我们以S7的1500系列来查看握手和读取、写入【字Word或者位Bit】命令报文
以下报文不做说明时都是十六进制字节。
西门子PLC需要连接成功后发送两次握手命令方可进行读写通信。
西门子PLC的S7协议的头由四个字节组成.。
第一个字节数固定为03,第二个字节数固定为00
第三个字节和第四个字节代表【报文字节总长度】,比如00 16就代表报文总长度为22
报文字节总长度=256*buffer[2]+buffer[3]
【高字节在前,低字节在后】,而在C#程序中是低字节在前,高字节在后的。
因此,对报文的解析是 通过 03 00 开头,然后查找第三个和第四个字节,来获取【报文字节总长度】,然后依次查找【报文字节总长度-4】个字节即终止。
S7协议的地址(偏移量)是按照位来运算的,因此需要地址值乘以8。
地址的三个字节范围为0x000000~0x08FFFF
比如M30000,实际地址就是30000*8=240000,然后转化为3个字节。
240000=0x03A980,对应三个字节【03 A9 80】
比如DB21234.40000 其中DB号21234为0x52F2,DB编号对应两个字节【52 F2】
偏移量(地址)40000乘以8就是320000,也就是0x04E200,对应三个字节【04 E2 00】
第一次握手First Handshake
发送命令【22个字节】:
03 00 00 16 11 E0 00 00 00 01 00 C0 01 0A C1 02 01 02 C2 02 01 00
反馈命令【22个字节】:
03 00 00 16 02 D0