public AIO121602() { ThicknessOffsets = new float[] { 0, 0, 0, 0, 0, 0, 0, 0 }; System.Timers.Timer _timeout = new System.Timers.Timer(5000); bool isTimeout = false, isInitEnd = false; for (int i = 0; i < _avrs.Length; i++) { _avrs[i] = new MoveAverage(4); } _timeout.Elapsed += ((object sender, System.Timers.ElapsedEventArgs e) => { _timeout.Stop(); isTimeout = true; }); _timeout.Start(); Task.Run(() => { LastErrorNo = _aio.Init(ITEM_NAME, out _aioId); isInitEnd = true; }); while (!isTimeout && !isInitEnd) { Thread.Sleep(100); } _timeout.Stop(); if (isTimeout) { LastErrorNo = -1; return; } LastErrorNo = _aio.ResetDevice(_aioId); if (LastErrorNo != 0) { return; } LastErrorNo = _aio.SetAiStopTrigger(_aioId, 4); if (LastErrorNo != 0) { return; } LastErrorNo = _aio.SetAiChannels(_aioId, 14); if (LastErrorNo != 0) { return; } LastErrorNo = _aio.SetAiRangeAll(_aioId, (short)CaioConst.PM5); if (LastErrorNo != 0) { return; } LastErrorNo = _aio.SetAiTransferMode(_aioId, 0); // デバイスバッファモード if (LastErrorNo != 0) { return; } LastErrorNo = _aio.SetAiMemoryType(_aioId, 0); // MemoryFIFOモード if (LastErrorNo != 0) { return; } LastErrorNo = _aio.SetAiClockType(_aioId, 0); if (LastErrorNo != 0) { return; } LastErrorNo = _aio.SetAiSamplingClock(_aioId, 3000); // 1msサンプリング // LastErrorNo = _aio.SetAiSamplingClock( _aioId, 50000 ); // 1msサンプリング if (LastErrorNo != 0) { return; } ThicknessOneSheetQue = new Queue <ThicknessData[][]>(); _aio.StartAi(_aioId); _interval = new System.Timers.Timer(); _interval.Interval = 100; _interval.Elapsed += _interval_Elapsed; _interval.Start(); }
//ロガーの設定 private void setLogger() { //入力方式 int aioInputMethod = aio.SetAiInputMethod(devId, 0); //シングルエンド if (aioInputMethod != 0) { statusMsg(aioInputMethod, null); return; } //使用チャネル数 int aioCh = aio.SetAiChannels(devId, 2); //2ch if (aioCh != 0) { statusMsg(aioCh, null); return; } //計測レンジ指定 int aioRange = aio.SetAiRangeAll(devId, (short)CaioConst.PM5); //±5V if (aioRange != 0) { //1664LAXでは±10V固定 statusMsg(aioRange, null); aioRange = aio.SetAiRangeAll(devId, (short)CaioConst.PM10); //±10V if (aioRange != 0) { statusMsg(aioCh, null); return; } statusMsg(1, "レンジが変更できないデバイスなので±10V固定で動作します"); } //転送方式 int aioMemTrans = aio.SetAiTransferMode(devId, 0); //デバイスバッファ if (aioMemTrans != 0) { statusMsg(aioMemTrans, null); return; } //メモリ格納形式 int aioMem = aio.SetAiMemoryType(devId, 0); //FIFO if (aioMem != 0) { statusMsg(aioMem, null); return; } //クロック int aioClk = aio.SetAiClockType(devId, 0); //内部クロック if (aioClk != 0) { statusMsg(aioClk, null); return; } //変換速度 int aioSpd = aio.SetAiSamplingClock(devId, 1000); //1000us if (aioSpd != 0) { statusMsg(aioSpd, null); return; } float clock = 0; aio.GetAiSamplingClock(devId, out clock); convSpeed.Text = clock.ToString() + "μs"; //開始条件 int aioStartTrg = aio.SetAiStartTrigger(devId, 0); //ソフトウェア if (aioStartTrg != 0) { statusMsg(aioStartTrg, null); return; } //停止条件 int aioStopTrg = aio.SetAiStopTrigger(devId, 4); //コマンド if (aioStopTrg != 0) { statusMsg(aioStopTrg, null); return; } /* * 停止条件 = 0とリピート回数 = 0でDEMO DEVICEにて実行するとこのプログラムではBSoDが発生しWindowsが停止する。 * 恐らく想定外入力によって引き起こされるドライバのバグだと思われる。 */ //イベント駆動 int aioEvent = aio.SetAiEvent(devId, (uint)this.Handle, (int)CaioConst.AIE_DATA_NUM | //指定回数格納 (int)CaioConst.AIE_OFERR | (int)CaioConst.AIE_SCERR | (int)CaioConst.AIE_ADERR); //オーバーフロー、クロックエラー、AD変換エラー if (aioEvent != 0) { statusMsg(aioEvent, null); return; } //イベント発生サンプリング回数設定 int aioSamplingTimes = aio.SetAiEventSamplingTimes(devId, 1000); //1000回だと画像データ取得時刻にかなりの確率で間に合わない if (aioSamplingTimes != 0) { statusMsg(aioSamplingTimes, null); return; } }