电总/modbus协议,电池电流放电获取数据异常问题.

        

package work;

import java.math.BigInteger;
import java.text.DecimalFormat;



public class BatteryCurrent {
	public static void main(String[] args) {
		
	/*情况一 电总协议
	 * 协议中可以获取正电池电流和负电池电流(APM30-300)或者只获取一个电池电流(UL33)
	 * 正常情况下使用getDecodeMessageStr4LHLH方法解析电池电流是可以,但是放电时使用该方法解析会与实际数据有差距
	 * 通过测试发现需要把返回的数据进行翻转后再解析
	 * 例如返回的数据为1F856BC1 这需要翻转为 C16B851F 后在进行解析 
	 * 且
	 * */
		String a = "C16B851F";
		System.out.println(Float.intBitsToFloat(new BigInteger(a,16).intValue()));
     /*情况二 MODBUS协议
      * 电池放电时解析出来的数据比较大
      *正常情况下使用getDecodeMessageDouble2HL方法进行解析电池电流是可以,但是放电时使用该方法解析会与实际数据有差距
      *发现需要使用getDecodeMessageString2HL方法进行解析
      * */
		byte[] messageRep = new byte[]{(byte)0xff,(byte)0xed};
		double BETI = Double.parseDouble(getDecodeMessageString2HL(messageRep, 0, "0"));
		System.out.println(BETI);
		
	
	}
	/**
	 * IEEE754方式计算,只包含整数
	 * HEX-ASCII码后传输,4个字节转换成ASCII码后传输,即传输8个字节,接收到的8个字节在转成16进制字符串,每8位表示一个值(8位即可看成4个字节)
	 * 传出方式是:<font style='color: red'>先低字后高字,先低字节后高字节。</font><br>
	 * @param b 返回数据
	 * @param t 开始取值点
	 * @return
	 */
	public  String getDecodeMessageStr4LHLH(String b, int t) {
		int val=0;
		String messageF = b.substring(t, t+8);
		
		String s1 = messageF.substring(6, 8);
		String s2 = messageF.substring(4, 6);
		String s3 = messageF.substring(2, 4);
		String s4 = messageF.substring(0, 2);
		messageF = s1 + s2 + s3 + s4;
		
		try{
			val=Integer.valueOf(messageF, 16);
		}catch (Exception e) {
			try{
				if(Integer.valueOf(s1, 16)>127)s1="40";
			}catch (Exception e1) {
				s1="00";
			}
			try{
				Integer.valueOf(s2, 16);
			}catch (Exception e1) {
				s2="00";
			}
			try{
				Integer.valueOf(s3, 16);
			}catch (Exception e1) {
				s3="00";
			}
			try{
				Integer.valueOf(s4, 16);
			}catch (Exception e1) {
				s4="00";
			}
			messageF = s1 + s2 + s3 + s4;
			val=Integer.valueOf(messageF, 16);
		}
		DecimalFormat dformat = new DecimalFormat("0.00");
		return  dformat.format(Float.intBitsToFloat(val));
	} 
	
	public static String getDecodeMessageString2HL(byte[] message, int suffix, String v) {
		try {
			byte[] b = new byte[2];
			System.arraycopy(message,suffix,b,0,2);
			String is=  String.valueOf((Integer.valueOf(bytesToHexString(b), 16).shortValue()));
			return is;
		} catch (Exception e) {
		}
		return v;
	}

	public static String bytesToHexString(byte[] src){  
	    StringBuilder stringBuilder = new StringBuilder("");  
	    if (src == null || src.length <= 0) {  
	        return null;  
	    }  
	    for (int i = 0; i < src.length; i++) {  
	        int v = src[i] & 0xFF;  
	        String hv = Integer.toHexString(v);  
	        if (hv.length() < 2) {  
	            stringBuilder.append(0);  
	        }  
	        stringBuilder.append(hv);  
	    }  
	    return stringBuilder.toString();  
	} 
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值