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 Init() { // 製品プログラムを書き込み後 //1.検査中止ボタンを押す。 //2.「1項目だけ検査する」をチェックして「バージョンチェック」を選択する。 //3.試験機の電源を一度OFFにして、再度ONにしてから「開始」をクリックする。 //4.OKだったら初期化を行う。 //---初期化方法--- // ①”S2”スイッチを押したまま、電源を投入してください。 // ②電源投入後”LED1”が点灯、”LED3”が点滅します。 // ③”LED3”が点滅している状態で、”S1”スイッチを押します。 // ④EEPROMの初期化されます。 //----------- //!!!!注意!!!! // ※③で”S1”スイッチ押してから11秒程度経過すると、表示操作延長基板は // 通信エラーと判定し”LED2”を点灯し、エラー履歴が記録されてしまいます。 // 出荷時にエラー履歴を残すとNGなので、必ず10秒以内に確認を実施し電源 // OFFしてください。 // ”LED2”が点灯した場合は、必ず①から作業のやり直しをお願い致します。 //!!!!!!!!!! try { var dialog = new DialogPic("S2(ひだり側)を押したままOKボタンを押してね!", DialogPic.NAME.その他); dialog.ShowDialog(); Sleep(400); General.PowSupply(true); dialog = new DialogPic("黄色LEDが点滅してるかな??", DialogPic.NAME.その他); dialog.ShowDialog(); if (!Flags.DialogReturn) { return(false); } bool FlagTimeOver = false; int countDown = 20; //30秒でエラーになるので、余裕を持って20秒以内に初期化を完了させる var tm = new System.Timers.Timer(); tm.Elapsed += (object sender, System.Timers.ElapsedEventArgs e) => { countDown = countDown - 1; State.VmTestStatus.DialogMess = $"S1(みぎ側)を押して、黄色が消えるのを確認してね\r\n※残り {countDown}秒"; if (countDown == 0) { tm.Stop(); FlagTimeOver = true; } }; tm.Interval = 1000; tm.Start(); dialog = new DialogPic("S1(みぎ側)を押して、黄色が消えるのを確認してね\r\n※残り 20秒", DialogPic.NAME.その他); dialog.ShowDialog(); General.PowSupply(false); return(!FlagTimeOver); } catch { return(false); } }
//メインルーチン 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(); } }