行业资讯
📅 2026/8/7 5:02:13
TwinCAT3 EL6021串口模块自由协议通讯实战:从硬件配置到PLC程序调试
1. 项目概述与核心价值最近在做一个设备数据采集的项目需要把一台老式仪表的数据通过串口读到TwinCAT3控制的PLC里。这种场景在工业现场太常见了很多存量设备只提供串口RS232/RS485通讯而新的控制系统又基于EtherCAT。我手头正好有倍福的EL6021串口模块就决定用它来打通这个链路。整个过程下来发现虽然官方有文档但真要实现一个稳定可靠的、基于自由协议也就是常说的自定义协议的串口通讯里面有不少细节和坑需要留意。这篇文章我就把从硬件接线、TwinCAT3配置、到PLC程序编写、以及与上位机串口调试助手比如SSCOM联调的全过程结合我踩过的几个坑详细拆解一遍。无论你是刚开始接触TwinCAT3串口通讯还是正在调试一个棘手的协议希望这些实战经验能帮你省点时间。EL6021这个模块本质上是将串行数据转换为EtherCAT网络上的过程数据在TwinCAT3里我们需要配置好它的参数并在PLC中编写程序来收发这些数据。而“自由协议”意味着没有Modbus RTU、USS这类标准协议栈可用我们需要自己处理数据帧的组包、解包、校验以及超时重发等逻辑。这听起来有点复杂但一旦理清思路你会发现它提供了最大的灵活性可以应对各种非标设备。2. 硬件准备与EL6021模块基础2.1 EL6021模块简介与选型考量EL6021是倍福Beckhoff的一款单通道串行接口模块支持RS232和RS485半双工两种电气标准。在项目选型时你需要根据现场设备的接口来决定。如果设备是标准的DB9 RS232口通常直接使用EL6021的RS232模式如果通信距离较远超过15米或者需要连接多个从站RS485是更好的选择。我这次对接的仪表是RS485接口所以选择RS485模式。这里有个关键点EL6021的端子定义。它的接线端子是4针的对于RS485模式通常使用端子1Data B 或 RXD-/TXD-和端子4Data A- 或 RXD/TXD端子2是GND端子3在RS485模式下通常不接。务必核对设备手册有些设备的A/B定义可能相反接反了会导致通信失败。我的经验是如果不通首先把A、B线对调一下试试这是排查硬件连接最快的方法。模块需要24V直流供电这个电源最好与控制柜的PLC系统电源隔离尤其是当串口连接的是外部独立设备时可以有效避免地环路引入的干扰。EL6021的EtherCAT接口是标准的直接插入EtherCAT总线即可TwinCAT3会自动识别。2.2 串口调试助手的选择与准备在PLC程序开发阶段串口调试助手是我们的“假设备”用来模拟真实仪表发送和接收数据。网络热词里提到了很多像SSCOM、XCOM、唐老鸭、正点原子等。我长期用的是SSCOM因为它小巧、免费、功能全支持多种编码显示和发送方式。准备工作如下准备一个USB转RS485/RS232适配器。如果你的电脑没有串口这是必备的。买一个质量好点的芯片推荐FTDI或CP2102稳定性比那些廉价芯片好很多。连接硬件将USB适配器的RS485端A/B与EL6021的RS485端A/B连接地线GND也接上。如果测试RS232则需要连接RX、TX和GND三根线注意交叉连接即适配器的TX接模块的RX适配器的RX接模块的TX。配置串口调试助手打开SSCOM选择正确的COM口在设备管理器中查看设置波特率、数据位、停止位、校验位。这些参数必须与后续在TwinCAT3中配置的EL6021参数完全一致这是通信的基石。通常先设置为9600波特率8数据位1停止位无校验N,8,1进行基础测试。3. TwinCAT3中的EL6021配置详解3.1 安装与扫描设备首先确保你的TwinCAT3开发环境已经安装。在TwinCAT3 XAEeXtended Automation Engineering环境中新建或打开一个项目。将你的倍福控制器或运行TwinCAT Runtime的PC设为活动目标。在“Solution Explorer”的“I/O”选项卡中右键点击“Devices”选择“Scan Devices”。如果你的EL6021模块已经正确上电并接入EtherCAT总线系统应该能扫描到它。扫描完成后你会看到一个名为“EL6021”的设备出现在设备树下。3.2 关键参数配置Online选项卡双击这个EL6021设备打开其配置对话框。最重要的配置都在“Online”选项卡里。这里面的每一个参数都至关重要配置错误直接导致通信失败。Operation Mode操作模式选择“RS485”或“RS232”根据你的硬件接线选择。我选择“RS485 (Half Duplex)”。Baud Rate波特率与你对接的设备或串口调试助手设置一致例如9600。Data Bits数据位通常为8。Stop Bits停止位通常为1。Parity校验位可选None无、Even偶校验、Odd奇校验。必须与对端匹配。Flow Control流控制在RS485自由协议通讯中通常选择“None”。RS232场景下根据设备要求选择。Framing帧设置这是自由协议的关键。由于我们自行处理数据帧这里通常不依赖模块的硬件帧检测。将“End Idle Time”和“Start Idle Time”设置为一个较小的值如1个字符时间或者使用“No Frame”模式。更常见的做法是在PLC程序里用超时时间来判定一帧数据的结束这样更灵活。我通常将“End Idle Time”设为5-10ms具体取决于波特率和帧间隔让模块在收到一串数据后如果空闲超过这个时间就产生一个接收中断信号给PLC提示“有一包数据到了”。这个时间需要根据实际设备的数据间隔来微调。配置完成后点击“Apply”或“OK”。然后别忘了将配置下载到控制器Activate Configuration。3.3 过程数据映射与变量关联配置好参数后我们需要在PLC程序中访问串口的数据。EL6021模块的过程数据Process Data主要包括接收缓冲区Input和发送缓冲区Output。在EL6021设备的“Process Data”选项卡或“I/O Mapping”中你会看到分配的输入和输出变量。通常输入变量PLC从模块读是一个字节数组如ARRAY[0..2031] OF BYTE代表接收缓冲区输出变量PLC向模块写也是一个字节数组代表发送缓冲区。长度2032字节是EL6021缓冲区的大小。我们需要在PLC的POUs程序组织单元中声明与这些I/O映射关联的变量。例如VAR fbSerialPort : FB_EL6021_SerialPort; // 这是一个我自定义的功能块用于封装通讯逻辑 aRxBuffer AT%I* : ARRAY[0..1023] OF BYTE; // 关联到EL6021的输入过程数据 aTxBuffer AT%Q* : ARRAY[0..1023] OF BYTE; // 关联到EL6021的输出过程数据 nRxLength : UINT; // 实际接收到的数据长度 bNewData : BOOL; // 新数据到达标志 END_VAR这里使用了AT声明将PLC变量直接映射到I/O地址。%I*和%Q*的具体地址需要在“I/O Mapping”中查看并填写。更现代的做法是使用“Link to PLC”功能在TwinCAT System Manager中直接将过程数据变量链接到PLC项目中的全局变量列表GVL这样更直观。4. PLC程序设计与自由协议处理逻辑4.1 通讯状态机设计处理自由协议串口通讯最稳健的方式是使用状态机State Machine。这能让程序逻辑清晰易于调试和维护。一个典型的状态机包括以下状态IDLE空闲等待发送命令或处理接收超时。SEND_COMMAND发送命令将组装好的命令帧写入aTxBuffer并触发EL6021发送。WAIT_RESPONSE等待响应启动一个定时器等待设备回应。同时监控接收缓冲区。PROCESS_RESPONSE处理响应当收到数据并确认帧完整后进行数据解析、校验。ERROR_HANDLING错误处理处理超时、校验错误、断线等情况。在TwinCAT3中我们可以用一个枚举类型定义这些状态并在一个循环执行的功能块如FB_SerialComm里用CASE语句实现。4.2 数据接收与帧判断逻辑如何从连续的字节流中判断一帧数据已经接收完整这是自由协议的核心。有几种常见方法固定长度如果协议帧长度固定只需计数接收到的字节数。特定结束符例如每帧数据以回车换行0x0D 0x0A结束。在接收中断中检查是否收到结束符。超时判定这是最通用和灵活的方法。利用EL6021配置的“End Idle Time”或自己在PLC中实现一个超时定时器。当收到第一个字节时启动定时器如果在超时时间内没有收到新的字节则认为一帧数据结束。我的实现通常结合结束符和超时双重判断以提高可靠性。在PLC程序中我会在每次EL6021的输入数据更新可以通过链接一个ADSREAD功能块轮询或利用EL6021提供的“Data Received”事件时将字节从aRxBuffer拷贝到一个自定义的环形缓冲区Ring Buffer或队列中然后在这个缓冲区中搜索帧头和帧尾。4.3 数据发送与流控制发送相对简单将待发送的字节数组复制到aTxBuffer中并确保设置正确的发送数据长度。EL6021模块通常提供一个控制字Control Byte或命令来触发发送。你需要查阅EL6021的手册看是写特定的命令到输出区还是通过ADS写参数来启动发送。对于RS485半双工通信有一个关键点收发切换。RS485接口在同一时刻只能发送或接收。EL6021模块通常会自动管理这个切换这就是为什么选择“RS485 (Half Duplex)”模式。但在程序逻辑上你必须在确保完全发送完成后才能将总线状态切换回接收并开始等待响应。在状态机中从SEND_COMMAND切换到WAIT_RESPONSE前最好加一个小的延时如10ms确保最后一个字节已经物理发送完毕。5. 与串口调试助手的联调实战5.1 初步连接测试首先进行最简单的测试让PLC通过EL6021发送一串固定的数据在串口调试助手上查看是否能收到。在PLC程序中初始化状态机到IDLE然后手动触发进入SEND_COMMAND状态。发送的数据可以简单定为Hello SSCOM!的ASCII码。在SSCOM中设置好相同的串口参数打开串口。激活TwinCAT3配置并运行PLC程序。如果一切正常你应该在SSCOM的接收框中看到“Hello SSCOM!”字符串。这个测试验证了从TwinCAT3到串口调试助手的发送通路是通的。如果收不到按以下顺序排查硬件连接A/B线是否接反USB适配器驱动是否正常COM口号是否正确参数匹配波特率、数据位、停止位、校验位是否完全一致TwinCAT配置EL6021的Operation Mode是否正确配置是否已下载并激活PLC程序发送的数据是否正确写入了aTxBuffer发送触发命令是否正确5.2 模拟设备响应测试接下来测试接收通路。让串口调试助手模拟仪表向EL6021发送一帧数据PLC程序需要正确接收并解析。在PLC程序中确保接收处理逻辑状态机中的WAIT_RESPONSE和PROCESS_RESPONSE状态已就绪。为了测试可以在成功接收一帧数据后将一个内部变量如bRxOk置位或者在Watch Table里观察接收缓冲区的内容。在SSCOM的发送框中输入你想要模拟的设备响应数据。例如假设设备响应协议是:010310000002F7一个Modbus RTU格式的帧这里仅作示例。注意选择正确的发送格式通常是16进制发送Hex。点击SSCOM的发送按钮。在TwinCAT3的在线监控中查看PLC是否进入了PROCESS_RESPONSE状态接收缓冲区aRxBuffer的前几个字节是否与发送的数据一致。如果PLC收不到数据排查点EL6021配置中的“End Idle Time”如果设置得太短可能数据还没发完就被认为帧结束了如果设置得太长PLC可能一直等待而不进入处理状态。对于短帧可以先尝试设置为5-10ms。PLC的轮询速度确保你的PLC任务如MAIN循环时间足够快例如10ms能及时处理接收中断或检查接收缓冲区。接收缓冲区处理逻辑检查你的帧判断逻辑超时或结束符是否过于严格导致无法识别测试帧。5.3 完整协议交互模拟最后模拟完整的“请求-响应”对话。这需要你在串口调试助手中使用“按指定协议格式回复”的功能或者手动操作。设计一个简单的协议。例如请求帧PLC发0x01 0x03 0x00 0x00 0x00 0x02设备地址01读寄存器响应帧SSCOM模拟发0x01 0x03 0x04 0x00 0x0A 0x00 0x14 0xCRC返回两个寄存器数据0x000A和0x0014在PLC程序中实现状态机发送请求帧 - 等待响应 - 超时或收到响应后解析。在SSCOM中你可能需要手动在收到请求帧后点击发送响应帧。更高级的测试可以使用SSCOM的“文件传输”或“脚本”功能自动回复。观察PLC程序是否能完成一次完整的状态循环并正确解析出响应数据中的0x000A和0x0014。这个阶段会遇到最多问题也是调试的重点。6. 常见问题排查与实战心得6.1 数据收发错乱或丢失症状有时能收到有时收不到收到的数据多了或少了几个字节。排查首要怀疑对象地线。尤其是RS485通信一定要接好GND。单端接地通常在控制器侧接地是常见做法避免地环路电流。波特率容错低质量的USB转串口适配器或长距离线路可能导致波特率偏差。尝试适当降低波特率如从115200降到9600测试。PLC任务周期与缓冲区如果PLC处理接收数据的任务周期太慢而数据来得太快可能导致缓冲区溢出。确保你的处理速度跟得上数据速率。可以增大EL6021的接收缓冲区或者在PLC中更频繁地读取数据。干扰RS485线路如果与动力线并行敷设容易引入干扰。使用双绞屏蔽电缆并将屏蔽层单端接地。6.2 收到大量乱码或固定错误字符症状接收到的数据完全不是发送的比如发送0x01收到0x81。排查数据位、停止位、校验位设置错误这是最常见的原因。请逐字核对TwinCAT3中EL6021的配置与对端设备或串口助手的配置。一个校验位设置错误就会导致所有字节的最高位翻转。电气标准不匹配确认是RS232还是RS485接线是否正确。6.3 通信不稳定时好时坏症状设备重启后通信正常运行一段时间后失败。排查终端电阻RS485总线在高速或长距离时需要在总线两端的设备上并联一个120欧姆的终端电阻以消除信号反射。检查你的布线是否需要在EL6021端或设备端添加终端电阻。电源问题检查24V电源是否稳定。EL6021模块对电源波动比较敏感。程序逻辑缺陷检查状态机是否有未妥善处理的异常分支导致状态“卡死”。增加全面的超时和错误恢复机制。例如在任何等待状态如WAIT_RESPONSE中都必须有一个超时跳转到ERROR_HANDLING或IDLE的路径。6.4 TwinCAT3配置相关陷阱Online参数更改后不生效修改EL6021的Online参数后必须重新Activate Configuration激活配置有时甚至需要重启TwinCAT Runtime。单纯下载PLC程序是不够的。过程数据链接错误检查PLC变量与I/O映射的链接是否成功。在线模式下在I/O Mapping界面查看变量状态是否为“Linked”且没有报错。如果链接断开接收和发送数据都无法进行。ADS通信与实时任务如果你使用ADS Read/Write来访问EL6021的缓冲区而不是直接的I/O映射请注意ADS通信是非实时的有延迟和不确定性。对于高速或稳定的串口通信强烈推荐使用I/O映射方式。6.5 个人实战心得调试分步走不要试图一开始就实现完整协议。务必按照“发送测试 - 接收测试 - 协议交互测试”的步骤进行每步确认无误后再推进。善用工具除了串口调试助手TwinCAT3自带的“Logger”功能非常好用。你可以将串口收发数据的字节、状态机的状态变迁、定时器值等关键信息记录到Logger中方便分析复杂的时序问题。超时是生命线在工业通信中一定要为每一个等待外部响应的环节设置合理的超时。超时时间要结合波特率和数据帧长度计算并留有余量。例如等待一个20字节的响应帧在9600波特率下传输时间大约20ms那么超时可以设为50-100ms。CRC校验不可省对于自由协议自己加上CRC循环冗余校验或LRC纵向冗余校验是非常必要的。这能有效避免因干扰导致的错误数据被误认为正确帧。在发送前计算并附加校验码在接收后验证校验码。关于EL6021的“Data Received”事件有些资料会提到使用该事件来触发接收。但在高负载或快速连续接收时事件可能丢失。更可靠的做法是在一个快速循环的PLC任务中定期检查接收缓冲区的长度或状态标志。我通常使用一个10ms的循环任务来轮询和处理接收数据。