Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 7 von 7

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

  1. #1
    Registriert seit
    06.08.2015
    Beiträge
    7
    Danke
    5
    Erhielt 1 Danke für 1 Beitrag

    Standard


    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
    Geändert von jomatic (06.08.2015 um 12:34 Uhr)
    Zitieren Zitieren ...mal wieder ANY-Pointer, was mache ich beim Bau eines ANY-Pointers falsch?  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.715
    Danke
    398
    Erhielt 2.398 Danke für 1.998 Beiträge

    Standard

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

    Gruß
    Larry
    Geändert von Larry Laffer (06.08.2015 um 13:00 Uhr)

  3. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    jomatic (06.08.2015)

  4. #3
    jomatic ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    06.08.2015
    Beiträge
    7
    Danke
    5
    Erhielt 1 Danke für 1 Beitrag

    Standard

    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

  5. #4
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.339
    Danke
    449
    Erhielt 688 Danke für 513 Beiträge

    Standard

    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];
          L     W#16#87;           //Speicherbereich - Vorgänger-Lokaldaten - Da Pointer später von Funktion FILL benutzt
          T     LB [AR1,P#6.0];

    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.
    Geändert von RONIN (23.08.2015 um 20:49 Uhr) Grund: Hatte beim roten Teil LD statt LB... Kopierfehler
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  6. Folgende 2 Benutzer sagen Danke zu RONIN für den nützlichen Beitrag:

    jomatic (06.08.2015),Larry Laffer (06.08.2015)

  7. #5
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.715
    Danke
    398
    Erhielt 2.398 Danke für 1.998 Beiträge

    Standard

    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

  8. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.715
    Danke
    398
    Erhielt 2.398 Danke für 1.998 Beiträge

    Standard

    @Ronin:
    Danke für die Vervollständigung meines Beitrags ... ich hatte es auch so angenommen ...

  9. #7
    jomatic ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    06.08.2015
    Beiträge
    7
    Danke
    5
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Code:
    L     W#16#87;           //Speicherbereich - Vorgänger-Lokaldaten - Da Pointer später von Funktion FILL benutzt
    T     LB [AR1,P#6.0];
    
    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
    Geändert von jomatic (06.08.2015 um 14:58 Uhr)

Ähnliche Themen

  1. Libnodave was mache ich falsch?
    Von ich988 im Forum Hochsprachen - OPC
    Antworten: 5
    Letzter Beitrag: 01.12.2008, 13:38
  2. Was mache ich falsch?
    Von AUDSUPERUSER im Forum Stammtisch
    Antworten: 0
    Letzter Beitrag: 14.03.2008, 07:45
  3. Was mache ich falsch?
    Von Anonymous im Forum Simatic
    Antworten: 16
    Letzter Beitrag: 29.11.2005, 08:41
  4. was mache ich falsch? (AWL)
    Von Anonymous im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 08.11.2005, 01:22
  5. Zähler : Was mache ich falsch ?
    Von MarioDisketti im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 08.07.2005, 08:59

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •