Step 7 ...mal wieder ANY-Pointer, was mache ich beim Bau eines ANY-Pointers falsch?

jomatic

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

nachdem mir dieses Forum schon oft geholfen hat, ohne dass ich registriert war, habe ich mich jetzt angemeldet. Herzlichen Dank für die vielen guten Beiträge hier.

Mein aktuelles Problem:
Ich möchte in einer Funktion mithilfe des SFC21 einen Datenbaustein füllen.
Dabei wird das Doppelwort, mit dem gefüllt wird, als Parameter FillDWord übergeben.

Ich möchte dafür den ANY-Pointer P#L 10.0 DWORD 1 selbst zusammenbauen und war überzeugt, das dank vieler hilfreicher Beiträge in diesem Forum richtig gemacht zu haben.

Wenn ich SFC21 mit BVAL:=P#L 10.0 DWORD 1 aufrufe, wird der Baustein wie erwartet gefüllt.

Wenn ich SFC21 mit BVAL:=#pFillWord aufrufe (unten im Code auskommentiert), gibt SFC21 als RET_VAL W#16#8124 aus.

Ich hätte erwartet, dass beide SFC21-Aufrufe äquivalent sind (vorausgesetzt natürlich, dass sich die Adresse L10.0 von tmpFillWord nicht ändert).
Wo liegt mein Fehler?

Gruß jomatic


Code:
FUNCTION FC4 : VOID
TITLE =
VERSION : 0.1


VAR_INPUT
  FillDWord : DWORD ;    //Wort, mit denen der DBs gefüllt wird
END_VAR
VAR_TEMP
  pFillDWord : ANY ;    
  tmpFillDWord : DWORD ;    
END_VAR
BEGIN
NETWORK
TITLE =

      L     #FillDWord;
      T     #tmpFillDWord;
NETWORK
TITLE =

      LAR1  P##pFillDWord;

      L     B#16#10; //10h für S7
      T     LB [AR1,P#0.0];

      L     B#16#6; //Datentyp DWORD
      T     LB [AR1,P#1.0];

      L     1;
      T     LW [AR1,P#2.0]; // Wiederholfaktor 1

      L     0;
      T     LW [AR1,P#4.0]; // kein DB ==> 0, DB-Nr. oder 0

      L     P##tmpFillDWord;
      T     LD [AR1,P#6.0];

NETWORK
TITLE =

//     CALL "FILL" (
//     BVAL   :=#pFillDWord,
//       RET_VAL:=mw214,
//       BLK    :=P#DB2.DBX 0.0 DWORD 100);


      CALL "FILL" (
           BVAL                     := P#L 10.0 DWORD 1,
           RET_VAL                  := mw214,
           BLK                      := P#DB2.DBX 0.0 DWORD 100);

END_FUNCTION
 
Zuletzt bearbeitet:
Hallo,
warum übergibst du dein "Fillword" nicht direkt an ByVal des SFC ?

Gruß
Larry
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,
ich dachte, SFC21 akzeptiert für BVAL nur einen ANY-Pointer.
Kannst Du bitte den Code für den Aufruf posten, falls ich mich irre.
Auszug aus S7-Handbuch: System- und Standardfunktionen: sfc21-Aufruf.png
Gruß jomatic
 
Ja, da fehlt was.
Code:
      LAR1  P##pFillDWord;


      L     B#16#10; //10h für S7
      T     LB [AR1,P#0.0];
      L     B#16#6; //Datentyp DWORD
      T     LB [AR1,P#1.0];
      L     1;
      T     LW [AR1,P#2.0]; // Wiederholfaktor 1
      L     0;
      T     LW [AR1,P#4.0]; // kein DB ==> 0, DB-Nr. oder 0


      L     P##tmpFillDWord;
      T     LD [AR1,P#6.0];
      [B][COLOR=#ff0000]L     W#16#87;           //Speicherbereich - Vorgänger-Lokaldaten - Da Pointer später von Funktion FILL benutzt[/COLOR][/B]
      [B][COLOR=#ff0000]T     L[/COLOR][COLOR=#0000cd]B[/COLOR][COLOR=#ff0000] [AR1,P#6.0];[/COLOR][/B]


und einfacher, wie Larry schon schrieb:
Code:
      L     L#0;
      T     #tmpFillDWord;

      CALL "FILL" (
           BVAL                     := #tmpFillDWord,
           RET_VAL                  := mw214,
           BLK                      := P#DB2.DBX 0.0 DWORD 100);
Der Compiler übergibt wenn der IN-Parameter ANY ist, automatisch den passenden ANY-Pointer der zu tmpFillDWord passt.
Bei deinem Fall würde also automatisch P#L 10.0 DWORD 1 übergeben.
 
Zuletzt bearbeitet:
Hallo,
ich habe es jetzt nicht selbst ausprobiert - aber in der Beschreibung steht ja "enthält den Wert (also dein DBD) oder die Beschreibung (also einen ANY) ..."
Schreib doch einfach mal dein "Fillword" da direkt dran und schau was er macht - m.E. müßte es funktionieren.

Gruß
Larry
 
Code:
[B][COLOR=#ff0000]L     W#16#87;           //Speicherbereich - Vorgänger-Lokaldaten - Da Pointer später von Funktion FILL benutzt[/COLOR][/B]
[B][COLOR=#ff0000]T     L[/COLOR][COLOR=#0000cd]B[/COLOR][COLOR=#ff0000] [AR1,P#6.0];
[/COLOR][/B]
Danke, das war der entscheidende Hinweis. Hatte auch beim händischen Bau W#16#86 verwendet. Wieder etwas gelernt.

Code:
CALL "FILL" (
BVAL                     := #tmpFillDWord,
RET_VAL                  := mw214,
BLK                      := P#DB2.DBX 0.0 DWORD 100);
Ihr habt beide Recht, Larry Laffer und und RONIN. Es funktioniert so. Wieder etwas gelernt, dass #tmpFillDWord in einen Pointer umgewandelt wird.

Gruß jomatic
 
Zuletzt bearbeitet:
Zurück
Oben