diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/driver/AbstractOpcDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/driver/AbstractOpcDeviceDriver.java index 5679c931..626dba50 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/driver/AbstractOpcDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/driver/AbstractOpcDeviceDriver.java @@ -58,28 +58,60 @@ public class AbstractOpcDeviceDriver extends AbstractDeviceDriver implements Opc int i = 0; while(true) { //下发信号 - control( itemValues); - Map read = new HashMap(); - Map itemStatus = group.read(true, (Item[])readitems.values().toArray(new Item[0])); - Set items = itemStatus.keySet(); - Iterator var15 = items.iterator(); - - while(var15.hasNext()) { - Item item = (Item)var15.next(); - ItemState itemState = (ItemState)itemStatus.get(item); - Object value = OpcUtl.getValue(item, itemState); - read.put(item.getId(), value); - } - - boolean check = true; - Iterator var24 = itemsString.iterator(); - - while(var24.hasNext()) { - String itemString = (String)var24.next(); - if (!ObjectUtl.isEquals(itemValues.get(itemString), JsonUtl.parse(read.get(itemString)))) { - check = false; + try{ + if(i == 0){ + control( itemValues); + } else { + controlByNewConn( itemValues); } + + } catch (Exception e){ + e.printStackTrace(); } + Map read = new HashMap(); + Map itemStatus = null; + boolean check = true; + try{ + if(i>0){ + group = opcServerService.getServer(this.getOpcServer()); + itemsString = new ArrayList<> (itemValues.keySet()); + Iterator nis = itemsString.iterator(); + + while (nis.hasNext()) { + String string = (String) nis.next(); + try { + readitems.put(string, group.addItem(string)); + } catch (Exception e) { + e.printStackTrace(); + } + } + itemStatus = group.read(true, (Item[])readitems.values().toArray(new Item[0])); + + } else { + itemStatus = group.read(true, (Item[])readitems.values().toArray(new Item[0])); + } + Set items = itemStatus.keySet(); + Iterator var15 = items.iterator(); + while(var15.hasNext()) { + Item item = (Item)var15.next(); + ItemState itemState = (ItemState)itemStatus.get(item); + Object value = OpcUtl.getValue(item, itemState); + read.put(item.getId(), value); + } + + Iterator var24 = itemsString.iterator(); + + while(var24.hasNext()) { + String itemString = (String)var24.next(); + if (!ObjectUtl.isEquals(itemValues.get(itemString), JsonUtl.parse(read.get(itemString)))) { + check = false; + } + } + } catch (Exception e){ + e.printStackTrace(); + check = false; + } + if (check) { return; } @@ -95,6 +127,85 @@ public class AbstractOpcDeviceDriver extends AbstractDeviceDriver implements Opc } } + public boolean controlByNewConn(Map itemValues) { + + Iterator> it = itemValues.entrySet().iterator(); + + ItemValue p2[]; + p2 = new ItemValue[itemValues.size()]; + int i=0; + while (it.hasNext()) { + Map.Entry entry = it.next(); + System.out.println("即将写入值:"+entry.getKey() + ":" + entry.getValue()); + p2[i] = new ItemValue(); + p2[i].setItem_code(entry.getKey()); + p2[i].setItem_value(entry.getValue()); + i++; + } + + return this.controlByNewConn(p2); + } + + public boolean controlByNewConn(ItemValue[] itemValues) { + if (itemValues != null && itemValues.length != 0) { + String this_items = JsonUtl.parseWithoutException(itemValues); + boolean need_write = false; + StringBuilder sb = new StringBuilder(); + ItemValue[] var5 = itemValues; + int var6 = itemValues.length; + +// for (int var7 = 0; var7 < var6; ++var7) { +// ItemValue itemValue = var5[var7]; +// String code = itemValue.getItem_code(); +// Object udw_value = this.getUdwValue(code); +// Object write_value = itemValue.getItem_value(); +// sb.append(code); +// sb.append(":"); +// sb.append(JsonUtl.parseWithoutException(udw_value)); +// sb.append(";"); +// if (!need_write && !UnifiedDataAppService.isEquals(udw_value, write_value)) { +// need_write = true; +// } else { +// log.warn("下发信号点位{} 当前写入值:{} 与系统内存值:{} 相同,不再写入 ", code, write_value, udw_value ); +// } +// } + need_write = true; + if (need_write) { + Date date = new Date(); + /*if (StringUtl.isEqual(this_items, this.last_items) && date.getTime() - this.sendTime.getTime() < (long) WcsConfig.opc_write_repeat_check) { + log.trace("发送时间因为小于{}毫秒,而被无视", WcsConfig.opc_write_repeat_check); + return false; + }*/ + + this.last_items = this_items; + this.sendTime = date; + /* this.execute_log.setResource(this.getDevice().getCode(), this.getDevice().getName()); + this.execute_log.log("原始记录{}->变更为{}", new Object[]{sb, this_items}); + OpcServerService opcServerService = OpcServerFactory.getOpcServerService();*/ + + OpcServerService opcServerService = SpringContextHolder.getBean(OpcServerServiceImpl.class); + + opcServerService.writeIntegerByNewConn(this.getOpcServer(), itemValues); + + + UnifiedDataAccessor opcValueAccessor = this.getOpcValueAccessor(); + ItemValue[] var17 = itemValues; + int var18 = itemValues.length; + + for (int var19 = 0; var19 < var18; ++var19) { + ItemValue itemValue = var17[var19]; + String code = itemValue.getItem_code(); + Object value = itemValue.getItem_value(); + opcValueAccessor.setValue(code, value); + } + } + + return true; + } else { + throw new WDKException("下发 无内容"); + } + } + public boolean control(Map itemValues) { Iterator> it = itemValues.entrySet().iterator(); diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/opc/OpcServerService.java b/wcs/nladmin-system/src/main/java/org/nl/acs/opc/OpcServerService.java index 3e1f7a30..fed5dab8 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/opc/OpcServerService.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/opc/OpcServerService.java @@ -15,7 +15,13 @@ public interface OpcServerService { Group getServer(String var1); + Group getServerByNewConn(String var1); + void writeInteger(String var1, ItemValue... var2); + void writeIntegerByNewConn(String var1, ItemValue... var2); + void clearServer(String var1); + + } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/opc/OpcServerServiceImpl.java b/wcs/nladmin-system/src/main/java/org/nl/acs/opc/OpcServerServiceImpl.java index 47cd77a0..f82dcfef 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/opc/OpcServerServiceImpl.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/opc/OpcServerServiceImpl.java @@ -1,8 +1,10 @@ package org.nl.acs.opc; +import cn.hutool.core.util.StrUtil; import org.jinterop.dcom.common.JIException; import org.nl.acs.auto.initial.ApplicationAutoInitial; import org.nl.acs.device_driver.driver.ItemValue; +import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.exception.WDKException; import org.openscada.opc.lib.common.NotConnectedException; import org.openscada.opc.lib.da.Group; @@ -40,22 +42,22 @@ public class OpcServerServiceImpl implements OpcServerService, ApplicationAutoIn this.reload(); if (OpcConfig.auto_start_opc) { Thread t = - new Thread() { - public void run() { - Iterator var1 = OpcServerServiceImpl.this.opcServerManageDtos.values().iterator(); + new Thread() { + public void run() { + Iterator var1 = OpcServerServiceImpl.this.opcServerManageDtos.values().iterator(); - while (var1.hasNext()) { - OpcServerManageDto dto = (OpcServerManageDto) var1.next(); + while (var1.hasNext()) { + OpcServerManageDto dto = (OpcServerManageDto) var1.next(); - try { - OpcServerServiceImpl.this.getServer(dto.getOpc_code()); - //OpcServerServiceImpl.log.info("加载opc server {}", dto.getOpc_code()); - } catch (Exception var4) { - //OpcServerServiceImpl.log.warn("启动无法载入servers", var4); + try { + OpcServerServiceImpl.this.getServer(dto.getOpc_code()); + OpcServerServiceImpl.log.info("加载opc server {}", dto.getOpc_code()); + } catch (Exception var4) { + OpcServerServiceImpl.log.warn("启动无法载入servers", var4); + } + } } - } - } - }; + }; t.start(); } } @@ -65,79 +67,128 @@ public class OpcServerServiceImpl implements OpcServerService, ApplicationAutoIn this.opcServerManageDtos = Collections.synchronizedMap(this.opcServerManageDtos); } - public synchronized Group getServer(String code) { - Group group = null; - group = (Group) this.groups.get(code); - if (group != null) { - try { - if (group.isActive()) { - return group; + public Group getServer(String code) { + synchronized(this.buildLock(code)) { + Group group = null; + group = (Group)this.groups.get(code); + if (group != null) { + label68: { + Group var10000; + try { + if (!group.isActive()) { + break label68; + } + + var10000 = group; + } catch (JIException var14) { + log.error(code, var14); + break label68; + } + + return var10000; } - } catch (JIException var9) { - var9.printStackTrace(); } - } - Server server = (Server) this.servers.get(code); - boolean needcreate = false; - if (server == null) { - needcreate = true; - } else { - try { - group = server.findGroup(OpcConfig.opc_server_default_group); - } catch (UnknownHostException - | JIException - | UnknownGroupException - | NotConnectedException - | IllegalArgumentException var8) { - var8.printStackTrace(); + Server server = (Server)this.servers.get(code); + boolean needcreate = false; + String groupName = code; + if (server == null) { needcreate = true; + } else { + try { + group = server.findGroup(groupName); + } catch (UnknownHostException | JIException | UnknownGroupException | NotConnectedException | IllegalArgumentException var13) { + log.error(code, var13); + needcreate = true; + } } + + if (needcreate) { + OpcServerManageDto dto = (OpcServerManageDto)this.opcServerManageDtos.get(code); + if (dto == null) { + throw new RuntimeException(code+"不存在"); + } + +// if (server!=null){ +// server.disconnect(); +// server=null; +// } + + if (server == null) { + server = OpcServerUtl.getServerWithOutException(dto.getOpc_host(), StrUtil.trim(dto.getCls_id()), dto.getUser(), dto.getPassword(), StrUtil.trim(dto.getDomain())); } + + try { + group = server.addGroup(groupName); + } catch (Exception var12) { + this.clearServer(code); + ThreadUtl.sleep(5000L); + log.warn("获取opc出错重新获取", code, var12); + server = OpcServerUtl.getServerWithOutException(dto.getOpc_host(), StrUtil.trim(dto.getCls_id()), dto.getUser(), dto.getPassword(), StrUtil.trim(dto.getDomain())); + try { + group = server.addGroup(groupName); + } catch (Exception var11) { + throw new RuntimeException(var12); + } + } + + this.servers.put(code, server); + this.groups.put(code, group); + } + + return group; } + } - if (needcreate) { - OpcServerManageDto dto = (OpcServerManageDto) this.opcServerManageDtos.get(code); - if (dto == null) { - throw new WDKException("code 不存在"); + public Group getServerByNewConn(String code) { + synchronized(this.buildLock(code)) { + + Server server = (Server)this.servers.get(code); + if (server!=null){ + this.clearServer(code); } - server = OpcServerUtl.getServerWithOutException( - dto.getOpc_host(), - dto.getCls_id(), - dto.getUser(), - dto.getPassword(), - dto.getDomain()); - -// server = OpcServerUtl.getServerWithOutException(this.OpcServer.getOpc_host(), this.OpcServer.getCls_id(), this.OpcServer.getUser(), this.OpcServer.getPassword(), this.OpcServer.getDomain()); + OpcServerManageDto dto = (OpcServerManageDto)this.opcServerManageDtos.get(code); + if (dto == null) { + throw new RuntimeException(code+"不存在"); + } +// if (server == null) { + server = OpcServerUtl.getServerWithOutException(dto.getOpc_host(), StrUtil.trim(dto.getCls_id()), dto.getUser(), dto.getPassword(), StrUtil.trim(dto.getDomain())); +// } + String groupName = code; + Group group = null; try { - group = server.addGroup(OpcConfig.opc_server_default_group); - } catch (Exception var7) { - throw new WDKException(var7); + group = server.addGroup(groupName); + } catch (Exception var12) { + this.clearServer(code); + ThreadUtl.sleep(2000L); + log.warn("获取opc出错重新获取", code, var12); + server = OpcServerUtl.getServerWithOutException(dto.getOpc_host(), StrUtil.trim(dto.getCls_id()), dto.getUser(), dto.getPassword(), StrUtil.trim(dto.getDomain())); + try { + group = server.addGroup(groupName); + } catch (Exception var11) { + throw new RuntimeException(var12); + } } this.servers.put(code, server); this.groups.put(code, group); + return group; } - - return group; } - public synchronized void clearServer(String code) { - try { - Server server = (Server) this.servers.get(code); - if (server!=null){ + public void clearServer(String code) { + synchronized(this.buildLock(code)) { + try { + Server server = (Server)this.servers.get(code); server.disconnect(); + } catch (Exception var5) { } - } catch (Exception e) { - e.printStackTrace(); - log.error("清理server异常,",e.getMessage()); + this.servers.remove(code); + this.groups.remove(code); } - - this.servers.remove(code); - this.groups.remove(code); } public void writeInteger(String code, ItemValue... values) { @@ -146,9 +197,32 @@ public class OpcServerServiceImpl implements OpcServerService, ApplicationAutoIn OpcUtl.writeValue(group, values); } catch (Exception var4) { this.clearServer(code); - log.warn("写入出错opc server {} 重新加载", code, var4); - ThreadUtl.sleep(5000L); + log.info("写入出错opc server {} 重新加载", code, var4); + ThreadUtl.sleep(1000L); throw var4; } } + + public void writeIntegerByNewConn(String code, ItemValue... values) { + try { + Group group = this.getServerByNewConn(code); + OpcUtl.writeValue(group, values); + } catch (Exception var4) { + this.clearServer(code); + log.info("写入出错opc server {} 重新加载", code, var4); + ThreadUtl.sleep(1000L); + throw var4; + } + } + + private String buildLock(String key) { + if (StrUtil.isEmpty(key)) { + key = ""; + } + StringBuilder builder = new StringBuilder(); + builder.append("OpcServerService."); + builder.append(key); + String lock = builder.toString().intern(); + return lock; + } }