TIA RDREC lässt sich nicht beliebig aufrufen?

Stefan_POL

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

ich schreibe ein Programm, bei dem ich an einem Profinet-Teilnehmer verschiedene Parameter abfragen möchte. Dazu verwende ich die Funktion RDREC. Um die jeweiligen Parameter nacheinander abzufragen wird die fallende Flanke des vorherigen REQ-Eingangs überwacht und damit der REQ-Eingang des folgenden NW ausgelöst. Mein Problem ist, dass die RDREC-Funktion nach dem 3. Aufruf nicht mehr funktioniert. Ich denke ich mache etwas falsch, aber ich komme nicht drauf.

Code:
NW1

      U     %M0.0
      FP    %M2.2
      =     %M3.5


      CALL  RDREC , %DB100
         ptr_type:=Any
         REQ    :=%M3.5
         ID     :=%DB1.DBD420
         INDEX  :=%DB1.DBW52
         MLEN   :=4
         VALID  :=
         BUSY   :=
         ERROR  :=
         STATUS :=
         LEN    :=
         RECORD :=P#DB1.DBX132.0




      CALL  BLKMOV
         blk_type:=Any
         SRCBLK  :=P#DB1.DBX132.0
         RET_VAL :=#RET_VAL_1
         DSTBLK  :=%DB1.DBD252


NW2

      U     %M3.5
      FN    %M2.3
      =     %M3.6


      CALL  RDREC , %DB100
         ptr_type:=Any
         REQ    :=%M3.6
         ID     :=%DB1.DBD420
         INDEX  :=%DB1.DBW50
         MLEN   :=4
         VALID  :=
         BUSY   :=
         ERROR  :=
         STATUS :=
         LEN    :=
         RECORD :=P#DB1.DBX128.0


      CALL  BLKMOV
         blk_type:=Any
         SRCBLK  :=P#DB1.DBX128.0
         RET_VAL :=#RET_VAL_1
         DSTBLK  :=%DB1.DBD256



NW3

      U     %M3.6
      FN    %M2.4
      =     %M3.7


      CALL  RDREC , %DB100
         ptr_type:=Any
         REQ    :=%M3.7
         ID     :=%DB1.DBD420
         INDEX  :=%DB1.DBW54
         MLEN   :=4
         VALID  :=
         BUSY   :=
         ERROR  :=
         STATUS :=
         LEN    :=
         RECORD :=P#DB1.DBX136.0


      CALL  BLKMOV
         blk_type:=Any
         SRCBLK  :=P#DB1.DBX136.0
         RET_VAL :=#RET_VAL_1
         DSTBLK  :=%DB1.DBD260

NW4

      U     %M3.7
      FN    %M2.5
      =     %M4.0






      CALL  RDREC , %DB100
         ptr_type:=Any
         REQ    :=%M4.0
         ID     :=%DB1.DBD420
         INDEX  :=%DB1.DBW56
         MLEN   :=2
         VALID  :=
         BUSY   :=
         ERROR  :=
         STATUS :=
         LEN    :=
         RECORD :=P#DB1.DBX140.0


      CALL  BLKMOV
         blk_type:=Any
         SRCBLK  :=P#DB1.DBX140.0
         RET_VAL :=#RET_VAL_1
         DSTBLK  :=%DB1.DBW264

NW5

    U     %M4.0
      FN    %M2.6
      =     %M4.1






      CALL  RDREC , %DB100
         ptr_type:=Any
         REQ    :=%M4.1
         ID     :=%DB1.DBD420
         INDEX  :=%DB1.DBW0
         MLEN   :=2
         VALID  :=
         BUSY   :=
         ERROR  :=
         STATUS :=
         LEN    :=
         RECORD :=P#DB1.DBX70.0


      CALL  BLKMOV
         blk_type:=Any
         SRCBLK  :=P#DB1.DBX70.0
         RET_VAL :=#RET_VAL_1
         DSTBLK  :=%DB1.DBW194
Freue mich über Hilfestellung.
 
Nabend...,
Nun wenn du die Prameter NACHEINANDER abfragen willst, dann warte auch die jeweilige "Fertigmeldung" ab (negative Flanke Busy)...

Gruß...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

danke, es funktioniert wenn ich nur die negative Flanke BUSY auswerte. Die negative Flanke des vorherigen REQ Eingangs muss ich ignorieren, sonst passt das Timing scheinbar nicht.
 
Kann es passieren, daß ein RDREC-Aufruf sofort fertig wird und kein BUSY=1 kommt? Dann käme auch keine Flanke...

Harald
Ich bin zwar noch nicht ganz durch mit den Änderungen, aber was ich bisher gesehen habe ist gut. BUSY kommt zuverlässig, soweit ich dass in Wireshark gesehen habe. Die Read Requests an das verbundene Gerät werden sauber ausgeführt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann es passieren, daß ein RDREC-Aufruf sofort fertig wird und kein BUSY=1 kommt? Dann käme auch keine Flanke...

Busy ist bei mir immer gekommen. Dem Baustein fehlt aber n done. Dann wär die ganze sache viel weniger undurchsichtig. Auch ne Möglichkeit zur laufzeit die freien recourcen zu ermitteln wäre so ein Kapitel.
 
Busy ist bei mir immer gekommen. Dem Baustein fehlt aber n done.
Kein DONE: Verwechselst Du da was mit der SFC59 "RD_REC"?
Bei RDREC gibt es den Output "VALID": Neuer Datensatz wurde empfangen und ist gültig


Achtung: Es kann vorkommen daß BUSY nicht aktiv wird - erster und letzter Aufruf eines Auftrags können im Fehlerfall zusammenfallen!
TIA Hilfe V13 schrieb:
Bedeutung von REQ, RET_VAL und BUSY bei asynchron arbeitenden Anweisungen
[...]
Im Fall 1 (Erstaufruf mit REQ=1) wird bei freien Systemressourcen und korrekter Versorgung der Eingansparameter in RET_VAL W#16#7001 eingetragen, und BUSY wird gesetzt.
Falls die benötigten Systemressourcen momentan belegt sind oder ein Fehler in den Eingangsparametern vorliegt, wird in RET_VAL der zugehörige Fehlercode eingetragen, und BUSY wird mit 0 beschrieben.

REQ braucht keine Flanke (wird nach Auftrags-Anstoß nicht mehr ausgewertet). Man könnte REQ=1 anstehen lassen und nach/hinter dem CALL etwa so auswerten: "IF REQ AND NOT BUSY THEN ...", um zu erkennen daß der Auftrag beendet/abgebrochen bzw. gar nicht erst gestartet ist.

Harald
 
Zurück
Oben