[西门子] 付款尾款锁机程序(时间密码锁)——西门子-(1200-1500)SCL语言

[复制链接]
查看169 | 回复0 | 2024-11-7 08:13:04 | 显示全部楼层 |阅读模式
西门子S7-1200 PLC中的“锁机程序”通常指的是用于控制机器或设备在特定条件下锁定(即停止运行)的程序。这种程序可能基于时间、操作次数或其他逻辑条件来执行锁定动作。例如,一个锁机程序可能会根据设备的使用期限自动锁定机器,直到用户输入正确的解锁密码或支付相应的费用后才能继续使用。

对于西门子S7-1200 PLC来说,实现这样一个锁机程序可以通过以下步骤:

  1. 设定锁机日期:可以设置一个初始的锁机日期,当PLC内部时钟到达这个日期时,设备将被锁定。

  2. 密码管理

    • 设置普通密码和永久解锁密码。

    • 普通密码可以让用户暂时解除锁定,并按照预设的时间间隔再次锁定。

    • 永久解锁密码则可以完全解除锁机制。

  3. 错误报警:如果有人尝试输入错误的密码多次,系统应该能够发出警报,并且可能采取进一步的安全措施,如临时禁用输入功能。

  4. 编程语言:这些功能可以用TIA Portal软件中的梯形图(LAD)、函数块图(FBD)或结构化控制语言(SCL)来编写

一、计算星期程序(FB块)

在西门子S7-1200 PLC中,使用TIA Portal软件来创建一个功能块(FB)以计算给定日期是星期几,可以通过一些基本的数学运算和逻辑来实现。这里我将提供一个基于Zeller公式的简化版本来实现这个功能。Zeller公式是一种用来计算给定日期是星期几的方法。

#q := #Day_IN;
#m := #Month_IN_1;
#k := #Year_IN_1 MOD 100;
#j := #Year_IN_1 / 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;
ELSE
    #Month_IN_1 := #Month_IN;
    #Year_IN_1 := #Year_IN;
    
END_IF;



#i := (#q + ((13 * (#m + 1)) / 5) + #k + (#k / 4) + (#j / 4) - (2 * #j)) MOD 7;
#kk := (#i + 7) MOD 7;

CASE #kk OF
    0:
        #Week_OUT := #data_out[6];
    1:
        #Week_OUT := #data_out[7];
    2:
        #Week_OUT := #data_out[1];
    3:
        #Week_OUT := #data_out[2];
    4:
        #Week_OUT := #data_out[3];
    5:
        #Week_OUT := #data_out[4];
    6:
        #Week_OUT := #data_out[5];
END_CASE;

二、计算每月多少天(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

    

    #DAY_IN := 30;
    
END_IF;

IF #Month_IN = 2 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
        
        #month_num := 2;
    ELSE
        #month_num := 3;
        
    END_IF;
    
    IF #month_num = 2 THEN
        #DAY_IN := 29;
    END_IF;
    IF #month_num = 3 THEN
        #DAY_IN := 28;
    END_IF;
    
END_IF;

三、计算倒计时天数(FB块)

#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);

REGION 输入限制
    
    IF #set_year <  #in_year THEN
        
        #set_year := #in_year;
    END_IF;
    
    IF #set_month > 12 THEN
        #set_month := 12;
    END_IF;
    
    #计算每月多少天_Instance_7(Year_IN := #DATA_b[1],
                        Month_IN := #DATA_b[2],
                        DAY_IN => #set_day_1);
    
    IF #set_day > #set_day_1 THEN
        #set_day := INT_TO_UINT(#set_day_1);
    END_IF;
    
END_REGION

REGION  计算倒计时天数
    
    
    IF #run = TRUE THEN
        #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;
        ELSE
            #year_1 := #DATA_b[1] - #DATA_a[1];
        END_IF;
        
        IF #year_1 = 0 THEN    // 一年内计算
            
            #计算每月多少天_Instance(Year_IN := #DATA_a[1],     // 计算输入的年月日的天数
                              Month_IN := #DATA_a[2],
                              DAY_IN => #day_10);
            
            
            
            #day_11 := #day_10 - #DATA_a[3];       // 计算当月剩余天数
            #计算每月多少天_Instance_1(Year_IN := #DATA_b[1],   // 计算设置的年月日的天数
                                Month_IN := #DATA_b[2],
                                DAY_IN => #day_12);
            
            
            #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],
                                    Month_IN := #j,
                                    DAY_IN => #day_14);
                
                #day_15 := #day_14 + #day_15;
                
            END_FOR;
            
            #OUT_day := #day_15 - #day_12 - #day_10 + #day_12 + #day_11 - #day_13;  //输出倒计时天数
        ELSE
            
            FOR #i := 1 TO #year_1 BY 1 DO
                
                IF #relay_1 = FALSE THEN
                    
                    FOR #j := #DATA_a[2] TO 12 BY 1 DO
                        #计算每月多少天_Instance_3(Year_IN := #DATA_a[1],
                                            Month_IN := #j,
                                            DAY_IN => #day_1);
                        
                        
                        #day_4 := #day_1 + #day_4;
                    END_FOR;
                    IF (#DATA_b[1] - #DATA_a[1]) > 1 THEN
                        
                        #relay_1 := TRUE;
                        
                    END_IF;
                    
                END_IF;
                
                IF #relay_1 = TRUE THEN
                    FOR #j := 1 TO 12 BY 1 DO
                        #计算每月多少天_Instance_2(Year_IN := (#DATA_a[1] + #i),
                                            Month_IN := #j,
                                            DAY_IN => #day_5);
                        
                        #day_2 := #day_5 + #day_2;
                        
                    END_FOR;
                    
                END_IF;
                
            END_FOR;
            
            FOR #ii := 1 TO #DATA_b[2] BY 1 DO
                
                #计算每月多少天_Instance_4(Year_IN := (#DATA_b[1]),
                                    Month_IN := #ii,
                                    DAY_IN => #day_8);
                
                
                #day_9 := #day_8 + #day_9;
                
            END_FOR;
            
            #计算每月多少天_Instance_5(Year_IN := #DATA_a[1],
                                Month_IN := #DATA_a[2],
                                DAY_IN => #day_10);
            
            
            #day_11 := #day_10 - #DATA_a[3];
            
            #计算每月多少天_Instance_6(Year_IN := #DATA_b[1],
                                Month_IN := #DATA_b[2],
                                DAY_IN => #day_12);
            
            
            #OUT_day := #day_2 + #day_4 + #day_9 + #DATA_b[3] - #day_12 + #day_11 - #day_10;
            
        END_IF;
        #run := FALSE;     //一个循环完成后置零
        #relay_1 := FALSE;
        
        
    END_IF;
    
END_REGION

四、时间密码锁程序(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;

REGION   设置时间暂存 

        #DATA_B[1] := #year_set;
        #DATA_B[2] := #month_set;
        #DATA_B[3] := #day_set;
        
        IF #DATA_B[1] < 0 THEN
            
            #year_set := 0;
            
        END_IF;
        
        IF #DATA_B[1] > 99 THEN
            
            #year_set := 99;
            
        END_IF;
        
        IF #month_set > 12 THEN
            
            #month_set := 12;
            
        END_IF;
        
        #计算每月多少天_Instance_1(Year_IN:=#DATA_B[1],
                            Month_IN:=#DATA_B[2],
                            DAY_IN=>#day_2);
        
        IF #day_set > #day_2 THEN
            
            #day_set := #day_2;
            
        END_IF;
        
        
END_REGION
    
    
REGION 计算设置的年月日时间
    
    IF #确认设置 = TRUE THEN
        #随机密码_run := TRUE;
    #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];
        
    IF #DATA_C[2] > 12 THEN
        #DATA_C[2] := #DATA_C[2]-12;
        #DATA_C[1] := #DATA_C[1] + 1;
        
    END_IF;
    
     #计算每月多少天_Instance(Year_IN:=#DATA_C[1],
                  Month_IN:=#DATA_C[2],
                  DAY_IN=>#DAY_1);

 
    
      IF #DATA_C[3] > #DAY_1 THEN
          #DATA_C[3] :=#DATA_C[3]- #DAY_1;
       #DATA_C[2] := #DATA_C[2] + 1;
    
      END_IF;
      
      IF #DATA_A[4] = 24 THEN   // 倒计时天数更新
          
          #RUN_1 := TRUE;
          
      END_IF;
      #year_out := #DATA_C[1] ;
      #month_out := #DATA_C[2];
      #day_out := #DATA_C[3] ;
      #确认设置 := FALSE;
  END_IF;
END_REGION
    
    
REGION 随机密码生成
    
    #随机密码生成_Instance(Equipment_code:=#设备码,
                     时钟输入:="Clock_Byte",
                     Verification_Code_1=>#验证码_1,
                     Verification_Code_2=>#验证码_2,
                     One_Month=>#一月密码,
                     Three_Months=>#三月密码,
                     Half_A_Year=>#半年密码,
                     A_Year=>#一年密码,
                     Permanent=>#永久密码,
                     Admin=>#admin密码,
                     RUN:=#随机密码_run);
    
END_REGION
    
    
REGION 判断密码是否正确    
    
    IF #确认输入密码 = TRUE AND #密码输入错误次数 <= 3 THEN
    
    IF #密码输入 = #一月密码 THEN
        
        #month_set := #month_set + 1;
        #确认输入密码 := FALSE;
        #密码输入错误次数 := 0;
    END_IF;
    
    IF #密码输入 = #三月密码 THEN
        
        #month_set := #month_set + 3;
        #确认输入密码 := FALSE;
        #密码输入错误次数 := 0;
    END_IF;
    
    IF #密码输入 = #半年密码 THEN
        
        #month_set := #month_set + 6;
        #确认输入密码 := FALSE;
        #密码输入错误次数 := 0;
    END_IF;
    
    IF #密码输入 = #一年密码 THEN
        
        #year_set := #year_set + 1;
        #确认输入密码 := FALSE;
        #密码输入错误次数 := 0;
    END_IF;
    
    IF #确认输入密码 = TRUE THEN    //密码输入错误
        
        #密码错误 := TRUE;
        #密码输入错误次数 := #密码输入错误次数 + 1;
    END_IF;
    
    #随机密码_run := TRUE;   //随机密码更新
    
    
   END_IF;
   
   IF #密码输入错误次数 > 3 THEN
       
       #密码错误三次 := 1;
       
   END_IF;
   
END_REGION


END_IF;





免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

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

本版积分规则