Exemplo n.º 1
0
        // 线程名/流程名/设备ID, 忽略返回值

        protected int do_New(clsFaim3 v_faim3, DAL_CommData v_dao_comm, string vflowName)
        {
            _faim3    = v_faim3;
            _dao_comm = v_dao_comm;
            // 无流程名, 则取类名
            _flowName = (string.IsNullOrEmpty(vflowName)) ? this.GetType().Name : vflowName;
            #region                                         // dict_Threads 线程池

            if (_faim3.dict_Threads.ContainsKey(_flowName)) // 存在key
            {
                FACC.F_Log.Debug_1("do_New()", string.Format("--->>>> {0}流程/设备存在", _flowName));
                return(-1);                  //
            }
            clsThread _en = new clsThread(); // 线程消息
            _en.Info          = new clsThreadInfo();
            _en.Name          = _flowName;
            _en.Info.flowName = _flowName;
            // 专用线程代理   dict_Threads.Add
            _en.Del = new System.Threading.ThreadStart(do_Sub_While); // 实例化代理

            _faim3.dict_Threads.Add(_flowName, _en);
            #endregion
            F_Log.Debug_1("do_New()", string.Format("初始化 流程:{0}", _flowName));
            return(0);
        }
Exemplo n.º 2
0
        bool doPartA(clsFaim3 v_faim3, DAL_CommData v_dao_comm, string vflowName)
        {
            string  _cls_Name = "DAL_PartA";
            clsLogs _logs     = new clsLogs();
            clsFlow _flow     = v_faim3.dict_Flow[vflowName];
            string  _currCase = _flow.nextCase;

            F_Log.Debug_1(_cls_Name, String.Format("流程:{0}: 步骤:{1}",
                                                   vflowName, _currCase));
            _flow.alartCase = _currCase;
            if (!v_faim3.dict_CaseState.ContainsKey(_currCase))
            {
                //'A: 步骤.txt 文件中没有注册该步骤参数
                _logs.No   = v_faim3.dict_CaseState[_currCase].No;
                _logs.Name = (_currCase + "_没注册 步骤");
                _flow.RunLog.Add(_logs);
                F_Log.Debug_1(_cls_Name, string.Format("--->>>> 没注册 流程:{0}: 步骤:{1}", vflowName, _currCase));
                return(true);
            }
            clsCaseState _en_State = v_faim3.dict_CaseState[_currCase];

            if ((_en_State.Times > 0))                                                            // 逻辑模型: 执行次数至少有一次, 如 <1, 则不执行AR(),  只执行判断, 以实现流程在等待联动消息的逻辑
            {
                F_Delegate.delCasePartA_R _doPartA = _dao_comm.dict_Methods.doPartA_R[_currCase]; // 通过代理, 从步骤集中取出一个步骤, 执行其方法()
                //
                _logs.No   = v_faim3.dict_CaseState[_currCase].No;
                _logs.Name = _currCase;
                _flow.RunLog.Add(_logs);
                _doPartA(v_faim3, v_dao_comm);
                // AR
                // Delay
                if ((_en_State.Delay > -1))//
                {
                    Thread.Sleep(_en_State.Delay);
                }
                //
            }
            if (string.IsNullOrEmpty(_en_State.No))//逻辑模型:  无BT报警号 检测的步骤, 只执行 AR(), 不执行AR(), 实现两个 AR() 串联(直通)的逻辑
            {
                doGet_NextCase(_faim3, ref _flow, _currCase);
            }
            else
            {
                // 逻辑模型:  无BT报警号 无报警延时, 只执行 AR(), 不执行AR(), 实现两个 AR() 串联(直通)的逻辑
                string _testCase = (_currCase + F_Const.fix_CaseT);
                if (_flow.nextCase == _flow.currCase)
                {
                    _flow.alartCase = _currCase;
                    _flow.nextCase  = _testCase; // ==> Test  当前流程名 + _T
                    F_Log.Debug_1(_cls_Name, String.Format("取到 测试步骤名:{0}", _flow.nextCase));
                }
            }
            return(true);
        }
Exemplo n.º 3
0
        // 文件名 / 命名空间 / 类名
        static T doCreateInstance_byFile <T>(string vFn, string nsName, string clsName)
        {
            string _fn = vFn;

            _fn = do_GetFullFileName(_fn);
            if (!File.Exists(vFn))
            {
                F_Log.Debug_1("clsTool_ASM", string.Format("--->>>> 02 不存在 文件_{0}", vFn));
                return(default(T));
            }
            string _name = nsName + "." + clsName;

            return(do_CreateInstance_byFile <T>(_name, _fn));
        }
Exemplo n.º 4
0
        static string do_GetFullFileName(string vFn)
        {
            string _rec = vFn;

            if (!vFn.Contains(":"))
            {
                _rec = AppDomain.CurrentDomain.BaseDirectory + vFn;
            }
            if (!File.Exists(vFn))
            {
                F_Log.Debug_1("clsTool_ASM", string.Format("--->>>> 03 不存在 文件_{0}", vFn));
                return(null);
            }
            return(_rec);
        }
Exemplo n.º 5
0
        //protected void btOUT(int vDevNo, int vBit)
        //{
        //    doSend(_faim3, vDevNo, vBit, (eHL)(vBit > 0 ? 1 : 0), _sect_iDev);
        //}
        //'计划中取下一流程名, 用于一步延时后进行下一步
        //'直接以值正(1)/负(0)决定输出1/0  _do2_AR(_devNo, 6, eSwitch.On)
        //protected void doSend(int vDevNo, int vBit, eHL val)
        //{
        //    btOUT(_faim3, vDevNo, vBit, val, _sect_iDev);
        //}
        //'直接以位置正(1)/负(0)决定输出1/0  _do2_AR(_devNo, -6)
        public static void doGet_NextCase(clsFaim3 _faim3, ref clsFlow _flow, string vCaseName)
        {
            string _alartCase = _flow.alartCase;
            //if (_faim3.dict_CaseState.ContainsKey(_alartCase)) return;  //
            clsCaseState _caseState = _faim3.dict_CaseState[_alartCase];

            if (_flow.dictCases.ContainsKey(vCaseName))
            {
                _caseState.endMode = eCaseFlag.Next;
                _flow.nextCase     = _flow.dictCases[vCaseName].nextCase;
            }
            else// '流程结束
            {
                F_Log.Debug_1("DAL_Part", String.Format("--->>>> {0} 没有指定下一个步骤名", vCaseName));
                _caseState.endMode = eCaseFlag.Exist;
                _flow.nextCase     = "Free";
            }
        }
Exemplo n.º 6
0
        // from : file  命名空间.类名 / faim3 / dao / new(形参:用户类名)
        static T do_CreateInstance_byName_Para <T>(string vName, clsFaim3 v_faim3, DAL_CommData v_dao_comm, string userClassName)
        {
            object obj = null;
            Type   vT  = Type.GetType(vName);

            obj = Activator.CreateInstance(
                vT,
                new object[] { v_faim3, v_dao_comm, userClassName });
            T _en = (T)obj;//

            if (_en == null)
            {
                F_Log.Debug_1("clsTool_ASM", string.Format("--->>>> 04 未创建对象_{0} {1}", vName, userClassName));
            }
            else
            {
                F_Log.Debug_1("clsTool_ASM", string.Format("成功创建对象_{0}", _en.GetType().Name));
            }
            return(_en);
        }
Exemplo n.º 7
0
        static T do_CreateInstance <T>(
            string vFn, string vName,
            clsFaim3 vFaim3, string userClassName)
        {
            if (!File.Exists(vFn))
            {
                return(default(T));
            }
            byte[]   _buf = File.ReadAllBytes(vFn);
            Assembly _asm = Assembly.Load(_buf);

            //Assembly _asm = Assembly.LoadFrom(vFile);
            object obj = null;

            if (string.IsNullOrEmpty(userClassName))
            {
                obj = _asm.CreateInstance(vName, false);
            }
            else
            {
                Type vT = Type.GetType(vName);
                obj = Activator.CreateInstance(
                    vT,
                    new object[] { vFaim3, userClassName });
            }
            T _en = (T)obj;//

            if (_en == null)
            {
                F_Log.Debug_1("clsTool_ASM", string.Format("!! 未创建对象_{0}", vName));
            }
            else
            {
                F_Log.Debug_1("clsTool_ASM", string.Format("成功创建对象_{0}", _en.GetType().Name));
            }

            return(_en);
        }
Exemplo n.º 8
0
        // 文件名.命名空间 / 类名
        static T do_CreateInstance_byFile <T>(string vName, string vFn)
        {
            if (!File.Exists(vFn))
            {
                F_Log.Debug_1("clsTool_ASM", string.Format("--->>>> 05 文件不存在_{0}{1}", vName, vFn));
                return(default(T));
            }
            byte[]   _buf = File.ReadAllBytes(vFn);
            Assembly _asm = Assembly.Load(_buf);
            object   obj  = null;

            obj = _asm.CreateInstance(vName, false);
            T _en = (T)obj;//

            if (_en == null)
            {
                F_Log.Debug_1("clsTool_ASM", string.Format("--->>>> 06 未创建对象_{0}{1}", vName, vFn));
                System.Windows.Forms.MessageBox.Show(string.Format("--->>>> 06 未创建对象_{0}{1}", vName, vFn));
            }
            //else
            //    F_Log.Debug_1("clsTool_ASM", string.Format("成功创建对象_{0}", _en.GetType().Name));
            return(_en);
        }
Exemplo n.º 9
0
        static void __NG(clsFaim3 _faim3, DAL_CommData _dao_comm, string _flowName, string _caseName)
        {
            if (_flowName == "DAL_Buttons")
            {
                return;
            }
            clsFlow _flow      = _faim3.dict_Flow[_flowName];
            string  _alartCase = _flow.alartCase;
            //if (!_faim3.dict_CaseState.ContainsKey(_alartCase)) return;  //
            clsCaseState _caseState = _faim3.dict_CaseState[_alartCase];
            Dictionary <string, clsCaseChildInfo> _dictCaseChildInfo = _caseState.dict_CaseChildInfo;

            if (!_dictCaseChildInfo.ContainsKey(_NG_D))
            {
                return; // 指定步骤无此部份指令
            }
            int _lineStart = _dictCaseChildInfo[_NG_D].lineStart;

            if (_lineStart < 0)
            {
                return;                  // 条件:没有指定的结构块起始行号
            }
            _do_WaitLine(_faim3, _dao_comm, _flowName, eWF_State.JMP, _lineStart);
            if (_faim3.isEmergency > 0)
            {
                return;
            }
            #region // 开始执行

            clsDevTestBits _line = _faim3.lst_DevTestBits[_lineStart];
            if (_line.isDebug == 1)                   /*#*/
            {
                if (_faim3.dict_KV["isDebug"] != "1") // 非 debug 状态下,不运行 debug 行  cfgDev_Cards.xls
                {
                    return;
                }
            }
            //string _line_vName = _line.vName;
            if (_flow.dictCases.ContainsKey(_line.vName) ||
                _line.vName.ToUpper().Trim() == "NEXT" ||
                _line.vName.ToUpper().Trim() == "NEXTCASE") // 5. 转向目标正确
            {
                _flow.Tag = "GOTO_NG";                      //  设NG跳转标志
                if (_flow.NGtimes == 0)                     // 首次,初始设次数
                {
                    _flow.NGtimes = Convert.ToInt32(string.IsNullOrEmpty(_line.HL) ? "1" : _line.HL);
                }

                if (_flow.NGtimes < 2) // 到NG次数, 则转向
                {
                    _flow.NGtimes      = 0;
                    _caseState.endMode = eCaseFlag.NG;
                    if (_line.vName.ToUpper().Trim() == "NEXT" ||
                        _line.vName.ToUpper().Trim() == "NEXTCASE")            // 转向下一步骤 NestCase 的第一行号
                    {
                        _flow.nextCase = _flow.dictCases[_alartCase].nextCase; // 设跳转步骤名
                    }
                    else
                    {
                        _flow.nextCase = _line.vName;
                    }
                }
                else
                {
                    _flow.NGtimes--;
                }
            }
            else// '流程结束
            {
                F_Log.Debug_1("NG", String.Format("--->>>> {0} NG指定之步骤名不存在", _line.vName));
                _caseState.endMode = eCaseFlag.Exist;
                _flow.nextCase     = "Free";
            }
            #endregion
            _line.times++;   // 此行使用的次数
        }
Exemplo n.º 10
0
        void doPartB(clsFaim3 v_faim3, DAL_CommData v_dao_comm, string vflowName)
        {
            string       _cls_Name  = "DAL_PartB";
            clsFlow      _flow      = v_faim3.dict_Flow[vflowName];
            string       _alartCase = _flow.alartCase;//取流程名, 无后缀
            clsCaseState _caseState = _faim3.dict_CaseState[_alartCase];
            clsCaseAlarm _enAlarm   = v_faim3.dict_CaseAlarm[_alartCase];

            _enAlarm.OnAlarm += new FaimDelegate.delAlarm(_enAlarm_OnAlarm);
            //
            if ((_enAlarm.maxDelay1 == -1))//逻辑模型 maxDelay1 = -1  不进行测试
            {
                doGet_NextCase(_faim3, ref _flow, _alartCase);
                FACC.F_Log.Debug_1(_clsName, string.Format("逻辑模型 maxDelay1 = -1  不进行测试:{0}", _alartCase));
                return;
            }
            // 带后缀的 方法 名, 只在 dict_Methods.doCase 中

            F_Delegate.delCasePartB_T _doPartB_T = _dao_comm.dict_Methods.doPartB_T[_alartCase];
            bool _bl_BT = true;

            _bl_BT = (_bl_BT & _doPartB_T(v_faim3, v_dao_comm));     // 测试 TEST
            if ((_flow.Tag == "GOTO_ABS" || _flow.Tag == "GOTO_NG")) //
            {
                _flow.Tag      = "";
                _flow.stepCase = _flow.currCase;
                return;
            }
            else if ((_flow.Tag == "GOTO_OTHER"))//
            {
                _flow.Tag = "";
                List <string> _otherCase = _flow.dictCases[_alartCase].otherCase;
                if (_otherCase.Contains(_alartCase))// 若 自定义列表包括了当前步骤名, 如何处理???
                {
                    return;
                }
            }
            else if ((_flow.Tag == "ALAR_ON_NG"))
            {
                _flow.Tag         = "";
                _enAlarm.AlarmDrv = eSwitch.On;
                _enAlarm.AlarmIs  = true;  // OnAlarm(this);
                //
                return;
            }
            else if ((_flow.Tag == "ALAR_OFF_NG"))//
            {
                _flow.Tag         = "";
                _enAlarm.AlarmDrv = eSwitch.Off;
                //
                _enAlarm.AlarmIs = false;   // OnAlarm(this);
                return;
            }
            //
            if ((_bl_BT && !_enAlarm.AlarmIs))//
            {
                //
                _caseState.Result = "";
                _enAlarm.DelayT1  = 0;
                _enAlarm.DelayT2  = 0;
                _flow.NGtimes     = 0;
                doGet_NextCase(_faim3, ref _flow, _alartCase);
                F_Log.Debug_1(_cls_Name, (_alartCase + " BT(1)"));
            }
            else
            {
                //
                if (!_enAlarm.AlarmIs)// 没报警
                {
                    //
                    _enAlarm.DelayT1++;
                    if (_enAlarm.DelayT1 > _enAlarm.maxDelay1)//  第一圈
                    {
                        _enAlarm.DelayT1 = 0;
                        _enAlarm.DelayT2++;
                        if (_enAlarm.DelayT2 > _enAlarm.maxDelay2)// 第二圈 时间到
                        {
                            _enAlarm.DelayT2 = 0;
                            if (_enAlarm.maxDelay2 == 0)//
                            {
                                if (_flow.dictCases.ContainsKey(_alartCase))
                                {
                                    _caseState.endMode = eCaseFlag.NG;
                                    _flow.nextCase     = v_faim3.dict_CaseAlarm[_alartCase].excpCase;
                                }
                                else
                                {
                                    F_Log.Debug_1(_cls_Name, string.Format("--->>>> {0} 没有指定下一个方法名", _alartCase));
                                    _caseState.endMode = eCaseFlag.Exist;
                                    _flow.nextCase     = "Free";//流程结束
                                }
                                return;
                            }
                            else if (_enAlarm.maxDelay2 > 0)
                            {
                                _enAlarm.AlarmIs  = true;
                                _enAlarm.AlarmDrv = eSwitch.On;// 报警灯亮
                                //
                            }
                        }
                    }
                }
                else if (_enAlarm.AlarmIs)//
                {
                    //
                    if (!string.IsNullOrEmpty(_enAlarm.dlgMessage))//
                    {
                        string _title = (_enAlarm.RemarkA + ",请确认忽略异常!");
                        if ((_enAlarm.dlgMessage.Length > 6))
                        {
                            _title = _enAlarm.dlgMessage;
                        }
                        //
                        DialogResult _dlg = MessageBox.Show(_enAlarm.dlgMessage, "温馨提示", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification);
                        if ((_dlg == DialogResult.OK))//逻辑模型:  人工出口, 有报警 忽略异常
                        {
                            //
                            F_Delegate.delCasePartB_R _doPart_BR = v_dao_comm.dict_Methods.doPartB_R[_alartCase];
                            //  测试 RUN
                            _doPart_BR(v_faim3, v_dao_comm);
                            //
                            System.Threading.Thread.Sleep(_enAlarm.DelayB);
                            if (_flow.dictCases.ContainsKey(_alartCase))
                            {
                                _caseState.endMode = eCaseFlag.NG;
                                _flow.nextCase     = v_faim3.dict_CaseAlarm[_alartCase].excpCase;
                            }
                            else
                            {
                                F_Log.Debug_1(_cls_Name, string.Format("--->>>> {0} 没有指定下一个方法名", _alartCase));
                                _caseState.endMode = eCaseFlag.Exist;
                                _flow.nextCase     = "Free";//流程结束
                            }
                            _enAlarm.AlarmIs  = false;
                            _enAlarm.AlarmDrv = eSwitch.Off;//报警灯灭
                        }
                    }
                    else if (_bl_BT)//逻辑模型:  成功出口, 有报警
                    {
                        _caseState.Result = "";
                        _enAlarm.DelayT1  = 0;
                        _enAlarm.DelayT2  = 0;
                        _flow.NGtimes     = 0;
                        _enAlarm.AlarmIs  = false;
                        _enAlarm.AlarmDrv = eSwitch.Off;//报警灯灭
                        doGet_NextCase(_faim3, ref _flow, _alartCase);
                        F_Log.Debug_1(_cls_Name, (_alartCase + " BT(2)"));
                    }
                }
            }
            return;
        }
Exemplo n.º 11
0
        protected override void do_While(string vFlowId)
        {
            //int _loc = 0;
            _bl = true;
            #region                            // _flow 初始化

            _flow.currCase = _flow.firstCase;  // 恢复 第1步

            _flow.alartCase = _flow.firstCase; // 恢复
            //if (_faim3.dict_CaseState.ContainsKey(_flow.alartCase))
            //{
            clsCaseState _caseState = _faim3.dict_CaseState[_flow.alartCase];
            _caseState.beginMode = eCaseFlag.Next;
            _caseState.endMode   = eCaseFlag.Next;
            //}
            _flow.nextCase = _flow.firstCase;
            _flow.lastCase = "Free";
            _flow.stepCase = "Free";  // 初始化单步的步骤名

            _flow.breakSkipCase = ""; // 断点无效的步骤名
            _flow.times        += 1;  // 累加, 显示流程 启动的次数

            _flow.Tag     = "";
            _flow.NGtimes = 0;
            #endregion
            #region // 日志 1 2
            F_Log.Debug_1(this.GetType().Name, String.Format("*** 流程开始:{0}.{1}, 状态:{2}, 计数:{3} ***",
                                                             vFlowId,
                                                             _flow.currCase,
                                                             _flow.eState.ToString(),
                                                             _flow.times));
            // 日志 2
            clsLogs _logs2 = new clsLogs();
            _logs2.No   = _flow.currCase;
            _logs2.Name = "*** " + _flow.currCase + " _开始";
            _flow.RunLog.Add(_logs2);                                // 累加, 内存日志
            #endregion
            #region                                                  // 流程条件
            clsThreadInfo _ti = _faim3.dict_Threads[vFlowId].Info;
            _ti.allowWhile    = eSwitch.Yes;                         //控制流程之1, 线程终止  false
            _ti.allowBusiness = eSwitch.No;                          // 控制流程之2 业务等待/暂停
            System.Diagnostics.Stopwatch _tmr = do_th_Name_pre(_ti); // 计时
            #endregion
            _faim3.dict_Threads[_flowName].Info.tmr_real = 0;        // 当前步骤 实际占用总时长



            #region                                           // while
            while (((int)_ti.allowWhile == (int)eSwitch.Yes)) // 允许线程运行 1
            {
                #region                                       // break
                // 急停
                if (_faim3.isEmergency > 0)
                {
                    _flow.eState      = eWF_State.Emergency;
                    _ti.allowWhile    = eSwitch.No;
                    _ti.allowBusiness = eSwitch.No;
                    break;
                }
                // 最后一步


                if (_flow.nextCase.ToUpper() == "FREE")
                {
                    break;// 结束流程
                }
                #endregion
                #region                     // continue
                // 暂停
                if (!do_allowBusiness(_ti)) //_flow.eState = eWF_State.Wait;
                {
                    continue;               // 线程延时+ 业务是否允许 流程信息 2
                }
                if (do_NG_hasTimes())
                {
                    continue; //_flow.currCase
                }
                #endregion
                // 显示执行后的 curr
                //_dao_comm_set_arr_str800();
                //string _caseName_old = _flow.currCase;
                clsCaseState _caseState_old = _faim3.dict_CaseState[_flow.alartCase];
                _flow.currCase = _flow.nextCase;  // 准备执行下一步, 即将下一步设为当前步骤


                if (_flow.currCase.EndsWith(F_Const.fix_CaseT)) // “_T”, 测试步骤
                {
                }
                else
                {
                    _flow.alartCase = _flow.currCase; // 非测试步骤


                    clsCaseState _caseState_new = _faim3.dict_CaseState[_flow.alartCase];
                    if (_caseState_new.beginMode == eCaseFlag.Free)
                    {
                        _caseState_new.beginMode = _caseState_old.endMode;
                    }
                    //if (_caseName_old.EndsWith(F_Const.fix_CaseT)) // “_T”, 测试步骤
                    //    _caseState_new.beginMode = eCaseFlag.TT;
                    //else
                }
                //_dao_comm_set_arr_str800();
                // 指定预执行的 curr
                do_WaitBreak();
                do_WaitStep();

                _flow.caseTimes++; // 累加, 显示步骤 通过的次数


                // 状态为运行中


                _flow.eState = eWF_State.Running;
                long _trm_begin = _tmr.ElapsedMilliseconds;                    // 毫秒
                _ti.caseName = _flow.currCase;
                if (_dao_comm.dict_Methods.doCase.ContainsKey(_flow.currCase)) // 条件:Case名存在,XX() 或 XX_T()
                {
                    if (!_flow.currCase.EndsWith(F_Const.fix_CaseT))           // 条件:无“_T”, 则新步骤开始, 先找到该配置文档的行号
                    {
                        _ti.cnt_business++;                                    // Case完成数


                        // 发消息, 上一步骤信息和本步骤位置
                        doGet_CmdLineStart(_flow.currCase, ref _faim3);                          // 预处理 分解Case的各语法结构
                    }
                    #region                                                                      // 流程代码 代理1   Switch  &  Select Case
                    F_Delegate.delCase _delCase = _dao_comm.dict_Methods.doCase[_flow.currCase]; //通过代理, 从步骤集中取出一个步骤, 执行其方法()
                    _delCase(_dao_comm, _flow.FlowName);                                         // 执行步骤
                    do_end_CalcTimer(_ti, _tmr, _trm_begin);                                     // 流程信息2
                    #endregion
                    if (_flow.Delay > -1)
                    {
                        System.Threading.Thread.Sleep(_flow.Delay);
                    }
                }
                else  // 结束 flow
                {
                    _ti.allowWhile = eSwitch.Off;               // 控制流程之2 , 步骤名不存在 无方法


                    _flow.eState = eWF_State.End;
                    FACC.F_Log.Debug_1(this.GetType().Name, String.Format("--->>>> 无 步骤 :{0}.{1}->{2} - 状态:{3}, 计数:{4} ",
                                                                          vFlowId,
                                                                          _flow.lastCase, _flow.currCase,
                                                                          _flow.eState.ToString(),
                                                                          _flow.times));
                }
            }
            #endregion
            do_End_Flow(_ti, _tmr, vFlowId);
        }