Beiträge anzeigen

Diese Sektion erlaubt es ihnen alle Beiträge dieses Mitglieds zu sehen. Beachten sie, dass sie nur solche Beiträge sehen können, zu denen sie auch Zugriffsrechte haben.


Nachrichten - hugo

Seiten: 1 ... 84 85 [86] 87
1276
Bestehende Module / Existing Modules / Re: Brennersteuerung
« am: 31. Dezember 2006, 13:46:54 »
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.

1277
Bestehende Module / Existing Modules / Brennersteuerung
« am: 31. Dezember 2006, 13:31:50 »
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

*)

1278
Modulentwicklung / Module Development / wuensche und anregungen
« am: 31. Dezember 2006, 11:17:58 »
hier bitte wuensche fuer module einstellen, oscat bemueht sich die weiterentwicklung an die wuensche der benutzer anzupassen

1279
Bestehende Module / Existing Modules / Re: Aufrufprobleme PID-Regler
« am: 30. Dezember 2006, 12:34:09 »
weitere infos sch diesen link an seite 49

http://www.fen-net.de/karlheinz.john/

1280
Bestehende Module / Existing Modules / Re: Aufrufprobleme PID-Regler
« am: 30. Dezember 2006, 12:30:09 »
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....

1281
Bestehende Module / Existing Modules / Abstand zweier Datums
« am: 29. Dezember 2006, 14:58:41 »
die funktion date_delta(date1, date2)
berechnet den abstand zweier datumswerte in tagen

1282
Bestehende Module / Existing Modules / Datum und Zeiträume addieren
« am: 29. Dezember 2006, 14:57:32 »
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.


1283
Bestehende Module / Existing Modules / Berechnung des Osterdatums
« am: 29. Dezember 2006, 14:55:09 »
funktion easter(date); berechnet den ostersonntag für ein bestimmtes jahr
die meisten kirchlichen feiertage haben einen festen abstand von ostern

1284
Bestehende Module / Existing Modules / Berechnung von Feiertagen
« am: 29. Dezember 2006, 14:52:12 »
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.

1285
Bestehende Module / Existing Modules / Re: Pumpensteuerung
« am: 29. Dezember 2006, 11:39:35 »
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.

1286
Bestehende Module / Existing Modules / Re: Pumpensteuerung
« am: 28. Dezember 2006, 23:58:37 »
versuch doch einfach mal das modul aus der aktuellen oscat.lib
zugegeben in st ist vieles einfacher, dort kann man eben wirklich programmieren...
naja zumindest was sps anbelangt.

mit in schaltest du die pumpe an und aus.
manual ist ein override eingang für eine hand zwangssteuerung
rst setzt die timer des betriebsstundenzählers auf null.

der ausgang pump steuert die pumpe, und der ontime und cycles zählt betriebsstunden und ein aus zyklen.

wenn du auf das modul einen doppelclick machst
kannst du die werte für zwangssteuerung und minimale laufzeit einstellen.

viel spass

1287
oscat.lib fuer TwinCAT/CoDeSys / Re: Veröffentlichung Version 1.3
« am: 28. Dezember 2006, 23:54:28 »
wie ist das gemeint? verstehe ich nicht

1288
Bestehende Module / Existing Modules / Re: Aufrufprobleme PID-Regler
« am: 28. Dezember 2006, 18:26:28 »
hab das ganze mit eingangsvariblen aus einen fb schreiben probiert, es funktioniert.
jedoch werde ich erst nachlesen ob das iec confrom ist. wenn  ja mache ich die aenderung sie ist in jedem fall eine gute idee.

1289
Modulentwicklung / Module Development / Re: Mein PID-Regler
« am: 27. Dezember 2006, 00:02:42 »
hier der pid regler aus der oscat lib

FUNCTION_BLOCK FT_PID
VAR_INPUT
   actual, set_point, offset, manual_in : REAL;
   Manual : BOOL;
   rst : BOOL := FALSE;
END_VAR
VAR_INPUT
   KP, TN, TV, limit_L, limit_H : REAL;
END_VAR
VAR_OUTPUT
   Y : REAL;
   LIM, overflow : BOOL;
END_VAR
VAR
   integ : FT_INT;
   deriv : FT_deriv;
   diff: REAL;
END_VAR

(*
version 1.1   25 dec 2006
programmer    hugo
tested by      tobias

FT_PID is a pid controller with manual functionality.
The PID controller works according to the fomula Y = KP * ( e + 1/TN * INTEG(e) + TV *DERIV(e)) + offset, while e = set_point - actual.
a rst will reset all internal data, while a switch to manual will cause the controller to follow the function Y = manual_in + offset.
limit_h and Limit_l set the possible output range of Y.
the output flags lim will signal that the output limits are active and overflow will signal that the integrator has reached the max or min limit. 

since rev 1.1 the "trapezregel is used for more accuracy.
*)


IF rst OR KP = 0 THEN
   y := offset;
   integ(rst := 1);
   integ.rst := 0;
ELSIF manual THEN
   Y := manual_in + offset;
   integ(rst := 1);
   integ.rst := 0;
ELSE
   (* calcualtion of the actual PID values *)
   diff := set_point - actual;

   (* integrator is only called if TN > 0 othewrwise it is disabled *)
   IF TN > 0 THEN integ(in := diff, K := 1/TN, out_min := (limit_L - offset) / KP, out_max := (limit_H - offset) / KP); END_IF;
   deriv(in := diff, K := TV);

   (* check if integrator has reached the allowed limits and set overflow if necessary *)
   IF integ.Out >= (limit_H - offset) / KP THEN
      Y := limit_H;
      overflow := TRUE;
   ELSIF integ.Out <= (limit_L - offset) / KP THEN
      Y := limit_L;
      overflow := TRUE;
   ELSE
      Y := KP * (integ.Out + deriv.out + diff) + offset;
      overflow := FALSE;
   END_IF;

   (* this portion limits the output to limit_H and limit_L and set the lim flag if limits are exceeded *)
   IF Y > limit_H THEN
      Y := limit_H;
      Lim := TRUE;
   ELSIF Y < limit_L THEN
      Y := limit_L;
      lim := TRUE;
   ELSE
      lim := FALSE;
   END_IF;
END_IF;

1290
Bestehende Module / Existing Modules / Re: Pumpensteuerung
« am: 27. Dezember 2006, 00:01:06 »
hier das pump interface aus der oscat lib vielleicht kannst du das mitverwenden

FUNCTION_BLOCK actuator_pump
VAR_INPUT
   in : BOOL;
   manual : BOOL;
   rst : BOOL := FALSE;
END_VAR
VAR_INPUT CONSTANT
   min_ontime : TIME := t#10s;
   min_offtime : TIME := t#10s;
   run_every : TIME := t#10000m;
END_VAR
VAR_OUTPUT
   pump : BOOL;
   runtime : REAL;
   cycles : REAL;
END_VAR
VAR
   tx : TIME;
   last_change : TIME;
   meter : ontime;
   old_man : BOOL;
END_VAR

(*
   version 1.0   4 dec 2006
   programmer    oscat
   tested BY      oscat

actuator_pump is a pump interface which cam be controlled by an input in and an input manual.
in or manual high turns the pump output on.
a rst input is used to reset the runtime counters.
when the pump was not active for a time run_every the actuator turns on the pump automatically for min_ontime.
two setup variables min_ontime and min_offtime guarantee a minimum runtime and offtime of the pump.
the units are hours and the output type is real to prevent fromoverfow.

*)

tx := TIME();
IF rst THEN
   rst := FALSE;
   meter(rst := 1);
   meter.rst := 0;
ELSIF manual AND NOT pump AND NOT old_man THEN
   last_change := tx;
   pump := 1;
ELSIF NOT manual AND old_man AND pump AND NOT in THEN
   last_change := tx;
   pump := 0;
ELSIF in AND NOT pump AND tx - last_change >= min_offtime THEN
   last_change := tx;
   pump := 1;
ELSIF pump AND NOT in AND NOT manual AND tx - last_change >= min_ontime THEN
   last_change := tx;
   pump := 0;
ELSIF NOT pump AND tx - last_change >= run_every THEN
   last_change := tx;
   pump := 1;
END_IF;

meter(in := pump);
runtime := meter.ontime;
cycles := meter.cycles;
old_man := manual;

Seiten: 1 ... 84 85 [86] 87