面向 .NET 开发者与自动化工程师的 TwinCAT 3 入门到进阶知识手册。 本手册为纯知识/概念讲解,不包含代码示例,侧重概念、原理与工程实践的理解。
- 第 1 章 TwinCAT 平台概览
- 第 2 章 工程结构与项目组织
- 第 3 章 IEC 61131-3 与结构化文本
- 第 4 章 实时性与任务调度
- 第 5 章 ADS 通信
- 第 6 章 常见问题与排错思路
- 第 7 章 术语表
TwinCAT(The Windows Control and Automation Technology)是 Beckhoff 公司的软件自动化平台。它把一台普通 PC 变成功能强大的软件 PLC(Soft PLC)与运动控制器,可以在 Windows 操作系统上实时运行控制程序,同时复用 PC 的算力、网络与生态资源。
核心思想:用标准工业 PC 替代传统专用 PLC 硬件,通过软件实现 PLC、运动控制、视觉、HMI 等多种自动化功能。
- TwinCAT 2:32 位,基于 Windows 的经典版本,使用 CoDeSys V2.3 内核,功能相对固定。
- TwinCAT 3:现主流版本。基于 Visual Studio 集成(XAE),支持面向对象编程、多语言、64 位、自动化接口(Automation Interface)、TE 系列工具(如 TwinCAT Scope、TwinCAT 3 HMI)。
- TwinCAT 3.1:当前广泛使用的 32 位运行时;TwinCAT 3.1.4024+ 及更新的 64 位运行时(TwinCAT 3.1.4026/4028 等)逐步普及。
版本差异主要影响:运行时位数、支持的平台(Win10/11、Windows CE、嵌入式)、可用功能包与驱动兼容性。
- XAE(eXtended Automation Engineering):工程/开发环境。负责编程、配置、编译、调试。通常以 Visual Studio 插件形式出现,用户在此编写 PLC 程序、配置 I/O、任务与路由。
- XAR(eXtended Automation Runtime):运行时环境。负责在目标系统上实时执行程序、处理 I/O、管理任务调度与通信。
理解:XAE 是「写代码/配置」的地方,XAR 是「跑程序」的地方。 两者可以位于同一台机器(本地开发+运行),也可以分离(开发机通过路由访问目标控制器)。
TwinCAT 3 提供多种运行时组件,各自承担不同职责:
- PLC(TwinCAT PLC Control):执行 IEC 61131-3 程序,是逻辑控制核心。
- NC I / NC P(Motion Control):运动控制,负责轴定位、插补、电子齿轮/凸轮等。
- CNC:数控插补,面向机床类应用。
- HMI(TwinCAT 3 HMI):人机界面,可独立部署到 Web/浏览器。
- SAFETY(TwinSAFE):功能安全,遵循 IEC 61508/ISO 13849。
- I/O:与现场总线(EtherCAT、CANopen、Modbus、PROFINET 等)交互。
一次工程可启用多个运行时组件,它们共享同一实时内核。
从逻辑上可把系统分为三层:
- 硬件层:工业 PC(IPC)、EtherCAT 总线、I/O 端子、伺服驱动器等。
- 运行时层(XAR):实时内核(RTime)、任务调度、PLC/NC/CNC 运行时、ADS 通信服务。
- 工程层(XAE):Visual Studio 中的项目树、配置、在线调试、诊断。
Windows 上,TwinCAT 通过实时内核与普通 Windows 任务隔离,保证控制任务的确定性(determinism)。
| 维度 | 传统专用 PLC | TwinCAT 软 PLC |
|---|---|---|
| 硬件 | 专用 CPU + 固件 | 通用工业 PC |
| 性能 | 固定、受限 | 随 CPU 增强,算力强 |
| 扩展 | 硬件受限 | 软件/接口灵活,可加视觉、HMI、数据库 |
| 生态 | 封闭 | 可复用 Windows/.NET 生态 |
| 实时性 | 硬实时固件 | 通过实时内核保证 |
小结:TwinCAT 把自动化工程带入了「软件定义」的时代,代价是需要理解实时内核、路由与 ADS 通信等概念。
一个 TwinCAT 3 工程在 Visual Studio 中呈现为树状结构,顶层节点通常包括:
- System:系统配置,含路由(Routes)、许可证(License)、证书(Certificates)等。
- PLC:PLC 项目与程序文件。
- I/O:设备与总线配置(EtherCAT 主站、从站、映射)。
- NC / SAFETY / HMI:按需启用的其他运行时。
- Mappings:变量映射(连接 PLC 变量与 I/O)。
工程以 .tsproj 文件为根,包含多个子项目与配置。
System 节点集中管理影响系统级通信的配置:
- AmsNetId:每个 TwinCAT 节点的唯一网络标识(形如
a.b.c.d.e.f),用于 ADS 寻址。 - 路由(Routes):定义本机到其他 TwinCAT 节点的连接方式,分静态路由(TCP/IP、串口等)与动态路由(自动发现)。
- 许可证(License):TwinCAT 运行时需激活相应许可才能运行,分 7 天试用、正式(硬件狗/软件绑定)等。
- 证书:TLS 相关安全配置。
理解 AmsNetId 与路由是掌握 ADS 通信的前提(详见第 5 章)。
一个 PLC 项目(.plcproj)包含多种文件类型,通过后缀区分:
- TcPOU(Program Organization Unit):程序组织单元,可声明为程序(PROGRAM)、功能块(FUNCTION_BLOCK)或函数(FUNCTION)。
- TcGVL(Global Variable List):全局变量列表,声明跨 POU 共享的全局变量。
- TcDUT(Data Unit Type):数据类型定义,如结构体(STRUCT)、枚举(ENUM)、别名(TYPE)。
- TcPLC:PLC 项目配置(任务、编译设置等)。
- Tmc:编译生成的运行时元数据(Symbol 信息),供 ADS/在线访问。
IEC 61131-3 的三种基本 POU:
- Program(程序):顶层执行单元,常由任务调度,可直接访问全局变量。
- Function Block(功能块):可实例化、带内部状态(实例数据),适合封装重复逻辑。
- Function(函数):无内部状态,输入输出均为参数,适合纯计算。
理解三者的区别,对组织大型程序至关重要:函数无状态、功能块有状态、程序是任务入口。
- 任务:调度单元,决定哪些 POU 以什么频率、什么优先级运行。
- 循环时间(Cycle Time):任务一次完整执行的周期,如 1ms、10ms。
- 优先级:多个任务按优先级抢占调度,影响实时性。
- 任务类型:PLC 任务、I/O 任务(同步 I/O 刷新)、外部任务(如由 EtherCAT 同步)。
任务配置直接影响控制周期与 I/O 一致性,是性能调优的关键。
- 编译(Build):把源码编译为运行时目标与符号信息。
- 激活配置(Activate Configuration):把工程配置与程序写入目标系统,替换当前运行配置。
- 运行(Run):激活后目标系统进入运行状态,任务开始执行。
- 在线修改(Online Change):运行时修改代码并热更新,无需停机,但有限制(不能改变任务/变量结构等)。
注意:激活配置会重启运行时,需理解其影响,尤其在生产环境。
- 登录(Login):建立在线连接,查看实时值、断点。
- 变量监视:查看/修改当前值。
- 下载(Download):将代码下载到运行时。
- 重启(Restart):冷/热重启 PLC。
小结:工程结构是「配置→编程→编译→激活→运行→在线调试」的闭环,理解各环节是排查问题的基础。
IEC 61131-3 定义了五种标准编程语言,TwinCAT 3 全部支持:
- ST(Structured Text,结构化文本):类 Pascal 的文本语言,适合复杂逻辑,最常用。
- LD(Ladder Diagram,梯形图):继电器逻辑图,适合开关逻辑。
- FBD(Function Block Diagram,功能块图):图形化功能块连线,适合信号流。
- SFC(Sequential Function Chart,顺序功能图):状态机/流程图,适合顺序控制。
- IL(Instruction List,指令表):类汇编的文本语言,逐渐少用。
本手册重点讲 ST 的概念,因为它是文本编程的主流,也与 .NET 开发者思维最接近。
ST 由声明区与实现区组成:
- 声明区:定义变量、类型、常量等。
- 实现区:包含赋值、条件、循环、函数调用等语句。
其语言特点:大小写不敏感、使用分号分隔语句、用关键字(如 VAR、IF、FOR)组织结构、支持布尔逻辑与算术运算。
基本数据类型(按位宽分类):
- 布尔型:
BOOL(真/假)。 - 整数型:
BYTE/SINT(8 位)、WORD/INT(16 位)、DWORD/DINT(32 位)、LWORD/LINT(64 位),无符号/有符号对应。 - 浮点型:
REAL(32 位单精度)、LREAL(64 位双精度)。 - 字符串:
STRING(固定长度字节串)、WSTRING(宽字符串)。 - 时间类型:
TIME、TOD(Time of Day)、DATE、DT(Date and Time)、LTIME。 - 位/字节:
BIT(位串)。
理解位宽与有/无符号,是避免数据溢出、类型转换错误的基础。
变量声明在 VAR...END_VAR 块中,按作用域分类:
- 局部变量:POU 内的
VAR。 - 输入/输出变量:
VAR_INPUT(输入)、VAR_OUTPUT(输出)、VAR_IN_OUT(输入输出/引用)。 - 全局变量:在 GVL 中声明的
VAR_GLOBAL,全局可见。 - 常量:
VAR CONSTANT。 - 静态/实例变量:功能块内部的持久变量。
变量修饰符(如 RETAIN 掉电保持、PERSISTENT 持久化)影响数据在重启/断电后的保留行为。
ST 支持的语句类型(概念层面):
- 赋值:将表达式结果赋给变量。
- 条件:
IF...THEN...ELSIF...ELSE...END_IF。 - 选择:
CASE...OF...END_CASE。 - 循环:
FOR、WHILE、REPEAT...UNTIL。 - 调用:调用功能块/函数,如布尔触发
FB(...)、沿触发等。 - 返回:
RETURN。
表达式支持算术、比较、逻辑、位运算,以及类型转换函数(如 INT_TO_REAL)。
DUT(Data Unit Type)用于自定义数据类型:
- 结构体(STRUCT):把多个不同类型字段组合成一个整体,适合表示「对象/记录」,如一个轴的多个属性。
- 枚举(ENUM):定义一组命名常量,表示有限状态,如运行模式。
- 别名(TYPE 别名):给已有类型起新名字,增强可读性。
- 联合体/数组:也可在 DUT 中定义。
结构体字段的顺序与大小决定了其内存布局,这与 ADS 通信中的「结构体映射」直接相关(见第 5 章)。
TwinCAT 3 在 IEC 61131-3 基础上引入面向对象扩展:
- 支持方法(METHOD)、属性(PROPERTY)、继承(EXTENDS)、接口(INTERFACE)、抽象/多态。
- 适合大型、可复用的工程结构。
小结:ST 与类型系统是 PLC 编程的基石,理解数据类型与作用域能显著减少编程与通信阶段的错误。
实时系统要求在确定的时间内响应事件,且行为可预测(deterministic)。TwinCAT 通过专用实时内核,在 Windows 上为控制任务分配确定性的执行窗口,避免被普通进程(如系统服务、浏览器)抢占。
- 硬实时:必须在截止时间内完成,否则视为失败(如伺服控制)。
- 软实时:允许偶尔超时,但整体性能受影响。
- 优先级:数值越小优先级越高(TwinCAT 中 0 为最高)。高优先级任务抢占低优先级任务。
- 循环时间(Cycle Time):任务一次循环的目标耗时,如 PLC 任务 10ms、NC 任务 1ms。
- 实时性约束:任务的实际执行时间(Jitter)必须远小于循环时间,才能保证稳定。
配置原则:关键、高频、对时间敏感的任务优先级更高;CPU 负载需留余量。
看门狗用于检测任务是否「卡死」或超时。若任务在设定时间内未完成(或持续占用超限),系统可触发报警或停机,防止失控。TwinCAT 的任务配置中可设定看门狗时间与行为。
多任务并发访问同一变量可能产生数据一致性问题。TwinCAT 提供机制保证一致性:
- 任务间通信:通过共享变量,但需注意访问原子性。
- 同步机制:如
VAR_ACCESS、锁、或通过特定任务间通信原语。
常见风险:一个任务写、另一个任务读时读到中间值(撕裂读/写)。对跨任务共享的结构体/大数据尤其需谨慎。
- 控制周期与 CPU 负载:周期越短,CPU 占用越高。
- I/O 同步:I/O 刷新与任务周期同步,减少数据不一致。
- 程序复杂度:避免在实时任务中做繁重计算或大数组处理。
小结:实时性由「任务优先级 + 循环时间 + 看门狗 + 数据一致性」共同保证,是运动控制与快速逻辑的关键。
ADS(Automation Device Specification) 是 Beckhoff 的通信协议,用于 TwinCAT 组件之间、以及外部应用(如 .NET、C++、Python)与 TwinCAT 运行时之间的通信。它基于 TCP/IP(也可通过其他传输),是访问 TwinCAT 变量、服务、状态的统一接口。
ADS 采用客户端/服务器模型:客户端(如 .NET 程序)发送请求,服务器(TwinCAT 运行时/系统服务)响应。
- AmsNetId:TwinCAT 节点的网络地址,形如
192.168.0.112.1.1。前 4 段常对应 IP,后 2 段为路由/系统标识。每个节点必须唯一。 - AmsPort:节点内部的端口号,标识具体的服务/运行时。常见端口:
- 851:PLC 运行时(标准 PLC,第一运行时)。第二运行时为 852,以此类推。
- 10000:系统服务(System Service),用于查询设备状态、重启、诊断等。
- 15000 等:其他服务(如 NC、高级功能)。
理解「NetId 定位节点、Port 定位服务」是 ADS 寻址的核心。
路由定义了本机如何访问其他 TwinCAT 节点。ADS 通信要求双方建立路由关系:
- 静态路由:手动配置,常见 TCP/IP 类型,指定对端 IP 与 NetId。
- 动态路由:自动发现,适用于同一网段/广播环境。
- 回程路由(Back Route):对方能访问我,也需要配置,否则单向通信失败。
路由配置是「无法连接」类问题最常见的根源之一。
TwinCAT 把 PLC 变量按符号路径暴露给 ADS,路径形如:
- 全局变量:
GVL_Points.nCount。 - 结构体字段:
GVL_Points.stAxis.dActual。 - 数组元素、嵌套结构同样按路径访问。
编译时生成符号表(Symbol 信息),ADS 客户端据此知道变量的类型、地址与可访问性。符号必须在运行时可用(即程序已编译/激活),否则访问失败。
ADS 需要把 PLC 类型映射为外部语言(如 .NET)类型:
| PLC 类型 | .NET 类型(典型) |
|---|---|
BOOL |
bool |
INT / SINT / DINT |
short / sbyte / int |
REAL / LREAL |
float / double |
STRING |
string |
| 结构体(STRUCT) | 对应 .NET 结构体/类(按字段顺序与大小) |
结构体映射需要保证字段顺序、大小、对齐(Pack)一致,否则读写会错位。这是 C# 侧常见的坑。
ADS 设备有两个状态维度:
- ADS 状态(AdsState):如
Run(运行)、Stop(停止)、Config(配置)、Reset等。 - 设备状态(DeviceState):具体组件状态,如 PLC 是否正常。
查询设备状态常用于连通性测试与故障诊断:能成功查询状态即证明路由与端口可达。
- 本地连接:本机有 TwinCAT 运行时/路由器,客户端直接连接本机端口。
- 远程连接:客户端无本地 TwinCAT,可内嵌/借助 ADS 路由器(如管理式 TCP 路由器)建立到远程节点的路由,再连接远程端口。
理解两种模式,便于在不同部署环境(开发机 vs 生产机)间切换。
小结:ADS 通信 = NetId/Port 寻址 + 路由可达 + 符号寻址 + 类型映射,四者缺一不可。
现象:连接失败、超时、Error 0x... 类错误。
排查方向:
- 对端 AmsNetId 与 IP 是否正确。
- 是否配置了到对端的路由,且对端是否有回程路由。
- 网络是否可达(ping 通、防火墙放行 ADS 端口)。
- TwinCAT 路由器/运行时是否已启动。
现象:读写符号时报「Symbol not found」。
排查方向:
- 符号路径拼写是否正确(大小写、命名空间、
GVL_Points是否qualified_only)。 - 程序是否已编译/激活,符号表是否已生成。
- 目标运行时是否为对应 PLC 端口(851)。
现象:写入时类型转换失败、读回值异常。
排查方向:
- PLC 类型与外部类型是否一致(如 INT 应为
short/int,而非long)。 - 是否传入了错误 CLR 类型导致 ADS 库强制转换失败。
- 结构体字段顺序、大小、对齐(Pack)是否与 PLC 端一致。
现象:能连接但读写无响应/报错。
排查方向:
- 目标 AdsState 是否为
Run(运行态才可读写变量)。 - 是否处于
Config/Stop等非运行状态。 - 是否因安全/许可未激活而受限。
- TwinCAT System Manager / XAE 诊断视图:查看路由、状态、日志。
- TwinCAT 的
Tc命令行工具:查路由、状态。 - ADS 错误码:通过错误码(
0x...)定位具体原因。 - 网络工具:
ping、端口检查等。
小结:排错顺序通常是「网络可达性 → 路由 → 目标状态 → 符号 → 类型」,逐层排查。
| 术语 | 含义 |
|---|---|
| TwinCAT | Beckhoff 的软件自动化平台,PC-based 控制。 |
| XAE | 工程开发环境(Visual Studio 集成),编程与配置。 |
| XAR | 运行时环境,实时执行程序。 |
| Soft PLC | 软件 PLC,在 PC 上以软件方式实现 PLC 功能。 |
| POU | 程序组织单元(Program/Function Block/Function)。 |
| ST | 结构化文本,IEC 61131-3 文本编程语言。 |
| DUT | 数据类型定义(结构体/枚举/别名)。 |
| GVL | 全局变量列表。 |
| Task | 任务,调度单元,决定执行频率与优先级。 |
| Cycle Time | 任务循环时间。 |
| Watchdog | 看门狗,检测任务超时/卡死。 |
| AmsNetId | TwinCAT 节点网络地址。 |
| AmsPort | 节点内服务端口(851 PLC、10000 系统服务等)。 |
| ADS | Automation Device Specification,TwinCAT 通信协议。 |
| Route | 路由,节点间的连接定义。 |
| Symbol | 符号,PLC 变量的寻址路径与元数据。 |
| Activate | 激活配置,写入目标并生效。 |
| Online Change | 在线修改,运行时热更新代码。 |
| EtherCAT | Beckhoff 的实时以太网现场总线。 |
| NC | 运动控制运行时。 |
| HMI | 人机界面。 |
| TwinSAFE | 功能安全解决方案。 |
| RETAIN | 掉电保持变量。 |
| Jitter | 抖动,任务实际执行时间波动。 |
本手册为概念性知识文档,不包含代码示例。如需配套实战练习或深入某一专题,可进一步扩展。