S7-PLC基于Modbus/TCP协议通信研究

2014-12-23 01:33袁文波尤万方殷召生
计算机工程与设计 2014年2期
关键词:模件字节寄存器

袁文波,洪 波,尤万方,殷召生,蒋 彦,温 柳

(1.国网电力科学研究院 南京南瑞集团公司水利水电技术分公司,江苏 南京210003;2.安徽电力泾县供电有限责任公司,安徽 泾县242500)

0 引 言

S7-PLC作为现地控制核心广泛应用于自动化控制领域,但S7-PLC 目前没有公开的以太网通讯标准协议[1]。Modbus/TCP协议作为一种工业以太网通信标准协议,广泛应用于工业自动化控制领域。与S7-PLC相比,国内外众多中大型PLC都支持Modbus/TCP通信协议,用户不需要编写Modbus/TCP应用层程序,就可直接使用,诸如国外Schneider公司推出的Quantum、Premium 系列PLC和国内南瑞集团公司推出的MB40、MB80 系列iPLC (智能可编程控制器)等,目前S7-PLC需要用户购买昂贵的软件包方可实现Modbus/TCP 通 信,而 不 能 直 接 实 现[2,3],这 样 既不利于Modbus/TCP通信在S7-PLC上应用,也不利于S7-PLC在自动化控制领域朝数字化、信息化、网络化和标准化方向发展趋势下应用,因此在S7-PLC支持TCP/IP协议基础上 设 计Modbus/TCP 应 用 层 程 序 实 现 在S7-PLC 上Modbus/TCP通信应用尤为重要。笔者通过Modbus/TCP应用层程序开发以及组态配置实现上位机与S7-PLC 基于Modbus/TCP协议通信。

1 通信的可行性

1.1 Modbus/TCP协议[4-8]

Modbus/TCP协议是运行在TCP/IP上的Modbus报文传输协议,使用TCP/IP以太网的5层,协议数据格式为每个8Bit字节包含两个4Bit的十六进制字符,与Modbus-RTU 协议相同。其应用数据单元 (ADU)包含报文头、功能代码和数据3部分,功能代码和数据构成协议数据单元(PDU),报文头 (MBAP)由事务处理标识符 (2 字节)、协议标识符 (2字节)、长度 (2字节,余下域字节的数量,包含单元标识符和协议数据单元在内)、单元标识符 (1字节)组成。Modbus/TCP数据帧是基于Modbus-RTU 数据帧,帧头添加事务元标识符、协议标识符、长度等6字节,帧尾去除容错校验码,用报头中的单元标识符取代Modbus-RTU 上通常使用的从站地址,Modbus/TCP在应用层不需要校验域,而是利用TCP层、IP 层和以太网链路层差错校验码的使用校验和机制来校验分组交换的准确性。该协议采用请求和响应机制:客户机向服务器发送请求,分析处理请求,向客户机发送应答。其数据帧封装过程为[9]:用户数据首先在应用层按照Modbus应用层规范进行封装,生成相应的请求或应答应用数据单元 (ADU),该ADU 按照RFC1042规范映射到TCP/IP协议栈的各层进行数据封装。Modbus/TCP数据帧拆解过程与封装过程相反。

1.2 S7-PLC通信和编程资源[10,11]

S7-PLC支持通过内部总线进行CPU 模件和以太网模件数据交换,以太网模件支持TCP/IP协议,S7-PLC 可通过以太网模件与上位机实现通信连接。S7-PLC 软件平台STEP7 软件配备了结构化语言SCL,是西门子公司依据IEC61131-3标准创立的一种高等编程语言,它与编程语言Pascal类似,它能实现庞杂的数学运算、复杂算法优化和批量数据处理,编写的程序非常简练和紧凑。S7-PLC 循环执行的主程序组织块OB1可以直接或者间接地调用相应的FB、FC、SFB、SFC 实现数据采集、过程监测、控制调节以及通信功能。FC、FB 是用户程序,可以编程使用,FB有其专用的背景数据块,FB可以有多个背景数据块实现不同对象的同一功能,SFB、SFC 是系统程序,可以被调用。SFC59 (RD_REC)为CPU 模件通过内部总线接收数据的系统功能,SFC58 (WR_REC)为CPU 模件通过内部总线发送数据的系统功能。

1.3 设计模型

Modbus/TCP协议首先需要在上位机和S7-PLC建立可靠的连接,然后保证数据可靠并且按顺序到达传输。S7-PLC基于Modbus/TCP协议应用模型见表1,利用该模型可将S7-PLC作为Modbus/TCP 协议的服务器,与监控系统中上位机实现Modbus/TCP通信。

通信过程为:①S7-PLC中以太网模件通过TCP/IP通信获取上位机发送的Modbus/TCP协议IEEE802.3以太网报文,以太网模件TCP/IP 协议栈从以太网物理层、数据链路层、IP层和TCP层逐层拆解以太网报文;②通信程序调用SFC59 (RD_REC),通过内部总线从以太网模件获取请求应用数据帧;③通信程序将应用数据帧拆分成MBAP

表1 S7-PLC基于Modbus/TCP协议通信模型

报头和协议数据单元,并对MBAP报头和协议数据单元细分,对协议数据单元中功能码和数据分析,进行相应读写操作;④通信程序将上送数据和功能码封装在应答的协议数据单元,再按协议规范封装MBAP 报头,构成Modbus/TCP应用数据单元;⑤通信程序调用SFC58(WR_REC),通过内部总线将应答的应用数据单元写入以太网模件;⑥以太网模件TCP/IP 协议栈将应用数据单元在TCP 层、IP层、数据链路层和以太网物理层逐层封装,构成完整的IEEE802.3以太网报文[12],最终通过TCP/IP通信将Modbus/TCP应用数据单元封装在内的应答以太网报文发送至上位机。过程①和⑥需要通过硬件组态和网络配置,由以太网模件自动完成,其他过程则通过编写应用层通信程序FB实现,设计应用层用户通信程序也是本文研究重点。

2 请求和应答数据帧解析

S7-PLC作为服务器与作为客户机的上位机基于请求/响应机制进行Modbus/TCP 通信。本文S7-PLC 的Modbus/TCP通信功能码有8种,功能码和功能作用见表2。

表2 功能码和功能作用

上位机向S7-PLC 发送请求,S7-PLC 分析请求,处理请求,向客户机发送应答。当S7-PLC对上位机响应时,它使用功能码来指示正常 (无差错)响应或者出现某种差错(称为异常响应)。对于一个正常响应来说,S7-PLC仅复制原始功能码。对于异常响应,S7-PLC将原始功能码加0x80(即其字节的最高有效位设置逻辑1)后返回。

请求报文用RQ 数组表示,正常响应的应答报文用SN数组表示,异常响应的应答报文用EX 数组表示,数组单位均为字节。各数组的第1、2个单元分别存贮事务元标识符的高、低字节,各数组的第3、4个单元分别存贮协议标识符的高、低字节。各数组的第7个单元存贮单元标识符SID。各数组的第5、6个单元分别存贮长度的高、低字节,因为长度为余下域的字节数,小于256,RQ [4]、SN[4]、EX [4]为0,事务元标识符和协议标识符的值均为0,请求报文、正常响应报文、异常响应报文中前5字节值均为0,即RQ [0]… RQ [4]、SN [0]… SN [4]、EX[0]… EX [4]=0x00。分3种类型深入解析8种功能请求报文和正常应答报文,并对异常响应的应答报文解析。

(1)对于读取数据功能报文,即功能码FNC 为0x01、0x02、0x03或0x04,请求报文的帧长度为12 个字节,其余下域的字节数为6 个;正常应答的帧长度为B+9 个字节,其余下域的字节数为B+3个。B为实际数据 (开关量或寄存器)的字节数,D1…DB为从地址ADD 开始需要读取的B个实际数据;QNT 为实际数据 (开关量或寄存器)的数量,QNTH 为其高字节,QNTL 为其低字节;ADD为读取的起始地址,ADDH 为其高字节,ADDL 为其低字节。功能码FNC为0x01或0x02,是对输出型或输入型开关量进行读取操作,QNT 为从地址ADD 开始需要读取的位数量,QNT 在1~1920之间,其字节数为B= (QNT+7)/8;功能码FNC为0x03或0x04,是对保持型或模拟输入量型寄存器读取操作,QNT 在1~125之间,QNT 为需要读取从起始地址读取寄存器数量,其字节数为B=2*QNT。请求报文的数据帧见表3,正常响应的应答报文数据帧见表4。

(2)对单个开关输出量或保持寄存器写操作功能,即功能码FNC为0x05或0x06,正常响应报文与请求报文完全相同,报文帧长度为12 个字节,余下域的字节数为6个,对地址ADD 的开关输出量或保持寄存器的进行写操作。功能码FUNC 为0x05,是对单个开关输出量写操作,包括置位和复位两种操作:对地址ADD 的开关输出量进行置位操作请求 (当RQ [10]=VDH=0xFF,同时RQ [11]=VDL=0x00,即VD=0xFF00),对地址ADD 开出位进行复位操作请求 (当RQ [10]=VDL=0x00,RQ [11]=VDH=0x00,即VD=0x0000)。功能码FUNC 为0x06,是对单个保持寄存器写操作,将VD 赋值于地址为ADD 的保持寄存器,VD 为写入寄存器的数值,VDH 为其高字节,VDL为低字节。请求和应答报文数据帧见表5。

表3 FNC为0x01、0x02、0x03、0x04的请求报文

表4 FNC为0x01、0x02、0x03、0x04的应答报文

表5 FNC为0x05、0x06的请求和应答报文

(3)对多个开关输出量或保持寄存器写操作功能,即功能码FNC为0x0F或0x10,请求报文的帧长度为B+13个字节,其余下域的字节数为B+7个;正常应答的帧长度为12个字节,其余下域的字节数为6 个。B 为实际数据(开关量或保持寄存器)的字节数,VD1…VDB为需要从地址ADD 开始写入的B 个实际数据;QNT 为实际数据 (开关量或保持寄存器)的数量,QNTH 为其高字节,QNTL为其低字节;ADD 为读取的起始地址,ADDH 为其高字节,ADDL为其低字节。功能码FNC 为0x0F,是对QNT个开关输出量进行写入操作,QNT 为从地址ADD 开始需要写入的位数量,QNT 在1~1920之间,其字节数为B=(QNT+7)/8;功能码FNC为0x10,是对QNT 个保持寄存器写入操作,QNT 在1~125 之间,QNT 为地址ADD开始写入的保持寄存器数量,其字节数为B=2*QNT。请求报文的数据帧见表6,正常应答报文数据帧见表7。

(4)异常应答报文的帧长度为9个字节,余下域的字节数为3个,功能码EXF 为原始功能码FNC 加0x80,异常码EXC 表明出错的原因。异常应答报文见表8,异常码0x01、0x02、0x03或0x0B分别表示S7-PLC分析请求报文时发现功能码非法、地址非法、数值或数量非法和单元标识符不一致,以及异常码0x04表示S7-PLC 进行相应操作过程中出现差错。

表6 FNC为0x0F、0x10的请求报文

表7 FNC为0x0F、0x10的应答报文

表8 异常应答报文

3 通信程序架构

在S7-PLC的开关输入量、开关输出量和模拟输入量硬件组态中同一类型按槽位顺序连续地分配地址,保持寄存器由数据块DB数据存储[13],将数据类型相同且地址连续的数据组块传送提高通信效率和可靠。FB 和FC 均是S7-PLC用户程序中的子程序,若FC 用于不同对象的相同功能时新编程序和修改程序,而FB不需要修改程序。对于不同对象FB程序调用,调用的程序相同,背景数据块不同而已,FC没有静态变量,FB 有保存在背景数据块中的静态变量。S7-PLC 基 于Modbus/TCP 通 信 程 序 架 构 如 图1 所示,在通信程序架构中,在S7-PLC作为服务器,通信程序由通信逻辑处理和通信接口两部分组成,一个通信逻辑处理程序需要数个不同通信逻辑处理程序一起应用,实现对开关输入量、开关输出量、模拟量输入量、保持寄存器(四类数据以下称物理数据)的访问功能。一套S7-PLC 含有数块以太网模件,诸如S7-300/400PLC软冗余系统和S7-400PLC硬冗余系统,不仅需要调用多个通信逻辑处理程序,还需要调用多个通信逻辑处理程序,因此通信逻辑处理程序和通信接口程序采用FB 程序。FB通过背景数据量传递的变量区有:输入区(IN)、输出区 (OUT)、输入输出区 (IN_OUT)和静态变量区 (STAT),其中IN、IN_OUT、OUT为接口参数,直接体现在生成的FB 块左右两侧,而STAT 为内部参数。通信接口程序在其不同背景数据块中建立相应存储区,通信接口程序将物理数据按类型映射至其背景数据块中存储区,通信接口程序在物理数据和通信逻辑处理程序中的静态变量收发区进行数据转移作用,系统功能SFC59 (RD_REC)和SFC58 (WR_REC)数据记录区以字节为单位,因此通信接口程序还将物理数据按字节进行组块。通信逻辑处理程序在其背景数据块中建立相应收发区,在其背景数据块中收发区从以太网模件CP接收Modbus/TCP请求报文,分析请求报文,并根据请求报文对通信接口程序中的静态变量存贮区进行访问操作,按规范将数据组成Modbus/TCP应答报文,返回给以太网模件。

图1 S7-PLC基于Modbus/TCP协议通信程序架构

4 通信程序设计

通信逻辑处理程序和通信接口程序采用SCL 语言编写,通信逻辑处理程序包含变量定义、读取请求报文、分析报文、处理报文和发送响应报文5部分。

4.1 变量定义

服务器逻辑功能块定义模件逻辑输入地址 (CP_LAD-DR)、模件连接标识号 (CONN_ID)等输入变量,定义单元标识 (UnitID)、功 能 码 (FctCod)、起 始 地 址 (StrtAdd)、数量或数值 (QntVal)、字节数 (BytCnt)、收发数据区 (MsgBUF)等静态变量,定义发送数据的any指针(anySnd)、接收数据的any指针 (anyRcv)等临时变量。

4.2 读取请求应用数据报文

对于上述8种功能码,Modbus/TCP 请求应用数据报文总长度均大于或等于12 个字节。当功能码为0x10 或0x0F时,请求报文总长度大于12个字节,12个字节后数据域为写入开关输出量或寄存器数据的字节数和写入数据,对于其它功能码,请求应用数据报文总长度为12个字节。调用SFC59读取首12个字节报文数据记录,这12个字节数据不仅包含报文头,还包含功能码、寄存器或开关量的起始地址、数量或数值 (QntVal)。当功能码为0x05 或0x06 时,QntVal表示数值,对于其他功能码,QntVal表示数量。

4.3 分析请求应用数据报文

分析请求应用数据报文包含判断单元标识符、判断功能码、判断数量或数据和判断地址范围,若超出范围,返回非法信息。

4.4 请求处理

当功能码为0x01、0x02、0x03 或0x04 时,首先按规范组建应答报文的首9个字节数据,再从通信接口程序的数据存储区读取数据,并将数据存入应答报文9个字节后的数据域组成应答报文应用数据区。当功能码为0x05时,对单个开关输出量写操作,当QntVal为0xFF00时,对起始地址的开关输出量进行置位操作,当QntVal为0x0000时,对起始地址的开关输出量进行复位操作。当功能码为0x06时,将QntVal赋值予起始地址相应的寄存器。对于功能码为0x05或0x06,将12个字节请求报文不需修改存入应答报文应用数据区。当功能码为0x0F时,按位对开关输出量相应通信接口程序的存储区操作,当功能码为0x10时,按字对寄存器相应通信接口程序的存储区写操作。当功能码为0x0F或0x10时,首先通过SFC59从以太网模件读取单字节的字节数BytCnt,再通过SFC59读取BytCnt个字节数据,并接收到的数据写入相应通信接口程序的存储区,操作成功后,将请求报文首12个字节中的长度值更改为0x0006,并将修改后的12个字节数据存入应答报文应用数据区。

4.5 正常响应或异常响应

操作成功后,将anySnd 指向正常应答报文应用数据区;报文有误以及操作失败,按规范组建相应的异常应答报文应用数据区,同时将anySnd指向异常应答报文应用数据区;调用系统功能SFC58将应答报文发送至以太网模件。

5 工程应用

5.1 系统结构

某水电厂采用基于Modbus/TCP协议的计算机监控系统,上位机采用NC2000监控系统软件,现地控制层采用SJ-500LCU 装置,LCU 采用S7-PLC,见图2。对于每套PLC,均需要设定站地址,Modbus/TCP协议报头中单元标识符来定义和区分各套PLC。上位机作为发起者将请求数据帧的以太网报文至PLC,PLC根据请求要求做出处理和响应。

图2 系统结构

5.2 PLC 硬件组态与网络配置

编程者在Step7 软件平台的硬件组态窗口中,为主机架上分别配置电源模件、CPU 模件和以太网模件,设置以太网模件的逻辑输入地址,选择100Mbps全双工方式通信参数,设置相应IP地址,在Step7 软件平台网络配置组态窗口,为以太网模件配置网络连接,并配置本地连接标识号,协议选用TCP协议,端口号设置为502,通信模式选用发送/接收模式。

5.3 运行结果及分析

该水电厂计算机监控系统在现场成功运行数年,对各设备进行过程监测、数据采集、控制调节。系统运行至今没有出现过通信上的误报、重报、漏报现象,水电厂所有S7-PLC的采集数据传入上位机数据库的时间小于1s,上位机发出命令到S7-PLC接受命令的时间小于200ms。系统通信快速、安全、稳定及可靠,验证了Modbus/TCP 协议通信在S7-PLC系统上实现。

6 结束语

本文通过对Modbus/TCP 协议和对S7-PLC 通信程序资源研究,提出了Modbus/TCP 通信协议在S7-PLC 系统上应用模型,对8种功能码分3类进行分析请求报文和正常响应报文以及异常响应报文等的数据帧,构建S7-PLC基于Modbus/TCP通信程序架构,在此设计了S7-PLC 基于Modbus/TCP协议通信程序。在某水电厂计算机监控系统中通过硬件组态和网络配置实现上位机与S7-PLC 基于Modbus/TCP协议 通 信。Modbus/TCP 通 信 在S7-PLC 系统上成功实现,为Modbus/TCP 协议在S7-PLC 系统上推广应用具有重要意义。

[1]ZHANG Shiyou.Direct communication between PC and S7PLC by fetch/write method [J].Anhui Metallurgy,2012,27 (1):31-33 (in Chinese). [张世友.利用FETCH/WRITE 方式实现PC机与S7PLC 的直接通讯 [J].安徽冶金,2012,27(1):31-33.]

[2]CHEN Qun.Non-driver application of modbus protocol in S7-300 [J].Computer Engineering,2009,35 (1):254-255,259 (in Chinese).[陈群.S7-300中Modbus协议的免驱动应用 [J].计算机工程,2009,35 (1):254-255.]

[3]Siemens A G.SIMATIC factory automation [EB/OL].[2012-08-15].http://www.ad.siemens.com.

[4]GB/T 19582-2008.Modbus industrial automation network specification[S](in Chinese).[GB/T 19582-2008,基于Modbus协议的工业自动化网络规范[S].]

[5]Modbus_IDA.Modbus messaging on TCP/IP implementation guide V1.0b[EB/OL].[2006-10-24].http://www.modbus.org.

[6]Modbus_IDA.Modbus over serial line specification and implementation guide V1.02 [EB/OL].[2006-12-20].http://www.modbus.org.

[7]Modbus_IDA.Modbus TCP conformance test specification V3.0[EB/OL].[2009-12-15].http://www.modbus.org.

[8]Modbus_IDA.Modbus application protocol specification VI.1b3 [EB/OL].[2012-04-26].http://www.modbus.org.

[9]ZHAO Yixin,TANG Yan.Static active optimizing technique investigation for modbus TCP/IP system [J].Journal of Southwest China Normal University (Natural Science),2006,31(4):116-120 (in Chinese).[赵亦欣,唐雁.Modbus TCP/IP系统静态主动优化技术研究 [J].西南师范大学学报 (自然科学版),2006,31 (4):116-120.]

[10]GAO Hongbin,KONG Meijing,HE Menghe.Siemens PLC and industrial control network applications [M].Beijing:Publishing House of Electronics Industry,2006:52-64 (in Chinese).[高鸿斌,孔美静,赫孟合.西门子PLC 与工业控制网络应用 [M].北京:电子工业出版社,2006:52-64.]

[11]Siemens AG.System software for S7-300/400 system and standard functions [EB/OL].[2010-10-31].http://www.ad.siemens.com.

[12]LIU Zhenhua,ZHU Mingfu.Research and implementation of Modbus protocol over UDP/IP [J].Microcomputer Applications,2010,31 (12):20-27 (in Chinese).[刘振华,朱 明富.UDP/IP协议下Modbus协议的研究与实现 [J].微计算机应用,2010,31 (12):20-27.]

[13]Siemens AG.Addressing for S7-300and S7-400 [EB/OL].[2010-09-30].http://www.ad.siemens.com.

猜你喜欢
模件字节寄存器
伺服卡模件更换时负荷突降原因分析
No.8 字节跳动将推出独立出口电商APP
N95口罩机刀模件的设计及加工
Lite寄存器模型的设计与实现
No.10 “字节跳动手机”要来了?
简谈MC7字节码
maxDNA分散控制系统I/O模件冗余实现机制
DCS过程控制站内IO模件地址重叠识别方法
高速数模转换器AD9779/AD9788的应用
一种可重构线性反馈移位寄存器设计