开头先给结论:CM1241 RS232/422/485 通信模块配合 Modbus Slave 软件做 Modbus RTU 从站测试,是西门子 S7-1200 PLC 串口通信里很常见、也很实用的一个验证组合。它解决的核心问题,是在没有真实主站设备的情况下,用一台电脑加一个串口调试软件,就能完整验证 PLC 作为 Modbus RTU 从站时的寄存器读写、数据映射和通信稳定性。这篇文章适合正在做 PLC 串口通信、准备把 S7-1200 接第三方上位机或仪表,又不想一上来就买专用主站设备的工程师看。最值得关注的不是 Modbus Slave 软件怎么点,而是 CM1241 的硬件接线、MB_COMM_LOAD 参数设置、轮询地址映射和排错顺序这四件事,它们才是决定通信能不能一次跑通的真正关键。
1. 先确认 CM1241 做从站时,整个通信链路是怎么组起来的
很多人第一次碰 CM1241 会有一个误区,以为通信模块插到 CPU 左侧就能直接发数据。实际上 CM1241 只是一个物理层转换和串口收发通道,真正决定“发什么、回什么、按什么格式回”的,是 CPU 里跑的 Modbus 指令。CM1241 只是把 CPU 准备好的 Modbus RTU 帧,从内部总线搬到 RS232、RS422 或 RS485 线路上,再把收到的请求帧交给 CPU 处理。
1.1 主从关系要分清
在这套测试方案里,角色分配是固定的:
- PLC 侧:S7-1200 CPU 加 CM1241 通信模块,运行 Modbus RTU 从站程序,等待主站请求。
- PC 侧:Modbus Slave 软件作为主站模拟工具,主动发起 03、04、06、16 等 Modbus 功能码请求。
- 物理链路:PC 通过 USB 转串口线连接 CM1241 模块的通信接口。
所以通信方向是 PC 先发请求,PLC 收到后解析、读取或写入保持寄存器或线圈,再组织响应帧回给 PC。Modbus Slave 软件里看到的寄存器数据,实际来自 PLC 的数据块或存储区。
有一个容易混淆的地方:Modbus Slave 这个名字会让人以为它只能做从站模拟。实际上它既可以模拟从站,也可以发起请求。这里我们用的是它的主站请求功能,通过 Modbus Poll 或者直接手动发送报文来测试 PLC 从站。如果电脑上装了 Modbus Poll,也可以把它当作更直观的主站工具,但 Modbus Slave 同样能完成轮询和读写验证。
1.2 CM1241 三种电气接口是三个不同的使用思路
CM1241 有三种型号:RS232、RS422、RS485。不要只看标题里写的是“CM1241 RS232/422/485”,就以为一个模块同时支持三种接口。实际上每个模块是固定的一种电气接口:
| 模块型号 | 电气接口 | 通信距离与拓扑 | 典型用途 |
|---|---|---|---|
| 6ES7241-1AH32-0XB0 | RS232 | 点对点,15 米左右 | 接打印机、扫码枪、小范围仪表 |
| 6ES7241-1CH32-0XB0 | RS422 | 点对点,四线全双工,1200 米 | 接高速仪表、需要收发独立的设备 |
| 6ES7241-1CH30-0XB0 | RS485 | 多点总线,两线半双工,1200 米 | 接变频器、电表、多台仪表轮询 |
如果你的设备只有 RS232 接口,那就必须选 RS232 型号。如果现场已经有 RS485 总线且挂多台设备,选 RS485 型号更合适。测试前先看清楚模块外壳上的型号标识,接线端子定义也不同。
1.3 为什么建议先用电脑加 Modbus Slave 做验证
我一般不会在项目刚起步就把 PLC 直接连到真实主站设备上调试。原因很简单:真实设备往往只有有限的功能码支持、固定的寄存器地址、不确定的波特率,出了问题很难判断是 PLC 侧配置不对,还是设备侧协议实现不标准。
用 Modbus Slave 软件做模拟主站,好处是:
- 可以手动指定功能码、地址、数量和轮询周期。
- 可以随时修改寄存器值,验证 PLC 数据块的映射是否正确。
- 可以抓取原始报文,看通讯帧里的地址、功能码、CRC 和返回异常码。
这套组合非常适合先做完从站程序验证,再推送到现场设备。说白了,就是用软件把通信链路先打通,再换真硬件,缩小排错范围。
2. 准备环境和硬件接线,重点看串口参数和线序
开始组态之前,先把硬件和软件环境准备干净。这部分最浪费时间的往往不是技术,而是线序接错、串口号选错、接口供电不足这些小问题。
2.1 硬件清单和接线方式
测试需要准备这些:
- S7-1200 CPU,建议固件版本 V4.0 以上,Modbus 指令支持更完整。
- CM1241 通信模块,与 CPU 的固件版本匹配。
- 24V DC 电源,给 PLC 和通信模块供电,通信模块本身需要供电。
- 编程电缆或网线,用于 TIA Portal 组态下载。
- USB 转串口线,型号要和你选的 CM1241 电气接口对应。RS232 需要 USB 转 RS232,RS485 需要 USB 转 RS485。
- 连接导线,建议 0.5 到 1.0 平方毫米的屏蔽双绞线。
接线前先断电。CM1241 RS485 模块的端子定义通常是 A(数据正)、B(数据负),RS232 则是 TXD、RXD、GND。不同订货号的端子位置可能不同,接之前最好翻一下模块铭牌上的标记。USB 转串口线内部带转换芯片,不需要额外供电,但一定要装好驱动,否则 Windows 设备的“端口(COM 和 LPT)”里找不到对应 COM 号。
接 RS485 时,注意 A 接 A、B 接 B。很多调试失败的案例就是因为把 A 和 B 反接,现象是 Modbus Slave 软件一直显示超时,但看不出来是程序问题还是物理层问题。
2.2 串口参数必须保持一致
Modbus RTU 通信需要两边串口参数完全一致,包括:
- 波特率:9600、19200、38400、115200,通常用 9600 起步。
- 数据位:8。
- 停止位:1 或 2,常见是 1。
- 校验位:无校验、偶校验或奇校验。
CM1241 侧通过 Modbus 指令组态这些参数,Modbus Slave 软件侧通过串口设置界面配置。哪一边不对都会导致通讯超时。我的习惯是先统一用 9600、8、N、1,通上了再提高波特率到 19200 或更高,避免一开始就卡在高速通讯的干扰上。
2.3 终端电阻和偏置电阻什么时候要处理
RS485 总线在距离较长或节点较多时,需要终端电阻匹配,否则信号反射会导致偶发超时和乱码。单个 PLC 到单个电脑这种短距离测试,通常不接终端电阻也能通,但如果你在实验室里已经出现不稳定,可以在总线两端并联 120 欧姆终端电阻试一下。
偏置电阻的作用是保证总线空闲时电平确定。两线制 RS485 在没有数据传输时是“空闲”状态,如果总线上没有偏置,可能收到随机电平。很多 Modbus RTU 从站在数据间隔期出现 CRC 错误的,可以优先检查偏置电阻。但注意,短距离一对一测试时,先不要急着加偏置,加了反而可能影响信号质量。
3. TIA Portal 里做硬件组态和从站程序,关键参数要看懂
程序部分比想象中简单,但有一个隐藏前提:CM1241 不能单独发 Modbus 报文,必须调用专门的 Modbus 指令,并且要先做“加载端口”的初始化。
3.1 硬件组态步骤
在 TIA Portal 中新建项目,添加 S7-1200 CPU,然后把 CM1241 模块拖到 CPU 左侧的通信模块插槽里。我一般会先检查模块对 CPU 固件版本的要求,低版本固件 CPU 有时不支持新增通信模块或部分指令。
组态完成后编译无错误,再下载到 PLC。如果 CPU 面板有报错灯,先看模块诊断信息,确认 CM1241 是否被识别。
3.2 Modbus RTU 从站指令调用方式
TIA Portal 里并没有一个叫“Modbus Slave”的指令,实际使用的是三步结构:
- MB_COMM_LOAD:加载通信端口,配置波特率、校验、接口等参数。
- MB_SLAVE:作为从站处理请求,绑定数据区和通信缓冲区。
- 需要保持通信使能时,通常会配合一个循环 OB 持续调用 MB_SLAVE。
MB_COMM_LOAD 的参数比较容易踩坑。常见需要填的参数有:
| 参数 | 含义 | 我常用的值 |
|---|---|---|
| REQ | 上升沿触发加载 | 使用 M0.5 或启动脉冲 |
| PORT | 硬件标识符 | 系统通过组态自动生成,也可以从“硬件标识符”获取 |
| BAUD | 波特率 | 9600 或 19200 |
| PARITY | 校验位 | 0 无校验,1 奇校验,2 偶校验 |
| FLOW_CTRL | 流控制 | 通常设为 0,不使用硬件流控 |
| RESP_TO | 响应超时,单位毫秒 | 从站模式用 1000 或 2000 |
MB_SLAVE 调用时,MB_ADDR 是从站地址,要和 Modbus Slave 软件里设置的目标从站地址一致。MB_HOLD_REG 是保持寄存器区域的指针,通常指向一个数据块中的数组。默认情况下 MB_SLAVE 支持的 Modbus 功能码包括:
- 01:读线圈
- 02:读离散输入
- 03:读保持寄存器
- 04:读输入寄存器
- 05:写单个线圈
- 06:写单个保持寄存器
- 15:写多个线圈
- 16:写多个保持寄存器
这些功能码不是每个都要用,但 Modbus Slave 软件测试时,你至少会用到 03、06、16 这三个。
3.3 为什么 MB_COMM_LOAD 的执行状态很重要
MB_COMM_LOAD 返回错误码时,后续 MB_SLAVE 是没办法正常工作的。常见错误码含义可以记一下:
- 0:正常
- 1:参数错误,比如波特率不支持、校验位值越界。
- 2:端口已被其他指令占用。
- 3:硬件标识符无效。
- 4:端口已被关闭或模块未就绪。
当 Modbus Slave 软件一直超时,我的习惯是先看 MB_COMM_LOAD 的 DONE 位和 ERROR 位。如果 ERROR 置位,立刻读错误码,先解决端口加载问题,再去看从站指令。否则你会花很多时间去改 Modbus Slave 软件那边的参数,结果还是连不上。
注意:不要让 MB_COMM_LOAD 在每个扫描周期都触发。它只在启动时执行一次,之后保持端口配置。如果每个循环周期都重新加载端口,通信会不断被重置,Modbus Slave 软件表现出“偶尔通、一直断”的现象。
3.4 数据区映射建议
MB_SLAVE 的保持寄存器区域通常映射到 PLC 数据块数组上。比如建立一个名为 “ModbusData” 的全局 DB,内部定义一个长度为 100 的 INT 数组,然后用 PEEK 或直接指针方式把它传给 MB_HOLD_REG。
这样写的好处是:Modbus Slave 软件写入寄存器时,你可以在 PLC 监控表中直接看到数据变化。反过来,你也能在线监控 PLC 数据,确认上位机读写是否真的落到了想要的地址。我一直建议把保持寄存器区域和实际工艺变量的地址对应关系整理成表格,方便后面排查。
如果只是做验证,不需要把程序写得非常复杂。你可以在 OB1 里调用 MB_COMM_LOAD 和 MB_SLAVE,再用一个定时中断 OB 轮询更新数据,就足够模拟真实的从站行为。
4. Modbus Slave 软件侧参数设置与联调验证
Modbus Slave 软件的界面看起来功能很多,但第一步只需要确定串口号、波特率、数据位、停止位、校验位和从站地址。这些参数要和 PLC 侧完全一致。
4.1 串口连接设置
打开 Modbus Slave 软件,找到串口连接或连接设置选项。这里的关键选择是“连接方式”:有的版本通过“Modbus Slave”内置主站功能发起请求,有的是通过 Modbus Poll 外部工具发起。不同版本界面有差异,但核心参数是同一套。
设置串口时,注意 Windows 识别出的 COM 号要和物理 USB 转串口线对应。检查方法是:在设备管理器里拔插串口线,看哪个 COM 号出现和消失。
4.2 从站地址和功能码选择
测试从站时,需要建立一个新的“从站”连接:
- 从站 ID:填写 1,和 PLC 的 MB_ADDR 一致。
- 功能码:根据你要测试的内容选 03(读保持寄存器)或 04(读输入寄存器)。
- 起始地址:0 或 0 开头的地址,取决于协议映射。
- 寄存器数量:可以先读 10 个或 20 个,不要一下读几百个。
地址这块有一个容易踩的坑:Modbus 协议地址从 0 开始,但很多设备手册从 1 号寄存器开始描述。实际报文的起始地址是“寄存器号减一”。在 Modbus Slave 软件里,有些版本会提供地址偏移显示,建议先把起始地址设为 0 测试,再根据现场设备手册调整偏移。
4.3 验证通讯是否正常
配置完成后,点击连接,观察数据变化:
- 如果通讯正常,寄存器值会周期性刷新,显示的是 PLC 数据块里的值。
- 如果出现红色超时标识或异常码,先看通讯帧里的错误代码。
- 如果是 CRC 错误,优先排查波特率、校验位和接线线序。
Modbus 异常码也要记住几个:
- 01:非法功能码,说明 PLC 从站不支持你请求的功能。
- 02:非法数据地址,说明起始地址加寄存器数量越界。
- 03:非法数据值,说明写入的数据内容不合法。
- 04:从站设备故障。
我实际测试时,最常遇到的是异常码 02。原因通常是 Modbus Slave 软件请求的保持寄存器区域超过了 MB_HOLD_REG 定义的数组长度。解决办法是把数组定义大一点,或者把请求的寄存器数量改小。
4.4 写入测试怎么做
Modbus RTU 从站不仅要能读,还要能写。测试 06 功能码时,在 Modbus Slave 软件里切换到写单个寄存器模式,写入一个固定值,比如 1234,然后到 PLC 监控表里看对应数据块地址是否变成 1234。如果写入后 PLC 侧无变化,排查顺序是:
- 检查从站地址。
- 检查寄存器地址映射。
- 检查功能码是否被 MB_SLAVE 支持。
- 检查数据块是否被优化访问(优化块访问可能导致指针无法直接寻址)。
建议:把保持寄存器数组放在非优化数据块中,并取消勾选“优化的块访问”。否则使用指针或直接寻址时可能出现地址偏移错误。
5. 常见报错与排错顺序,照着这个顺序查能省很多时间
CM1241 与 Modbus Slave 软件联调时,看到的现象通常不是报错,而是超时、无响应、偶发断连。这类问题最容易被误判成“程序写错了”,实际上很多是物理层或参数问题。
5.1 第一步:看现象,判断是物理层问题还是协议层问题
先做一个最简单的回环测试:把 USB 转串口线的发送和接收短接,看看电脑串口助手能不能收到自己发的数据。如果能收到,说明串口线、驱动和 COM 号没问题。如果收不到,先换串口线或重装驱动。
回环测试之后,再连接 CM1241,用串口调试助手或 Modbus Slave 软件发标准 Modbus RTU 报文。如果完全无响应,优先看物理接线和端口加载状态。如果偶尔有响应但 CRC 错误,优先看波特率、校验位和线缆屏蔽。
5.2 第二步:看 MB_COMM_LOAD 错误码
如果 CM1241 端口没有加载成功,任何 Modbus 请求都不会有回应。在 TIA Portal 监控 MB_COMM_LOAD 的 ERROR 位和错误码:
- 错误码为 1,检查 BAUD、PARITY 参数是否超出允许范围。
- 错误码为 2,确认端口是否被其他指令占用,比如已经调用过一次 MB_COMM_LOAD 且没有释放。
- 错误码为 3,检查 PORT 硬件标识符是否填写正确。
5.3 第三步:看 MB_SLAVE 状态
MB_SLAVE 的 ERROR 位和 STATUS 字也要监控。STATUS 输出的是 Modbus 异常码。如果 STATUS 为 0,说明从站处理正常,问题大概率在 Modbus Slave 软件侧或物理层。如果 STATUS 不为 0,按照异常码含义去检查功能码、数据地址和数据值。
这里有一个容易被忽略的点:MB_SLAVE 需要持续调用。如果你只在 OB1 里调用了一次,而它正好在某个扫描周期完成了报文处理,下个周期不再处理新请求,Modbus Slave 软件就会超时。建议把 MB_SLAVE 放在循环 OB 中,每个扫描周期都调用。
5.4 第四步:看线缆和端子
很多现场问题出现在端子上。CM1241 的 RS485 端子是弹簧端子或螺丝端子,接线时如果线芯裸露太长,可能碰到相邻端子导致短路。处理办法是把线芯剥短一点,压紧端子,然后轻轻拉一下确认不脱落。
如果是 RS232 模块,注意 TXD 和 RXD 是交叉连接的。PLC 的 TXD 要接电脑串口的 RXD,PLC 的 RXD 接电脑串口的 TXD。如果你用的是成品 USB 转 RS232 线,通常已经内置交叉连接,但如果你自己压端子,很容易做错。
5.5 一个实测中的典型坑:Modbus Slave 软件轮询间隔设置太短
Modbus Slave 软件或配套调试工具里可以设置轮询周期。默认可能设置成 10 毫秒或 100 毫秒。如果轮询速度过快,CM1241 处理不过来,会出现偶发超时。此时先把轮询周期调到 500 毫秒或 1 秒,确认稳定后再调到 100 毫秒、50 毫秒。
不要一上来就追求高频率轮询。PLC 从站不是实时网卡,它有扫描周期和处理时间,尤其是 MB_SLAVE 调用和数据块访问都需要时间。把轮询间隔调大,是排查偶发断连最快的方法。
5.6 排查链路总结
把完整的排查顺序整理成清单,照着做基本能解决 90% 的问题:
- 确认 CM1241 模块型号和接口类型,接线是否按要求完成。
- 确认 USB 转串口线驱动安装成功,COM 号正确。
- 确认 PLC 组态下载成功,模块无硬件诊断错误。
- 确认 MB_COMM_LOAD 调用成功,错误码为 0。
- 确认 MB_SLAVE 从站地址、数据区映射和功能码支持范围。
- 确认 Modbus Slave 软件串口参数、从站 ID、起始地址、寄存器数量。
- 用短距离、低波特率、慢轮询重新测试。
- 如果还不行,用串口助手抓原始报文分析。
6. 多寄存器读写、长数据块映射和上位机对接注意事项
单站测试通过后,实际项目里往往要处理更多寄存器、更长数据块和不同格式的数据。这部分提前理解,能少走很多弯路。
6.1 保持寄存器区域如何扩展
MB_SLAVE 的 MB_HOLD_REG 指向的数据块大小,决定了从站能提供的保持寄存器数量。如果现场设备需要读取 200 个保持寄存器,就把数组长度设为 200 或以上。Modbus 协议里,单次请求的寄存器数量有上限,通常 03 功能码单次最多读 125 个寄存器,16 功能码单次最多写 123 个寄存器。所以即使从站内部定义了 200 个寄存器,上位机也得分批读取。
我在项目里一般会建议上位机开发人员按 100 个寄存器一批的方式读取,避免单帧数据过长,也方便异常排查。
6.2 数据格式和大小端问题
Modbus RTU 保持寄存器是 16 位。如果设备上传的是浮点数或 32 位整数,就涉及寄存器组合问题:是低字在前还是高字在前。CM1241 默认的数据存储是大端还是小端,要结合具体的死循环指令和数据块映射来判断。
我的习惯是,先用 16 位整数做测试,确认读写都正常,再处理浮点数。用 Modbus Slave 软件写入一个已知浮点数,然后在 PLC 侧看两个字的高低关系,直接实测清楚大小端规则,比死记手册更可靠。
6.3 与真实上位机对接时的差异
Modbus Slave 软件测试通过,不等于上位机直接就能通。真实上位机可能有以下不同:
- 扫描周期更短或更长。
- 同时读写多个从站。
- 对异常响应的容忍度不同。
- 寄存器地址起始偏移不一致。
所以从实验室走到现场时,建议把 CM1241 的从站地址、寄存器映射表、功能码清单和串口参数整理成文档,连同 PLC 程序一起交给上位机开发人员。这样就算出现通讯问题,双方也能快速对照排查。
7. 稳定性和边界条件,什么情况下会失败,什么情况不建议用 CM1241
CM1241 做 Modbus RTU 从站能覆盖很多场景,但它不是万能的。了解边界条件,比学会操作步骤更重要。
7.1 性能边界
CM1241 是串口通信模块,不是高速总线。RS485 理论上支持 1200 米,但实际速度和可靠性受线缆质量、端子压接、干扰源影响。波特率越高,对线缆和现场环境要求越严格。不要为了追求速度把波特率设成 115200,除非你已经验证过整个链路的稳定性。
如果通信数据量大、要求毫秒级响应,串口方案不适合。这时候要考虑 PROFINET 或以太网通信模块,或者换用带以太网接口的设备。CM1241 适合的是中低速、长距离、多点仪表采集和中小规模数据交换。
7.2 功能码支持边界
MB_SLAVE 默认支持的 Modbus 功能码是那几种常见的读写功能。如果设备使用了一些特殊功能码,比如 08 诊断、43 封装接口,CM1241 不一定支持。测试前先确认从站设备实际使用的功能码,不要只看设备手册的“支持 Modbus RTU”几个字。
7.3 多主站或并发请求场景
Modbus RTU 是单主站协议,同一总线上通常只有一个主站发起请求。如果你的现场有多个上位机同时读取,需要做权限管理或通过网关转发,不要直接挂在同一条 RS485 总线上,否则会发生帧冲突。CM1241 从站模式本身不具备多主站仲裁机制。
7.4 电源和接地
CM1241 需要 24V 供电,如果现场电源纹波大,可能导致通信模块工作异常,出现偶发超时或初始化失败。建议使用稳定的 24V 开关电源,通信线缆屏蔽层单端接地。实验室测试时常忽略这一点,但现场一定要重视。
8. 最后留几个我每次做这类项目都会先确认的问题
写这篇文章之前,我又按完整流程把 CM1241 加 Modbus Slave 软件测了一遍。每次做这类项目,我都会在动手前和做完后问自己几个问题,如果都能回答清楚,基本不会有大问题。
- 硬件型号是 RS232、RS422还是 RS485?接线端子是不是按照对应接口定义的?
- CPU 固件和 TIA Portal 版本是否兼容 CM1241?
- MB_COMM_LOAD 的错误码是不是 0?
- MB_SLAVE 的从站地址、数据块指针、寄存器数量是否正确?
- Modbus Slave 软件里的串口参数、从站 ID、功能码和地址偏移是否和 PLC 侧一致?
- 现场设备或上位机要求的寄存器地址,是按照 0 起始还是 1 起始?
- 数据块是否禁用了优化访问?指针是否能正常寻址?
- 轮询周期是否合理?连续跑一小时会不会偶发断连?
如果这些问题都能答上来,CM1241 和 Modbus Slave 软件的通讯验证基本已经稳了。再往后就是现场环境对线缆和干扰的考验,那是另一个维度的问题。建议先把这套流程完完整整跑一遍,再考虑批量轮询、多从站和真实设备对接。技术验证这件事,最怕的不是慢,而是跳步。