9度通讯程序适用于9度多组设备
Administrator
2023-12-27 c736aaea5522e295b42676f094d313e7f6a4afb4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package com.dev.bmp7100;
 
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
 
import com.base.Crc16;
 
public class bpm7100_CommData {
    //------------------------------------------------------------------------//
    final public static short REGADDR_NULL = 0x0000;
    final public static short REGADDR_START = 0x0100;
    //------------------------------------------------------------------------//
    final public static byte MB_CMD_NULL = 0x00;
    final public static byte MB_CMD_READ = 0x03;
    final public static byte MB_CMD_WRITE = 0x05;
    //------------------------------------------------------------------------//
    final public static int CURR_DIR_CHARGE = 0;
    final public static int CURR_DIR_DISCHARGE = 1;
    //------------------------------------------------------------------------//
    final public static int BATTSTATE_NULL = 0;
    final public static int BATTSTATE_FLOAT = 1;
    final public static int BATTSTATE_CHARGE = 2;
    final public static int BATTSTATE_DISCHARGE = 3;
    
    final public static int CMD_GET_BATT_VOL = 1;
    final public static int CMD_GET_BATT_STATE = 2;
    //------------------------------------------------------------------------//
    final public static int BATT_COUNT_PER_DEV = 24;
    final public static int BATT_GROUP_COUNT_MAX = 100;
    final public static int BATT_MON_COUNT_MAX = 500;
    //------------------------------------------------------------------------//
    private boolean m_UsrWriteCmdAck = false;
    //------------------------------------------------------------------------//
    boolean batt_test_state = false;
    //------------------------------------------------------------------------//
    int rs485_addr = 0;
    float module_version = 0;
    float groupvol = 0;
    float battcurr = 0;
    float grouptmp = 0;
    float[] battvol = new float[BATT_MON_COUNT_MAX];
    short crc16 = 0;
    //------------------------------------------------------------------------//    
    byte[] data_byte_tx;
    byte[] data_byte_rx;
    ByteBuffer data_bf;
    //------------------------------------------------------------------------//
    public bpm7100_CommData()
    {
        data_byte_tx = new byte[8];
        data_byte_rx = new byte[256];
        data_bf = ByteBuffer.allocate(512);
        data_bf.order(ByteOrder.BIG_ENDIAN);
    }
    //------------------------------------------------------------------------//
    public boolean getUsrWriteCmdAck()
    {
        return m_UsrWriteCmdAck;
    }
    //------------------------------------------------------------------------//
    void makeDataToByteArray(byte addr, byte cmd, short reg_addr, short reg_count)
    {
        data_bf.clear();
        if(MB_CMD_READ == cmd)
        {
            data_bf.put(addr);
            data_bf.put(cmd);
            data_bf.putShort(reg_addr);
            data_bf.putShort(reg_count);
            int crc = Crc16.CalCRC16(data_bf, 6)&0xFFFF;
            data_bf.putShort((short) ((crc<<8) + (crc>>8)));
        }
        else if(MB_CMD_WRITE == cmd)
        {
            m_UsrWriteCmdAck = false;
            data_bf.put(addr);
            data_bf.put(cmd);
            data_bf.putShort(reg_addr);
            data_bf.putShort((short) 1);
            int crc = Crc16.CalCRC16(data_bf, 6)&0xFFFF;
            data_bf.putShort((short) ((crc<<8) + (crc>>8)));
        }
        
        data_bf.position(0);
        data_bf.get(data_byte_tx);
    }
    //------------------------------------------------------------------------//
    public boolean getDataFromByteArray(int rx_datacount)
    {
        boolean res = false;
        
        data_bf.clear();
        data_bf.put(data_byte_rx);
        data_bf.flip();
        /*********************************************************/
        int crc = Crc16.CalCRC16(data_bf, rx_datacount-2)&0xFFFF;
        crc = ((short) ((crc<<8) + (crc>>8)));
        
        data_bf.position(rx_datacount-2);
        short tmp_crc = data_bf.getShort();
        /*********************************************************/
        if(crc == tmp_crc) 
        {
            data_bf.position(0);
            
            data_bf.get();
            byte cmd = data_bf.get();
            data_bf.get();
            
            rs485_addr = 0;
            if(MB_CMD_READ == cmd)
            {
                rs485_addr = (data_bf.getShort()&0xFFFF);
                module_version = (float)(data_bf.getShort()&0xFFFF) / 10;
                grouptmp = ((float)(data_bf.getShort()&0xFFFF) / 10) - 10;
                
                battcurr = ((float)(data_bf.getShort()&0xFFFF) / 1000) - 20;
                groupvol = (float)(data_bf.getShort()&0xFFFF) / 10;
                
                for(int n=0; n<BATT_COUNT_PER_DEV; n++) {
                    battvol[n] = ((float)(data_bf.getShort()&0xFFFF) / 1000) - 20;
                }
                
                res = true;
            }
        }
        
        return res;
    }
    //------------------------------------------------------------------------//
    public void clearData() {
        grouptmp = 0;
        battcurr = 0;
        groupvol = 0;
        
        for(int n=0; n<BATT_COUNT_PER_DEV; n++) {
            battvol[n] = 0;
        }
    }
    //------------------------------------------------------------------------//
}