• 指令数据采集(六)--指令的执行


    执行也是需要进行循环递归执行,类似一个树的形状,详见代码片段。TL1Connection 为执行的连接接口,List<Instruction> 为需要执行的指令集

     1 /**
     2      * 执行指令集
     3      *
     4      * @param iConnect
     5      * @param instructions
     6      */
     7     @Override
     8     public void executeInstruction(TL1Connection iConnect, List<Instruction> instructions) {
     9         for(Instruction instruction:instructions){
    10             logInfo = instruction.getInstName() + ",执行的指令:" + instruction.getInstNo() + "开始执行!";
    11             eventLogService.insertEventLogNew(instruction.getWoId(), logInfo,EventLog.NO_EXCEPTION, "", "");
    12             
    13             this.executeInstruction(iConnect,instruction);
    14             
    15             logInfo = instruction.getInstName() + ",执行的指令:" + instruction.getInstNo() + "执行完毕!";
    16             eventLogService.insertEventLogNew(instruction.getWoId(), logInfo,EventLog.NO_EXCEPTION, "", "");
    17         }
    18     }
    View Code

    执行当前的一条指令,已经循环执行子指令

     1 /**
     2      * 执行一个指令 包括子指令
     3      * @param iConnect
     4      * @param instructions
     5      */
     6     @Override
     7     public void executeInstruction(TL1Connection iConnect, Instruction instructions) {
     8         logger.debug("<><><执行命令><><><>" + instructions.getInstNo());
     9         logger.debug("<><><执行命令入参><><><>" + instructions.getParamsInput());
    10         //这边需要优化的地方有两点
    11         //1.根据执行的结果拼装一个 Insert 语句 这边需要一次网络访问
    12         //2.远程服务器执行也需要一次网络访问
    13         //两次网络访问的时间是叠加的
    14         //执行之前判断条件 当前的指令是否要执行
    15         try {
    16             setInstructionByCondition(instructions);
    17             List<Map<String, String>> executeInst = sendInstruction(iConnect, instructions);
    18             //在下面的方法中 处理insert语句
    19             //处理成对应的参数的入参形式 提供给下一条命令使用
    20             packageExecuteReusltCurrentIns(instructions, executeInst);
    21             //正常执行时候的日志
    22             EventLog eventLog = new EventLog(0, 0, instructions.getWoId(), 0,
    23                     instructions.getInputInstruction()==null?"执行的指令为:空":"执行的指令:"+instructions.getInputInstruction().toString(), 0,
    24                     instructions.getParamsInput()==null?"输入的参数为:空":instructions.getParamsInput().toString(), "","");
    25             //进行日志记录
    26             eventLogService.insertEventLog(eventLog);
    27         }catch (Exception e) {
    28             //日志记录 执行异常的时候的日志
    29             EventLog eventLog = new EventLog(0, 0, instructions.getWoId(),0,
    30                     instructions.getInputInstruction()==null?"执行的指令为:空":"执行的指令为: "+instructions.getInputInstruction().toString()+
    31                     "抛出的异常信息"+e.getMessage(), 0,
    32                     instructions.getParamsInput()==null?"输入的参数为:空":"输入的参数为: "+instructions.getParamsInput().toString(), "","");
    33             //进行日志记录
    34             eventLogService.insertEventLog(eventLog);
    35             logger.error(e.getMessage());
    36         }
    37 
    38         /**
    39         List<List<Param>> paramListOutput = pakageExecuteResult(instructions, executeInst);
    40         logger.debug("<><><指令关联的参数><><><>" + paramListOutput.toString());
    41 
    42         //需要复制的指令
    43         List<Instruction> instructionListRelation = null;
    44         if(instructions.getChildren()!=null&&instructions.getChildren().size()>0) {
    45             instructionListRelation = (List<Instruction>) ((ArrayList<Instruction>) instructions.getChildren()).clone();
    46         }
    47         if (instructionListRelation != null && !instructionListRelation.isEmpty()) {
    48             //上条命令执行的出参,作为当前这条命令的出参
    49             //Instruction instructionChild = instructionListRelation.get(0);
    50             //根据返回的参数的多少 动态创建子命令
    51             //上一条命令的出参 作为下一条命令的入参
    52             //instruction.setParamsInput(paramListOutput);
    53             //先清空关联的指令
    54             if(instructions.getChildren()!=null) {
    55                 instructions.getChildren().removeAll(instructions.getChildren());
    56             }
    57             //复制创建子命令 然后开始重置
    58             cloneChildInstruction(instructionListRelation,executeInst.size(),
    59                                     paramListOutput,instructions.getChildren(),
    60                                     instructions.getListsOutputResult());
    61             logger.debug("<><><克隆的子指令 根据返回的结果数 ><" + (executeInst.size()) + "><><>" + instructionListRelation.toString());
    62         }
    63          **/
    64         //递归执行子命令
    65         if(instructions.getChildren()!=null&&!instructions.getChildren().isEmpty()) {
    66             for (Instruction execIns : instructions.getChildren()) {
    67                 logInfo = execIns.getInstName() + ",执行的指令:" + execIns.getInstNo() + "开始执行!";
    68                 eventLogService.insertEventLogNew(execIns.getWoId(), logInfo,EventLog.NO_EXCEPTION, "", "");
    69                 
    70                 executeInstruction(iConnect, execIns);
    71                 
    72                 logInfo = execIns.getInstName() + ",执行的指令:" + execIns.getInstNo() + "执行完毕!";
    73                 eventLogService.insertEventLogNew(execIns.getWoId(), logInfo,EventLog.NO_EXCEPTION, "", "");
    74             }
    75         }
    76     }
    View Code

    进行条件判断,他的子指令是否需要进行执行

     1 /**
     2      * 指令使用条件控制
     3      * @param currInstruction 当前的指令
     4      */
     5     public void setInstructionByCondition(Instruction currInstruction){
     6         //处理条件
     7         GroupCondition groupCondition = iGroupConditionServiceImpl.packageGroupCondition(currInstruction);
     8         GroupConditionExector groupConditionExector = new GroupConditionExector(currInstruction.getParamOutputParent());
     9         //处理条件 判断为null的情况以及判断父指令没有返回值的情况
    10         if(groupCondition!=null&&currInstruction.getParamOutputParent()!=null&&
    11                 !currInstruction.getParamOutputParent().isEmpty()) {
    12             boolean flag = groupConditionExector.execute(groupCondition);
    13             currInstruction.setIsRun(flag);
    14         }
    15     }
    View Code

    连接器,执行的结果

     1 /**
     2      * 返回的指令结果
     3      *
     4      * @param instruction
     5      * @return
     6      */
     7     public List<Map<String, String>> sendInstruction(TL1Connection iConnect, Instruction instruction) {
     8         List<Map<String, String>> instructionMap = new ArrayList<Map<String, String>>();
     9         try {
    10             if(instruction.isRun()) {
    11                 //判断当前的指令是否要执行
    12                 instructionMap = iConnect.sendCommand(instruction);
    13             }
    14         }finally {
    15             TL1ConnectionPool tl1ConnectionPool = TL1ConnectionPool.getInstance();
    16             InterfaceObject interfaceObject = iConnect.getObject();
    17             try {
    18                 tl1ConnectionPool.closeConnection(iConnect,interfaceObject);
    19             } catch (Exception e) {
    20                 e.printStackTrace();
    21             }
    22         }
    23 
    24 //        } finally
    25 //        {
    26 //            TL1ConnectionPool tl1ConnectionPool = TL1ConnectionPool.getInstance();
    27 //            InterfaceObject interfaceObject = iConnect.getObject();
    28 //            try {
    29 //                tl1ConnectionPool.closeConnection(iConnect,interfaceObject);
    30 //            } catch (Exception e) {
    31 //                e.printStackTrace();
    32 //            }
    33 //        }
    34         return instructionMap;
    35     }
    View Code

    将当前指令的返回的N条结果对应到克隆创建的N条指令的入参当中去

     1 /**
     2      * 该方法用于处理指令的返回结果
     3      * @param instruction
     4      * @param executeInst
     5      */
     6     public void packageExecuteReusltCurrentIns(Instruction instruction, List<Map<String, String>> executeInst){
     7         logger.debug("<><><telnet之后返回的结果><><><>" + executeInst.toString());
     8         List<List<Param>> listsParam = new ArrayList<List<Param>>();
     9         //这边是每条指令的返回值的key 但返回的是多行的数据 这边只能够对应的是一条数据
    10         //所以返回数据集就不在这边设置了
    11         List<Param> paramListOutputValue = instruction.getParamsOutput();
    12         String [] sqlArray = new String[executeInst.size()];
    13         int  sqlArrayCount = 0;
    14         //先清空所有的sql
    15         //InstructionExeSql.stringSqlStack.clear();
    16         //处理当前的输出值
    17         for (Map<String, String> mapOutput : executeInst) {
    18             List<Param> listsRow = new ArrayList<Param>();
    19             for (Param param : paramListOutputValue) {
    20                 ParamKey paramKey = param.getParamKey();
    21                 //新建一个
    22                 Param paramNew  = new Param();
    23                 paramNew.setParamKey(paramKey);
    24                 if (StringUtils.isNotBlank(mapOutput.get(paramKey.getKeyDesc()))) {
    25                     ParamValue paramValue = new ParamValue();
    26                     paramValue.setValue(mapOutput.get(paramKey.getKeyDesc()));
    27                     //赋值给当前的对象 新建的对象
    28                     paramNew.setParamValue(paramValue);
    29                 }
    30                 listsRow.add(paramNew);
    31             }
    32             //加载全局的设置
    33             if(this.wholeSituation!=null&&!this.wholeSituation.isEmpty()){
    34                 listsRow.addAll(this.wholeSituation);
    35             }
    36             //搞一个sql 装载命令
    37             String sql = this.getSqlString(listsRow);
    38             sqlArray[sqlArrayCount++]=sql;
    39             //InstructionExeSql.stringSqlStack.add(sql);
    40             logger.debug("<><><获得的sql><><><>" + sql);
    41             listsParam.add(listsRow);
    42         }
    43         //执行sql
    44         //InstructionExeSql.stringSqlStack.size();
    45         sqlService.exectorSqlBatch(sqlArray);
    46         logger.debug("<><><处理出参><><><>" + paramListOutputValue.toString());
    47         logger.debug("<><><执行之后的出参值><><><>" + listsParam.toString());
    48         //设置出参的结果
    49         instruction.setListsOutputResult(listsParam);
    50         //克隆指令
    51         cloneChildInstrucion(instruction);
    52     }
    View Code

    指令克隆

     1 public void cloneChildInstrucion(Instruction instructionParent) {
     2         //复制之后的个数
     3         List<Instruction> instructionListChild = new ArrayList<Instruction>();
     4         List<List<Param>> listListParamResult = instructionParent.getListsOutputResult();
     5         //当前子指令的个数
     6         List<Instruction> instructionListChildCurrent = instructionParent.getChildren();
     7         //需要拷贝的个数 默认为0个
     8         int cloneChildCount = 0;
     9         if (listListParamResult != null) {
    10             cloneChildCount = listListParamResult.size();
    11         }
    12         try {
    13             //含有子指令的时候进行拷贝处理
    14             if(instructionListChildCurrent!=null) {
    15                 for (Instruction instruction : instructionListChildCurrent) {
    16                     for (int cloneChildStart = 0; cloneChildStart < cloneChildCount; cloneChildStart++) {
    17                         Instruction instructionChild = instruction.clone();
    18                         //设置父指令的结果 分配到每个指令当中
    19                         instructionChild.setParamOutputParent(listListParamResult.get(cloneChildStart));
    20                         instructionListChild.add(instructionChild);
    21                     }
    22                 }
    23                 //重新设置子指令
    24                 if (!instructionListChild.isEmpty()) {
    25                     for(Instruction instChid:instructionListChild){
    26                         //调整参数 出入参数设置
    27                         List<Param> paramList = dealInstructionInput(instChid.getParamOutputParent(),instChid.getInstructionRelaParamList());
    28                         instChid.setParamsInput(paramList);
    29                     }
    30                     instructionParent.setChildren(instructionListChild);
    31                 }
    32             }
    33         } catch (CloneNotSupportedException e) {
    34             e.printStackTrace();
    35         }
    36     }
    View Code
  • 相关阅读:
    广州数控系统数据采集进行中,广数
    heidainhen 海德汉 数据采集
    新代 SYNTEC 数据采集实战
    马扎克MAZAK免授权数据采集
    西门子数控,已授权的机器,可用OPC UA的方式来采集,数据很丰富。
    打破局限,西门子数控免授权数据采集实战
    三合一 DNC系统,(fanuc 三菱 兄弟),(上传,下发,删除)NC程序.
    批量删除多个相同格式内容的Excel表格的列
    批量将多个相同Excel表格内容合并到一个Excel表格的sheet工作簿当中。
    Excel2010表格内容被加密,无法编辑内容。
  • 原文地址:https://www.cnblogs.com/binarysheep/p/7441922.html
Copyright © 2020-2023  润新知