简介:面向工业自动化与PLC调试场景,这份资源系统讲解三菱Q系列串行通讯模块QJ71C24N与QJ71C24N-R2之间通过RS232实现数据交换的方法。内容从两款模块的通道差异入手,对比单RS-232/RS-422/485与双RS-232配置,重点说明基于无顺序协议的参数设置流程,包括在Works2中添加智能功能模块、开关设置中的波特率、奇偶校验、数据位、停止位等关键项,并给出接收与发送程序的设计思路。文档还补充了CRC校验、超时机制、参数一致性等提升通讯可靠性的注意事项。资源包共含1个docx文件,大小约197KB,文字清晰、图文结合,方便随时查阅。目前已有3899人学习下载,适合初次接触三菱Q系列串口通讯模块的工程师、PLC编程人员以及对工业现场总线配置感兴趣的读者参考使用;通过阅读可快速掌握QJ71C24N与QJ71C24N-R2的RS232直连配置方法,理解无顺序协议的应用边界,并为后续编写稳定通讯程序提供可直接借鉴的框架。
1. 三菱Q系列串行通讯模块:QJ71C24N与QJ71C24N-R2的RS232通讯能解决什么
在产线上碰到两台三菱Q系列PLC要近距离交换数据,最省事的办法不是上以太网,而是用串行通讯模块直接拉一根RS232线。三菱Q系列串行通讯模块里,QJ71C24N和QJ71C24N-R2是经常被拿来配对的两块板子:前者有一个RS-232口加一个RS-422/485口,后者两个口都是RS-232。数据交换走无顺序协议,参数在GX Works2里设好,程序端就是一个发送一个接收。
这篇文章把硬件接线、参数设置、收发程序按实际调试顺序拆开,把我踩过的坑一并列出。它适合现场做设备间通讯的电气工程师,也适合刚接手Q系列通讯项目、想照着配置的新手。读完你至少能知道无顺序协议怎么选、两块模块的通道怎么配对、开关设置每一项怎么填,以及程序里那两个专用指令为什么不能省。
2. 协议与通道差异:为什么无顺序协议适合两台PLC直连
2.1 三种通讯协议怎么选
QJ71C24N和QJ71C24N-R2在固件层面支持三种通讯模式:MC协议、无顺序协议、双向协议。很多人第一次配置时直接卡在这一步,因为GX Works2的开关设置里那一排下拉框并没有写“推荐”,而是把选择权交给了你。
MC协议是三菱自定义的应用层协议,帧格式固定,带站号、命令、子命令、数据长度、校验码。这类协议适合上位机组态软件、触摸屏或者另一台同样支持MC协议的PLC,双方按固定格式一问一答,好处是省心,坏处是帧结构固定在模块内部,你想塞一段自定义数据进去反而别扭。
双向协议则是为特定智能设备准备的,比如温控器、变频器这类支持双向协议的仪表。它同样有固定帧格式,模块会自动解析地址和数据区。但如果你面对的是两台PLC之间的裸数据搬运,双向协议的灵活性也不够。
无顺序协议恰恰是这一类场景里最实用的选项。它不关心你的数据里是什么内容,模块只负责把串口上收到的字节原样存进缓冲区,或者把PLC发来的数据原样从串口发出去,不做任何组帧和解析。数据是否完整、是否有校验、如何界定一帧,全部由用户程序来定义。
| 协议 | 帧格式 | 适用场景 | 模块端处理 | 本项目是否选用 |
|---|---|---|---|---|
| MC协议 | 固定命令帧,含站号/命令/校验 | 上位机组态、触摸屏、PLC间固定问答 | 自动解析并应答 | 否 |
| 双向协议 | 固定格式,含站号/数据/校验 | 温控器、变频器等智能仪表 | 自动解析数据区 | 否 |
| 无顺序协议 | 无固定格式,原始字节透传 | 两台PLC直连、扫码枪、串口设备 | 只存取,不解析 | 是 |
我一般会这样判断:如果链路两端都是自己写程序,且数据内容不固定,就选无顺序协议。这样模块退化成一条透明管道,通讯逻辑完全掌控在梯形图里,调试时问题也好定位。
2.2 两块模块的通道配置差异
QJ71C24N和QJ71C24N-R2从正面看长得几乎一样,但通道配置有本质区别。QJ71C24N的通道1是RS-232,通道2是RS-422/485;QJ71C24N-R2则两个通道都是RS-232。
| 模块型号 | 通道1 | 通道2 |
|---|---|---|
| QJ71C24N | RS-232 | RS-422/485 |
| QJ71C24N-R2 | RS-232 | RS-232 |
这意味着两块模块配对时,接线逻辑并不对称。要让QJ71C24N和QJ71C24N-R2通过RS232通讯,只能从QJ71C24N的通道1出线,因为它的通道2是RS-422/485电平,和RS-232的电压范围完全不兼容。RS-232是单端±12V信号,RS-422/485是差分信号,直接对接不仅收不到数据,长时间硬接还有可能损伤驱动芯片。
QJ71C24N-R2的第二个RS-232通道是它的优势所在。主链路用通道1接QJ71C24N,通道2还能再接一台带RS-232口的上位机或者触摸屏,互不干扰。如果你手头已经有QJ71C24N,接收侧再配一块QJ71C24N-R2是最划算的组合,两个模块的通道1一对接就是一条干净的RS232点对点链路。
RS232本身是点对点通讯,距离一般控制在15米以内,速率不宜太高,9600到19200波特率在现场最稳。如果现场要求远距离或多点通讯,那就不是这个方案能解决的问题了,得换RS-422/485或者走以太网模块。
2.3 直连线缆接线与引脚核对
两块模块都是9针D型公头,直连时不能用那种一头公一头母的延长线,得做一条交叉线。项目中c图所示的做法,实际就是标准的2-3交叉、5-5直连。
| 功能 | QJ71C24N通道1引脚 | 接至QJ71C24N-R2通道1引脚 | 功能 |
|---|---|---|---|
| SD(发送数据) | 2 | 3 | RD(接收数据) |
| RD(接收数据) | 3 | 2 | SD(发送数据) |
| SG(信号地) | 5 | 5 | SG(信号地) |
三根线就能跑通基本的全双工通讯。发送侧的第2脚接到接收侧的第3脚,发送侧的第3脚接到接收侧的第2脚,两边的第5脚信号地直连。剩下的引脚不用接,前提是开关设置里把硬件流控关掉。如果某些现场设备默认开了DTR/DSR或RTS/CTS握手,那么对应引脚要么短接,要么在参数里明确设为无效,否则模块会一直等待握手信号而不发数据。
线缆我一般选带屏蔽层的双绞线,屏蔽层只在发送侧单端接地,避免形成环形地线。RS232本来就是低电压信号,和动力电缆同槽走线很容易被干扰,现场布线尽可能分开。线缆长度控制在15米以内,超过这个距离宁可改RS-422,也别硬扛。
接线完成的判断标准很简单:万用表量两端2-3、3-2之间通断正常,5脚之间电阻为零。量完再接设备,通讯异常时第一反应不用怀疑线序,省很多事。
3. GX Works2开关设置:通道1参数逐项配置
3.1 添加模块:槽号与智能功能模块的分配
打开GX Works2,进入工程后先在左侧导航树里找到“智能功能模块”。右键点击智能功能模块,选择“添加新模块”,弹出对话框里“模块类型”选择“串行通信”,“模块型号”选择QJ71C24N,然后点确定。这里有一个容易被忽略的地方:模块型号选错会导致后面的开关设置界面完全不同,QJ71C24N-R2必须单独选,不能拿QJ71C24N代替。
添加成功后,展开“智能功能模块”节点,下面会出现QJ71C24N。双击“开关设置”,进入通道配置界面。在动手改参数之前,先确认模块所在的槽号与实际硬件安装位置一致。槽号错了,GX Works2虽然能保存参数,但下装到PLC时模块地址和参数对不上,通讯自然起不来。I/O分配也要避开CPU自带的输入输出和已占用的智能模块地址,重复分配时软件会提示冲突。
这一步骤的本质是让软件认识硬件,把模块的通道、中断、缓冲存储器映射到CPU的地址空间里。后面的收发指令里用的通道号、X/Y信号编号,都依赖这一步正确分配,所以不要跳过。
3.2 开关设置逐项解读:协议、波特率、校验
双击“开关设置”后,界面左侧选择“通道1”,右侧就是一串配置项。无顺序协议场景下,我通常按下面这张表逐项填写:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| 通讯协议 | 无顺序协议 | 透明传输,不做帧解析 |
| 波特率 | 9600 或 19200 | 两站必须一致 |
| 数据位 | 8 | 常见ASCII/二进制数据都用8位 |
| 奇偶校验 | 无 | 也可选偶校验,两站必须一致 |
| 停止位 | 1 | 标准配置 |
| 和校验 | 无 | 无顺序协议下模块不做校验 |
| DTR/DSR控制 | 无效 | 关闭硬件流控,三线通讯 |
| DC代码接收 | 无效 | 避免XON/XOFF被模块拦截 |
通道1是QJ71C24N的RS-232口,所以在“通道”下拉里确认选中的是通道1而不是通道2。通道2在无顺序协议里虽然也能配置,但RS-422/485电平与RS-232不兼容,本例根本不会用。设置完后点击“结束”或“设置结束”保存,再继续配置下一个模块。
波特率的选择不是越高越好。9600和19200在现场表现最稳定,38400以上对线缆质量和接地要求明显提高。两站之间距离超过10米时,我一般直接定9600,宁可传输慢一点,也要保证不丢字节。
无顺序协议下,模块是纯管道,不会自动加校验码,也不关心数据里是不是有错误的字节。通讯的完整性完全靠用户程序自己检查。这一点必须提前想明白,否则接收侧收到错数据时会误以为是自己程序写错了。
3.3 QJ71C24N-R2的设置与两站一致性核对
QJ71C24N-R2的参数设置路径和QJ71C24N完全一样,唯一的区别是添加模块时“模块型号”选择QJ71C24N-R2,而不是QJ71C24N。展开智能功能模块,双击开关设置,同样选择通道1,逐项填写与发送侧相同的参数。
两个模块的参数一致性是通讯成功的前提,每一个字节位都必须对得上。波特率、数据位、奇偶校验、停止位四项中任何一项不一致,接收侧要么收不到数据,要么收到的字节全部是乱码。
| 参数项 | 发送侧QJ71C24N通道1 | 接收侧QJ71C24N-R2通道1 | 一致性 |
|---|---|---|---|
| 通讯协议 | 无顺序协议 | 无顺序协议 | 一致 |
| 波特率 | 9600 | 9600 | 一致 |
| 数据位 | 8 | 8 | 一致 |
| 奇偶校验 | 无 | 无 | 一致 |
| 停止位 | 1 | 1 | 一致 |
| DTR/DSR控制 | 无效 | 无效 | 一致 |
参数设置完成后,参数并不会立刻生效。需要执行“在线→PLC写入→智能功能模块参数”,把配置下装到PLC和模块中,然后对PLC做一次复位或者断电重启,模块才会按新参数运行。这是最容易漏的一步,很多人在软件里设完参数,直接上电调试,发现通讯不通,其实不是参数错,而是参数根本没进模块。
4. 无顺序协议收发程序:OUTPUT发送与INPUT接收
4.1 发送侧程序:发送启动、数据区、发送完成处理
发送侧以QJ71C24N的通道1为出口。程序思路是:收到启动信号后,把D区里组织好的数据通过OUTPUT指令一次性交给模块,模块按无顺序协议逐字节从RS-232口发出。发送完成标志复位之前,不允许发起下一次发送。
// 发送侧梯形图指令表(QJ71C24N 通道1) LD X0 // 发送启动信号,按钮或上位机置位 OR M101 // 自保持,确保发送过程中信号不丢失 ANI X0F // 通道1发送完成标志,发送过程中断开 OUT M101 // 发送请求保持 LD M101 OUTPUT CH1 D10 D200 K10 // 通道1发送:控制数据首址D10,数据首址D200,发送10个字 LD M101 AND X0F // 通道1发送完成 OUT M102 // 发送完成通知,复位启动信号或通知上位机OUTPUT是串行通讯模块的专用发送指令,指令里四个关键参数依次是通道号、控制数据起始软元件、发送数据起始软元件、发送点数。通道号必须与开关设置里配置的通道一致,这里固定是CH1。控制数据D10用来存放发送相关的扩展参数,比如结束方式、错误状态,具体偏移地址按模块手册对照表确认。发送数据D200起连续10个字的内容就是实际发送的帧内容。
X0F是通道1的发送完成信号,只有当模块把最后一位数据真正写进RS-232发送寄存器后才会置位。程序里把X0F串在发送请求自保持回路中,意味着上一帧没发完,M101就被断开,新的OUTPUT不会执行。这个互锁习惯很重要,能防止连续发送时后一帧覆盖前一帧的缓冲。
发送点数K10不是随意定的,要和接收侧约定的帧长度严格一致。无顺序协议下接收侧通常按固定长度接收,发送10个字,接收侧就必须按10个字的长度去读,否则数据会错位。
4.2 接收侧程序:接收完成标志、缓冲转存
接收侧用QJ71C24N-R2的通道1。模块收到完整数据后,会把数据存进自身接收缓冲区,同时把接收完成信号X0E置位。用户程序的职责是及时用INPUT指令把这批数据读进PLC的D区,读完之后清掉接收完成信号,准备接收下一帧。
// 接收侧梯形图指令表(QJ71C24N-R2 通道1) LD X0E // 通道1接收完成标志,模块置位 OUT M200 // 读取触发信号 LD M200 INPUT CH1 D10 D100 K10 // 通道1接收:控制数据首址D10,数据存入D100起10个字 LD M200 ANI X0E // 等待模块复位接收完成信号 OUT M201 // 整帧读取完成,通知主程序处理 LD M201 RST M200 // 清除读取触发信号,准备下一帧INPUT是串行通讯模块的专用接收指令,参数含义与OUTPUT对称:通道号、控制数据起始软元件、接收数据存放起始软元件、读取点数。D100到D109就是模块缓冲区内数据的落地点,读取完成后这10个字可以交给后续的逻辑去解析、搬运或存入数据块。
X0E置位后,程序必须尽快执行INPUT。模块接收缓冲区的大小有限,如果这一帧还没读走,下一帧数据到了就会把旧数据覆盖掉,造成丢帧。梯形图里用M200把X0E的置位状态锁存住,再通过M200触发INPUT,读取完成后用ANI X0E判断模块已经复位信号,最后用M201通知主程序。整个流程保证了一帧一读、读后即清的基本逻辑。
如果接收侧程序里没有及时读取,而且缓冲区被覆盖,那么表现就是通讯中断,但模块本身没有任何报警。这是无顺序协议最容易翻车的地方,后面避坑章节会重点讲。
4.3 数据帧设计:固定帧头、长度与软元件分配
无顺序协议不提供任何帧边界识别,两台PLC之间必须自己约定帧格式。最简单的做法是固定长度帧:发送侧每次发固定数量的字,接收侧按同样的字数读取。固定长度帧的好处是程序简单、逻辑清晰,坏处是数据内容变化时也要按最大长度发送,浪费一点带宽。
为了能识别一帧数据的起始和有效性,我习惯在有效数据前后加帧头和校验字:
| 字序号 | 内容 | 说明 |
|---|---|---|
| 第1字 | 0xAA55 | 帧头,固定值,用于起始识别 |
| 第2字 | 0x0008 | 数据长度,表示有效数据为8个字 |
| 第3~10字 | 有效数据 | 实际要交换的内容 |
| 第11字 | 累加和 | 第1字到第10字的累加取低16位 |
发送侧在组帧时,先把帧头、长度、有效数据和校验字写入D200到D210,再执行OUTPUT发送11个字。接收侧读取这11个字后,先判断第一个字是不是0xAA55,再计算第1到第10字的累加和与第11字比对。校验通过才认为这一帧数据有效,不通过则丢弃并计数。
D寄存器分配固定下来后,发给梯形图里做符号注释,避免地址漂移。发送侧的D200到D210、接收侧的D100到D110,两者内容格式完全一致,只是存放位置不同。这样设计的好处是,后期要增加数据类型,只需要改长度字段和有效数据区间的个数,帧头校验逻辑不用动。
5. 通讯避坑记录:乱码、卡死、旧数据与电平错配
5.1 现象:数据乱码
现象:链路能通,但接收侧收到的数据偶尔全是乱码,十六进制监视里看到的是错位的字节,和发送内容对不上。
原因:最常见的是两侧波特率、数据位、校验不一致。比如发送侧设了偶校验,接收侧没设校验,每个字节的高位就多了一位,所有数据整体向右错一位。其次才是线缆过长或屏蔽层接地不良导致的电平抖动。
解决:先把开关设置里四项参数逐项截图对比,波特率、数据位、奇偶校验、停止位必须完全一致。然后降波特率到9600做验证,排除高速传输下的信号质量问题。如果9600下稳了,说明是线缆或干扰,不要急着提速率,先处理接地和布线。
5.2 现象:接收程序停住,等不到完成标志
现象:接收侧X0E一直不置位,程序停在等待状态,严重时CPU扫描周期被拉长,甚至触发看门狗超时。
原因:发送侧根本没有把数据发出来,发送条件没满足。另一个常见原因是开关设置里把DTR/DSR控制设成了有效,但接线没接握手脚,模块一直在等DTR信号,数据根本出不去。
解决:先用万用表量发送侧2脚对地有没有电平变化,确认模块确实在发。再看开关设置里DTR/DSR控制是不是“无效”,如果不是,要么改设置,要么把收发两侧的4、6脚短接。我一般直接把硬件流控全部关掉,裸三线跑通最省心。
5.3 现象:偶发通讯失败,同一条产线时好时坏
现象:传输批量数据时偶尔缺几个字,重连后又恢复,故障没有固定规律,时好时坏,排查起来很玄学。
原因:两台设备的信号地没有真正共地。RS232的信号参考点是GND,如果两台设备的5脚没有接通,或者机壳地之间存在电位差,接收侧判电平就会出问题。另一种情况是RS232线缆和动力电缆同槽走线,干扰偶发。
解决:确认两台设备5脚GND已可靠连接,屏蔽层只在发送侧单端接地。RS232线缆单独走线,和变频器、电机电缆保持至少20厘米距离。如果现场布线改不了,就换屏蔽双绞线,或者降波特率提高抗干扰余量。
5.4 现象:读到的还是上一次的旧数据
现象:第二次发送后,接收侧D区里的数据还是第一帧的旧内容,程序好像没收到新帧。
原因:接收侧读取不及时,或者读取完成后没有复位接收完成信号。模块缓冲区被新帧覆盖前,INPUT读到的是旧缓冲区内容,X0E一直保持,程序误以为数据没变。
解决:X0E置位后立即执行INPUT读取,读取完成后清掉触发标志,做到一帧一读。接收程序里加一个帧序号或者帧头判断,每次读到数据先验证帧头,再判断是否是新帧。这样即使缓冲区状态异常,旧数据也不会被当成有效数据用。
5.5 现象:改用R2的CH2后完全不通
现象:QJ71C24N通道1接QJ71C24N-R2通道1跑通了,把线缆换到R2的通道2后,立刻完全没有数据。
原因:R2的两个通道虽然都是RS232,但它们的I/O首地址、X/Y信号编号、开关设置项完全独立。程序里的OUTPUT/INPUT指令仍然写的是CH1,模块的通道2自然没有反应。两个通道物理上一样,逻辑上是两块独立设备。
解决:换通道时,开关设置里选“通道2”重新配置参数,程序里OUTPUT/INPUT的通道号改成2,接收完成信号X/Y地址也要按通道2的分配重新填写。不要以为“两个口都是RS232”就只换线不换程序,这个坑我踩过,换完通道还要做一次完整的参数核对和下装。
6. 回环测试与在线监视:十分钟验证RS232链路可靠性
6.1 回环测试:先确认板卡再连设备
如果通讯不上,第一步不是查程序,而是做回环测试。找一只9针公头,把2脚和3脚短接,5脚自连,插到QJ71C24N的通道1上。然后用发送侧程序触发一次OUTPUT,如果程序能收到自己发出来的数据,说明模块的发送链路、接收链路、缓冲区都是好的。回环通则问题在外部线缆,回环不通则问题在模块或配置。
6.2 在线监视与串口助手交叉验证
GX Works2切换到在线监视模式,把X0E、X0F、M200、M201、D100这些关键软元件全部丢进监视窗口。触发一次发送后,看X0E是否置位、D100区域是否出现新数据。如果X0E不置位,怀疑重点放在硬件;如果X0E置位但数据不对,怀疑重点放在参数一致性和帧校验。
更直接的办法是用一只USB转RS232线,一头插电脑,另一头接到QJ71C24N-R2的通道1,先用串口调试助手手动发送一帧固定内容,观察PLC有没有收到。这一招能绕过PLC发送侧的程序逻辑,单独验证接收侧程序是否正确。等接收侧确认没问题,再切回两台PLC直连,问题定位就缩小到发送侧了。
从那以后我每次搭这样的串口链路,都强制自己先做一遍回环测试再上真机,宁可多花十分钟,也不愿意到现场以后发现两块模块之间的问题,还是先怀疑模块后怀疑线这么绕一大圈。这个习惯帮我省掉了不少来回试错的功夫,希望帮到你。
本文还有配套的精品资源,点击获取