FX3U-IE-V12.2 PLC源代码解析及网口实现本地或远程穿透编程、监控
FX3U-IE-V12.2 PLC源代码,网口实现本地或远程穿透编程、监控。 网口支持FXTCP mc协议的触摸屏、上位机组态连接。 硬件STM32F103VET6和RET6,兼容三菱FX3U源码,带modbusTCP服务和双串口ModbusRTU主从站功能(可通过plc程序切换),实时时钟,深度测试后,修改一些主要bug后,稳定运行。 程序配套测试用板卡pcb,原理图,bom表等资料。
一、模块定位
在 FX3U-IE-V12.2 整套源码中,CAN 网络通信(can_network.c/h)承担“现场级高速数据共享”职责:
- 把 PLC 的 D 寄存器区间映射为“共享寄存器”,实现主-从站间毫秒级同步;
- 兼容 FX3U 原生命令集(0x03 读、0x10 写),上位机/触摸屏无需修改协议即可接入;
- 支持 0~8 号站(主机地址=0,从机 1~8),单站最多 32 字共享区,整网 256 字;
- 异常自恢复:CRC 校验、长度保护、超时重发、总线-off 自动复位;
- 纯软件实现,不依赖专用 CAN-ASIC,成本敏感型 OEM 可直接复用。
二、硬件与底层约束
- 物理层:STM32F103 内置 bxCAN,外接 TJA1050 或 SN65HVD230,波特率 500 k(可改);
- 引脚重映射:PB8-RX、PB9-TX,启用 GPIORemap1CAN1;
- 时钟:APB1=36 MHz,位定时 6×(1+6+5)=500 k;
- 滤波器:32 bit 掩码模式,全 0 接收——由软件完成地址过滤,降低中断抖动;
- 中断:FIFO0 中断优先级 0,与 USB 共享向量 USBLPCAN1RX0IRQn。
三、协议帧格式(应用层)
| 字节偏移 | 长度 | 含义 |
|---|---|---|
| 0 | 1 | 功能码:0x03 读寄存器,0x10 写寄存器 |
| 1~2 | 2 | 寄存器起始地址(大端) |
| 3 | 1 | 后续数据字节数 N |
| 4~4+N-1 | N | 数据载荷 |
| 4+N~5+N | 2 | CRC16-Modbus(低前高后) |
标准帧 ID = 目标站地址,数据域≤8 字节,长包由发送端自动拆包、接收端按字节流重组。
四、共享寄存器地址空间
D4096 ~ D5095 → 主机共享区(32 字) D5096 ~ D6095 → 1# 从机共享区 …… D8096 ~ D9095 → 8# 从机共享区PLC 侧用普通 D 寄存器指令即可读写;CAN 主站周期把“非本机”区下发到对应从站,保持全网一致。
五、主机业务流程(地址=0)
- 初始化:检测 D8151(从站数)、D8152(每站寄存器数)、D8149(超时 ms),异常置位 D8063 错误码;
- 周期扫描:
a. slaveCnt 递增,向当前从站发 0x03+起始 0xFFFF 读取“共享寄存器个数”;
b. 收到应答后,发 0x03+真实起始地址,读取该站完整数据块;
c. 把数据块拷入 PLC 的 Dxxxx 区,随后发 0x10 把“非本机”区写入从站;
d. 收到写应答后置 rxFlg=5,loop 指针下移,继续下一从站; - 任何一步超时/CRC 错,重试 6 次,仍失败则置 D8063 相应错误码并跳过该站。
六、从机业务流程(地址 1~8)
- 上电等待主机“读 0xFFFF”命令,回复本机共享寄存器个数;
- 收到“读寄存器”命令,打包本地 D 区数据,拆帧发送;
- 收到“写寄存器”命令,把数据写入本地 D 区,回送 0x10+起始地址+0x0000(成功);
- 若 CRC/长度/地址非法,回送 0x10+起始地址+非 0 错误码,主机记录并告警。
七、拆包与组包策略
- 发送端:按 8 字节切片,末包不足 8 字节直接发;帧间插入 2 ms 延时,防止 bxCAN 发送缓冲区拥塞;
- 接收端:字节流状态机,rxFlg=1 表示“正在收”,超时 10 ms 判帧结束;重组后统一 CRC 校验;
- 双缓冲:TxBuf/RxBuf 各 128 B,支持单包最大 64 字节数据(32 字寄存器×2)。
八、异常与诊断
| D8063 值 | 含义 | 自动恢复策略 |
|---|---|---|
| 6367 | CRC 错 | 重发 6 次 |
| 6371 | 发送超时 | 重发 6 次 |
| 6377 | 寄存器地址越界 | 跳过本帧,不再重试 |
| 6378 | 从站数设置超范围 | 初始化阶段直接返回,不进入循环 |
| 6379 | 共享寄存器数>32 | 同上 |
所有错误码在成功完成一次周期后自动清零,方便上位机“读-清除”机制。
九、与 PLC 扫描周期的关系
CANPoll() 由 PLC 主循环调用,约每 1 ms 一次;内部状态机无阻塞,最长处理时间 < 200 µs(72 MHz),对梯形图扫描影响可忽略。若用户关闭 M8150(CANEN_FLG),模块立即释放 FIFO 中断并清空发送队列,实现热插拔安全。
十、裁剪与移植指南
- 非 FX3U 平台:把 plc16BitBuf[] 替换成任意 16-bit RAM 区;CRC16Modbus 已有开源实现;
- 减少 RAM:把 CANBUFLEN 改成 64,单站寄存器≤16 字即可;
- 提高速率:把 SimpleDelay(2) 改为 1 ms 或完全删除,若 CAN 收发器支持 1 M 波特率;
- 多主机场景:当前协议无总线仲裁,建议单主机;若需多主机,请在应用层加令牌帧。
十一、典型应用接线
主机 STM32F103VET6 ├─PB8 ‑- CAN_RX ├─PB9 ‑- CAN_TX └─TJA1050 ‑- 120 Ω 终端电阻 ‑- 从机 1~8屏蔽双绞线长度 ≤ 40 m(500 k),分支 < 0.3 m,保证通讯余量。
十二、版本记录
V1.0.1 – 2020-11-02
- 首版,兼容 FX3U 原生命令集
- 支持 8 站、32 字共享、CRC 校验、自动重发
FX3U-IE-V12.2 PLC源代码,网口实现本地或远程穿透编程、监控。 网口支持FXTCP mc协议的触摸屏、上位机组态连接。 硬件STM32F103VET6和RET6,兼容三菱FX3U源码,带modbusTCP服务和双串口ModbusRTU主从站功能(可通过plc程序切换),实时时钟,深度测试后,修改一些主要bug后,稳定运行。 程序配套测试用板卡pcb,原理图,bom表等资料。
