LinMotDeviceConfigManager.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. using Aitex.Common.Util;
  2. using Aitex.Core.RT.DataCenter;
  3. using Aitex.Core.RT.Log;
  4. using Aitex.Core.RT.SCCore;
  5. using Aitex.Core.Util;
  6. using DocumentFormat.OpenXml.Wordprocessing;
  7. using MECF.Framework.Common.Beckhoff.ModuleIO;
  8. using MECF.Framework.Common.Layout;
  9. using MECF.Framework.Common.TwinCat;
  10. using MECF.Framework.Common.Utilities;
  11. using System;
  12. using System.Collections.Generic;
  13. using System.IO;
  14. using System.IO.Ports;
  15. using System.Linq;
  16. using System.Text;
  17. using System.Threading.Tasks;
  18. using System.Windows.Markup;
  19. namespace MECF.Framework.Common.Device.LinMot
  20. {
  21. public class LinMotDeviceConfigManager : Singleton<LinMotDeviceConfigManager>
  22. {
  23. #region 常量
  24. private string LINMOT_DEVICELIST = "LinMotDeviceList";
  25. #endregion
  26. /// <summary>
  27. /// 模块数据更新委托字典
  28. /// </summary>
  29. private Dictionary<string, LinMotDelegate.OnUpdateModuleVariableValue> _linmotActionDic = new Dictionary<string, LinMotDelegate.OnUpdateModuleVariableValue>();
  30. /// <summary>
  31. /// 模块设备字典
  32. /// </summary>
  33. private Dictionary<string, LinMotDevice> _linmotDeviceDic = new Dictionary<string, LinMotDevice>();
  34. /// <summary>
  35. /// 模块串口设备字典
  36. /// </summary>
  37. private Dictionary<string, LinMotSerialDevice> _linmotSerialDevice = new Dictionary<string, LinMotSerialDevice>();
  38. /// <summary>
  39. /// 地址模块字典(key-母级模块,value-linmot device模块名称
  40. /// </summary>
  41. private Dictionary<string, string> _linmotDeviceAddressModuleDic = new Dictionary<string, string>();
  42. /// <summary>
  43. /// 配置文件对象
  44. /// </summary>
  45. private LinMotDeviceConfigCfg linMotDeviceConfigCfg = new LinMotDeviceConfigCfg();
  46. /// <summary>
  47. /// 初始化
  48. /// </summary>
  49. public void Initialize()
  50. {
  51. bool isSimulate = SC.GetValue<bool>("System.IsSimulatorMode");
  52. string xmlPath = "";
  53. if (isSimulate)
  54. {
  55. xmlPath = PathManager.GetCfgDir() + "Devices\\LinmotCfg-Simulator.xml";
  56. }
  57. else
  58. {
  59. xmlPath = PathManager.GetCfgDir() + "Devices\\LinmotCfg.xml";
  60. }
  61. try
  62. {
  63. linMotDeviceConfigCfg = CustomXmlSerializer.Deserialize<LinMotDeviceConfigCfg>(new FileInfo(xmlPath));
  64. if (linMotDeviceConfigCfg != null)
  65. {
  66. foreach (LinmotDeviceConfig config in linMotDeviceConfigCfg.LinmotDeviceConfigs)
  67. {
  68. DATA.Subscribe($"{config.Name}.{LINMOT_DEVICELIST}", () => config, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  69. LinMotSerialDevice linMotSerialDevice = new LinMotSerialDevice(config.Name, config.Port, config.BaudRate, (StopBits)config.StopBit,
  70. config.Data, SerialPortUtil.GetParity(config.Parity), true);
  71. linMotSerialDevice.Initialize();
  72. InitialLinMotDevice(config, linMotSerialDevice);
  73. }
  74. LinMotErrorCodeManager.Instance.Initialize();
  75. }
  76. }
  77. catch
  78. {
  79. LOG.WriteLog(eEvent.ERR_LINMOT, "Linmot", "Load linmot xml failed");
  80. }
  81. }
  82. /// <summary>
  83. /// 初始化LinMot设备
  84. /// </summary>
  85. /// <param name="config"></param>
  86. private void InitialLinMotDevice(LinmotDeviceConfig config,LinMotSerialDevice linMotSerialDevice)
  87. {
  88. if(config.LinmotDevices!=null)
  89. {
  90. foreach(LinMotDevice device in config.LinmotDevices)
  91. {
  92. _linmotSerialDevice[device.Name] = linMotSerialDevice;
  93. _linmotDeviceDic[device.Name] = device;
  94. _linmotDeviceAddressModuleDic[$"{config.Name}_{device.Address}"] = device.Name;
  95. _linmotActionDic[device.Name] = null;
  96. }
  97. }
  98. }
  99. /// <summary>
  100. /// 获取所有LinMot设备集合
  101. /// </summary>
  102. /// <returns></returns>
  103. public List<string> GetLinMotDeviceList()
  104. {
  105. return _linmotDeviceDic.Keys.ToList();
  106. }
  107. /// <summary>
  108. /// 初始化设备
  109. /// </summary>
  110. /// <param name="name"></param>
  111. public void InitialDevice(string name)
  112. {
  113. if(_linmotSerialDevice.ContainsKey(name))
  114. {
  115. _linmotSerialDevice[name].Start();
  116. }
  117. }
  118. /// <summary>
  119. /// 查询连接状态
  120. /// </summary>
  121. /// <param name="name"></param>
  122. /// <returns></returns>
  123. public bool GetDeviceConnect(string name)
  124. {
  125. if(_linmotDeviceDic.ContainsKey(name))
  126. {
  127. return _linmotSerialDevice[name].Connected;
  128. }
  129. return false;
  130. }
  131. /// <summary>
  132. /// 发送指令
  133. /// </summary>
  134. /// <param name="name"></param>
  135. /// <param name="id"></param>
  136. /// <param name="linMotOperation"></param>
  137. public bool SendOperation(string name,byte id,LinMotOperation linMotOperation)
  138. {
  139. if(_linmotSerialDevice.ContainsKey(name))
  140. {
  141. if (linMotOperation != LinMotOperation.ReadStatus)
  142. {
  143. LOG.WriteBackgroundLog(eEvent.INFO_LINMOT, name, $"{name} execute {linMotOperation}");
  144. }
  145. return _linmotSerialDevice[name].SendOperation(id, linMotOperation);
  146. }
  147. else
  148. {
  149. LOG.WriteBackgroundLog(eEvent.ERR_LINMOT, name, $"dictionary does not contain {name}");
  150. }
  151. return false;
  152. }
  153. /// <summary>
  154. /// 发送Curve指令
  155. /// </summary>
  156. /// <param name="name"></param>
  157. /// <param name="id"></param>
  158. /// <param name="autoCount"></param>
  159. /// <param name="curveId"></param>
  160. /// <param name="timeScale"></param>
  161. public bool SendCurveOperation(string name, byte id,ushort curveId, ushort timeScale)
  162. {
  163. if(_linmotSerialDevice.ContainsKey(name))
  164. {
  165. return _linmotSerialDevice[name].SendCurveOperation(id, curveId, timeScale);
  166. }
  167. return false;
  168. }
  169. /// <summary>
  170. /// 发送CommandTable指令
  171. /// </summary>
  172. /// <param name="name"></param>
  173. /// <param name="id"></param>
  174. /// <param name="autoCount"></param>
  175. /// <param name="entryId"></param>
  176. /// <returns></returns>
  177. public bool SendCommandTable(string name,byte id,short entryId)
  178. {
  179. if (_linmotSerialDevice.ContainsKey(name))
  180. {
  181. return _linmotSerialDevice[name].SendCommandTableOpertaion(id, entryId);
  182. }
  183. else
  184. {
  185. LOG.WriteLog(eEvent.ERR_LINMOT, name, $"{name} linmot is not in dictionary");
  186. }
  187. return false;
  188. }
  189. /// <summary>
  190. /// 更新RAM变量
  191. /// </summary>
  192. /// <param name="name"></param>
  193. /// <param name="id"></param>
  194. /// <param name="lowByte"></param>
  195. /// <param name="highByte"></param>
  196. /// <param name="intValue"></param>
  197. /// <returns></returns>
  198. public bool SendWriteRamIntValue(string name, byte id, byte lowByte,byte highByte, int intValue)
  199. {
  200. if (_linmotSerialDevice.ContainsKey(name))
  201. {
  202. return _linmotSerialDevice[name].SendWriteRamIntValue(id,lowByte,highByte, intValue);
  203. }
  204. return false;
  205. }
  206. /// <summary>
  207. /// 发送GAI GotoPosition
  208. /// </summary>
  209. /// <param name="name"></param>
  210. /// <param name="id"></param>
  211. /// <param name="autoCount"></param>
  212. /// <param name="position"></param>
  213. /// <param name="velocilty"></param>
  214. /// <param name="accel"></param>
  215. /// <param name="decel"></param>
  216. /// <returns></returns>
  217. public bool SendVAIGotoPosition(string name,byte id,int position,int velocilty,int accel,int decel)
  218. {
  219. if(_linmotSerialDevice.ContainsKey(name))
  220. {
  221. return _linmotSerialDevice[name].SendVAIGoToPositionOpertaion(id,position, velocilty,accel,decel);
  222. }
  223. return false;
  224. }
  225. /// <summary>
  226. /// 发送GAI GotoPosition After Actual Command
  227. /// </summary>
  228. /// <param name="name"></param>
  229. /// <param name="id"></param>
  230. /// <param name="autoCount"></param>
  231. /// <param name="position"></param>
  232. /// <param name="velocilty"></param>
  233. /// <param name="accel"></param>
  234. /// <param name="decel"></param>
  235. /// <returns></returns>
  236. public bool SendVAIGotoPositionAfterActualCommand(string name, byte id, int position, int velocilty, int accel, int decel)
  237. {
  238. if (_linmotSerialDevice.ContainsKey(name))
  239. {
  240. return _linmotSerialDevice[name].SendVAIGoToPositionAfterAutalCommandOpertaion(id, position, velocilty, accel, decel);
  241. }
  242. return false;
  243. }
  244. /// <summary>
  245. /// 获取LinMot设备
  246. /// </summary>
  247. /// <param name="name"></param>
  248. /// <returns></returns>
  249. public LinMotDevice GetLinMotDevice(string name)
  250. {
  251. if(_linmotDeviceDic.ContainsKey(name))
  252. {
  253. return _linmotDeviceDic[name];
  254. }
  255. return null;
  256. }
  257. /// <summary>
  258. /// 获取Id
  259. /// </summary>
  260. /// <param name="name"></param>
  261. /// <returns></returns>
  262. public int GetAddress(string name)
  263. {
  264. if(_linmotDeviceDic.ContainsKey(name))
  265. {
  266. if(int.TryParse(_linmotDeviceDic[name].Address,out var address))
  267. {
  268. return address;
  269. }
  270. }
  271. return -1;
  272. }
  273. /// <summary>
  274. /// 根据地址获取模块名称
  275. /// </summary>
  276. /// <param name="name"></param>
  277. /// <param name="id"></param>
  278. /// <returns></returns>
  279. public string GetModuleNameByAddress(string name,byte id)
  280. {
  281. if(_linmotDeviceAddressModuleDic.ContainsKey($"{name}_{id}"))
  282. {
  283. return _linmotDeviceAddressModuleDic[$"{name}_{id}"];
  284. }
  285. return "";
  286. }
  287. /// <summary>
  288. /// 注册变量数值发生变化回调
  289. /// </summary>
  290. /// <param name="moduleName"></param>
  291. /// <param name="variable"></param>
  292. /// <param name="onUpdateModuleVariableValue"></param>
  293. public void SubscribeModuleVariable(string moduleName, LinMotDelegate.OnUpdateModuleVariableValue onUpdateModuleVariableValue)
  294. {
  295. _linmotActionDic[moduleName] = onUpdateModuleVariableValue;
  296. }
  297. /// <summary>
  298. /// 更新数据
  299. /// </summary>
  300. /// <param name="moduleName"></param>
  301. /// <param name="statusWord"></param>
  302. /// <param name="errorCode"></param>
  303. /// <param name="position"></param>
  304. public void UpdateModuleData(string moduleName,short statusWord,short errorCode,int position)
  305. {
  306. if(_linmotActionDic.ContainsKey(moduleName))
  307. {
  308. _linmotActionDic[moduleName].Invoke(statusWord, errorCode, position);
  309. }
  310. }
  311. /// <summary>
  312. /// 更新linmot速度相关的参数
  313. /// </summary>
  314. /// <param name="deviceName"></param>
  315. /// <param name=""></param>
  316. public void UpdateSpeedData(string deviceName, string direction, double maxSpeed, int maxAcceleration,int maxDeceleration)
  317. {
  318. if (linMotDeviceConfigCfg != null)
  319. {
  320. foreach (LinmotDeviceConfig config in linMotDeviceConfigCfg.LinmotDeviceConfigs)
  321. {
  322. if (deviceName.Contains(config.Name))
  323. {
  324. foreach(var item in config.LinmotDevices)
  325. {
  326. if(item.Name == deviceName)
  327. {
  328. if ("up".Equals(direction))
  329. {
  330. item.LinMotDeviceData.UpMaxSpeed = maxSpeed * 1000;
  331. item.LinMotDeviceData.UpMaxAcceleration = maxAcceleration * 1000;
  332. item.LinMotDeviceData.UpMaxDeceleration = maxDeceleration * 1000;
  333. }
  334. else
  335. {
  336. item.LinMotDeviceData.DownMaxSpeed = maxSpeed * 1000;
  337. item.LinMotDeviceData.DownMaxAcceleration = maxAcceleration * 1000;
  338. item.LinMotDeviceData.DownMaxDeceleration = maxDeceleration * 1000;
  339. }
  340. }
  341. }
  342. }
  343. }
  344. }
  345. bool isSimulate = SC.GetValue<bool>("System.IsSimulatorMode");
  346. string xmlPath = "";
  347. if (isSimulate)
  348. {
  349. xmlPath = PathManager.GetCfgDir() + "Devices\\LinmotCfg-Simulator.xml";
  350. }
  351. else
  352. {
  353. xmlPath = PathManager.GetCfgDir() + "Devices\\LinmotCfg.xml";
  354. }
  355. try
  356. {
  357. CustomXmlSerializer.Serialize(linMotDeviceConfigCfg, xmlPath);
  358. }
  359. catch
  360. {
  361. LOG.WriteLog(eEvent.ERR_LINMOT, "Linmot", "Save linmot xml failed");
  362. }
  363. }
  364. }
  365. }