Beispiel #1
0
        public InspectionStep[] GetInspectionSteps()
        {
            IntPtr stepsPtr = IntPtr.Zero;
            int    i        = 0;
            int    j        = 0;

            InspectionStep[] steps;


            InspectionStepsPriv stepsPriv = new InspectionStepsPriv();

            InspectionStepPriv[]    stepArrayPriv;
            PassFailConditionPriv[] conditionArrayPriv;
            Error err = vbaiGetInspectionSteps(_session.nativeSession, ref stepsPtr);

            if (err != Error.Success)
            {
                steps = null;
                ExceptionBuilder.CheckErrorAndThrow(err);
                return(steps);
            }
            stepsPriv     = (InspectionStepsPriv)Marshal.PtrToStructure(stepsPtr, typeof(InspectionStepsPriv));
            steps         = new InspectionStep[stepsPriv.numSteps];
            stepArrayPriv = new InspectionStepPriv[stepsPriv.numSteps];
            for (i = 0; i < stepsPriv.numSteps; i++)
            {
                int structSize = Marshal.SizeOf(typeof(InspectionStepPriv));
                stepArrayPriv[i]         = (InspectionStepPriv)Marshal.PtrToStructure((System.IntPtr)((int)stepsPriv.stepsIntPtr + i * structSize), typeof(InspectionStepPriv));
                steps[i].stateName       = String.Copy(stepArrayPriv[i].stateName);
                steps[i].stepClass       = String.Copy(stepArrayPriv[i].stepClass);
                steps[i].stepGUID        = String.Copy(stepArrayPriv[i].stepGUID);
                steps[i].stepName        = String.Copy(stepArrayPriv[i].stepName);
                steps[i].conditionsArray = new PassFailCondition[stepArrayPriv[i].numConditions];
                conditionArrayPriv       = new PassFailConditionPriv[stepArrayPriv[i].numConditions];
                int offset = 0;
                for (j = 0; j < stepArrayPriv[i].numConditions; j++)
                {
                    PassFailConditionPriv temp = (PassFailConditionPriv)Marshal.PtrToStructure((System.IntPtr)((int)stepArrayPriv[i].conditionsArrayIntPtr + offset), typeof(PassFailConditionPriv));
                    offset += 28;   // increment for next item on next iteration. Marshal.SizeOf(typeof(NumericCondition));
                    steps[i].conditionsArray[j].typeCondition = temp.typeCondition;

                    if (temp.typeCondition == (PassFailConditionType.NumericCondition))
                    {
                        steps[i].conditionsArray[j].used        = (temp.conditionPriv.numericCondition.used == 1);
                        steps[i].conditionsArray[j].num1        = temp.conditionPriv.numericCondition.value1;
                        steps[i].conditionsArray[j].num2        = temp.conditionPriv.numericCondition.value2;
                        steps[i].conditionsArray[j].numFunction = temp.conditionPriv.numericCondition.function;
                    }
                    else
                    {
                        steps[i].conditionsArray[j].used        = (temp.conditionPriv.stringCondition.used == 1);
                        steps[i].conditionsArray[j].str1        = Marshal.PtrToStringAnsi(temp.conditionPriv.stringCondition.value1);
                        steps[i].conditionsArray[j].str2        = Marshal.PtrToStringAnsi(temp.conditionPriv.stringCondition.value2);
                        steps[i].conditionsArray[j].strFunction = temp.conditionPriv.stringCondition.function;
                    }
                }
            }
            vbaiDispose(stepsPtr);
            return(steps);
        }
        /// <summary>
        /// 外観検査モード主処理
        /// </summary>
        /// <returns>正常終了/異常終了</returns>
        public bool MainProc()
        {
            log.System("検査モード 開始");
            string recipe_fpath = m_cfg.RecipeFileList[m_recipeNo];

            // レシピファイルリード
            m_insList = InspectionList.LoadRecipeFile(recipe_fpath);
            if (m_insList == null)
            {
                CommonUI.MsgBox.Error($"検査レシピ取得エラー\r\nレシピ'{m_recipeNo}'をリード中に異常がありました");
                return(false);
            }
            // デバイス異常時のコールバック設定
            m_devMgr.OnErrorEnd += OnDeviceErrorEnd;

            m_devMgr.InputID += OnDeviceInputId;
            m_step            = InspectionStep.None;

            // プリンタの使用有無設定更新
            m_devMgr.Printer.Use = !string.IsNullOrEmpty(m_insList.TemplateFileNameBarcode);

            // メイン画面生成
            m_fmMain = new UI.FormAppearanceInspection(m_recipeNo, m_user, m_insList);
            var fmtask = UITask(m_fmMain);

            // 検査処理タスク
            var insTask = Task.Factory.StartNew(MainInspectionTask, TaskCreationOptions.LongRunning);

            insTask.ContinueWith(t => {
                if (t.Result == ProcResult.Error)
                {
                    m_fmMain.Destroy();
                }
            });

            try
            {
                // メイン画面終了待ち
                fmtask.Wait(m_cts.Token);
            }
            catch (Exception)
            {
                m_cts.Cancel();
            }
            m_cts.Dispose();


            m_devMgr.InputID -= OnDeviceInputId;
            bool bret = fmtask.Result == CommonUI.FormResult.OK  || fmtask.Result == CommonUI.FormResult.Cancel;

            log.System("検査モード 終了 : 結果={0}", bret);
            return(bret);
        }
Beispiel #3
0
        /// <summary>
        /// 工程のステップ(工程)
        /// </summary>
        /// <param name="state">新しい工程</param>
        async void SetStep(InspectionStep state)
        {
            log.UI("状態更新 {0} -> {1}", m_InspectionStep, state);
            m_InspectionStep = state;
            m_stepView.UpdateState(state);

            switch (state)
            {
            // 初期化
            case InspectionStep.Intialize:
                FinishStep(true);
                break;

            // ID取得
            case InspectionStep.GetId:
                bool bret = await GetIDLoop();

                if (!bret)
                {
                    Result = FormResult.Cancel;
                    Close();
                    return;
                }
                FinishStep(true);
                break;

            // パネルセット
            case InspectionStep.SetPanel:
                if (!MsgBox.ContinueConfirm("パネルをセットして下さい(裏面)"))
                {
                    Result = FormResult.Cancel;
                    Close();
                    return;
                }
                await CallControllerAction(new ActionParam_ReadyInspecton());

                FinishStep(true);
                break;

            // 裏面検査
            case InspectionStep.InspectionBack:
                StartInspection(Inspection.ISP_Mode.BackSurface);
                break;

            // パネル反転
            case InspectionStep.ReversePanel:
                if (!MsgBox.ContinueConfirm("表面を検査します。パネルを反転して下さい"))
                {
                    Result = FormResult.Cancel;
                    Close();
                    return;
                }
                FinishStep(true);
                break;

            // 表面検査
            case InspectionStep.InspectionFront:
                StartInspection(Inspection.ISP_Mode.Surface);
                break;
            }
        }
Beispiel #4
0
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="step">次の工程</param>
 public UpdateStepInfo(InspectionStep step)
 {
     Step      = step;
     m_taskCmp = new TaskCompletionSource <bool>();
 }
 /// <summary>
 /// 状態の設定
 /// </summary>
 /// <param name="newStep">次の状態</param>
 void SetStep(InspectionStep newStep)
 {
     m_step    = newStep;
     m_updStep = new FormMessages.UpdateStepInfo(newStep);
     m_fmMain.PostMessage(FormMessages.UpdateStep(m_updStep));
 }