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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: FC Move mittels Any-Pointer

  1. #1
    Registriert seit
    14.10.2010
    Ort
    Telgte
    Beiträge
    653
    Danke
    97
    Erhielt 129 Danke für 99 Beiträge

    Beitrag


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Guten Tag liebe "SPS-Gemeinde",

    ich habe vor ein paar Wochen bei Siemens Lehrgänge zu S7/300 besucht und die Prüfung zum Programmierer abgelegt. Es gab jedoch eine Aufgabenstellung die ich bis heute nicht gelöst habe.(Prüfungsaufgabe, daher hilft Siemens nicht). Das läßt mich Nachts nicht schlafen .
    Ich möchte auf keinen Fall eine fertige Lösung zu meinem Problem!
    Ich benötige vielmehr eine Starthilfe um das Problem selbst zu lösen.

    Thema indirekte Adressierung:
    Es sollte ein FC erstellt werden, der "wiederverwendbar" programmiert ist.
    Die Funktion ist kurz erklärt:
    In-Parameter : Start ( Bool )
    In-Parameter : Quelle ( Any-Pointer )
    In/Out-Parameter : Ziel ( Any-Pointer )

    Mit dem Start-Impuls sollte aus einem DB-Prozessdaten ein UDT mit einer Datenlänge von 4 Doppelworten in einen DB-Datensicherung geschrieben werden. ( Grundfunktion )
    Wenn diese Funktion hergestellt wurde, sollte man die Programmierung und den DB-Datensicherung in soweit ändern, das es 10 Speicherplätze gibt und nach erreichen des letzten Speicherplatz von vorne überschrieben wird. ( erweiterte Funktion )

    Problem meinerseits ist das mir bis jetzt jeder Gedankenansatz fehlt wie ich den Datenbereich innerhalb des FC´s von IN nach OUT bekomme.
    Ausprobiert habe ich schon vieles, aber ich bekomme immer nur Fehlermeldungen im Simatic Manager das die benutzten Befehle in einem FC nicht gestattet sind etc.

    Würde mich freuen wenn mir jemand "auf die Sprünge" helfen könnte.
    Danke
    Torsten
    Zitieren Zitieren FC Move mittels Any-Pointer  

  2. #2
    Registriert seit
    19.06.2005
    Ort
    in Bayern ganz oben
    Beiträge
    1.360
    Danke
    188
    Erhielt 372 Danke für 290 Beiträge

    Standard

    Hi,

    das kopieren kann man schön mit dem SFC20 machen. Vorher musst Du allerdings die ANYs in eine Temporäre Variable kopieren und diese dann an den SFC20 legen.

    http://sps-forum.de/showthread.php?t=12923

    Gruss Daniel
    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte...

    OSCAT.lib Step 7

    Open Source Community for Automation Technolgy

    SPS-Forum Chat (Mibbit) | SPS-Forum Chat (MIRC)

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

    Toki0604 (02.11.2010)

  4. #3
    Avatar von Toki0604
    Toki0604 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    14.10.2010
    Ort
    Telgte
    Beiträge
    653
    Danke
    97
    Erhielt 129 Danke für 99 Beiträge

    Standard

    Hi Daniel,
    danke für deine schnelle Antwort.
    Habe mir den Link angeschaut. Soweit so gut. Aber der Any-Pointer steht am IN-Parameter eines FC. Ich habe hier keine lokale Adressen die ich nutzen kann. Ich glaube genau hier ist mein Problem ( Gedankenblockade meinerseits?! ).

    Gruß, Torsten

  5. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.712
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    Hallo,
    was Dalbi schreibt bezieht sich auf den IN-Parameter ANY schlecht hin.
    Du kannst ihn nicht einfach zu dem FBC20 durchreichen - das geht nicht. Du mußt die Adresse, auf die er zeigt, in einem eigenen "LOKAL angelegten" ANY nachbilden und die dann an den SFC20 übergeben.
    Das wird aber in dem Beitrag, den Dalbi dir verlinkt hat, auch dargestellt.
    Ansonsten gibt es (speziell zu diesem Thema) hier im Forum noch viele andere Beiträge (Suchfunktion), die das auch noch behandeln ...

    Gruß
    Larry

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

    Toki0604 (02.11.2010)

  7. #5
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Vielleicht hilft das folgende Programmbeispiel weiter:

    In einem FC werden zwei ANY-Pointer (Quellbereich und Zielbereich) aus dem IN-Bereich in den TEMP-Bereich kopiert.

    Anschließend wird ein SFC20 BLKMOV mit den beiden ANY-Pointer (Quellbereich und Zielbereich) aus dem TEMP-Bereich beschaltet.

    Der SFC20 BLKMOV kopiert dann den Quellbereich (Eingangsbereich) in den Zielbereich (Datenbaustein).

    Code:
    UNCTION FC 100 : VOID
    TITLE =ANY-Pointer
    //14
    AUTHOR : Kai
    FAMILY : SPSForum
    NAME : 'ANY'
    VERSION : 1.0
    VAR_INPUT
      IN_Quelle : ANY ; 
      IN_Ziel : ANY ; 
    END_VAR
    VAR_TEMP
      TEMP_DB_Register : WORD ; 
      TEMP_AR1_Register : DWORD ; 
      TEMP_AR2_Register : DWORD ; 
      TEMP_Quelle : ANY ; 
      TEMP_Ziel : ANY ; 
      TEMP_RET_VAL : INT ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =Register sichern
     
          L     DBNO; // DB-Register
          T     #TEMP_DB_Register; 
     
          TAR1  ; // AR1-Register
          T     #TEMP_AR1_Register; 
     
          TAR2  ; // AR2-Register
          T     #TEMP_AR2_Register; 
     
    NETWORK
    TITLE =Quelle (ANY-Pointer)
    //Versorgung ANY-Pointer-Variable mit IN-Variable
    //
    //Adressierung AR1 im V-Stack
    //
    //L     P#IN_Quelle
    //LAR1
    //
    //L     B [AR1,P#0.0]
    //
    //Versorgung ANY-Pointer-Variable mit TEMP-Variable
    //
    //Adressierung AR2 im L-Stack 
    //
    //L     P#TEMP_Quelle
    //LAR2
    //
    //T     LB [AR2,P#0.0]
    //   
          L     P##IN_Quelle; // Quelle (ANY-Pointer)
          LAR1  ; 
     
          L     P##TEMP_Quelle; // Quelle (ANY-Pointer)
          LAR2  ; 
     
          L     B [AR1,P#0.0]; // Syntax-ID
          T     LB [AR2,P#0.0]; 
     
          L     B [AR1,P#1.0]; // Datentyp
          T     LB [AR2,P#1.0]; 
     
          L     W [AR1,P#2.0]; // Anzahl
          T     LW [AR2,P#2.0]; 
     
          L     W [AR1,P#4.0]; // DB-Nummer
          T     LW [AR2,P#4.0]; 
     
          L     D [AR1,P#6.0]; // Bereichszeiger
          T     LD [AR2,P#6.0]; 
     
    NETWORK
    TITLE =Ziel (ANY-Pointer)
    //Versorgung ANY-Pointer-Variable mit IN-Variable
    //
    //Adressierung AR1 im V-Stack
    //
    //L     P#IN_Ziel
    //LAR1
    //
    //L     B [AR1,P#0.0]
    //
    //Versorgung ANY-Pointer-Variable mit TEMP-Variable
    //
    //Adressierung AR2 im L-Stack
    //
    //L     P#TEMP_Ziel
    //LAR2
    //
    //T     LB [AR2,P#0.0]
    //   
          L     P##IN_Ziel; // Ziel (ANY-Pointer)
          LAR1  ; 
     
          L     P##TEMP_Ziel; // Ziel (ANY-Pointer)
          LAR2  ; 
     
          L     B [AR1,P#0.0]; // Syntax-ID
          T     LB [AR2,P#0.0]; 
     
          L     B [AR1,P#1.0]; // Datentyp
          T     LB [AR2,P#1.0]; 
     
          L     W [AR1,P#2.0]; // Anzahl
          T     LW [AR2,P#2.0]; 
     
          L     W [AR1,P#4.0]; // DB-Nummer
          T     LW [AR2,P#4.0]; 
     
          L     D [AR1,P#6.0]; // Bereichszeiger
          T     LD [AR2,P#6.0]; 
     
    NETWORK
    TITLE =Quelle (ANY-Pointer) nach Ziel (ANY-Pointer) kopieren
     
          CALL SFC   20 (
               SRCBLK                   := #TEMP_Quelle,
               RET_VAL                  := #TEMP_RET_VAL,
               DSTBLK                   := #TEMP_Ziel);
          NOP   0; 
     
    NETWORK
    TITLE =Register wiederherstellen
     
          AUF   DB [#TEMP_DB_Register]; // DB-Register
     
          L     #TEMP_AR1_Register; // AR1-Register
          LAR1  ; 
     
          L     #TEMP_AR2_Register; // AR2-Register
          LAR2  ; 
     
    END_FUNCTION
    Gruß Kai
    Angehängte Dateien Angehängte Dateien

  8. Folgender Benutzer sagt Danke zu Kai für den nützlichen Beitrag:

    Toki0604 (02.11.2010)

  9. #6
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Und noch ein paar Bilder aus der Simulation mit PLCSIM.

    Gruß Kai
    Angehängte Grafiken Angehängte Grafiken

  10. Folgender Benutzer sagt Danke zu Kai für den nützlichen Beitrag:

    Toki0604 (02.11.2010)

  11. #7
    Avatar von Toki0604
    Toki0604 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    14.10.2010
    Ort
    Telgte
    Beiträge
    653
    Danke
    97
    Erhielt 129 Danke für 99 Beiträge

    Daumen hoch

    Mit bestem Dank an Dalbi, Larry und Kai !
    Das Einlesen und Schreiben funktioniert. Nun gehe ich an die erweiterte Funktion die Ziel-Speicherplätze dynamisch zu gestalten.
    Dazu denke ich muss ich nur entsprechend einen Offset an den Zielspeicherort anhängen. Werde ich jetzt mal ausprobieren.

    Gruß
    Torsten
    Angehängte Dateien Angehängte Dateien
    Zitieren Zitieren Erstes Ziel erreicht - Grundfunktion steht  

  12. #8
    Avatar von Toki0604
    Toki0604 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    14.10.2010
    Ort
    Telgte
    Beiträge
    653
    Danke
    97
    Erhielt 129 Danke für 99 Beiträge

    Daumen hoch

    Hi,
    habe meinen Offset auch ans laufen gebracht. (Schwitz )
    Schaut ihr vielleicht mal ob das OK ist, oder es ggf. eine elegantere Lösung gibt !? Habe es als PDF angehängt, weil Quellcode ist glaub ich zu viel.
    Danke, Gruß
    Torsten
    Angehängte Dateien Angehängte Dateien
    Zitieren Zitieren Erweiterte Funktion läuft auch  

  13. Folgender Benutzer sagt Danke zu Toki0604 für den nützlichen Beitrag:

    dkaserer (21.09.2011)

  14. #9
    Registriert seit
    19.02.2005
    Beiträge
    199
    Danke
    12
    Erhielt 8 Danke für 6 Beiträge

    Standard

    Hallo Leute,

    ich habe dieses Beispiel von Kai ausprobiert.
    Klappt gut. Warum kann ich aber keine Lokaldaten als Destination angeben:

    Code:
    Call "Any"
    IN_Quelle:=P#DB100.DBX0.0 Byte 10
    IN_Ziel:=P#L 0.0 BYTE 10
    Gruß,
    Aksels
    Linux is like a Wigwam: no Windows, no Gates and Apache inside.
    Zitieren Zitieren Aufruf des FC mit Temp-Daten  

  15. #10
    Registriert seit
    08.04.2008
    Ort
    Köln
    Beiträge
    844
    Danke
    39
    Erhielt 244 Danke für 199 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Aksels,

    Du kannst mit dem Any-Pionter auf Lokal-Variablen des aktuellen und auf die L-Variablen vorhergehenden
    Bausteins zugreifen. D.h. Du könntest im Baustein "Any" auf die L-Variablen des aufrufenden Bausteins
    zugreifen. Der SFC 20 kann nur auf seine und die des "Any" zugreifen.
    Auf die L-Variablen des vor-vorhergehenden Bausteins kann man nicht zugreifen.

    Grüße
    Gebs

Ähnliche Themen

  1. Move in CFC
    Von Shettyman im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 18.12.2010, 17:27
  2. ST Move
    Von c.wehn im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 12.12.2009, 12:39
  3. Zugriff auf Adressen mittels Pointer
    Von Jiss im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 11.12.2009, 07:56
  4. Move Befehl in SCL
    Von Felse im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 03.03.2009, 09:19
  5. CoDeSys - Move
    Von mark_ im Forum Sonstige Steuerungen
    Antworten: 7
    Letzter Beitrag: 04.06.2007, 17:23

Lesezeichen

Berechtigungen

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