/// <summary> /// 指定軸のJog動作開始/停止 /// </summary> /// <param name="axisNo">軸番号(0~)</param> /// <param name="dir">方向 1:+ -1:- 0:停止</param> /// <param name="spd">0:停止 ※現時点では設定不可</param> /// <returns></returns> public int ServoJog(int axisNo, int dir, int spd) { Trace.TraceFormat("Entry:axisNo={0} dir={1},spd={2}", axisNo, dir, spd); if (spd > Setting.MaxJogSpd) { Trace.TraceFormat("[ERR]Over spd={0}-{1}", spd, Setting.MaxJogSpd); return((int)ErrCode.ERR_PARAM); } if (spd == 0 && dir != 0) { if (spd == 0) { //設定値が0なら現在の設定値を取得 spd = SvControl.GetAxisParam(axisNo, (int)SvParaType.JOG_SPD); } if (spd == 0) { //それでも0なら適当な値 spd = 10000; } } int ret = SvControl.JogAxis(axisNo, dir, spd); Trace.TraceFormat("Leave:{0}", ret); return(ret); }
/// <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); }
unsafe private void UnitEventThread() { UnitEvent[0] = GetEvent(); //サーボユニット用通知イベント WaitHandle[] hdl = new WaitHandle[] { UnitEvent[0].GetEvent() as AutoResetEvent }; SvControl.SetUnitEvent(UnitEvent[0]); while (true) { int idx = WaitHandle.WaitAny(hdl, 500); if (idx != WaitHandle.WaitTimeout) { if (idx == 0) { //サーボユニット状態通知 Trace.TraceFormat("Send Servo Error"); SendIoMessage(0, MessageCode.SYS_SV_ALM); } UnitEvent[idx].Reset(); } if (_threadStop != 0) { break; } } }
/// <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); } }
public void QuitView() { //サーボ終了処理 SvControl.Close(); //I/O終了処理 IoControl.Close(); //生成したスレッドの終了(フラグを立てる) _threadStop = 1; }
/// <summary> /// 軸の移動 /// </summary> /// <param name="data">{"RX":xxxx,"RY":yyyy}</param> /// <returns></returns> public int SvMove(Dictionary <string, int> data) { Trace.TraceFormat("Entry"); try { return(SvControl.Move(data, _eventCtrl.GetEvent())); } catch (Exception) { //イベントか取得できない場合は例外がスローされる Trace.TraceFormat("[ERR]No Event"); return((int)ErrCode.ERR_EXEC); } }
/* * /// <summary> * /// サーボ電源のOn/Off * /// </summary> * /// <param name="onoff">On:1 Off:0</param> * /// <returns>Error: <0 </returns> * public int ServoPower(int onoff) * { * //コントローラーの電源ON * if( onoff == 0 ) { * SvControl.Power(0); * } * * //制御電源ONの手順 * if( onoff == 1 ) { * OutBitOnOff(0, true); * OutBitOnOff(1, true); * OutBitOnOff(2, true); * Thread.Sleep(100); * OutBitOnOff(2, false); * } * else { * OutBitOnOff(2, false); * OutBitOnOff(1, false); * Thread.Sleep(500); * OutBitOnOff(0, false); * } * if( onoff == 1) { * Thread.Sleep(2000); //アンプ電源が入ってから待ちを入れる * SvControl.Power(1); * } * return ((SvPowStat == true) ? 1 : 0); * } */ /// <summary> /// サーボのステータス情報を更新する /// </summary> public void UpdateServoStatus() { for (int axisNo = 0; axisNo < 5; axisNo++) { uint data = (uint)SvControl.GetAxisStatus(axisNo, 1); if (_svStatus[axisNo] != data) { _svStatus[axisNo] = data; string propName = "AxisBackGround" + axisNo.ToString(); RaisePropertyChanged(propName); propName = "AxisErrMsg" + axisNo.ToString(); RaisePropertyChanged(propName); } } }
/// <summary> /// システム全体の状態取得 /// </summary> /// <returns></returns> public int GetStatus() { int status = 0; //サーボ軸情報(0-7 bit: 異常あり=1) int[] axis = new int[] { (int)AxisNo.Axis_X, (int)AxisNo.Axis_Y, (int)AxisNo.Axis_Z, (int)AxisNo.Axis_A, (int)AxisNo.Axis_B }; for (int i = 0; i < 5; i++) { status |= (SvControl.GetAxisAlam(axis[i]) != 0) ? (1 << i) : 0; //異常アリ } //サーボエリア情報(8-15 bit) Double pos1 = 0.0, pos2 = 0.0, pos3 = 0.0, pos4 = 0.0, pos5 = 0.0, pos6 = 0.0; SvControl.GetCurPos(ref pos1, ref pos2, ref pos3, ref pos4, ref pos5, ref pos6); int areaCode = 0; status |= (areaCode << 8); //Rowthonユニット情報(16-19) byte rowthonStat = 0; status |= (rowthonStat << 16); //I/Oユニット情報(20-23) byte ioStat = 0; status |= (ioStat << 16); //Visionユニット情報(24-27) byte visionStat = 0; status |= (visionStat << 24); return(status); }
/// <summary> /// 実装ユニットのエラークリア /// </summary> /// <returns></returns> public int ClearError() { int st; Trace.TraceFormat("Entry"); //サーボシステムのエラークリア if ((st = SvControl.Reset()) < 0) { Trace.TraceFormat("[ERR]ServoReset:{0}", st); return(st); } if ((st = SvControl.ClrError()) < 0) { Trace.TraceFormat("[ERR]ServoErrorClear:{0}", st); return(st); } //I/Oシステムのエラークリア //画像システムのエラークリア Trace.TraceFormat("Leave:OK"); return((int)ErrCode.RET_OK); }
/// <summary> /// サーボエラークリア・コマンド /// </summary> /// <param name="obj"></param> public void SvErrorClear(object obj) { SvControl.ClrError(); }
/// <summary> /// サーボ・リセットコマンド /// </summary> /// <param name="obj"></param> public void SvReset(object obj) { SvControl.Reset(); }