私.Modbus测试_ZC01_TCP方式
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 StatusBaseLocator<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 StatusBaseLocator<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);// 注意,floatNumber 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、
?
轉載于:https://www.cnblogs.com/codeskilla/p/10016127.html
總結
以上是生活随笔為你收集整理的私.Modbus测试_ZC01_TCP方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 突然发现缓存这么好用
- 下一篇: mybash的实现