Browse Source

Optimize minimum step setting in MotorSimulator;

niuyx 1 month ago
parent
commit
437452ed25
1 changed files with 50 additions and 20 deletions
  1. 50 20
      Framework/Common/Simulator/MotorSimulator.cs

+ 50 - 20
Framework/Common/Simulator/MotorSimulator.cs

@@ -1,10 +1,11 @@
 using Aitex.Common.Util;
+using Aitex.Core.RT.Log;
 using Aitex.Core.Util;
+using MECF.Framework.Common.Beckhoff.AxisProvider;
 using MECF.Framework.Common.Device.Galil;
 using System;
 using System.Collections.Generic;
 using System.IO;
-using System.Threading;
 
 namespace MECF.Framework.Common.Simulator
 {
@@ -45,6 +46,10 @@ namespace MECF.Framework.Common.Simulator
         /// 电机数据字典(key:Name(module.name),value:Datas)
         /// </summary>
         private Dictionary<string, SimulatorMotionData> _motorNameDataDic = new Dictionary<string, SimulatorMotionData>();
+        /// <summary>
+        /// Key:moduleName, Value:minStep
+        /// </summary>
+        private Dictionary<string, int> _motorNameMinStepDic = new Dictionary<string, int>();
         #endregion
 
         #region 属性
@@ -75,22 +80,51 @@ namespace MECF.Framework.Common.Simulator
         /// </summary>
         private void Init()
         {
-            ////加载对应配置文件 GalilControllerCfg-Simulator.xml,初始化数据字典
-            string oldXmlPath = PathManager.GetCfgDir();
-            string newXmlPath = oldXmlPath.Replace("CyberX8_Simulator", "CyberX8_RT") + "Devices\\GalilControllerCfg-Simulator.xml";
-            GalilControllerCfg cfg = CustomXmlSerializer.Deserialize<GalilControllerCfg>(new FileInfo(newXmlPath));
-            foreach (GalilDeviceConfig config in cfg.GalilDeviceConfigs)
-            {               
-                foreach (GalilAxisConfig item in config.GalilAxises)
+            //加载对应配置文件 GalilControllerCfg-Simulator.xml,初始化数据字典
+            try
+            {
+                string oldXmlPath = PathManager.GetCfgDir();
+                string newXmlPath = oldXmlPath.Replace("CyberX8_Simulator", "CyberX8_RT") + "Devices\\GalilControllerCfg-Simulator.xml";
+                GalilControllerCfg cfg = CustomXmlSerializer.Deserialize<GalilControllerCfg>(new FileInfo(newXmlPath));
+                if (cfg != null)
                 {
-                    _motorNameDataDic[$"{config.Module}.{item.Name}"] = new SimulatorMotionData();
-                    _motorNameDataDic[$"{config.Module}.{item.Name}"].FwdSoftLimit = item.ForwardSoftwareLimit;
-                    _motorNameDataDic[$"{config.Module}.{item.Name}"].RevSoftLimit = item.ReverseSoftwareLimit;
-                    _motorNameDataDic[$"{config.Module}.{item.Name}"].NegativeTorqueLimit = item.NegativeTorqueLimit;
-                    _motorNameDataDic[$"{config.Module}.{item.Name}"].PositiveTorqueLimit = item.PositiveTorqueLimit;
-                    _motorNameDataDic[$"{config.Module}.{item.Name}"].SwitchSignal = true;
+                    foreach (GalilDeviceConfig config in cfg.GalilDeviceConfigs)
+                    {
+                        foreach (GalilAxisConfig item in config.GalilAxises)
+                        {
+                            _motorNameDataDic[$"{config.Module}.{item.Name}"] = new SimulatorMotionData();
+                            _motorNameDataDic[$"{config.Module}.{item.Name}"].FwdSoftLimit = item.ForwardSoftwareLimit;
+                            _motorNameDataDic[$"{config.Module}.{item.Name}"].RevSoftLimit = item.ReverseSoftwareLimit;
+                            _motorNameDataDic[$"{config.Module}.{item.Name}"].NegativeTorqueLimit = item.NegativeTorqueLimit;
+                            _motorNameDataDic[$"{config.Module}.{item.Name}"].PositiveTorqueLimit = item.PositiveTorqueLimit;
+                            _motorNameDataDic[$"{config.Module}.{item.Name}"].SwitchSignal = true;
+                        }
+                    }
                 }
             }
+            catch
+            {
+                LOG.WriteLog(eEvent.ERR_GALIL, "Galil", "Load galil GalilControllerCfg-Simulator.xml failed");
+            }                  
+            
+            //加载AxisProviderCfg.xml
+            try
+            {
+                string oldXmlPath = PathManager.GetCfgDir();
+                string newXmlPath = oldXmlPath.Replace("CyberX8_Simulator", "CyberX8_RT") + "Devices\\AxisProviderCfg.xml";
+                BeckhoffAxisProviderCfg axisProviderCfg = CustomXmlSerializer.Deserialize<BeckhoffAxisProviderCfg>(new FileInfo(newXmlPath));
+                if (axisProviderCfg != null)
+                {
+                    foreach (BeckhoffProviderAxis item in axisProviderCfg.Axes)
+                    {
+                        _motorNameMinStepDic[item.Name] = (int)item.ScaleFactor / 30;
+                    }
+                }
+            }
+            catch
+            {
+                LOG.WriteLog(eEvent.ERR_AXIS, "axisProvider", "Load AxisProviderCfg.xml failed");
+            }
         }
         /// <summary>
         /// 定时器执行
@@ -214,9 +248,7 @@ namespace MECF.Framework.Common.Simulator
                 if (motionData.ActualPosition < motionData.TargetPosition)
                 {
                     //motionData.ActualPosition += (motionData.ActualVelocity * TIMER_INTERVAL / 1000);
-                    int step = 100;
-                    if (name.Contains("LS")) step = 1000;
-                    motionData.ActualPosition += ((motorStep / MOTOR_STEP_FACTOR < step) ? step : motorStep / MOTOR_STEP_FACTOR);
+                    motionData.ActualPosition += ((motorStep / MOTOR_STEP_FACTOR < _motorNameMinStepDic[name]) ? _motorNameMinStepDic[name] : motorStep / MOTOR_STEP_FACTOR);
                     bool fwdLimit = motionData.FwdSoftLimit != 0 ? motionData.ActualPosition >= motionData.FwdSoftLimit : false;
                     if (fwdLimit || motionData.ActualPosition >= motionData.TargetPosition)
                     {
@@ -230,9 +262,7 @@ namespace MECF.Framework.Common.Simulator
                 //反向运动
                 else if (motionData.ActualPosition > motionData.TargetPosition)
                 {
-                    int step = 100;
-                    if (name.Contains("LS")) step = 1000;
-                    motionData.ActualPosition -= ((motorStep / MOTOR_STEP_FACTOR < step) ? step : motorStep / MOTOR_STEP_FACTOR);
+                    motionData.ActualPosition -= ((motorStep / MOTOR_STEP_FACTOR < _motorNameMinStepDic[name]) ? _motorNameMinStepDic[name] : motorStep / MOTOR_STEP_FACTOR);
                     //motionData.ActualPosition -= (motionData.ActualVelocity * TIMER_INTERVAL / 1000);
                     bool revLimit = motionData.RevSoftLimit != 0 ? motionData.ActualPosition <= motionData.RevSoftLimit : false;
                     if (revLimit || motionData.ActualPosition <= motionData.TargetPosition)