Example #1
0
        /// <summary>
        /// Рассичтывает число импульсов, необходимых для достижения угла phi.
        /// </summary>
        /// <param name="ldp">Конструктивные параметры плеча робота-манипулятора</param>
        /// <param name="phi">Угол поворота плеча, градусы</param>
        /// <returns>Число импульсов</returns>
        private static long CalculatePulsesCount(LeverDesignParameters ldp, double phi)
        {
            phi *= ldp.IsABIncreasesOnStepperCW ? -deg : deg;
            double pulsesCount = ldp.IsABIncreasesOnStepperCW ? -1 : 1;

            pulsesCount *= (1.0 / ldp.I) * ((ldp.AB - Math.Sqrt(Math.Pow(ldp.AO, 2) + Math.Pow(ldp.BO, 2) - (2 * ldp.AO * ldp.BO * Math.Cos(ldp.AlphaRad + ldp.BetaRad + phi)))) / (ldp.P * ldp.RoRad));

            return(Convert.ToInt64(pulsesCount));
        }
Example #2
0
        /// <summary>
        /// Возвращает число импульсов, выдаваемых УЧПУ.
        /// </summary>
        /// <param name="ldp">Конструктивные параметры плеча робота-манипулятора</param>>
        /// <param name="phi">Угол поворота плеча, градусы</param>
        /// <returns>Число импульсов</returns>
        public static long GetPulsesCount(LeverDesignParameters ldp, double phi)
        {
            long pulsesCount = CalculatePulsesCount(ldp, phi);

            if (!IsPulsesCountCorrect(ldp, pulsesCount))
            {
                throw new DesignParametersException("Конструктивные параметры робота-манипулятора (или рабочая зона) не позволяют достичь заданный угол");
            }

            return(pulsesCount);
        }
Example #3
0
        /// <summary>
        /// Рассчитывает значение AB в зависимости от числа импульсов и текущего значения AB.
        /// </summary>
        /// <param name="ldp">Конструктивные параметры плеча робота-манипулятора</param>
        /// <param name="pulsesCount">Число импульсов</param>
        /// <returns>Новое значение AB</returns>
        public static double GetNewAB(LeverDesignParameters ldp, long pulsesCount)
        {
            double newValue = CalculateAB(ldp, pulsesCount);

            if (!ldp.Workspace.IsBetweenMinAndMax(newValue))
            {
                throw new DesignParametersException("Новое значение расстояния от оси подвеса ходового винта до точки крепления плеча к гайке ходового винта не удовлетворяет конструктивным параметрам робота или рабочей зоны");
            }

            return(newValue);
        }
Example #4
0
        /// <summary>
        /// Возвращает количество импульсов для достижения положения <paramref name="abTo"/> из положения <paramref name="abFrom"/>
        /// плеча <paramref name="ldp"/>.
        /// </summary>
        public static long GetPulsesCount(LeverDesignParameters ldp, double abFrom, double abTo)
        {
            if (!ldp.Workspace.IsBetweenMinAndMax(abFrom))
            {
                throw new DesignParametersException("Значение расстояния от оси подвеса ходового винта до точки крепления плеча к гайке ходового винта не удовлетворяет конструктивным параметрам робота или рабочей зоны");
            }

            var phi = ldp.GetAngleByABValue(abTo);

            phi *= ldp.IsABIncreasesOnStepperCW ? -deg : deg;
            double pulsesCount = ldp.IsABIncreasesOnStepperCW ? -1 : 1;

            pulsesCount *= (1.0 / ldp.I) * ((abFrom - Math.Sqrt(Math.Pow(ldp.AO, 2) + Math.Pow(ldp.BO, 2) - (2 * ldp.AO * ldp.BO * Math.Cos(ldp.AlphaRad + ldp.BetaRad + phi)))) / (ldp.P * ldp.RoRad));

            return(Convert.ToInt64(pulsesCount));
        }
Example #5
0
        private LeverDesignParameters GetLeverDesign(DesignType designType)
        {
            var design = designs.Single(d => d.DesignType == designType);

            var lever = new UM160CalculationLib.LeverDesignParameters(GetValue(design.Items, ValueType.AO),
                                                                      GetValue(design.Items, ValueType.BO),
                                                                      GetValue(design.Items, ValueType.P),
                                                                      GetValue(design.Items, ValueType.Ro),
                                                                      GetValue(design.Items, ValueType.Alpha),
                                                                      GetValue(design.Items, ValueType.Beta),
                                                                      GetValue(design.Items, ValueType.I),
                                                                      design.IsAbIncreases,
                                                                      GetValue(design.Items, ValueType.AB),
                                                                      GetValue(design.Items, ValueType.ABmin),
                                                                      GetValue(design.Items, ValueType.ABmax));

            lever.ABzero = GetAbZero(design, lever);

            return(lever);
        }
Example #6
0
 /// <summary>
 /// Рассчитывает значение AB в зависимости от числа импульсов и текущего значения AB.
 /// </summary>
 /// <param name="ldp">Конструктивные параметры плеча робота-манипулятора</param>
 /// <param name="pulsesCount">Число импульсов</param>
 /// <returns>Новое значение AB</returns>
 private static double CalculateAB(LeverDesignParameters ldp, long pulsesCount)
 {
     pulsesCount = ldp.IsABIncreasesOnStepperCW ? pulsesCount : -pulsesCount;
     // Округляем сотые значение миллиментов.
     return(Math.Round(ldp.AB + (ldp.RoRad * pulsesCount * ldp.I * ldp.P), 0));
 }
Example #7
0
 /// <summary>
 /// Возвращает истину если pulsesCount допустимое значение.
 /// </summary>
 /// <param name="ldp">Конструктивные параметры плеча робота-манипулятора</param>
 /// <param name="pulsesCount">Число импульсов</param>
 /// <returns>Истина, если pulsesCount допустимое значение</returns>
 private static bool IsPulsesCountCorrect(LeverDesignParameters ldp, long pulsesCount)
 {
     return(ldp.Workspace.IsBetweenMinAndMax(CalculateAB(ldp, pulsesCount)));
 }