HJ212-2005协议是国家环保局在2005年推出的一种数据传输协议,主要用于环保水污染和大气污染监测点的数据上传。该协议是一种应用层协议,传输层一般基于TCP/IP协议,数据包除CRC校验码外都是由ASCII码字符组成。因此S7-1200要实现HJ212协议通讯除了需要使用TCP/IP通讯命令外还需要使用字符串处理命令。
HJ212协议包由包头、数据段长度、数据段、CRC校验码、包尾组成。包头固定为“##”包尾固定为<CR><LF>。以下就是一个实际的HJ212实时数据包的构成:
##0281ST=32;CN=2011;PW=123456;MN=35050XXXXXXXXA;CP=&&DataTime=20201119133949;101-Rtd=0.281,101-Flag=N;060-Rtd=0.185,060-Flag=N;011-Rtd=12.620,011-Flag=N;001-Rtd=6.576,001-Flag=N;065-Rtd=11.190,065-Flag=N;B01-Rtd=723.289,B01-Flag=N;B21-Rtd=3746018.000,B21-Flag=N;SW-Rtd=25.668,SW-Flag=N&&4874$R$L
ST=32表示为地表水体污染源
CN=2011代表实时数据发送命令
PW=123456为访问密码
MN=35050XXXXXXXXA为监测点编号
CP=&&数据区&&为指令参数,中间即为数据区,其中不同的编码表示不同的污染物指标,比如011-Rtd代表COD实时数据。
由于传输层使用的是TCP/IP协议,所以第一步是在1200里使用TCON指令建立TCP服务器连接。下图是数采仪通讯参数设定及TCON指令参数设定。
第二步为使用TRCV指令接收数采仪发送的数据包,程序如下图所示。因为不同212命令下数据包长度不一致,所以需要将LEN设置为0,将ADHOC设置为1,即激活Ad-hoc模式,接收动态长度的数据:
通过以上两步,数采仪数据包已经接收到数据缓存区的字符数组中,下面需要将字符数组转换成字符串,才能使用字符串命令解析数据。首先解析命令编码CN,只有2011命令代表传输的是实时数据,其他命令的数据包可以忽略。下图指令的功能是提取数据包的前100个字符,这里面包含了命令码、数据发送的日期和时间等参数。
我们封装了一个FC80实现命令编号和时间的提取,其中命令编号提取部分的代码如下图所示。先通过FIND命令查找关键字符CN的位置,再通过字符串转数字命令提取十进制的命令编码。
最后是污染物参数的解析,当命令编码=2011时,表示收到的是实时数据包,此时将数据包的数据部分转换成提取到数据字符串,再调用自己封装的FC81实现实时数据的解析。
FC81中提取实时数据的程序与提取命令编码相同,以COD为例,先通过FIND命令查找COD指标编码011-Rtd的位置,再通过字符串转数字命令提取实数类型数据。
综上即可通过S7-1200实现HJ212协议的通讯的解析,可以提取污染物指标实时数据和更新时间等。本次只解析了实时数据包,还可以采用类似的方法解析小时数据、日数据包,实现更多的功能。