Step 7 Bestimmten Datenbereich aus Array auslesen

newbi_plc

Level-1
Beiträge
19
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Angehaengtes Bild zeigt Daten in einem DB mit dem Array BDAT [0..67] of Char. Die Daten die ich brauche stehen an einer bestimmten Stelle. In meinem Fall BDAT[4..24] wie im Bild.

Jetzt braeuchte ich aber diese in einem String um damit weiter arbeiten zu koennen (in diesem Fall benoetigt ein externer Teilnehmer die Bereitstellung der Daten in From eines Strings).

Mir ist aber nicht klar wie man aus einem Array des Typs Char bestimmte Datenbereiche auslesen kann und dann in einen String wandelt. Zumal kommt noch dazu das ich ein Sonderzeichen in den Daten habe in BDAT [14] (Rautezeichen). Dieses sollte nicht in dem String vorkommen. Man muss also dieses Zeichen „suchen“ und herausnehmen so dass zum Schluss nur noch Zahlen im String stehen. In diesem Fall eben String '53010326499000967152'

Mittles Google habe ich zumindest mal einen SCL code finden koennen der Character zu einem String zusammenfasst mit bestimmter Laenge. Siehe Text weiter unten. Soweit so gut. Man kann natuerlich jetzt muehsam jedes byte laden und transferieren aus dem DB in ein Array mit der Laenge der Daten ohne das Sonderzeichen aber ist das so eine gute Loesung? Dadurch verliere ich ein Stueck weit flexibilitaet falls sich die Daten mal aendern zum Beispiel. Die Daten starten immer an der gleichen Stelle im DB! Also an BDAT[4]

Ich weiss nicht ob das verstaendlich genug war. Hat jemand du sowas schon mal gemacht?



SCL code Char_to_string

Code:
FUNCTION FC1373 : VOID
 TITLE = 'FC_Char_To_String'
 VERSION : '1.0'
 AUTHOR  : HeD
 VAR_INPUT
    Chars : ARRAY[0..67]OF CHAR;
    Anzahl : INT;
 END_VAR
 VAR_TEMP
    Zaehler : INT;
    Anzahl_Byte : BYTE;
    Zeichenkette_AT : STRING;
    _Byte AT Zeichenkette_AT : ARRAY[0..1]OF BYTE;
    _Chars AT Zeichenkette_AT : ARRAY[0..255] OF Char;
 END_VAR
 VAR_OUTPUT    
 Zeichenkette : STRING;
 END_VAR
 //Variable initialisieren
 Zeichenkette_AT := '';
 //Größe der Nutzdaten festlegen
 Anzahl_Byte:=INT_TO_BYTE(Anzahl);
_Byte[0] := Anzahl_Byte;
 _Byte[1] := Anzahl_Byte;
 //Die Chars dem String zuweisen
    FOR Zaehler := 1 TO 67 BY 1 DO
        _Chars[Zaehler+1] := Chars[Zaehler];
    END_FOR;
 //Temp in Out kopieren    
 Zeichenkette := Zeichenkette_AT;
 END_FUNCTION
 

Anhänge

  • DB.JPG
    DB.JPG
    128,9 KB · Aufrufe: 50
In der Klassikwelt ist das denke ich nur über Any-Pointer zu lösen. Variablen Any erstellen der das kopieren erledigt, danach mit FIND die Zeichen suchen die weggehören und mit den STRING FCs von Siemens den Endstring zusammenbasteln.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Man kann auch (unschön) einen absoluten Pointer nehmen und den SFC20 (BLK_MOV) nehmen.


Bitte in Zukunft immer Softwareversion und Steuerungstyp angeben, dann wird dir wohl auch eher geholfen!
 
Man braucht dafür keine ANY-Pointer. Der oben in #1 gezeigte FC_Char_To_String kommt auch ohne ANY-Pointer aus. :cool:

Ich mache so ein Zerlegen von Byte/Char-Folgen meistens "von-Hand-zu-Fuß" zeichenweise (wie z.B. hier in mehreren Varianten). Das ist meistens auch nicht aufwendiger als zunächst Teilstücke für Standard-Bausteine mundgerecht zu kopieren/manipulieren. Oft mache ich dabei auch gleich die Konvertierung von eingebetteten Zahlenwerten zu INT oder REAL, dann braucht man die Zeichen nicht mehrmals anfassen.

Harald
 
Zurück
Oben