?? modbus.java
字號:
public short PresetMultipleRegisters(short nAddr, int nDataStart , short nQtd , double adRegValues[],int nRealType) {
short anRegValues[];
short nError;
anRegValues=new short[nQtd*4];
DoubleToShortArray(adRegValues,anRegValues,nRealType);
return PresetMultipleRegisters(nAddr,nDataStart ,(short)(nQtd*4) ,anRegValues);
}
public short PresetSingleRegister(short nAddr, int nRegister , short nRegValue) {
short QUERY_LENGHT=(short)(6);
byte abyQuery[]= new byte[QUERY_LENGHT+MBAP_HEADER_SIZE];
short nReplyLength=(short)(6);
int aiReply[] = new int[nReplyLength+MBAP_HEADER_SIZE];
short nError;
short nByte;
short nRespByte;
int iReg;
int iRetry;
//Query
InsertMBAPHeader(abyQuery,QUERY_LENGHT);
//modbus message
abyQuery[OFFSET_MODBUS_MESS+0]=(byte)nAddr; //ADDR
abyQuery[OFFSET_MODBUS_MESS+1]=PRESET_SINGLE_REGISTER; //Function
abyQuery[OFFSET_MODBUS_MESS+2]=HiByte(nRegister);
abyQuery[OFFSET_MODBUS_MESS+3]=LoByte(nRegister);
abyQuery[OFFSET_MODBUS_MESS+4]=HiByte(nRegValue);
abyQuery[OFFSET_MODBUS_MESS+5]=LoByte(nRegValue);
iRetry=0;
do {
nError=TxRxMessage(abyQuery,(short)(QUERY_LENGHT+MBAP_HEADER_SIZE),aiReply, nReplyLength);
if (nError==ERR_OK) {
for (iReg=0;iReg<QUERY_LENGHT;iReg++){
if ((byte)aiReply[iReg]!=abyQuery[OFFSET_MODBUS_MESS+iReg]) {
nError=ERR_INVALID_RESPONSE;
break;
}
}
}//nerror=ERR_OK
iRetry++;
} while ((iRetry<m_iRetries)&&(nError!=ERR_OK));
ThrowException(nError);
return(nError);
}//end PresetSingleRegister
public short PresetSingleRegister(short nAddr, int nRegister , int iRegValue) {
return PresetSingleRegister(nAddr,nRegister ,(short)iRegValue);
}
public short PresetSingleRegister(short nAddr, int nRegister ,float fRegValue,int nRealType) {
float afRegs[] = new float[1];
afRegs[0] = fRegValue;
return PresetMultipleRegisters(nAddr,nRegister ,(short)(1) ,afRegs,nRealType);
}
public short PresetSingleRegister(short nAddr, int nRegister ,double dRegValue,int nRealType) {
double adRegs[] = new double[1];
adRegs[0] = dRegValue;
return PresetMultipleRegisters(nAddr,nRegister ,(short)(1) ,adRegs,nRealType);
}
public short LoopbackTest(short nAddr) throws ModbusException {
short QUERY_LENGHT=(short)(6);
byte abyQuery[]= new byte[QUERY_LENGHT+MBAP_HEADER_SIZE];
short nReplyLength=(short)(6+MBAP_HEADER_SIZE);
int aiReply[] = new int[nReplyLength];
short nError;
int iReg;
short nQueryLenght = (short)(QUERY_LENGHT+MBAP_HEADER_SIZE);
int iRetry;
iReg=0;
//Query
InsertMBAPHeader(abyQuery ,QUERY_LENGHT);
//modbus message
abyQuery[OFFSET_MODBUS_MESS+0]=(byte)nAddr; //ADDR
abyQuery[OFFSET_MODBUS_MESS+1]=LOOP_BACK_TEST; //Function
abyQuery[OFFSET_MODBUS_MESS+2]=HiByte((short)0); //diag. code=0
abyQuery[OFFSET_MODBUS_MESS+3]=LoByte((short)0);
abyQuery[OFFSET_MODBUS_MESS+4]=(byte)System.currentTimeMillis();
abyQuery[OFFSET_MODBUS_MESS+5]=(byte)System.currentTimeMillis();
iRetry=0;
do {
nError=TxRxMessage(abyQuery,nQueryLenght,aiReply, nReplyLength);
if (nError==ERR_OK) {
for (iReg=0;iReg<QUERY_LENGHT;iReg++){
if ((byte)aiReply[iReg]!=abyQuery[OFFSET_MODBUS_MESS+iReg]) {
nError=ERR_INVALID_RESPONSE;
break;
}
}
}//nerror=ERR_OK
iRetry++;
} while ((iRetry<m_iRetries)&&(nError!=ERR_OK));
ThrowException(nError);
return(nError);
}//end LoopBackTest
public short ForceSingleCoil(short nAddr, int nRegister, boolean bCoilValue) {
short QUERY_LENGHT=(short)(6);
byte abyQuery[]= new byte[QUERY_LENGHT+MBAP_HEADER_SIZE];
short nReplyLength=(short)(6);
int aiReply[] = new int[nReplyLength+MBAP_HEADER_SIZE];
short nError;
int iReg;
int iRetry;
//Query
InsertMBAPHeader(abyQuery,QUERY_LENGHT);
//modbus message
abyQuery[OFFSET_MODBUS_MESS+0]=(byte)nAddr; //ADDR
abyQuery[OFFSET_MODBUS_MESS+1]=FORCE_SINGLE_COIL; //Function
abyQuery[OFFSET_MODBUS_MESS+2]=HiByte(nRegister); //diag. code=0
abyQuery[OFFSET_MODBUS_MESS+3]=LoByte(nRegister);
abyQuery[OFFSET_MODBUS_MESS+4]=HiByte(CmodBool(bCoilValue));
abyQuery[OFFSET_MODBUS_MESS+5]=LoByte(CmodBool(bCoilValue));
iRetry=0;
do {
nError=TxRxMessage(abyQuery,(short)(QUERY_LENGHT+MBAP_HEADER_SIZE),aiReply, nReplyLength);
if (nError==ERR_OK) {
for (iReg=0;iReg<QUERY_LENGHT;iReg++){
if ((byte)aiReply[iReg]!=abyQuery[OFFSET_MODBUS_MESS+iReg]) {
nError=ERR_INVALID_RESPONSE;
break;
}
}
}//nerror=ERR_OK
iRetry++;
} while ((iRetry<m_iRetries)&&(nError!=ERR_OK));
ThrowException(nError);
return(nError);
}//end ForceSingleCoil
public short ForceMultipleCoils(short nAddr, int nDataStart , short nQtd , boolean abCoilValues[]) {
short QUERY_LENGHT=(short)(7+(nQtd + 7)/8);
byte abyQuery[]= new byte[QUERY_LENGHT+MBAP_HEADER_SIZE];
short nReplyLength=(short)(6);
int aiReply[] = new int[nReplyLength];
short nError;
short nByte;
short nQueryByte;
int iCoil;
int iBit;
int iReg;
int iRetry;
//Query
InsertMBAPHeader(abyQuery ,QUERY_LENGHT);
//modbus message
abyQuery[OFFSET_MODBUS_MESS+0]=(byte)nAddr; //ADDR
abyQuery[OFFSET_MODBUS_MESS+1]=FORCE_MULTIPLE_COILS; //Function
abyQuery[OFFSET_MODBUS_MESS+2]=HiByte(nDataStart);
abyQuery[OFFSET_MODBUS_MESS+3]=LoByte(nDataStart);
abyQuery[OFFSET_MODBUS_MESS+4]=HiByte(nQtd);
abyQuery[OFFSET_MODBUS_MESS+5]=LoByte(nQtd);
abyQuery[OFFSET_MODBUS_MESS+6]=(byte)((nQtd + 7)/8);
nQueryByte=OFFSET_MODBUS_MESS+7;
iBit=0;
for (iCoil=0;iCoil<(nQtd);iCoil++){
if (iBit>7){
iBit=0;
nQueryByte++;
}
if (abCoilValues[iCoil]) {
abyQuery[nQueryByte]=(byte)(abyQuery[nQueryByte] | (0x01<<iBit));
}
iBit++;
}
iRetry=0;
do {
nError=TxRxMessage(abyQuery,(short)(QUERY_LENGHT+MBAP_HEADER_SIZE),aiReply, nReplyLength);
if (nError==ERR_OK) {
for (iReg=0;iReg<6;iReg++){
if ((byte)aiReply[iReg]!=abyQuery[OFFSET_MODBUS_MESS+iReg]) {
nError=ERR_INVALID_RESPONSE;
break;
}
}
}//nerror=ERR_OK
iRetry++;
} while ((iRetry<m_iRetries)&&(nError!=ERR_OK));
ThrowException(nError);
return(nError);
}//end ForceMultipleCoils
public synchronized short TxRxMessage(byte abyQuery[] , short nQueryLength, int aiReply[], short nReplyLenght) {
long lInitialTime;
boolean bTimeout=false;
int iByteRecived;
long lCurrentTime;
short iRespSize=0;
if (m_bReConnectOnEveryMessage) {
if (!openConnection(m_sAddress,m_iPort,m_iTimeOut)){
return(ERR_EXECPTION);
}
}
try {
m_ostream.flush();
m_ostream.flush();
m_istream.skip(m_istream.available()); //discard any value in the buffer
//send question
m_ostream.write(abyQuery, 0, nQueryLength); //offset=0
m_ostream.flush();
lInitialTime=System.currentTimeMillis();
bTimeout=false;
while (!bTimeout){
if (this.m_istream.available()<MBAP_HEADER_SIZE){
if ((System.currentTimeMillis()-lInitialTime)>m_iTimeOut){
lCurrentTime=(System.currentTimeMillis()-lInitialTime);
lCurrentTime=System.currentTimeMillis();
bTimeout=true;
}
}
else {
break;
}
}
if (!bTimeout){
for (iByteRecived=0;iByteRecived<MBAP_HEADER_SIZE;iByteRecived++){
aiReply[iByteRecived]=m_istream.readUnsignedByte();
}
iRespSize = (short)(aiReply[MBAP_HEADER_SIZE-2]);
iRespSize = (short)((iRespSize<<8)|(aiReply[MBAP_HEADER_SIZE-1]));
while (!bTimeout){
if (this.m_istream.available()<(iRespSize)){
if ((System.currentTimeMillis()-lInitialTime)>m_iTimeOut){
lCurrentTime=(System.currentTimeMillis()-lInitialTime);
lCurrentTime=System.currentTimeMillis();
bTimeout=true;
}
}
else {
break;
}
}
}
if (!bTimeout){
for (iByteRecived=0;iByteRecived<iRespSize;iByteRecived++){
aiReply[iByteRecived]=m_istream.readUnsignedByte();
}
//verify modbus exception
if (aiReply[1]>0x80){
return (short)(ERR_MODBUS_EXCPTION+aiReply[2]);
}
}
else {
return(ERR_TIMEOUT);
}
if (m_bReConnectOnEveryMessage) {
closeConnection();
}
}//end try
System.err.println("Could not read data from Modbus server.");
return(ERR_EXECPTION);
}
return(ERR_OK);
}//end TxRxMessage
public void InsertMBAPHeader(byte abQuery[] , short nqueryLenght ){
if (abQuery.length<6) {
return;
}
abQuery[0]=0; //identifier
abQuery[1]=0;
abQuery[2]=0;//protocol identifier
abQuery[3]=0;
abQuery[4]=HiByte(nqueryLenght);//length field (upper byte)
abQuery[5]=LoByte(nqueryLenght);
}
private byte HiByte(int iNumber) {
return( (byte)((iNumber>>8) & (int)0x000000FF));
}
private byte LoByte(int iNumber) {
return( (byte)((iNumber) & 0xFF));
}
private short HiWord(int iNumber) {
return( (short)((iNumber>>16) & (int)0x0000FFFF));
}
private short LoWord(int iNumber) {
return( (short)((iNumber) & (int)0x0000FFFF));
}
//java boolean to modbus boolean
private short CmodBool(boolean bCoil) {
if (bCoil) {
return((short)0xFF00);
}
else {
return((short)0x0000);
}
}
private void ShortToIntArray(short nArray[] , int iArray[]) {
int i;
int iTest;
for (i=0;i<nArray.length;i++){
iArray[i]=(int)((char)nArray[i]);
iTest=iArray[i];
}
}
private void IntToShortArray(int iArray[] , short nArray[]) {
int i;
short nTest;
for (i=0;i<nArray.length;i++){
nArray[i]=(short)iArray[i];
nTest=nArray[i];
}
}
private void ShortToFloatArray(short anArray[] , float afArray[] , int nRealTye) {
int i;
float fValue;
if (anArray.length!=(2*afArray.length)) {
System.err.println("ShortToFloat Error");
return;
}
for (i=0;i<afArray.length;++i){
if (REAL_NORMAL==nRealTye) {
afArray[i]= Float.intBitsToFloat(HiLoWord2Int (anArray[2*i+1],anArray[2*i+0]));
}
else {
afArray[i]= Float.intBitsToFloat(HiLoWord2Int (anArray[2*i+0],anArray[2*i+1]));
}
}
}
private void FloatToShortArray(float afArray[] ,short anArray[], int nRealTye) {
int i;
int iValue;
if (anArray.length!=(2*afArray.length)) {
System.err.println("ShortToFloat Error");
return;
}
for (i=0;i<afArray.length;++i){
iValue = Float.floatToIntBits(afArray[i]);
if (REAL_NORMAL==nRealTye) {
anArray[2*i+1]=HiWord(iValue);
anArray[2*i+0]=LoWord(iValue);
}
else {
anArray[2*i+0]=HiWord(iValue);
anArray[2*i+1]=LoWord(iValue);
}
}
}
private void ShortToDoubleArray(short anArray[] , double adArray[] , int nRealTye) {
int i;
float fValue;
if (anArray.length!=(4*adArray.length)) {
System.err.println("ShortToFloat Error");
return;
}
for (i=0;i<adArray.length;++i){
if (REAL_NORMAL==nRealTye) {
adArray[i]= Double.longBitsToDouble(Words2Long(anArray[4*i+3],anArray[4*i+2],anArray[4*i+1],anArray[4*i+0]));
}
else {
adArray[i]= Double.longBitsToDouble(Words2Long(anArray[4*i+0],anArray[4*i+1],anArray[4*i+2],anArray[4*i+3]));
}
}
}
private void DoubleToShortArray(double adArray[] ,short anArray[], int nRealTye) {
int i;
long lValue;
if (anArray.length!=(4*adArray.length)) {
System.err.println("DoubleToShortArray Error");
return;
}
for (i=0;i<adArray.length;++i){
lValue = Double.doubleToLongBits(adArray[i]);
if (REAL_NORMAL==nRealTye) {
anArray[4*i+3]=GetWord(3,lValue);
anArray[4*i+2]=GetWord(2,lValue);
anArray[4*i+1]=GetWord(1,lValue);
anArray[4*i+0]=GetWord(0,lValue);
}
else {
anArray[4*i+0]=GetWord(3,lValue);
anArray[4*i+1]=GetWord(2,lValue);
anArray[4*i+2]=GetWord(1,lValue);
anArray[4*i+3]=GetWord(0,lValue);
}
}
}
private int HiLoWord2Int(short iHi , short iLo) {
int iRet=0;
int iHiPart=0;
int iLoPart=0;
iHiPart = ((int)0xFFFF & iHi);
iHiPart = (iHiPart<<16);
iRet = iHiPart|((int)0xFFFF & iLo);
return( iRet) ; //(byte)((iNumber>>8) & (int)0x000000FF));
}
private long Words2Long(short w3 , short w2,short w1 , short w0) {
long lRel=0;
long lTemp=0;
lTemp = ((long)0xFFFF & w3);
lTemp = lTemp<<(3*16);
lRel = lRel | lTemp;
lTemp = ((long)0xFFFF & w2);
lTemp = lTemp<<(2*16);
lRel = lRel | lTemp;
lTemp = ((long)0xFFFF & w1);
lTemp = lTemp<<(1*16);
lRel = lRel | lTemp;
lTemp = ((long)0xFFFF & w0);
lTemp = lTemp<<(0*16);
lRel = lRel | lTemp;
return lRel;
}
private short GetWord(int iPart, long lValue) {
long lTemp=0;
lTemp =lValue;
lTemp = lTemp>>(iPart*16);
lTemp = ((long)0xFFFF & lTemp);
return (short)lTemp;
}
}//end Modbus Class
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -