#include <281xEvTimersInit.h> #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "edrk_main.h" #include "mathlib.h" //#include "modbus_fill_table.h" #include "big_dsp_module.h" #include "control_station.h" #include "CAN_Setup.h" #include "global_time.h" #include "global_time.h" #include "IQmathLib.h" #include "mathlib.h" #include "mathlib.h" #include "modbus_table_v2.h" #include "oscil_can.h" #include "DSP281x_Examples.h" // DSP281x Examples Include File #include "DSP281x_SWPrioritizedIsrLevels.h" // DSP281x Examples Include File #include "DSP281x_Device.h" #include "alg_pll.h" #include "vector_control.h" #include "CRC_Functions.h" #include "RS_Functions.h" #include "xp_project.h" #include "sbor_shema.h" #include "alarm_log_can.h" #include "pwm_test_lines.h" /////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////// #pragma DATA_SECTION(Unites2VPU, ".slow_vars") int Unites2VPU[127]={0}; #pragma DATA_SECTION(Unites2Zadat4ik, ".slow_vars") int Unites2Zadat4ik[127]={0}; #pragma DATA_SECTION(Unites2BKSSD, ".slow_vars") int Unites2BKSSD[127]={0}; #pragma DATA_SECTION(Unites2UMU, ".slow_vars") int Unites2UMU[127]={0}; #pragma DATA_SECTION(f, ".slow_vars") FLAG f = FLAG_DEFAULTS; int cur1=0; int cur2=0; unsigned int old_time_edrk1 = 0, old_time_edrk2 = 0, prev_flag_special_mode_rs = 0; #pragma DATA_SECTION(edrk, ".slow_vars") EDRK edrk = EDRK_DEFAULT; #pragma DATA_SECTION(pll1, ".slow_vars") PLL_REC pll1 = PLL_REC_DEFAULT; #define U_LEVEL_ON_BLOCK_KEY 559240 // 100V #define U_LEVEL_OFF_BLOCK_KEY 279620 // 50V #define TEMPER_NAGREF_ON 5 #define TEMPER_NAGREF_OFF 10 int vozb_on_off=0; int vozb_plus=0; int vozb_minus=0; #define MAX_TIME_SBOR 100 #define MAX_TIME_RAZBOR 100 #define VOZB_MAX_TIMER_ON 20 #define VOZB_MAX_TIMER_OFF 20 #define QTV_MAX_TIMER_ON 20 #define QTV_MAX_TIMER_OFF 20 #define VOZB_ACP_IN project.adc[0].read.pbus.adc_value[2] #define ING_ACP_IN_CUR_OBOROT project.adc[0].read.pbus.adc_value[0] #define ING_ACP_IN_ZAD_VOZB project.adc[0].read.pbus.adc_value[1] //#define DEC_ZAD_OBOROTS 1 //#define INC_ZAD_OBOROTS 1 //#define MAX_ZAD_OBOROTS 150 //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // задание оборотов от Задатчика PLUS, MINUS // если выбран нужный режим //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// void set_oborots_from_zadat4ik(void) { static unsigned int old_time_edrk3 = 0, prev_PROVOROT; if (!(detect_pause_milisec(100,&old_time_edrk3))) return; // if (edrk.from_shema.bits.SVU) return; // if (edrk.from_shema.bits.ZADA_DISPLAY) return; // // // if (control_station.active_control_station[CONTROL_STATION_ZADATCHIK_CAN]) // { // // if (edrk.from_zadat4ik.bits.MINUS) // { // if (edrk.W_from_ZADAT4IK>0) // edrk.W_from_ZADAT4IK=edrk.W_from_ZADAT4IK-DEC_ZAD_OBOROTS; // if (edrk.W_from_ZADAT4IK<0) // edrk.W_from_ZADAT4IK=0; // } // // if (edrk.from_zadat4ik.bits.PLUS) // { // if (edrk.W_from_ZADAT4IK=MAX_ZAD_OBOROTS) // edrk.W_from_ZADAT4IK=MAX_ZAD_OBOROTS; // } // // // if (edrk.from_zadat4ik.bits.PROVOROT) // { // edrk.W_from_ZADAT4IK = 3; // } // // if ((edrk.from_zadat4ik.bits.PROVOROT==0) && (prev_PROVOROT==1)) // edrk.W_from_ZADAT4IK = 0; // // prev_PROVOROT = edrk.from_zadat4ik.bits.PROVOROT; // } // // if (control_station.active_control_station[CONTROL_STATION_VPU_CAN]) // { // // if (edrk.from_vpu.bits.MINUS) // { // if (edrk.W_from_VPU>0) // edrk.W_from_VPU=edrk.W_from_VPU-DEC_ZAD_OBOROTS; // if (edrk.W_from_VPU<0) // edrk.W_from_VPU=0; // } // // if (edrk.from_vpu.bits.PLUS) // { // if (edrk.W_from_VPU=MAX_ZAD_OBOROTS) // edrk.W_from_VPU=MAX_ZAD_OBOROTS; // } // // // if (edrk.from_vpu.bits.PROVOROT) // { // edrk.W_from_VPU = 3; // } // // if ((edrk.from_vpu.bits.PROVOROT==0) && (prev_PROVOROT==1)) // edrk.W_from_VPU = 0; // // prev_PROVOROT = edrk.from_vpu.bits.PROVOROT; // } } //////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// //TODO: may be move to detect_errors.c unsigned int pause_detect_error(unsigned int *c_err, unsigned int max_wait,unsigned int flag) { if (flag) { if ((*c_err)>=max_wait) { return 1; } else { (*c_err)++; return 0; } } else { (*c_err) = 0; return 0; } } void update_ukss_setup(unsigned int pause) { static unsigned int old_time_ukss1=0; int real_mbox; Unites2Zadat4ik[96] = 25; Unites2Zadat4ik[97] = 100; Unites2Zadat4ik[98] = 8; Unites2VPU[96] = 25; Unites2VPU[97] = 100; Unites2VPU[98] = 8; Unites2UMU[96] = 25; Unites2UMU[97] = 100; Unites2UMU[98] = 8; Unites2BKSSD[96] = 25; Unites2BKSSD[97] = 100; Unites2BKSSD[98] = 8; if (detect_pause_milisec(pause,&old_time_ukss1)) { real_mbox = get_real_out_mbox (UNITS_TYPE_BOX, ZADATCHIK_CAN); if (CAN_cycle_free(real_mbox)) { CAN_cycle_send( UNITS_TYPE_BOX, ZADATCHIK_CAN, 96, &Unites2Zadat4ik[96], 3, CAN_BOX_STANDART_ADR, CAN_BOX_PRIORITY_NORMAL);// примерно 40 мсек. идет отправка всей посылки } real_mbox = get_real_out_mbox (UNITS_TYPE_BOX, VPU_CAN); if (CAN_cycle_free(real_mbox)) { CAN_cycle_send( UNITS_TYPE_BOX, VPU_CAN, 96, &Unites2VPU[96], 3, CAN_BOX_STANDART_ADR, CAN_BOX_PRIORITY_NORMAL);// примерно 40 мсек. идет отправка всей посылки } real_mbox = get_real_out_mbox (UNITS_TYPE_BOX, UMU_CAN_DEVICE); if (CAN_cycle_free(real_mbox)) { CAN_cycle_send( UNITS_TYPE_BOX, UMU_CAN_DEVICE, 96, &Unites2UMU[96], 3, CAN_BOX_STANDART_ADR, CAN_BOX_PRIORITY_NORMAL);// примерно 40 мсек. идет отправка всей посылки } real_mbox = get_real_out_mbox (UNITS_TYPE_BOX, BKSSD_CAN_DEVICE); if (CAN_cycle_free(real_mbox)) { CAN_cycle_send( UNITS_TYPE_BOX, BKSSD_CAN_DEVICE, 96, &Unites2BKSSD[96], 3, CAN_BOX_STANDART_ADR, CAN_BOX_PRIORITY_NORMAL);// примерно 40 мсек. идет отправка всей посылки } } } //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // обновлЯем задатчик и ВПУ //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// void update_ukss_can(unsigned int pause) { int real_mbox; int t1; static unsigned int old_time_ukss2=0; if (edrk.flag_second_PCH==0) t1 = pause; if (edrk.flag_second_PCH==1) t1 = pause; Unites2Zadat4ik[4] = edrk.to_zadat4ik.OBOROTS1.all; Unites2Zadat4ik[5] = edrk.to_zadat4ik.OBOROTS2.all; Unites2Zadat4ik[6] = edrk.to_zadat4ik.BIG_LAMS.all; Unites2Zadat4ik[7] = edrk.to_zadat4ik.APL_LAMS0.all; Unites2Zadat4ik[8] = 0; Unites2VPU[4] = edrk.to_vpu.OBOROTS1.all; Unites2VPU[5] = edrk.to_vpu.OBOROTS2.all; Unites2VPU[6] = edrk.to_vpu.BIG_LAMS.all; Unites2VPU[7] = 0; Unites2VPU[8] = 0; if (detect_pause_milisec(t1,&old_time_ukss2)) { // real_mbox = get_real_out_mbox(UNITS_TYPE_BOX, ZADATCHIK_CAN); real_mbox = get_real_out_mbox (UNITS_TYPE_BOX, ZADATCHIK_CAN); if (CAN_cycle_full_free(real_mbox,CAN_BOX_STAT_ON)) { if (edrk.flag_second_PCH==0) CAN_cycle_send( UNITS_TYPE_BOX, ZADATCHIK_CAN, 4, &Unites2Zadat4ik[4], 5, CAN_BOX_STANDART_ADR, CAN_BOX_PRIORITY_NORMAL);// примерно 40 мсек. идет отправка всей посылки else CAN_cycle_send( UNITS_TYPE_BOX, ZADATCHIK_CAN, 0xa, &Unites2Zadat4ik[4], 5, CAN_BOX_STANDART_ADR, CAN_BOX_PRIORITY_NORMAL);// примерно 40 мсек. идет отправка всей посылки } // // // if (CAN_FIFO_free(5)) // { // if (edrk.flag_second_PCH==0) // { // // CAN_word_send(UNITS_TYPE_BOX, ZADATCHIK_CAN, 0x4, edrk.to_zadat4ik.OBOROTS1.all); // CAN_word_send(UNITS_TYPE_BOX, ZADATCHIK_CAN, 0x5, edrk.to_zadat4ik.OBOROTS2.all); // // CAN_word_send(UNITS_TYPE_BOX, ZADATCHIK_CAN, 0x6, edrk.to_zadat4ik.BIG_LAMS.all); // CAN_word_send(UNITS_TYPE_BOX, ZADATCHIK_CAN, 0x7, edrk.to_zadat4ik.APL_LAMS0.all); // CAN_word_send(UNITS_TYPE_BOX, ZADATCHIK_CAN, 0x8, 0); // // } // else // { // // CAN_word_send(UNITS_TYPE_BOX, ZADATCHIK_CAN, 0xa, edrk.to_zadat4ik.OBOROTS1.all); // CAN_word_send(UNITS_TYPE_BOX, ZADATCHIK_CAN, 0xb, edrk.to_zadat4ik.OBOROTS2.all); // // CAN_word_send(UNITS_TYPE_BOX, ZADATCHIK_CAN, 0xc, edrk.to_zadat4ik.BIG_LAMS.all); // CAN_word_send(UNITS_TYPE_BOX, ZADATCHIK_CAN, 0xd, edrk.to_zadat4ik.APL_LAMS0.all); // CAN_word_send(UNITS_TYPE_BOX, ZADATCHIK_CAN, 0xe, 0); // // } // // } // real_mbox = get_real_out_mbox(UNITS_TYPE_BOX, VPU_CAN); real_mbox = get_real_out_mbox (UNITS_TYPE_BOX, VPU_CAN); if (CAN_cycle_full_free(real_mbox,CAN_BOX_STAT_ON)) { if (edrk.flag_second_PCH==0) CAN_cycle_send( UNITS_TYPE_BOX, VPU_CAN, 4, &Unites2VPU[4], 4, CAN_BOX_STANDART_ADR, CAN_BOX_PRIORITY_NORMAL);// примерно 40 мсек. идет отправка всей посылки else CAN_cycle_send( UNITS_TYPE_BOX, VPU_CAN, 0xa, &Unites2VPU[4], 4, CAN_BOX_STANDART_ADR, CAN_BOX_PRIORITY_NORMAL);// примерно 40 мсек. идет отправка всей посылки } // if (CAN_FIFO_free(3)) // { // if (edrk.flag_second_PCH==0) // { // CAN_word_send(UNITS_TYPE_BOX, VPU_CAN, 0x4, edrk.to_vpu.OBOROTS1.all); // CAN_word_send(UNITS_TYPE_BOX, VPU_CAN, 0x5, edrk.to_vpu.OBOROTS2.all); // CAN_word_send(UNITS_TYPE_BOX, VPU_CAN, 0x6, edrk.to_vpu.BIG_LAMS.all); // CAN_word_send(UNITS_TYPE_BOX, VPU_CAN, 0x8, 0); // } // else // { // CAN_word_send(UNITS_TYPE_BOX, VPU_CAN, 0xa, edrk.to_vpu.OBOROTS1.all); // CAN_word_send(UNITS_TYPE_BOX, VPU_CAN, 0xb, edrk.to_vpu.OBOROTS2.all); // CAN_word_send(UNITS_TYPE_BOX, VPU_CAN, 0xc, edrk.to_vpu.BIG_LAMS.all); // CAN_word_send(UNITS_TYPE_BOX, VPU_CAN, 0xe, 0); // } // // } // CAN_word_send(UNITS_TYPE_BOX, ZADATCHIK, 0x4, edrk.to_zadat4ik.APL_LAMS1.all); } } //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // спец настройки для межблочного обмена БС1 БС2 по CAN //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// void init_can_box_between_bs1_bs2(void) { // включаем реверс адресов только для одного БС // имитируем ящик Unites какбы // if (edrk.flag_second_PCH==0) { unites_can_setup.revers_box[ANOTHER_BSU1_CAN_DEVICE] = 1; } unites_can_setup.adr_detect_refresh[ZADATCHIK_CAN] = 16; } //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // обновлЯем другой БСУ по CAN //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// void update_bsu_can(unsigned int pause) { int real_mbox; int t1; // if (edrk.flag_second_PCH==0) // t1 = 125; // if (edrk.flag_second_PCH==1) // t1 = 150; SendAll2SecondBS(pause); } //////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// unsigned int counter_imit_rascepitel = 0; unsigned int imit_signals_rascepitel(unsigned int *counter, unsigned int max_pause, unsigned int s, unsigned int cmd_clear) { if (cmd_clear==1) { (*counter) = 0; return 0; } if (s) { if ((*counter)>=max_pause) return 1; else (*counter)++; return 0; } if (s==0) { if ((*counter)==0) return 0; else (*counter)--; return 1; } return 0; } ////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // считываем цифровые входы //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// #define RASCEPITEL_MANUAL_ALWAYS_ON_2 1//1 #define TIME_ON_OFF_FOR_IMITATION_RASCEPITEL 50 // 5 сек. void update_input_edrk(void) { static unsigned int flag_imit_rascepitel = 0; static int st1=0; // ANOTHER PCH edrk.from_second_pch.bits.RASCEPITEL = !FROM_ING_ANOTHER_RASCEPITEL; edrk.from_second_pch.bits.MASTER = FROM_ING_ANOTHER_MASTER_PCH; // ZADAT4IK if (control_station.alive_control_station[CONTROL_STATION_ZADATCHIK_CAN]) edrk.from_zadat4ik.all = Unites[ZADATCHIK_CAN][16]; else edrk.from_zadat4ik.all = 0; if (control_station.alive_control_station[CONTROL_STATION_VPU_CAN]) edrk.from_vpu.all = Unites[VPU_CAN][16]; else edrk.from_vpu.all = 0; // ING #if (_FLOOR6==1) if (st1==0) { edrk.from_ing1.bits.ALL_KNOPKA_AVARIA = 0;//!FROM_ALL_KNOPKA_AVARIA; edrk.from_ing1.bits.BLOCK_IZOL_AVARIA = 0;//!FROM_ING_BLOCK_IZOL_AVARIA; edrk.from_ing1.bits.BLOCK_IZOL_NORMA = 1;//!FROM_ING_BLOCK_IZOL_NORMA; edrk.from_ing1.bits.LOCAL_REMOUTE = 0;//!FROM_ING_LOCAL_REMOUTE; edrk.from_ing1.bits.NAGREV_ON = 1;//!FROM_ING_NAGREV_ON; edrk.from_ing1.bits.NASOS_NORMA = 1;//!FROM_ING_NASOS_NORMA; edrk.from_ing1.bits.NASOS_ON = 0;//!FROM_ING_NASOS_ON; edrk.from_ing1.bits.OHLAD_UTE4KA_WATER = 0;//!FROM_ING_OHLAD_UTE4KA_WATER; edrk.from_ing1.bits.UPC_24V_NORMA = 1;//!FROM_ING_UPC_24V_NORMA; edrk.from_ing1.bits.OP_PIT_NORMA = 1;//!FROM_ING_OP_PIT_NORMA; edrk.from_ing1.bits.VENTIL_ON = 0;//!FROM_ING_VENTIL_ON; edrk.from_ing1.bits.VIPR_PREDOHR_NORMA = 1;//!FROM_ING_VIPR_PREDOHR_NORMA; edrk.from_ing1.bits.ZARYAD_ON = 0;//!FROM_ING_ZARYAD_ON; edrk.from_ing1.bits.ZAZEML_OFF = 1;//!FROM_ING_ZAZEML_OFF; edrk.from_ing1.bits.ZAZEML_ON = 0;//!FROM_ING_ZAZEML_ON; edrk.from_ing2.bits.KEY_MINUS = 0;//FROM_ING_OBOROTS_MINUS; edrk.from_ing2.bits.KEY_PLUS = 0;//!FROM_ING_OBOROTS_PLUS; edrk.from_ing2.bits.KEY_KVITIR = 0;//FROM_ING_LOCAL_KVITIR; edrk.from_ing2.bits.KEY_SBOR = 0;//FROM_ING_SBOR_SHEMA; edrk.from_ing2.bits.KEY_RAZBOR = 0;//FROM_ING_RAZBOR_SHEMA; // edrk.from_ing1.bits.RASCEPITEL_ON = 0;//FROM_ING_RASCEPITEL_ON_OFF; // edrk.from_ing2.bits.SOST_ZAMKA = !edrk.to_ing.bits.BLOCK_KEY_OFF;//1;//!FROM_ING_SOST_ZAMKA; // SHEMA edrk.from_shema.bits.RAZBOR_SHEMA = 0;//FROM_BSU_RAZBOR_SHEMA; edrk.from_shema.bits.SBOR_SHEMA = 0;//FROM_BSU_SBOR_SHEMA; edrk.from_shema.bits.ZADA_DISPLAY = 0;//!FROM_BSU_ZADA_DISPLAY; edrk.from_shema.bits.SVU = 0;//!FROM_BSU_SVU; // edrk.from_shema.bits.KNOPKA_AVARIA = FROM_ALL_KNOPKA_AVARIA; edrk.from_shema.bits.QTV_ON_OFF = 0;//!FROM_SHEMA_QTV_ON_OFF; edrk.from_shema.bits.UMP_ON_OFF = 0;//!FROM_SHEMA_UMP_ON_OFF; edrk.from_shema.bits.READY_UMP = 1;//!FROM_SHEMA_READY_UMP; edrk.from_shema.bits.SVU_BLOCK_QTV = 0;//!FROM_SVU_BLOCK_QTV; st1 = 1; } // имитация расцепителя if (edrk.to_ing.bits.RASCEPITEL_ON) flag_imit_rascepitel = 1; if (edrk.to_ing.bits.RASCEPITEL_OFF) flag_imit_rascepitel = 0; edrk.from_ing1.bits.RASCEPITEL_ON = imit_signals_rascepitel(&counter_imit_rascepitel, TIME_ON_OFF_FOR_IMITATION_RASCEPITEL, flag_imit_rascepitel, 0); ///// edrk.from_ing2.bits.SOST_ZAMKA = !edrk.to_ing.bits.BLOCK_KEY_OFF; #else edrk.from_ing1.bits.ALL_KNOPKA_AVARIA = !FROM_ALL_KNOPKA_AVARIA; edrk.from_ing1.bits.BLOCK_IZOL_AVARIA = !FROM_ING_BLOCK_IZOL_AVARIA; edrk.from_ing1.bits.BLOCK_IZOL_NORMA = !FROM_ING_BLOCK_IZOL_NORMA; edrk.from_ing1.bits.LOCAL_REMOUTE = !FROM_ING_LOCAL_REMOUTE; edrk.from_ing1.bits.NAGREV_ON = !FROM_ING_NAGREV_ON; edrk.from_ing1.bits.NASOS_NORMA = !FROM_ING_NASOS_NORMA; edrk.from_ing1.bits.NASOS_ON = !FROM_ING_NASOS_ON; edrk.from_ing1.bits.OHLAD_UTE4KA_WATER = !FROM_ING_OHLAD_UTE4KA_WATER; edrk.from_ing1.bits.UPC_24V_NORMA = !FROM_ING_UPC_24V_NORMA; edrk.from_ing1.bits.OP_PIT_NORMA = !FROM_ING_OP_PIT_NORMA; edrk.from_ing1.bits.VENTIL_ON = !FROM_ING_VENTIL_ON; edrk.from_ing1.bits.VIPR_PREDOHR_NORMA = !FROM_ING_VIPR_PREDOHR_NORMA; edrk.from_ing1.bits.ZARYAD_ON = !FROM_ING_ZARYAD_ON; edrk.from_ing1.bits.ZAZEML_OFF = !FROM_ING_ZAZEML_OFF; edrk.from_ing1.bits.ZAZEML_ON = !FROM_ING_ZAZEML_ON; edrk.from_ing2.bits.KEY_MINUS = FROM_ING_OBOROTS_MINUS; edrk.from_ing2.bits.KEY_PLUS = !FROM_ING_OBOROTS_PLUS; edrk.from_ing2.bits.KEY_KVITIR = FROM_ING_LOCAL_KVITIR; edrk.from_ing2.bits.KEY_SBOR = FROM_ING_SBOR_SHEMA; edrk.from_ing2.bits.KEY_RAZBOR = FROM_ING_RAZBOR_SHEMA; #if(RASCEPITEL_MANUAL_ALWAYS_ON_2) // имитация расцепителя if (edrk.to_ing.bits.RASCEPITEL_ON) flag_imit_rascepitel = 1; if (edrk.to_ing.bits.RASCEPITEL_OFF) flag_imit_rascepitel = 0; edrk.from_ing1.bits.RASCEPITEL_ON = imit_signals_rascepitel(&counter_imit_rascepitel, TIME_ON_OFF_FOR_IMITATION_RASCEPITEL, flag_imit_rascepitel, 0); #else edrk.from_ing1.bits.RASCEPITEL_ON = FROM_ING_RASCEPITEL_ON_OFF; #endif edrk.from_ing2.bits.SOST_ZAMKA = !FROM_ING_SOST_ZAMKA; // SHEMA edrk.from_shema.bits.RAZBOR_SHEMA = FROM_BSU_RAZBOR_SHEMA; edrk.from_shema.bits.SBOR_SHEMA = FROM_BSU_SBOR_SHEMA; edrk.from_shema.bits.ZADA_DISPLAY = !FROM_BSU_ZADA_DISPLAY; edrk.from_shema.bits.SVU = !FROM_BSU_SVU; // edrk.from_shema.bits.KNOPKA_AVARIA = FROM_ALL_KNOPKA_AVARIA; edrk.from_shema.bits.QTV_ON_OFF = !FROM_SHEMA_QTV_ON_OFF; edrk.from_shema.bits.UMP_ON_OFF = !FROM_SHEMA_UMP_ON_OFF; edrk.from_shema.bits.READY_UMP = !FROM_SHEMA_READY_UMP; edrk.from_shema.bits.SVU_BLOCK_QTV = !FROM_SVU_BLOCK_QTV; #endif } //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // определение откуда получать задачу на обороты //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// void get_where_oborots(void) { //// if (CAN_timeout[get_real_out_mbox(MPU_TYPE_BOX,0)-1]==0) // if (CAN_timeout[get_real_in_mbox(MPU_TYPE_BOX,0)]==0) // { // edrk.W_from_SVU = modbus_table_can_in[14].all; // edrk.W_from_DISPLAY = modbus_table_can_in[16].all; // } // else // { // edrk.W_from_SVU = 0; // edrk.W_from_DISPLAY = 0; // } // // // // // if (edrk.from_shema.bits.SVU) // { // edrk.W_from_all = edrk.W_from_SVU; // edrk.W_from_ZADAT4IK = edrk.W_from_all; // } // else // { // if (edrk.from_shema.bits.ZADA_DISPLAY) // { // edrk.W_from_all = edrk.W_from_DISPLAY; // edrk.W_from_ZADAT4IK = edrk.W_from_all; // } // else // edrk.W_from_all = edrk.W_from_ZADAT4IK; // } } //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// unsigned int toggle_status_lamp(unsigned int bb1, unsigned int flag) { if (bb1==1 && flag==0) { return 0; } if (bb1==0 && flag==0) { return 0; } if (bb1==1 && flag==1) { return 0; } if (bb1==0 && flag==1) { return 1; } return 0; } //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // записываем цифровые выходы //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// void update_output_edrk(void) { unsigned int b; static unsigned int time_toggle1=0,time_toggle2=0; //to ingetim TO_ING_NAGREV_OFF = !edrk.to_ing.bits.NAGREV_OFF; TO_ING_NASOS_1_ON = !edrk.to_ing.bits.NASOS_1_ON; TO_ING_NASOS_2_ON = !edrk.to_ing.bits.NASOS_2_ON; // TO_ING_RESET_BLOCK_IZOL = !edrk.to_ing.bits.RESET_BLOCK_IZOL; TO_ING_SMALL_LAMPA_AVARIA = edrk.to_ing.bits.SMALL_LAMPA_AVARIA; TO_ING_RASCEPITEL_OFF = !edrk.to_ing.bits.RASCEPITEL_OFF; TO_ING_RASCEPITEL_ON = !edrk.to_ing.bits.RASCEPITEL_ON; // ANOTHER PCH TO_SECOND_PCH_MASTER = edrk.to_second_pch.bits.MASTER; TO_SECOND_PCH_ALARM = !edrk.to_second_pch.bits.ALARM; //to_shema // //#if (ENABLE_USE_QTV==1) // TO_STEND_QM_ON_INVERS = !edrk.to_shema.bits.QTV_ON; //#endif if (control_station.active_array_cmd[CONTROL_STATION_CMD_CROSS_STEND_AUTOMATS]) { #if (MODE_QTV_UPRAVLENIE==1) TO_SHEMA_QTV_ON_OFF = !edrk.to_shema.bits.CROSS_QTV_ON_OFF; #endif TO_ING_LAMPA_ZARYAD = !edrk.to_shema.bits.CROSS_QTV_ON_OFF; if (edrk.to_ing.bits.BLOCK_KEY_OFF || edrk.to_shema.bits.CROSS_QTV_ON_OFF) TO_ING_BLOCK_KEY_OFF = 0; else TO_ING_BLOCK_KEY_OFF = 1; // TO_ING_BLOCK_KEY_OFF = !edrk.to_shema.bits.CROSS_QTV_ON_OFF; TO_SHEMA_ENABLE_QTV = !edrk.to_shema.bits.CROSS_QTV_ON_OFF; TO_SHEMA_UMP_ON_OFF = !edrk.to_shema.bits.CROSS_UMP_ON_OFF; } else { TO_ING_LAMPA_ZARYAD = !edrk.Status_Ready.bits.Batt; TO_ING_ZARYAD_ON = !edrk.to_ing.bits.ZARYAD_ON; TO_ING_BLOCK_KEY_OFF = !edrk.to_ing.bits.BLOCK_KEY_OFF; #if (MODE_QTV_UPRAVLENIE==1) TO_SHEMA_QTV_ON_OFF = !edrk.to_shema.bits.QTV_ON_OFF; #endif #if (MODE_QTV_UPRAVLENIE==2) TO_SHEMA_QTV_OFF = !edrk.to_shema.bits.QTV_OFF; TO_SHEMA_QTV_ON = !edrk.to_shema.bits.QTV_ON; #endif TO_SHEMA_ENABLE_QTV = !edrk.to_shema.bits.ENABLE_QTV; TO_SHEMA_UMP_ON_OFF = !edrk.to_shema.bits.UMP_ON_OFF; } //lamps APL // if (edrk.Sbor)// && edrk.from_ing.bits2.GED_NAMAGNI4EN==0) // { // if (edrk.Status_Ready.bits.ready5==0) // edrk.to_zadat4ik.APL_LAMS0.bits.SBOR_SIL_SHEMA = 1; // else // edrk.to_zadat4ik.APL_LAMS0.bits.SBOR_SIL_SHEMA = 0; // } // else // { // edrk.to_zadat4ik.APL_LAMS0.bits.SBOR_SIL_SHEMA = 0; // } edrk.to_vpu.BIG_LAMS.bits.GOTOV2 = edrk.Status_Ready.bits.ready_final; edrk.to_vpu.BIG_LAMS.bits.PEREGRUZKA = edrk.to_zadat4ik.BIG_LAMS.bits.OGRAN_POWER; edrk.to_vpu.BIG_LAMS.bits.PODDERG_OBOROTS = 0;// edrk.to_vpu.BIG_LAMS.bits.VPU = edrk.to_zadat4ik.APL_LAMS0.bits.OBOROT_VPU; } /////////////////////////////////////////////// /////////////////////////////////////////////// // ОсновнаЯ программа /////////////////////////////////////////////// /////////////////////////////////////////////// /////////////////////////////////////////////// void nagrev_auto_on_off(void) { if (edrk.temper_edrk.max_real_int_temper_waterTEMPER_NAGREF_OFF) edrk.to_ing.bits.NAGREV_OFF = 1; } /////////////////////////////////////////////// #define TIME_WAIT_OFF_BLOCK_KEY 100 void auto_block_key_on_off(void) { static unsigned int count_err = TIME_WAIT_OFF_BLOCK_KEY; if (filter.iqU_1_long >= U_LEVEL_ON_BLOCK_KEY || filter.iqU_2_long >= U_LEVEL_ON_BLOCK_KEY || edrk.SumSbor) { edrk.Status_Ready.bits.Batt = 1; edrk.to_ing.bits.BLOCK_KEY_OFF = 0; count_err = 0; } if (filter.iqU_1_long <= U_LEVEL_OFF_BLOCK_KEY && filter.iqU_2_long <= U_LEVEL_OFF_BLOCK_KEY && edrk.SumSbor==0) { if (pause_detect_error(&count_err,TIME_WAIT_OFF_BLOCK_KEY,1)) { edrk.to_ing.bits.BLOCK_KEY_OFF = 1; edrk.Status_Ready.bits.Batt = 0; } } else count_err = 0; } /////////////////////////////////////////////// /////////////////////////////////////////////// void update_lamp_alarm(void) { if ((edrk.errors.e0.all) || (edrk.errors.e1.all) || (edrk.errors.e2.all) || (edrk.errors.e3.all) || (edrk.errors.e4.all) || (edrk.errors.e5.all) || (edrk.errors.e6.all) || (edrk.errors.e7.all) || (edrk.errors.e8.all) || (edrk.errors.e9.all) || (edrk.errors.e10.all) || (edrk.errors.e11.all) || (edrk.errors.e12.all) ) { edrk.to_ing.bits.SMALL_LAMPA_AVARIA = 1; // edrk.to_second_pch.bits.ALARM = 1; edrk.summ_errors = 1; edrk.Stop |= 1; } else { edrk.to_ing.bits.SMALL_LAMPA_AVARIA = 0; edrk.to_second_pch.bits.ALARM = 0; edrk.summ_errors = 0; } } /////////////////////////////////////////////// /////////////////////////////////////////////// /////////////////////////////////////////////// /////////////////////////////////////////////// /////////////////////////////////////////////// #define TIME_WAIT_RELE_QTV_ON 20 //2 sec #define TIME_WAIT_RELE_QTV_OFF 20 //2 sec #define TIME_WAIT_ANSWER_QTV_ON TIME_WAIT_ERROR_QTV //150 //15 sec #define TIME_WAIT_ANSWER_QTV_OFF 40 //4 sec /////////////////////////////////////////////// int qtv_on_off(unsigned int flag) { static unsigned int time_wait_rele_on_qtv=0; static unsigned int time_wait_rele_off_qtv=0; static unsigned int time_wait_answer_on_qtv=0; static unsigned int time_wait_answer_off_qtv=0; static unsigned int count_err_on = 0; int cmd_qtv=0;//,cmd_p2=0; static int QTV_Ok = 0; static int prev_error = 0; cmd_qtv = 0; // cmd_p2 = 0; if ( flag==1 && edrk.summ_errors==0) { cmd_qtv = 1; } else { cmd_qtv = 0; } edrk.cmd_to_qtv = cmd_qtv; if (cmd_qtv) { edrk.to_shema.bits.ENABLE_QTV = 1; edrk.to_shema.bits.QTV_OFF = 1; if ((pause_detect_error(&time_wait_rele_on_qtv,TIME_WAIT_RELE_QTV_ON,1)==0) && edrk.from_shema.bits.QTV_ON_OFF==0) { #if (MODE_QTV_UPRAVLENIE==2) edrk.to_shema.bits.QTV_ON = 1; #endif #if (MODE_QTV_UPRAVLENIE==1) edrk.to_shema.bits.QTV_ON_OFF = 1; #endif } else edrk.to_shema.bits.QTV_ON = 0; if (pause_detect_error(&time_wait_answer_on_qtv,TIME_WAIT_ANSWER_QTV_ON,1)==0) { if (edrk.from_shema.bits.QTV_ON_OFF==1) QTV_Ok = 1; } else { // была команда на вкл, но сухой контакт не пришел if (edrk.from_shema.bits.QTV_ON_OFF==0) { #if (WORK_ON_STEND_D) if (pause_detect_error(&count_err_on,TIME_WAIT_ANSWER_QTV_ON,1)) { edrk.errors.e6.bits.QTV_ERROR_NOT_ANSWER |= 1; QTV_Ok = 0; } #else edrk.errors.e6.bits.QTV_ERROR_NOT_ANSWER |= 1; QTV_Ok = 0; #endif } else count_err_on = 0; } time_wait_rele_off_qtv = 0; time_wait_answer_off_qtv = 0; } else { QTV_Ok = 0; edrk.to_shema.bits.ENABLE_QTV = 0; time_wait_rele_on_qtv = 0; time_wait_answer_on_qtv = 0; edrk.to_shema.bits.QTV_ON = 0; edrk.to_shema.bits.QTV_ON_OFF = 0; // if (pause_detect_error(&time_wait_rele_off_qtv,TIME_WAIT_RELE_QTV_OFF,1)==0) // edrk.to_shema.bits.QTV_OFF = 1; // else edrk.to_shema.bits.QTV_OFF = 0; if (pause_detect_error(&time_wait_answer_off_qtv,TIME_WAIT_ANSWER_QTV_OFF,1)==0) { } else { if (edrk.from_shema.bits.QTV_ON_OFF==1) edrk.errors.e6.bits.QTV_ERROR_NOT_ANSWER |= 1; } if (prev_error!=edrk.summ_errors && edrk.summ_errors) { if (pause_detect_error(&time_wait_rele_off_qtv,TIME_WAIT_RELE_QTV_OFF,1)==1) time_wait_rele_off_qtv = 0; } } prev_error = edrk.summ_errors; return (QTV_Ok); } /////////////////////////////////////////////// /////////////////////////////////////////////// /////////////////////////////////////////////// void detect_kvitir_from_all(void) { static int prev_kvitir=0; edrk.Kvitir = control_station.active_array_cmd[CONTROL_STATION_CMD_CHECKBACK] || edrk.from_ing2.bits.KEY_KVITIR; /* if (edrk.RemouteFromRS) edrk.Kvitir = edrk.KvitirRS; if (edrk.RemouteFromVPU) edrk.Kvitir = edrk.KvitirVPU; if (edrk.RemouteFromDISPLAY) edrk.Kvitir = edrk.from_display.bits.KVITIR;//edrk.KvitirDISPLAY; if (edrk.RemouteFromMPU) edrk.Kvitir = edrk.KvitirMPU; */ if (edrk.Kvitir==1 && prev_kvitir==0) { if (edrk.Status_Ready.bits.ready_final==0 && edrk.Go==0 && edrk.Stop == 1) { edrk.KvitirProcess = 1; project.clear_errors_all_plates(); clear_errors(); edrk.KvitirProcess = 0; } clear_warnings(); /* edrk.KvitirDISPLAY = 0; edrk.KvitirVPU = 0; edrk.KvitirMPU = 0; edrk.KvitirSVU = 0; edrk.KvitirRS = 0; */ } prev_kvitir = edrk.Kvitir; } /////////////////////////////////////////////// unsigned int get_ready_1(void) { unsigned int r1, r2; if (project.cds_in[0].status == component_Ready && project.cds_in[1].status == component_Ready && project.cds_out[0].status == component_Ready && project.cds_tk[0].status == component_Ready && project.cds_tk[1].status == component_Ready && project.cds_tk[2].status == component_Ready && project.cds_tk[3].status == component_Ready && project.adc[0].status == component_Ready && project.adc[1].status == component_Ready && project.hwp[0].status == component_Ready ) r2 = 1; else r2 = 0; r1 = (edrk.ms.ready1 && edrk.from_ing1.bits.NASOS_NORMA && edrk.from_ing1.bits.ZAZEML_ON==0 && edrk.from_ing1.bits.ZAZEML_OFF==1 && edrk.from_ing1.bits.VIPR_PREDOHR_NORMA && edrk.from_ing1.bits.BLOCK_IZOL_NORMA && edrk.from_ing1.bits.OP_PIT_NORMA && edrk.from_ing1.bits.UPC_24V_NORMA && r2); return r1; } /////////////////////////////////////////////// /////////////////////////////////////////////// /////////////////////////////////////////////// /////////////////////////////////////////////// /////////////////////////////////////////////// /////////////////////////////////////////////// /////////////////////////////////////////////// #define MAX_U_PROC_SMALL 2.5 //1.4 #define MAX_U_PROC 1.3 //1.11 //1.4 #define MIN_U_PROC 0.8 //0.7 #define ADD_U_MAX_GLOBAL 200.0 //V Насколько поднимаем уставку GLOBAL относительно ZadanieU_Charge #define ADD_U_MAX_GLOBAL_SMALL 500.0 //V Насколько поднимаем уставку GLOBAL относительно ZadanieU_Charge #define LEVEL_DETECT_U_SMALL 1000.0 //V Насколько поднимаем уставку GLOBAL относительно ZadanieU_Charge void set_zadanie_u_charge(void) { // edrk.ZadanieU_Charge = edrk.ZadanieU_Charge_RS; // edrk.iq_ZadanieU_Charge = _IQ(edrk.ZadanieU_Charge/NORMA_ACP); if (edrk.zadanie.ZadanieU_Charge<=100) { edrk.iqMIN_U_ZPT = _IQ(-50.0/NORMA_ACP); edrk.iqMIN_U_IN = _IQ(-50.0/NORMA_ACP); } else { edrk.iqMIN_U_ZPT = _IQ(edrk.zadanie.ZadanieU_Charge*MIN_U_PROC/NORMA_ACP); edrk.iqMIN_U_IN = _IQ(edrk.zadanie.ZadanieU_Charge*MIN_U_PROC/NORMA_ACP); } if (edrk.zadanie.ZadanieU_ChargeU_D_MAX_ERROR_GLOBAL_2800) edrk.iqMAX_U_ZPT_Global = U_D_MAX_ERROR_GLOBAL_2800; } edrk.iqMAX_U_ZPT = _IQ(edrk.zadanie.ZadanieU_Charge*MAX_U_PROC/NORMA_ACP); edrk.iqMAX_U_IN = _IQ(edrk.zadanie.ZadanieU_Charge*MAX_U_PROC/NORMA_ACP); } /////////////////////////////////////////////// /////////////////////////////////////////////// // ОсновнаЯ программа /////////////////////////////////////////////// /////////////////////////////////////////////// void test_send_alarm_log(int alarm_cmd) { static unsigned int points_alarm_log = 1000; // static unsigned int nchannel_alarm_log = 30; static int prev_alarm_cmd = 0; static int local_alarm_cmd = 0; if (alarm_cmd && prev_alarm_cmd==0 && alarm_log_can.stage==0) { // i_led2_on(); alarm_log_can.post_points = COUNT_SAVE_LOG_OFF;//100; // количество поставарийныйх записей alarm_log_can.oscills = logpar.count_log_params_fast_log;//nchannel_alarm_log; // количество колонок alarm_log_can.global_enable = 1; alarm_log_can.start_adr_temp = (int *)0xc0000; // адрес для временного размещения копии лога, лог скопируется из циклического буфера в этот развернувшись. // alarm_log_can.finish_adr_temp = (int *)0xa0000; // адрес для временного размещения копии лога, лог скопируется из циклического буфера в этот развернувшись. alarm_log_can.start_adr_real_logs = (int *)START_ADDRESS_LOG; // адрес начала реальных логов в циклическом буфере alarm_log_can.finish_adr_real_log = (int *)logpar.real_finish_addres_mem; // конец логов в циклическом буфере alarm_log_can.current_adr_real_log = (int *)logpar.addres_mem; alarm_log_can.temp_points = points_alarm_log; // реальный размер циклическго буфера в точках. // alarm_log_can.real_points = 1000; // нужный кусок для копии, данное количество скопируется из циклического буфера во временный лог. alarm_log_can.step = 450; // mks local_alarm_cmd = alarm_cmd; // alarm_log_can.status_alarm = alarm_cmd;//cmd_alarm_log; // код аварии alarm_log_can.start = 0x1; alarm_log_can.stop = 0x1; alarm_log_can.copy2temp = 0x1; alarm_log_can.clear(&alarm_log_can); // alarm_log_can.send(&alarm_log_can); // i_led2_off(); } else local_alarm_cmd = 0; alarm_log_can.status_alarm = local_alarm_cmd;//cmd_alarm_log; // код аварии alarm_log_can.send(&alarm_log_can); if (alarm_log_can.stage) { i_led2_on_off(1); } else { i_led2_on_off(0); } prev_alarm_cmd = alarm_cmd; } //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// // //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// void run_edrk(void) { // static unsigned int prev_SumSbor = 0, prev_AllStart = 0, prev_VozbudOnOff = 0, prev_SBOR_SHEMA_VPU = 0,prev_SBOR_SHEMA_RS=0, prev_SBOR_SHEMA_DISPLAY = 0; int current_active_control, ff =0; static unsigned int filter_count_error_control_station_select_active = 0; static int flag_enable_update_mpu = 1; static unsigned int external_cmd_alarm_log = 0; //static int ccc[40] = {0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0}; static int ccc[40] = {0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1}; static int prev_enable_pwm_test_lines=0; if (f.Prepare || f.terminal_prepare) { project.clear_errors_all_plates(); } // slow_vector_update(); read_plane_errors(); // if (flag_enable_update_hmi) // update_tables_HMI(); // if (flag_enable_update_mpu) // update_modbus_table(); // modbusNetworkSharing(1); // get_command_HMI(); // return; // i_led1_on_off(1); if (edrk.flag_disable_pult_485==0) modbusNetworkSharing(0); // i_led1_on_off(0); if (!(detect_pause_milisec(100,&old_time_edrk2))) return; if (ccc[0]) return; //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// // Дальше код запускается раз в 100 мсек. //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// // external_cmd_alarm_log = modbus_table_can_in[11].all; // test_send_alarm_log(external_cmd_alarm_log); // modbusNetworkSharing(0); // i_led2_on_off(1); if (ccc[1]) modbusNetworkSharingCAN(); #if (ENABLE_CAN_SEND_TO_UKSS_FROM_MAIN) // пишем в задатчик if (ccc[2]) update_ukss_can(TIME_PAUSE_MODBUS_CAN_ZADATCHIK_VPU); if (ccc[3]) update_ukss_setup(TIME_PAUSE_MODBUS_CAN_UKSS_SETUP); #endif #if (ENABLE_CAN_SEND_TO_ANOTHER_BSU_FROM_MAIN) // пишем в задатчик if (ccc[4]) update_bsu_can(TIME_PAUSE_MODBUS_CAN_BS2BS); #endif if (ccc[5]) check_all_power_limits(); if (ccc[6]) calc_p_water_edrk(); if (ccc[7]) calc_temper_edrk(); if (ccc[8]) calc_temper_acdrive(); // читаем цифр входы if (ccc[9]) update_input_edrk(); if (ccc[10]) detect_kvitir_from_all(); if (ccc[11]) detect_error_all(); if (ccc[12]) calc_limit_overheat(); if (ccc[13]) calc_RMS_values_main(); if (ccc[14]) update_lamp_alarm(); if (ccc[15]) set_zadanie_u_charge(); if (ccc[16]) reinit_protect_I_and_U_settings(); if (ccc[17]) nagrev_auto_on_off(); if (ccc[18]) auto_block_key_on_off(); edrk.f_rotor_hz = _IQtoF(edrk.iq_f_rotor_hz) * NORMA_FROTOR; edrk.oborots = fast_round(edrk.f_rotor_hz*60.0); edrk.power_kw = _IQtoF(filter.PowerScalar) * NORMA_ACP * NORMA_ACP / 1000.0; edrk.Status_Ready.bits.ready1 = get_ready_1(); if (ccc[19]) pump_control(); if (control_station_select_active()) { if (filter_count_error_control_station_select_active<30) filter_count_error_control_station_select_active++; else edrk.errors.e7.bits.NOT_VALID_CONTROL_STATION |= 1; } else filter_count_error_control_station_select_active = 0; current_active_control = get_current_station_control(); if (current_active_control=max_errors) return 1; else (*counter)++; return 0; } if (err==0) { if ((*counter)==0) return 0; else (*counter)--; return 0; } return 0; } ////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// #define MAX_ERRORS_DETECT_ALIVE_ANOTHER_BS 30//20 #define MAX_WAIT_READY1_DETECT_ALIVE_ANOTHER_BS 100 #define MAX_WAIT_READY2_DETECT_ALIVE_ANOTHER_BS 70 //30 // должен быть больше чем MAX_ERRORS_DETECT_ALIVE_ANOTHER_BS ////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// void detect_alive_another_bs(void) { // static unsigned int count_wait_ready = 0; static unsigned int prev_another_bs_maybe_on = 0; static unsigned int prev_another_bs_maybe_on_after_ready1 = 0; edrk.ms.err_signals.alive_can_to_another_bs = CAN_timeout[get_real_in_mbox(UNITS_TYPE_BOX,ANOTHER_BSU1_CAN_DEVICE)]; edrk.ms.err_signals.alive_opt_bus_read = !project.cds_tk[3].optical_data_in.ready; edrk.ms.err_signals.alive_opt_bus_write = !project.cds_tk[3].optical_data_out.ready; edrk.ms.err_signals.alive_sync_line = !sync_data.global_flag_sync_1_2; edrk.ms.err_signals.alive_sync_line_local = !sync_data.local_flag_sync_1_2; // edrk.ms.err_signals.input_alarm_another_bs = edrk.from_ing1.bits. // тут пока отключен канал. // edrk.ms.err_signals.fast_optical_alarm = 0;//!project.cds_tk[3].read.sbus.status_tk_40pin.bit.tk5_ack; edrk.ms.err_signals.another_rascepitel = edrk.from_second_pch.bits.RASCEPITEL; if (edrk.ms.err_signals.alive_can_to_another_bs && (edrk.ms.err_signals.alive_opt_bus_read || edrk.ms.err_signals.alive_opt_bus_write) && edrk.ms.err_signals.alive_sync_line // && edrk.ms.err_signals.fast_optical_alarm ) { edrk.ms.another_bs_maybe_off = 1; edrk.ms.another_bs_maybe_on = 0; } else { edrk.ms.another_bs_maybe_off = 0; edrk.ms.another_bs_maybe_on = 1; } // если связь восстановилась, то опять ждем некоторое время пока запустятся все остальные каналы связи. if (prev_another_bs_maybe_on!=edrk.ms.another_bs_maybe_on && edrk.ms.another_bs_maybe_on) { // edrk.ms.count_time_wait_ready1 = 0; edrk.ms.count_time_wait_ready2 = 0; prev_another_bs_maybe_on_after_ready1 = 0; clear_errors_master_slave(); } // // выставляем флаг только через время MAX_WAIT_READY_DETECT_ALIVE_ANOTHER_BS // edrk.ms.ready1 = filter_err_count(&edrk.ms.count_time_wait_ready1, MAX_WAIT_READY1_DETECT_ALIVE_ANOTHER_BS, 1, 0); if (edrk.Status_Ready.bits.ready5) { edrk.ms.ready2 = filter_err_count(&edrk.ms.count_time_wait_ready2, MAX_WAIT_READY2_DETECT_ALIVE_ANOTHER_BS, 1, 0); } else { edrk.ms.count_time_wait_ready2 = 0; edrk.ms.ready2 = 0; } // edrk.ms.ready2 = edrk.Status_Ready.bits.ready5 && filter_err_count(&edrk.ms.count_time_wait_ready2, // MAX_WAIT_READY2_DETECT_ALIVE_ANOTHER_BS, // 1, // 0); prev_another_bs_maybe_on = edrk.ms.another_bs_maybe_on; // ждем пока пройдет некоторое время if (edrk.ms.ready1==0) { edrk.ms.status = 1; return; } // если связь была после edrk.ms.ready1==1, но вся пропала, даем ошибку if (prev_another_bs_maybe_on_after_ready1!=edrk.ms.another_bs_maybe_on && edrk.ms.another_bs_maybe_on==0) { edrk.errors.e4.bits.ANOTHER_BS_POWER_OFF |= 1; } prev_another_bs_maybe_on_after_ready1 = edrk.ms.another_bs_maybe_on; edrk.ms.err_lock_signals.alive_can_to_another_bs |= filter_err_count(&edrk.ms.errors_count.alive_can_to_another_bs, MAX_ERRORS_DETECT_ALIVE_ANOTHER_BS, edrk.ms.err_signals.alive_can_to_another_bs, 0); edrk.ms.err_lock_signals.alive_opt_bus_read |= filter_err_count(&edrk.ms.errors_count.alive_opt_bus_read, MAX_ERRORS_DETECT_ALIVE_ANOTHER_BS, edrk.ms.err_signals.alive_opt_bus_read, 0); edrk.ms.err_lock_signals.alive_opt_bus_write |= filter_err_count(&edrk.ms.errors_count.alive_opt_bus_write, MAX_ERRORS_DETECT_ALIVE_ANOTHER_BS, edrk.ms.err_signals.alive_opt_bus_write, 0); edrk.ms.err_lock_signals.alive_sync_line = filter_err_count(&edrk.ms.errors_count.alive_sync_line, MAX_ERRORS_DETECT_ALIVE_ANOTHER_BS, edrk.ms.err_signals.alive_sync_line, 0); edrk.ms.err_lock_signals.alive_sync_line_local = filter_err_count(&edrk.ms.errors_count.alive_sync_line_local, MAX_ERRORS_DETECT_ALIVE_ANOTHER_BS, edrk.ms.err_signals.alive_sync_line_local, 0); edrk.ms.err_lock_signals.fast_optical_alarm |= filter_err_count(&edrk.ms.errors_count.fast_optical_alarm, MAX_ERRORS_DETECT_ALIVE_ANOTHER_BS, edrk.ms.err_signals.fast_optical_alarm, 0); edrk.ms.err_lock_signals.input_alarm_another_bs |= filter_err_count(&edrk.ms.errors_count.input_alarm_another_bs, MAX_ERRORS_DETECT_ALIVE_ANOTHER_BS, edrk.ms.err_signals.input_alarm_another_bs, 0); edrk.ms.err_lock_signals.another_rascepitel |= filter_err_count(&edrk.ms.errors_count.another_rascepitel, MAX_ERRORS_DETECT_ALIVE_ANOTHER_BS, edrk.ms.err_signals.another_rascepitel, 0); edrk.ms.err_lock_signals.input_master_slave |= filter_err_count(&edrk.ms.errors_count.input_master_slave, MAX_ERRORS_DETECT_ALIVE_ANOTHER_BS, edrk.ms.err_signals.input_master_slave, 0); if (edrk.ms.err_signals.alive_can_to_another_bs && (edrk.ms.err_signals.alive_opt_bus_read || edrk.ms.err_signals.alive_opt_bus_write) && edrk.ms.err_signals.alive_sync_line // && edrk.ms.err_signals.fast_optical_alarm // && edrk.ms.err_signals.input_alarm_another_bs && // && edrk.ms.err_signals.another_rascepitel == 0 // && edrk.ms.err_signals.input_master_slave ) { if (edrk.ms.err_signals.another_rascepitel) edrk.errors.e7.bits.ANOTHER_RASCEPITEL_ON |= 1; // edrk.ms.another_bs_maybe_off = 1; // edrk.ms.another_bs_maybe_on = 0; edrk.warnings.e4.bits.ANOTHER_BS_POWER_OFF = 1; // edrk.warnings.e4.bits.FAST_OPTICAL_ALARM = 1; edrk.warnings.e7.bits.MASTER_SLAVE_SYNC = 1; edrk.warnings.e7.bits.READ_OPTBUS = edrk.ms.err_signals.alive_opt_bus_read; edrk.warnings.e7.bits.WRITE_OPTBUS = edrk.ms.err_signals.alive_opt_bus_write; edrk.warnings.e7.bits.CAN2CAN_BS = 1; edrk.ms.status = 2; } else { edrk.warnings.e4.bits.ANOTHER_BS_POWER_OFF = 0; // if (edrk.ms.err_lock_signals.alive_can_to_another_bs) edrk.errors.e7.bits.CAN2CAN_BS |= 1; else edrk.warnings.e7.bits.CAN2CAN_BS = 0; // if (edrk.ms.err_lock_signals.alive_opt_bus_read) edrk.errors.e7.bits.READ_OPTBUS |= 1; else edrk.warnings.e7.bits.READ_OPTBUS = 0; // if (edrk.ms.err_lock_signals.alive_opt_bus_write) edrk.errors.e7.bits.WRITE_OPTBUS |= 1; else edrk.warnings.e7.bits.WRITE_OPTBUS = 0; // if (edrk.ms.err_lock_signals.alive_sync_line) edrk.warnings.e7.bits.MASTER_SLAVE_SYNC = 1; else edrk.warnings.e7.bits.MASTER_SLAVE_SYNC = 0; // // if (edrk.ms.err_lock_signals.fast_optical_alarm) // edrk.errors.e4.bits.FAST_OPTICAL_ALARM |= 1; // else // edrk.warnings.e4.bits.FAST_OPTICAL_ALARM = 0; // edrk.ms.another_bs_maybe_on = 1; // edrk.ms.another_bs_maybe_off = 0; if (edrk.ms.err_signals.alive_can_to_another_bs || edrk.ms.err_signals.alive_opt_bus_read || edrk.ms.err_signals.alive_opt_bus_write || edrk.ms.err_signals.alive_sync_line || edrk.ms.err_signals.fast_optical_alarm ) edrk.ms.status = 3; else edrk.ms.status = 4; } } ////////////////////////////////////////////////////////// unsigned int wait_synhro_optical_bus(void) { static unsigned int cmd = 0; static unsigned int count_wait_synhro = 0; // // switch(cmd) // { // 0 : if (optical_read_data.data.cmd.bit.wdog_tick == 0) // cmd = 1; // // break; // // 1 : optical_write_data.data.cmd.bit.wdog_tick = 1; // break; // // // default: break // } return 0; } ////////////////////////////////////////////////////////// void clear_wait_synhro_optical_bus(void) { // optical_read_data.data.cmd.bit.wdog_tick = 0; // optical_write_data.data.cmd.bit.wdog_tick = 0; } ////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// #define MAX_COUNT_TRY_MASTER_BS1 200//40 //15 //5 #define MAX_COUNT_TRY_MASTER_BS2 100//40 //15 //40 //20 #define MAX_COUNT_WAIT_ANSWER_CONFIRM_MODE 20 #define MAX_COUNT_WAIT_SLAVE_TRY_MASTER 100 #define SIZE_LOG_MASTER_SLAVE_STATUS 50 #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 = 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_masteredrk.zadanie.iq_limit_power_zad_rmp) edrk.zadanie.rmp_powers_zad.DesiredInput = edrk.zadanie.iq_limit_power_zad_rmp; else edrk.zadanie.rmp_powers_zad.DesiredInput = edrk.zadanie.iq_power_zad; } else if (flag_set_zero==2) { edrk.zadanie.rmp_powers_zad.DesiredInput = 0; edrk.zadanie.rmp_powers_zad.Out = 0; } else edrk.zadanie.rmp_powers_zad.DesiredInput = 0; edrk.zadanie.rmp_powers_zad.calc(&edrk.zadanie.rmp_powers_zad); edrk.zadanie.iq_power_zad_rmp = edrk.zadanie.rmp_powers_zad.Out; } ////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// //#pragma CODE_SECTION(get_start_ged_from_zadanie,".fast_run"); int get_start_ged_from_zadanie(void) { // uf const if (edrk.Mode_ScalarVectorUFConst == ALG_MODE_UF_CONST) { if (edrk.zadanie.iq_fzad_rmp!=0 && edrk.zadanie.iq_kzad_rmp!=0) return 1; else return 0; } else // scalar oborots if (edrk.Mode_ScalarVectorUFConst == ALG_MODE_SCALAR_OBOROTS) { if (edrk.zadanie.iq_oborots_zad_hz_rmp!=0 && edrk.zadanie.iq_Izad_rmp!=0 && edrk.zadanie.iq_power_zad_rmp!=0 && edrk.zadanie.iq_limit_power_zad_rmp!=0) return 1; else return 0; } else // scalar power if (edrk.Mode_ScalarVectorUFConst == ALG_MODE_SCALAR_POWER) { if (edrk.zadanie.iq_oborots_zad_hz_rmp!=0 && edrk.zadanie.iq_Izad_rmp!=0 && edrk.zadanie.iq_power_zad_rmp!=0 && edrk.zadanie.iq_limit_power_zad_rmp!=0) return 1; else return 0; } else // foc oborots if (edrk.Mode_ScalarVectorUFConst == ALG_MODE_FOC_OBOROTS) { if (edrk.zadanie.iq_oborots_zad_hz_rmp!=0 && edrk.zadanie.iq_Izad_rmp!=0 && edrk.zadanie.iq_power_zad_rmp!=0 && edrk.zadanie.iq_limit_power_zad_rmp!=0) return 1; else return 0; } else // foc power if (edrk.Mode_ScalarVectorUFConst == ALG_MODE_FOC_POWER) { if (edrk.zadanie.iq_oborots_zad_hz_rmp!=0 && edrk.zadanie.iq_Izad_rmp!=0 && edrk.zadanie.iq_power_zad_rmp!=0 && edrk.zadanie.iq_limit_power_zad_rmp!=0) return 1; else return 0; } else { return 0; } } ////////////////////////////////////////////////////////// void UpdateTableSecondBS(void) { int cmd; int i,k; Unites2SecondBS[0]++; Unites2SecondBS[1] = global_time.miliseconds; Unites2SecondBS[2] = edrk.flag_second_PCH; Unites2SecondBS[3] = (edrk.to_shema.bits.QTV_ON_OFF << 1) | (edrk.to_shema.bits.UMP_ON_OFF); Unites2SecondBS[4] = edrk.SumSbor; Unites2SecondBS[5] = edrk.int_koef_ogran_power; Unites2SecondBS[6] = (int)edrk.power_kw; Unites2SecondBS[7] = (int)edrk.active_post_upravl; Unites2SecondBS[8] = (int)edrk.power_kw; Unites2SecondBS[9] = edrk.Status_Ready.bits.ready1; Unites2SecondBS[10] = edrk.Status_Ready.bits.ready_final; Unites2SecondBS[11] = edrk.MasterSlave; Unites2SecondBS[12] = _IQtoF(vect_control.iqId_min) * NORMA_ACP; for (i=0;i=minimal_detect_u || filter.iqU_2_long>=minimal_detect_u || prev_uzpt1-filter.iqU_1_long)>=delta_u || (prev_uzpt2-filter.iqU_2_long)>=delta_u ) { // напряжение еще падает count_detects = 0; } else { if (count_detects