From 013fa08f64639a4a722dbb709a746a4561a02964 Mon Sep 17 00:00:00 2001 From: baoshiwei <baoshiwei@shlanbao.cn> Date: 星期日, 08 六月 2025 14:45:33 +0800 Subject: [PATCH] feat(service): 添加压缩空气和水表数据模拟器 --- src/main/java/com/zhitan/service/impl/WaterMeterSimulator.java | 83 ++++++++++++++++ src/main/java/com/zhitan/service/impl/CompressedAirSimulator.java | 81 ++++++++++++++++ src/main/java/com/zhitan/service/impl/OpcServiceImpl.java | 29 ++++- src/main/resources/application-prod.yml | 44 ++------ src/main/java/com/zhitan/service/impl/DataServiceImpl.java | 29 +++++ 5 files changed, 227 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/zhitan/service/impl/CompressedAirSimulator.java b/src/main/java/com/zhitan/service/impl/CompressedAirSimulator.java new file mode 100644 index 0000000..2c150b5 --- /dev/null +++ b/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("鏌ヨ鍑烘渶鍚庝竴娆″啓鍏nfluxdb鐨勫帇缂╃┖姘旀暟鎹�:{}", 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; + } +} \ No newline at end of file diff --git a/src/main/java/com/zhitan/service/impl/DataServiceImpl.java b/src/main/java/com/zhitan/service/impl/DataServiceImpl.java index 18d8376..e977412 100644 --- a/src/main/java/com/zhitan/service/impl/DataServiceImpl.java +++ b/src/main/java/com/zhitan/service/impl/DataServiceImpl.java @@ -129,6 +129,35 @@ @Override public void writeTimeSeriesData(@NotNull PowerEntity powerEntity) { List<IndexTemplate> templates = getIndexTemplate(); + // 鍒ゆ柇鎬绘湁鍔熸槸鍚︿负绌猴紝濡傛灉涓虹┖鍒ゆ柇姝e悜鏈夊姛鍜屽弽鍚戞湁鍔熸槸鍚︿负绌猴紝濡傛灉鍚庝袱涓换鎰忎竴涓笉涓虹┖锛屽垯浠庢椂搴忔暟鎹簱涓幏鍙栦负绌虹殑閭d竴涓紝鐒跺悗灏嗘�绘湁鍔熻兘鐢佃兘璧嬪�间负姝e悜鏈夊姛鑳界數鑳藉噺鍘诲弽鍚戞湁鍔熻兘鐢佃兘 + 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()); + } + } + // 鍒ゆ柇鎬绘棤鍔熸槸鍚︿负绌猴紝濡傛灉涓虹┖鍒ゆ柇姝e悜鏃犲姛鍜屽弽鍚戞棤鍔熸槸鍚︿负绌猴紝濡傛灉鍚庝袱涓换鎰忎竴涓笉涓虹┖锛屽垯浠庢椂搴忔暟鎹簱涓幏鍙栦负绌虹殑閭d竴涓紝鐒跺悗灏嗘�绘棤鍔熺數鑳借祴鍊间负姝e悜鏃犲姛鐢佃兘鍜屽弽鍚戞棤鍔熺數鑳界殑缁濆鍊间箣鍜� + 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())); + } + } // 鑾峰彇绫讳腑鎵�鏈夊0鏄庣殑瀛楁 Field[] fields = powerEntity.getClass().getDeclaredFields(); List<Point> points = new ArrayList<>(); diff --git a/src/main/java/com/zhitan/service/impl/OpcServiceImpl.java b/src/main/java/com/zhitan/service/impl/OpcServiceImpl.java index b456832..e75289f 100644 --- a/src/main/java/com/zhitan/service/impl/OpcServiceImpl.java +++ b/src/main/java/com/zhitan/service/impl/OpcServiceImpl.java @@ -366,12 +366,29 @@ // 1. 鐩存帴閫氳繃InfluxDB瀛樺偍搴撳啓鍏� for (OpcData data : dataList) { if (data.getValue() != null) { - Point point = Point - .measurement(influxdbConfig.getMeasurement()) - .addTag(TAG, data.getName()) - .addField(FIELD_VALUE, data.getValue()) - .time(data.getTimestamp(), WritePrecision.NS); - points.add(point); + // 濡傛灉鏄數鍘嬶紝鍥涜矾鍏辩敤锛岄渶瑕佸鐞� 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()); diff --git a/src/main/java/com/zhitan/service/impl/WaterMeterSimulator.java b/src/main/java/com/zhitan/service/impl/WaterMeterSimulator.java new file mode 100644 index 0000000..a795d59 --- /dev/null +++ b/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() { + // 杩欓噷搴旇瀹炵幇浠嶪nfluxDB鏌ヨ鏈�鍚庝竴娆¤褰曠殑閫昏緫 + double lastValue = repository.getLastPoint(influxdbConfig.getMeasurement(),TAG, TAGNAME); + if (lastValue>0) { + log.info("鏌ヨ鍑烘渶鍚庝竴娆″啓鍏nfluxdb鐨勬暟鎹�:{}", 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; + } +} \ No newline at end of file diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 69a92ef..6137809 100644 --- a/src/main/resources/application-prod.yml +++ b/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" -- Gitblit v1.9.3