目前,我正在使用Schneider Power Logic电气设备。我想从设备读取数据并在系统中显示该值。到目前为止,我发现了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");
}


这是我从Modbus4Java页面提供的示例代码中获得的代码。与我有关的另一件事是params.setCommPortId("COM6");的值,除了“ COM6”之外,还有什么其他值可以输入。因为基本上它接收一个String值。那么我可以将任何String值添加到它吗?这个特定的setCommPortID的功能是什么。 (第三个问题)

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

在运行此代码段后,出现了一个错误:

    稳定的图书馆

本机lib版本= RXTX-2.1-7

Java库版本= RXTX-2.1-7

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

请,请,请帮助我。我被困了将近一个月。真希望外面有人能帮助我。预先感谢您的任何帮助和建议。

最佳答案

我是j2mod的维护者,所以我的答案将建议您查看j2mod附带的测试程序。您可以在URL的SourceForge上找到j2mod-

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

我在这里回答问题非常好,但是我也遵循stackoverflow,因此我也可以在这里进行解释。这里有很多问题,因此,如果有任何遗漏,我先向您致歉。

施耐德设备是从属设备或“服务器”,而您的应用程序是主设备或“客户端”。 Modbus是主/从协议,由主设备发起所有请求。您的应用程序将是主应用程序,并负责发出设备的所有请求。

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

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

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

07-23 12:45