Bläddra i källkod

完成opcda通过变化获取值的demo

gt 2 år sedan
förälder
incheckning
1756407919
20 ändrade filer med 305 tillägg och 49 borttagningar
  1. 4 4
      chuanyi_server/src/main/java/com/judong/chuanyiserver/controller/DataModelController.java
  2. 1 1
      chuanyi_server/src/main/java/com/judong/chuanyiserver/entity/DataModel.java
  3. 1 1
      chuanyi_server/src/main/java/com/judong/chuanyiserver/entity/ItemGroup.java
  4. 1 1
      chuanyi_server/src/main/java/com/judong/chuanyiserver/opc/KepOpcServerPoolFactory.java
  5. 1 1
      chuanyi_server/src/main/java/com/judong/chuanyiserver/opc/OpcAsyncTask.java
  6. 126 0
      chuanyi_server/src/main/java/com/judong/chuanyiserver/opc/OpcDaObservable.java
  7. 1 1
      chuanyi_server/src/main/java/com/judong/chuanyiserver/opc/OpcDaTimerTask.java
  8. 1 1
      chuanyi_server/src/main/java/com/judong/chuanyiserver/opc/OpcServerUaPoolFactory.java
  9. 1 1
      chuanyi_server/src/main/java/com/judong/chuanyiserver/opc/OpcTimerTask.java
  10. 1 1
      chuanyi_server/src/main/java/com/judong/chuanyiserver/service/impl/ChannelSettingServiceImpl.java
  11. 15 6
      chuanyi_server/src/main/java/com/judong/chuanyiserver/service/impl/ItemGroupServiceImpl.java
  12. 8 5
      chuanyi_server/src/main/java/com/judong/chuanyiserver/util/ConstantStr.java
  13. 1 1
      chuanyi_server/src/main/java/com/judong/chuanyiserver/util/KepOpcServerUtil.java
  14. 24 0
      chuanyi_server/src/main/java/com/judong/chuanyiserver/util/OpcDaUtil.java
  15. 1 8
      chuanyi_server/src/main/java/com/judong/chuanyiserver/util/OpcServerUaUtil.java
  16. 51 0
      chuanyi_server/src/main/java/com/judong/chuanyiserver/util/Test.java
  17. 12 0
      chuanyi_server/src/main/java/com/judong/chuanyiserver/util/TestObservable.java
  18. 17 0
      chuanyi_server/src/main/java/com/judong/chuanyiserver/util/TestUser.java
  19. 26 13
      chuanyi_server/src/main/java/com/judong/chuanyiserver/util/TestUtil.java
  20. 12 4
      chuanyi_server/src/main/resources/mapper/DataModelDao.xml

+ 4 - 4
chuanyi_server/src/main/java/com/judong/chuanyiserver/controller/DataModelController.java

@@ -32,8 +32,8 @@ public class DataModelController {
     @PostMapping("/addDataModel")
     @WebLog(ServerEnum = ServerEnum.CLIENT, ModelEnum = ModelEnum.DATAMODEL, OperationEnum = OperationEnum.ADD)
     public Result addDataModel(@RequestBody DataModel dataModel) {
-        if (Blank.isEmpty(dataModel, dataModel.getMathParameter(), dataModel.getOperationRule())) {
-            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数学参数和四则混合运算表达式不能为空");
+        if (Blank.isEmpty(dataModel, dataModel.getRemark(), dataModel.getMathParameter(), dataModel.getOperationRule())) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "名称不能为空,数学参数和四则混合运算表达式不能为空");
         }
         return dataModelService.addDataModel(dataModel);
     }
@@ -47,8 +47,8 @@ public class DataModelController {
     @PostMapping("/updateDataModel")
     @WebLog(ServerEnum = ServerEnum.CLIENT, ModelEnum = ModelEnum.DATAMODEL, OperationEnum = OperationEnum.UPDATE)
     public Result updateDataModel(@RequestBody DataModel dataModel) {
-        if (Blank.isEmpty(dataModel, dataModel.getId(), dataModel.getMathParameter(), dataModel.getOperationRule())) {
-            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数学参数和四则混合运算表达式不能为空");
+        if (Blank.isEmpty(dataModel, dataModel.getId(), dataModel.getRemark(), dataModel.getMathParameter(), dataModel.getOperationRule())) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "名称不能为空,数学参数和四则混合运算表达式不能为空");
         }
         return dataModelService.updateDataModel(dataModel);
     }

+ 1 - 1
chuanyi_server/src/main/java/com/judong/chuanyiserver/entity/DataModel.java

@@ -29,7 +29,7 @@ public class DataModel implements Serializable {
     private String userId;
 
     /**
-     * 备注
+     * 备注,数据模型名称
      */
     private String remark;
     /**

+ 1 - 1
chuanyi_server/src/main/java/com/judong/chuanyiserver/entity/ItemGroup.java

@@ -31,7 +31,7 @@ public class ItemGroup implements Serializable {
      */
     private Integer dataSourceId;
     /**
-     * 读取模式
+     * 读取模式;0频率,1变化时读取,2超过设定值读取
      */
     private Integer readMode;
     /**

+ 1 - 1
chuanyi_server/src/main/java/com/judong/chuanyiserver/config/KepOpcServerPoolFactory.java → chuanyi_server/src/main/java/com/judong/chuanyiserver/opc/KepOpcServerPoolFactory.java

@@ -1,4 +1,4 @@
-package com.judong.chuanyiserver.config;
+package com.judong.chuanyiserver.opc;
 
 import com.alibaba.fastjson.JSONObject;
 import com.judong.chuanyiserver.enums.ResultEnum;

+ 1 - 1
chuanyi_server/src/main/java/com/judong/chuanyiserver/config/OpcAsyncTask.java → chuanyi_server/src/main/java/com/judong/chuanyiserver/opc/OpcAsyncTask.java

@@ -1,4 +1,4 @@
-package com.judong.chuanyiserver.config;
+package com.judong.chuanyiserver.opc;
 
 import com.judong.chuanyiserver.dao.DataSourceDao;
 import com.judong.chuanyiserver.dao.ItemGroupDao;

+ 126 - 0
chuanyi_server/src/main/java/com/judong/chuanyiserver/opc/OpcDaObservable.java

@@ -0,0 +1,126 @@
+package com.judong.chuanyiserver.opc;
+
+import com.judong.chuanyiserver.entity.DataSource;
+import com.judong.chuanyiserver.util.Blank;
+import com.judong.chuanyiserver.util.OpcDaUtil;
+import org.openscada.opc.lib.common.ConnectionInformation;
+import org.openscada.opc.lib.da.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+import java.util.concurrent.Executors;
+
+public class OpcDaObservable extends Observable {
+    private Server mServer = null;
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(OpcDaObservable.class);
+
+    /**
+     * 判断opc连接现在是否可用
+     *
+     * @param dataSource
+     * @return
+     */
+    public synchronized boolean connectionServer(DataSource dataSource) {
+        boolean mState = false;
+        try {
+            final ConnectionInformation ci = new ConnectionInformation();
+            ci.setHost(dataSource.getIpAddress());
+            ci.setDomain("");
+            ci.setUser(dataSource.getIpUserName());
+            ci.setPassword(dataSource.getIpPassword());
+            ci.setClsid(dataSource.getClsId());
+            mServer = new Server(ci, Executors.newSingleThreadScheduledExecutor());
+            mServer.connect();
+
+            mServer.addStateListener(new ServerConnectionStateListener() {
+                @Override
+                public void connectionStateChanged(boolean connected) {
+                    LOGGER.info("connectionStateChanged state = {}", connected);
+                    try {
+                        if (!connected) {
+                            mServer.connect();
+                        }
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+            });
+            mState = true;
+        } catch (Exception e) {
+            LOGGER.error(e.getMessage());
+        } finally {
+            if (!mState) {
+                mServer = null;
+            }
+        }
+        return mState;
+    }
+
+    public void readItemListValue(List<String> itemIdList, int period) {
+        try {
+//            Async20Access access = new Async20Access(mServer, period, false);
+            SyncAccess access = new SyncAccess(mServer, period);
+            for (String itemId : itemIdList) {
+                access.addItem(itemId, new DataCallback() {
+                    private Map<String, Object> map;
+
+                    @Override
+                    public void changed(Item item, ItemState itemState) {
+                        try {
+                            Map<String, Object> newMap = OpcDaUtil.getVal(itemState.getValue());
+                            if (Blank.isEmpty(map)) {
+                                map = newMap;
+                                noticeChange(itemId, newMap);
+                            } else {
+                                if (!map.equals(newMap)) {
+                                    noticeChange(itemId, newMap);
+                                }
+                            }
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                    }
+                });
+            }
+            access.bind();
+            access.addStateListener(new AccessStateListener() {
+                @Override
+                public void stateChanged(boolean state) {
+                    System.out.println("access读取的的状态为:--------------" + state);
+//                    System.out.println("-------------------------------"+state);
+//                    if (!state) {
+//                        access.bind();
+//                    }
+//                    access.bind();
+                }
+
+                @Override
+                public void errorOccured(Throwable t) {
+                    System.out.println(t);
+                }
+            });
+            while (true) {
+//                access.unbind();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 数据变化通知观察者
+     */
+    public void noticeChange(String itemId, Object value) {
+        setChanged();
+        Map<String, Object> map = new HashMap<>();
+        map.put("itemId", itemId);
+        map.put("value", value);
+        notifyObservers(map);
+    }
+
+    public OpcDaObservable(Server server) {
+        this.mServer = server;
+    }
+}

+ 1 - 1
chuanyi_server/src/main/java/com/judong/chuanyiserver/config/OpcDaTimerTask.java → chuanyi_server/src/main/java/com/judong/chuanyiserver/opc/OpcDaTimerTask.java

@@ -1,4 +1,4 @@
-package com.judong.chuanyiserver.config;
+package com.judong.chuanyiserver.opc;
 
 import com.judong.chuanyiserver.dao.ItemGroupDao;
 import com.judong.chuanyiserver.entity.DataModel;

+ 1 - 1
chuanyi_server/src/main/java/com/judong/chuanyiserver/config/OpcServerUaPoolFactory.java → chuanyi_server/src/main/java/com/judong/chuanyiserver/opc/OpcServerUaPoolFactory.java

@@ -1,4 +1,4 @@
-package com.judong.chuanyiserver.config;
+package com.judong.chuanyiserver.opc;
 
 import com.alibaba.fastjson.JSONObject;
 import com.judong.chuanyiserver.enums.ResultEnum;

+ 1 - 1
chuanyi_server/src/main/java/com/judong/chuanyiserver/config/OpcTimerTask.java → chuanyi_server/src/main/java/com/judong/chuanyiserver/opc/OpcTimerTask.java

@@ -1,4 +1,4 @@
-package com.judong.chuanyiserver.config;
+package com.judong.chuanyiserver.opc;
 
 import com.judong.chuanyiserver.dao.ItemGroupDao;
 import com.judong.chuanyiserver.entity.DataModel;

+ 1 - 1
chuanyi_server/src/main/java/com/judong/chuanyiserver/service/impl/ChannelSettingServiceImpl.java

@@ -1,7 +1,7 @@
 package com.judong.chuanyiserver.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
-import com.judong.chuanyiserver.config.OpcAsyncTask;
+import com.judong.chuanyiserver.opc.OpcAsyncTask;
 import com.judong.chuanyiserver.dao.ChannelSettingDao;
 import com.judong.chuanyiserver.dao.ConnectDao;
 import com.judong.chuanyiserver.entity.ChannelSetting;

+ 15 - 6
chuanyi_server/src/main/java/com/judong/chuanyiserver/service/impl/ItemGroupServiceImpl.java

@@ -1,7 +1,7 @@
 package com.judong.chuanyiserver.service.impl;
 
-import com.judong.chuanyiserver.config.OpcAsyncTask;
-import com.judong.chuanyiserver.config.OpcTimerTask;
+import com.judong.chuanyiserver.opc.OpcAsyncTask;
+import com.judong.chuanyiserver.opc.OpcTimerTask;
 import com.judong.chuanyiserver.dao.DataModelDao;
 import com.judong.chuanyiserver.dao.DataSourceDao;
 import com.judong.chuanyiserver.dao.ItemGroupDao;
@@ -13,8 +13,6 @@ import com.judong.chuanyiserver.enums.ResultEnum;
 import com.judong.chuanyiserver.exception.CustomException;
 import com.judong.chuanyiserver.service.ItemGroupService;
 import com.judong.chuanyiserver.util.*;
-import org.openscada.opc.dcom.da.OPCSERVERSTATE;
-import org.openscada.opc.lib.da.*;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -201,6 +199,7 @@ public class ItemGroupServiceImpl implements ItemGroupService {
         DataSource dataSource = DataSource.convertPassword(dataSourceDao.getDataSourceById(itemGroup.getDataSourceId()));
         DataSourceType dataSourceType = dataSourceDao.getDataSourceTypeById(dataSource.getTypeId());
         Boolean flage = false;
+        //获取组中所有标签的数据模型,并转换为map<itemName,DataModel>
         List<Item> allItemList = itemGroupDao.getItemListByGroupId(id);
         itemGroup.setItemList(allItemList);
         if (Blank.isNotEmpty(allItemList)) {
@@ -261,8 +260,18 @@ public class ItemGroupServiceImpl implements ItemGroupService {
                         }
                     }
                     String[] items = itemList.toArray(new String[]{});
-                    timer.schedule(new OpcTimerTask(redisUtil, opcAsyncTask, itemGroupDao, timer, itemGroup, dataSource, map, items),
-                            DateUtil.strChangeDate(DateUtil.getCurrentYmd() + " " + itemGroup.getStartReadTime()), ConstantStr.PERIOD_DAY);
+                if (itemGroup.getReadMode() == ConstantStr.ON_FREQUENCY) {
+
+                        timer.schedule(new OpcTimerTask(redisUtil, opcAsyncTask, itemGroupDao, timer, itemGroup, dataSource, map, items),
+                                DateUtil.strChangeDate(DateUtil.getCurrentYmd() + " " + itemGroup.getStartReadTime()), ConstantStr.PERIOD_DAY);
+                } else if (itemGroup.getReadMode() == ConstantStr.ON_CHANGE) {
+
+                } else if (itemGroup.getReadMode() == ConstantStr.EXCEED_SET_VALUE) {
+
+                } else {
+                    throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "目前未适配其他类型的读取模式");
+                }
+
                 } else if (dataSource.getClsId().toUpperCase().equals(OpcDaDriverEnum.WINCC.getValue())) {
 
                 } else {

+ 8 - 5
chuanyi_server/src/main/java/com/judong/chuanyiserver/util/ConstantStr.java

@@ -1,7 +1,5 @@
 package com.judong.chuanyiserver.util;
 
-import javafx.scene.chart.Chart;
-
 /**
  * 全局常量
  */
@@ -64,6 +62,11 @@ public class ConstantStr {
     public static final String BAR_CHART = "bar";
     public static final String PIE_CHART = "pie";
 
+    //读取模式。0频率,1变化时读取,2超过设定值读取
+    public static final Integer ON_FREQUENCY = 0;
+    public static final Integer ON_CHANGE = 1;
+    public static final Integer EXCEED_SET_VALUE = 2;
+
     //取值条件
     public static final Integer AVERAGE_VALUE = 0;
     public static final Integer MAX_VALUE = 1;
@@ -77,13 +80,13 @@ public class ConstantStr {
 
     //报表取值格式
     //每天的08:00到第二天的07:00
-    public static final Integer EVERY_DAY_ES= 0;
+    public static final Integer EVERY_DAY_ES = 0;
 
     //定时器时间间隔
     public static final long PERIOD_DAY = 24 * 60 * 60 * 1000;
 
     //是否为自动报表,0手动,1自动
-    public static final Integer MANUAL_REPORT= 0;
-    public static final Integer AUTOMATIC_REPORT= 1;
+    public static final Integer MANUAL_REPORT = 0;
+    public static final Integer AUTOMATIC_REPORT = 1;
 
 }

+ 1 - 1
chuanyi_server/src/main/java/com/judong/chuanyiserver/util/KepOpcServerUtil.java

@@ -1,7 +1,7 @@
 package com.judong.chuanyiserver.util;
 
 import com.alibaba.fastjson.JSONObject;
-import com.judong.chuanyiserver.config.KepOpcServerPoolFactory;
+import com.judong.chuanyiserver.opc.KepOpcServerPoolFactory;
 import com.judong.chuanyiserver.entity.ChannelSetting;
 import com.judong.chuanyiserver.entity.DataModel;
 import com.judong.chuanyiserver.entity.DataSource;

+ 24 - 0
chuanyi_server/src/main/java/com/judong/chuanyiserver/util/OpcDaUtil.java

@@ -30,6 +30,12 @@ import java.util.concurrent.Executors;
 @Slf4j
 public class OpcDaUtil {
 
+    /**
+     * 创建server
+     *
+     * @param dataSource
+     * @return
+     */
     public static Server createServer(DataSource dataSource) {
         final ConnectionInformation ci = new ConnectionInformation();
         ci.setHost(dataSource.getIpAddress());
@@ -40,6 +46,12 @@ public class OpcDaUtil {
         return new Server(ci, Executors.newSingleThreadScheduledExecutor());
     }
 
+    /**
+     * 测试opcda连接
+     *
+     * @param dataSource
+     * @return
+     */
     public static Result opcDaTestConnect(DataSource dataSource) {
         Server server = null;
         try {
@@ -72,6 +84,12 @@ public class OpcDaUtil {
         }
     }
 
+    /**
+     * opcda获取树
+     *
+     * @param dataSource
+     * @return
+     */
     public static Result opcDaGetTree(DataSource dataSource) {
         Server server = null;
         try {
@@ -197,6 +215,12 @@ public class OpcDaUtil {
         return jsonObjectList;
     }
 
+    /**
+     * 获取opcda连接下的所有驱动
+     *
+     * @param dataSource
+     * @return
+     */
     public static List<JSONObject> getDaAllDriver(DataSource dataSource) {
         try {
             ServerList serverList = new ServerList(dataSource.getIpAddress(), dataSource.getIpUserName(), dataSource.getIpPassword(), "");

+ 1 - 8
chuanyi_server/src/main/java/com/judong/chuanyiserver/util/OpcServerUaUtil.java

@@ -1,10 +1,8 @@
 package com.judong.chuanyiserver.util;
 
 import com.alibaba.fastjson.JSONObject;
-import com.judong.chuanyiserver.config.KepOpcServerPoolFactory;
-import com.judong.chuanyiserver.config.OpcServerUaPoolFactory;
+import com.judong.chuanyiserver.opc.OpcServerUaPoolFactory;
 import com.judong.chuanyiserver.entity.ServerInformation;
-import com.judong.chuanyiserver.enums.ConnectModeEnum;
 import com.judong.chuanyiserver.enums.ResultEnum;
 import com.judong.chuanyiserver.exception.CustomException;
 import lombok.extern.slf4j.Slf4j;
@@ -23,17 +21,12 @@ import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId;
 import org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.Unsigned;
 import org.eclipse.milo.opcua.stack.core.types.enumerated.TimestampsToReturn;
 import org.eclipse.milo.opcua.stack.core.types.structured.EndpointDescription;
-import org.openscada.opc.dcom.da.OPCSERVERSTATE;
-import org.openscada.opc.lib.da.Group;
-import org.openscada.opc.lib.da.Item;
-import org.openscada.opc.lib.da.Server;
 
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;

+ 51 - 0
chuanyi_server/src/main/java/com/judong/chuanyiserver/util/Test.java

@@ -0,0 +1,51 @@
+package com.judong.chuanyiserver.util;
+
+import com.judong.chuanyiserver.opc.OpcDaObservable;
+import com.judong.chuanyiserver.entity.DataSource;
+import org.openscada.opc.lib.da.Server;
+import org.openscada.opc.lib.da.ServerConnectionStateListener;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Test {
+    public static void main(String[] args) {
+        List<String> stringList = new ArrayList<>();
+        stringList.add("通道 1._Statistics._MaxPendingWrites");
+        stringList.add("通道 1._Statistics._PendingWrites");
+        stringList.add("通道 1._Statistics._TxBytes");
+        DataSource dataSource = new DataSource();
+        dataSource.setClsId("7BC0CC8E-482C-47CA-ABDC-0FE7F9C6E729");
+        dataSource.setIpAddress("192.168.0.7");
+        dataSource.setIpUserName("administrator");
+        dataSource.setIpPassword("jd123456");
+        OpcDaObservable opcDaObservable = null;
+        try {
+            final Server mServer = OpcDaUtil.createServer(dataSource);
+            opcDaObservable = new OpcDaObservable(mServer);
+            mServer.connect();
+
+            mServer.addStateListener(new ServerConnectionStateListener() {
+                @Override
+                public void connectionStateChanged(boolean connected) {
+                    System.out.println("server服务的状态目前是--------------" + connected);
+//                    try {
+//                        if (!connected) {
+//                            System.out.println("------------"+connected);
+//                            mServer.connect();
+//                        }
+//                    } catch (Exception e) {
+//                        e.printStackTrace();
+//                    }
+                }
+            });
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        TestUser testUser = new TestUser();
+        testUser.setName("张三");
+        opcDaObservable.addObserver(testUser);
+        opcDaObservable.readItemListValue(stringList, 500);
+    }
+
+}

+ 12 - 0
chuanyi_server/src/main/java/com/judong/chuanyiserver/util/TestObservable.java

@@ -0,0 +1,12 @@
+package com.judong.chuanyiserver.util;
+
+import java.util.Observable;
+import java.util.Observer;
+
+public class TestObservable extends Observable {
+
+    public void setData(String message) {
+        setChanged();
+        notifyObservers(message);
+    }
+}

+ 17 - 0
chuanyi_server/src/main/java/com/judong/chuanyiserver/util/TestUser.java

@@ -0,0 +1,17 @@
+package com.judong.chuanyiserver.util;
+
+import lombok.Data;
+
+import java.util.Observable;
+import java.util.Observer;
+
+@Data
+public class TestUser implements Observer {
+
+    private String name;
+
+    @Override
+    public void update(Observable o, Object arg) {
+        System.out.println(name + "看到变化:" + arg);
+    }
+}

+ 26 - 13
chuanyi_server/src/main/java/com/judong/chuanyiserver/util/TestUtil.java

@@ -1,18 +1,12 @@
 package com.judong.chuanyiserver.util;
 
-import com.alibaba.fastjson.JSONObject;
-import com.judong.chuanyiserver.config.OpcAsyncTask;
+import com.judong.chuanyiserver.opc.OpcAsyncTask;
 import lombok.extern.slf4j.Slf4j;
 import org.jinterop.dcom.core.JIVariant;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.openscada.opc.dcom.list.ClassDetails;
-import org.openscada.opc.dcom.list.impl.OPCServerList;
 import org.openscada.opc.lib.common.ConnectionInformation;
 import org.openscada.opc.lib.da.*;
-import org.openscada.opc.lib.list.Categories;
-import org.openscada.opc.lib.list.Category;
-import org.openscada.opc.lib.list.ServerList;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
@@ -62,10 +56,12 @@ public class TestUtil {
         ConnectionInformation ci = new ConnectionInformation();
         Server server = null;
         try {
-            ci.setHost("192.168.1.99");
+//            ci.setHost("192.168.1.99");
+            ci.setHost("192.168.0.7");
             ci.setDomain("");
             ci.setUser("administrator");
-            ci.setPassword("asdf");
+//            ci.setPassword("asdf");
+            ci.setPassword("jd123456");
             ci.setClsid("7BC0CC8E-482C-47CA-ABDC-0FE7F9C6E729");
 //            ci.setClsid("3C5702A2-EB8E-11D4-83A4-00105A984CBD");
 //            ci.setClsid("75d00bbb-dda5-11d1-b944-9e614d000000");
@@ -74,17 +70,34 @@ public class TestUtil {
             server.connect();
             Group group = server.addGroup();
 //            Item item = group.addItem("通道 1.设备 1._System._SecondsInError");
-//            Item item = group.addItem("通道 1.设备 1._System._SecondsInError");
+            Item item = group.addItem("通道 1.设备 1._System._SecondsInError");
 
 //            Item item = group.addItem("FIX.RM.LT001.F_CV");
-            Item item = group.addItem("FIX.LT001.F_CV");
+//            Item item = group.addItem("FIX.LT001.F_CV");
 
 //            Item item = group.addItem("@LOCALMACHINE::.内部变量.AI2");
 //            Item item = group.addItem("AI2");
 //            opcAsyncTask.read(item);
+            List<String> stringList=new ArrayList<>();
+            server.addStateListener(new ServerConnectionStateListener() {
+                @Override
+                public void connectionStateChanged(boolean connected) {
+
+                }
+            });
+            AccessBase access = new Async20Access(server, 500, true);
+            access.addItem("通道 1.设备 1._System._SecondsInError", new DataCallback() {
+                @Override
+                public void changed(Item item, ItemState itemState) {
+                    stringList.add("1");
+                }
+            });
+            access.bind();
+            System.err.println(stringList);
+            JIVariant value = item.read(true).getValue();
 
-            Map<String, Object> value = KepOpcServerUtil.getVal(item.read(true).getValue());
-            System.err.println(value);
+//            Map<String, Object> value = KepOpcServerUtil.getVal(item.read(true).getValue());
+//            System.err.println(value);
 
 
 //            dumpTree(server.getTreeBrowser().browse(), 0);

+ 12 - 4
chuanyi_server/src/main/resources/mapper/DataModelDao.xml

@@ -2,6 +2,10 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.judong.chuanyiserver.dao.DataModelDao">
 
+    <sql id="dataModel">
+        id,math_parameter, operation_rule, user_id, remark, create_time
+    </sql>
+
     <insert id="addDataModel">
         insert into t_data_model (math_parameter, operation_rule, user_id, remark, create_time)
             VALUE (#{mathParameter}, #{operationRule}, #{userId}, #{remark}, now())
@@ -28,20 +32,23 @@
     </select>
 
     <select id="getAllDataModel" resultType="com.judong.chuanyiserver.entity.DataModel">
-        select id, math_parameter, operation_rule, user_id, remark, create_time
+        select
+        <include refid="dataModel"/>
         from t_data_model
         where user_id = #{userId}
         limit #{startNum},#{limitNum}
     </select>
 
     <select id="getDataModelById" resultType="com.judong.chuanyiserver.entity.DataModel">
-        select id, math_parameter, operation_rule, user_id, remark, create_time
+        select
+        <include refid="dataModel"/>
         from t_data_model
         where id = #{id}
     </select>
 
     <select id="getDmListByItemList" resultType="com.judong.chuanyiserver.entity.DataModel">
-        select id, math_parameter, operation_rule, user_id, remark, create_time
+        select
+        <include refid="dataModel"/>
         from t_data_model where id in
         <foreach collection="itemList" item="item" index="index" open="(" close=")" separator=",">
             #{item.dataModelId}
@@ -49,7 +56,8 @@
     </select>
 
     <select id="getDmListByTdList" resultType="com.judong.chuanyiserver.entity.DataModel">
-        select id, math_parameter, operation_rule, user_id, remark, create_time
+        select
+        <include refid="dataModel"/>
         from t_data_model where id in
         <foreach collection="tableDataDtoList" item="tableDataDto" index="index" open="(" close=")" separator=",">
             #{tableDataDto.dataModelId}