西门子SCL---气缸逻辑控制
2023-06-13 09:16:23 时间
气缸---气动执行元件,就是采用压缩空气作为动力,驱动机构作直线、摆动和旋转运动的元件。
作为工业自动化不可或缺的一环,气缸的控制程序使用得也是相当频繁。本文主要阐述使用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即是人的大脑;
环境因素的采集传导是人体的各种感观,采集温度、湿度、图像亦或是声音等等,各种传感器在工控
过程中是人的感观系统,让“大脑”能以最直观的方式接受这些环境信息;吃东西要靠嘴巴,抓东西要
靠手,看物体要靠眼睛,自动化设备也是一样,依靠着执行机构“大脑”可以最终达成自己的控制目的。
‘-采集-’ ‘-运算-’ ‘-执行-’之间相互影响,组成一个闭环系统 。控制系统所需的目标参数。
以上。如果代码有错误或者缺失的地方,欢迎在评论区留言指出。谢谢。
相关文章
- 自抗扰控制(ADRC)仿真系统(matlab/simulink)的搭建
- 多功能可充电移动照明LED驱动控制IC方案
- Kubernetes 1.26 中更简单的准入控制实战
- 语句使用Oracle IF条件语句控制逻辑流程(oracleif条件)
- SAP 通过事务代码与屏幕变式(SHD0)控制控制用户界面的某些字段,以控制生产订单的调度类型为例详解编程语言
- 数据Linux下通过串口读取数据实现智能控制(linux串口读取)
- Oracle的控制文件:守护着数据库安全的重要保障(oracle的控制文件)
- 控制使用Redis和Java实现的有效过期控制(redisjava过期)
- 控制实现Java应用程序基于Redis的过期控制(redisjava过期)
- Linux信号:深入理解和控制进程(linux信号)
- 调整Redis槽分配控制你的数据分片容量(控制redis槽分配)
- 手动控制Redis集群的切换过程(redis 集群手动切换)