modbus4j ser通讯

[cpp]view plain copy

  1. modbus4j.jar实现modbus urt模式
[cpp]view plain copy
  1. 使用modbus4j开源项目,通过串口读取数据,过程中遇到点小问题。(转的demo按自己的需求修改的)
  2. 1.串口不对应,导致 gnu.io.NoSuchPortException。
  3. 2.PLC485串口转COMM口,发/送线连接不对,导致读不到数据
  4. 3.rxtxSerial.dll放置的路径,查了下有人说放到myeclipse/jre/bin下,可我是放到C:\Windows\System32下,不知道原因。
  5. 4.RXTXcomm.jar包和rxtxSerial.dll文件不对应,可去官网下载同一版本。
  6. 5.读保持型寄存器和读输入型寄存器方法不一样。这是由于modbus协议,保持型功能码为03,输入型为04。通过api可找到对应的方法,用法也差不多一样。
  7. class="java">package com.test.modbus;
  8. import java.util.Arrays;
  9. import com.serotonin.io.serial.SerialParameters;
  10. import com.serotonin.modbus4j.ModbusFactory;
  11. import com.serotonin.modbus4j.ModbusMaster;
  12. import com.serotonin.modbus4j.exception.ModbusInitException;
  13. import com.serotonin.modbus4j.exception.ModbusTransportException;
  14. import com.serotonin.modbus4j.msg.ReadDiscreteInputsRequest;
  15. import com.serotonin.modbus4j.msg.ReadDiscreteInputsResponse;
  16. import com.serotonin.modbus4j.msg.ReadHoldingRegistersRequest;
  17. import com.serotonin.modbus4j.msg.ReadHoldingRegistersResponse;
  18. import com.serotonin.modbus4j.msg.WriteRegistersRequest;
  19. import com.serotonin.modbus4j.msg.WriteRegistersResponse;
  20. /**
  21. * 通过串口解析MODBUS协议
  22. * @author cl2
  23. *
  24. */
  25. public class TestModbusDemo {
  26. //设定MODBUS网络上从站地址
  27. private final static int SLAVE_ADDRESS = 1;
  28. // 串行波特率
  29. private final static int BAUD_RATE = 9600;
  30. public static void main(String[] args) {
  31. SerialParameters serialParameters = new SerialParameters();
  32. // 设定MODBUS通讯的串行口
  33. serialParameters.setCommPortId("COM3");
  34. // 设定成无奇偶校验
  35. serialParameters.setParity(0);
  36. // 设定成数据位是8位
  37. serialParameters.setDataBits(8);
  38. // 设定为1个停止位
  39. serialParameters.setStopBits(1);
  40. // 设定端口名称
  41. serialParameters.setPortOwnerName("Numb nuts");
  42. // 设定端口波特率
  43. serialParameters.setBaudRate(BAUD_RATE);
  44. // 创建ModbusFactory工厂实例
  45. ModbusFactory modbusFactory = new ModbusFactory();
  46. // 创建ModbusMaster实例
  47. ModbusMaster master = modbusFactory.createRtuMaster(serialParameters);
  48. // 初始化
  49. try {
  50. master.init();
  51. readHoldingRegistersTest(master,SLAVE_ADDRESS,0,100);
  52. } catch (ModbusInitException e) {
  53. e.printStackTrace();
  54. } finally {
  55. master.destroy();
  56. }
  57. }
  58. /**
  59. * 读开关量型的输入信号
  60. * @param master 主站
  61. * @param slaveId 从站地址
  62. * @param start 起始偏移量
  63. * @param len 待读的开关量的个数
  64. */
  65. private static void readDiscreteInputTest(ModbusMaster master, int slaveId, int start, int len) {
  66. try {
  67. ReadDiscreteInputsRequest request = new ReadDiscreteInputsRequest(slaveId, start, len);
  68. ReadDiscreteInputsResponse response = (ReadDiscreteInputsResponse) master.send(request);
  69. if (response.isException())
  70. System.out.println("Exception response: message=" + response.getExceptionMessage());
  71. else
  72. System.out.println(Arrays.toString(response.getBooleanData()));
  73. }
  74. catch (ModbusTransportException e) {
  75. e.printStackTrace();
  76. }
  77. }
  78. /**
  79. * 读保持寄存器上的内容
  80. * @param master 主站
  81. * @param slaveId 从站地址
  82. * @param start 起始地址的偏移量
  83. * @param len 待读寄存器的个数
  84. */
  85. private static void readHoldingRegistersTest(ModbusMaster master,
  86. int slaveId, int start, int len) {
  87. try {
  88. ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(
  89. slaveId, start, len);
  90. ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master
  91. .send(request);
  92. if (response.isException()) {
  93. System.out.println("Exception response: message="
  94. + response.getExceptionMessage());
  95. } else {
  96. System.out.println(Arrays.toString(response.getShortData()));
  97. short[] list = response.getShortData();
  98. for(int i = 0; i < list.length; i++){
  99. System.out.print(list[i] + " ");
  100. }
  101. }
  102. } catch (ModbusTransportException e) {
  103. e.printStackTrace();
  104. }
  105. }
  106. /**
  107. * 批量写数据到保持寄存器
  108. * @param master 主站
  109. * @param slaveId 从站地址
  110. * @param start 起始地址的偏移量
  111. * @param values 待写数据
  112. */
  113. public static void writeRegistersTest(ModbusMaster master, int slaveId, int start, short[] values) {
  114. try {
  115. WriteRegistersRequest request = new WriteRegistersRequest(slaveId, start, values);
  116. WriteRegistersResponse response = (WriteRegistersResponse) master.send(request);
  117. if (response.isException()){
  118. System.out.println("Exception response: message=" + response.getExceptionMessage());
  119. }
  120. else {
  121. System.out.println("Success");
  122. }
  123. }
  124. catch (ModbusTransportException e) {
  125. e.printStackTrace();
  126. }
  127. }
  128. }

    推荐阅读