CP341 是串口通信模块,本身不带 Modbus 协议栈,必须额外购买 Modbus RTU 从站 / 主站授权狗(硬件 Dongle)。
读智能仪表:PLC 做 Modbus‑RTU 主站 (Master),仪表是 Modbus 从站 (Slave)。硬件:S7‑300 CPU + CP341(6ES7 341‑1CH02‑0AE0)+ Modbus‑RTU 主站硬件狗;接线:RS485 两线 A/B。软件:STEP7 V5.x,需要安装
CP341 Modbus RTU驱动库。
区分:
CP341 硬件 + Modbus 主站 Dongle:才能做 Modbus RTU 主站读仪表;
没有 dongle:只能做 ASCII、3964R,不能跑 Modbus。
一、硬件准备
CP341 订货号:6ES7341‑1CH02‑0AE0(RS422/485 版本)
Modbus RTU MASTER 硬件加密狗:6ES7870‑1AA01‑0YA0,插在 CP341 前面。
没有这个狗,PTP 库不能执行 Modbus 功能码。
接线 RS485:
CP341 端子:A ↔ 仪表 A;B ↔ 仪表 B;
两端共地;总线两端加终端电阻 120Ω;
手拉手总线,禁止星型布线。
二、软件库安装
STEP7 需要安装:SIMATIC S7‑300 CP341 Modbus RTU 库包,安装后库里面出现:
FB08:MBUS_CTRL Modbus 主站初始化FB07:MBUS_MSG Modbus 读写消息(读仪表就调用 FB07)
⚠不要和 S7‑200 的 Modbus 库混淆,CP341 这一套是专用库。
三、关键参数(必须和智能仪表完全一致)
在仪表手册获取:
从站地址 Slave ID(1‑247)
波特率:9600 /19200;数据位 8;停止位 1;校验位:无 / 奇 / 偶
需要读取的寄存器:
0x03 功能码:读保持寄存器 Holding Register(绝大多数智能仪表)
寄存器起始地址、寄存器数量。
注意 Modbus 地址坑:仪表手册写寄存器 40001,对应 Modbus 逻辑地址是0;40002 对应 1。4xxxx 地址 = 逻辑地址 +40001。
四、PLC 程序编写(LAD)
新建 DB,背景数据块,不要优化块访问(S7‑300 老式库要求)。
1. FB08 MBUS_CTRL(初始化,OB1 循环调用)
表格
| 引脚 | 说明 | 示例 |
|---|---|---|
| EN | 一直接通 | M0.0=TRUE |
| Mode | 1=Modbus RTU 模式 | 1 |
| Baud | 波特率;9600=9600 | 9600 |
| Parity | 校验:0 无,1 奇,2 偶 | 0 |
| Done | 完成位 | M0.1 |
| Error | 错误代码 | M0.2 |
| Status | 状态字 | MW10 |
FB08 每个 OB1 周期调用一次,完成初始化 CP341 的串口参数。
2. FB07 MBUS_MSG 读仪表(触发调用,不能一直使能)
注意:多个仪表读取,必须轮询调用 FB07,同一时刻只能激活 1 个 FB07,不能同时多个 EN=1。
表格
| 引脚 | 说明 | 示例 |
|---|---|---|
| EN | 上升沿触发读,不要常 ON | M0.3 脉冲触发 |
| First | 1 = 新请求 | 1 |
| Slave | 仪表从站地址 | 例如:1 |
| RW | 0 = 读;1 = 写 | 0 |
| Func | 功能码,读保持寄存器 = 3 | 3 |
| DAddr | Modbus 逻辑起始地址 | 例如读 40010 → DAddr=9 |
| DataPt | PLC 接收数据指针,P#DB20.DBX0.0 | P#DB20.DBX0.0 |
| Len | 读取寄存器个数,如读 4 个寄存器 | 4 |
| Done | 本次读取完成 | M0.4 |
| Error | 出错标志 | M0.5 |
| Status | 故障状态码 | MW12 |
DataPt:指向 PLC 的接收 DB 块,DB20,非优化访问;读到的寄存器就存放在 DB20 里面,每个寄存器占 1 个字(16bit)。例:读 4 个寄存器:DB20.DBW0、DB20.DBW2、DB20.DBW4、DB20.DBW6。
轮询逻辑(多仪表标准写法)
用计数器 / 状态机轮询,同一时间只允许 1 个 MBUS_MSG 的 EN 接通;
FB07 Done 或者 Error 之后,延时一小段,切换下一个从站任务。
如果一直 EN 接通,会报通信错误。
五、DB 块定义示例 DB20(接收缓冲区)
属性:取消 “优化的块访问”
plaintext
DB20: Offset 0: Word Reg0 //对应仪表40010 Offset 2: Word Reg1 //40011 Offset 4: Word Reg2 //40012 Offset 6: Word Reg3 //40013
读到之后,根据仪表手册,做转换:
整数直接使用;
有部分仪表是两个 Word 组成浮点数 Real,需要把 DBW0 和 DBW2 合并 REAL。
六、CP341 硬件参数设置(HW‑Config)
硬件组态插入 CP341;
双击 CP341 → Parameters:
Protocol 选择:
Modbus‑RTU Master
这里只是组态,真正协议由硬件狗 + FB 库实现。
保存编译,下载硬件组态到 PLC。
七、常见故障排查(看 FB07 的 Status 状态字 MW12)
Status=16#8180:没有 Modbus 硬件狗!最常见,狗没插、狗损坏。
Status=16#80C8:超时,没有收到仪表应答:
接线 A/B 颠倒;
波特率、校验、从站地址不匹配;
终端电阻没接;仪表没上电。
Status=16#80E0:非法 DAddr 寄存器地址,超出仪表寄存器范围。
Status=16#80A1:请求正在处理,上一次消息还没结束,又触发 FB07,需要轮询。
调试手段:CP341 可以用 PTrace 串口跟踪,监视收发报文,确认 PLC 发出去什么、仪表回复什么,快速定位问题。
重要注意点
硬件狗不可省略,没有狗不能跑 Modbus RTU 主站;很多人只买 CP341,漏掉 dongle,调试卡很久。
DB 块必须关闭优化访问,否则 FB07 的 DataPt 指针报错。
FB07 不能常 ON,必须脉冲触发,任务完成 (Done/Error) 之后再发下一条,多仪表严格轮询。
RS485 总线注意共地、终端电阻;A/B 线千万不要接反。
Modbus 地址区分:40001 对应逻辑地址 0,很多人直接填 40001 进去 DAddr,直接报错。
浮点数:很多仪表把 REAL 放在 2 个连续寄存器,需要用
T_CONV或者间接拼接成 REAL。





