1. 程式人生 > >私.Modbus測試_ZC01

私.Modbus測試_ZC01

ZC:這個例子是使用TCP來互動midbus協議資料,我在這個例子裡面沒有查詢到 dll或so檔案,執行過程中也沒有提示需要dll或so檔案  也沒有說缺少函式之類的,應該是 沒有用到 dll或so檔案的。

 

ZC:這是使用 TCP的方式來傳輸 modbus協議資料包的,想追一下原始碼 看看到底是不是 socket,追到 ModbusMaster.class的 呼叫函式sendImpl(...)就追不下去了。後一想 通過Debug來追,就來到了 TcpMaster.class中 在函式openConnection(...)中 可以看到 transport就是 socket的輸入輸出流,繼續跟下去 在下面的 傳送過程中 呼叫到了“transport.write(data);”  其實就是 使用socket在傳送資料

 

1、modbus tcp通訊modbus4j使用說明-java程式設計-Leftso(左搜).html(http://www.leftso.com/blog/83.html

2、我的測試程式碼:

 2.1、包:(1)原始碼:"...\ZC_IDE\Java_3rd\modbus_java\03_最新的(20181125)\modbus4j-master.zip",(2)jar:"...\ZC_IDE\Java_3rd\modbus_java\02_新一點的\Mango Automation\m2m2-modbus-1.8.0.zip"的lib資料夾中有

  測試工具:ModbusSlave:"...\ZC__Self\私\ModbusSlave\Modbus Tools\Modbus Slave\mbslave.exe"

 2.2、

package com.modbus4j303;

import com.serotonin.modbus4j.BatchRead;
import com.serotonin.modbus4j.BatchResults;
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.code.DataType;
import com.serotonin.modbus4j.exception.ErrorResponseException;
import com.serotonin.modbus4j.exception.ModbusInitException; import com.serotonin.modbus4j.exception.ModbusTransportException; import com.serotonin.modbus4j.ip.IpParameters; import com.serotonin.modbus4j.locator.BaseLocator; public class Modbus4jUtils { /** * 工廠。 */ static ModbusFactory modbusFactory; static { if (modbusFactory == null) { modbusFactory = new ModbusFactory(); } } /** * 獲取master * * @return * @throws ModbusInitException */ public static ModbusMaster getMaster() throws ModbusInitException { IpParameters params = new IpParameters(); params.setHost("localhost"); params.setPort(502); // // modbusFactory.createRtuMaster(wapper); //RTU 協議 // modbusFactory.createUdpMaster(params);//UDP 協議 // modbusFactory.createAsciiMaster(wrapper);//ASCII 協議 ModbusMaster master = modbusFactory.createTcpMaster(params, false);// TCP 協議 master.init(); return master; } /** * 讀取[01 Coil Status 0x]型別 開關資料 // ZC: Coil線圈 * * @param slaveId * slaveId * @param offset * 位置 * @return 讀取值 * @throws ModbusTransportException * 異常 * @throws ErrorResponseException * 異常 * @throws ModbusInitException * 異常 */ public static Boolean readCoilStatus(int slaveId, int offset) throws ModbusTransportException, ErrorResponseException, ModbusInitException { // 01 Coil Status BaseLocator<Boolean> loc = BaseLocator.coilStatus(slaveId, offset); Boolean value = getMaster().getValue(loc); return value; } /** * 讀取[02 Input Status 1x]型別 開關資料 * * @param slaveId * @param offset * @return * @throws ModbusTransportException * @throws ErrorResponseException * @throws ModbusInitException */ public static Boolean readInputStatus(int slaveId, int offset) throws ModbusTransportException, ErrorResponseException, ModbusInitException { // 02 Input Status BaseLocator<Boolean> loc = BaseLocator.inputStatus(slaveId, offset); Boolean value = getMaster().getValue(loc); return value; } /** * 讀取[03 Holding Register型別 2x]模擬量資料 * * @param slaveId * slave Id * @param offset * 位置 * @param dataType * 資料型別,來自com.serotonin.modbus4j.code.DataType * @return * @throws ModbusTransportException * 異常 * @throws ErrorResponseException * 異常 * @throws ModbusInitException * 異常 */ public static Number readHoldingRegister(int slaveId, int offset, int dataType) throws ModbusTransportException, ErrorResponseException, ModbusInitException { // 03 Holding Register型別資料讀取 BaseLocator<Number> loc = BaseLocator.holdingRegister(slaveId, offset, dataType); Number value = getMaster().getValue(loc); return value; } /** * 讀取[04 Input Registers 3x]型別 模擬量資料 * * @param slaveId * slaveId * @param offset * 位置 * @param dataType * 資料型別,來自com.serotonin.modbus4j.code.DataType * @return 返回結果 * @throws ModbusTransportException * 異常 * @throws ErrorResponseException * 異常 * @throws ModbusInitException * 異常 */ public static Number readInputRegisters(int slaveId, int offset, int dataType) throws ModbusTransportException, ErrorResponseException, ModbusInitException { // 04 Input Registers型別資料讀取 BaseLocator<Number> loc = BaseLocator.inputRegister(slaveId, offset, dataType); Number value = getMaster().getValue(loc); return value; } /** * 批量讀取使用方法 * * @throws ModbusTransportException * @throws ErrorResponseException * @throws ModbusInitException */ public static void batchRead() throws ModbusTransportException, ErrorResponseException, ModbusInitException { BatchRead<Integer> batch = new BatchRead<Integer>(); batch.addLocator(0, BaseLocator.holdingRegister(1, 1, DataType.FOUR_BYTE_FLOAT)); batch.addLocator(1, BaseLocator.inputStatus(1, 0)); ModbusMaster master = getMaster(); batch.setContiguousRequests(false); BatchResults<Integer> results = master.send(batch); System.out.println(results.getValue(0)); System.out.println(results.getValue(1)); } /** * 測試 * * @param args */ public static void main(String[] args) { try { // 01測試 Boolean v011 = readCoilStatus(1, 0); Boolean v012 = readCoilStatus(1, 1); Boolean v013 = readCoilStatus(1, 6); System.out.println("v011:" + v011); System.out.println("v012:" + v012); System.out.println("v013:" + v013); // 02測試 Boolean v021 = readInputStatus(1, 0); Boolean v022 = readInputStatus(1, 1); Boolean v023 = readInputStatus(1, 2); System.out.println("v021:" + v021); System.out.println("v022:" + v022); System.out.println("v023:" + v023); // 03測試 Number v031 = readHoldingRegister(1, 1, DataType.FOUR_BYTE_FLOAT);// 注意,float Number v032 = readHoldingRegister(1, 3, DataType.FOUR_BYTE_FLOAT);// 同上 System.out.println("v031:" + v031); System.out.println("v032:" + v032); // 04測試 Number v041 = readInputRegisters(1, 1, DataType.FOUR_BYTE_FLOAT);// Number v042 = readInputRegisters(1, 3, DataType.FOUR_BYTE_FLOAT);// System.out.println("v041:" + v041); System.out.println("v042:" + v042); // 批量讀取 batchRead(); } catch (Exception e) { e.printStackTrace(); } } }

 

3、

4、

5、