在西门子S7-1200 PLC中实现时间密码锁功能,可以用于限制对程序或系统的访问权限,只允许在特定的时间段内通过正确的密码进行操作。这种功能在很多场景下都非常有用,比如维护窗口期间允许技术人员更改设置,或者在非工作时间内锁定某些关键操作以防止误操作。
有需要交流的可以加微信,
备注加“交流群”
下面是一个基本的概念性描述,说明如何在西门子S7-1200 PLC中实现时间密码锁功能:
设定允许的时间段:
使用定时器功能(如TON或TOF)来监控当前时间是否位于允许的操作时间段内。
可以利用内置实时时钟(RTC)来获取当前时间,并与预设的时间段进行比较。
密码验证:
在允许的时间段内,用户可以通过触摸屏或其他输入设备输入密码。
密码可以存储在一个安全的位置,并且每次输入后与之进行比较。
解锁操作:
如果密码正确并且当前时间处于允许的时间段内,则解锁程序,允许进行进一步的操作。错误的密码尝试应该被记录下来,并在多次失败后可能触发额外的安全措施,如暂时锁定系统。
安全特性:
错误密码尝试的次数限制。
密码更改功能。
错误报警,如果出现连续的密码错误尝试。
一、时间密码的随机密码FB块封装
西门子S7-1200 PLC(可编程逻辑控制器)中的“锁机程序”功能可以通过设置一个随机密码来保护PLC的程序不被未经授权的访问或修改。这个随机密码的主要作用包括:
安全保护:防止未授权人员对PLC程序进行修改或复制,从而保护工业控制系统的安全性和稳定性。
防止误操作:避免非专业人员因误操作而导致的生产中断或其他安全问题。
版权保护:对于设备制造商来说,可以保护他们的软件知识产权不被盗用。
维护管理:只有知道密码的维护人员才能进行程序的更新和维护工作,有助于提高维护效率和减少故障恢复时间。
(一)、FB块的封装通过系统的CLOCK_BYTE生成随机数通过内部算法实现解锁一个月、解锁三个月、解锁半年、解锁一年和管理员密码,还生成随机数验证码。
(二)、FB块内部SCL语言IF #RUN = TRUE THEN #DATA_A[1] := SCALE_X(MIN := 0.0, VALUE := NORM_X(MIN := 0, VALUE := #时钟输入, MAX := 255), MAX := 200.0); #DATA_A[2] := SCALE_X(MIN := 0.0, VALUE := NORM_X(MIN := 0, VALUE := #时钟输入, MAX := 255), MAX := 200.0);
#DATA_B[1] := REAL_TO_DINT(#DATA_A[1] * 100 / 51 * 94/3); #DATA_B[2] := REAL_TO_DINT(#DATA_A[2] * 100 / 66 * 57/7); #RUN := FALSE;END_IF;
#Verification_Code_1 := #DATA_B[1];#Verification_Code_2 := #DATA_B[2];
(* 一月的密码*)
#One_Month := ABS(REAL_TO_DINT(#DATA_B[1] * #Equipment_code / 354 + #DATA_B[2] * 1234 / 942 * 546));(* 三月的密码*)
#Three_Months := ABS(REAL_TO_DINT(#DATA_B[1] * #Equipment_code / 14 + #DATA_B[2] * 1234 / 962 * 556));(* 半年的密码*)#Half_A_Year := ABS(REAL_TO_DINT(#DATA_B[1] * #Equipment_code / 8944 + #DATA_B[2] * 4234 / 4132 * 3546));(* 一年的密码*)
#A_Year := ABS(REAL_TO_DINT(#DATA_B[1] * #Equipment_code / 76154 + #DATA_B[2] * 6134 / 532 * 126));(* 永久的密码*)
#Permanent := ABS(REAL_TO_DINT(#DATA_B[1] * #Equipment_code / 124 + #DATA_B[2] * 1334 / 52 * 216));
(* 管理的密码*)
#Admin := ABS(REAL_TO_DINT(#DATA_B[1] * #Equipment_code / 94 + #DATA_B[2] * 514 / 432 * 2966));
(三)、时间效果展示
video: https://mp.weixin.qq.com/mp/readtemplate?t=pages/video_player_tmpl&action=mpvideo&auto=0&vid=wxv_3612920352709541889二、计算剩余年、月、天数FB块封装(总的时间密码锁FB块)要在西门子S7-1200 PLC中实现锁机程序并计算剩余的年、月、天数,你可以创建一个功能块(FB)来封装这个逻辑。以下是一个简化的示例,说明如何创建这样一个功能块:(一)、功能块概述
功能: 计算从当前日期到指定结束日期的剩余年、月、天数。
输入参数:
年、月、日、时、分、秒: 结束日期 (DATE_AND_TIME)
年、月、日、时、分、秒: 当前日期 (DATE_AND_TIME)
输出参数:
Years: 剩余年数 (UINT)
Months: 剩余月数 (UINT)
Days: 剩余天数 (UINT)
创建功能块
在TIA Portal中打开你的项目。
寻找或创建一个新的功能块,命名为时间密码锁。
定义上述输入和输出参数。
(二)、FB功能块的封装
(三)、FB功能块内部程序(计算年月日)
IF #DATA_A[1]> #year OR #DATA_A[2]> #month OR #DATA_A[3]> #day OR #DATA_A[4]>#hour THEN #locked_up := TRUE; #RELAY:= TRUE; END_IF;
IF #RELAY = FALSE THEN // 输入时间暂存 #DATA_A[1] := #year; #DATA_A[2] := #month; #DATA_A[3] := #day; #DATA_A[4] := #hour; #DATA_A[5] := #minute; #DATA_A[6] := #second; // 设置时间暂存 #DATA_B[1] := #year_set; #DATA_B[2] := #month_set; #DATA_B[3] := #day_set; #DATA_B[4] := #hour_set; #DATA_B[5] := #minute_set; #DATA_B[6] := #second_set; // 剩余时间暂存 #DATA_C[1] := #DATA_B[1] - #DATA_A[1]; //年 IF #计算剩余天数 = TRUE THEN #DATA_C[3] := 0; #DATA_C[2] := 0; IF #DATA_C[1] > 0 AND #DATA_C[1] < 2 THEN //月 #DATA_C[2] := (#DATA_B[2] + (12 - #DATA_A[2])); //月 END_IF; IF #DATA_C[1]>=2 THEN #DATA_C[2] := (#DATA_C[1] - 1) * 12 + (#DATA_B[2] + (12 - #DATA_A[2])); //月 END_IF; FOR #ii := 0 TO #year_set-#year BY 1 DO IF 12 - #month <> 0 AND #day_n_3 = 0 THEN FOR #jj_1 := 1 TO 12 - #month BY 1 DO #计算每月多少天_Instance(Year_IN := #ii+#DATA_B[1], Month_IN := #jj_1, DAY_IN => #day_n); #DATA_C[3] := #day_n + #DATA_C[3]; END_FOR; #day_n_3 := 1; ELSE FOR #jj_1 := 1 TO 12 BY 1 DO #计算每月多少天_Instance(Year_IN := #ii+#DATA_B[1], Month_IN := #jj_1, DAY_IN => #day_n); #DATA_C[3] := #day_n + #DATA_C[3]; END_FOR; END_IF; END_FOR; #计算每月多少天_Instance(Year_IN := #DATA_A[1], Month_IN := #DATA_A[2], DAY_IN => #day_n_1); #计算每月多少天_Instance(Year_IN := #DATA_B[1], Month_IN := #DATA_B[2], DAY_IN => #day_n_2); #DATA_C[3] :=#DATA_C[3]-( #day_n_1-#DATA_A[2])-( #day_n_2-#DATA_B[2]); #计算剩余天数 := FALSE; #ii:=#day_n_3 := 0; END_IF; //剩余时间输出 #year_out := #DATA_C[1]; #month_out := #DATA_C[2]; #day_out := #DATA_C[3]; END_IF;(四)、实际效果展示
video: https://mp.weixin.qq.com/mp/readtemplate?t=pages/video_player_tmpl&action=mpvideo&auto=0&vid=wxv_3612931227818409991通过以上代码可以实现星期、天数和随机密码的实现由于时间关系剩下的代码将明天更新
|