随着工业自动化技术的快速发展,高效、可靠的通信协议成为实现设备互联的关键。ModBus TCP 作为一种基于以太网的开放式协议,凭借其简单性、兼容性和低成本优势,在 PLC 工业通信领域得到了广泛应用。本文以西门子 TIA(博图)平台为背景,探讨 ModBus TCP 协议的实现原理、配置方法及典型应用场景,旨在为工业自动化系统集成提供技术参考,并分析其在实时数据传输、设备监控及系统协同中的实践价值。
什么是 TIA(博图)?
TIA(Totally Integrated Automation,全集成自动化) 是西门子推出的工业自动化软件平台,集成了 PLC 编程(如 S7-1200/1500)、HMI 设计(如 WinCC)、驱动配置(如 G120/SINAMICS)及网络通信等功能,提供统一的工程开发环境。其核心软件 TIA Portal(博图) 采用模块化设计,支持从硬件组态、程序编写到仿真调试的全流程,并具备高效的协同工程能力。TIA Portal 以直观的界面、高效的代码复用和强大的兼容性著称,广泛应用于智能制造、过程控制等领域,显著提升工业自动化系统的开发效率与灵活性。
ModBus TCP 程序块
在 TIA 软件中新建项目后,可以通过路径 PLC设备
-> 程序块
-> Main(OB*)
来添加 ModBus TCP 程序块。
在 指令
-> 通讯
-> 其他
-> MODBUS TCP
中找到对应的程序块。
一、ModBus TCP 客户端
1.1 核心参数
参数 | 声明 | 数据类型 | 说明 |
---|---|---|---|
REQ | Input | BOOL | 发送请求的触发信号(1=发送查询,执行期间数据块被锁定,重复触发无效) |
DISCONNECT | Input | BOOL | 连接状态:0=建立连接,1=断开连接(成功后,STATUS=0003) |
MB_MODE | Input | USINT | 功能模式选择(读/写/诊断),功能码 23 无效。 |
MB_DATA_ADDR | Input | UDINT | 数据地址(功能码 23 无效) |
MB_DATA_LEN | Input | UINT | 数据长度(位数/字数,功能码 23 无效) |
MB_DATA_PTR | InOut | VARIANT | 数据缓存指针(功能码 23 无效) |
CONNECT | InOut | VARIANT | 可以使用以下结构(系统数据类型): TCON_IP_v4:包括建立指定连接时所需的所有地址参数。使用 TCON_IP_v4 时,可通过调用指令“MB_CLIENT”建立连接。 TCON_Configured:包括所组态连接的地址参数。使用 TCON_Configured 时,将使用下载硬件配置后由 CPU 创建的已有连接。 |
DONE | Out | BOOL | 最后一个 ModBus 操作成功完成时,设置为 1 。 |
BUSY | Out | BOOL | 请求状态: 0:无进行中的请求。 1:正在处理请求。 注意:连接建立/断开期间不设定状态。 |
ERROR | Out | BOOL | 错误状态:0:无错误;1:发生错误。 |
STATUS | Out | WORD | 状态码 |
1.2 关键说明
- 功能码 23 的限制:在使用功能码 23 时,
MB_DATA_ADDR
、MB_DATA_LEN
、MB_DATA_PTR
参数不适用,需保持默认值。 - 连接类型:
CONNECT
支持多种结构,具体取决于指令版本和固件的支持(如安全通信需特定版本)。 - 状态控制:
BUSY
仅反映请求状态,不包括连接操作;DONE
和ERROR
状态需结合STATUS
一起分析。
1.3 ModBus 地址设置
添加 ModBus TCP 程序块后,会自动生成一个对应的系统块。您可以在 程序块
-> 系统块
-> 程序资源
中找到相应的块。在 系统块
中,找到 MB_Unit_ID
,用来设置 ModBus 通讯地址。
二、ModBus TCP 服务端
1.1 核心参数
参数 | 声明 | 数据类型 | 说明 |
---|---|---|---|
DISCONNECT | Input | BOOL | 用于管理与伙伴模块的连接。 0: 建立连接; 1: 终止连接(此时不进行其他操作)。 成功终止后,STATUS 输出 0003。 |
MB_HOLD_REG | InOut | VARIANT | 指向 Modbus 保持寄存器的指针,必须大于两个字节。存储区可通过 Modbus 功能 3、6、16 和 23 访问。可使用全局数据块或位存储器。 |
CONNECT | InOut | VARIANT | 指向连接描述的指针。支持结构: TCON_IP_v4: 包含建立连接所需的地址参数(默认 0.0.0.0)。 TCON_Configured: 组态连接的地址参数。 |
NDR | Output | BOOL | 新数据是否就绪: 0: 无新数据; 1: 有新数据来自 Modbus 客户端。 |
DR | Output | BOOL | 数据读取状态: 0: 未读取数据; 1: 数据已从 Modbus 客户端读取。 |
ERROR | Output | BOOL | 指令执行出错时设置为 1,错误原因由 STATUS 参数提供。 |
STATUS | Output | WORD | 状态信息。 |
三、 连接参数(CONNECT 参数)
PLC 的 ModBus TCP 可使用配置连接和组态连接两种模式。在使用前需要手动添加一个 数据块(DB*)
并手动输入 数据类型
来生成对应的参数。
通俗总结
- 设定连接:手动输入 IP 和端口,适用于灵活的场景。
- 组态连接:直接引用 CPU 已配置的连接,适用于固定的场景。
- 共同要求:每个指令需独立连接,仅使用 TCP,避免使用禁用的端口。
3.1 两种连接方式对比
类型 | 描述 | 适用场景 |
---|---|---|
设定连接 | 通过 TCON_IP_v4 结构手动配置连接参数(如 IP、端口等)。 |
需要动态指定连接参数的场景。 |
组态连接 | 使用 CPU 中已配置好的连接(通过 TCON_Configured 结构引用)。 |
连接参数固定且已预先组态的场景。 |
3.2 设定连接(TCON_IP_v4 结构)
字节位置 | 参数名 | 数据类型 | 默认值 | 说明 |
---|---|---|---|---|
0-1 | InterfaceID |
UINT (HW_ANY) | - | 本地网卡标识(0-65535)。 |
2-3 | ID |
UINT (CONN_OUC) | - | 唯一连接 ID(范围 1-4095),不同指令实例不得重复。 |
4 | ConnectionType |
BYTE | 11 | 必须为 11(TCP) ,其他值会报错。 |
5 | ActiveEstablished |
BOOL | TRUE | TRUE 表示主动发起连接(客户端模式)。 |
6-9 | RemoteAddress |
ARRAY[1..4] of BYTE | - | 服务器 IP 地址 例如 192.168.0.1 对应为:ADDR[1]:192 ADDR[2]:168 ADDR[3]:0 ADDR[4]:1 |
10-11 | RemotePort |
UINT | 502 | 服务器端口(1-49151),Modbus 默认 502。 |
12-13 | LocalPort |
UINT | 0 | 本地端口(范围 1-49151),0 表示随机分配。 |
V2.1 版本迁移提示
CONNECT_ID
→ID
IP_PORT
→RemotePort
IP_OCTET_1~4
→RemoteAddress[1..4]
3.3 组态连接(TCON_Configured 结构)
字节位置 | 参数名 | 数据类型 | 默认值 | 说明 |
---|---|---|---|---|
0-1 | InterfaceID |
UINT | - | 本地网卡标识(范围 0-65535)。 |
2-3 | ID |
UINT | - | 输入 CPU 中已组态连接的 ID(1-4095)。 |
4 | ConnectionType |
BYTE | 254 | 必须为 254,表示使用组态连接。 |
实验演示:基于 ModBus TCP 的 PLC 与分布式 IO 通信控制
演示采用 PLC 连接 IO 设备,并且 PLC 连接两个开关用于控制 PLC 允许通过 ModBus 连接 IO 设备,以及发送控制指令。IO 端连接 LED 指示灯,用以直观显示控制指令是否被接收。
一、硬件配置
1.1 主要设备清单
设备类型 | 型号规格 |
---|---|
PLC 控制器 | S7-1200(1214C DC/DC/DC) |
分布式 IO 模块 | M31-AXAX8080G |
控制开关 | 自锁开关(常开型)、点动开关 |
状态指示 | DC 12V LED 指示灯 |
1.2 硬件连接示意
-
PLC 输入端口接入两个开关:
- 自锁开关连接至 I0.0(通信使能开关)
- 点动开关连接至 I0.1(触发指令发送)
-
PLC 数字输出 DO 连接至 LED 指示灯,用于显示被控 IO 输出状态。
-
PLC 和分布式 IO通过以太网连接,确保在同一子网内。
二、演示环境
2.1 通信架构
-
网络环境:PLC 与分布式 IO 设备处于同一局域网(同一子网)。
-
通信角色分配:
- 分布式 IO模块工作于 ModBus TCP 服务器(Server)模式,监听端口502。
- S7-1200 PLC工作于 ModBus TCP 客户端(Client)模式,主动发起连接。
2.2 控制逻辑实现
-
通信使能控制:
- 自锁开关联接 PLC 输入点 I0.0
- 当开关闭合,PLC启动并保持与 IO 设备的 TCP 连接
- 当开关断开,PLC断开通信连接,停止控制命令发送
-
指令触发控制:
- 点动开关联接 PLC 输入点 I0.1
- 每次按下开关,PLC发送一次 ModBus TCP 控制命令
- 控制命令实现分布式 IO 数字输出(DO)状态翻转(0 ↔ 1)
-
状态反馈:
- IO 模块的 DO 端口驱动连接的 LED 指示灯
- LED 亮灭状态实时反映当前 DO 输出状态,便于观察控制效果
三、ModBus TCP获取连接参数与设置
3.1 获取分布式 IO 通信参数
确保分布式 IO模块已设置为 ModBus TCP 工作模式,记录以下关键通信参数:
参数 | 示例值 | 说明 |
---|---|---|
IP 地址 | 10.100.165.100 | IO 设备的局域网 IP |
端口号 | 502 | 标准 ModBus TCP 端口 |
ModBus 地址 | 1 | 设备单元标识号(Unit ID) |
3.2 PLC 通信参数及程序配置
3.2.1 PLC初始化
在 TIA Portal 新建项目,选择对应的 PLC 型号及版本(例如 S7-1200 1214C DC/DC/DC)。
根据实际需求设置 PLC 安全配置,演示时可选择关闭以简化操作。
3.2.2 PLC 网络设置
- 进入 设备组态 ,选中 PLC 设备,找到 “PROFINET 接口” 中的 “以太网地址” 配置。
- 手动设置 PLC 的固定内网 IP 地址和子网掩码,例如:
IP地址:10.100.1.110
子网掩码:255.255.0.0
3.2.3 添加 ModBus TCP 客户端程序块
进入 PLC 程序块编辑,打开主程序块 Main(OB1)。
在“指令”->“通讯”->“其他”中找到“ModBus TCP 客户端”指令,添加到程序中。
系统将自动生成对应的数据块(DB),用户可根据需要修改名称和编号。
3.2.4 创建 TCON_IP_v4 数据块
新建一个全局数据块(DB),命名自定义。
将数据类型设置为 TCON_IP_v4 (支持 ModBus TCP 连接所需的 IP 配置结构)。
TCON_IP_v4
设置并赋值通信参数,重点填写如下内容:
远程设备 IP 地址(例:10.100.165.100)
远程端口号(502)
连接相关标志位
3.2.5 配置 ModBus 设备地址
- 在系统块对应的 ModBus 客户端数据块(例如 MB_CLIENT_DB)中,找到
MB_Unit_ID
字段。 - 将其设为分布式 IO 模块的 ModBus 地址(例如
1
),确保指令发送的目标设备正确。
3.2.6 建立连接及初始化通信参数
在主程序块 Main(OB1)中,填充 ModBus 客户端数据块相关控制参数:
MB_MODE: 1 // 客户端模式
MB_DATA_ADDR: 1 // 数据寄存器起始地址
MB_DATA_LEN: 8 // 读取或写入长度(字)
CONNECT: "CONNECT".Static_1 // 连接控制信号
指定数据缓冲区内存区域:
MB_DATA_PTR: P#M100.0 WORD 1 // 内存起始地址及长度
3.3 编写控制程序逻辑
- 监测输入开关 I0.0,自锁开关为通信使能信号,控制是否建立/维持 ModBus TCP 连接。
- 监测点动开关 I0.1,每次按下即触发 DO 状态反转(读当前状态反转后写入 IO)。
- 通过 ModBus TCP 发送控制指令,驱动分布式 IO 端口输出。
- 根据 DO 输出状态控制 LED 灯亮灭,完成状态反馈。
四、调试与演示
4.1 程序编写完成后
- 进行完整编译,确保无任何编译错误。
- 通过以太网将程序下载到 PLC。
- 运行 PLC,观察系统响应。
4.2 运行验证
- 合上自锁开关,确保与 IO 设备的 ModBus TCP 连接成功。
- 按下点动开关,每次观察 LED 灯状态变化,实现远程 IO 控制。
- 断开自锁开关,PLC 断开连接,停止 ModBus 通信。