java程式碼實現Modubs從站服務端
阿新 • • 發佈:2021-06-17
ModbusSlave.zip下載
1、ModbusTCPSlave
此處new TcpSlave(10000, false)
因ubuntu下1000以下埠需要root許可權,故這裡使用了10000這個埠,windows下可以使用502埠
package slave; import com.serotonin.modbus4j.ModbusFactory; import com.serotonin.modbus4j.ModbusSlaveSet; import com.serotonin.modbus4j.ip.tcp.TcpSlave; public class ModbusTCPSlave { public static void main(String[] args) throws Exception { run(); } public static void run() throws Exception { /* createSlave方法執行完成後,會進行監聽,影響之後的業務執行,需要以執行緒的方式進行啟動 */ new Thread(() -> { createSalve(); }).start(); /* 為保證在進行點表資料初始化的時候slave已經啟動完成,在此處進行了1s的休眠 */ Thread.sleep(1000); /* 開始進行點表的初始化資料寫入 */ // InitModbusSlave(); } /** * @description 建立ModbusTCP伺服器 */ private static void createSalve() { //建立modbus工廠 ModbusFactory modbusFactory = new ModbusFactory(); //建立TCP服務端 // final ModbusSlaveSet salve = modbusFactory.createTcpSlave(false); final ModbusSlaveSet salve = new TcpSlave(10000, false); //向過程影像區新增資料 salve.addProcessImage(Register.getModscanProcessImage(1)); //獲取暫存器 salve.getProcessImage(1); try { salve.start(); System.out.println("salve.start();"); } catch (Exception e) { e.printStackTrace(); } } }
2、BasicProcessImageListener
package slave; import com.serotonin.modbus4j.ProcessImageListener; /** * 監聽線圈和暫存器,實現ProcessImageListener */ public class BasicProcessImageListener implements ProcessImageListener { @Override public void coilWrite(int i, boolean b, boolean b1) { } @Override public void holdingRegisterWrite(int offset, short oldValue, short newValue) { System.out.println("Register at " + offset + "," + "change " + oldValue + " to " + newValue); } }
3、Register
package slave; import com.serotonin.modbus4j.BasicProcessImage; /** * 暫存器及線圈 */ public class Register { public static BasicProcessImage getModscanProcessImage(int slaveId) { /* 初始化過程影像區 */ BasicProcessImage processImage = new BasicProcessImage(slaveId); /* 初始化暫存器資料範圍 */ processImage.setInvalidAddressValue(Short.MIN_VALUE); /* 初始化過程影像區各個數值為0 */ for (int i = 0; i < 608; i++) { processImage.setHoldingRegister(i, (short) 0); } /* 為影像區新增監聽 */ processImage.addListener(new BasicProcessImageListener()); return processImage; } }