modbus 编程调试问题

han867241432 2015-09-17 09:24:19
以下是主设备代码,问题是:通过mbslave连接到pc的COM1口,然后运行程序:出现端口被未知程序占用。如果先运行程序,或出现请求无应答。mbslave也连不上COM1。希望各位能帮助解答一下。
程序是网上拷的,想先调通一下。
在网上也没有找到好的关于modbus的编程资料,在官网找到一个函数手册,但是仅仅是函数头,并没有关于函数功能的介绍如果可以的话,希望各位大大能提供一些资料。
/**
* 通过串口解析MODBUS协议
*
*
*/
public class modBus {
//设定MODBUS网络上从站地址
private final static int SLAVE_ADDRESS = 1;
// 串行波特率
private final static int BAUD_RATE = 9600;

public static void main(String[] args) {
SerialParameters serialParameters = new SerialParameters();
// 设定MODBUS通讯的串行口
serialParameters.setCommPortId("COM1");
// 设定成无奇偶校验
serialParameters.setParity(0);
// 设定成数据位是8位
serialParameters.setDataBits(8);
// 设定为1个停止位
serialParameters.setStopBits(1);
// 设定端口名称
serialParameters.setPortOwnerName("hwm");
// 设定端口波特率
serialParameters.setBaudRate(BAUD_RATE);

// 创建ModbusFactory工厂实例
ModbusFactory modbusFactory = new ModbusFactory();
// 创建ModbusMaster实例
ModbusMaster master = modbusFactory.createRtuMaster(serialParameters);

// 初始化
try {
master.init();
readHoldingRegistersTest(master,SLAVE_ADDRESS,0,100);

} catch (ModbusInitException e) {
e.printStackTrace();
} finally {
master.destroy();
}

}



/**
* 读保持寄存器上的内容
* @param master 主站
* @param slaveId 从站地址
* @param start 起始地址的偏移量
* @param len 待读寄存器的个数
*/
private static void readHoldingRegistersTest(ModbusMaster master,
int slaveId, int start, int len) {
try {
ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(
slaveId, start, len);
ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse)
master.send(request);
if (response.isException()) {
System.out.println("Exception response: message="
+ response.getExceptionMessage());
} else {
System.out.println(Arrays.toString(response.getShortData()));
short[] list = response.getShortData();
for(int i = 0; i < list.length; i++){
System.out.print(list[i] + " ");
}
}
} catch (ModbusTransportException e) {
e.printStackTrace();
}
}

}


以下是先连接mbslave后运行程序的报错
Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
com.serotonin.modbus4j.exception.ModbusInitException: com.serotonin.io.serial.SerialPortException: gnu.io.PortInUseException: Unknown Application
at com.serotonin.modbus4j.serial.SerialMaster.init(SerialMaster.java:31)
at com.serotonin.modbus4j.serial.rtu.RtuMaster.init(RtuMaster.java:23)
at modBus.main(modBus.java:48)
Caused by: com.serotonin.io.serial.SerialPortException: gnu.io.PortInUseException: Unknown Application
at com.serotonin.io.serial.SerialUtils.openSerialPort(SerialUtils.java:55)
at com.serotonin.modbus4j.serial.SerialMaster.init(SerialMaster.java:27)
... 2 more
Caused by: gnu.io.PortInUseException: Unknown Application
at gnu.io.CommPortIdentifier.open(CommPortIdentifier.java:354)
at com.serotonin.io.serial.SerialUtils.openSerialPort(SerialUtils.java:43)
... 3 more


以下是先运行程序的报错。

Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
com.serotonin.modbus4j.exception.ModbusTransportException: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.serial.rtu.RtuMessageRequest@c1b531
at com.serotonin.modbus4j.serial.rtu.RtuMaster.send(RtuMaster.java:57)
at modBus.readHoldingRegistersTest(modBus.java:74)
at modBus.main(modBus.java:49)
Caused by: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.serial.rtu.RtuMessageRequest@c1b531
at com.serotonin.messaging.MessageControl.send(MessageControl.java:104)
at com.serotonin.messaging.MessageControl.send(MessageControl.java:69)
at com.serotonin.modbus4j.serial.rtu.RtuMaster.send(RtuMaster.java:51)
... 2 more

最近在做的项目需要用到,但是之前也没接触过,再次谢谢大家了。
...全文
2310 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
summerXJY100 2018-08-16
  • 打赏
  • 举报
回复
1、portInUseException,显示端口被占用
启动mbslave应用程序后,打开端口,当前端口被占用,因此java程序无法再次访问此端口。
2、TimeOutException,连接超时
java程序建立了com口的连接,从com口读取数据,如果com口没有连接设备,java程序永远读不到数据,因此连接超时。

建议使用实际的物理设备建立环境。首先使用mbslave进行检测环境是否连接正常,关闭mbslave后,再进行java程序的测试。

如果没有物理环境,建议使用vspd建立虚拟端口,使用mbslave建立从站,使用java建立主站。或者反过来用。
ASandJava 2018-05-12
  • 打赏
  • 举报
回复
网上代码没问题
ASandJava 2018-05-12
  • 打赏
  • 举报
回复
最新解决 网上的代码没有问题吗,是配置时候的问题,问题出现在串口连接时必须主机连接一个,从机连接另一个,他们靠slave id连接,切记,切记
找虫子的MM 2018-03-20
  • 打赏
  • 举报
回复
引用 13 楼 TheBlackbeard 的回复:
楼主把地址改成 0 试试
改为0之后 ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master.send(request); 这行代码获取为空
无扬人生 2017-12-23
  • 打赏
  • 举报
回复
楼主把地址改成 0 试试
无扬人生 2017-12-23
  • 打赏
  • 举报
回复
引用 楼主 han867241432 的回复:
以下是主设备代码,问题是:通过mbslave连接到pc的COM1口,然后运行程序:出现端口被未知程序占用。如果先运行程序,或出现请求无应答。mbslave也连不上COM1。希望各位能帮助解答一下。 程序是网上拷的,想先调通一下。 在网上也没有找到好的关于modbus的编程资料,在官网找到一个函数手册,但是仅仅是函数头,并没有关于函数功能的介绍如果可以的话,希望各位大大能提供一些资料。 /** * 通过串口解析MODBUS协议 * * */ public class modBus { //设定MODBUS网络上从站地址 private final static int SLAVE_ADDRESS = 1; // 串行波特率 private final static int BAUD_RATE = 9600; public static void main(String[] args) { SerialParameters serialParameters = new SerialParameters(); // 设定MODBUS通讯的串行口 serialParameters.setCommPortId("COM1"); // 设定成无奇偶校验 serialParameters.setParity(0); // 设定成数据位是8位 serialParameters.setDataBits(8); // 设定为1个停止位 serialParameters.setStopBits(1); // 设定端口名称 serialParameters.setPortOwnerName("hwm"); // 设定端口波特率 serialParameters.setBaudRate(BAUD_RATE); // 创建ModbusFactory工厂实例 ModbusFactory modbusFactory = new ModbusFactory(); // 创建ModbusMaster实例 ModbusMaster master = modbusFactory.createRtuMaster(serialParameters); // 初始化 try { master.init(); readHoldingRegistersTest(master,SLAVE_ADDRESS,0,100); } catch (ModbusInitException e) { e.printStackTrace(); } finally { master.destroy(); } } /** * 读保持寄存器上的内容 * @param master 主站 * @param slaveId 从站地址 * @param start 起始地址的偏移量 * @param len 待读寄存器的个数 */ private static void readHoldingRegistersTest(ModbusMaster master, int slaveId, int start, int len) { try { ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest( slaveId, start, len); ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master.send(request); if (response.isException()) { System.out.println("Exception response: message=" + response.getExceptionMessage()); } else { System.out.println(Arrays.toString(response.getShortData())); short[] list = response.getShortData(); for(int i = 0; i < list.length; i++){ System.out.print(list[i] + " "); } } } catch (ModbusTransportException e) { e.printStackTrace(); } } } 以下是先连接mbslave后运行程序的报错 Stable Library ========================================= Native lib Version = RXTX-2.1-7 Java lib Version = RXTX-2.1-7 com.serotonin.modbus4j.exception.ModbusInitException: com.serotonin.io.serial.SerialPortException: gnu.io.PortInUseException: Unknown Application at com.serotonin.modbus4j.serial.SerialMaster.init(SerialMaster.java:31) at com.serotonin.modbus4j.serial.rtu.RtuMaster.init(RtuMaster.java:23) at modBus.main(modBus.java:48) Caused by: com.serotonin.io.serial.SerialPortException: gnu.io.PortInUseException: Unknown Application at com.serotonin.io.serial.SerialUtils.openSerialPort(SerialUtils.java:55) at com.serotonin.modbus4j.serial.SerialMaster.init(SerialMaster.java:27) ... 2 more Caused by: gnu.io.PortInUseException: Unknown Application at gnu.io.CommPortIdentifier.open(CommPortIdentifier.java:354) at com.serotonin.io.serial.SerialUtils.openSerialPort(SerialUtils.java:43) ... 3 more 以下是先运行程序的报错。 Stable Library ========================================= Native lib Version = RXTX-2.1-7 Java lib Version = RXTX-2.1-7 com.serotonin.modbus4j.exception.ModbusTransportException: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.serial.rtu.RtuMessageRequest@c1b531 at com.serotonin.modbus4j.serial.rtu.RtuMaster.send(RtuMaster.java:57) at modBus.readHoldingRegistersTest(modBus.java:74) at modBus.main(modBus.java:49) Caused by: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.serial.rtu.RtuMessageRequest@c1b531 at com.serotonin.messaging.MessageControl.send(MessageControl.java:104) at com.serotonin.messaging.MessageControl.send(MessageControl.java:69) at com.serotonin.modbus4j.serial.rtu.RtuMaster.send(RtuMaster.java:51) ... 2 more 最近在做的项目需要用到,但是之前也没接触过,再次谢谢大家了。
应该是modbus的地址错了,改下地址试试,
问题很多呀 2017-12-02
  • 打赏
  • 举报
回复
引用 5 楼 wangziguan1212 的回复:
这个错误是什么原因? 请大神指教 Stable Library ========================================= Native lib Version = RXTX-2.1-7 Java lib Version = RXTX-2.1-7 com.serotonin.modbus4j.exception.ModbusTransportException: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.serial.rtu.RtuMessageRequest@74cb02 at com.serotonin.modbus4j.serial.rtu.RtuMaster.send(RtuMaster.java:57) at modbus.HardneedlTest.readDiscreteInputTest(HardneedlTest.java:55) at modbus.HardneedlTest.main(HardneedlTest.java:32) Caused by: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.serial.rtu.RtuMessageRequest@74cb02 at com.serotonin.messaging.MessageControl.send(MessageControl.java:104) at com.serotonin.messaging.MessageControl.send(MessageControl.java:69) at com.serotonin.modbus4j.serial.rtu.RtuMaster.send(RtuMaster.java:51) ... 2 more com.serotonin.modbus4j.exception.ModbusTransportException: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.serial.rtu.RtuMessageRequest@18a9fc8 at com.serotonin.modbus4j.serial.rtu.RtuMaster.send(RtuMaster.java:57) at modbus.HardneedlTest.writeRegistersTest(HardneedlTest.java:105) at modbus.HardneedlTest.main(HardneedlTest.java:33) Caused by: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.serial.rtu.RtuMessageRequest@18a9fc8 at com.serotonin.messaging.MessageControl.send(MessageControl.java:104) at com.serotonin.messaging.MessageControl.send(MessageControl.java:69) at com.serotonin.modbus4j.serial.rtu.RtuMaster.send(RtuMaster.java:51) ... 2 more com.serotonin.modbus4j.exception.ModbusTransportException: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.serial.rtu.RtuMessageRequest@19518cc at com.serotonin.modbus4j.serial.rtu.RtuMaster.send(RtuMaster.java:57) at modbus.HardneedlTest.readHoldingRegistersTest(HardneedlTest.java:80) at modbus.HardneedlTest.main(HardneedlTest.java:34) Caused by: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.serial.rtu.RtuMessageRequest@19518cc at com.serotonin.messaging.MessageControl.send(MessageControl.java:104) at com.serotonin.messaging.MessageControl.send(MessageControl.java:69) at com.serotonin.modbus4j.serial.rtu.RtuMaster.send(RtuMaster.java:51) ... 2 more
我也是这个问题,大神,解决了吗?
wanglonjg 2017-07-07
  • 打赏
  • 举报
回复
java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver Exception in thread "main" java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1709) at java.lang.Runtime.loadLibrary0(Runtime.java:823) at java.lang.System.loadLibrary(System.java:1030) at gnu.io.CommPortIdentifier.<clinit>(CommPortIdentifier.java:83) at com.serotonin.io.serial.SerialUtils.openSerialPort(SerialUtils.java:37) at com.serotonin.modbus4j.serial.SerialMaster.init(SerialMaster.java:27) at com.serotonin.modbus4j.serial.rtu.RtuMaster.init(RtuMaster.java:23) at Modbus.main(Modbus.java:27)
tuochao4178 2016-12-22
  • 打赏
  • 举报
回复
com.serotonin.messaging.TimeoutException:
井底之蛙1991 2016-09-04
  • 打赏
  • 举报
回复
这个错误是什么原因? 请大神指教 Stable Library ========================================= Native lib Version = RXTX-2.1-7 Java lib Version = RXTX-2.1-7 com.serotonin.modbus4j.exception.ModbusTransportException: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.serial.rtu.RtuMessageRequest@74cb02 at com.serotonin.modbus4j.serial.rtu.RtuMaster.send(RtuMaster.java:57) at modbus.HardneedlTest.readDiscreteInputTest(HardneedlTest.java:55) at modbus.HardneedlTest.main(HardneedlTest.java:32) Caused by: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.serial.rtu.RtuMessageRequest@74cb02 at com.serotonin.messaging.MessageControl.send(MessageControl.java:104) at com.serotonin.messaging.MessageControl.send(MessageControl.java:69) at com.serotonin.modbus4j.serial.rtu.RtuMaster.send(RtuMaster.java:51) ... 2 more com.serotonin.modbus4j.exception.ModbusTransportException: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.serial.rtu.RtuMessageRequest@18a9fc8 at com.serotonin.modbus4j.serial.rtu.RtuMaster.send(RtuMaster.java:57) at modbus.HardneedlTest.writeRegistersTest(HardneedlTest.java:105) at modbus.HardneedlTest.main(HardneedlTest.java:33) Caused by: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.serial.rtu.RtuMessageRequest@18a9fc8 at com.serotonin.messaging.MessageControl.send(MessageControl.java:104) at com.serotonin.messaging.MessageControl.send(MessageControl.java:69) at com.serotonin.modbus4j.serial.rtu.RtuMaster.send(RtuMaster.java:51) ... 2 more com.serotonin.modbus4j.exception.ModbusTransportException: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.serial.rtu.RtuMessageRequest@19518cc at com.serotonin.modbus4j.serial.rtu.RtuMaster.send(RtuMaster.java:57) at modbus.HardneedlTest.readHoldingRegistersTest(HardneedlTest.java:80) at modbus.HardneedlTest.main(HardneedlTest.java:34) Caused by: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.serial.rtu.RtuMessageRequest@19518cc at com.serotonin.messaging.MessageControl.send(MessageControl.java:104) at com.serotonin.messaging.MessageControl.send(MessageControl.java:69) at com.serotonin.modbus4j.serial.rtu.RtuMaster.send(RtuMaster.java:51) ... 2 more
井底之蛙1991 2016-09-04
  • 打赏
  • 举报
回复
解决了吗???
derek 2016-05-18
  • 打赏
  • 举报
回复
我也遇到这个错误 你们是怎么解决的? com.serotonin.modbus4j.exception.ModbusTransportException: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.serial.rtu.RtuMessageRequest@100bac2 at com.serotonin.modbus4j.serial.rtu.RtuMaster.send(RtuMaster.java:57) at com.sailun.monitoring.humiture.HardneedlTest2.readHoldingRegistersTest(HardneedlTest2.java:215) at com.sailun.monitoring.humiture.HardneedlTest2.main(HardneedlTest2.java:137) at com.sailun.main.Main.main(Main.java:12) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.simontuffs.onejar.Boot.run(Boot.java:306) at OneJar.run(OneJar.java:47) at OneJar.main(OneJar.java:42) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.exe4j.runtime.LauncherEngine.launch(Unknown Source) at com.exe4j.runtime.WinLauncher.main(Unknown Source) Caused by: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.serial.rtu.RtuMessageRequest@100bac2 at com.serotonin.messaging.MessageControl.send(MessageControl.java:104) at com.serotonin.messaging.MessageControl.send(MessageControl.java:69) at com.serotonin.modbus4j.serial.rtu.RtuMaster.send(RtuMaster.java:51) ... 16 more
abababudei 2016-03-24
  • 打赏
  • 举报
回复
解决了么,分享一下,我这里报了写超时 01-02 11:13:49.520 11469-11469/? W/System.err﹕ com.serotonin.modbus4j.exception.ModbusTransportException: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.serial.rtu.RtuMessageRequest@4130c830 01-02 11:13:49.520 11469-11511/? I/GNU.IO﹕ leaving check_tiocmget_changes 01-02 11:13:49.520 11469-11511/? I/GNU.IO﹕ port_has_changed_fionread: change is 0 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at com.serotonin.modbus4j.serial.rtu.RtuMaster.send(RtuMaster.java:57) 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at com.example.modbus.SerialUtils.writeRegistersTest(SerialUtils.java:111) 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at com.example.modbus.SerialUtils.modbus(SerialUtils.java:50) 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at com.example.modbus.MyActivity.onCreate(MyActivity.java:12) 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at android.app.Activity.performCreate(Activity.java:5104) 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at android.app.ActivityThread.access$600(ActivityThread.java:141) 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:99) 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at android.os.Looper.loop(Looper.java:137) 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5041) 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method) 01-02 11:13:49.520 11469-11511/? I/GNU.IO﹕ entering check_tiocmget_changes 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:511) 01-02 11:13:49.520 11469-11511/? I/GNU.IO﹕ leaving check_tiocmget_changes 01-02 11:13:49.520 11469-11511/? I/GNU.IO﹕ port_has_changed_fionread: change is 0 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:816) 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:582) 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at dalvik.system.NativeStart.main(Native Method) 01-02 11:13:49.520 11469-11469/? W/System.err﹕ Caused by: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.serial.rtu.RtuMessageRequest@4130c830 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at com.serotonin.messaging.MessageControl.send(MessageControl.java:104) 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at com.serotonin.messaging.MessageControl.send(MessageControl.java:69) 01-02 11:13:49.520 11469-11469/? W/System.err﹕ at com.serotonin.modbus4j.serial.rtu.RtuMaster.send(RtuMaster.java:51) 01-02 11:13:49.520 11469-11469/? W/System.err﹕ ... 17 more
奔命 2015-11-25
  • 打赏
  • 举报
回复
大哥解决了么,求帮助啊

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧