技术论坛

 西门子通信协议S7COMM【转载】

返回主题列表
作者 主题
荧惑mars
侠士

经验值:1413
发帖数:157
精华帖:6
楼主    2020-04-02 09:53:54
主题:西门子通信协议S7COMM【转载】 精编帖 

不知道用的人多不多,刚好最近在学习,分享之……


首先,这里所说的S7Comm 协议只是西门子S7通讯协议簇里的一种,以0x32开始的报文结构。


1、S7Comm协议结构:


借助WireShark抓包,可以看到,S7Comm 以太网协议基于OSI模型:


OSI layer     Protocol

7                 Application Layer S7 communication

6                 Presentation Layer S7 communication(COTP)

5                 Session Layer S7 communication(TPKT)

4                 Transport Layer ISO-on-TCP (RFC 1006)

3                 Network Layer IP

2                 Data Link Layer Ethernet

1                 Physical Layer Ethernet

其中,第1~4层会由计算机自己完成(底层驱动程序);关于这些神马的定义,大家可以上网查一下;

第5层TPKT,应用程数据传输协议,介于TCP和COTP协议之间;这是一个传输服务协议,主要用来在COTP和TCP之间建立桥梁;


"TPKT is an"encapsulation" protocol. It carries the OSI packet in its ownpacket's data payload and then passes the resulting structure to TCP, from thenon, the packet is processed as a TCP/IP packet. The OSI programs passing datato TPKT are unaware that their data will be carried over TCP/IP because TPKTemulates the OSI protocol Transport Service Access Point (TSAP)."


第6层COTP,按照维基百科的解释,COTP 是 OSI 7层协议定义的位于TCP之上的协议。COTP 以“Packet”为基本单位来传输数据,这样接收方会得到与发送方具有相同边界的数据;


第7层,S7 communication,这一层和用户数据相关,对PLC数据的读取报文在这里完成;


刚看到TPKT和COPT也许会很迷惑,其实在具体的报文中,TPKT的作用是包含用户协议(5~7层)的数据长度(字节数);COTP的作用是定义了数据传输的基本单位(在S7Comm中 PDU TYPE:DT data);


S7Comm与标准TCP/IP比较:S7Comm是一个7层协议;TCP/IP是四层协议,用户数据在第四层TCP层完成;


计算机与PLC进行通讯,可以连接102端口,这是西门子开放的一个通讯端口;


2、第七层 S7 communication协议


S7 communication包含三部分:1-Header;2-Parameter;3 - Data。


根据实现的功能不同,S7 communication协议的结构会有所不同;例如,请求数据报文只包含前两部分;


     <1>Header     



       *01(1 byte): protocol Id: 0x32;


       *02a(1 byte): ROSCTR: Job (01);


       *02b(2 byte): redundancy identification (reserved): 0x0000;


       *2c(2 byte): protocol data unit reference; it’s increased by request event;


       *2d(2 byte): parameter length - the total length (bytes) of parameter part;


       *2e(2 byte): data length; 读取PLC内部数据,此处为00 00;对于其他功能,例如:读取CPU的型号,此处为Data部分的数据长度;


    <2>Parameter(读取数据)


      *3(1 byte): function code: Read Var (0x04);writeVar (0x05);


        *4(1 byte): item count;


        *5(1 byte): variable specification: 0x12;


        *6(1 byte): length of following address specification – is 7~12length in byte;


        *7(1 byte): syntax Id: S7ANY (0x10);


        *8(1 byte):transport size: BYTE(2);


        *9(2 byte): requested data length;


        *10(2 byte): DB number; 如果访问的不是DB区域,此处为00 00;


        *11(1 byte): Area: 0x84= data block(DB); 0X82= outputs(Q); 0x81=inputs(I); 0x83= Flags(M); 0x1d= S7 timers(T); 0x1c= S7counters(C);


        *12(3 byte):address- start address from zero bit


        *5~*12构成了一个基本的数据请求单元[Item],对多个不同地址区域的数据请求,就是有多个[Item]构成的。


         Parameter部分的数据结构可以总结为:


                     [Function code ]+ [Item count] + Item[1] + Item[2]  . . . Item[n]  


        <3>Data


          这一部分与功能有关,例如:读取CPU型号、向CPU存储区写数据;在请求数据报文中此部分不包含任何数据。




      3、S7Comm以太网通讯过程(以1500PLC为例)    


      计算机与1500PLC进行S7Comm以太网通讯,需经过三个过程:


      <1>“握手”


               当PC与PLC通过Socket建立链接时,会进行“三次握手”,这是标准的TCP连接方式;这个过程会有Socket自动完成;


      <2> 通讯请求


              在“握手”之后,并不能马上进行数据交换,还需要"通讯请求"过程。这个过程包含两次报文交换:


                1> PC 发送COTP报文给PLC;在COTP报文中包含“连接请求”和“destination TSAP” - 明确CPU的机架号和槽号;


                      PLC反馈COTP报文,包含“连接确认”;


                        这样PLC就清楚了需要和那个CPU来进行数据通讯;


                2> PC 发送S7Comm报文给PLC;在S7 communicaton报文中包含“通讯请求”;


                      PLC反馈S7Comm报文。


      <3> 交换数据


               数据读写就在这个过程内完成。我们可以组织报文来实现我们需要的功能。这个过程内的报文是S7Comm格式;  


               具体实现时,需要对S7Comm中的第5、6、7层进行编程。


      *需要注意的是,如果不进行“第2步-通讯请求”而直接发送交换数据报文,则PLC会将连接断开。

————————————————

版权声明:本文为CSDN博主「assassion1981」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/powersun1981/article/details/54289776




活到老,学到老。
荧惑mars
侠士

经验值:1413
发帖数:157
精华帖:6
2楼    2020-04-02 10:01:00
精编帖  主题:回复:西门子通信协议S7COMM【转载】

工控协议——S7通讯协议

S7协议简介

2. TPKT协议

3.COTP协议

S7通信支持两种方式

S7comm协议

S7comm的结构主要分为三部分:

Header:

S7协议简介

S7以太网协议本身也是TCP/IP协议簇的一员,S7协议在OSI中的位置相当于将物理层和数据链路层之上的协议进行了定义,S7comm的协议栈修改程度更高,在应用层组织的数据经过COTP协议、TPKT协议的进一步处理后,最终通过TCP进行传输


S7协议与TCP/IP其中的对应关系:


ISO-OSI参考模型 TCP/IP模型 S7以太网协议模型

7-应用层 4-应用层 6-S7 Communication

6-表示层 5-S7 Communication (COTP)

5-会话层 4- S7 Communication (TPKT)

4-传输层 3-传输层 3-TCP(102端口)

3-网络层 2-网络层 2-IP

2-数据链路层 1-网络接口层 1-工业以太网

1-物理层

备注:这里的S7模型并不是说S7是独立于TCP/IP的,只是为了标出S7模型下比较有代表性的内容,事实上S7就是TCP的一种定制,是TCP协议簇的一种


在进行报文分析前,我们首先把s7的大概分析如下:


2. TPKT协议

TPKT(Transport Service ontop of the TCP):通过TCP的传输服务。介于TCP和COTP之间。属于传输服务类的协议,它为上层的COTP和下层TCP进行了过渡。功能为在COTP和TCP之间建立桥梁,其内容包含了上层协议数据包的长度。一般与COTP一起发送,当作Header段。我们常用的RDP协议(remote desktop protocol,windows的远程桌面协议)也是基于TPKT的,TPKT的默认TCP端口为102(RDP为3389),其实它本身为payload增加的数据并不多,主要就是以下几个:


version,1byte,表明版本信息

reserved,1byte,看到这个名字就知道是保留的了

length,2byte,包括payload和这三部分在内的总长度


接下我们用2018工控比赛流量包来实际看一眼:


可以看到,版本号是3号,长度为31,除此之外该层并没有什么有用信息了


3.COTP协议

COTP协议的全称是(Connection-Oriented Transport Protocol),即面向连接的传输协议,从这个名字就可以看出,它的传输必然是依赖于连接的,所以在传输数据前必然有类似TCP握手建立链接的操作。


接下来我们看看具体的流量包:

1


首先是TCP的三次握手,在192.168.25.146与192.168.25.139间建立了TCP连接,之后是两个COTP的包,注意,这里wireshark为我们标注出了CR和CC,后面的COTP包都是DT,这里的CR和CC其实分别是connect request(请求连接)和connect confirm(确认连接)的,也就是建立连接的过程,之后连接建立成功后,发送DT包,也就是data ,是在发送数据。

(备注:wireshark是网络封包分析软件:下载地址为:https://www.wireshark.org/download.html有兴趣的可以去下载了解一下)


接下来我们看看他们所携带的数据:


可以看到,DT包和连接包有着明显的不同,连接包明显多了一堆内容,这其实是COPT包的两种形态,COTP连接包(COTP Connection Packet)和COTP功能包(COTP Fuction Packet)


首先来看COPT连接包,通过上面的wireshark的分析我们可以看到,主要有以下几个字段:


length,1byte,数据的长度,但并不包含length这个字段(至于为什么这样,不清楚)

PDU type,1 byte,标识类型,图中的0x0d即为连接确认的类型,常有的还有

0xe,连接请求

0x0d,连接确认

0x08,断开请求

0x0c,断开确认

0x05,拒绝

DST reference,2byte,目标的引用,可以认为是用来唯一标识目标

SRC reference,2byte,源的引用,同上

option,1byte,可以看到wireshark将8位拆为了前四位和后两位:

前四位标识class,也就是标识类别

倒数第二位对应Extended formats,是否使用拓展样式

倒数第一位对应No explicit flow control,是否有明确的指定流控制

parameter,附加的参数字段,参数可以有多个,每个参数又由以下几个字段构成:

code,1byte,标识类型,主要有:

0xc0,tpdu的size,tpdu即传送协议数据单元,也就是传输的数据的大小(是否和前面的length有重复之处?)

0xc1,src-tsap,翻译过来应该叫源的端到端传输(在完整的TCP/IP协议栈中,这个字段代表的是应用与应用之间的通信,我这里猜测可能是为了),但从西门子给的手册来看,它标记的应该是机架号,可是不管我怎么查,也没有找到wireshark解析出的字符串。那么逆向我们找不到答案,就只能正向来了,在parameter字段的最后我们再来详细说这到底是个啥。


0xc2,dst-tsap,同上,之后我们再探索

length,长度

对应的数据

接着COPT功能包,其实个人感觉这两种包可以归为一种,但是看到文献都是分为两种的,那我们也就划分为两种吧

length,1byte,长度

PDU type,1 byte,图中为0x0f,即为数据传输,此外的type都不太常用,这里不再提了(其实是我没找到相关的流量包……有这方面流量的大佬希望补全以下)

option,1byte,以位为单位划分:

第一位,标识是否为最后一个数据包(从这可以看出,COPT协议当数据较多时,会分为几个单元传输

后七位,标识TPDU的number

到这COPT包我们就算是分析的彻彻底底了,当然,上面还留了个小问题,parameter里的tsap到底是个什么东西?

S7通信支持两种方式

1.基于客户端(Client)/服务器(Server)的单边通信;

客户端(Client)/服务器(Server)模式是最常用的通信方式,也称作S7单边通信。在该模式中,只需要在客户端一侧进行配置和编程;服务器一侧只需要准备好需要被访问的数据,不需要任何编程(服务器的“服务”功能是硬件提供的,不需要用户软件的任何设置)。

2.基于伙伴(Partner)/伙伴(Partner)的双边通信;

有时候,我们需要双向的数据操作,这就要使用伙伴(Partner)/伙伴(Partner)通信模式。

伙伴(Partner)/伙伴(Partner)通信模式也称为S7双边通信,也有人称其为客户端(Client)—客户端(Client)模式。不管是什么名字,该通信方式有如下几个特点:


通信双方都需要进行配置和编程;

通信需要先建立连接。主动请求建立连接的是主动伙伴(Active Partner),被动等 待建立连接的是被动伙伴(Passive Partner);

当通信建立后,通信双方都可以发送或接受数据;

举例:在S7-300中,使用FB12(BSend)/FB13(BRecv)进行发送和接收。当一方调用发送指令时,另一方必须同时调用接收指令才能完成数据的传输。


S7comm协议

S7comm的结构主要分为三部分:

Header

Header:主要是数据的描述性信息,包含长度信息,PDU参考和消息类型常量,最重要的是要表明PDU的类型

Parameter:参数,随着不同类型的PDU会有不同的参数

Data:数据,该数据是一个可选字段来携带数据,例如存储器值,块代码,固件数据等。

如下图:



Header:



Protocol id 1 byte,即协议的id,始终设置为0x32

ROSCTR 1byte,pdu(协议数据单元(Protocol Data Unit))的类型,一般由以下几种:


0x01-job:开工干活的意思,主设备通过job向从设备发出“干活”的命令,具体是读取数据还是写数据由parameter决定

0x02-ack:确认 确认有没有数据字段

0x03-ack-data:从设备回应主设备的job

0x07-Userdata:原始协议的扩展,参数字段包含请求/响应id,(用于编程/调试,SZL读取,安全功能,时间设置,循环读取…)

Reserved:2byte,保留,始终设置为0x0000

PDU reference:pdu的参考–由主站生成,每次新传输递增,用于链接对其请求的响应,Little-Endian(注意:这是WinCC,Step7和其他西门子程序的行为,它可能是随机的生成后,PLC只将其复制到回复中)

parameter length:参数的长度

error class:错误类型,像是图中的0x00就是没有错误的意思,而常见的请求错误则是0x85

error code:错误码,结合错误类型来确定错误,图中的0x00同样是没有错误的意思

关于具体的错误类型和错误码的信息大家可以自行搜索,因为太多了这里就不再展开说明了。

推荐地址:https://www.jianshu.com/p/19798f2768e1


Parameter:取决于不同的pdu类型,

下面来看看具体的流量包


可以看到该pdu为job,也就是主设备在发号施令,而通过parameter可以看到,function是0x04的read,也就是读取数据,item count意思是后续跟了几个item,该pdu就一个,所以为1。


而这个item的结构就有要单独说说了:

variable specification,1byte,一般就是0x12

Length:Length of following address specification,数据的长度

Syntax Id:符号id,一个标志,决定了一些格式性问题,这里是0x10是Address data S7-Any pointer-like DBx.DBXx.x的意思,具体意思我们下面再提,详细的大家还是可以去自己看看,主要就是对于后续的寻址起到了一定的限定

Transport size: 传输大小,也可以认为是传输类型,在这是4,也就是WORD

DB number: 就是数据块编号的意思,0就代表要找的东西不在数据块里

Area: 要操作的“东西”,比如0x82,就是读设备的输出,通过这一位也可以看到,我们要读的数据不在DB里,所以DB number为0,如果为DB的话,这1byte应该为0x84

Address: 具体的地址,如下图所示,前五位没用到,第六位到第二十一位是Byte地址,最后三位是Bit的地址


首先,它定义了格式为Address data S7-Any pointer-like DBx.DBXx.x,然后指定了读取的”东西“为设备的输出,读取的大小为word,其实到这里这个pdu的全部信息就已经分析完了,为了更好的理解上面定义的格式,我们还是继续看一下。


它读的DB number是0那么根据格式就是DB0.DBXx.x,而读取的address是Byte为0,Bit为0,也就是DB0.DBX0.0,如果我们指定的”东西“为数据块的话,就按照这种格式读取。这就是格式的意思,再比如说0xb2,描述为Symbolic address mode of S7-1200,实际上格式就是符号地址,就不再是这样的组织形式了。


再来看看上个pdu的相应,这里截图没截到header,header最值得关注的是pdu的类型,这里是0x03,也就是我们之前提到过的对于job的相应

而paramter部分可以看到,function是与job pdu的相同的。Data部分就是传回来的具体数据了,return code是返回码,用来标识job让干活的结果,这里是0xff,代表的是成功的意思,除了这个,还有以下几种:

0x01,硬件错误

0x03,想访问的东西不让访问

0x05,地址越界了

0x06,你请求的数据类型和请求的”东西“的数据类型不一致

接着是data的长度(是真的data的长度,不包含前面),最后就是具体的data了,可以看到,这里读到的是0x0000。


下面结合具体案例分析

工业协议数据流量包分析


可以看到一大堆的协议,不过整体思路还是刚才清晰的,首先是ARP协议去找mac地址(不知道arp的,补一下计算机网络的知识吧……),接着是标准的TCP三次握手,接着是COTP的建立连接(要不以后我叫他两次握手?),接着就到了S7comm和modbus来具体干活了。

思路体现如下:

ARP–>mac地址–>TCP三次握手–>COTP建立连接–>S7comm干活


我们可以看到这个job和我们之前的并不一样,打开仔细瞧瞧


我们看到parameter中的funtion为0xf0,是建立通信的意思,这其实是和上面的TCP、COPT有些相似的,都是在两个设备之间建立通信,而参数的主要信息是MAX AMQ calling和MAX AMQ called。

下面一个ack_data的pdu自然是相应建立通信的意思了,经过TCP握手、COPT建立连接、S7comm建立通信,这样设备间的通信才正式建立完毕了。

往后的S7comm可以看到是read,也就是在读数据,数据包和上面提到的一样,

总结

S7comm作为一个私有协议,它的可出题点其实更多,而且由于是私有协议,很多地方都还有挖掘的空间,这篇文章只是带大家按照我的思路,从无到有的分析了S7comm的各个部分,肯定有不完全正确的地方,也肯定有细节没有考虑到,希望大家能更进一步,探索更多的秘密。

数据来源:https://github.com/w3h/icsmaster/tree/master/pcap


2.S7 协议工作流程


client与server通过socket建立连接,过程是标准的TCP连接方式,这一步完成连接的建立

client发送COTP,请求连接PLC,报文中包含CR Connect Request和Destination TSAP,从而标识出CPU的机架号和槽号

PLC返回COTP,确认连接,报文中包含CC Connect Confirm,此时server已经明确client与哪个CPU进行通讯

client发送S7 Communication给server,报文中包含Setup communication,即通讯请求

server返回S7

Communication给client,报文的ROSCTR为ACK_DATA,有确认的意思,包含了对作业请求的回复

client与server发送交换数据的报文,仍以S7 Communication完成

注:2-5的步骤中,2与3完成数据传输前连接的功能,4与5则完成连接之后的通讯请求,如果绕过通讯请求的建立,在有TCP时就进行数据交换,服务器一般会直接断连

另外推荐几个有用的协议网站

开源通信库snap7:http://snap7.sourceforge.net/

S7 wireshark解析器:https://sourceforge.net/projects/s7commwireshark/

S7捕获包:https://github.com/gymgit/s7-pcaps

PLC4X: http://plc4x.apache.org/protocols/s7/index.html

————————————————

版权声明:本文为CSDN博主「闲鱼!!!」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_43158056/article/details/104298156


活到老,学到老。
荧惑mars
侠士

经验值:1413
发帖数:157
精华帖:6
5楼    2020-04-02 11:15:28
精编帖  主题:回复:西门子通信协议S7COMM【转载】

S7-200/300/400,是S7comm

S7-1200/1500,是S7comm-plus

S7-1200/1500固件版本V3.0以上,S7comm-plus有更新,具体内容未知。


附上wireshark维基百科解释

https://wiki.wireshark.org/S7comm


S7 Communication (S7comm)

S7comm (S7 Communication) is a Siemens proprietary protocol that runs between programmable logic controllers (PLCs) of the Siemens S7-300/400 family.

It is used for PLC programming, exchanging data between PLCs, accessing PLC data from SCADA (supervisory control and data acquisition) systems and diagnostic purposes.

The S7comm data comes as payload of COTP data packets. The first byte is always 0x32 as protocol identifier. Special communication processors for the S7-400 series (CP 443) may use this protocol without the TCP/IP layers.


OSI layer     Protocol

7                 Application Layer S7 communication

6                 Presentation Layer S7 communication(COTP)

5                 Session Layer S7 communication(TPKT)

4                 Transport Layer ISO-on-TCP (RFC 1006)

3                 Network Layer IP

2                 Data Link Layer Ethernet

1                 Physical Layer Ethernet

   

To establish a connection to a S7 PLC there are 3 steps:

Connect to PLC on TCP port 102

Connect on ISO layer (COTP Connect Request)

Connect on S7comm layer (s7comm.param.func = 0xf0, Setup communication)

Step 1) uses the IP address of the PLC/CP.

Step 2) uses as a destination TSAP of two bytes length. The first byte of the destination TSAP codes the communication type (1=PG, 2=OP). The second byte of the destination TSAP codes the rack and slot number: This is the position of the PLC CPU. The slot number is coded in Bits 0-4, the rack number is coded in Bits 5-7.

Step 3) is for negotiation of S7comm specific details (like the PDU size).


History

The protocol is used by Siemens since the Simatic S7 product series was launched in 1994. The protocol is also used on top of other physical/network layers, like RS-485 with MPI (Multi-Point-Interface) or Profibus.


Protocol dependencies

S7 communication consists of (at least) the following protocols:

COTP: ISO 8073 COTP Connection-Oriented Transport Protocol (spec. available as RFC905)

TPKT: RFC1006 "ISO transport services on top of the TCP: Version 3", updated by RFC2126

TCP: Typically, TPKT uses TCP as its transport protocol. The well known TCP port for TPKT traffic is 102.


Example traffic


Wireshark

The S7comm dissector is partially functional.


Preference Settings

(XXX add links to preference settings affecting how PROTO is dissected).


Example capture file

SampleCaptures/s7comm_downloading_block_db1.pcap s7comm: connecting and downloading program block DB1 into PLC

SampleCaptures/s7comm_program_blocklist_onlineview.pcap s7comm: connecting and getting a list of all available block in the PLC

SampleCaptures/s7comm_reading_plc_status.pcap s7comm: connecting and viewing the PLC status

SampleCaptures/s7comm_reading_setting_plc_time.pcap s7comm: connecting, reading and setting the time of the PLC

SampleCaptures/s7comm_varservice_libnodavedemo.pcap s7comm: running libnodave demo with S7-300 PLC, using variable-services with several areas

SampleCaptures/s7comm_varservice_libnodavedemo_bench.pcap s7comm: running libnodave demo benchmark with S7-300 PLC using variable-services to check the communication capabilities


Display Filter

A complete list of PROTO display filter fields can be found in the display filter reference

Show only the S7comm based traffic:

s7comm


Capture Filter

You cannot directly filter S7comm protocols while capturing.

S7comm uses port 102, so it is possible to capture S7comm data by using the capture filter

tcp port 102


External links

RFC1006 ISO Transport Service on top of the TCP Version: 3, based on ISO 8073

RFC905 ISO Transport Protocol Specification ISO DP 8073

Siemens - Information about the properties of the S7 protocol What properties, advantages and special features does the S7 protocol offer - Siemens Industry Online Support


Discussion

S7comm (2016-05-13 21:10:09由ThomasWiens编辑)



活到老,学到老。
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。