1.2 通信角色说明
设备 | 角色 | 功能 |
| Modbus Poll | 客户端/主站 | 发起读/写请求 |
| S7-1200 | 服务器/从站 | 响应读/写请求 |
1.3 通信特点
特性 | 说明 |
通信类型 | Modbus TCP(基于 TCP/IP) |
功能码 | 01/02/03/04/05/06/15/16 |
传输距离 | 标准 100 米(可扩展) |
通信周期 | 100ms ~ 1s 可调 |
端口号 | 默认 502 |
连接数 | S7-1200 最多支持 8 个 Modbus TCP 连接 |
---
二、硬件与软件要求
2.1 软件要求
软件 | 最低版本 | 推荐版本 | 说明 |
TIA Portal(博途) | V15.1 | V17/V18/V19 | S7-1200 组态 |
S7-1200 固件 | V2.0 | V4.0+ | 支持 Modbus TCP 服务器 |
Modbus Poll | V6.0 | V9.0+ | Modbus 主站测试软件 |
MB_SERVER 库 | V2.0+ | 最新版本 | TIA Portal 内置 |
操作系统 | Windows 7/10/11 | Windows 10/11 | 运行 Modbus Poll |
2.2 硬件要求
设备 | 型号 | 说明 |
| S7-1200 | CPU 1212C/1214C/1215C/1217C | 带 PROFINET 接口 |
| PC 电脑 | 任意 Windows PC | 运行 Modbus Poll |
| 网线 | CAT5e 及以上 | 标准工业以太网线 |
| 交换机 | 可选 | 多设备连接时使用 |
2.3 S7-1200 Modbus TCP 连接限制
S7-1200 型号 | 最大 Modbus TCP 连接数 | 说明 |
CPU 1211C | 8 个 | 共享通信资源 |
CPU 1212C | 8 个 | 共享通信资源 |
CPU 1214C | 8 个 | 共享通信资源 |
CPU 1215C | 8 个 | 共享通信资源 |
CPU 1217C | 8 个 | 共享通信资源 |
---
三、配置步骤(S7-1200 侧)
第一步:创建 TIA Portal 项目
打开TIA Portal软件
点击「创建新项目」,输入项目名称
选择「添加新设备」
第二步:添加 S7-1200 CPU
添加 PLC:
选择「控制器」→「SIMATIC S7-1200」→「CPU」
选择具体型号和固件版本
配置 PROFINET 接口:
进入「设备视图」→ 点击 CPU 上的 PROFINET 接口
在「属性」→「以太网地址」中设置:
IP 地址:如 192.168.0.1
子网掩码:255.255.255.0
第三步:添加 Modbus TCP 通信块
打开程序块:
展开「程序块」→「系统块」
找到「Communication」→「Modbus TCP」
添加 MB_SERVER 块:
拖拽「MB_SERVER」到 OB1 或 FB/FC 中
系统会自动生成背景数据块(如 DB3)
配置 MB_SERVER 参数:
参数 | 设置值 | 说明 |
| CONNECT | 新建连接 | 指向 Modbus TCP 连接配置 |
| DISC_IO | | 离散输入/输出区 |
| HOLD_REG | | 保持寄存器区 |
| MB_HOLD_REG | | 保持寄存器指针 |
第四步:配置 Modbus TCP 连接
创建连接配置:
在「程序块」→「系统块」→「Modbus TCP」
右键「添加新连接」
配置连接参数:
参数 | 设置值 | 说明 |
| 连接 ID | | 唯一连接标识 |
| IP 地址 | 0.0.0.0 | 监听所有 IP(或指定 PC IP) |
| 端口号 | 502 | Modbus TCP 默认端口 |
| 连接类型 | TCP | 选择 TCP 连接 |
| 主动建立连接 | 否 | PLC 作为服务器被动监听 |
第五步:创建数据块
创建 DB 块:
右键「程序块」→「添加新块」→「数据块」
命名为「Modbus_Data」
取消「优化的块访问」,使用绝对地址
定义变量:
变量名称 | 数据类型 | 地址 | 说明 |
Coil_Out | Array[0..99] Of Bool | DB1.DBX0.0 | 线圈输出区 |
Discrete_In | Array[0..99] Of Bool | DB1.DBX100.0 | 离散输入区 |
Hold_Reg | Array[0..99] Of Word | DB1.DBW200 | 保持寄存器区 |
Input_Reg | Array[0..99] Of Word | DB1.DBW400 | 输入寄存器区 |
第六步:编写通信程序
// 主程序 OB1// 调用 MB_SERVER 块"MB_Server_Instance"( CONNECT := 'Modbus_TCP_Connection', // 连接配置 DISC_IO := P#"Modbus_Data".Coil_Out, // 离散 I/O 区 HOLD_REG := P#"Modbus_Data".Hold_Reg[0], // 保持寄存器区 MB_HOLD_REG := P#"Modbus_Data".Hold_Reg[0], // 保持寄存器指针 MB_MODE := 0, // 服务器模式 BUSY => MB_Busy, // 忙标志 ERROR => MB_Error, // 错误标志 STATUS => MB_Status // 状态代码);第七步:编译并下载
编译项目:
点击「编译」→「编译全部」
检查是否有错误
下载 PLC 程序:
连接 S7-1200 PLC
下载程序到 PLC
将 PLC 切换到RUN 模式
---
四、Modbus Poll 软件配置
第一步:安装 Modbus Poll
下载 Modbus Poll 软件(https://www.modbustools.com)
安装软件到 PC
启动 Modbus Poll
第二步:配置连接
点击「Connection」→「Connect」配置连接参数:参数 | 设置值 | 说明 |
| Connection | Modbus TCP | 选择 TCP 连接 |
| TCP/IP Setup | 点击配置 | 进入 IP 配置 |
| IP Address | 192.168.0.1 | S7-1200 的 IP 地址 |
| Port | 502 | Modbus TCP 默认端口 |
| Slave ID | 1 | Modbus 从站地址 |
第三步:配置读写设置
点击「Setup」→「Read/Write Definition」配置读写参数:参数 | 设置值 | 说明 |
| Function | 03-Read Holding Register | 功能码 |
| Address | 200 | 起始地址(对应DB1.DBW200) |
| Quantity | 10 | 读取数量 |
| Scan Rate | 1000 ms | 扫描周期 |
| Slave ID | 1 | 从站地址 |
第四步:开始通信
点击「Connection」→「Connect」建立连接
查看数据显示窗口
监控通信状态
---
五、数据交换格式详解
5.1 Modbus 功能码
功能码 | 名称 | S7-1200 映射 | 说明 |
01 | 读线圈 | %Q/M 区 | 读布尔输出 |
02 | 读离散输入 | %I/M 区 | 读布尔输入 |
03 | 读保持寄存器 | DB 块 | 读写字数据 |
04 | 读输入寄存器 | DB 块/IW 区 | 读字数据 |
05 | 写单线圈 | %Q/M 区 | 写布尔输出 |
06 | 写单寄存器 | DB 块 | 写字数据 |
15 | 写多线圈 | %Q/M 区 | 写多个布尔 |
16 | 写多寄存器 | DB 块 | 写多个字 |
5.2 地址映射表(典型配置)
Modbus 地址 | 功能码 | S7-1200 地址 | 数据类型 | 说明 |
00001-00100 | 01 | DB1.DBX0.0-DB1.DBX12.3 | Bool | 线圈输出 |
10001-10100 | 02 | DB1.DBX100.0-DB1.DBX112.3 | Bool | 离散输入 |
40001-40100 | 03 | DB1.DBW200-DB1.DBW398 | Word | 保持寄存器 |
30001-30100 | 04 | DB1.DBW400-DB1.DBW598 | Word | 输入寄存器 |
5.3 Modbus TCP 报文格式
5.4 典型读写示例
读取保持寄存器:
请求:00 01 00 00 00 06 01 03 00 C8 00 0A (事务 ID)(协议)(长度)(从站)(功能码)(起始地址)(数量)响应:00 01 00 00 00 17 01 03 14 [数据 20 字节]写入单寄存器:
请求:00 02 00 00 00 09 01 06 00 C8 03 E8响应:00 02 00 00 00 06 01 06 00 C8 03 E8---
六、编程示例
6.1 完整服务器程序(SCL)
// 数据块 DB1 "Modbus_Server_Data"(取消优化块访问)DATA_BLOCK "Modbus_Server_Data"STRUCT // 线圈区(功能码 01/05/15) Coil_Out : Array[0..99] Of Bool; // DB1.DBX0.0 // 离散输入区(功能码 02) Discrete_In : Array[0..99] Of Bool; // DB1.DBX100.0 // 保持寄存器区(功能码 03/06/16) Hold_Reg : Array[0..99] Of Word; // DB1.DBW200 // 输入寄存器区(功能码 04) Input_Reg : Array[0..99] Of Word; // DB1.DBW400 // 通信状态 Server_Ready : Bool; // DB1.DBX600.0 Comm_Error : Bool; // DB1.DBX600.1 Error_Code : Word; // DB1.DBW602 Client_Connected : Bool; // DB1.DBX600.2END_STRUCTEND_DATA_BLOCK// 主程序 OB1FUNCTION_BLOCK "FB_Modbus_Server"VAR // MB_SERVER 实例 "MB_Server_Instance" : MB_SERVER; // 连接配置 "Modbus_TCP_Connection" : TCON_Modbus; // 状态变量 MB_Busy : Bool; MB_Error : Bool; MB_Status : Word;END_VAR// 连接配置初始化"Modbus_TCP_Connection".connectionId := W161;"Modbus_TCP_Connection".connectionType := W161; // TCP"Modbus_TCP_Connection".activeEstablish := FALSE; // 被动监听"Modbus_TCP_Connection".localPort := 502;// 调用 MB_SERVER 块"MB_Server_Instance"( CONNECT := 'Modbus_TCP_Connection', DISC_IO := P#"Modbus_Server_Data".Coil_Out, HOLD_REG := P#"Modbus_Server_Data".Hold_Reg[0], MB_HOLD_REG := P#"Modbus_Server_Data".Hold_Reg[0], BUSY => MB_Busy, ERROR => MB_Error, STATUS => MB_Status);// 状态处理IF MB_Error THEN "Modbus_Server_Data".Comm_Error := TRUE; "Modbus_Server_Data".Error_Code := MB_Status;ELSE "Modbus_Server_Data".Comm_Error := FALSE;END_IF;// 服务器就绪标志"Modbus_Server_Data".Server_Ready := NOT MB_Busy;6.2 数据映射处理
// 将 PLC 内部数据映射到 Modbus 寄存器区// 保持寄存器映射"Modbus_Server_Data".Hold_Reg[0] := "Motor_Speed_Setpoint"; // 40001"Modbus_Server_Data".Hold_Reg[1] := "Motor_Speed_Actual"; // 40002"Modbus_Server_Data".Hold_Reg[2] := WORD("Motor_Current"); // 40003"Modbus_Server_Data".Hold_Reg[3] := WORD("Motor_Temp"); // 40004"Modbus_Server_Data".Hold_Reg[4] := "Fault_Code"; // 40005"Modbus_Server_Data".Hold_Reg[5] := "Part_Count"; // 40006// 线圈映射"Modbus_Server_Data".Coil_Out[0] := "Motor_Start"; // 00001"Modbus_Server_Data".Coil_Out[1] := "Motor_Stop"; // 00002"Modbus_Server_Data".Coil_Out[2] := "Motor_Reset"; // 00003"Modbus_Server_Data".Coil_Out[3] := "Alarm_Reset"; // 00004// 离散输入映射"Modbus_Server_Data".Discrete_In[0] := "Motor_Running"; // 10001"Modbus_Server_Data".Discrete_In[1] := "Motor_Fault"; // 10002"Modbus_Server_Data".Discrete_In[2] := "System_Ready"; // 100036.3 读取 Modbus Poll 写入的数据
// 从 Modbus 寄存器区读取数据到 PLC 内部变量// 读取 Modbus Poll 写入的设定值"Motor_Speed_Setpoint" := INT("Modbus_Server_Data".Hold_Reg[0]);"Motor_Start" := "Modbus_Server_Data".Coil_Out[0];"Motor_Stop" := "Modbus_Server_Data".Coil_Out[1];"Motor_Reset" := "Modbus_Server_Data".Coil_Out[2];// 控制逻辑IF "Motor_Start" AND NOT "Motor_Stop" AND NOT "Motor_Fault" THEN "Motor_Running" := TRUE;END_IF;IF "Motor_Stop" OR "Motor_Fault" THEN "Motor_Running" := FALSE;END_IF;IF "Motor_Reset" THEN "Fault_Code" := 0; "Motor_Fault" := FALSE;END_IF;---
七、通信状态监控与诊断
7.1 MB_SERVER 状态代码
状态代码 | 含义 | 解决方案 |
| 无错误 | 正常 |
| 连接超时 | 检查网络连接 |
| 连接拒绝 | 检查 IP 和端口 |
| 无连接 | 等待客户端连接 |
| 连接断开 | 检查网络稳定性 |
| 数据错误 | 检查寄存器地址 |
| 功能码错误 | 检查功能码支持 |
| 从站地址错误 | 检查 Slave ID |
| 数据长度错误 | 检查数据长度配置 |
7.2 Modbus Poll 状态显示
显示 | 颜色 | 含义 |
数值显示 | 黑色 | 正常数据 |
数值显示 | 红色 | 通信错误 |
状态栏 | 绿色 | 连接正常 |
状态栏 | 红色 | 连接断开 |
Tx 计数器 | 递增 | 发送请求 |
Rx 计数器 | 递增 | 接收响应 |
Err 计数器 | 递增 | 通信错误 |
7.3 TIA Portal 在线监控
在 TIA Portal 中查看 CPU 的「在线与诊断」
查看「通信」→「Modbus TCP」连接状态
查看通信错误信息
监控 DB 块数据变化
---
八、常见问题与解决方案
问题现象 | 可能原因 | 解决方案 |
无法连接 PLC | IP 地址不在同一网段 | 检查并统一 IP 网段 |
连接超时 | 端口号错误 | 确认端口为 502 |
连接被拒绝 | MB_SERVER 未运行 | 检查 PLC 程序和 RUN 模式 |
数据读取失败 | 寄存器地址错误 | 检查地址映射(注意偏移) |
功能码不支持 | 功能码配置错误 | 确认支持的功能码 |
从站地址错误 | Slave ID 不匹配 | 确认从站地址为 1 |
频繁通信中断 | 网线质量差 | 更换高质量网线 |
数据值异常 | 字节顺序错误 | 检查高低字节顺序 |
DB 块访问失败 | 优化块访问启用 | 禁用优化块访问 |
多个客户端冲突 | 连接数超限 | 减少连接或升级 PLC |
MB_SERVER 报错 | 连接配置错误 | 检查 CONNECT 参数 |
防火墙阻止 | PC 防火墙设置 | 关闭防火墙或添加例外 |
---
九、配置要点总结
配置项 | 关键要点 |
通信协议 | Modbus TCP(S7-1200 作为服务器) |
IP 地址 | 同一网段,不能冲突 |
端口号 | 默认 502 |
从站地址 | Modbus Poll 中 Slave ID 通常为 1 |
连接配置 | MB_SERVER 的 CONNECT 参数正确 |
数据指针 | 使用 P格式(如 PDB1.DBW0 BYTE 200) |
DB 块优化 | 必须禁用优化块访问 |
功能码 | 01/02/03/04/05/06/15/16 |
地址映射 | 注意 Modbus 地址与 PLC 地址对应 |
运行模式 | PLC 需切换到 RUN 模式 |
防火墙 | PC 防火墙需允许 502 端口 |
网络连接 | 使用 CAT5e 及以上标准网线 |
---
十、推荐参考资料
资料名称 | 来源 |
S7-1200 Modbus TCP 通信手册 | 西门子工业支持中心 |
MB_SERVER 功能块使用说明 | TIA Portal 帮助文档 |
Modbus Poll 用户手册 | Modbus Tools 官网 |
Modbus TCP 协议规范 | Modbus 组织官网 |
---
十一、总结
S7-1200 与 Modbus Poll 的通信是Modbus TCP 从站测试的经典方案,具有以下优势:
优势 | 说明 |
标准协议 | Modbus TCP 是开放标准,兼容性好 |
配置简单 | TIA Portal 内置 MB_SERVER 块 |
测试方便 | Modbus Poll 直观显示数据 |
成本优化 | 无需额外通信模块 |
扩展灵活 | 支持多个客户端连接 |
兼容性好 | 支持标准 Modbus TCP 客户端 |
配置流程简图
重要提示
S7-1200 作为 Modbus TCP 服务器,被动监听连接IP 地址必须在同一网段,不能冲突端口号默认为 502,如有修改需同步配置DB 块必须禁用优化块访问,使用绝对地址Modbus Poll 中 Slave ID 通常为1PC 防火墙需允许 502 端口,否则连接会被阻止注意地址映射关系,Modbus 地址与 PLC 地址要对应 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!