⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modbus.java

📁 工控modbus协议通讯
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
	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
		
		catch(IOException ioe) { 
			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 + -