modbus4j ser通讯

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

你可能感兴趣的:(JAVA)