基于Modbus-TCP协议的S7-1200 PLC与RFID射频读写器通信程序设计
2023-01-13陈元凯盖超会谷玉玲
陈元凯 盖超会 谷玉玲
(武汉软件工程职业学院 电子工程学院 湖北 武汉:430205)
Modbus-TCP通信协议是一种已广泛应用于当今工业控制领域的通用通信协议。通过此协议,控制器经由网络(如以太网)可以和其它设备之间进行数据通信。Siemens S7-1200 PLC作为一种高可靠性的控制器,通过与RFID射频读写器进行数据通信实现IC卡数据的读写,不但可以实现对生产过程的精准控制,更能实现对用户数据的实时管理。本文从Modbus-TCP通信协议以及RFID读写器的功能入手,详细介绍了PLC与RFID读写器之间的读取与写入数据的程序编写与调试方法。
1 Modbus_TCP通信协议概述
Modbus/TCP是简单的、中立厂商的用于管理和控制自动化设备的Modbus系列通信协议的派生产品,它覆盖了使用TCP/IP协议的“Intranet”和“Internet”环境中Modbus报文的用途。协议的最通用用途是为诸如PLC、I/O模块以及连接其它简单域总线或I/O模块的网关服务的。
Modbus/TCP 使Modbus_RTU协议运行于以太网,Modbus TCP使用TCP/IP和以太网在站点间传送Modbus报文,Modbus/TCP结合了以太网物理网络和网络标准TCP/IP以及以Modbus作为应用协议标准的数据表示方法[1]。Modbus/TCP通信报文被封装于以太网TCP/IP数据包中。与传统的串口方式,Modbus/TCP插入一个标准的Modbus报文到TCP报文中,不再带有数据校验和地址。
Modbus数据在TCP/IP以太网上传输,支持Ethernet II和802.3两种帧格式,Modbus TCP数据帧包含报文头、功能代码和数据3部分[2]。MBAP报文头(MBAP、Modbus Application Protocol、Modbus应用协议)分4个域,共7个字节,如图1所示。
2 C-11HMRW型RFID射频读写器功能及寄存器说明
RFID读写器(Radio Frequency Identification的缩写)即无线射频识别,是一种非接触式的自动识别技术,其基本原理是利用射频信号和空间耦合(电感或电磁耦合)或雷达反射的传输特性,实现对被识别物体的自动识别。通过天线与RFID电子标签进行无线通信,可以实现对标签识别码和内存数据的读出或写入操作[3]。典型的RFID读写器包含有RFID射频模块(发送器和接收器)、控制单元以及天线,IC-11HMRW型RFID射频读写器如图2所示。
图1 Modbus_TCP的数据帧
图2 IC-11HMRW型RFID射频读写器
RFID射频读写器读写器在Modbus-TCP通信中作为服务端监听设备端口,当有客户端连接请求时响应并创建连接。读写器设备的默认端口号为39169,默认站号为2,IC-11HMRW型RFID射频读写器的部分寄存器地址功能说明如表1所示。
表1 RFID射频读写器的部分寄存器地址
3 S7-1200 PLC与RFID射频读写器通信要求
3.1 网络结构要求
网络结构要求利用工业以太网线缆,按照图3所示的网络结构逻辑拓扑图将交换机、上位机、RFID读写器与S7-1200连接起来并设置好相应的IP地址。
图3 网络结构图
3.2 读IC卡要求
在RFID读写器上读IC卡,当RFID读写器检测到有卡时点亮PLC的Q0.1,无卡时熄灭。同时利用S7-1200 PLC的读取操作将IC卡中0010~0013(40011~40014)4个寄存器中存储的数据读取到S7-1200 PLC的DB块数组中进行保存。
3.3 写IC卡要求
在RFID读写器上写IC卡,需将4组16进制数1234、5678、9ABC、DEF0分别写入到IC卡中0010~0013(40011~40014)4个寄存器中。写入完成后再立即用RFID读卡操作读取IC卡中的数据。
4 S7-1200 PLC与RFID射频读写器PLC程序设计
4.1 程序设计流程
依据系统要求,PLC与RFID射频读写器的通信程序主要分为IC卡读操作与IC卡写操作两大部分,同时IC卡读操作到卡写操作的过程需要通过手动切换,而IC卡写操作到IC卡读操作则需自动切换,故根据RFID射频读写器功能及寄存器说明设计PLC通信程序,PLC程序设计流程如图4所示。
图4 PLC程序设计流程
4.2 全局DB块创建
(1)在TIA博途软件中创建名为“RFID数据读取及写入”工程,添加硬件后分别创建名为“IC卡读取”和“IC卡写入”的FC功能块。
(2)向工程中创建一个名为“connect”的全局DB数据块,用于存储连接数据和通信数据,并在该数据块的属性中取消其“优化块访问”。
(3)向“connect”数据块中添加两个4字节数组、5个字节变量及1个TCON_IP_v4变量,数组分别命名为“receive”和“send”,“receive”数组用于接收RFID读写器的数据,“send”数组用于向RFID读写器发送数据,5个字节变量分别命名为“Answer1”、“Answer2”、“Answer3”、“Request1”和“Request2”,TCON_IP_v4变量命名为“IP”用于存储Modbus TCP连接端口及地址,“connect”数据块数据添加如图5所示。
图5 “connect”数据块数据添加
系统要求利用RFID读写器向IC卡中写入16进制1234、5678、9ABC、DEF0四个数据,故相应的设置“send”数组的4个字节的初值。设置Request1和Request2的初值分别为16#8和16#4,这两个字节用于向RFID读写器提出请求。设置TCON_IP_v4变量中“InterfaceID”、“ID”、“ADDR[1]”、“ADDR[2]”、“ADDR[3]”、“ADDR[4]”、“RemotePort”、“LocalPort”的初值分别为64、16#01、192、168、0、242、39169和0,其中ADDR[1]~ADDR[4]为远程通信对象IP地址的4个字节,RemotePort为远程通信对象即RFID读写器的端口号,LocalPort为PLC本地端口号。
4.3 Main函数程序编写
在主程序中调用“IC卡读取”和“IC卡写入”FC功能块,并通过同一触点连接,实现IC卡读取与写入操作的切换,根据系统要求,默认为IC卡读取状态,仅当触发IC卡写入时才切换至写入状态,故设置M6.0作为IC卡读取操作与IC卡写入操作的切换开关,Main函数如图6所示。
图6 Main函数程序
4.4 “IC卡读取”功能块程序编写
4.4.1 MB_CLIENT指令块
在本例中RFID读写器作为服务端,S7-1200 PLC作为客户端。在程序中添加Modbus TCP客户端通信指令MB_CLIENT,该指令用于通过PROFINET在客户端和服务器之间建立连接、发送Modbus请求、接收响应并控制Modbus TCP客户端的连接终端。需要注意的是Modbus查询开始后,背景数据块将锁定,其它客户端无法使用,因此与Modbus RTU类似,MB_CLIENT需利用轮询操作实现同一指令多次调用的遍历[4]。
4.4.2 判断RFID读写器上是否有IC卡
根据前文的介绍,当读取到00007寄存器(地址为40008)的第四位为1时,即表示有IC卡在RFID读写器的在感应区,故在FC1“IC卡读取”功能块中编写程序判断是否有卡,IC卡判断程序如图7所示。
其中当M100.0触发后PLC从00007寄存器读取长度为1个字节的数据并将其保存在DB2.DBW8中。由于读取到00007寄存器(地址为40008)的第四位为1时表示有卡,故可利用读取到的DB2.DBW8与16#0010进行比较,当读写器上有卡时点亮指示灯Q0.1。
MB_CLIENT指令需利用轮询操作实现同一指令多次调用的遍历,故利用MB_CLIENT指令的完成位及错误位触发TP脉冲定时器500毫秒的延时后复位当前读取操作的REQ请求位并置位下一操作的REQ请求位[5]。
图7 IC卡判断程序
4.4.3 请求读取第一操作空间指定数据区域
根据程序编写流程,在读取IC卡的数据前需向00007寄存器(地址40008)写入16#0008进行数据读取请求,待00007寄存器回复16#0012后方可执行IC卡数据的读取操作,故读取第一操作空间时需利用MB_CLIENT指令向地址40008执行写操作,然后再对地址40008执行读操作,读取第一操作空间指定数据区域请求程序如图8所示。
图8 读取第一操作空间指定数据区域请求程序
4.4.4 读取指定区域数据
在数据读取请求得到回复后便可读取4个寄存器中的数据,轮询触发M100.3后,PLC读取从40011开始的4个寄存器中的数据保存到从DB2.DBW0开始的4个字中。需要的注意的是由于轮询控制算法是实现数据读写操作的轮流循环,故在最后一步读数据操作结束后再次置位第一步读卡操作中的请求位,以实现轮询控制[6]。
4.5 “IC卡写入”功能块程序编写
4.5.1 IC卡数据写入
根据系统要求,需将4组16进制数分别写入到IC卡中4个寄存器中,由于这4组16进制数保存在DB2.DBW14开始的4个字的初值中,故在FC2“IC卡写入”功能块中添加写操作指令,当手动触发写操作按钮M100.4后便可将这4个字临时存储到40011开始的4个寄存器中,同时利用轮询控制算法触发下一步使能数据入卡操作。注意此时的写入仅是临时存储,只有激活使能后才能使数据保存到IC卡中。
要使数据存入卡中需向40008寄存器中写入16#0004,使能数据存储操作。故利用轮询触发写操作指令将存储16#0004数据的DB2.DBW24写入到40008中,使能数据存入到IC卡,IC卡数据写入程序如图9所示。
图9 IC卡数据写入程序
4.5.2 读取返回值,判断是否写入成功
数据存储并使能完成后需继续读取40008寄存器的回复值,若回复为16#0011即为数据写入成功。利用读操作指令,将40008寄存器的值读取到DB2.DBW12中,若返回值为16#0011则通过比较指令触发写入操作完成,即完成IC卡写操作。IC卡写操作完成后需自动切换至IC卡读取状态,故轮询控制的最后一步需复位IC卡写切换开关M6.0,使系统自动切换至IC卡读取功能块。
5 功能测试
5.1 IC卡读取功能测试
在RFID读写器上放置一张有数据的IC卡,监视DB块中receive接收数组及应答回复字Answer1和Answer2,此时能够从数组中读取到数据,且应答回复字均为16#0012,即表示此时RFID读写器上有卡,且卡内40011到40014寄存器内有数据,IC卡读取功能测试如图10所示。
5.2 IC卡写入功能测试
IC卡数据读取完成后启用IC卡写入功能,将默认send数组中的4个16进制数写入到卡中,写入完成后系统自动切换回IC读取功能,再次监视DB块中receive接收数组及应答回复字Answer1和Answer2,此时从数组中读取到的数据即为IC卡写入的数据,即IC卡写入功能测试成功,IC卡写功能测试如图11所示。
6 结束语
本文针对IC-11HMRW型RFID射频读写器,详细阐述了Siemens S7-1200 PLC与RFID读写器进行以太网通信实现IC卡读操作和写操作的程序设计方法,并在TIA博途软件中进行了仿真调试。实践证明该系统运行稳定、程序设计方案可行。
图10 IC卡读取功能测试
图11 IC卡写功能测试