Bladeren bron

Merge branch 'master' of http://116.63.33.55/git/read_opc

Zt 2 jaren geleden
bovenliggende
commit
7f80e1ecdc

+ 22 - 7
chuanyi_server/src/main/java/com/judong/chuanyiserver/config/OpcDaTimerTask.java

@@ -61,14 +61,29 @@ public class OpcDaTimerTask extends TimerTask {
                 List<RawData> rawDataList = new ArrayList<>();
                 Date date = new Date();
                 Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
+                List<com.judong.chuanyiserver.entity.Item> itemList = itemGroup.getItemList();
                 for (org.openscada.opc.lib.da.Item key : resultMap.keySet()) {
-                    ItemState itemMap = resultMap.get(key);
-                    Map<String, Object> val = OpcDaUtil.getVal(itemMap.getValue());
-                    DataModel dm = map.get(key.getId());
-                    String valStr = val.get("value").toString();
-                    rawDataList.add(new RawData(dataSourceId, key.getId(), val.get("javaType").toString(),
-                            Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr,
-                            date));
+                    String keyId = key.getId();
+                    for (com.judong.chuanyiserver.entity.Item item : itemList) {
+                        if (item.getItemReadName().equals(keyId)) {
+                            ItemState itemMap = resultMap.get(key);
+                            Map<String, Object> val = OpcDaUtil.getVal(itemMap.getValue());
+                            DataModel dm = map.get(item.getItemName());
+                            String valStr = val.get("value").toString();
+                            rawDataList.add(new RawData(dataSourceId, item.getItemName(), val.get("javaType").toString(),
+                                    Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr,
+                                    date));
+                            break;
+                        }
+                    }
+
+//                    ItemState itemMap = resultMap.get(key);
+//                    Map<String, Object> val = OpcDaUtil.getVal(itemMap.getValue());
+//                    DataModel dm = map.get(key.getId());
+//                    String valStr = val.get("value").toString();
+//                    rawDataList.add(new RawData(dataSourceId, key.getId(), val.get("javaType").toString(),
+//                            Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr,
+//                            date));
                 }
                 opcAsyncTask.addRawDataList(itemGroup.getId(), rawDataList);
             } else {

+ 1 - 1
chuanyi_server/src/main/java/com/judong/chuanyiserver/dao/ItemGroupDao.java

@@ -35,7 +35,7 @@ public interface ItemGroupDao {
 
     Integer runItemGroupById(Integer id, Integer runState);
 
-    List<String> getItemByIdChange(Integer id);
+    List<String> getItemByIdChange(Integer itemGroupId);
 
     Integer updateItemDescribe(Item item);
 

+ 4 - 0
chuanyi_server/src/main/java/com/judong/chuanyiserver/entity/Item.java

@@ -22,6 +22,10 @@ public class Item implements Serializable {
      */
     private String itemName;
     /**
+     * 项读取数据使用的名称
+     */
+    private String itemReadName;
+    /**
      * opcUa特有的nodeId路径
      */
     private Integer nodeIndex;

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

@@ -47,6 +47,8 @@ public class ItemGroupServiceImpl implements ItemGroupService {
     public synchronized Result addItemGroup(ItemGroup itemGroup) {
         String userId = userUtil.getCurrentUserId();
         itemGroup.setUserId(userId);
+        DataSource dataSource = dataSourceDao.getDataSourceById(itemGroup.getDataSourceId());
+        DataSourceType dataSourceType = dataSourceDao.getDataSourceTypeById(dataSource.getTypeId());
         if (Blank.isEmpty(itemGroup.getId())) {
             ItemGroup isExistItemGroup = itemGroupDao.getItemGroupByName(userId, itemGroup.getGroupName());
             if (Blank.isNotEmpty(isExistItemGroup)) {
@@ -54,6 +56,29 @@ public class ItemGroupServiceImpl implements ItemGroupService {
             }
             itemGroupDao.addItemGroup(itemGroup);
             if (Blank.isNotEmpty(itemGroup.getItemList())) {
+                if (dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_DA_REAL.getValue())) {
+                    List<Item> itemList = itemGroup.getItemList();
+                    if (dataSource.getClsId().equals(OpcDaDriverEnum.KEPSERVER.getValue())) {
+                        for (int i = 0; i < itemList.size(); i++) {
+                            itemList.get(i).setItemReadName(itemList.get(i).getItemName());
+                        }
+                    } else if (dataSource.getClsId().equals(OpcDaDriverEnum.OPCIFIX.getValue())) {
+                        for (int i = 0; i < itemList.size(); i++) {
+                            String itemName = itemList.get(i).getItemName();
+                            int j = itemName.indexOf(".");
+                            String s = itemName.substring(j + 1);
+                            itemList.get(i).setItemReadName(itemName.substring(0, j) + s.substring(s.indexOf(".")));
+                        }
+                    } else if (dataSource.getClsId().equals(OpcDaDriverEnum.WINCC.getValue())) {
+                        for (int i = 0; i < itemList.size(); i++) {
+                            String itemName = itemList.get(i).getItemName();
+                            itemList.get(i).setItemReadName(itemName.substring(itemName.lastIndexOf(".") + 1));
+                        }
+                    } else {
+                        throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "目前未适配此种驱动类型");
+                    }
+                    itemGroup.setItemList(itemList);
+                }
                 itemGroupDao.addItem(itemGroup.getId(), itemGroup.getItemList());
             }
             return Result.ok("添加item组成功");
@@ -70,6 +95,29 @@ public class ItemGroupServiceImpl implements ItemGroupService {
             if (itemGroupDao.updateItemGroup(itemGroup) <= 0) {
                 return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "修改item组失败");
             }
+            if (dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_DA_REAL.getValue())) {
+                List<Item> itemList = itemGroup.getItemList();
+                if (dataSource.getClsId().equals(OpcDaDriverEnum.KEPSERVER.getValue())) {
+                    for (int i = 0; i < itemList.size(); i++) {
+                        itemList.get(i).setItemReadName(itemList.get(i).getItemName());
+                    }
+                } else if (dataSource.getClsId().equals(OpcDaDriverEnum.OPCIFIX.getValue())) {
+                    for (int i = 0; i < itemList.size(); i++) {
+                        String itemName = itemList.get(i).getItemName();
+                        int j = itemName.indexOf(".");
+                        String s = itemName.substring(j + 1);
+                        itemList.get(i).setItemReadName(itemName.substring(0, j) + s.substring(s.indexOf(".")));
+                    }
+                } else if (dataSource.getClsId().equals(OpcDaDriverEnum.WINCC.getValue())) {
+                    for (int i = 0; i < itemList.size(); i++) {
+                        String itemName = itemList.get(i).getItemName();
+                        itemList.get(i).setItemReadName(itemName.substring(itemName.lastIndexOf(".") + 1));
+                    }
+                } else {
+                    throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "目前未适配此种驱动类型");
+                }
+                itemGroup.setItemList(itemList);
+            }
             if (Blank.isNotEmpty(itemGroup.getDataSourceId()) && Blank.isNotEmpty(itemGroup1.getDataSourceId())) {
                 if (itemGroup.getDataSourceId() == itemGroup1.getDataSourceId()) {
                     List<Item> itemList = itemGroup.getItemList();
@@ -154,6 +202,7 @@ public class ItemGroupServiceImpl implements ItemGroupService {
         DataSourceType dataSourceType = dataSourceDao.getDataSourceTypeById(dataSource.getTypeId());
         Boolean flage = false;
         List<Item> allItemList = itemGroupDao.getItemListByGroupId(id);
+        itemGroup.setItemList(allItemList);
         if (Blank.isNotEmpty(allItemList)) {
             for (Item item : allItemList) {
                 if (Blank.isNotEmpty(item.getDataModelId())) {
@@ -193,15 +242,13 @@ public class ItemGroupServiceImpl implements ItemGroupService {
                 }
                 //异步读取opcUA数据并保存
                 opcAsyncTask.runOpcUa(itemGroup, dataSource, map);
-            } else if (dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_DA_REAL.getValue()) ||
-                    dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_HDA_HISTORY.getValue()) ||
-                    dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_AE_ALARMS.getValue())
-            ) {
+            } else if (dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_DA_REAL.getValue())) {
                 if (Blank.isEmpty(dataSource.getIpAddress(), dataSource.getIpUserName(), dataSource.getIpPassword())) {
                     throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据源ip,用户名,密码都不能为空");
                 }
                 //读取数据并保存
                 Timer timer = new Timer();
+                //获取读取使用的itemName
                 List<String> itemList = itemGroupDao.getItemByIdChange(id);
                 //如果驱动是kepserver,则不进行变化
                 if (dataSource.getClsId().equals(OpcDaDriverEnum.OPCIFIX.getValue())) {
@@ -213,14 +260,17 @@ public class ItemGroupServiceImpl implements ItemGroupService {
                             itemList.set(i, itemName.substring(0, j) + s.substring(s.indexOf(".")));
                         }
                     }
+                    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);
                 } else if (dataSource.getClsId().equals(OpcDaDriverEnum.WINCC.getValue())) {
 
                 } else {
                     throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "目前未适配此种驱动类型");
                 }
-                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);
+            } else if (dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_HDA_HISTORY.getValue()) ||
+                    dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_AE_ALARMS.getValue())) {
+
             } else if (dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.KEP_SERVER_REAL.getValue())) {
                 if (Blank.isEmpty(dataSource.getIpAddress(), dataSource.getIpUserName(), dataSource.getIpPassword())) {
                     throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据源ip,用户名,密码都不能为空");
@@ -281,10 +331,16 @@ public class ItemGroupServiceImpl implements ItemGroupService {
                 }
             }
             //读取数据并返回
-            List<Item> itemList = itemGroupDao.getItemListByGroupId(itemGroup.getId());
-            return Result.ok(OpcUaUtil.opcUaReadNodeIdList(dataSource, itemList, map));
-        } else if (dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_DA_REAL.getValue()) ||
-                dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_HDA_HISTORY.getValue()) ||
+            return Result.ok(OpcUaUtil.opcUaReadNodeIdList(dataSource, allItemList, map));
+        } else if (dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_DA_REAL.getValue())) {
+            if (Blank.isEmpty(dataSource.getIpAddress(), dataSource.getIpUserName(), dataSource.getIpPassword())) {
+                throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据源ip,用户名,密码都不能为空");
+            }
+            //读取数据并返回
+            List<String> itemStrList = itemGroupDao.getItemByIdChange(itemGroup.getId());
+            String[] items = itemStrList.toArray(new String[]{});
+            return Result.ok(OpcDaUtil.opcReadItemListValue(dataSource, items, allItemList, map));
+        } else if (dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_HDA_HISTORY.getValue()) ||
                 dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_AE_ALARMS.getValue())
         ) {
             if (Blank.isEmpty(dataSource.getIpAddress(), dataSource.getIpUserName(), dataSource.getIpPassword())) {
@@ -297,10 +353,9 @@ public class ItemGroupServiceImpl implements ItemGroupService {
                 throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据源ip,用户名,密码都不能为空");
             }
             //读取数据并返回
-            List<String> itemList = itemGroupDao.getItemByIdChange(itemGroup.getId());
-            String[] items = itemList.toArray(new String[]{});
-            List<Item> itemList1 = itemGroupDao.getItemListByGroupId(itemGroup.getId());
-            return Result.ok(KepOpcServerUtil.opcReadItemListValue(dataSource, items, itemList1, map));
+            List<String> itemStrList = itemGroupDao.getItemByIdChange(itemGroup.getId());
+            String[] items = itemStrList.toArray(new String[]{});
+            return Result.ok(KepOpcServerUtil.opcReadItemListValue(dataSource, items, allItemList, map));
         } else {
             return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "目前还没有此种类型的连接方式");
         }

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

@@ -1,7 +1,9 @@
 package com.judong.chuanyiserver.util;
 
 import com.alibaba.fastjson.JSONObject;
+import com.judong.chuanyiserver.entity.DataModel;
 import com.judong.chuanyiserver.entity.DataSource;
+import com.judong.chuanyiserver.entity.Item;
 import com.judong.chuanyiserver.enums.OpcDaDriverEnum;
 import com.judong.chuanyiserver.enums.ResultEnum;
 import com.judong.chuanyiserver.exception.CustomException;
@@ -11,6 +13,8 @@ import org.jinterop.dcom.core.JIVariant;
 import org.openscada.opc.dcom.da.OPCSERVERSTATE;
 import org.openscada.opc.dcom.list.ClassDetails;
 import org.openscada.opc.lib.common.ConnectionInformation;
+import org.openscada.opc.lib.da.Group;
+import org.openscada.opc.lib.da.ItemState;
 import org.openscada.opc.lib.da.Server;
 import org.openscada.opc.lib.da.browser.Branch;
 import org.openscada.opc.lib.da.browser.Leaf;
@@ -286,4 +290,69 @@ public class OpcDaUtil {
         map.put("value", value);
         return map;
     }
+
+    public static List<JSONObject> opcReadItemListValue(DataSource dataSource, String[] items, List<com.judong.chuanyiserver.entity.Item> itemList, Map<String, DataModel> dmMap) {
+        Server server = null;
+        try {
+            server = createServer(dataSource);
+            server.connect();
+            if (null == server.getServerState()) {
+                throw new CustomException(ResultEnum.NOT_FOUND.getRespCode(), "连接失败");
+            }
+            if (OPCSERVERSTATE.OPC_STATUS_RUNNING == server.getServerState().getServerState()) {
+                List<JSONObject> jsonObjectList = new ArrayList<>();
+                Date date = new Date();
+                Group group = server.addGroup();
+                Map<String, Object> map = new HashMap<>();
+                for (com.judong.chuanyiserver.entity.Item item : itemList) {
+                    map.put(item.getItemName(), item.getDescribe());
+                }
+                Map<String, org.openscada.opc.lib.da.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);
+                Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
+                for (org.openscada.opc.lib.da.Item key : resultMap.keySet()) {
+                    String keyId = key.getId();
+                    for (Item item : itemList) {
+                        if (item.getItemReadName().equals(keyId)) {
+                            ItemState itemMap = resultMap.get(key);
+                            Map<String, Object> val = getVal(itemMap.getValue());
+                            JSONObject jsonObject = new JSONObject();
+                            jsonObject.put("dataSourceName", dataSource.getDataSourceName());
+                            jsonObject.put("itemName", item.getItemName());
+                            jsonObject.put("dataType", val.get("javaType").toString());
+                            jsonObject.put("dataValue", val.get("value").toString());
+                            jsonObject.put("createTime", date);
+                            jsonObject.put("describe", map.get(item.getItemName()));
+                            jsonObjectList.add(jsonObject);
+                            break;
+                        }
+                    }
+                }
+
+                jsonObjectList.sort(new Comparator<JSONObject>() {
+                    @Override
+                    public int compare(JSONObject o1, JSONObject o2) {
+                        return o2.getString("itemName").compareTo(o1.getString("itemName"));
+                    }
+                });
+                return jsonObjectList;
+            }
+        } catch (Exception e) {
+            String message = e.getMessage();
+            if (message.contains("0x00000005")) {
+                throw new CustomException(ResultEnum.REQUEST_TIME_OUT.getRespCode(), "用户名或密码错误");
+            }
+            if (message.contains("0x8001FFFF")) {
+                throw new CustomException(ResultEnum.REQUEST_TIME_OUT.getRespCode(), "ip地址不存在");
+            }
+            throw new CustomException(ResultEnum.REQUEST_TIME_OUT.getRespCode(), e.getMessage());
+        } finally {
+            if (Blank.isNotEmpty(server)) {
+                server.dispose();
+            }
+        }
+        return null;
+    }
 }

+ 5 - 4
chuanyi_server/src/main/resources/mapper/ItemGroupDao.xml

@@ -10,7 +10,7 @@
 
     <sql id="item">
         id
-        , item_group_id, item_name, node_index, node_identifier, data_type, `describe`, data_model_id
+        , item_group_id, item_name, item_read_name, node_index, node_identifier, data_type, `describe`, data_model_id
     </sql>
 
     <insert id="addItemGroup" parameterType="com.judong.chuanyiserver.entity.ItemGroup" useGeneratedKeys="true"
@@ -22,10 +22,11 @@
     </insert>
 
     <insert id="addItem">
-        insert into t_item (item_group_id, item_name,node_index,node_identifier,data_type,`describe`,data_model_id)
+        insert into t_item (item_group_id, item_name,
+        item_read_name,node_index,node_identifier,data_type,`describe`,data_model_id)
         VALUES
         <foreach collection="itemList" item="item" index="index" separator=",">
-            (#{itemGroupId},#{item.itemName},#{item.nodeIndex},#{item.nodeIdentifier},#{item.dataType},#{item.describe},#{item.dataModelId})
+            (#{itemGroupId},#{item.itemName},#{item.itemReadName},#{item.nodeIndex},#{item.nodeIdentifier},#{item.dataType},#{item.describe},#{item.dataModelId})
         </foreach>
     </insert>
 
@@ -126,7 +127,7 @@
     </select>
 
     <select id="getItemByIdChange" resultType="java.lang.String">
-        select item_name
+        select item_read_name
         from t_item
         where item_group_id = #{itemGroupId}
     </select>