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

Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 33 von 33

Thema: Befehl zum auslesen eines Strings

  1. #31
    Registriert seit
    16.05.2005
    Ort
    Stuttgart
    Beiträge
    53
    Danke
    15
    Erhielt 4 Danke für 4 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Ich kenne leider deinen FB nicht. Ich denke aber mal, dass er nicht grundsätzlich den ganzen Puffer benutzt, wenn nicht entsprechend Zeichen übertragen werden.
    Willst du dir da ganz sicher sein, dann arbeitest du mit dem Puffer wie gehabt und kopierst nach dem Receive mittels SFC20 (Block-Move) den ganzen Kram in deinen String, den du dann entsprechend auswertest.

    Vorrangig würde mich allerdings interessieren, ob meine Theorie mit dem Empfangslänge stimmt ... Darauf baut alles weitere auf ...

    Gruß
    LL
    den orginal fb von wago hab ich hier rein gesetzt und mein programm wie ich es machen will steht hier

    Code:
    /--- Teststatements -----------------
          L     MW   200
          T     #SendCount
    //------------------------------------
    
    
    // *********************************************** //
    // ** EXAMPLE FOR THE CALL OF THE SERIAL-DRIVER ** // 
    // *********************************************** //
    
          CALL  FB    21 , DB21
           Send_DBNo          :=DB11        // DB with the Senddata
           Send_from_ByteNo   :=1           // Index of the first Byte to send
           Send_n_Bytes       :=#SendCount  // Quantity of Sendbytes
           Receive_DBNo       :=DB10        // DB for the Receivedata
           Start_Receivebuffer:=1           // Index for the begin of Receivebuffer
           Receivebuffer_Size :=30          // Size of the Receivebuffer (Ringbuffer)
           Input_65x          :=P#P  260.0 BYTE 4    // Input-Startaddress of the serial modul (modulwidth only 4 or 6 Byte)
           Output_65x         :=P#P  260.0 BYTE 4    // Output-Startaddress of the serial modul (modulwidth only 4 or 6 Byte)
           Used_Coupler_is_x33:=TRUE        // If the used Coupler is a 301 or 303 then put this input to FALSE else put it to TRUE
           Receive_next_Byte  :=#ReceiveIndex    //Index of the place for the next received character
           RESET              :=M10.0       // Reset to the serial Interface (this Variable will be deleted by the FB)
           Start_Sendjob      :=M10.1       // Start one Job for sending data (this Variable will be deleted by the FB)
    
    
      CALL  SFC   20
           SRCBLK :=P#DB10.DBX0.0 BYTE 255
           RET_VAL:=#test
           DSTBLK :=#ReceiveData
    
    
          CALL  FC    10
           S1     :=#ReceiveData
           S2     :=#NID_1
           RET_VAL:=#NID_1_1
    
      CALL  FC    10
           S1     :=#ReceiveData
           S2     :=#NID_2
           RET_VAL:=#NID_2_1
    
      U     #NID_4_1               // Hier muss ich aus einem String eine zahl auslesen und später weiterverwenden
          L     DB10.DBD   12
          T     #Druck
    
    
         U     E      0.0
          SPBNB _001
          CALL  SFC   20
           SRCBLK :=#SPS_1
           RET_VAL:=#err_sps_1
           DSTBLK :=P#DB11.DBX0.0 BYTE 255
    _001: NOP   0
    
          U     E      0.1
          SPBNB _002
          CALL  SFC   20
           SRCBLK :=#SPS_2
           RET_VAL:=#err_sps_2
           DSTBLK :=P#DB11.DBX0.0 BYTE 255
    _002: NOP   0
    
          U     E      0.2
          SPBNB _003
          CALL  SFC   20
           SRCBLK :=#SPS_3
           RET_VAL:=#err_sps_3
           DSTBLK :=P#DB11.DBX0.0 BYTE 255
    _003: NOP   0
    
    
          U     E      0.3
          SPBNB _004
          CALL  SFC   20
           SRCBLK :=#SPS_4
           RET_VAL:=#err_sps_4
           DSTBLK :=P#DB11.DBX0.0 BYTE 255
    _004: NOP   0
    
          U     E      0.4
          SPBNB _005
          CALL  SFC   20
           SRCBLK :=#SPS_5
           RET_VAL:=#err_sps_5
           DSTBLK :=P#DB11.DBX0.0 BYTE 255
    _005: NOP   0
    
    
          U     E      0.5
          SPBNB _006
          CALL  SFC   20
           SRCBLK :=#SPS_6
           RET_VAL:=#err_sps_6
           DSTBLK :=P#DB11.DBX0.0 BYTE 255
    _006: NOP   0
    
          U     E      0.6
          SPBNB _007
          CALL  SFC   20
           SRCBLK :=#SPS_7
           RET_VAL:=#err_sps_7
           DSTBLK :=P#DB11.DBX0.0 BYTE 255
    _007: NOP   0
    
          U     E      0.7
          SPBNB _008
          CALL  SFC   20
           SRCBLK :=#SPS_8
           RET_VAL:=#err_sps_8
           DSTBLK :=P#DB11.DBX0.0 BYTE 255
    _008: NOP   0
    ich werd nun mal mich an meine sps setzten und testen
    Es gibt 2 Dinge die unendlich sind
    das Universum und die menschliche Dummheit
    beim Universum bin ich mir nicht ganz sicher

  2. #32
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Der FC10 arbeitet nur mit Strings, diese müssen auch richtig initialisiert sein, d.h. in Byte 0 und 1 (max Länge, genutzte Länge) muß auch etwas drinstehen, sonst wird der FC10 kein Ergebnis liefern. Das gilt auch, bzw. insbesondere, wenn man temporäre Strings verwendet! Hatte ich dir aber schon geschrieben.

    Aber by the way, hier mal ein Baustein, der einen DB nach einem String durchsucht, allerdings hat der String eine feste Länge, du müßtest das anpassen für variable Strings bzw. 2 FB für die 2 Strings schreiben. Nur als Anregung

    Code:
    FUNCTION_BLOCK FB 110
    TITLE =
    AUTHOR : Ralle
    FAMILY : System
    NAME : Search
    VERSION : 0.9
    
    
    VAR_INPUT
      DBNr : INT ;                    //DB-Nummer des DB, der durchsucht werden soll
      Scanncode : STRING  [18 ];    //18 Zeichen langer Suchstring
      Max_Len : INT ;                //Wieviele Bytes sollen im DB durchsucht werden?
    END_VAR
    VAR_OUTPUT
      Pos : INT ;                    //Byte-Nr, an der der Code gefunden wurde
    END_VAR
    VAR_IN_OUT
      Start : BOOL ;                //einmalig zum Start setzen, wird am Ende vom FB zurückgesetzt
      Fertig : BOOL ;                //Fertigmeldung, wird bei Start immer gelöscht
      Code_gefunden : BOOL ;        //Codevergeleich war positiv, wird bei Start immer gelöscht
    END_VAR
    VAR
      ddSuch : DWORD ;                //erstes DWord zur Suche
      Zaehler : INT ;                //Suchzähler
    END_VAR
    VAR_TEMP
      SAVE_VKE : BOOL ;    
      RETTAR1 : DWORD ;    
      RETTAR2 : DWORD ;    
      wDBNo : WORD ;    
      TEMP0 : DWORD ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    
    //Sichere VKE im BIE
          SET   ; 
          SAVE  ; 
          =     #SAVE_VKE; 
    
    //Adressregister retten
          TAR1  #RETTAR1; 
          TAR2  #RETTAR2; 
    
          U     #Start; 
          SPBN  ENDE; 
    
          L     #DBNr; 
          T     #wDBNo; 
          AUF   DB [#wDBNo];         //globalen DB öffnen
    
          SET   ; 
          R     #fertig; 
          R     #Code_gefunden; 
    
          L     P##Scanncode; 
          LAR1  ; 
          L     DID [AR1,P#2.0];     //Byte0+1 sind Stringlänge
          T     #ddSuch;             //Das ist das erste DWord, das gesucht wird
    
          L     #Max_Len;             //Maximale Länge der Daten im DB
    Z001: T     #Zaehler; 
    
          L     #Max_Len; 
          L     #Zaehler; 
          -D    ;                     //wir wollen ja bei DBD0 anfangen (bei Bedarf noch ein Offset dazu)
          SLD   3;                     //aus dem Zähler einen Pointer machen
          LAR1  ; 
          L     DBD [AR1,P#0.0]; 
          L     #ddSuch; 
          ==D   ; 
          SPB   VERG; 
    
          L     MD   100; 
          L     1; 
          +D    ; 
          T     MD   100; 
    
    WESU: L     #Zaehler; 
          LOOP  Z001;                 //der Zaehler wird automatisch um 1 dekrementiert (erniedrigt)
          SPA   KCOD;                 //alles durchsucht, aber keine Übereinstimmung gefunden
    
    VERG: NOP   0; 
    //18 Zeichen vergleichen
    //1 Zeichen entspricht einem Byte, 4 Zeichen haben wir schon, bleiben 14 weitere, macht 3 DWORD + 1 WORD
    
    //Zeichen 5-8
          L     #Max_Len; 
          L     #Zaehler; 
          -D    ; 
          SLD   3; 
          LAR1  ; 
          L     DBD [AR1,P#4.0]; 
          T     #TEMP0; 
          L     P##Scanncode; 
          LAR1  ; 
          L     DID [AR1,P#6.0]; 
          L     #TEMP0; 
          ==D   ; 
          SPBN  WESU;                 //ungleich, also oben weitersuchen mit dem nächsten Byte
    
    //Zeichen 9-12  
          L     #Max_Len; 
          L     #Zaehler; 
          -D    ; 
          SLD   3; 
          LAR1  ; 
          L     DBD [AR1,P#8.0]; 
          T     #TEMP0; 
          L     P##Scanncode; 
          LAR1  ; 
          L     DID [AR1,P#10.0]; 
          L     #TEMP0; 
          ==D   ; 
          SPBN  WESU;                 //ungleich, also oben weitersuchen mit dem nächsten Byte
    
    //Zeichen 13-16
          L     #Max_Len; 
          L     #Zaehler; 
          -D    ; 
          SLD   3; 
          LAR1  ; 
          L     DBD [AR1,P#12.0]; 
          T     #TEMP0; 
          L     P##Scanncode; 
          LAR1  ; 
          L     DID [AR1,P#14.0]; 
          L     #TEMP0; 
          ==D   ; 
          SPBN  WESU;                 //ungleich, also oben weitersuchen mit dem nächsten Byte
    
    //Zeichen 17-18
          L     #Max_Len; 
          L     #Zaehler; 
          -D    ; 
          SLD   3; 
          LAR1  ; 
          L     DBW [AR1,P#16.0]; 
          T     #TEMP0; 
          L     P##Scanncode; 
          LAR1  ; 
          L     DIW [AR1,P#18.0]; 
          L     #TEMP0; 
          ==D   ; 
          SPBN  WESU;                 //ungleich, also oben weitersuchen mit dem nächsten Byte
    
    //18 Zeichen gleich, also Code gefunden und fertig
          SET   ; 
          S     #fertig; 
          S     #Code_gefunden; 
          R     #Start; 
          L     #Max_Len; 
          L     #Zaehler; 
          -D    ; 
          T     #Pos; 
          SPA   ENDE; 
    
    //keine Übereinstimmung gefunden, aber das Ende des Suchbereiches erreicht
    KCOD: SET   ; 
          S     #fertig; 
          R     #Code_gefunden; 
          R     #Start; 
          L     0; 
          T     #Pos; 
    
    ENDE: NOP   0; 
    
    //Zurückübertragen der geretteten Adressregister
          LAR1  #RETTAR1; 
          LAR2  #RETTAR2; 
    
          U     #SAVE_VKE; 
          SAVE  ; 
          BE    ; 
    END_FUNCTION_BLOCK
    Und hier noch ein SCL-Baustein, der aus einem DB Strings extrahiert, indem er nach einer Trennsequenz sucht, bei dir war das /r/v oder so?

    Code:
    FUNCTION_BLOCK FB7
    
    Title = 'Auftrag'
    //
    // Auftragstrennung
    // Zerlegung des Auftragsfiles
    // in seine einzelnen Bestandteile
    // Im File trennt ';' die 
    // einzelnen Positionen voneinander
    // 
    Version : '1.0'
    author  : Ralle
    name    : AUFTRAG
    family  : SYSTEM
    
    VAR_INPUT
      // Eingangsparameter
      Auftrag: STRING[200];
    END_VAR
    
    VAR_OUTPUT // Ausgangsparameter
      Car_id_No: STRING[7];
      Kind_of_production: STRING[4];
      IO_Flag: STRING[2];
      Sachnummer: STRING[10];
      OPS_Kennung: STRING[3];
      Auftrag_Order_No: STRING[8];
      D_Part_Number_1: STRING[8];
      D_Part_Number_2: STRING[8];
      D_Part_Number_3: STRING[8];
      D_Part_Number_4: STRING[8];
      D_Part_Number_5: STRING[8];
      D_Part_Number_6: STRING[8];
      D_Part_Number_7: STRING[8];
      D_Part_Number_8: STRING[8];
    
    END_VAR
    
    VAR_TEMP
        // temporäre Variablen
      Pos: INT;
      SuchString: STRING;
      Length: INT;
    END_VAR
    
    // Anweisungsteil
    //SuchString := '$0D$0A';
    SuchString := ';';
    Length := 0;
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    Car_id_No :=            MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=          DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    Kind_of_production :=   MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=          DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    IO_Flag :=              MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=          DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    Sachnummer :=       MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=          DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    OPS_Kennung :=     MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=          DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    Auftrag_Order_No := MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=          DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    D_Part_Number_1 := MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=          DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    D_Part_Number_2 := MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=          DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    D_Part_Number_3 := MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=          DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    D_Part_Number_4 := MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=          DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    D_Part_Number_5 := MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=          DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    D_Part_Number_6 := MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=          DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    D_Part_Number_7 := MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=          DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    D_Part_Number_8 := MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=          DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    ;
    END_FUNCTION_BLOCK
    Leider bin ich gerade unterwegs und habe kaum Netzzugang, daher kann eine Antwort eher wieder am Ende der Woche von mir kommen.

    Hoffe der Code hilft dir etwas weiter, sollte zumindest als Anregung dienen.

    PS: FIND, MID und DELETE sind funktionen aus der IEC-Standard-Library unter Step7!
    Geändert von Ralle (21.04.2008 um 10:51 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

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

    nonguru (21.04.2008)

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    wie sieht es aus bei dir ...?
    Wolltest du mir nicht noch ein paar Info's zukommen lassen ...?

Ähnliche Themen

  1. Auslesen eines Projekts
    Von superbug im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 05.08.2011, 12:52
  2. Übertragen eines Strings [9] in DB
    Von Wiedenn? im Forum Simatic
    Antworten: 25
    Letzter Beitrag: 14.07.2009, 21:11
  3. Antworten: 5
    Letzter Beitrag: 30.06.2009, 11:48
  4. Wie Laufzeit eines SPS-Programmes auslesen?
    Von ctb im Forum CODESYS und IEC61131
    Antworten: 5
    Letzter Beitrag: 23.08.2008, 17:36
  5. SCL Befehl um die Länge eines Datenbausteins zu ermitteln?
    Von 1.0er im Forum Programmierstrategien
    Antworten: 1
    Letzter Beitrag: 13.01.2006, 02:18

Lesezeichen

Berechtigungen

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