GalilControllerCfgManager.cs 13 KB

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