`

java modbus 32位浮点数解析

    博客分类:
  • java
 
阅读更多
package com;

import java.text.DecimalFormat;

public class test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str="";
		str="60004133";
		System.out.println("point_102 蒸汽压力:"+getDoubleByHexstr(str));
		/*str="D1, EC, 43, 6C";
		System.out.println("point_103 汽包液位:"+getDoubleByHexstr(str));
		str="2A, B4, 40, E7";
		System.out.println("point_104 蒸汽流量:"+getDoubleByHexstr(str));
		str="71, 9A, 41, 18";
		System.out.println("point_105 给水流量:"+getDoubleByHexstr(str));
		str="98, 00, 44, 2D";
		System.out.println("point_106 炉膛温度:"+getDoubleByHexstr(str));
		str="00, 00, 43, 01";
		System.out.println("point_107 1#给料温度:"+getDoubleByHexstr(str));
		str="99, 9A, 43, 33";
		System.out.println("point_108 2#给料温度:"+getDoubleByHexstr(str));
		str="E6, 66, 43, 14";
		System.out.println("point_118 2#给料温度:"+getDoubleByHexstr(str));
		str="33, 33, 42, F4";
		System.out.println("point_119 一次风温度:"+getDoubleByHexstr(str));
		str="00, 00, 42, C8";
		System.out.println("point_120 空预器出口温度:"+getDoubleByHexstr(str));
		str="00, 00, 00, 00";
		System.out.println("point_121 布袋进口温度:"+getDoubleByHexstr(str));
		str="00, 00, 00, 00";
		System.out.println("point_122 排烟温度:"+getDoubleByHexstr(str));
		str="00, 00, 00, 00";
		System.out.println("point_123 给水调节阀开度:"+getDoubleByHexstr(str));*/
		//System.out.println(getDoubleByHexstr(str));
	}

	/**
	 * modbus 返回的四字节的浮点数转换<br>
	 * hexstr = "AE 14 41 43";原始串
	 */
	public static Double getDoubleByHexstr(String hexstr) {
		//String[] hexarray = hexstr.split(", ");
		// 高地位互换		
		//hexstr = hexarray[2] + hexarray[3] + hexarray[0] + hexarray[1];
		hexstr=hexstr.substring(4, 6)+hexstr.substring(6, 8)+hexstr.substring(0, 2)+hexstr.substring(2, 4);
		System.out.println(hexstr);
		// System.out.println( hexstr );
		// 先将16进制数转成二进制数0 10000001 00000000000000000000000 <br>
		String binarystr = hexString2binaryString(hexstr);
		// 1位符号位(SIGN)=0 表示正数
		String sign = binarystr.substring(0, 1);
		// 8位指数位(EXPONENT)=10000001=129[10进制]
		String exponent = binarystr.substring(1, 9);
		int expint = Integer.parseInt(exponent, 2);
		// 23位尾数位(MANTISSA)=00000000000000000000000
		String last = binarystr.substring(9);
		// 小数点移动位数
		int mobit = expint - 127;
		// 小数点右移18位后得10101001 01101001 110.00000
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < 23; i++) {
			if (i == mobit)
				sb.append(".");
			char b = last.charAt(i);
			sb.append(b);

		}
		String valstr = "1" + sb.toString();
		int s = valstr.indexOf(".") - 1;// 指数
		Double dval = 0d;
		for (int i = 0; i < valstr.length(); i++) {
			if (valstr.charAt(i) == '.')
				continue;

			Double d = Math.pow(2, s);
			int f = Integer.valueOf(valstr.charAt(i) + "");
			// System.out.println( f );
			d = d * f;
			// System.out.println( "c:=" + valstr.charAt( i ) + ",s=" + s +
			// ",val=" + d + ", Math.pow( 2, s )=" + Math.pow( 2, s ) );
			s = s - 1;
			dval = dval + d;
		}
		if (sign.equals("1"))
			dval = 0 - dval;
		return round(dval);
	}

	public static String hexString2binaryString(String hexString) {
		if (hexString == null || hexString.length() % 2 != 0)
			return null;
		String bString = "", tmp;
		for (int i = 0; i < hexString.length(); i++) {
			tmp = "0000" + Integer.toBinaryString(Integer.parseInt(hexString.substring(i, i + 1), 16));
			bString += tmp.substring(tmp.length() - 4);
		}
		return bString;
	}
	
	public static Double round(double dt){
		DecimalFormat df=new DecimalFormat(".####");
		String strdt=df.format(dt);
		return Double.parseDouble(strdt);
	}
	   

}

 

分享到:
评论

相关推荐

    ModbusRTU协议中浮点数转换

    - 接着,由于Modbus RTU一次只能发送或接收16位的数据,所以我们需要将浮点数的二进制表示分割成高位和低位两个16位整数。 - 最后,这些整数可以被编码为Modbus协议的寄存器值。 2. **整型到浮点数**: - 在接收...

    16位转浮点型float,MODBUS 32位转浮点型float 64位转双浮点型double

    转换时,需要解码这32位数据并按照标准进行计算,将二进制形式转化为十进制的浮点数。 3. **64位转双浮点型(double)** 双浮点型(double)是64位的浮点数,提供更高的精度。同样遵循IEEE 754标准,64位数据由1位...

    使用java获取modbus数据.zip

    Java获取Modbus数据是工业自动化领域中的一个常见任务,Modbus是一种通用的通信协议,用于设备间的简单通信,尤其在PLC(可编程逻辑控制器)和SCADA(监控与数据采集系统)中广泛使用。本教程将围绕如何使用Java语言...

    modbus tcp协议解析

    同时,要理解Modbus协议的报文格式,正确编写或解析通信报文,避免出现通信异常。 通过以上内容,我们可以了解到Modbus TCP协议的基本概念、结构、应用以及使用Java工具进行测试和调试的方法。这些知识对于理解和...

    modbus数据类型解析工具

    5. **float32**:32位浮点数,遵循IEEE 754标准,可以表示大约1.4e-38到3.4e38之间的数值,包含正负值和小数部分,通常用于科学计算和工程应用中的精度需求。 这个工具还支持这四种数据类型的四种不同顺序排列,这...

    完整版modbus+tcp+ java开发代码

    在Java中实现Modbus TCP通信,通常需要一个库来处理底层的网络交互和Modbus报文解析。 在描述中提到的“寄存器holding request 读写操作”是指对保持寄存器(Holding Registers)的操作。保持寄存器是Modbus协议中...

    IEEE标准的32位浮点数转换为十进制的计算方法

    数据在传输时是以二进制格式发送的,接收方需要按照IEEE 754标准解析这些32位浮点数,才能正确理解传递的信息。在上述例子中,通过MODTEST软件读取的流量计数据,经过MODBUS协议转换,需要进行16进制到10进制,以及...

    modbus Java 开发包modbus4j-3.0.5.rar

    **响应数据类型解析**是Modbus4J的一个关键特性,它能自动将接收到的二进制数据转换为Java对象,如整数、浮点数或字符串,便于开发者处理。此外,**节点扫描**功能允许库自动发现网络上的Modbus设备,简化了设备配置...

    modbus浮点数处理(IEEE754标准)-易语言

    在处理Modbus浮点数通信时,易语言提供了相应的库函数和组件,简化了上述转换和处理过程。开发者可以通过易语言提供的API接口,轻松地完成从Modbus报文到浮点数的转换,以及反之的过程。 **6. 2018开源大赛(第三届)...

    IEEE754浮点数_数值转换_浮点数转换_

    浮点数由三部分组成:符号位、指数和尾数。对于单精度(32位)和双精度(64位)格式,它们的分配如下: 1. **单精度(32位)**: - 符号位:1位,0表示正,1表示负 - 指数:8位,偏移值为127 - 尾数( mantissa...

    关于Modbus数据16进制转10进制问题

    这两天在开发STM32的Modbus主站,就买了一个RS485总线的温湿度传感器来,温湿度传感器说明要求将传感器返回的Modbus报文数据转换为10进制后再除以10得到真实数据,以下是举例 Modbus主站发送报文: 01 04 00 01 00 ...

    解析大端模式和小端模式

    ### 解析大端模式和小端模式 在计算机科学领域,数据存储格式是理解硬件与软件交互的关键之一。其中,字节序(Byte Order)是一个重要概念,它指的是多字节数据类型(如整数、浮点数等)在内存中的存储顺序。目前...

    浮点型数据与IEEE754标准互转

    对于单精度浮点数,它有32位,分为三部分:1位符号位,8位指数位,和23位尾数。双精度浮点数则是64位,包括1位符号位,11位指数位,以及52位尾数。指数部分采用偏移量(bias)表示,尾数通常以“1.”(隐藏的1)形式...

    modbus&645to mysql.zip

    这可能涉及到将二进制数据转换为十进制或浮点数,或者整理数据字段以符合数据库表的结构。 3. 连接MySQL:使用MySQL的API(应用程序编程接口),如Python的`pymysql`库,Java的JDBC,或者PHP的mysqli扩展,创建到...

    modbus工具类, 实现各种数据类型的转化和读取, 性能方面实现了根据数据地址合并读取数据, 大大提高效率.zip

    工具类通常会包含方法来将这些二进制数据转换为开发者友好的格式(例如,将16位的寄存器数据转换为Java中的int或float类型),同时也能够将编程语言中的数据转换回Modbus可理解的格式。 描述中提到的“根据数据地址...

    在线测温后台通讯协议

    #### 三、MODBUS地址信息表解析 在文中给出的在线测温MODBUS地址信息表中,我们可以看到每个传感器对应的数据存储位置及其格式: - **温度信息**:每个传感器的数据占用4个字节,采用标准的IEEE754浮点数格式表示。...

Global site tag (gtag.js) - Google Analytics