CellPowerSupplier.cs 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.RT.Device;
  3. using Aitex.Core.RT.Log;
  4. using Aitex.Core.RT.OperationCenter;
  5. using Aitex.Core.RT.Routine;
  6. using Aitex.Core.Util;
  7. using MECF.Framework.Common.CommonData.PowerSupplier;
  8. using MECF.Framework.Common.Device.PowerSupplier;
  9. using MECF.Framework.Common.Equipment;
  10. using PunkHPX8_Core;
  11. using PunkHPX8_RT.Modules.Transporter;
  12. using System;
  13. using System.Collections.Concurrent;
  14. using System.Collections.Generic;
  15. using System.Linq;
  16. using System.Reflection;
  17. using System.Security.Cryptography;
  18. using System.Text;
  19. using System.Threading.Channels;
  20. using System.Threading.Tasks;
  21. using System.Windows;
  22. using System.Windows.Documents;
  23. namespace PunkHPX8_RT.Devices.PowerSupplier
  24. {
  25. public class CellPowerSupplier : BaseDevice, IDevice
  26. {
  27. private enum PowerSupplierOperation
  28. {
  29. None=0,
  30. StepOperation=1,
  31. SetCurrent=2,
  32. SetStartOperation=3
  33. }
  34. #region 常量
  35. private const string POWERSUPPLIER_DATA = "PowerSupplierData";
  36. private const string SET_POINT = "SetPoint";
  37. private const string CURRENT = "Current";
  38. private const string VOLTAGE = "Voltage";
  39. private const string ENABLED = "Enabled";
  40. private const string CONNECTED = "Connected";
  41. private const string POWER_STATUS = "PowerStatus";
  42. private const string POWER_CONTROL = "PowerControl";
  43. private const string POWER_RUN_MODEL = "PowerRunModel";
  44. private const string POWER_GRADE = "PowerGrade";
  45. #endregion
  46. #region 内部变量
  47. /// <summary>
  48. /// 数据
  49. /// </summary>
  50. private PowerSupplierData _powerSupplierData;
  51. /// <summary>
  52. /// 通道
  53. /// </summary>
  54. private byte _channel=0;
  55. /// <summary>
  56. /// 设备参数
  57. /// </summary>
  58. private PowerSupplierDevice _deviceParameter;
  59. /// <summary>
  60. /// 定时器
  61. /// </summary>
  62. private PeriodicJob _periodicJob;
  63. /// <summary>
  64. /// 指定读取指令集合
  65. /// </summary>
  66. private ConcurrentQueue<string> _readCommandList = new ConcurrentQueue<string>();
  67. /// <summary>
  68. /// 步阶Routine
  69. /// </summary>
  70. private PowerSupplierStepRoutine _powerSupplierStepRoutine;
  71. /// <summary>
  72. /// 设置电流Routine
  73. /// </summary>
  74. private PowerSupplierSetCurrentRoutine _powerSupplierSetCurrentRoutine;
  75. /// <summary>
  76. /// 设置步阶Routine
  77. /// </summary>
  78. private PowerSupplierStartStepRoutine _powerSupplierStartStepRoutine;
  79. /// <summary>
  80. /// 状态
  81. /// </summary>
  82. private RState _status;
  83. /// <summary>
  84. /// 当前操作
  85. /// </summary>
  86. private PowerSupplierOperation _currentOperation;
  87. /// <summary>
  88. /// <summary>
  89. /// 读取电流时间
  90. /// </summary>
  91. private DateTime _sendDateTime = DateTime.Now;
  92. /// <summary>
  93. /// 连接上升沿
  94. /// </summary>
  95. private R_TRIG _connectedTrig = new R_TRIG();
  96. /// <summary>
  97. /// 发送Remote上升沿
  98. /// </summary>
  99. private R_TRIG _sendRemoteTrig = new R_TRIG();
  100. /// <summary>
  101. /// 连接成功时间
  102. /// </summary>
  103. private DateTime _connectTime = DateTime.Now;
  104. /// <summary>
  105. /// 设置电压数值比例
  106. /// </summary>
  107. private int _voltageUnitSetScale;
  108. /// <summary>
  109. /// 读取电压数值比例
  110. /// </summary>
  111. private int _voltageUnitScale;
  112. /// <summary>
  113. /// 高档位设置电流数值比例
  114. /// </summary>
  115. private int _highGradeCurrentSetScale;
  116. /// <summary>
  117. /// 高档位读取电流数值比例
  118. /// </summary>
  119. private int _highGradeCurrentScale;
  120. /// <summary>
  121. /// 中档位设置电流数值比例
  122. /// </summary>
  123. private int _middleGradeCurrentSetScale;
  124. /// <summary>
  125. /// 中档位读取电流数值比例
  126. /// </summary>
  127. private int _middleGradeCurrentScale;
  128. /// <summary>
  129. /// 低档位设置电流数值比例
  130. /// </summary>
  131. private int _lowGradeCurrentSetScale;
  132. /// <summary>
  133. /// 低档位读取电流数值比例
  134. /// </summary>
  135. private int _lowGradeCurrentScale;
  136. /// <summary>
  137. /// 当前电源所处的挡位
  138. /// </summary>
  139. private int _currentPowerGrade;
  140. /// <summary>
  141. /// 当前正在使用的电流设置比例
  142. /// </summary>
  143. private int _currentSetScale;
  144. /// <summary>
  145. /// 当前正在使用的电流读取比例
  146. /// </summary>
  147. private int _currentScale;
  148. #endregion
  149. #region 属性
  150. /// <summary>
  151. /// 数据
  152. /// </summary>
  153. public PowerSupplierData PowerSupplierData { get { return _powerSupplierData; } }
  154. /// <summary>
  155. /// 状态
  156. /// </summary>
  157. public RState Status { get { return _status; } }
  158. /// <summary>
  159. /// 连接状态
  160. /// </summary>
  161. public bool IsConnected { get { return PowerSupplierDeviceConfigManager.Instance.GetModuleConnected(Module); } }
  162. #endregion
  163. /// <summary>
  164. /// 构造函数
  165. /// </summary>
  166. /// <param name="moduleName"></param>
  167. public CellPowerSupplier(string moduleName) : base(moduleName, moduleName, moduleName, moduleName)
  168. {
  169. _powerSupplierData = new PowerSupplierData();
  170. _periodicJob = new PeriodicJob(100, OnTimer, $"{Module}.OnTimer", true);
  171. }
  172. /// <summary>
  173. /// 初始化
  174. /// </summary>
  175. /// <returns></returns>
  176. public bool Initialize()
  177. {
  178. InitializeOperation();
  179. InitializeData();
  180. InitializeRoutine();
  181. return true;
  182. }
  183. /// <summary>
  184. /// 初始化操作
  185. /// </summary>
  186. private void InitializeOperation()
  187. {
  188. OP.Subscribe($"{Module}.Enable", EnableOperation);
  189. OP.Subscribe($"{Module}.Disable", DisableOperation);
  190. OP.Subscribe($"{Module}.SetPoint", SetPointOperation);
  191. OP.Subscribe($"{Module}.StartStepPeriod", StartStepPeriod);
  192. OP.Subscribe($"{Module}.SetLocalControl", SetLocalOperation);
  193. OP.Subscribe($"{Module}.SetRemoteControl", SetRemoteOperation);
  194. OP.Subscribe($"{Module}.Abort", AbortOperation);
  195. OP.Subscribe($"{Module}.SetPowerGrade", SetPowerGrade);
  196. }
  197. /// <summary>
  198. /// 初始化数据
  199. /// </summary>
  200. private void InitializeData()
  201. {
  202. _deviceParameter = PowerSupplierDeviceConfigManager.Instance.GetPowerSupplierDeviceByName(Module);
  203. if(_deviceParameter!=null)
  204. {
  205. if(!byte.TryParse(_deviceParameter.Address,out _channel))
  206. {
  207. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, $"{Module} channel is invalid");
  208. }
  209. _voltageUnitSetScale = _deviceParameter.VoltageUnitSetScale;
  210. _voltageUnitScale = _deviceParameter.VoltageUnitScale;
  211. _highGradeCurrentSetScale = _deviceParameter.HighGradeCurrentSetScale;
  212. _highGradeCurrentScale = _deviceParameter.HighGradeCurrentScale;
  213. _middleGradeCurrentSetScale = _deviceParameter.MiddleGradeCurrentSetScale;
  214. _middleGradeCurrentScale = _deviceParameter.MiddleGradeCurrentScale;
  215. _lowGradeCurrentSetScale = _deviceParameter.LowGradeCurrentSetScale;
  216. _lowGradeCurrentScale = _deviceParameter.LowGradeCurrentScale;
  217. }
  218. else
  219. {
  220. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, $"{Module} is not in config xml");
  221. }
  222. DATA.Subscribe($"{Module}.{POWERSUPPLIER_DATA}", () => _powerSupplierData, Aitex.Core.Util.SubscriptionAttribute.FLAG.IgnoreSaveDB);
  223. DATA.Subscribe($"{Module}.{CONNECTED}", () => PowerSupplierDeviceConfigManager.Instance.GetModuleConnected(Module), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  224. PowerSupplierDeviceConfigManager.Instance.SubscribeModuleVariable(Module, ENABLED, UpdateVariableValue);
  225. PowerSupplierDeviceConfigManager.Instance.SubscribeModuleVariable(Module, SET_POINT, UpdateVariableValue);
  226. PowerSupplierDeviceConfigManager.Instance.SubscribeModuleVariable(Module, VOLTAGE, UpdateVariableValue);
  227. PowerSupplierDeviceConfigManager.Instance.SubscribeModuleVariable(Module, CURRENT, UpdateVariableValue);
  228. PowerSupplierDeviceConfigManager.Instance.SubscribeModuleVariable(Module, POWER_STATUS, UpdateVariableValue);
  229. PowerSupplierDeviceConfigManager.Instance.SubscribeModuleVariable(Module,POWER_CONTROL, UpdateVariableValue);
  230. PowerSupplierDeviceConfigManager.Instance.SubscribeModuleVariable(Module, POWER_RUN_MODEL, UpdateVariableValue);
  231. PowerSupplierDeviceConfigManager.Instance.SubscribeModuleVariable(Module, POWER_GRADE, UpdateVariableValue);
  232. }
  233. /// <summary>
  234. /// 初始化Routine
  235. /// </summary>
  236. private void InitializeRoutine()
  237. {
  238. _powerSupplierStepRoutine = new PowerSupplierStepRoutine(Module);
  239. _powerSupplierSetCurrentRoutine = new PowerSupplierSetCurrentRoutine(Module);
  240. _powerSupplierStartStepRoutine= new PowerSupplierStartStepRoutine(Module);
  241. }
  242. /// <summary>
  243. /// 更新变量数值
  244. /// </summary>
  245. /// <param name="variable"></param>
  246. /// <param name="value"></param>
  247. private void UpdateVariableValue(string variable, object value)
  248. {
  249. PropertyInfo property = PowerSupplierData.GetType().GetProperty(variable);
  250. if (property != null)
  251. {
  252. if (!PowerSupplierData.IsDataInitialized)
  253. {
  254. PowerSupplierData.IsDataInitialized = true;
  255. SetPowerCCStatus();
  256. }
  257. if (variable == POWER_GRADE)
  258. {
  259. if (int.TryParse(value.ToString(), out int intvalue))
  260. {
  261. property.SetValue(PowerSupplierData, value);
  262. if (intvalue == 0)
  263. {
  264. _currentSetScale = _lowGradeCurrentSetScale;
  265. _currentScale = _lowGradeCurrentScale;
  266. }
  267. else if (intvalue == 1)
  268. {
  269. _currentSetScale = _middleGradeCurrentSetScale;
  270. _currentScale = _middleGradeCurrentScale;
  271. }
  272. else
  273. {
  274. _currentSetScale = _highGradeCurrentSetScale;
  275. _currentScale = _highGradeCurrentScale;
  276. }
  277. }
  278. else //默认使用高档的比例
  279. {
  280. _currentSetScale = _highGradeCurrentSetScale;
  281. _currentScale = _highGradeCurrentScale;
  282. }
  283. }
  284. if (variable==SET_POINT)
  285. {
  286. if (double.TryParse(value.ToString(), out double doubleValue))
  287. {
  288. property.SetValue(PowerSupplierData, doubleValue / _currentSetScale);
  289. }
  290. else
  291. {
  292. property.SetValue(PowerSupplierData, value);
  293. }
  294. }
  295. else if(variable==CURRENT)
  296. {
  297. if (double.TryParse(value.ToString(), out double doubleValue))
  298. {
  299. property.SetValue(PowerSupplierData, doubleValue / _currentScale);
  300. }
  301. else
  302. {
  303. property.SetValue(PowerSupplierData, value);
  304. }
  305. }
  306. else if (variable == VOLTAGE)
  307. {
  308. if (double.TryParse(value.ToString(), out double doubleValue))
  309. {
  310. property.SetValue(PowerSupplierData, doubleValue / _voltageUnitScale);
  311. }
  312. else
  313. {
  314. property.SetValue(PowerSupplierData, value);
  315. }
  316. }
  317. else
  318. {
  319. property.SetValue(PowerSupplierData, value);
  320. }
  321. }
  322. }
  323. /// <summary>
  324. /// 定时器
  325. /// </summary>
  326. /// <returns></returns>
  327. private bool OnTimer()
  328. {
  329. bool connected = PowerSupplierDeviceConfigManager.Instance.GetModuleConnected(Module);
  330. _connectedTrig.CLK = connected;
  331. if (_connectedTrig.Q)
  332. {
  333. _connectTime = DateTime.Now;
  334. return true;
  335. }
  336. if(!connected)
  337. {
  338. _connectedTrig.RST = true;
  339. PowerSupplierDeviceConfigManager.Instance.StartConnectDevice(Module);
  340. return true;
  341. }
  342. if (!_sendRemoteTrig.Q)
  343. {
  344. if (DateTime.Now.Subtract(_connectTime).TotalSeconds >= 1)
  345. {
  346. _sendRemoteTrig.CLK = SetRemoteOperation("", null);
  347. SetRemoteOperation("", null);
  348. }
  349. return true;
  350. }
  351. if (_readCommandList.Count != 0)
  352. {
  353. if (_readCommandList.TryDequeue(out string command))
  354. {
  355. switch (command)
  356. {
  357. case ENABLED:
  358. PowerSupplierDeviceConfigManager.Instance.GetChannelOutputSwitch(Module, _channel);
  359. break;
  360. case SET_POINT:
  361. PowerSupplierDeviceConfigManager.Instance.GetChannelCurrentSetting(Module, _channel);
  362. break;
  363. case POWER_STATUS:
  364. PowerSupplierDeviceConfigManager.Instance.GetChannelPowerStatus(Module, _channel);
  365. break;
  366. case POWER_CONTROL:
  367. PowerSupplierDeviceConfigManager.Instance.GetChannelPowerControl(Module, _channel);
  368. break;
  369. case POWER_RUN_MODEL:
  370. PowerSupplierDeviceConfigManager.Instance.GetPowerRunmodelControl(Module, _channel);
  371. break;
  372. case POWER_GRADE:
  373. PowerSupplierDeviceConfigManager.Instance.GetPowerGrade(Module, _channel);
  374. break;
  375. }
  376. _sendDateTime = DateTime.Now;
  377. }
  378. }
  379. else
  380. {
  381. //控制模式为local
  382. if (PowerSupplierData.PowerControlContent != null && PowerSupplierData.PowerControlContent.ToLower() == "local")
  383. {
  384. return true;
  385. }
  386. if (DateTime.Now.Subtract(_sendDateTime).TotalMilliseconds >= 300)
  387. {
  388. ReadCurrentAndVoltage(); //每隔0.3s读一下电流电压
  389. }
  390. }
  391. if(_status==RState.Running)
  392. {
  393. IRoutine routine = GetCurrentRoutine();
  394. if (routine != null)
  395. {
  396. _status = routine.Monitor();
  397. if (_status == RState.Failed || _status == RState.Timeout)
  398. {
  399. _status = RState.Failed;
  400. if(_currentOperation==PowerSupplierOperation.SetCurrent)
  401. {
  402. DisableOperation("", null);
  403. }
  404. _currentOperation = PowerSupplierOperation.None;
  405. }
  406. else if (_status == RState.End)
  407. {
  408. _currentOperation = PowerSupplierOperation.None;
  409. }
  410. }
  411. }
  412. return true;
  413. }
  414. /// <summary>
  415. /// 读取电流和电压
  416. /// </summary>
  417. private void ReadCurrentAndVoltage()
  418. {
  419. _sendDateTime = DateTime.Now;
  420. PowerSupplierDeviceConfigManager.Instance.GetChannelCurrentAndVoltage(Module, _channel);
  421. }
  422. #region Operation
  423. /// <summary>
  424. /// Enable Operation
  425. /// </summary>
  426. /// <param name="cmd"></param>
  427. /// <param name="args"></param>
  428. /// <returns></returns>
  429. public bool EnableOperation(string cmd, object[] args)
  430. {
  431. if (PowerSupplierData == null)
  432. {
  433. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Data is null");
  434. return false;
  435. }
  436. if (PowerSupplierData.PowerControl == (short)PowerControlEnum.Local)
  437. {
  438. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is local control");
  439. return false;
  440. }
  441. if (PowerSupplierData.SetPoint==0)
  442. {
  443. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Setpoint is 0,cannot enable output");
  444. return false;
  445. }
  446. EnableOutput();
  447. LOG.WriteLog(eEvent.INFO_POWERSUPPLIER, Module, $"Power Control enable output Success");
  448. return true;
  449. }
  450. /// <summary>
  451. /// Disable Operation
  452. /// </summary>
  453. /// <param name="cmd"></param>
  454. /// <param name="args"></param>
  455. /// <returns></returns>
  456. public bool DisableOperation(string cmd, object[] args)
  457. {
  458. if(_status==RState.Running)
  459. {
  460. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is Busy");
  461. return false;
  462. }
  463. DisableOutput();
  464. LOG.WriteLog(eEvent.INFO_POWERSUPPLIER, Module, $"Power Control disable output Success");
  465. return true;
  466. }
  467. /// <summary>
  468. /// 中止
  469. /// </summary>
  470. /// <param name="cmd"></param>
  471. /// <param name="args"></param>
  472. /// <returns></returns>
  473. private bool AbortOperation(string cmd, object[] args)
  474. {
  475. if(_status==RState.Running)
  476. {
  477. IRoutine routine = GetCurrentRoutine();
  478. if(routine!=null)
  479. {
  480. routine.Abort();
  481. }
  482. DisableOutput();
  483. PowerSupplierDeviceConfigManager.Instance.SetPowerRunmodelControl(Module, _channel, (byte)PowerRunModelEnum.Normal);
  484. LOG.WriteLog(eEvent.INFO_POWERSUPPLIER, Module, $"abort {_currentOperation} operation");
  485. _status = RState.End;
  486. _currentOperation = PowerSupplierOperation.None;
  487. _readCommandList.Enqueue(POWER_RUN_MODEL);
  488. }
  489. return true;
  490. }
  491. /// <summary>
  492. /// 关闭输出
  493. /// </summary>
  494. /// <returns></returns>
  495. public bool DisableOutput()
  496. {
  497. if(PowerSupplierData==null)
  498. {
  499. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Data is null");
  500. return false;
  501. }
  502. if(PowerSupplierData.PowerControl==(short)PowerControlEnum.Local)
  503. {
  504. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is local control");
  505. return false;
  506. }
  507. bool result= PowerSupplierDeviceConfigManager.Instance.SetChannelOutputSwitchControl(Module, _channel, false);
  508. _sendDateTime = DateTime.Now;
  509. _readCommandList.Enqueue(ENABLED);
  510. _readCommandList.Enqueue(POWER_STATUS);
  511. return result;
  512. }
  513. /// <summary>
  514. /// 启动输出
  515. /// </summary>
  516. /// <returns></returns>
  517. public bool EnableOutput()
  518. {
  519. if (PowerSupplierData == null)
  520. {
  521. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Data is null");
  522. return false;
  523. }
  524. if (PowerSupplierData.PowerControl == (short)PowerControlEnum.Local)
  525. {
  526. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is local control");
  527. return false;
  528. }
  529. bool result= PowerSupplierDeviceConfigManager.Instance.SetChannelOutputSwitchControl(Module, _channel, true);
  530. _sendDateTime = DateTime.Now;
  531. _readCommandList.Enqueue(ENABLED);
  532. _readCommandList.Enqueue(POWER_STATUS);
  533. return result;
  534. }
  535. /// <summary>
  536. /// SetPoint
  537. /// </summary>
  538. /// <param name="cmd"></param>
  539. /// <param name="args"></param>
  540. /// <returns></returns>
  541. public bool SetPointOperation(string cmd, object[] args)
  542. {
  543. if (_status == RState.Running)
  544. {
  545. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is Busy");
  546. return false;
  547. }
  548. if (PowerSupplierData == null)
  549. {
  550. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Data is null");
  551. return false;
  552. }
  553. if (PowerSupplierData.PowerControl == (short)PowerControlEnum.Local)
  554. {
  555. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is local control");
  556. return false;
  557. }
  558. if (args.Length<2)
  559. {
  560. return false;
  561. }
  562. if (double.TryParse(args[1].ToString(), out double value))
  563. {
  564. SetCurrent(value);
  565. }
  566. return true;
  567. }
  568. /// <summary>
  569. /// 设置电流
  570. /// </summary>
  571. /// <param name="current"></param>
  572. /// <returns></returns>
  573. public bool SetCurrent(double current)
  574. {
  575. PowerSupplierDeviceConfigManager.Instance.SetPowerRunmodelControl(Module, _channel, (byte)PowerRunModelEnum.Normal);
  576. int setPoint = (int)Math.Round(_currentSetScale * current, 0);
  577. bool result= PowerSupplierDeviceConfigManager.Instance.SetChannelCurrent(Module, _channel, setPoint);
  578. _sendDateTime = DateTime.Now;
  579. if (result)
  580. {
  581. LOG.WriteLog(eEvent.INFO_POWERSUPPLIER, Module, $"Current {current} Setting success");
  582. _readCommandList.Enqueue(SET_POINT);
  583. _readCommandList.Enqueue(POWER_RUN_MODEL);
  584. return true;
  585. }
  586. else
  587. {
  588. return false;
  589. }
  590. }
  591. /// <summary>
  592. /// 设置电源挡位
  593. /// </summary>
  594. /// <param name="cmd"></param>
  595. /// <param name="args"></param>
  596. /// <returns></returns>
  597. public bool SetPowerGrade(string cmd, object[] args)
  598. {
  599. if (_status == RState.Running)
  600. {
  601. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is Busy");
  602. return false;
  603. }
  604. if (PowerSupplierData == null)
  605. {
  606. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Data is null");
  607. return false;
  608. }
  609. if (PowerSupplierData.PowerControl == (short)PowerControlEnum.Local)
  610. {
  611. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is local control");
  612. return false;
  613. }
  614. byte grade = (byte)args[0];
  615. PowerSupplierDeviceConfigManager.Instance.SetPowerRunmodelControl(Module, _channel, (byte)PowerRunModelEnum.Normal);
  616. bool result = PowerSupplierDeviceConfigManager.Instance.SetPowerGrade(Module, _channel, grade);
  617. _readCommandList.Enqueue(POWER_GRADE);
  618. _readCommandList.Enqueue(POWER_RUN_MODEL);
  619. return true;
  620. }
  621. /// <summary>
  622. /// 启动
  623. /// </summary>
  624. /// <param name="cmd"></param>
  625. /// <param name="args"></param>
  626. /// <returns></returns>
  627. private bool StartStepPeriod(string cmd, object[] args)
  628. {
  629. if (_status == RState.Running)
  630. {
  631. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is Busy");
  632. return false;
  633. }
  634. if (PowerSupplierData == null)
  635. {
  636. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Data is null");
  637. return false;
  638. }
  639. if (PowerSupplierData.PowerControl == (short)PowerControlEnum.Local)
  640. {
  641. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is local control");
  642. return false;
  643. }
  644. bool result= _powerSupplierStepRoutine.Start(args)==RState.Running;
  645. if(result)
  646. {
  647. _status = RState.Running;
  648. _currentOperation = PowerSupplierOperation.StepOperation;
  649. }
  650. return result;
  651. }
  652. /// <summary>
  653. /// 启动设置步阶,
  654. /// </summary>
  655. /// <param name="cmd"></param>
  656. /// <param name="args"></param>
  657. /// <returns></returns>
  658. public bool StartSetStepPeriodNoWaitEnd(List<PowerSupplierStepPeriodData> datas)
  659. {
  660. if (_status == RState.Running)
  661. {
  662. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is Busy");
  663. return false;
  664. }
  665. if (PowerSupplierData == null)
  666. {
  667. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Data is null");
  668. return false;
  669. }
  670. if (PowerSupplierData.PowerControl == (short)PowerControlEnum.Local)
  671. {
  672. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is local control");
  673. return false;
  674. }
  675. bool result = _powerSupplierStartStepRoutine.Start(datas) == RState.Running;
  676. if (result)
  677. {
  678. _status = RState.Running;
  679. _currentOperation = PowerSupplierOperation.SetStartOperation;
  680. }
  681. return result;
  682. }
  683. /// <summary>
  684. /// 设置步阶
  685. /// </summary>
  686. /// <param name="cmd"></param>
  687. /// <param name="args"></param>
  688. /// <returns></returns>
  689. public bool SetStepPeriod(string cmd, object[] args)
  690. {
  691. List<PowerSupplierStepPeriodData> powerSupplierStepPeriodDatas = (List<PowerSupplierStepPeriodData>)args[1];
  692. bool result=PowerSupplierDeviceConfigManager.Instance.SetStepPeriod(Module, _channel, powerSupplierStepPeriodDatas,_currentSetScale, _voltageUnitSetScale);
  693. _sendDateTime = DateTime.Now;
  694. if (result)
  695. {
  696. LOG.WriteLog(eEvent.INFO_POWERSUPPLIER, Module, $"Step Period Set Success");
  697. return true;
  698. }
  699. else
  700. {
  701. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, $"Step Period Set Fail");
  702. return false;
  703. }
  704. }
  705. /// <summary>
  706. /// 启动步阶
  707. /// </summary>
  708. /// <param name="endStep"></param>
  709. /// <param name="cycle"></param>
  710. /// <returns></returns>
  711. public bool StartStepPeriod(ushort endStep,ushort cycle)
  712. {
  713. bool result = PowerSupplierDeviceConfigManager.Instance.StartStepPeriod(Module, _channel, 1, endStep, cycle);
  714. _sendDateTime= DateTime.Now;
  715. return result;
  716. }
  717. /// <summary>
  718. /// 设置电源运行模式
  719. /// </summary>
  720. /// <param name="runModel"></param>
  721. /// <returns></returns>
  722. public bool SwitchPowerRunModel(byte runModel)
  723. {
  724. bool result= PowerSupplierDeviceConfigManager.Instance.SetPowerRunmodelControl(Module,_channel, runModel);
  725. _sendDateTime = DateTime.Now;
  726. _readCommandList.Enqueue(POWER_RUN_MODEL);
  727. return result;
  728. }
  729. /// <summary>
  730. /// 设置本地模式
  731. /// </summary>
  732. /// <param name="cmd"></param>
  733. /// <param name="args"></param>
  734. /// <returns></returns>
  735. private bool SetLocalOperation(string cmd, object[] args)
  736. {
  737. if (_status == RState.Running)
  738. {
  739. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is Busy");
  740. return false;
  741. }
  742. bool result= PowerSupplierDeviceConfigManager.Instance.SetChannelPowerControl(Module, _channel, 1);
  743. _sendDateTime = DateTime.Now;
  744. if (result)
  745. {
  746. LOG.WriteLog(eEvent.INFO_POWERSUPPLIER, Module, $"Power Control Switch Local Control Success");
  747. _readCommandList.Enqueue(POWER_CONTROL);
  748. return true;
  749. }
  750. else
  751. {
  752. return false;
  753. }
  754. }
  755. /// <summary>
  756. /// 设置远程模式
  757. /// </summary>
  758. /// <param name="cmd"></param>
  759. /// <param name="args"></param>
  760. /// <returns></returns>
  761. private bool SetRemoteOperation(string cmd, object[] args)
  762. {
  763. if (_status == RState.Running)
  764. {
  765. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is Busy");
  766. return false;
  767. }
  768. bool result= PowerSupplierDeviceConfigManager.Instance.SetChannelPowerControl(Module, _channel, 2);
  769. _sendDateTime = DateTime.Now;
  770. if (result)
  771. {
  772. LOG.WriteLog(eEvent.INFO_POWERSUPPLIER, Module, $"Power Control Switch Remote Control Success");
  773. _readCommandList.Enqueue(POWER_CONTROL);
  774. return true;
  775. }
  776. else
  777. {
  778. return false;
  779. }
  780. }
  781. /// <summary>
  782. /// 设置电流并设置输出
  783. /// </summary>
  784. /// <param name="cmd"></param>
  785. /// <param name="args"></param>
  786. /// <returns></returns>
  787. public bool SetCurrentAndOutput(double current)
  788. {
  789. if (_status == RState.Running)
  790. {
  791. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is Busy");
  792. return false;
  793. }
  794. if (PowerSupplierData == null)
  795. {
  796. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Data is null");
  797. return false;
  798. }
  799. if (PowerSupplierData.PowerControl == (short)PowerControlEnum.Local)
  800. {
  801. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is local control");
  802. return false;
  803. }
  804. bool result = _powerSupplierSetCurrentRoutine.Start(current) == RState.Running;
  805. if (result)
  806. {
  807. _status = RState.Running;
  808. _currentOperation = PowerSupplierOperation.SetCurrent;
  809. }
  810. return result;
  811. }
  812. /// <summary>
  813. /// 获取当前的routine
  814. /// </summary>
  815. /// <returns></returns>
  816. private IRoutine GetCurrentRoutine()
  817. {
  818. switch(_currentOperation)
  819. {
  820. case PowerSupplierOperation.StepOperation:
  821. return _powerSupplierStepRoutine;
  822. case PowerSupplierOperation.SetCurrent:
  823. return _powerSupplierSetCurrentRoutine;
  824. case PowerSupplierOperation.SetStartOperation:
  825. return _powerSupplierStartStepRoutine;
  826. default:
  827. return null;
  828. }
  829. }
  830. /// <summary>
  831. /// 设置CC电源状态
  832. /// </summary>
  833. private void SetPowerCCStatus()
  834. {
  835. _readCommandList.Enqueue(POWER_STATUS);
  836. _readCommandList.Enqueue(SET_POINT);
  837. _readCommandList.Enqueue(ENABLED);
  838. _readCommandList.Enqueue(POWER_CONTROL);
  839. _readCommandList.Enqueue(POWER_RUN_MODEL);
  840. _readCommandList.Enqueue(POWER_GRADE);
  841. }
  842. #endregion
  843. public void Monitor()
  844. {
  845. }
  846. public void Reset()
  847. {
  848. }
  849. public void Terminate()
  850. {
  851. DisableOutput();
  852. }
  853. }
  854. }