TemperatureConfigManager.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. using Aitex.Core.Util;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO.Ports;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using Aitex.Core.RT.DataCenter;
  10. using MECF.Framework.Common.Utilities;
  11. using MECF.Framework.Common.Layout;
  12. using MECF.Framework.Common.Device.ResistivityProbe;
  13. using Aitex.Common.Util;
  14. using Aitex.Core.RT.Log;
  15. using System.Threading;
  16. using MECF.Framework.Common.ToolLayout;
  17. using System.Security.Claims;
  18. using DocumentFormat.OpenXml.Spreadsheet;
  19. namespace MECF.Framework.Common.Device.TemperatureController
  20. {
  21. public class TemperatureConfigManager : Singleton<TemperatureConfigManager>
  22. {
  23. #region 常量
  24. private string TEMPERATURE_DEVICELIST = "TemperatureDeviceList";
  25. #endregion
  26. #region 内部变量
  27. /// <summary>
  28. /// 模块设备字典
  29. /// </summary>
  30. private Dictionary<string, TemperatureDevice> _temperatureDeviceDic = new Dictionary<string, TemperatureDevice>();
  31. /// <summary>
  32. /// 模块串口设备字典
  33. /// </summary>
  34. private Dictionary<string, TemperatureSerialDevice> _temperatureSerialDevice = new Dictionary<string, TemperatureSerialDevice>();
  35. /// <summary>
  36. /// 地址模块字典(key-母级模块,value-temperature device模块名称
  37. /// </summary>
  38. private Dictionary<string, string> _temperatureDeviceAddressModuleDic = new Dictionary<string, string>();
  39. /// <summary>
  40. /// 模块变量变更字典
  41. /// </summary>
  42. private Dictionary<string, TwinCat.BeckhoffDelegate.OnUpdateModuleVariableValue> _moduleVariableActionDic = new Dictionary<string, MECF.Framework.Common.TwinCat.BeckhoffDelegate.OnUpdateModuleVariableValue>();
  43. /// <summary>
  44. /// 变量数值字典(key-moduleName.Variable,value-数值)
  45. /// </summary>
  46. private Dictionary<string, object> _nameVariableValueDic = new Dictionary<string, object>();
  47. /// <summary>
  48. /// TC是否在线字典
  49. /// </summary>
  50. private Dictionary<string, bool> _temperaturePowerConnectDic = new Dictionary<string, bool>();
  51. #endregion
  52. /// <summary>
  53. /// 初始化
  54. /// </summary>
  55. public void Initialize()
  56. {
  57. string xmlPath = PathManager.GetCfgDir() + "Devices\\SMCCfg.xml";
  58. TemperatureConfig cfg = CustomXmlSerializer.Deserialize<TemperatureConfig>(new FileInfo(xmlPath));
  59. if (cfg != null)
  60. {
  61. foreach (TemperatureDeviceConfig config in cfg.TemperatureDeviceConfigs)
  62. {
  63. DATA.Subscribe($"{config.Name}.{TEMPERATURE_DEVICELIST}", () => config, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  64. TemperatureSerialDevice temperatureSerialDevice = new TemperatureSerialDevice(config.Name, config.Port, config.BaudRate, (StopBits)config.StopBit,
  65. config.Data,SerialPortUtil.GetParity(config.Parity),true,1000);
  66. temperatureSerialDevice.Initialize();
  67. temperatureSerialDevice.OnUpdateVariableValueChanged += TemperatureSerialDevice_OnUpdateVariableValueChanged;
  68. InitialtemperatureDevice(config, temperatureSerialDevice);
  69. }
  70. }
  71. }
  72. /// <summary>
  73. /// 变量发生变化
  74. /// </summary>
  75. /// <param name="address"></param>
  76. /// <param name="variableName"></param>
  77. /// <param name="variableValue"></param>
  78. private void TemperatureSerialDevice_OnUpdateVariableValueChanged(string name,byte address, string variableName, object variableValue)
  79. {
  80. if ("Alarm".Equals(variableName) && variableValue!=null)
  81. {
  82. string[] strAry = variableValue.ToString().Split('-');
  83. string binaryString = "";
  84. foreach (string numStr in strAry)
  85. {
  86. int num = Convert.ToInt32(numStr, 16) - 0x30;
  87. string binary = Convert.ToString(num, 2).PadLeft(4, '0');
  88. binaryString += binary;
  89. }
  90. variableValue = string.Join("-", binaryString.ToCharArray());
  91. }
  92. string str = $"{name}_{address}";
  93. if(_temperatureDeviceAddressModuleDic.ContainsKey(str))
  94. {
  95. string moduleName = _temperatureDeviceAddressModuleDic[str];
  96. if(_moduleVariableActionDic.ContainsKey($"{moduleName}.{variableName}"))
  97. {
  98. _nameVariableValueDic[$"{moduleName}.{variableName}"] = variableValue;
  99. _moduleVariableActionDic[$"{moduleName}.{variableName}"].Invoke(variableName, variableValue);
  100. }
  101. }
  102. }
  103. /// <summary>
  104. /// 初始化
  105. /// </summary>
  106. /// <param name="config"></param>
  107. private void InitialtemperatureDevice(TemperatureDeviceConfig config, TemperatureSerialDevice temperatureSerialDevice)
  108. {
  109. if (config.TemperatureDevices != null)
  110. {
  111. foreach (TemperatureDevice device in config.TemperatureDevices)
  112. {
  113. device.ReserviorName = ReservoirItemManager.Instance.GetReservoirByTC(device.Name);
  114. _temperatureSerialDevice[device.Name] = temperatureSerialDevice;
  115. _temperatureDeviceDic[device.Name] = device;
  116. _temperatureDeviceAddressModuleDic[$"{config.Name}_{device.Address}"] = device.Name;
  117. _temperaturePowerConnectDic[device.Name] = true; //默认TC设备power正常
  118. }
  119. }
  120. }
  121. /// <summary>
  122. /// 更新TCpowerConnect字典
  123. /// </summary>
  124. /// <param name="id"></param>
  125. /// <param name="value"></param>
  126. public void UpdataTCPowerConnectDic(string id,bool value)
  127. {
  128. _temperaturePowerConnectDic[id] = value;
  129. }
  130. /// <summary>
  131. /// 初始化设备
  132. /// </summary>
  133. /// <param name="name"></param>
  134. public void InitialDevice(string name)
  135. {
  136. if (_temperatureSerialDevice.ContainsKey(name))
  137. {
  138. _temperatureSerialDevice[name].Start();
  139. }
  140. }
  141. /// <summary>
  142. /// 查询连接状态
  143. /// </summary>
  144. /// <param name="name"></param>
  145. /// <returns></returns>
  146. public bool GetDeviceConnect(string name)
  147. {
  148. if (_temperatureSerialDevice.ContainsKey(name))
  149. {
  150. return _temperatureSerialDevice[name].Connected;
  151. }
  152. return false;
  153. }
  154. /// <summary>
  155. /// 查询电源连接状态
  156. /// </summary>
  157. /// <param name="name"></param>
  158. /// <returns></returns>
  159. public bool GetDevicePowerConnect(string name)
  160. {
  161. if (_temperaturePowerConnectDic.ContainsKey(name))
  162. {
  163. return _temperaturePowerConnectDic[name];
  164. }
  165. return false;
  166. }
  167. /// <summary>
  168. /// 注册变量数值发生变化回调
  169. /// </summary>
  170. /// <param name="moduleName"></param>
  171. /// <param name="variable"></param>
  172. /// <param name="onUpdateModuleVariableValue"></param>
  173. public void SubscribeModuleVariable(string moduleName, string variable, MECF.Framework.Common.TwinCat.BeckhoffDelegate.OnUpdateModuleVariableValue onUpdateModuleVariableValue)
  174. {
  175. string name = $"{moduleName}.{variable}";
  176. _moduleVariableActionDic[name] = onUpdateModuleVariableValue;
  177. if (_nameVariableValueDic.ContainsKey(name))
  178. {
  179. _moduleVariableActionDic[name].Invoke(variable, _nameVariableValueDic[name]);
  180. }
  181. }
  182. /// <summary>
  183. /// 获取外部温度
  184. /// </summary>
  185. /// <param name="name"></param>
  186. /// <param name="id"></param>
  187. /// <param name="linMotOperation"></param>
  188. public void ReadReserviorExtendSensorTemperature(string name, byte id)
  189. {
  190. if (_temperatureSerialDevice.ContainsKey(name))
  191. {
  192. if (_temperatureSerialDevice[name].Connected)
  193. {
  194. _temperatureSerialDevice[name].ReadReserviorExtendSensorTemperature(id);
  195. }
  196. }
  197. }
  198. /// <summary>
  199. /// 获取内部温度
  200. /// </summary>
  201. /// <param name="name"></param>
  202. /// <param name="id"></param>
  203. /// <param name="linMotOperation"></param>
  204. public void ReadHeatExchangerInternelSensorTemperature(string name, byte id)
  205. {
  206. if (_temperatureSerialDevice.ContainsKey(name))
  207. {
  208. if (_temperatureSerialDevice[name].Connected)
  209. {
  210. _temperatureSerialDevice[name].ReadHeatExchangerInternelSensorTemperature(id);
  211. }
  212. }
  213. }
  214. /// <summary>
  215. /// 获取内Alarm
  216. /// </summary>
  217. /// <param name="name"></param>
  218. /// <param name="id"></param>
  219. /// <param name="linMotOperation"></param>
  220. public void ReadAlarmStatus(string name, byte id)
  221. {
  222. if (_temperatureSerialDevice.ContainsKey(name))
  223. {
  224. if (_temperatureSerialDevice[name].Connected)
  225. {
  226. _temperatureSerialDevice[name].ReadAlarmStatus(id);
  227. }
  228. }
  229. }
  230. /// <summary>
  231. /// 设置目标温度
  232. /// </summary>
  233. /// <param name="name"></param>
  234. /// <param name="id"></param>
  235. /// <param name="targetTemperature"></param>
  236. public void SetTargetTemperature(string name, byte id,double targetTemperature)
  237. {
  238. if (_temperatureSerialDevice.ContainsKey(name))
  239. {
  240. if (_temperatureSerialDevice[name].Connected)
  241. {
  242. _temperatureSerialDevice[name].SetTargetTemperature(id,targetTemperature);
  243. }
  244. }
  245. }
  246. /// <summary>
  247. /// 读取目标温度
  248. /// </summary>
  249. /// <param name="name"></param>
  250. /// <param name="id"></param>
  251. /// <param name="targetTemperature"></param>
  252. public void ReadTargetTemperature(string name, byte id)
  253. {
  254. if (_temperatureSerialDevice.ContainsKey(name))
  255. {
  256. if (_temperatureSerialDevice[name].Connected)
  257. {
  258. _temperatureSerialDevice[name].ReadTargetTemperature(id);
  259. }
  260. }
  261. }
  262. /// <summary>
  263. /// Disable
  264. /// </summary>
  265. /// <param name="name"></param>
  266. /// <param name="id"></param>
  267. /// <returns></returns>
  268. public bool DisableController(string name, byte id,int controlOperationModel)
  269. {
  270. if (_temperatureSerialDevice.ContainsKey(name))
  271. {
  272. if (_temperatureSerialDevice[name].Connected)
  273. {
  274. _temperatureSerialDevice[name].SetControlOperationModel(id, controlOperationModel);
  275. //_temperatureSerialDevice[name].ReadControlOperationModel(id);
  276. return true;
  277. }
  278. else
  279. {
  280. LOG.WriteLog(eEvent.ERR_TEMPERATURE, name, $"{name} is not connected");
  281. return false;
  282. }
  283. }
  284. else
  285. {
  286. return false;
  287. }
  288. }
  289. /// <summary>
  290. /// 启用Controller
  291. /// </summary>
  292. /// <param name="name"></param>
  293. /// <param name="id"></param>
  294. /// <returns></returns>
  295. public bool EnableControl(string name, byte id,int controlOperationModel)
  296. {
  297. if (_temperatureSerialDevice.ContainsKey(name))
  298. {
  299. if (_temperatureSerialDevice[name].Connected)
  300. {
  301. _temperatureSerialDevice[name].SetControlOperationModel(id, controlOperationModel);
  302. //_temperatureSerialDevice[name].ReadControlOperationModel(id);
  303. return true;
  304. }
  305. else
  306. {
  307. LOG.WriteLog(eEvent.ERR_TEMPERATURE, name, $"{name} is not connected");
  308. return false;
  309. }
  310. }
  311. else
  312. {
  313. return false;
  314. }
  315. }
  316. /// <summary>
  317. /// 获取操作模式
  318. /// </summary>
  319. /// <param name="name"></param>
  320. /// <param name="id"></param>
  321. /// <param name="linMotOperation"></param>
  322. public void ReadControlOperationModel(string name, byte id)
  323. {
  324. if (_temperatureSerialDevice.ContainsKey(name))
  325. {
  326. if (_temperatureSerialDevice[name].Connected)
  327. {
  328. _temperatureSerialDevice[name].ReadControlOperationModel(id);
  329. }
  330. }
  331. }
  332. /// <summary>
  333. /// 获取Id
  334. /// </summary>
  335. /// <param name="name"></param>
  336. /// <returns></returns>
  337. public byte GetAddress(string name)
  338. {
  339. if (_temperatureDeviceDic.ContainsKey(name))
  340. {
  341. if (byte.TryParse(_temperatureDeviceDic[name].Address, out var address))
  342. {
  343. return address;
  344. }
  345. }
  346. return 0;
  347. }
  348. }
  349. }