using Aitex.Common.Util; using Aitex.Core.RT.Log; using Aitex.Core.RT.SCCore; using Aitex.Core.Util; using MECF.Framework.Common.Device.Festo; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.IOCore; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace MECF.Framework.Common.Device.Galil { public class GalilControllerCfgManager : Singleton { #region 常量 private const string STOPCODE = "StopCode"; private const string REFERENCE_POSITION = "ReferencePosition"; private const string TORQUE = "Torque"; private const string VELOCITY = "Velocity"; private const string POSITION_ERROR = "PositionError"; private const string AUXILIARY_POSITION="AuxiliaryPosition"; #endregion #region 内部变量 /// /// 模块数据字典(key-模块名称,value-模块Galil数据) /// private Dictionary _moduleGalilDataDictionary = new Dictionary(); /// /// 电机数据字典(key-电机名称,value-电机数据) /// private Dictionary _moduleNameAxisDataDictionary = new Dictionary(); /// /// 电机索引字典(key-电机名称,value-索引) /// private Dictionary _moduleNameIndexDictionary = new Dictionary(); /// /// 模块电机集合字典(key-模块名称,value-电机集合) /// private Dictionary> _moduleNameLstDictionary= new Dictionary>(); /// /// 模块电机配置字典(key-电机名称,value-电机配置) /// private Dictionary _moduleNameAxisConfigDictionary = new Dictionary(); /// /// 模块电机tcp设备字典(key-模块名称,value-tcp设备) /// private Dictionary _moduleGalilTcpDeviceDictionary = new Dictionary(); /// /// 电机 /// private char[] _axisArray = null; #endregion /// /// 初始化 /// public void Initialize() { bool isSimulate = SC.GetValue("System.IsSimulatorMode"); string xmlPath = ""; try { if (isSimulate) { xmlPath = PathManager.GetCfgDir() + "Devices\\GalilControllerCfg-Simulator.xml"; } else { xmlPath = PathManager.GetCfgDir() + "Devices\\GalilControllerCfg.xml"; } GalilControllerCfg cfg = CustomXmlSerializer.Deserialize(new FileInfo(xmlPath)); if (cfg != null) { foreach (var config in cfg.GalilDeviceConfigs) { InitializeGalilDevice(config); GalilTcpDevice galilDevice = new GalilTcpDevice(config.Module, config.IpAddress, config.Port); galilDevice.ReceiveTimeout = config.RecvTimeout; galilDevice.SendTimeout = config.SendTimeout; galilDevice.Initialize(); _moduleGalilTcpDeviceDictionary[config.Module] = galilDevice; } } } catch { LOG.WriteLog(eEvent.ERR_GALIL, "Galil", "Load galil xml failed"); } } /// /// 初始化Galil 设备 /// /// private void InitializeGalilDevice(GalilDeviceConfig deviceConfig) { List lst = new List(); int maxIndex = 0; foreach(var item in deviceConfig.GalilAxises) { _moduleNameIndexDictionary[$"{deviceConfig.Module}.{item.Name}"] = item.Index; _moduleNameAxisConfigDictionary[$"{deviceConfig.Module}.{item.Name}"]=item; if (!lst.Contains(item.Name)) { lst.Add(item.Name); } if (maxIndex < item.Index) { maxIndex= item.Index; } } if (lst.Count > 0) { _moduleNameLstDictionary[deviceConfig.Module] = lst; _axisArray = new char[maxIndex+1]; int a = 'A'; for(int i = 0; i < _axisArray.Length; i++) { _axisArray[i] = (char)(a + i); } } } /// /// 更新模块数据 /// /// public void UpdateModuleData(string module,GalilControllerData controllerData) { if (!_moduleGalilDataDictionary.ContainsKey(module)) { _moduleGalilDataDictionary[module] = controllerData; } if (!_moduleNameLstDictionary.ContainsKey(module)) { return; } List lst = _moduleNameLstDictionary[module]; foreach (var item in lst) { string moduleName = $"{module}.{item}"; if (!_moduleNameIndexDictionary.ContainsKey(moduleName)) { continue; } int index = _moduleNameIndexDictionary[moduleName]; if(index>=controllerData.GalilAxisDatas.Count) { continue; } GalilAxisData galilAxisData=controllerData.GalilAxisDatas[index]; CheckAxisDataChanged(moduleName, galilAxisData); } } /// /// 检验电机数据是否发生变化 /// /// /// private void CheckAxisDataChanged(string moduleName,GalilAxisData axisData) { if (_moduleNameAxisDataDictionary.ContainsKey(moduleName)) { NotifyGalilAxisData(moduleName, _moduleNameAxisDataDictionary[moduleName],axisData); _moduleNameAxisDataDictionary[moduleName].Copy(axisData); } else { NotifyGalilAxisAllData(moduleName, axisData); _moduleNameAxisDataDictionary[moduleName] = axisData.Clone(); } } /// /// 更新Galil电机数据 /// /// private void NotifyGalilAxisAllData(string moduleName,GalilAxisData axisData) { PropertyInfo[] propertyInfos= axisData.GetType().GetProperties(); foreach(var info in propertyInfos) { object value = info.GetValue(axisData); GalilAxisManager.Instance.UpdateIoValue($"{moduleName}.{info.Name}", value); } } /// /// 通知Galil电机数据 /// /// /// private void NotifyGalilAxisData(string moduleName,GalilAxisData sourceData, GalilAxisData targetData) { PropertyInfo[] propertyInfos = sourceData.GetType().GetProperties(); foreach (var info in propertyInfos) { object sourceValue= info.GetValue(sourceData); object targetValue = info.GetValue(targetData); if (sourceValue.ToString() != targetValue.ToString()) { GalilAxisManager.Instance.UpdateIoValue($"{moduleName}.{info.Name}", targetValue); } } } /// /// 设置 /// /// /// /// /// /// public bool SetAxisCommand(string module, string name,string commad, object value) { if (!_moduleGalilTcpDeviceDictionary.ContainsKey(module)) { LOG.WriteLog(eEvent.ERR_GALIL, module, $"{module} does not have tcp device"); return false; } string str = $"{module}.{name}"; if(_moduleNameIndexDictionary.ContainsKey(str)) { int index = _moduleNameIndexDictionary[str]; if (index >= _axisArray.Length) { LOG.WriteLog(eEvent.ERR_GALIL, module, $"{str} is not matched with index"); return false; } string strCommand = ""; string axis = _axisArray[index].ToString(); if (value != null) { strCommand = $"{commad}{axis}={value};"; } else { strCommand = $"{commad}{axis};"; } return _moduleGalilTcpDeviceDictionary[module].SetGalilCommand(strCommand); } else { LOG.WriteLog(eEvent.ERR_GALIL, module, $"{str} is not matched with index"); return false; } } /// /// 获取Galil配置对象 /// /// /// /// public GalilAxisConfig GetGalilAxisConfig(string module,string name) { string str = $"{module}.{name}"; if (_moduleNameAxisConfigDictionary.ContainsKey(str)) { return _moduleNameAxisConfigDictionary[str]; } else { return null; } } } }