气缸功能块的封装和抽象
气缸有去工作位和去原位两种动作,同时为了检测是否到位,一般会配备磁性开关或者光电检测是否到达工作位和原位。如果给出输出,超时未到位,需要触发报警。
通常在急停状态下,需要断开去工作位和去原位的动作输出;在手动模式下,可以直接输出DO
信号;在自动模式下,还需要考虑一些业务逻辑,比如互锁逻辑。
功能块声明如下:
FUNCTION_BLOCK Cylinder
VAR_INPUT
emStop_nc : BOOL; // 急停信号常闭点
cmdReset : BOOL; // 复位信号
cmdWork : BOOL; // 去工位
cmdHome : BOOL; // 去原位
AutoMode : BOOL; // true: 自动模式; false: 手动模式
snWorkPos : BOOL; // 工作位传感器
snHomePos : BOOL; // 原位传感器
timeoutWork : TIME; // 工作位超时时间
timeoutHome : TIME; // 原位超时时间
END_VAR
VAR_OUTPUT
doWork : BOOL; // 气缸伸出
doHome : BOOL; // 气缸缩回
errWorkTimeout : BOOL; // 工作位置超时报警
errHomeTimeout : BOOL; // 原位超时报警
workPosDone : BOOL; // 工作位到位完成
homePosDone : BOOL; // 原位到位完成
END_VAR
VAR
timerWork : TON; // 工作位置超时定时器
timerHome : TON; // 原位超时定时器
emStopActive : BOOL; // 急停激活标志
resetHandled : BOOL; // 复位已处理标志
END_VAR
气缸的业务非常简单,直接把业务逻辑翻译成代码即可:
CheckEmStop( btnEmStop_nc := emStop_nc, btnReset := cmdReset, oldEmStopActive := emStopActive, newEmStopActive => emStopActive);
// 急停动作
IF emStopActive THEN
doWork := FALSE;
doHome := FALSE;
// 手动动作
ELSIF NOT AutoMode THEN
doWork := cmdWork;
doHome := cmdHome;
// 自动动作
ELSIF AutoMode THEN
doWork := cmdWork AND NOT cmdHome;
doHome := cmdHome AND NOT cmdWork;
// 复位动作
ELSIF cmdReset THEN
errWorkTimeout := FALSE;
errHomeTimeout := FALSE;
END_IF
// 到位检测
workPosDone := snWorkPos;
homePosDone := snHomePos;
// 超时检测: 工作位
timerWork(IN := doWork AND NOT snWorkPos, PT := timeoutWork, Q => errWorktimeout);
// 超时检测:原位
timerHome(IN := doHome AND NOT snHomePos, PT := timeoutHome, Q => errHometimeout);
errHomeTimeout := timerHome.Q;
测试
PROGRAM PLC_PRG
VAR
cylinder1: Cylinder;
sbReset: BOOL; // 复位
emStop_nc: BOOL; // 急停
reqWork : BOOL; // 工位请求
reqHome: BOOL; // 原位请求
sensorWork: BOOL; // 工位检测
sensorHome: BOOL; // 原位检测
END_VAR
调用程序为:
cylinder1(
emStop_nc:= emStop_nc, cmdReset:= sbReset, cmdWork:= reqWork, cmdHome:= reqHome, AutoMode:= TRUE,
snWorkPos:= sensorWork, snHomePos:= sensorHome, timeoutWork:= T#30S, timeoutHome:= T#10S,
doWork=> , doHome=> , errWorkTimeout=> , errHomeTimeout=> , workPosDone=> , homePosDone=>
);
去工作位请求:
去工作位超时: