>西门子S7-1200 PLC中的“锁机程序”通常指的是用于控制机器或设备在特定条件下锁定(即停止运行)的程序。这种程序可能基于时间、操作次数或其他逻辑条件来执行锁定动作。例如,一个锁机程序可能会根据设备的使用期限自动锁定机器,直到用户输入正确的解锁密码或支付相应的费用后才能继续使用。
对于西门子S7-1200 PLC来说,实现这样一个锁机程序可以通过以下步骤: 设定锁机日期:可以设置一个初始的锁机日期,当PLC内部时钟到达这个日期时,设备将被锁定。 密码管理: 错误报警:如果有人尝试输入错误的密码多次,系统应该能够发出警报,并且可能采取进一步的安全措施,如临时禁用输入功能。 编程语言:这些功能可以用TIA Portal软件中的梯形图(LAD)、函数块图(FBD)或结构化控制语言(SCL)来编写
一、计算星期程序(FB块) 在西门子S7-1200 PLC中,使用TIA Portal软件来创建一个功能块(FB)以计算给定日期是星期几,可以通过一些基本的数学运算和逻辑来实现。这里我将提供一个基于Zeller公式的简化版本来实现这个功能。Zeller公式是一种用来计算给定日期是星期几的方法。#k := #Year_IN_1 MOD 100;#data_out[1] := 'Monday';#data_out[2] := 'Tuesday';#data_out[3] := 'Wednesday';#data_out[4] := 'Thursday';#data_out[5] := 'Friday';#data_out[6] := 'Saturday';#data_out[7] := 'Sunday';IF #Month_IN = 1 OR #Month_IN = 2 THEN #Month_IN_1 := #Month_IN + 12; #Year_IN_1 := #Year_IN - 1; #Month_IN_1 := #Month_IN;#i := (#q + ((13 * (#m + 1)) / 5) + #k + (#k / 4) + (#j / 4) - (2 * #j)) MOD 7; #Week_OUT := #data_out[6]; #Week_OUT := #data_out[7]; #Week_OUT := #data_out[1]; #Week_OUT := #data_out[2]; #Week_OUT := #data_out[3]; #Week_OUT := #data_out[4]; #Week_OUT := #data_out[5];二、计算每月多少天(FB块) IF #Month_IN = 1 OR #Month_IN = 3 OR #Month_IN = 5 OR #Month_IN = 7 OR #Month_IN = 8 OR #Month_IN = 10 OR #Month_IN = 12 THEN #DAY_IN := 31; END_IF;
IF #Month_IN = 4 OR #Month_IN = 6 OR #Month_IN = 9 OR #Month_IN = 11 THEN #remainder := #Year_IN MOD 400; #remainder_1 := #Year_IN MOD 4; #remainder_2 := #Year_IN MOD 100; IF #remainder = 0 OR (#remainder_1 = 0 AND #remainder_2 <> 0) THEN#DATA_a[1] := UINT_TO_INT(#in_year);#DATA_a[2] := UINT_TO_INT(#in_month);#DATA_a[3] := UINT_TO_INT(#in_day);#DATA_b[1] := UINT_TO_INT(#set_year);#DATA_b[2] := UINT_TO_INT(#set_month);#DATA_b[3] := UINT_TO_INT(#set_day); IF #set_year < #in_year THEN #计算每月多少天_Instance_7(Year_IN := #DATA_b[1], IF #set_day > #set_day_1 THEN #set_day := INT_TO_UINT(#set_day_1); #day_15 := #day_14 := #day_7 := #day_9 := #day_4 := #day_2 := 0; //数据初始化 IF #DATA_b[1] - #DATA_a[1] > 1 THEN // 计算是一年内 还是一年以上 #year_1 = 0一年内 #year_1 <> 0 一年以上含一年 #year_1 := #DATA_b[1] - #DATA_a[1] - 1; #year_1 := #DATA_b[1] - #DATA_a[1]; IF #year_1 = 0 THEN // 一年内计算 #计算每月多少天_Instance(Year_IN := #DATA_a[1], // 计算输入的年月日的天数 #day_11 := #day_10 - #DATA_a[3]; // 计算当月剩余天数 #计算每月多少天_Instance_1(Year_IN := #DATA_b[1], // 计算设置的年月日的天数 #day_13 := #day_12 - #DATA_b[3]; // 计算当月剩余天数 FOR #j := #DATA_a[2] TO #DATA_b[2] BY 1 DO // 计算累计天数 #计算每月多少天_Instance_2(Year_IN := #DATA_a[1], #day_15 := #day_14 + #day_15; #OUT_day := #day_15 - #day_12 - #day_10 + #day_12 + #day_11 - #day_13; //输出倒计时天数 FOR #i := 1 TO #year_1 BY 1 DO FOR #j := #DATA_a[2] TO 12 BY 1 DO #计算每月多少天_Instance_3(Year_IN := #DATA_a[1], #day_4 := #day_1 + #day_4; IF (#DATA_b[1] - #DATA_a[1]) > 1 THEN FOR #j := 1 TO 12 BY 1 DO #计算每月多少天_Instance_2(Year_IN := (#DATA_a[1] + #i), #day_2 := #day_5 + #day_2; FOR #ii := 1 TO #DATA_b[2] BY 1 DO #计算每月多少天_Instance_4(Year_IN := (#DATA_b[1]), #day_9 := #day_8 + #day_9; #计算每月多少天_Instance_5(Year_IN := #DATA_a[1], #day_11 := #day_10 - #DATA_a[3]; #计算每月多少天_Instance_6(Year_IN := #DATA_b[1], #OUT_day := #day_2 + #day_4 + #day_9 + #DATA_b[3] - #day_12 + #day_11 - #day_10; #run := FALSE; //一个循环完成后置零四、时间密码锁程序(FB块) IF #DATA_A[1]> #year OR #DATA_A[2]> #month OR #DATA_A[3]> #day OR #DATA_A[4]>#hour THEN // 私自修改当前系统时间直接锁死 #DATA_B[2] := #month_set; #计算每月多少天_Instance_1(Year_IN:=#DATA_B[1], IF #day_set > #day_2 THEN #DATA_C[1] := #DATA_A[1] + #DATA_B[1]; #DATA_C[2] := #DATA_A[2] + #DATA_B[2]; #DATA_C[3] := #DATA_A[3] + #DATA_B[3]; #DATA_C[2] := #DATA_C[2]-12; #DATA_C[1] := #DATA_C[1] + 1; #计算每月多少天_Instance(Year_IN:=#DATA_C[1], IF #DATA_C[3] > #DAY_1 THEN #DATA_C[3] :=#DATA_C[3]- #DAY_1; #DATA_C[2] := #DATA_C[2] + 1; IF #DATA_A[4] = 24 THEN // 倒计时天数更新 #year_out := #DATA_C[1] ; #month_out := #DATA_C[2]; #随机密码生成_Instance(Equipment_code:=#设备码, Verification_Code_1=>#验证码_1, Verification_Code_2=>#验证码_2, IF #确认输入密码 = TRUE AND #密码输入错误次数 <= 3 THEN #month_set := #month_set + 1; #month_set := #month_set + 3; #month_set := #month_set + 6; #year_set := #year_set + 1; IF #确认输入密码 = TRUE THEN //密码输入错误 #密码输入错误次数 := #密码输入错误次数 + 1; #随机密码_run := TRUE; //随机密码更新
|