张世友
(安徽马钢自动化信息技术有限公司 ,安徽马鞍山,243011)
随着PLC性价比的不断提高,其应用范围不断扩大,特别是近年来PLC向着大型网络化方向发展,已经渗透到钢铁,化工电力,制造、运输等各个行业中。针对PLC编程、计算能力有限及PC机大量应用的情况,PC机与PLC的结合使用就成为必然趋势。在各行各业的控制系统中西门子的S7 PLC被广泛采用,由于西门子公司没有公开西门子的S7以太网通讯协议,目前S7-400 PLC和PC机通讯的方式主要有以下几种:
⑴通过西门子OPC服务器实现PC机和PLC通讯;
⑵利用西门子的SAPⅠ(西门子应用程序编程接口)调用西门子提供的动态链接库函数来实现PC机应用程序和PLC之间的数据之间交换。
⑶在PLC和PC机之间建立通讯连接,调用PLC的通讯功能块,利用TCP/ⅠP协议之间和PC机进行通讯。
⑷在利用FETCH/WRⅠTE方式实现PLC和PC机之间通讯,直接读取PLC的M区、Ⅰ区、Q区、DB区等区域内的任何数据。
在以上四种方式虽然都能和PLC实现数据交换,前三种通讯方式有的要安装数量不等的西门子软件,有的只能交换某一特定数据块的数据,增加系统的软件成本和调试维护的难度;而第四种利用Windows操作系统中的 TCP/ⅠP协议和 PLC的FECTH/WRⅠTE通讯方式直接实现PLC和PC的数据交换,不仅节省了系统的软件成本,同时加快了系统的响应速度,可以读S7 PLC中所有区域内的数据。
TCP/ⅠP是当前应用最为广泛的通讯协议,广泛应用于各种PC网络;西门子的工业以太网卡如CP443-1也支持TCP/ⅠP协议,为S7 PLC和PC通讯提供了硬件基础。TCP/ⅠP协议实现了两种通讯方式:面向连接的(TCP)通讯方式和无连接的(UDP)通讯方式;由于工业现场的数据都十分重要,为了保证通讯的准确无误,我们采用了面向连接的通讯方式。
为了使S7400-PLC能够和PC机进行通讯,需要通过CP443-1以太网模块,将S7400-PLC连到以太网上,同时设置好正确的ⅠP地址和网关等,进入西门子硬件组态,选择CP443-1以太网模块的属性,在相应的位置设置好ⅠP地址、网关和子网掩码等相关信息;在西门子的网络组态软件(NET PRO)中要建立一个通讯连接,在网络协议栏中选择TCP协议,同时设置好本地通讯的端口,同时将连接的方式设置为FETCH/WRⅠTE方式,且PLC作为通讯服务器方。
利用FETCH/WRⅠTE方式,其他设备可以存取S7系统中的任何存储期的数据,进行数据交换时,在S7-400 PLC段不需要编写任何程序,只需要按照要求设置好相应的通讯连接,并且PC机按要FETCH和WRⅠTE的PDU的要求发送相应的通讯请求报文PLC,PLC根据接受的请求报文后对请求报文解析处理,然后返回确认数据报文或响应数据报文,完成一次通讯操作。
为了通过FETCH/WRⅠTE方式和PC机通讯,必须要知道每个通讯报文的数据组成,S7请求报文的长度有16个字节组成,分为向PLC写数据的数据报文格式和从PLC读取数据的数据报文格式。
2.2.1 向PLC写数据的请求报文和相应报文格式(见图1)
写数据请求报文由PC发送到PLC,主要包括:系统标识、报头长度、操作代码表示、操作代码长度、操作代码等,这些内容对每个报文都是固定的值,同时报文包括操作的区域(DB区、Ⅰ区、Q区、M区、C区、T区)、数据块号(在对DB区操作时有效,范围为:1~255)、以字节为单位的起始地址、以字节为单位的数据长度和要发送的具体数据。写数据响应报文由PLC发送到PC机,确认写数据请求报文的处理情况,如果成功,则数据写响应报文的错误代码(Error field)为0,如果请求报文中的数据有误,则通过写数据响应报文返回错误代码。
2.2.2 从PLC读取数据的请求包和相应包格式(见图2)
图1 写数据报文及其响应报文
图2 读数据请求报文及其相应报文
读数据请求报文由PC发送到S7 PLC,能够读取的数据区域和写入数据相同,主要不同是操作代码不同,其读请求报文不含数据区;读响应报文除了含有报文头外,还包含请求数据包中所请求读取的数据,若错误,则返回错误代码。
在WⅠNDDOWS操作系统下,通过WⅠNSOCK网络编程接口,来实现应用程序的网络通讯功能;为了减少程序的CPU占用率和提高系统的实时性,采用了OverlappedⅠ/O(重叠式Ⅰ/O)Socket通讯方式。通常一台PC机有可能和多台PLC连接,为使程序高效执行和减少程序设计的复杂性,将采用多线程技术,PC机和不同PLC的通讯有不同的线程来完成,整个通讯程序采用VisualC++2005开发平台下完成。
PC机和一台PLC通讯的功能都在一个线程函数中完成。主要过程有:首先初始化WinSocket通讯动态连接库,然后创建套接字,并且将其绑定到TCP协议上;然后开始和PLC的以太网接口进行建立连接;在连接建立好以后,开始向PLC发送读或写数据的请求报文,并进行Ⅰ/O重叠操作,等待PLC响应;测试有没有数据发送,若有,则接受,若没有,则继续测试;整个程序的流程图如图3。
图3 P C机通讯流程图
为了和多个PLC进行通讯,可以在通讯模块中为每个PLC创建一个通讯线程,由不同的线程和不同的PLC进行通讯,这样便于系统的调试和维护,同时程序设计时采用了通讯容错技术,在PC机和PLC的网络出现故障时,PC机每隔30 s会和PLC建立通讯连接,只要PLC重新在线,不需要人工干预,系统自动恢复正常。
因S7400PLC和PC机的在整数,浮点数等数据类型中高低字节顺序正好使相反的,为了保证数据正确的传输,在PC机端需要对接受到的PLC数据和发送给PLC的数据进行高低字节顺序的对调;利用C++语言中的union(联合体)可以实现该功能,过程如下:首先定义联合体S7Data,在联合体内部定义一个整型数(两个字节)变量iData、浮点数(四个字节)变量fData和一个4个字节的char(字符)类型的数组变量cData[4],在数据接受自PLC或发往PLC整型数或浮点数分别联合体的iData或fData变量中,然后将cData[4]中将高低字节顺序颠倒,联合体中的iData或fData(根据PLC数据类型)就是PLC中相应数据的值了。
为了便于控制系统和二级系统的集成,已经将本技术开发成中间件,成功应用于江阴兴澄铁钢1#加热炉三级系统、马钢车轮压轧线机械手控制系统,马钢(合肥)1#连续退火机组等生产线上,通过近几年的运行,证明该通讯方式非常简洁高效,保证了工艺数据和设定值的高效传输。
[1](美)Anthony Jones Jim Ohlund.Windows网络编程技术[M].北京:机械工业出版社.2000