|
@@ -0,0 +1,244 @@
|
|
|
+package com.judong.chuanyiserver.opc;
|
|
|
+
|
|
|
+import com.judong.chuanyiserver.dao.ItemGroupDao;
|
|
|
+import com.judong.chuanyiserver.entity.DataModel;
|
|
|
+import com.judong.chuanyiserver.entity.DataSource;
|
|
|
+import com.judong.chuanyiserver.entity.ItemGroup;
|
|
|
+import com.judong.chuanyiserver.entity.RawData;
|
|
|
+import com.judong.chuanyiserver.enums.ResultEnum;
|
|
|
+import com.judong.chuanyiserver.exception.CustomException;
|
|
|
+import com.judong.chuanyiserver.util.*;
|
|
|
+import lombok.val;
|
|
|
+import org.openscada.opc.lib.da.*;
|
|
|
+
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+public class OpcDaTask extends TimerTask {
|
|
|
+
|
|
|
+ private final RedisUtil redisUtil;
|
|
|
+
|
|
|
+ private final OpcAsyncTask opcAsyncTask;
|
|
|
+
|
|
|
+ private final ItemGroupDao itemGroupDao;
|
|
|
+
|
|
|
+ private final Timer timer;
|
|
|
+
|
|
|
+ private final ItemGroup itemGroup;
|
|
|
+
|
|
|
+ private final DataSource dataSource;
|
|
|
+
|
|
|
+ private final Map<String, DataModel> map;
|
|
|
+
|
|
|
+ private final List<String> itemIdList;
|
|
|
+
|
|
|
+ public OpcDaTask(RedisUtil redisUtil, OpcAsyncTask opcAsyncTask, ItemGroupDao itemGroupDao, Timer timer, ItemGroup itemGroup, DataSource dataSource, Map<String, DataModel> map, List<String> itemIdList) {
|
|
|
+ this.redisUtil = redisUtil;
|
|
|
+ this.opcAsyncTask = opcAsyncTask;
|
|
|
+ this.itemGroupDao = itemGroupDao;
|
|
|
+ this.timer = timer;
|
|
|
+ this.itemGroup = itemGroup;
|
|
|
+ this.dataSource = dataSource;
|
|
|
+ this.map = map;
|
|
|
+ this.itemIdList = itemIdList;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ Server server = OpcDaUtil.createServer(dataSource);
|
|
|
+ try {
|
|
|
+ if (itemGroup.getReadMode() == ConstantStr.ON_FREQUENCY) {
|
|
|
+ server.connect();
|
|
|
+ SyncAccess access = new SyncAccess(server, itemGroup.getModeValue() * 1000);
|
|
|
+ for (String itemId : itemIdList) {
|
|
|
+ access.addItem(itemId, new DataCallback() {
|
|
|
+ @Override
|
|
|
+ public void changed(Item item, ItemState itemState) {
|
|
|
+ try {
|
|
|
+ Map<String, Object> val = OpcDaUtil.getVal(itemState.getValue());
|
|
|
+ DataModel dm = map.get(itemId);
|
|
|
+ String valStr = val.get("value").toString();
|
|
|
+ opcAsyncTask.addRawData(itemGroup.getId(), new RawData(dataSource.getId(), itemId, val.get("javaType").toString(), Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr,
|
|
|
+ itemState.getTimestamp().getTime()));
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ access.bind();
|
|
|
+ while (true) {
|
|
|
+ Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + itemGroup.getId());
|
|
|
+ if (Blank.isEmpty(flage)) {
|
|
|
+ flage = false;
|
|
|
+ }
|
|
|
+ if (!flage) {
|
|
|
+ access.unbind();
|
|
|
+ if (Blank.isNotEmpty(server)) {
|
|
|
+ server.dispose();
|
|
|
+ }
|
|
|
+ redisUtil.del(ConstantStr.ITEM_GROUP + itemGroup.getId());
|
|
|
+ itemGroupDao.runItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
|
|
|
+ timer.cancel();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (itemGroup.getReadMode() == ConstantStr.ON_CHANGE) {
|
|
|
+ server.connect();
|
|
|
+ SyncAccess access = new SyncAccess(server, 500);
|
|
|
+ Date date = new Date();
|
|
|
+ for (String itemId : itemIdList) {
|
|
|
+ access.addItem(itemId, new DataCallback() {
|
|
|
+ private Map<String, Object> valueMap;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void changed(Item item, ItemState itemState) {
|
|
|
+ try {
|
|
|
+ Map<String, Object> val = OpcDaUtil.getVal(itemState.getValue());
|
|
|
+ if (Blank.isEmpty(valueMap)) {
|
|
|
+ valueMap = val;
|
|
|
+ DataModel dm = map.get(itemId);
|
|
|
+ String valStr = val.get("value").toString();
|
|
|
+ opcAsyncTask.addRawData(itemGroup.getId(), new RawData(dataSource.getId(), itemId, val.get("javaType").toString(), Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr,
|
|
|
+ date));
|
|
|
+ } else {
|
|
|
+ if (!valueMap.equals(val)) {
|
|
|
+ valueMap = val;
|
|
|
+ DataModel dm = map.get(itemId);
|
|
|
+ String valStr = val.get("value").toString();
|
|
|
+ opcAsyncTask.addRawData(itemGroup.getId(), new RawData(dataSource.getId(), itemId, val.get("javaType").toString(), Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr,
|
|
|
+ itemState.getTimestamp().getTime()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ access.bind();
|
|
|
+ while (true) {
|
|
|
+ Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + itemGroup.getId());
|
|
|
+ if (Blank.isEmpty(flage)) {
|
|
|
+ flage = false;
|
|
|
+ }
|
|
|
+ if (!flage) {
|
|
|
+ access.unbind();
|
|
|
+ if (Blank.isNotEmpty(server)) {
|
|
|
+ server.dispose();
|
|
|
+ }
|
|
|
+ redisUtil.del(ConstantStr.ITEM_GROUP + itemGroup.getId());
|
|
|
+ itemGroupDao.runItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
|
|
|
+ timer.cancel();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (itemGroup.getReadMode() == ConstantStr.EXCEED_SET_VALUE) {
|
|
|
+ server.connect();
|
|
|
+ SyncAccess access = new SyncAccess(server, 500);
|
|
|
+ Date date = new Date();
|
|
|
+ for (String itemId : itemIdList) {
|
|
|
+ access.addItem(itemId, new DataCallback() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void changed(Item item, ItemState itemState) {
|
|
|
+ try {
|
|
|
+ Map<String, Object> val = OpcDaUtil.getVal(itemState.getValue());
|
|
|
+ DataModel dm = map.get(itemId);
|
|
|
+ String valStr = val.get("value").toString();
|
|
|
+ String dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr;
|
|
|
+ if (Blank.isNotEmpty(dmData)) {
|
|
|
+ if (Double.valueOf(dmData) >= Double.valueOf(itemGroup.getModeValue())) {
|
|
|
+ opcAsyncTask.addRawData(itemGroup.getId(), new RawData(dataSource.getId(), itemId, val.get("javaType").toString(), dmData,
|
|
|
+ date));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ opcAsyncTask.addRawData(itemGroup.getId(), new RawData(dataSource.getId(), itemId, val.get("javaType").toString(), "null",
|
|
|
+ date));
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ access.bind();
|
|
|
+ while (true) {
|
|
|
+ Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + itemGroup.getId());
|
|
|
+ if (Blank.isEmpty(flage)) {
|
|
|
+ flage = false;
|
|
|
+ }
|
|
|
+ if (!flage) {
|
|
|
+ access.unbind();
|
|
|
+ if (Blank.isNotEmpty(server)) {
|
|
|
+ server.dispose();
|
|
|
+ }
|
|
|
+ redisUtil.del(ConstantStr.ITEM_GROUP + itemGroup.getId());
|
|
|
+ itemGroupDao.runItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
|
|
|
+ timer.cancel();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (itemGroup.getReadMode() == ConstantStr.LOWER_SET_VALUE) {
|
|
|
+ server.connect();
|
|
|
+ SyncAccess access = new SyncAccess(server, 500);
|
|
|
+ Date date = new Date();
|
|
|
+ for (String itemId : itemIdList) {
|
|
|
+ access.addItem(itemId, new DataCallback() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void changed(Item item, ItemState itemState) {
|
|
|
+ try {
|
|
|
+ Map<String, Object> val = OpcDaUtil.getVal(itemState.getValue());
|
|
|
+ DataModel dm = map.get(itemId);
|
|
|
+ String valStr = val.get("value").toString();
|
|
|
+ String dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr;
|
|
|
+ if (Blank.isNotEmpty(dmData)) {
|
|
|
+ if (Double.valueOf(dmData) <= Double.valueOf(itemGroup.getModeValue())) {
|
|
|
+ opcAsyncTask.addRawData(itemGroup.getId(), new RawData(dataSource.getId(), itemId, val.get("javaType").toString(), dmData,
|
|
|
+ date));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ opcAsyncTask.addRawData(itemGroup.getId(), new RawData(dataSource.getId(), itemId, val.get("javaType").toString(), "null",
|
|
|
+ date));
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ access.bind();
|
|
|
+ while (true) {
|
|
|
+ Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + itemGroup.getId());
|
|
|
+ if (Blank.isEmpty(flage)) {
|
|
|
+ flage = false;
|
|
|
+ }
|
|
|
+ if (!flage) {
|
|
|
+ access.unbind();
|
|
|
+ if (Blank.isNotEmpty(server)) {
|
|
|
+ server.dispose();
|
|
|
+ }
|
|
|
+ redisUtil.del(ConstantStr.ITEM_GROUP + itemGroup.getId());
|
|
|
+ itemGroupDao.runItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
|
|
|
+ timer.cancel();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "目前未适配其他类型的读取模式");
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ String message = e.getMessage();
|
|
|
+ if (message.contains("0x00000005")) {
|
|
|
+ redisUtil.convertAndSend(ConstantStr.ITEM_GROUP, Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "组" + itemGroup.getGroupName() + "运行异常,错误信息为:" + "用户名或密码错误"));
|
|
|
+ } else if (message.contains("0x8001FFFF")) {
|
|
|
+ redisUtil.convertAndSend(ConstantStr.ITEM_GROUP, Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "组" + itemGroup.getGroupName() + "运行异常,错误信息为:" + "ip连接不可用"));
|
|
|
+ } else {
|
|
|
+ redisUtil.convertAndSend(ConstantStr.ITEM_GROUP, Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "组" + itemGroup.getGroupName() + "运行异常,错误信息为:" + e.getMessage()));
|
|
|
+ }
|
|
|
+ if (Blank.isNotEmpty(server)) {
|
|
|
+ server.dispose();
|
|
|
+ }
|
|
|
+ redisUtil.del(ConstantStr.ITEM_GROUP + itemGroup.getId());
|
|
|
+ itemGroupDao.runItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
|
|
|
+ timer.cancel();
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|