本文章借鉴了博主一杯清酒邀明月和加油小林哥和听风的内容,作为学习笔记。
前面用了labview连接PLC的三种方式,一是通过VIPM上安装的S7.COM进行通讯,二是通过胡工科技的hsl进行通讯,三是通过OPC进行通讯。这里介绍通过TCP协议来手搓S7协议与西门子的plc进行通信。
S7Communication是西门子专有的协议,是西门子S7通讯协议簇里面的一种。
S7通讯协议是西门子S7系列PLC内部集成的一种通讯协议,是S7系列PLC的精髓所在。他是一种运行在传输层之上的,经过特殊优化的通讯协议,其信息传输可以基于MPI网络,PROFIBUS网络或者以太网
S7在TCP连接上后还需要进行两次握手
S7协议的TCP/IP实现依赖于面向块的ISO传输服务。S7协议被封装在TPK和ISO-COTP协议中,这使得PDU能够通过TCP传送。
第一次握手
当PDU类型为0x0E的时候报文格式为
TPKT协议结构
COTP连接包的结构
第一次握手发送返回字节格式
支持PUD类型
参数代码TPDU-SIZE
对应到labview中在建立连接时进行两次握手操作,第一次握手操作,对应可以看到相应的指令集对应上表中的指令说明。和平常的tcp通讯一样,只需要发送相应的指令集即可。
第二次握手发送返回字节格式
ROSCTR类型
同样第二次握手也同上次一样,发送相应的指令集。
数据读取/写入报文发送返回字节格式
S7协议的地址是按照位来运算的,因此需要地址值乘以8。地址的三个范围为0x000000~0x08FFFF。比如M30000,实际地址就是30000*8=240000,然后转化为三个字节。
240000=0x03A980,对应三个字节 03,A9,80比如DB21234.40000其中DB号为21234为0x52F2,,DB编号对应两个字节52 ,F2,偏移量40000乘以8就是320000,也就是0x04E200,对应三个字节 04,E2,00。
写入数据,更改相应功能码,编写要写入的数据。
读取数据
故障代码
PUT和GET指令TABLE参数的错误代码:
功能码
区域类型
SyntaxID类型
PLC区域类型块
CPU的地址区