rev 更新底层写入信号逻辑

This commit is contained in:
USER-20220102CG\noblelift
2023-08-11 16:49:55 +08:00
parent 77795095ba
commit 29f251f7d9
3 changed files with 276 additions and 85 deletions

View File

@@ -58,12 +58,40 @@ public class AbstractOpcDeviceDriver extends AbstractDeviceDriver implements Opc
int i = 0; int i = 0;
while(true) { while(true) {
//下发信号 //下发信号
try{
if(i == 0){
control( itemValues); control( itemValues);
} else {
controlByNewConn( itemValues);
}
} catch (Exception e){
e.printStackTrace();
}
Map<String, Object> read = new HashMap(); Map<String, Object> read = new HashMap();
Map<Item, ItemState> itemStatus = group.read(true, (Item[])readitems.values().toArray(new Item[0])); Map<Item, ItemState> 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<Item> items = itemStatus.keySet(); Set<Item> items = itemStatus.keySet();
Iterator var15 = items.iterator(); Iterator var15 = items.iterator();
while(var15.hasNext()) { while(var15.hasNext()) {
Item item = (Item)var15.next(); Item item = (Item)var15.next();
ItemState itemState = (ItemState)itemStatus.get(item); ItemState itemState = (ItemState)itemStatus.get(item);
@@ -71,7 +99,6 @@ public class AbstractOpcDeviceDriver extends AbstractDeviceDriver implements Opc
read.put(item.getId(), value); read.put(item.getId(), value);
} }
boolean check = true;
Iterator var24 = itemsString.iterator(); Iterator var24 = itemsString.iterator();
while(var24.hasNext()) { while(var24.hasNext()) {
@@ -80,6 +107,11 @@ public class AbstractOpcDeviceDriver extends AbstractDeviceDriver implements Opc
check = false; check = false;
} }
} }
} catch (Exception e){
e.printStackTrace();
check = false;
}
if (check) { if (check) {
return; return;
} }
@@ -95,6 +127,85 @@ public class AbstractOpcDeviceDriver extends AbstractDeviceDriver implements Opc
} }
} }
public boolean controlByNewConn(Map<String, Object> itemValues) {
Iterator<Map.Entry<String, Object>> it = itemValues.entrySet().iterator();
ItemValue p2[];
p2 = new ItemValue[itemValues.size()];
int i=0;
while (it.hasNext()) {
Map.Entry<String, Object> 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<String, Object> itemValues) { public boolean control(Map<String, Object> itemValues) {
Iterator<Map.Entry<String, Object>> it = itemValues.entrySet().iterator(); Iterator<Map.Entry<String, Object>> it = itemValues.entrySet().iterator();

View File

@@ -15,7 +15,13 @@ public interface OpcServerService {
Group getServer(String var1); Group getServer(String var1);
Group getServerByNewConn(String var1);
void writeInteger(String var1, ItemValue... var2); void writeInteger(String var1, ItemValue... var2);
void writeIntegerByNewConn(String var1, ItemValue... var2);
void clearServer(String var1); void clearServer(String var1);
} }

View File

@@ -1,8 +1,10 @@
package org.nl.acs.opc; package org.nl.acs.opc;
import cn.hutool.core.util.StrUtil;
import org.jinterop.dcom.common.JIException; import org.jinterop.dcom.common.JIException;
import org.nl.acs.auto.initial.ApplicationAutoInitial; import org.nl.acs.auto.initial.ApplicationAutoInitial;
import org.nl.acs.device_driver.driver.ItemValue; import org.nl.acs.device_driver.driver.ItemValue;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.wql.exception.WDKException; import org.nl.modules.wql.exception.WDKException;
import org.openscada.opc.lib.common.NotConnectedException; import org.openscada.opc.lib.common.NotConnectedException;
import org.openscada.opc.lib.da.Group; import org.openscada.opc.lib.da.Group;
@@ -49,9 +51,9 @@ public class OpcServerServiceImpl implements OpcServerService, ApplicationAutoIn
try { try {
OpcServerServiceImpl.this.getServer(dto.getOpc_code()); OpcServerServiceImpl.this.getServer(dto.getOpc_code());
//OpcServerServiceImpl.log.info("加载opc server {}", dto.getOpc_code()); OpcServerServiceImpl.log.info("加载opc server {}", dto.getOpc_code());
} catch (Exception var4) { } catch (Exception var4) {
//OpcServerServiceImpl.log.warn("启动无法载入servers", var4); OpcServerServiceImpl.log.warn("启动无法载入servers", var4);
} }
} }
} }
@@ -65,32 +67,38 @@ public class OpcServerServiceImpl implements OpcServerService, ApplicationAutoIn
this.opcServerManageDtos = Collections.synchronizedMap(this.opcServerManageDtos); this.opcServerManageDtos = Collections.synchronizedMap(this.opcServerManageDtos);
} }
public synchronized Group getServer(String code) { public Group getServer(String code) {
synchronized(this.buildLock(code)) {
Group group = null; Group group = null;
group = (Group)this.groups.get(code); group = (Group)this.groups.get(code);
if (group != null) { if (group != null) {
label68: {
Group var10000;
try { try {
if (group.isActive()) { if (!group.isActive()) {
return group; break label68;
} }
} catch (JIException var9) {
var9.printStackTrace(); var10000 = group;
} catch (JIException var14) {
log.error(code, var14);
break label68;
}
return var10000;
} }
} }
Server server = (Server)this.servers.get(code); Server server = (Server)this.servers.get(code);
boolean needcreate = false; boolean needcreate = false;
String groupName = code;
if (server == null) { if (server == null) {
needcreate = true; needcreate = true;
} else { } else {
try { try {
group = server.findGroup(OpcConfig.opc_server_default_group); group = server.findGroup(groupName);
} catch (UnknownHostException } catch (UnknownHostException | JIException | UnknownGroupException | NotConnectedException | IllegalArgumentException var13) {
| JIException log.error(code, var13);
| UnknownGroupException
| NotConnectedException
| IllegalArgumentException var8) {
var8.printStackTrace();
needcreate = true; needcreate = true;
} }
} }
@@ -98,23 +106,29 @@ public class OpcServerServiceImpl implements OpcServerService, ApplicationAutoIn
if (needcreate) { if (needcreate) {
OpcServerManageDto dto = (OpcServerManageDto)this.opcServerManageDtos.get(code); OpcServerManageDto dto = (OpcServerManageDto)this.opcServerManageDtos.get(code);
if (dto == null) { if (dto == null) {
throw new WDKException("code 不存在"); throw new RuntimeException(code+"不存在");
} }
server = OpcServerUtl.getServerWithOutException( // if (server!=null){
dto.getOpc_host(), // server.disconnect();
dto.getCls_id(), // server=null;
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());
if (server == null) {
server = OpcServerUtl.getServerWithOutException(dto.getOpc_host(), StrUtil.trim(dto.getCls_id()), dto.getUser(), dto.getPassword(), StrUtil.trim(dto.getDomain())); }
try { try {
group = server.addGroup(OpcConfig.opc_server_default_group); group = server.addGroup(groupName);
} catch (Exception var7) { } catch (Exception var12) {
throw new WDKException(var7); 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.servers.put(code, server);
@@ -123,22 +137,59 @@ public class OpcServerServiceImpl implements OpcServerService, ApplicationAutoIn
return group; return group;
} }
public synchronized void clearServer(String code) {
try {
Server server = (Server) this.servers.get(code);
if (server!=null){
server.disconnect();
} }
} catch (Exception e) { public Group getServerByNewConn(String code) {
e.printStackTrace(); synchronized(this.buildLock(code)) {
log.error("清理server异常,",e.getMessage());
Server server = (Server)this.servers.get(code);
if (server!=null){
this.clearServer(code);
}
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(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;
}
}
public void clearServer(String code) {
synchronized(this.buildLock(code)) {
try {
Server server = (Server)this.servers.get(code);
server.disconnect();
} catch (Exception var5) {
} }
this.servers.remove(code); this.servers.remove(code);
this.groups.remove(code); this.groups.remove(code);
} }
}
public void writeInteger(String code, ItemValue... values) { public void writeInteger(String code, ItemValue... values) {
try { try {
@@ -146,9 +197,32 @@ public class OpcServerServiceImpl implements OpcServerService, ApplicationAutoIn
OpcUtl.writeValue(group, values); OpcUtl.writeValue(group, values);
} catch (Exception var4) { } catch (Exception var4) {
this.clearServer(code); this.clearServer(code);
log.warn("写入出错opc server {} 重新加载", code, var4); log.info("写入出错opc server {} 重新加载", code, var4);
ThreadUtl.sleep(5000L); ThreadUtl.sleep(1000L);
throw var4; 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;
}
} }