功能块编程思路梳理
在构思该单通气缸功能块程序时,可按以下思路逐步展开:
1. 明确控制目标
确定要实现对单通气缸的精确控制,包括使其能在手动和自动模式下分别完成回原位与去工作位的动作。同时,要对气缸的运行状态进行监测,及时发现异常并报警,最终将控制信号准确输出以驱动电磁阀。
2. 分析输入信号
考虑到不同的操作需求和安全条件,梳理出所需的输入信号:
操作模式信号:如自动模式
bAuto_Mode
、手动模式bHome_Mode
,用于区分当前的操作模式,以便执行相应的控制逻辑。
操作按钮信号:HMI 上的手动回原位按钮
bHmi_ToHPos
、手动去工作位按钮bHmi_ToWPos
,以及自动运行时的回原位bAuto_ToHPos
和去工作位bAuto_ToWPos
条件信号,这些信号决定了气缸的动作指令。安全与复位信号:急停信号
bEstop
用于在紧急情况下立即停止气缸动作;复位信号bReset
用于消除报警状态;安全信号bSafety_1
和bSafety_2
确保在满足安全条件时气缸才能动作。位置信号:原点到位信号
bHome_Signal
和工作位到位信号bWork_Signal
,用于判断气缸是否到达指定位置。
3. 规划输出信号
确定需要输出的信号以实现对气缸的控制和状态反馈:
电磁阀控制信号:单通电磁阀输出信号
staOut
,直接控制电磁阀的通断,进而控制气缸的动作;并将其赋值给外部输出信号bOut
用于实际硬件控制。位置就绪信号:原点位置就绪
bHPos_Ready
和动点位置就绪bWPos_Ready
,用于向其他程序模块反馈气缸是否已到达相应位置。报警信号:报警信号
bAlarm
,在检测到气缸运行异常时发出报警。
4. 设计控制逻辑
复位逻辑:构思当复位信号有效时,将报警信号清零的逻辑,使系统能恢复正常状态。
手动操作逻辑:思考如何根据 HMI 手动按钮信号以及急停信号,控制电磁阀输出,实现手动模式下气缸的位置控制。
自动运行逻辑:规划在自动模式下,结合各种条件信号(如自动操作按钮、急停、安全信号等),控制气缸自动回原位或去工作位的逻辑。
到位信号检测逻辑:设想利用定时器对位置信号进行滤波处理,准确判断气缸是否稳定到达指定位置,并输出相应的就绪信号。
报警逻辑:分析气缸可能出现的异常情况(如位置信号异常、电磁阀输出与位置信号不匹配等),设计相应的报警触发条件和逻辑。
5. 模块化与结构规划
将上述不同功能的逻辑分别划分到不同的程序区域(如复位、HMI 手动操作、自动运行等区域),使程序结构清晰,便于后续的调试、维护和扩展。
单通气缸功能块源码
bHMI_ToHPos---手动回原位触发压缩空气
bHMI_ToWPos---手动去动点位“单通电磁阀”
bAuto_ToHPos---自动回原位
bAuto_ToWPos---自动去动点位
1、自动运行时,手动操作需要锁定
2、自动运行时,需要联锁安全信号
3、手动操作不联锁安全信号
//单通气缸功能块气缸动作受联锁信号互锁、安全条件不满足气缸无法动作;
//电磁阀得电,气缸去动点(和现场不同,可以改变气管方向);
//急停锁定时气缸无法动作;
//自动运行时可以在HMI完成操作按钮锁定
REGION 复位
IF #bReset THEN
#bAlarm := FALSE;
END_IF;
END_REGION
REGION HMI手动操作
IF #bHmi_ToHPos AND NOT #bHmi_ToWPos AND #bEstop THEN
#staOut := FALSE;
END_IF;
IF #bHmi_ToWPos AND NOT #bHmi_ToHPos AND #bEstop THEN
#staOut := TRUE;
END_IF;
END_REGION
REGION 自动运行
// 当满足自动回原位条件、急停条件、处于自动模式且安全信号满足时,使气缸回原位
IF #bAuto_ToHPos AND NOT #bAuto_ToWPos AND #bEstop AND #bAuto_Mode AND #bSafety_1 AND #bsafety_2 THEN
#staOut := FALSE; //回原位
END_IF;
// 当满足自动去工作位条件、急停条件、处于自动模式且安全信号满足时,使气缸去工作位
IF #bAuto_ToWPos AND NOT #bAuto_ToHPos AND #bEstop AND #bAuto_Mode AND #bSafety_1 AND #bsafety_2 THEN
#staOut := TRUE; //工作位
END_IF;
END_REGION
REGION 气缸到位信号
#IEC_Timer1(IN:=#bHome_Signal,
PT:=#Filter_Time);
#staHPos_Ready := #IEC_Timer1.Q;
#bHPos_Ready := #staHPos_Ready; // 原位到位延时输出
#IEC_Timer2(IN:=#bWork_Signal,
PT:=#Filter_Time);
#staWPos_Ready := #IEC_Timer2.Q;
#bWPos_Ready := #staWPos_Ready; // 动点到位延时输出
END_REGION
REGION 气缸报警
#IEC_Timer3(IN:=(NOT #staHPos_Ready AND NOT #staWPos_Ready) //1、动点和原点都没信号;
OR (#staHPos_Ready AND #staWPos_Ready) //2、动点和原点都有信号;
OR (#staOut = TRUE AND NOT #staWPos_Ready) //3、动点电磁阀输出时,规定时间内未检测到动点信号;
OR (#staOut = FALSE AND NOT #staHPos_Ready), //4、原点电磁阀输出时,规定时间内未检测到动点信号:
PT:=#Alarm_Time);
IF #IEC_Timer3.Q THEN
#bAlarm := TRUE;
END_IF;
END_REGION
REGION 线圈输出
#bOut := #staOut;
END_REGION
加入知识星球智能制造与自动化,加入会员可下载此公众号发布文章中的相关资料(行业报告、MES、数字化技术方案、自动化教程、自动化行业标准化资料VASS\SICAR\戴姆勒等、C#上位机开发、node-red开发、人工智能教程等)。
今天的文章,如果你感觉有价值,请记得一键三连:点赞加关注,留言,转发朋友圈,分享收藏,点击在看之后,一定记着加我个人微信:ZIDHXB。