'Modbus4J Modbus RTU master

Currently I am working with the Schneider Power Logic electrical device. I want to read the data from the device and show the value in my system. So far, I discover J2mod, Jamod and Modbus4Java library. I used all modbus4java to connect and get the device's data.

Actually I still confuse whether I suppose to create Master side or Slave side. Based on my understanding, the device will be Slave and my system will be Master (1st question).

Below is the setting AT MY DEVICE. It indicate that the device in slave mode and its protocol is Modbus RTU. So, I need to create a master apps to communicate with it right which is using the ModbusRTU protocol right ? (2nd question)

  • Mode: Slave
  • Protocol: Modbus RTU
  • Address: 1
  • Baud Rate: 38400
  • Parity: None

Below is the code of my apps act as the Master and using the ModbusRTU protocol

public static void main(String[] args) throws ModbusTransportException, ErrorResponseException {
    ModbusFactory factory = new ModbusFactory();  

    SerialParameters params = new SerialParameters();  
    params.setCommPortId("COM6");  
    params.setBaudRate(9600);  
    params.setDataBits(8);  
    params.setStopBits(1);  
    params.setParity(0); 

    ModbusMaster master = factory.createRtuMaster(params);  

    master.setTimeout(1000);  
    master.setRetries(0);  
    long start = System.currentTimeMillis(); 

    try {
        master.init();
    } catch (Exception e) {
        System.out.println( "Modbus Master Init Error: " + e.getMessage());  
          return; 
    }

    try {  
        System.out.println("Reg. 1001 Value:" + master.getValue(1, RegisterRange.HOLDING_REGISTER, 3110, DataType.FOUR_BYTE_FLOAT_SWAPPED));  
    }  
    finally {  
        master.destroy();  
    }  

    System.out.println("Time elapsed: " + (System.currentTimeMillis() - start) + "ms"); 
}

This is the code that I get from the sample code provide by the Modbus4Java page. The other thing that concern me is the value of params.setCommPortId("COM6"); What other value than "COM6" that I can put there. Because basically it receive a String value. So am I able to put any String value to it ? And what is the function of this particular setCommPortID. (3rd question)

Looking at the sample code provide by the Modbus4Java page, it does not put the IP address of the device. But in my case, my device got an IP address. And the IP address only use in the Slave apps only. How should my system recognize the IP address of the device ? (4th question).

And after I run this code snippet, I got an error:

Stable Library

Native lib Version = RXTX-2.1-7

Java lib Version = RXTX-2.1-7

Modbus Master Init Error: com.serotonin.io.serial.SerialPortException: gnu.io.NoSuchPortException

Please, please and please help me. I been stuck with this almost a month. Really hope someone out there will be able to help me. Thank you in advance for any kind of help and suggestion.



Solution 1:[1]

I'm the maintainer for j2mod, so my answer is going to suggest you look at the test programs which are included with j2mod. You can find j2mod on SourceForge at this URL --

https://sourceforge.net/projects/j2mod/

I'm pretty good about answering questions there, but I also follow stackoverflow, so I can explain more here as well. There are a LOT of questions in here, so I apologize in advance if I've missed anything.

The Schneider device is the slave, or "server" and your application is the master or "client". Modbus is a master/slave protocol, with the master initiating all requests. Your application will be the master and responsible for making all requests of your device.

The exact communications will be provided by the device documentation. In this instance, you indicate that the device uses 38400 baud, and so forth. Those are the parameters you will use to update SerialParameters with the RXTX library (which just so happens to also be used by j2mod).

The value passed to setCommPortId() is the Windows COM port identifier - you should be able to pass any value which is associated with an actual COM port -- "COM1", "COM2", etc. Note that some USB converters change their COM port each time they are used, so you may be chasing port names.

You mentioned that your device also has an IP address. You cannot use the RTU classes and methods to access a Modbus/TCP device. The same is true for jamod and j2mod - most Modbus libraries have different classes for RTU and TCP transports (as well as ASCII and UDP, for libraries which support those other transports).

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Julie in Austin