『7x24小时有问必答』
一、通信概述
Modbus Poll 是一款Modbus 主站模拟/测试软件,运行在 PC 上,用于测试 Modbus 从站设备。在此场景中,S7-1200 作为 Modbus TCP 服务器(从站),Modbus Poll 作为Modbus TCP 客户端(主站)

1.1 通信架构

1.png

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
PM100.0 BYTE 100
离散输入/输出区
HOLD_REG
PDB1.DBW0 BYTE 200
保持寄存器区
MB_HOLD_REG
PDB1.DBW0
保持寄存器指针

第四步:配置 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 报文格式

2.png

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.2

END_STRUCT

END_DATA_BLOCK

// 主程序 OB1

FUNCTION_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";            // 10003

6.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 客户端

配置流程简图

3.png

重要提示

S7-1200 作为 Modbus TCP 服务器,被动监听连接IP 地址必须在同一网段,不能冲突端口号默认为 502,如有修改需同步配置DB 块必须禁用优化块访问,使用绝对地址Modbus Poll 中 Slave ID 通常为1PC 防火墙需允许 502 端口,否则连接会被阻止注意地址映射关系,Modbus 地址与 PLC 地址要对应

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码