AeDcPower.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO.Ports;
  4. using Aitex.Core.Common.DeviceData;
  5. using Aitex.Core.RT.DataCenter;
  6. using Aitex.Core.RT.Event;
  7. using Aitex.Core.RT.Log;
  8. using Aitex.Core.RT.OperationCenter;
  9. using Aitex.Core.RT.SCCore;
  10. using Aitex.Core.Util;
  11. using MECF.Framework.Common.Communications;
  12. using MECF.Framework.Common.Device.Bases;
  13. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.DCPowers.AE
  14. {
  15. public class AeDcPower : RfPowerBase
  16. {
  17. public override bool IsPowerOn
  18. {
  19. get { return _isOn; }
  20. }
  21. public override bool IsSetPowerOn
  22. {
  23. get { return _setOn; }
  24. }
  25. public override bool IsError
  26. {
  27. get { return _isError; }
  28. }
  29. public override EnumRfPowerRegulationMode RegulationMode
  30. {
  31. get { return _regulationMode; }
  32. }
  33. public override float ForwardPower
  34. {
  35. get { return _forwardPower; }
  36. }
  37. public override float ReflectPower
  38. {
  39. get { return _reflectPower; }
  40. }
  41. public override float PowerSetPoint
  42. {
  43. get { return _powerSetPoint; }
  44. }
  45. public float Voltage
  46. {
  47. get { return _voltage; }
  48. }
  49. public float Current
  50. {
  51. get { return _current; }
  52. }
  53. public override float Frequency { get; set; }
  54. public override float PulsingFrequency { get; set; }
  55. public override float PulsingDutyCycle { get; set; }
  56. public override float PulsingReverseTime { get; set; }
  57. public override AITRfPowerData DeviceData
  58. {
  59. get
  60. {
  61. AITRfPowerData data = new AITRfPowerData()
  62. {
  63. Module = Module,
  64. DeviceName = Name,
  65. DeviceSchematicId = DeviceID,
  66. DisplayName = Display,
  67. UnitPower = _unit,
  68. ForwardPower = ForwardPower,
  69. ReflectPower = ReflectPower,
  70. PowerSetPoint = PowerSetPoint,
  71. RegulationMode = RegulationMode,
  72. Voltage = Voltage,
  73. Current = Current,
  74. IsRfOn = IsPowerOn,
  75. IsRfAlarm = IsError,
  76. Frequency = Frequency,
  77. PulsingFrequency = PulsingFrequency,
  78. PulsingDutyCycle = PulsingDutyCycle,
  79. PulsingReverseTime = PulsingReverseTime,
  80. ScalePower = _scalePower,
  81. IsPulseType = _scPowerType.StringValue == "DCPulse",
  82. };
  83. return data;
  84. }
  85. }
  86. public AeDcPowerConnection Connection
  87. {
  88. get { return _connection; }
  89. }
  90. private AeDcPowerConnection _connection;
  91. private byte _deviceAddress;
  92. private float _powerSetPoint;
  93. private float _reflectPower;
  94. private float _scalePower;
  95. private float _factor;
  96. private bool _isOn;
  97. private bool _isError;
  98. private string _errorCode;
  99. private float _forwardPower;
  100. private string _unit;
  101. private float _voltage;
  102. private float _current;
  103. private int _queryInterval;
  104. private bool _setOn;
  105. private SCConfigItem _scPowerType;
  106. private SCConfigItem _scPulseType;
  107. private SCConfigItem _scPulseReverseTime;
  108. private EnumRfPowerRegulationMode _regulationMode;
  109. private EnumRfPowerCommunicationMode _commMode;
  110. private EnumDcPowerPulseType _pulseType;
  111. public Func<bool, bool> FuncCheckInterLock;
  112. public Func<bool, bool> FuncForceAction;
  113. private R_TRIG _trigForceAction = new R_TRIG();
  114. private RD_TRIG _trigRfOnOff = new RD_TRIG();
  115. private R_TRIG _trigError = new R_TRIG();
  116. private R_TRIG _trigWarningMessage = new R_TRIG();
  117. private R_TRIG _trigCommunicationError = new R_TRIG();
  118. private R_TRIG _trigRetryConnect = new R_TRIG();
  119. private R_TRIG _trigConnect = new R_TRIG();
  120. private PeriodicJob _thread;
  121. private LinkedList<HandlerBase> _lstHandler = new LinkedList<HandlerBase>();
  122. private object _locker = new object();
  123. private bool _enableLog = true;
  124. private bool _isHaloInstalled;
  125. public AeDcPower(string module, string name) : base(module, name)
  126. {
  127. }
  128. public override bool Initialize()
  129. {
  130. base.Initialize();
  131. string portName = SC.GetStringValue($"{Module}.{Name}.Address");
  132. //int bautRate = SC.GetValue<int>($"{ScBasePath}.{Name}.BaudRate");
  133. //int dataBits = SC.GetValue<int>($"{ScBasePath}.{Name}.DataBits");
  134. //Enum.TryParse(SC.GetStringValue($"{ScBasePath}.{Name}.Parity"), out Parity parity);
  135. //Enum.TryParse(SC.GetStringValue($"{ScBasePath}.{Name}.StopBits"), out StopBits stopBits);
  136. _unit = SC.GetStringValue($"{Module}.{Name}.Unit");
  137. _deviceAddress = (byte)SC.GetValue<int>($"{Module}.{Name}.DeviceAddress");
  138. _enableLog = SC.GetValue<bool>($"{Module}.{Name}.EnableLogMessage");
  139. _scalePower = (float)SC.GetValue<double>($"{Module}.{Name}.ScalePower");
  140. _factor = SC.GetValue<int>($"{Module}.{Name}.Factor");
  141. _queryInterval = SC.GetValue<int>($"{Module}.{Name}.QueryInterval");
  142. _scPowerType = SC.GetConfigItem($"System.SetUp.{Module}.PowerType");
  143. _scPulseType = SC.GetConfigItem($"System.SetUp.{Module}.PulseType");
  144. _scPulseReverseTime = SC.GetConfigItem($"System.SetUp.{Module}.PulseReverseTime");
  145. _connection = new AeDcPowerConnection(portName);
  146. _connection.IsEnableHandlerRetry = true;
  147. _connection.EnableLog(_enableLog);
  148. if (_connection.Connect())
  149. {
  150. EV.PostInfoLog(Module, $"{Module}.{Name} connected");
  151. }
  152. _thread = new PeriodicJob(_queryInterval, OnTimer, $"{Module}.{Name} MonitorHandler", true);
  153. DATA.Subscribe($"{Module}.{Name}.Current", () => Current);
  154. DATA.Subscribe($"{Module}.{Name}.Voltage", () => Voltage);
  155. OP.Subscribe($"{Module}.{Name}.SetPowerForRecipe", (function, args) =>
  156. {
  157. float value = Convert.ToSingle(args[0]);
  158. SetPower(value);
  159. bool isOn = value > 0;
  160. if (isOn ^ IsPowerOn)
  161. {
  162. SetPowerOnOff(isOn, out _);
  163. }
  164. return true;
  165. });
  166. OP.Subscribe($"{Module}.{Name}.SetPulseType", (function, args) =>
  167. {
  168. if (!Enum.TryParse((string)args[0], out EnumDcPowerPulseType type))
  169. {
  170. EV.PostWarningLog(Module, $"Argument {args[0]}not valid");
  171. return false;
  172. }
  173. SetPulseType(type);
  174. return true;
  175. });
  176. OP.Subscribe($"{Module}.{Name}.SetPulseFrequency", (function, args) =>
  177. {
  178. int value = Convert.ToInt32(args[0]);
  179. SetPulseFrequency(value);
  180. return true;
  181. });
  182. OP.Subscribe($"{Module}.{Name}.SetPulseReverseTime", (function, args) =>
  183. {
  184. float value = Convert.ToSingle(args[0]);
  185. SetPulseReverseTime(value);
  186. return true;
  187. });
  188. return true;
  189. }
  190. private bool OnTimer()
  191. {
  192. try
  193. {
  194. _connection.MonitorTimeout();
  195. _trigConnect.CLK = _connection.IsConnected;
  196. if (_trigConnect.Q)
  197. {
  198. _lstHandler.AddLast(new AeRfPowerSetCommModeHandler(this, _deviceAddress, EnumRfPowerCommunicationMode.Host));
  199. _lstHandler.AddLast(new AeRfPowerSetRegulationModeHandler(this, _deviceAddress, EnumRfPowerRegulationMode.Power));
  200. }
  201. if (!_connection.IsConnected)
  202. {
  203. lock (_locker)
  204. {
  205. _lstHandler.Clear();
  206. }
  207. _trigRetryConnect.CLK = !_connection.IsConnected;
  208. if (_trigRetryConnect.Q)
  209. {
  210. _connection.SetPortAddress(SC.GetStringValue($"{Module}.{Name}.Address"));
  211. if (_connection.Connect() && _connection.IsConnected)
  212. {
  213. _connection.ForceClear();
  214. EV.PostInfoLog(Module, $"Reconnect with {_connection.Address}, {Module}.{Name}");
  215. }
  216. else
  217. {
  218. EV.PostAlarmLog(Module, $"Can not connect with {_connection.Address}, {Module}.{Name}");
  219. }
  220. }
  221. return true;
  222. }
  223. // 达到一定条件,强制关闭电源
  224. if (FuncForceAction != null)
  225. {
  226. _trigForceAction.CLK = FuncForceAction(IsPowerOn);
  227. if (_trigForceAction.Q)
  228. {
  229. SetPower(0);
  230. SetPowerOnOff(false, out string reason);
  231. //EV.PostAlarmLog(Module, $"Force set {Name} off for interlock");
  232. }
  233. }
  234. HandlerBase handler = null;
  235. if (!_connection.IsBusy)
  236. {
  237. lock (_locker)
  238. {
  239. if (_lstHandler.Count == 0)
  240. {
  241. if (_commMode != EnumRfPowerCommunicationMode.Host)
  242. {
  243. _lstHandler.AddLast(new AeRfPowerSetCommModeHandler(this, _deviceAddress, EnumRfPowerCommunicationMode.Host));
  244. _lstHandler.AddLast(new AeRfPowerQueryCommModeHandler(this, _deviceAddress));
  245. }
  246. if (_regulationMode != EnumRfPowerRegulationMode.Power)
  247. {
  248. _lstHandler.AddLast(new AeRfPowerSetRegulationModeHandler(this, _deviceAddress, EnumRfPowerRegulationMode.Power));
  249. _lstHandler.AddLast(new AeRfPowerQueryRegulationModeHandler(this, _deviceAddress));
  250. }
  251. if (_setOn || _isOn)
  252. {
  253. _lstHandler.AddLast(new AeRfPowerQueryStatusHandler(this, _deviceAddress));
  254. _lstHandler.AddLast(new AeRfPowerQueryPowerVoltageCurrentHandler(this, _deviceAddress));
  255. //_lstHandler.AddLast(new AeRfPowerQuerySetPointHandler(this, _deviceAddress));
  256. //_lstHandler.AddLast(new AeRfPowerQueryFaultorWarningHandler(this, _deviceAddress));
  257. }
  258. if (SC.GetStringValue($"System.SetUp.{Module}.PowerType") == "DCPulse")
  259. {
  260. _lstHandler.AddLast(new AeRfPowerQueryPulseFrequencyHandler(this, _deviceAddress));
  261. _lstHandler.AddLast(new AeRfPowerQueryPulseReverseTimeHandler(this, _deviceAddress));
  262. }
  263. }
  264. if (_lstHandler.Count > 0)
  265. {
  266. handler = _lstHandler.First.Value;
  267. _lstHandler.RemoveFirst();
  268. }
  269. }
  270. if (handler != null)
  271. {
  272. _connection.Execute(handler);
  273. }
  274. }
  275. }
  276. catch (Exception ex)
  277. {
  278. LOG.Write(ex);
  279. }
  280. return true;
  281. }
  282. public override void Monitor()
  283. {
  284. try
  285. {
  286. _connection.EnableLog(_enableLog);
  287. _trigRfOnOff.CLK = _isOn;
  288. if (_trigRfOnOff.R)
  289. {
  290. EV.PostInfoLog(Module, $"{Module}.{Name} is on");
  291. }
  292. if (_trigRfOnOff.T)
  293. {
  294. EV.PostInfoLog(Module, $"{Module}.{Name} is off");
  295. }
  296. _trigError.CLK = IsError;
  297. if (_trigError.Q)
  298. {
  299. EV.PostAlarmLog(Module, $"{Module}.{Name} is error, error code {_errorCode:D3}");
  300. }
  301. _trigCommunicationError.CLK = _connection.IsCommunicationError;
  302. if (_trigCommunicationError.Q)
  303. {
  304. EV.PostWarningLog(Module, $"{Module}.{Name} communication error, {_connection.LastCommunicationError}");
  305. }
  306. //MonitorRampingPower();
  307. base.Monitor();
  308. }
  309. catch (Exception ex)
  310. {
  311. LOG.Write(ex);
  312. }
  313. }
  314. public override void Reset()
  315. {
  316. _trigError.RST = true;
  317. _trigWarningMessage.RST = true;
  318. _connection.SetCommunicationError(false, "");
  319. _trigCommunicationError.RST = true;
  320. _enableLog = SC.GetValue<bool>($"{Module}.{Name}.EnableLogMessage");
  321. _trigRetryConnect.RST = true;
  322. _trigForceAction.RST = true;
  323. base.Reset();
  324. }
  325. public override void SetPower(float power)
  326. {
  327. _powerSetPoint = power;
  328. lock (_locker)
  329. {
  330. if (power > 0)
  331. _lstHandler.AddLast(new AeRfPowerSetPowerHandler(this, _deviceAddress, _isHaloInstalled ? (int)(power * _factor) : (int)(power / _factor)));
  332. else
  333. _lstHandler.AddFirst(new AeRfPowerSetPowerHandler(this, _deviceAddress, _isHaloInstalled ? (int)(power * _factor) : (int)(power / _factor)));
  334. }
  335. }
  336. public override bool SetPowerOnOff(bool isOn, out string reason)
  337. {
  338. reason = "";
  339. if (FuncCheckInterLock != null)
  340. {
  341. if (!FuncCheckInterLock(isOn))
  342. {
  343. return false;
  344. }
  345. }
  346. _setOn = isOn;
  347. lock (_locker)
  348. {
  349. if (isOn)
  350. _lstHandler.AddLast(new AeRfPowerSwitchOnOffHandler(this, _deviceAddress, isOn));
  351. else
  352. _lstHandler.AddFirst(new AeRfPowerSwitchOnOffHandler(this, _deviceAddress, isOn));
  353. }
  354. return true;
  355. }
  356. public override void SetRegulationMode(EnumRfPowerRegulationMode mode)
  357. {
  358. lock (_locker)
  359. {
  360. _lstHandler.AddLast(new AeRfPowerSetRegulationModeHandler(this, _deviceAddress, mode));
  361. }
  362. }
  363. public void SetPulseType(EnumDcPowerPulseType type)
  364. {
  365. lock (_locker)
  366. {
  367. _lstHandler.AddLast(new AeRfPowerSetPulseTypeHandler(this, _deviceAddress, type));
  368. }
  369. }
  370. public void SetPulseFrequency(float frequency)
  371. {
  372. //PulsingFrequency = frequency;
  373. lock (_locker)
  374. {
  375. _lstHandler.AddLast(new AeRfPowerSetPulseFrequencyHandler(this, _deviceAddress, (byte)(frequency / 5)));
  376. }
  377. }
  378. public void SetPulseReverseTime(float time)
  379. {
  380. //PulsingReverseTime = time;
  381. lock (_locker)
  382. {
  383. _lstHandler.AddLast(new AeRfPowerSetPulseReverseTimeHandler(this, _deviceAddress, (byte)(time * 10)));
  384. }
  385. }
  386. internal void NoteError(string reason)
  387. {
  388. _trigWarningMessage.CLK = true;
  389. if (_trigWarningMessage.Q)
  390. {
  391. EV.PostWarningLog(Module, $"{Module}.{Name} error, {reason}");
  392. }
  393. }
  394. internal void NoteReflectPower(float reflect)
  395. {
  396. _reflectPower = reflect * 10;
  397. }
  398. internal void NoteCommMode(EnumRfPowerCommunicationMode mode)
  399. {
  400. _commMode = mode;
  401. }
  402. internal void NoteStatus(byte[] data)
  403. {
  404. _isOn = (data[0] & 0x08) == 0x08;
  405. }
  406. internal void NoteRegulationModeSetPoint(EnumRfPowerRegulationMode mode)
  407. {
  408. _regulationMode = mode;
  409. }
  410. internal void NotePowerSetPoint(int power)
  411. {
  412. _powerSetPoint = power * _factor;
  413. }
  414. internal void NoteForwardPower(int power)
  415. {
  416. _forwardPower = power * _factor;
  417. }
  418. internal void NoteVoltage(int voltage)
  419. {
  420. _voltage = voltage;
  421. }
  422. internal void NoteCurrent(int current)
  423. {
  424. _current = current / 100.0f;
  425. }
  426. internal void NoteHaloInstalled(bool isInstalled)
  427. {
  428. _isHaloInstalled = isInstalled;
  429. }
  430. internal void NoteErrorStatus(bool isError, string errorCode)
  431. {
  432. _isError = isError;
  433. _errorCode = errorCode;
  434. }
  435. internal void NotePulseFrequency(int frequency)
  436. {
  437. PulsingFrequency = frequency * 5;
  438. }
  439. internal void NotePulseReverseTime(int time)
  440. {
  441. PulsingReverseTime = time / 10.0f;
  442. }
  443. }
  444. public enum EnumRfPowerCommunicationMode
  445. {
  446. Undefined,
  447. Host = 2,
  448. UserPort = 4, //Analog
  449. Diagnostic = 8,
  450. DeviceNet = 16,
  451. EtherCat32 = 32,
  452. }
  453. public enum EnumDcPowerPulseType
  454. {
  455. Current = 0,
  456. Always = 1,
  457. Voltage = 2,
  458. }
  459. }