Java实现ModbusTCP服务器的创建和数据变化监听

要创建slave从站,我们需要使用modbus的jar包

<!--modbus4j-->
        <dependency>
            <groupId>com.infiniteautomation</groupId>
            <artifactId>modbus4j</artifactId>
            <version>3.0.3</version>
        </dependency>

这里有个坑,阿里巴巴的镜像是下载不了这个包的,建议使用默认镜像,然后科学上网下载,不然就只能下别人的包,然后手动导入。

创建服务器:


import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusSlaveSet;
import com.serotonin.modbus4j.ip.tcp.TcpSlave;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

@Component
public class ModbusTCPSlave implements ApplicationRunner {


//    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(502, false);

        //向过程影像区添加数据
        salve.addProcessImage(Register.getModscanProcessImage(1));
        //获取寄存器
        salve.getProcessImage(1);
        try {
            System.out.println("salve启动成功");
            salve.start();
//            System.out.println("salve.start();");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        /* createSlave方法执行完成后,会进行监听,影响之后的业务运行,需要以线程的方式进行启动 */
        new Thread(() -> {
            createSalve();
        }).start();
        /* 为保证在进行点表数据初始化的时候slave已经启动完成,在此处进行了1s的休眠 */
        Thread.sleep(1000);
        /* 开始进行点表的初始化数据写入 */
        // InitModbusSlave();
    }

}

初始化寄存器和线圈:

import com.serotonin.modbus4j.BasicProcessImage;

/**
 * 寄存器及线圈
 */
public class Register {
    public static BasicProcessImage getModscanProcessImage(int slaveId) {
        /* 初始化过程影像区 */
        BasicProcessImage processImage = new BasicProcessImage(slaveId);
        /* 设置无效地址的默认值为Short类型的最大值 */
//        processImage.setInvalidAddressValue(Short.MAX_VALUE);

        /* 初始化过程影像区各个数值为0 */
        for (int i = 0; i < 608; i++) {
            processImage.setHoldingRegister(i, (short) 0);

        }
        /* 为影像区添加监听 */
        processImage.addListener(new BasicProcessImageListener());
        return processImage;
    }
}

数据变化监听:

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

以上,我们就可以在启动的时候创建一个slave从站

接着我们可以使用工具Modbus Poll测试连接一下,连接上了,就代表从站创建成功。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值