2016-03-22 15 views
0

Modbus özellikli bir cihaza erişen java için jamod kütüphanesini deniyorum. 'un modbus profiline göre cihazın belirli bir register (40149) olmasını istiyorum. Veri türü beklenen bir Signed 32 bit int olmalıdır. Aşağıdaki kodu kurdum (https://github.com/jeick/jamod/blob/master/src/main/java/net/wimpi/modbus/cmd/TCPMasterTest.java tabanlı), ancak çalışmıyor. Kayıt sadece yazıyor, ancak cihazın kayıt değerini görebileceğim bir ekranı var. Böylece bir Modbus kaydı ilk elemanı ile iki uzunlukta bir dizi mevcut gerekli değeri 20000 ve 0.Java Modbus (jamod) Erişim

private static int requestNumber = 7; 
public static void main(String[] args) { 
    int port = Modbus.DEFAULT_PORT; 
    int unitId = 3; //Same as TCPSlaveTest.java 
    try { 
     if (args != null && args.length == 1) { 
      port = Integer.parseInt(args[0]); 
     } 
     //InetAddress addy = InetAddress.getLocalHost(); 
     InetAddress addy = InetAddress.getByName("192.168.2.11"); 
     TCPMasterConnection connection = new TCPMasterConnection(addy); 
     connection.setTimeout(3000); 
     connection.setPort(port); 
     System.out.println("Trying to connect to "+addy.getCanonicalHostName()+" on port "+port); 
     connection.connect(); 

     ModbusTCPTransaction transaction = new ModbusTCPTransaction(connection); 

     ModbusRequest request; 
     while ((request = getNextRequest()) != null) { 
      request.setUnitID(unitId); 
      transaction.setRequest(request); 
      transaction.execute(); 
      ModbusResponse response = transaction.getResponse(); 
      gotResponse(response); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

private static void gotResponse(ModbusResponse response) { 
    System.out.println("Got response: "+ response.getHexMessage()); 
} 

private static ModbusRequest getNextRequest() { 
    //Note: simple process image uses 0-based register addresses 
    switch (requestNumber) { 
     case 0: 
      return new WriteCoilRequest(0,true); 
     case 1: 
      return new ReadCoilsRequest(0, 2); 
     case 2: 
      return new ReadInputDiscretesRequest(0,4); 
     case 3: 
      return new ReadInputRegistersRequest(0,1); 
     case 4: 
      return new ReadMultipleRegistersRequest(30052,2); 
     case 5: 
      Register r = ModbusCoupler.getReference().getProcessImageFactory().createRegister(); 
      r.setValue(420); 
      return new WriteSingleRegisterRequest(0,r); 
     case 6: 
      return new ReadMultipleRegistersRequest(30051,2); 
     case 7: 
      SimpleRegister[] registers = new SimpleRegister[2]; 
      registers[0] = new SimpleRegister(0); 
      registers[1] = new SimpleRegister(2000); 
      return new WriteMultipleRegistersRequest(40149,registers); 
     default: 
      return null; 
    } 
} 

herhangi bir öneri, ikinci dizi gönderilir, 16 bit (cihazın göre Modbus profilli) olduğu ?

cevap

0

Kayıt içine bir değer yazmak karmaşık bir işlem değildir, bunu yapmak için kullandığım yöntemdir.

import java.net.InetAddress; 
import java.net.UnknownHostException; 

import net.wimpi.modbus.ModbusException; 
import net.wimpi.modbus.ModbusIOException; 
import net.wimpi.modbus.ModbusSlaveException; 
import net.wimpi.modbus.io.ModbusTCPTransaction; 
import net.wimpi.modbus.msg.ReadInputDiscretesRequest; 
import net.wimpi.modbus.msg.ReadInputDiscretesResponse; 
import net.wimpi.modbus.msg.WriteSingleRegisterRequest; 
import net.wimpi.modbus.net.TCPMasterConnection; 
import net.wimpi.modbus.procimg.SimpleRegister; 

public class WriteToRegister { 

    TCPMasterConnection con = null; //the connection 
    ModbusTCPTransaction trans = null; //the transaction 
    ReadInputDiscretesRequest req = null; //the request 
    ReadInputDiscretesResponse res = null; //the response 

    WriteToRegister(String ipaddress , int port) throws UnknownHostException { 

     InetAddress ipaddr = null; 

     ipaddr = InetAddress.getByName(ipaddress); 

     con = new TCPMasterConnection(ipaddr); 
     con.setPort(port); 
     System.out.println("Making connection to Plc.."); 

     try { 
      con.connect(); 
     } catch (Exception e) { 
      System.err.println("Connection successful"); 
      e.printStackTrace(); 
     } 
    } 

    public void writeRegister(int regaddr, int value) throws ModbusIOException, ModbusSlaveException, ModbusException { 

     WriteSingleRegisterRequest WriteReq = null; 
     SimpleRegister MyReg = new SimpleRegister(1); 

     //3. Prepare the request 
     WriteReq = new WriteSingleRegisterRequest(); 
     WriteReq.setReference(regaddr); //register number 
     MyReg.setValue(value);   //value for register 
     WriteReq.setRegister(MyReg); 

     //4. Prepare the transaction 

     trans = new ModbusTCPTransaction(con); 
     trans.setRequest(WriteReq); 

     trans.execute(); 

    } 

    public static void main(String[] args) throws UnknownHostException, ModbusIOException, ModbusSlaveException, ModbusException { 

     WriteToRegister w = new WriteToRegister("192.168.0.34",502); 
     // Make sure you insert register value in hexadecimal 
     // and value should be in range of -32,768 to 32,767 
     w.writeRegister(0x1000, 255); 

    } 

} 

Bu yardımcı olur umarım! Benim için çalışıyor.