Befehl zum auslesen eines Strings

nonguru

Level-1
Beiträge
57
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
was muss ich eingen wenn ich im db10 ab bit 0 einen string habe und diesen ständig auslesen will auf die gesammte länge

wenn ich int oder dworl laden will heist das ja
L db10.dbw0

wie hesit das bei strings oder geht das überhaupt




:confused:
 
Um auf deine Frage sinnvoll antworten zu können müßtest du erstmal angeben, was du mit dem String anstellen willst ...

Laden kannst du innerhalb des SPS nur max. Doppelworte direkt ...
 
was muss ich eingen wenn ich im db10 ab bit 0 einen string habe und diesen ständig auslesen will auf die gesammte länge

wenn ich int oder dworl laden will heist das ja
L db10.dbw0

wie hesit das bei strings oder geht das überhaupt




:confused:

Ich will ihn dann vergleichen. Aber wie muss ich den angeben beim vergleicher das der weis wo es her komm ich will fc10 benutzen
 
Ich will ihn dann vergleichen. Aber wie muss ich den angeben beim vergleicher das der weis wo es her komm ich will fc10 benutzen

Die Eingangsparameter für die Funktion FC10 EQ_STRNG müssen mit symbolischen Variablen belegt werden.

http://www.sps-forum.de/showpost.php?p=95001&postcount=11

http://www.sps-forum.de/showpost.php?p=95003&postcount=13

Ein kurzes Programmbeispiel findest Du hier:

http://www.sps-forum.de/showpost.php?p=92669&postcount=6

http://www.sps-forum.de/showpost.php?p=92671&postcount=7

Gruß Kai
 
Also die länge des Strings ist unterschiedlich es sind nur die letzten beiden zeichen gleich /r/n
und ich soll nun die vergleichen und entsprechend ein bit setzten zur weiterverarbeitung
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann brauchst Du hier noch zusätlich die IEC-Funktion FC32 RIGHT:

FC 32 RIGHT

Beschreibung

Die Funktion FC 32 liefert die letzten L Zeichen einer Zeichenkette. Ist L größer als die aktuelle Länge der STRING Variablen, wird der Eingangswert zurückgeliefert. Bei L = 0 und bei einem Leerstring als Eingangswert wird ein Leerstring zurückgeliefert. Ist L negativ wird ein Leerstring ausgegeben und das Binärergebnis BIE auf ”0" gesetzt.

Parameter Deklaration Datentyp Speicherbereich Beschreibung
IN INPUT STRING D, L Eingangsvariable im Format STRING
L INPUT INT E, A, M, D, L, Konst. Länge der rechten Zeichenkette
RET_VAL OUTPUT STRING D, L Ausgangsvariable im Format STRING

Der Parameter IN und der Rückgabewert können nur mit einer symbolisch definierten Variablen belegt werden.

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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)
 
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 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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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)
 
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
... 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
 
Zurück
Oben