wu
2024-12-31 1edefcae08fe7c8df6a177e5dbbc8ab8f8194187
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
package toTcp;
 
import static java.lang.System.arraycopy;
 
public class DLT645_2007Control {
 
    // ¶ÁÊý¾Ý ,´«Èëµç±íµÄ±íºÅºóÉú³É ¶ÁÊý¾ÝµÄÃüÁ½«ÃüÁî·¢Ë͵½µç±í
    public byte[] ReadData(String address) {
 
        byte[] readcommand = new byte[20];
        readcommand[0] = (byte) 0xFE; // ÍøÉÏ×ÊÁÏËµÇ°ÃæÒª¼ÓËĸö¹Ì¶¨µÄ 0xFE£¬
        readcommand[1] = (byte) 0xFE;
        readcommand[2] = (byte) 0xFE;
        readcommand[3] = (byte) 0xFE;
        readcommand[4] = (byte) 0x68;// ÕæÕýµÄÊý¾ÝÖ¡ÆðʼλÖÃ
        byte[] addressbytes = setAddrByte(address); // µç±íµÄµØÖ· ×ª³É16½øÖÆ£¬ÓÐÒ»¸öµ¹ÐòµÄ²Ù×÷
        arraycopy(addressbytes, 0, readcommand, 5, addressbytes.length);
        readcommand[11] = (byte) 0x68;// ¹Ì¶¨¸ñʽ
        readcommand[12] = (byte) 0x11;// ±íʾ ¶ÁÊý¾Ý
        readcommand[13] = (byte) 0x04;// ºóÃæ Êý¾ÝÏîµÄ³¤¶È
        // byte[] dataTypeBytes = new byte[] { (byte) 0x00, (byte) 0x00, (byte)
        // 0x00, (byte) 0x00 };//¶Áµç±íµÄÓй¦×ܵçÄÜ
        byte[] dataTypeBytes = new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00 };// Êý¾ÝÏî´úÂ룺
        // ¶Áµç±íµÄÕýÏòÓй¦×ܵçÄÜ
 
        if (dataTypeBytes != null) {
            for (int i = 0; i < dataTypeBytes.length; i++) {
                dataTypeBytes[i] += 0x33;
            }
        }
        arraycopy(dataTypeBytes, 0, readcommand, 14, dataTypeBytes.length);
        readcommand[18] = getSigned(getCSCode(readcommand, 4, 17));
        readcommand[19] = (byte) 0x16;
        return readcommand;
    }
 
    // ½âÎö´ÓÉ豸·µ»ØµÄÊý¾Ý
    public static void ReturnData(byte[] returndatas) {
        float reslut =0;
        if (returndatas.length > 8) {
 
            if (returndatas[8] == (byte) 0x91)// ¶ÔÓ¦¶ÁÊý¾ÝÃüÁî11 µÄÕýÈ·Ó¦´ð
            {
                String EachByteAddress = GetBCDAddress(returndatas); // µÃµ½
                // µ±Ç°·µ»ØÊý¾Ý´ú±íµÄ
                // µç±í±íºÅ
                boolean check = checkData(returndatas);
                if (check) {
                    int[] read_ints = new int[returndatas.length];
                    for (int i = 0; i < returndatas.length; i++) {
                        if ((int) returndatas[i] > 0) {
                            read_ints[i] = (int) returndatas[i];
                        } else {
                            read_ints[i] = (int) returndatas[i] + 256;
                        }
                    }
 
                    if (read_ints[8] == 0x91) {
                        int lengthOfData = read_ints[9];// Êý¾Ý³¤¶È;
                        byte[] data = new byte[lengthOfData - 4];
                        for (int d = 0; d < lengthOfData - 4; d++) {
                            data[d] = (byte) (read_ints[14 + d] - 0x33);
                        }
                        int value = 0;
                        for (int v = 0; v < lengthOfData - 4; v++) {
                            value = v + (data[v] * 10 / 16 + (data[v]) % 16) * 100 ^ v;
                        }
                         reslut = value * 0.01f;// value *0.01 ÊÇ×îÖյĠÕýÏòÓй¦×ܵçÄÜ
 
 
                    }
                }
            }
        }
       // System.out.println(reslut);
    }
 
    // °Ñ±íºÅµØÖ·×ª³É16½øÖÆ
    public byte[] setAddrByte(String addr) {
        byte[] addressByte = new byte[6];
        for (int i = 11; i > 0; i -= 2) {
            int a = addr.charAt(i);
            int b = addr.charAt(i - 1);
            // ÓÉÓÚµØÖ·ÊÇ16½øÖÆ£¬ËùÒÔÏȽøÐÐÅжÏ
            // A - F
            if (a >= 65 && a <= 70) {
                a -= 15;
            } else if (a >= 97 && a <= 102) {
                a -= 87;
            } else {
                a -= 48;
            }
 
            if (b >= 65 && b <= 70) {
                b -= 15;
            } else if (b >= 97 && b <= 102) {
                b -= 87;
            } else {
                b -= 48;
            }
 
            addressByte[(11 - i) / 2] = (byte) (b * 16 + a);
        }
        return addressByte;
    }
 
    // °Ñ16½øÖƵıíºÅÊý¾Ý ×ª³É×Ö·û´®ÐÎʽµÄ±íºÅ
    public static String GetBCDAddress(byte[] address) {
        byte[] byteAddress = new byte[6];
        arraycopy(address, 1, byteAddress, 0, 6);
        String addr = "";
        String EachByteAddress;
        int bitdata;
        for (byte addr_b : byteAddress) {
            if (addr_b < 0) {
                bitdata = addr_b + 256;
            } else {
                bitdata = addr_b;
            }
            EachByteAddress = bitdata / 16 + "" + bitdata % 16;
            addr = EachByteAddress + addr;
        }
        return addr;
    }
 
    // CSУÑéÂë
    private int getCSCode(byte[] byteFrame, int i, int j) {
        int s = 0;
        for (int k = i; k <= j; k++) {
            s += (byteFrame[k] & 0xff) % 256;
        }
        return s;
    }
 
    // ½«ÎÞ·ûºÅ(ÐÎʽÉϵÄ)µÄÊý¾Ýת»¯³ÉÓзûºÅµÄbyteÊý¾ÝÖµ
    private byte getSigned(int a) {
        if (a > 0x7f)
            return (byte) (a - 256);
        else
            return (byte) (a);
    }
 
    // Ð£Ñé ·µ»ØµÄÊý¾Ý°üÄÚÈÝ
    static boolean checkData(byte[] data) {
        byte s = 0;
        int j;
        for (j = data.length - 1; j > 0; j--) {
            if (data[j] == 22) {
                break;
            }
        }
 
        for (int i = 0; i < j - 1; i++) {
            s += (data[i] & 0xff) % 256;
        }
        // System.out.println(s);
        if (s == data[j - 1]) {
            return true;
        } else {
            return false;
        }
    }
}