← Documentation
ADS-IDAC Engine 5.0.0
ControlPanel.cpp
Go to the documentation of this file.
1// ControlPanel.cpp: implementation of the ControlPanel class.
2//
4
5#if defined(_WIN32)
6#include <direct.h>
7#include <boost/serialization/export.hpp>
8#endif
9
10#include "ControlPanel.h"
11#include "../System/SystemModule.h"
12#include "../Scheduler/Scheduler.h"
13#include "../Scheduler/CommunicationPlace.h"
14#include "../Crew/OperatorDM.h"
15#include "../Crew/TimeConstrainedModule.h"
16#include "../HWReliability/HWReliabilityModule.h"
17#include "../Global/SimulationContext.h"
18#ifdef ENABLE_HCL
19#include "../../HCL/hcl/HCLEngine.h"
20#endif
21#include <boost/archive/binary_oarchive.hpp>
22#include <boost/archive/binary_iarchive.hpp>
23BOOST_CLASS_EXPORT_IMPLEMENT(ControlPanel)
24using namespace std;
25
26
28// Construction/Destruction
30
32 current_time = -1.0;
35}
36
38 this->clearControlPanel();
39}
40
42 // Idempotent: the early registration of the shared configuration loads the
43 // panel before the procedure book (the procedures parser resolves
44 // expectation targets against the panel name maps), and onFirstInit reaches
45 // here again on the engine's normal path. The panel layout is immutable
46 // configuration; reloading would append a duplicate of every element.
47 if (!indicators.parameter_value_array.empty()) return;
48 string indicator_file_name;
49 indicator_file_name = g_sim.SScheduler.getIndicatorsDirectory();
50 indicator_file_name += "ControlPanel.txt";
51
52 ifstream fin_ind(indicator_file_name.c_str(), ios::in);
53 //read info from hard disk and construct element search maps
54 if (!fin_ind.is_open()) {
55 cout << "File: " << indicator_file_name << " can not be opened" << endl;
56 ofstream fout("err messages.txt", ios::app);
57 fout << r5pars_.timesno << " File: " << indicator_file_name << " can not be opened\n";
58 fout.close();
59 r5pars_.sim_err = true;
60 g_sim.Branch_center.setTempESMessage("File ControlPanel.txt cannot be open.");
62 }
63// establish component map
67 fin_ind.close();
68//
69}
70
72 // Initialization of the control panel based on the contents of the RELAP5 and HCL inputs
75 // ensure alarms are updated correctly during initiation
76 this->checkForNewAlarms();
77 //
78 //ControlPanel::alarms.initiateAllAlarms(indicators);
79
80// Initialize the SPDS:
81 //safety_par_display_system.initiationForSimulation();
82}
85
86//The updateDisplayAndAlarm is called every time step to keep the information up-to-date
87//Controls are not updated here since they are updated individually based on demand
88//Only the Indicators and Alarms are updated here
89//They updating sequence should not be changed: indicator first followed by alarms
93}
96}
97
99 BranchSystemAlarmState *new_alarm;
100 vector<unique_ptr<AlarmParameter>>::iterator ap_itr;// alarm_parameter_value_array;
101 vector<unique_ptr<AlarmComponent>>::iterator ac_itr; // alarm_component_state_array;
102 vector<unique_ptr<AlarmTwoParameterDifference>>::iterator apd_itr; //alarm_value_difference_array;
103 int old_state, new_state;
104 int n_new_alarm = 0;
105 double weight_new_alarm = 0.0;
106 bool new_alarm_generated = false;
107 bool sequence_should_be_terminated = false;
108 string sequence_terminate_alarms;
109 string alarm_name, sub_name;
110 sequence_terminate_alarms = "Sequence_terminated_by_alarm:_";
111//
112 for (ap_itr = ControlPanel::alarms.alarm_parameter_value_array.begin();
113 ap_itr != ControlPanel::alarms.alarm_parameter_value_array.end(); ap_itr++) {
114 old_state = (*ap_itr)->getDisplayedAlarmState();
115 new_state = (*ap_itr)->updateDisplayedAlarmState(ControlPanel::indicators);
116// if(old_state == sim::State::Off && new_state == sim::State::On) {
117 // any state change is reported, so alarm clearing and reflash are seen too
118 if (old_state != new_state) {
119 new_alarm = new BranchSystemAlarmState();
120 new_alarm->copySystemAlarm(**ap_itr);
121 //debug----------
122 //if(new_alarm->getAlarmName() == "A_PZR_LoLVL"){
123 // cout << "DBG ControlPanel::checkForNewAlarms" << endl;
124 //}
125 //-------------
127 g_sim.Branch_center.system_branch.push_back(unique_ptr<BranchSystemAlarmState>(new_alarm));
128 n_new_alarm += 1;
129 weight_new_alarm += new_alarm->getImportanceOfTheAlarm();
130 new_alarm_generated = true;
131 alarm_name = new_alarm->getAlarmName();
132 if (alarm_name.size() >= 9) {
133 sub_name = alarm_name.substr(0, 9);
134 if (sub_name == "A_ENDSEQ_") {
135 sequence_should_be_terminated = true;
136 sequence_terminate_alarms += alarm_name;
137 sequence_terminate_alarms += ':';
138 }
139 }
140 }
141 }
142 for (ac_itr = ControlPanel::alarms.alarm_component_state_array.begin();
143 ac_itr != ControlPanel::alarms.alarm_component_state_array.end(); ac_itr++) {
144 old_state = (*ac_itr)->getDisplayedAlarmState();
145 new_state = (*ac_itr)->updateDisplayedAlarmState(ControlPanel::indicators);
146// if(old_state == sim::State::Off && new_state == sim::State::On) {
147 // any state change is reported, so alarm clearing and reflash are seen too
148 if (old_state != new_state) {
149 new_alarm = new BranchSystemAlarmState();
150 new_alarm->copySystemAlarm(**ac_itr);
152 g_sim.Branch_center.system_branch.push_back(unique_ptr<BranchSystemAlarmState>(new_alarm));
153 n_new_alarm += 1;
154 weight_new_alarm += new_alarm->getImportanceOfTheAlarm();
155 new_alarm_generated = true;
156 alarm_name = new_alarm->getAlarmName();
157 if (alarm_name.size() >= 9) {
158 sub_name = alarm_name.substr(0, 9);
159 if (sub_name == "A_ENDSEQ_") {
160 sequence_should_be_terminated = true;
161 sequence_terminate_alarms += alarm_name;
162 sequence_terminate_alarms += ':';
163 }
164 }
165 }
166 }
167 for (apd_itr = ControlPanel::alarms.alarm_value_difference_array.begin();
168 apd_itr != ControlPanel::alarms.alarm_value_difference_array.end(); apd_itr++) {
169 old_state = (*apd_itr)->getDisplayedAlarmState();
170 new_state = (*apd_itr)->updateDisplayedAlarmState(ControlPanel::indicators);
171// if(old_state == sim::State::Off && new_state == sim::State::On) {
172 // any state change is reported, so alarm clearing and reflash are seen too
173 if (old_state != new_state) {
174 new_alarm = new BranchSystemAlarmState();
175 new_alarm->copySystemAlarm(**apd_itr);
177 g_sim.Branch_center.system_branch.push_back(unique_ptr<BranchSystemAlarmState>(new_alarm));
178 n_new_alarm += 1;
179 weight_new_alarm += new_alarm->getImportanceOfTheAlarm();
180 new_alarm_generated = true;
181 alarm_name = new_alarm->getAlarmName();
182 if (alarm_name.size() >= 9) {
183 sub_name = alarm_name.substr(0, 9);
184 if (sub_name == "A_ENDSEQ_") {
185 sequence_should_be_terminated = true;
186 sequence_terminate_alarms += alarm_name;
187 sequence_terminate_alarms += ':';
188 }
189 }
190 }
191 }
194 if (sequence_should_be_terminated) {
196 g_sim.SScheduler.setInfoOfSequenceTerminatedByAlarm(sequence_terminate_alarms);
197 }
198}
201}
204}
207void ControlPanel::executeValueControl(string _ctrl_name, double _ctrl_value) {
208 controls.executeValueControl(_ctrl_name, _ctrl_value);
209}
210void ControlPanel::executeStateControl(string _ctrl_name, int _ctrl_state) {
211 controls.executeStateControl(_ctrl_name, _ctrl_state);
212}
214 SystemControl *_ctrl;//getControlFromMap(string);
215 ControlState *_ctrl_state;
216 ControlValue *_ctrl_value;
217 SystemDisplay *_system_display, *_system_display1, *_system_display2;
218 SystemControl *_system_control;
219 SystemAlarm *_system_alarm;
220 DisplayComponentState *_component_state;
221 DisplaySupportSystemState *_support_system_state;
222 DisplayParameterValue *_parameter_value;
223 DisplayParameterValueRate *_parameter_trend;
224 DisplayHeatStructure *_heat_structure; //meash points are the objects stored
225 BranchAction *b_action_pt;
226 BranchSystemAction *bsa_success, *bsa_fail;
227 //TODO:
228 BranchSupportSystemAction *bssa_success, *bssa_fail;
229
230 double act_probability, control_value;
231 bool is_a_maneuver_action = false;
232 bool is_FT_action = false;
233 string str, sub_action_name;
234 //iterators declared as auto in range-based for loops below
235// vector<BranchExpectedParameterTrend *>::iterator parameter_trend_itr;
236 int functional_state;
237 DisplayType control_type, display_type;
238 //crew action to change plant state
239 functional_state = sim::State::Succeed;
240 for (auto &action_elem : g_sim.Communication_place.action) {
241 str = action_elem->getActionName();
242 if (str.size() > 9) {
243 sub_action_name = str.substr(0, 9);
244 if (sub_action_name == "MANEUVER_") {
245 is_a_maneuver_action = true;
246 }
247 }
248 if (is_a_maneuver_action && action_elem->getIntendedReceiver()
249 == sim::Source::Plant) {//reply to teh sender for the maneuver action has been initiated
250 action_elem->setIntendedReceiver(action_elem->getSender());
251 action_elem->setSender(sim::Source::Plant);
252 action_elem->setProbability(1.0);
253 } else if (action_elem->getIntendedReceiver() == sim::Source::Plant) {
254 _ctrl = controls.getControlFromMap(action_elem->getActionName());
255 if (_ctrl != 0 && (_ctrl->getFunctionalState() == sim::State::Succeed || _ctrl->getFunctionalState() == sim::State::Control)) {
256 control_type = _ctrl->getTypeOfControl();
257 control_value = action_elem->getControlValue();
258 if (control_type == DisplayType::ControlState) {
259 _ctrl_state = (ControlState *) _ctrl;
260 _ctrl_state->performValueControl(g_sim.Plant, control_value);
261 } else {//DisplayType::ControlValue
262 _ctrl_value = (ControlValue *) _ctrl;
263 _ctrl_value->performControl(g_sim.Plant, control_value);
264 }
265 action_elem->setIntendedReceiver(action_elem->getSender());
266 action_elem->setSender(sim::Source::Plant);
267 action_elem->setProbability(1.0);
268 action_elem->setPerceivedControlValue(_ctrl->getControlValue());
269 action_elem->setControlValue(_ctrl->getControlValue());
270 } else if (_ctrl != 0 && _ctrl->getFunctionalState() == sim::State::Failed) {
272 // calculate recovery probability
273 act_probability = _ctrl->calculateProbability();
274 _ctrl->setProbability(act_probability);
275 //successful recovery
276 str = "Successful Recovery (probability = ";
277 str += to_string(act_probability);
278 str += ")";
279 b_action_pt = new BranchAction();
280 b_action_pt->copyBranchAction(*action_elem);
281 b_action_pt->setDisplayName(b_action_pt->getActionName());
283 b_action_pt->setActionTime(0.0);
284 b_action_pt->setProbability(act_probability);
285 b_action_pt->setMessage(str);
286 g_sim.Branch_center.addAction(b_action_pt->getSender(), b_action_pt);
287 //fail to recover
288 str = "Failure of Recovery (probability = ";
289 str += to_string(1.0 - act_probability);
290 str += ")";
291 b_action_pt = new BranchAction();
292 b_action_pt->copyBranchAction(*action_elem);
293 b_action_pt->setDisplayName("FAIL_RECOVERY");
295 b_action_pt->setActionTime(0.0);
296 b_action_pt->setProbability(1.0 - act_probability);
297 b_action_pt->setMessage(str);
298 g_sim.Branch_center.addAction(b_action_pt->getSender(), b_action_pt);
299 } else if (_ctrl != 0 && _ctrl->getFunctionalState() == sim::State::Recovery) {//fail recovery
300 if (action_elem->getDisplayName() == "FAIL_RECOVERY") {
301 _ctrl->setFunctionalState(sim::State::FailedP);//permonent failure
302 } else {//successful recovery
304 control_type = _ctrl->getTypeOfControl();
305 control_value = action_elem->getControlValue();
306 if (control_type == DisplayType::ControlState) {
307 _ctrl_state = (ControlState *) _ctrl;
308 _ctrl_state->performValueControl(g_sim.Plant, control_value);
309 } else {//DisplayType::ControlValue
310 _ctrl_value = (ControlValue *) _ctrl;
311 _ctrl_value->performControl(g_sim.Plant, control_value);
312 }
313 }
314 action_elem->setIntendedReceiver(action_elem->getSender());
315 action_elem->setSender(sim::Source::Plant);
316 action_elem->setProbability(1.0);
317 action_elem->setPerceivedControlValue(_ctrl->getControlValue());
318 action_elem->setControlValue(_ctrl->getControlValue());
319 } else if (_ctrl != 0 && _ctrl->getFunctionalState() == sim::State::FailedP) {//hardware permanent failure
320 action_elem->setIntendedReceiver(action_elem->getSender());
321 action_elem->setSender(sim::Source::Plant);
322 action_elem->setProbability(1.0);
323 } else {
324 ofstream fout("err messages.txt", ios::app);
325 cout << "ControlPanel::executeRequestToPlant: Action: " << action_elem->getActionName()
326 << " can not be recognized" << endl;
327 fout << r5pars_.timesno << " ControlPanel::executeRequestToPlant: Action: " << action_elem->getActionName()
328 << " can not be recognized\n";
329 fout.close();
330 r5pars_.sim_err = true;
331 g_sim.Branch_center.setTempESMessage("ControlPanel::executeRequestToPlant err1.");
333 }
334 }
335 }
336 //TODO:
337 //check for actions due to hardware value or operator maneuver controls
338 for (auto &hw_elem : g_sim.Communication_place.HW_reliability) {
339 if (hw_elem->getSender() == sim::Operator::OAT || hw_elem->getSender() == sim::Operator::ODM
340 || hw_elem->getSender() == sim::Operator::OCT) {
341 is_a_maneuver_action = true;
342 } else if (hw_elem->getSender() == sim::Branch::FtPlant) {
343 is_FT_action = true;
344 } else {
345 is_a_maneuver_action = false;
346 is_FT_action = false;
347 }
348
349 if (hw_elem->getFunctionalState() == sim::State::Failed && !is_a_maneuver_action && !is_FT_action) {
350 _system_control =
351 this->controls.getControlFromMap(hw_elem->getCorrespondingComponentNameOfControl());
352 if (_system_control != 0) {
353 _system_control->setFunctionalState(sim::State::Failed);
354 // apply the failed control value through the panel
355 //_system_control->setControlValue(hw_elem->getControlValue());
356 this->executeValueControl(hw_elem->getCorrespondingComponentNameOfControl(),
357 hw_elem->getControlValue());
358 } else {
359 ofstream fout("err messages.txt", ios::app);
360 cout << "ControlPanel::executeRequestToPlant: HW_reliability: "
361 << hw_elem->getCorrespondingComponentNameOfControl() << " can not be recognized" << endl;
362 fout << r5pars_.timesno << " ControlPanel::executeRequestToPlant: HW_reliability: "
363 << hw_elem->getCorrespondingComponentNameOfControl() << " can not be recognized\n";
364 fout.close();
365 r5pars_.sim_err = true;
366 g_sim.Branch_center.setTempESMessage("ControlPanel::executeRequestToPlant err2.");
368 }
369 } else if (hw_elem->getFunctionalState() == sim::State::Failed && is_FT_action) {
370 string topNodeName = hw_elem->getDisplayName();
372 if (ft != 0) {
373#ifdef ENABLE_HCL
374 if (ft->getHclEngine()->isFTDefined(hw_elem->getCorrespondingComponentNameOfControl())) {
375 ft->getHclEngine()->fixEvent(hw_elem->getCorrespondingComponentNameOfControl(), hw_elem->getControlValue());
377 } else {
378#else
379 if (false) {
380#endif
381 ofstream fout("err messages.txt", ios::app);
382 cout << "ControlPanel::executeRequestToPlant: HW_reliability: "
383 << hw_elem->getCorrespondingComponentNameOfControl() << " basic node cannot be found in " << hw_elem->getDisplayName()
384 << " FT" << endl;
385 fout << r5pars_.timesno << " ControlPanel::executeRequestToPlant: HW_reliability: "
386 << hw_elem->getCorrespondingComponentNameOfControl() << " basic node cannot be found in "<< hw_elem->getDisplayName()
387 << " FT" << "\n";
388 fout.close();
389 r5pars_.sim_err = true;
390 g_sim.Branch_center.setTempESMessage("ControlPanel::executeRequestToPlant err2.");
392 }
393 } else {
394 ofstream fout("err messages.txt", ios::app);
395 cout << "ControlPanel::executeRequestToPlant: HW_reliability: "
396 << hw_elem->getCorrespondingComponentNameOfControl() << " can not be recognized" << endl;
397 fout << r5pars_.timesno << " ControlPanel::executeRequestToPlant: HW_reliability: "
398 << hw_elem->getCorrespondingComponentNameOfControl() << " can not be recognized\n";
399 fout.close();
400 r5pars_.sim_err = true;
401 g_sim.Branch_center.setTempESMessage("ControlPanel::executeRequestToPlant err2.");
403 }
404 } else if (is_a_maneuver_action) {//humman maneuver actions
405 _ctrl = controls.getControlFromMap(hw_elem->getDisplayName());
406 functional_state = _ctrl->getFunctionalState();
407 if (_ctrl != 0) {//the control is identified
408 if (functional_state == sim::State::Succeed) {//component is OK to operate
409 control_type = _ctrl->getTypeOfControl();
410 control_value = hw_elem->getControlValue();
411 if (control_type == DisplayType::ControlState) {
412 _ctrl_state = (ControlState *) _ctrl;
413 _ctrl_state->performValueControl(g_sim.Plant, control_value);
414 } else {//DisplayType::ControlValue
415 _ctrl_value = (ControlValue *) _ctrl;
416 _ctrl_value->performControl(g_sim.Plant, control_value);
417 }
418 } else if (functional_state == sim::State::FailedP) {//Component failed permanently
419 //do nothing here
420 } else {//component failed but recoverable. Operator's first maneuver action would generate success and failure branches
421 if (hw_elem->getFunctionalState()
422 == sim::State::Unknown) {//Generate two branches: successful and fail recoveries
423 // calculate recovery probability
424 act_probability = hw_elem->calculateProbability();
425 hw_elem->setProbability(act_probability);
426 //
427 bsa_success = new BranchSystemAction();
428 bsa_success->copyBranchSystemAction(*hw_elem);
430 //Set the probability of successful recovery
431 bsa_success->setTimerAndProbability(0.0, act_probability);
432 //
433 bsa_fail = new BranchSystemAction();
434 bsa_fail->copyBranchSystemAction(*hw_elem);
436 //Set the probability of failure recovery
437 bsa_fail->setTimerAndProbability(0.0, 1 - act_probability);
438 g_sim.Branch_center.addHWReliabilityBranch(bsa_success, bsa_fail);
439 } else if (hw_elem->getFunctionalState() == sim::State::Succeed) {//the component is successfully recovered
441 control_type = _ctrl->getTypeOfControl();
442 control_value = hw_elem->getControlValue();
443 if (control_type == DisplayType::ControlState) {
444 _ctrl_state = (ControlState *) _ctrl;
445 _ctrl_state->performValueControl(g_sim.Plant, control_value);
446 } else {//DisplayType::ControlValue
447 _ctrl_value = (ControlValue *) _ctrl;
448 _ctrl_value->performControl(g_sim.Plant, control_value);
449 }
450 } else if (hw_elem->getFunctionalState()
451 == sim::State::FailedP) {//the compoent is recovered with failure: failed permanently
453 } else {
454 ofstream fout("err messages.txt", ios::app);
455 cout << "ControlPanel::executeRequestToPlant: HW_reliability: manueuval control 0 "
456 << hw_elem->getDisplayName() << " has unknown functional state" << endl;
457 fout << r5pars_.timesno << " ControlPanel::executeRequestToPlant: HW_reliability: manueuval control 0 "
458 << hw_elem->getDisplayName() << " has unknown functional state\n";
459 fout.close();
460 r5pars_.sim_err = true;
461 g_sim.Branch_center.setTempESMessage("ControlPanel::executeRequestToPlant err3.");
463 }
464 }
465 } else {
466 ofstream fout("err messages.txt", ios::app);
467 cout << "ControlPanel::executeRequestToPlant: HW_reliability: manueuval control "
468 << hw_elem->getDisplayName() << " can not be recognized" << endl;
469 fout << r5pars_.timesno << " ControlPanel::executeRequestToPlant: HW_reliability: manueuval control "
470 << hw_elem->getDisplayName() << " can not be recognized\n";
471 fout.close();
472 r5pars_.sim_err = true;
473 g_sim.Branch_center.setTempESMessage("ControlPanel::executeRequestToPlant err3.");
475 }
476 } else {
477 }
478 }
479 //Check requests for state of components
480 for (auto &cs_elem : g_sim.Communication_place.component_state) {
481 if (cs_elem->getIntendedReceiver() == sim::Source::Plant) {
482 _system_display = indicators.getDisplayFromMap(cs_elem->getDisplayName());
483 if (_system_display == 0) {
484 _system_display = indicators.getDisplayFromMap(cs_elem->getInfoName());
485 }
486 if (_system_display != 0) {
487 display_type = _system_display->getTypeOfDisplay();
488 if (display_type == DisplayType::ComponentState) {
489 _component_state = (DisplayComponentState *) _system_display;
490 cs_elem->setObservedComponentState(_component_state->getDisplayedComponentOperationalState());
491 cs_elem->setIntendedReceiver(cs_elem->getSender());
492 cs_elem->setSender(sim::Source::Plant);
493 cs_elem->setProbability(1.0);
494 } else {
495 ofstream fout("err messages.txt", ios::app);
496 cout << "ControlPanel::executeRequestToPlant: Component State: Incorrect display type " << static_cast<int>(display_type)
497 << " with name " << _system_display->getDisplayName()
498 << endl;
499 fout << r5pars_.timesno << " ControlPanel::executeRequestToPlant: Component State: Incorrect display type "
500 << static_cast<int>(display_type)
501 << " with name " << _system_display->getDisplayName()
502 << '\n';
503 fout.close();
504 r5pars_.sim_err = true;
505 g_sim.Branch_center.setTempESMessage("ControlPanel::executeRequestToPlant err3.");
507 }
508 } else {
509 ofstream fout("err messages.txt", ios::app);
510 cout << "ControlPanel::executeRequestToPlant: Component State: "
511 << cs_elem->getCorrespondingSystemParameterName() << " can not be recognized" << endl;
512 fout << r5pars_.timesno << " ControlPanel::executeRequestToPlant: Component State: "
513 << cs_elem->getCorrespondingSystemParameterName() << " can not be recognized\n";
514 fout.close();
515 r5pars_.sim_err = true;
516 g_sim.Branch_center.setTempESMessage("ControlPanel::executeRequestToPlant err4.");
518 }
519 }
520 }
521 //Check requests for state of support systems
522 for (auto &ss_elem : g_sim.Communication_place.support_system_state) {
523 if (ss_elem->getIntendedReceiver() == sim::Source::Plant) {
524 _system_display = indicators.getDisplayFromMap(ss_elem->getDisplayName());
525 if (_system_display == 0) {
526 _system_display = indicators.getDisplayFromMap(ss_elem->getInfoName());
527 }
528 if (_system_display != 0) {
529 display_type = _system_display->getTypeOfDisplay();
530 if (display_type == DisplayType::SupportSystemState) {
531 _support_system_state = (DisplaySupportSystemState *) _system_display;
532 ss_elem->setObservedSupportSystemState(_support_system_state->getDisplayedSupportSystemOperationalState());
533 ss_elem->setIntendedReceiver(ss_elem->getSender());
534 ss_elem->setSender(sim::Source::Plant);
535 ss_elem->setProbability(1.0);
536 } else {
537 ofstream fout("err messages.txt", ios::app);
538 cout << "ControlPanel::executeRequestToPlant: Support System State: Incorrect display type " << static_cast<int>(display_type)
539 << endl;
540 fout << r5pars_.timesno
541 << " ControlPanel::executeRequestToPlant: Support System State: Incorrect display type "
542 << static_cast<int>(display_type) << '\n';
543 fout.close();
544 r5pars_.sim_err = true;
545 g_sim.Branch_center.setTempESMessage("ControlPanel::executeRequestToPlant err3.");
547 }
548 } else {
549 ofstream fout("err messages.txt", ios::app);
550 cout << "ControlPanel::executeRequestToPlant: Support System State: "
551 << ss_elem->getDisplayName() << " can not be recognized" << endl;
552 fout << r5pars_.timesno << " ControlPanel::executeRequestToPlant: Support System State: "
553 << ss_elem->getDisplayName() << " can not be recognized\n";
554 fout.close();
555 r5pars_.sim_err = true;
556 g_sim.Branch_center.setTempESMessage("ControlPanel::executeRequestToPlant err4.");
558 }
559 }
560 }
561 //Check requests for state of parameters
562 for (auto &pv_elem : g_sim.Communication_place.parameter_value) {
563 if (pv_elem->getIntendedReceiver() == sim::Source::Plant) {
564 _system_display = indicators.getDisplayFromMap(pv_elem->getDisplayName());
565 if (_system_display == 0) {
566 _system_display = indicators.getDisplayFromMap(pv_elem->getInfoName());
567 }
568 if (_system_display != 0) {
569 display_type = _system_display->getTypeOfDisplay();
570 if (display_type == DisplayType::ParameterValue) {
571 _parameter_value = (DisplayParameterValue *) _system_display;
572 pv_elem->setObservedParameterValue(_parameter_value->getDisplayedParameterValue());
573 pv_elem->setIntendedReceiver(pv_elem->getSender());
574 pv_elem->setSender(sim::Source::Plant);
575 pv_elem->setProbability(1.0);
576 } else if (display_type == DisplayType::HeatStructure) {
577 _heat_structure = (DisplayHeatStructure *) _system_display;
578 pv_elem->setObservedParameterValue(_heat_structure->getDisplayedParameterValue());
579 pv_elem->setIntendedReceiver(pv_elem->getSender());
580 pv_elem->setSender(sim::Source::Plant);
581 pv_elem->setProbability(1.0);
582 } else if (display_type == DisplayType::ParameterTrend) {
583 _parameter_trend = (DisplayParameterValueRate *) _system_display;
584 pv_elem->setObservedParameterValue(_parameter_trend->getRateOfChange());
585 pv_elem->setIntendedReceiver(pv_elem->getSender());
586 pv_elem->setSender(sim::Source::Plant);
587 pv_elem->setProbability(1.0);
588 } else {
589 ofstream fout("err messages.txt", ios::app);
590 cout << "ControlPanel::executeRequestToPlant: Parameter Value type: " << static_cast<int>(display_type)
591 << " can not be recognized" << endl;
592 fout << r5pars_.timesno << " ControlPanel::executeRequestToPlant: Parameter Value type: " << static_cast<int>(display_type)
593 << " can not be recognized\n";
594 fout.close();
595 r5pars_.sim_err = true;
596 g_sim.Branch_center.setTempESMessage("ControlPanel::executeRequestToPlant err5.");
598 }
599 } else {
600 ofstream fout("err messages.txt", ios::app);
601 cout << "ControlPanel::executeRequestToPlant: Parameter Value: neither "
602 << pv_elem->getDisplayName() << " nor "
603 << pv_elem->getInfoName() << " can not be recognized" << endl;
604 fout << r5pars_.timesno << " ControlPanel::executeRequestToPlant: Parameter Value: neither "
605 << pv_elem->getDisplayName() << " nor "
606 << pv_elem->getInfoName() << " can not be recognized\n";
607 fout.close();
608 r5pars_.sim_err = true;
609 g_sim.Branch_center.setTempESMessage("ControlPanel::executeRequestToPlant err6.");
611 }
612 }
613 }
614 // execute requests for parameter differences
615 for (auto &pd_elem : g_sim.Communication_place.parameter_difference) {
616 if (pd_elem->getIntendedReceiver() == sim::Source::Plant) {
617 // find first difference parameter on the control panel
618 _system_display1 =
619 indicators.getDisplayFromMap(pd_elem->first_mental_parameter.getDisplayName());
620 if (_system_display1 == 0) {
621 _system_display1 = indicators.getDisplayFromMap(pd_elem->first_indicator.getInfoName());
622 }
623 if (_system_display1 != 0) {
624 display_type = _system_display1->getTypeOfDisplay();
625 if (display_type == DisplayType::ParameterValue) {
626 _parameter_value = (DisplayParameterValue *) _system_display1;
627 pd_elem->first_mental_parameter.setObservedParameterValue(_parameter_value->getDisplayedParameterValue());
628 } else if (display_type == DisplayType::ParameterTrend) {
629 _parameter_trend = (DisplayParameterValueRate *) _system_display1;
630 pd_elem->first_mental_parameter.setObservedParameterValue(_parameter_trend->getRateOfChange());
631 } else {
632 ofstream fout("err messages.txt", ios::app);
633 cout << "ControlPanel::executeRequestToPlant: Parameter Difference type: " << static_cast<int>(display_type)
634 << " can not be recognized" << endl;
635 fout << r5pars_.timesno << " ControlPanel::executeRequestToPlant: Parameter Difference type: "
636 << static_cast<int>(display_type) << " can not be recognized\n";
637 fout.close();
638 r5pars_.sim_err = true;
639 g_sim.Branch_center.setTempESMessage("ControlPanel::executeRequestToPlant err5.");
641 }
642 } else {
643 ofstream fout("err messages.txt", ios::app);
644 cout << "ControlPanel::executeRequestToPlant: Parameter Difference: neither "
645 << pd_elem->first_mental_parameter.getDisplayName() << " nor "
646 << pd_elem->first_indicator.getInfoName() << " can be recognized" << endl;
647 fout << r5pars_.timesno << " ControlPanel::executeRequestToPlant: Parameter Difference: neither "
648 << pd_elem->first_mental_parameter.getDisplayName() << " nor "
649 << pd_elem->first_indicator.getInfoName() << " can be recognized\n";
650 fout.close();
651 r5pars_.sim_err = true;
652 g_sim.Branch_center.setTempESMessage("ControlPanel::executeRequestToPlant err6.");
654 }
655 //
656 //find second difference parameter on the control panel
657 _system_display2 =
658 indicators.getDisplayFromMap(pd_elem->second_mental_parameter.getDisplayName());
659 if (_system_display2 == 0) {
660 _system_display2 = indicators.getDisplayFromMap(pd_elem->second_indicator.getInfoName());
661 pd_elem->second_mental_parameter.copyDisplayElement((DisplayElement &) _system_display2);
662 }
663 if (_system_display2 != 0) {
664 display_type = _system_display2->getTypeOfDisplay();
665 if (display_type == DisplayType::ParameterValue) {
666 _parameter_value = (DisplayParameterValue *) _system_display2;
667 pd_elem->second_mental_parameter.setObservedParameterValue(_parameter_value->getDisplayedParameterValue());
668 } else if (display_type == DisplayType::ParameterTrend) {
669 _parameter_trend = (DisplayParameterValueRate *) _system_display2;
670 pd_elem->second_mental_parameter.setObservedParameterValue(_parameter_trend->getRateOfChange());
671 } else {
672 ofstream fout("err messages.txt", ios::app);
673 cout << "ControlPanel::executeRequestToPlant: Parameter Difference type: " << static_cast<int>(display_type)
674 << " can not be recognized" << endl;
675 fout << r5pars_.timesno << " ControlPanel::executeRequestToPlant: Parameter Difference type: "
676 << static_cast<int>(display_type) << " can not be recognized\n";
677 fout.close();
678 r5pars_.sim_err = true;
679 g_sim.Branch_center.setTempESMessage("ControlPanel::executeRequestToPlant err5.");
681 }
682 } else {
683 ofstream fout("err messages.txt", ios::app);
684 cout << "ControlPanel::executeRequestToPlant: Parameter Difference: neither "
685 << pd_elem->second_mental_parameter.getDisplayName() << " nor "
686 << pd_elem->second_indicator.getInfoName() << " can be recognized" << endl;
687 fout << r5pars_.timesno << " ControlPanel::executeRequestToPlant: Parameter Difference: neither "
688 << pd_elem->second_mental_parameter.getDisplayName() << " nor "
689 << pd_elem->second_indicator.getInfoName() << " can be recognized\n";
690 fout.close();
691 r5pars_.sim_err = true;
692 g_sim.Branch_center.setTempESMessage("ControlPanel::executeRequestToPlant err6.");
694 }
695 if (_system_display1 != 0 && _system_display2 != 0) {
696 pd_elem->setIntendedReceiver(pd_elem->getSender());
697 pd_elem->setSender(sim::Source::Plant);
698 pd_elem->setProbability(1.0);
699 }
700 }
701 }
702
703 //
704 //Check request for states of alarms
705 for (auto &as_elem : g_sim.Communication_place.alarm_state) {
706 if (as_elem->getIntendedReceiver() == sim::Source::Plant) {
707 _system_alarm = alarms.getAlarmFromMap(as_elem->getAlarmName());
708 if (_system_alarm == 0) {
709 _system_alarm = alarms.getAlarmFromMap(as_elem->getInfoName());
710 }
711 if (_system_alarm != 0) {
712 as_elem->setObservedAlarmState(_system_alarm->getDisplayedAlarmState());
713 as_elem->setIntendedReceiver(as_elem->getSender());
714 as_elem->setSender(sim::Source::Plant);
715 as_elem->setProbability(1.0);
716 } else {
717 ofstream fout("err messages.txt", ios::app);
718 cout << "ControlPanel::executeRequestToPlant: Alarm_state: neither " << as_elem->getAlarmName()
719 << " nor "
720 << as_elem->getInfoName() << " can not be recognized" << endl;
721 fout << r5pars_.timesno << " ControlPanel::executeRequestToPlant: Parameter Value: neither "
722 << as_elem->getAlarmName() << " nor "
723 << as_elem->getInfoName() << " can not be recognized\n";
724 fout.close();
725 r5pars_.sim_err = true;
726 g_sim.Branch_center.setTempESMessage("ControlPanel::executeRequestToPlant err7.");
728 }
729 }
730 }
731}
733 this->updateDisplay();
734 this->checkForNewAlarms();
735 //this->safety_par_display_system.updateAllSPDSValueAndRate();
736 this->executeRequestToPlant();
737}
739 // State overlay: rebuild layout/definitions from the process-local master
740 // before the state stream is applied. The copy helpers append, so clear
741 // every element container (and the raw-pointer maps they rebuild) first.
745 alarms.alarm_map.clear();
751 indicators.display_map.clear();
754 controls.control_map.clear();
755 copyControlPanel(const_cast<ControlPanel&>(master));
756}
761 //safety_par_display_system.copySPDS(_cp.safety_par_display_system);
765}
767 this->copyControlPanel(_cp);
768};
773 //safety_par_display_system.clearSPDS();
774 current_time = -1.0;
777}
779 this->clearControlPanel();
780}
782 fout << "ControlPanel\n" << current_time << ' '
788 //safety_par_display_system.saveSPDSToFile(fout);
789}
791 string str;
792 fin >> str;
793 if (str != "ControlPanel") {
794 ofstream fout("err messages.txt", ios::app);
795 cout << "ControlPanel::retrieveControlPanelFromFile File retrieval error in previous function" << endl;
796 fout << r5pars_.timesno
797 << " ControlPanel::retrieveControlPanelFromFile File retrieval error in previous function\n";
798 fout.close();
799 r5pars_.sim_err = true;
800 g_sim.Branch_center.setTempESMessage("ControlPanel::retrieveSystemModuleFromFile Prior err.");
802 return;
803 }
804
805 fin >> current_time
811 //safety_par_display_system.retrieveSPDSFromFile(fin);
812}
Control room panel state — alarms, displays, controls, and operator interface.
DisplayType
Definition: SimConstants.h:41
SimulationContext g_sim
Global simulation context: the single instance, defined in SimulationContext.cpp.
double getImportanceOfTheAlarm()
std::string getAlarmName()
int getDisplayedAlarmState()
void copyBranchAction(BranchAction &)
void setActionTime(double)
void setTempTypeOfConsequence(Consequence)
Stores the consequence of the end state the running sequence will get.
std::vector< std::unique_ptr< BranchSystemAlarmState > > system_branch
Pending system alarm states, copied onto every alternative of the next cluster.
Definition: BranchRecord.h:294
void addAction(int, BranchAction *)
void addHWReliabilityBranch(BranchSystemAction *, BranchSystemAction *)
Registers a hardware reliability fork with two alternatives (index 0 first). The record takes ownersh...
void setTempESMessage(std::string)
Stores the description of the end state the running sequence will get if it is terminated (set by mod...
void copyBranchSystemAction(BranchSystemAction &)
std::vector< std::shared_ptr< BranchExpectedSupportSystemState > > support_system_state
Definition: BranchUnit.h:62
std::vector< std::shared_ptr< BranchExpectedParameterDifference > > parameter_difference
Definition: BranchUnit.h:65
std::vector< std::shared_ptr< BranchExpectedParameterValue > > parameter_value
Definition: BranchUnit.h:64
std::vector< std::shared_ptr< BranchExpectedComponentState > > component_state
Definition: BranchUnit.h:61
std::vector< std::shared_ptr< BranchExpectedAlarmState > > alarm_state
Definition: BranchUnit.h:60
std::vector< std::shared_ptr< BranchAction > > action
Definition: BranchUnit.h:59
std::vector< std::shared_ptr< BranchSystemAction > > HW_reliability
void setSenderAndReceiver(int, int)
double getControlValue()
void setDisplayName(std::string)
std::vector< std::unique_ptr< AlarmTwoParameterDifference > > alarm_value_difference_array
void retrieveControlPanelAlarmFromFile(std::ifstream &)
std::map< std::string, SystemAlarm * > alarm_map
int readInfoFromFile(std::ifstream &)
void updateAllDisplayedAlarmState(ControlPanelDisplay &)
std::vector< std::unique_ptr< AlarmComponent > > alarm_component_state_array
void copyControlPanelAlarm(ControlPanelAlarm &)
std::vector< std::unique_ptr< AlarmParameter > > alarm_parameter_value_array
SystemAlarm * getAlarmFromMap(std::string)
void saveControlPanelAlarmToFile(std::ofstream &)
void saveControlPanelControlToFile(std::ofstream &)
std::vector< std::unique_ptr< ControlValue > > control_value_array
std::map< std::string, SystemControl * > control_map
SystemControl * getControlFromMap(std::string)
std::vector< std::unique_ptr< ControlState > > control_state_array
int readInfoFromFile(std::ifstream &)
void executeValueControl(std::string, double)
void executeStateControl(std::string, int)
void copyControlPanelControl(ControlPanelControl &)
void retrieveControlPanelControlFromFile(std::ifstream &)
void copyControlPanelDisplay(ControlPanelDisplay &)
void retrieveControlPanelDisplayFromFile(std::ifstream &)
std::vector< std::unique_ptr< DisplayComponentState > > component_state_array
std::vector< std::unique_ptr< DisplayParameterValueRate > > parameter_trend_array
std::map< std::string, SystemDisplay * > display_map
std::vector< std::unique_ptr< DisplayParameterValue > > parameter_value_array
std::vector< std::unique_ptr< DisplayHeatStructure > > heat_structure_array
void saveControlPanelDisplayToFile(std::ofstream &)
int readInfoFromFile(std::ifstream &)
SystemDisplay * getDisplayFromMap(std::string)
std::vector< std::unique_ptr< DisplaySupportSystemState > > support_systems_state_array
void setCurrentTime()
void seedFromMaster(const ControlPanel &master)
double total_weight_of_activated_alarm
Definition: ControlPanel.h:60
int total_number_of_activated_alarm
Definition: ControlPanel.h:59
void checkForNewAlarms()
void retrieveControlPanelFromFile(std::ifstream &)
int getTotalNumberOfActivatedAlarm()
void copyControlPanel(ControlPanel &)
void executeStateControl(std::string, int)
void executeRequestToPlant()
ControlPanelDisplay indicators
Definition: ControlPanel.h:53
ControlPanelControl controls
Definition: ControlPanel.h:54
void copyControlPanelForRestart(ControlPanel &)
void updateTotalNumberOfActivatedAlarm(int)
void clearForRestart()
void readInfoFromFile()
void saveControlPanelToFile(std::ofstream &)
void updateDisplayAndAlarm()
virtual ~ControlPanel()
void oneThroughProcess()
double getTotalWeightOfActivatedAlarm()
void updateTotalWeightOfActivatedAlarm(double)
double current_time
Definition: ControlPanel.h:58
void executeValueControl(std::string, double)
void clearControlPanel()
void initiationForSimulation()
void updateDisplay()
ControlPanelAlarm alarms
Definition: ControlPanel.h:52
double getCurrentTime()
void performValueControl(SystemModule &, double)
void performControl(SystemModule &, double)
std::string getActionName()
std::string getDisplayName()
void copyDisplayElement(DisplayElement &)
HWReliabilityFTUnit * getHWReliabilityFTUnit(const std::string)
Finds the fault tree unit whose top node has the given name.
void setProbability(double)
Definition: Probability.cpp:26
double calculateProbability()
void setInfoOfSequenceTerminatedByAlarm(std::string)
Definition: Scheduler.cpp:821
std::string getIndicatorsDirectory()
Definition: Scheduler.cpp:631
void setSequenceTerminatedByAlarm(bool)
Definition: Scheduler.cpp:808
void setMessage(std::string)
void copySystemAlarm(SystemAlarm &)
Definition: SystemAlarm.cpp:29
void setFunctionalState(int)
DisplayType getTypeOfControl()
int getFunctionalState()
DisplayType getTypeOfDisplay()
void setTimerAndProbability(double, double)
void setBothTotalTimeRequiredAndRemainingTime(double)
Definition: Timer.cpp:71
struct @0 r5pars_
constexpr int FtPlant
Definition: SimConstants.h:266
constexpr int OCT
Definition: SimConstants.h:146
constexpr int ODM
Definition: SimConstants.h:145
constexpr int OAT
Definition: SimConstants.h:144
constexpr int Plant
Definition: SimConstants.h:135
constexpr int Failed
Definition: SimConstants.h:103
constexpr int FailedP
Definition: SimConstants.h:115
constexpr int Succeed
Definition: SimConstants.h:104
constexpr int Recovery
Definition: SimConstants.h:122
constexpr int Control
Definition: SimConstants.h:111
constexpr int Unknown
Definition: SimConstants.h:120
constexpr int None
Definition: SimConstants.h:75
Scheduler SScheduler
Simulation scheduling, parses CLI options.
HWReliabilityModule System_reliability
Hardware fault trees.
SystemModule Plant
Maps RELAP5 card numbers to C++ objects.
CommunicationPlace Communication_place
Inter-module communication.
BranchRecord Branch_center
Dynamic event tree state.