String ohne Trennzeichen zerlegen

ChopinJunkie

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

ich habe hier folgendes Problem: ich muss in Codesys ein gesamtes String Datei (also ein Wort), die mir ohne Trennzeichen gegeben wird, zerlegen und dann weiter in einer Form von ASCII Code-Symbolen-reihe darstellen.

Ich komme jetzt zum Gedanken, dass ich es am besten in ST Form schreiben muss. Leider bis jetzt habe ich ausschließlich mit FUP gearbeitet, also ich bin ein blütiger Anfänger in ST/AWL.

Hoffe auf eure Hilfe!
MfG,
ChopinJunkie
 
Hallo,

nach welchen Kriterien muss denn zerlegt werden? Und was muss dann damit gemacht werden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
nach welchen Kriterien muss denn zerlegt werden? Und was muss dann damit gemacht werden?
ein beliebiges String muss so zerlegt werden, damit das Programm später daraus einen ASCII codierten Zeichen(dargestellt als BOOL) bilden kann.

Ich habe bis jetzt nur einzige Idee, diesen String einfach mit vordefiniertem 2-dimensionalen String Array zu vergleichen. Auf diese Weise denke ich, ich könnte entsprechenden Indexen für spalten und zeilen addresse aus ASCII tabelle bekommen. Die Indexnummern dann später entsprechender weise mit STRING_TO_BYTE und STRING_TO_WORD bearbeiten.
Hoffentlich, meine Idee ist gut zu verstehen :)

Vllt hat jemand was anderes zu vorschlagen? Würde auf eure Hilfe freuen!

Gruß,
ChopinJunkie
 
Also willst du nur die einzelnen Buchstaben haben? Aber ASCII ist nicht BOOL sondern BYTE.

Was muss denn damit gemacht werden? Evtl. gibts da ne andere Lösung.
 
Also willst du nur die einzelnen Buchstaben haben? Aber ASCII ist nicht BOOL sondern BYTE.

Was muss denn damit gemacht werden? Evtl. gibts da ne andere Lösung.

Was damit gemacht werden soll, habe ich meiner Meinung nach schon beschrieben, oder?!
--> Ein Wort Buchstaben weise so zerlegen, damit jede einzelne Buchstabe des Wortes mit z.B. 2#100_0001 (was laut ASCII Binary Darstellung ein A ist) gesendet werden kann.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mir ist auch nicht ganz klar was du willst.
Wenn du einen String in ASCII-Code umwandeln willst, geht das ganz leicht mit einem Pointer.

Code:
var
  ASCII_Array :Array[1..255] of Byte;
  pZeichen : Pointer to String;
  str :String(255);
  i :int;
end_var

str := 'bliblablub';
pZeichen := ADR(str);

for i := 1 to LEN(str) do
  ASCII_Array[i] := ASC(pZeichen^);
  pZeichen := pZeichen + 1;
end_for

So in etwas denke ich......

Ansonsten musst vlt. nochmal deutlicher erklären was du willst.
 
Ich habe gestern sowas ausprobiert, aber bis jetzt scheint es nicht wirklich gut zu funktionieren

Code:
FUNCTION_BLOCK Eingabefeld
VAR_INPUT
	stEingabefeld: STRING;
	bTransmittern: BOOL;
END_VAR
VAR_OUTPUT
	byCode_Wort: BYTE;
END_VAR
VAR
	stWort: STRING;
	i: INT;
	j: INT;
	stIndex_i: STRING;
	stIndex_j: STRING;
	byIndex_i: BYTE;
	byIndex_j: WORD;
	
END_VAR
VAR CONSTANT
// Idea is: to declare 2 dimensions in order to better describe ascii code table	
// two dimensional Array of STRING. Need to be better declared. We skip first two lines with ''  !!!
    stEingegebenes_Wort: ARRAY[0..7, 0..15] OF STRING := [32(''), ' ', 15(''), '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A' ,'B' ,'C' ,'D' ,'E' ,'F' ,'G' ,'H' ,'I' ,'J' ,'K' ,'L' ,'M' ,'N' ,'O' ,'P' ,'Q' ,'R' ,'S' ,'T' ,'U' ,'V' ,'W' ,'X' ,'Y' ,'Z' ,'[','\' ,']' ,'^' ,'_' ,'`' , 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~'];
END_VAR

IF bTransmittern = TRUE THEN
	stWort:= '' ; //erasing previous Data in String
	stWort:= stEingabefeld;	//assigning InputVar to internalVar
	FOR i:= 0 TO i:=7 DO//Loop for finding the Index of Element in String. As Next we should compare the elements
						//of entered String with elements of predefined Array
		IF stEingegebenes_Wort[i, j]=stWort THEN
			stIndex_i:= stEingegebenes_Wort[i, j]; //Storing chosen element in Index_i Var
 		END_IF
	END_FOR
	FOR j:= 0 TO j:=15 DO
		IF stEingegebenes_Wort[i, j]=stWort THEN
			stIndex_j:= stEingegebenes_Wort[i, j];
		END_IF
	END_FOR
	byIndex_i:= STRING_TO_BYTE(stIndex_i);
	byIndex_j:= STRING_TO_WORD(stIndex_j);
END_IF
 
Sorry, aber dein Code-Schnipsel ist genauso konfus wie deine Beschreibung deines Problems.
Hier mal ein paar Anmerkungen:

1. Der Kompiler sollte bei eigentlich bei deinen FOR - Schleifen meckern
Richtig:
Code:
FOR i := 0 TO 7 DO
END_FOR
oder
Code:
FOR i := 10 TO 1 BY -2 DO
END_FOR

2. Wenn du durch ein zweidimensionales Array iterieren willst, musst du die Schleifen verschachteln und nicht aneinanderreihen.
Ein deinem Code arbeitest du erst alle Felder der ersten Zeile (i von 0 bis 7) durch während j immer 0 bleibt.
In der zweiten Schleife sollte dir evtl. das Programm abstürzen, denn nach der ersten Schleife hat i den Wert 8 und du versuchst mit
stEingegebenes_Wort[8,j] zu arbeiten. Da die erste Dimension deines Feldes aber nur bis 7 geht .......

Richtige Verschachtelung:
Code:
FOR i := 0 to 7 DO
  FOR j := 0 to 15 DO
    //mach was mit Array[i,j]
  END_FOR
END_FOR

3. Du vergleichst einen String mit undefinierter Länge mit einem String der nur aus einem Zeichen besteht.
Wenn dein stEingabefeld mehr als ein Zeichen hat, ist der Vergleich immer false.

4.
Code:
byIndex_i:= STRING_TO_BYTE(stIndex_i); 
byIndex_j:= STRING_TO_WORD(stIndex_j);

Keine Ahnung was du damit bezweckst.



Ich sehe gerade das es in Codesys die Funktion ASC für die Umwandlung eines Zeichens in ASCII Code nicht gibt. In der Oscat Bibliothek gibt es dafür die Funktion CODE.
Code:
ASCII := CODE('123',2); (*liefert den ASCII Code des 2ten Zeichens: ACSII = 50*)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
danke für die Hinweise
ich werde noch die genauer angucken. Die Oscat Basic library habe ich mir schon zugefügt, aber keine Code Funktion gefunden. Kannst du vllt mal genauer die Bibliothet nennen.

Danke im Voraus,
Gruß, ChopinJunkie
 
Ich selber nutze die OSCAT Bib nicht. Aber laut Doku sollte die Funktion bei den String Funktionen der OSCAT Basic sein.
 
Ich hab auch nicht kapiert, was du machen willst und dein Code macht es auch nicht klarer. Wie wäre es mit einer Neuformulierung der Frage, evtl. mit einem Beispiel für INPUT und erwartetem OUTPUT.
 
Zurück
Oben