1. 项目背景与设备初识当RFID遇上汇川PLC大家好我是老张在工业自动化这行摸爬滚打了十几年从早期的条码到现在的RFID各种数据采集方案都折腾过。今天想和大家聊聊一个非常实用但在实际落地时又容易让人“头大”的场景如何让一台工业级的RFID读写器通过最常用的以太网和汇川的PLC“对上话”实现稳定可靠的数据交互。这个需求在智能仓储、产线物料追踪、AGV调度等场景里太常见了。比如一个托盘载着货物经过一个站点读写器要瞬间读取托盘上RFID标签的信息然后把这个信息比如物料编号、批次号实时传给PLCPLC再决定下一步是分拣、入库还是流转。整个过程要求毫秒级响应通讯必须稳定不能丢数据。这次我们实战的主角是工业级RFID读写器CK-LR08-E00和汇川H5U系列PLC。CK-LR08-E00这家伙我用了不少它是个低频读写器抗金属干扰能力强特别适合工业环境像在金属托盘、机床刀具管理上用起来很稳。它自带一个以太网口支持TCP/IP协议这就给我们用网络通讯提供了硬件基础。而汇川H5U是现在很多中小型项目里的“明星”PLC性价比高编程软件AutoShop也好上手它的以太网端口同样支持TCP/IP的客户端和服务器模式。那么问题来了硬件都有了协议也都是TCP/IP为什么直接连上还不能用因为我们需要在PLC里写程序去“指挥”它如何与读写器建立连接、如何发送指令、如何解析返回的数据。这就像给两个人配了电话硬件和基础协议但还需要约定好打电话时谁先开口、说什么暗语应用层指令才能有效沟通。接下来我就带你一步步打通这个关节。2. 核心原理与通讯框架理解TCP/IP自由协议在动手接线和写代码之前我们得先花几分钟把通讯的“游戏规则”搞清楚。很多朋友一上来就配置参数结果连不上或者数据乱码多半是底层原理没吃透。原始文章里提到了“以太网TCP/IP自由协议”这个名字听起来有点专业其实我们可以把它拆开理解。TCP/IP是一套庞大的协议族我们这里最关心的是基于TCP的Socket通讯。你可以把它想象成在两个设备之间建立一条可靠的、双向的、有顺序的“数据管道”。比如PLC发送“读取标签”的指令这条指令会完整、按顺序地到达读写器读写器处理完再把结果数据通过同一条管道原路送回来。这种可靠性是UDP协议不具备的所以工业控制里用TCP居多。那“自由协议”又是什么意思呢它指的是在TCP这个可靠的传输通道之上应用层的数据格式和交互逻辑由设备厂商或我们自己来定义。CK-LR08-E00读写器有它自己的一套指令集比如用特定的字节组合表示“读标签”用另一组字节表示“写标签”。PLC需要按照这个指令集的格式去组装要发送的数据包。这不像Modbus TCP那样有全球统一的寄存器地址表。自由协议更灵活但需要我们更仔细地查阅读写器的通讯手册搞清楚它的“语言”。所以整个通讯框架就很清晰了物理层网线。用一根标准的网线一头插在CK-LR08-E00的以太网口另一头插在汇川H5U PLC的以太网口或者接入同一个局域网交换机。网络与传输层TCP/IP协议栈。由设备的操作系统和硬件驱动负责我们需要设置IP地址、子网掩码、网关确保两者在同一个网段能互相ping通。应用层自由指令协议。这是我们需要编程实现的核心——在PLC中用程序代码构建符合CK-LR08-E00要求的指令数据包并通过TCP连接发送出去同时也要编写程序来接收并解析读写器返回的数据包。理解了这个框架后续所有的配置和编程步骤其实都是在填充这个框架里的具体内容。我们不是在进行魔法操作而是在搭建一个可预测、可调试的数据通道。3. 硬件连接与网络基础配置理论懂了咱们就动手开干。第一步是把硬件环境搭起来确保物理链路和基础网络是通的。这一步做不好后面的程序调得再漂亮也是白搭。首先给设备上电并规划IP地址。假设我们现场的局域网网段是192.168.1.0/24。我们需要为读写器和PLC分配两个同网段且不冲突的IP。CK-LR08-E00读写器通常可以通过配套的配置软件或者网页如果支持来设置IP。这里我们将其设置为192.168.1.80。子网掩码255.255.255.0网关根据实际情况设置如果只在局域网内通讯可以不设或设成PLC的IP。汇川H5U PLC通过AutoShop软件连接PLC先用USB线或网线在“PLC参数”或“设备配置”中找到以太网设置。我们将其设置为192.168.1.100。子网掩码同样为255.255.255.0。设置好后一个非常关键的验证步骤是用电脑ping一下这两个地址。将你的电脑也接入同一个局域网设置一个同网段的IP如192.168.1.10。打开命令提示符分别输入ping 192.168.1.80和ping 192.168.1.100。如果都能收到回复Reply from...恭喜你网络层的基础通路已经建立成功。如果ping不通就要检查网线、设备防火墙工业设备一般没有、IP设置是否正确。接下来是接线。用一根直连网线或交叉线现在大多数设备都支持自动翻转将CK-LR08-E00的以太网口与汇川H5U的以太网口直接连接或者更常见的做法是两者都接到一台工业交换机上。我个人的经验是在调试阶段如果条件允许尽量用直连的方式可以排除交换机带来的不确定因素。接好线后观察设备的指示灯读写器和PLC的以太网口应该有绿色的链路指示灯常亮黄色的数据指示灯在通讯时会闪烁。硬件连接和网络配置是基石务必稳扎稳打。我遇到过不少案例工程师花了大半天调试程序最后发现是IP地址设错了或者子网掩码不对非常耽误时间。所以养成“先ping通再编程”的好习惯。4. PLC程序骨架搭建创建TCP通讯功能块网络通了现在进入核心环节——在汇川AutoShop软件里编写PLC程序。我们的目标是创建一个可复用的TCP通讯功能块这是整个项目的“大脑”。汇川H5U的编程软件提供了现成的TCP/IP通讯指令非常好用。我们不需要从零开始写Socket而是像搭积木一样调用这些指令。首先新建一个程序文件然后我们创建一个功能块FB。你可以把它理解为一个封装好的、有特定功能的“小程序模块”我们可以在主程序里多次调用它每次调用就是一个独立的TCP连接实例。在这个功能块内部我们需要声明并使用以下几个关键的TCP指令TCP_Connect用于PLC作为客户端时主动去连接服务器即我们的RFID读写器。TCP_Accept用于PLC作为服务器时等待并接受客户端的连接请求。在这个项目里我们通常让PLC做客户端读写器做服务器所以这个指令可能用不上但先建好框架以备不时之需。TCP_Send发送数据指令。把我们组装好的读写器指令通过TCP连接发出去。TCP_Receive接收数据指令。持续监听TCP连接把读写器返回的数据收回来。TCP_Close关闭TCP连接指令。除了指令还需要定义两个重要的数据结构作为这些指令的输入/输出参数一个TCP连接结构体比如命名为tcp_conn里面包含这个连接的所有状态信息比如连接标识、本地端口、远程IP和端口、发送/接收缓冲区指针等。这个结构体会传递给各个TCP指令。一个数组作为数据缓冲区比如定义一个INT类型的数组data_buffer[100]。这个数组用来临时存放我们要发送的原始字节数据需要转换成整数格式以及接收到的原始字节数据。为什么是整型数组因为PLC处理字节数据时经常以字Word2字节或双字DWord4字节为单位用整型数组比较方便。创建好这个功能块就相当于我们为PLC打造了一个专用的“TCP通讯驱动模块”。接下来我们就要在主程序里实例化这个模块并告诉它具体连接谁、怎么收发数据。5. 连接建立与数据收发实战功能块准备好了现在我们来让它真正“动”起来。在主程序里我们需要做以下几件具体的事。第一步实例化并配置连接参数。假设我们只需要一个PLC连接一台读写器那么就在主程序里实例化一个刚才创建的功能块比如叫FB_RFID_Com。然后我们需要配置这个实例的连接参数。关键是要设置目标服务器的IP地址和端口号也就是我们CK-LR08-E00的地址192.168.1.80和它开放的TCP服务端口假设是500具体需查阅读写器手册。 在PLC里IP地址通常需要转换成十六进制格式。192.168.1.80转换成十六进制是C0.A8.01.50在汇川的指令里可能需要以16#C0A80150这样的形式填写。端口号500则可以直接用十进制常数K500表示。把这些参数赋值给功能块实例内部的那个TCP连接结构体。第二步发起连接。将功能块中对应于TCP_Connect指令的触发引脚比如一个叫做Connect_Execute的BOOL变量置为ON。PLC就会尝试向192.168.1.80:500发起TCP连接请求。此时你应该去观察硬件CK-LR08-E00上如果有通讯指示灯它应该从闪烁变为常亮比如绿色表示TCP连接已建立。同时在AutoShop软件的监控表里可以看到功能块中表示连接状态的变量如Connected变为True。第三步发送读取标签指令。连接成功后就可以进行数据交互了。首先我们实现读取标签UID唯一标识符的功能。根据CK-LR08-E00的通讯手册找到“单标签读取”或类似功能的指令码。假设指令是0x01 0x02 0x00 0x00这只是一个示例实际指令一定以手册为准。 我们需要将这个字节序列按照顺序填入功能块的发送缓冲区数组Send_Buffer中。在PLC中一个字节0x01可以放在一个整型变量的低8位。所以Send_Buffer[0]可以赋值16#0102即0x01和0x02组合成一个字Send_Buffer[1]赋值16#0000。同时将发送数据长度变量Send_Size设置为4表示4个字节。最后将发送执行变量Send_Execute置ON一次。PLC就会自动将这4个字节的数据包通过TCP连接发送给读写器。第四步接收并解析返回数据。当读写器上方有标签时它会执行读操作并将结果数据返回。PLC侧的TCP_Receive指令一直在后台工作当检测到网络上有数据到来时会自动存入接收缓冲区Receive_Buffer数组中。 我们需要编写一段解析程序。首先检查接收长度Receive_Size是否大于0。然后根据手册约定的返回数据格式从Receive_Buffer中提取有效信息。例如返回数据包可能是[0xAA, 0xBB, 0x08, 0x00, 0x0A, 0x00, 0x0B, 0x00, 0x0C, 0x0D]。其中前几个字节可能是帧头或状态码中间8个字节00 0A 00 0B 00 0C 00 0D就是标签的UID。我们需要用MOV指令或数组操作把这8个字节的数据提取出来存放到PLC的另外8个连续的寄存器如D100-D107中供后续逻辑使用。第五步发送写入标签指令。写标签的过程类似。首先组装写标签指令。假设指令格式为指令头 要写入的数据8字节。那么我们需要将新的数据例如00 01 00 02 00 03 00 04拼接到指令码后面计算好总长度填入发送缓冲区再次触发Send_Execute。 这里有个细节原始文章提到如果Send_Size设置为0PLC会自动判断字符串结束符。但在处理这种纯十六进制字节流的自由协议时我强烈建议手动指定准确的发送长度避免因缓冲区中意外出现的0导致数据截断造成通讯失败。当写操作完成后读写器同样会返回一个响应包通常是成功或失败的状态码我们需要在接收解析程序中处理这个响应以确认写操作是否成功。通过这一套“发送-接收-解析”的循环我们就完成了与RFID读写器的核心数据交互。6. 关键参数详解与调试技巧程序写完了但一次成功是小概率事件调试才是重头戏。这里分享几个我踩过坑才总结出来的关键参数和调试技巧能帮你快速定位问题。1. 超时时间设置在TCP连接和收发指令时一定要设置合理的超时时间。比如TCP_Connect指令有一个连接超时参数如果网络不通或读写器未就绪超过这个时间PLC就会报错而不是一直卡住。发送和接收指令也有超时设置。我一般会把连接超时设为5-10秒发送/接收超时设为2-3秒。时间太短容易在网络波动时误判太长则影响系统响应。2. 字节序问题这是自由协议调试中最常见的“坑”。不同设备对多字节数据如16位整数、32位浮点数在内存中的存储顺序可能不同分为大端序高位在前和小端序低位在前。CK-LR08-E00返回的标签UID00 0A 00 0B 00 0C 00 0D你需要确认在PLC的寄存器中D100里存的是0x000A还是0x0A00这决定了你后续处理数据时是否需要做字节交换。务必仔细查阅读写器通讯手册的“数据格式”章节并在第一次通讯成功时用监控软件仔细比对缓冲区原始数据和解析后的数据。3. 发送与接收的互锁逻辑在PLC程序中要处理好发送和接收的状态机。一个简单的原则是等待上一次发送的响应返回后再发起下一次发送。可以在功能块里设计两个状态位IsWaitingResponse等待响应中和SendEnabled允许发送。当触发一次发送后IsWaitingResponse置位SendEnabled复位。直到正确接收到响应包并解析完成后才将IsWaitingResponse复位SendEnabled置位。这样可以有效避免指令堆叠、数据覆盖的问题。4. 利用网络调试助手在调试PLC程序之前强烈建议先用电脑上的网络调试助手如TCP/UDP调试工具模拟PLC或读写器。你可以将电脑IP设为192.168.1.100去连接读写器192.168.1.80:500手动发送十六进制指令看看读写器返回什么。反过来你也可以用电脑模拟服务器让PLC来连接验证PLC发送的数据格式是否正确。这个工具能帮你快速确定问题是出在PLC程序逻辑上还是出在指令格式或网络配置上。5. 详细的日志与状态监控在AutoShop中不要只监控数据缓冲区。把功能块内部的关键状态变量都做到触摸屏或监控表里比如连接状态、发送完成标志、接收完成标志、接收数据长度、最后一次错误代码等。当通讯异常时这些状态信息是第一时间定位问题的宝贵线索。调试就是一个“大胆假设小心求证”的过程。遵循“先硬件灯、ping再软件调试助手最后PLC程序”的步骤耐心分析每个环节的数据问题总能解决。7. 从Demo到稳定工程化优化建议当我们把基本读写功能调通后这只是一个Demo。要把它变成一个能在产线上稳定运行24小时不间断的系统还需要做一些工程化的优化。第一增加心跳与重连机制。工业现场环境复杂网络闪断、设备重启都有可能。我们不能假设TCP连接一旦建立就永远不断。一个健壮的程序需要有心跳机制。可以让PLC每隔一定时间如5秒向读写器发送一个特定的、短小的“心跳包”比如0xAA。如果连续几次如3次发送心跳都没有收到回复则认为连接已断开程序自动调用TCP_Close断开旧连接然后重新触发TCP_Connect进行重连。同时在重连成功之前主流程的读写操作应该被暂停并触发报警提示维护人员。第二设计健壮的数据帧处理。读写器返回的数据可能不是一次接收完整的或者可能粘包两次返回的数据连在一起。我们的接收程序不能简单地认为一次接收就是完整的一帧。需要在缓冲区中设计一个简单的帧解析器。例如协议规定每帧数据以0xAA 0xBB开头以0x0D 0x0A结尾。那么我们的程序就应该在接收缓冲区中搜索这个帧头找到后根据后续的长度字段或帧尾来判断一帧是否接收完整。只有确认收到完整帧后才进行解析否则就继续等待接收。第三错误处理与异常分支。程序中要对每一个可能失败的操作进行判断和处理。TCP_Connect失败怎么办TCP_Send失败怎么办接收到的数据长度不对、校验和错误怎么办对于每一种错误都应该有对应的处理流程记录错误日志、复位相关标志位、尝试恢复操作、或者上报到上位机系统。避免因为一个未处理的异常导致整个通讯功能卡死。第四参数的可配置化。不要把IP地址、端口号、心跳间隔、重试次数等参数硬编码在程序里。应该将它们放在PLC的断电保持寄存器或配方数据块中。这样当设备更换、网络调整时工程师只需要在触摸屏上修改几个参数而无需重新下载PLC程序大大提高了维护的灵活性。把这些优化点都考虑到并实现你的这个RFID通讯功能就不再是一个脆弱的实验品而是一个能够抵御现场各种干扰的可靠工业模块。我自己的项目里经过这样优化后的系统连续运行数月不出问题是常态。技术的价值最终就体现在这份稳定性和可靠性上。好了关于CK-LR08-E00与汇川PLC的以太网通讯实战我的经验差不多就这些了希望能帮你少走些弯路。如果在实际动手过程中遇到具体问题欢迎随时交流。