SObjectizerã®ã«ãŒãã¯ãèªåããã»ã¹å¶åŸ¡ã·ã¹ãã ïŒAPCSïŒã®ãããã¯ã«æ ¹ãããŠããŸãã ãã ããããã»ã¹å¶åŸ¡ã·ã¹ãã ããé ãé¢ããé åã§SObjectizerã䜿çšããŸããã ãã®ãããããã©ãããé·ãéåãäžããŠããŸãã...ããšããã«ããŽãªãããã¹ã¿ã«ãžã¢ãæããããšããããŸã ããã®ãããSObjectizerã§æãããªã¥ãŒã ã®ããäŸã®1ã€ã§ããmachine_controlãç»å ŽããŸããã ãããããç§ã¯ãæãæºãã¶ããããšãæã¿ãçŸä»£ã®SObjectizerã§æ©åšãå¶åŸ¡ããã¿ã¹ã¯ãã·ãã¥ã¬ãŒãããŸããã ããŠããã±ããããé
ä¿¡ãã£ã«ã¿ãŒããã³ãã¬ãŒããšãŒãžã§ã³ããåªå
床ããµããŒããããã£ã¹ãããã£ãŒãªã©ãSObjectizerã®ããŸããŸãªããããæ©èœã®äŸãè©°ã蟌ã¿ãŸãã 仿¥ã¯ããã¹ãŠãã©ã®ããã«æ©èœãããã説æããŠã¿ãŸãã

ãã€ã¯ã»ããŒãã³ã°ã«ããåç
ã¢ããªã³ã°ãšã¯äœã§ããïŒ
ãšã³ãžã³ãå
èµããçç£æœèšã§æ©æ¢°ãŸãã¯å·¥äœæ©æ¢°ãæ±ã£ãŠãããšããŸãã ããŠãã³ã³ãã¢ãã«ãé§åãšããŸãããã ãŸãã¯ãæ°Žãæ±²ã¿äžãããã³ãã§ãã ãã€ã³ãã§ã¯ãããŸããã éèŠãªããšã¯ããšã³ãžã³ãåäœããŠãããšãããšã³ãžã³ãç±ããªãããšã§ãã ãããŠãç±ããªã£ãããå·åŽããå¿
èŠããããŸãã ãã®ããããšã³ãžã³ã®è¿ãã«å·åŽãã¡ã³ãåãä»ããããŠããŸãã ãšã³ãžã³ã70åºŠä»¥äžæãŸã£ãå Žåããã®ãã¡ã³ããªã³ã«ããå¿
èŠããããŸãã å·åŽã®çµæããšã³ãžã³ã50床ã«å·åŽãããå Žåããã¡ã³ããªãã«ããå¿
èŠããããŸãã å·åŽã«ãããããããšã³ãžã³ãå ç±ãç¶ããæž©åºŠã95床ã«éããå Žåããšã³ãžã³ã忢ãã50床ã«å·ãããŸã§åŸ
ã€å¿
èŠããããŸãã
åœç¶ãããããã¹ãŠããã€ããã¯ã¹ã§ã©ã®ããã«çºçãããã確èªããããšæããŸãã ãšã³ãžã³ãçŸåšåäœããŠãããã©ããããšã³ãžã³ã®æž©åºŠãå·åŽãã¡ã³ããªã³ã«ãªã£ãŠãããã©ããã確èªããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãmachine_controlã®å®è£
ã§ããã®ãã¹ãŠã®æ
å ±ãã³ã³ãœãŒã«ã«ç°¡åã«å®æçã«å°å·ããŸãã
ããŠãç§ãã¡ã«ãšã£ãŠããé¢çœãããããã«ã1ã€ã®ãšã³ãžã³ã§ã¯ãªããè€æ°ã®ãšã³ãžã³ã§äœæ¥ããŸãã ãã¹ãŠåãããã«æ©èœããŸãããããããã£ã¯ç°ãªããŸãã ãããã®ããã€ãã¯ããéãç±ããããã€ãã¯ããé
ããªããŸãã ãããã£ãŠãããšãã°4ã€ã®ãšã³ãžã³ã®äœæ¥ã芳å¯ãããšããããããç¬èªã®ç掻ãéã£ãŠããããã«èŠããŸãã
è¡ããïŒ
éžæãããœãªã¥ãŒã·ã§ã³ã«é¢ããããã€ãã®äžè¬çãªèšè
åé¡ã¯ããã€ãã®æ¹æ³ã§è§£æ±ºã§ããããšã¯æããã§ãã 以äžã§èª¬æããæ¹æ³ã¯ãå¯èœãªæ¹æ³ã®1ã€ã«ãããŸããã åçŽããšå®çšæ§ã®çç±ããã§ã¯ãªããSObjectizerã®ããŸããŸãªæ©èœãå®èšŒããæ©äŒã®ããã«éžã°ããŸããã ãããã£ãŠãåŸç¶ã®ããã¹ãããã¢ãšããŠæ±ãããšããå§ãããŸãã ããã«ãæ¬çªç°å¢ã§ã¯ãã¹ãŠãããæ·±å»ã§æªåããŸã;ïŒ
ãã®äŸã¯ã©ã®ããã«æ©èœããŸããïŒ
ããã€ãã®ãã·ã³ãšãŒãžã§ã³ãããããç¹å¥ãªå
±éã¡ãŒã«ããã¯ã¹ããããŸãã ãã·ã³ãšãŒãžã§ã³ãã¯ãçŸåšã®ã¹ããŒã¿ã¹ã«é¢ããã¡ãã»ãŒãžããã®å
±æã¡ãŒã«ããã¯ã¹ã«æã
éä¿¡ããŸãã

äžè¬çãªã¡ãŒã«ããã¯ã¹ããããã·ã³ãšãŒãžã§ã³ãã®ã¹ããŒã¿ã¹ã«é¢ããã¡ãã»ãŒãžã¯ãå®å
šã«ç°ãªã2ã€ã®ãšãŒãžã§ã³ãã«å±ããŸãã æåã®total_status_dashboardã¯ããã·ã³ãšãŒãžã§ã³ãã®ã¹ããŒã¿ã¹ã«é¢ããæ
å ±ãåéããæšæºåºåã¹ããªãŒã ã§çºçããŠããããšã«é¢ããæ
å ±ã宿çã«è¡šç€ºããŸãã äŸã®å®è¡ã«ãããããããæ¬¡ã®å³ã衚瀺ãããŸãã

2çªç®ã®ãšãŒãžã§ã³ãã¯statuses_analyserã§ãã 圌ã¯ããã·ã³ã§äœãèµ·ãã£ãŠããããå¶åŸ¡ãããã·ã³ã®1ã€ãå€éšã®åœ±é¿ãå¿
èŠãšããç¬éã倿ããããã«ãã¹ããŒã¿ã¹ã«é¢ããæ
å ±ãåãåããŸãã ã¢ã¯ã·ã§ã³ãå¿
èŠãªå Žåãstatuses_analyserãšãŒãžã§ã³ãã¯åããããªãã¯ã¡ãŒã«ããã¯ã¹ã«å¥ã®ã¡ãã»ãŒãžãéä¿¡ããŸãã Machine_controllerãšãŒãžã§ã³ãã¯ãã®ã¡ãã»ãŒãžã«å¿çããŸãã ç¹å®ã®ãã·ã³ã«ã©ã®å¶åŸ¡ã¢ã¯ã·ã§ã³ãé©çšãããããã§ã«æ±ºå®ããŠããã察å¿ããã¡ãã»ãŒãžã察å¿ãããšãŒãžã§ã³ããã·ã³ã«çŽæ¥éä¿¡ããŸãã
å®éãããããã¹ãŠã§ãã æ®ãã®ç¹ã«ã€ããŠã¯ã以äžã§è©³çŽ°ã«æ€èšããŸãã
ãšãŒãžã§ã³ãa_machine_t
ãã¹ããŒããããã®äŸã®å®è£
ã®åæãéå§ããŸãã ãšã³ãžã³ãšå·åŽãã¡ã³ãåãããã·ã³èªäœããã å®éã«ã¯ãããã€ãã®ã»ã³ãµãŒãšã³ã³ãããŒã©ãŒãæ¥ç¶ãããå®éã®ããŒããŠã§ã¢ããããŸãã ãããŠããã®ãã¹ãŠã®ãããã³ã§ã¯ãããã°ã©ã ãã1ã€ãŸãã¯å¥ã®ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠããŸãã¯å€åããã€ãã®ç°ãªãã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠäœæ¥ããå¿
èŠããããŸãã
ããããæ¶ç©ºã®äŸããããããããŒããããŒãªã³ã°ããããå®éã®æ©åšããããŒã¿ãèªã¿åã£ããããå¿
èŠã¯ãããŸããã 皌åäžã®ãã·ã³ã®ãããªãã®ãå¿
èŠã§ãã ãããè¡ãããã«ããšãŒãžã§ã³ãa_machine_tããããŸãã
- ãšã³ãžã³ã®ç¶æ
ããã¡ã³ã®åäœããšã³ãžã³ã®çŸåšã®æž©åºŠãªã©ããã®ç¶æ
ã«é¢ããæ
å ±ã宿çã«å€éšã«çºè¡ããŸãã
- ãšã³ãžã³ããªã³/ãªãããã³ãã³ããåãå
¥ããŠå®è¡ããŸãã
- ãã¡ã³ããªã³/ãªãããã³ãã³ããåãå
¥ããŠå®è¡ããŸãã
ãã®ãšãŒãžã§ã³ããæš¡å£ã«åŸäºããŠãããšããäºå®ã«ããããããããã€ãŠã¯ããã»ã¹å¶åŸ¡ã·ã¹ãã ã®ã¿ã¹ã¯ã§ãåæ§ã®ããžãã¯ã䜿çšããããšãå¯èœã§ããã ã¿ã€ããŒã€ãã³ãã®ãšãŒãžã§ã³ãã¯ãäœããã®ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠæ©åšã«ã¢ã¯ã»ã¹ããã»ã³ãµãŒããæ
å ±ãåéããŸããã ãã®åŸã圌ã¯ãã£ããã£ããæ
å ±ãç®çã®åœ¢åŒã«å€æãããã®æ
å ±ãé©åã«åŠçã§ãã人ã«éä¿¡ããŸããã
ãã®a_machine_tãšãŒãžã§ã³ãã®å€èгãèŠãŠã¿ãŸãããããæåã«a_machine_tã®å®è£
ã«å¿
èŠãªå®çŸ©ãããã€ã玹ä»ããŸãã
ãããã£ãŠããšãŒãžã§ã³ãa_machine_tã¯ãturn_engine_on / turn_engine_offããã³turn_cooler_on / turn_cooler_offã·ã°ãã«ã¡ãã»ãŒãžã®åœ¢åŒã§å¶åŸ¡ã³ãã³ããåä¿¡ããmachine_statusã¡ãã»ãŒãžãéä¿¡ããŠãã®ã¹ããŒã¿ã¹ãéç¥ããŸãã
ããã§ããšãŒãžã§ã³ãa_machine_tèªäœã®æ€èšã«é²ãããšãã§ããŸãã ãžãã«ããå§ããŸãããïŒ
class a_machine_t : public so_5::agent_t {
ãšãŒãžã§ã³ãa_machine_tã¯ãããšã³ãžã³ããªã³ããšããšã³ãžã³ããªããã®2ã€ã®ç¶æ
ãæã€éåžžã«åçŽãªç¶æ
ãã·ã³ã§ãã ãããã®ããããã§ã圌ã¯ããã€ãã®ã¡ãã»ãŒãžã«ç°ãªã£ãŠåå¿ããŸãã SObjectizerã§ãšãŒãžã§ã³ããç¶æ
ãã·ã³ãšããŠæç€ºããããã«ãst_engine_onãšst_engine_offã®2ã€ã®åå¥ã®å±æ§ãå¿
èŠã§ããã
éå§ãããšããšãŒãžã§ã³ãã¯å®æçãªupdate_statusã¡ãã»ãŒãžãéå§ããŸãã ãã®ã¡ãã»ãŒãžãåä¿¡ãããã³ã«ããšãŒãžã§ã³ãã¯ãšã³ãžã³ãšãã¡ã³ãäœåããŠãããã©ãããèæ
®ããŠãm_engine_temperatureå€ãåã«ãŠã³ãããŸãã æ¬¡ã«ãçŸåšã®æž¬å®å€ãå«ãmachine_statusã¡ãã»ãŒãžãm_status_distrib_mboxã¡ãŒã«ããã¯ã¹ã«éä¿¡ãããŸãã
ãšãŒãžã§ã³ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãåæãã©ã¡ãŒã¿ãŒãè±å¯ãªããã«èšå€§ã«èŠããŸãããå®éã«ã¯äºçްãªããšãªã®ã§ãèæ
®ããŸããã
ããããããã¯ãã£ãšé¢çœãã§ãã ãŸããããã¯ç¹å¥ãªso_define_agentïŒïŒã¡ãœããã§ããããšãŒãžã§ã³ããSObjectizerå
ã§åäœããããã«èªèº«ãæ§æã§ããããã«ããããã«äœ¿çšãããŸãã a_machine_tã¯åæç¶æ
ã«ç§»è¡ããå¿
èŠãªã¡ãã»ãŒãžããµãã¹ã¯ã©ã€ãããå¿
èŠããããŸãã ããã¯æ¬¡ã®ãããªãã®ã§ãã
virtual void so_define_agent() override { this >>= st_engine_off; st_engine_on .event< turn_engine_off >( &a_machine_t::evt_turn_engine_off ) .event< turn_cooler_on >( &a_machine_t::evt_turn_cooler_on ) .event< turn_cooler_off >( &a_machine_t::evt_turn_cooler_off ) .event< update_status >( &a_machine_t::evt_update_status_when_engine_on ); st_engine_off .event< turn_engine_on >( &a_machine_t::evt_turn_engine_on ) .event< turn_cooler_on >( &a_machine_t::evt_turn_cooler_on ) .event< turn_cooler_off >( &a_machine_t::evt_turn_cooler_off ) .event< update_status >( &a_machine_t::evt_update_status_when_engine_off ); }
ç°ãªãç¶æ
ã®ãšãŒãžã§ã³ãã¯ãç°ãªããã³ãã©ãŒã䜿çšããŠupdate_statusä¿¡å·ã«å¿çããããšã«æ³šæããŠãã ããã ãŸããst_engine_onç¶æ
ã§ã¯ããã§ã«å®è¡äžã®ãšã³ãžã³ããªã³ã«ããæå³ããªããããturn_engine_onä¿¡å·ãç¡èŠãããããšãããããŸãã åæ§ã«ãç¶æ
st_engine_offã®turn_engine_offã䜿çšããŸãã
so_define_agentïŒïŒã¡ãœããã«é¢ããŠã¯ãå°ãäœè«ãããããããŸãããäžèŠããã®ã¡ãœããã¯åé·ã«èŠããŸããããããªãã§ãå®è¡ã§ããããã§ãã çµå±ã®ãšãããã³ã³ã¹ãã©ã¯ã¿ãŒã§ãã¹ãŠã®ãšãŒãžã§ã³ãèšå®ãçŽæ¥å®è¡ã§ããŸãã
確ãã«ãããã¯å¯èœã§ãã ç°¡åãªå Žåãããã¯è¡ãããŸãã ãã ãããšãŒãžã§ã³ãã®ç¶æ¿ã䜿çšãããå Žåãso_define_agentïŒïŒã§ãšãŒãžã§ã³ããèšå®ããæ¹ãã³ã³ã¹ãã©ã¯ã¿ãŒããã䟿å©ã§ãã ã¯ã©ã¹ã®çžç¶äººã¯ãåºæ¬ã¯ã©ã¹ã®èšå®ã«å¹²æžããç°¡åã§äŸ¿å©ãªæ¹æ³ãååŸããŸãïŒããšãã°ãåºæ¬ã¯ã©ã¹ã§so_define_agentïŒïŒãåã«åŒã³åºãããšã¯ã§ããããã¹ãŠã®èšå®ã¯æŽŸçã¯ã©ã¹ã«ãã£ãŠè¡ãããŸãïŒã
ããã«ãçµéšäžãå¥ã®so_define_agentïŒïŒã¡ãœããã¯ãããŸããŸãªäººã
ã«ãã£ãŠæžãããå€§èŠæš¡ãªãããžã§ã¯ãã§æ£åœåããå§ããŸããä»ã®äººã®ã³ãŒããéããããã«å¥ã®äººã®ãšãŒãžã§ã³ãã®so_define_agentïŒïŒãèŠããšããã¹ãŠã1ãæã«è¡šç€ºãããŸã å€ãã®æéãšãšãã«ã®ãŒãç¯çŽããŸãã
次ã«éèŠãªã¡ãœããã¯so_evt_startïŒïŒã§ãã SObjectizerã¯ãSObjectizerå
ã§åäœãéå§ãããã¹ãŠã®ãšãŒãžã§ã³ãã§èªåçã«åŒã³åºããŸãã a_machine_tã¯so_evt_startïŒïŒã䜿çšããŠã宿çãªupdate_statusã¡ãã»ãŒãžã®éä¿¡ãéå§ããŸãã
virtual void so_evt_start() override {
次ã¯ãa_machine_tãšãŒãžã§ã³ãã€ãã³ããã³ãã©ãŒã§ãã ã€ãã³ããã³ãã©ã¯ããšãŒãžã§ã³ãã察å¿ããã€ã³ã·ãã³ãã¡ãã»ãŒãžãåä¿¡ãããšãã«SObjectizerãåŒã³åºãã¡ãœããã§ãã ã€ã³ã·ãã³ãã¡ãã»ãŒãžãšãã³ãã©ãŒã®å¯Ÿå¿ã¯ãã¡ãã»ãŒãžããµãã¹ã¯ã©ã€ããããšãã«èšå®ãããŸãã ãããã£ãŠã次ã®åœ¢åŒã®ãµãã¹ã¯ãªãã·ã§ã³ïŒ
st_engine_on .event< turn_engine_off >( &a_machine_t::evt_turn_engine_off )
ãšãŒãžã§ã³ããturn_engine_offã¿ã€ãã®ã¡ãã»ãŒãžãåä¿¡ããå ŽåããšãŒãžã§ã³ãã¯evt_turn_engine_offïŒïŒã¡ãœãããåŒã³åºãå¿
èŠãããããšãSObjectizerã«äŒããŸãã
a_machine_tãšãŒãžã§ã³ãã«ã¯4ã€ã®åçŽãªãã³ãã©ãŒããããŸãããããããã©ã®ããã«æ©èœãããã説æããæå³ã¯ãããŸããã
void evt_turn_engine_off() {
ãããã宿çãªã¡ãã»ãŒãžupdate_statusã«å¯Ÿããåå¿ã«ã€ããŠã¯ãããã€ãã®èª¬æãããå¿
èŠããããŸãã æåã«ããšã³ãžã³ã®å®è¡äžã®update_statusã«å¯Ÿããåå¿ãèŠãŠã¿ãŸãããã
void evt_update_status_when_engine_on() { m_engine_temperature += m_engine_heating_step; if( cooler_state_t::on == m_cooler_status ) m_engine_temperature -= m_cooler_impact_step; distribute_status(); }
ãšã³ãžã³ã¯ç§ãã¡ãšäžç·ã«åããŠãããããããã«ç±ããªã£ãŠããã®ã§ãçŸåšã®æž©åºŠãäžããå¿
èŠããããŸãã ãã ããå·åŽãã¡ã³ããªã³ã«ãªã£ãŠããå Žåã¯ãå·åŽå¹æãèæ
®ããŠæž©åºŠã調æŽããå¿
èŠããããŸãã
update_statusä¿¡å·ãst_engine_offç¶æ
ã§åŠçããããšããã€ãŸã ãšã³ãžã³ããªãã«ãªã£ããšãã«ãå·åŽã®å¹æãèæ
®ããå¿
èŠãããã®ã¯ãçŸåšãªã³ã«ãªã£ãŠããå Žåã®ã¿ã§ãã
void evt_update_status_when_engine_off() { if( cooler_state_t::on == m_cooler_status ) { m_engine_temperature -= m_cooler_impact_step;
ããŠãè£å©ã¡ãœããdistribute_statusïŒïŒã¯å®å
šã«ç°¡åãªå®è£
ã§ãã ãã®å¯äžã®ã¿ã¹ã¯ã¯ããã®ç®çã®ããã«ç¹å¥ã«èšèšãããã¡ãŒã«ããã¯ã¹ã«machine_statusã¡ãã»ãŒãžãéä¿¡ããããšã§ãã
void distribute_status() {
machine_statusã¡ãã»ãŒãžã¯ã©ãã«è¡ããŸããïŒ
ããããèªè
ã®1人ãçåãæ±ããŠããŸããããªãa_machine_tèªäœããã¡ã³ãšãšã³ãžã³ã®ãªã³/ãªããæ±ºå®ããªãã®ã§ããïŒ äœãèµ·ãã£ãŠããã®ããåå¥ã«åæããŠé©åãªã¢ã¯ã·ã§ã³ããšãã®ã§ã¯ãªããa_machine_tã¯çŸåšã®ç¶æ
ã«é¢ããã¡ãã»ãŒãžã宿çã«ã©ããã«éä¿¡ããã ããªã®ã§ããïŒ
ããã¯ãåè§£ã®ããã§ã:)
ãªããžã§ã¯ãæåã®ã¢ãããŒãã«åºã¥ããŠã·ã¹ãã ãèšèšãããšããåãªããžã§ã¯ãããã®ã¿ã¹ã¯ãæ
åœããå¿
èŠãªå¹æãããããçµã¿åãããããšã«ãã£ãŠéæãããããã«åªããŠããŸãã ã¢ã¯ã¿ãŒïŒãšãŒãžã§ã³ãïŒã«åºã¥ããŠã·ã¹ãã ãèšèšãããšãã«ãåãããšãèµ·ãããŸããåã¢ã¯ã¿ãŒãèªåã®ã¿ã¹ã¯ãæ
åœãããããã®çµã¿åãããéããŠãœãªã¥ãŒã·ã§ã³ãçå®ããŸãã
ãããã£ãŠãa_machine_tãšãŒãžã§ã³ãã¯1ã€ã®ã¿ã¹ã¯ã®ã¿ã解決ããŸããæ©åšãšã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããŸãïŒãã®äŸã§ã¯ããã®ã€ã³ã¿ãŒãã§ãŒã¹ãæš¡å£ããŸãïŒã å®éã®ã¿ã¹ã¯ã§ã¯ãa_machine_tã¯ããããã®èšå®/ãªã»ãããéä¿¡ããŒãã§ã®ãã€ãã®èªã¿åããšæžã蟌ã¿ãI / Oæäœã®æåã®ç¢ºèªãããŒã¿è»¢éé床ãã¿ã€ã ã¢ãŠããªã©ã®äœã¬ãã«ã®å¶åŸ¡ãè¡ããŸãã
ãããã£ãŠãa_machine_tã®ã¿ã¹ã¯ã¯ããããªãåŠçã«é©ããããã€ã¹ããæå³ã®ããæ
å ±ãååŸãããã®æ
å ±ã2éã®èª°ãã«äžããäžããããã€ã¹ã®ã³ãã³ããåãåãããã®ã³ãã³ããããã€ã¹ãçè§£ããäžé£ã®ã¢ã¯ã·ã§ã³ã«å€æããããšã§ãã ç¹å®ã®ã·ãã¥ã¬ãŒã·ã§ã³ã®å¶éã®ç¯å²ã§ãa_machine_tãè¡ãããšã
ãšãŒãžã§ã³ãa_total_status_dashboard_t
a_total_status_dashboard_tãšãŒãžã§ã³ãã¯machine_statusã¡ãã»ãŒãžãåéãããããã®ã¡ãã»ãŒãžããæ
å ±ãéçŽããéçŽãããæ
å ±ã宿çã«æšæºåºåã«ãããããå¿
èŠããããŸãã
ä»äºãå®äºããããã«ãa_total_status_dashboard_tã¯2ã€ã®ã¡ãã»ãŒãžããµãã¹ã¯ã©ã€ãããŸãã
virtual void so_define_agent() override { so_subscribe( m_status_distrib_mbox ) .event( &a_total_status_dashboard_t::evt_machine_status ); so_subscribe_self().event< show_dashboard >( &a_total_status_dashboard_t::evt_show_dashboard ); }
ãšãŒãžã§ã³ãã¯ãa_machine_tãšãŒãžã§ã³ããmachine_statusã¡ãã»ãŒãžãéä¿¡ããç¹å¥ãªã¡ãŒã«ããã¯ã¹ããã®æåã®ã¡ãã»ãŒãžmachine_statusãäºæããŸãã ãããŠã2çªç®ã®ã¡ãã»ãŒãžãshow_dashboardããšãŒãžã§ã³ãa_total_status_dashboard_tã¯ã宿çãªã¡ãã»ãŒãžã®åœ¢åŒã§èªåèªèº«ã«éä¿¡ããŸãã
virtual void so_evt_start() override {
ããã§ãa_total_status_dashboard_tã¯a_machine_tãšãŒãžã§ã³ããšåãã¢ãããŒãã䜿çšããŸãâ so_evt_startïŒïŒã¡ãœããã§å®æçãªã¡ãã»ãŒãžãéå§ããŸããSObjectizerã¯æåã«a_total_status_dashboard_tãèªåçã«åŒã³åºããŸãã
machine_statusã®åŠçã¯éåžžã«ç°¡åã§ããæ¬¡ã®ãããã®æ
å ±ã飿³ã³ã³ããã«ä¿åããã ãã§ãã
void evt_machine_status( const machine_status & status ) { m_machine_statuses[ status.m_id ] = one_machine_status_t{ status.m_engine_status, status.m_cooler_status, status.m_engine_temperature }; }
ãŸããshow_dashboardãã³ãã©ãŒã«ã¯è€éãªãã®ã¯äœãå«ãŸããŠããŸãããæšæºåºåã¹ããªãŒã ãžã®åºåã䜿çšããŠã飿³ã³ã³ãããŒã®å
容ãç¹°ãè¿ãåŠçããã ãã§ãã
void evt_show_dashboard() { auto old_precision = std::cout.precision( 5 ); std::cout << "=== The current status ===" << std::endl; for( const auto & m : m_machine_statuses ) { show_one_status( m ); } std::cout << "==========================" << std::endl; std::cout.precision( old_precision ); }
ãšãŒãžã§ã³ãa_total_status_dashboard_tã¯ããŸãé¢å¿ããªãããã®å®è£
ã¯éåžžã«åçŽãªã®ã§ããã以äžå®è£
ã«é²ã¿ãŸããã æ°ã«ãã人ã¯ãa_total_status_dashboard_tã®å®å
šãªãœãŒã¹ã³ãŒããããã§èŠãããšãã§ããŸã ã
ãšãŒãžã§ã³ãa_statuses_analyser_tããã³a_machine_controller_t
machine_controlã®äŸã®ãã®å®è£
ã§ã¯ãa_machine_tãšãŒãžã§ã³ãããã®æ
å ±ã®åæãšãã·ã³ãšãŒãžã§ã³ããžã®å¶åŸ¡ã³ãã³ãã®çºè¡ã«ããã€ãã®ãšãŒãžã§ã³ãã®æãé¢äžããŠããŸãã
ãŸãããšãŒãžã§ã³ãa_statuses_analyser_tã¯ãmachine_statusã¡ãã»ãŒãžãåä¿¡ããŠââåæããç¹å®ã®a_machine_tã«äœããã®åœ±é¿ãå¿
èŠã§ããããšã倿ããŸãã
次ã«ãa_machine_controller_tã¿ã€ãã®ãã³ãã¬ãŒããšãŒãžã§ã³ãã®ã°ã«ãŒãããããŸããããã¯ãa_statuses_analyser_tããã®ä¿¡å·ã«å¿çããç¹å®ã®ãã·ã³ã«ç¹å®ã®å¹æããããããŸãã ãããã£ãŠã1ã€ã®ãšãŒãžã§ã³ãa_machine_controlle_tã¯ãå·åŽãã¡ã³ããªã³ã«ããå¿
èŠãããç¶æ³ã«åå¿ãã察å¿ãããšãŒãžã§ã³ãa_machine_tã«turn_cooler_onã¡ãã»ãŒãžãéä¿¡ããŸãã å¥ã®a_machine_controller_tãšãŒãžã§ã³ãã¯ããšã³ãžã³ããªãã«ããå¿
èŠãããç¶æ³ã«å¿çããturn_engine_offã¡ãã»ãŒãžãéä¿¡ããŸãã ç
äžè¬çã«ããã®ãããªa_statuses_analyser_tãša_machine_controller_tã®åå²ã¯ããã®äŸã®æãããªè€éãã§ãã 1ã€ã®ãšãŒãžã§ã³ãa_statuses_analyser_tã ãã§å®å
šã«ç®¡çã§ããŸãããšãŒãžã§ã³ãa_statuses_analyser_tèªäœã¯ãæ
å ±ãåæããŠå¶åŸ¡ã³ãã³ããéä¿¡ã§ããŸãã ã»ãšãã©ã®å ŽåããšãŒãžã§ã³ãa_statuses_analyser_tã®ããªã¥ãŒã ã¯åæã«å€§å¹
ã«å¢å ããŸãã
åœåãmachaine_controlã¯ããŸããŸãªSObjectizeræ©èœãç¹ã«ãã³ãã¬ãŒããšãŒãžã§ã³ãã®äœ¿çšãšãšãŒãžã§ã³ãã®åªå
床ã衚瀺ãããã£ããããa_statuses_analyser_tãša_machine_controller_tã®éã§ããžãã¯ãåé¢ããããšã«ããŸããã
ãããã£ãŠãa_machine_tãa_statuses_analyser_tãa_machine_controller_tã®çžäºäœçšã®æ¬è³ªã¯æ¬¡ã®ãšããã§ãã
- a_machine_tã¯ãã¡ãã»ãŒãžmachine_statusã®åœ¢åŒã§èªèº«ã«é¢ããæ
å ±ã宿çã«éä¿¡ããŸãã
- a_statuses_analyser_tã¯machine_statusããæ
å ±ãåéããç¹å®ã®a_machine_tãžã®åœ±é¿ãå¿
èŠãã©ããã倿ããŸãã 圱é¿ãå¿
èŠãªå Žåãa_status_analyser_tã¯ãã©ã®ãã·ã³ã«ã©ã®åœ±é¿ãå¿
èŠãã«é¢ããæ
å ±ãå«ãã¡ãã»ãŒãžãmachine_needs_attentionã«éä¿¡ããŸãã
- a_machine_controller_tãšãŒãžã§ã³ãã¯machine_needs_attentionã¡ãã»ãŒãžã«å¿çããç¹å®ã®a_machine_tãšãŒãžã§ã³ãã®turn_engine_on / turn_engine_offããã³/ãŸãã¯turn_cooler_on / turn_cooler_offã¡ãã»ãŒãžãçæããŸãã

machine_needs_attentionã¡ãã»ãŒãžã¯æ¬¡ã®ããã«ãªããŸãã
a_statuses_analyser_tãšãŒãžã§ã³ãã¯ãåãã·ã³ã«é¢ããéå»ã®æ
å ±ãä¿åããmachine_statusã¡ãã»ãŒãžããã®æ°ããæ
å ±ãšæ¯èŒããŸãã ãšã³ãžã³ã®å·åŽãå¿
èŠã§ããããšãæ€åºãããå Žåããšã³ãžã³ãéç±ããå ŽåããŸãã¯ãšã³ãžã³ãå®å
šãªæž©åºŠã«éããå Žåãa_statuses_analyser_tã¯machine_needs_attentionã¡ãã»ãŒãžãçæããŸãã ãã®ã¡ãã»ãŒãžã¯ã察å¿ããa_machine_controller_tã«ãã£ãŠååŸãããå¿
èŠãªã³ãã³ããå¿
èŠãªa_machine_tãšãŒãžã§ã³ãã«éä¿¡ãããŸãã
ãšãŒãžã§ã³ãã®è©³çްa_statuses_analyser_t
ãšãŒãžã§ã³ãa_statuses_analyser_tã®å
èã¯éåžžã«èšå€§ã§ãã ãã ãããããã®ã»ãšãã©ã¯ããã·ã³ãšãŒãžã§ã³ãã®çŸåšã®ç¶æ
ã®ä¿åãšåæã«é¢é£ããŠããŸãã ãã®éšåã詳现ã«åæããããšã¯ããŸããïŒè³ªåãããã°ãã³ã¡ã³ãã§åçããŸãïŒãç°¡åã«èª¬æããŸãã
- agent a_statuses_analyser_tã¯ãåãã·ã³ãšãŒãžã§ã³ãã®æåŸã®æ¢ç¥ã®ã¹ããŒã¿ã¹ã«é¢ããæ
å ±ãå«ã飿³ã³ã³ãããæ ŒçŽããŸãã ãã®ã³ã³ããã®éµã¯ããã·ã³ã®äžæã®èå¥ååã§ãã
- 次ã®machine_statusã¡ãã»ãŒãžãåä¿¡ãããšããšãŒãžã§ã³ãã¯ä»¥åã«ä¿åããæ
å ±ã§ææ°ã®æ
å ±ã確èªããŸãã ãã·ã³ãšãŒãžã§ã³ããžã®é²åºãå¿
èŠãªç¶æ³ãèŠã€ãã£ãå Žåãmachine_needs_attentionã¡ãã»ãŒãžãçæãããŸãã
- ãã®åŸãa_statuses_analyser_tãšãŒãžã§ã³ãã¯ãé¢é£ããã³ã³ãããŒå
ã®ããŒã¿ãæŽæ°ããŸãã
ã³ãŒãã§ã¯ãããã«ã¯ããªãã®éã®è¡ãå¿
èŠã§ãããããã«ã¯è€éãªããšã¯äœããããŸããã
ãã ããSObjectizerãšã®å¯Ÿè©±ã«é¢é£ããa_statuses_analyser_tãšãŒãžã§ã³ãã®éšåã¯éåžžæå°éã§ããso_define_agentïŒïŒã®å¯äžã®ã¡ãã»ãŒãžãšãã®ã¡ãã»ãŒãžã®å¯äžã®ã€ãã³ãã«ãµãã¹ã¯ã©ã€ãããã ãã§ãã
virtual void so_define_agent() override { so_subscribe( m_status_distrib_mbox ).event( &a_statuses_analyzer_t::evt_machine_status ); } void evt_machine_status( const machine_status & status ) { auto it = m_last_infos.find( status.m_id ); if( it == m_last_infos.end() )
ããã§ãevt_machine_statusïŒïŒå
ã§åŒã³åºãããhandle_new_statusïŒïŒã¡ãœããã¯ãæ¢ã«ç°¡åã«èª¬æãããé©çšããããšãŒãžã§ã³ããã·ã³ã¹ããŒã¿ã¹å¶åŸ¡ããžãã¯ã®äžéšã§ãã
a_machine_controller_tãšãŒãžã§ã³ãã®è©³çް
äžè¬çã«a_machine_controller_tã®æå³ã¯äœã§ããïŒ
a_machine_controller_tãšãŒãžã§ã³ãã®ã€ã³ã¹ã¿ã³ã¹ãããã€ãæã€ããšã¯ãæ¬¡ã®æå³ããããŸããããšãã°ãa_statuses_analyser_tãšãŒãžã§ã³ãããè»ã®ãšã³ãžã³ãå®å
šãªæž©åºŠãŸã§å·åŽããããšå€æããå Žåãããã€ãã®ç°ãªãããšãè¡ãå¿
èŠããããŸãã ãŸããå·åŽãã¡ã³ããªãã«ããŸãã 第äºã«ããšã³ãžã³ã以åã«ã·ã£ãããªããããããšã倿ããå Žåããããå床ãªã³ã«ããå¿
èŠããããŸãã
ãã®ãã¹ãŠã®ããžãã¯ãa_statuses_analyser_tå
ã«é
眮ãããšãã³ãŒãã倧ãããªãããããããå°é£ã«ãªãããšãããããŸãã 代ããã«ãa_statuses_analyser_tã«ãã·ã³ãšãŒãžã§ã³ãã®æäœã§æ³šæãæãã¹ãå
容ã宣èšããããã«åŒ·å¶ããŸããã A_machine_controller_tãšãŒãžã§ã³ãã¯ãã§ã«ãã®ã¢ããŠã³ã¹ã«å¿çããŠããŸãã ãããŠãåa_machine_controller_tèªäœãå¿çããå¿
èŠããããã©ãããæ±ºå®ããŸãã å¿
èŠãªå Žåãa_machine_contoller_tã¯ã¡ãã»ãŒãžmachine_needs_attentionãåä¿¡ãããšãŒãžã§ã³ããã·ã³ã«å¯ŸããŠå¯Ÿå¿ããã³ãã³ããéå§ããŸãã å¿
èŠã§ãªãå Žåãa_machine_controller_t machine_needs_attentionã¯åã«ã¡ãã»ãŒãžãç¡èŠããŸãã
ãšãŒãžã§ã³ãa_machine_controller_t
ãã³ãã¬ãŒããšãŒãžã§ã³ãa_machine_controller_tã®ã³ãŒãã¯å°ãããããæäœããããããã«ããã®ãšãŒãžã§ã³ãã®ã³ãŒãå
šäœãå®å
šã«ç€ºããŸãã
template< class LOGIC > class a_machine_controller_t : public so_5::agent_t { public : a_machine_controller_t( context_t ctx, so_5::priority_t priority, so_5::mbox_t status_distrib_mbox, const machine_dictionary_t & machines ) : so_5::agent_t( ctx + priority ) , m_status_distrib_mbox( std::move( status_distrib_mbox ) ) , m_machines( machines ) , m_logic() {} virtual void so_define_agent() override { so_set_delivery_filter( m_status_distrib_mbox, [this]( const machine_needs_attention & msg ) { return m_logic.filter( msg ); } ); so_subscribe( m_status_distrib_mbox ) .event( [this]( const machine_needs_attention & evt ) { m_logic.action( m_machines, evt ); } ); } private : const so_5::mbox_t m_status_distrib_mbox; const machine_dictionary_t & m_machines; const LOGIC m_logic; };
ãããã£ãŠãããã¯ã1ã€ã®ãã©ã¡ãŒã¿ãŒïŒç¹å®ã®a_machine_controller_tãæã€ã¹ãã¢ããªã±ãŒã·ã§ã³ããžãã¯ã®ã¿ã€ãïŒã«ãã£ãŠãã©ã¡ãŒã¿ãŒåããããã³ãã¬ãŒãã¯ã©ã¹ã§ãã ãã®ã¿ã€ãã®LOGICã¯ã次ã®åœ¢åŒã®2ã€ã®ã¡ãœãããæã€ã¿ã€ãã§ãªããã°ãªããŸããã
struct LOGIC { bool filter( const machine_needs_attention & msg ) const; void action( const machine_dictionary_t & machines, const machine_needs_attention & evt ) const; };
C ++ 11ã«æŠå¿µããã£ãå Žåãa_machine_controller_tãã³ãã¬ãŒãã®ãã©ã¡ãŒã¿ãŒã«ãªãããã¿ã€ããšããã§ãªãã¿ã€ããå€å¥ããããããããã«ãé©åãªæŠå¿µã宣èšããããšãã§ããŸãã ãããããªããªã C ++ 11ã¯æŠå¿µããããããªãã£ããããã¢ãã«ã®ã¿ã€ãã³ã°ã«é Œããªããã°ãªããŸããã
a_machine_controller_tãšãŒãžã§ã³ãã¯ãå
éšã«LOGICã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããã®ãã¹ãŠã®ã¢ã¯ã·ã§ã³ããã®ã€ã³ã¹ã¿ã³ã¹ã«å§ä»»ããŸãã ãããŠããã®ã€ã³ã¹ã¿ã³ã¹ã¯ããšãŒãžã§ã³ããã·ã³ã«å¶åŸ¡ã¢ã¯ã·ã§ã³ãçºè¡ããã³ã³ãããŒã©ãŒã«ãããŸããã
ã³ã³ãããŒã©ãŒã«ã¯2ã€ã®ã¢ã¯ã·ã§ã³ã®ã¿ããããŸãã
ãŸããç¹å®ã®ã³ã³ãããŒã©ãŒã«ãšã£ãŠé¢å¿ã®ãªãã¡ãã»ãŒãžããã£ã«ã¿ãŒã§é€å€ããå¿
èŠããããŸãããããè¡ãããã«ãa_machine_controller_tã¯ã¡ãã»ãŒãžé
ä¿¡ãã£ã«ã¿ãŒãå²ãåœãŠãŸãã
so_set_delivery_filter( m_status_distrib_mbox, [this]( const machine_needs_attention & msg ) { return m_logic.filter( msg ); } );
é
ä¿¡ãã£ã«ã¿ãŒã¯ãSObjectizerã®ç¹å¥ãªã¡ã«ããºã ã§ãããšãŒãžã§ã³ããã¡ãŒã«ããã¯ã¹Mããã¿ã€ãTã®ç¹å®ã®ã¡ãã»ãŒãžããµãã¹ã¯ã©ã€ãããã¿ã€ãTã®ãã¹ãŠã®ã¡ãã»ãŒãžãåä¿¡ããã®ã§ã¯ãªãããšãŒãžã§ã³ãã«ãšã£ãŠè峿·±ãæ
å ±ãå«ãã¡ãã»ãŒãžã®ã¿ãåä¿¡ããå Žåã«å¿
èŠã§ãã
so_set_delivery_filter() , -, M , T. true, . false, , , .

. Subscriber-1 mbox-. Subscriber-2 , .
LOGIC::filter() , machine_needs_attention, .
-, - machine_needs_attention, , .
LOGIC::action(). a_machine_controller_t machine_needs_attention:
so_subscribe( m_status_distrib_mbox ) .event( [this]( const machine_needs_attention & evt ) { m_logic.action( m_machines, evt ); } );
controller-
, , a_machine_controller_t, . , turn_engine_off, :
struct engine_stopper_t { bool filter( const machine_needs_attention & msg ) const { return msg.m_attention == attention_t::engine_overheat_detected; } void action( const machine_dictionary_t & machines, const machine_needs_attention & evt ) const { so_5::send< turn_engine_off >( machines.find_mbox( evt.m_id ) ); } };
ããªãã¡ machine_needs_attention, . , - turn_engine_off.
:
struct cooler_starter_t { bool filter( const machine_needs_attention & msg ) const { return (msg.m_attention == attention_t::engine_overheat_detected || msg.m_attention == attention_t::engine_cooling_needed) && msg.m_cooler_status == cooler_state_t::off; } void action( const machine_dictionary_t & machines, const machine_needs_attention & evt ) const { so_5::send< turn_cooler_on >( machines.find_mbox( evt.m_id ) ); } };
. , , .
:
- engine_stopper_t ;
- engine_starter_t ;
- cooler_starter_t ;
- cooler_stopper_t .
, a_machine_controller_t â .
a_machine_controller_t
machine_control , machine_needs_attention . , machine_needs_attention attention_t::engine_overheat_detected cooler_status_t::off, : engine_stopper_t, cooler_starter_t.
, . , engine_overheat_detected turn_engine_off, turn_cooler_on. - , . , . , .
SObjectizer- ?
. , . , . . , , .
SObjectizer : , . so_5::disp::prio_one_thread::strictly_ordered. a_machine_controller_t .
- :
- engine_stopper_t, .. ;
- cooler_starter_t, â ;
- engine_starter_t;
- cooler_stopper_t.
, a_machine_controller_t :
a_machine_controller_t( ..., so_5::priority_t priority, ... ) : so_5::agent_t( ctx + priority ) , ... {}
:
coop.make_agent_with_binder< a_machine_controller_t< engine_stopper_t > >( disp->binder(), so_5::prio::p4, status_distrib_mbox, machines ); coop.make_agent_with_binder< a_machine_controller_t< cooler_starter_t > >( disp->binder(), so_5::prio::p3, status_distrib_mbox, machines );
so_5::prio::p4 so_5::prio::p3 â .
-
, a_machine_t st_engine_off, .. . , . , a_machine_t, a_machine_controller_t ?
, - -, turn_engine_on -.
, C++ , a_machine_t, a_total_status_dashboard_t, a_statuses_analyser_t a_machine_controller_t. , ad-hoc . ããªãã¡ , -. machine_control :
coop.define_agent().on_start( [&dict] { dict.for_each( []( const std::string &, const so_5::mbox_t & mbox ) { so_5::send< turn_engine_on >( mbox ); } ); } );
define_agent() ad-hoc , . ad-hoc SObjectizer-: turn_engine_on.
SObjectizer-, , .
. - . SObjectizer . , .
machine_control , :
- - , one_thread;
- a_total_status_dashboard_t ( one_thread);
- a_statuses_analyser_t ( one_thread);
- a_machine_controller_t prio_one_thread::strictly_ordered, ;
- - .

« »?
, , , : machine_dictionary . , - - .
, - ( machine_status machine_needs_attention) . SObjectizer , , , turn_engine_on, . machine_dictionary.
?
, , , .
, , , , a_machine_t a_machine_controller_t, .
SObjectizer-, ad-hoc â . , , - SObjectizer, , , , « ». -, , ping-pong , , . , SObjectizer.
, , . , , Actor Model Publish/Subscribe .
machine_control , (.. ) .
, a_machine_t machine_status , , . a_machine_t ( ) . , .
a_machine_t ( turn_engine_on), , . a_machine_t , . , â a_machine_t .
, - turn_engine_on a_machine_t, Actor Model, 1:1.
machine_status machine_needs_attention Actor Model, .. 1:N. Publish/Subscribe. , machine_status machine_needs_attention, . â - Publish. Subscribe, , , a_total_status_dashboard_t, a_statuses_analyser_t a_machine_controller_t so_define_agent().
, SObjectizer: . , SObjectizer multi-producer/multi-consumer , 1:N.
, machine_status, , , . a_total_status_dashboard_t machine_status . a_statuses_analyser_t machine_status a_machine_t.
. , . a_total_status_dashboard_t a_statuses_analyser_t. a_total_status_dashboard_t - a_gui_status_dashboard_t, std::cout, . , , , machine_status.
SObjectizer â , , . SObjectizer , ( CSP- ).
SObjectizer , , . (.. ), .
, . â . , . -, - , so_5::signal_t, . , - , - . , , - - .
çµè«ã®ä»£ããã«
, , .
, SObjectizer- so_5_extra , SObjectizer. , SObjectizer , , . so_5_extra , . - SObjectizer, . SObjectizer, so_5_extra.