Daimon.gu

What is ?

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

 

posted on 2015-03-13 23:14  Daimon.gu  阅读(3034)  评论(0编辑  收藏  举报