
简介一份面向三菱Q系列PLC初学者与现场调试人员的MODBUS通信实例文档围绕QJ71C24N串口模块展开帮助读者理解模块配置、协议支持功能设置及G.CPRTCL指令的使用方法。压缩包内共1个doc文件约854KB以图文步骤、参数说明和变频器读取案例组织内容涵盖GX WORK2工程建立、CH2通信协议与通信速度设置、软元件批量配置、模块写入及通讯接线等要点。文档结合安川A1000变频器给出输出频率与电压读取示例并解释Un、n1、n2、(S)、(D)等指令参数含义便于对照现场设备排查通信问题。已有6752人学习适合需要快速上手QJ71C24N MODBUS RTU通信、查阅配置细节与案例参考的工程技术人员。1. QJ71C24N 跑 MODBUS RTU从一块串口模块到一条能通的链路产线上要读一台变频器的输出频率和母线电压PLC 侧只有一个 Q 系列 CPU 加一块 QJ71C24N 串口通信模块边上没有网关、没有多余网口。这种活儿的常规解法就是让 QJ71C24N 直接跑 MODBUS RTUPLC 当主站、变频器当从站一根两线 485 把数据拉回来。QJ71C24N MODBUS 通信实例看起来简单组态、建协议表、调 G.CPRTCL、从 D7002 附近取数。真正让人卡住的往往是最前面半步——智能功能模块的起始 XY 地址填错一位后面所有软元件跟着错位程序写得再漂亮也只是对着空气发数据。这份实例的价值在于把这整条链路串起来模块挂载、协议表、控制数据区、读写程序、接线联调适合手上已有 Q 系列硬件、需要跟变频器或仪表做串口对接的电气与自动化从业者也适合第一次碰通信协议支持功能、想看清楚 G.CPRTCL 到底怎么用的人。2. GX Works2 组态起始 XY 地址、CH2 协议与波特率三项对齐2.1 先定槽位和起始 XY 地址这是后面所有地址的根打开 GX Works2新建工程CPU 型号按实际填例子是 Q00UJ工程树里右键智能功能模块弹出的安装位置设置要按硬件实际情况选——模块插在哪个槽就填哪个槽不要照抄教程里的编号。设完槽位之后软件会给模块分配一段起始 XY 地址本例是 0090也就是模块占 X90X9F 十六点输入、Y90Y9F 十六点输出。这个号必须记牢因为它在三个地方要完全一致程序里 G.CPRTCL 的 Un 参数、TOP 指令的目标模块、以及模块参数窗口里显示的模块号。后面换槽位、加模块、改底板这个号会重新分配而程序里的 Un 不会自动跟着变不改就是全盘错位。提示紧凑型 CPU 的可用槽位有限扩展底板上的模块编号是连续排下去的别只看 CPU 本体上插了几个。装完模块先回参数里核对一遍起始 XY再往下走。2.2 开关设置CH2 的协议类型与传输速率要跟从站逐项对上双击开关设置进入通道设置界面选中 CH2。这里有个型号层面的前提QJ71C24N 是 CH1 走 RS-232、CH2 走 RS-422/485 的组合模块要跑两线 485 总线只能用 CH2如果手上是 R2 型号两路都是 RS-232根本接不了 485 总线这个坑最好在拆包装前就排掉。具体设置分三块。运行设置里把 CH2 的工作方式切到通信协议设置让模块按通信协议支持功能里建的协议表干活而不是走无顺序协议通信协议设置里选 MODBUS RTU通信速度按从站设备的参数页填9600、19200、38400 都是常见值必须跟变频器或仪表那一侧完全一致。数据格式通常是 8 位数据位、1 位停止位、偶校验或者无校验MODBUS RTU 对这三种组合都支持但主从两侧必须一样。校验位不一致的典型表现是能收到回包但每个字节都错读回来的数值是乱的。改完记得点设置结束或者应用不点的话窗口一关就白改。提示波特率改完必须重新做一次模块写入模块不会实时感知你改了参数。很多人改完速率直接去试通信发现还是原来的速率就是漏了这一步。2.3 通信协议支持功能把功能码 03 建成一张可执行的协议表这里要说清楚为什么用通信协议支持功能而不是无顺序协议。走无顺序协议报文要自己拼、CRC 要自己算、回包要自己拆CPU 侧要写一大堆字节操作走通信协议支持功能模块内部已经内置了 MODBUS RTU 的报文格式和 CRC 校验CPU 只需要把站号、寄存器地址、点数这些参数丢进控制数据区模块自己组包、自己校验、自己回填结果。开发量差一个数量级稳定性也更好。操作路径是工具 → 通信协议支持功能 → 串行通信模块出现协议列表窗口后点新建再点添加在协议名一栏里选 MODBUS RTU 的功能码。本例第一个协议选读保持寄存器功能码 03确定后窗口里会多出一行记录协议编号就是后面程序里要填的编号。需要读频率和电压之外还要写给定频率的可以继续点添加选功能码 06写单寄存器或者 16写多个寄存器。每加一个协议都会分到一个编号这个编号与功能码的对应关系建议直接抄在纸上或者记在工程注释里写程序时要用。协议添加完了还要做软元件分配点编辑 → 软元件批量设置输入起始软元件号比如 D7000软件会自动把协议执行编号区、控制数据区、接收数据区排开。设完点工具 → 设置软元件一览显示能看到完整的软元件分配表包括本例里 D7052 起的协议执行编号寄存器区。这张表要截图留着后面写程序、查收数据都靠它。2.4 模块写入参数生效的最后一公里参数和协议都配置好之后点在线 → 模块写入选择正确的模块执行写入。写完会弹提示框确认之后模块才会按新参数运行。这一步和写入可编程控制器是两码事模块写入是把智能功能模块的参数、协议表烧进模块本身写入 PLC 是下载梯形图程序。两件事都要做少一件都不通。写入完成后建议把 CPU 复位一次或者给模块断电重启让参数彻底生效。现场遇到过改完参数提示写入成功、但实际还在跑旧波特率的情况复位一次就正常了这种玄学问题多数是模块没吃透新参数。3. G.CPRTCL 与软元件分配D7000 起这块控制区怎么排才不出错3.1 控制数据区的排布逻辑先看懂再抄G.CPRTCL 是通信协议支持功能的核心指令它做的事情是按照你在模块里建好的协议表拿控制数据区里的参数组一帧报文发出去收到回包后把数据填到接收区最后在完成标志位上报一个结果。CPU 侧全程不碰字节只跟软元件打交道。这份实例里的控制数据从 D7000 开始D7000 放外部设备的 MODBUS 地址也就是从站站号D7001 放要访问的寄存器地址D7002 放读取或写入的点数。三个字对应一帧报文里最关键的三个字段。读变频器的频率和电压就是把站号丢进 D7000把 0024H 丢进 D7001把 K2 丢进 D7002然后触发指令。接收数据紧跟在控制区之后具体偏移以软元件一览里显示的为准不同软件版本、不同起始软元件号会略有差异别凭记忆写偏移量。我一般会在软元件一览窗口把接收区起始地址抄下来标在梯形图注释里后面读数直接按注释取。提示控制数据区和接收区是连续占用的规划软元件时前后各留出几十个点的余量。后面加第二、第三个协议的时候控制区一扩原来挨着放的中间变量就被覆盖了这种事故排查起来极其难受。3.2 G.CPRTCL 的五个参数逐项拆开指令格式是 G.CPRTCL Un n1 n2 (S) (D)五个参数每个都有明确含义错一个就不通。Un 是模块的起始 I/O 编号对应智能功能模块参数里那个四位 XY 地址。本例模块分配在 0090Un 就填 H90。换槽位、改底板之后这里必须跟着改这是现场最高频的一类错误。n1 是通信端口号1 代表 CHANNEL 12 代表 CHANNEL 2。本例走 485 两线所以填 2。填错端口最典型的症状是模块上 CH2 的收发灯一闪一闪程序却永远等不到完成因为数据全从 CH1 出去了。n2 是连续执行的协议个数指从控制数据里的第一个协议编号开始连续执行几个协议。只读一组数据就填 1如果一次要读频率电压、再读一遍报警码可以把两个协议编号连着排n2 填 2模块会按顺序执行完再统一给完成标志。(S) 是控制数据保存的起始地址本例是 D7000。这个地址由软元件批量设置决定改过起始软元件号的话这里要同步改。(D) 是通信结束时的标志位通信正常完成置 ON。按指令说明(D)1 是异常完成标志通信失败时置 ON具体的错误代码在控制数据区里能查到。写程序时两个标志都要接只看完成标志不看异常标志出问题时就是纯黑匣子。3.3 读保持寄存器 03 的完整程序段下面这段是读变频器 0024H 起两个寄存器的实际写法注释里标了每个值的来源; 读变频器 0024H输出频率、0025H输出电压CH2协议编号 1 MOV H1 D7000 ; 从站站号按变频器参数页里的 MODBUS 地址填 MOV H24 D7001 ; 保持寄存器起始地址 0024H MOV K2 D7002 ; 连续读 2 个寄存器 SET M100 ; 触发条件上升沿执行一次 LD M100 G.CPRTCL H90 K2 K1 D7000 M200 ; H90 模块起始 I/O 编号本例分配在 0090 ; K2 端口号CH2 ; K1 连续执行 1 个协议 ; D7000 控制数据起始地址 ; M200 完成标志M201 为异常完成标志逻辑上分两段前三行是准备参数把站号、寄存器地址、点数摆好后面是触发执行M100 置位后指令开始跑跑完 M200 置 ON。实际用法一般是把 M200 接到复位 M100 的回路上形成置位—执行—完成—复位—再置位的循环这样才有稳定的周期刷新。参数说明里几个容易出问题的地方D7001 里填的是十六进制寄存器地址H24 对应 0024H别填成十进制 24D7002 是点数读两个寄存器填 K2填多了会读到相邻的无效寄存器从站可能直接返回异常码。3.4 写寄存器的程序段与多协议连续执行写功能码 06 是单寄存器写入控制区结构跟读类似多了一步把要写的数据放进发送数据区。数据区的起始地址同样以软元件一览为准别和接收区混用; 写变频器频率给定功能码 06协议编号 2 MOV H1 D7010 ; 从站站号第二组控制区起点与读操作错开 MOV H01 D7011 ; 写入目标寄存器地址按从站手册填 MOV K1 D7012 ; 写 1 个寄存器 MOV K5000 D7013 ; 写入值标度按手册换算示例为 50.00Hz 的原始码 SET M110 LD M110 G.CPRTCL H90 K2 K1 D7010 M210这里刻意把写操作的控制区从 D7010 开始跟读操作的 D7000 分开。读写共用同一块控制区、靠切换功能码来实现的做法看着省软元件实际上很容易在时序上打架——写还没完成读的触发条件就把它覆盖了。一个 G.CPRTCL 指令最多可以连续执行 8 个协议协议编号依次放在 D7052 起的连续 8 个字里D7052 是第一次执行的协议编号D7053 是第二次一直排到 D7059 对应第八次。这个区域是软元件批量设置自动分配的改了起始软元件号会整体平移程序里的引用要跟着改。4. 接线与从站对齐0024H 读频率电压这条路怎么调通4.1 RS-485 两线接法把四线并成两线再把屏蔽和终端处理掉QJ71C24N 的 CH2 出的是 RS-422/485 四线端子SDA、SDB 是一对发送RDA、RDB 是一对接收。两线半双工接法要把模块侧的发送和接收并起来SDA 与 RDA 短接成 ASDB 与 RDB 短接成 B然后 A 接从站 A、B 接从站 B。现场最容易翻车的是 A/B 极性。不同厂商对 A、B 的定义是反的有的把 A 叫正端有的叫负端。接反了通信完全不通也不报错收发灯该闪还是闪就是收不到正确回包。遇到怎么调都不通的新设备把 A、B 对调试一次是成本最低的排查手段。屏蔽层和接地也要处理线缆屏蔽层单端接地一般接在 PLC 柜这一侧另一头悬空两头都接会形成环流长距离时干扰明显。总线两端各挂一只 110150Ω 的终端电阻中间节点不要挂距离短、设备少的时候可以先不加但布线超过几十米、或者现场有变频器这类干扰源终端电阻最好老老实实装上。站号、波特率、校验、停止位这四项主从两侧必须完全一致。变频器侧一般在参数页里有专门一组通信参数改完要断电重启或者执行参数保存只在面板上改不保存是没有用的。4.2 用 0024H 读频率和电压地址对了标度还得对变频器的 MODBUS 寄存器地图里输出频率和输出电压通常是相邻的两个保持寄存器本例是 0024H 和 0025H。程序里就是 MOV H24 D7001、MOV K2 D7002 两行读回来的两个数落在接收区连续两个软元件里。数据读回来不等于活干完了还有标度换算。多数变频器的频率寄存器标度是 0.01Hz读到 5000 表示 50.00Hz电压标度可能是 0.1V 或者 1V不同厂商、不同系列都不一样。这个必须以变频器手册的数据表为准凭经验直接除 100 很容易出现差十倍的问题而且这种错误在数值上看起来很合理不容易被发现。本例对接的是某品牌 A1000 系列变频器具体寄存器和标度以该系列手册的通信数据表为准。如果读回来的数明显不对先看是不是高低字节顺序的问题。有些设备返回的是高字在前有些是低字在前32 位数据拼接顺序反了会得到一个完全离谱的数值。用 SWAP 指令或者手动调换两个字的顺序就能验证。4.3 联调顺序先单点通再上量联调别一上来就接整条总线。先在实验台上用一个模块、一台从站、一米线把单个寄存器的读通确认站号、波特率、校验、寄存器地址、标度全部正确再接现场总线。上量之后如果出现部分设备偶尔读不到先查终端电阻和接地再查总线拓扑有没有星形分支——485 总线要求手拉手串下去星形接法在分支点会产生反射短距离看不出问题长距离就是随机丢包。最后再查是不是轮询间隔太短从站来不及处理下一帧。5. 避坑与排查五条现场翻车记录的现象、原因和解决5.1 现象G.CPRTCL 执行后完成标志一直不 ON原因排下来最常见的是 Un 参数和模块实际起始 I/O 编号不一致。中途改过槽位、加过扩展模块、或者从别人的工程里拷了程序段都会导致这个号错位。指令照样执行只是它对着一个不存在的模块发数据当然不会完成。解决方式是回到参数里的智能功能模块设置看起始 XY 到底分配成了多少把 G.CPRTCL 的 Un 和 TOP 指令的目标一起改过来。改完记得重新做模块写入参数和程序两边都对齐了才算完。另一个次要原因是触发条件用了电平而不是上升沿导致指令被反复重入这种情况把触发改成脉冲或者加个自复位回路就好。5.2 现象偶尔能读到数据多数时候超时收发灯乱闪这是典型的回波问题。两线半双工接法下模块自己发出去的数据会被自己的接收端听到如果模块把这段回显当成从站的应答协议判别就会错乱表现就是时通时不通或者读回来的数全是错的。解决办法是把回波传送禁掉。实例里用一句 TOP 指令向模块的缓冲存储器写一个禁止回波的设置目标缓冲地址是 1C2H写一个点; 禁止 CH2 回波传送模块起始 I/O 0090 ; TOP Un S1 S2 n Un模块起始I/OS1缓冲地址S2写入值n点数 TOP H90 H1C2 K1 K1这段一般放在程序的最前面用常 ON 触点或者初始化脉冲执行一次即可。注意 Un 同样要跟模块实际起始 I/O 编号一致有的资料里把它简写成 H9抄之前先核对自己模块分配到的到底是 0090 还是别的号别照抄。5.3 现象第一次读成功之后再也不刷新原因是完成标志没有参与握手。指令跑完 M200 置 ON 之后一直保持触发条件 M100 也一直是置位状态第二次执行的条件根本不存在数据就停在第一次的结果上看起来像是卡住了。解决思路很简单把完成标志接回来复位触发条件。M200 或 M201 任意一个 ON就复位 M100同时复位完成标志本身下一个扫描周期重新置位触发。做成周期轮询的话中间再加一个定时器控制轮询间隔别让指令一个扫描周期接一个扫描周期地连发从站扛不住这种节奏。5.4 现象读回来的数值差十倍或者完全离谱数值差整十倍基本是标度没换算。变频器频率寄存器多数是 0.01Hz 标度读到 5000 除以 100 才是 50.00Hz直接按 1Hz 理解就变成 5000Hz。数值离谱到不成样子优先怀疑高低字节顺序反了或者读的寄存器地址偏了一位、读到了相邻的其他参数。解决方式是按从站手册的通信数据表逐项核对寄存器地址和标度别凭经验。16 位数据用 SWAP 指令验证字节序32 位数据要确认高字低字的拼接顺序。这类错误不会报通信异常只能靠对数发现所以第一次读数一定要跟变频器面板显示的实际值对一遍。5.5 现象参数改完、程序也下载了通信还是按老参数跑模块写入和 PLC 程序写入是两条独立的路径只做了后者模块里的协议表和通信参数还是旧的。另一种情况是模块写入时选错了模块多模块系统里点错了目标参数写到了隔壁模块上。解决方式是在线 → 模块写入看清楚目标模块的起始 I/O 编号再执行写完按提示确认然后给 CPU 复位一次或者模块断电重启。做完之后打开模块参数窗口回读一遍确认波特率、协议号、软元件分配都跟预期一致再去看程序逻辑。6. 从跑通到复用轮询状态机与失败重试的两段写法单次读通只是验证链路真正上线要的是稳定轮询。我一般不用完成就复位、复位就再触发这种裸写法而是加一个小的状态机等待 → 发送 → 等待完成 → 取数 → 冷却五个状态各占一个软元件位冷却用定时器控制。; 精简轮询骨架ST0 空闲ST1 触发ST2 等完成ST3 取数ST4 冷却 LD M8000 ; 常 ON ANI M300 ; 冷却未结束 ANI M301 ; 无异常挂起 SET M100 ; 触发一次协议执行 LD M200 ; 正常完成 SET M310 ; 置取数请求交给后续处理 RST M100 LD M201 ; 异常完成 RST M100 INC D8000 ; 异常计数器用于判断是否需要告警 LD M310 OUT T10 K50 ; 冷却 5 秒按从站响应能力调整 LD T10 RST M310这段骨架的关键点有三个。一是异常分支必须接M201 一置位就复位触发同时累加一个计数器连续失败超过阈值再输出告警避免一次偶发干扰就停机。二是冷却定时器的时间要按从站的实际响应能力给变频器这类从站处理一帧需要几十毫秒轮询间隔压到几十毫秒会看到随机超时。三是取数请求M310要和数据处理逻辑解耦取数和换算分开写后面加第二条协议的时候直接复制这套骨架就行。重试逻辑建议做成阶梯式的第一次失败立即重试一次还失败就等一个完整冷却周期再试连续三次失败才置告警位。现场干扰大多是瞬时的无脑重试能把大部分偶发超时吃掉又不会因为从站真掉线而疯狂刷总线。有一个习惯我保持了挺久每接一个新从站先在实验台上用最短的线、最低的波特率9600把单个寄存器读通把标度对完再上现场改速率、加节点。从那以后我每次改完模块参数都强制走一遍模块写入 → 复位 → 回读参数核对再去看程序跑不跑因为血泪经验告诉我八成的不通都出在参数没生效和 Un 填错这两件事上而不是程序逻辑写错了。希望帮到你。本文还有配套的精品资源点击获取