CellPowerSupplier.cs 29 KB

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