/** * PI-Regler Berechnung durchführen * * @param soll der Sollwert * @param ist der Istwert * @param takt Zeit zwischen den Aufrufen der Funktion (in min) * @return Stellwert 0 bis 100 Prozent */ static int _pi_step(int soll, int ist, int takt) { int e, kp, stell_alt, v4; // Verstärkung berechnen kp = 200 / g_p1; // Fehler berechnen e = soll - ist; #ifdef DEBUG rs_send_s("ps: e="); rs_send_dec(e); rs_send_s("\n"); #endif stell_alt = g_stell; if (stell_alt <= 100 && stell_alt >= 0) // Fehler aufsummieren g_esum += e; v4 = g_esum * kp * takt / g_p2; g_stell = e * kp + v4; #ifdef DEBUG rs_send_s("ps: stell="); rs_send_dec(g_stell); rs_send_s("\n"); rs_send_s("ps: esum="); rs_send_dec(g_esum); rs_send_s("\n"); #endif if (g_stell > 100) { g_stell = 100; g_esum = (stell_alt - e * kp) * g_p2 / kp / takt; #ifdef DEBUG rs_send_s("ps: esum="); rs_send_dec(g_esum); rs_send_s("\n"); #endif } if (g_stell < 0 || g_esum < 0) { #ifdef DEBUG rs_send_s("ps: llim\n"); #endif g_esum = 0; if (g_stell < 0) g_stell = 0; } return g_stell; }
/** * RTC Interrupt (simuliert durch polling) */ void RTC_IRQ(void) //interrupt 10 // = RTC Interrupt { // wird alle 0.5 ms aufgerufen byte c; byte state; // for (c=0;c<2;c++) { NextDimmschritTime[c]--; if (NextDimmschritTime[c] == 0) { // Zeit für Dimmschritt if (dim_val_soll[c]>dim_val_ist[c]) dim_val_ist[c]++; else if (dim_val_soll[c]<dim_val_ist[c]) dim_val_ist[c]--; else SendRueckmeldung(c,dim_val_ist[c]); BerechneDauer(c); NextDimmschritTime[c] = dimmschritt[c]; #ifdef debugRTC rs_send_s("\nIst:"); rs_send_dec(dim_val_ist[0]); rs_send_s(","); rs_send_dec(dim_val_ist[1]); #endif } // Zeit seit letztem U-IRQ hochzählen if (TimeSinceUIRQ[c]<0xFFFF)TimeSinceUIRQ[c]++; // Kurzschlußdauer hochzählen if (c==KANAL1) state = P_K_C1; else state = P_K_C2; if(state & !IstSpannungsausfall[c]) { // Wenn Kurzschlußsignal und nicht Spannungsausfall if (TimeSinceShort[c]<0xFFFF) TimeSinceShort[c]++; // Kurzschlußzeit hochzählen } else { TimeSinceShort[c] = 0; } } }
// Empfangenes Telegramm verarbeiten void write_value_req(void) { unsigned char length,n=0; unsigned int ga; unsigned int val=0; eibledcount=0xff;// EIBLED lang einschalten length=telegramm[5]&0x0F; if (length<=15 ) {// wenn ein Telegramm reinkommt.. if(length==1)val=telegramm[7] & 0x3F; if(length==2)val=telegramm[8] ; if(length==3)val=256*telegramm[8]+telegramm[9]; ga=256*telegramm[3]+telegramm[4]; if(filtermode){ for(n=0;n<=61;n++) { // Wert der GA aus Flash lesen if(ga_db[n].ga==ga) { n=63; } } } if ((n>=63 || !filtermode)) { if(!tel_sent){ rs_send_dec(telegramm[3]>>3); // GA senden rs_send('/'); rs_send_dec(telegramm[3] & 0x07); rs_send('/'); rs_send_dec(telegramm[4]); rs_send('='); if (length<=3) rs_send_dec(val); // Value senden if(length==4){ n='.'; if(telegramm[8]>31){// time rs_send((telegramm[8]>>5)+'0'); rs_send(','); n=':'; } rs_send_dec(telegramm[8]&0x1F); rs_send(n); rs_send_dec(telegramm[9]); rs_send(n); rs_send_dec(telegramm[10]); } if(length>4){ for(n=8;n <= length+6;n++){ rs_send(telegramm[n]); } } rs_send_s("\n"); // CR LF //rs_send(10); }