//ovladani z UHTML
unsigned long U00; //ktere cidlo/rele 1-6
unsigned long pu00;
unsigned int sbernice;
//T1 -> S11, S21, S31
//T2 -> S12, S22, S32
//T3 -> S13, S23, S33
//T4 -> S14, S24, S34
//T5 -> S15, S25, S35
//T6 -> S16, S26, S36
signed long S11; //dolni teplota
signed long S21; //horni teplota
signed long S31; //akt teplota
signed long S12; //dolni teplota
signed long S22; //horni teplota
signed long S32; //akt teplota
signed long S13; //dolni teplota
signed long S23; //horni teplota
signed long S33; //akt teplota
signed long S14; //dolni teplota
signed long S24; //horni teplota
signed long S34; //akt teplota
signed long S15; //dolni teplota
signed long S25; //horni teplota
signed long S35; //akt teplota
signed long S16; //dolni teplota
signed long S26; //horni teplota
signed long S36; //akt teplota
//stav R1-R6 -> U41-U46
unsigned long U41; //rele 1
unsigned long U42; //rele 2
unsigned long U43; //rele 3
unsigned long U44; //rele 4
unsigned long U45; //rele 5
unsigned long U46; //rele 6
unsigned int rele; //jake rele je reseno
unsigned int hist; //histereze
unsigned int paramchangetime; //uptime posledni zmeny
unsigned int paramtimeout; //cas od posledni zmeny parametru po zapis do DF (60s)
unsigned int hb;
unsigned int lb;
void time(void)
{
unsigned int d, m, h, n, s; //y
d = SDS_get_u(5);
m = SDS_get_u(6);
//y = 2000 + SDS_get_u(7);
h = SDS_get_u(8);
n = SDS_get_u(9);
s = SDS_get_u(10);
printf("%u.%u. %02u:%02u:%02u ", d, m, h, n, s);
}
void main(void)
{
time();
printf("Start programu\n");
//zakladni nastaveni hodnot
S11=-9999;
S21=-9999;
S12=-9999;
S22=-9999;
S13=-9999;
S23=-9999;
S14=-9999;
S24=-9999;
S15=-9999;
S25=-9999;
S16=-9999;
S26=-9999;
U00=0;
pu00=0;
paramtimeout=6000; //60s po posledni zmene v html zapsat do df
paramchangetime=0;
hist=50; //0.5st
sbernice=2199; //sbernice A
//sbernice=2699; //sbernice B
nactizdf(0);
rele=1; //zacina se od 1.rele
while(1){
//kontrola, nacteni, ulozeni do DF novych hodnot z uziv.stranky
parametry();
//zapis do DF
zapisdf();
//akt.teploty do S3x
S31=SDS_get_i(sbernice+1);
S32=SDS_get_i(sbernice+2);
S33=SDS_get_i(sbernice+3);
S34=SDS_get_i(sbernice+4);
S35=SDS_get_i(sbernice+5);
S36=SDS_get_i(sbernice+6);
//akt.stav rele do U1x
U41=SDS_get_u(231);
U42=SDS_get_u(232);
U43=SDS_get_u(233);
U44=SDS_get_u(234);
U45=SDS_get_u(235);
U46=SDS_get_u(236);
//ovladani rele dle teplot
ovladani();
rele++;
if(rele>6) rele=1;
}
}
void parametry(void)
{
if(U00!=pu00){
pu00=U00;
time();
printf("Zmena nastavení (teploty 1-6) %i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i \n", S11, S21, S12, S22, S13, S23, S14, S24, S15, S25, S16, S26);
paramchangetime=SDS_get_u(3);
}
}
void nactizdf(unsigned int page)
{
signed char buffer[264]; // vzdy minimalne 264 bajtu
if (DF_read_page(0, &buffer) == 0){
time();
printf("Nepovedlo se přečíst stránku 0 z DF\n");
} else {
S11=-1*(buffer[11]*100+buffer[12]);
S21=-1*(buffer[13]*100+buffer[14]);
S12=-1*(buffer[15]*100+buffer[16]);
S22=-1*(buffer[17]*100+buffer[18]);
S13=-1*(buffer[19]*100+buffer[20]);
S23=-1*(buffer[21]*100+buffer[22]);
S14=-1*(buffer[23]*100+buffer[24]);
S24=-1*(buffer[25]*100+buffer[26]);
S15=-1*(buffer[27]*100+buffer[28]);
S25=-1*(buffer[29]*100+buffer[30]);
S16=-1*(buffer[31]*100+buffer[32]);
S26=-1*(buffer[33]*100+buffer[34]);
if (DF_read_page(1, &buffer) == 0){
time();
printf("Nepovedlo se přečíst stránku 1 z DF\n");
} else {
if(S11==0) S11=buffer[11]*100+buffer[12];
if(S21==0) S21=buffer[13]*100+buffer[14];
if(S12==0) S12=buffer[15]*100+buffer[16];
if(S22==0) S22=buffer[17]*100+buffer[18];
if(S13==0) S13=buffer[19]*100+buffer[20];
if(S23==0) S23=buffer[21]*100+buffer[22];
if(S14==0) S14=buffer[23]*100+buffer[24];
if(S24==0) S24=buffer[25]*100+buffer[26];
if(S15==0) S15=buffer[27]*100+buffer[28];
if(S25==0) S25=buffer[29]*100+buffer[30];
if(S16==0) S16=buffer[31]*100+buffer[32];
if(S26==0) S26=buffer[33]*100+buffer[34];
time();
printf("Stránka 0 a 1 přečtena z DF. Načtené hodnoty:\n", page);
printf("Teploty pro rele 1: %i, %i\n", S11, S21);
printf("Teploty pro rele 2: %i, %i\n", S12, S22);
printf("Teploty pro rele 3: %i, %i\n", S13, S23);
printf("Teploty pro rele 4: %i, %i\n", S14, S24);
printf("Teploty pro rele 5: %i, %i\n", S15, S25);
printf("Teploty pro rele 6: %i, %i\n", S16, S26);
}
}
}
void zapisdf(void)
{
if(paramchangetime>0 && paramchangetime+paramtimeout<SDS_get_u(3)){
paramchangetime=0;
ulozdodf(0);
}
}
void ulozdodf(unsigned int page)
{
if (page==0){
unsigned int i;
unsigned char zbuffer[264]; // vzdy minimalne 264 bajtu - zaporne
unsigned char pbuffer[264]; // vzdy minimalne 264 bajtu - plus
//zaporne hodnoty jsou v page 0
for (i=11; i<=34; i++){
zbuffer[i]=0;
pbuffer[i]=0;
}
if(S11<0){
zbuffer[11]=-1*S11 / 100; //hb
zbuffer[12]=-1*S11 % 100; //lb
} else {
pbuffer[11]=S11 / 100; //hb
pbuffer[12]=S11 % 100; //lb
}
if(S21<0){
zbuffer[13]=-1*S21 / 100; //hb
zbuffer[14]=-1*S21 % 100; //lb
} else {
pbuffer[13]=S21 / 100; //hb
pbuffer[14]=S21 % 100; //lb
}
if(S12<0){
zbuffer[15]=-1*S12 / 100; //hb
zbuffer[16]=-1*S12 % 100; //lb
} else {
pbuffer[15]=S12 / 100; //hb
pbuffer[16]=S12 % 100; //lb
}
if(S22<0){
zbuffer[17]=-1*S22 / 100; //hb
zbuffer[18]=-1*S22 % 100; //lb
} else {
pbuffer[17]=S22 / 100; //hb
pbuffer[18]=S22 % 100; //lb
}
if(S13<0){
zbuffer[19]=-1*S13 / 100; //hb
zbuffer[20]=-1*S13 % 100; //lb
} else {
pbuffer[19]=S13 / 100; //hb
pbuffer[20]=S13 % 100; //lb
}
if(S23<0){
zbuffer[21]=-1*S23 / 100; //hb
zbuffer[22]=-1*S23 % 100; //lb
} else {
pbuffer[21]=S23 / 100; //hb
pbuffer[22]=S23 % 100; //lb
}
if(S14<0){
zbuffer[23]=-1*S14 / 100; //hb
zbuffer[24]=-1*S14 % 100; //lb
} else {
pbuffer[23]=S14 / 100; //hb
pbuffer[24]=S14 % 100; //lb
}
if(S24<0){
zbuffer[25]=-1*S24 / 100; //hb
zbuffer[26]=-1*S24 % 100; //lb
} else {
pbuffer[25]=S24 / 100; //hb
pbuffer[26]=S24 % 100; //lb
}
if(S15<0){
zbuffer[27]=-1*S15 / 100; //hb
zbuffer[28]=-1*S15 % 100; //lb
} else {
pbuffer[27]=S15 / 100; //hb
pbuffer[28]=S15 % 100; //lb
}
if(S25<0){
zbuffer[29]=-1*S25 / 100; //hb
zbuffer[30]=-1*S25 % 100; //lb
} else {
pbuffer[29]=S25 / 100; //hb
pbuffer[30]=S25 % 100; //lb
}
if(S16<0){
zbuffer[31]=-1*S16 / 100; //hb
zbuffer[32]=-1*S16 % 100; //lb
} else {
pbuffer[31]=S16 / 100; //hb
pbuffer[32]=S16 % 100; //lb
}
if(S26<0){
zbuffer[33]=-1*S26 / 100; //hb
zbuffer[34]=-1*S26 % 100; //lb
} else {
pbuffer[33]=S26 / 100; //hb
pbuffer[34]=S26 % 100; //lb
}
time();
if (DF_write_page(0, &zbuffer) == 0){
printf("Nepovedlo se zapsat stránku 0 do DF\n");
} else {
printf("Stránka 0 zapsána do DF\n");
}
time();
if (DF_write_page(1, &pbuffer) == 0){
printf("Nepovedlo se zapsat stránku 1 do DF\n");
} else {
printf("Stránka 1 zapsána do DF\n");
}
}
}
void ovladani()
{
int t1; int t2;
switch(rele){
case 1:
t1=S11;
t2=S21;
break;
case 2:
t1=S12;
t2=S22;
break;
case 3:
t1=S13;
t2=S23;
break;
case 4:
t1=S14;
t2=S24;
break;
case 5:
t1=S15;
t2=S25;
break;
case 6:
t1=S16;
t2=S26;
break;
}
nastavrele(t1, t2);
}
void nastavrele(int t1, int t2)
{
unsigned int r; unsigned int c; unsigned int st; unsigned int n; int ta;
n=0; //novy stav rele
r=rele+230;
st=SDS_get_u(r); //akt stav rele
if (st!=0) n=1;
c=rele+sbernice;
ta=SDS_get_i(c); //akt teplota
if (ta<t1-hist && st!=0) {n=0;}
if ((ta>=t1 && st==0) && (ta<=t2 && st==0)) {n=1;}
if (ta>t2+hist && st!=0) {n=0;}
if (n==1){
if (st==0){
SDS_set_u(r, 0xFF); //zap rele
time();
printf("Rele %u sepnuto. Teplota %i\n", rele, ta);
}
} else {
if (st!=0){
SDS_set_u(r, 0x00); //vyp rele
time();
printf("Rele %u vypnuto. Teplota %i\n", rele, ta);
}
}
}