哪位帮我用宏指令编写时间到了停机 ,时间就用屏的时间。如:我要设备在2019年12月30日0时,时间到了置位PLC的M8034,然后在屏上输入 一个密码复位PLC的M8034。
回答:
在威纶通屏里写宏指令控制PLC的M8034,这种方法不是很好,现在三菱PLC的密码已经是非常容易解密的。
如果别人删除这一行怎么办。
如果用宏指令控制屏的一个画面,加上禁止上传、禁止反编译等,这样解密的可能性就小得多。
收款可以单片机做动态密码,自己也不知道他下一次会出现什么序号。
然后跟据序号,译出相应的密码输入,现在用的是32个字节的动态密码,密码 里面包含有时间,到期日期,一次最大充许三个月的密匙。
PLC里面一两个状态控制的,老一点的PLC很快就给破解了,真要用这些的,可以在人机方面增加一点值运算,至少保障性强一些。
但是人机也是可以破解的,价值不大的无所谓了,如价值大的,只能自己整了,我都是用ARM做的收费的,通讯是自动波特率的。
如果机器不是花大力气研发的,小动作加密下是可以的,破解你的设备也没那个必要。
这里我们编写一个宏代码来看看如何实现这个功能。
界面如下图:
界面上可以设置到期时间,实际使用时,可以不用精确到分秒。
这里仅是练手学习,可以参考,修改使用。
同时当前触摸屏的系统显示也在界面上显示出来。
后台有运行一宏指令,每隔200毫秒会检测设置时间与系统是否一至,相同则表示时间到。
执行置位相同寄存器来表示期限到。
宏内是直接将年,月,日,时,分,秒进行对比,也可以考虑使用时间戳来试试。
时间到后,会在界面点亮指示灯LB0。
具体使用如下:
第二行显示的是当前屏上的时间,如2020, 10, 25, 23, 15,00;(年,月,日,时,分,秒)
要测试的话,可设置第一行的程序到期时间,如2020, 10, 25, 23, 15,30.
这样30秒到点后,程序锁定。
在最后一行输入密码(预留有6组,分别对年月日时分秒延期,具体看宏1),
如111111,点击应用,程序会延长10秒,后到期再停止。
宏指令如下:
macro_command main()
bool bOn=false
GetData(bOn, "Local HMI", LB, 0, 1)
if bOn == true then
return
end if
//
short nY,nM,nD,nHour,nMinute,nSecond
GetData(nY, "Local HMI", RW, 0, 1)
GetData(nM, "Local HMI", RW, 1, 1)
GetData(nD, "Local HMI", RW, 2, 1)
GetData(nHour, "Local HMI", RW, 3, 1)
GetData(nMinute, "Local HMI", RW, 4, 1)
GetData(nSecond, "Local HMI", RW, 5, 1)
//本机时间获取
short nY1,nM1,nD1,nHour1,nMinute1,nSecond1
GetData(nY1, "Local HMI", LW, 9022, 1)
GetData(nM1, "Local HMI", LW, 9021, 1)
GetData(nD1, "Local HMI", LW, 9020, 1)
GetData(nHour1, "Local HMI", LW, 9019, 1)
GetData(nMinute1, "Local HMI", LW, 9018, 1)
GetData(nSecond1, "Local HMI", LW, 9017, 1)
//并显示(可删除不用)
SetData(nY1, "Local HMI", LW, 10, 1)
SetData(nM1, "Local HMI", LW, 11, 1)
SetData(nD1, "Local HMI", LW, 12, 1)
SetData(nHour1, "Local HMI", LW, 13, 1)
SetData(nMinute1, "Local HMI", LW, 14, 1)
SetData(nSecond1, "Local HMI", LW, 15, 1)
//如果时间到则置位相关寄存器
if nY1==nY then
if nM==nM1 then
if nD==nD1 then
if nHour==nHour1 then
if nMinute==nMinute1 then
if nSecond==nSecond1 then
bOn=true
SetData(bOn, "Local HMI", LB, 0, 1)
SetData(bOn, "FATEK FB/FBs/B1/B1z Series", M, 8034, 1)
return
end if
end if
end if
end if
end if
end if
end macro_command
宏设置了每200毫秒执行一次,代码使用时注意进行设置。
时间到后,灯点亮,程序进入锁定状态。
可以在界面上输入密码,点击应用,来解锁。
密码在解锁的宏里面使用了6组,可以分别对年,月,日,时,分,秒进行累加。
进行时间的延长处理。
宏代码如下:
macro_command main()
int nSecret=0
short nTemp=0
//不需要延期,则直执行。
bool bOn=true
GetData(bOn, "Local HMI", LB, 0, 1)
if bOn == false then
return
end if
//
GetData(nSecret, "Local HMI", LW, 0, 1)
//第一组密码对,秒数增加
if nSecret==111111 then
GetData(nTemp, "Local HMI", RW, 5, 1)
nTemp = nTemp+10
if nTemp>60 then
nTemp = nTemp-10
end if
SetData(nTemp, "Local HMI", RW, 5, 1)
bOn = false
end if
//第二组密码对,分数增加
if nSecret==222222 then
GetData(nTemp, "Local HMI", RW, 4, 1)
nTemp = nTemp+1
if nTemp>60 then
nTemp = nTemp-1
end if
SetData(nTemp, "Local HMI", RW, 4, 1)
bOn = false
end if
//第三组密码对,时数增加
if nSecret==333333 then
GetData(nTemp, "Local HMI", RW, 3, 1)
nTemp = nTemp+1
if nTemp>24 then
nTemp = nTemp-1
end if
SetData(nTemp, "Local HMI", RW, 3, 1)
bOn = false
end if
//第四组密码对,日数增加
if nSecret==444444 then
GetData(nTemp, "Local HMI", RW, 2, 1)
nTemp = nTemp+1
if nTemp>29 then
nTemp = nTemp-1
end if
SetData(nTemp, "Local HMI", RW, 2, 1)
bOn = false
end if
//第五组密码对,月数增加
if nSecret==555555 then
GetData(nTemp, "Local HMI", RW, 1, 1)
nTemp = nTemp+1
if nTemp>24 then
nTemp = nTemp-1
end if
SetData(nTemp, "Local HMI", RW, 1, 1)
bOn = false
end if
//第六组密码对,年数增加
if nSecret==666666 then
GetData(nTemp, "Local HMI", RW, 0, 1)
nTemp = nTemp+1
SetData(nTemp, "Local HMI", RW, 0, 1)
bOn = false
end if
//
SetData(bOn, "FATEK FB/FBs/B1/B1z Series", M, 8034, 1)
SetData(bOn, "Local HMI", LB, 0, 1)
end macro_command
代码功能,仅是根据问题来编写,仅供参考。
例程下载地址:
如果对威纶通触摸屏不熟悉,或对宏的使用很陌生,
可以下载我录制的两套相关视频教程来学习。
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|