String (Zeichenkette) Byteweise senden

Butzl

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
Hab ein problem mit der Zeigeraritmetik von S7.

Habe ein 4x20Zeichen großes Display, auf welches ich meldungen Anzeigen lassen will. Die Meldungen sind in einem Datenbaustein (DB6) vordefiniert und belegen jeweils 22Bytes im Speicher (Datentyp String [20] + 2Bytes Kopf)

Das Display wird über Canopen angesteuert und mit SDO´s übertragen (Sende-Baustein). Leider muss ich hierfür jedes Byte(Zeichen) einzeln senden.

Idee:
Zeiger auf Anfangsaddresse der gewünschten Meldung( 0.0 , 22.0, 44.0 usw) und erstes Zeichen senden dann über eine Schleife den pointer um eins erhöhen und wieder senden.

Frage:
Wie schaut diese Schleife programmtechnisch aus?? Bekomme nur das erste Zeichen aber im nächsten durchlauf findet keine erhöhung des Zeigers statt :(


AUF "Meldungen" // DB5
L 0 // fehlerwort (z.B. 0...10)
L 11
*I
L 2 // Offset wegen Kopf
+I
T #temp_x // Anfangsadresse
T #temp_y // Speicherung für ende der Zeichenkette
SLW 3
LAR1

n30: L DBB [AR1,P#0.0]
T #Zeichen // Das gewünschte Zeichen zum Übertragen (1Byte)

CALL "SDO Transfer" // Übertragung an Display mit Sende-Baustein
Buchstabe:=#Zeichen
Freigabe :="eins" // Anstoß zum senden

L P#1.0 //erhöhen des pointers
+AR1

L #temp_x // Abfrage auf Zeichenende
L 1
+I
T #temp_x

L #temp_y
L 20
+I
L #temp_x
==I
sbbn n30

Hoffe ihr könnt mir helfen
 
Das geht so wahrscheinlich ohnehin nicht, du machst den gesamten Schleifendurchlauf in einem SPS-Zyklus. Ich vermute, der SDO-Transfer wird da auch nicht mitkommen. Das hängt aber davon ab, wie dder SDO-Transfer überhaupt arbeitet (synchron, asynchron, Start bei Flanke an Freigabe?, wie wird erkannt, dass das senden fertig ist ?????)
Ansonsten macht es immer Sinn, das berechnete AR 1 in einem DWord zwischenzuspeichern und dann in diesem DWord den Pointer zu erhöhen, das DWord dann in AR1 zu laden und anschließend das DBB zu holen.

Ich denke, abhängig von der arbeitsweise des SDO-Transfer, kannst du höchstens jeden 2. SPS-Zyklus ein neues Zeichen übertragen, um zwischendurch die Freigabe wieder auf False zu setzen und dann das nächste Zeichen zu schicken.

PS. Noch was, nimm besser SLD 3
 
Zurück
Oben