matlab_23550/Inu/Src2/main/master_slave.c

587 lines
22 KiB
C

/*
* 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;
}
}
//////////////////////////////////////////////////////////