在三菱 PLC 中,气缸控制的通用功能块(Function Block, FB)可封装气缸的伸出、缩回、急停、状态反馈等核心逻辑,简化编程并提高复用性。以下以FX5 系列和Q 系列为例,设计通用气缸控制功能块,涵盖单作用气缸和双作用气缸的典型控制逻辑。
一、气缸控制功能块设计思路
气缸控制的核心需求:
功能块需包含输入参数(控制信号)、输出参数(驱动信号)、内部状态(动作逻辑)和报警信号(超时、异常)。
二、双作用气缸通用功能块(FB_Cylinder_Double)
双作用气缸通过两个电磁阀控制伸出 / 缩回(如两位五通电磁阀),需两个磁性开关反馈位置。
1. 功能块参数定义
| 类型 | 变量名 | 数据类型 | 说明 |
|---|---|---|---|
| 输入 | EN | BOOL | 功能块使能(ON 时激活) |
| 输入 | AutoMode | BOOL | 自动模式(ON = 自动,OFF = 手动) |
| 输入 | Auto_Extend | BOOL | 自动模式伸出指令(ON = 伸出) |
| 输入 | Auto_Retract | BOOL | 自动模式缩回指令(ON = 缩回) |
| 输入 | Man_Extend | BOOL | 手动模式伸出按钮(点动 / 自锁,需外部处理) |
| 输入 | Man_Retract | BOOL | 手动模式缩回按钮(点动 / 自锁) |
| 输入 | EStop | BOOL | 急停信号(ON = 急停,强制缩回) |
| 输入 | Sensor_Extend | BOOL | 伸出到位磁性开关(ON = 到位) |
| 输入 | Sensor_Retract | BOOL | 缩回到位磁性开关(ON = 到位) |
| 输入 | Timeout_Set | WORD | 动作超时时间(单位:100ms,如 50=5 秒) |
| 输出 | Solenoid_Extend | BOOL | 伸出电磁阀输出(Yx) |
| 输出 | Solenoid_Retract | BOOL | 缩回电磁阀输出(Yx) |
| 输出 | Status_Extend | BOOL | 伸出状态(ON = 已伸出) |
| 输出 | Status_Retract | BOOL | 缩回状态(ON = 已缩回) |
| 输出 | Alarm_Timeout | BOOL | 超时报警(ON = 超时) |
| 输出 | Alarm_Fault | BOOL | 异常报警(如双到位,ON = 故障) |
2. 内部逻辑(状态机设计)
通过状态机实现气缸动作的有序切换,核心状态包括:
关键逻辑:
3. GX Works3 中功能块实现(示例代码片段)
plaintext
// 功能块:FB_Cylinder_Double // 状态定义 VAR_INTERNAL CurrentState: INT := 0; // 0=初始,1=伸出中,2=伸出到位,3=缩回中,4=急停 Timer_Extend: TON; // 伸出超时定时器 Timer_Retract: TON; // 缩回超时定时器 END_VAR // 急停优先 IF EStop THEN CurrentState := 4; ELSE CASE CurrentState OF 0: // 初始状态(缩回到位) IF (AutoMode AND Auto_Extend) OR (NOT AutoMode AND Man_Extend) THEN CurrentState := 1; // 触发伸出 END_IF; 1: // 伸出过程 Solenoid_Extend := TRUE; Solenoid_Retract := FALSE; Timer_Extend(IN:=TRUE, PT:=Timeout_Set * 100); // 超时计时 IF Sensor_Extend THEN CurrentState := 2; // 伸出到位 Timer_Extend(IN:=FALSE); ELSIF Timer_Extend.Q THEN Alarm_Timeout := TRUE; // 超时报警 END_IF; 2: // 伸出到位 IF (AutoMode AND Auto_Retract) OR (NOT AutoMode AND Man_Retract) THEN CurrentState := 3; // 触发缩回 END_IF; 3: // 缩回过程 Solenoid_Extend := FALSE; Solenoid_Retract := TRUE; Timer_Retract(IN:=TRUE, PT:=Timeout_Set * 100); IF Sensor_Retract THEN CurrentState := 0; // 缩回到位 Timer_Retract(IN:=FALSE); ELSIF Timer_Retract.Q THEN Alarm_Timeout := TRUE; END_IF; 4: // 急停状态 Solenoid_Extend := FALSE; Solenoid_Retract := TRUE; IF Sensor_Retract THEN CurrentState := 0; // 急停后缩回到位 END_IF; END_CASE; END_IF; // 状态反馈 Status_Extend := (CurrentState = 2) OR (CurrentState = 1 AND Sensor_Extend); Status_Retract := (CurrentState = 0) OR (CurrentState = 3 AND Sensor_Retract); // 异常报警(双到位) Alarm_Fault := Sensor_Extend AND Sensor_Retract;
三、单作用气缸功能块(FB_Cylinder_Single)
单作用气缸仅需一个电磁阀(得电伸出,失电靠弹簧缩回),磁性开关检测伸出到位。
四、功能块调用示例(双作用气缸)
在主程序中调用功能块,关联实际 I/O 点:
plaintext
// 实例化气缸1功能块 FB_Cyl1: FB_Cylinder_Double; // 输入参数映射 FB_Cyl1.EN := TRUE; FB_Cyl1.AutoMode := X0; // 自动/手动切换开关(X0=ON为自动) FB_Cyl1.Auto_Extend := M0; // 自动伸出指令(来自程序逻辑) FB_Cyl1.Auto_Retract := M1; // 自动缩回指令 FB_Cyl1.Man_Extend := X1; // 手动伸出按钮 FB_Cyl1.Man_Retract := X2; // 手动缩回按钮 FB_Cyl1.EStop := X3; // 急停按钮 FB_Cyl1.Sensor_Extend := X10; // 伸出到位传感器 FB_Cyl1.Sensor_Retract := X11; // 缩回到位传感器 FB_Cyl1.Timeout_Set := K50; // 超时5秒 // 输出参数映射 Y0 := FB_Cyl1.Solenoid_Extend; // 伸出电磁阀 Y1 := FB_Cyl1.Solenoid_Retract; // 缩回电磁阀 M10 := FB_Cyl1.Status_Extend; // 伸出状态指示 M11 := FB_Cyl1.Alarm_Timeout; // 超时报警
五、功能块设计要点
六、扩展功能
通过通用功能块,可快速实现气缸控制逻辑,尤其适合多气缸的非标设备(如装配线、分拣机),显著提高编程效率和可靠性。

