当前位置: 首页 > news >正文

三菱FX3U串口通讯无协议编程与RS指令实现Modbus协议

引言

在工业自动化系统中,PLC与上位机之间的通讯至关重要。Modbus RTU协议作为一种广泛应用的通讯协议,通常用于不同设备之间的数据交换。

对于三菱FX3U系列PLC来说,虽然它没有直接内置完整的Modbus RTU从站功能(早期型号需通过扩展模块),但通过其内建的RS/RS2指令+ 无协议(Non-Protocol)编程方式,完全可以实现稳定的Modbus RTU从站功能。

本文将从硬件准备、参数设置、梯形图实现、CRC校验、常见功能码处理,到上位机测试,全流程拆解如何让FX3U成为Modbus RTU从站,帮助你在实际项目中快速落地。

1. Modbus RTU协议简介

Modbus RTU协议以二进制模式传输数据,具有简单、稳定、实时性好等特点。

典型数据包结构(从站响应示例):

字段长度(字节)说明
地址1从站地址(1~247)
功能码101/03/05/06/15/16等
数据域N寄存器值、线圈状态等
CRC校验2低字节在前,高字节在后

上位机一般作为主站(Master),PLC作为从站(Slave)。

2. 硬件准备

  • PLC:FX3U系列
  • 通讯模块:推荐FX3U-485-BD(内置RS485)或FX3U-485ADP-MB(更推荐,支持原生Modbus)
  • 接线:485 A/B 差分信号 + 终端电阻(120Ω,通常在最远端设备)

3. PLC参数设置(关键!)

GX Works2 / GX Developer中设置串口参数(D8120):

  • D8120设置示例(Modbus RTU常用):
    • H4081 → 波特率9600、8位数据、奇校验、1位停止位(最常用)
    • H4085 → 19200、8、奇、1(推荐更高速度)

其他重要软元件:

  • M8120:通信初始化完成标志
  • M8121:发送中
  • M8122:发送完成
  • M8123:接收完成
  • M8129:超时判断

4. 核心实现:RS2指令 + 无协议编程

FX3U推荐使用RS2指令(支持更多功能)。

基本梯形图框架

// 1. 初始化(仅执行一次) LD M8002 MOV H4081 D8120 // 通信格式设置 MOV K100 D8121 // 发送缓冲区首地址 MOV K100 D8122 // 接收缓冲区首地址 MOV K64 D8123 // 发送/接收缓冲区大小(100字示例) SET M8120 // 启动通信

接收处理主逻辑(核心部分):

// 接收完成中断处理 LD M8123 ANI M8121 // 非发送中 CALL P100 // 跳转到接收处理子程序

子程序 P100(接收 + 处理 + 应答)

  1. 检查地址是否匹配本站地址
  2. 检查功能码(支持 03 读保持寄存器、06 写单寄存器、16 写多寄存器等)
  3. 计算CRC校验
  4. 组织响应报文
  5. 使用RS2发送响应

CRC16计算(FX3U必须自己实现):

// 可封装成函数块(推荐用ST或FNC) // 输入:数据起始地址 + 数据长度 // 输出:CRC值(存入D寄存器)

5. 常用功能码实现示例

  • 03H 读多个保持寄存器:最常用,上位机读取PLC D寄存器
  • 06H 写单个保持寄存器:上位机控制PLC输出
  • 10H(16)写多个寄存器:批量参数下发

推荐做法

  • 将PLC内部D区映射为Modbus寄存器地址(如D1000 ~ D1299 映射为40001开始)
  • 使用MOV/Z MOV等指令快速组包

6. 上位机测试

推荐工具:

  • Modbus Poll(主站测试软件)
  • Modbus Slave(模拟)
  • .NET 上位机(NModbus / Modbus.Net)

测试参数

  • 波特率:9600或19200
  • 校验:Odd(奇校验)
  • 从站ID:与PLC设置一致(通常1~247)

7. 工业级增强建议

  • 增加看门狗与超时重发机制
  • 支持广播地址(0)
  • 异常响应(功能码 + 0x80)
  • 配合上位机粘包解析(参考之前串口粘包完整实现)
  • 若使用FX3U-485ADP-MB模块,可直接用ADPRW指令,大幅简化编程

8. 注意事项与常见问题

  • FX3U早期型号必须手动实现CRC(推荐查表法提升速度)
  • 485总线必须单总线拓扑 + 终端电阻
  • 通信间隔至少大于帧传输时间(3.5字符时间)
  • 强烈建议先在仿真器上调试通过,再下到实机

结语:通过RS2指令 + 无协议编程,FX3U完全可以稳定实现Modbus RTU从站功能,满足绝大多数与上位机、触摸屏、变频器、仪表等的通讯需求。

此方案已在多条产线(半导体老化、水处理、汽车焊接等)中稳定运行。如果您需要完整梯形图源码(GX Works2格式)CRC16函数块03H/06H/10H完整实现示例,或者与.NET MAUI上位机联调方案,随时告诉我,我可以继续提供详细代码和工程文件思路。

CRC16 函数块完整实现(三菱FX3U Modbus RTU专用)

以下是为FX3U系列PLC量身定制的高性能CRC16 Modbus函数块(支持GX Works2 / GX Developer)。

推荐方案:查表法(Table Look-up)——速度快、工业推荐

1. 函数块(FB) -CRC16_Modbus

输入输出定义:

变量名类型说明
ENBOOL使能(通常接SM400)
uStartAddrINT数据起始地址(字单位)
uLengthINT数据长度(字单位)
uCRCDWORD输出:计算出的CRC值
bDoneBOOL计算完成标志
2. 完整实现代码(ST语言 + 梯形图调用)

推荐使用ST语言编写函数块(FX3U支持)

(* ============================================= CRC16_Modbus 函数块 (查表法) 作者:工业上位机实战系列 适用:FX3U / FX5U Modbus RTU从站 ============================================= *) FUNCTION_BLOCK CRC16_Modbus VAR_INPUT EN : BOOL; // 使能 uStartAddr : INT; // 数据起始地址 (字) uLength : INT; // 数据长度 (字) END_VAR VAR_OUTPUT uCRC : DWORD; // CRC结果 (低字在前) bDone : BOOL; // 计算完成 END_VAR VAR i : INT; crc : WORD := 16#FFFF; data : WORD; ptr : INT; crcTable : ARRAY[0..255] OF WORD; // CRC16查找表 END_VAR // ==================== 初始化CRC16查找表 ==================== IF EN AND NOT bDone THEN // 第一次调用时初始化查找表(只执行一次) IF crcTable[0] = 0 THEN FOR i := 0 TO 255 DO crcTable[i] := WORD#16#0000; data := WORD(i); FOR ptr := 0 TO 7 DO IF ((data AND 16#0001) <> 0) THEN data := SHR(data, 1) XOR 16#A001; ELSE data := SHR(data, 1); END_IF; END_FOR; crcTable[i] := data; END_FOR; END_IF; // ==================== 计算CRC ==================== crc := 16#FFFF; FOR i := 0 TO uLength-1 DO data := %D[uStartAddr + i]; // 读取一个字 crc := SHR(crc, 8) XOR crcTable[(crc XOR data) AND 16#00FF]; crc := SHR(crc, 8) XOR crcTable[(crc XOR (SHR(data, 8))) AND 16#00FF]; END_FOR; // Modbus RTU要求低字节在前 uCRC := DWORD# (SHL(WORD_TO_DWORD(crc), 16) OR (SHR(crc, 8) AND 16#00FF) OR SHL((crc AND 16#00FF), 8)); bDone := TRUE; ELSE bDone := FALSE; END_IF; END_FUNCTION_BLOCK

3. 梯形图调用示例

LD M8000 // 始终ON FB CRC16_Modbus EN -> SM400 uStartAddr -> D100 // 要计算的数据起始地址 uLength -> K10 // 10个字 uCRC -> D200 // 输出CRC (D200=低字节, D201=高字节) bDone -> M100

使用方法

  • 计算完后,D200 = CRC低字节,D201 = CRC高字节
  • 发送时按低字节在前顺序发送:MOV D200 D300MOV D201 D301

4. 简化版(纯梯形图 + FNC指令,适合老版本)

如果您的PLC版本不支持ST语言,可使用以下简化版(查表法仍可实现,但代码量较大)。

我也可以提供位运算版(无需查表),计算速度稍慢但代码更短。


关注继续提供以下内容

  1. 完整梯形图版CRC16(纯梯形图,无ST)
  2. Modbus RTU 03H读寄存器完整响应程序
  3. 06H/10H写寄存器处理程序
  4. CRC16 测试工具(上位机验证用)
http://www.jsqmd.com/news/797340/

相关文章:

  • 2026 济南黄金回收市场深度解析:合规变现与机构选择指南 - 奢侈品回收测评
  • 塞尔维亚名义雇主EOR业务是什么? - 万领钧KnitPeople
  • 【yagmail,一个邮件的 Python 库!】轻轻松松搞定自动化邮件发送
  • 豆包导出word手机
  • Windows系统mqad.dll文件丢失无法启动程序解决
  • PCDViewer-2.0隐藏玩法:用‘轨道旋转’和‘跟踪球’模式提升你的点云审查效率
  • 告别轮询!用DSP28335 GPIO中断实现矩阵按键响应,效率提升实战指南
  • 终极视频字幕提取指南:如何用本地OCR工具高效提取87种语言硬字幕
  • Agent Framework 中智能体的Sequential 编排模式
  • Consistent-Teacher:减少半监督目标检测中不一致伪标签
  • 5.11 应急演练子系统第1天 - GENGAR
  • ARM浮点异常处理机制与FPEXC寄存器详解
  • 拒绝概念噱头!重型纸箱真实降解数据,大厂绿色包装这样选
  • Python 爬虫高级实战:爬虫版本迭代与平滑更新
  • 怎样免费解锁碧蓝航线全皮肤:Perseus开源工具完整配置指南
  • 【Gemini赋能Google Meet实时字幕】:2024企业级会议无障碍升级的5大落地陷阱与避坑指南
  • 2026华南区域平开门工厂实力排行:5家头部企业实测对比 - 奔跑123
  • 算法21,搜索插入位置
  • Visual C++运行库一键修复指南:解决Windows程序启动问题的完整方案
  • 系统突然出现 CPU 飙高,你如何排查?
  • 告别OrthoFinder限制:用IQtree+Notung搞定跨物种基因家族树(附兰科NB-ARC实战)
  • 蓝叠模拟器抓包难题?用Proxifier+ Fiddler搞定HTTPS请求(保姆级图文教程)
  • WarcraftHelper魔兽争霸3终极优化指南:告别卡顿与兼容性问题
  • Bebas Neue字体技术深度解析:开源无衬线显示字体的现代排版解决方案
  • AI教材生成秘籍!低查重AI写教材工具,快速产出30万字优质教材!
  • 基于深度学习的遥感船舶SAR图像识别 YOLOv11在遥感图像船舶识别中的应用
  • 从ITF到DSPF:华大九天Empyrean RCExplorer在版图寄生分析中的实战解析
  • 企业数智化
  • OpenClaw 汉化版 Windows 一键安装指南|零基础 5 分钟部署 告别命令行
  • 云计算Linux——Nginx源码编译安装(十一)