|
@@ -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)
|