现有一威纶屏,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。
所以不知道怎么回事。。。。
请问这段程序有什么问题么??
非常感谢
非常感谢楼上解答。
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时触发。。
我也试了一下,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