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

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

Thema: Mit SFC20 "Blockmve" PEWs in DB schreiben

  1. #1
    Registriert seit
    03.12.2008
    Beiträge
    654
    Danke
    160
    Erhielt 185 Danke für 113 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen
    Stehe gerade etwas auf dem Schlauch

    Wie kann ich mit dem SFC20 "Blockmove" den Peripheriebereich ab PEW256 (-->16 Worte)
    in einen DB transferieren?
    Code:
        CALL  "BLKMOV"
          SRCBLK :=P#E 256.0 BYTE 32       //PEW256 Breite 32 Byte
           RET_VAL:=MW500
           DSTBLK :="Schrauberschnittstelle".PLC_IN
    Mit diesem Code geht es nicht. S7 frisst ihn zwar, aber es kommt nichts an.

    Code:
        CALL  "BLKMOV"
          SRCBLK :=P#PEW 256 BYTE 32       //PEW256 Breite 32 Byte
           RET_VAL:=MW500
           DSTBLK :="Schrauberschnittstelle".PLC_IN
    P#PEW 256 BYTE 32 oder ähnliche Konstrukte werden erst gar nicht akzeptiert.

    Muss doch irgendwie gehen.

    Vielen Dank schon mal im voraus.
    PS. Bin auch für andere Lösungen offen, muss nicht SFC20 sein.
    Zitieren Zitieren Mit SFC20 "Blockmve" PEWs in DB schreiben  

  2. #2
    Registriert seit
    23.10.2009
    Beiträge
    390
    Danke
    58
    Erhielt 112 Danke für 86 Beiträge

    Standard

    Dein erstes Beispiel greift ja nicht auf PEB256... zu sondern auf EB256...
    Sollte klappen, aber ist das PAE der CPU denn groß genug eingestellt?

    Zum zweiten Beispiel: BLKMOV kann mMn nicht direkt auf die Peripherie zugreifen.

    Gruß
    Erich

  3. #3
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.725
    Danke
    314
    Erhielt 1.519 Danke für 1.282 Beiträge

    Standard

    Die einfachste Lösung wäre, so du eine relativ neue CPU hast in der HW-Konfig das Prozessabbild zu vergrößern im Reiter "Zyklus/Taktmerker".

    Mfg
    Manuel
    Warum denn einfach, wenn man auch Siemens einsetzen kann!

    Wer die grundlegenden Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu bekommen, verdient weder Freiheit noch Sicherheit (B. Franklin).

  4. #4
    Registriert seit
    06.10.2003
    Beiträge
    3.403
    Danke
    447
    Erhielt 502 Danke für 406 Beiträge

    Standard

    Zitat Zitat von Paul Beitrag anzeigen
    .. Muss doch irgendwie gehen ...
    Die SFC20 kopiert nichts aus dem Peripheriebereich. Man kann sich jedoch in SCL eine FC stricken, die in einer Schleife indiziert auf den Peripheriebereich zugreift. So eine Funktion ist auch ganz nützlich, um nichtkonsistente Datenblöcke eines Busteilnehmers zu kopieren (analog zur SFC14/15 für konstistente Bereiche).
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  5. #5
    Registriert seit
    13.10.2015
    Beiträge
    2
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo zusammen,
    ich bin neu hier im Forum. Schaue immer mal gerne hier herein, weil ich immer gute Beiträge und Hilfestellungen gelesen habe.
    Zurzeit habe ich ein ähnliches Problem, wie Paul.

    Ich benötige eine registerindirekte Adressierung für einen bibliotheksfähigen Baustein. Ziel ist es an den Baustein (FB167) einen Prozesseingangs-Adressbereich anzulegen und anschließend sollen intern, in Abhängigkeit von mehreren Variablen (Dateneingangsbyte, Nutzdatenlänge, etc.), die Eingangsbytes eingelesen und in den Instanzdatenbaustein abgelegt werden. Alles soll in AWL programmiert sein.

    Hier ist mein erster Ansatz, der leider nicht so funktioniert, wie ich es mir vorstelle:

    FB167, DB167
    L #I_PEB_Startbyte // lade Nummer von erstem Eingangsbyte (In-Var)
    T #S_PEB_Nr // schreibe in statische Variable

    L #I_Data_Laenge // lade vorgegebene Daten-Länge (In-Var)
    loop: T #S_Laenge // schreibe in statische Variable

    L P##E_Result_Data // lade Inhaltswert von E_Result_Data (In-Var)
    T #S_PEB_Inhalt // schreibe Wert in PEB_Inhalt
    L #S_PEB_Inhalt // lade PEB_Inhalt
    T #S_DM_Result_Data[1] // schreibe in Speicherbereich Array

    L #S_PEB_Inhalt // lade PEB_Inhalt, eigentlich Speicherort für nächsten Loop-Durchlauf
    L 1 // lade Ziffer 1
    +I // addiere es zu Pointerinhalt,
    T #S_PEB_Inhalt // überschreibe in Variable

    L #S_PEB_Nr // lade Nummer vom aktuellen Eingangsbyte
    L 1 // lade 1
    +I // addiere zusammen
    T #S_PEB_Nr // überschreibe in Variable

    L #S_Laenge // lade aktuelle Länge (als statische Var, die heruntergezählt wird)
    LOOP loop // Sprung zur Marke "loop" nachdem Variable um 1 dekrementiert

    Kann mir bitte jemand dabei helfen bzw. gibt es eine andere Lösung?
    Ich bin gerade dabei mir mehr AWL-Kenntnisse aufzubauen.

    VG
    Bit_Schupser

  6. #6
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Für welche SPS soll der Code sein?

    Warum soll das ein FB sein? Wäre FC nicht besser?

    Soll der "bibliotheksfähige" Baustein die Herkunft der Daten verschleiern oder darf man das auch sauber in den Referenzdaten wiederfinden können?

    Ist garantiert, daß der von Deinem Baustein zukünftig von hinten durch die Brust ausgelesene Peripheriebereich byteweise organisiert ist oder wirst Du nicht vielmehr Konsistenzprobleme durch die "zerhackten" Zugriffe bekommen?

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. #7
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Wieviele PEB oder PEW sind das bei Dir, wo kommen die her und was stellen sie dar?

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  8. #8
    Registriert seit
    13.10.2015
    Beiträge
    2
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Harald,

    die CPU ist eine VIPA SLIO, mit PG/OP und PN-Schnittstelle. Die Daten kommen von einem PN-Teilnehmer. Es ist ein Scanner, der einen Barcode zur Produktidentifizierung aufnimmt und daher eingelesen werden muss.
    Mir ist klar, dass ich auch über verschiedene SFBs oder SFCs die Daten einlesen könnte. Es soll aber, wenn möglich, mit einer am FB167 angelegten Eingangsvariable realisiert werden.
    Ursprünglich habe ich es statisch mit Move (z.B. lade PEB160 transferiere Array[1]) realisiert. Da sich aber jetzt meine Vorgaben geändert haben, soll die Verarbeitung variabel und dynamisch aufgebaut sein.

    Der FB167 besteht aus etwa 30 Netzwerken und hat noch weitere Funktionen zur Ansteuerung des Scanners.

    Ich verstehe deine Frage “Daten verschleiern“ nicht. Mein Ziel ist ein Loop, der in Abhängigkeit der Barcodelänge den Prozesseingangsbytebereich aufwärts (ab PEB160) einliest und die Werte dazu in ein Array schreibt. Als maximale Vorgabe vom Scanner sind 64 Byte (als Char) vorgegeben. In meinen Maschinen brauche ich für gewöhnlich 10 – 20 Chars.

    Gruß
    Bit_Schupser

    P.S. kann mir jemand sagen, wie ich hier im Forum die Beiträge zitieren? Bin noch neu hier.

  9. #9
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von Bit_Schupser Beitrag anzeigen
    kann mir jemand sagen, wie ich hier im Forum die Beiträge zitieren? Bin noch neu hier.
    Unten rechts unter jedem Beitrag gibt es einen Button "Zitieren" - den benutzen. Alles weitere siehst Du dann schon.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  10. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    Bit_Schupser (14.10.2015)

  11. #10
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Mit "verschleiern" meine ich, daß bei der Übergabe von Adressen als INT die Zugriffe auf die Adressen nicht in den Referenzdaten erscheinen. Sehr schlechter Programmierstil...

    Das Kopieren kann man so machen:
    Code:
    FUNCTION_BLOCK FBxxx
    TITLE =
    VERSION : 0.1
    
    VAR_INPUT
      I_PEB_Ptr : POINTER ; //PEBxxx Anfangsadresse des PEB-Bereichs
      I_Data_Laenge : INT ; //Länge des PEB-Bereichs
    END_VAR
    VAR
      S_DM_Result_Data : ARRAY  [1 .. 64 ] OF //internes Byte-Array
      BYTE ;
    END_VAR
    VAR_TEMP
      t_PEB_Ptr : DWORD ;   //Pointer im Doppelwortformat für speicherindirekte Adressierung
      t_Laenge : INT ;      //Schleifenzähler
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    
    //*** Pointer auf übergebenen Peripherieeingangsbereich
          L     P##I_PEB_Ptr;               //Adresse des In-Parameters in dieser Instanz (DI)
          TAR2  ;                           //Offset dieser (Multi-)Instanz (DB)
          UD    DW#16#FFFFFF;               //Bereichskennung (DB) ausblenden
          +D    ;                           //dazuaddieren
          LAR1  ;                           //--> AR1: Adresse des In-Parameters im IDB (DI)
          L     DID [AR1,P#2.0];            //übergebenes PEx als P#Pxxx.0
          T     #t_PEB_Ptr;                 //Pointer auf Peripherieeingangsbereich
    //      LAR1  ;                           //(nur zum beobachten)
    
    //*** Pointer auf Byte-Array in STAT
          L     P##S_DM_Result_Data;        //Adresse des Byte-Array in dieser Instanz (DI)
          TAR2  ;                           //Offset dieser (Multi-)Instanz (DB)
          UD    DW#16#FFFFFF;               //Bereichskennung (DB) ausblenden
          +D    ;                           //dazuaddieren
          LAR1  ;                           //--> AR1: Adresse des Byte-Array im IDB (DI)
    
    //*** Länge des Peripherieeingangsbereich prüfen,
    //    darf nur 1 bis max Array-Größe von S_DM_Result_Data[1..64] sein 
          L     #I_Data_Laenge;             //darf nur 1..64 sein!
          L     65;                         //Größe+1 des Byte-Array S_DM_Result_Data[1..64]
          MOD   ;                           //auf 0..64 begrenzen, notfalls wrap
          SPN   loop;
          L     1;                          //Länge = 0! --> mit 1 ersetzen
    
    //*** Kopierschleife
    loop: T     #t_Laenge;                  //Schleifenzähler
    
    //*** kopieren PEB[adr] --> S_DM_Result_Data[i]
          L     PEB [#t_PEB_Ptr];           //PEB[adr]
          T     DIB [AR1,P#0.0];            //S_DM_Result_Data[i]
    
    //*** beide Pointer weiterstellen
          L     #t_PEB_Ptr;
          L     P#1.0;
          +D    ;
          T     #t_PEB_Ptr;                 //(adr) auf nächstes PEB
    
          +AR1  P#1.0;                      //(i) auf nächstes Byte im Array S_DM_Result_Data[]
    
    //*** Schleife
          L     #t_Laenge;                  //Schleifenzähler
          LOOP  loop;
    
    END_FUNCTION_BLOCK
    An I_PEB_Ptr schreibst Du beim Aufruf dann z.B. "PEB160" (also: I_PEB_Ptr:=PEB160)

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  12. Folgende 2 Benutzer sagen Danke zu PN/DP für den nützlichen Beitrag:

    Bit_Schupser (14.10.2015),RONIN (14.10.2015)

Ähnliche Themen

  1. Antworten: 28
    Letzter Beitrag: 25.06.2015, 14:52
  2. "int" mit VAL_STRG in "string"
    Von Susi70 im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 17.02.2012, 14:03
  3. Probleme mit 12/24V "high" und 0V als "low" Auswertung
    Von PraktikantMarkus im Forum CODESYS und IEC61131
    Antworten: 8
    Letzter Beitrag: 14.12.2011, 01:37
  4. Antworten: 8
    Letzter Beitrag: 17.03.2009, 22:18
  5. Probleme mit SFC20 "BLKMOV"
    Von matchef im Forum Simatic
    Antworten: 25
    Letzter Beitrag: 18.12.2008, 16:19

Stichworte

Lesezeichen

Berechtigungen

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