CellPowerSupplier.cs 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879
  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. if (result) //挡位设置成功则默认当前挡位
  618. {
  619. PowerSupplierData.PowerGrade = grade;
  620. }
  621. return result;
  622. }
  623. /// <summary>
  624. /// 启动
  625. /// </summary>
  626. /// <param name="cmd"></param>
  627. /// <param name="args"></param>
  628. /// <returns></returns>
  629. private bool StartStepPeriod(string cmd, object[] args)
  630. {
  631. if (_status == RState.Running)
  632. {
  633. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is Busy");
  634. return false;
  635. }
  636. if (PowerSupplierData == null)
  637. {
  638. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Data is null");
  639. return false;
  640. }
  641. if (PowerSupplierData.PowerControl == (short)PowerControlEnum.Local)
  642. {
  643. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is local control");
  644. return false;
  645. }
  646. bool result= _powerSupplierStepRoutine.Start(args)==RState.Running;
  647. if(result)
  648. {
  649. _status = RState.Running;
  650. _currentOperation = PowerSupplierOperation.StepOperation;
  651. }
  652. return result;
  653. }
  654. /// <summary>
  655. /// 启动设置步阶,
  656. /// </summary>
  657. /// <param name="cmd"></param>
  658. /// <param name="args"></param>
  659. /// <returns></returns>
  660. public bool StartSetStepPeriodNoWaitEnd(List<PowerSupplierStepPeriodData> datas)
  661. {
  662. if (_status == RState.Running)
  663. {
  664. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is Busy");
  665. return false;
  666. }
  667. if (PowerSupplierData == null)
  668. {
  669. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Data is null");
  670. return false;
  671. }
  672. if (PowerSupplierData.PowerControl == (short)PowerControlEnum.Local)
  673. {
  674. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is local control");
  675. return false;
  676. }
  677. bool result = _powerSupplierStartStepRoutine.Start(datas) == RState.Running;
  678. if (result)
  679. {
  680. _status = RState.Running;
  681. _currentOperation = PowerSupplierOperation.SetStartOperation;
  682. }
  683. return result;
  684. }
  685. /// <summary>
  686. /// 设置步阶
  687. /// </summary>
  688. /// <param name="cmd"></param>
  689. /// <param name="args"></param>
  690. /// <returns></returns>
  691. public bool SetStepPeriod(string cmd, object[] args)
  692. {
  693. List<PowerSupplierStepPeriodData> powerSupplierStepPeriodDatas = (List<PowerSupplierStepPeriodData>)args[1];
  694. bool result=PowerSupplierDeviceConfigManager.Instance.SetStepPeriod(Module, _channel, powerSupplierStepPeriodDatas,_currentSetScale, _voltageUnitSetScale);
  695. _sendDateTime = DateTime.Now;
  696. if (result)
  697. {
  698. LOG.WriteLog(eEvent.INFO_POWERSUPPLIER, Module, $"Step Period Set Success");
  699. return true;
  700. }
  701. else
  702. {
  703. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, $"Step Period Set Fail");
  704. return false;
  705. }
  706. }
  707. /// <summary>
  708. /// 启动步阶
  709. /// </summary>
  710. /// <param name="endStep"></param>
  711. /// <param name="cycle"></param>
  712. /// <returns></returns>
  713. public bool StartStepPeriod(ushort endStep,ushort cycle)
  714. {
  715. bool result = PowerSupplierDeviceConfigManager.Instance.StartStepPeriod(Module, _channel, 1, endStep, cycle);
  716. _sendDateTime= DateTime.Now;
  717. return result;
  718. }
  719. /// <summary>
  720. /// 设置电源运行模式
  721. /// </summary>
  722. /// <param name="runModel"></param>
  723. /// <returns></returns>
  724. public bool SwitchPowerRunModel(byte runModel)
  725. {
  726. bool result= PowerSupplierDeviceConfigManager.Instance.SetPowerRunmodelControl(Module,_channel, runModel);
  727. _sendDateTime = DateTime.Now;
  728. _readCommandList.Enqueue(POWER_RUN_MODEL);
  729. return result;
  730. }
  731. /// <summary>
  732. /// 设置本地模式
  733. /// </summary>
  734. /// <param name="cmd"></param>
  735. /// <param name="args"></param>
  736. /// <returns></returns>
  737. private bool SetLocalOperation(string cmd, object[] args)
  738. {
  739. if (_status == RState.Running)
  740. {
  741. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is Busy");
  742. return false;
  743. }
  744. bool result= PowerSupplierDeviceConfigManager.Instance.SetChannelPowerControl(Module, _channel, 1);
  745. _sendDateTime = DateTime.Now;
  746. if (result)
  747. {
  748. LOG.WriteLog(eEvent.INFO_POWERSUPPLIER, Module, $"Power Control Switch Local Control Success");
  749. _readCommandList.Enqueue(POWER_CONTROL);
  750. return true;
  751. }
  752. else
  753. {
  754. return false;
  755. }
  756. }
  757. /// <summary>
  758. /// 设置远程模式
  759. /// </summary>
  760. /// <param name="cmd"></param>
  761. /// <param name="args"></param>
  762. /// <returns></returns>
  763. private bool SetRemoteOperation(string cmd, object[] args)
  764. {
  765. if (_status == RState.Running)
  766. {
  767. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is Busy");
  768. return false;
  769. }
  770. bool result= PowerSupplierDeviceConfigManager.Instance.SetChannelPowerControl(Module, _channel, 2);
  771. _sendDateTime = DateTime.Now;
  772. if (result)
  773. {
  774. LOG.WriteLog(eEvent.INFO_POWERSUPPLIER, Module, $"Power Control Switch Remote Control Success");
  775. _readCommandList.Enqueue(POWER_CONTROL);
  776. return true;
  777. }
  778. else
  779. {
  780. return false;
  781. }
  782. }
  783. /// <summary>
  784. /// 设置电流并设置输出
  785. /// </summary>
  786. /// <param name="cmd"></param>
  787. /// <param name="args"></param>
  788. /// <returns></returns>
  789. public bool SetCurrentAndOutput(double current)
  790. {
  791. if (_status == RState.Running)
  792. {
  793. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is Busy");
  794. return false;
  795. }
  796. if (PowerSupplierData == null)
  797. {
  798. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Data is null");
  799. return false;
  800. }
  801. if (PowerSupplierData.PowerControl == (short)PowerControlEnum.Local)
  802. {
  803. LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, Module, "Power Supplier is local control");
  804. return false;
  805. }
  806. bool result = _powerSupplierSetCurrentRoutine.Start(current) == RState.Running;
  807. if (result)
  808. {
  809. _status = RState.Running;
  810. _currentOperation = PowerSupplierOperation.SetCurrent;
  811. }
  812. return result;
  813. }
  814. /// <summary>
  815. /// 获取当前的routine
  816. /// </summary>
  817. /// <returns></returns>
  818. private IRoutine GetCurrentRoutine()
  819. {
  820. switch(_currentOperation)
  821. {
  822. case PowerSupplierOperation.StepOperation:
  823. return _powerSupplierStepRoutine;
  824. case PowerSupplierOperation.SetCurrent:
  825. return _powerSupplierSetCurrentRoutine;
  826. case PowerSupplierOperation.SetStartOperation:
  827. return _powerSupplierStartStepRoutine;
  828. default:
  829. return null;
  830. }
  831. }
  832. /// <summary>
  833. /// 设置CC电源状态
  834. /// </summary>
  835. private void SetPowerCCStatus()
  836. {
  837. _readCommandList.Enqueue(POWER_STATUS);
  838. _readCommandList.Enqueue(POWER_GRADE);
  839. _readCommandList.Enqueue(SET_POINT);
  840. _readCommandList.Enqueue(ENABLED);
  841. _readCommandList.Enqueue(POWER_CONTROL);
  842. _readCommandList.Enqueue(POWER_RUN_MODEL);
  843. }
  844. #endregion
  845. public void Monitor()
  846. {
  847. }
  848. public void Reset()
  849. {
  850. }
  851. public void Terminate()
  852. {
  853. DisableOutput();
  854. }
  855. }
  856. }