求助威纶通EB8000制作帐号登录配备相应用户权限等级的宏指令问题 点击:0 | 回复:14



西玛仪表 028-66505957 13808018567

    
  • 精华:0帖
  • 求助:2帖
  • 帖子:63帖 | 1652回
  • 年度积分:0
  • 历史总积分:2355
  • 注册:2006年4月18日
发表于:2011-01-10 23:24:52
楼主

现有一威纶屏,6100i。想利用12个用户权限。进行帐号的登录。并且确定不同帐号密码给定不同权限功能。

我是这样做的:在帐号设定界面里面设定1号用户为默认管理员帐号(给自己用的),2号为第二管理员帐号。345为工程师帐号,6789、10、11、12为操作员级帐号。

帐号的用户名和密码可由管理员帐号更改。密码的更改比较简单。但是用户名的更改就出问题了。。

为了简便说明,我就暂时举例只有3个帐号。

1号帐号用一个字元输入,地址是lLW100,长度为3个word。内容是AABBCC,6个字母。2号帐号相应地址为LW103,内容DDEEFF,3号帐号为LW106。内容GGHHII。

出现情况一:宏指令定义字符串型变量长度问题。

定义c har 型变量名为name 的变量。

用getdata函数:getdata(name,"Local HMI",LW,100,3)。然后有用setdata(name,"Local HMI",LW,200,1)。在界面上用字元显示LW200,长度3直接。结果只显示一个A。而不是AABBCC,甚至不是AA。假如c har变量的长度为一个word的话,至少应该显示AA。按照这么说的话,一个c har型的变量,其存储长度只能有一个Byte。而在说明书中没有这方面的解释说明。因此很奇怪。。。。

临时解决办法,定义int型的name、name1、name2,共三个变量。因此,一个AABBCC长的字元,结果得分3次传。将AA传给name,BB传给name1,CC传给name2。

出现情况二:宏指令的调用和运行问题

由于得用户自定义用户名。因此,在登录界面中需要有用户名的字元型输入单元。

设定如下:字元型输入单元地址LW200,长度3word。用getdata分别传给宏里头的int型变量name、name1、name2。

然后,在设定用户界面中,预设定好,LW100,长度3word的1号用户传给int array【9】型变量中的array【0】、array【1】、array【2】。

2号用户类推。。。3号也是。

用语句:

int nameid

if (name==array【0】 and name1==array【1】 and name2==array【2】) then
nameid=1
SetData(nameid,"Local HMI",LW,9219,1)

else if (name==array【3】 & name1==array【4】 & name2==array【5】) then
nameid=2
SetData(nameid,"Local HMI",LW,9219,1)

else if (name==array【6】 & name1==array【7】 & name2==array【8】) then
nameid=3
SetData(nameid,"Local HMI",LW,9219,1)

else

nameid=0

SetData(nameid,"Local HMI",LW,9219,1)
end if

最后,在PLC控制中调用,触发条件为LB9000,为ON时就执行。

结果,发现,首次使用时,当LW100输入AABBCC,可以将LW9219设定成1,但是借着清除LW100后,重新输入DDEEFF就没法使LW9219设定成2。

所以不知道怎么回事。。。。

请问这段程序有什么问题么??

 

非常感谢




威武小郭

  • 精华:2帖
  • 求助:0帖
  • 帖子:3帖 | 143回
  • 年度积分:0
  • 历史总积分:1042
  • 注册:2010年8月11日
发表于:2011-01-11 09:54:08
1楼

太有技术含量的,很难很难啊,正在认真的看,希望早点搞出来

 

 

成就工控专家,威武一统江湖

西玛仪表 028-66505957 13808018567

  • 精华:0帖
  • 求助:2帖
  • 帖子:63帖 | 1652回
  • 年度积分:0
  • 历史总积分:2355
  • 注册:2006年4月18日
发表于:2011-01-11 12:52:39
2楼

确实写得有点多。。表达水平不行,可能大家看不是很懂。总结一下:

第一个问题,在宏指令中的c har型变量的长度是多少

第二个问题,if语句中的if 条件。当出现多条件时如何处理,if a==b and c==d and e==f then之类。另外对于else if到底有没有效。

第三个问题,宏指令的执行机制,当到达触发条件时,宏指令是只执行一遍还是不停的循环执行??比如三维力控里面的按钮脚本就分按下时执行一遍,松开时执行一遍。和按下时循环执行。三种模式。

MT8000TX

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 20回
  • 年度积分:0
  • 历史总积分:49
  • 注册:2008年6月13日
发表于:2011-01-11 17:26:22
3楼
简单回答你的问题
在宏指令中的char型变量的长度是 1 byte, 但是因为GetData每次读取的数据长度是以word作为单位, 如果name是宣告为c har, 除了需要使用array的型态,大小也要是2的倍数
因此如果名称是使用”AABBCC”的格式, 建议你使用下面的宣告方式
c har name[6]
GetData(name[0],"Local HMI",LW,100, 6)// 读取6 bytes = 3 words
或是
short name[3]
GetData(name[0],"Local HMI",LW,100, 3)// 读取3 words
千万不要忘记在GetData()中要使用name[0]来读取数据,表示从name[0]开始承接数据

另外, else-if的语法当然有效, 只是你用法错了
else if (name==array【3】 & name1==array【4】 & name2==array【5】) then
上面的判断式应该改为
else if (name==array【3】 and name1==array【4】 and name2==array【5】) then
也就是应该将”&”改为”and”

最后, 宏指令的执行机制,当到达触发条件时,宏指令是只执行一遍还是不停的循环执行?
我的回答是, 如果是用按键的方式触发执行, 那就是每按一下按钮才执行一次, 除非用PLC控件, 选择在ON状态时永远执行

西玛仪表 028-66505957 13808018567

  • 精华:0帖
  • 求助:2帖
  • 帖子:63帖 | 1652回
  • 年度积分:0
  • 历史总积分:2355
  • 注册:2006年4月18日
发表于:2011-01-11 22:18:33
4楼

非常感谢楼上解答。

1、按照楼上的意思,c har实际上是字符型变量,而不是我想象中的字符串变量。我在这里临时用int来代替。经楼上的解答,我想威纶的short型应该就是16位。所以short就ok了。。。

2、使用and试过,因为结论不对,所以没法判断and还是&哪个正确。。不过经楼上解答,已经改成and

3、我用一个简单的程序测试过,楼上是正确的。

4、至此,实际问题解决。可以实现,用户名+密码登录了。现将原程序贴在下面,



macro_command main()

short array[36]
short name
short name1
short name2
short nameid

GetData(array[0],"Local HMI",RW,300,6)
GetData(array[6],"Local HMI",RW,306,6)
GetData(array[12],"Local HMI",RW,312,6)
GetData(array[18],"Local HMI",RW,318,6)
GetData(array[24],"Local HMI",RW,324,6)
GetData(array[30],"Local HMI",RW,330,6)

GetData(name,"Local HMI",LW,100,1)
GetData(name1,"Local HMI",LW,101,1)
GetData(name2,"Local HMI",LW,102,1)

if (name==array[0] and name1==array[1] and name2==array[2]) then
nameid=1
SetData(nameid,"Local HMI",LW,9219,1)

else if (name==array[3] and name1==array[4] and name2==array[5]) then
nameid=2
SetData(nameid,"Local HMI",LW,9219,1)

else if (name==array[6] and name1==array[7] and name2==array[8]) then
nameid=3
SetData(nameid,"Local HMI",LW,9219,1)

else if (name==array[9] and name1==array[10] and name2==array[11]) then
nameid=4
SetData(nameid,"Local HMI",LW,9219,1)

else if (name==array[12] and name1==array[13] and name2==array[14]) then
nameid=5
SetData(nameid,"Local HMI",LW,9219,1)

else if (name==array[15] and name1==array[16] and name2==array[17]) then
nameid=6
SetData(nameid,"Local HMI",LW,9219,1)

else if (name==array[18] and name1==array[19] and name2==array[20]) then
nameid=7
SetData(nameid,"Local HMI",LW,9219,1)

else if (name==array[21] and name1==array[22] and name2==array[23]) then
nameid=8
SetData(nameid,"Local HMI",LW,9219,1)

else if (name==array[24] and name1==array[25] and name2==array[26]) then
nameid=9
SetData(nameid,"Local HMI",LW,9219,1)

else if (name==array[27] and name1==array[28] and name2==array[29]) then
nameid=10
SetData(nameid,"Local HMI",LW,9219,1)

else if (name==array[30] and name1==array[31] and name2==array[32]) then
nameid=11
SetData(nameid,"Local HMI",LW,9219,1)

else if (name==array[33] and name1==array[34] and name2==array[35]) then
nameid=12
SetData(nameid,"Local HMI",LW,9219,1)

else
nameid=0
SetData(nameid,"Local HMI",LW,9219,1)
end if

end macro_command

 

 

非常感谢威武小郭和MT8000TX的帮助。

总结起来感觉最主要的问题是改int为short    改&为and    触发条件改为LB9000。当LB9000为on时触发。。

西玛仪表 028-66505957 13808018567

  • 精华:0帖
  • 求助:2帖
  • 帖子:63帖 | 1652回
  • 年度积分:0
  • 历史总积分:2355
  • 注册:2006年4月18日
发表于:2011-01-11 22:20:03
5楼

用户1名存放地址rw300。3word字元。用户2rw303.。。类推。。。

密码就不用说了。系统字里头。。。

Weintek HMI

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 20回
  • 年度积分:0
  • 历史总积分:49
  • 注册:2008年6月13日
发表于:2011-01-12 09:42:30
6楼
还可以更化简一下, 提供大家参考

macro_command main()

short array[36]
short i, index0, index1, index2
short name[3], nameid = 0

GetData(array[0] ,"Local HMI", RW, 300, 36)// get all user name
GetData(name[0], "Local HMI",LW, 100,3)// get input user name

for i = 0 to 11
    index0  = 0 + i * 3
    index1  = 1 + i * 3
    index2  = 2 + i * 3

    if (name[0] == array[index0] and name[1] == array[index1] and name[2] == array[index2]) then
       nameid = i + 1
       break
    end if
next i

SetData(nameid,"Local HMI",LW,9219,1)

end macro_command

西玛仪表 028-66505957 13808018567

  • 精华:0帖
  • 求助:2帖
  • 帖子:63帖 | 1652回
  • 年度积分:0
  • 历史总积分:2355
  • 注册:2006年4月18日
发表于:2011-01-13 21:36:53
7楼

诶。。。顺便问下,这个for 语句。。的运行机制,,看您这个简化程序也就是说在for循环前不管i的实际值是多少,只要开始进行for循环,那么i就从0到11开始。这个for循环是不需要判断条件的,只要运行到这里就开始循环。。。

是吧?

西玛仪表 028-66505957 13808018567

  • 精华:0帖
  • 求助:2帖
  • 帖子:63帖 | 1652回
  • 年度积分:0
  • 历史总积分:2355
  • 注册:2006年4月18日
发表于:2011-01-13 21:55:39
8楼
试运行了下,MT8000tx的好用。。。而且在声明short name[3], nameid = 0 时将nameid声明为0。也就是说,程序每次运行一圈就将nameid复位为0。只要if判断没有改变nameid的值,那么在后面setdata时nameid始终为0.。。好用。比else if还好用。

syl510129

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 49回
  • 年度积分:0
  • 历史总积分:342
  • 注册:2006年7月21日
发表于:2011-01-14 10:17:35
9楼

我也试了一下,MT8000TX的程序不错,很简洁。我里面在加了一个变量PASSWORD作为密码修改时的寻址指针(LW9200),当任意用户输入用户名正确后,输入新的密码(用LW110)可以修改老的密码(用LW110的通知功能触发数据传输,将新的密码传送到LW9500-9522)

macro_command main()

short array[36]
short i, index0, index1, index2
short name[3], nameid = 0

short password

GetData(array[0] ,"Local HMI", RW, 300, 36)// get all user name
GetData(name[0], "Local HMI",LW, 100,3)// get input user name

for i = 0 to 11
index0 = 0 + i * 3
index1 = 1 + i * 3
index2 = 2 + i * 3

if (name[0] == array[index0] and name[1] == array[index1] and name[2] == array[index2]) then
nameid = i + 1
break
end if
next i

SetData(nameid,"Local HMI",LW,9219,1)
password=(nameid-1)*2

SetData(password,"Local HMI",LW,9200,1)
end macro_command

云锋

  • 精华:2帖
  • 求助:5帖
  • 帖子:394帖 | 5543回
  • 年度积分:307
  • 历史总积分:30324
  • 注册:2005年6月24日
发表于:2011-01-14 11:01:52
10楼
楼主的触摸屏用成上位机了。

董金丽

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 6回
  • 年度积分:0
  • 历史总积分:6
  • 注册:2016年6月13日
发表于:2016-06-21 15:49:11
11楼

谁能给我提供一下威纶通才触摸屏宏指令的应用  我是新手 才刚刚学谢谢了

诚就理想

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 64回
  • 年度积分:85
  • 历史总积分:582
  • 注册:2016年7月20日
发表于:2016-09-12 23:28:01
12楼

那边并不能te's'x'he'd's'x'h's'x'x

caoxiao789

  • 精华:0帖
  • 求助:0帖
  • 帖子:21帖 | 68回
  • 年度积分:49
  • 历史总积分:224
  • 注册:2015年3月16日
发表于:2017-04-08 15:54:02
13楼

楼主能总结一下,加上注释发出来让大家学习好么

stgyliwei

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:102
  • 注册:2018年7月14日
发表于:2019-05-19 17:58:48
14楼

RW里存的数是多少


相关主题

官方公众号

智造工程师