Frage zum Datentyp STRING

pinolino

Level-1
Beiträge
261
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Ihr,

ich brauche bitte etwas Hilfe. Es geht darum, dass ich über einen OPC-Server in einem Datenbaustein den Datentyp STRING zur Verfügung gestellt bekomme.

z.B. steht da 'a' drin.

Nun möchte ich in der SPS überwachen, ob das Zeichen 'a' im DB vorhanden ist. Muss ich hier zunächst eine Umwandlung in einen anderen Datentyp vornehmen?

Wenn also 'a' drinsteht, so soll ein Ausgang gesetzt werden...

Vielen Dank!
pinolino
 
Hallo,
je nachdem, was du weiter vorhast und wie du es vorhast.
Du kannst aber ohne weitere Umwandlungen z.B. so etwas programmieren :
Code:
L DB10.DBB2
L 'a'
==I
= M10.0
Du mußt nur immer beachten, wie der String aufgebaut ist (er hat immer 2 Header-Bytes und dann kommen erst die "Nutzdaten").

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du mußt vor allem mal ausprobieren, was dein OPC-Server bei einem String anzeigt. Wir hatten Probleme mit dem Siemens-OPC-Server und S7-Strings, da fehlten immer die ersten beiden Buchstaben. Das wurde dann über Char-Arrays gelöst, wenn ich recht erinnere.
 
Vielen Dank schon mal für eure Hilfe!

@Larry: Wenn ich das so programmiere, wie du vorschlägst, dann flackert der Merker M10.0 in der Variablentabelle - woher kommt das?


Wenn die Weiterverwendung umfangreicher wird, so habe ich mir überlegt, dass ich mittels des IEC-Bausteins FC38 ja auch eine Umwandlung vornehmen könnte. Siehe Anhang!

Allerdings steht dann als Wert im MW10 die Zahl 0 - was habe ich da nur wieder falsch gemacht?

Grüße
pinolino
 

Anhänge

  • FC.jpg
    FC.jpg
    6,6 KB · Aufrufe: 66
  • DB.jpg
    DB.jpg
    10,6 KB · Aufrufe: 47
du solltest auf jede Fall den String initialisieren, wenn du die Step7-FC's benutzt.
Das heißt, dass der Header des Strings beschrieben werden muß. Im Byte 0 des Strings muss dann die deklarierte Länge des Strings stehen (bei dir dann 254) und im Byte 1 die benutzte Länge desselben (bei dir 1). Dann sollte der FC38 korrekt arbeiten.

Warum der Merker (meines Beispiels) flackert kann ich dir so nicht sagen. Wird er ggf. noch woanders verwendet ? Oder das String DBB ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Soll das ein "BIT" sein am Eingang "S" ?

Da passt eigentlich kein Zeichen rein?!

AH: P#DB5.DBX 0.0 (Byte,Word... zeigt der nicht mehr an?) byte 255
 
Zuletzt bearbeitet:
Was willst du an dieser Stelle überhaupt mit FC38 anfangen?

Der wandelt Strings, in denen Zahlen stehnen in Integer.

Beispiel:
mySting = '1234'

Dann wird am RET_VAL ein Integer mit dem Wert 1234 ausgegeben.

Bei Deinem String kann der FC natürlich nichts umwandeln da 'a' ja keine Zahl ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was willst du an dieser Stelle überhaupt mit FC38 anfangen?

Der wandelt Strings, in denen Zahlen stehnen in Integer.

Beispiel:
mySting = '1234'

Dann wird am RET_VAL ein Integer mit dem Wert 1234 ausgegeben.

Bei Deinem String kann der FC natürlich nichts umwandeln da 'a' ja keine Zahl ist.

Hm, also 'a' entspricht doch der Zahl 97 - und diese hätte ich auch am Ausgang RET_VAL erwartet, oder?

@Verpolt: P#DB5.DBX 0.0 hat das System von selbst so eingestellt; wie gesagt ich habe ja 'a' im DB stehen und dies hätte eigentlich gewandelt werden sollen.

@Larry: Der DB lässt mir hier ja gar nicht die Eingabe eines Bytes zu...

pinolino
 
Zuletzt bearbeitet:
@Pinolino:
Der Einwand von Aventinus ist vollkommen korrekt. Das Zeichen 'a' hat als ASCII-Zeichen zwar den Byte-Wert 97 - im Sinne der Wandlung String_to_INT hat es aber keinen Zahlenwert. (Welche Funktion der von dir verwendete FC hat hatte ich vorhin nicht weiter verifiziert)

Was heißt: "der DB läßt nicht die Eingabe eines Byte zu" ?
Ich denke, dein Problem ist hier die Beschränkung der Programmier-Möglichkeiten durch den Einsatz KOP/FUP. Wenn du etwas mit Strings etc. machen möchtest so würde ich dir empfehlen, dich von KOP/FUP zu lösen und es entweder in AWL zu programmieren oder besser noch in SCL ...

Gruß
larry
 
@Pinolino:
Der Einwand von Aventinus ist vollkommen korrekt. Das Zeichen 'a' hat als ASCII-Zeichen zwar den Byte-Wert 97 - im Sinne der Wandlung String_to_INT hat es aber keinen Zahlenwert.

Gruß
larry

Danke Larry,

allerdings verstehe ich das jetzt nicht so recht. Der Wert 97 ist doch ein Zahlenwert (INT), der sich aus dem Zeichen 'a' errechnet. Wieso hat dann 'a' nun doch keinen Zahlenwert? :confused:

Sorry, das hatte ich nicht geschrieben - es sind unter Step7 momentan lediglich Vorüberlegungen... das eigentliche Programm soll dann mittels dem TIA-Portal (S7-1200) programmiert werden und dieses lässt ja weder AWL noch SCL zu.

Grüße
pinolino
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn in deinem Sting[254] der Text 'a' steht sieht dein Sting so aus:

Byte 1 - Header: FEh
Byte 2 - Header: 1h
Byte 3 - Text[1]: 61h ('a' oder 97d)

wenn die Zahl '097' im String stehen sollte sieht das so aus:

Byte 1 - Header: FEh
Byte 2 - Header: 3h
Byte 3 - Text[1]: 30h ('0' oder 48d)
Byte 4 - Text[2]: 39h ('9' oder 57d)
Byte 5 - Text[3]: 37h ('7' oder 55d)

und darin besteht der Unterschied.
 
Zurück
Oben