package com.iailab.module.data.channel.opcda.collector; import com.iailab.module.data.channel.opcda.entity.ChannelOPCDADeviceEntity; import com.iailab.module.data.channel.opcda.service.ChannelOPCDADeviceService; import com.iailab.module.data.common.enums.CommonConstant; import com.iailab.module.data.common.enums.DataSourceType; import com.iailab.module.data.common.utils.TagUtils; import lombok.extern.slf4j.Slf4j; import org.jinterop.dcom.common.JIException; import org.jinterop.dcom.core.JIVariant; import org.openscada.opc.lib.da.Group; import org.openscada.opc.lib.da.Item; import org.openscada.opc.lib.da.ItemState; import org.openscada.opc.lib.da.Server; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @Slf4j @Component public class OpcDACollector { @Autowired private OpcDAUtils opcDAUtils; @Autowired private ChannelOPCDADeviceService channelOPCDADeviceService; private Map<String, Server> serverMap = new ConcurrentHashMap<>(); private Map<String, Group> groupMap = new ConcurrentHashMap<>(); private Map<String, ChannelOPCDADeviceEntity> deviceMap = new HashMap<>(); private Server getServer(String sourceId) throws Exception { try { if (!serverMap.containsKey(sourceId)) { log.info("æ ¹æ®æ•°æ®æºèŽ·å–opcDAServer,sourceId=" + sourceId); ChannelOPCDADeviceEntity OPCDADevice = channelOPCDADeviceService.info(sourceId); deviceMap.put(sourceId, OPCDADevice); Server server = opcDAUtils.createServer(OPCDADevice); if (server != null) { serverMap.put(sourceId, server); } } } catch (Exception ex) { log.info("=========getOPCDAServer Exception============"); log.info("ex.message+" + ex.getMessage()); ex.printStackTrace(); throw new Exception(ex.getMessage()); } return serverMap.get(sourceId); } public Map<String, Object> getTagValues(List<String[]> tags) { if (CollectionUtils.isEmpty(tags)) { return new HashMap<>(); } Map<String, Object> result = new HashMap<>(tags.size()); // 按照sourceId分组 Map<String, List<String[]>> sourceIdTagMap = tags.stream().collect(Collectors.groupingBy(t -> t[0])); for (Map.Entry<String, List<String[]>> entry : sourceIdTagMap.entrySet()) { try { Server server = this.getServer(entry.getKey()); Group group = this.getGroup(server, entry.getKey()); Map<Item, ItemState> read = OpcDAUtils.readA(group, entry.getValue()); for (Map.Entry<Item, ItemState> itemStateEntry : read.entrySet()) { try { result.put(TagUtils.genTagId(DataSourceType.OPCDA.getCode(), deviceMap.get(entry.getKey()).getServerName(), itemStateEntry.getKey().getId()), OpcDAUtils.getObjectValue(itemStateEntry.getValue())); } catch (JIException e) { result.put(TagUtils.genTagId(DataSourceType.OPCDA.getCode(), deviceMap.get(entry.getKey()).getServerName(), itemStateEntry.getKey().getId()), CommonConstant.BAD_VALUE); } } } catch (Exception ex) { ex.printStackTrace(); for (String[] tag : entry.getValue()) { result.put(TagUtils.genTagId(DataSourceType.OPCDA.getCode(), deviceMap.get(entry.getKey()).getServerName(), tag[1]), CommonConstant.BAD_VALUE); } } } return result; } private Group getGroup(Server server, String sourceId) throws Exception { try { if (!groupMap.containsKey(sourceId)) { log.info("æ ¹æ®æ•°æ®æºèŽ·å–opcDAGroup,sourceId=" + sourceId); Group group = server.addGroup(sourceId); if (group != null) { groupMap.put(sourceId, group); } } } catch (Exception ex) { log.info("=========getOPCDAGroup Exception============"); log.info("ex.message+" + ex.getMessage()); ex.printStackTrace(); throw new Exception(ex.getMessage()); } return groupMap.get(sourceId); } public void write(String serverId) throws Exception { Server server = this.getServer(serverId); Group group = server.addGroup(); Item item = group.addItem("é€šé“ 1.设备 1.item001"); OpcDAUtils.write(item, new JIVariant("999")); } }