STEP 7 V13 SP1 软件版本中的 Modbus TCP 指令目前新的版本已升至 V4.0,如图 1 所示。该版本的使用需要具备以下两个条件:
1. 软件版本: STEP 7 V13 SP1 及其以上
2. 固件版本: S7-1200 CPU 的固件版本 V4.1 及其以上
图1. Modbus TCP V4.0 版本指令块
V4.0 作为 Modbus TCP 新版指令的个基础版本,后续版本新增内容参见:
V5.0 版本新功能文档参见链接。
V6.0 版本新功能文档参见链接。
V4.0 版本 Modbus TCP 客户端文档参见链接。
旧版指令主要应用于固件版本 V4.0 及其以前的 CPU:
客户端指令块文档参见链接。
服务器指令块文档参见链接。
S7-1200 Modbus TCP 实验环境下面以两台 S7-1200 之间进行 Modbus TCP 通信为例,详细阐述客户端与服务器侧如何编程及通信的过程,本文档只介绍服务器部分组态编程,客户端部分参见链接。
表 1 列出了具体的实验环境,表 2 列出了双方 CPU 通信所需主要参数。
操作系统 | WIN7 SP1 版 64 位 |
编程软件 | STEP 7 Professional V13 SP1 Update 5 |
系统硬件 | CPU1212C 6ES7212-1AE40-0XB0 V4.1 CPU1215C 6ES7215-1AG40-0XB0 V4.1 |
表1. Modbus TCP 通信的实验环境
CPU类型 | IP 地址 | 端口号 | 硬件标识符 | |
客户端 | CPU 1212C | 192.168.0.6 | 0 | 64 |
服务器 | CPU 1215C | 192.168.0.4 | 502 | 64 |
表2. Modbus TCP 通信双方的基本配置
硬件标识符是在“设备组态”中,双击 PROFINET 接口,然后在“属性”中的“硬件标识符”中查看,如图 2 所示。
图 2. S7-1200 设备的 PROFINET 接口硬件标识符
S7-1200 Modbus TCP 服务器编程“MB_SERVER”指令将处理 Modbus TCP 客户端的连接请求、接收并处理 Modbus 请求并发送响应。
1. 调用 MB_SERVER
将 MB_SERVER 指令块在“ 程序块 > OB1 ”中的程序段里调用,调用时会自动生成背景 DB ,点击确定即可,如图 3 所示。
图 3. 调用 MB_SERVER 指令块
该功能块各个引脚定义如表 3 所示:
参数 | 说明 |
DISCONNET | 0(默认):被动建立与客户端的通信连接;1:终止连接。 |
MB_HOLD_REG | 指向 Modbus 保持寄存器的数据区。可以设为数据块或 M 存储区地址。数据块可以为优化的数据块,也可以为非优化的数据块。对于优化数据块只能是基本数据类型的数组。对于非优化的数据块没有要求,一般通过 P# 指针的形式输入。具体参见表 4。 |
CONNECT | 指向连接描述结构的指针。使用 TCON_IP_v4 数据类型。 |
NDR | 0:无新写入的数据;1:Modbus 客户端写入了新的数据。 |
DR | 0:未读取数据;1: Modbus 客户端读取了数据 |
ERROR | 错误位:0:无错误;1:出现错误,错误原因查看 STATUS。 |
STATUS | 指令的详细状态信息。 |
表 3. MB_SERVER 各个引脚定义说明
Modbus TCP 服务器数据区定义,参见表 4。
输出位 | 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 |
表 4. 数据区定义
注意:数据区从指令库版本 V5.0 开始,可以自由定义,方法参见链接。
2. ConNECT 引脚的指针类型
先创建一个新的全局数据块 DB2,如图 4 所示:
图 4. 创建全局数据块
第二步,双击打开新生成的 DB2 数据块,定义变量名称为“ss",数据类型为“TCON_IP_v4”(可以将 TCON_IP_v4 拷贝到该对话框中),然后点击“回车”按键。该数据类型结构创建完毕。如图 5 所示:
图 5. 创建 MB_SERVER 中的 TCP 连接结构的数据类型
各个参数定义说明如表 4 所示:
参数 | 说明 |
InterfaceId | 网口硬件标识符,对于本体网口为 64,即16#40。 |
ID | 连接 ID,取值范围 1~4095 |
Connection Type | 连接类型。TCP 连接默认为:16#0B |
ActiveEstablished | 建立连接。主动为 1(客户端),被动为 0(服务器)。 |
ADDR | 服务器侧的 IP 地址 |
RemotePort | 远程端口号 |
LocalPort | 本地端口号 |
表4. TCON_IP_v4 数据结构的引脚定义
客户端侧的 IP 地址为 192.168.0.6,端口号为 0,所以 MB_SERVER 服务器侧该数据结构的各项值如图 6 所示。
图 6. MB_SERVER 服务器侧的 ConNECT 数据结构定义
注意:
ConNECT 引脚的填写需要用符号寻址的方式。
TCON_IP_v4 是系统数据类型,不是在 PLC 数据类型中创建的。
RemotePort 一般使用默认值 0,意思是不指定客户端端口。
RemoteAddress 可以不指定,意思是不指定客户端 IP 地址。也可以像图 6 所示指定客户端地址。
3. S7-1200 服务器侧 MB_SERVER 编程
调用 MB_SERVER 指令块,实现被客户端读取 2 个保持寄存器的值,如图7所示。
图7. MB_SERVER 服务器侧编程
S7-1200 MODBUS TCP 通信调试S7-1200 MODBUS TCP 服务器侧准备数据,用于客户端读访问,如图8所示。
图8. 服务器侧监控表
S7-1200 MODBUS TCP 客户端侧,给 MB_CLIENT 指令块中 REQ 引脚一个上升沿,监控数据读取成功。如图9所示。
图9. 客户端侧监控表