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;
        }
    }
    
  • 相关阅读:
    【译】第26节---配置一对多关系
    【译】第25节---配置一对一关系
    【译】第24节---Fluent API
    pycharm 更改创建文件默认路径和修改字体大小
    软件工程----自我介绍
    课堂作业---读取文件实现求数组中所有子数组和的最大值
    实现数组中连续子数组值和最大
    android-----实现不两个不同的activity的跳转和数据传递
    android------解决editText只输入一行和textView不显示过多的内容
    android-------实现底部导航的模板
  • 原文地址:https://www.cnblogs.com/kikyoqiang/p/14891564.html
Copyright © 2011-2022 走看看