气缸有去工作位和去原位两种动作,同时为了检测是否到位,一般会配备磁性开关或者光电检测是否到达工作位和原位。如果给出输出,超时未到位,需要触发报警。

通常在急停状态下,需要断开去工作位和去原位的动作输出;在手动模式下,可以直接输出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=>
);

去工作位请求:

工位请求.PNG

去工作位超时:

工位超时.PNG

标签: CoDeSys, PLC

添加新评论