/// <summary> /// 動作中のスクリプト実行を強制停止 /// </summary> /// <param name="id"></param> /// <returns></returns> public int StopProgram(int id) { Trace.TraceFormat("Entry:ID={0}", id); if (id == -1) { SvControl.Power(0); if (_scriptThread != null) { Trace.TraceFormat("Thread Abort"); _scriptThread.Abort(); _scriptThread.Join(); } } else { if (id < 0 || id > 255) { Trace.TraceFormat("[ERR]ID={0} Param", id); return((int)ErrCode.ERR_PARAM); } PEventManager.PEvent ev = GetEvent(id); //スレッドで実行しているスクリプトを停止させる if (_scriptThread != null) { _scriptThread.Abort(); _scriptThread.Join(); } Trace.TraceFormat("[ERR]Leave ID={0} Exec", id); ev.Cancel((int)ErrCode.ERR_EXEC); } Trace.TraceFormat("Leave ID={0}", id); return((int)ErrCode.RET_OK); }
/// <summary> /// 軸移動指令の中止 /// </summary> /// <returns></returns> public int StopMove(int id) { Trace.TraceFormat("Entry:id={0}", id); if (SvControl != null) { try { PEventManager.PEvent evObj = _eventCtrl.GetEvent(id); if (evObj.GetRscType() == 0) { //イベントが使用中である場合のみ uint st = SvControl.GetMcStatus(); //プログラムは停止させる(動作中かどうかは確認しない) SvControl.StopCommand(); SvControl.Reset(); //スレッドをAbort()させると"ブロック停止"なので //プログラムの停止を待つ // ※プログラムを停止させることによって、動作完了扱いとなるため // 停止コマンドを出した直後にイベントのステータスを変更しても // 動作コマンドの完了の方が遅くなるので、結果的にイベントは // キャンセルから成功になってしまう。 // このため、プログラムの完了を待ってから、改めてイベントをキャンセル設定する Trace.TraceFormat("Wait:program stop"); uint nn; do { Thread.Sleep(100); nn = SvControl.GetMcStatus(); Trace.TraceFormat("programStatus:{0:X}", nn); } while((nn & (0x10 << 16)) != 0); if ((st & (0x10 << 16)) != 0) { //プログラム実行中であった場合はイベントをキャンセル扱いとする evObj.Cancel(0); Trace.TraceFormat("programEvent Canceled"); } } else { Trace.TraceFormat("Event Not Used"); } Trace.TraceFormat("Leave"); return((int)ErrCode.RET_OK); } catch (Exception) { Trace.TraceFormat("[ERR]Exception Parameter"); return((int)ErrCode.ERR_PARAM); } } else { return((int)ErrCode.ERR_EXEC); } }
/// <summary> /// イベントをキャンセル状態セットする /// </summary> /// <param name="id"></param> /// <returns></returns> public int CancelWait(int id) { Trace.TraceFormat("Entry:ID={0}", id); try { PEventManager.PEvent ev = _eventCtrl.GetEvent(id); ev.Cancel((int)ErrCode.ERR_EXEC); } catch (Exception) { Trace.TraceFormat("Exception: NotEventID={0}", id); return((int)ErrCode.ERR_PARAM); } Trace.TraceFormat("Leave"); return((int)ErrCode.RET_OK); }