Sfoglia il codice sorgente

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

ljh 2 anni fa
parent
commit
4534642b2a

+ 40 - 62
chuanyi_server/src/main/java/com/judong/chuanyiserver/config/OpcAsyncTask.java

@@ -102,75 +102,53 @@ public class OpcAsyncTask {
         log.info("OpcServerUa:opc.tcp://" + serverInformation.getIpAddress() + ":" + serverInformation.getIpPort() + "停止读取数据");
     }
 
-    public void runItemGroup(Integer id) {
-        ItemGroup itemGroup = itemGroupDao.getItemGroupById(id);
-        DataSource dataSource = dataSourceDao.getDataSourceById(itemGroup.getDataSourceId());
-        DataSourceType dataSourceType = dataSourceDao.getDataSourceTypeById(dataSource.getTypeId());
-        dataSource = OpcUtil.convertPassword(dataSource);
-        if (dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_UA_REAL.getValue()) ||
-                dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_UA_HISTORY.getValue())) {
-            if (Blank.isEmpty(dataSource.getIpAddress(), dataSource.getIpPort(), dataSource.getIsAnonymous())) {
-                throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据源ip,端口号,匿名方式都不能为空");
-            }
-            if (dataSource.getIsAnonymous() == ConstantStr.NOT_ANONYMOUS) {
-                if (Blank.isEmpty(dataSource.getIpUserName(), dataSource.getIpPassword())) {
-                    throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "选择不匿名方式,需要填写用户名和密码");
-                }
-            }
-            //读取数据并保存
-        } 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())
-        ) {
-            if (Blank.isEmpty(dataSource.getIpAddress(), dataSource.getIpUserName(), dataSource.getIpPassword())) {
-                throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据源ip,用户名,密码都不能为空");
-            }
-            //读取数据并保存
-        } 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,用户名,密码都不能为空");
+    //异步读取kepserver
+    public void runKepServer(ItemGroup itemGroup, DataSource dataSource) {
+        Integer id = itemGroup.getId();
+        Server server = KepOpcServerUtil.createServer(dataSource);
+        List<String> itemList = itemGroupDao.getItemByIdChange(id);
+        String[] items = itemList.toArray(new String[]{});
+        try {
+            server.connect();
+            if (null == server.getServerState()) {
+                throw new CustomException(ResultEnum.NOT_FOUND.getRespCode(), "连接失败");
             }
-            //读取数据并保存
-            Server server = KepOpcServerUtil.createServer(dataSource);
-            List<String> itemList = itemGroupDao.getItemByIdChange(id);
-            String[] items = itemList.toArray(new String[]{});
-            try {
-                server.connect();
-                if (null == server.getServerState()) {
-                    throw new CustomException(ResultEnum.NOT_FOUND.getRespCode(), "连接失败");
-                }
-                if (OPCSERVERSTATE.OPC_STATUS_RUNNING == server.getServerState().getServerState()) {
-                    Boolean flage = true;
-                    while (flage) {
-                        List<RawData> rawDataList = new ArrayList<>();
-                        Date date = new Date();
-                        Group group = server.addGroup();
-                        Map<String, Item> itemResult = group.addItems(items);
-                        Set itemSet = new HashSet(itemResult.values());
-                        Item[] itemArr = new Item[itemSet.size()];
-                        itemSet.toArray(itemArr);
-                        Map<Item, ItemState> resultMap = group.read(true, itemArr);
-                        for (Item key : resultMap.keySet()) {
-                            ItemState itemMap = resultMap.get(key);
-                            Map<String, Object> val = getVal(itemMap.getValue());
-                            rawDataList.add(new RawData(itemGroup.getDataSourceId(), key.getId(), val.get("javaType").toString(), val.get("value").toString(), date));
-                        }
-                        addRawDataList(rawDataList);
-                        Thread.sleep(itemGroup.getModeValue() * 1000);
-                        flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
-                        if (Blank.isEmpty(flage)) {
-                            flage = false;
-                        }
+            if (OPCSERVERSTATE.OPC_STATUS_RUNNING == server.getServerState().getServerState()) {
+                Boolean flage = true;
+                while (flage) {
+                    List<RawData> rawDataList = new ArrayList<>();
+                    Date date = new Date();
+                    Group group = server.addGroup();
+                    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()) {
+                        ItemState itemMap = resultMap.get(key);
+                        Map<String, Object> val = getVal(itemMap.getValue());
+                        rawDataList.add(new RawData(itemGroup.getDataSourceId(), key.getId(), val.get("javaType").toString(), val.get("value").toString(), date));
+                    }
+                    addRawDataList(rawDataList);
+                    Thread.sleep(itemGroup.getModeValue() * 1000);
+                    flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                    if (Blank.isEmpty(flage)) {
+                        flage = false;
                     }
                 }
-            } catch (Exception e) {
-                e.printStackTrace();
             }
-        } else {
-            throw new CustomException(ResultEnum.SERVER_ERROR.getRespCode(), "目前还没有此种类型的连接方式");
+        } catch (Exception e) {
+            e.printStackTrace();
+            redisUtil.del(ConstantStr.ITEM_GROUP + id);
+            itemGroupDao.runItemGroupById(id, ConstantStr.STOP_IT);
         }
     }
 
+    /**
+     * 新增原始数据
+     *
+     * @param rawDataList
+     */
     public void addRawDataList(List<RawData> rawDataList) {
         if (Blank.isNotEmpty(rawDataList)) {
             rawDataDao.addRawDataList(rawDataList);

+ 81 - 8
chuanyi_server/src/main/java/com/judong/chuanyiserver/service/impl/ItemGroupServiceImpl.java

@@ -1,19 +1,25 @@
 package com.judong.chuanyiserver.service.impl;
 
 import com.judong.chuanyiserver.config.OpcAsyncTask;
+import com.judong.chuanyiserver.dao.DataSourceDao;
 import com.judong.chuanyiserver.dao.ItemGroupDao;
-import com.judong.chuanyiserver.entity.Item;
-import com.judong.chuanyiserver.entity.ItemGroup;
+import com.judong.chuanyiserver.entity.*;
+import com.judong.chuanyiserver.enums.DataSourceTypeEnum;
 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.Group;
+import org.openscada.opc.lib.da.ItemState;
+import org.openscada.opc.lib.da.Server;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.List;
+import java.util.*;
+
+import static com.judong.chuanyiserver.util.KepOpcServerUtil.getVal;
 
 @Service
 @Transactional
@@ -31,6 +37,9 @@ public class ItemGroupServiceImpl implements ItemGroupService {
     @Resource
     private RedisUtil redisUtil;
 
+    @Resource
+    private DataSourceDao dataSourceDao;
+
     @Override
     public synchronized Result addItemGroup(ItemGroup itemGroup) {
         String userId = userUtil.getCurrentUserId();
@@ -132,13 +141,42 @@ public class ItemGroupServiceImpl implements ItemGroupService {
     @Override
     public Result runItemGroupById(Integer id, Integer runState) {
         ItemGroup itemGroup = itemGroupDao.getItemGroupById(id);
+        DataSource dataSource = dataSourceDao.getDataSourceById(itemGroup.getDataSourceId());
+        DataSourceType dataSourceType = dataSourceDao.getDataSourceTypeById(dataSource.getTypeId());
+        dataSource = OpcUtil.convertPassword(dataSource);
         if (runState == ConstantStr.START_UP) {
             if (itemGroup.getRunState() == ConstantStr.START_UP) {
                 return Result.ok("此item组已处于运行中");
             }
             redisUtil.set(ConstantStr.ITEM_GROUP + id, true);
-            //异步启动
-            opcAsyncTask.runItemGroup(id);
+            if (dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_UA_REAL.getValue()) ||
+                    dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_UA_HISTORY.getValue())) {
+                if (Blank.isEmpty(dataSource.getIpAddress(), dataSource.getIpPort(), dataSource.getIsAnonymous())) {
+                    throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据源ip,端口号,匿名方式都不能为空");
+                }
+                if (dataSource.getIsAnonymous() == ConstantStr.NOT_ANONYMOUS) {
+                    if (Blank.isEmpty(dataSource.getIpUserName(), dataSource.getIpPassword())) {
+                        throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "选择不匿名方式,需要填写用户名和密码");
+                    }
+                }
+                //读取数据并保存
+            } 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())
+            ) {
+                if (Blank.isEmpty(dataSource.getIpAddress(), dataSource.getIpUserName(), dataSource.getIpPassword())) {
+                    throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据源ip,用户名,密码都不能为空");
+                }
+                //读取数据并保存
+            } 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,用户名,密码都不能为空");
+                }
+                //异步读取数据并保存
+                opcAsyncTask.runKepServer(itemGroup, dataSource);
+            } else {
+                throw new CustomException(ResultEnum.SERVER_ERROR.getRespCode(), "目前还没有此种类型的连接方式");
+            }
             itemGroupDao.runItemGroupById(id, runState);
             return Result.ok("启动成功");
         }
@@ -152,6 +190,41 @@ public class ItemGroupServiceImpl implements ItemGroupService {
 
     @Override
     public Result getItemValueById(Integer id) {
-        return null;
+        ItemGroup itemGroup = itemGroupDao.getItemGroupById(id);
+        DataSource dataSource = dataSourceDao.getDataSourceById(itemGroup.getDataSourceId());
+        DataSourceType dataSourceType = dataSourceDao.getDataSourceTypeById(dataSource.getTypeId());
+        dataSource = OpcUtil.convertPassword(dataSource);
+        if (dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_UA_REAL.getValue()) ||
+                dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_UA_HISTORY.getValue())) {
+            if (Blank.isEmpty(dataSource.getIpAddress(), dataSource.getIpPort(), dataSource.getIsAnonymous())) {
+                throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据源ip,端口号,匿名方式都不能为空");
+            }
+            if (dataSource.getIsAnonymous() == ConstantStr.NOT_ANONYMOUS) {
+                if (Blank.isEmpty(dataSource.getIpUserName(), dataSource.getIpPassword())) {
+                    throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "选择不匿名方式,需要填写用户名和密码");
+                }
+            }
+            //读取数据并返回
+            return null;
+        } 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())
+        ) {
+            if (Blank.isEmpty(dataSource.getIpAddress(), dataSource.getIpUserName(), dataSource.getIpPassword())) {
+                throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据源ip,用户名,密码都不能为空");
+            }
+            //读取数据并返回
+            return null;
+        } 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,用户名,密码都不能为空");
+            }
+            //读取数据并返回
+            List<String> itemList = itemGroupDao.getItemByIdChange(itemGroup.getId());
+            String[] items = itemList.toArray(new String[]{});
+            return Result.ok(KepOpcServerUtil.opcReadItemListValue(dataSource, items));
+        } else {
+            return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "目前还没有此种类型的连接方式");
+        }
     }
 }

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

@@ -240,43 +240,39 @@ public class KepOpcServerUtil {
         return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
     }
 
-    public static Result opcReadItemListValue(Server server, String[] items) {
+    public static List<JSONObject> opcReadItemListValue(DataSource dataSource, String[] items) {
+        Server server = KepOpcServerUtil.createServer(dataSource);
         try {
+            server.connect();
             if (null == server.getServerState()) {
-                return Result.no(ResultEnum.NOT_FOUND.getRespCode(), "连接失败");
+                throw new CustomException(ResultEnum.NOT_FOUND.getRespCode(), "连接失败");
             }
             if (OPCSERVERSTATE.OPC_STATUS_RUNNING == server.getServerState().getServerState()) {
-                List<RawData> rawDataList = new ArrayList<>();
+                List<JSONObject> jsonObjectList = new ArrayList<>();
                 Date date = new Date();
                 Group group = server.addGroup();
-                Map<String, Item> itemResult = group.addItems(items);
+                Map<String, org.openscada.opc.lib.da.Item> itemResult = group.addItems(items);
                 Set itemSet = new HashSet(itemResult.values());
-                Item[] itemArr = new Item[itemSet.size()];
+                org.openscada.opc.lib.da.Item[] itemArr = new org.openscada.opc.lib.da.Item[itemSet.size()];
                 itemSet.toArray(itemArr);
-                Map<Item, ItemState> resultMap = group.read(true, itemArr);
-                for (Item key : resultMap.keySet()) {
+                Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
+                for (org.openscada.opc.lib.da.Item key : resultMap.keySet()) {
                     ItemState itemMap = resultMap.get(key);
                     Map<String, Object> val = getVal(itemMap.getValue());
-                    rawDataList.add(new RawData(1, key.getId(), val.get("javaType").toString(), val.get("value").toString(), date));
+                    JSONObject jsonObject = new JSONObject();
+                    jsonObject.put("dataSourceName", dataSource.getDataSourceName());
+                    jsonObject.put("itemName", key.getId());
+                    jsonObject.put("dataType", val.get("javaType").toString());
+                    jsonObject.put("dataValue", val.get("value").toString());
+                    jsonObject.put("createTime", date);
+                    jsonObjectList.add(jsonObject);
                 }
-
-                //循环读值需要使用到的
-                final AccessBase access = new SyncAccess(server, 1000);
-                //开始读值
-                access.bind();
-                //停止读值
-                access.unbind();
-//                Iterator<com.judong.chuanyiserver.entity.Item> iterator = itemList.iterator();
-//                while (iterator.hasNext()) {
-//                    Item item = group.addItem(iterator.next().getItemName());
-//                    Map<String, Object> value = getVal(item.read(true).getValue());
-//                }
-                return Result.ok("");
+                return jsonObjectList;
             }
         } catch (Exception e) {
-            return Result.no(ResultEnum.REQUEST_TIME_OUT.getRespCode(), e.getMessage());
+            e.printStackTrace();
         }
-        return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
+        return null;
     }
 
     /**