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

Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 33

Thema: Befehl zum auslesen eines Strings

  1. #11
    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 peter(R) Beitrag anzeigen
    Wie lang ist der string, womit soll er verglichen werden und was soll damit gemacht werden (wenn ungleich)???

    peter(R)
    Die länge kann unterschiedlich sein ich weis nur das die letzten beiden zeichen \r\n sind wenn ungleich soll er mit dem nächten vergleichen bis er einen findet der gleich ist
    Es gibt 2 Dinge die unendlich sind
    das Universum und die menschliche Dummheit
    beim Universum bin ich mir nicht ganz sicher

  2. #12
    Registriert seit
    13.04.2008
    Ort
    Großraum KA
    Beiträge
    963
    Danke
    52
    Erhielt 128 Danke für 112 Beiträge

    Standard

    Ok. die länge der Zeichnen in dem String kann unterschiedlich sein. Aber es muss doch eine max. Gesamtlänge geben zB. String[16]. Damit wäre die erste Aufgabe wohl rauszufinden wo das letzte Zeichen steht und es dann mit einem anderen String[16] zu vergleichen bei dem man dann erst wieder das letzte Zeichen suchen muss. Ändert sich immer nur der "letzte" String ?? Oder gibt es eine Anzahl Strings die sich völlig beliebig ändern können ??? Wer sagt dir dann wann du welchen String mit welchem vergleichen musst ??
    Die Aufgabe erscheint mir doch etwas komplexer als du sie beim Themenstart beschrieben hast.
    Versuche doch bitte mal genau zu beschreiben was die Gesamtaufgabe ist. Das macht es sehr viel einfacher zu helfen.

    peter(R)

  3. #13
    Registriert seit
    04.02.2007
    Beiträge
    2.544
    Danke
    167
    Erhielt 731 Danke für 528 Beiträge

    Standard

    Die Daten kommen doch über eine Serielle Schnittstelle , oder ?

    Dann kommt bei einem Receive die länge der Daten als LEN an,

    Wenn Du die Daten z.B. in einem DB10 ablegst mit dem Format

    Code:
    Befehl String[60]
    so steht in DB10.DBB0 die maximale Länge von 60 zeichen

    Nach dem Empfang überträgst die die Länge in DB10.DBB11 (Achtung rein kommt ein INT also Wort)
    Achtung Als Parameter für den Empfang DB10 ab Adresse Dbb2 angeben.

    Somit hast Du einen fertigen String, den Du mit deinen angelegten Befehlen zum Beispiel in einer Schleife vergleichen kannst.
    Wenn immer am Ende die gleichen zeichen sind, die Dich nicht interesssieren, kannst Du die ausblenden, indem du z.B. die Länge um 4 reduzierst.

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

    Standard

    Ich glaube heute nacht hatte ich die göttliche eingebung;
    nun geh ich her
    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

    So sieht meine vorläufig noch nict getestete lösung aus


    Nun hast du aber nach der eigentlichen Aufgabe gefragt:
    die Aufgabe ist ich bekomme eine Zeichenkette auf der Serielen Schnittstelle und anhand dieser soll ich befahle ausführen und wieder eine zeichenkette zurücksenden. Manche ketten siend immer gleich nur eine enthält immer an der sleben stelle einen vierstelligen wert.

    reicht die info soweit
    Es gibt 2 Dinge die unendlich sind
    das Universum und die menschliche Dummheit
    beim Universum bin ich mir nicht ganz sicher

  5. #15
    Registriert seit
    13.04.2008
    Ort
    Großraum KA
    Beiträge
    963
    Danke
    52
    Erhielt 128 Danke für 112 Beiträge

    Standard

    Definiere 7.Stelle. Das würde ja bedeuten, daß nur die Stellen 7-10 für dich relevant sind WENN da ein Wert drinsteht oder verstehe ich da was falsch ?
    Ein Beispiel für so eine Zeichenkette wäre nicht schlecht. ZB. eine mit und eine ohne Wert.

    peter(R)

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

    Standard

    Zitat Zitat von peter(R) Beitrag anzeigen
    Definiere 7.Stelle. Das würde ja bedeuten, daß nur die Stellen 7-10 für dich relevant sind WENN da ein Wert drinsteht oder verstehe ich da was falsch ?
    Ein Beispiel für so eine Zeichenkette wäre nicht schlecht. ZB. eine mit und eine ohne Wert.

    peter(R)
    Hast du mal meinen Lösungsansatz gelesen könnte dieser funktinieren

    pruefablauf gestartet\r\n
    pruefdruck 0000\r\n 0000= wert zwischen 1000 und 9000
    ablauf wird beendet\r\n
    ablauf beendet\r\n
    Es gibt 2 Dinge die unendlich sind
    das Universum und die menschliche Dummheit
    beim Universum bin ich mir nicht ganz sicher

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

    Standard

    Zitat Zitat von jabba Beitrag anzeigen
    Die Daten kommen doch über eine Serielle Schnittstelle , oder ?

    Dann kommt bei einem Receive die länge der Daten als LEN an,

    Wenn Du die Daten z.B. in einem DB10 ablegst mit dem Format

    Code:
    Befehl String[60]
    so steht in DB10.DBB0 die maximale Länge von 60 zeichen

    Nach dem Empfang überträgst die die Länge in DB10.DBB11 (Achtung rein kommt ein INT also Wort)
    Achtung Als Parameter für den Empfang DB10 ab Adresse Dbb2 angeben.

    Somit hast Du einen fertigen String, den Du mit deinen angelegten Befehlen zum Beispiel in einer Schleife vergleichen kannst.
    Wenn immer am Ende die gleichen zeichen sind, die Dich nicht interesssieren, kannst Du die ausblenden, indem du z.B. die Länge um 4 reduzierst.
    ich schreibe es in einen db der inhalt wir in array0..255 vom typ byte geschrieben
    Es gibt 2 Dinge die unendlich sind
    das Universum und die menschliche Dummheit
    beim Universum bin ich mir nicht ganz sicher

  8. #18
    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 Nonguru,
    ich habe mir die bisherigen Postings angesehen und werde daraus nicht so richtig schlau.
    Vielleicht wäre es an dieser Stelle nicht schlecht, wenn du anhand von Beispielen mal erklärst, was du empfängst und was dich von den empfangenen Daten interessiert.

    Vielleicht grundsätzlich :
    Wenn du einen String mittels einer der Receive-FB's empfängst, dann wird dir mit dem gleichen FB auch die Anzahl der übertragenen Zeichen mitgeteilt. Diese Anzahl musst du dann nur noch in den String-Kopf eintragen und schon können die FC's LEFT, MID, RIGHT usw. korrekt arbeiten (der String ist nun initialisiert). Das heißt, wenn du die rechten beiden Zeichen deines String haben willst, dann weiß RIGHT automatisch wo die stehen.

    Gruß
    LL

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

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Hallo Nonguru,
    ich habe mir die bisherigen Postings angesehen und werde daraus nicht so richtig schlau.
    Vielleicht wäre es an dieser Stelle nicht schlecht, wenn du anhand von Beispielen mal erklärst, was du empfängst und was dich von den empfangenen Daten interessiert.

    Vielleicht grundsätzlich :
    Wenn du einen String mittels einer der Receive-FB's empfängst, dann wird dir mit dem gleichen FB auch die Anzahl der übertragenen Zeichen mitgeteilt. Diese Anzahl musst du dann nur noch in den String-Kopf eintragen und schon können die FC's LEFT, MID, RIGHT usw. korrekt arbeiten (der String ist nun initialisiert). Das heißt, wenn du die rechten beiden Zeichen deines String haben willst, dann weiß RIGHT automatisch wo die stehen.

    Gruß
    LL
    Vielleicht zur Hardware ich habe eine serielle Schnittstelle der Firma WAGO mit deren Vorgefertigten Baustein.
    Alles was über die Schnittstelle rein kommt wird in einen DB geschrieben vom Typ Array 0..255 byte
    genauso sende ich auch daten

    Nun zur Aufgabe:

    Ich sende an die Dichtpruefstation

    start pruefablauf\r\n

    hierauf erhalte ich

    pruefablauf gestartet\r\n

    nun sendet die Anlage den gewünschten Pruefdruck

    pruefdruck 0000\r\n

    sps sendet

    pruefdruck eingestellt 0000\r\n

    nid sendet

    pruefergebnis ergebnis\r\v ergebnis io oder nio

    usw.....


    und ich muss je nach string bei mir dinge machen

    oder antworten


    Sind diese informationen hilfreich
    Es gibt 2 Dinge die unendlich sind
    das Universum und die menschliche Dummheit
    beim Universum bin ich mir nicht ganz sicher

  10. #20
    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


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    ... ein bißchen ...

    Aus dem ARRAY [0..255] of Byte würde ich zunächst einen STRING [254] machen.
    Achtung hierbei : die Nutzdaten des String stehen ab Byte-Index String-Anfang +2. Im Byte 0 steht die definierte Länge des Strings (hier musst du 254 eintragen) und im Byte 1 steht die echte Länge des Strings (hier musst du die Anzahl der empfangenen Zeichen eintragen).
    Nun kannst du mit den STRING-Routinen an dem String herummachen bis der Arzt kommt ...
    Wichtig hier aber auch : Auch der Ziel-String für z.B. RIGHT muss initialisiert sein (in Byte 0 muss die deklarierte Länge des Strings stehen).

    Um die Sache ggf. einfacher zu machen ... hast du SCL zur Verfügung ?

    Gruß
    LL

Ä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
  •