CellPowerSupplier.cs 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894
  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. if( PowerSupplierData.SetPoint > 0.02 && PowerSupplierData.PowerGrade == 0)
  530. {
  531. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, $"Power grade is low,Current setpoint{PowerSupplierData.SetPoint} large than 0.02A");
  532. return false;
  533. }
  534. if (PowerSupplierData.SetPoint > 0.6 && PowerSupplierData.PowerGrade == 1)
  535. {
  536. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, $"Power grade is middle,Current setpoint{PowerSupplierData.SetPoint} large than 0.6A");
  537. return false;
  538. }
  539. if (PowerSupplierData.SetPoint > 20 && PowerSupplierData.PowerGrade == 2)
  540. {
  541. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, $"Power grade high,Current setpoint{PowerSupplierData.SetPoint} large than 20A");
  542. return false;
  543. }
  544. bool result = PowerSupplierDeviceConfigManager.Instance.SetChannelOutputSwitchControl(Module, _channel, true);
  545. _sendDateTime = DateTime.Now;
  546. _readCommandList.Enqueue(ENABLED);
  547. _readCommandList.Enqueue(POWER_STATUS);
  548. return result;
  549. }
  550. /// <summary>
  551. /// SetPoint
  552. /// </summary>
  553. /// <param name="cmd"></param>
  554. /// <param name="args"></param>
  555. /// <returns></returns>
  556. public bool SetPointOperation(string cmd, object[] args)
  557. {
  558. if (_status == RState.Running)
  559. {
  560. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is Busy");
  561. return false;
  562. }
  563. if (PowerSupplierData == null)
  564. {
  565. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Data is null");
  566. return false;
  567. }
  568. if (PowerSupplierData.PowerControl == (short)PowerControlEnum.Local)
  569. {
  570. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is local control");
  571. return false;
  572. }
  573. if (args.Length<2)
  574. {
  575. return false;
  576. }
  577. if (double.TryParse(args[1].ToString(), out double value))
  578. {
  579. SetCurrent(value);
  580. }
  581. return true;
  582. }
  583. /// <summary>
  584. /// 设置电流
  585. /// </summary>
  586. /// <param name="current"></param>
  587. /// <returns></returns>
  588. public bool SetCurrent(double current)
  589. {
  590. PowerSupplierDeviceConfigManager.Instance.SetPowerRunmodelControl(Module, _channel, (byte)PowerRunModelEnum.Normal);
  591. int setPoint = (int)Math.Round(_currentSetScale * current, 0);
  592. bool result= PowerSupplierDeviceConfigManager.Instance.SetChannelCurrent(Module, _channel, setPoint);
  593. _sendDateTime = DateTime.Now;
  594. if (result)
  595. {
  596. LOG.WriteLog(eEvent.INFO_POWERSUPPLIER, Module, $"Current {current} Setting success");
  597. _readCommandList.Enqueue(SET_POINT);
  598. _readCommandList.Enqueue(POWER_RUN_MODEL);
  599. return true;
  600. }
  601. else
  602. {
  603. return false;
  604. }
  605. }
  606. /// <summary>
  607. /// 设置电源挡位
  608. /// </summary>
  609. /// <param name="cmd"></param>
  610. /// <param name="args"></param>
  611. /// <returns></returns>
  612. public bool SetPowerGrade(string cmd, object[] args)
  613. {
  614. if (_status == RState.Running)
  615. {
  616. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is Busy");
  617. return false;
  618. }
  619. if (PowerSupplierData == null)
  620. {
  621. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Data is null");
  622. return false;
  623. }
  624. if (PowerSupplierData.PowerControl == (short)PowerControlEnum.Local)
  625. {
  626. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is local control");
  627. return false;
  628. }
  629. byte grade = (byte)args[0];
  630. PowerSupplierDeviceConfigManager.Instance.SetPowerRunmodelControl(Module, _channel, (byte)PowerRunModelEnum.Normal);
  631. bool result = PowerSupplierDeviceConfigManager.Instance.SetPowerGrade(Module, _channel, grade);
  632. if (result) //挡位设置成功则默认当前是设置的挡位
  633. {
  634. PowerSupplierData.PowerGrade = grade;
  635. }
  636. return result;
  637. }
  638. /// <summary>
  639. /// 启动
  640. /// </summary>
  641. /// <param name="cmd"></param>
  642. /// <param name="args"></param>
  643. /// <returns></returns>
  644. private bool StartStepPeriod(string cmd, object[] args)
  645. {
  646. if (_status == RState.Running)
  647. {
  648. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is Busy");
  649. return false;
  650. }
  651. if (PowerSupplierData == null)
  652. {
  653. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Data is null");
  654. return false;
  655. }
  656. if (PowerSupplierData.PowerControl == (short)PowerControlEnum.Local)
  657. {
  658. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is local control");
  659. return false;
  660. }
  661. bool result= _powerSupplierStepRoutine.Start(args)==RState.Running;
  662. if(result)
  663. {
  664. _status = RState.Running;
  665. _currentOperation = PowerSupplierOperation.StepOperation;
  666. }
  667. return result;
  668. }
  669. /// <summary>
  670. /// 启动设置步阶,
  671. /// </summary>
  672. /// <param name="cmd"></param>
  673. /// <param name="args"></param>
  674. /// <returns></returns>
  675. public bool StartSetStepPeriodNoWaitEnd(List<PowerSupplierStepPeriodData> datas)
  676. {
  677. if (_status == RState.Running)
  678. {
  679. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is Busy");
  680. return false;
  681. }
  682. if (PowerSupplierData == null)
  683. {
  684. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Data is null");
  685. return false;
  686. }
  687. if (PowerSupplierData.PowerControl == (short)PowerControlEnum.Local)
  688. {
  689. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is local control");
  690. return false;
  691. }
  692. bool result = _powerSupplierStartStepRoutine.Start(datas) == RState.Running;
  693. if (result)
  694. {
  695. _status = RState.Running;
  696. _currentOperation = PowerSupplierOperation.SetStartOperation;
  697. }
  698. return result;
  699. }
  700. /// <summary>
  701. /// 设置步阶
  702. /// </summary>
  703. /// <param name="cmd"></param>
  704. /// <param name="args"></param>
  705. /// <returns></returns>
  706. public bool SetStepPeriod(string cmd, object[] args)
  707. {
  708. List<PowerSupplierStepPeriodData> powerSupplierStepPeriodDatas = (List<PowerSupplierStepPeriodData>)args[1];
  709. bool result=PowerSupplierDeviceConfigManager.Instance.SetStepPeriod(Module, _channel, powerSupplierStepPeriodDatas,_currentSetScale, _voltageUnitSetScale);
  710. _sendDateTime = DateTime.Now;
  711. if (result)
  712. {
  713. LOG.WriteLog(eEvent.INFO_POWERSUPPLIER, Module, $"Step Period Set Success");
  714. return true;
  715. }
  716. else
  717. {
  718. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, $"Step Period Set Fail");
  719. return false;
  720. }
  721. }
  722. /// <summary>
  723. /// 启动步阶
  724. /// </summary>
  725. /// <param name="endStep"></param>
  726. /// <param name="cycle"></param>
  727. /// <returns></returns>
  728. public bool StartStepPeriod(ushort endStep,ushort cycle)
  729. {
  730. bool result = PowerSupplierDeviceConfigManager.Instance.StartStepPeriod(Module, _channel, 1, endStep, cycle);
  731. _sendDateTime= DateTime.Now;
  732. return result;
  733. }
  734. /// <summary>
  735. /// 设置电源运行模式
  736. /// </summary>
  737. /// <param name="runModel"></param>
  738. /// <returns></returns>
  739. public bool SwitchPowerRunModel(byte runModel)
  740. {
  741. bool result= PowerSupplierDeviceConfigManager.Instance.SetPowerRunmodelControl(Module,_channel, runModel);
  742. _sendDateTime = DateTime.Now;
  743. _readCommandList.Enqueue(POWER_RUN_MODEL);
  744. return result;
  745. }
  746. /// <summary>
  747. /// 设置本地模式
  748. /// </summary>
  749. /// <param name="cmd"></param>
  750. /// <param name="args"></param>
  751. /// <returns></returns>
  752. private bool SetLocalOperation(string cmd, object[] args)
  753. {
  754. if (_status == RState.Running)
  755. {
  756. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is Busy");
  757. return false;
  758. }
  759. bool result= PowerSupplierDeviceConfigManager.Instance.SetChannelPowerControl(Module, _channel, 1);
  760. _sendDateTime = DateTime.Now;
  761. if (result)
  762. {
  763. LOG.WriteLog(eEvent.INFO_POWERSUPPLIER, Module, $"Power Control Switch Local Control Success");
  764. _readCommandList.Enqueue(POWER_CONTROL);
  765. return true;
  766. }
  767. else
  768. {
  769. return false;
  770. }
  771. }
  772. /// <summary>
  773. /// 设置远程模式
  774. /// </summary>
  775. /// <param name="cmd"></param>
  776. /// <param name="args"></param>
  777. /// <returns></returns>
  778. private bool SetRemoteOperation(string cmd, object[] args)
  779. {
  780. if (_status == RState.Running)
  781. {
  782. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is Busy");
  783. return false;
  784. }
  785. bool result= PowerSupplierDeviceConfigManager.Instance.SetChannelPowerControl(Module, _channel, 2);
  786. _sendDateTime = DateTime.Now;
  787. if (result)
  788. {
  789. LOG.WriteLog(eEvent.INFO_POWERSUPPLIER, Module, $"Power Control Switch Remote Control Success");
  790. _readCommandList.Enqueue(POWER_CONTROL);
  791. return true;
  792. }
  793. else
  794. {
  795. return false;
  796. }
  797. }
  798. /// <summary>
  799. /// 设置电流并设置输出
  800. /// </summary>
  801. /// <param name="cmd"></param>
  802. /// <param name="args"></param>
  803. /// <returns></returns>
  804. public bool SetCurrentAndOutput(double current)
  805. {
  806. if (_status == RState.Running)
  807. {
  808. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is Busy");
  809. return false;
  810. }
  811. if (PowerSupplierData == null)
  812. {
  813. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Data is null");
  814. return false;
  815. }
  816. if (PowerSupplierData.PowerControl == (short)PowerControlEnum.Local)
  817. {
  818. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is local control");
  819. return false;
  820. }
  821. bool result = _powerSupplierSetCurrentRoutine.Start(current) == RState.Running;
  822. if (result)
  823. {
  824. _status = RState.Running;
  825. _currentOperation = PowerSupplierOperation.SetCurrent;
  826. }
  827. return result;
  828. }
  829. /// <summary>
  830. /// 获取当前的routine
  831. /// </summary>
  832. /// <returns></returns>
  833. private IRoutine GetCurrentRoutine()
  834. {
  835. switch(_currentOperation)
  836. {
  837. case PowerSupplierOperation.StepOperation:
  838. return _powerSupplierStepRoutine;
  839. case PowerSupplierOperation.SetCurrent:
  840. return _powerSupplierSetCurrentRoutine;
  841. case PowerSupplierOperation.SetStartOperation:
  842. return _powerSupplierStartStepRoutine;
  843. default:
  844. return null;
  845. }
  846. }
  847. /// <summary>
  848. /// 设置CC电源状态
  849. /// </summary>
  850. private void SetPowerCCStatus()
  851. {
  852. _readCommandList.Enqueue(POWER_STATUS);
  853. _readCommandList.Enqueue(POWER_GRADE);
  854. _readCommandList.Enqueue(SET_POINT);
  855. _readCommandList.Enqueue(ENABLED);
  856. _readCommandList.Enqueue(POWER_CONTROL);
  857. _readCommandList.Enqueue(POWER_RUN_MODEL);
  858. }
  859. #endregion
  860. public void Monitor()
  861. {
  862. }
  863. public void Reset()
  864. {
  865. }
  866. public void Terminate()
  867. {
  868. DisableOutput();
  869. }
  870. }
  871. }