ShakerControlViewModel.cs 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898
  1. using HandyControl.Interactivity;
  2. using HandyControl.Interactivity.Commands;
  3. using PLCControl;
  4. using Shaker.Model;
  5. using Shaker.ViewModel;
  6. using ShakerControl.ViewModel.DataManger;
  7. using ShakerControl.ViewModel.Warn;
  8. using System.Collections.ObjectModel;
  9. using System.Diagnostics.CodeAnalysis;
  10. using System.Windows.Input;
  11. namespace ShakerControl.ViewModel
  12. {
  13. internal class ShakerControlViewModel : ViewModelBase<ShakerControlModel>
  14. {
  15. private AllowRemoteControl allowRemote = AllowRemoteControl.Local;
  16. private EventBus.Properties Properties { get; init; } = new EventBus.Properties();
  17. private EventBus.IEventData<LogModel> EventHandle { get; init; }
  18. public void Close()
  19. {
  20. PLCControl?.Disconnect();
  21. }
  22. public void PublishLog(string message,Shaker.Model.LogType logType = LogType.Message)
  23. {
  24. EventHandle?.Publish(this, new LogModel()
  25. {
  26. ClientID = MainWindowViewModel.Default.ClientID,
  27. DateTime = DateTime.Now,
  28. Message = message,
  29. LogType = logType,
  30. ShakerID = Model.Id,
  31. UserID = MainWindowViewModel.Default.User.Model.Id,
  32. }, Properties);
  33. }
  34. public AllowRemoteControl AllowRemote
  35. {
  36. get => allowRemote;
  37. set
  38. {
  39. if (allowRemote != value)
  40. {
  41. UpdateProperty(ref allowRemote, value);
  42. if (!MainWindowViewModel.Default.MangerIsOnLine) return;
  43. MainWindowViewModel.Default.Bus.PubSub.PublishAsync(value, new Dictionary<string, string>()
  44. {
  45. {Shaker.Model.GlobalVariable.ShakerIDKey,Model.Id }
  46. });
  47. }
  48. }
  49. }
  50. public IO.IOPageViewModel IO { get; } = new IO.IOPageViewModel();
  51. public DataMangerViewModel DataManger { get; init; }
  52. public WarningViewModel Warning { get; init; }
  53. public Log.LogViewModel Log { get; init; }
  54. public ShakerControlViewModel(ShakerControlModel model)
  55. {
  56. for(int i=0;i<DataMangerItemModel.ANALOG_DATA_LENGTH;i++)
  57. {
  58. AnalogNames.Add("");
  59. Units.Add("");
  60. }
  61. EventHandle = GetEvent<LogModel>();
  62. Properties[Shaker.Model.GlobalVariable.ShakerIDKey] = model.Id;
  63. PLCControl = new PLCControl.ModBus.Control();
  64. PLCControl.IPAddress =model.IPAddress;
  65. PLCControl.Port = model.Port;
  66. PLCControl.SlaveID = model.SlaveID;
  67. PLCControl.ConnectionChanged = (sender) =>
  68. {
  69. OnPropertyChanged(nameof(IsConnected));
  70. if (MainWindowViewModel.Default.MangerIsOnLine)
  71. {
  72. MainWindowViewModel.Default.Bus.PubSub.PublishAsync<Shaker.Model.ShakerConnectState>(new ShakerConnectState()
  73. {
  74. IsConnected = sender,
  75. }, new Dictionary<string, string>()
  76. {
  77. {Shaker.Model.GlobalVariable.ShakerIDKey,model.Id }
  78. });
  79. }
  80. if(sender)
  81. {
  82. PublishLog("功放连接成功", LogType.Message);
  83. }
  84. else
  85. {
  86. PublishLog("功放连接已断开", LogType.Error);
  87. }
  88. };
  89. if(!MainWindowViewModel.Default.IsOffine) MainWindowViewModel.Default.Bus.PubSub.PublishAsync(AllowRemote, new Dictionary<string, string>()
  90. {
  91. {Shaker.Model.GlobalVariable.ShakerIDKey,model.Id }
  92. });
  93. PLCControl.Connect();
  94. if (!MainWindowViewModel.Default.IsOffine)
  95. {
  96. MainWindowViewModel.Default.Bus.RPC.Respond<Shaker.Model.SetGain, Shaker.Model.Result>((gain, properties) =>
  97. {
  98. if (properties.Contains(Shaker.Model.GlobalVariable.ShakerIDKey))
  99. {
  100. string shakerid = properties.GetString(GlobalVariable.ShakerIDKey);
  101. if (string.IsNullOrEmpty(shakerid))
  102. {
  103. SystemLog.Default.WriteLog("远程控制功放时需必须指定振动台", LogType.Warn);
  104. return (new Result()
  105. {
  106. Message = "必须指定振动台",
  107. Success = false,
  108. });
  109. }
  110. else
  111. {
  112. if (AllowRemote == AllowRemoteControl.Local)
  113. {
  114. SystemLog.Default.WriteLog("当前振动台为本地控制", LogType.Message);
  115. return (new Result()
  116. {
  117. Message = "当前振动台为本地控制",
  118. Success = false,
  119. });
  120. }
  121. else
  122. {
  123. if (PowerAmplifier == null)
  124. {
  125. SystemLog.Default.WriteLog("当前振动台不支持增益控制", LogType.Message);
  126. return (new Result()
  127. {
  128. Message = "当前振动台不支持增益控制",
  129. Success = false,
  130. });
  131. }
  132. if (!GainEnabled)
  133. {
  134. SystemLog.Default.WriteLog("增益开关未打开", LogType.Message);
  135. return (new Result()
  136. {
  137. Message = "增益开关未打开",
  138. Success = false,
  139. });
  140. }
  141. if (gain.Gain > PowerAmplifier.MaxGain || gain.Gain < PowerAmplifier.MinGain)
  142. {
  143. SystemLog.Default.WriteLog($"超过设定范围,当前设定值为{gain.Gain},允许值范围为{PowerAmplifier.MinGain}~{PowerAmplifier.MaxGain}", LogType.Message);
  144. return (new Result()
  145. {
  146. Message = $"超过设定范围,当前设定值为{gain.Gain},允许值范围为{PowerAmplifier.MinGain}~{PowerAmplifier.MaxGain}",
  147. Success = false,
  148. });
  149. }
  150. PowerAmplifier?.SetGain(gain.Gain);
  151. return (new Result()
  152. {
  153. Success = true,
  154. });
  155. }
  156. }
  157. }
  158. else
  159. {
  160. SystemLog.Default.WriteLog("远程控制功放时需必须指定振动台", LogType.Warn);
  161. return (new Result()
  162. {
  163. Message = "必须指定振动台",
  164. Success = false,
  165. });
  166. }
  167. }, $"{Shaker.Model.GlobalVariable.ShakerIDKey} = '{model.Id}'");
  168. MainWindowViewModel.Default.Bus.PubSub.Subscribe<Shaker.Model.ShakerControlModel>((model, _) =>
  169. {
  170. PublishLog($"振动台{Description}的参数已修改");
  171. Tools.DispatherInovke.Inovke(() =>
  172. {
  173. PromptViewModel.Default.Init();
  174. PromptViewModel.Default.NoTextFunc = (index) => $"否({10 - index})";
  175. PromptViewModel.Default.Message = $"振动台{Description}的参数已修改,是否重启程序?";
  176. PromptViewModel.Default.YesAction = () =>
  177. {
  178. (App.Current as App)?.Restart();
  179. };
  180. PromptViewModel.Default.SetTimeout(10);
  181. PromptViewModel.Default.IsOpen = true;
  182. });
  183. }, $"{Shaker.Model.GlobalVariable.ShakerIDKey} = '{model.Id}'");
  184. MainWindowViewModel.Default.Bus.RPC.Respond<Shaker.Model.SysControl, Shaker.Model.Result>(SystemControl, $"{Shaker.Model.GlobalVariable.ShakerIDKey} = '{model.Id}'");
  185. MainWindowViewModel.Default.Bus.PubSub.Subscribe<SysControl>((control, properties) =>
  186. {
  187. if (control == null) return;
  188. switch(control.Cmd)
  189. {
  190. case SysCmd.Start:
  191. if (!StartEnabled) return;
  192. PowerAmplifier?.StartCommand?.Execute(null);
  193. break;
  194. case SysCmd.Stop:
  195. if (!StopEnabled) return;
  196. PowerAmplifier?.StopCommand?.Execute(null);
  197. break;
  198. case SysCmd.Reset:
  199. if (!ResetEnabled) return;
  200. PowerAmplifier?.ResetCommand?.Execute(null);
  201. break;
  202. case SysCmd.CloseGain:
  203. if (!GainSwitchEnabled || PowerAmplifier ==null) return;
  204. PowerAmplifier.GainSwitchControl(false);
  205. break;
  206. case SysCmd.OpenGain:
  207. if (!GainSwitchEnabled || PowerAmplifier ==null) return;
  208. PowerAmplifier.GainSwitchControl(true);
  209. break;
  210. case SysCmd.CoolingWaterReset:
  211. if (!CoolingWaterResetEnabled || !AllowCoolingWater) return;
  212. CoolingWater?.ResetCommand?.Execute(null);
  213. break;
  214. case SysCmd.CoolingWaterStart:
  215. if (!CoolingWaterStartEnabled || !AllowCoolingWater) return;
  216. CoolingWater?.StartCommand?.Execute(null);
  217. break;
  218. case SysCmd.CoolingWaterStop:
  219. if (!CoolingWaterStopEnabled || !AllowCoolingWater) return;
  220. CoolingWater?.StopCommand?.Execute(null);
  221. break;
  222. }
  223. }, $"{Shaker.Model.GlobalVariable.ShakerIDKey} = '{model.Id}'");
  224. MainWindowViewModel.Default.Bus.PubSub.Subscribe<SetGain>((control, _) =>
  225. {
  226. if (control == null || PowerAmplifier ==null || GainEnabled) return;
  227. PowerAmplifier.SetGain(control.Gain);
  228. }, $"{Shaker.Model.GlobalVariable.ShakerIDKey} = '{model.Id}'");
  229. }
  230. Warning = new WarningViewModel(this);
  231. GetEvent(MainWindowViewModel.GET_DATA_EVENT).Subscrip((_, _) =>
  232. {
  233. if (!IsConnected) return;
  234. ReadPlcValue();
  235. DataManger?.AddData(new short[Shaker.Model.DataMangerItemModel.ANALOG_DATA_LENGTH]
  236. {
  237. Model.OperatingStatus.Value,
  238. Model.OutputCurrent.Value,
  239. Model.OutputVoltage.Value,
  240. Model.ExcitationCurrent.Value,
  241. Model.ExcitationVoltage.Value,
  242. Model.ThreePhaseVoltage.Value,
  243. Model.AbutmentTemperature0.Value,
  244. Model.AbutmentTemperature1.Value,
  245. Model.DCVoltage1.Value,
  246. Model.DCVoltage2.Value,
  247. Model.DCVoltage3.Value,
  248. Model.DCVoltage4.Value,
  249. Model.ExternalCirculatingWaterPressure.Value,
  250. Model.ExcitationWaterSupplyFlow.Value,
  251. Model.ExcitationWaterSupplyTemperature.Value,
  252. Model.MovingCoilWaterSupplyPressure.Value,
  253. Model.MovingCoilWaterSupplyFlow.Value,
  254. Model.MovingCoilWaterSupplyTemperature.Value,
  255. Model.ExcitationWaterSupplyPressure.Value,
  256. Model.ExcitationWaterSupplyFlow.Value,
  257. Model.ExcitationWaterSupplyTemperature.Value,
  258. Model.CoolingWaterOperatingStatus.Value,
  259. }, PowerAmplifier?.Gain ?? 0);
  260. if (MainWindowViewModel.Default.IsOffine) return;
  261. if(MainWindowViewModel.Default.MangerIsOnLine)
  262. {
  263. MainWindowViewModel.Default.Bus.PubSub.PublishAsync<Shaker.Model.ShakerStatusModel>(new ShakerStatusModel()
  264. {
  265. GainSwich = PowerAmplifier?.GainSwitch ??false,
  266. Values = ShakerDigitalGroup?.Model?.Values ?? new byte[4],
  267. Values1 = ShakerDigitalGroup1?.Model?.Values ?? new byte[4],
  268. },new Dictionary<string, string>()
  269. { {Shaker.Model.GlobalVariable.ShakerIDKey,model.Id } });
  270. }
  271. });
  272. ShakerAnlogs.Add(new ShakerAnlogViewModel(this, model.OutputCurrent));
  273. ShakerAnlogs.Add(new ShakerAnlogViewModel(this, model.OutputVoltage));
  274. ShakerAnlogs.Add(new ShakerAnlogViewModel(this, model.ExcitationCurrent));
  275. ShakerAnlogs.Add(new ShakerAnlogViewModel(this, model.ExcitationVoltage));
  276. ShakerAnlogs.Add(new ShakerAnlogViewModel(this, model.ThreePhaseVoltage));
  277. AnalogNames[0] = Model.OperatingStatus.Name;
  278. AnalogNames[1] = Model.OutputCurrent.Name;
  279. AnalogNames[2] = Model.OutputVoltage.Name;
  280. AnalogNames[3] = Model.ExcitationCurrent.Name;
  281. AnalogNames[4] = Model.ExcitationVoltage.Name;
  282. AnalogNames[5] = Model.ThreePhaseVoltage.Name;
  283. Units[0] = Model.OperatingStatus.Unit;
  284. Units[1] = Model.OutputCurrent.Unit;
  285. Units[2] = Model.OutputVoltage.Unit;
  286. Units[3] = Model.ExcitationCurrent.Unit;
  287. Units[4] = Model.ExcitationVoltage.Unit;
  288. Units[5] = Model.ThreePhaseVoltage.Unit;
  289. if (!string.IsNullOrEmpty(model.AbutmentTemperature0.Name))
  290. {
  291. AnalogNames[6] = Model.AbutmentTemperature0.Name;
  292. Units[6] = Model.AbutmentTemperature0.Unit;
  293. ShakerAnlogs.Add(new ShakerAnlogViewModel(this, model.AbutmentTemperature0));
  294. }
  295. if (!string.IsNullOrEmpty(model.AbutmentTemperature1.Name))
  296. {
  297. AnalogNames[7] = Model.AbutmentTemperature1.Name;
  298. Units[7] = Model.AbutmentTemperature1.Unit;
  299. ShakerAnlogs.Add(new ShakerAnlogViewModel(this, model.AbutmentTemperature1));
  300. }
  301. if (!string.IsNullOrEmpty(model.DCVoltage1.Name))
  302. {
  303. AnalogNames[8] = Model.DCVoltage1.Name;
  304. Units[8] = Model.DCVoltage1.Unit;
  305. ShakerAnlogs.Add(new ShakerAnlogViewModel(this, model.DCVoltage1));
  306. }
  307. if (!string.IsNullOrEmpty(model.DCVoltage2.Name))
  308. {
  309. AnalogNames[9] = Model.DCVoltage2.Name;
  310. Units[9] = Model.DCVoltage2.Unit;
  311. ShakerAnlogs.Add(new ShakerAnlogViewModel(this, model.DCVoltage2));
  312. }
  313. if (!string.IsNullOrEmpty(model.DCVoltage3.Name))
  314. {
  315. AnalogNames[10] = Model.DCVoltage3.Name;
  316. Units[10] = Model.DCVoltage3.Unit;
  317. ShakerAnlogs.Add(new ShakerAnlogViewModel(this, model.DCVoltage3));
  318. }
  319. if (!string.IsNullOrEmpty(model.DCVoltage4.Name))
  320. {
  321. AnalogNames[11] = Model.DCVoltage4.Name;
  322. Units[11] = Model.DCVoltage4.Unit;
  323. ShakerAnlogs.Add(new ShakerAnlogViewModel(this, model.DCVoltage4));
  324. }
  325. AnalogNames[12] = Model.ExternalCirculatingWaterPressure.Name;
  326. Units[12] = Model.ExternalCirculatingWaterPressure.Unit;
  327. CoolingWaters.Add(new ShakerAnlogViewModel(this, model.ExternalCirculatingWaterPressure));
  328. AnalogNames[13] = Model.ExternalCirculatingWaterFlow.Name;
  329. Units[13] = Model.ExternalCirculatingWaterFlow.Unit;
  330. CoolingWaters.Add(new ShakerAnlogViewModel(this, model.ExternalCirculatingWaterFlow));
  331. AnalogNames[14] = Model.ExternalCirculatingWaterTemperature.Name;
  332. Units[14] = Model.ExternalCirculatingWaterTemperature.Unit;
  333. CoolingWaters.Add(new ShakerAnlogViewModel(this, model.ExternalCirculatingWaterTemperature));
  334. AnalogNames[15] = Model.MovingCoilWaterSupplyPressure.Name;
  335. Units[15] = Model.MovingCoilWaterSupplyPressure.Unit;
  336. CoolingWaters.Add(new ShakerAnlogViewModel(this, model.MovingCoilWaterSupplyPressure));
  337. AnalogNames[16] = Model.MovingCoilWaterSupplyFlow.Name;
  338. Units[16] = Model.MovingCoilWaterSupplyFlow.Unit;
  339. CoolingWaters.Add(new ShakerAnlogViewModel(this, model.MovingCoilWaterSupplyFlow));
  340. AnalogNames[17] = Model.MovingCoilWaterSupplyTemperature.Name;
  341. Units[17] = Model.MovingCoilWaterSupplyTemperature.Unit;
  342. CoolingWaters.Add(new ShakerAnlogViewModel(this, model.MovingCoilWaterSupplyTemperature));
  343. AnalogNames[18] = Model.ExcitationWaterSupplyPressure.Name;
  344. Units[18] = Model.ExcitationWaterSupplyPressure.Unit;
  345. CoolingWaters.Add(new ShakerAnlogViewModel(this, model.ExcitationWaterSupplyPressure));
  346. AnalogNames[19] = Model.ExcitationWaterSupplyFlow.Name;
  347. Units[19] = Model.ExcitationWaterSupplyFlow.Unit;
  348. CoolingWaters.Add(new ShakerAnlogViewModel(this, model.ExcitationWaterSupplyFlow));
  349. AnalogNames[20] = Model.ExcitationWaterSupplyTemperature.Name;
  350. Units[20] = Model.ExcitationWaterSupplyTemperature.Unit;
  351. CoolingWaters.Add(new ShakerAnlogViewModel(this, model.ExcitationWaterSupplyTemperature));
  352. AnalogNames[21] = Model.CoolingWaterOperatingStatus.Name;
  353. Units[21] = Model.CoolingWaterOperatingStatus.Unit;
  354. ShakerDigitalGroup = new ShakerDigitalGroupViewModel(this);
  355. ShakerDigitalGroup.UpDateModel(model.DigitalGroup);
  356. CoolingWater = new CoolingWaterViewModel(this);
  357. PowerAmplifier = new PowerAmplifierViewModel(this);
  358. PowerAmplifier.PropertyChanged += (sender, args) =>
  359. {
  360. if (args.PropertyName == nameof(PowerAmplifierViewModel.GainSwitch))
  361. {
  362. OnPropertyChanged(nameof(GainEnabled));
  363. }
  364. };
  365. ShakerDigitalGroup1 = new ShakerDigitalGroupViewModel(this);
  366. ShakerDigitalGroup1.UpDateModel(model.DigitalGroup1);
  367. CoolingWaterGroup = new ShakerDigitalGroupViewModel(this);
  368. CoolingWaterGroup.UpDateModel(model.CoolingWaterDigitalGroup);
  369. DataManger = new DataMangerViewModel(AnalogNames.ToArray(),Units.ToArray());
  370. DataManger.ShakerID = model.Id;
  371. Log = new Log.LogViewModel(model.Id);
  372. UpDateModel(model);
  373. if (!MainWindowViewModel.Default.IsOffine)
  374. {
  375. MainWindowViewModel.Default.Bus.PubSub.PublishAsync<Shaker.Model.ClientExitModel>(new ClientExitModel()
  376. {
  377. Online = true,
  378. }, new Dictionary<string, string>()
  379. {
  380. {Shaker.Model.GlobalVariable.ShakerIDKey,model.Id }
  381. });
  382. }
  383. }
  384. public bool AllowCoolingWater => Model.AllowCoolingWater;
  385. private Result SystemControl(Shaker.Model.SysControl gain, Apache.NMS.IPrimitiveMap properties)
  386. {
  387. if (properties.Contains(Shaker.Model.GlobalVariable.ShakerIDKey))
  388. {
  389. string shakerid = properties.GetString(GlobalVariable.ShakerIDKey);
  390. if (string.IsNullOrEmpty(shakerid))
  391. {
  392. SystemLog.Default.WriteLog("远程控制功放时需必须指定振动台", LogType.Warn);
  393. return (new Result()
  394. {
  395. Message = "必须指定振动台",
  396. Success = false,
  397. });
  398. }
  399. else
  400. {
  401. if (AllowRemote == AllowRemoteControl.Local && gain.Cmd != SysCmd.ApplicationControl)
  402. {
  403. SystemLog.Default.WriteLog("当前振动台为本地控制", LogType.Message);
  404. return (new Result()
  405. {
  406. Message = "当前振动台为本地控制",
  407. Success = false,
  408. });
  409. }
  410. else
  411. {
  412. switch (gain.Cmd)
  413. {
  414. case SysCmd.Start:
  415. if (PowerAmplifier == null)
  416. {
  417. SystemLog.Default.WriteLog("当前振动台不支持功放控制", LogType.Message);
  418. return (new Result()
  419. {
  420. Message = "当前振动台不支持功放控制",
  421. Success = false,
  422. });
  423. }
  424. if (StartEnabled)
  425. {
  426. PowerAmplifier.StartCommand?.Execute(null);
  427. }
  428. else
  429. {
  430. SystemLog.Default.WriteLog("当前状态无法启动功放", LogType.Message);
  431. return (new Result()
  432. {
  433. Message = "当前状态无法启动功放",
  434. Success = false,
  435. });
  436. }
  437. break;
  438. case SysCmd.Stop:
  439. if (PowerAmplifier == null)
  440. {
  441. SystemLog.Default.WriteLog("当前振动台不支持功放控制", LogType.Message);
  442. return (new Result()
  443. {
  444. Message = "当前振动台不支持功放控制",
  445. Success = false,
  446. });
  447. }
  448. if (StopEnabled)
  449. {
  450. PowerAmplifier.StopCommand?.Execute(null);
  451. }
  452. else
  453. {
  454. SystemLog.Default.WriteLog("当前状态无法停止功放", LogType.Message);
  455. return (new Result()
  456. {
  457. Message = "当前状态无法停止功放",
  458. Success = false,
  459. });
  460. }
  461. break;
  462. case SysCmd.Reset:
  463. if (PowerAmplifier == null)
  464. {
  465. SystemLog.Default.WriteLog("当前振动台不支持功放控制", LogType.Message);
  466. return (new Result()
  467. {
  468. Message = "当前振动台不支持功放控制",
  469. Success = false,
  470. });
  471. }
  472. if (ResetEnabled)
  473. {
  474. PowerAmplifier.ResetCommand?.Execute(null);
  475. }
  476. else
  477. {
  478. SystemLog.Default.WriteLog("当前状态无法复位功放", LogType.Message);
  479. return (new Result()
  480. {
  481. Message = "当前状态无法复位功放",
  482. Success = false,
  483. });
  484. }
  485. break;
  486. case SysCmd.CoolingWaterReset:
  487. if(!AllowCoolingWater)
  488. {
  489. SystemLog.Default.WriteLog("当前振动台不支持冷却水控制", LogType.Message);
  490. return (new Result()
  491. {
  492. Message = "当前振动台不支持冷却水控制",
  493. Success = false,
  494. });
  495. }
  496. if (CoolingWater == null)
  497. {
  498. SystemLog.Default.WriteLog("当前振动台不支持冷却水控制", LogType.Message);
  499. return (new Result()
  500. {
  501. Message = "当前振动台不支持冷却水控制",
  502. Success = false,
  503. });
  504. }
  505. if (CoolingWaterResetEnabled)
  506. {
  507. CoolingWater.ResetCommand?.Execute(null);
  508. }
  509. else
  510. {
  511. SystemLog.Default.WriteLog("当前状态无法复位冷却水", LogType.Message);
  512. return (new Result()
  513. {
  514. Message = "当前状态无法复位冷却水",
  515. Success = false,
  516. });
  517. }
  518. break;
  519. case SysCmd.CoolingWaterStart:
  520. if (!AllowCoolingWater)
  521. {
  522. SystemLog.Default.WriteLog("当前振动台不支持冷却水控制", LogType.Message);
  523. return (new Result()
  524. {
  525. Message = "当前振动台不支持冷却水控制",
  526. Success = false,
  527. });
  528. }
  529. if (CoolingWater == null)
  530. {
  531. SystemLog.Default.WriteLog("当前振动台不支持冷却水控制", LogType.Message);
  532. return (new Result()
  533. {
  534. Message = "当前振动台不支持冷却水控制",
  535. Success = false,
  536. });
  537. }
  538. if (CoolingWaterStartEnabled)
  539. {
  540. CoolingWater.StartCommand?.Execute(null);
  541. }
  542. else
  543. {
  544. SystemLog.Default.WriteLog("当前状态无法启动冷却水", LogType.Message);
  545. return (new Result()
  546. {
  547. Message = "当前状态无法启动冷却水",
  548. Success = false,
  549. });
  550. }
  551. break;
  552. case SysCmd.CoolingWaterStop:
  553. if (!AllowCoolingWater)
  554. {
  555. SystemLog.Default.WriteLog("当前振动台不支持冷却水控制", LogType.Message);
  556. return (new Result()
  557. {
  558. Message = "当前振动台不支持冷却水控制",
  559. Success = false,
  560. });
  561. }
  562. if (CoolingWater == null)
  563. {
  564. SystemLog.Default.WriteLog("当前振动台不支持冷却水控制", LogType.Message);
  565. return (new Result()
  566. {
  567. Message = "当前振动台不支持冷却水控制",
  568. Success = false,
  569. });
  570. }
  571. if (CoolingWaterStopEnabled)
  572. {
  573. CoolingWater.StopCommand?.Execute(null);
  574. }
  575. else
  576. {
  577. SystemLog.Default.WriteLog("当前状态无法停止冷却水", LogType.Message);
  578. return (new Result()
  579. {
  580. Message = "当前状态无法停止冷却水",
  581. Success = false,
  582. });
  583. }
  584. break;
  585. case SysCmd.CloseGain:
  586. if (PowerAmplifier == null)
  587. {
  588. SystemLog.Default.WriteLog("当前振动台不支持功放控制", LogType.Message);
  589. return (new Result()
  590. {
  591. Message = "当前振动台不支持功放控制",
  592. Success = false,
  593. });
  594. }
  595. if (GainSwitchEnabled)
  596. {
  597. PowerAmplifier?.GainSwitchControl(false);
  598. }
  599. else
  600. {
  601. SystemLog.Default.WriteLog("当前状态无法关闭增益输出", LogType.Message);
  602. return (new Result()
  603. {
  604. Message = "当前状态无法关闭增益输出",
  605. Success = false,
  606. });
  607. }
  608. break;
  609. case SysCmd.OpenGain:
  610. if (PowerAmplifier == null)
  611. {
  612. SystemLog.Default.WriteLog("当前振动台不支持功放控制", LogType.Message);
  613. return (new Result()
  614. {
  615. Message = "当前振动台不支持功放控制",
  616. Success = false,
  617. });
  618. }
  619. if (GainSwitchEnabled)
  620. {
  621. PowerAmplifier?.GainSwitchControl(true);
  622. }
  623. else
  624. {
  625. SystemLog.Default.WriteLog("当前状态无法打开增益输出", LogType.Message);
  626. return (new Result()
  627. {
  628. Message = "当前状态无法打开增益输出",
  629. Success = false,
  630. });
  631. }
  632. break;
  633. case SysCmd.ApplicationControl:
  634. {
  635. if(!MainWindowViewModel.Default.IsLoggedIn)
  636. {
  637. return new Result()
  638. {
  639. Success = false,
  640. Message = "用户未登录",
  641. };
  642. }
  643. if (AllowRemote == AllowRemoteControl.Remote) return new Result()
  644. {
  645. Success = true,
  646. };
  647. Tools.DispatherInovke.Inovke(() =>
  648. {
  649. PromptViewModel.Default.Init();
  650. PromptViewModel.Default.Message = $"申请{Model.Description}的控制权限,是否同意?";
  651. PromptViewModel.Default.YesAction = () =>
  652. {
  653. AllowRemote = AllowRemoteControl.Remote;
  654. };
  655. uint count = MainWindowViewModel.Default.SystemConfig.RequestPermissionsTimeout / 1000;
  656. PromptViewModel.Default.NoTextFunc = (index) => $"否({count - index})";
  657. PromptViewModel.Default.SetTimeout(count);
  658. PromptViewModel.Default.IsOpen = true;
  659. });
  660. return new Result()
  661. {
  662. Success = true,
  663. };
  664. }
  665. case SysCmd.Connect:
  666. if (PLCControl.IsConnected)
  667. {
  668. return new Result()
  669. {
  670. Success = false,
  671. Message = "当前已连接",
  672. };
  673. }
  674. else
  675. {
  676. try
  677. {
  678. var result = PLCControl.Connect();
  679. if (result)
  680. {
  681. return new Result()
  682. {
  683. Success = true,
  684. };
  685. }
  686. else
  687. {
  688. return new Result()
  689. {
  690. Success = false,
  691. Message = "连接失败",
  692. };
  693. }
  694. }
  695. catch (Exception ex)
  696. {
  697. return new Result()
  698. {
  699. Success = false,
  700. Message = "连接失败," + ex.Message,
  701. };
  702. }
  703. }
  704. case SysCmd.DisConnect:
  705. if (PLCControl.IsConnected)
  706. {
  707. PLCControl.Disconnect();
  708. return new Result()
  709. {
  710. Success = true,
  711. };
  712. }
  713. else
  714. {
  715. return new Result()
  716. {
  717. Success = false,
  718. Message = "当前没有连接",
  719. };
  720. }
  721. default:
  722. {
  723. SystemLog.Default.WriteLog("不支持的指令", LogType.Message);
  724. return (new Result()
  725. {
  726. Success = false,
  727. Message = "不支持的指令",
  728. });
  729. }
  730. }
  731. return (new Result()
  732. {
  733. Success = true,
  734. });
  735. }
  736. }
  737. }
  738. else
  739. {
  740. SystemLog.Default.WriteLog("远程控制功放时需必须指定振动台", LogType.Warn);
  741. return (new Result()
  742. {
  743. Message = "必须指定振动台",
  744. Success = false,
  745. });
  746. }
  747. }
  748. public bool ResetEnabled => OperatingStatus != OperatingStatus.Run;
  749. public bool StartEnabled => OperatingStatus == OperatingStatus.Wait;
  750. public bool StopEnabled => OperatingStatus == OperatingStatus.Run;
  751. public bool GainSwitchEnabled => OperatingStatus == OperatingStatus.Run;
  752. public bool GainEnabled => (PowerAmplifier?.GainSwitch ?? false)&& OperatingStatus == OperatingStatus.Run;
  753. public ObservableCollection<string> AnalogNames { get; } = new ObservableCollection<string>();
  754. public ObservableCollection<string> Units { get; } = new ObservableCollection<string>();
  755. public CoolingWaterOperatingStatus CoolingWaterOperatingStatus
  756. {
  757. get => (CoolingWaterOperatingStatus)Model.CoolingWaterOperatingStatus.Value;
  758. set
  759. {
  760. var temp = Model.CoolingWaterOperatingStatus.Value;
  761. if(temp!=(short)value)
  762. {
  763. UpdateProperty(ref Model.CoolingWaterOperatingStatus.Value, (short)value);
  764. OnPropertyChanged(nameof(CoolingWaterResetEnabled));
  765. OnPropertyChanged(nameof(CoolingWaterStartEnabled));
  766. OnPropertyChanged(nameof(CoolingWaterStopEnabled));
  767. }
  768. }
  769. }
  770. public OperatingStatus OperatingStatus
  771. {
  772. get => (OperatingStatus)Model.OperatingStatus.Value;
  773. private set
  774. {
  775. var temp = Model.OperatingStatus.Value;
  776. if (temp != (short)value)
  777. {
  778. UpdateProperty(ref Model.OperatingStatus.Value, (short)value);
  779. OnPropertyChanged(nameof(ResetEnabled));
  780. OnPropertyChanged(nameof(StartEnabled));
  781. OnPropertyChanged(nameof(StopEnabled));
  782. OnPropertyChanged(nameof(GainSwitchEnabled));
  783. OnPropertyChanged(nameof(GainEnabled));
  784. }
  785. }
  786. }
  787. public bool CoolingWaterResetEnabled => CoolingWaterOperatingStatus != CoolingWaterOperatingStatus.Run;
  788. public bool CoolingWaterStartEnabled => CoolingWaterOperatingStatus == CoolingWaterOperatingStatus.Wait;
  789. public bool CoolingWaterStopEnabled => CoolingWaterOperatingStatus == CoolingWaterOperatingStatus.Run;
  790. public void Exit()
  791. {
  792. if (!MainWindowViewModel.Default.MangerIsOnLine) return;
  793. MainWindowViewModel.Default.Bus.PubSub.PublishAsync<Shaker.Model.ClientExitModel>(new ClientExitModel()
  794. {
  795. Online = false,
  796. }, new Dictionary<string, string>()
  797. {
  798. {Shaker.Model.GlobalVariable.ShakerIDKey,Model.Id }
  799. });
  800. Disconnect();
  801. }
  802. public void Connect() => PLCControl.Connect();
  803. public void Disconnect() => PLCControl.Disconnect();
  804. public string ClientID => Model.ClientID;
  805. public string ShakerName => Model.Name;
  806. [AllowNull]
  807. internal IPLCControl PLCControl { get; private set; }
  808. public string Description { get => Model.Description; set => UpdateProperty(ref Model.Description, value); }
  809. public string IPAddress { get => Model.IPAddress; }
  810. public int Port { get => Model.Port; }
  811. public byte SlaveID => Model.SlaveID;
  812. public bool IsConnected => PLCControl != null && PLCControl.IsConnected;
  813. public ObservableCollection<ShakerAnlogViewModel> CoolingWaters { get; } = new ObservableCollection<ShakerAnlogViewModel>();
  814. public ObservableCollection<ShakerAnlogViewModel> ShakerAnlogs { get; } = new ObservableCollection<ShakerAnlogViewModel>();
  815. public ShakerDigitalGroupViewModel ShakerDigitalGroup { get; }
  816. public ShakerDigitalGroupViewModel ShakerDigitalGroup1 { get; }
  817. public ShakerDigitalGroupViewModel CoolingWaterGroup { get; }
  818. public PowerAmplifierViewModel PowerAmplifier { get; }
  819. public CoolingWaterViewModel CoolingWater { get; }
  820. public void ReadPlcValue()
  821. {
  822. if (!PLCControl.IsConnected) return;
  823. OperatingStatus = (OperatingStatus)PLCControl.ReadInt16(Model.OperatingStatus.Address);
  824. if(AllowCoolingWater) CoolingWaterOperatingStatus = (CoolingWaterOperatingStatus)PLCControl.ReadInt16(Model.CoolingWaterOperatingStatus.Address);
  825. foreach (var item in ShakerAnlogs)
  826. {
  827. item.ReadPlcValue();
  828. }
  829. if(AllowCoolingWater)
  830. {
  831. foreach(var item in CoolingWaters)
  832. {
  833. item.ReadPlcValue();
  834. }
  835. }
  836. ShakerDigitalGroup.ReadPlcValue();
  837. ShakerDigitalGroup1.ReadPlcValue();
  838. if(AllowCoolingWater) CoolingWaterGroup.ReadPlcValue();
  839. PowerAmplifier.ReadPlcValue();
  840. CoolingWater.ReadPlcValue();
  841. }
  842. public ICommand ConnectCommand => new DelegateCommand(() =>
  843. {
  844. if (PLCControl.IsConnected) return;
  845. if (!PLCControl.Connect())
  846. {
  847. PromptViewModel.Default.Init();
  848. PromptViewModel.Default.IconType = IconType.Error;
  849. PromptViewModel.Default.NoVisibility = System.Windows.Visibility.Collapsed;
  850. PromptViewModel.Default.Message = "连接失败!";
  851. PromptViewModel.Default.IsOpen = true;
  852. }
  853. else
  854. {
  855. }
  856. });
  857. public ICommand DisConnectCommand => new DelegateCommand(() =>
  858. {
  859. PromptViewModel.Default.Init();
  860. PromptViewModel.Default.IconType = IconType.Ask;
  861. PromptViewModel.Default.Message = "是否断开连接?";
  862. PromptViewModel.Default.YesAction = () =>
  863. {
  864. if (!PLCControl.IsConnected) return;
  865. PublishLog("断开功放连接", LogType.Message);
  866. PLCControl.Disconnect();
  867. };
  868. PromptViewModel.Default.IsOpen = true;
  869. });
  870. }
  871. }