/* * master_slave.c * * Created on: 13 íîÿá. 2024 ã. * Author: Evgeniy_Sokolov */ #include <edrk_main.h> #include <params.h> #include <params_alg.h> #include <params_norma.h> #include <params_pwm24.h> #include <params_temper_p.h> #include <project.h> #include "IQmathLib.h" #include "mathlib.h" #include <optical_bus.h> #include "synhro_tools.h" #include "master_slave.h" ////////////////////////////////////////////////////////// #pragma DATA_SECTION(buf_log_master_slave_status,".slow_vars"); unsigned int buf_log_master_slave_status[SIZE_LOG_MASTER_SLAVE_STATUS] = {0}; //AUTO_MASTER_SLAVE_DATA buf2[SIZE_BUF1] = {0}; //AUTO_MASTER_SLAVE_DATA buf3[SIZE_BUF1] = {0}; //OPTICAL_BUS_DATA_LOW_CMD buf4[SIZE_BUF1] = {0}; //OPTICAL_BUS_DATA_LOW_CMD buf5[SIZE_BUF1] = {0}; ////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// void auto_select_master_slave(void) { static unsigned int count_try_master = 0; static unsigned int count_wait_answer_confirm_mode = 0; static unsigned int count_wait_slave_try_master = 0; unsigned int err_confirm_mode = 0; // îøèáêà ïîäòâåðæäåíèÿ ðåæèìà äðóãèì Ï× static unsigned int c_buf_log_master_slave_status = 0, prev_status = 0; // logs master_slave_status if (edrk.auto_master_slave.status != prev_status) { c_buf_log_master_slave_status++; if (c_buf_log_master_slave_status>=SIZE_LOG_MASTER_SLAVE_STATUS) c_buf_log_master_slave_status = 0; buf_log_master_slave_status[c_buf_log_master_slave_status] = edrk.auto_master_slave.status; } prev_status = edrk.auto_master_slave.status; //end logs master_slave_status if (edrk.ms.ready2==0 && edrk.errors.e7.bits.AUTO_SET_MASTER==0) { edrk.auto_master_slave.remoute.all = 0; edrk.auto_master_slave.local.all = 0; edrk.auto_master_slave.prev_remoute.all = edrk.auto_master_slave.remoute.all; edrk.auto_master_slave.prev_local.all = edrk.auto_master_slave.local.all; edrk.auto_master_slave.status = 1; // if (prev_ready!=edrk.ms.ready2) // for (c_buf=0;c_buf<SIZE_BUF1;c_buf++) // { // buf2[c_buf].all = buf3[c_buf].all = buf1[c_buf] = buf4[c_buf].all = buf5[c_buf].all =0; // } // // c_buf = 0; // // prev_ready = edrk.ms.ready2; clear_wait_synhro_optical_bus(); return; } // else // prev_ready = edrk.ms.ready2; if (edrk.errors.e7.bits.AUTO_SET_MASTER) { edrk.to_second_pch.bits.MASTER = edrk.auto_master_slave.local.bits.master; edrk.auto_master_slave.local.bits.master = 0; edrk.auto_master_slave.local.bits.slave = 0; edrk.auto_master_slave.local.bits.try_master = 0; edrk.auto_master_slave.local.bits.try_slave = 0; edrk.auto_master_slave.local.bits.nothing = 1; // edrk.auto_master_slave.prev_remoute.all = edrk.auto_master_slave.remoute.all; // edrk.auto_master_slave.prev_local.all = edrk.auto_master_slave.local.all; // edrk.auto_master_slave.status = 10; return; } edrk.auto_master_slave.prev_status = edrk.auto_master_slave.status; // c_buf++; // if (c_buf>=SIZE_BUF1) // c_buf = 0; // // buf1[c_buf] = edrk.auto_master_slave.status; // buf2[c_buf].all = edrk.auto_master_slave.local.all; // buf3[c_buf].all = edrk.auto_master_slave.remoute.all; // buf4[c_buf].all = optical_read_data.data.cmd.all; // buf5[c_buf].all = optical_write_data.data.cmd.all; // // ñáðîñèì ñ÷åò÷èê âðåìåíè ïåðåõîäà íà ìàñòåð if (edrk.auto_master_slave.local.bits.try_master==0 || (edrk.auto_master_slave.prev_local.bits.try_master != edrk.auto_master_slave.local.bits.try_master && edrk.auto_master_slave.local.bits.try_master==1)) count_try_master = 0; // åñëè øèíà OPTICAL_BUS ñäîõëà, âûõîäèì if (edrk.errors.e7.bits.WRITE_OPTBUS==1 || edrk.errors.e7.bits.READ_OPTBUS==1 || edrk.warnings.e7.bits.WRITE_OPTBUS==1 || edrk.warnings.e7.bits.READ_OPTBUS==1) { if (edrk.errors.e7.bits.WRITE_OPTBUS==1 || edrk.errors.e7.bits.READ_OPTBUS==1) { // øèíà íå ðàáîòàåò, è òîò Ï× âêëþ÷åí // çíà÷èò ÷òî-òî ñëó÷èëîñü - âûêëþ÷àåìñÿ edrk.errors.e7.bits.AUTO_SET_MASTER |= 1; edrk.auto_master_slave.remoute.bits.nothing = 1; edrk.auto_master_slave.remoute.bits.master = 0; edrk.auto_master_slave.remoute.bits.slave = 0; edrk.auto_master_slave.remoute.bits.try_master = 0; edrk.auto_master_slave.remoute.bits.try_slave = 0; edrk.auto_master_slave.local.bits.master = 0; edrk.auto_master_slave.local.bits.slave = 0; edrk.auto_master_slave.local.bits.try_master = 0; edrk.auto_master_slave.local.bits.try_slave = 0; edrk.auto_master_slave.local.bits.nothing = 1; edrk.auto_master_slave.status = 10; } else { // øèíà íå ðàáîòàåò, è òîò Ï× âûêëþ÷åí // çíà÷èò ìû ñðàçó ìàñòåð edrk.warnings.e7.bits.AUTO_SET_MASTER = 1; edrk.auto_master_slave.remoute.bits.nothing = 1; edrk.auto_master_slave.remoute.bits.master = 0; edrk.auto_master_slave.remoute.bits.slave = 0; edrk.auto_master_slave.remoute.bits.try_master = 0; edrk.auto_master_slave.remoute.bits.try_slave = 0; edrk.auto_master_slave.local.bits.master = 1; edrk.auto_master_slave.local.bits.slave = 0; edrk.auto_master_slave.local.bits.try_master = 0; edrk.auto_master_slave.local.bits.try_slave = 0; edrk.auto_master_slave.local.bits.nothing = 1; edrk.auto_master_slave.status = 2; } edrk.auto_master_slave.remoute.bits.sync_line_detect = 0; edrk.auto_master_slave.remoute.bits.bus_off = 1; edrk.auto_master_slave.remoute.bits.sync1_2 = 0; } else { edrk.warnings.e7.bits.AUTO_SET_MASTER = 0; edrk.auto_master_slave.remoute.bits.bus_off = 0; // ñèíõðîíèçèðóåì ñâîè ïðîãðàììû ÷åðåç OPTICAL_BUS if (wait_synhro_optical_bus()==1) { edrk.auto_master_slave.status = 50; // wait synhro } else { edrk.auto_master_slave.remoute.bits.master = optical_read_data.data.cmd.bit.master; edrk.auto_master_slave.remoute.bits.slave = optical_read_data.data.cmd.bit.slave; edrk.auto_master_slave.remoute.bits.try_master = optical_read_data.data.cmd.bit.maybe_master; edrk.auto_master_slave.remoute.bits.sync1_2 = optical_read_data.data.cmd.bit.sync_1_2; edrk.auto_master_slave.remoute.bits.sync_line_detect = optical_read_data.data.cmd.bit.sync_line_detect; edrk.auto_master_slave.remoute.bits.tick = optical_read_data.data.cmd.bit.wdog_tick; if (optical_read_data.data.cmd.bit.master==0 && optical_read_data.data.cmd.bit.slave==0) edrk.auto_master_slave.remoute.bits.nothing = 1; ////////////////////////////////////////////////// ////////////////////////////////////////////////// // 1 // òîò Ï× óæå ìàñòåð if (edrk.auto_master_slave.remoute.bits.master) { // è ýòîò Ï× ìàñòåð ïî÷åìó-òî? if (edrk.auto_master_slave.local.bits.master) { edrk.errors.e7.bits.AUTO_SET_MASTER |= 1; edrk.auto_master_slave.status = 3; } else { // ýòîò Ï× åùå íå îïðåäåëèëñÿ, ïîýòîìó ïåðåõîä íà slave if (edrk.auto_master_slave.local.bits.master==0 && edrk.auto_master_slave.local.bits.slave==0) { // edrk.auto_master_slave.local.bits.try_slave = 1; // ñòàëè slave edrk.auto_master_slave.local.bits.slave = 1; // ñíÿëè ñâîé çàïðîñ íà ìàñòåðà åñëè îí áûë edrk.auto_master_slave.local.bits.try_master = 0; edrk.auto_master_slave.status = 4; } else { edrk.auto_master_slave.status = 21; } } } else ////////////////////////////////////////////////// ////////////////////////////////////////////////// // 2 // òîò Ï× óæå slave if (edrk.auto_master_slave.remoute.bits.slave) { // è ýòîò Ï× slave ïî÷åìó-òî? if (edrk.auto_master_slave.local.bits.slave) { // áûë ïåðåõîä èç ìàñòåð â slave if (edrk.auto_master_slave.prev_remoute.bits.slave==0) { if (edrk.Go) { // çàïóùåí ØÈÌ edrk.errors.e7.bits.AUTO_SET_MASTER |= 1; edrk.auto_master_slave.status = 5; } else { // ïðîáóåì ïåðåõâàòèòü master edrk.auto_master_slave.local.bits.try_master = 1; edrk.auto_master_slave.status = 6; } } else { edrk.errors.e7.bits.AUTO_SET_MASTER |= 1; edrk.auto_master_slave.status = 7; } } else { // ýòîò Ï× åùå íå îïðåäåëèëñÿ, ïîýòîìó çàïðàøèâàåò íà master if (edrk.auto_master_slave.local.bits.master==0 && edrk.auto_master_slave.local.bits.slave==0 && edrk.auto_master_slave.local.bits.try_master==0) { if (edrk.flag_second_PCH==0) edrk.auto_master_slave.local.bits.try_master = 1; if (edrk.flag_second_PCH==1) edrk.auto_master_slave.local.bits.try_master = 1; edrk.auto_master_slave.status = 8; // edrk.auto_master_slave.local.bits.slave = 1; } else // ýòîò Ï× óæå â çàïðîñå íà ìàñòåð, à òîò Ï× ïîäòâåðäèë â slave ÷òî îí íå ïðîòèâ. if (edrk.auto_master_slave.local.bits.master==0 && edrk.auto_master_slave.local.bits.slave==0 && edrk.auto_master_slave.local.bits.try_master==1) { // ñòàëè ìàñòåðîì edrk.auto_master_slave.local.bits.master = 1; edrk.auto_master_slave.local.bits.try_master = 0; edrk.auto_master_slave.status = 9; // edrk.auto_master_slave.local.bits.slave = 1; } else { edrk.auto_master_slave.status = 22; } } } else ////////////////////////////////////////////////// ////////////////////////////////////////////////// // 3 // òîò Ï× çàïðàøèâàåò ïåðåõîä íà ìàñòåð if (edrk.auto_master_slave.remoute.bits.master==0 && edrk.auto_master_slave.remoute.bits.slave==0 && edrk.auto_master_slave.remoute.bits.try_master) { // à ýòîò Ï× slave if (edrk.auto_master_slave.local.bits.slave) { // âðîäå íå íîðì, îñòàåìñÿ slave // òóò íàäî ïîäîæäàòü íåêîòðîå âðåìÿ, ïîêà òîò Ï× íå ïîéìåò ÷òî ìû ñòàëè ñëåéâîì è ïåðåéäåò èç try_master â ìàñòåð if (count_wait_slave_try_master<MAX_COUNT_WAIT_SLAVE_TRY_MASTER) count_wait_slave_try_master++; else { edrk.auto_master_slave.status = 10; edrk.errors.e7.bits.AUTO_SET_MASTER |= 1; } } else // à ýòîò Ï× master if (edrk.auto_master_slave.local.bits.master) { // òóò ìû äîëæíû ïðèíÿòü ðåøåíèå îòäàâàòü ëè ñâîé ìàñòåð äðóãîìó Ï×? // ïîêà âûñòàâèì îøèáêó edrk.errors.e7.bits.AUTO_SET_MASTER |= 1; edrk.auto_master_slave.status = 11; } else // ýòîò Ï× íå ìàñòåð è íå ñëåéâ è íåò çàïðîñîâ îò íåãî íà ìàñòåð if (edrk.auto_master_slave.local.bits.master==0 && edrk.auto_master_slave.local.bits.slave==0 && edrk.auto_master_slave.local.bits.try_master==0) { // ñòàíîâèìñÿ slave edrk.auto_master_slave.local.bits.slave = 1; edrk.auto_master_slave.status = 12; count_wait_slave_try_master = 0; // îáíóëèì ñ÷åò÷èê, ò.ê. íàñ íàäî ÷òîá òîò Ï× ïîíÿë ÷òî ìû ñòàëè slave } else // ýòîò Ï× íå ìàñòåð è íå ñëåéâ è åñòü çàïðîñ îò íåãî íà ìàñòåð, ò.å. îáà Ï× õîòÿò áûòü ìàñòåðàìè if (edrk.auto_master_slave.local.bits.master==0 && edrk.auto_master_slave.local.bits.slave==0 && edrk.auto_master_slave.local.bits.try_master==1) { // ñòàíîâèìñÿ master ÷åðåç íåêîòîðîå âðåìÿ (äëÿ êàæäîãî Ï× âðåìÿ ðàçíîå) if (edrk.flag_second_PCH==0) { //îáà õîòÿò, íî ïðèîòðèòåò äàåì âñåãäà ïåðâîìó edrk.auto_master_slave.local.bits.master = 1; edrk.auto_master_slave.local.bits.try_master = 0; // if (count_try_master<MAX_COUNT_TRY_MASTER_BS1) // count_try_master++; // else // edrk.auto_master_slave.local.bits.master = 1; } if (edrk.flag_second_PCH==1) { //îáà õîòÿò, íî ïðèîòðèòåò äàåì âñåãäà ïåðâîìó edrk.auto_master_slave.local.bits.slave = 1; edrk.auto_master_slave.local.bits.try_master = 0; // if (count_try_master<MAX_COUNT_TRY_MASTER_BS2) // count_try_master++; // else // edrk.auto_master_slave.local.bits.master = 1; } edrk.auto_master_slave.status = 13; } else { edrk.errors.e7.bits.AUTO_SET_MASTER |= 1; edrk.auto_master_slave.status = 100; } } else ////////////////////////////////////////////////// ////////////////////////////////////////////////// // 4 // ýòîò Ï× çàïðàøèâàåò ïåðåõîä íà ìàñòåð if (edrk.auto_master_slave.local.bits.master==0 && edrk.auto_master_slave.local.bits.slave==0 && edrk.auto_master_slave.local.bits.try_master) { // ñòàíîâèìñÿ master ÷åðåç íåêîòîðîå âðåìÿ (äëÿ êàæäîãî Ï× âðåìÿ ðàçíîå) if (edrk.flag_second_PCH==0) { if (count_try_master<MAX_COUNT_TRY_MASTER_BS1) { count_try_master++; edrk.auto_master_slave.status = 14; } else { edrk.auto_master_slave.local.bits.master = 1; edrk.auto_master_slave.local.bits.try_master = 0; edrk.auto_master_slave.status = 15; } } if (edrk.flag_second_PCH==1) { if (count_try_master<MAX_COUNT_TRY_MASTER_BS2) { count_try_master++; edrk.auto_master_slave.status = 14; } else { edrk.auto_master_slave.local.bits.master = 1; edrk.auto_master_slave.local.bits.try_master = 0; edrk.auto_master_slave.status = 15; } } } else ////////////////////////////////////////////////// ////////////////////////////////////////////////// // 5 // òîò Ï× íè÷åãî íå äåëàåò if (edrk.auto_master_slave.remoute.bits.master==0 && edrk.auto_master_slave.remoute.bits.slave==0 && edrk.auto_master_slave.remoute.bits.try_master==0) { // à ýòîò Ï× slave if (edrk.auto_master_slave.local.bits.slave) { // áûëè â ñëåéâå, à òîò Ï× ïî÷åìó-òî ïîòåðÿë ðåæèì - îøèáêà èëè ïîïûòêà çàõâàòà ìàñòåðà! if (edrk.auto_master_slave.prev_remoute.bits.master) { if (edrk.Go) // ïðè ØÈÌå âûðóáàåìñÿ. { edrk.errors.e7.bits.AUTO_SET_MASTER |= 1; edrk.auto_master_slave.status = 24; } else { // à òóò âñå îê. edrk.auto_master_slave.local.bits.slave = 0; edrk.auto_master_slave.local.bits.master = 1; edrk.auto_master_slave.status = 23; } } else { edrk.errors.e7.bits.AUTO_SET_MASTER |= 1; edrk.auto_master_slave.status = 16; } } else // à ýòîò Ï× master if (edrk.auto_master_slave.local.bits.master) { // òóò ìû îñòåìñÿ ìàñòåðîì âðîäå? // íî òîò Ï× íå ïîäòâåðäèë ïåðåõîä, îí äîëæåí ñòàòü ìàñòåðîì èëè ñëåéâîì err_confirm_mode = 0; // filter_err_count(&count_wait_answer_confirm_mode, // MAX_COUNT_WAIT_ANSWER_CONFIRM_MODE, // 1, // 0); if (err_confirm_mode) { // ìû ìàñòåð, íî òîò Ï× òàê è íå ïîíÿë ýòî edrk.errors.e7.bits.AUTO_SET_MASTER |= 1; edrk.auto_master_slave.status = 20; } else edrk.auto_master_slave.status = 17; } else { // òóò ïûòàåìñÿ çàõâàòèòü ìàñòåð if (edrk.flag_second_PCH==0) edrk.auto_master_slave.local.bits.try_master = 1; if (edrk.flag_second_PCH==1) edrk.auto_master_slave.local.bits.try_master = 1; edrk.auto_master_slave.status = 18; } } else ////////////////////////////////////////////////// ////////////////////////////////////////////////// // 5 // { // ÷òî-òî ïîøëî íå òàê edrk.errors.e7.bits.AUTO_SET_MASTER |= 1; edrk.auto_master_slave.status = 19; } ////////////////////////////////////////////////// ////////////////////////////////////////////////// // 6 // ////////////////////////////////////////////////// ////////////////////////////////////////////////// // 7 // ////////////////////////////////////////////////// ////////////////////////////////////////////////// // 8 // } } // optical_write_data.cmd.bit. = edrk.auto_master_slave.local.bits.slave; edrk.to_second_pch.bits.MASTER = edrk.auto_master_slave.local.bits.master; edrk.auto_master_slave.prev_remoute.all = edrk.auto_master_slave.remoute.all; edrk.auto_master_slave.prev_local.all = edrk.auto_master_slave.local.all; } ////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// void clear_errors_master_slave(void) { // if (edrk.errors.e7.bits.AUTO_SET_MASTER) { // if (edrk.errors.e7.bits.MASTER_SLAVE_SYNC // || edrk.errors.e1.bits.NO_INPUT_SYNC_SIGNAL) // edrk.ms.count_time_wait_ready1 = 0; edrk.ms.count_time_wait_ready2 = 0; edrk.ms.errors_count.alive_can_to_another_bs = 0; edrk.ms.errors_count.alive_opt_bus_read = 0; edrk.ms.errors_count.alive_opt_bus_write = 0; edrk.ms.errors_count.alive_sync_line = 0; edrk.ms.errors_count.alive_sync_line_local = 0; edrk.ms.errors_count.another_rascepitel = 0; edrk.ms.errors_count.fast_optical_alarm = 0; edrk.ms.errors_count.input_alarm_another_bs = 0; edrk.ms.errors_count.input_master_slave = 0; edrk.ms.err_lock_signals.alive_can_to_another_bs = 0; edrk.ms.err_lock_signals.alive_opt_bus_read = 0; edrk.ms.err_lock_signals.alive_opt_bus_write = 0; edrk.ms.err_lock_signals.alive_sync_line = 0; edrk.ms.err_lock_signals.alive_sync_line_local = 0; edrk.ms.err_lock_signals.another_rascepitel = 0; edrk.ms.err_lock_signals.fast_optical_alarm = 0; edrk.ms.err_lock_signals.input_alarm_another_bs = 0; edrk.ms.err_lock_signals.input_master_slave = 0; } } //////////////////////////////////////////////////////////