dodany kod c od Krzyska po wielu modyfikacjach przez Gemini zeby usunac zalezność od TI-RTOS

This commit is contained in:
2026-02-19 11:59:33 +01:00
parent bf9c4596b8
commit d086ef28de
336 changed files with 52294 additions and 1006 deletions

507
src/R_67N_LWN.c Normal file
View File

@@ -0,0 +1,507 @@
/*
* R_67N_LWN.c
*
* Created on: 20-07-2016
* Author: Krzysztof Jakubczyk
*/
#include "tdefs.h"
#include "misc.h"
#include "r_67n_lwn.h"
#include "analog_in.h"
#include "helper.h"
#include "ZDistL.h"
#include <math.h>
int r_67n_lwn_initlog(void *arguments, void *logic)
{
struct r_67n_lwn_args *args = (struct r_67n_lwn_args *)arguments;
struct r_67n_lwn_logic *log = (struct r_67n_lwn_logic *)logic;
if(set_bit_ptr_struct(args->io.stan_bl_in,&log->stan_bl_))
return -1;
if(set_float_ptr(args->io.orta_I_float_in,&log->orta_I_))
return -1;
if(set_float_ptr(args->io.ortb_I_float_in,&log->ortb_I_))
return -1;
if(set_float_ptr(args->io.kwampl_I_float_in,&log->kwampl_I_))
return -1;
if(set_float_ptr(args->io.orta_U_float_in,&log->orta_U_))
return -1;
if(set_float_ptr(args->io.ortb_U_float_in,&log->ortb_U_))
return -1;
if(set_float_ptr(args->io.kwampl_U_float_in,&log->kwampl_U_))
return -1;
if(set_float_ptr(args->io.IL1_float_in,&log->IL1))
return -1;
if(set_float_ptr(args->io.IL2_float_in,&log->IL2))
return -1;
if(set_float_ptr(args->io.IL3_float_in,&log->IL3))
return -1;
if(set_float_ptr(args->io.Io2h_float_in,&log->Io2h))
return -1;
if(set_bit_ptr_struct(args->io.test_in,&log->test))
return -1;
if(set_bit_ptr_struct(args->io.l_odb_in,&log->l_odb))
return -1;
if(set_bit_ptr_struct(args->io.l_ok_in,&log->l_ok))
return -1;
if(set_bit_ptr_struct(args->io.w_out,&log->W))
return -1;
if(set_bit_ptr_struct(args->io.z1_out,&log->Z1))
return -1;
if(set_bit_ptr_struct(args->io.z2_out,&log->Z2))
return -1;
if(set_bit_ptr_struct(args->io.p1_out,&log->P1))
return -1;
if(set_bit_ptr_struct(args->io.p2_out,&log->P2))
return -1;
if(set_bit_ptr_struct(args->io.kier_out,&log->kier))
return -1;
if(set_bit_ptr_struct(args->io.NRL_out,&log->NRL))
return -1;
////
//status_rej = oczekiwanie;
log->nast_.on_ = args->params.bity & 0x0001;
log->nast_.w1 = args->params.bity & 0x0002;
log->nast_.w2 = args->params.bity & 0x0004;
log->nast_.Bl_2h1_ON = (args->params.bity & 0x0008)?1:0;
log->nast_.Bl_2h2_ON = (args->params.bity & 0x0010)?1:0;
log->nast_.bl_ = args->params.bity & 0x0020;
log->nast_.dir = args->params.dir;
log->nast_.Ir1 = args->params.I1 * args->params.I1; // wyliczenie wartosci rozruchowej pradu
log->nast_.Ir2 = args->params.I2 * args->params.I2; // wyliczenie wartosci rozruchowej pradu
log->nast_.Ip1 = log->nast_.Ir1 * args->params.kp * args->params.kp; // wyliczenie wartoci powrotu algorytmu
log->nast_.Ip2 = log->nast_.Ir2 * args->params.kp * args->params.kp; // wyliczenie wartoci powrotu algorytmu
log->nast_.kh1 = args->params.kh1 * args->params.kh1;
log->nast_.khp1 = log->nast_.kh1 * args->params.kp * args->params.kp;
log->nast_.kh2 = args->params.kh2 * args->params.kh2;
log->nast_.khp2 = log->nast_.kh2 * args->params.kp * args->params.kp;
log->nast_.U_echo = args->params.L_U_echo * args->params.L_U_echo; // wyliczenie wartosci rozruchowej blokady napieciowej
log->nast_.Ur = args->params.U * args->params.U; // wyliczenie wartosci rozruchowej blokady napieciowej
log->nast_.Up = log->nast_.Ur * args->params.kp * args->params.kp; // wyliczenie wartosci powrotu blokady napieciowej
log->nast_.orta = cos(args->params.kat * (3.14159f / 180)); // wartosc ortogonalnej a wektora przesuniecia dla kata charakterystycznego
log->nast_.ortb = sin(args->params.kat * (3.14159f / 180)); // wartosc ortogonalnej b wektora przesuniecia dla kata charakterystycznego
log->nast_.I1_2hr = args->params.Io2h1 * args->params.Io2h1;
log->nast_.I1_2hr_powr = (0.95 * args->params.Io2h1) * (0.95 * args->params.Io2h1);
log->nast_.t1 = ((args->params.t1 - 0.005f) * 100); //czas dzialania
if (log->nast_.t1) log->nast_.t0_1 = 0; else log->nast_.t0_1 = 1;
log->nast_.t2 = ((args->params.t2 - 0.005f) * 100); //czas dzialania
if (log->nast_.t2) log->nast_.t0_2 = 0; else log->nast_.t0_2 = 1;
log->nast_.l_nad_time=(u32)(args->params.L_t_nad * 1000);
log->nast_.l_t_blok=(u32)(args->params.L_T_odwr * 1000);
log->nast_.t1_min=(u32)((args->params.t1_min - 0.005f) * 100);
log->nast_.t2_min=(u32)((args->params.t2_min - 0.005f) * 100);
// *((uint8_t *)REG_FUNCTION_ON_OFF + id - 0x2400) = log->nast_.on_;
return 0;
}
void r_67n_lwn(void *arguments, void *logic)
{
struct r_67n_lwn_args *args = (struct r_67n_lwn_args *)arguments;
struct r_67n_lwn_logic *log = (struct r_67n_lwn_logic *)logic;
float local_orta_U_ ,local_ortb_U_, ILmax;
u8 wk,l_nrl;
if(log->nast_.on_) // jesli zabezpieczenie aktywne
{
log->w.kwampl_U_ = *log->kwampl_U_;
log->w.kwampl_I_ = *log->kwampl_I_;
log->w.orta_I_ = *log->orta_I_;
log->w.orta_U_ = *log->orta_U_;
log->w.ortb_I_ = *log->ortb_I_;
log->w.ortb_U_ = *log->ortb_U_;
log->w.IL1 = *log->IL1;
log->w.IL2 = *log->IL2;
log->w.IL3 = *log->IL3;
log->w.Io2h = *log->Io2h;
// przesuniecie napiecia o wektor kata nastawy
local_orta_U_ = log->w.orta_U_ * log->nast_.orta - log->w.ortb_U_ * log->nast_.ortb;
local_ortb_U_ = log->w.orta_U_ * log->nast_.ortb + log->w.ortb_U_ * log->nast_.orta;
// okreslenie kierunku
log->dw.kierunek = (log->w.orta_I_ * local_orta_U_ + log->w.ortb_I_ * local_ortb_U_) > 0;
if(!czy_test_R()) // w tescie nie uzywaj kierunku
check_and_set_struct(log->dw.kierunek,&log->kier);
switch(log->nast_.dir) //okeslenie kierunku stopnia 1
{
case 0:
wk = log->dw.kierunek;
break;
case 1:
wk = !log->dw.kierunek;
break;
case 2:
wk = 1;
break;
}
//sprawdzenie warunku napiciowego
log->dw.P_U |= log->w.kwampl_U_ > log->nast_.Ur;
log->dw.P_U &= log->w.kwampl_U_ > log->nast_.Up;
if(log->dw.Bl_2h1)
log->dw.Bl_2h1 = log->w.Io2h > log->nast_.I1_2hr_powr * log->w.kwampl_I_;
else
log->dw.Bl_2h1 = log->w.Io2h > log->nast_.I1_2hr * log->w.kwampl_I_;
if(log->dw.Bl_2h2)
log->dw.Bl_2h2 = log->w.Io2h > log->nast_.I1_2hr_powr * log->w.kwampl_I_;
else
log->dw.Bl_2h2 = log->w.Io2h > log->nast_.I1_2hr * log->w.kwampl_I_;
log->dw.Bl_2h1 &= log->nast_.Bl_2h1_ON;
log->dw.Bl_2h2 &= log->nast_.Bl_2h2_ON;
//Sprawdzenie przekaznikw pradowych
//szukanie maksymalnego pradu
ILmax = log->w.IL1;
if (ILmax < log->w.IL2) ILmax = log->w.IL2;
if (ILmax < log->w.IL3) ILmax = log->w.IL3;
//sprawdzenie pobudzenia stopnia 1
sprawdz_P(&log->dw.P1,
wk && log->dw.P_U && !log->dw.Bl_2h1 && log->w.kwampl_I_ > log->nast_.Ir1 && log->w.kwampl_I_ > (log->nast_.kh1 * ILmax),
!wk || !log->dw.P_U || log->dw.Bl_2h1 || log->w.kwampl_I_ < log->nast_.Ip1 || log->w.kwampl_I_ < (log->nast_.khp1 * ILmax),
&log->dw.lp1,
11,3
);
//sprawdzenie pobudzenia stopnia 2
sprawdz_P(&log->dw.P2,
wk && log->dw.P_U && !log->dw.Bl_2h2 && log->w.kwampl_I_ > log->nast_.Ir2 && log->w.kwampl_I_ > log->nast_.kh2 * ILmax,
!wk || !log->dw.P_U || log->dw.Bl_2h2 || log->w.kwampl_I_ < log->nast_.Ip2 || log->w.kwampl_I_ < log->nast_.khp2 * ILmax,
&log->dw.lp2,
11,3
);
//obsluga wejscia testu przekaznika
if (czy_test_R())
{
log->dw.P1 = log->dw.P2 = check_struct(&log->test)?1:0;
}
//
// realizacja blokady dzialania przekaznika
if(log->nast_.bl_ && check_struct(&log->stan_bl_) /*| czy_start()*/)
log->dw.P1 = log->dw.P2 = 0;
//
log->dw.Z1 |= (log->dw.P1 && log->nast_.t0_1); // jesli dziaanie bezzwoczne stopnia 1
log->dw.Z2 |= log->dw.P2 && log->nast_.t0_2; // jesli dziaanie bezzwoczne stopnia 2
log->dw.Z = log->dw.Z1 || log->dw.Z2;
if (log->dw.Z && !log->dw.Z_last) //zapisanie momentu zadziaania
{
log->dw.Z_last = 1;
// log->dw.czas_ = time;
}
check_and_set_struct(log->dw.P1,&log->P1);
check_and_set_struct(log->dw.P2,&log->P2);
check_and_set_struct(log->dw.Z1,&log->Z1);
check_and_set_struct(log->dw.Z2,&log->Z2);
check_and_set_struct(((log->dw.Z1 && log->nast_.w1) || (log->dw.Z2 && log->nast_.w2) || (log->l_echo && (args->params.bity & R67N_L_ECHO_WYL))) && !log->l_blok_wyl && !log->dw.Podwr,&log->W);
if(args->params.bity & R67N_L_AKT)
{
//nadawanie
l_nrl=0;
if(log->dw.P1 && args->params.bity & R67N_L_NADP1)
{
l_nrl=1;
log->l_nad_cnt=0;
}
if(log->dw.P2 && args->params.bity & R67N_L_NADP2)
{
l_nrl=1;
log->l_nad_cnt=0;
}
//odbior
if(!(args->params.bity & R67N_L_BLOK)) // gdy tryb zezwalajacy
{
if(check_struct(&log->l_odb) && check_struct(&log->l_ok) && !log->dw.Podwr)
{
if(log->dw.P1)
log->skr_t1=1;
else
log->skr_t1=0;
if(log->dw.P2)
log->skr_t2=1;
else
log->skr_t2=0;
}
else
{
log->skr_t1=0;
log->skr_t2=0;
}
}
else // tryb blokujacy
{
if(check_struct(&log->l_odb) && check_struct(&log->l_ok) && !log->dw.Podwr)
log->l_blok_wyl=1;
else
log->l_blok_wyl=0;
}
//
// echo
if(args->params.bity & R67N_L_ECHO)
{
sprawdz_P(&log->dw.PI0,
(log->w.kwampl_I_ > log->nast_.Ir1 && log->w.kwampl_I_ > log->nast_.kh1 * ILmax)||(log->w.kwampl_I_ > log->nast_.Ir2 && log->w.kwampl_I_ > log->nast_.kh2 * ILmax),
(log->w.kwampl_I_ < log->nast_.Ip1 || log->w.kwampl_I_ < log->nast_.khp1 * ILmax)&&(log->w.kwampl_I_ < log->nast_.Ip2 || log->w.kwampl_I_ < log->nast_.khp2 * ILmax),
&log->dw.lp3,
5,200
);
if(check_struct(&log->l_odb) && check_struct(&log->l_ok) && !log->dw.PI0 && log->w.kwampl_U_ > log->nast_.U_echo && !log->dw.Podwr)
{
l_nrl=1;
log->l_nad_cnt=0;
log->l_echo=1;
}
else
log->l_echo=0;
}
// LRC
if(args->params.bity & R67N_L_ODWR_PR)
{
sprawdz_P(&log->dw.Podwr,
!wk && log->dw.P_U && ((!log->dw.Bl_2h1 && log->w.kwampl_I_ > log->nast_.Ir1 && log->w.kwampl_I_ > (log->nast_.kh1 * ILmax))||(!log->dw.Bl_2h2 && log->w.kwampl_I_ > log->nast_.Ir2 && log->w.kwampl_I_ > (log->nast_.kh2 * ILmax))),
wk || !log->dw.P_U || ((log->dw.Bl_2h1 || log->w.kwampl_I_ < log->nast_.Ip1 || log->w.kwampl_I_ < (log->nast_.khp1 * ILmax))&&(log->dw.Bl_2h2 || log->w.kwampl_I_ < log->nast_.Ip2 || log->w.kwampl_I_ < (log->nast_.khp2 * ILmax))),
&log->dw.lp4,
40,log->nast_.l_t_blok
);
if(log->dw.Podwr)
{
l_nrl=0;
clear_struct(&log->NRL);
log->l_nad_cnt=0;
}
}
// wyslanie impulsu nadawania
if(l_nrl && !log->l_nad_cnt)
set_struct(&log->NRL);
if(log->l_nad_cnt>=log->nast_.l_nad_time)
{
clear_struct(&log->NRL);
if(!l_nrl)
log->l_nad_cnt=0;
}
else if(check_struct(&log->NRL))
log->l_nad_cnt++;
}
}
else
{
clear_struct(&log->Z1);
clear_struct(&log->Z2);
clear_struct(&log->W);
clear_struct(&log->P1);
clear_struct(&log->P2);
clear_struct(&log->NRL);
}
}
void r_67n_lwn_100hz(void *arguments, void *logic)
{
struct r_67n_lwn_logic *log = (struct r_67n_lwn_logic *)logic;
int t;
if(log->nast_.on_) // jesli zabezpieczenie aktywne
{
// realizacja przekaznika czasowego
if (log->dw.P1) log->dw.lt1++; else log->dw.lt1 = 0;
if (log->dw.P2) log->dw.lt2++; else log->dw.lt2 = 0;
if(log->skr_t1 && log->nast_.t1_min<log->nast_.t1)
t=log->nast_.t1_min;
else
t=log->nast_.t1;
if (log->dw.lt1 > t)
{
log->dw.Z1 = 1;
log->dw.lt1--;
}
if(log->skr_t2 && log->nast_.t2_min<log->nast_.t2)
t=log->nast_.t2_min;
else
t=log->nast_.t2;
if (log->dw.lt2 > t)
{
log->dw.Z2 = 1;
log->dw.lt2--;
}
//
//kasowanie zadziaa po odpadniciu pobudze
log->dw.P = log->dw.P1 || log->dw.P2;
if(!log->dw.P1)
log->dw.Z1=0;
if(!log->dw.P2)
log->dw.Z2=0;
if(!log->dw.P)
log->dw.Z=0;
log->dw.Z_last = log->dw.Z;
// realizacja rejestratora parametrow ostatniego zaklocenia
switch(status_rej)
{
case oczekiwanie:
if (log->dw.P)
{
log->dw.dl_ = 0; // start odliczania czasu dlugosci trwania zaklocenia
status_rej = sledzenie;
log->dw.max_orta_I = log->w.orta_I_;
log->dw.max_ortb_I = log->w.ortb_I_;
log->dw.max_orta_U = log->w.orta_U_;
log->dw.max_ortb_U = log->w.ortb_U_;
log->dw.max_I = log->w.kwampl_I_;
log->dw.max_U = log->w.kwampl_U_;
log->dw.I1 = log->w.IL1;
log->dw.I2 = log->w.IL2;
log->dw.I3 = log->w.IL3;
}
break;
case sledzenie:
if (log->dw.Z)
{
status_rej = sledzenie_zad;
//log->dw.czas_ = time; // zapisanie do bufora tymczasowego czasu wyslania impulsu wylacz dla rejestracji
}
if (log->dw.P)
{
if(log->w.kwampl_I_>log->dw.max_I)
{
log->dw.max_orta_I = log->w.orta_I_;
log->dw.max_ortb_I = log->w.ortb_I_;
log->dw.max_orta_U = log->w.orta_U_;
log->dw.max_ortb_U = log->w.ortb_U_;
log->dw.max_I = log->w.kwampl_I_;
log->dw.max_U = log->w.kwampl_U_;
log->dw.I1 = log->w.IL1;
log->dw.I2 = log->w.IL2;
log->dw.I3 = log->w.IL3;
log->dw.Io2h = log->w.Io2h;
}
log->dw.dl_++;
} else {
status_rej = oczekiwanie;
}
break;
case sledzenie_zad:
if (!log->dw.P)
{
log->dw.wsk_rej = 1; // zapamietanie faktu powstania zaklocenia z wylaczeniem
status_rej = zapis;
} else {
if(log->w.kwampl_I_>log->dw.max_I)
{
log->dw.max_orta_I = log->w.orta_I_;
log->dw.max_ortb_I = log->w.ortb_I_;
log->dw.max_orta_U = log->w.orta_U_;
log->dw.max_ortb_U = log->w.ortb_U_;
log->dw.max_I = log->w.kwampl_I_;
log->dw.max_U = log->w.kwampl_U_;
log->dw.I1 = log->w.IL1;
log->dw.I2 = log->w.IL2;
log->dw.I3 = log->w.IL3;
log->dw.Io2h = log->w.Io2h;
}
log->dw.dl_++;
}
break;
case zapis:
if (!log->dw.wsk_rej)
{
status_rej = oczekiwanie;
}
break;
}
}
}
void r_67n_lwn_20hz(void *arguments, void *logic)
{
struct r_67n_lwn_logic *log = (struct r_67n_lwn_logic *)logic;
// czesc ktora miala byc wykonywana max co 1s w wolnym czasie
if(log->dw.wsk_rej) // przypisanie parametrow zaklocenia jesli bylo zadzialanie i zabezpieczenie sie odwzbudzilo
{
log->dw.R.max_I_ = sqrt(log->dw.max_I); // wyliczenie maksymalnej wartosci pradu
log->dw.R.max_U_ = sqrt(log->dw.max_U); // wyliczenie wartosci napiecia
log->dw.R.I1 = sqrt(log->dw.I1);
log->dw.R.I2 = sqrt(log->dw.I2);
log->dw.R.I3 = sqrt(log->dw.I3);
log->dw.R.Io2h = sqrt(log->dw.Io2h);
log->dw.R.max_kat_ = (180 / 3.14159f) * (atan2(log->dw.max_ortb_I,log->dw.max_orta_I) - atan2(log->dw.max_ortb_U,log->dw.max_orta_U));// wyliczenie kata
// log->dw.R.moment_wystapienia = log->dw.czas_; // wpisanie czasu chwili zadzialania zabezpieczenia
// log->dw.R.dlugosc = (float)log->dw.dl_ * 0.01f; // / 100; // wpisanie czasu trwania zwarcia
// log->dw.R.czy_nowa = true; // sygnalizacja powstania nowej rejestracji
log->dw.wsk_rej = 0; // zerowanie wskaznika powstania nowego zaklocenia
}
}