zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    
  • 相关阅读:
    349. Intersection of Two Arrays
    346. Moving Average from Data Stream
    345. Reverse Vowels of a String
    344. Reverse String
    342. Power of Four
    POJ2823 Sliding Window
    《STL源码剖析》笔记
    [jobdu]扑克牌顺子
    [jobdu]第一个只出现一次的字符
    [jobdu]包含min函数的栈
  • 原文地址:https://www.cnblogs.com/kikyoqiang/p/14891564.html
Copyright © 2011-2022 走看看