DELL
2025-04-28 e6eb7fb0af366e370f125668d62e89eb0004f517
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
package com.dev.switchdev.data;
 
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
 
import com.ComBase;
import com.Crc16;
import com.dev.bts.data.FBS9100_ComBase;
 
public class ModBus_RTU_Cmd {
public final int BYTE_LEN = 8;
 
    public static final int CMD_ReadOutPutCoil      =  0x01;            //¶ÁÈ¡Êä³öÏßȦ
    public static final int CMD_ReadInputCoil          =  0x02;            //¶ÁÈ¡ÊäÈëÏßȦ
    public static final int CMD_ReadHoldReg          =  0x03;            //¶ÁÈ¡±£³Ö¼Ä´æÆ÷
    public static final int CMD_ReadInputReg          =  0x04;            //¶ÁÈ¡ÊäÈë¼Ä´æÆ÷
 
    public static final int CMD_WriteSingleCoil        =  0x05;            //дÈëµ¥¸öÏßȦ
    public static final int CMD_WriteSingleReg        =  0x06;            //дÈëµ¥¸ö¼Ä´æÆ÷
    
    public static final int CMD_WriteMultiCoil        =  0x0F;            //дÈë¶à¸öÏßȦ
    public static final int CMD_WriteMultiReg        =  0x10;            //дÈë¶à¸ö¼Ä´æÆ÷
 
    
    public int ADDR;                    //ͨѶµØÖ·
    public int ByteCount;                //¼Ä´æÆ÷ÊýÄ¿
    public int CMD;                        //¹¦ÄÜÂë
    public int RES_Index;                //¼Ä´æÆ÷Æ«ÒÆÎ»ÖÃ
    public int Result_val;                //·µ»Ø½á¹û
    private int CRC;
    private int ByteLength;                //Êý¾ÝÇø×Ö½ÚÊý
    
    public void makeCmd(int addr, int cmd,int RES_Index, int bytecount)
    {
        this.ADDR = addr;
        this.CMD = cmd;
        this.RES_Index = RES_Index;
        this.ByteCount = bytecount;
    }
    
    public boolean putByteBuffer(final ByteBuffer bf)
    {
        if(bf.limit() < BYTE_LEN)
            return false;
 
        ByteBuffer tmpbuf = bf;
        int crc0 = tmpbuf.getShort(bf.limit()-2) & 0xFFFF;
        int crc1 = Crc16.CalCRC16(tmpbuf, bf.limit()-2) & 0xFFFF;
        if(crc0 != crc1) {
            System.err.println("CRC error  "+crc0+"==="+crc1);
            return false;
        }
        tmpbuf.position(0);
        this.ADDR = ComBase.changeByteToInt(tmpbuf.get());
        this.CMD = ComBase.changeByteToInt(tmpbuf.get());
        
        if(CMD_WriteSingleCoil == this.CMD 
           || CMD_WriteSingleReg == this.CMD
           || CMD_WriteMultiCoil == this.CMD
           || CMD_WriteMultiReg == this.CMD
        ) {
            RES_Index = ComBase.changeShortToInt(tmpbuf.getShort());
            Result_val = ComBase.changeShortToInt(tmpbuf.getShort());
        }else {
            ByteLength = ComBase.changeByteToInt(tmpbuf.get());
        }
        
        tmpbuf.compact();
        tmpbuf.flip();
        
        return true;
    }
    
    public ByteBuffer getByteBuffer()
    {
        ByteBuffer bytebuffer = ByteBuffer.allocate(BYTE_LEN);
        bytebuffer.order(ByteOrder.BIG_ENDIAN);
        
        bytebuffer.put(ComBase.changeIntToByte(ADDR));
        bytebuffer.put(ComBase.changeIntToByte(CMD));
        bytebuffer.putShort(ComBase.changeIntToShort(RES_Index));
        bytebuffer.putShort(ComBase.changeIntToShort(ByteCount));
        
        bytebuffer.flip();
        return bytebuffer;
    }
    
    public ByteBuffer getControlByteBuffer()
    {
        ByteBuffer bytebuffer = ByteBuffer.allocate(2);
        bytebuffer.order(ByteOrder.BIG_ENDIAN);
        
        bytebuffer.putShort(ComBase.changeIntToShort(1));
        
        bytebuffer.flip();
        return bytebuffer;
    }
    
    public ByteBuffer makeByteBuffer(int value)
    {
        ByteBuffer bytebuffer = ByteBuffer.allocate(2);
        bytebuffer.order(ByteOrder.BIG_ENDIAN);
        
        bytebuffer.putShort(ComBase.changeIntToShort(value));
        
        bytebuffer.flip();
        return bytebuffer;
    }
    public ByteBuffer makeByteBuffer(float value)
    {
        ByteBuffer bytebuffer = ByteBuffer.allocate(2);
        bytebuffer.order(ByteOrder.BIG_ENDIAN);
        
        bytebuffer.putShort(ComBase.changeFloatToShortSigned(value));
        
        bytebuffer.flip();
        return bytebuffer;
    }
    
    
 
 
    public ByteBuffer makeFbs9100CommBuf(ByteBuffer dt_datatofbs9100) {
        int out_len = 0;
        if(CMD_WriteMultiCoil == CMD) {            
            out_len = 1; 
        }else if(CMD_WriteSingleCoil == CMD) {
            out_len = -1; 
        }
        
        ByteBuffer bytebuffer = ByteBuffer.allocate(dt_datatofbs9100.limit()+BYTE_LEN+out_len);
        bytebuffer.order(ByteOrder.BIG_ENDIAN);        
        bytebuffer.position(0);
        bytebuffer.put(ComBase.changeIntToByte(ADDR));
        bytebuffer.put(ComBase.changeIntToByte(CMD));
        bytebuffer.putShort(ComBase.changeIntToShort(RES_Index));
        if(CMD_ReadHoldReg == CMD || CMD_WriteMultiReg == CMD) {            
            bytebuffer.putShort(ComBase.changeIntToShort(ByteCount));
        }
        
        if(CMD_WriteMultiCoil == CMD) {            
            bytebuffer.put(ComBase.changeIntToByte(ByteCount*2));
        }
        
        bytebuffer.put(dt_datatofbs9100);
        
        CRC = Crc16.CalCRC16(bytebuffer, bytebuffer.position()) & 0xFFFF;
        
        //bytebuffer.position(bytebuffer.remaining()-2);
        
        bytebuffer.putShort(ComBase.changeIntToShort(CRC));
        bytebuffer.flip();
        return bytebuffer;
    } 
    
    @Override
    public String toString() {
        return "TmpSensor_Cmd [BYTE_LEN=" + BYTE_LEN + ", ADDR=" + ADDR +  ", ByteCount=" + ByteCount + ", CMD=" + CMD
                + ", RES_Index=" + RES_Index + ", CRC=" + CRC + "]";
    }
    
}