Step 7 SCL Eingang TIME Startwert vorgeben

Zombie

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

ich musste zu einem SCL- Baustein, der den Telegrammverkehr mit dem überlagerten System regelt einen Eingang hinzubauen über den man die Telegrammwiederholungszeit einstellen kann.
Vorher war die auf 10Sekunden fest eingestellt, nun soll das ganze anpassbar sein.

Dabei kam die Frage auf, wie man so einem Eingang einen Startwert einstellen kann, damit wenn die Variable fehlt das Ding nicht mit 0MS loslegt.
Folgendes habe ich aus einem Tread hier im Forum abgeleitet. Dort steht ein Beispiel für Arrays drin.
Code:
VAR_INPUT
    itWdhZeit       :TIME := T#10S;      //Telegrammwiederholungszeit
END_VAR

Interessehalber wollte ich mal schauen, ob das so funktioniert und hab beim FB- Aufruf die Variablenanbindung weggelassen.

Nun läuft der Baustein auf unserem Testsystem, aber anstatt 10S in der Wiederholungszeit hat er T#5M27S685MS drin stehen.

Wüsste jemand wo mein Fehler ist?

Danke
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe den Startwert im Code geändert, einen neuen Eingang hinzugefügt, den Baustein compiliert und dann den Instanzdatenbaustein neu generieren lassen, nachdem ich den Aufruf aktualisiert habe und er mir anmeckerte dass der Instanzdatenbaustein nicht mehr passt. Ebenfalls habe ich den Instanzdatenbautein danach zusammen mit dem FB und aufrufenden FC reingeladen.

Muss ich dann immer noch Initialisieren?
 
So sah der Datenbaustein vor der Initialisierung aus.

VorInitialisierung.JPG

Nachdem ich über Bearbeiten-> Datenbaustein Initialisieren gegangen bin, hat sich nichts verändert.

Erst jetzt, nachdem ich T#10S an den Eingang drangeschrieben habe, steht auch T#10S im Datenbaustein drin.
Bei KOP/FUP- FBs muss ich den Datenbaustein doch auch nicht extra initialisieren, was mich gerade etwas ratlos zurück lässt.

Könnte der SCL Compiler mit Startwerten ein Problem haben?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zoombie,

hast du den IDB einfach mal nochmal geladen ? Ist das Fenster beim Download gekommen das nicht alle Bausteine in einem Cpu Zyklus übernommen werden können? Hast du evtl aus versehen denn in vom Fb im Baustein beschrieben?

Gruß Tia
 
Nur eine Idee , kann man die Funktion TIME_TCK() SFC64 ; verwenden und auf aktuellen Werte zugreifen?
 
Hallo Zoombie,

hast du den IDB einfach mal nochmal geladen ? Ist das Fenster beim Download gekommen das nicht alle Bausteine in einem Cpu Zyklus übernommen werden können? Hast du evtl aus versehen denn in vom Fb im Baustein beschrieben?

Gruß Tia
Ja, habe ihn dann nochmals geladen, keine Änderung.
Nein, das Fenster ist nicht gekommen, es handelte sich auch nur um zwei Bausteine.
Nein, ich habe ihn im Baustein nicht beschrieben.

Der EIngang wird nur einmalig im Programm abgefragt.
Code:
    //****************************************************************************************
    //Telegrammwiederholung
    //****************************************************************************************
    //Telegramm wurde zum versenden eingetragen, dann wird kontrolliert, ob das Telegramm
    //quittiert wird bevor die Quittierzeit abgelaufen ist
    IF ioiAuftStat = 2 THEN
        stQuitzeit(IN := "VKE1", PT:= itWdhZeit);
        IF stQuitzeit.Q THEN
            IF ioiSendStat = 0 OR ioiSendStat = 2 THEN
                //Auftragstelegramm wieder in Sendespeicher kopieren
                "dbSend".Sendedaten := "dbSend".Auftragstele;
                //Senden triggern
                ioiSendStat := 1;
                //Quittierungszeit zurücksetzen
                stQuitzeit(IN := "VKE0", PT:= T#0ms);
            END_IF;
        END_IF;
    ELSE
        //Quittierungszeit zurücksetzen
        stQuitzeit(IN := "VKE0", PT:= T#0ms);
    END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, habe ihn dann nochmals geladen, keine Änderung.
Nein, das Fenster ist nicht gekommen, es handelte sich auch nur um zwei Bausteine.
Nein, ich habe ihn im Baustein nicht beschrieben.

Der EIngang wird nur einmalig im Programm abgefragt.
Code:
    //****************************************************************************************
    //Telegrammwiederholung
    //****************************************************************************************
    //Telegramm wurde zum versenden eingetragen, dann wird kontrolliert, ob das Telegramm
    //quittiert wird bevor die Quittierzeit abgelaufen ist
    IF ioiAuftStat = 2 THEN
        stQuitzeit(IN := "VKE1", PT:= itWdhZeit);
        IF stQuitzeit.Q THEN
            IF ioiSendStat = 0 OR ioiSendStat = 2 THEN
                //Auftragstelegramm wieder in Sendespeicher kopieren
                "dbSend".Sendedaten := "dbSend".Auftragstele;
                //Senden triggern
                ioiSendStat := 1;
                //Quittierungszeit zurücksetzen
                stQuitzeit(IN := "VKE0", PT:= T#0ms);
            END_IF;
        END_IF;
    ELSE
        //Quittierungszeit zurücksetzen
        stQuitzeit(IN := "VKE0", PT:= T#0ms);
    END_IF;

Mal abgesehen davon das bedingte Aufrufe von Timern ein Nogo sind. Und so nicht gearbeitet werden sollte. Kann ich mir nicht erklären wieseo das ITWdhZeit als in so einen wert kriegt.
Als nächstes würde ich mal nachschauen obs irgendwelche indirekten oder sonstige Zugriffe auf den IDB gibt.

Irgendwelche PUT von extern?
 
Was für eine Step7-Version verwendest Du? Dein Bild sieht so komisch aus - wieso gibt es da 2 Spalten "Aktualwert"?
Wird Dein FB mehrmals aufgerufen? Beobachtest Du vielleicht die falsche Instanz? Sind alle IDB neu generiert und in die CPU übertragen?

Harald
 
Was für eine Step7-Version verwendest Du? Dein Bild sieht so komisch aus - wieso gibt es da 2 Spalten "Aktualwert"?
Das ist den online Sicht in STEP7 Classic, wenn man nicht den LAD/STL/FBD_editor als Standard für den beobachtung von DBs gewählt hat.

Ich wurde auch von den IF THEN ELSE Behandlung von den IEC Timer ablehnen.
Einfach:
Code:
TelegrammGestartet := // irgendetwas //
stQuitzeit(IN := TelegrammGestartet, PT:= itWdhZeit);
TelegrammFehler := stQuitzeit.Q ;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mal abgesehen davon das bedingte Aufrufe von Timern ein Nogo sind. Und so nicht gearbeitet werden sollte. Kann ich mir nicht erklären wieseo das ITWdhZeit als in so einen wert kriegt.
Als nächstes würde ich mal nachschauen obs irgendwelche indirekten oder sonstige Zugriffe auf den IDB gibt.

Irgendwelche PUT von extern?

Bedingte Aufrufe von Timern sind bei uns OK, aber Instanzdaten sind ein NoGo, da wird nicht drauf zugegriffen.
Nein, ich arbeite nur mit RFC über TCP Telegrammen, kein PUT

Was für eine Step7-Version verwendest Du? Dein Bild sieht so komisch aus - wieso gibt es da 2 Spalten "Aktualwert"?
Wird Dein FB mehrmals aufgerufen? Beobachtest Du vielleicht die falsche Instanz? Sind alle IDB neu generiert und in die CPU übertragen?

Harald

Nein, der FB wird nur einmalig aufgerufen, es gibt nur diese eine und der IDB und der FB sind gemeinsam generiert und gemeinsam reingeladen.

Step 7 5.6 mit der extra ansicht für die Instanzdaten.
 
Wie schon von Jesper geschrieben ist der erste Fehler der bedingte Aufruf des Timer-Bausteins.
Der zweite Fehler ist, dass der Baustein zum Triggern immer einen 0->1-Wechsel am IN erwartet (und natürlich auch irgendwann dann mal einen 1->0-Wechsel).
Warum startest du den Timer am IN statt mit VKE1 nicht mit der Bedingung der IF-Abfrage ...? Ich denke mal, dass es dann laufen wird ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Fehler ist nicht dass er nicht läuft, sondern dass er eine Zeit läuft die nicht eingestellt ist.
Der Startwert im Instanzdatenbaustein soll auf 10s stehen.
Ist aber am Eingang für den Zeitparameter kein Wert eingetragen, stehen im Instanzdatenbaustein 5Minuten und irgendwas drin und nicht der Startwert.
Der Wert der für den Parameter drin steht ist nicht der Startwert.

Der Timer läuft ab, und wenn er unterbrochen wird, greift ja die ELSE Bedingung und er wird zurückgesetzt.

Anstatt dass ich da eine Variable eintrage hab ich halt den Timer eingetragen.
 
Ich glaube die Wdhzeit ist als "Time" deklariert und läuft ununterbrochen weiter. Ich weiss aber nicht ob es was bringt wenn statt "Time", S5TIME deklariert.
 
Zuletzt bearbeitet:
Zurück
Oben