首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Modbus4J Modbus RTU主机

Modbus4J Modbus RTU主机
EN

Stack Overflow用户
提问于 2015-09-07 06:42:23
回答 1查看 7.9K关注 0票数 1

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

实际上,我仍然搞不懂我是要创造主人的一面,还是创造奴隶的一面。根据我的理解,这个装置将是奴隶,我的系统将是主人(第一个问题)。

下面是我的设备的设置。结果表明,从模式下的设备及其协议为Modbus RTU。所以,我需要创建一个主应用程序来与它进行通信--使用ModbusRTU协议对吗?(第二个问题)

  • 模式:从模式
  • 协议: Modbus RTU
  • 地址:1
  • 波特率: 38400
  • 均等:无

下面是我的应用程序的代码,充当主程序,并使用ModbusRTU协议

代码语言:javascript
运行
复制
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“之外,我还可以放在那里。因为它基本上接收一个字符串值。所以我能把任何字符串值给它吗?这个特殊的setCommPortID的功能是什么。(第三个问题)

查看由Modbus4Java页面提供的示例代码,它不会放置设备的IP地址。但就我而言,我的设备有一个IP地址。IP地址只在奴隶应用程序中使用。我的系统应该如何识别设备的IP地址?(第四个问题)。

在运行这个代码片段之后,我得到了一个错误:

稳定图书馆

本机库版本= RXTX-2.1-7

Java版本= RXTX-2.1-7

Modbus主输入错误: com.serotonin.io.serial.SerialPortException: gnu.io.NoSuchPortException

求你了求你帮帮我。我被困在这差不多一个月了。真希望外面有人能帮我。预先感谢您的任何帮助和建议。

EN

回答 1

Stack Overflow用户

发布于 2015-09-13 12:48:18

我是j2mod的维护者,所以我的答案是建议您看看j2mod中包含的测试程序。您可以在这个网址上找到j2mod on SourceForge --

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

我很擅长在那里回答问题,但我也遵循堆栈溢出,所以我也可以在这里解释更多。这里有很多问题,所以如果我错过了什么,我会提前道歉。

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

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

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32432548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档