[西门子] 西门子S7-1200 Modbus-TCP 通信案例

[复制链接]
查看151 | 回复0 | 6 天前 | 显示全部楼层 |阅读模式
一、 组网概述 

本文以 ZKA-4488-ETH 为例介绍西门子PLCIO设备进行Modbus通讯的步骤设置。ZKA-4488-ETH  8 路数字量输入DI),8 路数字量输出DO),路模拟量输入(AI0/4-20mA),4路模拟量输出设备AO,0/420mA),以太网通信。

 ZKA-4488-ETH 为例,出厂默认通讯参数如下:ZK模块 IP 为:192.168.0.105

TCP 端口为:10001

(注意:我们模块出厂时默认端口为10001,客户也可以通过ZK模块的配置文件把ZK通讯端口改成modbus-tcp的默认端口502)
工作模式为:服务器模式
二、 S7-200 Modbus TCP 通信 
1 、S7-200 Modbus TCP 通信简介
Modbus 是公开通信协议,详细的协议和规范,请访问 Modbus 组织的网站:http://www.modbus.org/
S7-1200 CPU 本体上集成了一个 PROFINET 通信口,支持以太网和基于 TCP/IP 和 UDP 的通信标准。这个 PROFINET 物理接口是支持10/100Mb/s 的 RJ45 口,支持电缆交叉自适应, 因此一个标准的或是交叉的以太网线都可以用于这个接口。使用这个通信口可以实现 S7-1200 CPU 与编程设备的通信,与 HMI 触摸屏的通信,以及与其它 CPU 之间的通信,
S7-1200 CPU 的 PROFINET 通信口主要支持以下通信协议及服务
  1. Profinet IO V2.0 开始)

  2. S7 通信 V2.0 开始支持客户端

  3. TCP

  4. ISO on TCP

  5. UDPV2.0 开始)

  6. Modbus TCP

  7. HMI 通信

  8. Web 通信(V2.0 开始

硬件版本 V4.1 支持的协议和最大的连接资源:
S7-1200 的连接资源
分配给每个类别的预留连接资源数为固定值;您无法更改这些值。但可组态 6个"可用自由连接"以按照应用要求增加任意类别的连接数。

示例 1: 1 个 PG 具有 3 个可用连接资源。根据当前使用的 PG 功能,该 PG 实际可能使用其可用连接资源的 1、2 或 3。在 S7-1200 中,始终保证至少有 1 个 PG,但不允许超过 1 个 PG。
在 CPU 属性>常规>连接资源显示:


硬件版本 V3.0 支持的协议和最大的连接资源:
  1. 3 个连接用于操作面板

  2. 1 个连接用于编程设备PG与 CPU 的通信

  3. 8 个连接用于Open IE ( TCPISO on TCPUDP的编程通信,使用 T-block 指令来实现

  4. 3 个连接用于 S7 通信的服务器端连接,可以实现与 S7-200S7-300 以及 S7-400 的以太网S7 通信

  5. 8 个连接用于 S7 通信的客户端连接,可以实现与 S7-200S7-300 以及 S7-400 的以太网 S7通信

连接数是固定不变的,不能自定义。
 注意:建立被动的 TCP ISO on TCP 和 UDP 的连接时,建议使用端口范围: 2000~5000一些端口号和 TSAP 号是受到限制不能被使用的。下列端口号和 TSAP 号不能使用:
  1. ISO TSAP (passive): 01.00, 01.01, 02.00, 02.01, 03.00, 03.01

  2. TCP/UDP port (passive): 20, 21, 25, 80, 102, 135, 161, 34962 … 34964,53, 80, 162, 443,520, 9001

2 、Modbus TCP 指令库
S7-1200集成PN接口MODBUS TCP通信概述
Modbus TCP 是标准的网络通信协议,通过 CPU 上 PN 接口进行 TCP/IP 通信,不需要额外的通信硬件模块,Modbus TCP 使用开放式用户通信连接作为 Modbus 通信路径,所支持的混合客户机和服务器连接数最大为 CPU 所允许的最大开放式用户通信连接数 8 个。
软件 STEP7 V11 SP1 版本开始,S7-1200CPU 从 Firmware V1.0.2 开始,不再需要安装Modbus TCP 的库文件,可以直接调用 Modbus TCP 的库指令“MB_CLIENT”“MB_SERVER”使用实现 Modbus TCP 通信功能,如图 所示。

图 1. Modbus TCP 的库指令
 3、Modbus TCP 功能编程
S7-1200 Modbus Tcp Client(客户端)
MB_CLIENT 进行客户机和服务器 TCP 连接、发送命令消息、接收响应以及控制服务器的断开。
1. 调用 MB_CLIENT 通信指令,进入 “Program blocks” > “OB1” 主程序中,调用 MODBUS TCP 客户机指令,如图 2 所示。

 2. MB_CLIENT 通信指令
功能块参数意义如下表 1.

 1. 功能块参数意义
2、MB_DATA_PTR 数据块的新建
通过“Program blocks”>“Add new block”,选择“Data block”创建 DB 块,选择“标准与 S7- 300/400 兼容” ,点击“OK”键,定义数据区为 100 个字的数组,如图 3 所示。

 3. 创建 MB_DATA_PTR 数据块
3、MB_MODE、MB_DATA_ADDR 和功能码的关系
MB_CLIENT 指令中,MB_MODEMB_DATA_ADDR 和 MB_DATA_LEN 三个参数组合定义了当前 Modbus 消息中所用的功能代码,如表 2.

表 2. MB_MODEMB_DATA_ADDR 和功能码的关系
如上例中 S7-1200 作客户机,用 FC04 功能码读取 ZKA-4488-ETH 的模拟输入 AI1 通道的读数的两个字,起始从 Modbus 地址 30001 开始,接收的数据存放在缓冲区 DB3.DBX0.0 开始区域,设置如上:MB_MODE=0MB_DATA_ADDR=30001MB_DATA_LEN=2,对应关系为:30001->DB3.DBW0 30002->DB3.DBW2
注意:Slave ID 是 ZKA-4488-ETH 的站地址,和客户机中“MB_CLIENT” 中的“CONNECT_ID” 不是一个概念,实际上与客户机中“MB_CLIENT”的背景数据块中的 STAT 变量“MB_UNIT_ID”需要一致,在 1200 中该地址默认为 16#00FF,实际使用时可以改成 1,即:与 ZKA-4488-ETH 配置文件中的站号保持一致,当 S7-1200 挂接了多个 ZKA-4488-ETH 时,该值可以按序编号,也可以都使用值 1,因为 modbus-tcp 依然可以根据指向的 IP地址发送数据

图 7. 客户机中“MB_CLIENT”的背景数据块中的 STAT 变量“MB_UNIT_ID”
4. 通讯测试
S7-1200 作客户机,用 FC04 功能码读取 ZKA-4488-ETH 的两个字,设置客户机和 ZKA-4488-ETH 的功能、起始地址、端口等参数相对应,具体设置如上,设置 M5.0 和 M0.0 为 1, 触发请求,如图 所示。

图 8. S7-1200 作客户机,用 FC04 功能码读取服务器的两个字
通讯结果如图 所示,从服务器读到数据 0011 到客户机的 DB3.DBW0 和 DB3.DBW2 区域。

图 9. 通讯结果
6、 MB_CLIENT 参数 STATUS 错误代码查询参考下面两个列表 3.和表 4.。

表 3. 协议错误代码

表 4. 参数错误代码
除了上面列出的 MB_CLIENT 错误外,也可以从底层传输通信指令(TCONTDISCONTSEND和 TRCV)返回错误,参考相应指令的错误代码。
4 、Modbus TCP 常问问题
MB_CLIENT 指令的背景数据块中的 "MB_Unit_ID" 有什么功能?
注意:Slave ID 是 ZKA-4488-ETH 的站地址,和客户机中“MB_CLIENT” 中的
“CONNECT_ID” 不是一个概念,实际上与客户机中“MB_CLIENT”的背景数据块中的 STAT 变量“MB_UNIT_ID”需要一致,在 1200 中该地址默认为 16#00FF实际使用时可以改成 1, 即:与 ZKA-4488-ETH 配置文件中的站号保持一致,当 S7-1200 挂接了多个 ZKA-4488-ETH 时,该值可以按序编号,也可以都使用值 1,因为 modbus-tcp 依然可以根据指向的 IP地址发送数据

图 11. MB_Unit_ID
S7-1200 MODBUS TCP 通信多请求处理怎么做
单独的客户机连接需要遵循的规则
1. 每个“MB_CLIENT”连接需要使用一个不同的背景数据块;
2. 每个“MB_CLIENT”连接必须指定一个服务器 IP 地址;
3. 每个“MB_CLIENT”连接必须指定一个唯一的连接 ID
4. 是否需要唯一的 IP 端口号取决于服务器组态;
连接 ID 和背景数据块组合成对,对每个连接来说,组合对都是唯一的。对于多请求处理,有两种方法:
方法一:如果 TCP 连接充裕,可以建立多个不同的连接发送请求,即每个请求使用一个独立的连接,调用独立的“MB_CLIENT”功能块,具体操作参考“Modbus TCP”部分。通过不同的连接发送多个请求,“MB_CLIENT”功能块多次调用,但是需要使用不同的背景数据块,不同的 ID 号和不同的端口号。
方法二:通过公共的连接发送多个请求。
通过公共的连接发送多个请求,“MB_CLIENT”功能块多次调用,但是需要使用相同的背景数据块,连接 ID 号,IP 地址和端口号。在任意时间,只能有一个 MB_CLIENT 请求处于激活状态,在一个请求完成执行后,下一个请求再开始执行,轮循处理。
在此,我们以方法二为例,介绍 S7-1200 如何通过分次请求获取 ZKA-4488-ETH 内部寄存器的数据:
1. S7-1200 的IP 地址 192.168.1.218,将系统存储器字节设置为 MB1,如图 1 所示,图 2 所示。

图 1 IP 地址设置

图 系统存储器字节设置
1、新建数据块,访问指向 ZKA-4488-ETH 的 IP 地址和端口号
如图 所示,新建 DB,添加变量类型为 TCON_IP_V4,设置 InterfaceIdIDActiveEstablishedRemoteAddressRemotePort 等参数,具体含义参见链接。

图 设置连接变量
如图 所示,在 DB 中建立结构数组,用于轮询控制位以及数据,其中元素 用于第一次读取,元素 1用于第二次读取。Init 用于初始标志位。

图 轮询数据
2、编写轮循功能
1)如图 8 所示,用“FirstScan”在第一次扫描中将初始标志位置位。

图 初始化标志位
2)如图 9 所示,程序段 2 中,第二步的完成位或者错误位去置位第一步的使能位复位第二步的使能位,同时复位第二步的完成位、错误位、触发的沿变量。
程序段 中,一般情况下是 EN 通过第一步的使能位使能,REQ 通过使能位的上升沿触发, 设置模式、读取数据地址、长度、存储地址、连接数据、完成、错误位等。此外需要考虑第一次触发轮询,可以使用手动触发,在这里使用初始化标志位实现指令的第一次使能,去进行 CPU 和调试软件的 TCP 连接,使用 Connected 标志位触发第一次的 REQ 触发。

图 请求 触发
如图 10 所示,程序段 中,第一步的完成位或者错误位去置位第二步的使能位复位第一步的使能位,同时复位第一步的完成位、错误位、触发的沿变量,最后复位初始化标志位,确保第一个MB_CLIENT 不会一直接通。
程序段 中,EN 通过第二步的使能位使能,REQ 通过使能位的上升沿触发,设置模式、读取数据地址、长度、存储地址、连接数据、完成、错误位等。

图 10 请求 触发
5、通讯测试
通讯结果如图 11 所示。

图 11 测试结果
 注意:1.如果需要更多的读写任务可以按照例子自行添加。

—THE END—



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则