package com.modbus.data;
|
|
import java.nio.ByteBuffer;
|
import java.nio.ByteOrder;
|
|
|
|
public class BaseData {
|
public static final int ReadByteCount = 12;
|
|
public static final int SINGLEWRITE_BYTECOUNT = 6;
|
|
public int transsend; //发送事务标识符
|
public int transreceive; //接收事务标识符
|
public int protocolident; //协议标识符
|
public int datacount; //数据长度[本字节下一个到最后]
|
public int unitident = 0x02; //单元标识符[当前单元固定为2]
|
public int funcode; //功能码
|
public int addrstart; //寄存器起始地址
|
public int regcount; //寄存器数量
|
public int bytecount; //数据区字节数量
|
public byte[] data; //数据区数据
|
|
public BaseData() {
|
|
}
|
|
public BaseData(int cmd_code,int regstart,int regcount) {
|
this.funcode = cmd_code;
|
this.addrstart = regstart;
|
this.regcount = regcount;
|
}
|
|
/**
|
* 构造发送数据
|
* @param cmd_code 命令码
|
* @param addrstart 寄存器起始地址
|
* @param regcount 寄存器数量
|
* @return
|
*/
|
public byte[] createReadData() {
|
ByteBuffer bf = ByteBuffer.allocate(ReadByteCount);
|
bf.order(ByteOrder.BIG_ENDIAN);
|
bf.putShort(ComBase.changeIntToShort(addrstart)); //接收标识 将寄存器起始地址放在标识中[2个字节]
|
bf.putShort(ComBase.changeIntToShort(0x0000)); //协议标识符
|
bf.putShort(ComBase.changeIntToShort(0x0006)); //下面字节长度
|
bf.put(ComBase.changeIntToByte(unitident)); //单元标识符(设备ID)
|
bf.put(ComBase.changeIntToByte(funcode)); //功能码
|
bf.putShort(ComBase.changeIntToShort(addrstart)); //寄存器起始地址
|
bf.putShort(ComBase.changeIntToShort(regcount));
|
bf.flip();
|
byte[] databyte = new byte[ReadByteCount];
|
bf.get(databyte);
|
return databyte;
|
}
|
|
/*
|
* 保持寄存器单点输入
|
* */
|
public byte[] createSingleResWiriteData(byte[] data) {
|
ByteBuffer bf = ByteBuffer.allocate(ReadByteCount+regcount*2+1);
|
bf.order(ByteOrder.BIG_ENDIAN);
|
bf.putShort(ComBase.changeIntToShort(addrstart)); //接收标识 将寄存器起始地址放在标识中[2个字节]
|
bf.putShort(ComBase.changeIntToShort(0x0000)); //协议标识符
|
bf.putShort(ComBase.changeIntToShort(4+regcount*2)); //下面字节长度
|
bf.put(ComBase.changeIntToByte(unitident)); //单元标识符(设备ID)
|
bf.put(ComBase.changeIntToByte(funcode)); //功能码
|
bf.putShort(ComBase.changeIntToShort(addrstart)); //寄存器起始地址
|
bf.put(data); //目标值
|
bf.flip();
|
byte[] databyte = new byte[bf.limit()];
|
bf.get(databyte);
|
//System.out.println(ComFn.bytesToHexString(databyte, databyte.length));
|
return databyte;
|
}
|
|
|
|
/**
|
* 构造单点写入数据
|
* @param value
|
* @return
|
*/
|
public byte[] createSingleCollWiriteData(byte[] data) {
|
ByteBuffer bf = ByteBuffer.allocate(ReadByteCount+regcount*2+1);
|
bf.order(ByteOrder.BIG_ENDIAN);
|
bf.putShort(ComBase.changeIntToShort(addrstart)); //接收标识 将寄存器起始地址放在标识中[2个字节]
|
bf.putShort(ComBase.changeIntToShort(0x0000)); //协议标识符
|
bf.putShort(ComBase.changeIntToShort(4+regcount*2)); //下面字节长度
|
bf.put(ComBase.changeIntToByte(unitident)); //单元标识符(设备ID)
|
bf.put(ComBase.changeIntToByte(funcode)); //功能码
|
bf.putShort(ComBase.changeIntToShort(addrstart)); //寄存器起始地址
|
bf.put(data); //目标值
|
bf.flip();
|
byte[] databyte = new byte[bf.limit()];
|
bf.get(databyte);
|
System.out.println(ComFn.bytesToHexString(databyte, databyte.length));
|
return databyte;
|
}
|
|
|
/**
|
* 构造多点写入数据
|
* @param value
|
* @return
|
*/
|
public byte[] createWiriteData(byte[] data) {
|
ByteBuffer bf = ByteBuffer.allocate(ReadByteCount+regcount*2+1);
|
bf.order(ByteOrder.BIG_ENDIAN);
|
bf.putShort(ComBase.changeIntToShort(addrstart)); //接收标识 将寄存器起始地址放在标识中[2个字节]
|
bf.putShort(ComBase.changeIntToShort(0x0000)); //协议标识符
|
bf.putShort(ComBase.changeIntToShort(7+regcount*2)); //下面字节长度
|
bf.put(ComBase.changeIntToByte(unitident)); //单元标识符(设备ID)
|
bf.put(ComBase.changeIntToByte(funcode)); //功能码
|
bf.putShort(ComBase.changeIntToShort(addrstart)); //寄存器起始地址
|
bf.putShort(ComBase.changeIntToShort(regcount)); //寄存器数量
|
bf.put(ComBase.changeIntToByte(regcount*2)); //写字节数量
|
bf.put(data); //目标值
|
bf.flip();
|
byte[] databyte = new byte[bf.limit()];
|
bf.get(databyte);
|
return databyte;
|
}
|
|
/**
|
* 构造按钮控制数据
|
* @return
|
*/
|
public static byte[] createButtonByte(int value) {
|
if(value==1){
|
value=0xff00;
|
}else{
|
value=0x0000;
|
}
|
ByteBuffer bf = ByteBuffer.allocate(2);
|
bf.order(ByteOrder.BIG_ENDIAN);
|
bf.putShort(ComBase.changeIntToShort(value));
|
bf.flip();
|
byte[] b = new byte[2];
|
bf.get(b);
|
return b;
|
}
|
|
/**
|
* 构造写入多个寄存器数据
|
* @param value
|
* @return
|
*/
|
public static byte[] createFloatByte(float value) {
|
ByteBuffer bf = ByteBuffer.allocate(4);
|
bf.order(ByteOrder.BIG_ENDIAN);
|
bf.putFloat(value);
|
bf.flip();
|
byte[] b = new byte[4];
|
bf.get(b);
|
return b;
|
}
|
|
/**
|
* 构造写入多个寄存器数据
|
* @param value
|
* @return
|
*/
|
public static byte[] createIntByte(int value) {
|
ByteBuffer bf = ByteBuffer.allocate(2);
|
bf.order(ByteOrder.BIG_ENDIAN);
|
bf.putShort(ComBase.changeIntToShort(value));
|
bf.flip();
|
byte[] b = new byte[2];
|
bf.get(b);
|
return b;
|
}
|
|
/**
|
*
|
* @return
|
*/
|
public boolean putByteBuffer(ByteBuffer bf) {
|
ByteBuffer tmpbuf = bf;
|
if(tmpbuf.limit() < 8) {
|
return false;
|
}
|
tmpbuf.position(0);
|
transsend = ComBase.changeShortToInt(bf.getShort());
|
protocolident = ComBase.changeShortToInt(bf.getShort());
|
datacount = ComBase.changeShortToInt(bf.getShort());
|
unitident = ComBase.changeByteToInt(bf.get());
|
addrstart = transsend;
|
if(unitident != 0x02) {
|
return false;
|
}
|
funcode = ComBase.changeByteToInt(bf.get());
|
return true;
|
}
|
|
|
}
|