建云 2025-7-18 08:00:15 | 显示全部楼层 | 阅读模式
抖音粉丝群1
『7x24小时有问必答』

西门子S7-1200 PLC通过TIA Portal编程环境中的Modbus TCP指令实现Modbus TCP/IP通信。主要指令包括

MB_SERVER
(Modbus服务器)和
MB_CLIENT
(Modbus客户端)。

1. MB_SERVER指令

MB_SERVER

指令使S7-1200 PLC作为Modbus TCP服务器(从站),被动接受来自Modbus客户端的请求,支持读/写保持寄存器、输入寄存器、线圈和离散输入。

输入参数

参数数据类型描述DISCONNECTBool控制连接断开。
0
:接受客户端连接;
1
:断开连接。CONNECT_IDUInt连接ID,范围1-65535,需与客户端匹配。IP_PORTUInt通信端口,默认
502
(Modbus TCP标准端口)。

输出参数

参数数据类型描述NDRBool新数据指示,客户端写入数据时置
1
DRBool数据读取指示,客户端读取数据时置
1
ERRORBool错误标志,通信错误时置
1
STATUSWord状态码,指示具体错误信息。

数据块参数

参数数据类型描述MB_HOLD_REGVariant指向保持寄存器的数据块(如DB2),存储客户端读/写数据。MB_COILVariant指向线圈数据块,存储布尔值。MB_INPUTVariant指向输入寄存器数据块(只读)。MB_DISCRETEVariant指向离散输入数据块(只读)。

工作原理

客户端发送Modbus功能码(如

03

读保持寄存器,

06

写单个寄存器)。

MB_SERVER

根据功能码处理请求,将数据存储到指定的数据块或从数据块读取数据。

支持的功能码:

01

(读线圈)、

02

(读离散输入)、

03

(读保持寄存器)、

04

(读输入寄存器)、

05

(写单个线圈)、

06

(写单个寄存器)、

15

(写多个线圈)、

16

(写多个寄存器)。

编程步骤

    创建数据块

    在TIA Portal中创建数据块(如DB2),用于保持寄存器。

    禁用“优化块访问”以确保Modbus地址映射正确。

    示例:DB2包含数组

    ARRAY[0..99] OF Word
    ,对应Modbus地址
    40001-40100

    添加MB_SERVER

    在“Main [OB1]”中拖动

    MB_SERVER
    指令。

    配置参数:

    DISCONNECT
    :设为
    0

    IP_PORT
    :设为
    502

    MB_HOLD_REG
    :指向DB2。

    可选:配置

    MB_COIL
    MB_INPUT
    MB_DISCRETE

    下载并测试

    下载程序到PLC。

    使用Modbus客户端工具(如Modbus Poll)连接PLC的IP地址和端口,测试读/写操作。

注意事项

地址映射

:Modbus地址

40001

对应数据块的

DBW0

,确保数据类型匹配。

位顺序

:S7-1200的位地址与Modbus标准可能不同,建议使用布尔数组。

连接限制

:S7-1200支持有限的并发连接(通常为8个),视CPU型号而定。

2. MB_CLIENT指令

MB_CLIENT

指令使S7-1200 PLC作为Modbus TCP客户端(主站),主动向Modbus服务器发送读/写请求。

输入参数

参数数据类型描述REQBool请求触发,上升沿触发通信。MB_MODEUSInt操作模式:
0
(读)、
1
(写)、
2
(诊断)。IP_ADDRESSDWord服务器IP地址(如
16#C0A80002
表示
192.168.0.2
)。IP_PORTUInt服务器端口,默认
502
DATA_ADDRUIntModbus寄存器起始地址(如
40001
)。DATA_LENUInt数据长度(寄存器数量,最大124)。DATA_PTRVariant指向存储读/写数据的数据块。

输出参数

参数数据类型描述DONEBool操作完成标志,成功时置
1
BUSYBool通信进行中,置
1
ERRORBool错误标志,通信失败时置
1
STATUSWord状态码,指示具体错误信息。

工作原理

MB_CLIENT

根据

MB_MODE

DATA_ADDR

生成Modbus请求,发送到服务器。

支持的功能码:

01

(读线圈)、

02

(读离散输入)、

03

(读保持寄存器)、

04

(读输入寄存器)、

05

(写单个线圈)、

06

(写单个寄存器)、

15

(写多个线圈)、

16

(写多个寄存器)。

数据存储在

DATA_PTR

指向的数据块中。

编程步骤

    创建数据块

    创建数据块(如DB3),用于存储读/写数据。

    禁用“优化块访问”。

    示例:DB3包含数组

    ARRAY[0..49] OF Word
    ,用于存储50个寄存器数据。

    添加MB_CLIENT

    在“Main [OB1]”中拖动

    MB_CLIENT
    指令。

    配置参数:

    REQ
    :连接到触发信号(如
    M0.0
    )。

    MB_MODE
    :设为
    0
    (读)或
    1
    (写)。

    IP_ADDRESS
    :输入服务器IP(如
    16#C0A80002
    )。

    IP_PORT
    :设为
    502

    DATA_ADDR
    :输入寄存器地址(如
    40001
    )。

    DATA_LEN
    :设置读取/写入的寄存器数量。

    DATA_PTR
    :指向DB3。

    控制逻辑

    使用定时器或条件触发

    REQ
    ,避免连续触发。

    检查

    DONE
    ERROR
    STATUS
    ,处理通信结果。

    下载并测试

    下载程序到PLC。

    使用Modbus服务器工具(如Modbus Slave)模拟服务器,验证读/写操作。

注意事项

请求触发

REQ

需为上升沿触发,避免重复发送请求。

数据长度

:一次请求最多读取124个寄存器,需分块处理大数据量。

错误处理

:通过

STATUS

解析错误代码(如

16#8183

表示连接失败)。

超时

:若服务器无响应,调整通信超时时间(在PLC属性中设置)。

3. 编程示例

示例1:S7-1200作为Modbus服务器

// 数据块 DB2:保持寄存器

DATA_BLOCK "DB_Holding"

{ S7_Optimized_Access := 'FALSE' }

VAR

Registers : ARRAY[0..99] OF Word;

END_VAR

END_DATA_BLOCK

// 在OB1中调用MB_SERVER

NETWORK

CALL "MB_SERVER"

DISCONNECT := FALSE

CONNECT_ID := 1

IP_PORT := 502

MB_HOLD_REG:= "DB_Holding"

NDR => M0.0

DR => M0.1

ERROR => M0.2

STATUS => MW100

客户端可通过地址

40001-40100

读/写DB2的数据。

示例2:S7-1200作为Modbus客户端

// 数据块 DB3:读/写数据

DATA_BLOCK "DB_Data"

{ S7_Optimized_Access := 'FALSE' }

VAR

Data : ARRAY[0..49] OF Word;

END_VAR

END_DATA_BLOCK

// 在OB1中调用MB_CLIENT

NETWORK

CALL "MB_CLIENT"

REQ := M0.0

MB_MODE := 0 // 读

IP_ADDRESS := 16#C0A80002 // 192.168.0.2

IP_PORT := 502

DATA_ADDR := 40001

DATA_LEN := 50

DATA_PTR := "DB_Data"

DONE => M1.0

BUSY => M1.1

ERROR => M1.2

STATUS => MW200

读取服务器地址

192.168.0.2
的寄存器
40001-40050
,存储到DB3。


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

本版积分规则

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

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

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


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