- {{item.name}}
和modScan进行MODBUS TCP通信
- 1
- 876
1.MB_SERVER 介绍
“MB_SERVER” 指令作为 Modbus TCP 服务器通过 PROFINET 接口与客户端通信。“MB_SERVER”指令将处理 Modbus TCP 客户端的连接请求,接收并处理客户端请求并发送响应。
本测试基于以下测试环境:
| TIA Portal 版本: | V20 |
| S7-1200 G2: | CPU 1214C DC/DC/DC 6ES7 214-1AH50-0XB0 V1.0.2 |
| MB_SERVER 版本: | V6.0 |
通信连接如下:

2.MB_SERVER 功能块调用
2.1 添加 PLC 并建立通讯变量
(1)在 TIA Portal 中添加 S7-1200 G2 PLC。

图2.1.1 TIA Portal 中添加 S7-1200 G2
(2)设置 CPU 的 IP 地址,勾选“启用系统存储器字节”

图2.1.2 配置 S7-1200 G2 属性
(3)建立通信用变量,本示例通信 10 个字的数据,数据类型为 Int 数组。


图2.1.3 配置 S7-1200 G2 属性
2.2 建立通信参数 DB
(1)新加入通信连接参数用的 DB 中,在 DB 块中输入数据类型为“TCON_IP_V4”的变量,生成如下 DB 变量结构,该结构需要自动生成,不能手动创建。

图2.2.1 通信连接参数
| 参数 | 说明 |
| InterfaceId | 网口硬件标识符; 对于本示例网口为 64。 |
| ID | 连接 ID,本 CPU 上通信的 ID 是唯一的,取值范围 1~4095: 本示例使用 ID 值 1 |
| Connection Type | 连接类型:TCP 连接默认为:16#0B |
| ActiveEstablished | 该处参数设置为 0。主动连接为 1(客户端),被动连接为 0(服务器):本示例服务器为被动连接,使用默认值 0 |
| ADDR | 远程客户端的 IP 地址:使用默认值 0,可以与任意客户端连接,本示例使用默认值 0 |
| RemotePort | 远程客户端的端口号;使用默认值 0,客户端可以使用任意端口连接,本示例使用默认值 0 |
| LocalPort | 本地 PLC 服务器的端口号:本示例服务器端口为 502 |
表2.2.1 通信连接参数设置
(2)InterfaceId 可以在 CPU 的变量中查询到,查询方式如下图:

图2.2.2 通信接口硬件标识符查询
2.3 调用 MB_SERVER 功能块
(1)从指令库中拖拽 MB_SERVER 指令到程序段,建立背景实例

图2.3.1 插入 MB_SERVER 指令
(2)连接功能块引脚

图2.3.2 MB_SERVER 指令引脚
功能块引脚定义如下表:
| 参数 | 说明 |
| DISCONNET | 0(默认):建立通讯连接,打开端口;1:终止连接。 |
| MB_HOLD_REG | 指向 Modbus 保持寄存器的数据区。可以设为数据块或 M 存储区地址。数据块可以为优化的数据块,也可以为非优化的数据块。对于优化数据块只能是基本数据类型的数组。对于非优化的数据块没有要求,一般通过 P# 指针的形式输入。具体参见表 2.3.2。 |
| CONNECT | 指向连接描述结构的指针。使用 TCON_IP_v4 数据类型。 |
| NDR | 0:无新写入的数据;1:Modbus 客户端写入了新的数据。 |
| DR | 0:未读取数据;1: Modbus 客户端读取了数据 |
| ERROR | 错误位:0:无错误;1:出现错误(仅在作业出错时输出一个周期),错误原因查看 STATUS。 |
| STATUS | 指令的详细状态信息。 |
表2.3.1 MB_SERVER 指令引脚定义
(3)Modbus TCP 服务器数据区定义:
表2.3.2 MB_SERVER 数据区默认定义
| 地址区 | 定义 | 说明 | |
| 输出位 | Q0.0 开始 | Q0.0 为地址 1,Q0.1 为地址 2,Q0.7 为地址 8,Q1.0 为地址 9... | |
| 输入位 | I0.0 开始 | I0.0 为地址 10001,I0.1 为地址 10002,I0.7 为地址 10008,I1.0 为地址 10009... | |
| 输入寄存器 | IW0 开始 | IW0 为地址 30001,IW2 为地址 30002,IW4 为地址 30003... | |
| 保持寄存器 | 由 MB_HOLD_REG 定义 | 指针指向的第一个字为 40001,第二个字为 40002... | |
| 例如:MB_HOLD_REG 为 P#M100.0 WORD 8,则 MW100 为 40001,MW102 为 40002,MW104 为 40003...MW114 为 40008 | |||
| 例如:MB_HOLD_REG 为 优化 DB 中 INT 数组[0..7],数组名为 “XXX”.AA,则 “XXX”.AA[0] 为 40001,“XXX”.AA[1] 为 40002,“XXX”.AA[2] 为 40003...“XXX”.AA[7] 为 40008 |
2.4 通信结果
监视通信 DB 中的变量及 ModScan 软件。
本示例中连接 DB1 的变量 dataBuffer 数组,元素 dataBuffer[0]~ dataBuffer[9] 对应的 Modbus 地址范围为 40001~40010,读取结果如下:

图2.4.1 监视通信结果
3.MB_SERVER 状态及错误代码抓取
MB_SERVER 功能块的 Error 位及错误状态输出仅存在一个周期,在博途软件中通常无法直接监视,需要使用如下方法抓取后查看。

图3.1 Error 位状态计数及错误代码抓取
错误代码查询如下表:
| STATUS (W#16#) | 发送到Modbus客户端的响应代码 (B#16#) | 错误说明 |
| 7001 | MB_SERVER 正在等待Modbus客户机连接到指定的TCP端口,仅在第一次执行连接或断开操作时才报告此代码 | |
| 7002 | | MB_SERVER 正在等待Modbus客户机连接到指定的TCP端口,等待连接或断开操作完成时,将针对任何后续执行报告此代码 |
| 7003 | | 断开操作已成功完成(仅在一个PLC扫描周期内有效) |
| 80BB | | 连接参数中的 “ActiveEstablished” 参数无效;只允许对服务器建立被动连接 (active_established = FALSE) |
| 8187 | | 参数MB_HOLD_REG中的指针无效,数据区过小 |
| 8389 | | 数据区域定义无效 |
| 818C | | 参数MB_HOLD_REG指向优化的区域(必须为“标准与S7- 300/400兼容”的DB或M区)或因执行超时出错(55秒) |
| 8381 | 1 | 不支持此功能代码 |
| 8382 | 3 | 数据长度错误 |
| 8383 | 2 | 数据地址错误或访问了保持寄存器(MB_HOLD_REG参数)地址以外的区域 |
| 8384 | 3 | 数据值错误 |
| 8385 | 3 | 不支持此数据诊断代码值(功能FC08) |
表3.1 错误代码
除了上面列出的错误外,也可以从底层传输通信指令(TCON、TDISCON、TSEND和TRCV)返回错误,参考相应指令的错误代码。
Modbus Server 还支持修改保持性寄存器的起始地址、限制 IO 过程映像区的访问、使用数据块中的数据区等功能,如需使用这些功能,可参考以下章节。
4.MB_SERVER 静态变量
4.1 修改保持性寄存器的起始地址
可以通过修改静态变量“HR_Start_Offset”,修改保持性寄存器的起始地址。

图3.1.1 HR_Start_Offset 变量在线修改
例如此处在线值修改为 16#000A(十进制的值 10),保持性寄存器对应的客户端访问地址为 40001+10 开始。
通信结果如下图:

图3.1.2 新的保持性寄存器对应关系
4.2 限制输入输出寻址范围
QB_Read_Start:可由远程 MODBUS 设备读取的过程映像输出中的第一个字节的地址(应用于功能代码 01);
QB_Read_Count:可由远程 MODBUS 设备读取的过程映像输出中的字节数(应用于功能代码 01);
IB_Read_Start:可由远程 MODBUS 设备读取的过程映像输入中的第一个字节的地址(应用于功能代码 02 和 04);
IB_Read_Count:可由远程 MODBUS 设备读取的过程映像输入中的字节数(应用于功能代码 02 和 04)。

图3.2.1 限制输入输出的寻址范围
例如图3.2.1中的值设置,Q 区可以写的范围为 QB20-QB29, Q 区允许读的范围为 QB20~QB24, I 区允许读取的范围为 IB30~IB35。
4.3 Modbus 地址使用数据块中的数据区
通过该功能,用户可以直接访问数据块中的数据区,而不用直接访问过程映像和保持性寄存器。
使用该功能,有以下限制:
必须禁用数据块的“优化块访问”(Optimized block access) 属性;
请求到达时,尚未定义相应功能代码的 MODBUS 数据类型的数据区域,请求会按之前的指令版本处理;
最多可在不同数据块中定义八个数据区域,每个数据块只能包含一个数据区域;
使用的数据区域不到八个,则所需数据区域必须紧密相连。
Data_Area_Array 字段包含八个元素:Data_Area_Array[1] 到 Data_Area_Array[8],每个字段元素 Data_Area_Array[x](其中 1 <= x <= 8)都是 MB_DataArea 类型的 UDT,结构如下表:
表3.3.1 Data_Area_Array 结构
| 参数 | 数据类型 | 含义 |
| data_type | UInt | 映射到此数据区域的 MODBUS 数据类型的标识符: |
| • 0:空字段元素或未使用数据区域的标识符。此时,db、start和length的值无效。 | ||
| • 1:过程映像输出(与功能代码 1、5 和 15 一起使用) | ||
| • 2:过程映像输入(与功能代码 2 一起使用) | ||
| • 3:保持寄存器(与功能代码 3、6 和 16 一起使用) | ||
| • 4:输入寄存器(与功能代码 4 一起使用) | ||
| db | UInt | 映射的数据区编号,该DB必须是非优化DB |
| start | UInt | 映射到数据块中的首个 MODBUS 地址,从0开始 |
| length | UInt | Bool数(对于data_type 1或者2),Word数(data_type 3或者4) |
以下是使用 ModScan 访问的示例:
在项目中创建两个 DB 数据块,分别用于输入寄存器区,和保持性寄存器区访问

图3.3.1 创建用于通讯的 DB 块

图3.3.2 关闭“优化的块访问”

图3.3.2 Data_Area_Array 中的配置
示例1:data_type = 4,db = 5,start = 0,length = 11
输入寄存器 (data_type = 4) 映射在数据块 5 (db = 5);
Modbus 地址 30001 (start = 0) 位于数据块中的字 0;
最后有效的 Modbus 地址 30011 (length = 10) 位于数据块中的字 10,输出结果见下图3.3.3。
示例2:data_type = 3,db = 6,start = 1,length = 11
输入 (data_type = 3) 映射在数据块 6 (db = 6);
Modbus 地址 40002 (start = 1) 位于数据块中的字 0;
最后有效的 Modbus 地址 40012 (length = 11) 位于数据块中的字11,输出结果见下图3.3.4。

图3.3.3 输入寄存器读取结果

图3.3.4 保持性寄存器读取结果
说明:ModSim做 Modbus TCP server 测试软件,Modscan32 做 Modbus TCP Client 测试软件,两者都是第三方软件,需要从 Internet 网络上下载。
- 评论
-
分享
扫码分享
- 收藏 收藏
- 点赞 点赞
- 纠错 纠错



西门子官方商城


{{item.nickName}}