1. 程式人生 > 其它 >java程式碼實現Modubs從站服務端

java程式碼實現Modubs從站服務端

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;
    }
}