AeDcPowerHandler.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578
  1. using System.Collections.Generic;
  2. using Aitex.Core.Common.DeviceData;
  3. using MECF.Framework.Common.Communications;
  4. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.DCPowers.AE
  5. {
  6. public abstract class AeDcPowerHandler : HandlerBase
  7. {
  8. public AeDcPower Device { get; }
  9. private byte _address;
  10. private byte _command;
  11. protected AeDcPowerHandler(AeDcPower device, byte address, byte command, byte[] data)
  12. : base(BuildMessage(address, command, data))
  13. {
  14. Device = device;
  15. _address = address;
  16. _command = command;
  17. }
  18. private static byte[] BuildMessage(byte address, byte command, byte[] data)
  19. {
  20. List<byte> buffer = new List<byte>();
  21. buffer.Add((byte)((address << 3) + (data == null ? 0 : data.Length)));
  22. buffer.Add(command);
  23. if (data != null && data.Length > 0)
  24. {
  25. buffer.AddRange(data);
  26. }
  27. buffer.Add(CalcSum(buffer, buffer.Count));
  28. return buffer.ToArray();
  29. }
  30. //host->unit, unit->host(ack), unit->host(csr), host->unit(ack)
  31. public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
  32. {
  33. AeRfPowerMessage response = msg as AeRfPowerMessage;
  34. ResponseMessage = msg;
  35. if (response.IsAck)
  36. {
  37. SetState(EnumHandlerState.Acked);
  38. }
  39. if (response.Address != _address || response.CommandNumber != _command)
  40. {
  41. transactionComplete = false;
  42. return false;
  43. }
  44. if (response.IsResponse)
  45. {
  46. if (response.DataLength >= 1)
  47. {
  48. ParseData(response);
  49. }
  50. SendAck();
  51. SetState(EnumHandlerState.Completed);
  52. transactionComplete = true;
  53. return true;
  54. }
  55. transactionComplete = false;
  56. return false;
  57. }
  58. protected virtual void ParseData(AeRfPowerMessage msg)
  59. {
  60. if (msg.Data[0] != 0)
  61. {
  62. var reason = TranslateCsrCode(msg.Data[0]);
  63. Device.NoteError(reason);
  64. }
  65. }
  66. public void SendAck()
  67. {
  68. Device.Connection.SendMessage(new byte[] { 0x06 });
  69. }
  70. private static byte CalcSum(List<byte> data, int length)
  71. {
  72. byte ret = 0x00;
  73. for (var i = 0; i < length; i++)
  74. {
  75. ret ^= data[i];
  76. }
  77. return ret;
  78. }
  79. protected string TranslateCsrCode(int csrCode)
  80. {
  81. string ret = csrCode.ToString();
  82. switch (csrCode)
  83. {
  84. case 0:
  85. ret = null;//"Command accepted";
  86. break;
  87. case 1:
  88. ret = "Control Code Is Incorrect";
  89. break;
  90. case 2:
  91. ret = "Output Is On(Change Not Allowed)";
  92. break;
  93. case 4:
  94. ret = "Data Is Out Of Range";
  95. break;
  96. case 7:
  97. ret = "Active Fault(s) Exist";
  98. break;
  99. case 9:
  100. ret = "Data Byte Count Is Incorrect";
  101. break;
  102. case 19:
  103. ret = "Recipe Is Active(Change Not Allowed)";
  104. break;
  105. case 50:
  106. ret = "The Frequency Is Out Of Range";
  107. break;
  108. case 51:
  109. ret = "The Duty Cycle Is Out Of Range";
  110. break;
  111. case 53:
  112. ret = "The Device Controlled By The Command Is Not Detected";
  113. break;
  114. case 99:
  115. ret = "Command Not Accepted(There Is No Such Command)";
  116. break;
  117. default:
  118. break;
  119. }
  120. return ret;
  121. }
  122. }
  123. //1 off, 2 on
  124. public class AeRfPowerSwitchOnOffHandler : AeDcPowerHandler
  125. {
  126. public AeRfPowerSwitchOnOffHandler(AeDcPower device, byte address, bool isOn)
  127. : base(device, address, isOn ? (byte)0x02 : (byte)0x01, null)
  128. {
  129. Name = "Switch " + (isOn ? "On" : "Off");
  130. }
  131. }
  132. //3 regulation mode
  133. public class AeRfPowerSetRegulationModeHandler : AeDcPowerHandler
  134. {
  135. public AeRfPowerSetRegulationModeHandler(AeDcPower device, byte address, EnumRfPowerRegulationMode mode)
  136. : base(device, address, 3, new byte[] { GetMode(mode) })
  137. {
  138. Name = "set regulation mode";
  139. }
  140. private static byte GetMode(EnumRfPowerRegulationMode mode)
  141. {
  142. switch (mode)
  143. {
  144. case EnumRfPowerRegulationMode.Power:
  145. return 6;
  146. case EnumRfPowerRegulationMode.Voltage:
  147. return 7;
  148. case EnumRfPowerRegulationMode.Current:
  149. return 8;
  150. }
  151. return 0;
  152. }
  153. }
  154. //6 set power
  155. public class AeRfPowerSetPowerHandler : AeDcPowerHandler
  156. {
  157. public AeRfPowerSetPowerHandler(AeDcPower device, byte address, int power)
  158. : base(device, address, 6, BuildData(power))
  159. {
  160. Name = "set power";
  161. }
  162. private static byte[] BuildData(int power)
  163. {
  164. return new byte[] { (byte)power, (byte)(power >> 8) };
  165. }
  166. }
  167. //14 set communication mode
  168. public class AeRfPowerSetCommModeHandler : AeDcPowerHandler
  169. {
  170. public AeRfPowerSetCommModeHandler(AeDcPower device, byte address, EnumRfPowerCommunicationMode mode)
  171. : base(device, address, 14, BuildData(mode))
  172. {
  173. Name = "set communication mode";
  174. }
  175. private static byte[] BuildData(EnumRfPowerCommunicationMode mode)
  176. {
  177. byte value = 0;
  178. switch (mode)
  179. {
  180. case EnumRfPowerCommunicationMode.DeviceNet:
  181. value = 16;
  182. break;
  183. case EnumRfPowerCommunicationMode.Diagnostic:
  184. value = 8;
  185. break;
  186. case EnumRfPowerCommunicationMode.EtherCat32:
  187. value = 32;
  188. break;
  189. case EnumRfPowerCommunicationMode.Host:
  190. value = 2;
  191. break;
  192. case EnumRfPowerCommunicationMode.UserPort:
  193. value = 4;
  194. break;
  195. }
  196. return new byte[] { value };
  197. }
  198. }
  199. //13 set caps control mode
  200. public class AeRfPowerSetCapsCtrlModeHandler : AeDcPowerHandler
  201. {
  202. public AeRfPowerSetCapsCtrlModeHandler(AeDcPower device, byte address, byte mode)
  203. : base(device, address, 13, BuildData(mode))
  204. {
  205. Name = "set caps control mode";
  206. }
  207. private static byte[] BuildData(byte mode)
  208. {
  209. return new byte[] { mode == 0x01 ? (byte)0x01 : (byte)0x00 };
  210. }
  211. }
  212. //65 set pulse type
  213. public class AeRfPowerSetPulseTypeHandler : AeDcPowerHandler
  214. {
  215. public AeRfPowerSetPulseTypeHandler(AeDcPower device, byte address, EnumDcPowerPulseType type)
  216. : base(device, address, 65, BuildData(type))
  217. {
  218. Name = "set pulse type";
  219. }
  220. private static byte[] BuildData(EnumDcPowerPulseType type)
  221. {
  222. byte value = 0;
  223. switch (type)
  224. {
  225. case EnumDcPowerPulseType.Current:
  226. value = 0;
  227. break;
  228. case EnumDcPowerPulseType.Always:
  229. value = 1;
  230. break;
  231. case EnumDcPowerPulseType.Voltage:
  232. value = 2;
  233. break;
  234. }
  235. return new byte[] { value };
  236. }
  237. }
  238. //92 set pulse frequency index
  239. public class AeRfPowerSetPulseFrequencyHandler : AeDcPowerHandler
  240. {
  241. public AeRfPowerSetPulseFrequencyHandler(AeDcPower device, byte address, byte frequency)
  242. : base(device, address, 92, BuildData(frequency))
  243. {
  244. Name = "set pulse frequency";
  245. }
  246. private static byte[] BuildData(byte frequency)
  247. {
  248. return new byte[] { frequency };
  249. }
  250. }
  251. //93 set pulse reverse time
  252. public class AeRfPowerSetPulseReverseTimeHandler : AeDcPowerHandler
  253. {
  254. public AeRfPowerSetPulseReverseTimeHandler(AeDcPower device, byte address, byte time)
  255. : base(device, address, 93, BuildData(time))
  256. {
  257. Name = "set pulse reverse time";
  258. }
  259. private static byte[] BuildData(byte time)
  260. {
  261. return new byte[] { time };
  262. }
  263. }
  264. //146 query pulse frequency index
  265. public class AeRfPowerQueryPulseFrequencyHandler : AeDcPowerHandler
  266. {
  267. public AeRfPowerQueryPulseFrequencyHandler(AeDcPower device, byte address)
  268. : base(device, address, 146, null)
  269. {
  270. Name = "Query pulse frequency index";
  271. }
  272. protected override void ParseData(AeRfPowerMessage response)
  273. {
  274. if (response.DataLength != 1)
  275. {
  276. Device.NoteError($"query pulse frequency index, return data length {response.DataLength}");
  277. }
  278. else
  279. {
  280. Device.NotePulseFrequency(response.Data[0]);
  281. }
  282. }
  283. }
  284. //147 query pulse reverse time
  285. public class AeRfPowerQueryPulseReverseTimeHandler : AeDcPowerHandler
  286. {
  287. public AeRfPowerQueryPulseReverseTimeHandler(AeDcPower device, byte address)
  288. : base(device, address, 147, null)
  289. {
  290. Name = "Query pulse reverse time";
  291. }
  292. protected override void ParseData(AeRfPowerMessage response)
  293. {
  294. if (response.DataLength != 1)
  295. {
  296. Device.NoteError($"query pulse reverse time, return data length {response.DataLength}");
  297. }
  298. else
  299. {
  300. Device.NotePulseReverseTime(response.Data[0]);
  301. }
  302. }
  303. }
  304. //154 query regulation mode
  305. public class AeRfPowerQueryRegulationModeHandler : AeDcPowerHandler
  306. {
  307. public AeRfPowerQueryRegulationModeHandler(AeDcPower device, byte address)
  308. : base(device, address, 154, null)
  309. {
  310. Name = "query regulation mode";
  311. }
  312. protected override void ParseData(AeRfPowerMessage response)
  313. {
  314. if (response.DataLength != 1)
  315. {
  316. Device.NoteError($"{Name}, return data length {response.DataLength}");
  317. }
  318. else
  319. {
  320. EnumRfPowerRegulationMode mode = EnumRfPowerRegulationMode.Undefined;
  321. switch (response.Data[0])
  322. {
  323. case 6:
  324. mode = EnumRfPowerRegulationMode.Power;
  325. break;
  326. case 7:
  327. mode = EnumRfPowerRegulationMode.Voltage;
  328. break;
  329. case 8:
  330. mode = EnumRfPowerRegulationMode.Current;
  331. break;
  332. }
  333. Device.NoteRegulationModeSetPoint(mode);
  334. }
  335. }
  336. }
  337. //155 query comm mode
  338. public class AeRfPowerQueryCommModeHandler : AeDcPowerHandler
  339. {
  340. public AeRfPowerQueryCommModeHandler(AeDcPower device, byte address)
  341. : base(device, address, 155, null)
  342. {
  343. Name = "query comm mode";
  344. }
  345. protected override void ParseData(AeRfPowerMessage response)
  346. {
  347. if (response.DataLength != 1)
  348. {
  349. Device.NoteError($"{Name}, return data length {response.DataLength}");
  350. }
  351. else
  352. {
  353. EnumRfPowerCommunicationMode mode = EnumRfPowerCommunicationMode.Undefined;
  354. switch (response.Data[0])
  355. {
  356. case 2:
  357. mode = EnumRfPowerCommunicationMode.Host;
  358. break;
  359. case 4:
  360. mode = EnumRfPowerCommunicationMode.UserPort;
  361. break;
  362. case 8:
  363. mode = EnumRfPowerCommunicationMode.Diagnostic;
  364. break;
  365. case 16:
  366. mode = EnumRfPowerCommunicationMode.DeviceNet;
  367. break;
  368. case 32:
  369. mode = EnumRfPowerCommunicationMode.EtherCat32;
  370. break;
  371. }
  372. Device.NoteCommMode(mode);
  373. }
  374. }
  375. }
  376. //162 query status
  377. public class AeRfPowerQueryStatusHandler : AeDcPowerHandler
  378. {
  379. public AeRfPowerQueryStatusHandler(AeDcPower device, byte address)
  380. : base(device, address, 162, null)
  381. {
  382. Name = "query status";
  383. }
  384. protected override void ParseData(AeRfPowerMessage response)
  385. {
  386. if (response.DataLength != 4)
  387. {
  388. Device.NoteError($"{Name}, return data length {response.DataLength}");
  389. }
  390. else
  391. {
  392. Device.NoteStatus(response.Data);
  393. if ((response.Data[1] & 0x80) == 0x80)
  394. {
  395. Device.NoteErrorStatus(true, "Interlock open");
  396. }
  397. else
  398. {
  399. Device.NoteErrorStatus(false, "");
  400. }
  401. }
  402. }
  403. }
  404. //164 query setpoint
  405. public class AeRfPowerQuerySetPointHandler : AeDcPowerHandler
  406. {
  407. public AeRfPowerQuerySetPointHandler(AeDcPower device, byte address)
  408. : base(device, address, 164, null)
  409. {
  410. Name = "query setpoint";
  411. }
  412. protected override void ParseData(AeRfPowerMessage response)
  413. {
  414. if (response.DataLength != 3)
  415. {
  416. Device.NoteError($"{Name}, return data length {response.DataLength}");
  417. }
  418. else
  419. {
  420. EnumRfPowerRegulationMode mode = EnumRfPowerRegulationMode.Undefined;
  421. switch (response.Data[2])
  422. {
  423. case 6:
  424. mode = EnumRfPowerRegulationMode.Power;
  425. break;
  426. case 7:
  427. mode = EnumRfPowerRegulationMode.Voltage;
  428. break;
  429. case 8:
  430. mode = EnumRfPowerRegulationMode.Current;
  431. break;
  432. }
  433. Device.NoteRegulationModeSetPoint(mode);
  434. Device.NotePowerSetPoint(response.Data[0] + (response.Data[1] << 8));
  435. }
  436. }
  437. }
  438. //165 query forward power
  439. public class AeRfPowerQueryForwardPowerHandler : AeDcPowerHandler
  440. {
  441. public AeRfPowerQueryForwardPowerHandler(AeDcPower device, byte address)
  442. : base(device, address, 165, null)
  443. {
  444. Name = "Query forward power";
  445. }
  446. protected override void ParseData(AeRfPowerMessage response)
  447. {
  448. if (response.DataLength != 2)
  449. {
  450. Device.NoteError($"query forward power, return data length {response.DataLength}");
  451. }
  452. else
  453. {
  454. Device.NoteForwardPower(response.Data[0] + (response.Data[1] << 8));
  455. }
  456. }
  457. }
  458. //168 query forward power, voltage, current
  459. public class AeRfPowerQueryPowerVoltageCurrentHandler : AeDcPowerHandler
  460. {
  461. public AeRfPowerQueryPowerVoltageCurrentHandler(AeDcPower device, byte address)
  462. : base(device, address, 168, null)
  463. {
  464. Name = "Query forward power, voltage, current";
  465. }
  466. protected override void ParseData(AeRfPowerMessage response)
  467. {
  468. if (response.DataLength != 6)
  469. {
  470. Device.NoteError($"query forward power, voltage, current, return data length {response.DataLength}");
  471. }
  472. else
  473. {
  474. Device.NoteForwardPower(response.Data[0] + (response.Data[1] << 8));
  475. Device.NoteVoltage(response.Data[2] + (response.Data[3] << 8));
  476. Device.NoteCurrent(response.Data[4] + (response.Data[5] << 8));
  477. }
  478. }
  479. }
  480. //221 query PIN number
  481. public class AeRfPowerQueryPinHandler : AeDcPowerHandler
  482. {
  483. public AeRfPowerQueryPinHandler(AeDcPower device, byte address)
  484. : base(device, address, 221, null)
  485. {
  486. Name = "Query PIN number";
  487. }
  488. protected override void ParseData(AeRfPowerMessage response)
  489. {
  490. if (response.DataLength != 32)
  491. {
  492. Device.NoteError($"query pin number, return data length {response.DataLength}");
  493. }
  494. else
  495. {
  496. Device.NoteHaloInstalled(response.Data[20] == 0x31);
  497. }
  498. }
  499. }
  500. //223 query fault or warning code
  501. public class AeRfPowerQueryFaultorWarningHandler : AeDcPowerHandler
  502. {
  503. public AeRfPowerQueryFaultorWarningHandler(AeDcPower device, byte address)
  504. : base(device, address, 223, null)
  505. {
  506. Name = "Query fault or warning code";
  507. }
  508. //protected override void ParseData(AeRfPowerMessage response)
  509. //{
  510. // if (response.DataLength == 1)
  511. // {
  512. // Device.NoteErrorStatus(false, string.Empty);
  513. // }
  514. // else if (response.DataLength >= 2 && (response.Data[0] == 1 || response.Data[0] == 3))
  515. // {
  516. // Device.NoteErrorStatus(true, string.Empty);
  517. // }
  518. //}
  519. }
  520. }