modbus TCP 连接使用modbus4j 进行连接 示例

jar包版本

modbus4j-3.0.6.jar

示例代码

	// 入库
@SneakyThrows
    private List<ElecDataVal> work(){
        List<ElecDataVal> elecDataVals = new ArrayList<>();
        Map<String, List<MPoint>> pMap = pointList.stream().collect(Collectors.groupingBy(MPoint::getSys));
        for (Map.Entry<String, List<MPoint>> entry : pMap.entrySet()) {
            String ip = ipMap.get(entry.getKey());
            initDevice(ip, port);
            master.init();
            elecDataVals.addAll(readValues(entry.getValue()));
        }
        Date nowTime = new Date();
        for (ElecDataVal elecDataVal : elecDataVals) {
            elecDataVal.setTime(nowTime);
        }
        return elecDataVals;
    }
	
	// 初始化本地设备
    public void initDevice(String ip, int port){
        ipParameters = new IpParameters();
        ipParameters.setHost(ip);
        ipParameters.setPort(port);
        ipParameters.setEncapsulated(false);

        modbusFactory = new ModbusFactory();
        master = modbusFactory.createTcpMaster(ipParameters, false);
        master.setTimeout(TIMEOUT);
        master.setRetries(RETRY);
        log.info("Modbus Factory init:host:{},port:{}",ip,port);
    }
	// 批量读取数据库中存储的设备信息,并使用modbusMaster 进行本地读取
    public List<ElecDataVal> readValues(List<MPoint> pointList) throws ErrorResponseException, ModbusTransportException {
        List<ElecDataVal> elecDataVals = new ArrayList<>(pointList.size());
        BatchRead<String> batchRead = new BatchRead<String>();
        for(MPoint point : pointList) {
            int id = point.getRegAddress();
            int mode = point.getPointType();
            batchRead.addLocator(point.getId(), BaseLocator.holdingRegister(deviceId, id, mode));
        }
        // 批量读取数据
        BatchResults<String> res = master.send(batchRead);
        log.debug("Modbus batch:{}",elecDataVals);
        if(res!=null) {
            for(MPoint point:pointList) {
                String key = point.getId();
                String value = String.valueOf(res.getValue(key));
                double v = Double.valueOf(value);
                if(point.getSelfGain()!=0){
                    v = v/point.getSelfGain();
                }
                ElecDataVal elecDataVal = new ElecDataVal();
                elecDataVal.setId(String.valueOf(snowflakeGenerator.next()));
                elecDataVal.setName(point.getName());
                elecDataVal.setVal(v);
                elecDataVals.add(elecDataVal);
            }
        }
        return elecDataVals;
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值