JAVA实现GBT32960报文解析(四):0x02驱动电机数据解析源码

**JAVA实现GBT32960报文解析系列文章链接:**
JAVA实现GBT32960报文解析(一):掌握协议中的各种数据类型和完整报文结构
JAVA实现GBT32960报文解析(二):数据包结构解析源码
JAVA实现GBT32960报文解析(三):0x01整车数据解析源码
JAVA实现GBT32960报文解析(四):0x02驱动电机数据解析源码
JAVA实现GBT32960报文解析(五):0x03燃料电池数据解析源码(待更…)
JAVA实现GBT32960报文解析(六):0x04发动机数据解析源码(待更…)
JAVA实现GBT32960报文解析(七):0x05车辆位置数据解析源码(待更…)
JAVA实现GBT32960报文解析(八):0x06极值数据解析源码(待更…)
JAVA实现GBT32960报文解析(九):0x07报警数据解析源码(待更…)
JAVA实战需求示例:车辆月度充电详情统计报表,含快充、慢充区分统计(待更…)



前言

这是本系列的第四篇文章,也是“数据单元”的第2部分的“0x02驱动电机数据”解析,关于其他部分报文的解析可通过上方系列文章的链接进入了解。

《GB/T 32960.3-2016 电动汽车远程服务与管理系统技术规范 第3部分:通讯协议及数据格式》中,关于数据单元类型为0x02的驱动电机数据格式和定义如下:
在这里插入图片描述

因不同车型所实际装配的驱动电机个数不同,所以在0x02数据单元类型中,首先对驱动电机的个数进行定义。而每个驱动电机数据格式和定义如下:
在这里插入图片描述


本文将继续对国标报文的剩余部分进行解析,即:0x02 =>【驱动电机数据】部分

提示:下方“删除线”划掉的部分,是从本系列第二篇文章开始已经通过代码示例解析过的报文。

剩余报文信息如下(示例):

232303FE584C32434546355030414C30303730323301012D15071C110B320102030100000000010E0C58271000021013510065020101014F4E204E2055001F271005000633555501D2D2CE0601220D00011F0B1501014B010B49070300000450000000000801010C58271000600001600CBD0CD90CD00CCF0CE00CF00CE00CCB0CE10CE00CDF0CC80CC50CD30CCF0CE70CE50CE30CD90CE90CF60CEF0CE10CDF0CEA0CED0CE80CD10CDA0CEE0B150CD30CED0D000CCA0CED0CD60CDA0CED0CDC0CE70CF00CED0CDF0CF40CF30CDC0CE50CE00CEF0CE10CD20CDD0CE80CD60CEA0CDD0CE90CD90CD60CC90CCB0CDE0CCC0CD30CD60CE60CF20CE20CCC0CE90CE40CF80CA00CE50CE10CE90CE80CE20CF70CF50CEA0CCD0CF80CE50CDD0CE00CE10CE90CDD0CEB0CEE0CF40CF60CFC0CE109010100104B4A4A4A4949494A4A49494A4A4A4A4A5F

一、驱动电机个数

在这里插入图片描述
在本系列第一篇文章中就讲过,关于十六进制转数值其实很粗暴,直接使用java.lang包的Integer.parseInt(String, int)方法解析

驱动电机个数解析,代码如下(示例):

		// 驱动电机个数(下标0是数据单元类型的定义,在主方法中已经处理,所以这里从下标1开始)
        map.put("驱动电机个数", Integer.valueOf(bytes[1], 16).toString());

二、驱动电机总成信息

涉及多个驱动电机的车型,则需要逐个解析

1.驱动电机序号

在这里插入图片描述

驱动电机序号解析,代码如下(示例):

		// 驱动电机序号
        map.put("驱动电机序号", Integer.valueOf(bytes[2], 16).toString());

2.驱动电机状态

在这里插入图片描述

驱动电机状态解析,代码如下(示例):

		// 构造函数中定义驱动电机状态
        motorStateMap = new HashMap<String, String>();
        motorStateMap.put("0x01", "耗电");
        motorStateMap.put("0x02", "发电");
        motorStateMap.put("0x03", "关闭状态");
        motorStateMap.put("0x04", "准备状态");
        motorStateMap.put("0xFE", "异常");
        motorStateMap.put("0xFF", "无效");
		// 解析调用
        map.put("驱动电机状态", motorStateMap.get("0x" + bytes[3]));

3.驱动电机控制器温度

在这里插入图片描述

关于数值类型的解析:需要优先处理异常无效数据的,然后注意是否有最小计量单位偏移量的描述。这些都需要一一处理,否则数据值解析错误很难直观看出。

驱动电机控制器温度解析,代码如下(示例):

    /**
     * 驱动电机控制器温度 & 驱动电机温度
     * @param strByte
     * @return
     */
    private String byte2temperature(String strByte)
    {
        if(strByte.equals("FE"))
        {
            return "异常";
        }
        else if(strByte.equals("FF"))
        {
            return "无效";
        }

        // 排除以上两种情况后,就可以直接当做数字处理
        BigDecimal BdByte = new BigDecimal(Integer.valueOf(strByte, 16));
        // 偏移量40℃,有效范围值:-40℃~210℃
        BdByte = BdByte.subtract(new BigDecimal(40));

        return BdByte.toString();
    }

4.驱动电机转速

在这里插入图片描述

驱动电机转速解析,代码如下(示例):

    /**
     * 驱动电机转速
     * @param strByte
     * @return
     */
    private String byte2revs(String strByte)
    {
        if(strByte.equals("FFFE"))
        {
            return "异常";
        }
        else if(strByte.equals("FFFF"))
        {
            return "无效";
        }

        // 排除以上两种情况后,就可以直接当做数字处理
        BigDecimal BdByte = new BigDecimal(Integer.valueOf(strByte, 16));
        // 偏移量20000r/min,有效范围值:-20000r/min~45531r/min
        BdByte = BdByte.subtract(new BigDecimal(20000));

        return BdByte.toString();
    }

5.驱动电机转矩

在这里插入图片描述

驱动电机转矩解析,代码如下(示例):

    /**
     * 驱动电机转矩
     * @param strByte
     * @return
     */
    private String byte2torque(String strByte)
    {
        if(strByte.equals("FFFE"))
        {
            return "异常";
        }
        else if(strByte.equals("FFFF"))
        {
            return "无效";
        }

        // 排除以上两种情况后,就可以直接当做数字处理
        BigDecimal BdByte = new BigDecimal(Integer.valueOf(strByte, 16));
        // 精确到0.1N.m,所以在这里除以10
        BdByte = BdByte.divide(new BigDecimal(10));
        // 偏移量2000N.m,有效范围值:-2000N.m~4553.1N.m
        BdByte = BdByte.subtract(new BigDecimal(2000));

        return BdByte.toString();
    }

6.驱动电机温度

在这里插入图片描述
驱动电机温度的定义参考【3.驱动电机控制器温度】,使用同一个方法byte2temperature();

7.电机控制器输入电压

在这里插入图片描述

驱动电机控制器输入电压解析,代码如下(示例):

	/**
     * 驱动电机控制器输入电压
     * @param strByte
     * @return
     */
    private String byte2inputVoltage(String strByte)
    {
        if(strByte.equals("FFFE"))
        {
            return "异常";
        }
        else if(strByte.equals("FFFF"))
        {
            return "无效";
        }

        // 排除以上两种情况后,就可以直接当做数字处理
        BigDecimal BdByte = new BigDecimal(Integer.valueOf(strByte, 16));
        // 精确到0.1V,所以在这里除以10
        BdByte = BdByte.divide(new BigDecimal(10));

        return BdByte.toString();
    }

8.电机控制器直流母线电流

在这里插入图片描述

驱动电机控制器直流母线电流状态解析,代码如下(示例):

	/**
     * 驱动电机控制器直流母线电流
     * @param strByte
     * @return
     */
    private String byte2DCBusCurrent(String strByte)
    {
        if(strByte.equals("FFFE"))
        {
            return "异常";
        }
        else if(strByte.equals("FFFF"))
        {
            return "无效";
        }

        // 排除以上两种情况后,就可以直接当做数字处理
        BigDecimal BdByte = new BigDecimal(Integer.valueOf(strByte, 16));
        // 精确到0.1A,所以在这里除以10
        BdByte = BdByte.divide(new BigDecimal(10));
        // 偏移量1000A,有效范围值:-1000A~1000A
        BdByte = BdByte.subtract(new BigDecimal(1000));

        return BdByte.toString();
    }

总结

根据文章结尾可下载的完整代码示例,最终通过System.out.println("DriveMotor Map => " + map);打印到控制台。

控制台输出结果如下:

DriveMotor Map => {驱动电机控制器直流母线电流=0, 驱动电机控制器输入电压=3.1, 驱动电机控制器温度=39, 驱动电机序号=1, 驱动电机状态=耗电, 驱动电机转速=0, 驱动电机温度=45, 驱动电机个数=1, 驱动电机转矩=0}

从下一篇文章,继续解析:数据单元信息标识为0x03燃料电池数据源码


** 相关下载:**
国标协议GBT32960文档 (包含《GB/T 32960-2016 电动汽车远程服务与管理系统技术规范》完整的1、2、3部分)
源码部分:
JAVA解析GBT32960协议 - 数据包结构源码(另含ParseUtils.java和BCCVerifyUtils.java两个工具类)
JAVA解析GBT32960协议 - 0x01整车数据源码
JAVA解析GBT32960协议 - 0x02驱动电机数据源码
JAVA解析GBT32960协议 - 0x03燃料电池数据源码(待更…)
JAVA解析GBT32960协议 - 0x04发动机数据源码(待更…)
JAVA解析GBT32960协议 - 0x05车辆位置数据源码(待更…)
JAVA解析GBT32960协议 - 0x06极值数据源码(待更…)
JAVA解析GBT32960协议 - 0x07报警数据源码(待更…)
JAVA实战需求示例:车辆月度充电详情统计报表,含快充、慢充区分统计数据源码(待更…)

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值