TcAdsClient
是倍福(Beckhoff)提供的 ADS(Automation Device Specification)通信接口的核心类,用于通过 C# 实现与 TwinCAT PLC 的数据交互。以下是其关键功能与实现方法:
1. 连接与断开 PLC
-
连接方法:
使用Connect()
方法指定目标 PLC 的AmsNetId
(如192.168.0.1.1.1
)和端口号(默认851
)。示例:TcAdsClient PLC_Client = new TcAdsClient(); PLC_Client.Connect("192.168.0.1.1.1", 851); // 连接 PLC
若连接成功,
IsConnected
属性返回true
。 -
断开连接:
调用Disconnect()
方法,并释放句柄资源以避免内存泄漏:PLC_Client.Disconnect();
2. 变量读写操作
-
变量句柄创建:
通过CreateVariableHandle()
根据 PLC 变量路径生成句柄(如TestAxisCtrl.AxisFb.Enabled
)。示例:int handle = PLC_Client.CreateVariableHandle("TestAxisCtrl.AxisFb.Enabled");
-
同步读写:
- 读取变量:使用
ReadAny()
并指定数据类型(如bool
、double
):bool enabled = (bool)PLC_Client.ReadAny(handle, typeof(bool));
- 写入变量:使用
WriteAny()
传递句柄和值:PLC_Client.WriteAny(handle, true); // 写入布尔值
- 读取变量:使用
-
流式读写(适用于复杂数据类型):
通过AdsStream
和AdsBinaryReader/Writer
处理字节流,例如读取字符串时需指定编码:AdsStream sStream = new AdsStream(50); AdsBinaryReader reader = new AdsBinaryReader(sStream); string str = reader.ReadPlcString(50, Encoding.ASCII); // 读取长度为50的ASCII字符串
3. 事件驱动通信
-
变量监控:
使用AddDeviceNotificationEx()
注册变量变化事件,并设置触发模式(如AdsTransMode.OnChange
)。示例:int notifyHandle = PLC_Client.AddDeviceNotificationEx( "TestAxisCtrl.AxisFb.ActPos", AdsTransMode.OnChange, 100, // 采样间隔(ms) 100, // 最大延迟(ms) AxisActPos, // 本地缓存变量 typeof(double) ); PLC_Client.AdsNotificationEx += ProcessOutput; // 绑定回调函数
-
回调处理:
在事件处理函数中,通过NotificationHandle
区分变量并更新界面或逻辑:private void ProcessOutput(object sender, AdsNotificationExEventArgs e) { if (e.NotificationHandle == notifyHandle) { double pos = (double)e.Value; ActPosBox.Text = pos.ToString(); } }
4. 数据类型与编码
-
支持类型:
TcAdsClient
支持 PLC 的常见类型,包括BOOL
、BYTE
、INT
、LREAL
(双精度浮点)、STRING
等。- 字符串需注意编码(如 ASCII 或 Unicode)和长度声明。
- 数组需通过索引访问(如
MAIN.bvar[0]
)。
-
错误处理:
使用try-catch
捕获异常(如连接超时或变量不存在):try { PLC_Client.WriteAny(handle, value); } catch (AdsErrorException ex) { MessageBox.Show($"写入失败: {ex.Message}"); }
5. 实际应用场景
- 工业控制:
- 控制电机启停、读取位置/速度反馈。
- 实现 HMI 界面与 PLC 的实时数据同步。
- 物联网集成:
结合倍福的 TF6760 模块,通过 HTTP/REST API 将 PLC 数据推送至云端。
注意事项
- 资源释放:读写完成后调用
DeleteVariableHandle()
释放句柄。 - 线程安全:在 UI 线程外操作时需使用
Invoke
更新控件。 - 性能优化:高频读写建议使用异步方法(如
ReadAsync
)或批量传输。
通过上述方法,TcAdsClient
可高效实现 C# 与 TwinCAT PLC 的交互,适用于工业自动化、设备调试等场景。具体代码示例可参考倍福官方文档。