Modbus4J Modbus RTU 主站

ame*_*mil 1 java ip modbus master-slave modbus-tcp

目前我正在使用施耐德电力逻辑电气设备。我想从设备读取数据并在系统中显示该值。到目前为止,我发现了 J2mod、Jamod 和 Modbus4Java 库。我使用了所有modbus4java来连接并获取设备的数据。

实际上我仍然很困惑是否应该创建主端或从端。根据我的理解,该设备将是从站,我的系统将是主站(第一个问题)。

以下是我的设备上的设置。表示设备处于从机模式,协议为Modbus RTU。那么,我需要创建一个使用 ModbusRTU 协议与其通信的主应用程序,对吗?(第二个问题)

  • 模式:从属
  • 协议:Modbus RTU
  • 地址1
  • 波特率:38400
  • 奇偶校验:无

下面是我的应用程序作为主站并使用 ModbusRTU 协议的代码

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"); 
}
Run Code Online (Sandbox Code Playgroud)

这是我从 Modbus4Java 页面提供的示例代码中获得的代码。我关心的另一件事是params.setCommPortId("COM6");除了“COM6”之外我还可以放在那里的其他值。因为基本上它接收一个字符串值。那么我可以为其添加任何字符串值吗?这个特定的setCommPortID 的作用是什么。(第三个问题)

查看Modbus4Java页面提供的示例代码,它没有放置设备的IP地址。但就我而言,我的设备有一个 IP 地址。并且 IP 地址仅在从属应用程序中使用。我的系统应如何识别设备的 IP 地址?(第四个问题)。

运行此代码片段后,出现错误:

稳定的库

本机库版本 = RXTX-2.1-7

Java 库版本 = RXTX-2.1-7

Modbus 主初始化错误:com.serotonin.io.serial.SerialPortException:gnu.io.NoSuchPortException

拜托,拜托,请帮助我。我被这个问题困扰了快一个月了。真的希望有人能够帮助我。预先感谢您的任何帮助和建议。

Jul*_*tin 5

我是 j2mod 的维护者,所以我的回答是建议您查看 j2mod 中包含的测试程序。您可以在 SourceForge 上找到 j2mod,网址为:

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

我很擅长在那里回答问题,但我也关注 stackoverflow,所以我也可以在这里解释更多。这里有很多问题,所以如果我错过了什么,我提前道歉。

Schneider 设备是从设备或“服务器”,您的应用程序是主设备或“客户端”。Modbus 是主/从协议,由主站发起所有请求。您的应用程序将成为主设备,负责向您的设备发出所有请求。

确切的通信将由设备文档提供。在本例中,您指示设备使用 38400 波特率,依此类推。这些是您将用来通过 RXTX 库更新 SerialParameters 的参数(恰好也被 j2mod 使用)。

传递给 setCommPortId() 的值是 Windows COM 端口标识符 - 您应该能够传递与实际 COM 端口关联的任何值 - “COM1”、“COM2”等。请注意,某些 USB 转换器会更改其 COM每次使用它们时都会使用端口,因此您可能会追逐端口名称。

您提到您的设备也有一个 IP 地址。您不能使用 RTU 类和方法来访问 Modbus/TCP 设备。jamod 和 j2mod 也是如此 - 大多数 Modbus 库对于 RTU 和 TCP 传输有不同的类别(对于支持其他传输的库,还有 ASCII 和 UDP)。