西门子300PLC与PC通信

通过路由器把电脑和PLC进行连接起来,使用博途V16进行下载硬件配置。确保能够通信后,使用wireshark进行抓包分析。

西门子PLC和电脑通信最主要是使用S7协议。但是在这之前会有一些数据包,建立连接,确认身份。

西门子PLC与PC通信使用的是TCP 102端口,一开始需要进行的其实就是TCP的三次握手,但是又不像普通的三次握手那样。

 

 在三次握手之后,会又电脑端向PLC进行COTP通信,这个也是基于TCP协议的一个通信,其实也就是在TCP的数据端,使用TCP payload

废话不多说,直接上图

 

 payload字段,就是红色圈起来的部分。

特别注意,在三次握手后的这个包,使用的是TCP封装起来的COTP协议,有很多的网友表示,这个其实是S7协议里面的会话层和表示层,会话层使用的是TPKT结构,一般占4个字节,第一个字节是版本号,一般为0x03,第二个字节是保留字节,剩下两个字节是payload的总长度。

TPKT的结构为:
0 (Unsigned integer, 1 byte): Version,版本信息。
1 (Unsigned integer, 1 byte): Reserved,保留(值为0×00)。
2-3 (Unsigned integer, 2 bytes): Length,TPKT、COTP、MMS三层协议的总长度,也就是TCP的payload的长度。(COTP中length不包括本身长度)

具体情况如图

在经过会话层的TPKT结构后,紧接着的就是COTP协议

)COTP协议:COTP(ISO 8073/X.224 COTP Connection-Oriented Transport Protocol)是OSI 7层协议定义的位于TCP之上的协议。COTP以“Packet”为基本单位来传输数据,这样接收方会得到与发送方具有相同边界的数据。
COTP协议分为两种形态,分别是COTP连接包(COTP Connection Packet)和COTP功能包(COTP Fuction Packet)。

COTP连接包的头结构为
0 (Unsigned integer, 1 byte): Length,COTP后续数据的长度(注意:长度不包含length的长度),一般为17 bytes。
1 (Unsigned integer, 1 byte): PDU type,类型有:

0x1: ED Expedited Data,加急数据
0x2: EA Expedited Data Acknowledgement,加急数据确认
0x4: UD,用户数据
0x5: RJ Reject,拒绝
0x6: AK Data Acknowledgement,数据确认
0x7: ER TPDU Error,TPDU错误
0x8: DR Disconnect Request,断开请求
0xC: DC Disconnect Confirm,断开确认
0xD: CC Connect Confirm,连接确认
0xE: CR Connect Request,连接请求
0xF: DT Data,数据传输

2~3 (Unsigned integer, 2 bytes): Destination reference.目标的引用,可以认为是用来唯一标识目标
4~5 (Unsigned integer, 2 bytes): Source reference.源的引用,同上
6 (1 byte): opt,其中包括Extended formats、No explicit flow control,值都是Boolean类型。前四位标识class,也就是标识类别,倒数第二位对应Extended formats,是否使用拓展样式,倒数第一位对应No explicit flow control,是否有明确的指定流控制。
7~? (length-7 bytes, 一般为11 bytes): Parameter,参数。一般参数包含Parameter code(Unsigned integer, 1 byte)、Parameter length(Unsigned integer, 1 byte)、Parameter data三部分。
code,1byte,标识类型,主要有:

0xc0,tpdu的size,tpdu即传送协议数据单元,也就是传输的数据的大小
0xc1,src-tsap,源的端到端传输。
0xc2,dst-tsap,目标的端到端传输。

Parameter length,长度
Parameter data数据。

长度: 0x11
PDU类型(CRConnect Request 连接请求) : 0x0E
目标引用: 0x0000
源引用: 0x0007
扩展格式/流控制: 0x00
参数代码SRC-TASP: 0xC1
参数长度: 0x02
SourceTSAP:0x0100
参数代码DST-TASP: 0xC2
参数长度: 0x02
DestinationTSAP:0x0102
参数代码TPDU-Size: 0xC0
参数长度: 0x01
TPDU大小: 0x0A

 

 

 COTP连接确认包

长度: 0x11
PDU类型(CCConnect Confirm 连接确认) : 0x0D
目标引用: 0x0007
源引用: 0x0003
扩展格式/流控制: 0x00
参数代码TPDU-Size: 0xC0
参数长度: 0x01
TPDU大小: 0x0A
参数代码SRC-TASP: 0xC1
参数长度: 0x02
SourceTSAP:0x0100
参数代码DST-TASP: 0xC2
参数长度: 0x02
DestinationTSAP:0x0102

 

 确认包和连接包,其实就在于第二个字节那里,第二个字节是PDU类型,还有就是源引用和目标引用部分有所改变。

剩下的S7协议部分,请看后续

 

posted @ 2022-09-28 21:13  wgd_elwood  阅读(1705)  评论(0编辑  收藏  举报