AeRfPowerHandler.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. using System;
  2. using System.Collections.Generic;
  3. using Aitex.Core.Common.DeviceData;
  4. using MECF.Framework.Common.Communications;
  5. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.RFs.AE
  6. {
  7. public abstract class AeRfPowerHandler : HandlerBase
  8. {
  9. public AeRfPower Device { get; }
  10. private byte _address;
  11. private byte _command;
  12. protected AeRfPowerHandler(AeRfPower device, byte address, byte command, byte[] data)
  13. : base(BuildMessage(address, command, data))
  14. {
  15. Device = device;
  16. _address = address;
  17. _command = command;
  18. }
  19. private static byte[] BuildMessage(byte address, byte command, byte[] data)
  20. {
  21. List<byte> buffer = new List<byte>();
  22. buffer.Add((byte)((address << 3) + (data == null ? 0 : data.Length)));
  23. buffer.Add(command);
  24. if (data != null && data.Length > 0)
  25. {
  26. buffer.AddRange(data);
  27. }
  28. buffer.Add(CalcSum(buffer, buffer.Count));
  29. return buffer.ToArray();
  30. }
  31. //host->unit, unit->host(ack), unit->host(csr), host->unit(ack)
  32. public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
  33. {
  34. AeRfPowerMessage response = msg as AeRfPowerMessage;
  35. ResponseMessage = msg;
  36. if (response.IsAck)
  37. {
  38. SetState(EnumHandlerState.Acked);
  39. }
  40. if (response.Address != _address || response.CommandNumber != _command)
  41. {
  42. transactionComplete = false;
  43. return false;
  44. }
  45. if (response.IsResponse)
  46. {
  47. if (response.DataLength >= 1)
  48. {
  49. ParseData(response);
  50. }
  51. SendAck();
  52. SetState(EnumHandlerState.Completed);
  53. transactionComplete = true;
  54. return true;
  55. }
  56. transactionComplete = false;
  57. return false;
  58. }
  59. protected virtual void ParseData(AeRfPowerMessage msg)
  60. {
  61. if (msg.Data[0] != 0)
  62. {
  63. var reason = TranslateCsrCode(msg.Data[0]);
  64. Device.NoteError(reason);
  65. }
  66. }
  67. public void SendAck()
  68. {
  69. Device.Connection.SendMessage(new byte[] { 0x06 });
  70. }
  71. private static byte CalcSum(List<byte> data, int length)
  72. {
  73. byte ret = 0x00;
  74. for (var i = 0; i < length; i++)
  75. {
  76. ret ^= data[i];
  77. }
  78. return ret;
  79. }
  80. protected string TranslateCsrCode(int csrCode)
  81. {
  82. string ret = csrCode.ToString();
  83. switch (csrCode)
  84. {
  85. case 0:
  86. ret = null;//"Command accepted";
  87. break;
  88. case 1:
  89. ret = "Control Code Is Incorrect";
  90. break;
  91. case 2:
  92. ret = "Output Is On(Change Not Allowed)";
  93. break;
  94. case 4:
  95. ret = "Data Is Out Of Range";
  96. break;
  97. case 7:
  98. ret = "Active Fault(s) Exist";
  99. break;
  100. case 9:
  101. ret = "Data Byte Count Is Incorrect";
  102. break;
  103. case 19:
  104. ret = "Recipe Is Active(Change Not Allowed)";
  105. break;
  106. case 50:
  107. ret = "The Frequency Is Out Of Range";
  108. break;
  109. case 51:
  110. ret = "The Duty Cycle Is Out Of Range";
  111. break;
  112. case 53:
  113. ret = "The Device Controlled By The Command Is Not Detected";
  114. break;
  115. case 99:
  116. ret = "Command Not Accepted(There Is No Such Command)";
  117. break;
  118. default:
  119. break;
  120. }
  121. return ret;
  122. }
  123. }
  124. //1 off, 2 on
  125. public class AeRfPowerSwitchOnOffHandler : AeRfPowerHandler
  126. {
  127. public AeRfPowerSwitchOnOffHandler(AeRfPower device, byte address, bool isOn)
  128. : base(device, address, isOn ? (byte)0x02 : (byte)0x01, null)
  129. {
  130. Name = "Switch " + (isOn ? "On" : "Off");
  131. }
  132. }
  133. //3 regulation mode
  134. public class AeRfPowerSetRegulationModeHandler : AeRfPowerHandler
  135. {
  136. public AeRfPowerSetRegulationModeHandler(AeRfPower device, byte address, EnumRfPowerRegulationMode mode)
  137. : base(device, address, 3, new byte[]{ GetMode(mode) })
  138. {
  139. Name = "set regulation mode";
  140. }
  141. private static byte GetMode(EnumRfPowerRegulationMode mode)
  142. {
  143. switch (mode)
  144. {
  145. case EnumRfPowerRegulationMode.DcBias:
  146. return 8;
  147. case EnumRfPowerRegulationMode.Forward:
  148. return 6;
  149. case EnumRfPowerRegulationMode.Load:
  150. return 7;
  151. case EnumRfPowerRegulationMode.VALimit:
  152. return 9;
  153. }
  154. return 0;
  155. }
  156. }
  157. //8 set power
  158. public class AeRfPowerSetPowerHandler : AeRfPowerHandler
  159. {
  160. public AeRfPowerSetPowerHandler(AeRfPower device, byte address, int power)
  161. : base(device, address, 8, BuildData(power))
  162. {
  163. Name = "set power";
  164. }
  165. private static byte[] BuildData(int power)
  166. {
  167. return new byte[]{(byte)power, (byte)(power >> 8)};
  168. }
  169. }
  170. //14 set communication mode
  171. public class AeRfPowerSetCommModeHandler : AeRfPowerHandler
  172. {
  173. public AeRfPowerSetCommModeHandler(AeRfPower device, byte address, EnumRfPowerCommunicationMode mode)
  174. : base(device, address, 14, BuildData(mode))
  175. {
  176. Name = "set communication mode";
  177. }
  178. private static byte[] BuildData(EnumRfPowerCommunicationMode mode)
  179. {
  180. byte value = 0;
  181. switch (mode)
  182. {
  183. case EnumRfPowerCommunicationMode.DeviceNet:
  184. value = 16;
  185. break;
  186. case EnumRfPowerCommunicationMode.Diagnostic:
  187. value = 8;
  188. break;
  189. case EnumRfPowerCommunicationMode.EtherCat32:
  190. value = 32;
  191. break;
  192. case EnumRfPowerCommunicationMode.Host:
  193. value = 2;
  194. break;
  195. case EnumRfPowerCommunicationMode.UserPort:
  196. value = 4;
  197. break;
  198. }
  199. return new byte[] { value };
  200. }
  201. }
  202. //13 set caps control mode
  203. public class AeRfPowerSetCapsCtrlModeHandler : AeRfPowerHandler
  204. {
  205. public AeRfPowerSetCapsCtrlModeHandler(AeRfPower device, byte address, byte mode)
  206. : base(device, address, 13, BuildData(mode))
  207. {
  208. Name = "set caps control mode";
  209. }
  210. private static byte[] BuildData(byte mode)
  211. {
  212. return new byte[] { mode == 0x01 ? (byte)0x01 : (byte)0x00 };
  213. }
  214. }
  215. //112 set load
  216. public class AeRfPowerSetLoadHandler : AeRfPowerHandler
  217. {
  218. public AeRfPowerSetLoadHandler(AeRfPower device, byte address, int data)
  219. : base(device, address, 112, BuildData(data))
  220. {
  221. Name = "set load";
  222. }
  223. private static byte[] BuildData(int data)
  224. {
  225. return new byte[] { (byte)data, (byte)(data >> 8) };
  226. }
  227. }
  228. //122 set tune
  229. public class AeRfPowerSetTuneHandler : AeRfPowerHandler
  230. {
  231. public AeRfPowerSetTuneHandler(AeRfPower device, byte address, int data)
  232. : base(device, address, 122, BuildData(data))
  233. {
  234. Name = "set tune";
  235. }
  236. private static byte[] BuildData(int data)
  237. {
  238. return new byte[] { (byte)data, (byte)(data >> 8) };
  239. }
  240. }
  241. //155 query comm mode
  242. public class AeRfPowerQueryCommModeHandler : AeRfPowerHandler
  243. {
  244. public AeRfPowerQueryCommModeHandler(AeRfPower device, byte address)
  245. : base(device, address, 155, null)
  246. {
  247. Name = "query comm mode";
  248. }
  249. protected override void ParseData(AeRfPowerMessage response)
  250. {
  251. if (response.DataLength != 1)
  252. {
  253. Device.NoteError($"{Name}, return data length {response.DataLength}");
  254. }
  255. else
  256. {
  257. EnumRfPowerCommunicationMode mode = EnumRfPowerCommunicationMode.Undefined;
  258. switch (response.Data[0])
  259. {
  260. case 2:
  261. mode = EnumRfPowerCommunicationMode.Host;
  262. break;
  263. case 4:
  264. mode = EnumRfPowerCommunicationMode.UserPort;
  265. break;
  266. case 8:
  267. mode = EnumRfPowerCommunicationMode.Diagnostic;
  268. break;
  269. case 16:
  270. mode = EnumRfPowerCommunicationMode.DeviceNet;
  271. break;
  272. case 32:
  273. mode = EnumRfPowerCommunicationMode.EtherCat32;
  274. break;
  275. }
  276. Device.NoteCommMode(mode);
  277. }
  278. }
  279. }
  280. //162 query status
  281. public class AeRfPowerQueryStatusHandler : AeRfPowerHandler
  282. {
  283. public AeRfPowerQueryStatusHandler(AeRfPower device, byte address)
  284. : base(device, address, 162, null)
  285. {
  286. Name = "query status";
  287. }
  288. protected override void ParseData(AeRfPowerMessage response)
  289. {
  290. if (response.DataLength != 4)
  291. {
  292. Device.NoteError($"{Name}, return data length {response.DataLength}");
  293. }
  294. else
  295. {
  296. Device.NoteStatus(response.Data);
  297. }
  298. }
  299. }
  300. //164 query setpoint
  301. public class AeRfPowerQuerySetPointHandler : AeRfPowerHandler
  302. {
  303. public AeRfPowerQuerySetPointHandler(AeRfPower device, byte address)
  304. : base(device, address, 164, null)
  305. {
  306. Name = "query setpoint";
  307. }
  308. protected override void ParseData(AeRfPowerMessage response)
  309. {
  310. if (response.DataLength != 3)
  311. {
  312. Device.NoteError($"{Name}, return data length {response.DataLength}");
  313. }
  314. else
  315. {
  316. EnumRfPowerRegulationMode regMode = EnumRfPowerRegulationMode.Undefined;
  317. switch (response.Data[2])
  318. {
  319. case 6:
  320. regMode = EnumRfPowerRegulationMode.Forward;
  321. break;
  322. case 7:
  323. regMode = EnumRfPowerRegulationMode.Load;
  324. break;
  325. case 8:
  326. regMode = EnumRfPowerRegulationMode.DcBias;
  327. break;
  328. case 9:
  329. regMode = EnumRfPowerRegulationMode.VALimit;
  330. break;
  331. }
  332. Device.NoteRegulationModeSetPoint(regMode);
  333. Device.NotePowerSetPoint(response.Data[0] + (response.Data[1] << 8));
  334. }
  335. }
  336. }
  337. //165 forward power
  338. public class AeRfPowerQueryForwardPowerHandler : AeRfPowerHandler
  339. {
  340. public AeRfPowerQueryForwardPowerHandler(AeRfPower device, byte address)
  341. : base(device, address, 165, null)
  342. {
  343. Name = "Query forward power";
  344. }
  345. protected override void ParseData(AeRfPowerMessage response)
  346. {
  347. if (response.DataLength != 2)
  348. {
  349. Device.NoteError($"query forward power, return data length {response.DataLength}");
  350. }
  351. else
  352. {
  353. Device.NoteForwardPower( response.Data[0] + (response.Data[1] << 8));
  354. }
  355. }
  356. }
  357. //166 reflect power
  358. public class AeRfPowerQueryReflectPowerHandler : AeRfPowerHandler
  359. {
  360. public AeRfPowerQueryReflectPowerHandler(AeRfPower device, byte address)
  361. : base(device, address, 166, null)
  362. {
  363. Name = "Query reflect power";
  364. }
  365. protected override void ParseData(AeRfPowerMessage response)
  366. {
  367. if (response.DataLength != 2)
  368. {
  369. Device.NoteError($"{Name}, return data length {response.DataLength}");
  370. }
  371. else
  372. {
  373. Device.NoteReflectPower(response.Data[0] + (response.Data[1] << 8));
  374. }
  375. }
  376. }
  377. //221 query PIN number
  378. public class AeRfPowerQueryPinHandler : AeRfPowerHandler
  379. {
  380. public AeRfPowerQueryPinHandler(AeRfPower device, byte address)
  381. : base(device, address, 221, null)
  382. {
  383. Name = "Query PIN number";
  384. }
  385. protected override void ParseData(AeRfPowerMessage response)
  386. {
  387. if (response.DataLength != 32)
  388. {
  389. Device.NoteError($"query pin number, return data length {response.DataLength}");
  390. }
  391. else
  392. {
  393. Device.NoteHaloInstalled(response.Data[20]==0x31);
  394. }
  395. }
  396. }
  397. }