-Menü

Beiträge anzeigen

Dieser Abschnitt erlaubt es Ihnen, alle Beiträge anzusehen, die von diesem Mitglied geschrieben wurden. Beachten Sie, dass Sie nur Beiträge sehen können, die in Teilen des Forums geschrieben wurden, auf die Sie aktuell Zugriff haben.

Beiträge anzeigen-Menü

Beiträge - hugo

#1276
zur regelungstechnik ist vielfach ein totzeitglied noetig, welches aber in software nur unzureichend implememtiert werden kann da es nur endliche samples eines eingangs innerhalb gegebener zeit machen kann.
da je nach anwendung unterschiedliche aufloesung (anzahl der samples) nötig sind haben wir uns entschlossen mehrere totzeitglieder (verzoegerungsglied) mit unterschiedlicher auflösung zu programmieren.
FT_TN8, FT_TN16 und FT_TN64

anbei der code fuer das FT_TN8

FUNCTION_BLOCK FT_TN8
VAR_INPUT
   in : REAL;
   T : TIME;
END_VAR
VAR_OUTPUT
   out : REAL;
END_VAR
VAR
   length : INT := 8;
   X : ARRAY[0..7] OF REAL;
   cnt : INT;
   last : TIME;
   tx: TIME;
   init: BOOL;
END_VAR

(*
version 1.0   1 Jan 2007
programmer    hugo
tested by      tobias

FT_TN8 is delay function, it will delay a signal by a specified time : T and will store 8 values of in before they are put thru to out.
if higher resolution is needed, pls use FT_TN16 or FT_TN64 instead.

*)

tx := TIME();
IF NOT init THEN
   x[cnt] := in;
   init := TRUE;
   last := tx;
ELSIF tx - last >= T / length THEN
   IF cnt = length - 1 THEN cnt := 0; ELSE cnt := cnt + 1; END_IF;
   Out := X[cnt];
   x[cnt] := in;
   last := tx;
END_IF;
#1277
beliebig, es gilt nur fuer den fall das die flamme im betrieb abbricht, nicht für den start, dort gilt nur einmal,
wenn die flamme im betrieb abreisst wird einmal versucht wieder zu zuenden, geht dies nicht kommt sofort stoerung.
#1278
hier der neue code aber noch ohne 2te stufe, denke ich mache einen weiteres modul fuer die 2 stufigen brenner, möchte aber erst das jetzige ausgetestet haben

das mit dem flammwaechster schaue ich mir anfang des neuen jahres an wenn ich den brenner vor mir habe, in jedem fall sollte das signal aber ausserhalb dieses moduls verarbeitet werden.
entweder schalteingang oder analogeingang mit analogverarbeitung in software.

wenn du mir testen helfen kannst waere das super.

viele gruesse und guten rutsch ins neue jahr


#1279
danke fuer deine inputs, die machen sinn, habe es momentan nach vorgaben von wolf und hoval gemacht, die kennen keine vorwaermung, werde es aber einbauen.

werde das modul auch auf eine 2te brennerstufe erweitern
#1280
ich habe das modul soeben geschrieben und simuliert, aber noch nicht im einsatz.
ich gehe davon aus das der flammwaechster ein simples ein / aus signal also kontakt liefert.
zum einsatz soll es erstamals kommen an einem buderus 85KW kessel mit wolf brenner.
#1281
ganz einfach ueber einen eingang an der sps
das modul hat eingaenge für in (steuerbefehl), flamme (flammwaechster), over_temp (temp_schutz des kessels)
sowie rst (reset puls nach fehler) und betriebsstunden rst fuer den betriebsstundenzaehler.

natuerlich macht das ganze nur dann sinn wenn du mit den funktionen deines vorhandenen steuergeraetes nicht zufrieden bist oder wenn wie in meinem fall erst gar keines vorhaden ist.
#1282
FUNCTION_BLOCK Burner
VAR_INPUT
   in : BOOL;
   over_temp : BOOL;
   oil_temp : BOOL := TRUE;
   Flame : BOOL;
   rst : BOOL;
   rst_timer : BOOL;
END_VAR
VAR_INPUT CONSTANT
   vorheizzeit : TIME := t#5s;
   vorbelueftungszeit : TIME := t#15s;
   vorzuendzeit : TIME := t#5s;
   nachzuendzeit : TIME := t#25s;
   sicherheitszeit : TIME := t#5s;
   sperrzeit : TIME := t#10s;
   mehrfachzuendung : BOOL := TRUE;
   KW : REAL;
END_VAR
VAR_OUTPUT
   motor : BOOL;
   oel_ventil : BOOL;
   pre_heat: BOOL;
   zuendung : BOOL;
   betriebsstunden : REAL;
   KWh : REAL;
   fail : BYTE;
END_VAR
VAR
   state : BYTE;
   last : TIME;
   tx: TIME;
   last_change: TIME;
   timer : ontime;
   oil_temp_last: BOOL;
END_VAR

(*
version 1.3   31 dec 2006
programmer    oscat
tested by      tobias

burner ist eine Oel-Brenner_steuerung fuer nichtmodulierende Oelbrenner
die steuerung kann ueber setup werte programmiert werden und entsprechenden brennern angepasst werden.
die vorheizzeit ist die zeit die eine oelvorwaermung aufgeheizt wird bevor der motor gestartet wird.
der eingang oil_temp gibt an ob die oil_temp erreicht wurde, er ist default auf true und kann auch offen gelassen werden.
die vorbelueftungszeit ist die zeit die der luefter laeuft bevor die oelzufuhr freigegeben wird.
die vorzuendzeit iust diejenige zeit die die zuendung vor offnen des oelventiel gestartet wird.
nachzuendzeit ist die zeit die nach entzuendung der flamme noch gezuendet wird.
die sicherheitszeit ist die zeit nach der die oelzufuhr gesperrt wird wenn keine flamme entsteht.
nach ablauf der sicherheitszeit wird ein fehler flag gesetzt und kann erst nach der sperrzeit wieder durch einen reset geloescht werden.
waehrend der sperrzeit ist keine weitere zuendung oder einschalten moeglich.
das flag mehrfachzuendung gibt an ob eine erloschene flamme in betrieb automatisch wieder gezuendet werden soll.
der flammwaechster liegt auf eingang flamme, ein uebertemperaturschutz auf dem eingang over_temp
der betriebsstundenzaehler gibt die brennerstunden in stunden als real ausgabewer an.
der ausgang motor steuert den luefter / pumpenmotor, oil_ventil schaltet das oil ventil und zuendung schaltet die zuendung ein.

if output fail > 0 an error happened and the output has an error code:
0 :   no error
1 :   pre heating time expired and oil temp input is not true
2 :   flame monitor is active during preheating time
3 :   flame monitor active during pre_ventilation_time
4 :   no ignoition during safety time
5 :   no flame during operation
9 :   overtemp input is true

*)

tx := TIME();

(* check rst input and rst if true *)
IF rst OR over_temp OR state = 0 THEN
   IF fail > 0 AND tx - last >= sperrzeit AND rst THEN
      fail := 0;
   ELSE
      (* normaler reset *)
      motor := FALSE;
      oel_ventil := FALSE;
      zuendung := FALSE;
      pre_heat := FALSE;
      IF over_temp THEN fail := 9; END_IF;
      last_change := tx;
      last := tx;
      state := 1;
   END_IF;
END_IF;

(* check for timer rst and rst timer if true *)
IF rst_timer THEN
   timer( rst := TRUE);
   timer.rst := FALSE;
END_IF;

CASE state OF

1:   (* in signal starts oil pre heating *)
   IF in AND NOT flame THEN
      pre_heat := TRUE;
      state := 2;
      last_change := tx;
   END_IF;

2:   (* after pre_heating time start motor *)
   IF (tx- last_change >= vorheizzeit AND oil_temp) OR (oil_temp AND NOT oil_temp_last) THEN
      motor := TRUE;
      state := 3;
      last_change := tx;
   (* vorheizzeit ist abgelaufen und oil_temp ist nicht aktiv *)
   ELSIF tx - last_change >= vorheizzeit AND NOT oil_temp THEN
      state := 7;
      pre_heat := FALSE;
      fail := 1;
      last_change := tx;
   (* flame monitor cannot be active at this time *)
   ELSIF flame THEN
      state := 7;
      pre_heat := FALSE;
      fail := 2;
      last_change := tx;
   END_IF;

3:   (* abwarten bis zündung eingeschaltet werden kann *)
   IF tx - last_change >= vorbelueftungszeit - vorzuendzeit THEN
      zuendung := TRUE;
      state := 4;
      last_change := tx;
   (* flame monitor cannot be active at this time *)
   ELSIF flame THEN
      state := 7;
      pre_heat := FALSE;
      motor := FALSE;
      fail := 3;
      last_change := tx;
   END_IF;

4:   (* warten bis oelzufuhr geoeffnet werden darf *)
   IF tx - last_change >= vorzuendzeit THEN
      oel_ventil := TRUE;
      state := 5;
      last_change := tx;
   END_IF;

5:   (* warten auf flammwaechter und falls noetig abschalten *)
   IF tx - last_change >= sicherheitszeit OR flame THEN
      IF NOT flame THEN
         (* notabschaltung da flammwaechster nicht angesprochen hat *)
         state := 7;
         motor := FALSE;
         oel_ventil := FALSE;
         pre_heat := FALSE;
         zuendung := FALSE;
         fail := 4;
         last_change := tx;
      ELSE
         state := 6;
         last_change := tx;
      END_IF;
   END_IF;

6:   (* brenner läuft, flammueberwachung und nach ablauf der nachzuendungszeit zuendung abschalten *)
   IF NOT flame AND NOT mehrfachzuendung THEN
      (* notabschaltung da flammwaechster keine flamme meldet *)
      state := 7;
      motor := FALSE;
      oel_ventil := FALSE;
      pre_heat := FALSE;
      zuendung := FALSE;
      fail := 5;
      last_change := tx;
   ELSIF NOT flame AND mehrfachzuendung THEN
      zuendung := TRUE;
      state := 5;
      last_change := tx;
   ELSIF tx - last_change >= nachzuendzeit THEN
      (* nachzuendzeit abgelaufen, zuendung abschalten *)
      zuendung := FALSE;
   END_IF;

END_CASE;

(* abschaltung wenn kein eingangssignal *)
IF NOT in AND state > 1 THEN
   state := 1;
   motor := FALSE;
   oel_ventil := FALSE;
   zuendung := FALSE;
   pre_heat := FALSE;
   last_change := tx;
END_IF;

(* betriebsstundenzähler *)
timer(in := flame AND in AND motor AND oel_ventil);
betriebsstunden := timer.ontime;
KWH := betriebsstunden * KW;

(* zeit fuer naechsten aufruf merken *)
last := tx;


(*
31.12.2006   hm      rev 1.1
   added pre_heat timing and output
   flame monitor bofe ignition will generate failure output
   added output for KWh

31.12.2006   hm      rev 1.2
   added oil_temp_input

31.12.2006   hm      rev 1.3
   changed fail output to be byte instead of bool

*)
#1283
hier bitte wuensche fuer module einstellen, oscat bemueht sich die weiterentwicklung an die wuensche der benutzer anzupassen
#1284
weitere infos sch diesen link an seite 49

http://www.fen-net.de/karlheinz.john/
#1285
habe folgendes gefunden:

in iec61131-3 von john tiegelkamp. seite 41 schreibt ganz klar das eine var_input innerhalb einer poe oder funktionsblock nur gelesen werden darf.
bei einer var_in_out ist dies anders, diese ist jedoch nur ein pointer auf die uebergebene variable, und hat weiterhin das problem der doppelten darstellung in einer grafischen sprache wie cfc


habe es zwar getetset, und unter codesys festgestellt ein funktionsbaustein kann sehr wohl eine var_input beschreiben, betrachte es aber als gefährlich so etwas zu verwenden.
für mich wäre es nur dann akzeptabel wenn die norm dies explizit erlauben würde.


fazit, in oscat wollen wir portabel bleiben und von keiner plattform abhaengig sein deshalb koennen wir dies nicht verwenden.
sorry....
#1286
die funktion date_delta(date1, date2)
berechnet den abstand zweier datumswerte in tagen
#1287
add_date(datum, tage, wochen, Monate, Jahre)

addiert zu einem gegebenen Datum tage, wochen, Monate, oder Jahre.
es koennen sowohl positive als auch negative Zahlen addiert also auch subtrahiert werden.

#1288
funktion easter(date); berechnet den ostersonntag für ein bestimmtes jahr
die meisten kirchlichen feiertage haben einen festen abstand von ostern
#1289
functiopn block holiday(date);
leifert ein boolsches ausgangssignal wenn am aktuellen datum ein feiertag ist und zugleich einen string mit dem namen des feiertags.
die feiertage sind in arrays constant gespeichert und koennen beliebig veraendert werden.
die feiertage koennen festes datum, referenz zu ostern oder mit wochentag vor einem datum beschrieben werden und erlauben so die einfache definition aller möglichen feiertage.
die derzeit in deutschland gültigen feiertage sind bereits vordefiniert und koennen ganz einfach erweitert werden.
#1290
den input manual musst du ja nicht benutzen, wenn er einfach offen bleibt wird er nicht benutzt
die zwangssteuerung ist aber nicht der manual eingang,
eine zwangssteuerung sorgt dafür das die pumpe alle xxx stunden automatisch yyy minuten läuft, als schutz um nicht festzusetzen.