ARTICLE DETAIL

资讯详情

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

Beckhoff EK1100 与 LabVIEW 集成:TwinCAT 配置与 ADS 通信实战指南

Beckhoff EK1100 与 LabVIEW 集成:TwinCAT 配置与 ADS 通信实战指南 1. 为什么EK1100接LabVIEW这件事值得单独拿出来说Beckhoff EK1100这个耦合器模块在EtherCAT圈子里算是入门级标配了。它本身不复杂一头是EtherCAT输入一头是E-bus输出后面挂一堆EL系列的IO模块24V供电结构简单到几乎不需要看手册。但问题恰恰出在“简单”这两个字上——很多人第一次把它接到LabVIEW环境里的时候会发现事情远没有想象中那么顺。我最早接触这个组合是在一个数据采集项目上当时的需求很明确用LabVIEW做上位机通过EtherCAT读取一批模拟量和数字量信号。硬件选型的时候觉得EK1100加EL3008、EL1008这套组合性价比很高Beckhoff的TwinCAT生态也成熟。但真正开始动手才发现从TwinCAT到LabVIEW这条链路中间有好几个容易踩坑的地方而且这些坑在官方文档里往往一笔带过或者分散在不同章节里新手很难一次性理清楚。这篇文章主要面向两类人一类是已经用过LabVIEW、但对EtherCAT和Beckhoff硬件不太熟悉的工程师另一类是用过TwinCAT做PLC控制、但没怎么碰过LabVIEW上位机开发的自动化从业者。我会把从硬件接线、TwinCAT配置、到LabVIEW端通信实现的完整流程拆开来讲重点放在那些实际调试中容易出问题的地方比如ESI文件识别、变量映射、ADS通信配置、实时性设置这些环节。需要提前说明的是EK1100本身只是一个耦合器它不参与协议转换也不做数据处理真正让LabVIEW能读到数据的是TwinCAT提供的ADS接口或者EtherCAT主站库。所以整个方案的核心思路是TwinCAT负责EtherCAT主站管理和IO映射LabVIEW通过ADS或者共享内存的方式去读写TwinCAT里的变量。这个架构决定了后面所有的配置步骤和注意事项。2. 整体方案设计与核心思路拆解2.1 为什么不让LabVIEW直接做EtherCAT主站很多人第一反应是LabVIEW有没有直接的EtherCAT主站库能不能跳过TwinCAT这个问题我当初也查过。NI官方确实提供了一些工业通信工具包但EtherCAT主站这块LabVIEW原生支持并不完整。市面上有一些第三方EtherCAT主站方案可以在LabVIEW里调用但要么价格不菲要么配置复杂度很高而且和Beckhoff的E-bus模块兼容性需要额外验证。相比之下TwinCAT作为Beckhoff自家的主站软件对EK1100和EL系列模块的支持是最原生的。ESI文件EtherCAT Slave Information直接内置扫描设备、配置PDO映射、设置分布式时钟这些操作在TwinCAT里都是图形化完成的不需要手写XML。所以更务实的做法是让TwinCAT做它擅长的事——管理EtherCAT网络和IO映射然后LabVIEW通过ADS协议去访问TwinCAT的变量。这个架构的好处很明显TwinCAT负责实时性和协议栈LabVIEW负责界面、数据处理和上层逻辑。两者各司其职稳定性有保障。缺点是多了一层TwinCAT部署的时候需要在一台工控机上同时装TwinCAT和LabVIEW对系统环境有一定要求。2.2 ADS通信的基本原理ADSAutomation Device Specification是Beckhoff提供的一套通信协议本质上是在TCP/IP之上封装了一层设备寻址和变量访问的机制。TwinCAT运行时会在本机监听ADS端口默认851LabVIEW通过ADS DLL或者.NET接口去读写TwinCAT里的变量。ADS的寻址方式是这样的每个ADS设备有一个NetID通常本机是127.0.0.1.1.1和一个端口号TwinCAT PLC运行时通常是851。变量通过句柄Handle来访问第一次读取某个变量时需要先获取句柄之后可以用句柄直接读写效率更高。在LabVIEW里调用ADS常见的方式有三种一是用Beckhoff官方提供的ADS DLL通过Call Library Function节点调用二是用TwinCAT Automation Interface的.NET接口三是用第三方封装的LabVIEW ADS工具包。我个人推荐第一种因为DLL接口稳定文档也相对齐全虽然需要手动封装一些VI但可控性最强。2.3 硬件选型与接线要点EK1100的接线本身不复杂但有几个细节容易忽略。首先是供电EK1100需要24V直流供电通常通过端子模块的电源触点引入。如果后面挂的EL模块比较多要注意电流预算EL系列模块的E-bus电流消耗在手册里都有标注总消耗不能超过EK1100的供电能力。其次是EtherCAT网口的连接。EK1100有两个RJ45口一个是输入IN一个是输出OUT。如果EK1100是网络上的第一个从站那么IN口接主站网卡OUT口接下一个从站。如果EK1100是中间节点则IN口接上一个从站的OUT口。这个顺序不能搞反否则TwinCAT扫描不到设备。还有一个容易踩的坑是网卡选择。TwinCAT对主站网卡有兼容性要求不是所有千兆网卡都能用作EtherCAT主站。Intel的I210、I219系列通常没问题Realtek的一些型号可能会遇到兼容性问题。如果扫描不到EK1100先检查网卡是不是在TwinCAT的兼容列表里。3. TwinCAT端配置的完整流程与关键细节3.1 TwinCAT安装与版本选择TwinCAT目前主流的有两个版本TwinCAT 2和TwinCAT 3。TwinCAT 2比较老但稳定性好很多老项目还在用。TwinCAT 3是当前推荐版本支持64位系统和Visual Studio集成更好。如果只是做IO采集和ADS通信两个版本都能满足需求但TwinCAT 3在Windows 10/11上的兼容性更好。安装TwinCAT 3的时候有一个关键选项是否安装“TwinCAT 3 Engineering”和“TwinCAT 3 Runtime”。Engineering是开发环境Runtime是运行时。如果这台机器既要开发又要运行两个都要装。如果只是运行装Runtime就够了。另外安装过程中会提示是否安装“EtherCAT Slave”支持这个不需要勾选因为EK1100是作为从站被主站管理的主站端不需要额外的从站支持。安装完成后需要重启电脑然后在任务栏右下角找到TwinCAT图标切换到“Config”模式。这个模式切换很重要只有在Config模式下才能扫描和配置EtherCAT网络。配置完成后要切回“Run”模式TwinCAT才会开始正常通信。3.2 扫描EtherCAT网络与ESI文件处理打开TwinCAT XAE基于Visual Studio的工程环境新建一个TwinCAT项目然后在“I/O”节点下右键选择“Scan Devices”。这时候TwinCAT会通过主站网卡扫描EtherCAT网络上的所有从站。如果EK1100和后面的EL模块都正常供电、接线正确应该能看到它们依次出现在设备树里。这里有一个常见问题如果EK1100的ESI文件版本和TwinCAT自带的版本不匹配可能会提示“Device not found”或者“ESI file missing”。Beckhoff的ESI文件通常随TwinCAT安装包一起提供但如果你用的是比较新的EK1100固件版本可能需要从Beckhoff官网下载最新的ESI文件放到TwinCAT的ESI目录下通常是C:\TwinCAT\3.1\Config\Io\EtherCAT。ESI文件放进去之后需要在TwinCAT里刷新设备描述。具体操作是在“EtherCAT”节点上右键选择“Reload Device Descriptions”然后重新扫描。如果还是识别不到检查一下EK1100的固件版本在TwinCAT的设备信息里可以看到。3.3 PDO映射与变量链接扫描到设备之后下一步是配置PDO映射。PDOProcess Data Object是EtherCAT里实际传输的数据单元。每个EL模块都有自己的PDO配置比如EL3008是8通道模拟量输入它的PDO里就包含8个模拟量通道的值和状态字。在TwinCAT里PDO映射是自动完成的但你可以手动调整。比如EL3008默认的PDO可能包含一些不需要的状态信息你可以取消勾选来减少数据量。对于EK1100本身它主要提供E-bus的电源状态和诊断信息通常不需要额外配置。PDO配置完成后需要把PDO变量链接到PLC变量。在TwinCAT 3里如果你创建了一个PLC项目可以在“PLC”节点下定义变量然后在“I/O”节点下把这些变量链接到对应的PDO条目上。这个链接过程是双向的PLC变量可以读输入PDO也可以写输出PDO。这里有一个细节链接的时候要注意数据类型匹配。比如EL3008的模拟量输入是16位整数PLC变量也要定义成INT或者WORD类型。如果定义成REALTwinCAT会自动做类型转换但可能会有精度损失或者量程问题。我一般建议在PLC端用原始数据类型然后在LabVIEW端做标定和转换。3.4 激活配置与运行模式切换所有配置完成后点击“Activate Configuration”按钮TwinCAT会把配置下载到运行时。这时候会提示是否重启TwinCAT运行时选择“Yes”。重启后TwinCAT进入Run模式EtherCAT网络开始正常通信。在Run模式下你可以通过TwinCAT的“Online”视图查看每个从站的状态。EK1100和EL模块应该显示绿色的“OP”状态Operational表示通信正常。如果有模块显示“PREOP”或者“INIT”说明配置有问题需要检查PDO映射或者供电。还有一个容易忽略的点TwinCAT的Run模式有两种一种是“Run Mode”一种是“Config Mode”。在Run Mode下EtherCAT通信是激活的但你不能修改配置。如果需要修改要先切回Config Mode修改后再切回Run Mode。这个切换在调试阶段会频繁用到建议把TwinCAT图标固定在任务栏方便快速切换。4. LabVIEW端ADS通信的实现与调试4.1 ADS DLL的调用与VI封装在LabVIEW里调用ADS DLL核心是几个函数AdsPortOpen、AdsGetLocalAddress、AdsSyncReadWriteReq、AdsSyncReadReq、AdsSyncWriteReq、AdsPortClose。这些函数在Beckhoff的ADS DLL通常是TcAdsDll.dll里都有导出。首先需要把DLL放到LabVIEW能找到的路径下或者直接在Call Library Function节点里指定完整路径。然后按照ADS API的文档逐个封装成子VI。我一般会封装三个核心VI一个用于打开端口和获取本机地址一个用于读取变量通过句柄一个用于写入变量。封装的时候要注意参数类型。ADS API里的变量句柄是DWORD类型在LabVIEW里对应U32。变量长度也是DWORD但实际读取的时候要根据数据类型来定。比如读取一个INT变量长度就是2字节读取一个REAL变量长度就是4字节。还有一个细节ADS API的调用是同步的也就是说调用AdsSyncReadReq的时候LabVIEW会阻塞直到返回结果。如果通信超时默认的超时时间是5秒这个时间在调试阶段可能会觉得太长。可以在调用的时候传入一个更短的超时参数比如1000毫秒这样出问题的时候能更快发现。4.2 变量句柄的获取与管理ADS通信里变量句柄是一个关键概念。第一次访问某个变量时需要先通过变量名获取句柄之后可以用句柄直接读写。获取句柄的函数是AdsSyncReadWriteReq传入变量名和长度返回句柄。这里有一个坑变量名必须和TwinCAT里定义的完全一致包括大小写和路径。比如TwinCAT PLC里定义了一个变量MAIN.nAnalogValue那么在LabVIEW里获取句柄的时候变量名也必须是MAIN.nAnalogValue不能写成main.nAnalogValue或者MAIN.nAnalogvalue。句柄获取之后建议缓存起来不要每次读写都重新获取。因为获取句柄本身是一次ADS通信频繁调用会影响效率。我通常会在LabVIEW的初始化阶段把所有需要访问的变量句柄都获取一遍存到一个数组或者簇里后面读写的时候直接查表。如果TwinCAT重新下载了配置句柄可能会失效这时候需要重新获取。所以在LabVIEW的错误处理里要加上句柄失效的判断和重新获取的逻辑。4.3 数据类型转换与字节序处理ADS通信传输的是原始字节流LabVIEW端需要根据数据类型做转换。比如TwinCAT里的INT是16位有符号整数字节序是小端Little-EndianLabVIEW里需要用“Unflatten From String”或者手动做字节交换。对于模拟量输入EL3008输出的是16位整数范围通常是0到32767对应0到10V或者-32768到32767对应-10V到10V。具体量程要看模块的配置。在LabVIEW里我一般会先转成整数然后根据量程做线性标定转成实际的物理量。对于数字量EL1008是8通道数字输入每个通道对应一个位。ADS读取的时候可以一次读一个字节然后在LabVIEW里用“Boolean Array To Number”或者按位与操作来提取每个通道的状态。还有一个容易忽略的点TwinCAT里的BOOL变量在ADS里是按字节传输的一个BOOL占一个字节。如果PLC里定义了一个BOOL数组ADS读取的时候要按字节数组来读然后在LabVIEW里逐字节转换成布尔值。4.4 实时性与通信周期设置LabVIEW通过ADS读写TwinCAT变量通信周期取决于LabVIEW端的循环速度。如果LabVIEW用一个While循环以100ms的间隔读取数据那么实际的数据更新率就是10Hz。对于大多数数据采集应用这个速率是够用的。但如果需要更高的实时性比如1ms的周期就需要考虑用TwinCAT的实时任务来推送数据而不是LabVIEW主动轮询。TwinCAT 3支持“ADS Notification”机制也就是TwinCAT在变量变化时主动通知LabVIEW。这种方式比轮询效率高但LabVIEW端的实现要复杂一些需要注册回调函数。我一般只在高速采集的场景下用Notification普通采集用轮询就够了。另外LabVIEW的While循环里要加适当的延时不要让它全速运行。全速运行会占满CPU而且ADS通信频率过高可能会导致TwinCAT运行时不稳定。我通常会在循环里加一个10ms到100ms的延时具体看应用需求。5. 常见问题排查与避坑经验实录5.1 TwinCAT扫描不到EK1100怎么办这是最常见的问题排查顺序如下排查项可能原因解决方法网卡兼容性主站网卡不在TwinCAT兼容列表换Intel I210/I219网卡接线顺序IN/OUT口接反确认主站接EK1100的IN口供电EK1100未上电或电压不足测量24V供电检查电源触点ESI文件缺少对应版本的ESI文件从官网下载并放入ESI目录驱动状态TwinCAT未切换到Config模式任务栏图标切换到Config网卡驱动网卡驱动未绑定到TwinCAT在TwinCAT网卡设置里绑定我遇到最多的情况是网卡兼容性问题。有一次用了一台工控机板载网卡是Realtek的TwinCAT死活扫描不到EK1100。后来换了一个Intel的PCIe网卡问题立刻解决。所以如果排查了一圈还是不行优先怀疑网卡。5.2 ADS通信返回错误码怎么查ADS API返回的错误码是十六进制的比如0x00000000表示成功0x00000006表示端口未打开0x00000007表示目标设备未找到。完整的错误码列表可以在Beckhoff的ADS文档里查到。常见的错误码和处理方法0x00000006ADS端口未打开。检查AdsPortOpen是否成功调用返回的端口号是否有效。0x00000007目标设备未找到。检查TwinCAT运行时是否在Run模式NetID是否正确。0x0000000B变量未找到。检查变量名是否拼写正确变量是否在PLC里定义。0x00000015通信超时。检查网络连接或者增加超时时间。在LabVIEW里我一般会把ADS函数的返回值连到一个错误处理分支如果返回值不是0就弹出提示框显示错误码方便快速定位问题。5.3 LabVIEW读取的数据全是0或者不变这个问题通常有几个原因一是PDO映射没配置好TwinCAT没有把实际IO数据链接到PLC变量二是变量链接错误PLC变量没有正确链接到PDO三是LabVIEW读取的变量名不对读到了一个未使用的变量。排查方法先在TwinCAT的“Online”视图里查看PLC变量的值。如果TwinCAT里显示的值是正确的但LabVIEW读出来是0那问题在ADS通信端。如果TwinCAT里显示的就是0那问题在PDO映射或者硬件接线端。还有一个可能是EL模块的通道没有使能。比如EL3008的模拟量输入通道默认可能是关闭的需要在TwinCAT里手动使能。这个在模块的“CoE Online”参数里可以设置。5.4 TwinCAT和LabVIEW同时运行时的资源冲突TwinCAT运行时对系统实时性有要求它会接管网卡和CPU的一些资源。如果LabVIEW也在同一台机器上运行而且LabVIEW的循环占用大量CPU可能会影响TwinCAT的实时性导致EtherCAT通信不稳定。解决方法一是给TwinCAT的实时任务分配独立的CPU核心在TwinCAT的“Real-Time”设置里可以配置CPU亲和性二是降低LabVIEW循环的优先级在LabVIEW里用“Wait”函数控制循环速度三是如果条件允许把TwinCAT和LabVIEW分到两台机器上通过ADS over TCP/IP通信。我个人的经验是如果LabVIEW只是做数据采集和显示不做复杂的信号处理同一台机器上运行问题不大。但如果LabVIEW要做视觉处理或者高速控制最好还是分开部署。5.5 卸载TwinCAT后LabVIEW的ADS DLL失效这个问题比较隐蔽。TwinCAT安装的时候会注册ADS DLL到系统目录LabVIEW调用的时候是从系统目录加载的。如果卸载了TwinCATADS DLL可能也被删除了LabVIEW再调用就会报错。解决方法把TcAdsDll.dll复制一份到LabVIEW项目的目录下在Call Library Function节点里用相对路径引用。这样即使TwinCAT卸载了只要DLL还在LabVIEW的ADS调用就不会报错。当然没有TwinCAT运行时ADS通信本身是无法工作的但至少LabVIEW不会因为找不到DLL而崩溃。6. 从调试现场带回来的几个实操心得第一个心得是关于变量命名的。在TwinCAT里定义PLC变量的时候尽量用有意义的英文命名不要用中文或者拼音。虽然TwinCAT支持中文变量名但ADS通信的时候中文变量名可能会遇到编码问题LabVIEW端处理起来很麻烦。我一般用nAnalogIn1、bDigitalOut2这种命名方式简洁明了。第二个心得是关于配置备份的。TwinCAT的配置文件和LabVIEW的VI文件要定期备份尤其是TwinCAT的ESI文件和PDO映射配置。有一次我换了一台工控机重新配置的时候发现原来的ESI文件版本找不到了折腾了半天才从旧机器的备份里恢复出来。从那以后我养成了每次配置完成后把整个TwinCAT项目目录打包备份的习惯。第三个心得是关于调试顺序的。不要一上来就把LabVIEW和TwinCAT都配好然后联调这样出了问题很难定位。正确的顺序是先确保TwinCAT能扫描到EK1100和所有EL模块再确保PLC变量能正确读取IO数据最后再调LabVIEW的ADS通信。每一步都验证通过后再进行下一步这样出问题的时候排查范围小很多。第四个心得是关于文档记录的。EtherCAT的配置涉及很多参数比如PDO映射、分布式时钟设置、看门狗时间等。这些参数在调试的时候可能改来改去如果不记录过一段时间自己都忘了为什么这么设。我一般会在TwinCAT项目里建一个文本文件记录每次修改的参数和原因方便以后回溯。第五个心得是关于版本兼容性的。TwinCAT 3的不同版本之间ESI文件和ADS DLL可能有差异。如果项目要迁移到另一台机器最好确保两台机器的TwinCAT版本一致。如果版本不同先在一台机器上验证通过后再迁移不要两台机器同时改。这套EK1100接LabVIEW的方案我从第一次踩坑到现在能比较顺畅地完成配置大概经历了十几个项目。每次遇到新问题都会在笔记里记一笔慢慢积累下来现在基本上能在半天内完成从硬件接线到LabVIEW出数据的全流程。对于刚接触这个组合的工程师我的建议是不要急于求成先把TwinCAT端的配置吃透确保EtherCAT网络稳定运行然后再去调LabVIEW的ADS通信。TwinCAT端稳了LabVIEW端就只是API调用的问题难度会小很多。
返回列表