欧姆龙CP1H串行端口2的RS485无协议通信实战解析

📅 发布时间:2026/7/5 6:54:44 👁️ 浏览次数:
欧姆龙CP1H串行端口2的RS485无协议通信实战解析
1. 从零开始认识CP1H的RS485无协议通信大家好我是老张在工控圈里摸爬滚打了十几年和各种PLC、变频器、仪表都打过交道。今天想和大家聊聊一个非常经典且实用的场景欧姆龙CP1H PLC通过它的串行端口2实现RS485无协议通信。很多刚接触的朋友一听到“无协议”和“RS485”可能就有点发怵觉得配置复杂调试困难。别担心今天我就用最“白话”的方式结合我踩过的坑和总结的经验带大家从硬件接线到软件编程完完整整地走一遍这个流程。保证你看完就能上手遇到问题也知道怎么查。首先咱们得搞清楚几个基本概念。CP1H本体上通常自带一个串口端口1但很多时候不够用或者我们需要更专业的通信方式。这时候就需要用到它的扩展选件板槽位了。CP1H最多可以插两块选件板我们今天的主角——CP1W-CIF11就是一块专门用于RS422A/485通信的选件板通常我们把它插在槽位2上。为什么是槽位2因为CP1H的端口2串行端口2的配置和编程是独立于端口1的逻辑更清晰也方便我们管理。那什么是“无协议通信”呢你可以把它想象成PLC和外部设备比如一台智能仪表、一个扫码枪或者另一台不同品牌的PLC之间用最原始的“喊话”方式进行交流。双方不遵循像Modbus、Host Link这类标准的、有固定格式的“语言”协议而是自己约定好一句话多长、每个字代表什么意思。PLC这边就用TXD指令来“喊话”发送数据用RXD指令来“听”接收数据。这种方式非常灵活可以对接市面上绝大多数自带简单串口通讯的设备是工控工程师的必备技能。而RS485是一种电气标准简单说就是一种抗干扰能力强、能传得远最长可达1200米、还能一根线上挂多个设备的通信接线方式。它通常用A、B两根线这就是常说的2线制来传输差分信号稳定性比常见的RS232强得多在车间、厂房这种环境复杂的地方特别有用。好了背景知识铺垫得差不多了咱们撸起袖子开始动手。2. 硬件配置拨对开关是成功的一半俗话说得好工欲善其事必先利其器。硬件配置是通信的基础这一步要是错了后面软件调出花来也没用。CP1W-CIF11这块板子正面上方有一排小小的拨码开关DIP Switch一共6个。它们的设置直接决定了这块板子是以RS422还是RS485工作是2线制还是4线制非常关键。很多通信失败的案例源头都在这儿。根据我的实战经验当我们使用最常见的2线制RS485时需要拨动的开关如下SW1ON。这个开关控制终端电阻。当通信距离较长比如超过50米或者挂的设备比较多时信号在导线末端会反射造成干扰。把这个开关拨到ON就启用了内置的终端电阻通常是120欧姆可以吸收反射信号让通信更稳定。即使距离短我也建议你习惯性地把它打开图个安心。不开有时也能通但就像开车不系安全带短途可能没事但不保证永远没事。SW2ON。SW3ON。 SW2和SW3的组合实际上就是选择RS485 2线制模式。具体对应关系可以看板子侧面或手册的图示记住全ON是2线制RS485的常用设置就行。SW4OFF。这个开关通常与发送控制相关在2线制模式下我们一般将其置于OFF。SW5ON。SW6ON。这里有个超级重要的坑点也是我当年调试时卡了很久的地方SW5和SW6必须拨到ON端原始文章里也提到了如果它们不在ONPLC就收不到外部设备发来的数据。我后来翻了很多资料才弄明白SW5和SW6控制的是RS485接口的“发送使能”逻辑。在2线制RS485中收发共用一对线所以PLC在“听”的时候必须把自己的“嘴巴”发送驱动器彻底关上否则会干扰总线上的信号。SW5和SW6拨到ON就是为了确保在非发送状态下PLC的发送端处于高阻态不影响总线。你可以理解为只有这样才能让PLC的“耳朵”清静下来专心接收。为了方便大家对照我把关键设置总结成下面这个表格拨码开关编号2线制RS485推荐状态功能说明SW1ON终端电阻使能。建议打开尤其长距离多设备时。SW2ON模式选择。与SW3组合设定为2线制RS485。SW3ON模式选择。SW4OFF发送控制相关2线制下通常为OFF。SW5ON关键发送使能控制。必须ON以确保正确接收。SW6ON关键发送使能控制。必须ON以确保正确接收。注意拨动开关时请使用细小的工具如圆珠笔尖并确保PLC电源已完全关闭。带电操作有可能损坏拨码开关或选件板。设置好拨码开关后就是接线了。CP1W-CIF11的接线端子是螺丝压接的。对于2线制RS485你只需要接两个信号线SDA (或 A): 接外部设备的RS485 A 或 D 端子。SDB- (或 B-): 接外部设备的RS485 B- 或 D- 端子。 另外别忘了把双方的SG信号地连接起来这有助于消除共模干扰提升通信稳定性。虽然理论上RS485不需要共地也能工作但在工业现场我强烈建议你把地线接上这是花小力气避免大麻烦的好习惯。3. 软件设置在CX-Programmer里搭好舞台硬件准备妥当我们就要打开欧姆龙的编程软件CX-Programmer新版是Sysmac Studio但CP1H用CX-P更普遍进行软件层面的配置了。这一步相当于给PLC的串口2定下“规矩”用什么速度说话波特率、每个字占多少时间数据位、停止位、怎么判断一句话开始起始码和结束结束码。首先在工程树里双击你的CP1H机型打开“设置”窗口。找到“串行端口2”的选项卡点进去。这里面的参数需要和你通信的外部设备完全一致否则就是“鸡同鸭讲”。通信模式毫不犹豫地选择“串行网关”模式下的“无协议”。这个模式就是为我们今天要做的自定义通信准备的。基本设置波特率9600 19200 38400 115200 这几个是常用的。选一个你的外部设备支持的速率。如果设备距离远、线路环境差建议从9600开始这个速率抗干扰能力最强。数据位7 或 8。根据设备要求来现在8位更普遍。停止位1 或 2。通常选1位。奇偶校验无、偶、奇。为了简单很多设备用“无校验”。如果现场干扰大可以选用偶校验增加一点检错能力。无协议定制设置这里是核心起始码你可以指定一个或一组字节作为接收数据的开始标志。比如你规定设备发出的数据总是以0x3A一个冒号‘:’开头那就在这里设置。如果数据没有固定开头就选“无”。结束码这个更常用。指定如何判断一串数据发完了。有三种方式指定代码比如规定回车换行CRLF(0x0D0A)作为结束。接收字节数最简单粗暴的方式。比如你知道设备每次固定发4个字节就在这里设4。PLC收到4个字节后就认为一帧数据完整了触发接收完成标志。间隔时间当数据流中断超过设定的时间如10ms就认为一帧结束。适合数据长度不固定且帧间有间隔的场合。在我们的实战场景里外部设备发送固定4字节那么最稳妥的方式就是在“结束码”里选择“接收字节数”并设置为4。这样配置最简单也最可靠。传输设置这里控制发送相关。有个“CTS控制”选项通常我们不需要硬件流控制选“无”就行。配置完成后记得点击“确定”并将这些设置传送到PLC在线工作模式下选择“传送”-“传送到PLC”。只有传送下去配置才真正生效。很多朋友配置完忘了传送然后死活调不通就是漏了这一步。4. 指令编程RXD与TXD的舞步舞台搭好演员就该上场了。无协议通信的两位核心“演员”就是RXD指令和TXD指令。它们的使用有固定的套路掌握了就能应对大部分场景。4.1 接收数据RXD指令详解RXD指令的作用是从串行端口2的接收缓冲区里把数据读到PLC的某个数据区比如D区里。它的梯形图格式和参数设置有点讲究。假设我们要把接收到的4个字节存放到从D100开始的连续两个字1个字2个字节里。我们可以这样编写接收逻辑|--[RXD #0022 D100 #0004]--|别被这一行指令吓到我来拆解每一个参数控制端口号 (#0022)这是固定写法。#0022中的第一个2代表串行端口2第二个2代表这是“无协议”模式下的通信指令。记住这个数就行。目标首字 (D100)告诉PLC把读出来的数据存到哪里去。从D100开始存放。字节数 (#0004)告诉PLC我这次要读多少个字节。这里就是4个字节。但是我们不可能让PLC一直不停地执行RXD指令。通常我们需要用一个条件来触发接收比如串口收到了数据或者用一个定时器周期性地读取。更常见的做法是利用接收完成标志A392.06。当串口2根据我们之前的设置比如收满4字节判定一帧数据接收完成时这个标志位会瞬间从OFF变为ON。我们可以用这个上升沿来触发RXD指令确保每次读取的都是完整的一帧新数据。|--[RXD #0022 D100 #0004]--|注意指令前面的符号这代表上升沿微分执行。这样只有当A392.06从OFF变成ON的第一个扫描周期RXD指令才执行一次高效且不会重复读取。接收上来的数据是16进制的存放在D100和D101中4个字节占两个16位的字。你可能需要根据和设备约定的格式对这些数据进行解析。比如D100的高字节可能是设备状态低字节可能是数据的高8位等等。这就需要你对照设备的通信手册来编程了。4.2 发送数据TXD指令实战发送数据用的是TXD指令。假设我们每隔10ms就要向上位机发送4个字节的数据内容分别是0x01,0x02,0x03,0x04。首先我们需要把这4个字节的数据提前准备好存放到一个连续的存储区里。比如我们存到D200开始的区域D200:#0102(高字节01低字节02)D201:#0304(高字节03低字节04)然后我们使用一个0.01s即10ms的定时器比如T0来产生周期性的发送脉冲。在定时器T0的常开触点后面编写TXD指令|--[T0]--[TXD #0022 D200 #0004]--|同样拆解参数控制端口号 (#0022)和RXD一样代表使用串口2的无协议模式发送。源首字 (D200)告诉PLC要发送的数据从哪里开始取。从D200里取数据。字节数 (#0004)告诉PLC这次要发送4个字节。当T0触点接通时TXD指令执行PLC就会自动将D200、D201中的4个字节通过串口2的RS485线路发送出去。发送完成后发送完成标志A392.02会置ON我们可以利用这个标志来做一些后续处理比如复位定时器、准备下一帧数据等。这里有一个非常重要的细节RS485是半双工的同一时间只能有一方说话。PLC在发送数据时它的接收电路是被暂时屏蔽的。所以如果你的通信是PLC主动轮询问一句答一句的模式一定要在发送完成并延迟一小段时间确保数据已完全发出后再切换到接收状态去等待设备的回复。这个切换通常由硬件CP1W-CIF11根据TXD指令自动管理但编程时心里要有这个概念。5. 调试与排坑让数据流动起来配置和程序都写好了下载到PLC接上线最激动人心也最让人头疼的调试环节就来了。理想情况是数据嗖嗖地收发但现实往往是通信指示灯一动不动。别慌按照以下步骤排查绝大部分问题都能解决。第一步硬件复查电源PLC和外部设备都上电了吗这是最最低级的错误但我确实见过。拨码开关再确认一遍特别是SW5和SW6必须ON。用手机拍个微距照片放大看确保没看错。接线A对AB对B-接反了通信肯定失败。信号地SG接了吗螺丝拧紧了吗可以用万用表通断档测一下线是否导通。终端电阻如果通信距离长超过50米或线上设备多除了打开SW1可能还需要在物理线路的最远端的设备的A和B-之间并联一个120欧姆的终端电阻。很多设备自带一个可插拔的终端电阻跳线记得检查。第二步软件配置复查参数一致性波特率、数据位、停止位、校验位PLC和外部设备必须一字不差。差一点都通不了。设置传送CX-P里的串口设置传送到PLC了吗PLC需要断电再上电或切换运行模式才能使新的串口设置生效。指令端口号RXD和TXD指令的第一个操作数是不是#0022用错了端口号指令不会报错但数据不会从你想的端口出去。第三步动态监测与调试如果硬件软件确认无误还是没数据就需要借助工具了。串口监听这是最强大的调试手段。在PLC和外部设备之间串接一个USB转RS485转换器连接到你的电脑。用电脑上的串口调试助手如AccessPort、友善串口助手等监听总线上的所有数据。这样你就能清清楚楚地看到PLC到底发没发出数据发出的数据对不对外部设备有没有回复回复的数据是什么是PLC没发还是设备没回还是数据内容错了一目了然。PLC内部监控在CX-P的监控模式下查看关键标志位。A392.06接收完成标志有没有闪动如果它一直不ON说明PLC根本没收到完整帧问题可能在外部设备发送、线路、或PLC的接收设置如结束码判断条件。A392.02发送完成标志执行TXD指令后它有没有ON如果没ON可能是发送条件没触发或者端口被占用。接收缓冲区有些型号可以通过特殊寄存器直接查看串口接收缓冲区的实时内容但这不如外接监听直观。程序逻辑检查你的RXD指令触发条件对吗是用A392.06的上升沿触发的吗TXD指令的发送周期会不会太频繁导致发送冲突发送和接收的逻辑有没有互锁避免同时操作我遇到过最诡异的一个案例是一切配置都正确但就是收不到数据。最后用监听工具发现外部设备发送的每个字节之间间隔太长超过了PLC串口设置里“结束码”中“间隔时间”的默认值导致PLC还没收满4个字节就以为一帧已经结束超时了从而触发了接收完成但缓冲区里只有部分数据。后来把PLC的接收超时时间设长或者改用“接收字节数”作为结束条件问题就解决了。调试通信耐心和正确的工具尤其是串口监听是关键。把问题分解从硬件到软件从发送到接收一步步隔离定位没有解决不了的通信故障。当你第一次看到PLC和外部设备成功交换数据时那种成就感绝对是工控编程的一大乐趣。