zl程序教程

您现在的位置是:首页 >  Java

当前栏目

西门子SCL---气缸逻辑控制

2023-02-18 16:47:35 时间
     气缸---气动执行元件,就是采用压缩空气作为动力,驱动机构作直线、摆动和旋转运动的元件。
作为工业自动化不可或缺的一环,气缸的控制程序使用得也是相当频繁。本文主要阐述使用SCL编写气
缸的逻辑控制程序。
    直入主题。首先新建底层块FB_AirValve。将气缸控制过程中的变量定义。由气缸种类不同引出报
警类型也不相同。真空发生器的控制和气缸类似,在类别上区分开来共用控制的输入输出变量。
底层变量申明
//急停状态复位掉双线圈输出状态-单线圈无影响
IF NOT #bEmg THEN
    #bOut_Double_Back := false;
    #bOut_Double_Front := false;
    #bManual_Back := false;
    #bManual_Front := false;
    #bAuto_Back := false;
    #bAuto_Front := false;
END_IF;
//手动状态,触发气缸缩回
IF NOT #bManual_Auto AND #bManual_Back AND #bEmg AND NOT #bLimit_Back THEN
    #bOut_Single := false;
    #bOut_Double_Back := true;
    #bOut_Double_Front := false;
    #bManual_Back := false;
END_IF;
//手动状态,触发气缸伸出
IF NOT #bManual_Auto AND #bManual_Front AND #bEmg AND NOT #bLimit_Front THEN
    #bOut_Single := true;
    #bOut_Double_Back := false;
    #bOut_Double_Front := true;
    #bManual_Front := false;
END_IF;
//自动状态,触发气缸缩回
IF  #bManual_Auto AND #bAuto_Back AND #bEmg AND NOT #bLimit_Back THEN
    #bOut_Single := false;
    #bOut_Double_Back := true;
    #bOut_Double_Front := false;
    #bAuto_Back := false;
END_IF;
//自动状态,触发气缸伸出
IF  #bManual_Auto AND #bAuto_Front AND #bEmg AND NOT #bLimit_Front THEN
    #bOut_Single := true;
    #bOut_Double_Back := false;
    #bOut_Double_Front := true;
    #bAuto_Front := false;
END_IF;
//模式切换时控制信号清除
IF #bManual_Auto THEN
    #bManual_Back := false;
    #bManual_Front := false;
ELSE
    #bAuto_Back := false;
    #bAuto_Front := false;
END_IF;
//报警选择输入错误处理
IF #iAlarm_Switch>=4 OR #iAlarm_Switch<0 THEN
    #iAlarm_Switch := 1;
END_IF;
//报警选择判断
CASE #iAlarm_Switch OF
    0:  // 无报警
        #bAlarm_Back := false;
        #bAlarm_Front := false;
        #bAlarm_BackAndFront := false;
    1:  // 双电磁阀磁性开关原点与终点报警
        IF #tonAlarm_Back.Q THEN
            #bAlarm_Back := true;
        END_IF;
        IF #tonAlarm_Front.Q THEN
            #bAlarm_Front := true;
        END_IF;
        IF #tonAlarm_BackAndFront.Q THEN
            #bAlarm_BackAndFront := true;
        END_IF;
        IF #bReset AND NOT #tonAlarm_Back.Q THEN
            #bAlarm_Back := false;
        END_IF;
        IF #bReset AND NOT #tonAlarm_Front.Q THEN
            #bAlarm_Front := false;
        END_IF;
        IF #bReset AND NOT #tonAlarm_BackAndFront.Q THEN
            #bAlarm_BackAndFront := false;
        END_IF;
    2:  // 单电磁阀磁性开关动作位报警
        #bAlarm_Back := false;
        IF #tonAlarm_Front.Q THEN
            #bAlarm_Front := true;
        END_IF;
        IF #tonAlarm_BackAndFront.Q THEN
            #bAlarm_BackAndFront := true;
        END_IF;
        IF #bReset AND NOT #tonAlarm_Front.Q THEN
            #bAlarm_Front := false;
        END_IF;
        IF #bReset AND NOT #tonAlarm_BackAndFront.Q THEN
            #bAlarm_BackAndFront := false;
        END_IF;
    3:  // 单电磁阀磁性开关初始位报警
        #bAlarm_Front := false;
        IF #tonAlarm_Back.Q THEN
            #bAlarm_Back := true;
        END_IF;
        IF #tonAlarm_BackAndFront.Q THEN
            #bAlarm_BackAndFront := true;
        END_IF;
        IF #bReset AND NOT #tonAlarm_Back.Q THEN
            #bAlarm_Back := false;
        END_IF;
        IF #bReset AND NOT #tonAlarm_BackAndFront.Q THEN
            #bAlarm_BackAndFront := false;
        END_IF;
        
END_CASE;
//真空发生器延时自动关闭破坏阀设置
IF #tonClose_BackAndFront.Q THEN
    #bOut_Double_Back := false;
END_IF;
//报警延时设定
#tonAlarm_Back(IN:=#bOut_Double_Back AND NOT #bSensor_Back,
               PT:=#tAlarm_BackOrFront);
#tonAlarm_Front(IN:=#bOut_Double_Front  AND NOT  #bSensor_Front AND
                NOT (#bEmptyRun AND #bCyl_Vac_Switch),
                PT:=#tAlarm_BackOrFront);
#tonAlarm_BackAndFront(IN:=(#bSensor_Back AND #bSensor_Front AND (#iAlarm_Switch=1)) 
OR (#bOut_Double_Back AND #bSensor_Front AND (#iAlarm_Switch=2)) 
OR (#bOut_Double_Front AND #bSensor_Back AND (#iAlarm_Switch=3)),
                PT:=#tAlarm_BackAndFront);
#tonClose_BackAndFront(IN:=#bCyl_Vac_Switch AND #bOut_Double_Back,
                       PT:=#tClose_BackAndFront);

底层块编写完成。
     分成手自动两种设备运行模式对气缸进行控制,程序设计时逻辑互锁,使控制逻辑严密,设备运
行安全可靠。
应用块对底层块的调用
    新建应用块FB_AirValveControl,申明一个调用底层块的数组,长度根据设备实际应用的气缸&真
空阀数量定义。
(*******************************************************************************
气缸&真空吸盘控制条件编写
按照站别进行分类
若需要单独设定时间 则FB中重新绑定变量 并于下面配置即可
数组元素含义(站别+流水号) ar_stValveControl[1][1].bCyl_Vac_Switch     
代表第一站 第一个阀
*******************************************************************************)
//气缸控制功能块声明
FOR #i := 1 TO 2 DO
    #ar_fbCylinder[#i](
        bCyl_Vac_Switch := "Global".ar_stValveControl[#i].bCyl_Vac_Switch,
        bEmptyRun := "PumpControl".接收[1],
        bManual_Auto := "PumpControl".接收[2],
        bReset := "PumpControl".接收[3],
        bEmg := "PumpControl".接收[4],
        bLimit_Back := "Global".ar_stValveControl[#i].bLimit_Back,
        bLimit_Front := "Global".ar_stValveControl[#i].bLimit_Front,
        bSensor_Back := "Global".ar_stValveControl[#i].bSensor_Back,
        bSensor_Front := "Global".ar_stValveControl[#i].bSensor_Front,
        iAlarm_Switch := "Global".ar_stValveControl[#i].iAlarm_Switch,
        tAlarm_BackOrFront := t#10s,
        tAlarm_BackAndFront := t#1s,
        tClose_BackAndFront := t#1s,
        bAlarm_Back => "Global".ar_stValveControl[#i].bAlarm_Back,
        bAlarm_Front => "Global".ar_stValveControl[#i].bAlarm_Front,
        bAlarm_BackAndFront => "Global".ar_stValveControl[#i].bAlarm_BackAndFront,
        bManual_Back := "Global".ar_stValveControl[#i].bManual_Back,
        bManual_Front := "Global".ar_stValveControl[#i].bManual_Front,
        bAuto_Back := "Global".ar_stValveControl[#i].bAuto_Back,
        bAuto_Front := "Global".ar_stValveControl[#i].bAuto_Front,
        bOut_Single := "Global".ar_stValveControl[#i].bOut_Single,
        bOut_Double_Back := "Global".ar_stValveControl[#i].bOut_Double_Back,
        bOut_Double_Front := "Global".ar_stValveControl[#i].bOut_Double_Front)  
END_FOR;
//配置气缸信号
//YV0101-1号气缸
"Global".ar_stValveControl[1].bCyl_Vac_Switch := FALSE;                 
//阀类型设定-False气缸 True真空吸
"Global".ar_stValveControl[1].bLimit_Back := FALSE;                 
//缩回动作限制条件-True有效-禁止触发
"Global".ar_stValveControl[1].bLimit_Front := FALSE;                 
/伸出动作限制条件-True有效-禁止触发
"Global".ar_stValveControl[1].iAlarm_Switch := 1;                     
//磁性开关的报警选择,输入0:不检测磁开,1:检测伸出&缩回2:只检测伸出3:只检测缩回
"Global".ar_stValveControl[1].bSensor_Front := "1号气缸伸出检测(左)" AND "1号气缸
伸出检测(右)";  
 //磁开IO设定-伸出位置磁性开关
"Global".ar_stValveControl[1].bSensor_Back := "1号气缸缩回检测(左)" AND "1号气缸
缩回检测(右)";  
 //磁开IO设定-缩回位置磁性开关
"1号气缸伸出控制" := "Global".ar_stValveControl[1].bOut_Double_Front; 
 //IO输出线圈设定-双线圈输出-伸出
"1号气缸缩回控制":="Global".ar_stValveControl[1].bOut_Double_Back ;  
 //IO输出线圈设定-双线圈输出-缩回

//YV0102-2号气缸
"Global".ar_stValveControl[2].bCyl_Vac_Switch := FALSE;                      
 //缩回动作限制条件-True有效-禁止触发
"Global".ar_stValveControl[2].bLimit_Back := FALSE;                 
//缩回动作限制条件-True有效-禁止触发
"Global".ar_stValveControl[2].bLimit_Front := FALSE;                      
//伸出动作限制条件-True有效-禁止触发
"Global".ar_stValveControl[2].iAlarm_Switch := 1;                         
//磁性开关的报警选择,输入0:不检测磁开,1:检测伸出&缩回2:只检测伸出3:只检测缩回
"Global".ar_stValveControl[2].bSensor_Front := "2号气缸缩回检测(左)" AND "2号气缸
缩回检测(右)";         //磁开IO设定-伸出位置磁性开关
"Global".ar_stValveControl[2].bSensor_Back := "2号气缸伸出检测(左)" AND "2号气缸
伸出检测(右)";          //磁开IO设定-缩回位置磁性开关
"2号气缸伸出控制":= "Global".ar_stValveControl[2].bOut_Double_Front;    
 //IO输出线圈设定-双线圈输出-伸出
"2号气缸缩回控制":= "Global".ar_stValveControl[2].bOut_Double_Back;     
 //IO输出线圈设定-双线圈输出-缩回


此块定义了一个10个长度的FB_AirValve数组,示例仅写出两例做示范。

应用块(手动)编写完成。气缸的自动控制,在自动程序里调用"Global".ar_stValveControl[i].
bAuto_Front Or "Global".ar_stValveControl[i].bAuto_Back即可。
    如果把自动化看成类人,数据的识别和运算、核心的控制就是"大脑"的工作,CPU即是人的大脑;
环境因素的采集传导是人体的各种感观,采集温度、湿度、图像亦或是声音等等,各种传感器在工控
过程中是人的感观系统,让“大脑”能以最直观的方式接受这些环境信息;吃东西要靠嘴巴,抓东西要
靠手,看物体要靠眼睛,自动化设备也是一样,依靠着执行机构“大脑”可以最终达成自己的控制目的。
 ‘-采集-’ ‘-运算-’ ‘-执行-’之间相互影响,组成一个闭环系统 。控制系统所需的目标参数。

 以上。如果代码有错误或者缺失的地方,欢迎在评论区留言指出。谢谢。