2. TwinCAT工程搭建

在 TwinCAT 3 中,一个可维护、可扩展的复杂产线顺控工程,其质量往往在“工程搭建”阶段就已经决定了大半。很多后期难以排查的故障——例如任务抖动导致联锁响应延迟、库版本不一致导致编译通过但运行异常、变量命名混乱导致跨工位引用出错——根源都在项目创建与配置阶段。本节围绕新建 PLC 项目、任务与周期配置、库引用、变量命名规范与版本管理五个关键环节展开,目标是搭建一个结构清晰、周期合理、依赖可控、命名统一、可追溯的工程骨架。

一、新建 PLC 项目与解决方案结构

在 TwinCAT XAE 中,工程以 Solution(解决方案)为顶层容器,一个 Solution 下可包含多个 TwinCAT Project。对于复杂产线,建议按“设备/产线”划分 Project,而不是把所有逻辑塞进一个 PLC 项目。典型做法是:新建一个 TwinCAT XAE Project,然后在 PLC 节点下右键添加“Standard PLC Project”,命名为 PLC_Main;若产线包含多个独立控制域(如主输送、分拣、包装),可再添加 PLC_Sorter、PLC_Packer 等子项目,通过 ADS 或共享变量通信。

新建 PLC 项目后,系统会自动生成 MAIN (PRG)、PlcTask (Task)、Untitled1 (Library) 等默认对象。此时不要急于写逻辑,而应先规划 POU 分层:建议至少划分 01_IO(输入输出映射)、02_Device(单设备功能块)、03_Sequence(顺控步序)、04_Interlock(联锁逻辑)、05_HMI(人机接口数据)五类文件夹。这种分层能让后续的任务分配和库引用有明确的归属。

二、任务与周期配置

TwinCAT 的任务系统决定了 PLC 程序的执行节拍。默认的 PlcTask 周期通常为 10 ms,但对于复杂产线,单一周期往往不够:高速信号(如安全门、急停、编码器)需要更短周期,而慢速逻辑(如温度 PID、报表统计)可以放宽周期以节省 CPU。合理的做法是按“响应要求”划分任务,而不是按“功能模块”划分。

例如,可配置三个任务:PlcTask_Fast 周期 2 ms,用于急停链、安全联锁和高速计数;PlcTask_Main 周期 10 ms,用于顺控步序和普通联锁;PlcTask_Slow 周期 50 ms,用于 HMI 刷新、数据记录和非实时计算。在 TwinCAT 中,通过双击 System → Tasks 添加任务,设置 Cycle Time,然后在 PLC 项目的 Task 节点下把对应 POU 拖入任务。需要注意:同一 POU 不应同时挂在多个任务下,否则会出现数据竞争;跨任务共享变量应使用 VAR_GLOBAL 并配合 AT %I*/AT %Q* 或 Volatile 语义,必要时加互锁标志。

任务优先级(Priority)也需关注:数值越小优先级越高。通常 Fast 任务优先级设为 0~2,Main 设为 5~10,Slow 设为 15~20。若 Fast 任务执行时间超过其周期,会导致任务溢出(Task Overrun),此时应在 System → Real-Time 中查看 CPU 负载,并优化代码或调整周期。

TwinCAT 任务周期与 POU 分配关系 PlcTask_Fast 周期 2 ms | 优先级 1 急停链 / 安全联锁 高速计数 / 位置捕获 PlcTask_Main 周期 10 ms | 优先级 8 顺控步序 / 状态机 普通联锁 / 设备功能块 PlcTask_Slow 周期 50 ms | 优先级 18 HMI 刷新 / 报警汇总 数据记录 / 非实时计算 跨任务共享变量区(VAR_GLOBAL) gSafetyOK | gStepIndex | gAlarmCode | gHmiCmd 注意:同一 POU 不可挂多个任务;跨任务变量需加互锁标志或使用 Volatile 语义 Fast 任务执行时间必须小于其周期,否则触发 Task Overrun

三、库引用管理

TwinCAT 的库分为系统库(如 Tc2_Standard、Tc2_System、Tc3_Module)和自定义库。新建 PLC 项目后,默认已引用 Tc2_Standard 和 Tc2_System。对于顺控与联锁工程,通常还需要引用 Tc2_Utilities(时间戳、字符串处理)、Tc3_JsonXml(若涉及配方)以及安全库 Tc3_Safety(若使用 TwinSAFE)。

库引用的关键原则是“显式、固定版本”。在 PLC → References 中右键添加库时,应选择具体版本号(如 Tc2_Standard 3.3.4.0),而不是“最新版本”。否则当工程迁移到另一台装有不同 TwinCAT 版本的电脑时,可能因库版本自动升级导致编译错误或行为变化。对于自定义库,建议将 .library 文件随工程一起纳入版本管理,并在 References 中使用相对路径或库仓库(Library Repository)方式引用。

四、变量命名规范

复杂产线中变量数量可达数千个,命名规范直接决定可读性和可维护性。推荐采用“前缀_设备_功能_类型”的结构,例如 iConv1_Speed、bDoor2_Closed、fbSorter_State。前缀遵循 IEC 61131-3 常见约定:b 布尔、i 整型、r 实型、s 字符串、t 时间、fb 功能块实例、st 结构体。设备名使用英文缩写并保持全局一致,例如 Conv 表示输送机、Sorter 表示分拣机、Robot 表示机器人。

对于联锁信号,建议在变量名中体现“安全方向”,例如 bEStop_Active、bGuard1_Closed、bSafetyOK。对于 HMI 交互变量,统一加 hmi 前缀,如 hmiStartCmd、hmiModeSel,便于在 HMI 变量表中批量筛选。所有全局变量集中在 GVL_Global、GVL_IO、GVL_HMI 等全局变量列表中,禁止在 POU 内部随意定义全局变量。

五、版本管理

TwinCAT 工程本质上是文件集合,适合用 Git 或 SVN 管理。但需注意:.tsproj、.plcproj 等工程文件是 XML 文本,可正常 diff;而 .tpy、.compiled 等编译产物应加入 .gitignore。推荐忽略规则包括:*.tpy、*.compiled、_Boot、_CompileInfo、*.~u。每次提交前,应在 TwinCAT 中执行“Clean Solution”并重新编译,确保提交的是源码而非中间产物。

对于库和第三方组件,建议使用 Git Submodule 或 NuGet 方式管理,避免直接复制文件导致版本漂移。工程根目录下可放置 README.md,记录 TwinCAT 版本、库版本、任务周期配置和变量命名约定,使团队成员在克隆工程后能快速对齐环境。

建议在工程创建完成后立即执行一次“空编译 + 下载 + 运行”,确认任务周期和库引用无误,再开始编写逻辑。这一步能提前暴露环境问题,避免后期排查困难。
不要使用“最新版本”方式引用库;不要将编译产物提交到版本库;不要在同一 POU 中混用多个任务的变量而不加互锁。

完成以上五步后,工程骨架即具备可扩展性:新增设备时按命名规范添加变量和功能块,按响应要求挂入对应任务,按需引用库并锁定版本,所有变更通过版本管理留痕。这样的工程在后续顺控步序扩展、联锁逻辑增加和多人协作时,才能保持稳定与可追溯。