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

}
Exemple #3
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);
			}