3. IEC 61131-3在TwinCAT中的工程化使用
在TwinCAT中,IEC 61131-3不只是语法标准,更是一套工程组织手段。复杂产线顺控与联锁工程能否长期维护,往往不取决于某段逻辑写得多巧妙,而取决于语言选型是否匹配对象、POU是否分层清晰、接口是否稳定、复用是否可控。本节围绕这四点展开。
一、语言选型:按“对象特征”而非个人偏好
TwinCAT支持ST、LD、FBD、SFC及CFC等语言。工程化选型的核心判断依据是:这段逻辑的主要特征是布尔组合、状态迁移、数值运算还是顺序调度。
- ST(结构化文本):适合数值计算、循环、数组处理、字符串与复杂条件判断。例如节拍统计、配方换算、报警码解析、与上位机报文拼装。ST表达力强,但过度使用IF嵌套会降低可读性。
- LD(梯形图):适合以触点、线圈、置位/复位为主的布尔联锁,尤其是电气人员维护的急停链、安全门、许可条件。LD对“并联/串联条件”的视觉表达直观。
- FBD(功能块图):适合信号流清晰的处理链,如模拟量滤波、限幅、斜坡、PID前级处理。数据从左到右流动,便于观察中间量。
- SFC(顺序功能图):适合有明确步序、转移条件和步动作的顺控流程,如工位上下料、清洗、压装。SFC把“步—转移—动作”显式化,是复杂顺控的首选骨架。
实际工程中常见组合是:SFC做流程骨架,ST做步内计算与通信,LD/FBD做联锁与信号处理。选型不是排他,而是分工。
二、POU组织:按“职责层级”划分
POU包括程序(PRG)、功能块(FB)和函数(FUN)。工程化组织建议按职责分层:
- 设备层FB:一个FB封装一台设备或一个执行机构,如
FB_Cylinder、FB_Motor、FB_Clamp。对外暴露命令与状态,内部处理互锁、超时、故障。 - 工位层PRG/FB:调用多个设备FB,完成一个工位的顺控。通常用SFC或状态机实现。
- 产线层PRG:调度各工位、处理上下游握手、节拍与模式管理。
- 公共层FUN/FB:报警、配方、单位换算、时间戳、通信封装等。
这样划分后,修改一台气缸逻辑只影响设备层FB,不会波及产线调度。POU命名建议带前缀,如FB_、PRG_、FUN_,并在TwinCAT解决方案中按文件夹分组,便于多人协作与版本管理。
三、接口设计:稳定优先于灵活
FB接口是复用的契约。设计时遵循三条原则:
- 输入用命令与参数,输出用状态与诊断。例如气缸FB输入
bExtend、bRetract、tTimeout,输出bExtended、bRetracted、bError、nErrorID。 - 避免在接口中暴露内部实现。不要把内部定时器、中间布尔量放到VAR_INPUT/OUTPUT,应放入VAR或VAR_PRIVATE。
- 用结构体聚合相关参数。如
ST_CylinderPara包含行程时间、超时、传感器配置,减少接口膨胀。
接口一旦发布,修改要谨慎。新增功能优先用可选输入或新方法,避免破坏已有调用。
四、代码复用:从复制到封装
复用的前提是“相同行为、不同参数”。若两台气缸动作逻辑一致,只是传感器数量不同,应通过参数区分,而不是复制两份代码。TwinCAT中常用手段包括:
- FB实例数组:
aCylinder : ARRAY[1..8] OF FB_Cylinder;,用循环调用,减少重复代码。 - 接口/继承:TwinCAT 3支持接口与继承,可定义
I_Actuator,让不同设备FB实现统一命令接口,便于上层统一调度。 - 库工程:把稳定FB放入独立库工程,供多个项目引用,统一升级。
五、选型与组织的综合示意
下图给出一个典型产线项目的语言分工与POU层级关系:SFC负责工位步序,ST负责计算与通信,LD/FBD负责联锁与信号处理,设备FB被工位层复用,公共库被全线共享。
六、一个可落地的接口示例
下面给出气缸设备FB的接口骨架,体现“命令输入、状态输出、参数聚合、诊断分离”的设计思路。示例参数为教学假设值,实际项目应按机械与传感器规格调整。
TYPE ST_CylinderPara :
STRUCT
tExtendTime : TIME := T#2S; // 伸出额定时间
tRetractTime : TIME := T#2S; // 缩回额定时间
tTimeout : TIME := T#5S; // 动作超时
bHasBothSensors : BOOL := TRUE;// 是否双传感器
END_STRUCT
END_TYPE
FUNCTION_BLOCK FB_Cylinder
VAR_INPUT
bExtend : BOOL; // 伸出命令
bRetract : BOOL; // 缩回命令
stPara : ST_CylinderPara; // 参数结构体
bSensorExt: BOOL; // 伸出到位传感器
bSensorRet: BOOL; // 缩回到位传感器
END_VAR
VAR_OUTPUT
bExtended : BOOL; // 伸出到位状态
bRetracted: BOOL; // 缩回到位状态
bBusy : BOOL; // 动作中
bError : BOOL; // 故障
nErrorID : INT; // 故障码
END_VAR
VAR
fbTimeout : TON; // 内部超时定时器
nState : INT; // 内部状态
END_VAR
调用侧只需实例化并接线:
VAR
aCyl : ARRAY[1..4] OF FB_Cylinder;
i : INT;
END_VAR
FOR i := 1 TO 4 DO
aCyl[i](bExtend := bCmdExtend[i],
bRetract := bCmdRetract[i],
stPara := stCylPara[i],
bSensorExt := bSensExt[i],
bSensorRet := bSensRet[i]);
END_FOR
这样,四台气缸共用同一份逻辑,差异只体现在参数与传感器接线。新增一台气缸只需扩展数组,不需要复制代码。判断复用是否成功,可以看一个指标:修改一处公共逻辑后,是否所有同类设备同步生效且无需逐台修改。若答案是否定的,说明复用还停留在复制粘贴阶段。
综上,TwinCAT中的IEC 61131-3工程化使用,本质是让语言、层级、接口、复用四者互相支撑:语言匹配对象,层级隔离变化,接口稳定契约,复用减少重复。做到这四点,复杂产线顺控与联锁代码才具备可维护、可扩展、可交接的工程品质。