BeckhoffAxisManager.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.RT.Log;
  3. using Aitex.Core.RT.SCCore;
  4. using Aitex.Core.Util;
  5. using MECF.Framework.Common.Beckhoff.IOAxis;
  6. using MECF.Framework.Common.Utilities;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading;
  12. using System.Threading.Tasks;
  13. namespace MECF.Framework.Common.TwinCat
  14. {
  15. public class BeckhoffAxisManager : Singleton<BeckhoffAxisManager>
  16. {
  17. #region 常量
  18. private string IO_TYPE = "axis";
  19. #endregion
  20. #region 内部变量
  21. private Dictionary<string, Dictionary<string, object>> _moduleVariableValueDic = new Dictionary<string, Dictionary<string, object>>();
  22. private Dictionary<string, BeckhoffDelegate.OnUpdateModuleVariableValue> _moduleVariableActionDic = new Dictionary<string, BeckhoffDelegate.OnUpdateModuleVariableValue>();
  23. private Dictionary<string, BeckhoffAxis> _moduleAxisDic = new Dictionary<string, BeckhoffAxis>();
  24. private int _size = 0;
  25. private BeckhoffCfg _cfg;
  26. #endregion
  27. #region 属性
  28. public int Size { get { return _size; } set { _size = value; } }
  29. #endregion
  30. /// <summary>
  31. /// 初始化
  32. /// </summary>
  33. /// <param name="cfg"></param>
  34. public void Initialize(BeckhoffCfg cfg)
  35. {
  36. _cfg = cfg;
  37. foreach (BeckhoffAxis item in cfg.Controller.Axises)
  38. {
  39. string moduleName = item.Name;
  40. if (!_moduleVariableValueDic.ContainsKey(moduleName))
  41. {
  42. _moduleVariableValueDic[moduleName] = new Dictionary<string, object>();
  43. }
  44. foreach (BeckhoffAxisInput input in item.Inputs)
  45. {
  46. if (!input.Address.StartsWith("0x"))
  47. {
  48. string inputName = $"{moduleName}.{input.Type}";
  49. _moduleVariableValueDic[moduleName][input.Type] = null;
  50. int dataSize = DataTypeUtil.GetDataTypeSize(input.DataType);
  51. BeckhoffItemManager.Instance.InitBeckhoffItem(inputName, input.Address, input.DataType, IO_TYPE, dataSize, false, 0,false);
  52. _size += dataSize;
  53. }
  54. else
  55. {
  56. _moduleVariableValueDic[moduleName][input.Type] = null;
  57. }
  58. }
  59. foreach (BeckhoffAxisOutput output in item.Outputs)
  60. {
  61. if (!output.Address.StartsWith("0x"))
  62. {
  63. string outputName = $"{moduleName}.{output.Type}";
  64. _moduleVariableValueDic[moduleName][output.Type] = null;
  65. int dataSize = DataTypeUtil.GetDataTypeSize(output.DataType);
  66. BeckhoffItemManager.Instance.InitBeckhoffItem(outputName, output.Address, output.DataType, IO_TYPE, dataSize, false, 0,false);
  67. BeckhoffItemManager.Instance.InitWriteBeckoffItem(outputName, output.Address, output.DataType, IO_TYPE, dataSize, false, 0,false);
  68. _size += dataSize;
  69. }
  70. }
  71. DATA.Subscribe($"{moduleName}.BeckhoffAxis", () => item, SubscriptionAttribute.FLAG.IgnoreSaveDB);
  72. _moduleAxisDic[moduleName] = item;
  73. }
  74. }
  75. /// <summary>
  76. /// 启动coe服务
  77. /// </summary>
  78. public void StartCoeInterface()
  79. {
  80. Thread coeSthread = new Thread(new ThreadStart(StartCOEInterfaceThread));
  81. coeSthread.IsBackground = true;
  82. coeSthread.Start();
  83. }
  84. /// <summary>
  85. /// 启动COE接口线程
  86. /// </summary>
  87. private void StartCOEInterfaceThread()
  88. {
  89. bool isSimulatorMode = SC.GetValue<bool>("System.IsSimulatorMode");
  90. foreach (BeckhoffAxis item in _cfg.Controller.Axises)
  91. {
  92. if (!isSimulatorMode)
  93. {
  94. TwincatCoeManager.Instance.Initialize(item);
  95. }
  96. }
  97. if (!isSimulatorMode)
  98. {
  99. TwincatCoeManager.Instance.StartReadInput();
  100. }
  101. }
  102. /// <summary>
  103. /// 更新变量数值
  104. /// </summary>
  105. /// <param name="name"></param>
  106. /// <param name="value"></param>
  107. public void SetAxisValue(string name,object value)
  108. {
  109. bool _enableRead = SC.GetValue<bool>("Twincat.EnableReadLog");
  110. if (_enableRead)
  111. {
  112. LOG.WriteBackgroundLog(eEvent.INFO_TWINCAT, "System", $"read {name} value {value}");
  113. }
  114. string[] strAry = name.Split('.');
  115. if(strAry.Length<2)
  116. {
  117. return;
  118. }
  119. string moduleName = $"{strAry[0]}.{strAry[1]}";
  120. string variableName = name.Replace($"{moduleName}.","");
  121. if(_moduleVariableValueDic.ContainsKey(moduleName))
  122. {
  123. if (_moduleVariableValueDic[moduleName].ContainsKey(variableName))
  124. {
  125. _moduleVariableValueDic[moduleName][variableName] = value;
  126. if(_moduleVariableActionDic.ContainsKey(name))
  127. {
  128. _moduleVariableActionDic[name].Invoke(variableName, value);
  129. }
  130. }
  131. }
  132. }
  133. /// <summary>
  134. /// 注册变量数值发生变化回调
  135. /// </summary>
  136. /// <param name="moduleName"></param>
  137. /// <param name="variable"></param>
  138. /// <param name="onUpdateModuleVariableValue"></param>
  139. public void SubscribeModuleVariable(string moduleName, string variable, BeckhoffDelegate.OnUpdateModuleVariableValue onUpdateModuleVariableValue)
  140. {
  141. _moduleVariableActionDic[$"{moduleName}.{variable}"] = onUpdateModuleVariableValue;
  142. if (_moduleVariableValueDic.ContainsKey(moduleName))
  143. {
  144. if (_moduleVariableValueDic[moduleName].ContainsKey(variable))
  145. {
  146. _moduleVariableActionDic[$"{moduleName}.{variable}"].Invoke(variable, _moduleVariableValueDic[moduleName][variable]);
  147. }
  148. }
  149. }
  150. /// <summary>
  151. /// 写入变量数值
  152. /// </summary>
  153. /// <param name="name"></param>
  154. /// <param name="setPoint"></param>
  155. /// <returns></returns>
  156. public bool WriteVariableValue(string name,object setPoint)
  157. {
  158. return TwincatAdoManager.Instance.WriteValue(name, setPoint);
  159. }
  160. /// <summary>
  161. /// 获取Axis对象
  162. /// </summary>
  163. /// <param name="name"></param>
  164. /// <returns></returns>
  165. public BeckhoffAxis GetAxis(string name)
  166. {
  167. return _moduleAxisDic.ContainsKey(name) ? _moduleAxisDic[name]:null;
  168. }
  169. }
  170. }