简介:面向PLC控制与上位机通信开发人员的实战文档,围绕FX3U-128MT与主站PC间的无协议RS485通信展开,适用于需要远程采集PLC报警信息、且传输距离超过RS232限值的自动化项目。文档完整记录了硬件选型与接线过程,包括MOXA四通道PCI-RS485多串口卡和FX3U-485-BD模块的引脚定义、通信电缆焊接方式,以及PLC端RS指令和D8120寄存器的配置方法。包体仅含1个doc文件,约124KB,为纯文档资源。已有147人学习,适合电气工程师、PLC程序员及自动化专业学生参考。文中还复现了实验中遇到的PC与PLC无法互收问题,并给出了线序调换与D8120设置为C81H的排错思路,可帮助读者规避同类通信故障,缩短现场调试时间。
1. 挑残机项目里的RS485选型:15米限制之外的可行解
挑残机的主站PC需要记录PLC(FX3U-128MT)的报警信息,设备布局决定了通信线缆要跨越较长距离。RS232最远15米的规格在这个场景下直接出局,RS485凭借1200米的理论传输距离和差分信号抗干扰能力成为现实选择。但PLC本体不带485口,必须外挂FX3U-485-BD扩展板,这就引出两个实际问题:一是MOXA多串口卡与BD板的引脚定义如何对应,二是PLC无协议通信的格式寄存器怎么设才能让数据真正走起来。这篇文章沿着项目调试的真实路径,把硬件接线、RS指令参数、D8120设置和两轮排错过程完整拆开,适合正在做三菱PLC与PC串口通信的工程师参考,尤其是第一次接触FX3U-485-BD的人。文中所有结论都来自实际跑通的实验,不是手册抄录。
2. 硬件接线:MOXA多串口卡与FX3U-485-BD的引脚对照和线序陷阱
2.1 两端引脚定义:A/B标签的歧义根源
主站PC端用的是MOXA 4通道PCI-RS485多串口卡,DB9公头引出5个有效引脚;PLC端是FX3U-485-BD扩展板,5位端子排。两者的引脚定义如下:
| 引脚 | MOXA多串口卡定义 | FX3U-485-BD定义 |
|---|---|---|
| 1 | TXD-(A) | RDA |
| 2 | TXD+(B) | RDB |
| 3 | RXD+(B) | SDB |
| 4 | RXD-(A) | SDA |
| 5 | GND | SG |
MOXA卡的数据手册用TXD+/TXD-、RXD+/RXD-四个信号标识,同时括号里标注了A/B。FX3U-485-BD这边则是RDA/RDB对应接收,SDA/SDB对应发送。RS485两线制半双工通信中,标准做法是A接Data-、B接Data+,但MOXA括号里的A/B标注与常规习惯并不一致,这正是第一次接线失败的原因。
2.2 通信电缆焊接:第一版线序为什么全灭
按直觉把同名信号对接——MOXA的TXD-(A)接PLC的RDA,TXD+(B)接RDB,RXD+(B)接SDB,RXD-(A)接SDA,GND接SG,线色定义如下:
| 主站PC端 | 引脚 | 颜色 | PLC端 |
|---|---|---|---|
| TXD-(A) | 1 | 黄 | RDA |
| TXD+(B) | 2 | 红 | RDB |
| RXD+(B) | 3 | 橙 | SDB |
| RXD-(A) | 4 | 黑 | SDA |
| GND | 5 | 紫 | SG |
焊接完成后烧录测试程序,结果PC发数据PLC收不到,PLC发数据PC也收不到,双向全灭。这时第一反应是检查拨码开关、串口调试助手的参数设置,但波特率、数据位这些都对得上。问题出在A/B标签的语义错位。
RS485标准定义A为负信号、B为正信号,可MOXA手册的括号标注把A和B的极性写反了。实际工程中经常遇到厂商把A标成Data+的坑,不能盲信括号里的字符,必须用示波器或万用表确认电平极性。
2.3 调换线序:解决了一半问题
把PLC端的RDA与RDB互换、SDA与SDB互换,同时发送和接收交叉对接:
| 主站PC端 | 引脚 | 颜色 | PLC端 |
|---|---|---|---|
| TXD-(A) | 1 | 黄 | RDB |
| TXD+(B) | 2 | 红 | RDA |
| RXD+(B) | 3 | 橙 | SDA |
| RXD-(A) | 4 | 黑 | SDB |
| GND | 5 | 紫 | SG |
重新通电测试,PLC发送、PC能正常接收,但PC发送、PLC依然收不到。这个现象很典型:发送方向通了,接收方向不通,说明物理层已经基本正确,问题转移到PLC端的收发切换或通信格式配置上。
2.4 接地和屏蔽的实务处理
RS485虽然是差分传输,但不代表可以忽略参考地。MOXA的GND和FX3U-485-BD的SG必须互联,否则共模电压超出收发器承受范围时,轻则通信误码,重则烧毁接口芯片。项目现场电缆长度超过15米,我习惯采用屏蔽双绞线,屏蔽层单端接地——两端接地会产生地环路电流,反而引入噪声。
如果通信距离超过100米,还应该在总线末端并联120欧终端电阻。挑残机项目线长约30米,MOXA卡内部自带跳线可以启用终端电阻,但PLC端BD板没有,所以只在PC端启用即可。
3. RS指令与D8120寄存器:无协议通信的参数配置
3.1 RS指令的格式与操作数含义
三菱FX系列无协议通信的核心是RS指令,功能是将数据通过基本单元上的串行通信口发送出去,同时接收外来数据。指令格式如下:
RS D0 K10 D100 K20D0:发送数据寄存器的起始地址,从D0开始的10个字节会被发送K10:发送数据长度(字节数),范围0~4096D100:接收数据寄存器的起始地址,收到的数据会存到这里K20:接收数据最大长度(字节数),实际接收长度由系统写入D8122
RS指令是主动型的,每次都要手动触发。程序里通常这样组织:
// 伪代码逻辑,对应梯形图的动作顺序 LD M8002 // 初始化脉冲 MOV H00C81 D8120 // 设置通信格式 MOV K0 D8121 // 无协议通信时保持默认 RS D0 K10 D100 K20 // 启用接收功能发送时把要发的数据先移入D0开始的寄存器区,然后置位M8122(发送请求),PLC会自动把数据从串口发出去。接收时不需要额外指令,数据到达后自动存入D100,同时M8123(接收完成标志)置位,程序读走数据后必须复位M8123,否则后续数据无法再接收。
3.2 D8120的位定义:每一位都不能拍脑袋
D8120是通信格式寄存器,16位二进制每一位控制一种通信参数。项目最终设定为0C81H,对应的二进制是0000 1100 1000 0001,拆开来看:
| 位 | 值 | 含义 |
|---|---|---|
| b0 | 1 | 数据位8位 |
| b1 | 0 | 无奇偶校验 |
| b2 | 0 | 1位停止位 |
| b3 | 0 | 无停止位延长 |
| b4~b7 | 0000 | 波特率9600bps |
| b8~b9 | 00 | 无帧头帧尾 |
| b10 | 1 | 使用FX3U-485-BD时必须为1 |
| b11 | 1 | 使用FX3U-485-BD时必须为1 |
| b12~b15 | 0000 | 协议模式默认 |
这里最容易跳坑的是b10和b11。查阅《三菱FX3U用户手册》,当基本单元连接FX3U-485-BD或FX3U-232-BD时,D8120的b10、b11必须同时设为1,否则通信口不会按BD板的方式工作。最初设0081H时b10、b11都是0,对应的是基本单元内置RS422口的工作模式,BD板物理上接了线,但PLC内部根本没把通信口切换到BD板上。
3.3 特殊辅助继电器的配合
RS指令的运行依赖一组特殊辅助继电器,常用几个如下:
| 软元件 | 功能 | 使用要点 |
|---|---|---|
| M8122 | 发送请求 | 置位后发送RS指令指定的数据,发送完成自动复位 |
| M8123 | 接收完成标志 | 接收完成后置位,程序处理完数据后必须手动复位 |
| M8120 | 通信格式修改标志 | 修改D8120之前先置位,改完复位后才能生效 |
| M8121 | 接收超时等待 | 可选项,配合D8129设置超时时间 |
初始化流程里一定要先置位M8120、写入D8120、再复位M8120,顺序不能反。有些工程师直接在程序开头用MOV指令写D8120,结果通信参数不生效,就是这个原因。
3.4 梯形图实现:完整的发送接收框架
// 梯形图逻辑的STL描述,映射到GX Works2的梯形图 LD M8002 SET M8120 // 进入通信格式设置模式 MOV H0C81 D8120 // 9600,8,1,无校验,RS485,BD板模式 RST M8120 // 退出设置模式 RS D0 K10 D100 K20 // 初始化接收,发送长度10字节 // 发送数据准备 LD X001 MOV U0 D0 // 把要发送的数据写入D0 MOV U1 D1 SET M8122 // 启动发送 // 接收数据处理 LD M8123 // 接收完成 MOV D100 D200 // 把收到的数据转存到业务寄存器区 RST M8123 // 必须复位,否则下一条数据进不来这段代码展示了无协议通信的最小完整框架。RS指令在初始化时就被执行,之后持续等待接收。发送数据时,先向发送缓冲区写入内容,再触发发送请求。接收完成标志M8123是边沿敏感的,如果处理程序里忘了复位,第二次接收永远不会完成。
4. 实验排错全过程:从0081H到C81H的一次典型调试
4.1 第一步:硬件连接和初测
按照第二章第二版的交叉线序焊接好电缆,把FX3U-485-BD插到FX3U-128MT基本单元的通信扩展槽上,MOXA卡安装到PC的PCI插槽并装好驱动。设备管理器里确认MOXA卡的串口号,比如COM3。PLC端程序先写最简版本:
LD M8002 MOV H0081 D8120 // 最初错误配置,后续发现BD板要求b10,b11=1 RS D0 K10 D100 K20PC端打开串口调试助手,选择COM3,波特率9600,8位数据位,1位停止位,无校验,无流控。点击打开串口,发送区填“1234567890”(ASCII),点击发送。观察PLC端监视D100的值,如果能在软元件监视窗口看到D100~D109有数据变化,说明接收正常。但实际结果是什么都没有。
4.2 第二步:分析总线状态和线序
用示波器探头夹在MOXA卡TXD+/TXD-两端,PC发送时能看到差分信号脉冲,说明PC侧发送电路在工作。再测PLC端RDB/RDA之间的电压,完全没有响应。这种情况下先怀疑线序。调用MOXA卡自带的诊断工具,查看串口状态寄存器,确认MOXA卡实际发出的电平极性。
同时用万用表二极管档测量MXOA卡引脚和PLC BD板引脚之间的导通性,逐一核对。这里发现了一个容易被忽略的点:DB9头的引脚编号和端子排的引脚编号都是从1开始,但MOXA卡的TXD-实际对应DB9的第1脚,TXD+对应第2脚,而FX3U-485-BD的端子排第1脚是RDA,第2脚是RDB。如果依赖括号里的A/B标签做同类对接,就会像第一次焊接那样把RDA接到TXD-(A)上,等于把Data-接到Data-、Data+接到Data+,这本身没错,但MOXA的括号标注里A和B的极性与RS485标准相反,导致实际是把负信号接到了正信号上。
调换线序后,PLC发送、PC接收成功,验证了发送方向的物理连接正确。但反向不通,说明还有逻辑层问题。
4.3 第三步:深挖D8120的BD板设置
打开GX Works2的软元件监视,强制D8120当前值,发现是0081H。对照三菱官方手册FX3U-485-BD的使用章节中有一项重要说明:在D8120的b11、b10必须设定为(1,1),即选择FX3U-485-BD或FX3U-232-BD专用模式。当时手上《三菱编程手册》里写得很清楚,但初版实验时只看了D8120常用设置表,没看BD板的附加条件,漏掉了这两位。
把D8120改成0C81H,热修改PLC程序(在线写入D8120),再次测试:PC发送“1234567890”,PLC端D100接收到对应ASCII码;PLC程序里把接收到的数据加上偏移再发送回去,PC串口助手也能看到回传数据。
4.4 不同D8120取值下的表现对照
| 设定值 | b10 | b11 | 通信效果 |
|---|---|---|---|
| 0081H | 0 | 0 | 使用基本单元内置RS422口模式,BD板无效,双向不通 |
| 0481H | 0 | 1 | 模式不匹配,发送可能通,接收不稳定 |
| 0C81H | 1 | 1 | 使用FX3U-485-BD模式,双向正常 |
这个表就是这次调试最值的记录。很多现场问题最后都落在这种“多读了一页手册”的差异上。b10、b11组合代表通信口硬件选择,不能按通用格式寄存器理解。
4.5 常见误用:把D8120当普通寄存器直接改
有人为了省事,在PLC运行时通过上位机写D8120,不经过M8120设置流程。这样改完参数不会立即生效,必须先将M8120置位,写入D8120后再复位M8120,或者直接断电重启。正确做法是把D8120的写入放在M8002初始化脉冲之后,这样PLC上电即完成配置。
另一个常见误用是忘记设置接收最大长度。RS指令的第二个长度参数如果设得太小,超过长度的数据会被丢弃,而且不会有任何报错。比如PC一次发20字节,但接收长度只设了10,那么后10字节直接丢掉,而且M8123根本不会置位,程序看起来就像“没收到数据”。调试时先用短数据帧,长度为1~4个字节,容易定位。
5. 无协议通信的验证方法和稳定化技巧
5.1 用串口调试助手做双向回环测试
验证步骤分三级:
- PC自发自收:串口调试助手的发送区发一串数据,如果接收到相同数据,说明MOXA卡的环回模式打开或接线短路,需要关闭环回模式;
- PLC发送、PC接收:PLC程序定时向D0写入计数递增值,触发M8122,PC端每秒应收到一次数据,数据内容按发送缓冲区计算;
- PC发送、PLC接收:PC发一帧已知数据,PLC端D100区域的数值与发送内容一致,并且M8123能正常置位复位。
最容易卡住的是第3步。在PLC程序里把接收到的数据原样回传,PC端同时收到自己的回显,这就证明RS485全双工通路(两对差分线)实际上可以工作。注意RS485是半双工,发送和接收共用物理通道时由方向切换控制,这里MOXA卡和FX3U-485-BD之间用了四线制,可以实现类似全双工的效果,但官方定位仍是“无协议半双工”,所以在PLC程序里不能一边发送一边等待接收。
5.2 数据帧格式约定:给报警信息加帧头帧尾
项目里要记录的是错误报警信息,实际报警码可能是16位整数或字符串。无协议通信没有协议号,接收方必须靠帧格式自己切分数据。我通常在发送缓冲区里定义一个固定格式:
帧头(1字节:0x02) + 报警码(2字节) + 时间戳(4字节) + 帧尾(1字节:0x03)发送程序按这个格式填充D0~D7,PC端按同样的规则解析。如果数据源是纯数字寄存器,注意高低字节顺序。三菱PLC的MOV指令把数据传到大端序,但RS指令是按字节发送,D0的高8位先发还是低8位先发取决于D8120的b14位。b14=0时低字节在前,b14=1时高字节在前。
我在项目中固定b14=1,保证与PC端解析一致。如果在GX Works2里查看D0的值是0x1234,发送后又变成0x3412,就是b14设置反了。
5.3 用M8121做接收超时,避免死等
RS485无协议通信中没有流控,如果PC端发了半帧数据就断线,PLC的M8123可能一直不置位,接收缓冲区卡住。可以给接收加超时控制:
LD M8121 // 超时标志 RST M8123 RS D0 K10 D100 K20 // 重新启用接收M8121配合D8129(超时时间,单位10ms),当接收数据间隔超过设定值时M8121置位。在梯形图里把它作为一个复位信号,把接收缓冲区清空重新接收。超时时间我一般设20~50ms,太快会切碎正常帧,太慢则失去保护意义。
5.4 校验方式:累加和与CRC16
纯无协议通信没有CRC保障,PC端和PLC端需要自己约定校验。简单项目用累加和就够:
校验字节 = (帧头 + 数据字节1 + 数据字节2 + ... + 帧尾) 取低8位PLC端用求和指令实现,PC端同样求和比较。如果环境电磁干扰强,报警数据容不得错,可以用CRC16-Modbus。三菱FX3U没有现成CRC指令,需要写一个子程序逐位计算,大约40步梯形图。不过通用做法还是把CRC计算放在PC端,PLC端只做累加和,减少PLC扫描周期占用。
5.5 最后的完整性检查清单
现场交付前按下面顺序过一遍:
- 用万用表确认通信电缆线序与第二章第三版表格一致,尤其确认TXD+/TXD-与RDA/RDB的交叉关系
- 检查PLC的D8120值是不是0C81H,并在程序里用M8120流程设置
- 检查RS指令的接收长度是否大于最大报警帧长度
- 检查M8123是否在读取后复位
- 用示波器测量总线空闲电平,静态时A-B电压应在-0.2V~-6V范围,如果A-B电压为正,线序又反了
- 检查MOXA卡驱动设置里的“流控”是否为无,RS485的自动方向切换由驱动处理,不要开启软件流控
把这六项逐条确认后,挑残机项目的报警记录功能在连续运行72小时内没有出现丢帧或乱码,整个调式过程确实就是靠线序和D8120那两位解决了问题。
本文还有配套的精品资源,点击获取