工控协议 | 您所在的位置:网站首页 › 西门子plc工作方式 › 工控协议 |
工控协议——S7通讯协议
S7协议简介2. TPKT协议3.COTP协议S7通信支持两种方式
S7comm协议S7comm的结构主要分为三部分:Header:
S7协议简介
S7以太网协议本身也是TCP/IP协议簇的一员,S7协议在OSI中的位置相当于将物理层和数据链路层之上的协议进行了定义,S7comm的协议栈修改程度更高,在应用层组织的数据经过COTP协议、TPKT协议的进一步处理后,最终通过TCP进行传输 备注:这里的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增加的数据并不多,主要就是以下几个: 接下我们用2018工控比赛流量包来实际看一眼: COTP协议的全称是(Connection-Oriented Transport Protocol),即面向连接的传输协议,从这个名字就可以看出,它的传输必然是依赖于连接的,所以在传输数据前必然有类似TCP握手建立链接的操作。 接下来我们看看具体的流量包:
接下来我们看看他们所携带的数据: 首先来看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字段的最后我们再来详细说这到底是个啥。![]() 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:数据,该数据是一个可选字段来携带数据,例如存储器值,块代码,固件数据等。 如下图:
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。 下面结合具体案例分析 工业协议数据流量包分析 我们可以看到这个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 |
CopyRight 2018-2019 实验室设备网 版权所有 |