资讯详情

资讯详情

LabVIEW与Beckhoff EK1100 EtherCAT通信实战:TwinCAT ADS方案详解

1. 为什么EK1100接LabVIEW这件事值得单独拿出来讲Beckhoff EK1100 这个耦合器模块在 EtherCAT 圈子里算是老熟人了。它本身不复杂一个 RJ45 进、一个 RJ45 出右边挂一堆 EL 系列的 IO 端子24V 供电E-bus 触点自动识别通电就能跑。真正让人头疼的不是 EK1100 本身而是当你想用 LabVIEW 去跟它对话的时候——你会发现LabVIEW 原生并不直接讲 EtherCAT 这门语言。这就是问题的核心。EtherCAT 是一个实时工业以太网协议它的数据帧在物理层上跑的是标准以太网但在协议层上完全不是 TCP/IP 那一套。LabVIEW 擅长的是串口、TCP、Modbus、NI-VISA 这些通用通信方式它没有内置的 EtherCAT 主站协议栈。所以你不能像打开一个 TCP 连接那样直接连到 EK1100 上读数据。那为什么还有这么多人想用 LabVIEW 接 EK1100原因很实际很多实验室、高校、小型自动化项目里上位机软件就是 LabVIEW 写的视觉检测、数据采集、界面显示都在 LabVIEW 里而现场设备用的是 Beckhoff 的 EtherCAT IO。你不可能为了几个 IO 点把整个上位机重写一遍所以就得想办法让 LabVIEW 和 EK1100 之间搭上一座桥。这座桥怎么搭有几种走法每种走法的坑不一样。我前后做过四五个类似的项目从最粗暴的 Modbus 转换到比较正规的 TwinCAT ADS 通信中间踩的坑足够写一篇长文。下面我把整个思路、选型逻辑、实操步骤和踩坑记录都摊开讲。注意本文讨论的是 LabVIEW 作为上位机与 Beckhoff EtherCAT 系统交互的工程实践不涉及任何网络穿透或非合规通信手段。所有方案均基于标准工业通信协议。2. 先搞清楚EK1100到底在系统里扮演什么角色2.1 EK1100不是主站它只是耦合器很多人第一次接触 EK1100 的时候会有一个误解以为它像 PLC 一样能主动处理逻辑。不是的。EK1100 是 EtherCAT 从站耦合器它的职责非常单一把 EtherCAT 通信过来的数据帧转换成 E-bus 信号传给右侧的 EL 系列端子模块同时把 EL 端子的输入数据打包回 EtherCAT 帧里发回去。它自己不做任何逻辑运算不存任何程序也没有 IP 地址的概念。你在 TwinCAT 里扫描设备的时候能看到它是因为 TwinCAT 作为 EtherCAT 主站通过广播寻址发现了这个从站。EK1100 的身份是挂在 EtherCAT 总线上的一个节点仅此而已。这意味着什么意味着你不能用 LabVIEW 直接连EK1100。你必须有一个 EtherCAT 主站由主站去跟 EK1100 通信然后 LabVIEW 再跟主站通信。这个主站可以是 TwinCAT 软主站跑在工控机上也可以是嵌入式主站模块还可以是带 EtherCAT 主站功能的运动控制卡。2.2 EtherCAT的数据帧为什么不能直接被LabVIEW解析EtherCAT 的数据帧结构跟普通以太网帧有本质区别。普通以太网帧的 EtherType 字段是 0x0800IP或 0x0806ARP而 EtherCAT 用的是 0x88A4。这个 EtherType 值在标准网卡驱动里通常不会被上层协议栈处理它直接透传到网卡硬件层面。EtherCAT 主站需要在网卡驱动层做特殊处理把 0x88A4 的帧直接读写绕过操作系统的 TCP/IP 协议栈。这就是为什么 TwinCAT 安装的时候会替换掉你的网卡驱动——它需要实时网卡驱动来保证 EtherCAT 帧的收发时序。LabVIEW 跑在用户态它没有能力直接操作网卡驱动去收发 0x88A4 帧。即使你用 LabVIEW 的 TCP/IP 函数去监听也抓不到 EtherCAT 帧因为协议栈根本不往上传。所以LabVIEW 直接读 EtherCAT这条路从原理上就走不通。2.3 那LabVIEW到底能通过什么方式拿到EK1100的数据既然不能直接读那就得找一个中间人。这个中间人必须能跟 EtherCAT 主站通信同时又能跟 LabVIEW 通信。常见的中间人方案有这么几种方案中间人LabVIEW侧接口实时性适用场景TwinCAT ADSTwinCAT 软主站ADS DLL / .NET中等工控机LabVIEW上位机Modbus TCP 网关协议转换网关Modbus TCP较低简单IO采集OPC UATwinCAT OPC UA ServerOPC UA Client中等标准化数据交换共享内存TwinCAT 自定义DLL调用DLL高同一台工控机串口转换模块通信模块VISA串口低少量IO、低成本这几种方案我都实际用过下面逐个拆解它们的原理、配置步骤和坑点。重点放在 TwinCAT ADS 方案上因为这是最正规、最稳定、也最值得深入讲的一条路。3. TwinCAT ADS方案最正规但也最容易卡住的路径3.1 ADS协议的本质是什么ADS 全称 Automation Device Specification是 Beckhoff 定义的一套设备间通信协议。它跑在 TCP 之上默认端口 48898也可以走本地消息机制。ADS 的核心概念是端口和索引组每个 ADS 设备有一个 AMS Net ID类似 IP 地址的作用每个变量有对应的索引组Index Group和索引偏移Index Offset。TwinCAT 作为 EtherCAT 主站会把所有从站的 IO 映射到自己的过程映像区。这个过程映像区可以通过 ADS 被外部程序读写。LabVIEW 通过 ADS DLL 调用就能读到 EK1100 下面挂的 EL 端子的输入值也能写输出值。关键点在于ADS 通信的实时性取决于 TwinCAT 的周期时间和 ADS 的响应速度。一般来说1ms 到 10ms 的周期是可以做到的但对于需要微秒级同步的场景ADS 就不够了。3.2 在TwinCAT里需要做哪些配置假设你已经装好了 TwinCAT 3并且 EK1100 和 EL 端子已经正常扫描到了。接下来需要做几件事第一确认 EtherCAT 主站状态是 OPOperational。在 TwinCAT 的 Solution Explorer 里展开 EtherCAT 节点看状态灯是不是绿色。如果是 PREOP 或者 SAFEOP说明还有问题先解决这个再往下走。第二创建 PLC 变量或者直接使用 IO 映射。如果你只是想让 LabVIEW 读 IO 值最简单的做法是在 TwinCAT 里建一个 PLC 项目把 EL 端子的输入输出映射到 PLC 变量上。比如 EL1008 的输入通道映射到MAIN.bInput1到MAIN.bInput8EL2008 的输出映射到MAIN.bOutput1到MAIN.bOutput8。第三激活配置并确认变量可以被 ADS 访问。在 TwinCAT 里右键 PLC 项目选择Build然后Activate Configuration。激活之后PLC 变量就会出现在 ADS 的符号表里。第四记下 AMS Net ID。在 TwinCAT 托盘图标右键选择Router然后Edit Routes能看到本机的 AMS Net ID格式类似192.168.1.100.1.1。这个 ID 在 LabVIEW 里要用到。提示如果你打算在同一台电脑上跑 TwinCAT 和 LabVIEWAMS Net ID 就是本机 ID。如果是两台电脑需要在 TwinCAT 的 Router 里添加对方的路由并且确保 48898 端口没有被防火墙挡住。3.3 LabVIEW侧调用ADS DLL的完整步骤LabVIEW 调用 ADS DLL 有两种方式一种是用调用库函数节点Call Library Function Node直接调TcAdsDll.dll另一种是用 .NET 的TwinCAT.Ads库。前者更底层但更灵活后者更方便但需要安装 TwinCAT 的 .NET 组件。我一般推荐用 Call Library Function Node 调TcAdsDll.dll因为这个 DLL 在 TwinCAT 安装目录下就有不依赖额外的 .NET 运行时。具体步骤如下第一步找到TcAdsDll.dll。默认路径是C:\TwinCAT\AdsApi\TcAdsDll\x64\TcAdsDll.dll64位系统或C:\TwinCAT\AdsApi\TcAdsDll\Win32\TcAdsDll.dll32位系统。注意 LabVIEW 的位数要和 DLL 的位数匹配32位 LabVIEW 只能调 32位 DLL。第二步在 LabVIEW 里创建一个 Call Library Function Node配置函数原型。ADS DLL 的核心函数有这么几个// 建立连接 long AdsPortOpen(void); // 获取本机AMS Net ID long AdsGetLocalAddress(AmsAddr *pAddr); // 读取变量 long AdsSyncReadReq(AmsAddr *pAddr, unsigned long indexGroup, unsigned long indexOffset, unsigned long length, void *pData); // 写入变量 long AdsSyncWriteReq(AmsAddr *pAddr, unsigned long indexGroup, unsigned long indexOffset, unsigned long length, void *pData); // 按名称读取 long AdsSyncReadByName(AmsAddr *pAddr, char *pSymName, unsigned long length, void *pData); // 关闭连接 long AdsPortClose(void);第三步定义 AmsAddr 结构体。这个结构体在 LabVIEW 里需要用簇来模拟typedef struct { unsigned char netId[6]; // AMS Net ID6字节 unsigned short port; // 端口号通常用851PLC运行时 } AmsAddr;在 LabVIEW 里netId 可以用一个包含6个 U8 的数组表示port 用 U16 表示。整个簇按字节对齐总共8字节。第四步调用AdsPortOpen打开端口然后调用AdsSyncReadByName按变量名读取数据。变量名的格式是MAIN.bInput1这种注意大小写敏感。第五步读取完成后调用AdsPortClose关闭端口。虽然不关也不会立刻出问题但长期运行的程序最好还是关掉避免资源泄漏。3.4 变量名寻址和地址寻址的区别与选择ADS 支持两种寻址方式按变量名Symbolic和按索引组/偏移Index Group/Offset。按变量名更直观但需要 TwinCAT 的符号表被正确加载按索引组/偏移更底层不依赖符号表但需要你手动查地址。按变量名的方式变量名必须跟 TwinCAT PLC 里定义的完全一致包括大小写。如果变量是在结构体里格式是MAIN.stInputs.bInput1。如果变量是数组格式是MAIN.arrInputs[0]。按索引组/偏移的方式需要知道变量的索引组和偏移量。这些信息可以在 TwinCAT 的Symbol Information里查到或者通过 ADS 的AdsSyncReadWriteReq动态获取。索引组通常是 0x4020PLC 变量区偏移量是变量在过程映像里的字节偏移。我个人的经验是如果变量不多用按变量名的方式最省事如果变量很多或者需要动态访问用索引组/偏移的方式更灵活。但要注意索引组/偏移的方式在 TwinCAT 重新编译后可能会变所以不适合长期固定的项目。4. 那些年我在EK1100接LabVIEW上踩过的坑4.1 32位和64位不匹配导致DLL调用失败这是最常见也最容易被忽略的问题。LabVIEW 2015 中文版默认装的是 32位版本而 TwinCAT 3 在 64位系统上默认装的是 64位版本。你拿 32位 LabVIEW 去调 64位TcAdsDll.dll结果就是 Call Library Function Node 直接报错错误代码大概是无法加载库或者函数未找到。解决办法有两个要么装 32位的 TwinCAT安装时可以选要么装 64位的 LabVIEW。我建议后者因为现在 64位 LabVIEW 已经很成熟了而且 64位系统下内存寻址更方便。怎么确认 LabVIEW 的位数打开 LabVIEW点 Help - About LabVIEW里面会写LabVIEW 2015 (32-bit)或者(64-bit)。怎么确认 DLL 的位数用 Dependency Walker 或者直接看路径Win32文件夹下的是 32位x64文件夹下的是 64位。4.2 AMS Net ID写错导致连接超时AMS Net ID 是一个 6字节的地址格式通常是x.x.x.x.x.x。本机的 AMS Net ID 在 TwinCAT 托盘图标里能看到但很多人会把它跟 IP 地址搞混。IP 地址是 4字节AMS Net ID 是 6字节虽然前 4字节通常跟 IP 地址一样但后面还有两字节。比如你的工控机 IP 是192.168.1.100AMS Net ID 可能是192.168.1.100.1.1。在 LabVIEW 里填 AmsAddr 的时候netId 数组要填[192, 168, 1, 100, 1, 1]port 填851。如果填错了AdsSyncReadByName会返回一个非零错误码通常是0x20或者0x21意思是目标不可达或者端口未打开。这时候先检查 AMS Net ID再检查 TwinCAT 的 Router 配置里有没有添加对应的路由。4.3 TwinCAT卸载不干净导致重装后ADS端口被占用TwinCAT 的卸载是出了名的不干净。你从控制面板卸载了 TwinCAT但注册表里、驱动里、服务里还残留一堆东西。重装之后ADS 端口 48898 可能被旧的进程占用导致新的 TwinCAT 起不来。我遇到过一次卸载 TwinCAT 后重装结果AdsPortOpen一直返回错误。查了半天发现是旧的TcAdsDll还在内存里没释放而且系统服务TcSysSrv还在跑。解决办法是手动删掉残留的服务和注册表项具体步骤停止所有 TwinCAT 相关的服务在 services.msc 里找 Tc 开头的服务删除C:\TwinCAT整个目录用注册表编辑器搜索 TwinCAT 和 Beckhoff删掉相关项重启电脑重新安装 TwinCAT这个过程比较暴力但确实有效。如果你不想这么麻烦可以在安装新版本之前先用 Beckhoff 官方的卸载工具清理一遍。4.4 EtherCAT从站状态卡在PREOP的排查思路EK1100 接上之后TwinCAT 扫描到了设备但状态一直是 PREOP进不了 OP。这时候 LabVIEW 那边读到的数据全是 0 或者直接报错。排查思路是这样的先看 EK1100 的 LED 灯。如果 RUN 灯是绿色常亮说明 EtherCAT 通信正常如果 RUN 灯闪烁或者红色说明通信有问题。再看 EL 端子的灯如果 EL 端子没有正常初始化EK1100 也进不了 OP。常见原因有这么几个一是 EtherCAT 网线质量不行用了普通的办公网线而不是工业以太网线二是网卡不兼容TwinCAT 支持的网卡型号有限Realtek 的很多网卡都不行建议用 Intel 的三是 E-bus 供电不足EK1100 右侧挂了太多 EL 端子24V 供电电流不够。提示TwinCAT 对网卡很挑。我实测下来Intel I210、I219、I350 这些网卡都很稳Realtek 的 RTL8168 系列经常出问题。如果实在没有 Intel 网卡可以在 TwinCAT 安装时选择兼容模式但实时性会打折扣。4.5 LabVIEW读取ADS数据时的字节序问题ADS 读取的数据是按小端序Little-Endian排列的。如果你读的是一个 U16 或者 U32LabVIEW 默认也是小端序所以直接读没问题。但如果你读的是一个结构体或者数组就需要特别注意字节对齐和顺序。我遇到过一次读一个包含 4个 U8 和 1个 U16 的结构体结果 U16 的值总是错的。后来发现是 TwinCAT 在结构体里做了字节对齐U16 前面插了一个填充字节。解决办法是在 LabVIEW 里也按同样的对齐方式解析或者干脆在 TwinCAT 里把结构体改成字节对齐用{attribute pack_mode : 1}。5. 除了ADS还有哪些路可以走5.1 Modbus TCP网关方案的适用边界如果你的需求只是读几个 IO 点不需要微秒级同步那 Modbus TCP 网关是最省事的方案。市面上有很多 EtherCAT 转 Modbus TCP 的网关模块比如 HMS Anybus、Profinet 转 Modbus 之类的。你把网关接在 EK1100 后面网关再通过网线连到工控机LabVIEW 用 Modbus TCP 函数直接读寄存器就行。这个方案的优点是 LabVIEW 侧完全不需要装 TwinCAT也不需要调 DLL用内置的 Modbus 函数就能搞定。缺点是实时性差Modbus TCP 的轮询周期通常在 10ms 到 100ms 之间而且网关本身有延迟。另外网关的寄存器映射需要手动配置EL 端子的通道跟 Modbus 寄存器的对应关系要自己算。我一般只在两种情况下用这个方案一是项目预算有限不想买 TwinCAT 授权二是 LabVIEW 程序已经写好了不想大改只想加几个 IO 点。5.2 OPC UA方案在标准化项目中的优势OPC UA 是现在工业通信的主流标准TwinCAT 3 自带 OPC UA Server 功能。你只需要在 TwinCAT 里启用 OPC UA Server把需要暴露的变量发布出去LabVIEW 侧用 OPC UA Client 就能读。这个方案的最大优势是标准化。OPC UA 有完善的安全机制、信息模型和跨平台支持适合大型项目或者需要跟 MES、SCADA 集成的场景。LabVIEW 2015 之后的版本对 OPC UA 的支持也还可以有现成的 VI 库可以用。缺点是配置比较繁琐TwinCAT 的 OPC UA Server 需要配置证书、用户权限、变量映射LabVIEW 侧也需要配置端点 URL 和安全策略。而且 OPC UA 的通信开销比 ADS 大实时性不如 ADS。5.3 共享内存方案在单机场景下的极限性能如果 TwinCAT 和 LabVIEW 跑在同一台工控机上共享内存是最快的方案。TwinCAT 提供了共享内存接口TcSmApiLabVIEW 可以通过调用 DLL 读写共享内存。这个方案的延迟可以做到微秒级比 ADS 快一个数量级。但共享内存的缺点是只能在同一台机器上用而且需要自己管理内存映射和同步。TwinCAT 的共享内存接口文档不算详细很多细节需要自己摸索。我用过一次调试花了整整两天最后发现是内存偏移量算错了。6. 几个容易被忽略的工程细节6.1 LabVIEW的循环周期和TwinCAT周期怎么匹配LabVIEW 的 While Loop 如果没有加定时会全速运行CPU 占用率很高。如果你在循环里调 ADS 读取函数每次读取都要走一遍 TCP 通信周期不稳定。建议在循环里加一个等待函数周期设成 TwinCAT 周期的 2到3倍。比如 TwinCAT 的 EtherCAT 周期是 1ms那 LabVIEW 的读取周期可以设成 2ms 到 5ms。这样既能保证数据及时更新又不会给 ADS 通信太大压力。如果你需要更精确的同步可以用 LabVIEW 的定时循环Timed Loop配合 TwinCAT 的同步信号。但这就比较复杂了一般项目用不上。6.2 错误处理不能只靠LabVIEW的错误簇LabVIEW 的错误簇很方便但 ADS DLL 返回的错误码不一定能直接映射到 LabVIEW 的错误簇里。有些错误码是 ADS 特有的比如0x706表示变量未找到0x745表示目标端口未打开。这些错误码需要你自己解析然后转换成有意义的信息。我一般会在 LabVIEW 里写一个专门的错误解析 VI把 ADS 错误码转换成中文描述方便调试。这个 VI 不复杂就是一个 Case Structure把常见的错误码列出来就行。6.3 长时间运行时的内存泄漏问题ADS DLL 的AdsSyncReadReq和AdsSyncWriteReq函数如果频繁调用可能会有内存泄漏。我遇到过一次LabVIEW 程序跑了三天之后内存占用从 200MB 涨到了 2GB最后直接崩溃。解决办法是尽量减少 ADS 调用次数把多个变量的读取合并成一次批量读取。ADS 支持批量读取用AdsSyncReadReq读一个连续的内存块然后在 LabVIEW 里解析。这样比逐个变量读取效率高得多也不容易泄漏。6.4 防火墙和杀毒软件对ADS通信的干扰Windows 防火墙默认会拦截 48898 端口的入站连接。如果你是在两台电脑之间做 ADS 通信需要在防火墙里放行 48898 端口。另外某些杀毒软件会把 ADS 通信当成可疑行为拦截比如卡巴斯基、360 之类的。如果 ADS 连接时好时坏先检查防火墙和杀毒软件。7. 我个人的选型建议和实操心得做了这么多项目我现在选方案的原则很简单看实时性要求和项目规模。如果实时性要求在 10ms 以上IO 点数不多直接用 Modbus TCP 网关省事省心。如果实时性要求在 1ms 到 10ms 之间IO 点数较多用 TwinCAT ADS 方案稳定可靠。如果实时性要求在微秒级而且 TwinCAT 和 LabVIEW 在同一台机器上考虑共享内存方案。如果项目需要跟上层系统集成用 OPC UA 方案。还有一个经验不管用哪种方案都先在 TwinCAT 里把 EtherCAT 通信调通确认 EK1100 和 EL 端子都进 OP 状态了再去搞 LabVIEW 侧。很多人一上来就写 LabVIEW 程序结果调了半天发现是 EtherCAT 本身没配好白白浪费时间。另外LabVIEW 调用 DLL 的时候一定要用错误簇串起来每个 DLL 调用后面都接一个错误处理。这样一旦出错能快速定位是哪个函数出的问题。我见过太多人把所有 DLL 调用平铺在程序框图里出了错根本不知道是哪一步。最后说一个细节TwinCAT 的 ADS 端口号PLC 运行时通常是 851NC 轴是 500IO 是 300。如果你要读的是 IO 变量而不是 PLC 变量端口号要改成 300。这个在 Beckhoff 的文档里有写但很多人会忽略。提示如果你用的是 LabVIEW 2015 中文版注意它的字符串编码默认是 GBK而 ADS 的变量名是 ASCII。如果变量名里有中文可能会出问题。建议变量名全用英文。8. 从EK1100这个点延伸出去的系统思维EK1100 接 LabVIEW 这件事表面上看是一个通信协议转换的问题实际上它反映的是工业自动化系统里一个很典型的矛盾现场设备用的是实时工业以太网而上位机软件用的是通用计算平台。这两者之间的鸿沟需要中间件来填补。理解了这个矛盾你就能举一反三。比如你以后遇到汇川 H5U 带 24个伺服轴的 EtherCAT 通信程序或者 LabVIEW 跟 NI 实时机的 TCP 交互本质上都是同一个问题怎么让非实时系统跟实时系统对话。答案永远是找一个合适的中间人然后把这个中间人的配置和接口吃透。我在这个过程中最大的收获是不要试图绕过中间人。我见过有人想用 LabVIEW 直接抓 EtherCAT 帧用 WinPcap 库去监听网卡结果抓到的数据根本没法解析因为 EtherCAT 的帧结构不是标准以太网帧。还有人想用 LabVIEW 的 Modbus 函数直接读 EK1100结果连都连不上因为 EK1100 根本不支持 Modbus。所以老老实实按标准方案来把 TwinCAT 配好把 ADS 调通把错误处理写扎实。这些基础工作做完了后面的数据采集、界面显示、逻辑控制都是水到渠成的事。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →