QJ71C24N与QJ71C24N-R2无顺序协议串口通信调试指南
简介面向工业自动化现场工程师与三菱Q系列PLC初学者这份文档聚焦QJ71C24N与QJ71C24N-R2两款串行通讯模块之间的RS232互联解决接口类型不同、采用无顺序协议时的参数设置与程序编写问题。压缩包共1个docx文件约197KB内容以图文对照的操作说明与程序片段为主含模块通道差异示意图、通讯线缆接线图以及Works2中添加智能功能模块、开关设置通道1的完整截图便于对照实际工程照做。已有3907人学习下载。读者可从中获取两类模块的接口差异辨析波特率、奇偶校验、数据位与停止位等通讯参数的配置要点以及QJ71C24N-R2接收程序与QJ71C24N发送程序的设计思路另附CRC校验、超时机制、通讯双方参数保持一致等稳定性建议适合作为串行通讯链路调试时的速查参考。1. 两块串行通讯模块对着连最容易被“看起来一样”骗过去现场最容易被低估的一类调试是两块 Q 系列串行通讯模块对着连一边是 QJ71C24N另一个通道还要挂扫码枪另一边是 QJ71C24N-R2两个口都是 RS-232。型号只差一个后缀很多人下意识按同一套参数抄一遍线也按同一根做结果上电后一盏 RD 灯都不闪。真实差别在通道构成上——QJ71C24N 是“一个 RS-232 一个 RS-422/485”的混合口QJ71C24N-R2 是两个纯 RS-232 口接线方式、可用协议、参数页里的可选项都不一样。这篇按我实际调试的顺序拆先认通道和协议再落到 GX Works2 的开关设置最后是发送和接收两段程序以及五个我踩过的坑。适合手里正拿着这两块模块、要在一两天内把链路打通的人。2. 先认通道再动手QJ71C24N 与 QJ71C24N-R2 的硬件账2.1 一个混合口一个双 232 口选型先看对方接口QJ71C24N 面板上是两个通道但物理形态不同CH1 是 RS-232走的是 9 针 D-SUBCH2 是 RS-422/485走的是模块自带的接线端子能拉两线或四线。QJ71C24N-R2 则是把两个通道都做成了 RS-232面板上两个 9 针 D-SUB 并排。这个差别直接决定了两件事一是能接几台 232 设备二是有没有差分总线可用。如果现场只对接一台设备两者随便选。但只要出现“一台 232 扫码枪 一条 485 总线上的温控表”QJ71C24N 就比 QJ71C24N-R2 合适因为 485 那一路不用再外挂转换器省掉一级故障点。反过来如果两台设备都是 232 且要同时在线QJ71C24N-R2 的两个独立通道更省事两块模块就能凑出四路 232。模块占 16 点 I/O起始 I/O 号决定缓冲存储器里的Un。我一般把靠近 CPU 的模块排前面起始号设 0程序里就是U0\G…如果排在第二个智能模块位置起始号 0x10所有U0\G都要改成U10\G。这一步看着小实际是新手最容易翻车的点——程序照抄别人的地址没跟着起始号改指令执行了但数据进的是另一个模块的缓冲区。还有一个物理边界要提前说清RS-232 是点对点一个通道只能挂一台设备不能像 485 那样并接。现场有人图省事把两台设备的 RD 并到一个 D-SUB 上短期内可能“能用”但只要两台同时回数据就会互相顶表现为随机丢帧而且很难查。2.2 MC 协议、无顺序协议、双向协议什么时候选哪个这两块模块都支持三种通讯方式MC 协议、无顺序协议、双向协议。名字抽象落到现场其实很好分。MC 协议是模块当从站对方按 MC 帧格式发命令来读写 PLC 软元件。适合对方是上位机、触摸屏或者会写 MC 帧的 PLC好处是数据区不用自己定义坏处是对方必须懂这套帧结构。如果对面是一台只会发 ASCII 的仪表选 MC 协议就是自找麻烦。双向协议是模块替你处理一部分帧格式收发带固定头尾和校验适合简单的 ASCII 设备比如某些称重仪表、老式条码枪。无顺序协议最“裸”你往发送缓冲区写什么字节模块就往外发什么字节收到的字节原样进接收缓冲区模块不管内容。正因为什么都不管它适合两端都是 PLC、帧格式自己定的场景也就是这篇要做的——QJ71C24N 的 CH1 和 QJ71C24N-R2 的 CH1 对着连帧结构由程序约定。选无顺序协议的理由很实际两端都是 PLC谁也不需要兼容别人的协议栈帧头帧尾、校验方式、数据长度全可以按现场需要定。代价是所有事情都得自己做——帧要自己组校验要自己算超时要自己管。提示无顺序协议下模块不会帮你做任何帧校验和校验码开关设为“有”也只对双向协议有意义别指望打开它就能自动校验。2.3 交叉线怎么接三线制的前提是什么RS-232 的对接是交叉一端的发送对另一端的接收。9 针 D-SUB 里几个关键脚位如下表。脚位信号方向对接方式2SDTXD模块发出接对方 3 脚3RDRXD模块接收接对方 2 脚5SG信号地—两端直连7RSRTS模块发出见下文处理8CSCTS模块接收见下文处理4ERDTR模块发出一般悬空6DRDSR模块接收一般悬空最省事的是“三线制”只接 2、3、5两端交叉。但三线制能不能用取决于模块的 RS/CS 控制设置——如果模块被配置成“检查 CS 信号”而 CS 脚悬空模块会认为自己无权发送表现就是程序执行了、发送区数据也写进去了但线上一个字节都没有。所以三线制必须配合开关设置里的 RS(CS) 控制改为“不使用”或者在两端各自把 7 脚和 8 脚短接做一个本地自环骗过模块。我一般的做法是线缆做五芯2、3、5 交叉直连7、8 在两端插头内部各自短接。这样无论模块参数怎么设都不会因为握手信号卡住后期换设备也不用重新做线。线长控制在 10 米以内超过 15 米就别硬撑老老实实加隔离或者换 485。屏蔽线单端接地两头都接地容易引入地环流反而更容易丢帧。3. GX Works2 里的参数落地开关设置逐项对照3.1 添加模块与通道定位参数不是在 PLC 参数里设而是在智能功能模块的开关设置里设。步骤是右键智能功能模块添加新模块模块类型选串行通信型号按实际选 QJ71C24N 或 QJ71C24N-R2确定后展开树形结构双击开关设置。这里有个隐含动作容易被跳过添加模块时填的起始 I/O 号必须和实际机架上的位置一致。GX Works2 不会去读硬件你填 0 它就是 0实际模块在 0x10 的位置参数就写到了不存在的地址上下载后模块照样按默认值跑表现为“参数明明改了但没生效”。添加完两块模块后树里会出现两个节点。QJ71C24N 展开后有 CH1 和 CH2 两组设置QJ71C24N-R2 也是两组但两组都是 232。对接用的是各自的 CH1所以只改 CH1CH2 保持默认即可——除非你现场还用了第二个口那时必须分别设。3.2 开关设置里真正要改的那几项开关设置页面项目不少实际决定链路能不能通的就那么几项。以两端都设 9600、8 数据位、1 停止位、偶校验为例设置项建议值说明运转模式无顺序协议决定模块按哪种帧规则收发数据位8要传二进制帧就选 87 位会把高位吃掉奇偶校验偶校验两端必须一致工业现场常用偶校验停止位1两端一致即可通信速度9600短距离可上 19200/38400长线降速更稳和校验码无无顺序协议下由程序自己校验站号0无顺序协议下不参与寻址但两端设成一样省事RS(CS)控制不使用三线制必须关掉否则发不出去DR(ER)控制不使用同上除非对方真的给 DSR附加超时时间不设置需要时再开先用程序侧超时运转模式这一项在 QJ71C24N 和 QJ71C24N-R2 上位置一样、选项一样但下拉框里 CH2 的选项会比 CH1 少一些QJ71C24N 的 CH2 是 485部分模式不支持。这是正常现象不要以为是软件版本问题。数据位和校验的组合有个坑如果选 7 数据位 偶校验一帧实际是 7119 位加上起始位共 10 位选 8 数据位 无校验是 819 位加起始位共 10 位。两者在示波器上看帧长一样但内容解析完全不同。现场接手别人调一半的项目时先拿串口助手抓一帧看实际位宽比翻参数页快。3.3 两边参数对照一致只是及格线把两端参数并排写出来方便逐项核对项目QJ71C24N CH1QJ71C24N-R2 CH1运转模式无顺序协议无顺序协议数据位88奇偶校验偶偶停止位11通信速度96009600和校验码无无RS(CS)控制不使用不使用起始 I/O 号按实际位置按实际位置参数一致只保证“能听懂对方在说什么”不保证“帧能对上”。无顺序协议里帧结构是程序约定参数页里没有任何一项能表达“我的帧从 STX 开始、到 ETX 结束”。这一点经常被误解调不通时就反复改波特率其实问题在帧解析逻辑上。改完参数要下载而且开关设置的生效方式和其他参数不同下载后需要把 CPU 复位一次或者给模块断电重启。只下载不复位模块仍然跑旧参数监视里看到的却是新参数这种“看到的和跑的不一样”最耗时间。注意改完开关设置后先做一次模块复位再做通讯测试。省下的这一分钟往往能省掉半小时的自我怀疑。4. 无顺序协议的收发程序发送侧和接收侧怎么写4.1 发送侧帧组装和 OUTPUT 指令发送侧的核心是两个动作——把要发的字节组织到连续软元件里然后调 OUTPUT 指令把这段数据送进模块的发送缓冲区并触发发送。QJ71C24N 的 CH1 发送缓冲区从U0\G256开始长度 256 个字CH2 从U0\G768开始。QJ71C24N-R2 的地址分配规律相同CH1、CH2 分别对应各自的区段。下面这段是发送侧最小可用的写法帧格式假定为STX 4 字节数据 ETX; 发送触发M100 上升沿一帧只发一次 LD M100 PLS M101 ; 组帧ASCII 直接写入STX 和 ETX 单独放 LD M101 MOV H02 D100 ; STX $MOV 1234 D101 ; 4 字节数据占 D101、D102 MOV H03 D103 ; ETX ; 发送从 D100 起 4 个字送进 CH1 发送缓冲区 LD M101 OUTPUT U0\G256 D100 K4 SET M110 ; 发送中标志 ; 等待发送完成完成后清标志 LD M110 AND X1 ; 发送完成信号按实际自动刷新地址核对 RST M110 RST M101OUTPUT指令三个操作数分别是缓冲存储器起始地址、CPU 侧数据起始软元件、点数。点数的单位是字1 个字对应 2 个字节所以上面 4 个字实际发出 8 个字节。这一点必须记牢因为组帧时很容易按“字节数”去填结果多发一倍长度对方收到半帧有效数据后面跟着一串垃圾。字节顺序也是固定的一个字里先发高字节、再发低字节。用$MOV写 ASCII 时高位在前正好对应正常阅读顺序但如果用MOV H3132这种方式手工塞数据就得留意高低位是不是反了。我见过最典型的现象是对方收到的内容整体“错一位”比如应该收到1234实际收到2143就是字节序的问题。发送侧还需要一个“别连着发”的约束。OUTPUT执行后数据在模块内部排队往外发如果下一个扫描周期立刻又覆盖发送缓冲区会出现两帧粘连对方按帧头解析时第二帧直接丢掉。做法是加一个发送中标志等完成信号置位后再允许下一帧。4.2 接收侧先看个数再搬数据接收侧的动作顺序和发送相反先读接收数据个数判断有没有新数据再用INPUT指令把数据从接收缓冲区搬到 CPU 软元件。QJ71C24N 的 CH1 接收缓冲区从U0\G512开始同样 256 个字。; 读取 CH1 接收数据个数 LD SM400 ; 常 ON FROM U0\G513 D300 K1 ; 个数存放地址首次使用请用缓冲存储器监视核对 ; 有数据才搬 LD D300 K0 INPUT U0\G512 D200 K16 ; 最多搬 16 个字即 32 字节 SET M200 ; 收到新帧标志 ; 帧解析判断 STX / ETX 是否齐全 LD M200 MOV D200 D400 AND D400 H02 ; 首字节是 STX MOV D201 D401 ; 取数据区 RST M200INPUT的点数同样按字算写 16 就是搬 32 个字节。这里不要图省事写一个很大的值比如 K128虽然不会越界缓冲区就 256 个字但会把上一次残留的旧数据一起搬进来解析时容易误判成新帧。接收个数所在的地址不同固件版本和不同起始 I/O 号下会有出入我一般第一次接新模块时用 GX Works2 的缓冲存储器监视功能确认一遍让对方发一帧看哪个地址的值从 0 变成帧长。确认之后再把地址写死到程序里比照抄别人的程序靠谱。还有一个必做的动作是“读完清空”。无顺序协议的接收缓冲区不会自动清零读走的数据还在里面如果下一帧比上一帧短多出来的尾部就是上一帧的残留。解析时如果只看帧头不看长度很容易把残留当数据。稳妥做法是每次搬完数据后把接收区按固定长度填 0或者严格按接收个数截取有效部分。4.3 一个最小握手流程两端都是 PLC 时最省事的握手是“请求—应答”两帧方向帧内容说明QJ71C24N → QJ71C24N-R2STX 01 数据 ETX01 表示写数据请求QJ71C24N-R2 → QJ71C24NSTX 81 状态 ETX81 表示应答状态 00 成功发起方发完请求后启动一个 500ms 定时器超时没收到 81 开头的应答就重发连续 3 次失败置报警位。应答方收到 01 后先处理数据再回 81。这套结构简单但足够覆盖大部分现场需求也方便后期加功能码。流程里要做的一件事是“发送前清接收区”。发起方在上一次应答处理完后把接收软元件清零避免上一次的应答被当成这一次的。这个动作在单步调试时看不出问题一旦节拍变快就会暴露。5. 避坑记录上线后最容易翻车的五个点5.1 接线和电气侧的两条现象程序执行了发送缓冲区也写进去了但对方一个字节都收不到。原因基本锁定在握手信号上。三线制接法只连了 2、3、5模块的 CS 脚悬空而开关设置里 RS(CS) 控制还是默认的“使用”模块判定对方未就绪数据卡在发送队列里。解决办法二选一把开关设置里的 RS(CS) 控制改成“不使用”并复位模块或者在两端插头里把 7 脚和 8 脚短接。我倾向前者改参数比改线快也不容易在插头里留虚焊。现象白天跑得好好的下午开始随机丢帧重启又正常。这种情况先查接地和线长别急着改程序。两端都接了屏蔽层地线时地电位差会在地线上形成环流叠加在信号上就是随机误码。处理办法是屏蔽层只在一端接地另一端悬空线长超过 10 米时把波特率降到 4800 试试如果降速后稳定基本可以确认是线缆质量问题而不是程序问题。另外RS-232 的信号地和设备外壳地不是一回事把 SG 接到柜体地上会引入干扰5 脚就接 5 脚不要乱接。5.2 参数和程序侧的三条现象两端参数逐项核对完全一样就是收不到数据。先看两边改的是不是同一个通道。QJ71C24N 有 CH1、CH2 两组设置QJ71C24N-R2 也有两组对接用的是 CH1但有人习惯性去改 CH2或者改完 CH1 忘了 CH2 还留着默认值实际通讯走的是没改的那个口。再确认下载后有没有复位。开关设置的生效需要模块重启只下载不复位时监视窗口显示的是新参数模块跑的是旧参数。现象对方收到的帧长度不对或者内容整体错位。这是点数单位和字节序的问题。OUTPUT的第三个操作数按字计不是按字节计。要发 8 个字节就写 K4写成 K8 会多发一倍长度后面跟的全是缓冲区里的残留数据。同理手工用MOV塞数据时要确认高低字节顺序一个字里先发高字节。调试期最简单的验证方式发一串ABCDEFGH用串口助手按十六进制看收到的应该是41 42 43 44 45 46 47 48顺序不对就说明字节序反了。现象跑几个小时以后通讯卡死PLC 也不报错。没有超时和重发机制一次丢帧后发起方永远在等应答接收方的接收区又堆着旧数据双方都卡住。无顺序协议本身不提供任何恢复机制全靠程序兜底。做法是给每次请求加一个定时器超时后清接收区、重发连续 3 次失败置报警位并停止发送等人工确认。报警位一定要留不然现场只会看到“设备不动了”查起来毫无线索。6. 上线前先做一次回环自测一根线省下半天这套链路我最推荐的一个习惯是在接对方设备之前先让模块自己跟自己通一次。做法很简单拔掉对外的线用一段短接线把模块 CH1 的 2 脚和 3 脚短接SD 直接接 RD参数按正式值设好然后跑发送程序看接收区能不能原样收到自己发出去的内容。这个动作能一次性排除掉一半变量参数配错、点数算错、字节序反了、接收区没清、OUTPUT 和 INPUT 的地址写错全都会在自测里暴露。而且因为不涉及对方设备排查时不需要跟人协调改一版测一版节奏完全自己掌握。自测通过后再接对方模块做对连测试。对连时先只发固定内容双方都不做解析只用串口助手或者缓冲存储器监视看原始字节对不对。字节对了再开解析逻辑解析对了再加超时重发。这个顺序看着慢实际比一次性全上再逐个排查快得多。自测里还有一个小技巧值得记把发送内容和接收内容都映射到连续的 D 区比如发送用 D100 起、接收用 D200 起然后在 GX Works2 里开一个软元件监视窗口把两段并排看。发ABCDEFGH接收区应该出现相同的字节如果接收区只有前半段多半是接收个数判断得不对如果出现的是上一次的内容就是接收区没清。一个容易被忽略的细节是自测时不要用正式设备的应答逻辑。自测阶段对方就是自己发什么收什么如果程序里带了“收到应答才允许下次发送”的互锁自测会因为帧类型不匹配卡在第一帧。我一般临时用一个自测标志位把互锁旁路掉测完再恢复。从那以后我每次上电前都强制走一遍回环自测哪怕项目再急也不跳过——省下的不是调试时间是现场被人围着问“到底什么时候能好”的那份从容。希望帮到你。本文还有配套的精品资源点击获取