| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 | using Aitex.Core.RT.Log;using Aitex.Core.RT.Routine;using MECF.Framework.Common.Routine;using PunkHPX8_Core;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Aitex.Core.RT.SCCore;namespace PunkHPX8_RT.Devices.LinMot{       public class LinMotStartContinueCurveRoutine : RoutineBase, IRoutine    {        private enum LinMotStartContinueStep        {            WriteCurveIdRam,            CurveIdDelay,            WriteAmplitudeRam,            AmplitudeDelay,            WriteTimeScaleRam,            Delay,            CommandTable,            CommandTableDelay,            CommandTableCheckRun,            ReCommandTable,            End        }        #region 内部变量        private LinMotAxis _axis;        private int _speed;        /// <summary>        /// Linmot检测运动时间        /// </summary>        private int _holdoffMilliseconds = 5000;        /// <summary>        /// 是否运动        /// </summary>        private bool _isRun = false;        #endregion        public LinMotStartContinueCurveRoutine(string module,LinMotAxis axis) : base(module)        {            _axis = axis;        }        public void Abort()        {            Runner.Stop("Manual Abort");        }        public RState Monitor()        {            //Runner.Run(LinMotStartContinueStep.WriteCurveIdRam, () => { return _axis.WriteRamIntValue(0xC8, 0x14, 1); }, 100)            //    .Delay(LinMotStartContinueStep.CurveIdDelay, 200)            Runner.Run(LinMotStartContinueStep.WriteAmplitudeRam, () => { return _axis.WriteRamIntValue(0xCA, 0x14, 100 * 10); }, 100)                .Delay(LinMotStartContinueStep.AmplitudeDelay, 100)                .Run(LinMotStartContinueStep.WriteTimeScaleRam, () => { return _axis.WriteRamIntValue(0xCB,0x14,_speed*100); }, 100)                .Delay(LinMotStartContinueStep.Delay, 100)                .Run(LinMotStartContinueStep.CommandTable, () => { return _axis.SendCommandTableOperation(1); },_delay_1ms)                .Delay(LinMotStartContinueStep.CommandTableDelay,1000)                .Run(LinMotStartContinueStep.CommandTableCheckRun, () => { _isRun = _axis.IsMotorOn; return true; },_delay_1ms)                .RunIf(LinMotStartContinueStep.ReCommandTable,!_isRun, () => { return _axis.SendCommandTableOperation(1); },                     () => _axis.IsMotorOn,_holdoffMilliseconds-_delay_1s)                .End(LinMotStartContinueStep.End, NullFun);            return Runner.Status;        }        public RState Start(params object[] objs)        {            _speed = (int)(objs[0]);            if (!CheckPreCondition())            {                return RState.Failed;            }            if (SC.ContainsItem("Linmot.LinmotHoldoffMilliseconds"))            {                _holdoffMilliseconds = SC.GetValue<int>("Linmot.LinmotHoldoffMilliseconds");            }            _isRun = false;            return Runner.Start(Module, "Start Curve");        }        /// <summary>        /// 前置条件        /// </summary>        /// <returns></returns>        private bool CheckPreCondition()        {            if (!_axis.IsSwitchOn)            {                LOG.WriteLog(eEvent.ERR_LINMOT, Module, "axis is not switch on");                return false;            }            if (!_axis.IsHomed)            {                LOG.WriteLog(eEvent.ERR_LINMOT, Module, "axis is not homed");                return false;            }            if (!_axis.IsConnectd)            {                LOG.WriteLog(eEvent.ERR_LINMOT, Module, "axis is not connected");                return false;            }            if (_axis.IsError)            {                LOG.WriteLog(eEvent.ERR_LINMOT, Module, "axis is in error");                return false;            }            return true;        }    }}
 |