DxkdpDcPowerHandler.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  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.DCPowers.AE
  6. {
  7. public abstract class DxkdpDcPowerHandler : HandlerBase
  8. {
  9. public DxkdpDcPower Device { get; }
  10. private byte _address;
  11. private byte _command;
  12. protected DxkdpDcPowerHandler(DxkdpDcPower 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(0xAA);
  23. buffer.Add(address);
  24. buffer.Add(command);
  25. buffer.Add((byte)(data == null ? 0 : data.Length));
  26. if (data != null)
  27. {
  28. buffer.AddRange(data);
  29. }
  30. buffer.Add(CalcSum(buffer.GetRange(1,buffer.Count - 1)));
  31. return buffer.ToArray();
  32. //buffer.Add((byte)((address << 3) + (data == null ? 0 : data.Length)));
  33. //buffer.Add(command);
  34. //if (data != null && data.Length > 0)
  35. //{
  36. // buffer.AddRange(data);
  37. //}
  38. //buffer.Add(CalcSum(buffer, buffer.Count));
  39. //return buffer.ToArray();
  40. }
  41. //host->unit, unit->host(ack), unit->host(csr), host->unit(ack)
  42. public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
  43. {
  44. DxkdpRfPowerMessage response = msg as DxkdpRfPowerMessage;
  45. ResponseMessage = msg;
  46. if (response.IsAck)
  47. {
  48. SetState(EnumHandlerState.Acked);
  49. }
  50. if ((_command == 0x20 || _command == 0x21 || _command == 0x22 || _command == 0x23 || _command == 0x24 || _command == 0x27 || _command == 0x29 || _command == 0x30) && response.RawMessage[0] == 0x06)
  51. {
  52. SetState(EnumHandlerState.Completed);
  53. transactionComplete = true;
  54. return true;
  55. }
  56. if (response.Address != _address || response.CommandNumber != _command)
  57. {
  58. transactionComplete = false;
  59. return false;
  60. }
  61. if (response.IsResponse)
  62. {
  63. if (response.DataLength >= 1)
  64. {
  65. ParseData(response);
  66. }
  67. //SendAck();
  68. SetState(EnumHandlerState.Completed);
  69. transactionComplete = true;
  70. return true;
  71. }
  72. transactionComplete = false;
  73. return false;
  74. }
  75. protected virtual void ParseData(DxkdpRfPowerMessage msg)
  76. {
  77. if (msg.Data[0] != 0)
  78. {
  79. var reason = TranslateCsrCode(msg.Data[0]);
  80. Device.NoteError(reason);
  81. }
  82. }
  83. public void SendAck()
  84. {
  85. Device.Connection.SendMessage(new byte[] { 0x06 });
  86. }
  87. private static byte CalcSum(List<byte> data)
  88. {
  89. byte ret = 0x00;
  90. for (var i = 0; i < data.Count; i++)
  91. {
  92. ret += data[i];
  93. }
  94. return ret;
  95. }
  96. protected string TranslateCsrCode(int csrCode)
  97. {
  98. string ret = csrCode.ToString();
  99. switch (csrCode)
  100. {
  101. case 0:
  102. ret = null;//"Command accepted";
  103. break;
  104. case 1:
  105. ret = "Control Code Is Incorrect";
  106. break;
  107. case 2:
  108. ret = "Output Is On(Change Not Allowed)";
  109. break;
  110. case 4:
  111. ret = "Data Is Out Of Range";
  112. break;
  113. case 7:
  114. ret = "Active Fault(s) Exist";
  115. break;
  116. case 9:
  117. ret = "Data Byte Count Is Incorrect";
  118. break;
  119. case 19:
  120. ret = "Recipe Is Active(Change Not Allowed)";
  121. break;
  122. case 50:
  123. ret = "The Frequency Is Out Of Range";
  124. break;
  125. case 51:
  126. ret = "The Duty Cycle Is Out Of Range";
  127. break;
  128. case 53:
  129. ret = "The Device Controlled By The Command Is Not Detected";
  130. break;
  131. case 99:
  132. ret = "Command Not Accepted(There Is No Such Command)";
  133. break;
  134. default:
  135. break;
  136. }
  137. return ret;
  138. }
  139. }
  140. //2.启动电源 3.停止电源
  141. public class DxkdpRfPowerSwitchOnOffHandler : DxkdpDcPowerHandler
  142. {
  143. public DxkdpRfPowerSwitchOnOffHandler(DxkdpDcPower device, byte address, bool isOn)
  144. : base(device, address,0x20, new byte[] { isOn ? (byte)0x01 : (byte)0x00 })
  145. {
  146. Name = "Switch " + (isOn ? "On" : "Off");
  147. }
  148. }
  149. //4 set Voltage
  150. public class DxkdpRfPowerSetVoltageHandler : DxkdpDcPowerHandler
  151. {
  152. public DxkdpRfPowerSetVoltageHandler(DxkdpDcPower device, byte address, UInt16 voltage)
  153. : base(device, address, 0x21, BuildData(voltage))
  154. {
  155. Name = "set Voltage";
  156. }
  157. private static byte[] BuildData(UInt16 power)
  158. {
  159. UInt16 powerUInt = power;
  160. byte[] data = BitConverter.GetBytes(powerUInt);
  161. return data;
  162. }
  163. }
  164. //5 set Electricity
  165. public class DxkdpRfPowerSetElectricityHandler : DxkdpDcPowerHandler
  166. {
  167. public DxkdpRfPowerSetElectricityHandler(DxkdpDcPower device, byte address, UInt16 am)
  168. : base(device, address, 0x22, BuildData(am))
  169. {
  170. Name = "set Electricity";
  171. }
  172. private static byte[] BuildData(UInt16 am)
  173. {
  174. UInt16 amUInt = am ;
  175. byte[] data = BitConverter.GetBytes(amUInt);
  176. return data;
  177. }
  178. }
  179. //6 set Voltage and Electricity
  180. public class DxkdpRfPowerSetVEHandler : DxkdpDcPowerHandler
  181. {
  182. public DxkdpRfPowerSetVEHandler(DxkdpDcPower device, byte address, int volt, int vmss, int ampere, int emss)
  183. : base(device, address, 0x23, BuildData(volt, vmss,ampere,emss))
  184. {
  185. Name = "set Voltage and Electricity";
  186. }
  187. private static byte[] BuildData(int volt, int vmss, int ampere, int emss)
  188. {
  189. byte[] data = new byte[4];
  190. UInt16 voltUInt = Convert.ToUInt16(volt * (int)Math.Pow(10, vmss));
  191. byte[] dataVolt = BitConverter.GetBytes(voltUInt);
  192. UInt16 ampereUInt = Convert.ToUInt16(ampere * (int)Math.Pow(10, emss));
  193. byte[] dataAm = BitConverter.GetBytes(ampereUInt);
  194. dataVolt.CopyTo(data, 0);
  195. dataAm.CopyTo(data, 4);
  196. return data;
  197. }
  198. }
  199. //8 set Polarity
  200. public class DxkdpRfPowerSetPolarityHandler : DxkdpDcPowerHandler
  201. {
  202. public DxkdpRfPowerSetPolarityHandler(DxkdpDcPower device, byte address, int polarity)
  203. : base(device, address, 0x24, BuildData(polarity))
  204. {
  205. Name = "set Polarity";
  206. }
  207. private static byte[] BuildData(int polarity)
  208. {
  209. UInt16 polarityUInt = Convert.ToUInt16(polarity);
  210. byte[] data = BitConverter.GetBytes(polarityUInt);
  211. return data;
  212. }
  213. }
  214. // 7.读电源的实际电流值、实际电压值
  215. public class DxkdpRfPowerQueryPracticalHandler : DxkdpDcPowerHandler
  216. {
  217. public DxkdpRfPowerQueryPracticalHandler(DxkdpDcPower device, byte address)
  218. : base(device, address, 0x26, null)
  219. {
  220. Name = "Query Practical voltage, current";
  221. }
  222. protected override void ParseData(DxkdpRfPowerMessage response)
  223. {
  224. if (response.DataLength != 5)
  225. {
  226. Device.NoteError($"Query Practical voltage, current, return data length {response.DataLength}");
  227. }
  228. else
  229. {
  230. Device.NoteVoltage((response.Data[1] << 8) + response.Data[0]);
  231. Device.NoteCurrent((response.Data[3] << 8) + response.Data[2]);
  232. }
  233. }
  234. }
  235. // 9.读设置的电压电流值及电源的状态
  236. public class DxkdpRfPowerQueryStateHandler : DxkdpDcPowerHandler
  237. {
  238. public DxkdpRfPowerQueryStateHandler(DxkdpDcPower device, byte address)
  239. : base(device, address, 0x28, null)
  240. {
  241. Name = "Query the voltage, current, and status";
  242. }
  243. protected override void ParseData(DxkdpRfPowerMessage response)
  244. {
  245. if (response.DataLength != 5)
  246. {
  247. Device.NoteError($"query forward State, return data length {response.DataLength}");
  248. }
  249. else
  250. {
  251. Device.NoteStatus(response.Data[0]);
  252. //Device.NoteSetVoltage((response.Data[2] << 8) + response.Data[1]);
  253. //Device.NoteSetCurrent((response.Data[4] << 8) + response.Data[3]); 不读电流设定值
  254. }
  255. }
  256. }
  257. // 1.读电源的系统信息
  258. public class DxkdpRfPowerQuerySysInformationHandler : DxkdpDcPowerHandler
  259. {
  260. public DxkdpRfPowerQuerySysInformationHandler(DxkdpDcPower device, byte address)
  261. : base(device, address, 0x2B, null)
  262. {
  263. Name = "Query forward Voltage,Electricity current";
  264. }
  265. protected override void ParseData(DxkdpRfPowerMessage response)
  266. {
  267. if (response.DataLength != 14)
  268. {
  269. Device.NoteError($"query forward system information, return data length {response.DataLength}");
  270. }
  271. else
  272. {
  273. Device.NoteMinVStepSize(response.Data[0]);
  274. Device.NoteMinCStepSize(response.Data[1]);
  275. Device.NoteSysVoltage((response.Data[7] << 8) + response.Data[6]);
  276. Device.NoteSysCurrent((response.Data[9] << 8) + response.Data[8]);
  277. }
  278. }
  279. }
  280. //8 set Mode=1
  281. public class DxkdpRfPowerSetModeHandler : DxkdpDcPowerHandler
  282. {
  283. public DxkdpRfPowerSetModeHandler(DxkdpDcPower device, byte address, EnumRfPowerCommunicationMode host)
  284. : base(device, address, 0x30, BuildData(host))
  285. {
  286. Name = "set Mode";
  287. }
  288. private static byte[] BuildData(EnumRfPowerCommunicationMode host)
  289. {
  290. byte dataByte =(byte) (host == EnumRfPowerCommunicationMode.Host ? 1 : 0);
  291. byte[] data = new byte[] { dataByte };
  292. return data;
  293. }
  294. public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
  295. {
  296. base.HandleMessage(msg, out transactionComplete);
  297. Device.NoteMode(true);
  298. return true;
  299. }
  300. }
  301. }