/// <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> /// <param name="eventList">イベントIDリスト</param> /// <param name="time">タイムアウト(ms)</param> /// <returns>発生したイベントIDのインデックス</returns> public int Wait(IList <int> eventList, int time) { WaitHandle[] evl = new WaitHandle[eventList.Count]; int[] evNo = new int[eventList.Count]; string msg = "["; Trace.TraceFormat("EventCount={0} Time={1}", eventList.Count, time); //イベントIDから真のイベントオブジェクトを取り出す int idx = 0; foreach (int evId in eventList) { if (evId < 0 || evId >= 255) { evNo = null; Trace.TraceFormat("[ERR]EventRangeOver={0}", evId); return((int)ErrCode.ERR_PARAM); } PEventManager.PEvent ev = _eventCtrl.GetEvent(evId); Object obj; if ((obj = ev.GetEvent() as AutoResetEvent) != null) { evl[idx] = obj as AutoResetEvent; } else { evl[idx] = obj as ManualResetEvent; } evNo[idx] = evId; idx++; msg += (evId.ToString() + ","); } msg += "]"; Trace.TraceFormat("Wait({0},{1})", msg, time); int ret = WaitHandle.WaitAny(evl, time); //使用したイベントIDは未使用状態にする _eventCtrl.Flush(eventList); if (ret == WaitHandle.WaitTimeout) { //タイムアウトの場合 Trace.TraceFormat("Leave TimeOut:{0}", time); return(ret); } //発生したイベント(インデックス)のイベントが持つID番号 Trace.TraceFormat("Leave:ID={0}", _eventCtrl.GetEvent(evNo[ret])._number); Trace.TraceFormat("Leave:St={0}", _eventCtrl.GetEvent(evNo[ret]).Status()); return(_eventCtrl.GetEvent(evNo[ret])._number); }
/// <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 GetEventErrCode(int id) { try { PEventManager.PEvent ev = _eventCtrl.GetEvent(id); return(ev.ErrorCode()); } catch (Exception) { return((int)ErrCode.ERR_PARAM); } }
public void SetIoEvent(PEventManager.PEvent ev, int port, int bit, int onoff) { ev.SetRsc(new IoData(port, bit, onoff)); if (onoff == 1) { _ioAssert[bit] = ev; } else { _ioNagate[bit] = ev; } }
/// <summary> /// イベント状態を取得 /// </summary> /// <param name="id"></param> /// <returns></returns> public int EventStatus(int id) { Trace.TraceFormat("Entry:ID={0}", id); try { PEventManager.PEvent ev = _eventCtrl.GetEvent(id); Trace.TraceFormat("Leave:Status={0}", ev.Status()); return(ev.Status()); } catch (Exception) { Trace.TraceFormat("[ERR]Exception NotEventID={0}", id); return((int)ErrCode.ERR_PARAM); } }
/// <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); }
/// <summary> /// 軸の移動 /// </summary> /// <param name="data">{"RX":xxxx,"RY":yyyy}</param> /// <returns></returns> public int Move(Dictionary <string, int> data, PEventManager.PEvent evObj) { Trace.TraceFormat("Entry"); int id = MoveAxis(data, evObj); if (id < 0) { Trace.TraceFormat("[ERR]ret={0}", id); evObj.Flush(); return(evObj.ErrorCode()); } Trace.TraceFormat("Leave:EventID={0}", evObj._number); return(evObj._number); }
/// <summary> /// スクリプト実行スレッド /// </summary> /// <param name="source"></param> public void execute_script(string source) { PEventManager.PEvent ev = VM.GetEvent(); ThreadArgs args = new ThreadArgs(); args.vm = VM; args.cmd = source; args._event = ev; args._timeOut = Int32.Parse(ProgTimeOut.Text); //スクリプト実行待ちのスレッド _waitThread = new Thread(new ParameterizedThreadStart(EventThread)); //スクリプト・スレッド _progThread = new Thread(new ParameterizedThreadStart(ScriptThread)); _waitThread.Start(args); _progThread.Start(args); }
/// <summary> /// サーボシステムの異常通知用イベントの設定 /// </summary> /// <param name="ev"></param> public void SetUnitEvent(PEventManager.PEvent ev) { _svCtrl.SetUnitEvent(ev); }
/// <summary> /// 軸移動指示(複数動作) /// </summary> /// <param name="data">{"X":xxx,"Y":xxx},{"X":xxx,"Y":yyy},...</param> /// <param name="evObj">イベントID</param> /// <returns></returns> public int MoveProgAxis(IList <Dictionary <string, int> > data, PEventManager.PEvent evObj) { return(_svCtrl.MoveProgAxis(data, evObj)); }
/// <summary> /// 軸移動指示(単一動作) /// </summary> /// <param name="data">{"X":xxx,"Y":yyy,...}</param> /// <param name="evObj">イベントID</param> /// <returns></returns> public int MoveAxis(Dictionary <string, int> data, PEventManager.PEvent evObj) { return(_svCtrl.MoveAxis(data, evObj)); }
/// <summary> /// コマンド受信スレッド /// </summary> unsafe private void CommandThread(Object argObj) { //引数の展開 object[] argsTmp = (object[])argObj; byte[] buffer = new byte[1024]; //ソケットの生成 _sock = new SockCtrl(); _sock.Init(_serverIP, (int)argsTmp[0]); while (_sock.listener == null) { Thread.Sleep(10); } try { _sock.listener.Pending(); } catch (Exception err) { _sock.listener.Start(); } while (true) { if (_sock.listener.Pending() == true) { _sock.Accept(); ConnectionMsg = "接続中"; Trace.TraceFormat("Socket Connected"); int len = 0; NetworkStream stream = _sock.stream; MemoryStream ms = new MemoryStream(); int cmdMode = 0; bool loop = true; while (loop) { //コマンド文字列受信 do { try { len = stream.Read(buffer, 0, 1); if (len == 0) { //クライアント側から切断された loop = false; ms.Position = 0; ms.Dispose(); break; } ms.Write(buffer, 0, len); } catch (Exception err) { //Read中に切断された //MessageBox.Show("CMD::" + err.Message, "警告", MessageBoxButton.OK, MessageBoxImage.Warning); WriteConsole(err.Message); loop = false; ms.Flush(); ms.Position = 0; ms.Dispose(); break; } //コマンドの最終文字は';' または'@'とする if (buffer[0] == ';') { cmdMode = 1; break; } if (buffer[0] == '@') { cmdMode = 2; break; } if (buffer[0] == '?') { cmdMode = 3; break; } }while (stream.DataAvailable); //コマンドを受信した if (loop == true && (int)ms.Position != 0) { Encoding enc = Encoding.UTF8; string cmd = enc.GetString(ms.GetBuffer(), 0, (int)ms.Length - 1); ms.Flush(); ms.Position = 0; ms.Dispose(); //コマンドスクリプトを実行する if (cmdMode == 1) { MessageData msg; try { ScriptSource src = _pythonConsole.Pad.Console.ScriptScope.Engine.CreateScriptSourceFromString(cmd); Object obj = src.Execute(_pythonConsole.Pad.Console.ScriptScope); msg = CreateMsg(MessageCode.SYS_CMD_RETOK, obj); } catch (Exception err) { //スクリプトの実行で例外発生 string errMsg = _pythonConsole.Pad.Console.ScriptScope.Engine.GetService <ExceptionOperations>().FormatException(err); Trace.TraceFormat("[ERR]Script:{0}", errMsg); //MessageBox.Show(errMsg, "err", MessageBoxButton.OK, MessageBoxImage.Error); _pythonConsole.Pad.Console.WriteLine(errMsg, Microsoft.Scripting.Hosting.Shell.Style.Out); msg = CreateMsg(MessageCode.SYS_CMD_RETNG, (int)ErrCode.ERR_EXEC); } try { //結果を送信する stream.Write(msg.Binary(), 0, Marshal.SizeOf(msg)); } catch (Exception err) { //MessageBox.Show("CMD_Write::" + err.Message, "警告", MessageBoxButton.OK, MessageBoxImage.Warning); WriteConsole(err.Message); loop = false; } } else if (cmdMode == 3) { //スクリプトファイルで実行 MessageData msg; try { ScriptSource src = _pythonConsole.Pad.Console.ScriptScope.Engine.CreateScriptSourceFromFile(cmd); Object obj = src.Execute(_pythonConsole.Pad.Console.ScriptScope); msg = CreateMsg(MessageCode.SYS_CMD_RETOK, obj); } catch (Exception err) { //スクリプトの実行で例外発生 string errMsg = _pythonConsole.Pad.Console.ScriptScope.Engine.GetService <ExceptionOperations>().FormatException(err); Trace.TraceFormat("[ERR]Script:{0}", errMsg); // MessageBox.Show(errMsg, "err", MessageBoxButton.OK, MessageBoxImage.Error); msg = CreateMsg(MessageCode.SYS_CMD_RETNG, (int)ErrCode.ERR_EXEC); } try { //結果を送信する stream.Write(msg.Binary(), 0, Marshal.SizeOf(msg)); } catch (Exception err) { Trace.TraceFormat("[ERR]Socket Write:{0}", err.Message); //MessageBox.Show("CMD_Write::" + err.Message, "警告", MessageBoxButton.OK, MessageBoxImage.Warning); WriteConsole(err.Message); loop = false; } _ExecuteScript(this, new ScriptEventArgs("\n")); } else { // 別スレッドでのコマンド実行 bool threadRun = true; if (_scriptThread != null) { if (_scriptThread.ThreadState != ThreadState.Stopped) { //前回のスクリプトスレッドが動作中 Trace.TraceFormat("Script already Run"); MessageData msg = CreateMsg(MessageCode.SYS_CMD_RETNG, (int)ErrCode.ERR_EXEC); try { //結果を送信する stream.Write(msg.Binary(), 0, Marshal.SizeOf(msg)); } catch (Exception err) { Trace.TraceFormat("[ERR]Socket Write:{0}", err.Message); //MessageBox.Show("CMD_Write::" + err.Message, "警告", MessageBoxButton.OK, MessageBoxImage.Warning); WriteConsole(err.Message); loop = false; threadRun = false; } threadRun = false; } } if (threadRun == true) { //スクリプト実行のイベント PEventManager.PEvent evObj = GetEvent(); ThreadArgs args = new ThreadArgs(); args.vm = this; args.cmd = cmd; args._event = evObj; _scriptThread = new Thread(new ParameterizedThreadStart(ScriptThread)); _scriptThread.Start(args); Trace.TraceFormat("Script thread started"); //execute_program() のリターン用データ MessageData msg = CreateMsg(MessageCode.SYS_CMD_RETOK, evObj._number); try { stream.Write(msg.Binary(), 0, Marshal.SizeOf(msg)); } catch (Exception err) { Trace.TraceFormat("[ERR]Socket:{0}", err.Message); //MessageBox.Show("SCR_Write::" + err.Message, "警告", MessageBoxButton.OK, MessageBoxImage.Warning); WriteConsole(err.Message); loop = false; } } } ms = new MemoryStream(); } } _sock.Close(); ConnectionMsg = "未接続"; _threadRestart = 1; Trace.TraceFormat("Socket DisConnected"); } else { Thread.Sleep(500); if (_threadStop != 0) { break; } } } _sock.Close(); ConnectionMsg = "未接続"; _threadRestart = 1; Trace.TraceFormat("Socket DisConnected"); }
public int GetMsgEventID() { _msgEvent = GetEvent(); return(_msgEvent._number); }