Modbus4J Modbus RTU主站

问题描述 投票:1回答:2

当前,我正在使用Schneider Power Logic电气设备。我想从设备读取数据并在系统中显示该值。到目前为止,我发现了J2mod,Jamod和Modbus4Java库。我用所有的modbus4java连接并获取设备的数据。

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

以下是“我的设备”中的设置。它指示处于从属模式及其协议的设备是Modbus RTU。因此,我需要创建一个主应用程序以与之通信,这是使用ModbusRTU协议的吗? (第二个问题)

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

下面是我的应用程序的代码充当Master并使用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地址? (第四个问题)。

并且在运行此代码段之后,出现错误:

稳定库

本地库版本= RXTX-2.1-7

Java库版本= RXTX-2.1-7

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

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

java ip master-slave modbus modbus-tcp
2个回答
4
投票

我是j2mod的维护者,所以我的答案将建议您查看j2mod附带的测试程序。您可以在URL的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)。


0
投票

我在上面的“ com.serotonin.io.serial.SerialParameters”之类的代码中遇到错误,似乎在modbus4j库中找不到SerialParameters类。并且该类未在modbus4j java-doc中显示。

您能帮我摆脱这种情况吗!!!

© www.soinside.com 2019 - 2024. All rights reserved.