首页 > 编程语言 >Java与Modbus通信

Java与Modbus通信

时间:2023-01-27 19:12:06浏览次数:62  
标签:Map Java 通信 slaveBlock Modbus master new modbusMaster

1、引入依赖

<dependency>
            <groupId>com.intelligt.modbus</groupId>
            <artifactId>jlibmodbus</artifactId>
            <!-- 版本号可依照maven仓库迭代升级 -->
            <version>1.2.9.7</version>
        </dependency>

 

2、获取Modbus连接

/**
     * 获取Modbus连接
     * @return
     */
    private Map<String, ModbusMaster> getModbusConn() throws UnknownHostException {
        ModbusMaster modbusMaster;
        TcpParameters tcpParameters = new TcpParameters();
        List<String> modbusIps = hfyProperties.getIps();
        Map<String, ModbusMaster> modbusMasterMap = new HashMap<>();
        for(String modbusIp : modbusIps){
            // TCP参数设置ip地址
            tcpParameters.setHost(InetAddress.getByName(modbusIp));
            // TCP设置长连接
            tcpParameters.setKeepAlive(true);
            // TCP设置端口,这里设置是默认端口502
            tcpParameters.setPort(Integer.valueOf(hfyProperties.getPort()));
            // 创建一个主机
            modbusMaster = ModbusMasterFactory.createModbusMasterTCP(tcpParameters);
            Modbus.setAutoIncrementTransactionId(true);
            modbusMasterMap.put(modbusIp, modbusMaster);
        }
        return modbusMasterMap;
    }
View Code

注:我这里是获得了3台modbus连接,因为有三台服务器。

3、根据功能码,实时读取Modbus数据

/**
     * 批量采集Modbus数据
     */
    //@RequestMapping("/")
    @Scheduled(fixedRate = 1, timeUnit = TimeUnit.SECONDS)
    public void batchReadHfyData() {
        long startTime = System.nanoTime();
        try {
            // 采集灰分仪数据
            Map<String, List<SlaveBlockDto>> slaveBlockDtoList = gatherSlaveData(slaveBlocks);
            // 发送kafka
            eventPublisher.publishEvent(new HfyMessageEvent(this, slaveBlockDtoList));
            log.info("读取数据耗时:{} 毫秒, 数据量:{}", Duration.ofNanos(System.nanoTime() - startTime).toMillis(), slaveBlockDtoList.size());
        } catch (ExecutionException | InterruptedException | UnknownHostException | ModbusIOException |
                 ModbusProtocolException | ModbusNumberException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 采集灰分仪数据
     */
    private Map<String, List<SlaveBlockDto>> gatherSlaveData(List<SlaveBlock> slaveBlocks) throws ExecutionException, InterruptedException, UnknownHostException, ModbusIOException, ModbusProtocolException, ModbusNumberException {
        List<SlaveBlockDto> dtoList;
        Map<String, ModbusMaster> modbusMasterMap = getModbusConn();
        Map<String, List<SlaveBlockDto>> resultMap = new HashMap<>();
        // 连接Modbus,实时获取料位仪的数据
        for(Map.Entry<String, ModbusMaster> modbusMaster : modbusMasterMap.entrySet()){
            ModbusMaster master = modbusMaster.getValue();
            String modbusIp = modbusMaster.getKey();
            // 开启连接
            master.connect();
            log.info("modbus, ip:{} 连接成功,连接为:{}", modbusIp, master);
            // 根据功能码读取实时数据
            dtoList = gatherImmDataByFuncCode(master);
            resultMap.put(modbusIp, dtoList);
        }
        return resultMap;
    }

    private List<SlaveBlockDto> gatherImmDataByFuncCode(ModbusMaster master) throws ModbusProtocolException, ModbusNumberException, ModbusIOException {
        List<SlaveBlockDto> dtoList = new ArrayList<>();
        int slaveId = hfyProperties.getSlaveId();
        int quantity = hfyProperties.getQuantity();
        for(SlaveBlock slaveBlock : slaveBlocks){
            if(slaveBlock.getFunctionCode().equalsIgnoreCase(FuncCodeEnum.CODE_FIVE.getCode()))
                continue;
            SlaveBlockDto slaveBlockDto = new SlaveBlockDto();
            // 功能码
            String code = slaveBlock.getFunctionCode();
            // 偏移地址
            int offset = slaveBlock.getOffset();
            FuncCodeEnum funcCodeEnum = FuncCodeEnum.fromFuncCodes(code);
            // 根据不同的功能码读取modbus数据
            switch(funcCodeEnum){
                case CODE_TWO:
                    boolean[] discreteInputs = master.readDiscreteInputs(slaveId, offset, quantity);
                    slaveBlockDto.setValue(String.valueOf(discreteInputs[0]));
                    break;
                case CODE_FOUR:
                    int[] inputRegisters = master.readInputRegisters(slaveId, offset, quantity);
                    slaveBlockDto.setValue(String.valueOf(inputRegisters[0]));
                    break;
                case CODE_FIVE:
                default:
                    break;
            }
            // 封装数据
            slaveBlockDto.setName(slaveBlock.getName());
            slaveBlockDto.setNameDesc(slaveBlock.getDesc());
            dtoList.add(slaveBlockDto);
        }
        return dtoList;
    }
View Code

源码:https://gitee.com/caesarthegreat/modbus-demo.git

标签:Map,Java,通信,slaveBlock,Modbus,master,new,modbusMaster
From: https://www.cnblogs.com/caesar-the-great/p/17069188.html

相关文章

  • javafx程序运行
    下载openjfxhttps://gluonhq.com/products/javafx/openjfx的LTS版本好像要付费才能下载,所以勾选“Includeolderversions”下载一个非LTS的。下载后解压到一个地方执......
  • 【参考答案】java基础练习:方法、递归
    方法实现定义方法(不用jdk提供的方法),计算x的y次方,如2的5次方packagecom.qzcsbj;/***@公众号:全栈测试笔记*@描述:<>*/publicclassTest{publicstaticvoid......
  • Java 解析 带 T Z 的 UTC 时间格式 日期
    直接上代码吧publicstaticvoidmain(String[]args)throwsParseException{SimpleDateFormatdf=newSimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");......
  • 01-Java概述
    计算机包括两部分:硬件:鼠标、键盘、显示器、主机箱内部的cpu、内存条、硬盘等软件:包括系统软件和应用软件系统软件:直接和硬件交互,例如window7、winxp、win8、win10......
  • 学习java第一天
    MARKDOWN学习标题二级标题三级标题 字体Hello,World!Hello,World!Hello,World!Hello,World!Hello,World!Hello,World!引用选择从未设想的道路,走出自......
  • java基础笔记
    JAVA基础数据类型基本数据类型(PrimitiveType)数值类型:整数类型:​ byte占1字节​ short占2字节​ int占4字节​ long占8字节,long类型数据后要加L(小写l也行,......
  • 用Java写一个分布式缓存——缓存管理
    前言之前也用过一些缓存中间件,框架,也想着自己是不是也能用Java写一个出来,于是就有了这个想法,打算在写的过程中同步进行总结源码:weloe/Java-Distributed-Cache(github.co......
  • 【Java】用增强for循环遍历元素提示并发修改异常
    做二叉树遍历时使用了增强for循环,但是出现异常:Exceptioninthread"main"java.util.ConcurrentModificationException原因是:迭代器遍历元素的时候,通过集合是不能修改元素......
  • java23种设计模式
    Java设计模式学习创建型模式简单工厂模式简单工厂模式严格意义上来说,并不属于设计模式中的一种,不过这里还是简单记录下。定义:由一个工厂对象决定创建出哪一种类型实例......
  • Java集合
    一、什么是集合二、Collection体系集合1.Collection父接口2.List集合方法(list继承collection)publicstaticvoidmain(String[]args){//创建l......