本发明涉及modbus领域,具体涉及基于java语言的modbus协议解析方法。
背景技术:
modbus协议是一种通用的工业标准,其广泛用于控制器之间的通信互联。当在一modbus网络上通信时,每个控制器需要知道该网络中与其通信的所有控制器的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用modbus协议发出。如今java版的modbus数据解析,大多代码繁琐,冗余增多,可读性不高,给开发人员、维护人员造成极大的困扰,且数据解析之后依然为16进制数字,无法友好的进行显示给用户进行观察。
技术实现要素:
本发明所要解决的技术问题是针对上述现有技术存在的不足,而提供一种去冗存精的基于java语言的modbus协议解析方法。本发明采用的技术方案是:
基于java语言的modbus协议解析方法,步骤为:
s1设置设备的设备属性值,连接设备与从机;
s2从从机中获取原始数据;
s3将获取的原始数据按照设备属性值进行分类,再根据设备属性值类型分别采用线圈解析方法或离散量线圈解析方法或寄存器解析方法进行解析;
s4解析后获得的数据存入nosql类型的redis数据库中,保存数据线程按照频率定时搜查redis的数据,然后存入mysql数据进行最终保存;同时利用websocket传入页面,进行实时显示。
优选的,线圈解析方法的步骤为:
s31-1将获取的原始数据的长度记作size,同时定义一个外部总变量记作totalresult,将得到设备类型的长度记作length;
s31-2用所述size除以8后取余并记作result;
s31-3将result的自身数字作为循环的次数,每次循环完成截取原始数据的操作,起始下标为当前循环的次数乘以8加1,结束下标为当前循环的次数先加1的和再乘以8,截取后的字符串进行倒序操作,然后totalresult追加此字符串;
s31-4截取totalresult,从length的下标减1到length的下标,得到数据结果finalresult;
离散量线圈解析方法的步骤为:
s32-1将设备类型长度记作size,同时定义一个外部总变量记作totalresult;
s32-2在totalresult后面追加原始数据的倒序排列的字符串;
s32-3截取totalresult,起始下标为size减1,结束下标为size,得到数据结果finalresult;
寄存器解析方法的步骤为:
s33-1获取原始数据记作value,将得到寄存器的最大ad值记作maxad,最小ad值记作minad;
得到配置好的最大真实值记作maxactualvalue,最小真实值记作minactualvalue;得到配置好的最大模拟量输入值记作maxanalogvalue,最小模拟量输入值记作minanalogvalue;得到幅度值记作bvalue;
s33-2用maxanalogvalue减去minanalogvalue的差,去除以maxad减去minad的差,得到余数k2;用maxactualvalue减去minactualvalue的差,去除以maxanalogvalue减去minanalogvalue的差,得到余数k1;k1转负数,然后乘以minanalogvalue,得到b1;k2乘以value加上bvalue,然后结果乘以k1得到k3;k3加上b1,减去minactualvalue的绝对值得到最终结果realvalue;
优选的,寄存器解析方法的步骤中所述的定时搜查redis的频率为2~10秒。
与现有技术方案相比,本发明技术方案的有益效果是:
1.通过本发明的解析方法对16进制数字进行解析后将转为10进制的数字,提高了代码的可读性,可简洁的进行显示给用户进行观察;可以使开发者专注于真实数据的处理过程,而不用在底层的与设备的交互过程再花费过多精力。
2.提高了读取数据的稳定性,理论上可以应对十万个设备连接状况;提高了读取数据的速度,可以在大批量设备的连接下做到2s以内数据的实时传递。
3.本发明适用于所有设备模型,包括较冷门的光纤、沉降、烟感等。
4.检测时间及时、准确,不会出现连接断开后没有被检测到的现象。
5.经过一些配置,可以对数据偏移或者超限进行告警,提醒等操作。
附图说明
图1展示了基于java语言的modbus协议解析方法的流程示意图。
具体实施方式
下面结合附图,对本发明作详细说明:
本发明基于java语言的modbus协议解析方法,详细过程如下:
s1设置设备的设备属性值,连接设备与从机;
s2从从机中获取原始数据;
s3将获取的原始数据按照设备属性值进行分类,再根据设备属性值类型分别采用线圈解析方法或离散量线圈解析方法或寄存器解析方法进行解析;其中设备属性值与下列3种解析方法一一对应,有可能会出现单个设备包含多个设备属性的情况;(例如:水泵设备,包含开关与运行状态两个设备属性,其中开关采用线圈解析方法,运行状态采用离散量线圈解析方法)
如果设备属性值对应的是线圈解析方法,那么解析方法的步骤为:
s31-1将获取的原始数据的长度记作size,同时定义一个外部总变量记作totalresult,将得到设备类型的长度记作length;(例如:原始数据为000000001,所以size=9,totalresult在此定义还无具体值,length=1)
s31-2用所述size除以8后取余并记作result;(例如:result=9/8=1)
s31-3将result的自身数字作为循环的次数,每次循环完成截取原始数据的操作,起始下标为当前循环的次数乘以8加1,结束下标为当前循环的次数先加1的和再乘以8,截取后的字符串进行倒序操作,然后totalresult追加此字符串;(例如:result为1,所以循环一次,截取000000001,起始下标为0*8+1,结束下标为(0+1)*8,截取完毕为00000001,倒序操作后为10000000,totalresult追加此字符串,totalresult=10000000)
s31-4截取totalresult,从length的坐标减1到length的坐标,得到数据结果finalresult(例如:totalresult=10000000,起始下标为1-1=0,结束坐标为1,finalresult=1);
如果设备属性值对应的是离散量线圈,那么解析方法的步骤为:
s32-1将设备类型的长度记作size,同时定义一个外部总变量记作totalresult(例如:size1=1,totalresult在此定义还无具体值)
s32-2在totalresult后面追加原始数据的倒序排列的字符串(例如:原始数据为000000001,倒序后为100000000,totalresult追加此字符串,totalresult=100000000);
s32-3截取totalresult,从size减一的下标到size的下标,得到数据结果finalresult(例如:totalresult=100000000,起始下标为1-1=0,结束坐标为1,finalresult=1);
如果设备属性值对应的是寄存器解析方法,那么解析方法的步骤为:
s33-1获取原始数据记作value(例如value=22222);将得到的寄存器的最大ad值记作maxad,最小ad值记作minad(例如:maxad=20000,minad=4000);得到配置好的最大真实值记作maxactual,最小真实值记作minactualvalue(例如:valuemaxactualvalue=30,minanalogvalue=0);得到配置好的最大模拟量输入值记作maxanalogvalue,最小模拟量输入值记作minanalogvalue(例如:maxanalogvalue=20,minanalogvalue=4);得到幅度值记作bvalue(例如:bvalue=0);
s33-2用maxanalogvalue减去minanalogvalue的差,去除以maxad减去minad的差,得到余数k2(例如:k2=(20-4)/(20000-4000)=0.001);用maxactualvalue减去minactualvalue的差,去除以maxanalogvalue减去minanalogvalue的差,得到余数k1(例如:k1=(30-0)/(20-4)=1.875);k1转负数,然后乘以minanalogvalue,得到b1(例如:b1=-1.875*4=-7.5);k2乘以value加上bvalue,然后结果乘以k1得到k3(例如:k3=(0.001*22222+0)*1.875=41.66);k3加上b1,减去minactualvalue的绝对值得到最终结果realvalue(例如:realvalue=41.66+(-7.5)-0=34.16);
s4解析后获得的数据存入nosql类型的redis数据库中,保存数据线程按照频率定时搜查redis的数据,然后存入mysql数据进行最终保存;同时利用websocket传入页面,进行实时显示。(例如:当线圈类型或离散量线圈的数据为1,页面中的对应设备开关即为开启状态,当数据为0,开关即为关闭状态,注:线圈类型既可以查看开关状态,又可以主动开启或者关闭开关,离散量线圈只能查看,无法控制状态,在此不做赘述;当寄存器的数据为34.16,如果此设备为水位检测仪,页面就会显示水位:34.16cm)
进一步的,寄存器解析方法的步骤中所述的定时搜查redis的频率为2~10秒。