1. 首页
  2. 物联网相关
  3. 「应用案例」ModBus TCP在PLC工业通信中的实现与应用(TIA)

「应用案例」ModBus TCP在PLC工业通信中的实现与应用(TIA)

  • 发布于 2025-04-28
  • 26 次阅读

随着工业自动化技术的快速发展,高效、可靠的通信协议成为实现设备互联的关键。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 程序块。

image

指令 -> 通讯 -> 其他 -> MODBUS TCP 中找到对应的程序块。

image

一、ModBus TCP 客户端

image

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 关键说明

  1. 功能码 23 的限制:在使用功能码 23 时,MB_DATA_ADDRMB_DATA_LENMB_DATA_PTR 参数不适用,需保持默认值。
  2. 连接类型CONNECT 支持多种结构,具体取决于指令版本和固件的支持(如安全通信需特定版本)。
  3. 状态控制BUSY 仅反映请求状态,不包括连接操作;DONEERROR 状态需结合 STATUS 一起分析。

1.3 ModBus 地址设置

添加 ModBus TCP 程序块后,会自动生成一个对应的系统块。您可以在 程序块 -> 系统块 -> 程序资源 中找到相应的块。在 系统块 中,找到 MB_Unit_ID,用来设置 ModBus 通讯地址。

image

二、ModBus TCP 服务端

image

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*)

image

并手动输入 数据类型 来生成对应的参数。

image

通俗总结

  • 设定连接:手动输入 IP 和端口,适用于灵活的场景。
  • 组态连接:直接引用 CPU 已配置的连接,适用于固定的场景。
  • 共同要求:每个指令需独立连接,仅使用 TCP,避免使用禁用的端口。

3.1 两种连接方式对比

类型 描述 适用场景
设定连接 通过 TCON_IP_v4 结构手动配置连接参数(如 IP、端口等)。 需要动态指定连接参数的场景。
组态连接 使用 CPU 中已配置好的连接(通过 TCON_Configured 结构引用)。 连接参数固定且已预先组态的场景。

3.2 设定连接(TCON_IP_v4 结构)

image

字节位置 参数名 数据类型 默认值 说明
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_IDID
  • IP_PORTRemotePort
  • IP_OCTET_1~4RemoteAddress[1..4]

3.3 组态连接(TCON_Configured 结构)

image

字节位置 参数名 数据类型 默认值 说明
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 控制逻辑实现

  1. 通信使能控制

    • 自锁开关联接 PLC 输入点 I0.0
    • 当开关闭合,PLC启动并保持与 IO 设备的 TCP 连接
    • 当开关断开,PLC断开通信连接,停止控制命令发送
  2. 指令触发控制

    • 点动开关联接 PLC 输入点 I0.1
    • 每次按下开关,PLC发送一次 ModBus TCP 控制命令
    • 控制命令实现分布式 IO 数字输出(DO)状态翻转(0 ↔ 1)
  3. 状态反馈

    • IO 模块的 DO 端口驱动连接的 LED 指示灯
    • LED 亮灭状态实时反映当前 DO 输出状态,便于观察控制效果

三、ModBus TCP获取连接参数与设置

3.1 获取分布式 IO 通信参数

确保分布式 IO模块已设置为 ModBus TCP 工作模式,记录以下关键通信参数:

image

参数 示例值 说明
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)。

image

根据实际需求设置 PLC 安全配置,演示时可选择关闭以简化操作。

image

image

image

image

3.2.2 PLC 网络设置

  • 进入 设备组态 ,选中 PLC 设备,找到 “PROFINET 接口” 中的 “以太网地址” 配置。
  • 手动设置 PLC 的固定内网 IP 地址和子网掩码,例如:
IP地址:10.100.1.110
子网掩码:255.255.0.0

image

3.2.3 添加 ModBus TCP 客户端程序块

进入 PLC 程序块编辑,打开主程序块 Main(OB1)。

image

在“指令”->“通讯”->“其他”中找到“ModBus TCP 客户端”指令,添加到程序中。

image

系统将自动生成对应的数据块(DB),用户可根据需要修改名称和编号。

image

image

3.2.4 创建 TCON_IP_v4 数据块

新建一个全局数据块(DB),命名自定义。

image

将数据类型设置为 TCON_IP_v4 (支持 ModBus TCP 连接所需的 IP 配置结构)。

TCON_IP_v4

image

设置并赋值通信参数,重点填写如下内容:

远程设备 IP 地址(例:10.100.165.100)
远程端口号(502)
连接相关标志位

image

3.2.5 配置 ModBus 设备地址

  • 在系统块对应的 ModBus 客户端数据块(例如 MB_CLIENT_DB)中,找到 MB_Unit_ID 字段。
  • 将其设为分布式 IO 模块的 ModBus 地址(例如 1),确保指令发送的目标设备正确。

image

3.2.6 建立连接及初始化通信参数

在主程序块 Main(OB1)中,填充 ModBus 客户端数据块相关控制参数:

MB_MODE: 1             // 客户端模式
MB_DATA_ADDR: 1        // 数据寄存器起始地址
MB_DATA_LEN: 8         // 读取或写入长度(字)
CONNECT: "CONNECT".Static_1  // 连接控制信号

image

指定数据缓冲区内存区域:

MB_DATA_PTR: P#M100.0 WORD 1  // 内存起始地址及长度

image

3.3 编写控制程序逻辑

  • 监测输入开关 I0.0,自锁开关为通信使能信号,控制是否建立/维持 ModBus TCP 连接。
  • 监测点动开关 I0.1,每次按下即触发 DO 状态反转(读当前状态反转后写入 IO)。
  • 通过 ModBus TCP 发送控制指令,驱动分布式 IO 端口输出。
  • 根据 DO 输出状态控制 LED 灯亮灭,完成状态反馈。
graph LR A[自锁开关 I0.0]-->B{状态为ON?}; B-- yes -->C[建立连接]; B-- NO -->D[断开连接]; C-->E{点动开关I0.1}; E-- 按下 -->F[改变DO状态]; F-->G[发送 ModBus 指令];

程序

四、调试与演示

4.1 程序编写完成后

  • 进行完整编译,确保无任何编译错误。

image

  • 通过以太网将程序下载到 PLC。

image

  • 运行 PLC,观察系统响应。

4.2 运行验证

  • 合上自锁开关,确保与 IO 设备的 ModBus TCP 连接成功。
  • 按下点动开关,每次观察 LED 灯状态变化,实现远程 IO 控制。
  • 断开自锁开关,PLC 断开连接,停止 ModBus 通信。

01

02