2012-06-08 3 views
0

JAMOD를 사용하여 코일에 액세스하는 방법을 이해하기 위해 다음 프로그램을 작성했습니다. 불행히도 그것은 오류를 던지고있다. -JAMOD를 사용하여 코일을 읽음

java.lang.IndexOutOfBoundsException 
at java.io.BufferedInputStream.read(Unknown Source) 
at java.io.DataInputStream.read(Unknown Source) 
at net.wimpi.modbus.io.ModbusTCPTransport.readResponse(ModbusTCPTransport.java:177) 
at net.wimpi.modbus.io.ModbusTCPTransaction.execute(ModbusTCPTransaction.java:193) 
at TempReader.main(TempReader.java:27) 
. x2 more times 
. 

java.io.EOFException 
at java.io.DataInputStream.readUnsignedByte(Unknown Source) 
at net.wimpi.modbus.io.BytesInputStream.readUnsignedByte(BytesInputStream.java:153) 
at net.wimpi.modbus.io.ModbusTCPTransport.readResponse(ModbusTCPTransport.java:182) 
at net.wimpi.modbus.io.ModbusTCPTransaction.execute(ModbusTCPTransaction.java:193) 
at TempReader.main(TempReader.java:30) 
net.wimpi.modbus.ModbusIOException: Executing transaction failed (tried 3 times) 
at net.wimpi.modbus.io.ModbusTCPTransaction.execute(ModbusTCPTransaction.java:197) 
at TempReader.main(TempReader.java:30) 

프로그램 라인 27은 "trans.execute()"이다. 읽으려고하는 코일 주소는 0x7D1 (2001) 또는 채널 0 데이터 유형은 2 단어입니다. - 물론

import java.net.*; 
import java.io.*; 
import net.wimpi.modbus.*; 
import net.wimpi.modbus.msg.*; 
import net.wimpi.modbus.io.*; 
import net.wimpi.modbus.net.*; 
import net.wimpi.modbus.util.*; 

public class TempReader { 

    public static void main(String Args[]){ 
     TCPMasterConnection con = null; 
     ModbusTCPTransaction trans = null; 
     ReadCoilsRequest rcreq=null; 
     ReadCoilsResponse rcres=null; 
     InetAddress addr = null; 
     int port = Modbus.DEFAULT_PORT; 
     byte byteArray[]={(byte)192, (byte)168, (byte)0, (byte)182}; 
     try { 
      addr=InetAddress.getByAddress(byteArray); 
      con=new TCPMasterConnection(addr); 
      con.setPort(502); 
      con.connect(); 
      rcreq=new ReadCoilsRequest(2001, 1); 
      trans=new ModbusTCPTransaction(con); 
      trans.setRequest(rcreq); 
      trans.execute(); 
      rcres=(ReadCoilsResponse)trans.getResponse(); 
      System.out.println("Response : "+rcres.getCoils().toString()); 
      con.close(); 
     } 
     catch(Exception e){ 
      con.close(); 
      e.printStackTrace(); 
     } 
    } 
} 

오류는 즉 3 회 종료 및 프로그램 종료 전에 ModbusTCPTransport 클래스에 설정된 (I 체크 클래스 원) 3 번 반복합니다.

어디로 잘못 가고 있습니까?

+0

죄송합니다. 어떻게 슬레이브 코일을 읽게 되었습니까? 덕분에 – noidea

답변

1

내 샘플 Modbus TCP ReadMultipleRegistersRequest.

 public static void main(String[] args) { 
    try {   

     /**************************************/ 

     //Read And Write Register Sample 
     int port = Modbus.DEFAULT_PORT; 
     String refe = "4000";//HEX Address 
     int ref=Integer.parseInt(refe,16);//Hex to int   
     int count = 98; //the number Address to read 
     int SlaveAddr=1; 
     String astr = "192.168.1.202"; //Modbus Device     

     InetAddress addr = InetAddress.getByName(astr); 
     TCPMasterConnection con = new TCPMasterConnection(addr); //the connection 
     ModbusTCPTransaction trans = null; //the transaction 

     //1.Prepare the request 
     /************************************/ 
     ReadMultipleRegistersRequest Rreq = new ReadMultipleRegistersRequest(ref,count); 
     ReadMultipleRegistersResponse Rres = new ReadMultipleRegistersResponse(); 

     Rreq.setUnitID(SlaveAddr); //set Slave Address 
     Rres.setUnitID(SlaveAddr); //set Slave Address 

     //2. Open the connection 
     con.setPort(port); 
     con.connect(); 
     con.setTimeout(2500); 

     //3. Start Transaction 
     trans = new ModbusTCPTransaction(con); 
     trans.setRetries(5); 

     trans.setReconnecting(true); 
     trans.setRequest(Rreq); 
     trans.execute(); 

     /*Print Response*/ 
     Rres = (ReadMultipleRegistersResponse) trans.getResponse(); 

     System.out.println("Connected to= "+ astr + con.isConnected() + "/Start Register " + Integer.toHexString(ref)); 
     count=1; 
    for (int k=0;k<count;k++){ 
     System.out.println("The value READ: " + Rres.getRegisterValue(k)); 
    }  

    /****************Close Connection**************/ 
     con.close(); 
     System.out.println("\nConnected = " + con.isConnected()); 
     System.exit(0);//edit Java bug error 


    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 




    }//main 

당신이 노예이 예를 시도 확인하려면 : 스레드를 파고

import net.wimpi.modbus.net.*; 
import net.wimpi.modbus.procimg.*; 
import net.wimpi.modbus.ModbusCoupler; 

public class TCPSlaveTest { 

    public static void main(String[] args) { 
    try { 


/* The important instances and variables */ 
ModbusTCPListener listener = null; 
SimpleProcessImage spi = null; 
int port = Modbus.DEFAULT_PORT; 

    //1. Set port number from commandline parameter 
    if(args != null && args.length ==1) { 
    port = Integer.parseInt(args[0]); 
    } 

//2. Prepare a process image 
spi = new SimpleProcessImage(); 
spi.addDigitalOut(new SimpleDigitalOut(true)); 
spi.addDigitalOut(new SimpleDigitalOut(false)); 
spi.addDigitalIn(new SimpleDigitalIn(false)); 
spi.addDigitalIn(new SimpleDigitalIn(true)); 
spi.addDigitalIn(new SimpleDigitalIn(false)); 
spi.addDigitalIn(new SimpleDigitalIn(true)); 
spi.addRegister(new SimpleRegister(251)); 
spi.addInputRegister(new SimpleInputRegister(45)); 

//3. Set the image on the coupler 
ModbusCoupler.getReference().setProcessImage(spi); 
ModbusCoupler.getReference().setMaster(false); 
ModbusCoupler.getReference().setUnitID(15); 

//4. Create a listener with 3 threads in pool 
listener = new ModbusTCPListener(3); 
listener.setPort(port); 
listener.start(); 


    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    }//main 

}//class TCPSlaveTest 
+0

당신은 항상 시간 제한을 읽었으므로 연결을 도와 줄 수 있습니까? – David

+0

이제는 이것이 슬레이브가 마스터가 아니라는 것을 이해합니다 ... jamod와 함께 작동하는 슬레이브 예제를 줄 수 있습니까? – David

+0

jamod가있는 슬레이브 모드를 테스트하지 않음, 이 예제가 너무 좋다고 생각합니다. http://jamod.sourceforge.net/kb/tcp_slave_howto.html – ISCI

관련 문제