FX3U 485通讯实战:ADPRW指令与无协议RS2调试指南

发布时间:2026/11/3 17:07:47
FX3U 485通讯实战:ADPRW指令与无协议RS2调试指南 现场调 485 通讯十个里有八个卡在同一个地方线接对了、模块灯也闪PLC 这边数据一动不动或者干脆报个不明不白的错误码。你要问我最常见的症结多半是指令用错了、格式字没配对、软元件占用没算清这三件事之一。这篇就把adprw 指令、FX3U 的 485 无协议通讯这两条最容易混淆的技术路线拆开讲清楚从硬件选型、D8120 格式字计算、ADPRW 的报文时序一直到无协议 RS2 的自定义帧收发全部按现场能直接抄的结构来写。不管你是刚接手第一台变频器通讯的新手还是被某个老仪表折腾过几轮的老手下面这些内容应该都能对得上你的现场。1. 概念先分清ADPRW 与无协议通讯压根是两套东西1.1 两条技术路线的本质差异很多人搜ADPRW 无协议通讯是因为被标题里的字面意思带偏了。ADPRW 严格来说不是无协议指令它是一条走 MODBUS RTU 标准的专用指令。你在梯形图里写ADPRW K1 H03 H0000 K2 D100PLC 内部会自动帮你拼帧头、算 CRC16 校验、等应答、把回包拆成数据字放好你拿到的就是干净的寄存器值。整个过程你连 CRC 长什么样都不用管。无协议通讯也常被叫自由口、自由协议、Free Protocol走的是另一条路RS2 指令负责把一串原始字节发出去再把回来的原始字节收进来。帧头是什么、数据几位、校验怎么算、什么时候算一帧结束全部由你自己在程序里定义。设备手册给你一张命令帧格式表你就照着拼它让你发0xAA 0x55 ...你就得发这八个字节一个都不能少。两条路线的差别用生活里的场景类比就很清楚ADPRW 像是寄快递用标准面单收发两端都认这套规则你只管填地址无协议像是自己写信信封、邮票、暗号全得自己约定万一对方理解的暗号和你不一样信就丢了。所以选型的判断标准也很简单——对方设备手册里有没有明确写支持 MODBUS RTU。写了优先 ADPRW没写或者写了但只有一张自定义帧表格那就只能走 RS2。1.2 选型判断翻设备手册的哪一页我在现场翻手册有个固定顺序先找通讯协议章节看有没有MODBUS字样再找通讯地址表看是40001这种寄存器编号还是0x10 命令码 数据这种自定义格式。前者基本能确定是标准 MODBUS后者就是私有协议。有个容易被忽略的点很多设备的通讯地址表是从 1 开始编号的而 ADPRW 的地址操作数是从 0 开始的协议地址。手册上写40001 对应温度值你在 ADPRW 里填的是H0000也就是 K0不是K40001也不是K1。这个差一位的问题我在现场见过太多次——数据读回来了但是始终是隔壁那个参数的值怎么调都不对最后发现是地址偏移了一位。还有一类设备更拧协议是 MODBUS 没错但只支持功能码 03 不支持 04或者线圈写单个支持、写多个不支持再或者对帧间隔时间有严格要求。这类情况我在第 4 章会专门讲怎么用轮询和超时兜底。至于方案的影响范围说个实在的边界一台 FX3U 最多两块 485 模块通道 1 和通道 2每个通道下面挂 32 个从站是比较稳的量级再多就要考虑响应时间和轮询周期了。如果你的项目是十几台温控表、几台变频器这种规模单通道轮询完全够用上百个点位又要保证实时性那就该考虑换更强的控制器或者走总线了这不是硬凑能解决的。2. 硬件与接线485 现场最容易翻车的地方2.1 模块型号决定指令能不能用这一条必须先说因为它决定了你后面所有的努力有没有意义。FX3U-485BD 这块板子不支持 ADPRW 指令它只能做无协议或者专用协议通讯。要用 ADPRW必须上 FX3U-485ADP-MB 这个带 MB 后缀的适配器或者用通讯扩展板转接的方式挂在通道上。我见过有人拿着 485BD 照着网上的 ADPRW 例程抄编都编不过去或者编过了运行起来状态字一直报错折腾一整天才发现型号不对。硬件上还有一个细节485ADP-MB 接通道 1 还是通道 2对应的特殊寄存器完全不一样。通道 1 用 D8120、通道 2 用 D8420通道 1 的接收完成标志是 M8123通道 2 是 M8433。这个对应关系写错了程序表面上看不出任何问题就是收不到数据非常隐蔽。我的习惯是程序开头就写注释把本程序使用通道 X标清楚配上对应的特殊寄存器列表。项目交接的时候能省下后来人半小时。2.2 双绞、屏蔽、终端电阻的实操处理485 是差分信号A、B 两根线必须用双绞。现场最常见的错误是拿了两根普通单芯线或者平行线接了事短距离可能能通线一长或者旁边有变频器误码就上来了。屏蔽层的处理也有讲究单点接地一般选在 PLC 这一侧接屏蔽从站侧屏蔽层悬空别两头都接否则地电位差会形成环流反而把信号搅乱。终端电阻是另一个高频问题。线长超过 50 米或者波特率上到 19200 以上总线两端最远的两台设备各接一个 120Ω 电阻。中间节点不需要接。有些模块自带拨码开关或跳线直接拨上去就行没有的话就外挂电阻在接线端子上。反过来如果线只有三五米、波特率 9600、就挂两三台设备终端电阻不接通常也没什么问题硬接反而增加负载。还有一点经验A、B 线接反是 485 现场第一大户。有的设备标 A/B有的标 D/D-有的标 /−各家定义还不完全统一。现象是通信完全无响应但模块指示灯可能还在闪。处理办法很简单——先测一下两根线之间的静态电压差正常应该在 0.2V 到 1V 量级然后用排除法反接试试两分钟的事不要在那怀疑程序。3. 通信格式字D8120 与 D8420 的逐位拆解3.1 位定义与常用组合计算格式字是一条 16 位的数据每一位管一件事。低字节管物理层参数高字节管协议和帧结构。我把它拆成表方便你对着算位区间名称取值含义b0数据长度07 位18 位MODBUS 必须 8 位b1~b2校验方式00无01奇校验10偶校验b3停止位01 位12 位b4~b7波特率100096001001192001010384001011576001100115200b8起始符0无起始符b9终止符0无终止符b13校验和 BCC0无b14~b15协议选择与模块型号、固件版本相关按手册设定低字节的算法其实很直接。举个最常见的组合9600 波特率、8 位数据、无校验、1 位停止位。8 位数据 → b01无校验 → b1b2001 位停止位 → b309600 → b4~b7 是二进制1000。把它们拼起来低字节就是1000 0001写成十六进制是H0081。再举一个19200、8 位、偶校验、1 位停止位。b01b1b210b30b4~b71001。拼起来是1001 0111也就是H0097。你可以拿这个规律去算任何组合比翻手册查表快得多。高字节这块我要提醒一句b8 以上的含义在不同固件和不同模块上是有差异的特别是协议选择位。所以我不建议你手算整个 16 位字工程上更稳妥的做法是只关心低字节的物理参数协议模式交给参数设置界面处理。3.2 两种设置途径与踩坑提醒设置格式字有两条路第一条是在编程软件的 PLC 参数里设串行通信选好通道、波特率、数据位、校验、停止位再选通讯模式MODBUS RTU 或专用/无协议。下载程序时参数一起写进去D8120 会被自动赋值。这条路最省心我强烈推荐新手走这条。第二条是在程序里用MOV H0081 D8120直接写。这条路灵活适合需要运行时切换参数或者做多套配置的场合但要求你自己把高字节也配对。这里有个非常经典的坑只改了波特率和数据位没改协议模式位ADPRW 指令执行后状态字一直报错。因为 ADPRW 内部要求通道处于 MODBUS 模式如果你还是无协议模式指令根本发不出去。表现就是状态字非 0 而且数值固定不变。我个人的做法是涉及 ADPRW 的工程一律用参数设置界面的方式配 MODBUS 模式程序里不再写 D8120减少一层出错的可能。还有一个时序问题如果确实要在程序里写 D8120必须在通讯指令执行之前完成赋值而且要留出一个扫描周期以上的间隔。我一般在初始化段用 M8002首次扫描脉冲触发一个 MOV后面挂个定时器延时 100ms 再允许通讯稳一点。提示格式字改完必须断电重启或者让模块重新初始化一次有些参数不是立即生效的。改完参数不重启就测很容易误判成设置无效。4. ADPRW 指令实操读一台温控表的保持寄存器4.1 操作数逐个拆解与软元件占用ADPRW 有五个操作数按顺序是从站站号、功能码、地址、点数、数据区起始软元件。拿一条典型的读取指令举例ADPRW K1 H03 H0000 K2 D100K1是从站站号范围 1 到 247其中 0 是广播地址一般不用它读。H03是功能码读保持寄存器用 03读输入寄存器用 04读线圈用 01读离散输入用 02写单个寄存器用 06写多个寄存器用 10十六进制的 H10也就是十进制的 16。H0000是协议地址对应手册上的 40001。K2是点数读 2 个寄存器。D100是数据落地的地方。软元件占用是最容易算错的部分必须单独说。读取时数据放在 D100 到 D101共 2 个字完成状态放在D102也就是起始地址 点数的那一个位置。所以这条指令实际占用了 D100、D101、D102 三个字。写入时D100 到 D101 是你要发出去的数据完成状态在 D102。我强调这个是因为踩过坑有一次程序里 D100 往后正好是 PID 参数区读回两个寄存器后把 D102 的积分时间给覆盖了现象是温度控制偶尔抽风查了两天才定位到。ADPRW 的数据区后面一定要留出一个字的空位而且这个字不要用于其他逻辑。另外还有一个区分位软元件和字软元件的细节功能码 01 和 02 是读线圈状态的数据按位处理起始软元件要填 M 区这类位软元件功能码 03、04 是读寄存器的按字处理填 D 区。填错了不会报语法错但数据全乱。4.2 报文帧结构与时序要真正理解 ADPRW 在干什么得看一眼它发出去的报文长什么样。以站号 1、读地址 0 开始 2 个保持寄存器为例总线上跑的是这样一串字节方向字节内容说明请求01从站站号请求03功能码请求00 00起始地址高字节在前请求00 02寄存器数量请求CRC 低校验低字节请求CRC 高校验高字节响应01从站站号响应03功能码响应04后续数据字节数响应xx xx xx xx4 个字节即 2 个寄存器响应CRC 低校验低字节响应CRC 高校验高字节整个过程分成发请求—等应答—解析入库三段。ADPRW 的驱动条件给一个上升沿之后指令内部会自己走完这三段不需要你保持条件为 ON。用脉冲触发是关键如果驱动条件一直保持 ON指令在完成后会再次执行总线上就会出现连续的重复请求从站可能还没处理完就收到下一帧导致丢包。等应答的时间模块内部有超时监控超了之后会往状态字里写一个异常代码。但我建议外部再加一个定时器兜底比如给 500ms 的监视时间超时就置一个通讯异常标志让画面报警同时跳过去轮询下一个站。因为如果某一台设备掉电或者线断了全靠内部超时的话整个轮询链会长时间卡在这里其他站的数据全都不刷新了。4.3 可复用的轮询程序框架下面这套框架我在好几个项目里都用过结构简单改站号就能复用// 1. 参数初始化首次扫描 LD M8002 MOV H0081 D8120 // 通道19600, 8位, 无校验, 1位停止MODBUS模式建议用参数界面设置 MOV K0 D200 // 轮询步序号清零 // 2. 定时触发一轮轮询 LD M8000 OUT T0 K50 // 500ms 触发一次 LD T0 PLS M10 // 3. 轮询步进站号 1 - 2 - 3 - 回到 1 LD M10 AND D200 K0 MOV HFFFF D102 // 预置状态字防止未执行被误判成成功 ADPRW K1 H03 H0000 K2 D100 MOV K1 D200 LD M10 AND D200 K1 MOV HFFFF D112 ADPRW K2 H03 H0000 K2 D110 MOV K2 D200 LD M10 AND D200 K2 MOV HFFFF D122 ADPRW K3 H03 H0000 K2 D120 MOV K0 D200 // 4. 结果判断状态字为 0 表示正常 LD M8000 AND D102 K0 MOV D100 D300 // 1号站数据转存 LD M8000 AND D102 K0 SET M500 // 通讯异常报警这套写法的核心思路是用状态字代替等待完成。传统写法是盯着完成位等容易死等用状态字 定时轮询的方式每一轮都会重新发起即使某一次失败下一轮还会重试系统自愈能力更好。预置HFFFF这个动作看着不起眼但实实在在解决了一个隐蔽问题D102 上电默认是 0如果第一轮指令还没来得及执行程序读到 0 就认为通讯成功把初始的 D100也是 0当成真实温度值送进画面操作工会以为温度真的是 0 度。预置非 0 之后未执行的状态就是异常逻辑上干净很多。5. 无协议 RS2 指令自定义帧的收发5.1 自由口适用的场景有些设备就是不走 MODBUS。比如一些老款称重仪表帧格式是02 xx xx xx 03STX 数据 ETX校验就是一个简单的和校验再比如某些扫码枪、打印机、条码秤协议是厂家自己定的。这类设备 ADPRW 完全派不上用场只能走自由口。自由口的好处是什么帧都能拼坏处是什么都得自己算。帧头、长度、数据、校验、帧尾、超时、粘包处理一个环节没照顾到数据就串位了。用 RS2 之前格式字必须设成无协议模式。我一般用H00819600、8 位、无校验、1 位停止如果是 7 位数据加偶校验的老设备就设成H00A1之类的组合按第 3 章的算法自己推。8 位数据模式下一个字放两个字节高位在前低位在后拼帧的时候要特别注意字节序这是新手最容易写反的地方。5.2 发送、接收、超时三段式写法RS2 指令的操作数是发送数据起始、发送字节数、接收数据起始、接收字节数、接收完成标志。// 拼帧把 6 个字节装进 D400 开始的 3 个字 LD M8002 MOV H02AA D400 // 帧头 0x02 命令码 0xAA MOV H0100 D401 // 数据高字节 0x01 数据低字节 0x00 MOV H0300 D402 // 校验 0x03 帧尾 0x00 // 发送 接收 LD X10 PLS M20 LD M20 RS2 D400 K6 D410 K10 M30 // 发 6 字节最多收 10 字节完成标志 M30 // 接收完成处理 LD M30 MOV D410 D420 // 转存首字 RST M30 // 手动复位完成标志 // 超时兜底发了之后 300ms 没收到就报警 LD M20 OUT T10 K30 LD T10 AND M30 K0 SET M501这里有三个细节值得展开说。第一接收完成标志 M30 必须手动复位。它是电平型的一旦置位就保持你不复位下一帧来的时候它一直是 ON程序没法区分新的完成了还是老的还挂着。所以每次处理完立刻 RST 一下。第二发送字节数按字节算不是按字算。D400 到 D402 是 3 个字但实际发出去 6 个字节。填 K3 只会发出前三个字节剩下的丢了对方回的帧自然对不上。第三接收缓冲区要留余量。你填 K10意思是最多收 10 个字节实际收到 6 个字节也是正常的不要去数为什么没收满。反过来说如果你填的 K 值比实际帧短超出的部分会被截掉校验位就没了。5.3 变长帧和校验处理固定长度的帧好办麻烦的是变长帧。比如仪表回02 LEN DATA... CRC 03其中 LEN 字节告诉你后面有几个数据字节。这种帧不能靠收满 N 个字节来判断结束要靠帧尾特征字节。我的处理套路是接收缓冲区设得比最大帧长还要大一点接收完成标志置位后在程序里逐字节扫描找帧头和帧尾找不到帧尾就说明这帧不完整可能是被拆成了两次直接丢弃重来。这个扫描 丢弃的逻辑用 ST 或者梯形图的循环指令都能写代码大概二三十行。校验这块分类处理和校验 / 异或校验简单累加或者异或一遍就行用 FOR 循环或者手写几段 ADD 都能搞定。CRC16如果是标准 MODBUS CRC而你又用自由口那就要自己算。这种情况我的建议是——能回退到 ADPRW 就回退因为手写 CRC 查表要占不少程序步而且容易写错初值和多项式。真躲不开的话用预置的 256 项查表法网上常见的算法改一改就能用别自己硬推公式。还有一个隐形坑帧间隔时间。MODBUS RTU 要求帧之间至少 3.5 个字符时间的静默自由口设备往往也有两帧之间要隔多久的要求。如果轮询得太快从站会认为这是同一帧的延续数据就乱了。解决办法就是在每次发送后加一个小延时9600 波特率下 10ms 到 20ms 通常够用。6. 排查实录485 通讯最常踩的坑6.1 现象、原因、对策速查表下面这张表基本覆盖了我这些年遇到的九成问题调试时可以照着对现象大概率原因排查动作完全无响应模块灯不闪A/B 接反、线路断路反接线试测 A/B 间静态电压差模块灯闪但数据不更新站号填错、波特率不一致核对从站面板上的站号和波特率ADPRW 状态字固定报同一错误通道未设为 MODBUS 模式查 PLC 参数里的通讯模式设置数据能读但全是 0 或固定值地址偏移一位、软元件类型填错地址减 1 试检查 M/D 软元件读回来的数值高低字节颠倒字节序问题用 SWAP 或者 XCH 交换字节多站轮询时偶发丢数据轮询过快、无超时兜底加间隔时间加超时跳步通讯几小时后突然中断干扰、终端电阻缺失、接地问题加屏蔽单点接地两端加 120Ω写入成功但设备不动作功能码不对、只写了单寄存器确认设备支持的写功能码上电后必须断电重启才通格式字未生效参数改完断电重新初始化6.2 几条不写在手册里的经验第一条先用手册例程通一次再上自己的程序。我见过太多人一上来就直接写完整程序调试时怀疑程序逻辑、怀疑地址、怀疑接线变量太多反而找不到原因。正确姿势是裸线接好一段最简的读取指令一个站号读一个寄存器通了之后再把框架套上去。通了说明物理层和基本配置没问题后面所有问题都在程序逻辑里排查范围一下缩小百分之八十。第二条状态字是唯一可信的判据。不要靠灯在闪判断通讯正常也不要靠数据看着像对判断成功。ADPRW 的状态字为 0 才算这一帧成功其他数值都是异常。养成先把状态字读出来看、再去看数据的习惯能省下大量时间。第三条把异常代码抄下来查。ADPRW 状态字返回的不是 0 的时候那个数值是有具体含义的比如从站无响应、CRC 错误、功能码不支持手册上有对照表。很多人一看非 0 就重启重启不好就蒙了。抄下来查一次下次再见就有数了。第四条扫描周期暴涨往往就是通讯卡住。一台 PLC 之前跑得好好的加了通讯之后扫描周期从 5ms 涨到 30ms多半是某个指令在死等应答。检查一下是不是驱动条件一直保持 ON、是不是没加超时兜底。通讯类指令一定要当成可能失败的外部交互来设计不能假设它一定成功。第五条多站轮询的周期要算一下。9600 波特率下一次读 2 个寄存器大约 15 个字节的往返加上帧间隔和从站响应时间保守估 50ms 一站。挂了 20 个站一轮就是 1 秒。如果你的工艺要求每个点 200ms 刷新一次那这套方案本身就不成立得换思路或者减少点位。我个人在实际项目里的体会是485 通讯这东西难点从来不在指令语法上——ADPRW 五个操作数看十分钟手册就会填了。真正耗时间的是那些看不见的地方一根接反的线、一个没生效的格式字、一位错位的地址、一处被覆盖的软元件。这些内容手册上不会单独拎出来讲只能靠现场一个一个撞过去。所以每次开新项目我都会先把物理层验证 → 单站单点通讯 → 多站轮询 → 异常兜底这四步按顺序走完一步不跳后面能省下的时间远比这四步花的多。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询