ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

LabVIEW 对接 Beckhoff EK1100 EtherCAT 从站实战指南

LabVIEW 对接 Beckhoff EK1100 EtherCAT 从站实战指南 1. 为什么 EK1100 接 LabVIEW 这件事值得单独拿出来说Beckhoff 的 EK1100 是一块 EtherCAT 耦合器本身长得不起眼两个网口、一个电源触点、一排 E-bus 触点插在导轨上就像个哑巴模块。但凡是做过 Beckhoff 系统的人都知道它是整个 EtherCAT 从站网络的入口——所有 EL 系列模块都挂在它后面主站要跟这些模块说话第一步就是先跟 EK1100 把链路建起来。问题就出在这个第一步上。如果你用的是 TwinCAT 做主站那 EK1100 基本是即插即用扫描一下就能认出来什么都不用管。但现实里很多项目的主站不是 TwinCAT而是 LabVIEW。LabVIEW 本身不原生支持 EtherCAT 主站协议栈它得靠第三方库、靠 DLL 封装、靠共享内存或者 TCP 中转才能跟 EtherCAT 网络搭上话。这一搭坑就来了。我前后做过三个用 LabVIEW 对接 Beckhoff EtherCAT 从站的项目从最开始的完全摸不着头脑到后来能稳定跑起来中间踩的坑足够写一篇长文。这篇东西就是把这些经验整理出来给正在或者准备走这条路的人一个参考。不管你是刚接触 EtherCAT 的新手还是 LabVIEW 老手但第一次碰 Beckhoff 硬件下面这些内容应该都能帮你省掉不少试错时间。核心关键词先摆出来Beckhoff EK1100、LabVIEW、EtherCAT、TwinCAT。这四个词贯穿全文后面所有讨论都围绕它们展开。2. 整体方案设计LabVIEW 到底怎么跟 EK1100 对话2.1 先搞清楚 EK1100 在 EtherCAT 网络里的角色EtherCAT 的网络结构是主从模式。主站Master只有一个从站Slave可以有很多个。EK1100 是耦合器它的作用是把 EtherCAT 的物理层信号转换成 E-bus 信号让后面的 EL 系列模块能接进来。你可以把它理解成一个翻译官——主站说的话是 EtherCAT 协议后面的模块只懂 E-busEK1100 负责两边传话。这里有个关键点EK1100 本身不处理数据它只是通道。真正干活的是它后面的 EL 模块比如 EL1008 是数字量输入EL2008 是数字量输出EL3002 是模拟量输入。所以你在 LabVIEW 里要读写的对象其实是这些 EL 模块的通道数据EK1100 只是你进入这个网络的门。注意EK1100 有两个 RJ45 网口一个是 IN一个是 OUT。主站必须接 IN 口OUT 口用来级联下一个从站。接反了不会烧但网络起不来这个错误新手经常犯。2.2 LabVIEW 做 EtherCAT 主站的三种可行路径LabVIEW 不是不能做 EtherCAT 主站而是它没有内置的 EtherCAT 协议栈。NI 官方的方案是用 NI-Industrial Communications for EtherCAT 这个驱动但它只支持 NI 自己的实时机比如 cRIO、PXI普通 Windows 上的 LabVIEW 用不了。所以如果你手上只有一台普通电脑加 LabVIEW就得走别的路。我实际用过或者评估过的方案有三种第一种TwinCAT 做网关LabVIEW 通过 ADS 通信。这是最稳的路子。TwinCAT 跑在 Windows 上做 EtherCAT 主站负责跟 EK1100 和后面的模块通信LabVIEW 通过 ADS 接口读写 TwinCAT 的变量。ADS 是 Beckhoff 自己的通信协议有现成的 DLL 可以调LabVIEW 里用 Call Library Function Node 就能用。这个方案的优点是稳定、实时性好、Beckhoff 官方支持缺点是得装 TwinCAT而且 TwinCAT 和 LabVIEW 在同一台电脑上跑的时候要注意资源占用。第二种第三方 EtherCAT 主站库加 DLL 封装。市面上有一些第三方 EtherCAT 主站协议栈比如 SOEMSimple Open EtherCAT Master它是开源的可以编译成 DLL然后 LabVIEW 调用。这个方案不用装 TwinCAT但配置起来麻烦而且 SOEM 的稳定性和实时性取决于你的网卡和系统普通 Windows 上跑效果一般。第三种硬件网关中转。用一个支持 EtherCAT 主站的硬件网关比如某些品牌的协议转换器把 EtherCAT 转成 Modbus TCP 或者 TCP/IPLabVIEW 通过标准协议去读。这个方案最省事但成本高而且多了一层转换实时性会打折扣。综合来看如果你追求稳定和开发效率第一种方案TwinCAT ADS是最推荐的。下面主要围绕这个方案展开其他两种会在后面简单提一下。2.3 为什么 TwinCAT 和 LabVIEW 能共存很多人担心 TwinCAT 和 LabVIEW 装在同一台电脑上会冲突。实测下来只要注意几点共存完全没问题。TwinCAT 会接管网卡做实时通信LabVIEW 用的是普通 Windows 网络栈两者不抢同一个网卡就行。具体来说你给 TwinCAT 专门指定一块网卡接 EK1100LabVIEW 用另一块网卡或者同一块网卡的非实时通道做 ADS 通信。TwinCAT 的 ADS 通信走的是本地回环不经过物理网卡所以不会跟 EtherCAT 的实时流量打架。这一点我一开始也担心后来查了 Beckhoff 的文档才确认ADS 在本地是走 TCP 127.0.0.1 的跟 EtherCAT 的网卡是分开的。3. 核心细节解析从硬件接线到软件配置的完整链路3.1 硬件接线与上电顺序硬件这块看起来简单但细节不少。EK1100 的供电是通过 E-bus 触点从上一个模块取的但第一个模块——也就是 EK1100 本身——需要单独供电。它的电源触点是弹片式的接 24V DC。我建议用带保险的电源因为 E-bus 上的模块如果短路会拖垮整个网络。接线顺序是这样的24V 电源接到 EK1100 的电源触点然后 EK1100 的 IN 口接主站网卡OUT 口接下一个从站如果有的话。后面的 EL 模块直接插在 EK1100 右边的 E-bus 触点上不需要单独供电除非是功率模块。实操心得上电顺序很重要。先给 EK1100 和模块上电再启动 TwinCAT 扫描。如果先启动 TwinCAT 再上电有时候扫描不到从站得重新扫描。这个顺序问题我遇到过好几次后来养成习惯就再也没出过。3.2 TwinCAT 里的 EtherCAT 配置TwinCAT 装好之后第一步是新建一个 TwinCAT XAE 项目。然后在 Solution Explorer 里找到 I/O 下的 Devices右键 Scan。这时候 TwinCAT 会自动扫描网卡上的 EtherCAT 从站。如果 EK1100 和后面的模块都正常你会看到它们依次出现在设备树里。扫描的时候有个细节TwinCAT 会问你要不要用Free Run模式。对于大多数应用选 Free Run 就够了。如果你的应用对同步要求很高比如多轴联动那就要用 DCDistributed Clocks模式。DC 模式需要 EK1100 和后面的模块都支持而且配置起来更复杂后面会单独说。扫描完成后你会在 Devices 下面看到 EK1100 和它后面的所有 EL 模块。每个模块下面有 Inputs 和 Outputs 两个文件夹里面是具体的通道变量。这些变量就是你在 LabVIEW 里要读写的对象。3.3 ADS 通信的基本原理ADS 是 Automation Device Specification 的缩写是 Beckhoff 定义的一套通信协议。它可以在同一台电脑上的不同进程之间通信也可以跨网络通信。TwinCAT 的运行时Runtime会开一个 ADS 服务器LabVIEW 作为客户端去连接它读写 TwinCAT 里的变量。ADS 的通信模型是端口 索引组 索引偏移。每个 TwinCAT 模块都有一个端口号比如 851 是 PLC 运行时501 是 I/O 运行时。索引组和索引偏移用来定位具体的变量。对于 EtherCAT 从站的变量索引组通常是 0x0000索引偏移是变量在过程映像里的偏移地址。听起来有点绕但实际操作中你不需要手动算这些。TwinCAT 会给你每个变量分配一个地址你可以在 TwinCAT 里查到。LabVIEW 这边用 ADS DLL 的时候把这些地址填进去就行。3.4 LabVIEW 调用 ADS DLL 的方式Beckhoff 提供了 ADS 的 DLL叫 TcAdsDll.dll通常在 TwinCAT 安装目录下。LabVIEW 里用 Call Library Function Node 调用这个 DLL 的几个核心函数AdsPortOpen打开 ADS 端口返回一个端口句柄。AdsGetLocalAddress获取本地 ADS 地址用于连接。AdsSyncReadReq同步读请求读取从站变量。AdsSyncWriteReq同步写请求写入从站变量。AdsPortClose关闭端口。这些函数的参数比较多尤其是AdsSyncReadReq和AdsSyncWriteReq需要传一个结构体指针。在 LabVIEW 里你需要用 Cluster 来构造这个结构体然后取它的地址传进去。这一步是 LabVIEW 调 DLL 的难点很多人卡在这里。我当时的做法是先在 C 语言里写一个简单的测试程序把 ADS 的读写跑通确认参数没问题然后再搬到 LabVIEW 里。这样出了问题容易定位是 DLL 调用的问题还是参数的问题一目了然。4. 实操过程从零搭建 LabVIEW 与 EK1100 的通信4.1 环境准备与软件安装先说软件清单。你需要TwinCAT 3XAE 版本不是 XARLabVIEW2015 或更高版本我用的 2018Beckhoff ADS DLLTwinCAT 安装时自带一块支持 EtherCAT 的网卡Intel 的网卡兼容性最好安装顺序建议先装 TwinCAT再装 LabVIEW。TwinCAT 安装的时候会问你要不要装 ADS 组件一定要勾上。LabVIEW 安装没什么特别的默认选项就行。注意TwinCAT 和 LabVIEW 都装好之后TwinCAT 会把自己的网卡驱动替换成实时驱动。如果你发现 LabVIEW 的网络功能不正常了检查一下是不是网卡被 TwinCAT 接管了。解决办法是给 TwinCAT 指定一块专门的网卡其他网卡保持 Windows 默认驱动。4.2 TwinCAT 项目配置的详细步骤打开 TwinCAT XAE新建一个项目。在 Solution Explorer 里展开找到 I/O Devices。右键 Devices选 Scan。弹出的对话框里会让你选网卡选接 EK1100 的那块。扫描完成后你会看到设备树里出现了 EK1100 和后面的模块。双击 EK1100在右边的属性页里可以看到它的状态。如果显示 OPOperational说明通信正常。如果是 INIT 或者 PREOP说明有问题通常是接线或者供电的问题。接下来要配置过程映像。在 TwinCAT 里每个从站的输入输出变量都会映射到过程映像里。你可以在 EK1100 的属性页里找到 Process Image 选项卡看看变量有没有正确映射。默认情况下TwinCAT 会自动映射但有时候需要手动调整。配置完成后激活配置。TwinCAT 会提示你重启到运行模式点确定就行。重启后TwinCAT 图标会变成蓝色表示运行中。4.3 LabVIEW 端的 ADS 通信实现LabVIEW 这边新建一个 VI。首先调用AdsPortOpen这个函数没有参数返回一个端口句柄。然后调用AdsGetLocalAddress获取本地 ADS 地址。这个地址是一个结构体包含 NetID 和端口号。接下来是读操作。调用AdsSyncReadReq参数包括端口句柄、ADS 地址、索引组、索引偏移、数据长度、数据缓冲区。索引组和索引偏移从 TwinCAT 里查数据长度根据变量类型定比如一个 BOOL 是 1 字节一个 INT 是 2 字节。写操作类似调用AdsSyncWriteReq参数差不多只是数据缓冲区变成输入。这些函数调用的时候要注意数据类型。LabVIEW 默认的整数是 32 位的但 ADS 的索引组和索引偏移是 16 位的需要转换。还有数据缓冲区要用字节数组不能用 LabVIEW 的数值类型直接传。我当时的做法是封装了一个子 VI把 ADS 的读写操作都包进去输入输出用 LabVIEW 的数值类型内部转换成 ADS 需要的格式。这样主程序里调用起来就很简单不用每次都处理那些底层细节。4.4 一个完整的读写示例假设你要读 EK1100 后面第一个 EL1008 模块的第一个通道。EL1008 是 8 通道数字量输入第一个通道的索引组是 0x0000索引偏移是 0x0000数据长度是 1 字节。在 LabVIEW 里你先打开 ADS 端口然后调用AdsSyncReadReq传入端口句柄、ADS 地址、索引组 0x0000、索引偏移 0x0000、长度 1、缓冲区。返回值如果是 0表示成功缓冲区里就是通道的状态。写操作类似比如你要控制 EL2008 的第一个通道索引组 0x0000索引偏移 0x0000长度 1缓冲区里写 0x01 表示打开0x00 表示关闭。实操心得索引偏移的计算有时候会让人头疼。TwinCAT 里每个模块的变量偏移是累加的第一个模块从 0 开始第二个模块接着第一个模块的长度往后排。如果你不确定可以在 TwinCAT 的 Process Image 里查看那里有每个变量的确切地址。5. 常见问题与排查技巧实录5.1 TwinCAT 扫描不到 EK1100 怎么办这是最常见的问题。排查顺序如下检查网线是不是接在 EK1100 的 IN 口。接 OUT 口扫描不到。检查 EK1100 的电源是不是正常。电源触点上应该有 24V。检查网卡是不是被 TwinCAT 正确接管。在 TwinCAT 的网卡设置里看看。检查 EK1100 的 LED 状态。正常运行时RUN 灯是绿的如果闪红或者不亮说明有问题。如果以上都正常还是扫描不到试试换一块网卡。有些网卡的 EtherCAT 兼容性不好尤其是 Realtek 的网卡问题比较多。Intel 的网卡最稳。5.2 ADS 通信报错怎么排查ADS 通信报错通常有几个错误码错误码含义可能原因0x01端口未打开忘记调用 AdsPortOpen0x02端口已打开重复调用 AdsPortOpen0x06目标端口未找到TwinCAT 运行时没启动0x07目标机器未找到ADS 地址填错了0x0B索引组无效索引组填错了0x0C索引偏移无效索引偏移填错了排查的时候先看错误码然后对照上表。最常见的是 0x06TwinCAT 没启动或者没进运行模式。其次是 0x0C索引偏移算错了。5.3 LabVIEW 调用 DLL 时的内存问题LabVIEW 调 DLL 的时候内存管理是个大坑。ADS 的读写函数需要传一个缓冲区指针LabVIEW 里要用 Initialize Array 创建一个字节数组然后取它的地址传进去。如果数组大小不对或者地址取错了轻则数据不对重则 LabVIEW 崩溃。我的经验是缓冲区大小一定要跟数据长度匹配不能多也不能少。还有调用完 DLL 之后要及时释放内存不然长时间运行会内存泄漏。注意LabVIEW 的 Call Library Function Node 里参数类型要选对。ADS 的端口句柄是 32 位整数要用 I32。ADS 地址是结构体要用 Cluster。数据缓冲区是字节数组要用 Array of U8。5.4 EtherCAT 的 Sync0 和 Sync1 是什么Sync0 和 Sync1 是 EtherCAT 的分布式时钟DC同步信号。Sync0 是主同步信号所有从站都跟它对齐。Sync1 是辅助同步信号用于更精细的同步控制。如果你的应用对同步要求不高用 Free Run 模式就行不用管 Sync0 和 Sync1。如果要用 DC 模式那就要配置这两个信号配置起来比较复杂建议参考 Beckhoff 的官方文档。5.5 卸载 TwinCAT 后 LabVIEW 网络异常TwinCAT 卸载的时候有时候不会把网卡驱动恢复成 Windows 默认驱动。结果就是 LabVIEW 的网络功能不正常甚至上不了网。解决办法是手动恢复网卡驱动打开设备管理器找到被 TwinCAT 接管的网卡右键更新驱动选 Windows 默认驱动。这个问题我遇到过两次第一次折腾了半天才找到原因。后来养成习惯卸载 TwinCAT 之前先手动把网卡驱动恢复再卸载就没出过问题。6. 进阶话题从能跑到跑得稳6.1 实时性优化LabVIEW 在 Windows 上跑实时性本来就一般。如果你对实时性要求高比如控制伺服轴那 Windows 上的 LabVIEW 可能不够用。这时候可以考虑用 NI 的实时机cRIO 或者 PXI上面跑 LabVIEW Real-Time通过 EtherCAT 跟 EK1100 通信。NI 的实时机有内置的 EtherCAT 主站支持配置起来比 Windows 上简单。如果只能用 Windows那就要在软件层面优化。比如把 ADS 通信放在单独的循环里用生产者消费者模式避免跟 UI 线程抢资源。还有ADS 的读写尽量用同步方式异步方式虽然不阻塞但容易出乱序问题。6.2 多从站网络的配置EK1100 后面可以挂很多从站最多 65535 个。实际项目中几十个从站是常见的。多从站的时候过程映像的偏移计算就很重要。每个从站的变量偏移是累加的你要确保每个变量的地址都算对。TwinCAT 里可以自动计算偏移但有时候需要手动调整。我的做法是在 TwinCAT 里把每个从站的变量都命名好然后导出变量列表在 LabVIEW 里按名字查找而不是按偏移。这样即使偏移变了只要名字不变LabVIEW 这边就不用改。6.3 跟其他通信方式的对比LabVIEW 跟 EtherCAT 从站通信除了 ADS还有 Modbus TCP 和 TCP/IP 两种方式。Modbus TCP 需要从站支持 Modbus 协议EK1100 本身不支持得加一个网关。TCP/IP 更灵活但需要自己定义协议开发量大。ADS 的优势是 Beckhoff 原生支持稳定、高效。缺点是只能在 Beckhoff 的生态里用换其他品牌的 EtherCAT 从站就不行了。所以选方案的时候要考虑项目的长期需求如果以后可能换品牌那就要考虑更通用的方案。7. 我个人在实际操作中的几点体会做 LabVIEW 对接 Beckhoff EK1100 这件事技术上的难点其实不多更多的是细节和耐心。我最大的体会是不要急着写代码先把硬件和 TwinCAT 配置跑通。很多人一上来就写 LabVIEW 程序结果通信不通回头查发现是 TwinCAT 没配好白白浪费很多时间。还有一点是文档要勤查。Beckhoff 的官方文档写得很详细尤其是 ADS 的 API 文档每个函数的参数都有说明。LabVIEW 这边的文档相对少一些但 NI 的论坛上有很多例子可以参考。我遇到问题的时候第一反应是查文档第二反应是搜论坛基本上都能找到答案。最后说一个小的技巧用 TwinCAT 的 Scope 功能监控变量。TwinCAT 自带一个 Scope 工具可以实时看变量的变化。调试的时候先在 TwinCAT 里确认变量正常再去 LabVIEW 里读这样能快速定位问题是在 TwinCAT 端还是 LabVIEW 端。这个技巧帮我省了很多排查时间。
返回列表