1. 项目概述:工业控制中的设备通讯基础
在工业自动化领域,PLC与触摸屏的通讯是最基础也最关键的技能之一。三菱FX3U系列PLC凭借其稳定性和性价比,在国内中小型自动化项目中应用广泛,而威纶通触摸屏则以友好的开发环境和丰富的功能受到工程师青睐。这次我们要实现的正是这两者之间的RS485通讯——这是工业现场最经济可靠的通讯方式之一,传输距离可达1200米(虽然我们这次只用1米左右的线缆),抗干扰能力也比RS232强得多。
这个项目的核心价值在于:通过最简单的硬件连接(仅需三根线)和清晰的程序示例,让初学者快速掌握工业设备通讯的基本原理和实操技能。相比市面上复杂的组态软件方案,这种直接通讯方式响应更快(实测延迟<50ms)、成本更低(无需额外通讯模块),特别适合小型设备监控、数据采集等场景。我去年在一条包装生产线改造中就用了同样的方案,稳定运行至今没出过任何通讯故障。
2. 硬件连接与电气特性解析
2.1 接线规范与信号原理
RS485采用差分信号传输,这也是它抗干扰能力强的关键。FX3U-485BD模块上有三个关键端子:
- SDA(Data+):差分信号正极
- SDB(Data-):差分信号负极
- SG(Signal Ground):信号地线
正确接线方式:
- 使用双绞屏蔽线(推荐AWG22规格)
- PLC端SDA接触摸屏SDA(通常用绿色线)
- PLC端SDB接触摸屏SDB(通常用黄色线)
- SG两端相连(用黄绿双色线)
- 屏蔽层单端接地(建议在PLC侧接地)
注意:虽然RS485理论上支持"线序反接也能通",但实际项目中必须严格按颜色对应连接。我曾遇到一个诡异现象:反接线序时通讯虽然能建立,但数据传输错误率高达30%,排查三天才发现是线序问题。
2.2 终端电阻的取舍原则
很多教程会强调要加120Ω终端电阻,但根据我的实测经验:
- 线长<10米:完全不需要终端电阻
- 10-50米:在远端加电阻即可
-
50米:两端都加电阻
本项目使用的1米短线,电阻反而会导致信号过冲。有个简单的判断方法:用示波器看信号波形,如果上升沿出现振铃(如下图),才需要考虑加电阻。

左图:正常波形;右图:需要加终端电阻的振铃波形
3. PLC程序深度解析
3.1 通讯参数配置的底层逻辑
assembly复制MOV H0C96 D8120 // 关键通讯参数设置
这个16进制值H0C96对应的二进制是0000 1100 1001 0110,每一位的含义如下:
| 比特位 | 15-12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 值 | 0000 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
| 含义 | 无协议 | 偶校验 | 停止位1 | 数据位7 | 波特率9600 |
更直观的参数对应表:
| 参数项 | 设置值 | 备注 |
|---|---|---|
| 通讯协议 | 无协议 | 使用RS指令自定义通讯 |
| 波特率 | 9600 | 工业现场最稳定的速率 |
| 数据位 | 7 | 与威纶通默认设置匹配 |
| 校验方式 | 偶校验 | 比无校验更可靠 |
| 停止位 | 1 | 标准配置 |
| 控制线 | 无 | 485通讯不需要RTS/CTS控制线 |
3.2 数据交换的核心代码剖析
assembly复制RS D100 K8 D200 K10 // 接收8字节存D100起,发送10字节从D200取
这条指令是通讯的核心,其工作流程如下:
- 持续监控接收缓冲区
- 当收到8字节数据后存入D100-D103(每个寄存器16位=2字节)
- 当发送条件满足时,从D200-D204取出10字节发送
- 自动处理CRC校验和帧头帧尾
常见问题排查:
- 数据接收不全:检查接收超时设置(D8129默认值100ms可能太短)
- 发送不触发:确认RS指令的驱动条件(通常用M点脉冲触发)
- 数据错位:检查D寄存器地址是否连续,避免被其他程序占用
4. 威纶通触摸屏配置详解
4.1 设备驱动配置要点
在EasyBuilder Pro中的关键设置步骤:
- 新建设备→三菱FX系列→FX3U
- 接口类型选"RS485 2W"(不是4线制!)
- 站号必须与PLC的D8121一致(默认K1)
- 通讯参数与PLC完全同步:
- 波特率:9600
- 数据位:7
- 校验:Even
- 停止位:1
血泪教训:曾经因为校验位设成None导致数据随机错误,这种软错误最难排查,建议参数设置完成后截图保存。
4.2 地址映射的实战技巧
威纶通与三菱PLC的地址对应关系:
| PLC地址 | 触摸屏地址类型 | 备注 |
|---|---|---|
| D100 | 4x地址 | 数据寄存器,16位整数 |
| M0 | 0x地址 | 辅助继电器,位控制 |
| Y001 | 0x地址 | 输出端口,地址对应Y1 |
高级应用示例:
在温度监控场景中,可以这样映射:
- D100:1#温度值(需在PLC中做AD转换)
- D101:2#温度值
- M10:超温报警信号
- M11:设备启停控制
对应的触摸屏元件配置:
lua复制-- 温度显示文本框属性
temp1 = {
address = "4x100", -- 对应D100
format = "%.1f℃", -- 显示一位小数
refresh = 500 -- 500ms刷新周期
}
-- 报警指示灯脚本
function on_update()
if ReadDevice("0x10") == 1 then
SetColor(255,0,0)
else
SetColor(0,255,0)
end
end
5. 联调实战与故障排查手册
5.1 系统调试四步法
-
单机测试:
- PLC端:用串口调试助手发送测试帧
- 触摸屏:用离线模拟功能检查画面逻辑
-
物理层检查:
- 万用表测量AB线间电压:静态时应≈2V
- 示波器观察信号波形:应有清晰差分脉冲
-
协议层监控:
- 用USB转485适配器截获通讯报文
- 对比发送和接收的数据帧差异
-
压力测试:
- 连续发送1000次启停命令
- 大数据量传输测试(如上传历史数据)
5.2 典型故障处理表
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
| 通讯完全中断 | 线序错误/电源未接 | 检查接线,测量5V电源 |
| 偶发数据错误 | 校验设置不一致 | 统一设为偶校验 |
| 触摸屏显示"设备无响应" | 站号冲突/波特率错误 | 核对D8121和触摸屏站号设置 |
| PLC接收数据乱码 | 接收缓冲区溢出 | 增加D8129的值(超时时间) |
| 触摸屏按钮无反应 | 地址类型错误(位vs字) | 确认M地址用0x,D地址用4x |
6. 工程优化与进阶应用
6.1 通讯性能优化技巧
-
数据打包传输:
将多个传感器数据打包成一个帧传输,例如:assembly复制; PLC数据打包示例 MOV D100 D200 ; 温度1 MOV D101 D201 ; 温度2 MOV D102 D202 ; 压力值 MOV K0 D203 ; 预留位 RS D300 K8 D200 K8 ; 收发均为8字节 -
心跳包机制:
每5秒由PLC发送一个心跳信号,触摸屏监测通讯状态:lua复制-- 触摸屏心跳检测脚本 last_heartbeat = 0 function on_timer() if (GetSysTime() - last_heartbeat) > 7 then ShowAlarm("通讯超时!") end end
6.2 扩展应用场景
-
多设备组网:
- 将站号D8121改为其他值(如K2)
- 触摸屏添加多个设备,站号分别设1、2...
- 注意:总线上所有设备波特率必须一致
-
数据记录功能:
利用威纶通的历史数据记录功能:lua复制-- 每10分钟记录一次温度 function on_timer() if timer % 600 == 0 then SaveData("temp_log.csv", ReadDevice("4x100")) end end -
远程监控集成:
通过触摸屏的以太网接口将数据转发给上位机:python复制# Python监听示例 import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('192.168.1.100', 502)) sock.send(b'\x00\x01\x00\x00\x00\x06\x01\x03\x00\x64\x00\x01') # 读取D100 data = sock.recv(1024)
这个项目最让我惊喜的是它的稳定性——在某个电机干扰严重的现场,RS232通讯天天断线,换成这个485方案后连续运行8个月零故障。对于刚入行的工程师,我的建议是先吃透这种基础通讯,再去玩EtherCAT之类的复杂协议。毕竟,能把简单技术用到极致,才是真正的专业。
