TIA Umwandlung Array of Bytes zu String mit S7300 Series

goldenmacha

Level-2
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe eine MQTT Verbindung schon erfolgreich hergestellt und will eine Message von Array of Bytes schicken, aber die Mqtt Publisher FB hat die Typ String für Message. Wie kann man es unwandeln? Oder kann ich einfach die Datentyp von Message in der Bausteinschnittstelle direkt auf Array of Bytes umwandeln?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit welcher Step7 Software arbeitest du?
Array of Byte und String unterscheiden sich nur dadurch, dass bei String noch 2 Header Bytes (für die Länge) davor sind. Im Grunde muss man da noch nichtmal konvertieren oder umkopieren, das Array of Byte beginnt einfach auf der Adresse 2 Byte später als der String. In SCL kann man das prima mit AT abbilden (einen String mit einer Struktur von 2 Bytes und einem Array of Byte überlagern).
 
Mit welcher Step7 Software arbeitest du?
Array of Byte und String unterscheiden sich nur dadurch, dass bei String noch 2 Header Bytes (für die Länge) davor sind. Im Grunde muss man da noch nichtmal konvertieren oder umkopieren, das Array of Byte beginnt einfach auf der Adresse 2 Byte später als der String. In SCL kann man das prima mit AT abbilden (einen String mit einer Struktur von 2 Bytes und einem Array of Byte überlagern).
Ich habe mit einer Step7 Tia Portal v17 gearbeitet.
 
Gelöscht, es geht ja um eine S7-300. Bitte um Entschuldigung.
Dann würde ich auch AT-Sicht, wie von PN/DP vorgeschlagen.

Wie man in TIA bei der 300 die AT-Sicht deklariert bin ich mir nicht sicher.
Bei der 1500 geht es so wie hier gezeigt, könnte bei 300 ähnlich sein.
 
Zuletzt bearbeitet:
Gelöscht, es geht ja um eine S7-300. Bitte um Entschuldigung.
Dann würde ich auch AT-Sicht, wie von PN/DP vorgeschlagen.

Wie man in TIA bei der 300 die AT-Sicht deklariert bin ich mir nicht sicher.
Bei der 1500 geht es so wie hier gezeigt, könnte bei 300 ähnlich sein.
Ich habe mit der AT-Sicht probiert, aber geht es auch nicht oder ich habe es falsch verstanden oder gemacht.
 

Anhänge

  • 20240705_125929.jpg
    20240705_125929.jpg
    3 MB · Aufrufe: 21
  • 20240705_125938.jpg
    20240705_125938.jpg
    3,2 MB · Aufrufe: 21
  • 20240705_125949.jpg
    20240705_125949.jpg
    3,4 MB · Aufrufe: 19
Du müsstest zumindest stringAT.abc mit dem 10dez (Länge deines deklarierten Strings) beschreiben.
Und dann auch noch stringAT.abc2 mit irgendwas zwischen 1 und 10 (Anzahl der tatsächlich belegten Zeichen im String.

So wie es du hast entsteht ein String mit Länge 0 und Anzahl Zeichen 0.

Und die Deklaration der AT-SICHT solltest du nicht im OUT machen, nimmer eher STATIC oder TEMP.
Geht das im OUT überhaupt?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und deklariere den String als STRING[11]. Ohne Angabe der Länge belegt String 256 Byte.
Etwa so:
Code:
Output:
  sResult := String;

Static oder Temp:
  MyString : STRING[11];
  MyStringChars AT MyString : STRUCT
    maxlen : BYTE;                // maximale Länge des Strings
    actlen : BYTE;                // aktuelle Länge des Strings
    chars : ARRAY [1..11] OF CHAR; // die einzelnen Zeichen
  END_STRUCT;

// String Header initialisieren
MyStringChars.maxlen := 11;
MyStringChars.actlen := 11;

oder

MyString := '';  //das initialisiert die maxlen entsprechend der String[n]-Deklaration
MyStringChars.actlen := MyStringChars.maxlen;  //oder Anzahl tatsächlich enthaltener Zeichen

// Zeichen in das Array schreiben
MyStringChars.chars[1] := 'a';
...
MyStringChars.chars[11] := 'z';

// oder aus einem anderen Char/Byte-Array kopieren 
MyStringChars.chars := dasAndereArray;

// als String an den Output geben
sResult := MyStringChars;
 
Zurück
Oben