Exemple #1
0
        public static bool CheckSw(SW_NAME name)
        {
            var IsChecking = true;

            try
            {
                void Check()
                {
                    Task.Run(() =>
                    {
                        while (IsChecking)
                        {
                            Target.SendData(name == SW_NAME.S1 ? "SSW01" : "SSW02", DoAnalysis: false);
                        }
                    });
                }

                Check();
                var mess   = name == SW_NAME.S1 ? "S1(みぎ)を押すと、LED2(赤)が点灯する??" : "S2(ひだり)を押すと、LED3(黄)が点灯する??";
                var dialog = new DialogPic($"{mess}\r\n何回押してもいいよ!", DialogPic.NAME.その他);
                dialog.ShowDialog();
                IsChecking = false;
                return(Flags.DialogReturn);
            }
            catch
            {
                return(false);
            }
            finally
            {
                //いったん電源を落とす そのままS2のチェックに行くとS2が反応しないため ※うめきバグ
                General.PowSupply(false);
                Sleep(200);
            }
        }
        public static bool SetRelay(VOL_CH ch)
        {
            var cmd = "";

            switch (ch)
            {
            case VOL_CH.P12V:
                cmd = "VCK01";
                break;

            case VOL_CH.P5V:
                cmd = "VCK02";
                break;

            case VOL_CH.P3_3V:
                cmd = "VCK03";
                break;

            case VOL_CH.M5V:
                cmd = "VCK04";
                break;
            }
            Sleep(100);
            return(Target.SendData(cmd));
        }
        public static async Task <bool> CheckSerial()
        {
            bool result;

            try
            {
                return(result = await Task <bool> .Run(() =>
                {
                    var tm = new GeneralTimer(15000);
                    tm.start();
                    while (true)
                    {
                        //うめきのバグ
                        //通信が不安定なのでなんかいかリトライする
                        if (tm.FlagTimeout)
                        {
                            return false;
                        }
                        if (!Target.SendData("RS401", Wait: 500, DoAnalysis: false))
                        {
                            continue;
                        }
                        if (!Target.RecieveData.Contains("U2TXMSG"))
                        {
                            continue;
                        }
                        if (Target.SendData("u2msg"))
                        {
                            break;
                        }
                    }
                    return true;
                }));
            }
            finally
            {
            }
        }
Exemple #4
0
        public static async Task <bool> CheckPwmOut(OUTPUT_NAME ch)
        {
            bool   result   = false;
            Double measData = 0;
            double Max      = 0;
            double Min      = 0;

            try
            {
                return(await Task <bool> .Run(() =>
                {
                    try
                    {
                        //製品にコマンドを送ると、PWM出力させ、マルチメータに出力端子を接続します
                        if (!Target.SendData(SetRelay(ch), Wait: 10000))
                        {
                            return false;
                        }

                        switch (ch)
                        {
                        case OUTPUT_NAME.PWM1_I_50:
                        case OUTPUT_NAME.PWM2_I_50:
                            Max = State.TestSpec.PWM_I50_HI;
                            Min = State.TestSpec.PWM_I50_LO;
                            break;

                        case OUTPUT_NAME.PWM1_I_100:
                        case OUTPUT_NAME.PWM2_I_100:
                            Max = State.TestSpec.PWM_I100_HI;
                            Min = State.TestSpec.PWM_I100_LO;
                            break;

                        case OUTPUT_NAME.PWM1_V_50:
                        case OUTPUT_NAME.PWM2_V_50:
                            Max = State.TestSpec.PWM_V50_HI;
                            Min = State.TestSpec.PWM_V50_LO;
                            break;

                        case OUTPUT_NAME.PWM1_V_100:
                        case OUTPUT_NAME.PWM2_V_100:
                            Max = State.TestSpec.PWM_V100_HI;
                            Min = State.TestSpec.PWM_V100_LO;
                            break;
                        }

                        var tm = new GeneralTimer(5000);
                        tm.start();
                        while (true)
                        {
                            if (tm.FlagTimeout)
                            {
                                return false;
                            }
                            if (!General._34401.GetDcVoltage())
                            {
                                continue;
                            }

                            measData = General._34401.VoltData;
                            if (Min < measData && measData < Max)
                            {
                                break;
                            }
                            Sleep(200);
                        }

                        if (!General._34401.GetDcVoltage())
                        {
                            return false;
                        }
                        measData = General._34401.VoltData;

                        return result = (Min < measData && measData < Max);
                    }
                    catch
                    {
                        return result = false;
                    }
                }));
            }
            finally
            {
                //ビューモデルの更新
                switch (ch)
                {
                case OUTPUT_NAME.PWM1_I_50:
                    State.VmTestResults.VolPwm1_I_50 = measData.ToString("F2") + "V";
                    State.VmTestResults.ColPwm1_I_50 = result ? General.OffBrush : General.NgBrush;
                    break;

                case OUTPUT_NAME.PWM1_I_100:
                    State.VmTestResults.VolPwm1_I_100 = measData.ToString("F2") + "V";
                    State.VmTestResults.ColPwm1_I_100 = result ? General.OffBrush : General.NgBrush;
                    break;

                case OUTPUT_NAME.PWM2_I_50:
                    State.VmTestResults.VolPwm2_I_50 = measData.ToString("F2") + "V";
                    State.VmTestResults.ColPwm2_I_50 = result ? General.OffBrush : General.NgBrush;
                    break;

                case OUTPUT_NAME.PWM2_I_100:
                    State.VmTestResults.VolPwm2_I_100 = measData.ToString("F2") + "V";
                    State.VmTestResults.ColPwm2_I_100 = result ? General.OffBrush : General.NgBrush;
                    break;

                case OUTPUT_NAME.PWM1_V_50:
                    State.VmTestResults.VolPwm1_V_50 = measData.ToString("F2") + "V";
                    State.VmTestResults.ColPwm1_V_50 = result ? General.OffBrush : General.NgBrush;
                    break;

                case OUTPUT_NAME.PWM1_V_100:
                    State.VmTestResults.VolPwm1_V_100 = measData.ToString("F2") + "V";
                    State.VmTestResults.ColPwm1_V_100 = result ? General.OffBrush : General.NgBrush;
                    break;

                case OUTPUT_NAME.PWM2_V_50:
                    State.VmTestResults.VolPwm2_V_50 = measData.ToString("F2") + "V";
                    State.VmTestResults.ColPwm2_V_50 = result ? General.OffBrush : General.NgBrush;
                    break;

                case OUTPUT_NAME.PWM2_V_100:
                    State.VmTestResults.VolPwm2_V_100 = measData.ToString("F2") + "V";
                    State.VmTestResults.ColPwm2_V_100 = result ? General.OffBrush : General.NgBrush;
                    break;
                }

                //NGだった場合、エラー詳細情報の規格値を更新する
                if (!result)
                {
                    State.VmTestStatus.Spec      = $"規格値 : {Min.ToString("F2")} ~ {Max.ToString("F2")}V";
                    State.VmTestStatus.MeasValue = "計測値 : " + measData.ToString("F2") + "V";
                }
            }
        }
Exemple #5
0
        public static async Task <bool> CheckSw1()
        {
            var result = false;

            try
            {
                return(result = await Task <bool> .Run(() =>
                {
                    PlaySound(soundNotice);
                    foreach (var n in Enum.GetValues(typeof(SW1_BIT)))
                    {
                        var mess = $"DSW1の {((SW1_BIT)n).ToString()} のみをON→OFFしてください!";
                        State.VmTestStatus.Message = mess;

                        var cmd = "";
                        switch ((SW1_BIT)n)
                        {
                        case SW1_BIT.B1:
                            cmd = "DSW01";
                            break;

                        case SW1_BIT.B2:
                            cmd = "DSW02";
                            break;

                        case SW1_BIT.B3:
                            cmd = "DSW03";
                            break;

                        case SW1_BIT.B4:
                            cmd = "DSW04";
                            break;
                        }

                        while (true)
                        {
                            if (Flags.ClickStopButton)
                            {
                                return false;
                            }

                            if (Target.SendData(cmd))
                            {
                                PlaySound2(soundSwCheck);
                                if ((SW1_BIT)n != SW1_BIT.B4)
                                {
                                    break;
                                }

                                //Bit4がONされた後は、Bit4がOFFされるのを確認する(出荷設定 b1~b4 すべてOFF)
                                while (true)
                                {
                                    if (Flags.ClickStopButton)
                                    {
                                        return false;
                                    }

                                    if (!Target.SendData(cmd))
                                    {
                                        break;
                                    }
                                }
                                break;
                            }
                            Sleep(250);
                        }
                    }

                    return true;
                }));
            }
            catch
            {
                return(false);
            }
            finally
            {
                State.VmTestStatus.Message = Constants.MessWait;
            }
        }
Exemple #6
0
        //メインルーチン
        public async Task Test()
        {
            DialogPic dialog;

            Flags.Testing = true;

            State.VmTestStatus.Message = Constants.MessWait;

            //テーマ透過度を最小にする
            General.SetRadius(true);

            await Task.Delay(500);

            FlagTestTime = true;
            Timer();

            int    FailStepNo = 0;
            int    RetryCnt   = 0;//リトライ用に使用する
            string FailTitle  = "";


            var テスト項目最新 = new List <TestSpecs>();

            if (State.VmTestStatus.CheckUnitTest == true)
            {
                //チェックしてある項目の百の桁の解析
                var re    = Int32.Parse(State.VmTestStatus.UnitTestName.Split('_').ToArray()[0]);
                int 位桁    = Int32.Parse(State.VmTestStatus.UnitTestName.Substring(0, (re >= 1000) ? 2 : 1));
                var 抽出データ = State.テスト項目.Where(p => (p.Key / 100) == 位桁);
                foreach (var p in 抽出データ)
                {
                    テスト項目最新.Add(new TestSpecs(p.Key, p.Value, p.PowSw, p.Cn3RelayPow));
                }
            }
            else
            {
                テスト項目最新 = State.テスト項目;
            }



            try
            {
                //IO初期化
                General.ResetIo();
                Thread.Sleep(400);


                foreach (var d in テスト項目最新.Select((s, i) => new { i, s }))
                {
Retry:
                    State.VmTestStatus.Spec      = "規格値 : ---";
                    State.VmTestStatus.MeasValue = "計測値 : ---";
                    Flags.AddDecision            = true;

                    SetTestLog(d.s.Key.ToString() + "_" + d.s.Value);

                    if (d.s.PowSw)
                    {
                        if (!Flags.PowOn)
                        {
                            await Task.Run(() =>
                            {
                                PowSupply(true);
                                Thread.Sleep(1000);
                            });
                        }
                    }
                    else
                    {
                        await Task.Run(() =>
                        {
                            PowSupply(false);
                        });
                    }

                    if (d.s.Cn3RelayPow)
                    {
                        LPC1768.SendData1768("W,P07,1");
                    }
                    else
                    {
                        LPC1768.SendData1768("W,P07,0");
                    }

                    switch (d.s.Key)
                    {
                    case 100:    //検査ソフト書き込み
                        if ((State.VmTestStatus.CheckWriteTestFwPass == true) ||
                            await 書き込み.WriteFw(Constants.fdtPath_TEST))
                        {
                            //dialog = new DialogPic("CN5(書き込みケーブル)を取り外してください", DialogPic.NAME.書き込みコネクタ);
                            //dialog.ShowDialog();
                            //if (!Flags.DialogReturn)
                            //    goto case 5000;

                            break;
                        }
                        goto case 5000;

                    case 200:    //電源電圧チェック +12V
                        if (await TestPowerSupplyVol.CheckVolt(TestPowerSupplyVol.VOL_CH.P12V))
                        {
                            break;
                        }
                        goto case 5000;

                    case 201:    //電源電圧チェック +5V
                        if (await TestPowerSupplyVol.CheckVolt(TestPowerSupplyVol.VOL_CH.P5V))
                        {
                            break;
                        }
                        goto case 5000;

                    case 202:    //電源電圧チェック +3.3V
                        if (await TestPowerSupplyVol.CheckVolt(TestPowerSupplyVol.VOL_CH.P3_3V))
                        {
                            break;
                        }
                        goto case 5000;

                    case 203:    //電源電圧チェック -5V
                        if (await TestPowerSupplyVol.CheckVolt(TestPowerSupplyVol.VOL_CH.M5V))
                        {
                            break;
                        }
                        goto case 5000;

                    case 300:    //PMM1電流チェック 50%
                        dialog = new DialogPic("JP2~7をI側にセットしてください。\r\n ※プレスを開けても大丈夫です", DialogPic.NAME.PWM_I);
                        dialog.ShowDialog();
                        if (!Flags.DialogReturn)
                        {
                            goto case 5000;
                        }
                        State.VmTestStatus.IsActiveRing = true;
                        General.PowSupply(true);
                        if (await TestAnalog.CheckPwmOut(TestAnalog.OUTPUT_NAME.PWM1_I_50))
                        {
                            break;
                        }
                        goto case 5000;

                    case 301:    //PMM1電流チェック 100%
                        State.VmTestStatus.IsActiveRing = true;
                        if (await TestAnalog.CheckPwmOut(TestAnalog.OUTPUT_NAME.PWM1_I_100))
                        {
                            break;
                        }
                        goto case 5000;

                    case 302:    //PWM2電流チェック 50%
                        State.VmTestStatus.IsActiveRing = true;
                        if (await TestAnalog.CheckPwmOut(TestAnalog.OUTPUT_NAME.PWM2_I_50))
                        {
                            break;
                        }
                        goto case 5000;

                    case 303:    //PWM2電流チェック 100%
                        State.VmTestStatus.IsActiveRing = true;
                        if (await TestAnalog.CheckPwmOut(TestAnalog.OUTPUT_NAME.PWM2_I_100))
                        {
                            break;
                        }
                        goto case 5000;

                    case 400:    //PMM1電圧チェック 50%
                        State.VmTestStatus.IsActiveRing = false;
                        dialog = new DialogPic("JP2~7をV側にセットしてください。\r\n ※プレスを開けても大丈夫です", DialogPic.NAME.PWM_V);
                        dialog.ShowDialog();
                        if (!Flags.DialogReturn)
                        {
                            goto case 5000;
                        }
                        State.VmTestStatus.IsActiveRing = true;
                        General.PowSupply(true);
                        if (await TestAnalog.CheckPwmOut(TestAnalog.OUTPUT_NAME.PWM1_V_50))
                        {
                            break;
                        }
                        goto case 5000;

                    case 401:    //PMM1電圧チェック 100%
                        State.VmTestStatus.IsActiveRing = true;
                        if (await TestAnalog.CheckPwmOut(TestAnalog.OUTPUT_NAME.PWM1_V_100))
                        {
                            break;
                        }
                        goto case 5000;

                    case 402:    //PWM2電圧チェック 50%
                        State.VmTestStatus.IsActiveRing = true;
                        if (await TestAnalog.CheckPwmOut(TestAnalog.OUTPUT_NAME.PWM2_V_50))
                        {
                            break;
                        }
                        goto case 5000;

                    case 403:    //PWM2電圧チェック 100%
                        State.VmTestStatus.IsActiveRing = true;
                        if (await TestAnalog.CheckPwmOut(TestAnalog.OUTPUT_NAME.PWM2_V_100))
                        {
                            break;
                        }
                        goto case 5000;

                    case 500:    //S1押しボタンチェック
                        State.VmTestStatus.IsActiveRing = false;
                        if (TestSw_1_2.CheckSw(TestSw_1_2.SW_NAME.S1))
                        {
                            break;
                        }
                        goto case 5000;

                    case 501:    //S2押しボタンチェック
                        State.VmTestStatus.IsActiveRing = false;
                        if (TestSw_1_2.CheckSw(TestSw_1_2.SW_NAME.S2))
                        {
                            break;
                        }
                        goto case 5000;

                    case 600:    //DSW1 チェック
                        State.VmTestStatus.IsActiveRing = false;
                        if (await TestDipSw.CheckSw1())
                        {
                            break;
                        }
                        goto case 5000;

                    case 700:    //X-Port動作 チェック
                        State.VmTestStatus.IsActiveRing = false;
                        if (TestXPort.Check())
                        {
                            break;
                        }
                        goto case 5000;

                    case 800:    //CN1動作チェック
                        State.VmTestStatus.IsActiveRing = true;
                        if (await Task <bool> .Run(() => Target.SendData("CCK01", Wait: 60000)))
                        {
                            break;
                        }
                        goto case 5000;

                    case 900:    //CN2動作チェック
                        State.VmTestStatus.IsActiveRing = true;
                        if (await Task <bool> .Run(() => Target.SendData("CCK02", Wait: 60000)))
                        {
                            break;
                        }
                        goto case 5000;

                    case 1000:    //EEPROMチェック
                        State.VmTestStatus.IsActiveRing = true;
                        if (await Task <bool> .Run(() => Target.SendData("E2P01", Wait: 60000)))
                        {
                            break;
                        }
                        goto case 5000;

                    case 1100:    //シリアル通信チェック
                        State.VmTestStatus.IsActiveRing = false;
                        if (await TestSerialComm.CheckSerial())
                        {
                            break;
                        }
                        goto case 5000;

                    case 1200:    //製品ソフト書き込み
                        if (await 書き込み.WriteFw(Constants.fdtPath_PRODUCT, State.TestSpec.Sum))
                        {
                            break;
                        }
                        goto case 5000;

                    case 1300:    //初期化
                        if (TestInit.Init())
                        {
                            break;
                        }
                        goto case 5000;

                    case 1400:    //Verチェック
                        if (await TestVer.CheckVer())
                        {
                            break;
                        }
                        goto case 5000;

                    case 5000:    //NGだっときの処理
                        if (Flags.AddDecision)
                        {
                            SetTestLog("---- FAIL\r\n");
                        }
                        FailStepNo = d.s.Key;
                        FailTitle  = d.s.Value;

                        ResetIo();

                        //周辺機器の再初期化
                        State.VmTestStatus.IsActiveRing = false;    //リング表示してる可能性があるので念のため消す処理

                        if (Flags.ClickStopButton)
                        {
                            goto FAIL;
                        }

                        if (RetryCnt++ != Constants.RetryCount)
                        {
                            //リトライ履歴リスト更新
                            Flags.Retry = true;
                            goto Retry;
                        }

                        General.PlaySoundLoop(General.soundAlarm);
                        var YesNoResult = MessageBox.Show("この項目はNGですがリトライしますか?", "", MessageBoxButtons.YesNo);
                        General.StopSound();

                        //何が選択されたか調べる
                        if (YesNoResult == DialogResult.Yes)
                        {
                            RetryCnt = 0;
                            await Task.Delay(1000);

                            goto Retry;
                        }

                        goto FAIL;    //自動リトライ後の作業者への確認はしない
                    }
                    //↓↓各ステップが合格した時の処理です↓↓
                    if (Flags.AddDecision)
                    {
                        SetTestLog("---- PASS\r\n");
                    }

                    State.VmTestStatus.IsActiveRing = false;

                    //リトライステータスをリセットする
                    RetryCnt    = 0;
                    Flags.Retry = false;

                    await Task.Run(() =>
                    {
                        var CurrentProgValue = State.VmTestStatus.進捗度;
                        var NextProgValue    = (int)(((d.i + 1) / (double)テスト項目最新.Count()) * 100);
                        var 化量 = NextProgValue - CurrentProgValue;
                        foreach (var p in Enumerable.Range(1, 化量))
                        {
                            State.VmTestStatus.進捗度 = CurrentProgValue + p;
                            if (State.VmTestStatus.CheckUnitTest == false)
                            {
                                Thread.Sleep(10);
                            }
                        }
                    });

                    if (Flags.ClickStopButton)
                    {
                        ResetIo();
                        goto FAIL;
                    }
                }


                //↓↓すべての項目が合格した時の処理です↓↓
                ResetIo();
                await Task.Delay(500);

                State.VmTestStatus.Message = Constants.MessRemove;

                //強制停止ボタンの設定
                //await General.ShowStopButton(false);

                //通しで試験が合格したときの処理です(検査データを保存して、シリアルナンバーをインクリメントする)
                if (State.VmTestStatus.CheckUnitTest != true) //null or False アプリ立ち上げ時はnullになっている!
                {
                    if (!General.SaveTestData())
                    {
                        FailStepNo = 5000;
                        FailTitle  = "検査データ保存";
                        goto FAIL_DATA_SAVE;
                    }

                    //await General.StampOn();//合格印押し

                    //当日試験合格数をインクリメント ビューモデルはまだ更新しない
                    State.Setting.TodayOkCount++;
                }



                FlagTestTime = false;
                State.VmTestStatus.StartButtonContent = Constants.確認;
                State.VmTestStatus.StartButtonEnable  = true;
                State.VmTestStatus.Message            = Constants.MessRemove;

                State.VmTestStatus.Colorlabel判定  = Brushes.AntiqueWhite;
                State.VmTestStatus.Decision      = "PASS";
                State.VmTestStatus.ColorDecision = effect判定表示PASS;

                ResetRing();
                SetDecision();
                SbPass();

                PlaySound(soundPassLong);

                Flags.Click確認Button = false;
                StopButtonBlinkOn();
                await Task.Run(() =>
                {
                    while (true)
                    {
                        if (Flags.Click確認Button)
                        {
                            break;
                        }
                        Thread.Sleep(100);
                    }
                });

                StopSound();
                StopButtonBlinkOff();
                await Task.Delay(500);

                return;

                //不合格時の処理
FAIL:
                await Task.Delay(500);

FAIL_DATA_SAVE:


                FlagTestTime = false;
                State.VmTestStatus.StartButtonContent = Constants.確認;
                State.VmTestStatus.StartButtonEnable  = true;
                State.VmTestStatus.Message            = Constants.MessRemove;


                //当日試験不合格数をインクリメント ビューモデルはまだ更新しない
                State.Setting.TodayNgCount++;
                await Task.Delay(100);

                State.VmTestStatus.Colorlabel判定  = Brushes.AliceBlue;
                State.VmTestStatus.Decision      = "FAIL";
                State.VmTestStatus.ColorDecision = effect判定表示FAIL;

                SetErrorMessage(FailStepNo, FailTitle);

                var NgDataList = new List <string>()
                {
                    State.VmMainWindow.Opecode,
                    State.VmMainWindow.Operator,
                    System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"),
                    State.VmTestStatus.FailInfo,
                    State.VmTestStatus.Spec,
                    State.VmTestStatus.MeasValue
                };

                General.SaveNgData(NgDataList);


                ResetRing();
                SetDecision();
                SetErrInfo();
                SbFail();

                General.PlaySound(General.soundFail);

                Flags.Click確認Button = false;
                StopButtonBlinkOn();
                await Task.Run(() =>
                {
                    while (true)
                    {
                        if (Flags.Click確認Button)
                        {
                            break;
                        }
                        Thread.Sleep(100);
                    }
                });

                StopButtonBlinkOff();
                await Task.Delay(500);

                return;
            }
            catch
            {
                System.Windows.Forms.MessageBox.Show("想定外の例外発生DEATH!!!\r\n申し訳ありませんが再起動してください");
                Environment.Exit(0);
            }
            finally
            {
                ResetIo();
                SbRingLoad();

                ResetViewModel();
                RefreshDataContext();
            }
        }