ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

TwinCAT3通过EL6021串口模块实现自定义协议通讯的完整指南

TwinCAT3通过EL6021串口模块实现自定义协议通讯的完整指南 1. 项目背景与核心需求在工业自动化项目中我们常常会遇到一个看似简单却颇为棘手的问题如何让高端的PLC控制器与那些“不按常理出牌”的第三方设备或老旧系统进行数据交换这些设备往往只提供一个简单的串口RS232/RS485通讯协议也是厂家自定义的文档可能还不全。最近我在一个设备改造项目里就碰到了这个情况上位机是倍福Beckhoff的TwinCAT3系统而下位机是一台老款的国产仪表只支持RS485串口和一套自定义的ASCII码协议。如果为此专门去开发一个网关或者更换仪表成本和时间都不允许。这时倍福的EL6021串口通讯模块就成了解决问题的关键。它本质上是一个将串行数据流映射到PLC过程映像区的硬件模块让TwinCAT3可以像读写普通I/O变量一样直接处理串口收发来的字节流。结合TwinCAT3强大的软件功能我们就能在PLC里实现自定义协议的解析与组包从而与任何支持串口的设备“对话”。这个项目的目标就是打通TwinCAT3通过EL6021模块与串口调试助手模拟第三方设备进行自由协议通讯的完整链路。这不仅是解决特定问题的技术方案更是一种应对非标设备集成的通用思路。2. EL6021模块硬件配置与接线要点EL6021是倍福EtherCAT端子模块家族中的一员专门用于串行通讯。在动手写代码之前正确的硬件安装和配置是通讯稳定的基石这一步的疏忽往往会导致后续各种莫名其妙的故障。2.1 模块选型与物理安装EL6021通常有多个子型号例如EL6021-0010代表一个RS232接口EL6021-0020代表一个RS485接口。你需要根据现场设备的接口类型来准确选择。我的项目中使用的是EL6021-0020RS485。在硬件组态时你需要将它添加到EtherCAT主站设备下的端子模块列表中。TwinCAT3的硬件扫描功能通常能自动识别出模块型号和名称。物理接线是第一个容易踩坑的地方。以RS485为例A线正和 B线负必须严格按照设备的定义连接接反了会导致无法通讯。有些设备标注为D和D-其对应关系通常是 A-D, B-D-。终端电阻在RS485网络的两端即EL6021端和远端设备端通常需要接入120欧姆的终端电阻以消除信号反射。EL6021模块上一般有拨码开关或配置软件来启用内部的终端电阻。如果通讯距离很短如小于10米且速率不高有时可以省略。但在不稳定时首先检查终端电阻是否正确启用。接地良好的共地对于RS485通讯的抗干扰能力至关重要。确保EL6021的电源地0V与远端设备的电源地可靠连接。注意RS232接线相对简单主要是TX、RX、GND三线制但同样要注意交叉连接PLC的TX接设备的RXPLC的RX接设备的TX。2.2 TwinCAT3中的模块参数化硬件安装好后需要在TwinCAT3开发环境XAE中对EL6021进行参数化配置。这是通过CoECANopen over EtherCAT字典参数实现的。在Solution Explorer中右键点击EL6021模块选择Append Box然后添加一个Serial设备。这会在模块下创建一个串口设备对象。双击这个串口设备对象打开其Parameter页面。这里需要配置的核心参数有Baud Rate波特率必须与对端设备严格一致如9600 19200 115200等。Data Bits数据位通常是8。Stop Bits停止位通常是1。Parity校验位根据协议选择None无校验、Even偶校验、Odd奇校验。Flow Control流控在自由协议中通常选择None。这些参数配置后会通过EtherCAT主站的Init命令下发给EL6021模块的固件。配置错误最直接的表现就是收发数据全是乱码或者根本收不到数据。一个实用的技巧是先将这些参数与已知能正常工作的串口调试助手设置保持一致进行初步测试。3. PLC程序中的数据缓冲区映射与处理EL6021模块的精妙之处在于它将串口这个“流”设备转换为了PLC熟悉的“内存映射”I/O。我们需要在PLC程序中定义与模块物理缓冲区对应的变量。3.1 过程映像区PIO变量声明在TwinCAT3的PLC项目中你需要为EL6021模块的输入和输出区域声明变量。这些变量的地址对应于模块的硬件偏移量。对于EL6021-0020其通道的地址映射通常是输出区PLC - 串口用于发送数据。例如从0x5000开始的一段区域。输入区串口 - PLC用于接收数据。例如从0x6000开始的一段区域。你可以在模块的Online标签页查看具体的地址范围。声明变量时可以使用AT %Q*和AT %I*关键字进行绝对地址映射。更清晰的做法是使用GVL全局变量列表并关联到硬件I/O映射。例如在GVL中声明VAR_GLOBAL // 发送缓冲区20个字节 fbSerialTxBuffer AT %QB5000 : ARRAY[0..19] OF BYTE; // 发送数据长度通常由模块参数定义这里仅为示例实际可能通过其他方式控制 nTxLength AT %QW5020 : UINT; // 接收缓冲区50个字节 fbSerialRxBuffer AT %IB6000 : ARRAY[0..49] OF BYTE; // 接收到的数据长度模块自动更新 nRxLength AT %IW6050 : UINT; END_VAR这里的关键是理解fbSerialTxBuffer数组中的每一个字节都会直接映射到EL6021模块的发送硬件缓冲区。当你向这个数组写入数据模块就会自动通过串口发送出去。同理串口接收到的字节会实时填充到fbSerialRxBuffer数组中nRxLength则反映了当前缓冲区中有效数据的字节数。3.2 自定义协议的数据帧处理逻辑自由协议通讯的核心就是在PLC里实现一个状态机来完成数据帧的组包、发送、接收和解析。这比使用标准的Modbus RTU等协议要灵活但也更复杂。发送逻辑组包根据设备协议将需要发送的命令码、数据、校验码等计算并填充到一个临时的字节数组aTxPacket中。例如一个简单的协议帧可能是[起始符0xAA] [长度] [命令码] [数据...] [CRC校验低字节] [CRC校验高字节]。填充发送缓冲区将组好的aTxPacket复制到映射的发送缓冲区变量fbSerialTxBuffer中。注意不要超过缓冲区声明的长度。触发发送EL6021模块通常有两种发送模式一种是“长度触发”即你设置好发送长度nTxLength后模块自动发送对应数量的字节另一种是“缓冲区管理”需要你通过控制某个特定的控制字Control Word位来启动发送。你需要查阅EL6021的手册来确定具体方式。例如可能需要将控制字的0x01位置1来启动一次发送。接收逻辑轮询接收长度在PLC的循环任务如MAIN中不断检查nRxLength变量。当它大于0时表示接收缓冲区有新数据。数据搬运将fbSerialRxBuffer中的数据复制到一个PLC内部的处理缓冲区aRxFifo中通常这是一个自定义的FIFO先进先出队列用于缓存可能不完整的报文。协议解析状态机对aRxFifo中的数据进行解析。状态机通常包含以下状态IDLE等待帧起始符。遍历aRxFifo直到找到约定的起始字节如0xAA。RECEIVING_LENGTH找到起始符后读取后续的长度字节。RECEIVING_DATA根据长度字节接收指定数量的数据体和校验码。CHECK_SUM数据收齐后计算CRC或和校验与接收到的校验码对比。FRAME_COMPLETE校验通过一帧有效数据解析完成将数据交付给业务逻辑处理并清空aRxFifo中已处理的部分。ERROR如果校验失败或超时则丢弃该帧数据状态机回到IDLE并可能记录错误。这个状态机的实现需要仔细处理边界情况比如一帧数据被分两次收到、缓冲区溢出、帧中间出现与起始符相同的数据字节等。4. 使用串口调试助手进行仿真与联调在实际连接真实设备前用串口调试助手进行仿真测试是最高效的调试方法。你可以用一台电脑运行TwinCAT3另一台电脑甚至同一台电脑用虚拟串口对运行串口调试助手来模拟下位机。4.1 调试环境搭建与工具选择我强烈推荐使用SSCOM或AccessPort这类功能强大的串口调试助手。它们不仅支持基本的收发还支持数据格式转换、定时发送、脚本调试等高级功能。对于这个项目你需要确保调试助手的串口参数波特率、数据位等与EL6021的配置完全一致。如果只有一台电脑可以使用如Virtual Serial Port Driver之类的软件创建一对虚拟的COM口例如COM3和COM4。在TwinCAT3中配置EL6021连接COM3在串口调试助手中打开COM4这样两者就能通过虚拟链路进行通讯了。4.2 通讯测试与故障排查流程一个系统化的测试流程能帮你快速定位问题硬件链路测试首先发送最简单的数据。在PLC程序中写一段简单的逻辑每隔1秒向发送缓冲区写入固定的几个字节如0x01, 0x02, 0x03并触发发送。在串口调试助手中观察是否收到完全一致的数据。如果收不到检查顺序硬件接线-模块电源与状态灯-TwinCAT3中EL6021的Online状态是否为OP运行-串口调试助手的端口号与参数是否正确。协议帧发送测试让PLC发送一个完整的协议帧。在串口调试助手接收区以十六进制显示模式查看。核对帧结构、长度、校验码是否正确。你可以利用调试助手的“发送新行”或“按十六进制发送”功能手动模拟设备回复一个正确的响应帧观察PLC程序能否正确解析并进入FRAME_COMPLETE状态。压力与异常测试这是发现程序健壮性问题的关键。快速连续发送在调试助手中设置定时发送以高于PLC处理周期的速度连续发送多帧数据测试PLC的FIFO缓冲区是否会溢出状态机是否会错乱。发送错误帧故意发送校验错误的帧、长度错误的帧、不完整的帧在半截停止观察PLC程序是否能正确丢弃并恢复。超时测试模拟设备无响应测试PLC中是否实现了接收超时机制并能从RECEIVING_DATA等状态安全地退回IDLE。在调试过程中充分利用TwinCAT3的在线监控和断点功能。在线监控fbSerialRxBuffer、nRxLength以及你内部状态机的状态变量可以清晰地看到数据流动和逻辑跳转的过程这是排查复杂协议问题的利器。5. 实战中的性能优化与稳定性保障当基本通讯功能实现后我们需要关注如何在复杂的工业现场环境中保证其长期稳定运行。这里有几个从实际项目中总结出的经验。5.1 缓冲区管理与防溢出策略EL6021模块的硬件缓冲区大小是有限的。如果PLC程序处理接收数据的速度慢于串口接收的速度就会发生缓冲区溢出导致数据丢失。除了在硬件上选择合适波特率在软件上必须实施保护双缓冲区乒乓操作不要直接在一个缓冲区上解析协议。可以声明两个或多个软件缓冲区BufferA,BufferB。当nRxLength指示有新数据时快速将硬件缓冲区数据memcpy到当前空闲的软件缓冲区如BufferA然后立即启动一个后台任务或函数块去解析BufferA同时将当前活动缓冲区切换到BufferB用于接收下一批数据。这能最大限度地减少因解析耗时导致的接收窗口丢失。流控的软件模拟对于不支持硬件流控RTS/CTS的设备可以在自定义协议里加入简单的“ACK/NACK”机制。PLC在处理完一帧并准备好接收下一帧时发送一个ACK信号给设备设备只有在收到ACK后才发送下一帧。这虽然降低了效率但极大地提高了在恶劣电磁环境下的可靠性。5.2 错误处理与诊断信息上报一个健壮的系统必须能感知故障并上报。CRC校验失败计数在全局变量中增加一个uiCrcErrorCount计数器。每次状态机进入ERROR状态且原因为CRC错误时计数器加1。可以在HMI上显示这个值当它短时间内快速增长时提示检查线路干扰或接地。通讯超时监控为每个需要持续通讯的设备定义一个TON接通延时定时器块作为看门狗。每次成功收到一帧有效数据就复位这个定时器。如果定时器到达预设时间如2秒则触发“设备通讯超时”报警并将状态机强制复位到IDLE。详细的状态字定义一个WORD或DWORD类型的状态变量用其中的每一个位来表示不同的状态或错误Bit0通讯使能Bit1正在发送Bit2正在接收Bit3帧错误Bit4超时错误等。将这个状态字映射到HMI或上位机便于远程诊断。5.3 与TwinCAT3高级功能的结合TwinCAT3不仅是一个PLC开发环境其强大的实时性和与Windows的交互能力可以让我们做得更多。利用ADS通讯记录日志你可以编写一个简单的TwinCAT3 Function Block当发生特定错误如解析失败、超时时通过ADSAutomation Device Specification协议将错误信息和相关数据如原始数据帧发送到一台Windows日志服务器或数据库。这对于分析间歇性故障非常有帮助。动态配置参数可以将波特率、设备地址等参数不写在硬编码的常量里而是放在Persistent Variables保持型变量或通过HMI输入。这样当需要更换不同型号的设备时无需修改和下载PLC程序在线修改参数即可极大地提高了灵活性。通过EL6021实现自由协议通讯是将倍福高端控制器的灵活性与底层串口设备连接起来的桥梁。这个过程虽然需要自己动手处理字节流和状态机但也给了你最大的控制权。掌握这套方法后你会发现面对那些“非标”的串口设备时不再需要寻找昂贵的专用网关手中的TwinCAT3系统就是最强大的集成工具。
返回列表