GalilControllerCfgManager.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. using Aitex.Common.Util;
  2. using Aitex.Core.RT.Log;
  3. using Aitex.Core.RT.SCCore;
  4. using Aitex.Core.Util;
  5. using MECF.Framework.Common.Device.Festo;
  6. using MECF.Framework.Common.Equipment;
  7. using MECF.Framework.Common.IOCore;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.IO;
  11. using System.Linq;
  12. using System.Reflection;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. namespace MECF.Framework.Common.Device.Galil
  16. {
  17. public class GalilControllerCfgManager : Singleton<GalilControllerCfgManager>
  18. {
  19. #region 常量
  20. private const string STOPCODE = "StopCode";
  21. private const string REFERENCE_POSITION = "ReferencePosition";
  22. private const string TORQUE = "Torque";
  23. private const string VELOCITY = "Velocity";
  24. private const string POSITION_ERROR = "PositionError";
  25. private const string AUXILIARY_POSITION="AuxiliaryPosition";
  26. #endregion
  27. #region 内部变量
  28. /// <summary>
  29. /// 模块数据字典(key-模块名称,value-模块Galil数据)
  30. /// </summary>
  31. private Dictionary<string, GalilControllerData> _moduleGalilDataDictionary = new Dictionary<string, GalilControllerData>();
  32. /// <summary>
  33. /// 电机数据字典(key-电机名称,value-电机数据)
  34. /// </summary>
  35. private Dictionary<string, GalilAxisData> _moduleNameAxisDataDictionary = new Dictionary<string, GalilAxisData>();
  36. /// <summary>
  37. /// 电机索引字典(key-电机名称,value-索引)
  38. /// </summary>
  39. private Dictionary<string, int> _moduleNameIndexDictionary = new Dictionary<string, int>();
  40. /// <summary>
  41. /// 模块电机集合字典(key-模块名称,value-电机集合)
  42. /// </summary>
  43. private Dictionary<string,List<string>> _moduleNameLstDictionary= new Dictionary<string,List<string>>();
  44. /// <summary>
  45. /// 模块电机配置字典(key-电机名称,value-电机配置)
  46. /// </summary>
  47. private Dictionary<string, GalilAxisConfig> _moduleNameAxisConfigDictionary = new Dictionary<string, GalilAxisConfig>();
  48. /// <summary>
  49. /// 模块电机tcp设备字典(key-模块名称,value-tcp设备)
  50. /// </summary>
  51. private Dictionary<string, GalilTcpDevice> _moduleGalilTcpDeviceDictionary = new Dictionary<string, GalilTcpDevice>();
  52. /// <summary>
  53. /// 电机
  54. /// </summary>
  55. private char[] _axisArray = null;
  56. #endregion
  57. /// <summary>
  58. /// 初始化
  59. /// </summary>
  60. public void Initialize()
  61. {
  62. bool isSimulate = SC.GetValue<bool>("System.IsSimulatorMode");
  63. string xmlPath = "";
  64. try
  65. {
  66. if (isSimulate)
  67. {
  68. xmlPath = PathManager.GetCfgDir() + "Devices\\GalilControllerCfg-Simulator.xml";
  69. }
  70. else
  71. {
  72. xmlPath = PathManager.GetCfgDir() + "Devices\\GalilControllerCfg.xml";
  73. }
  74. GalilControllerCfg cfg = CustomXmlSerializer.Deserialize<GalilControllerCfg>(new FileInfo(xmlPath));
  75. if (cfg != null)
  76. {
  77. foreach (var config in cfg.GalilDeviceConfigs)
  78. {
  79. InitializeGalilDevice(config);
  80. GalilTcpDevice galilDevice = new GalilTcpDevice(config.Module, config.IpAddress, config.Port);
  81. galilDevice.ReceiveTimeout = config.RecvTimeout;
  82. galilDevice.SendTimeout = config.SendTimeout;
  83. galilDevice.Initialize();
  84. _moduleGalilTcpDeviceDictionary[config.Module] = galilDevice;
  85. }
  86. }
  87. }
  88. catch
  89. {
  90. LOG.WriteLog(eEvent.ERR_GALIL, "Galil", "Load galil xml failed");
  91. }
  92. }
  93. /// <summary>
  94. /// 初始化Galil 设备
  95. /// </summary>
  96. /// <param name="deviceConfig"></param>
  97. private void InitializeGalilDevice(GalilDeviceConfig deviceConfig)
  98. {
  99. List<string> lst = new List<string>();
  100. int maxIndex = 0;
  101. foreach(var item in deviceConfig.GalilAxises)
  102. {
  103. _moduleNameIndexDictionary[$"{deviceConfig.Module}.{item.Name}"] = item.Index;
  104. _moduleNameAxisConfigDictionary[$"{deviceConfig.Module}.{item.Name}"]=item;
  105. if (!lst.Contains(item.Name))
  106. {
  107. lst.Add(item.Name);
  108. }
  109. if (maxIndex < item.Index)
  110. {
  111. maxIndex= item.Index;
  112. }
  113. }
  114. if (lst.Count > 0)
  115. {
  116. _moduleNameLstDictionary[deviceConfig.Module] = lst;
  117. _axisArray = new char[maxIndex+1];
  118. int a = 'A';
  119. for(int i = 0; i < _axisArray.Length; i++)
  120. {
  121. _axisArray[i] = (char)(a + i);
  122. }
  123. }
  124. }
  125. /// <summary>
  126. /// 更新模块数据
  127. /// </summary>
  128. /// <param name="controllerData"></param>
  129. public void UpdateModuleData(string module,GalilControllerData controllerData)
  130. {
  131. if (!_moduleGalilDataDictionary.ContainsKey(module))
  132. {
  133. _moduleGalilDataDictionary[module] = controllerData;
  134. }
  135. if (!_moduleNameLstDictionary.ContainsKey(module))
  136. {
  137. return;
  138. }
  139. List<string> lst = _moduleNameLstDictionary[module];
  140. foreach (var item in lst)
  141. {
  142. string moduleName = $"{module}.{item}";
  143. if (!_moduleNameIndexDictionary.ContainsKey(moduleName))
  144. {
  145. continue;
  146. }
  147. int index = _moduleNameIndexDictionary[moduleName];
  148. if(index>=controllerData.GalilAxisDatas.Count)
  149. {
  150. continue;
  151. }
  152. GalilAxisData galilAxisData=controllerData.GalilAxisDatas[index];
  153. CheckAxisDataChanged(moduleName, galilAxisData);
  154. }
  155. }
  156. /// <summary>
  157. /// 检验电机数据是否发生变化
  158. /// </summary>
  159. /// <param name="moduleName"></param>
  160. /// <param name="axisData"></param>
  161. private void CheckAxisDataChanged(string moduleName,GalilAxisData axisData)
  162. {
  163. if (_moduleNameAxisDataDictionary.ContainsKey(moduleName))
  164. {
  165. NotifyGalilAxisData(moduleName, _moduleNameAxisDataDictionary[moduleName],axisData);
  166. _moduleNameAxisDataDictionary[moduleName].Copy(axisData);
  167. }
  168. else
  169. {
  170. NotifyGalilAxisAllData(moduleName, axisData);
  171. _moduleNameAxisDataDictionary[moduleName] = axisData.Clone();
  172. }
  173. }
  174. /// <summary>
  175. /// 更新Galil电机数据
  176. /// </summary>
  177. /// <param name="axisData"></param>
  178. private void NotifyGalilAxisAllData(string moduleName,GalilAxisData axisData)
  179. {
  180. PropertyInfo[] propertyInfos= axisData.GetType().GetProperties();
  181. foreach(var info in propertyInfos)
  182. {
  183. object value = info.GetValue(axisData);
  184. GalilAxisManager.Instance.UpdateIoValue($"{moduleName}.{info.Name}", value);
  185. }
  186. }
  187. /// <summary>
  188. /// 通知Galil电机数据
  189. /// </summary>
  190. /// <param name="sourceData"></param>
  191. /// <param name="targetData"></param>
  192. private void NotifyGalilAxisData(string moduleName,GalilAxisData sourceData, GalilAxisData targetData)
  193. {
  194. PropertyInfo[] propertyInfos = sourceData.GetType().GetProperties();
  195. foreach (var info in propertyInfos)
  196. {
  197. object sourceValue= info.GetValue(sourceData);
  198. object targetValue = info.GetValue(targetData);
  199. if (sourceValue.ToString() != targetValue.ToString())
  200. {
  201. GalilAxisManager.Instance.UpdateIoValue($"{moduleName}.{info.Name}", targetValue);
  202. }
  203. }
  204. }
  205. /// <summary>
  206. /// 设置
  207. /// </summary>
  208. /// <param name="module"></param>
  209. /// <param name="name"></param>
  210. /// <param name="variable"></param>
  211. /// <param name="value"></param>
  212. /// <returns></returns>
  213. public bool SetAxisCommand(string module, string name,string commad, object value)
  214. {
  215. if (!_moduleGalilTcpDeviceDictionary.ContainsKey(module))
  216. {
  217. LOG.WriteLog(eEvent.ERR_GALIL, module, $"{module} does not have tcp device");
  218. return false;
  219. }
  220. string str = $"{module}.{name}";
  221. if(_moduleNameIndexDictionary.ContainsKey(str))
  222. {
  223. int index = _moduleNameIndexDictionary[str];
  224. if (index >= _axisArray.Length)
  225. {
  226. LOG.WriteLog(eEvent.ERR_GALIL, module, $"{str} is not matched with index");
  227. return false;
  228. }
  229. string strCommand = "";
  230. string axis = _axisArray[index].ToString();
  231. if (value != null)
  232. {
  233. strCommand = $"{commad}{axis}={value};";
  234. }
  235. else
  236. {
  237. strCommand = $"{commad}{axis};";
  238. }
  239. return _moduleGalilTcpDeviceDictionary[module].SetGalilCommand(strCommand);
  240. }
  241. else
  242. {
  243. LOG.WriteLog(eEvent.ERR_GALIL, module, $"{str} is not matched with index");
  244. return false;
  245. }
  246. }
  247. /// <summary>
  248. /// 获取Galil配置对象
  249. /// </summary>
  250. /// <param name="module"></param>
  251. /// <param name="name"></param>
  252. /// <returns></returns>
  253. public GalilAxisConfig GetGalilAxisConfig(string module,string name)
  254. {
  255. string str = $"{module}.{name}";
  256. if (_moduleNameAxisConfigDictionary.ContainsKey(str))
  257. {
  258. return _moduleNameAxisConfigDictionary[str];
  259. }
  260. else
  261. {
  262. return null;
  263. }
  264. }
  265. }
  266. }