2024年4月27日发(作者:)

Libnodave库的TCP协议剖析

夏正龙;耿浩

【摘 要】西门子系列PLC凭借出色的性能在工业应用场合得到了越来越广泛的应

用,而工控领域不仅仅拘泥于就地集控方式,基于工业以太网络的远方集中监控应用

也越来越广泛.目前上位机系统与西门子系列PLC进行以太网通讯普遍采用基于微

软COM/DCOM技术达成的自动控制协定OPC协议,即工控组态软件方法,由于工

控组态软件成本与工控数据点数多少相关,因此大型PLC自动控制系统软件成本高,

性价比低.通过研究西门子PLC设备第三方开源驱动库Libnodave,分别从应用的角

度和库开发的角度对Libnodave源代码进行解析,给出了更简单清晰的数据包格式.

通过Ethernet转RS-485设备连接PLC的驱动增强方法,详细介绍了测试代码的实

现,该方法基于跨平台移植考虑,便于软件功能上的扩展.%S7 series PLC of

Siemens is playing an increasingly important role in industrial applications

owing to its remarkable performance. Except for local control mode,the

remote centralized monitoring based on industrial Ethernet is also widely

present,the automatic control agreement OPC based on

Microsoft COM/DCOM,namely industrial control software approach,is

utilized commonly in communica-tion between upper computer system

and Siemens series e the cost of industrial control group

software is related to the number of industrial data points,the large PLC

automatic control system is in high cost and low cost this

paper,we analyze the Lib-nodave source code from the perspective of

application and library development through the research on Libnodave,a

third-party open source drive library,of Siemens PLC equipment and give a

simpler and clearer packet implementation of test code is

described in detail with a driver enhancement method of Ethernet

connecting to PLC via consideration of cross-platform

transplantation,this method facilitates the expansion of software functions.

【期刊名称】《计算机技术与发展》

【年(卷),期】2018(028)003

【总页数】5页(P160-164)

【关键词】ISO-on-TCP;Libnodave;以太网协议;可编程逻辑控制器

【作 者】夏正龙;耿浩

【作者单位】江苏师范大学 电气工程及其自动化学院,江苏 徐州221116;徐州上若

科技有限公司 自动化事业部,江苏 徐州221116

【正文语种】中 文

【中图分类】TP31

1 概 述

现代工控领域多采用数字化智能装置代替传统的模拟仪表作为前端控制器,而数字

智能装置一般都具备独自监测监控功能,能实时向上位集控后台实时上传工作状态。

当前工控领域的集控方式由集中控制向分散控制,由分散管理向集中管理转变。西

门子公司的PLC(programmable logic controller)设备在工控领域应用广泛,其

产品系列的丰富与可靠已经得到了广大用户的信赖。目前工控领域控制的实时性要

求越来越高,自然需要一个高速的通讯网络。

随着以太网通讯在工业控制领域的普及,其通讯速率高、可靠性高,在实际应用中

越来越广泛。西门子系列PLC以太网通讯模块有cp243,cp343,cp443。

200SMART和1200自带以太网口。西门子以太网协议众多,有ISO,ISO-on-

TCP,TCP,UDP等。ISO协议是西门子早期的以太网通讯协议,通讯使用的是

MAC地址。TCP、UDP协议,属于用户自定义协议,PLC端和上位机都需要用户

写程序。ISO-on-TCP协议是在TCP/IP协议层,按照ISO协议重新定义,通讯使

用的是IP地址。因为PLC本身就支持ISO-on-TCP协议,所以PLC不用添加任

何程序,只需要上位机按照规定的协议格式写程序就可以和PLC进行数据交换。

西门子公司开源驱动库Libnodave是一个开源驱动库,但该库的使用需要硬件匹

配,它支持的通讯方式主要由daveProtoMPI(针对西门子300/400系列PLC的

MPI协议)、daveProtoMPI2(针对不带STX的Andrew版本西门子300/400系

列PLC的MPI协议)、daveProtoMPI3(针对step7版本300/400系列PLC的

MPI协议)、daveProtoMPI4(针对带STX的Andrew版本西门子300/400系列

PLC的MPI协议)、daveProtoPPI(针对西门子200系列PLC的PPI协议)、

daveProtoAS511(针对S5编程口协议)、daveProtoS7online(针对

动态链接库通信)、daveProtoISOTCP(针对带路由功能的ISO on TCP协议)、

daveProtoISOTCP243(针对西门子200系列PLC设备中以太网模块CP243的

ISO on TCP协议)、daveProtoISOTCPR(针对具有路由功能的ISO on TCP协议)、

daveProtoMPI_IBH(针对通过网关联结的MPI协议)、daveProtoPPI_IBH(针对通

过网关联结的PPI协议)、daveProtoNLpro、daveProtoUserTransport组成。

上述协议主要是PPI协议和ISO on TCP协议。

上位机软件连接西门子PLC可以通过四种方法。一是opc server连接PLC,opc

server可以选用Simatic Net、Kepserver等[1]。二是组态软件连接PLC。例如

组态王驱动库,Intouch的DAServer等。三是用自由口实现通讯[2]。四是编程

方式连接PLC,如开源的Libnodave和西门子的prodave库[3-4],而

PRODAVE是用于上位机与S7系列PLC之间数据连接通信的商业软件包,它提供

了一个接口函数库,DLL和LIB库,以此完成PLC与上位机之间的数据通信。使

用PRODAVE进行控制系统开发,需要调用开发包提供的动态链接库中的函数即

可实现通信,而最新发布的6.2版新增加了对Window 7操作系统的支持。

以上四种方法,除了Libnodave是开源免费的,其他都需要授权。Libnodave是

跨平台的库,其支持MPI协议和以太网协议。以太网具有传输速率高、传输距离

远、可靠性以及开放性较好等优点[5-12]。西门子公司S7系列PLC的通信可以通

过开源驱动库Libnodave实现[13-14]。

文中参考Libnodave库,去掉MPI等协议,只保留需要的以太网协议,直接给出

发包和收包的数据格式,代码结构清晰明了。Libnodave库只提供了cp243,

cp343的连接方式,文中在其基础上增加了S7-200smart、西门子1200系列

PLC的连接方式。

2 研究环境

设计的Libnodave库的TCP协议解析工作,都是在微软Windows 7环境下完成。

后台PC机的IP地址为192.168.1.18,子网掩码为255.255.255.0。

操作系统:Windows 7;

编程软件:Visual Studio 2012;

西门子S7-200smart编程软件:S7-200 PC Access;

西门子S7-300编程软件:Step7 v5.5;

西门子S7系列PLC:S7-300PLC+cp343,200SMART。

测试的PLC的IP地址是192.168.0.25,子网掩码为255.255.255.0。

由于西门子以太网中的ISO on TCP协议所采用的数据传输端口为102,所以

port设置为102。

3 Libnodave程序流程

在软件编写方面,鉴于通过工控组态软件或者OPC服务器/客户端的PLC远程连

接上位机监测监控具有实时性较低、实施成本高等缺点,根据西门子S7-300与

S7-200SMART的实际对象,采用西门子Libnodave开源免费函数库结合高级语

言可以开发基于以太网通讯的监控软件,一定程度上优化远程监控计算机与PLC

之间的通信。该方法对数据的采集与存储、故障分析与处理非常便利,具有实施难

度低、数据交换方式灵活多变、实时性高等优点,具有极高的程序独立性,独立于

西门子其他任何软件。

图1给出了Libnodave测试程序流程。

图1 Libnodave库测试程序流程

该程序用socket同步通讯,Libnodave库协议握手需要调用7个函数。函数首先

打开通信接口句柄后保存到相应变量中,该变量在电泳daveNewInterface时传

递给新生成的daveNewInterface结构体。调用daveNewConnection时需要把

已经生成的daveInterface结构体指针传送到新生成的daveConnection结构中

保存。在调用其他功能函数时,硬件连接方面的信息通过daveConnection来传

递,实现功能函数调用的协议不相关性。由上可见,发送的数据包分布在多个结构

体中初始化,牵扯到多个函数的调用,代码结构纷繁复杂。

4 改进后的库函数

文中参考Libnodave库,改进后的库只有握手、读包、写包三个函数。数据包以

unsigned char数组的形式给出,并标识出每一位的含义,代码清晰明了,方便

移植。

由于所有的数据都是从PLC的内部存储空间获取,主要包括数据库DB、位存储区

M、输入映像区Inputs和输出映像区Outputs。针对上述四个区域,开发读取功

能,并通过位逻辑BOOL、字节BYTE、整形INT、双字节WORD、长整型DINT、

双字DWORD以及实数REAL7中形式读取。

下面是封装的函数列表:

BOOL ConnectPLC();

BOOL ReadBytes(int area, int db, int start, int len, unsigned char* buffer);

BOOL WriteBytes(int area, int db, int start, int len, unsigned char* buffer);

area:读取的数据区,m区是0x83,DB区0x84。

db:m区,值为0;db区,值为db区号。

start:读取的数据地址开始位置。

len:读取几个字节。

buffer:读取到的数值保存的缓冲区。

如:读取“DB1,W10”的数据,(W表示一个字,所以是2个字节),函数应该写

为:ReadBytes(0x84,1,10,2,buffer)。

4.1 握手数据包

每种以太网通讯模块的握手数据包都不相同。发送接收串都是unsigned char类

型的数据。客户端向PLC发送握手数据包,如果数据包是不匹配的,PLC是不会

回数据的。所以接收到数据包并且数据包的长度是22,就说明握手成功。握手通

过后,就可以和PLC进行数据交换了。表1给出cp243,cp343,1200,

200smart的握手数据包。所有发送的数据包前2个字节都是0x03、0x00,第3

和第4字节表示数据包的长度,计算公式为:串[2]*256+串[3]。

表1 cp243,cp343,1200,200smart的握手数据包PLC型号数据包

cp3430x03,0x00,0x00,0x16,0x11,0xE0,0x00,0x00,0x00,0x01,0x00,0xC1,0x02,

0x01,0x00,0xC2,0x02,0x02,0x02,0xC0,0x01,0x09cp2430x03,0x00,0x00,0x16,0

x11,0xE0,0x00,0x00,0x00,0x01,0x00,0xC1,0x02,0x4d,0x57,0xC2,0x02,0x4d,0x

57,0xC0,0x01,0x0912000x03,0x00,0x00,0x16,0x11,0xE0,0x00,0x00,0x00,0x93

,0x00,0xC1,0x02,0x10,0x11,0xC2,0x02,0x03,0x01,0xC0,0x01,0x0a200smart0x

03,0x00,0x00,0x16,0x11,0xE0,0x00,0x00,0x00,0x01,0x00,0xC1,0x02,0x00,0x0

0,0xc2,0x02,0x02,0x00,0xc0,0x01,0xa

位置的值为0x01,表示PG连接,0x02表示OP连接,0x03表示Step7Basic连

接。

4.2 读数据包

表2为读数据包(“口”占一个字节);表3为读数据返回包。

表2 读数据包偏移地址数据说明数据头0,10x03,0x00,值不变2,3口,口,表示串的

长度数据4-

220x02,0xf0,0x80,0x32,0x01,0x00,0x00,0xff,0xff,0x00,0x0e,0x00,0x00,0x04,0

x01,0x12,0x0a,0x10,值不变22口,0x01表示按位读,0x02表示按字节读23,24口,

口,len/256,len%25625,26口,口,db/256,db%25627口,0x83表示m区,0x84表

示db区280x00,值不变29,30口,口(start*8)/256,(start*8)%256

如果读取PLC的数据包是不正确的,PLC是不会回数据的。所以接收到数据包,

说明读取成功。返回的数据包中包含了要读取的数据。

4.3 写数据包

文中设计数据可以向数据库DB、位存储区M、输入映像区Inputs和输出映像区

Outputs中写入的功能,并可通过BOOL、BYTE、INT、WORD、DINT、

DWORD以及REAL七种形式写数据。以BYTE为基本单元,以一帧数据为写入

数据包为例,如表4所示。

表3 读数据返回包偏移地址数据说明数据头0,10x03,0x00,固定值2,3口,口,表示

串的长度数据4-

220x02,0xf0,0x80,0x32,0x03,0x00,0x00,0xff,0xff,0x00,0x02,0x00,0x06,0x00,0

x00,0x04,0x01,0xff,0x04,0x00,0x10,23,24口,口,表示的是数据位长度,计算成字

节公式:(串[23]*256+串[33])/8,其值应该和len一样25……口,……返回的数据,比如

返回2个字节数据,就占用串[25]和串[26]两个字节

表4 写数据包偏移地址数据说明数据头0,10x03,0x00,值不变2,3口,

口,(35+len)/256,(35+len)%256数据4-

140x02,0xf0,0x80,0x32,0x01,0x00,0x00,0x00,0x00,0x00,0x0e值不变15,16口,

口,(4+len)/256,(4+len)%25617-220x05,0x01,0x12,0x0a,0x10,0x02值不变

23,24口,口,len/256,len%25625,26口,口,db/256,db%25627口,0x83表示m

区,0x84表示db区280x00,值不变29,30口,

口,(start*8)/256,(start*8)%25631,320x00,0x04值不变33,34口,

口,(8*len)/256,(8*len)%25635……口,……写入的数据,比如写入“db1,w10”,就占

用串[35]和串[36]两个字节

如果写入PLC的数据包是不正确的,PLC是不会回数据的。所以接收到数据包并

且数据包的长度是22,就说明写入成功。

写数据包返回包

0x03,0x00,0x00,0x16,0x02,0xf0,0x80,0x32,0x03,0x00,0x00,0x00,0x00,0x00,0x

02,0x00,0x01,0x00,0x00,0x05,0x01,0xff

5 测试程序

测试程序主要有4个部分,分别为建立端口连接、设备联络握手、读写数据以及

句柄释放,详细流程如图2所示。

图2 测试程序流程

(1)建立连接。

connect(sockClient,(SOCKADDR*)& addrSrv,sizeof(SOCKADDR));

//tcp 连接与初始化连接与端口号

(2)协议握手。

ConnectPLC();

//通过协议握手数据的发送与接收情况启动相关校验程序,从而判断是否握手成功

(3)数据交换。

unsigned char v2[2]={0};

daveReadBytes(AREA_DB, 1, 10, 2, (void *)v2);

unsigned char v4[2]={0};

Put16(v4,2);

WriteBytes(AREA_M,0,20,2,(void *)v4);

//通过读写数据部分,启动数据帧的发送与接收工作,主要完成上位机与PLC的

数据交换与处理。

(4)断开连接

closesocket(sockClient);

//关闭套接字

测试程序截图如图3所示。

图3 测试程序截图

6 结束语

通过研究西门子开源设备Libnodave驱动库,解析西门子系列PLC通信原理以及

该开源库的编程结构,使得根据不同硬件或者平台需求借用源代码实现同西门子系

列PLC通信成为可能。鉴于Libnodave驱动库的免费、开源、稳定、灵活等特点,

取代PRODAVE来开发基于西门子S7-300与S7-200SMART的监控系统软件,

从而降低成本,提高西门子相关产品的局限性。Libnodave库是C语言编写的开

源跨平台的库,但是仍然不方便在跨语言方面的移植,比如在VB、C#等中调用它,

需要把Libnodave封装成二进制文件,并提供接口函数。文中通过研究西门子开

源设备Libnodave库,直接给出send,recv的字节码,非常方便跨语言、跨平

台的移植,对于嵌入式应用环境中有限的运算资源是一个有利的支撑,其研究成果

可以为工控行业各生产企业现场设备的升级改造与建设提供一定的借鉴,具有一定

的参考价值。

参考文献:

[1] 任思成,王书鹤,亓克贵.新一代工业过程控制软件接口标准-OPC技术

[J].仪器仪表学报,2002,23:265-267.

[2] 沈世斌.基于PLC自由口通信的应用[J].仪表技术与传感器,2004(12):26-

28.

[3] 周广颖,张金金,闫 隆.基于LIBNODAVE的上位机与西门子PLC的通信

[J].微计算机信息,2010,26(11-1):28-30.

[4] 赵 军,时良平,黄春阳.基于Prodave技术的西门子PLC监控调试软件开发

[J].自动化应用,2011(10):26-28.

[5] 张晓丽,马 俊,刘轶斐.炼钢厂实时数据通信系统的研究与开发[J].仪器仪表

学报,2005,26:553-556.

[6] 魏立新,冯 曦,王洪庆,等.LIBNODAVE在PLC上位机监控软件中的运用

[J].仪表技术与传感器,2014(7):82-84.

[7] DILIP P S,JAGTAP S monitoring & controlling of real time

industrial parameters with GSM & Ethernet[J].International Journal of

Electronics Communication & Instrumentation Engineering Research &

Development,2013,3(2):1-10.

[8] SCHNEIER nalysis of Microsoft’s point-to-point tunneling

protocol (PPTP)[C]//Proceedings of the 5th ACM conference on computer

and communications security.[s.l.]:ACM,1998:132-141.

[9] HU M,ZHAO Q,KURAMOTO M,et ch and implementation of

layer two tunneling protocol (L2TP) on carrier network[C]//4th IEEE

international conference on broadband network and multimedia

technology.[s.l.]:IEEE,2011:80-83.

[10] 桂 芳,全书海.网络控制系统传输时延分析与测试[J].计算机应用,

2005,25(10):2264-2266.

[11] 张晓倩,宋晓茹,曹建建.基于CAN总线的网络控制系统的仿真研究[J].计算机技

术与发展,2016,26(7):192-195.

[12] 党安喜,裴少婧,尚耀东,等.以太网时延仿真与性能分析[J].计算机工程与应

用,2009,45(2):119-121.

[13] IANNONE F,BERTOCCHI A,BONCAGNI L,et source solutions in

control and data acquisition systems:FTU case studies[J].Fusion

Engineering and Design,2010,85(3-4):321-324.

[14] 孙书欢,孔祥成,吴雪婷.西门子PLC设备开源驱动库Libnodave的研究与

改进[J].核电子学与探测技术,2013,33(7):847-851.