baoshiwei
2025-06-08 013fa08f64639a4a722dbb709a746a4561a02964
feat(service): 添加压缩空气和水表数据模拟器

- 新增 CompressedAirSimulator 和 WaterMeterSimulator 类
- 实现每分钟生成一次模拟数据并写入 InfluxDB
- 优化电压数据处理逻辑,支持四路共用的情况
- 修复部分数据采集和计算逻辑
已添加2个文件
已修改3个文件
254 ■■■■ 文件已修改
src/main/java/com/zhitan/service/impl/CompressedAirSimulator.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zhitan/service/impl/DataServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zhitan/service/impl/OpcServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zhitan/service/impl/WaterMeterSimulator.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-prod.yml 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zhitan/service/impl/CompressedAirSimulator.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,81 @@
package com.zhitan.service.impl;
import com.influxdb.client.domain.WritePrecision;
import com.influxdb.client.write.Point;
import com.zhitan.config.influxdb.InfluxdbConfig;
import com.zhitan.influxdb.InfluxdbRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Random;
@Slf4j
@Service
public class CompressedAirSimulator {
    private final String TAG = "tag";
    private final String FIELD_VALUE = "value";
    private final String TAGNAME = "yasuokongqi01_StTotal";
    private final InfluxdbRepository repository;
    private final InfluxdbConfig influxdbConfig;
    private double lastAirTotal = 0;
    private final Random random = new Random();
    @Autowired
    public CompressedAirSimulator(InfluxdbRepository repository, InfluxdbConfig influxdbConfig) {
        this.repository = repository;
        this.influxdbConfig = influxdbConfig;
        loadLastAirData();
    }
    private void loadLastAirData() {
        double lastValue = repository.getLastPoint(influxdbConfig.getMeasurement(), TAG, TAGNAME);
        if (lastValue > 0) {
            log.info("查询出最后一次写入influxdb的压缩空气数据:{}", lastValue);
            lastAirTotal = lastValue;
        }
    }
    @Scheduled(fixedRate = 60000) // æ¯åˆ†é’Ÿæ‰§è¡Œä¸€æ¬¡
    public void simulateAirUsage() {
        LocalDateTime now = LocalDateTime.now();
        double airUsage = calculateAirUsage(now);
        lastAirTotal += airUsage;
        Point point = Point
                .measurement(influxdbConfig.getMeasurement())
                .addTag(TAG, TAGNAME)
                .addField(FIELD_VALUE, lastAirTotal)
                .time(Instant.now(), WritePrecision.S);
        repository.writePoint(point);
        log.info("写入压缩空气表数据: {}", lastAirTotal);
    }
    private double calculateAirUsage(LocalDateTime time) {
        int hour = time.getHour();
        boolean isWeekend = time.getDayOfWeek().getValue() > 5;
        // åŸºç¡€ç”¨æ°”量
        double baseUsage = 0.1;
        // å·¥ä½œæ—¶é—´(8-20点)用气量增加
        if (hour >= 8 && hour < 20) {
            baseUsage += 0.3;
            // å·¥ä½œæ—¥ç”¨æ°”量更大
            if (!isWeekend) {
                baseUsage += 0.2;
            }
        }
        // æ·»åŠ éšæœºæ³¢åŠ¨
        baseUsage += random.nextDouble() * 0.8;
        return baseUsage;
    }
}
src/main/java/com/zhitan/service/impl/DataServiceImpl.java
@@ -129,6 +129,35 @@
    @Override
    public void writeTimeSeriesData(@NotNull PowerEntity powerEntity) {
        List<IndexTemplate> templates = getIndexTemplate();
        // åˆ¤æ–­æ€»æœ‰åŠŸæ˜¯å¦ä¸ºç©ºï¼Œå¦‚æžœä¸ºç©ºåˆ¤æ–­æ­£å‘æœ‰åŠŸå’Œåå‘æœ‰åŠŸæ˜¯å¦ä¸ºç©ºï¼Œå¦‚æžœåŽä¸¤ä¸ªä»»æ„ä¸€ä¸ªä¸ä¸ºç©ºï¼Œåˆ™ä»Žæ—¶åºæ•°æ®åº“ä¸­èŽ·å–ä¸ºç©ºçš„é‚£ä¸€ä¸ªï¼Œç„¶åŽå°†æ€»æœ‰åŠŸèƒ½ç”µèƒ½èµ‹å€¼ä¸ºæ­£å‘æœ‰åŠŸèƒ½ç”µèƒ½å‡åŽ»åå‘æœ‰åŠŸèƒ½ç”µèƒ½
        if (powerEntity.getEps() == null) {
            if (powerEntity.getEpsp() != null && powerEntity.getEpsn() != null) {
                powerEntity.setEps(powerEntity.getEpsp() - powerEntity.getEpsn());
            } else if (powerEntity.getEpsp() != null) {
                double lastValue = repository.getLastPoint(influxdbConfig.getMeasurement(),
                        TAG, powerEntity.getSn() + "_" + "Exp");
                powerEntity.setEps(powerEntity.getEpsp() - lastValue);
            } else if (powerEntity.getEpsn() != null) {
                double lastValue = repository.getLastPoint(influxdbConfig.getMeasurement(),
                        TAG, powerEntity.getSn() + "_" + "ActiveZT");
                powerEntity.setEps(lastValue - powerEntity.getEpsn());
            }
        }
        // åˆ¤æ–­æ€»æ— åŠŸæ˜¯å¦ä¸ºç©ºï¼Œå¦‚æžœä¸ºç©ºåˆ¤æ–­æ­£å‘æ— åŠŸå’Œåå‘æ— åŠŸæ˜¯å¦ä¸ºç©ºï¼Œå¦‚æžœåŽä¸¤ä¸ªä»»æ„ä¸€ä¸ªä¸ä¸ºç©ºï¼Œåˆ™ä»Žæ—¶åºæ•°æ®åº“ä¸­èŽ·å–ä¸ºç©ºçš„é‚£ä¸€ä¸ªï¼Œç„¶åŽå°†æ€»æ— åŠŸç”µèƒ½èµ‹å€¼ä¸ºæ­£å‘æ— åŠŸç”µèƒ½å’Œåå‘æ— åŠŸç”µèƒ½çš„ç»å¯¹å€¼ä¹‹å’Œ
        if (powerEntity.getEqs() == null) {
            if (powerEntity.getEqsp() != null && powerEntity.getEqsn() != null) {
                powerEntity.setEqs(Math.abs(powerEntity.getEqsp()) + Math.abs(powerEntity.getEqsn()));
            } else if (powerEntity.getEqsp() != null) {
                double lastValue = repository.getLastPoint(influxdbConfig.getMeasurement(),
                        TAG, powerEntity.getSn() + "_" + "ExpZN");
                powerEntity.setEqs(Math.abs(lastValue) + Math.abs(powerEntity.getEqsp()));
            } else if (powerEntity.getEqsn() != null) {
                double lastValue = repository.getLastPoint(influxdbConfig.getMeasurement(),
                        TAG, powerEntity.getSn() + "_" + "ActiveZN");
                powerEntity.setEqs(Math.abs(lastValue) + Math.abs(powerEntity.getEqsn()));
            }
        }
        // èŽ·å–ç±»ä¸­æ‰€æœ‰å£°æ˜Žçš„å­—æ®µ
        Field[] fields = powerEntity.getClass().getDeclaredFields();
        List<Point> points = new ArrayList<>();
src/main/java/com/zhitan/service/impl/OpcServiceImpl.java
@@ -366,12 +366,29 @@
            // 1. ç›´æŽ¥é€šè¿‡InfluxDB存储库写入
            for (OpcData data : dataList) {
                if (data.getValue() != null) {
                    // å¦‚果是电压,四路共用,需要处理 1-1#yijidiankonggui_1_VoltageA
                    if (data.getName().contains("_Voltage")) {
                        String prefix = data.getName().split("_")[0];
                        String suffix = data.getName().split("_")[2];
                        // å¾ªçŽ¯å››æ¬¡
                        for (int i = 1; i <= 4; i++) {
                            String name = prefix + "_" + i + "_" + suffix;
                            Point point = Point
                                    .measurement(influxdbConfig.getMeasurement())
                                    .addTag(TAG, name)
                                    .addField(FIELD_VALUE, data.getValue())
                                    .time(data.getTimestamp(), WritePrecision.NS);
                            points.add(point);
                        }
                    } else {
                    Point point = Point
                            .measurement(influxdbConfig.getMeasurement())
                            .addTag(TAG, data.getName())
                            .addField(FIELD_VALUE, data.getValue())
                            .time(data.getTimestamp(), WritePrecision.NS);
                    points.add(point);
                    }
                    log.debug("采集OPC UA数据: {} = {}", data.getName(), data.getValue());
                } else if (data.getErrorMessage() != null) {
                    log.warn("采集OPC UA数据失败: {} - {}", data.getName(), data.getErrorMessage());
src/main/java/com/zhitan/service/impl/WaterMeterSimulator.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,83 @@
package com.zhitan.service.impl;
import com.influxdb.client.domain.WritePrecision;
import com.influxdb.client.write.Point;
import com.zhitan.config.influxdb.InfluxdbConfig;
import com.zhitan.influxdb.InfluxdbRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Random;
@Slf4j
@Service
public class WaterMeterSimulator {
    private final String TAG = "tag";
    private final String FIELD_VALUE = "value";
    private final String TAGNAME = "shuibiao01_StTotal";
    private final InfluxdbRepository repository;
    private final InfluxdbConfig influxdbConfig;
    private double lastWaterTotal = 0;
    private final Random random = new Random();
    @Autowired
    public WaterMeterSimulator(InfluxdbRepository repository, InfluxdbConfig influxdbConfig) {
        this.repository = repository;
        this.influxdbConfig = influxdbConfig;
        // åˆå§‹åŒ–时从时序数据库加载上次的数据
        loadLastWaterData();
    }
    private void loadLastWaterData() {
        // è¿™é‡Œåº”该实现从InfluxDB查询最后一次记录的逻辑
        double lastValue = repository.getLastPoint(influxdbConfig.getMeasurement(),TAG, TAGNAME);
        if (lastValue>0) {
            log.info("查询出最后一次写入influxdb的数据:{}", lastValue);
            lastWaterTotal = lastValue;
        }
    }
    @Scheduled(fixedRate = 60000) // æ¯åˆ†é’Ÿæ‰§è¡Œä¸€æ¬¡
    public void simulateWaterUsage() {
        LocalDateTime now = LocalDateTime.now();
        double waterUsage = calculateWaterUsage(now);
        lastWaterTotal += waterUsage;
        Point point = Point
                .measurement(influxdbConfig.getMeasurement())
                .addTag(TAG, TAGNAME)
                .addField(FIELD_VALUE, lastWaterTotal)
                .time(Instant.now(), WritePrecision.S);
        repository.writePoint(point);
        log.info("写入水表数据: {}", lastWaterTotal);
    }
    private double calculateWaterUsage(LocalDateTime time) {
        int hour = time.getHour();
        boolean isWeekend = time.getDayOfWeek().getValue() > 5;
        // åŸºç¡€ç”¨æ°´é‡
        double baseUsage = 0.05;
        // å·¥ä½œæ—¶é—´(8-20点)用水量增加
        if (hour >= 8 && hour < 20) {
            baseUsage += 0.15;
            // å·¥ä½œæ—¥ç”¨æ°´é‡æ›´å¤§
            if (!isWeekend) {
                baseUsage += 0.1;
            }
        }
        // æ·»åŠ éšæœºæ³¢åŠ¨
        baseUsage += random.nextDouble() * 0.5;
        return baseUsage;
    }
}
src/main/resources/application-prod.yml
@@ -106,9 +106,7 @@
    - "1-1#yijidiankonggui_1_Exp=ns=2;s=modbus.1-1#yijidiankonggui.tag15"
    - "1-1#yijidiankonggui_1_ExpZN=ns=2;s=modbus.1-1#yijidiankonggui.tag17"
    # å°ç½é—´ CanSeamerRoom
    - "1-1#yijidiankonggui_2_VoltageA=ns=2;s=modbus.1-1#yijidiankonggui.tag1"
    - "1-1#yijidiankonggui_2_VoltageB=ns=2;s=modbus.1-1#yijidiankonggui.tag2"
    - "1-1#yijidiankonggui_2_VoltageC=ns=2;s=modbus.1-1#yijidiankonggui.tag3"
    - "1-1#yijidiankonggui_2_CurrentA=ns=2;s=modbus.1-1#yijidiankonggui.tag21"
    - "1-1#yijidiankonggui_2_CurrentB=ns=2;s=modbus.1-1#yijidiankonggui.tag22"
    - "1-1#yijidiankonggui_2_CurrentC=ns=2;s=modbus.1-1#yijidiankonggui.tag23"
@@ -119,9 +117,7 @@
    - "1-1#yijidiankonggui_2_Exp=ns=2;s=modbus.1-1#yijidiankonggui.tag29"
    - "1-1#yijidiankonggui_2_ExpZN=ns=2;s=modbus.1-1#yijidiankonggui.tag31"
    # æˆå“åº“ FinishedStore
    - "1-1#yijidiankonggui_3_VoltageA=ns=2;s=modbus.1-1#yijidiankonggui.tag1"
    - "1-1#yijidiankonggui_3_VoltageB=ns=2;s=modbus.1-1#yijidiankonggui.tag2"
    - "1-1#yijidiankonggui_3_VoltageC=ns=2;s=modbus.1-1#yijidiankonggui.tag3"
    - "1-1#yijidiankonggui_3_CurrentA=ns=2;s=modbus.1-1#yijidiankonggui.tag35"
    - "1-1#yijidiankonggui_3_CurrentB=ns=2;s=modbus.1-1#yijidiankonggui.tag36"
    - "1-1#yijidiankonggui_3_CurrentC=ns=2;s=modbus.1-1#yijidiankonggui.tag37"
@@ -132,9 +128,7 @@
    - "1-1#yijidiankonggui_3_Exp=ns=2;s=modbus.1-1#yijidiankonggui.tag43"
    - "1-1#yijidiankonggui_3_ExpZN=ns=2;s=modbus.1-1#yijidiankonggui.tag45"
    # æ¸…æ´—é—´ RightWorkshop
    - "1-1#yijidiankonggui_4_VoltageA=ns=2;s=modbus.1-1#yijidiankonggui.tag1"
    - "1-1#yijidiankonggui_4_VoltageB=ns=2;s=modbus.1-1#yijidiankonggui.tag2"
    - "1-1#yijidiankonggui_4_VoltageC=ns=2;s=modbus.1-1#yijidiankonggui.tag3"
    - "1-1#yijidiankonggui_4_CurrentA=ns=2;s=modbus.1-1#yijidiankonggui.tag49"
    - "1-1#yijidiankonggui_4_CurrentB=ns=2;s=modbus.1-1#yijidiankonggui.tag50"
    - "1-1#yijidiankonggui_4_CurrentC=ns=2;s=modbus.1-1#yijidiankonggui.tag51"
@@ -158,9 +152,7 @@
    - "1-2#yijidiankonggui_1_Exp=ns=2;s=modbus.1-2#yijidiankonggui.tag15"
    - "1-2#yijidiankonggui_1_ExpZN=ns=2;s=modbus.1-2#yijidiankonggui.tag17"
    # åŽŸææ–™ä»“åº“ RawMaterialWarehouse
    - "1-2#yijidiankonggui_2_VoltageA=ns=2;s=modbus.1-2#yijidiankonggui.tag1"
    - "1-2#yijidiankonggui_2_VoltageB=ns=2;s=modbus.1-2#yijidiankonggui.tag2"
    - "1-2#yijidiankonggui_2_VoltageC=ns=2;s=modbus.1-2#yijidiankonggui.tag3"
    - "1-2#yijidiankonggui_2_CurrentA=ns=2;s=modbus.1-2#yijidiankonggui.tag21"
    - "1-2#yijidiankonggui_2_CurrentB=ns=2;s=modbus.1-2#yijidiankonggui.tag22"
    - "1-2#yijidiankonggui_2_CurrentC=ns=2;s=modbus.1-2#yijidiankonggui.tag23"
@@ -171,9 +163,7 @@
    - "1-2#yijidiankonggui_2_Exp=ns=2;s=modbus.1-2#yijidiankonggui.tag29"
    - "1-2#yijidiankonggui_2_ExpZN=ns=2;s=modbus.1-2#yijidiankonggui.tag31"
    # æ’温室 ThermostaticChamber
    - "1-2#yijidiankonggui_3_VoltageA=ns=2;s=modbus.1-2#yijidiankonggui.tag1"
    - "1-2#yijidiankonggui_3_VoltageB=ns=2;s=modbus.1-2#yijidiankonggui.tag2"
    - "1-2#yijidiankonggui_3_VoltageC=ns=2;s=modbus.1-2#yijidiankonggui.tag3"
    - "1-2#yijidiankonggui_3_CurrentA=ns=2;s=modbus.1-2#yijidiankonggui.tag35"
    - "1-2#yijidiankonggui_3_CurrentB=ns=2;s=modbus.1-2#yijidiankonggui.tag36"
    - "1-2#yijidiankonggui_3_CurrentC=ns=2;s=modbus.1-2#yijidiankonggui.tag37"
@@ -184,9 +174,7 @@
    - "1-2#yijidiankonggui_3_Exp=ns=2;s=modbus.1-2#yijidiankonggui.tag43"
    - "1-2#yijidiankonggui_3_ExpZN=ns=2;s=modbus.1-2#yijidiankonggui.tag45"
    # åŒ…胶间 PackGlueRoom
    - "1-2#yijidiankonggui_4_VoltageA=ns=2;s=modbus.1-2#yijidiankonggui.tag1"
    - "1-2#yijidiankonggui_4_VoltageB=ns=2;s=modbus.1-2#yijidiankonggui.tag2"
    - "1-2#yijidiankonggui_4_VoltageC=ns=2;s=modbus.1-2#yijidiankonggui.tag3"
    - "1-2#yijidiankonggui_4_CurrentA=ns=2;s=modbus.1-2#yijidiankonggui.tag49"
    - "1-2#yijidiankonggui_4_CurrentB=ns=2;s=modbus.1-2#yijidiankonggui.tag50"
    - "1-2#yijidiankonggui_4_CurrentC=ns=2;s=modbus.1-2#yijidiankonggui.tag51"
@@ -210,9 +198,7 @@
    - "2-1#yijidiankonggui_2_Exp=ns=2;s=modbus.2-1#yijidiankonggui.tag29"
    - "2-1#yijidiankonggui_2_ExpZN=ns=2;s=modbus.2-1#yijidiankonggui.tag31"
    # è½¦é—´åŠžå…¬å®¤ WorkshopOffice
    - "2-1#yijidiankonggui_3_VoltageA=ns=2;s=modbus.2-1#yijidiankonggui.tag1"
    - "2-1#yijidiankonggui_3_VoltageB=ns=2;s=modbus.2-1#yijidiankonggui.tag2"
    - "2-1#yijidiankonggui_3_VoltageC=ns=2;s=modbus.2-1#yijidiankonggui.tag3"
    - "2-1#yijidiankonggui_3_CurrentA=ns=2;s=modbus.2-1#yijidiankonggui.tag35"
    - "2-1#yijidiankonggui_3_CurrentB=ns=2;s=modbus.2-1#yijidiankonggui.tag36"
    - "2-1#yijidiankonggui_3_CurrentC=ns=2;s=modbus.2-1#yijidiankonggui.tag37"
@@ -223,9 +209,7 @@
    - "2-1#yijidiankonggui_3_Exp=ns=2;s=modbus.2-1#yijidiankonggui.tag43"
    - "2-1#yijidiankonggui_3_ExpZN=ns=2;s=modbus.2-1#yijidiankonggui.tag45"
    # 1、2楼东办公室 EastOffice
    - "2-1#yijidiankonggui_4_VoltageA=ns=2;s=modbus.2-1#yijidiankonggui.tag1"
    - "2-1#yijidiankonggui_4_VoltageB=ns=2;s=modbus.2-1#yijidiankonggui.tag2"
    - "2-1#yijidiankonggui_4_VoltageC=ns=2;s=modbus.2-1#yijidiankonggui.tag3"
    - "2-1#yijidiankonggui_4_CurrentA=ns=2;s=modbus.2-1#yijidiankonggui.tag49"
    - "2-1#yijidiankonggui_4_CurrentB=ns=2;s=modbus.2-1#yijidiankonggui.tag50"
    - "2-1#yijidiankonggui_4_CurrentC=ns=2;s=modbus.2-1#yijidiankonggui.tag51"
@@ -249,9 +233,7 @@
    - "3-1#yijidiankonggui_1_Exp=ns=2;s=modbus.3-1#yijidiankonggui.tag15"
    - "3-1#yijidiankonggui_1_ExpZN=ns=2;s=modbus.3-1#yijidiankonggui.tag17"
    # è½¦é—´2楼 SecondFloorWorkshop
    - "3-1#yijidiankonggui_2_VoltageA=ns=2;s=modbus.3-1#yijidiankonggui.tag1"
    - "3-1#yijidiankonggui_2_VoltageB=ns=2;s=modbus.3-1#yijidiankonggui.tag2"
    - "3-1#yijidiankonggui_2_VoltageC=ns=2;s=modbus.3-1#yijidiankonggui.tag3"
    - "3-1#yijidiankonggui_2_CurrentA=ns=2;s=modbus.3-1#yijidiankonggui.tag21"
    - "3-1#yijidiankonggui_2_CurrentB=ns=2;s=modbus.3-1#yijidiankonggui.tag22"
    - "3-1#yijidiankonggui_2_CurrentC=ns=2;s=modbus.3-1#yijidiankonggui.tag23"
@@ -262,9 +244,7 @@
    - "3-1#yijidiankonggui_2_Exp=ns=2;s=modbus.3-1#yijidiankonggui.tag29"
    - "3-1#yijidiankonggui_2_ExpZN=ns=2;s=modbus.3-1#yijidiankonggui.tag31"
    # ç”Ÿäº§åŠžå…¬å®¤ ProductionOffice
    - "3-1#yijidiankonggui_3_VoltageA=ns=2;s=modbus.3-1#yijidiankonggui.tag1"
    - "3-1#yijidiankonggui_3_VoltageB=ns=2;s=modbus.3-1#yijidiankonggui.tag2"
    - "3-1#yijidiankonggui_3_VoltageC=ns=2;s=modbus.3-1#yijidiankonggui.tag3"
    - "3-1#yijidiankonggui_3_CurrentA=ns=2;s=modbus.3-1#yijidiankonggui.tag35"
    - "3-1#yijidiankonggui_3_CurrentB=ns=2;s=modbus.3-1#yijidiankonggui.tag36"
    - "3-1#yijidiankonggui_3_CurrentC=ns=2;s=modbus.3-1#yijidiankonggui.tag37"
@@ -275,9 +255,7 @@
    - "3-1#yijidiankonggui_3_Exp=ns=2;s=modbus.3-1#yijidiankonggui.tag43"
    - "3-1#yijidiankonggui_3_ExpZN=ns=2;s=modbus.3-1#yijidiankonggui.tag45"
    # é«˜ä½Žæ¸©è¯•验区 HLTempTest
    - "3-1#yijidiankonggui_4_VoltageA=ns=2;s=modbus.3-1#yijidiankonggui.tag1"
    - "3-1#yijidiankonggui_4_VoltageB=ns=2;s=modbus.3-1#yijidiankonggui.tag2"
    - "3-1#yijidiankonggui_4_VoltageC=ns=2;s=modbus.3-1#yijidiankonggui.tag3"
    - "3-1#yijidiankonggui_4_CurrentA=ns=2;s=modbus.3-1#yijidiankonggui.tag49"
    - "3-1#yijidiankonggui_4_CurrentB=ns=2;s=modbus.3-1#yijidiankonggui.tag50"
    - "3-1#yijidiankonggui_4_CurrentC=ns=2;s=modbus.3-1#yijidiankonggui.tag51"