基于ModbusTcp协议的Java Socket通信 报文编码格式与数据采集过程详解(下)

      最后更新:2022-06-21 15:25:16 手机定位技术交流文章

      • 前言:基于ModbusTcp协议的Java端口通信报告编码格式和数据采集过程(顶部)
      • RTU协议:基于ModbusRtu协议的Java Socket通信描述消息编码格式和数据采集过程

      此外,可以实现下列功能,以适应通信在实际环境中:


      1.不连续数据传输受阻等待设置接收长度判断和加班判断
      在这里插入图片描述

      2.查看是否存在配置问题:
      1字节 = 1长度 = 16位元 = 2字节未签名短
      浮点数为4位元,32位元需要2个注册器存储int/uint


      浮点数的进化转换:
      c9 41 9a 99 -> 41 c9 99 9a(但并不是简单地拆分计算)
      4*8 = 32个数字 31个数字是符号,30到238个数字是顺序代码,在第二步计算,最后的数字是其余的小数(由后23个数字确定)
      1.将纬度数据(10英寸,浮点类型)转换为二进制格式;
      2.移动 n 位数到小数的左边,直到最后1 位数停止,然后取得左移位数,计算序列代码,127+(左移位数);
      3.尾号(总计22到0的23位)是小部件的二进制编码,其余未填补的位数为0;
      然后将所有获得的二阶编码转换为16阶数据。

      e.g.
      让我们以6.91转换为二进制形式开始: 110.110100110101100
      标准化它:调整第一个大于1的实数为小于2.
      6.91 = 1.10111010001111010111000 * 2^2
      所以S:0
      EXP:2(左移位数小)+127(10个数字) =129(10个数字) =1001(2个数字)
      10110100110101100(注:前面的1号不再需要)
      组合:01001 10110100110101100
      = 0100 0000 1101 1101 0001 1110 1011 1000= 4 0 D D 1 E B 8

      网上转换网站: https://lostphp.com/hexconvert/


      3.批量读并解析:

      多条指令
      在这里插入图片描述
      一条指令
      在这里插入图片描述


      4.修改登记册数目:

      在这里插入图片描述

      多条指令一起修改
      多条指令一起修改


      读写读三遍比对:
      在这里插入图片描述
      注意:如果要修改的值超过字符范围的大小,所有字节将强制转换。


      5.面向对象设计模型
      (1)
      主要方法必须是静态的,以便修改,因为主要方法是由Java解释器调用,当时没有生成对象。
      该方法可以通过静态修改方法调用,而不生成类实例对象。
      如果没有静态修改方法,需要生成一个类的实例对象来调用方法。

      (2)
      java主函数通过一个新的对象调用非静态函数:
      主要方法是静态方法,如果你想调用其他方法,要么只有另一种静态方法,在调用其非静态方法时,既说明当前类,又说明主要方法调用非静态方法,需要一个新的对象,因为静态方法和静态类属于模板,非静态类和方法属于对象。

      (3)
      其他类中的非静态变量不能直接调用,必须在该类中创建(通过调用新方法创建非静态函数)。

      我自己设计的框架:
      在这里插入图片描述


      教员为我提供了更标准化的实际开发和应用框架:

      在这里插入图片描述

      框架梳理:

      接口

      IDevice:定义连接()判断函数,读写通用函数
      IEncoder:编译读写指令
      getRead/WriteCommand
      IDecoder:获取消息ID和长度和值,检查合法性
      getId、getHeadLength、getContentLength、getValue、checkIdLegality


      通用/公共类

      字节操作类:
      负责合并两个字节集(标题+文本)

      转换类:
      重写 getBytes():将不同类型的数据转换为字节
      getShort,getChar,getInt,getLong,getFloat,getDouble,getString,getHexString,getCRC():将字节[]转换成不同的数据类型

      enum PLCAddressType:
      电路注册表,离散注册表,保留注册表,输入注册表

      OperateResult: Pan-type, Save operation result judgment,等。

      DeviceTemplate类:
      实现接口实现IDevice设置地址和端口:

      判断是否连接成功:

      发送数据:

      首先显示发送的数据并设置输出输入流:

      接收时要先做判断:

      当缓冲区1数据长度报文头部长度(从decoder.getHeadLength获取)时->当缓冲区2数据长度报文正文长度(从decoder.getContentLength获取)时->合并报文->检查id合法,否则报错:

      ->输出byte转十六进制:判断数据字节长度&判断是否错误代码

      接收函数:
      计算和设置加班时间+接收数据长度判决
      首先将长度比作大小读入缓冲区

      read(byte[] b, int off, int len)从b[off]开始,将输入流中的数据字节读入字节阵列,返回实际读取字节的整数形式。

      读函数:
      泛型[在Modbus TcpDeviceTest中调用]
      确定连接是否成功: if(this.connect())
      Send encoded message byte[]: Send (encoder.getReadCommand()
      [在Modbus TcpEncoder中定义]
      根据响应消息确定是否成功发送: this.decoder.getValue() [在Modbus TcpDecoder中定义]
      否则报错


      TCP类:

      [实现在接口中定义的所有函数]

      ModbusTcpDecoder implements Idecoder

      从头条命令获取消息的文本长度:

      getValue()判断它是短整数还是浮点类型:提取相应的字符

      ModbusTcpDevice extends DeviceTemplate定义

      ModbusTcpEncoder implements Iencoder编码发送内容
      读指令:

      说明书可以写成参考在开头提到的关于rtu的文章

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/27908.html

          热门文章

          文章分类