上位机与西门子PLC实现S7通讯开发报文解析

上位机开发,与西门子PLC通讯实现案例。
Sharp7库,S7通讯标准,ISO_CR、TPKT_ISO、S7_PN、S7_RW、(Size_RD、Size_WR)、S7_MRD_HEADER、S7_MRD_ITEM、S7_MWR_HEADER、S7_MWR_PARAM、S7_SZL_FIRST、S7_SZL_NEXT、S7_GET_DT、S7_SET_DT、S7_SET_PWD、S7_CLR_PWD、S7_STOP、S7_HOT_START、S7_COLD_START、(pduStart、pduStop、pduAlreadyStarted、pduAlreadyStopped)、S7_GET_STAT、S7_BI等标准码;不同型号PLC的PDU值确定一次性读取长度(PDU-18),第二次握手返回的报文长度是27个字节,最后两个字节就是PDU的值,西门子PLC的PDU大小是和CPU息息相关的,一般会有240、480、960三个档次(240~960)。
关于上位机C#实现与西门子PLC1200的通讯案例,实现握手和读取、写入【字Word或者位Bit】命令报文,报文解析。
03 00 00 16 11 e0 00 00 00 01 00 c0 01 0a c1 02 01 00 c2 02 01 01 第一次握手
03 00 ——报文头
00 16 ——数据长度总22
11 e0 00 00 00
01
00 c0
01 0a
c1 02
01 00
c2 02
01 01
03 00 00 19 02 f0 80 32 01 00 00 04 00 00 08 00 00 f0 00 00 01 00 01 01 e0 第二次握手
03 00 00 16 02 D0 80 32 01 00 00 02 00 00 08 00 00 F0 00 00 01 00 第一次握手回复
03 00 00 1B 02 F0 80 32 01 00 00 02 00 00 08 00 00 00 00 00 01 00 01 00 F0 00 F0第二次握手回复
上位机与PLC通讯发送数据,上位机C#做客户端访问PLC服务器。上位机主动请求数据。
03 00
00 1f ——数据长度31
02 f0 80 32 ——固定长度4(协议类型)
01 ——命令类型:发
00 00 05 00 ——标识序列号:(与返回数据一致)
00 0e 00 00 ——命令数据总长度:14(后面字节总数)
04 ——命令起始符:4(04读;05写)
01 ——读取数据块个数:1
{下面每12个字节作为一个数据块}
{
12 -指定有效值类型;0a-接下来本地址访问长度; 10-语法标记ANY; 02-按字为单位 ——固定长度4(读取地址前缀,大概是进制之类的意思)
00 02 ——读取数据byte个数:2(16bit)
00 1a ——读取数据块编号:26(DB块编号,M区为0)
84 ——读取数据块类型:4(访问区域标识,M区为83;DB块为84)
00 63 90 ——读取地址偏移量:DB26.3186(3字节偏移量,S7协议的地址是按位来算的需要地址值乘8得出实际地址。范围:0x000000~0x08FFFF)
偏移量计算方式 :
M区地址需要乘以8.比如 M100=100*8=800=0x0320,
DB块偏移量乘以8. 比如DB30000.12000 DB块号30000=0x7530,偏移位置需要乘以8,即12000*8=96000=0x017700
}
PLC反馈:03 00 00 1B 02 F0 80 32 03 00 00 00 01 00 02 00 06 00 00 04 01 FF 04 00 02 30 39
03 00 ——报文头
00 1B ——数据总长度
02 F0 80 32 ——固定长度:4(大概是协议类型)
03 ——收
00 00 00 01 ——标记序列号:1
00 02 ——固定长度(作用不详)
00 06 00 00 ——有效数据长度:6(从第一个数据的前缀开始计算)
04 ——命令标识符
01 ——读取数据块个数:1
FF 04 ——反馈数据开始标记
00 02 ——数据长度
30 39 ——数据值
反馈(接收)报文解析:
按字读取:从索引21开始查找 反馈数据开始标记 0xFF04,然后读取2个字节的长度,0x5BA0,即十进制 23456
按位读取:从索引21开始查找 反馈数据开始标记 0xFF03,然后读取一个字节的长度,具体值为0x01,即为true
03 00 ——报文头
00 1f ——数据总长度:31
02 f0 80 32 ——固定长度:4
01 ——命令类型:发
00 00 05 00 ——标识序列号:(与返回数据一致)
00 0e 00 00 ——命令数据总长度:14(后面字节总数)
04 ——命令起始符:4
01 ——读取数据块个数:1
12 0a 10 02 ——固定长度4(读取地址前缀,大概是进制之类的意思)
00 06 ——读取数据byte个数:6(48bit)
00 1a ——读取数据块编号:26
84 ——读取数据块类型:4
00 00 e0 ——读取地址偏移量:224
03 00 ——报文头
00 25 ——数据总长度:37
02 f0 80 32 ——固定长度:4
01 ——命令类型:发
00 00 05 00 ——标记序列号:(请求与回复一致)
00 0e ——固定长度:2
00 06 ——有效数据长度:6(从偏移量后(因从索引31开始计算)第一位开始计算)
05 ——命令起始符(04读取;05写入)
01 ——写入数据块个数:1
{下面共12个字节作为一个数据块:
12 -有效值类型;0a -本次地址访问长度;10 -语法标记ANY;——固定长度:3
02 ——写入方式:01按bit写入;02按byte写入
00 02 ——写入数据个数:2(访问数据字节个数;byte方式可以写入多个,bit只能单个写入)
00 1a ——写入编号:26(DB块编号;M区为0)
84 ——写入数据类型:DB块(区域标识M区为83;DB块为84)
00 63 90 ——写入地址偏移量:3186
}
00 04 ——写入方式:03按bit写入;04按byte写入
00 10 ——写入个数:16(按位计算长度)
00 00 ——写入值:00 00(写入字节数据)
PLC反馈:03 00 00 16 02 F0 80 32 03 00 00 00 01 00 02 00 01 00 00 05 01 FF
03 00 ——报文头
00 16 ——数据总长度
02 F0 80 32 ——固定长度:4
03 ——命令类型:收
00 00 00 01 ——标记序列号
00 02
00 01
00 00
05 01
FF——写入正常
反馈(接收)报文解析:
最后一个字节是0xFF代表写入成功,否则失败
03 00 00 1f 02 f0 80 32 01 00 00 05 00 00 0e 00 00 04 01 12 0a 10 02 00 02 00 1a 84 00 63 90
03 00 00 1f 02 f0 80 32 01 00 00 05 00 00 0e 00 00 04 01 12 0a 10 02 00 06 00 1a 84 00 00 e0
03 00 00 25 02 f0 80 32 01 00 00 05 00 00 0e 00 06 05 01 12 0a 10 02 00 02 00 1a 84 00 63 90 00 04 00 10 00 00
——END
