Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        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;
                }
            }
        }
Пример #4
0
        /// <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);
            }
        }
Пример #5
0
        public void QuitView()
        {
            //サーボ終了処理
            SvControl.Close();

            //I/O終了処理
            IoControl.Close();
            //生成したスレッドの終了(フラグを立てる)
            _threadStop = 1;
        }
Пример #6
0
 /// <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);
     }
 }
Пример #7
0
/*
 *              /// <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);
                }
            }
        }
Пример #8
0
        /// <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);
        }
Пример #9
0
        /// <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);
        }
Пример #10
0
 /// <summary>
 ///  サーボエラークリア・コマンド
 /// </summary>
 /// <param name="obj"></param>
 public void SvErrorClear(object obj)
 {
     SvControl.ClrError();
 }
Пример #11
0
 /// <summary>
 ///  サーボ・リセットコマンド
 /// </summary>
 /// <param name="obj"></param>
 public void SvReset(object obj)
 {
     SvControl.Reset();
 }