简介:《三菱PLC串行通讯模块QJ71C24N与QJ71C24N-R2的RS232通讯方法》面向工业自动化现场调试、PLC串行通讯学习与设备联调人员,围绕Q系列串行通讯模块之间的RS232互联,讲解模块通道差异、无顺序协议选择、Works2参数配置以及收发程序设计等核心内容。压缩包内为1个docx文档,约197KB,集中呈现模块接口与通讯线缆示意、通道开关设置、接收缓冲区处理和发送数据帧示例,便于按设备型号对照查阅。已有3907人学习下载,适合需要快速理解QJ71C24N与QJ71C24N-R2通讯流程的工程师参考。文档还涵盖波特率、奇偶校验、数据位、停止位等参数设置,并提示CRC校验、超时机制、双方参数一致性和数据包标识识别等排错思路,可帮助读者建立从硬件配置、协议选择到程序联调的完整认识。
1. 两块串行通讯模块对接:先把 RS232 这条链路讲透
手上有一套 Q 系列的老设备要改造,主站侧机架上插的是 QJ71C24N,远程一个操作箱里插的是 QJ71C24N-R2,两边都只剩通道 1 空着,需要靠一根 RS232 串起来做数据交换。这类需求在产线改造里非常常见:不是上以太网,就是两根线走串口,成本低、改动小,但参数一旦对不上,通讯就会断续、丢包,甚至一直收不到数据。这篇内容对应的就是这套串行通讯模块的 RS232 对接方法,核心是无顺序协议下的参数配置与收发程序。适合已经摸过 GX Works2、但被智能功能模块的开关设置和各种缓冲区地址绕晕的人,也适合刚接手 Q 系列项目、需要快速把串口打通的新手。读完至少能自己把模块加进工程、把通道参数配对、把收发程序写出来跑通,并知道哪几个地方最容易出错。
2. 硬件与协议选型:QJ71C24N 和 QJ71C24N-R2 差在哪
在动手写任何一行程序之前,得先把两个模块的通道结构和协议模式确认清楚,否则后面参数设得再细,也可能因为物理通道搞错而一直不通。这一步在实操里经常被跳过,结果就是在软件里来回改波特率,改半天发现接的是另一个通道。
2.1 通道结构决定接线方式
QJ71C24N 是两个通道,但通道类型不同:通道 1 是 RS-232,通道 2 是 RS-422/485。QJ71C24N-R2 的两个通道都是 RS-232。也就是说,如果两边都用通道 1,那就都是 RS-232,用一根标准的 RS232 交叉线(2 号针脚对 3 号针脚、3 对 2、5 对 5 的 GND)就能接起来;如果想把 QJ71C24N 的通道 2 也利用上,就得额外考虑 RS-422/485 的差分接线和终端电阻,那是另一套做法。
实际接线前建议先明确三件事:哪一侧做发送主体、哪一侧做接收主体、通讯距离是否在 RS232 的可靠范围内。RS232 在 15 米内比较稳,超过这个距离还要走 RS232,就要考虑降低波特率或加隔离中继,否则线缆上的干扰会直接体现为校验错帧。这套接线方式在模块手册里对应的是标准交叉连接,只需要三根线:TXD 对 RXD、RXD 对 TXD、GND 对 GND,其余的握手信号在无顺序协议的应用里一般不用。
| 模块型号 | 通道 1 | 通道 2 | 本次用法 |
|---|---|---|---|
| QJ71C24N | RS-232 | RS-422/485 | 通道 1 走 RS232 |
| QJ71C24N-R2 | RS-232 | RS-232 | 通道 1 走 RS232 |
有一点需要注意:RS232 是点对点通讯,不能挂多个从站。如果现场想把多个设备串在同一条总线上,那就要走 RS-422/485 的多点连接,不能用 RS232 通道接多个节点。
2.2 为什么选无顺序协议
这两个模块支持 MC 协议、无顺序协议和双向协议。MC 协议适合与上位机、触摸屏这类按固定报文格式访问软元件的场景;无顺序协议则是不带协议框架的收发,发什么由程序决定,什么时候发由程序触发,接收端只负责把数据收进缓冲区再交给梯形图处理。所以在两块 PLC 之间做自定义数据交换时,无顺序协议是首选,因为数据格式完全由约定决定,简单直接。
另外两个协议方案也要有清醒认识。MC 协议虽然规整,但报文头和对端软元件地址的格式是固定的,用来做两块 PLC 之间的自己定义数据交换反而别扭;双向协议则是模块内部固化的收发过程,灵活性最低。无顺序协议最“裸”,但也正因为最裸,参数一旦配对成功,收发都是确定的,排查起来有迹可循。
协议选定以后还要注意通道的工作模式:无顺序协议分为发送和接收两个方向,每个通道可以单独设定接收方式和发送方式。常见做法是把接收方式设为“无顺序协议”,把接收数据长度和接收结束条件按对端发送的数据量预先定好,避免收不全或者把下一帧吞进上一帧里。
3. GX Works2 里的参数落地:两个模块的通道设置
参数设置是这套方案里最容易翻车的地方。两个模块参数必须完全一致,但它们在工程里是两个独立的模块节点,设置界面分两处,谁漏了哪一项,结果都是通讯不上。
3.1 QJ71C24N 的模块添加与开关设置
在 GX Works2 里,右键点击工程树里的“智能功能模块”,选“添加新模块”,模块类型选“串行通信”,模块型号选 QJ71C24N,确定后在工程树里展开这个模块,双击“开关设置”,通道选通道 1。这一步的关键是模块型号不能选错:型号选错时,后面的开关设置项会跟着变,光标位置和可选项都不一样,写出来的参数表面正常但实际不生效。
开关设置界面里实际要关注的字段包括:工作模式(选无顺序协议)、传送速度(也就是波特率)、传送数据的位构成(数据位 7/8、奇偶校验有无与奇偶、停止位 1/2)、以及校验方式和超时时间。这些字段两边必须严格一致,尤其数据位和奇偶校验,只要差一位,收到的就是一堆乱码或者干脆收不到。
模块型号:QJ71C24N 通道:1 工作模式:无顺序协议 传送速度:9600 bps 数据位:8 奇偶校验:无 停止位:1上面是一组常见配置,实际项目中常用 9600 和 19200,短距离、数据量小时用 9600 更省心。奇偶校验选“无”很普遍,因为在无顺序协议下,数据完整性靠应用层自己判断,靠串口奇偶位兜底意义有限;但如果现场干扰大,加上偶校验能提前发现一部分坏帧,代价是多一位、带宽略降。
3.2 QJ71C24N-R2 的参数对齐
另一侧的操作形状相同:同样在智能功能模块里添加新模块,模块类型串行通信,型号改成 QJ71C24N-R2,展开后双击开关设置,通道选通道 1,字段逐项填成和对面一模一样。
这里有个容易被忽略的细节:两个模块虽然型号不同,但通道 1 的 RS232 参数项是对应的,不存在“R2 少设一项”的说法。经常见到的误操作是在一侧设了 19200,另一侧默认还是 9600,或者一侧停止位 1、另一侧 2,然后现场反复插拔线缆找硬件问题。
模块型号:QJ71C24N-R2 通道:1 工作模式:无顺序协议 传送速度:9600 bps 数据位:8 奇偶校验:无 停止位:1参数填完后,建议在“开关设置”里再确认一遍接收相关的设定:接收数据长度、有无帧尾、以及接收超时。这些项两边的角色不同,接收侧要设好长度或结束条件,发送侧则只需保证发出去的数据和对方约定的长度、帧格式一致。
提示:参数设置改完后必须重新下载到 CPU 模块并复位,模块参数才会生效。只保存工程不下装,界面上看着是改过的,实际模块里还是旧参数,这类“改了没作用”的现象大多出在这里。
3.3 软元件地址与缓冲存储器
无顺序协议的数据不是凭空进出的,它走的是模块内部的缓冲存储器,通过 FROM/TO 指令或者直接指定软元件访问。发送时把数据写到发送缓冲区,触发发送请求;接收时从接收缓冲区把数据读回 CPU。因此,除了串口参数,还要把缓冲存储器地址和中断/握手用的软元件规划好。
常见做法是:给接收单独划一段数据寄存器作为落地缓冲,比如 D100 起连续若干字;给发送也划一段 D200 起的区域;再用两个位软元件分别表示“收到新数据”和“允许发送”,避免发送和接收互相覆盖。地址规划一旦定下来就不要中途改动,因为梯形图里的 FROM/TO 参数和后续维护的注释都依赖它,改动一处就要连带改几处,是后期维护的主要麻烦来源。
这里也要提醒一句:模块占用的 I/O 地址由插槽位置决定,不是固定的。模块添加进工程后,它的 I/O 编号会随所在的插槽变化,梯形图里的 FROM/TO 指令第一个参数必须用实际编号,照抄别人程序里的地址是行不通的,这是很多移植程序“在原机器上好好的,换台机器就不通讯”的根源。
4. 收发程序怎么写:接收侧与发送侧的梯形图逻辑
程序这一块,接收和发送的思路完全不同:接收是被动的,重点是判断数据到没到、到齐没到齐;发送是主动的,重点是时机和长度。两侧写反了不会报错,只会表现为“发得出去、收不回来”。
4.1 QJ71C24N-R2 的接收程序
接收程序的基本框架是:用 FROM 指令把接收缓冲区的数据读到 CPU 的数据寄存器,用模块提供的接收完成标志或接收数据个数来判断是否读到有效数据,读到后再把数据交给后续逻辑处理,最后清标志、准备下一次接收。
; 1. 读取接收数据字节数 FROM K0 H0 D10 K1 ; 2. 判断是否收到数据 CMP D10 K0 M100 ; 3. 收到数据则读取接收缓冲区内容 FROM K0 H400 D100 K10 ; 4. 置位“新数据到达”标志 LD M101 SET M200 ; 5. 处理完成后复位标志,准备下一次接收 LD M210 RST M200逻辑上可以拆成两段说明。第一段是用 FROM 读状态,把模块的状态字读到 D10,用来知道当前接收了多少字节或者接收是否完成;第二段是在判定有数据之后把缓冲区内容整段搬进 D100 起的区域,再置位一个标志位通知主程序去处理。
参数方面,FROM 指令的四个操作数分别是模块起始 I/O 编号、缓冲存储器地址、目标软元件、读取字数。起始 I/O 编号由插槽决定,缓冲存储器地址由模块手册给出(接收区和状态区是不同的地址),读取字数要按协议里约定的最大帧长来定,宁可比实际帧长一点,不要少读,少读会把长帧截断,后面解析全是错位。
4.2 QJ71C24N 的发送程序
发送侧的逻辑是:先把要发的内容按约定格式填进发送缓冲区,再触发发送请求,然后等发送完成。如果协议里带帧头帧尾或者长度字节,就要在填数据时一并算好。
; 1. 组织发送数据 MOV K1 D200 MOV K1234 D201 MOV K5678 D202 ; 2. 写入发送缓冲区 TO K0 H200 D200 K4 ; 3. 触发发送请求 SET M300 ; 4. 等待发送完成标志 LD M301 RST M300这段梯形图的思路是先做数据打包,再整段写到发送缓冲区,最后置位发送请求位。TO 指令和 FROM 是一对:起始 I/O 编号、缓冲存储器地址、源软元件、写入字数。发送请求位和发送完成标志的具体软元件由模块的开关设置和手册约定,写之前要确认清楚,否则会出现“置位了但没发出去”或者“一直在发”的情况。
接收和发送两侧的数据格式必须严格约定,包括字节序、长度字段占几个字节、有没有帧头。很多现场问题出在这一层:程序逻辑没错,参数也没错,但一边按低字节在前组帧、另一边按高字节在前解析,数据看着收到了,数值却永远是错的。
注意:发送频率不能超过对端的接收处理能力。连续快速置位发送请求会导致模块内部发送队列溢出或对端接收缓冲被覆盖,表现为偶发丢帧,很难复现,也最难查。
5. 避坑与排查:五条现场踩过的坑
这套配置和程序本身不复杂,但现场真正卡人的从来不是“会不会配”,而是“配完了不通,不知道看哪儿”。下面几条是这类串口对接里反复出现的问题,按现象、原因、解决三步走。
现象一:两块模块参数都设好了,接收侧一直收不到数据。原因多半是接线方向搞反,或者用了直连线。RS232 的点对点连接必须交叉,TXD 一定要接到对端的 RXD 上,很多人拿现成的直通线插上,两端都在发,谁也收不到。解决是先用万用表确认所接线缆是交叉线,再对着模块端子标记逐针核对接线,别依赖线缆颜色。
现象二:能收到数据,但内容是乱码,字节对不上。原因是串口参数不一致,最常见的是数据位和奇偶校验不匹配,其次是波特率有偏差。解决是把两侧的开关设置截图放到一起逐项对照,数据位、校验、停止位、波特率四项全部一致后再下装复位。如果参数确认一致仍然乱码,就要怀疑对端本身发的是不是这个帧格式。
现象三:偶尔丢一帧,重启后又正常。原因是接收缓冲被新数据覆盖,或者接收完成标志没有及时复位。接收侧的处理逻辑如果比数据到达慢,下一帧就会冲掉上一帧。解决是把接收处理做短,收到后先整段搬走再处理,同时把超时和接收长度条件设好,让模块明确知道一帧到哪里结束。
现象四:改完参数没反应,界面和实际不一致。原因是参数只保存未下装,或下装后没有复位模块。解决是把“改参数→下载→复位→验证”做成固定动作,每次改完都走一遍,并且不要在没验证的情况下连续改多项,否则出了问题说不清是哪一项引起的。
现象五:程序从别的项目拷过来,地址全对但就是不通讯。原因是模块插槽不同,I/O 起始编号变了,FROM/TO 指令里的第一个参数还是旧值。解决是到工程里确认当前模块的实际 I/O 编号,把所有 FROM/TO 的首参数统一改掉,改完再做一次全程序搜索,避免漏改藏在子程序里的那几处。
6. 联调收尾:用最短路径验证链路真的通了
参数下装、程序写完,先别急着上整机联调,用最短路径把链路单独验一遍最省时间。我一般的做法是:让发送侧只发固定长度的测试数据,比如连续发 4 个字、内容每次自增,接收侧把收到的原始数据直接搬到一片不参与业务逻辑的寄存器里,用软件监控看数值是否随发送侧同步变化。这样做的价值在于把“通讯是否通”和“数据处理是否正确”两件事分开,先证明链路,再证明逻辑,出问题时不用两头猜。
验证顺序建议按这四步走:第一步,两侧模块单独在线,确认模块状态正常、无硬件报错;第二步,只发不收,用接收侧的状态字确认收到字节数在变化;第三步,收发都开,比对接收缓冲区里的原始数值和发送侧写入的数值是否一致;第四步,把数据格式(字节序、长度字段)按约定对上,再看业务数据解析是否正确。每步只引入一个变量,哪一步断了,问题就锁定在那一步。
联调里还有一个实用技巧:在发送侧把发送计数器累加进测试帧里,接收侧把收到的计数器原样回显或记录到另一片寄存器。这样一旦出现丢帧,能立刻从计数器的跳变看出丢在第几帧、丢了几帧,比盯着数据变化猜要快得多。这个习惯是从一次连续跑了两天都没定位到偶发丢帧的经历里留下来的——当时参数、接线、程序全查过,最后靠计数器才确认是发送频率超过了对端处理速度。
另外,参数和地址这类东西最好在工程里留一份文字记录,写清模块型号、插槽、通道、各字段取值和缓冲存储器分配。Q 系列项目维护周期长,隔一年再回来看,光凭梯形图里几行 FROM/TO 是还原不出当时约定的。字符长度、字节序这种细节,写在记录里比写在脑子里靠谱。
从那以后我每次做串口对接,都强制走一遍“参数对照表 → 交叉线核验 → 单发单收 → 计数器验证”这套流程,不管项目多小都不跳步,因为跳过的每一步最后都会以返工的形式还回来。希望帮到你。
本文还有配套的精品资源,点击获取