[西门子] 时间密码锁——西门子1200-SCL语言(FB块分装)第二部分

[复制链接]
查看11695 | 回复0 | 2024-10-6 16:32:25 | 显示全部楼层 |阅读模式
在西门子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通过以上代码可以实现星期、天数和随机密码的实现由于时间关系剩下的代码将明天更新


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则