TIA IEC-Zeitfunktionen Programm aus Skizze ableiten: Ist dieser Lösungsansatz richtig?

Dazai

Level-1
Beiträge
30
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

es handelt sich um folgende Abbildungen, für die ich ein Programm schreiben muss.
1658857224079.png
Meine (etwas merkwürdige) Lösung sieht aus wie folgt:
1658857210792.png
Die Variablen sind noch nicht deklariert, daher die Fehler einfach ignorieren.
Die Lösung sieht für mich erstmal merkwürdig aus, aber mir fällt gerade nicht ein, wie man diese Aufgabe lösen kann. Ich wäre für ein paar Ansätze sehr dankbar.
 
erst mal als ansatz. (komplette lösung gibts hier normalerweise nicht)
der ton läuft nur wenn in=1. also flanke funktioniert nicht.
am timer 2 den ausgang mit seinen 2 sec dranschalten.
...... und dann schaun wir mal
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Dazai, die positive Flanke ist für genau einen Zyklus "True" die Einschaltverzögerung braucht aber länger True als die ESV- Zeit (in dem Fall >2sek.)
Da du ja TIA Portal hast, erstelle die Variablen und Simuliere das mit PLC SIM => Learning by Doing!

Bist du in Ausbildung? Die Arbeitsweise der Funktionen kannst du einfach mit "F1" im Hilfesystem vom TIA sehen...
 
wobei man hier jetzt nicht wirklich erkennennkann wie der a vom e abhängig ist
Der Eingang A32.0 ist vier Sekunden "True" nach zwei Sekunden wird der A32.0 für 3,5 Sekunden "True" weitere 1,5 Sekunden später wird der A32.0 nochmal für 1,6 Sekunden "True". Direkte Abhängigkeit ist das nicht...

So etwas ähnliches hab ich mal bei einer SPS Kopplung von zwei S5/95U über DI/DO gesehen als "ACK" 👨‍🦳
 
Gab es nicht diese Aufgabe vor kurzem schon einmal?
Für die Lösung braucht man 2..4 Timer. Ich würde vermutlich einen 2s-TON-Timer und einen 100ms-Timer und einen Rückwärtszähler und mehrere Vergleicher nehmen. Statt 100ms-Timer könnte man auch einen zyklischen OB3x (Weckalarm) nehmen.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Gibt es noch dazu Angaben was passieren soll wenn:

- der Eingangsimpuls keine 4 s dauert, z.B. 3 oder 5?
- der Eingangsimpuls innerhalb der Sequenz, also bevor oder während der zweite Ausgangsimpuls vorbei ist, kommt?

Gruß
 
@Thruser Nein weitere Angaben gibt es nicht dazu.

@rar-101 Ja mir fällt gerade auf, dass ich einen TP Timer brauche um die Dauer für A32 zu bestimmen.

@PN/DP Gibt es auch einen einfacheren Lösungsweg? Ich weiß leider nicht wie ich das, was du beschrieben hast umsetzen soll.

@volker Aber warum funktioniert die Flanke nicht?

Macht das hier vielleicht mehr Sinn?

1658928007788.png
 
Macht das hier vielleicht mehr Sinn?
Du steuerst 2x einen Ausgang (A32 = A32.0 ) an. Das funktioniert so nicht. Das Verknüpfungsergebnis ( VKE ) von Netzwerk 4 wird in dem Fall immer "gewinnen".

Der Code von Netzwerk 3 hat so keinerlei Funktion außer das der Timer in NW4 beeinflusst wird wegen:

Und du verwendest am TON 2x den gleichen Instanz-DB ( IEC_Timer_0_DB ). Das wird so auch nicht funktionieren.
 
Zuletzt bearbeitet:
@DeltaMikeAir Und wie bekomme ich das hin, dass beide Bedingungen in NW3 und NW4 gültig sind? Der Instanz DB der Timer wird noch geändert, der Screenshot dient nur dazu um zu gucken ob ich überhaupt auf dem richtigen Weg bin, was nicht der Fall zu sein scheint.
 
Ich kann dir nur wärmstens empfehlen dich eingehend mit den Timern auseinander zusetzen. Dafür brauchst du eigentlich nur TON und TOF und ein zwei Hilfsvariablen. Wenn die Lösung dann nur den oben gezeigten Signalverlauf wiedergeben soll ist die Sache in 2-3 Minuten erledigt. Und bitte sei dir bewusst, dass die PLC nach dem EVA-Prinzip zyklisch arbeitet. D.h. wenn ich einen Ausgang öfters beschreibe, wird immer das zuletzt geschriebene als Abbild an deine Ausgangskarte gehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@PN/DP Gibt es auch einen einfacheren Lösungsweg? Ich weiß leider nicht wie ich das, was du beschrieben hast umsetzen soll.
Du musst 4 Zeiten abmessen:
  • das Eingangssignal E32.0 muß 2s anliegen damit die Impulsausgabe gestartet wird.
    Das geht mit einem ganz einfachen TON und einer Bool-Variable "Pulsausgabe_läuft", die aktiviert und nach der kompletten Impulsausgabe deaktiviert wird.
    Weil das Verhalten des E32.0 ungenau beschrieben ist: Gehe am besten davon aus, daß es egal ist, wie lange das Eingangssignal anliegt, Hauptsache es liegt mindestens 2s lang an. Ob und wann es danach wieder auf 0 geht sollte für den Ablauf egal sein.
  • dann müssen 3 Zeiten nacheinander ablaufen: 3,5s + 1,5s + 1,6s
    Ein Profi-Programmierer schafft das mit nur 1 Timer (geht sogar auch mit dem selben Timer wie dem ersten TON). Die Logik wird aber viel übersichtlicher, wenn man 3 separate Timer verwendet. Will/darf man nicht so viele Timer verwenden, dann bietet sich ein (Rückwärts)Zähler an, der alle 100ms um 1 weiterzählt und bei 0 automatisch stehenbleibt (Rückwärtszähler) oder bei 66 * 100ms angehalten wird (Vorwärtszähler).
    Die Timer-Ausgänge sollten auf Bool-Hilfsvariablen kopiert werden, weil manche Timer-Ausgangszustände bei den Verknüpfungen mehrfach benötigt werden, und bei dem Siemens-Kuddelmuddel mit Timern man auf der sicheren/Implementations-unabhängigen Seite programmieren sollte, falls die Timer azyklisch aktualisiert werden.
  • Der Rest ist nur noch einfache logische Verknüpfung AND und OR der Bool-Hilfsvariablen (und ggf. des Zählerstandes) auf eine einzige Ausgangszuweisung an A32.0

Harald
 
Ungetestet:
Code:
dTimP := 100 ;  // [ms] e.g. OB1-cycle-time or time according to Alarm-OB *) **)

dTimA := 2000 ; // [ms] length of phase 1; obOut := FALSE *)
dTimB := 3500 ; // [ms] length of phase 2; obOut := TRUE
dTimC := 1500 ; // [ms] length of phase 3; obOut := FALSE
dTimD := 1600 ; // [ms] length of phase 4; obOut := TRUE

// *) ibIn must be TRUE longer than dTimA and must be FALSE longer than dTimP

tdSumB := dTim_a + dTim_b ; // [ms] length of phases 1 + 2
tdSumC := tdSumB + dTim_c ; // [ms] length of phases 1...3
tdSumD := tdSumC + dTim_d ; // [ms] length of phases 1...4

IF sdElapsed + dTimP > 0 THEN
    sdElapsed := sdElapsed + dTimP ; // count while no overflow
END_IF ;

IF ibIn AND NOT sbInPrev THEN
    sdElapsed := 0 ; // clear 'sdElapsed' on positive edge of ibIn
    sdInMax := 0 ;   // clear 'sdInMax' on positive edge of ibIn
ELSIF sbInPrev THEN
    sdInMax := sdElapsed ; // update 'sdInMax' while 'ibIn' is TRUE
END_IF ;
sbInPrev := ibIn ;

obOut := NOT (sdInMax <= dTimA OR sdElapsed > tdSumD OR sdElapsed > tdSumB AND sdElapsed <= tdSumC)
**)
Dieses Beispiel geht davon aus, dass der Code alle 100ms aufgerufen wird.
Statt 100 kann z.B. die ZyklusZeit des letzten OB1-Durchlaufs in ms addiert werden oder die Zeit des benutzten WeckAlarms.

Die Variablen 'sdElapsed', 'sdInMax' und 'sbInPrev' müssen statisch sein (ggfs VAR_IN_OUT).
Die Variablen 'dTimP', 'dTimA', 'dTimB', 'dTimC' und 'dTimD' könnten zusätzlich zu 'ibIn' VAR_INPUT sein.

Für alle numerischen Variablen hatte ich den DatenTyp DINT angedacht.
 
Zurück
Oben