西门子S7-200 PLC网络模块采用S7协议通讯,本文分析S7协议的内容与帧格式,其目的是能够让客户自己编写程序,用自己的socket程序通过以太网读写西门子S200 PLC 区数据。本文对要通过编写程序读取S7-1200、S7-300、S7-400的读者也有帮助。
【关键词】S7-200 S7协议 以太网通讯 TCP/IP
1 前言
在使用西门子S7-200 PLC的中,因为其通讯协议不公开,经常导致客户自己开发监控软件同PLC通讯连接出现困难。本文尝试研究通过以太网读取西门子 S200 PLC数据块及寄存器功能。
由于西门子的S7协议是不公开的协议,所以本文的研究方式是通过监听通讯帧,抓取数据包,然后推测协议的格式、定义及意义。
本文的目的,是能让用户自己编写程序,用自己的程序读取西门子S-7 200 PLC的 I、Q、M、DB区数据。
由于本人主要使用以太网与PLC通讯,所以重点介绍 ISO on TCP的通讯方式。但从网上的资料看出,S200的PPI协议、MPI协议其核心都是S7协议。相信本文对想通过MPI或PPI连接的用户也有一定的帮助。
2 ISO on TCP的模型
ISO(International Organization for Standardization )国际标准化组织制定了OSI(Open System Interconnection)7层模型,包括:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
西门子S7-200网络通讯使用的是:TCP/IP+ISO TP+S7协议。如图1。
通讯过程是:
(1)TCP三次握手建立通讯TCP连接。
(2) ISO_TP连接建立。
(3)S7协议连接请求、应答建立连接。
(4)实现S7协议读取数据。其过程如图2。
3 RFC1006
由于S7-200网络通讯,是使用的ISO TCP,先简要介绍一下ISO TP。如要更清晰了解ISO TP内容,请参考RFC1006及RFC983文档。
3.1 帧格式
ISO TP 帧分为两部分,一部分为帧头,一部分为 TPDU
ISO TP的帧分为4中帧分别是:
(1)CR: connect request(连接请求);
(2)CC: connect confirm(连接应答帧);
(3)DR: disconnect request(断开请求帧);
(4)DT: data(数据帧);
(5)ED: expedited data(扩展数据帧)。
对这5种类型帧,帧头格式一样,TPDU格式不同。
3.2 帧头格式
Vrsn reserved packet length
1 Byte 1 Byte 2 Byte
Vrsn 版本 :03;Reserved:保留;packet length 从vrsn到数据结尾长度,包括Vrsn。
3.3 TPDU格式
3.3.1 CR(连接请求)、CC(连接应答帧)的TPDU格式
如表1所示。
(1)header length:TPDU到帧尾长度,不包括header length这个字节。
(2)code :TPDU 类型,4个bit位。 0xe(1110)为连接请求CR;0xd(1101)为连接确认CC;0x8(1000)为断开连接请求DR;0xF(1111)为数据帧DT;0x1(0001)为扩展数据帧 ED。
(3)Credit:保留,总是0。
(4)destination reference :目的reference,在S200通讯中总是0。
(5)source reference :目的reference,在S200的通讯中,为连续次数(在RFC983中定义该部分为0)。
(6)class :4bits 发送端总是0,接受端忽略。
(7)options :4bits 发送端总是0,接受端忽略。
(8)variable data :该部分可传输多个参数,每个参数部分为:参数码(1Byte)+参数长度(1Byte)+参数值(N Byte)。
在S7-200以太网通讯中,variable data共有三组参数。参数1(C1)为PLC端的连接通道号、PLC机架号、PLC槽号;参数2(C2)为远端连接通道号、机架号、槽号;参数3(C3)为0x0A。
3.3.2 ED(扩充) 的TPDU格式
如表2所示。
header length部分、code部分、credit部分,内容同表2。
PDU-NR and EOT:0x80(1000 0000)表示该帧包括帧尾,即该帧独立,没有后续数据;其他数据忽略。
4 S7协议
西门子的S7通讯协议,是一组复杂的多功能协议,可下载程序,上次程序,操作PLC,读取数据等。本篇只针对S7-200数据读取功能部分进行解读。由于S7协议为没有公开资料,所以解读可能与实际存在差异。
4.1 S7协议连接
在S7协议层,客户端读取S7-200数据前,需要先建立连接。以下是客户端连接请求及PLC的连接应答帧。
(1)连接请求帧为:32 01 00 00 cc c1 00 08 00 00 f0 00 00 01 00 01 03 c0
(2)连接应答帧为:32 03 00 00 cc c1 00 08 00 00 00 00 f0 00 00 01 00 01 00 f0
该部分尚未知确切的含义。
4.2 S7读命令
4.2.1 命令
如表3所示。
标示符【0】: 0x32为帧开始标示符。
请求应答标识【1】:0x01为发送命令帧;0x03为应答帧。
保留【2~3】:保留或未知,填充0x00。
事务处理标识【4~5】:请求、应答事务标识,应答帧直接复制返回该部分。
命令长度【6~7】:填充从命令符开始,到帧结束的字节长度,包括命令本身的1个字节。
保留【8~9】:保留,填充0x00;
命令符【10】:命令符,0x04为读命令,0x05为写命令。
读取数据段数【11】:该部分为”读取数据段”个数。S7协议支持一次读取多个不连续地址的数据,读取段个数为本次读取命令要读取不连续数据段的数目。
读取数据段命令域【12~23】:在读取多个不连续地址的数据时,该部分可重复出现。具体含义:
命令域子段标示头【12】:读取数据段命令域的标识头,为0x12;
命令域子段长度【13】;命令域子端的长度,该字节后,到本命令域子段的长度。
未知【14】:该字节未知确切的含义,通常为0x10。
数据类型【15】:0x01 bit;0x02 byte;0x04为float
读取字节【16~17】:本命令段读取字节长度;
数据块编号【18~19】:读取数据块的编号,为I、Q、M等区,为0;
寄存器类型【20】:读取寄存类型,0x04 顺序控制继电器区(S);0x05特殊存储器区(SM);0x06 模拟量输入映象区(AI);0x07 模拟量输出映象区(AQ);0x1E:计数器存储器区(C);0x81数字量输入寄存器(I);0x82数字量输出寄存器(Q);0x83位存储器区(M);0x84变量存储器(V); 0x1F定时器存储器
区(T)。
偏移地址【20】:开始读取量的偏移地址,安bit计算。
4.3 S7读应答
应答
如表4所示。
标示符【0】: 0x32为帧开始标示符。
请求应答标识【1】:0x03为应答帧。
保留【2~3】:保留或未知,填充0x00。
事务处理标识【4~5】:直接复制请求帧该部分,然后填充返回。
执行命令返回值【6~7】:推测是执行命令的结果代码。推测0x02为执行OK。
数据帧长度【8~9】:从“数据段个数[13]”后,到帧尾的数据长度。
保留【10~11】:保留或未知,填充0x00。
命令符【12】:命令符,0x04为读命令,0x05为写命令。
数据段个数【13】:返回的数据段数
数据段:根据读取不连续地址命令,一个应答帧可包含多个读取的数据段。具体含义:
子数据段标示符【14】:0xFF子数据段标示符。
有效性【15】:该项表示的意义不太确定,推测为该数据段数据的有效性。
数据长度【16~17】:子数据段的数据长度,按bit位计算。
子数据段数据【N】:返回的数据。
5 编程试验
根据以上协议,编程实现通过以太网,读取S7-200PLC数据。读取QB0、MB0的界面如图3。
参考文献
[1]RFC983.ISO Transport Services on Top of the TCP.
[2]RFC1006.ISO Transport Service on top of the TCP.
作者简介
贾涛(1977-),男,现为软件工程师。主要从事监控软件设计。
作者单位