Beckhoff systemtime

FredlFesl

Level-2
Beiträge
25
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi!
Hab ein Problem mit dem FB NT_GetTime von Beckhoff. und zwar funktioniert er beim ersten Durchlauf, aber beim zweiten wird das BusyFlag nicht mehr gesetzt und somit wird die Zeit nicht aktualisiert. Viel komischer ist es´, dass es gestern noch funktioniert hat.
Hoffe ihr könnt mir helfen!

Vielen Dank!

Code:
Case Step of

(*Davor passiert auch noch was *)

4:
    NT_GetTime1( NETID:= '5.4.36.239.1.1', START:= TRUE, TIMESTR=> tTime);
    IF NOT (NT_GetTime1.BUSY) THEN
        IF ( NT_GetTime1.ERR ) THEN
            nErrId :=  NT_GetTime1.ERRID;
            bError := TRUE;
            Step := 50;
        ELSE
            Step := Step + 1;
        END_IF
    END_IF


5:
    NT_Gettime1.START := FALSE;
    (* Hier kommt noch mehr *)
End_Case
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du setzt NTGetTime1.START:=False wenn Step=5 ist. Das kriegt der NTGetTime1-FB aber gar nicht mit, weil Du ihn nur aufrufst, solange Step=4 ist.
Entweder rufst Du den NTGetTime1 auch bei Step=5 auf, oder besser, Du nimmst den Aufruf ganz aus der CASE-Anweisung raus und rufst ihn in jedem Programmzyklus auf, dann aber mit START:=Step=4.
 
Und bei Step=50 noch einmal
Code:
NT_GetTime1(START:=FALSE);

Ich bin gegen bedingte Aufrufe solcher asynchron zur PLC arbeitenden Bausteine, aber an diesem Punkt wird es natürlich schon philosophisch.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und bei Step=50 noch einmal
Code:
NT_GetTime1(START:=FALSE);

Ich bin gegen bedingte Aufrufe solcher asynchron zur PLC arbeitenden Bausteine, aber an diesem Punkt wird es natürlich schon philosophisch.

Also am Besten packt er es in Step = 4 nach dem inneren END_IF.
 
Hab es jetzt so gelöst! Vielen Dank für eure Hilfe!

Code:
CASE Step OF
...
3:
....
NT_GetTime1( NETID:= '5.4.36.239.1.1', Start := FALSE,TIMESTR=> tTime);
Step := Step + 1;

4:
NT_GetTime1( NETID:= '5.4.36.239.1.1', Start := TRUE, TIMESTR=> tTime);

 IF NOT (NT_GetTime1.BUSY) THEN
     IF ( NT_GetTime1.ERR ) THEN
          nErrId :=  NT_GetTime1.ERRID;
          bError := TRUE;
          NT_GetTime1( NETID:= '5.4.36.239.1.1', Start := FALSE, TIMESTR=> tTime);
          Step := 50;
      ELSE
          Step := Step + 1;
          NT_GetTime1( NETID:= '5.4.36.239.1.1', Start := FALSE, TIMESTR=> tTime);
       END_IF
  END_IF
 
5:
....
 
END_CASE
 
Hab es jetzt so gelöst! Vielen Dank für eure Hilfe!

Code:
CASE Step OF
...
3:
....
NT_GetTime1( NETID:= '5.4.36.239.1.1', Start := FALSE,TIMESTR=> tTime);
Step := Step + 1;
 
4:
NT_GetTime1( NETID:= '5.4.36.239.1.1', Start := TRUE, TIMESTR=> tTime);
 
 IF NOT (NT_GetTime1.BUSY) THEN
     IF ( NT_GetTime1.ERR ) THEN
          nErrId :=  NT_GetTime1.ERRID;
          bError := TRUE;
          NT_GetTime1( NETID:= '5.4.36.239.1.1', Start := FALSE, TIMESTR=> tTime);
          Step := 50;
      ELSE
          Step := Step + 1;
          NT_GetTime1( NETID:= '5.4.36.239.1.1', Start := FALSE, TIMESTR=> tTime);
       END_IF
  END_IF
 
5:
....
 
END_CASE

Noch ein paar Kleinigkeiten der Schönheit halber:
Du kannst zu Beginn von Step=4 beim Aufruf von NT_GetTime1 die Parameter weglassen, und wenn du das Rücksetzen des Bausteins nach deiner IF-Schleife machst, sparst du einen Aufruf.

Code:
CASE Step OF
...
3:
  ....
  NT_GetTime1( NETID:= '5.4.36.239.1.1', Start := FALSE,TIMESTR=> tTime);
  Step := Step + 1;
 
4:
  NT_GetTime1();
  IF NOT (NT_GetTime1.BUSY) THEN
    IF ( NT_GetTime1.ERR ) THEN
      nErrId :=  NT_GetTime1.ERRID;
      bError := TRUE;
      Step := 50;
    ELSE
      Step := Step + 1;
    END_IF
    NT_GetTime1(START := FASE);
  END_IF
 
5:
....
 
END_CASE
 
Aber wenn ich im Step 4 die Parameter weglasse wird doch NT_GetTime1. Start nicht auf TRUE gesetzt und der FB somit nicht aktiviert.
Hab es gerade probiert.

Stimmt habe es gerade auch gesehen. Ich habe den Aufruf in Step=3 als Start:=TRUE verwechselt.

Dann ist aber die Frage, wieso wird der Baustein in Step=3 zurückgesetzt? Wird er davor schon irgendwo verwendet?
 
Nein das nicht, aber damit stell ich sicher, dass der FB immer eine neue Flanke sieht. Ohne ihn davor auf False zu setzen funktioniert es nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
FredlFesl schrieb:
Ohne ihn davor auf False zu setzen funktioniert es nicht.

Eigentlich sollte es das. Aber vielleicht mag es der FB nicht, im selben PLC-Zyklus 2 mal aufgerufen zu werden, wie es bei Step=4 und Busy=False passiert.

Die Lösung zeigt sehr gut, warum ich gegen mehrfache bedingte Aufrufe solcher FB's bin. Man fügt solange weitere Aufrufe ein, bis es irgendwann funktioniert, verliert dabei aber die Übersicht.

Meine Lösung sieht so aus:
Code:
CASE Step OF
   ...
   4: Step:=Step+1;
   5: IF NOT NT_GetTime1.Busy
      THEN
         IF NOT NT_GetTime1.Err
         THEN
            tTime:=NT_GetTime1.TimeStr;
            Step:=Step+1;
         ELSE
           nErrId:=NT_GetTime1.ErrId;
           bEtrror:=TRUE;
           Step:=50;
         END_IF;
   ...
END_CASE;
 
NT_GetTime1(NetId:='5.4.36.239.1.1',
                   Start:=Step=4);
 
Zurück
Oben