Klimaanlagen-Steuerung (Simulation)

Newbert
2010-10-29
2010-10-29
  • Newbert - 2010-10-29

    Hallo CoDeSys-Gemeinde,

    kurz vor weg, ich bin absoluter Beginner in dem Bereich...

    Ich habe ein kleines Programm geschrieben, das 2 Klimaanlagen (simuliert) prüfen und im Fall "x" von einer auf die andere Klimaanlage schalten soll.

    PROGRAM PLC_PRG
    VAR
    Taster1 AT %IX0.0 : BOOL; ( Channel 1 of first 750-400 )
    Stoerer1 AT %IX0.1 : BOOL; ( Channel 2 of first 750-400 )
    Taster2 AT %IX0.2 : BOOL; ( Channel 1 of second 750-400 )
    Stoerer2 AT %IX0.3 : BOOL; ( Channel 2 of second 750-400 )
    Status1 AT %QX0.0 : BOOL; ( Channel 1 of third 750-501 )
    Status2 AT %QX0.1 : BOOL; ( Channel 2 of third 750-501 )

    END_VAR

    IF Stoerer1 = FALSE AND Stoerer2 = FALSE THEN
    IF Taster1 = TRUE THEN
    Status1 := TRUE;
    Status2 := FALSE;
    END_IF
    IF Taster2 = TRUE THEN
    Status1 := FALSE;
    Status2 := TRUE;
    END_IF
    END_IF

    IF Stoerer1 =TRUE AND Stoerer2 = FALSE THEN
    Status1 := FALSE;
    Status2 := TRUE;
    END_IF

    IF Stoerer1 = FALSE AND Stoerer2 = TRUE THEN
    Status1 := TRUE;
    Status2 := FALSE;
    END_IF

    IF Stoerer1 = TRUE AND Stoerer2 = TRUE THEN
    Status1 := FALSE;
    Status2 := FALSE;
    END_IF

    IF Stoerer1 = FALSE AND Stoerer2 = FALSE AND Status1 = FALSE AND Status2 = FALSE THEN
    Status1 := TRUE;
    END_IF

    Bei dem Störer handelt es sich um einen RASTER, bei dem Taster um einen TASTER.

    Ich habe nun das Problem, das ich es nicht realisiert bekomme, die Systeme auszuschalten sondern immer ein Gerät läuft oder eben beide gestört sind.
    Hat jemand von euch einen Tipp oder eine Idee wie ich das am besten realisieren kann?
    Die Klimaanlagen müssen auch auszuschalten sein...

    Vielen lieben Dank schon mal vorab für's lesen.
    -Bei Antworten und Tipps ein noch viel grösseres DANKE!

    Liebe Grüße,
    David

     
  • Erik Böhm - 2010-10-29

    Moin

    Ich hab das jetzt 3 mal durchgelesen und immer noch nicht verstanden was eigentlich passieren soll...

    Aber generell, hast du schon mal an eine 'case' Anweisung gedacht ?

    Gruß
    Erik

     
  • Newbert - 2010-10-29

    Ja, da die Schalter (Taster + Störer) BOOL sind, geht's nicht. Denn CASE benötigt INT...

    Liebe Grüße,
    David

     
  • Erik Böhm - 2010-10-29

    Servus

    Das ist mir auch schon bekannt

    Ich dachte an eine StateMachine wie:

    case iState of
    1:
    Prüfen ob min eine von beiden bereit, wenn ja, dann einschalten und Taster abfragen, wenn nein, dann iState = 10 usw...
    10:
    ;
    20:
    ;
    end_case

     
  • Newbert - 2010-10-29

    Achso, also das Problem einfach umgehen...
    Hmm, joa... ich bastel damit gleich noch mal rum.

    Allerdings läuft mir die Zeit davon, das ist ein Projekt das heute Nachmittag fertig sein soll

    Mir fehlen nur noch zwei Feinheiten, ein TIMER der automatisch nach 60 Sekunden von einer auf die anderen Anlage schaltet und dann eben ein Schalter der jeweils die Anlagen komplett ausschaltet. Und da verzweifel ich leider Gottes dran.

    Danke dir für deine Anregung mit dem "CASE"!!

    Liebe Grüße aus Dortmund,
    David

     
  • Erik Böhm - 2010-10-29

    Na dann mach doch einfach am Schluss des Ablaufs einen Schalter:

    if bAllOff then
    Status1 := FALSE;
    Status2 := FALSE;
    end_if

    Timer etwa so:
    Timer: TON;

    Timer(IN:= Status1 or Status2,PT := t#60s);
    if Timer.Q then
    Status1 := not Status1;
    Status2 := not Status2;
    end_if

    Gruß Erik

     
  • Newbert - 2010-10-29

    Hallo Erik,

    der Timer funktioniert soweit.
    Allerdings weiss ich leider nicht wo ich den Timer positionieren soll...
    Denn die anderen Funktionen dürfen dadurch nicht beeinträchtigt werden und der Timer soll immer wieder Starten wenn der Status gewechselt hat. ...Aaaarrrrrrr, es tut mir leid, ich bin leider ein blutiger Anfänger :-/

    Liebe Grüße,
    David

     
  • Erik Böhm - 2010-10-29

    Dann musst du als Startbedingung (IN) für den Timer das Wechselereignis eintragen (also z.B. Status1 <> Status1Old) oder so.
    Der Timer startet immer bei steigender Flanke von IN.

    Wo du den dann positionierst wird wohl egal sein.
    Denn wie sagt Sepp Herberger:

    Nach dem Ablauf ist vor dem Ablauf .

    Ich hab dann aber demnächst Feierabend.
    Ich kuck heut abend dann noch mal rein ob du schon verzweifelt bist.

    Gruß
    Erik

     

Log in to post a comment.