Kaynağa Gözat

完成opcda通过频率读取新版,opcda通过改变读取新版,

zhoupeng 1 yıl önce
ebeveyn
işleme
1737148716

+ 9 - 1
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaChangeTask.java

@@ -129,7 +129,7 @@ public class OpcDaChangeTask extends TimerTask {
                     }, 10000);
                 }
             });
-        }catch (Exception e){
+        } catch (Exception e) {
             String message = OpcDaUtil.genException(e.getMessage());
             messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
                     itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
@@ -150,6 +150,7 @@ public class OpcDaChangeTask extends TimerTask {
                     private BigDecimal oldValue;
                     private String sqlCurrentYmdh = "";
                     private Long index = 0L;
+                    private Long timeStamp = 0L;
 
                     @Override
                     public void changed(Item item1, ItemState itemState) {
@@ -162,17 +163,24 @@ public class OpcDaChangeTask extends TimerTask {
                             Object value = val.get("value");
                             //值对应取值的时间
                             Date time = itemState.getTimestamp().getTime();
+                            long time1 = time.getTime();
                             String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
                             String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
                             if (Blank.isEmpty(sqlCurrentYmdh)) {
                                 sqlCurrentYmdh = currentYmdh;
+                                timeStamp = time1;
                                 redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
                             } else {
+                                //如果上次时间戳和这次时间戳相等,说明值未发生变化,不需要进行下面的操作
+                                if (timeStamp == time1) {
+                                    return;
+                                }
                                 if (!sqlCurrentYmdh.equals(currentYmdh)) {
                                     //组装相应的原始数据
                                     opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                                     redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
                                     sqlCurrentYmdh = currentYmdh;
+                                    timeStamp = time1;
                                 }
                             }
                             if (javaType.toLowerCase().equals("boolean")) {

+ 36 - 45
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaFrequencyTask.java

@@ -12,6 +12,7 @@ import com.example.opc_da.dynamicSchedule.CronTaskRegister;
 import com.example.opc_da.util.OpcDaUtil;
 import com.example.opc_da.util.RedisUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.jinterop.dcom.common.JIException;
 import org.openscada.opc.dcom.da.OPCSERVERSTATE;
 import org.openscada.opc.lib.da.Item;
 import org.openscada.opc.lib.da.*;
@@ -81,7 +82,7 @@ public class OpcDaFrequencyTask extends TimerTask {
         Server server = OpcDaUtil.createServer(dataSource);
         Integer id = itemGroup.getId();
         Integer dataSourceId = dataSource.getId();
-        SyncAccess access = null;
+        Timer chTimer = new Timer();
         try {
             server.connect();
             server.addStateListener(connected -> {
@@ -127,7 +128,7 @@ public class OpcDaFrequencyTask extends TimerTask {
                     }, 10000);
                 }
             });
-        }catch (Exception e){
+        } catch (Exception e) {
             String message = OpcDaUtil.genException(e.getMessage());
             messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
                     itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
@@ -138,21 +139,37 @@ public class OpcDaFrequencyTask extends TimerTask {
             }
             itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.EXCEPT_STOP_UP);
             cronTaskRegister.removeCronTask(cronId);
+            chTimer.cancel();
             timer.cancel();
         }
         try {
-            access = new SyncAccess(server, (int) (Math.round(itemGroup.getModeValue() * 1000)));
-//            AccessBase access = new Async20Access(server, (int) (itemGroup.getModeValue() * 1000), true);
+            Group group = server.addGroup();
+            List<String> itemStrList = new ArrayList<>();
             for (com.example.opc_common.entity.Item item : itemList) {
-                String itemId = item.getItemReadName();
-                access.addItem(itemId, new DataCallback() {
+                itemStrList.add(item.getItemReadName());
+            }
+            String[] items = itemStrList.toArray(new String[]{});
+            Map<String, Item> itemResult = group.addItems(items);
+            Set itemSet = new HashSet(itemResult.values());
+            org.openscada.opc.lib.da.Item[] itemArr = new org.openscada.opc.lib.da.Item[itemSet.size()];
+            itemSet.toArray(itemArr);
 
-                    private String sqlCurrentYmdh = "";
-                    private Long index = 0L;
+            chTimer.schedule(new TimerTask() {
+                private String sqlCurrentYmdh = "";
+                private Long index = 0L;
 
-                    @Override
-                    public void changed(Item item1, ItemState itemState) {
-                        index++;
+                @Override
+                public void run() {
+                    index++;
+                    Map<Item, ItemState> resultMap = null;
+                    try {
+                        resultMap = group.read(true, itemArr);
+                    } catch (JIException e) {
+                        throw new RuntimeException(e);
+                    }
+                    for (Item item : resultMap.keySet()) {
+                        String itemId = item.getId();
+                        ItemState itemState = resultMap.get(item);
                         try {
                             Map<String, Object> val = OpcDaUtil.getVal(itemState.getValue());
                             DataModel dm = map.get(itemId);
@@ -196,7 +213,7 @@ public class OpcDaFrequencyTask extends TimerTask {
                                     opcAsyncTask.addCursorRawData(cursorRawData);
                                 }
                             }
-                        } catch (Exception e) {
+                        } catch (JIException e) {
                             //执行组装数据库的数据,以及生成驱动报表
                             opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                             redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
@@ -211,51 +228,29 @@ public class OpcDaFrequencyTask extends TimerTask {
                             itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
                             cronTaskRegister.removeCronTask(cronId);
                             redisUtil.del(ConstantStr.ITEM_GROUP + id);
+                            chTimer.cancel();
                             timer.cancel();
                         }
                     }
-                });
-            }
-            access.bind();
+                }
+            }, new Date(), (int) (Math.round(itemGroup.getModeValue() * 1000)));
+
             while (true) {
                 Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
                 if (Blank.isEmpty(flage)) {
                     flage = false;
                 }
-                if (!access.isActive()) {
-                    //执行组装数据库的数据,以及生成驱动报表
-                    String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
-                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                    messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                            itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
-                            "服务异常停止了",
-                            ConstantStr.NO_READ));
-                    if (Blank.isNotEmpty(access)) {
-                        access.clear();
-                    }
-                    if (Blank.isNotEmpty(server)) {
-                        server.dispose();
-                    }
-                    itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
-                    cronTaskRegister.removeCronTask(cronId);
-                    redisUtil.del(ConstantStr.ITEM_GROUP + id);
-                    timer.cancel();
-                    break;
-                }
                 if (!flage) {
                     //执行组装数据库的数据,以及生成驱动报表
                     String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
                     opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                     redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                    if (Blank.isNotEmpty(access)) {
-                        access.clear();
-                    }
                     if (Blank.isNotEmpty(server)) {
                         server.dispose();
                     }
                     cronTaskRegister.removeCronTask(cronId);
                     redisUtil.del(ConstantStr.ITEM_GROUP + id);
+                    chTimer.cancel();
                     timer.cancel();
                     break;
                 }
@@ -265,12 +260,10 @@ public class OpcDaFrequencyTask extends TimerTask {
                     opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                     redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
 
-                    if (Blank.isNotEmpty(access)) {
-                        access.clear();
-                    }
                     if (Blank.isNotEmpty(server)) {
                         server.dispose();
                     }
+                    chTimer.cancel();
                     timer.cancel();
                     break;
                 }
@@ -285,14 +278,12 @@ public class OpcDaFrequencyTask extends TimerTask {
                 String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
                 opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                 redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                if (Blank.isNotEmpty(access)) {
-                    access.clear();
-                }
                 if (Blank.isNotEmpty(server)) {
                     server.dispose();
                 }
                 itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.EXCEPT_STOP_UP);
                 cronTaskRegister.removeCronTask(cronId);
+                chTimer.cancel();
                 timer.cancel();
             }
         }

+ 94 - 0
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/Test.java

@@ -0,0 +1,94 @@
+package com.example.opc_da.task;
+
+import com.example.opc_common.entity.DataSource;
+import com.example.opc_common.enums.OpcDaDriverEnum;
+import com.example.opc_da.util.OpcDaUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.jinterop.dcom.common.JIException;
+import org.openscada.opc.lib.da.*;
+
+import java.util.*;
+
+@Slf4j
+public class Test {
+
+    public static void main(String[] args) {
+//        test1();
+        test2();
+    }
+
+    public static void test1() {
+        DataSource dataSource = new DataSource();
+        dataSource.setIpAddress("192.168.0.5");
+        dataSource.setIpUserName("administrator");
+        dataSource.setIpPassword("jd123456");
+        dataSource.setClsId(OpcDaDriverEnum.KEPSERVER.getValue());
+        Server server = OpcDaUtil.createServer(dataSource);
+        try {
+            server.connect();
+//            SyncAccess access = new SyncAccess(server, 1000);
+            AccessBase access = new SyncAccess(server, 1000);
+            List<String> stringList = new ArrayList<>();
+            stringList.add("_System._Time_PM");
+            stringList.add("通道 1._Statistics._FailedWrites");
+            stringList.add("通道 1._Statistics._MaxPendingReads");
+
+            for (String itemId : stringList) {
+                access.addItem(itemId, new DataCallback() {
+                    @Override
+                    public void changed(Item item, ItemState itemState) {
+                        log.info("item={},itemState={}", item, itemState);
+                    }
+                });
+            }
+            access.bind();
+            while (true) {
+
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void test2() {
+        DataSource dataSource = new DataSource();
+        dataSource.setIpAddress("192.168.0.5");
+        dataSource.setIpUserName("administrator");
+        dataSource.setIpPassword("jd123456");
+        dataSource.setClsId(OpcDaDriverEnum.KEPSERVER.getValue());
+        Server server = OpcDaUtil.createServer(dataSource);
+        try {
+            server.connect();
+            Group group = server.addGroup();
+            String[] items = {"_System._Time_PM", "通道 1._Statistics._FailedWrites", "通道 1._Statistics._MaxPendingReads"};
+            Map<String, Item> itemResult = group.addItems(items);
+            Set itemSet = new HashSet(itemResult.values());
+            org.openscada.opc.lib.da.Item[] itemArr = new org.openscada.opc.lib.da.Item[itemSet.size()];
+            itemSet.toArray(itemArr);
+            Timer timer = new Timer();
+            timer.schedule(new TimerTask() {
+                int count = 0;
+
+                @Override
+                public void run() {
+                    log.info("{}", count++);
+                    Map<Item, ItemState> resultMap = null;
+                    try {
+                        resultMap = group.read(true, itemArr);
+                    } catch (JIException e) {
+                        throw new RuntimeException(e);
+                    }
+                    for (Item key : resultMap.keySet()) {
+                        ItemState itemState = resultMap.get(key);
+                        log.info("item={},itemState={}", key, itemState);
+                    }
+                }
+            },new Date(), 1000);
+            while (true){
+
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}