STRING als TEMP-Variable funktioniert nicht?

Maxdo

Member
Beiträge
23
Punkte Reaktionen
1
Zuviel Werbung?
->Hier kostenlos registrieren
hi,

Möchte STRINGs als Temp-Variablen (für "Zwischenergebnis")
deklarieren, irgedwie funktionierts aber nicht.
Deklaration in der Var-Dek-Tab geht zwar, aber wenn ich einen
String der Temp-Variable zuweise und dann wieder aufrufe,
enthält dieser nichts.
Was mache ich falsch? Habe nichts in der Hilfe gefunden, dass
Strings nicht als Temp-Var erlaubt sind.

thanx
maxdo
 
OP
M

Maxdo

Member
Beiträge
23
Punkte Reaktionen
1
Zuviel Werbung?
->Hier kostenlos registrieren
danke zefix,

aber den abgespeicherten Temp-Sting frage ich natürlich wieder
im gleichen Bausteinaufruf ab.

Zur Erklärung: Möchte einen String erzeugen, der die Restzeit
eines IEC Timers anzeigt: '00h 00min 00sec'
Füge also nacheinander die Zeitwerte in den
Ursprungs-Stat-String 'h min sec' ein.
Dabei entstehen aber Strings die nur temporär
benötigt werden: 'h min 00sec' und 'h 00min 00sec'

jemand ne Ahnung?
 

Question_mark

Well-known member
Beiträge
3.381
Punkte Reaktionen
578
String als Temp-Variable

Hallo Maxdo,
Füge also nacheinander die Zeitwerte in den
Ursprungs-Stat-String 'h min sec' ein
Mal eine Rückfrage : hast Du daran gedacht, dass der INOUT Parameter "ET" vom Datentyp "TIME" ist ?
Am besten Du postest etwas von dem nicht funktionierenden Code, dann kann man vielleicht eher einen Tip geben.
Gruss
Question_mark
 

Question_mark

Well-known member
Beiträge
3.381
Punkte Reaktionen
578
String als Temp-Variablen

Hallo Maxdo,
noch ein Hinweis :
Wenn ein String in der S7 als temporäre Variable deklariert wird, so muss vor der Verwendung im Anwenderprogramm das Byte "Max.Länge" mit einer definierten Länge beschrieben werden :!:
Das Byte "Max.Länge" ist das Byte 0 im String.
Gruss
Question_mark
 

plc_tippser

Well-known member
Beiträge
2.500
Punkte Reaktionen
301
Zuviel Werbung?
->Hier kostenlos registrieren
Hi,
post mal etwas oder füge mal die Werte in den statischen Bereich ein, nur zum testen. Oft setze ich mir nach jedem Schritt ein Zwischentest-Merker um zu sehen, wo meine Daten verloren gehen.

pt
 
OP
M

Maxdo

Member
Beiträge
23
Punkte Reaktionen
1
wenn Strings als STAT-Werte (wie unten) dann funktionierts...


VAR_INPUT
...
VAR_OUTPUT
...
VAR
TON : "TON";
string_h_temp : STRING [3 ];
string_min_temp : STRING [3 ];
string_sec_temp : STRING [3 ];
string_h : STRING [2 ];
string_min : STRING [2 ];
string_sec : STRING [2 ];
string_rt_0 : STRING [9 ] := 'h min sec';
string_rt_sec : STRING [11 ];
string_rt_min_sec : STRING [13 ];
string_rt_h_min_sec : STRING [15 ];
END_VAR
VAR_TEMP
...
rem_std : INT ;
rem_min : INT ;
rem_sec : INT ;
END_VAR

BEGIN
NETWORK
TITLE =String 00h 00min 00sec erzeugen

CALL "I_STRNG" (// -- INT in String (mit Vorzeichen) wandeln --
I := #rem_std,
RET_VAL := #string_h_temp);

CALL "I_STRNG" (
I := #rem_min,
RET_VAL := #string_min_temp);

CALL "I_STRNG" (
I := #rem_sec,
RET_VAL := #string_sec_temp);


CALL "DELETE" (// ------ Vorzeichen aus String löschen ------
IN := #string_h_temp,
L := 1,
P := 1,
RET_VAL := #string_h);

CALL "DELETE" (
IN := #string_min_temp,
L := 1,
P := 1,
RET_VAL := #string_min);

CALL "DELETE" (
IN := #string_sec_temp,
L := 1,
P := 1,
RET_VAL := #string_sec);


CALL "INSERT" (// ------ Sekunden in String einfügen -------
IN1 := #string_rt_0,
IN2 := #string_sec,
P := 6,
RET_VAL := #string_rt_sec);

CALL "INSERT" (// ------- Minuten in String einfügen -------
IN1 := #string_rt_sec,
IN2 := #string_min,
P := 2,
RET_VAL := #string_rt_min_sec);

CALL "INSERT" (// ------- Stunden in String einfügen -------
IN1 := #string_rt_min_sec,
IN2 := #string_h,
P := 0,
RET_VAL := #string_rt_h_min_sec);


END_FUNCTION_BLOCK
 

Question_mark

Well-known member
Beiträge
3.381
Punkte Reaktionen
578
String als Temp-Variable

Hallo nochmal,
Maxdo schau mal auf mein voriges Posting, dann hast Du die Erklärung.
Bei Temp-Variablen das Längenbyte setzen. :roll:
Gruss
Question_mark
 
OP
M

Maxdo

Member
Beiträge
23
Punkte Reaktionen
1
Zuviel Werbung?
->Hier kostenlos registrieren
vielen Dank, Question_Mark

is jetzt vielleicht blöde frage:

Aber wie kann ich bei symbolischer Programmierung das
Byte 0 einer Temp-Variable beschreiben??

Danke für Deine Geduld!
Maxdo
 

plc_tippser

Well-known member
Beiträge
2.500
Punkte Reaktionen
301
Hi,

habe ich zwar auch noch nie gemacht, aber so würde es gehen

Code:
L p##Text
LAR1
L xy  //Länge
T DIB[AR1,P#0.0]

Du könntest natürlich auch direkt auf die Adresse schreiben, ist aber schlecht, wenn die Lokaldaten sich im Verlauf noch ändern.

Über Erfolg/Misserfolgmeldung würde ich mich freuen, da ich noch nie mit STRING in S7 keulen musste.

pt
 

sps-concept

Well-known member
Beiträge
2.235
Punkte Reaktionen
251
String

Hallo Max,

symbolisch gar nicht... Hab mir da nen Baustein gebastelt wo du den String einträgst und die Länge angibst, dann gehts alles schön symbolisch.

MfG
André Räppel
 

Zefix

Well-known member
Beiträge
484
Punkte Reaktionen
74
Zuviel Werbung?
->Hier kostenlos registrieren
Hatte letzte Woche mal mit Strings zu tun.
Wenn man aber im VAT Editor den String beobachten möchte und
den String als Block mit zb. 10 Bytes einfügt ,macht der Editor
hinter der Variable [1] usw. dran.
Er nummeriert das ganze Quasi.
Ich glaub im Baustein Editor müsste das ab Step7 5.2 oder 5.3 hinhaun.
Kanns leider im Moment nicht Testen da grad kein Step7 zur Hand :(
 

sps-concept

Well-known member
Beiträge
2.235
Punkte Reaktionen
251
String

ja das macht er schon, aber erst ab dem 3. Byte. Die 2 Bytes Kopfdaten kann man nicht symbolisch ansprechen.

MfG
André Räppel
 

Question_mark

Well-known member
Beiträge
3.381
Punkte Reaktionen
578
Zuviel Werbung?
->Hier kostenlos registrieren
String als Temp Variable

Hallo Maxdo,
Aber wie kann ich bei symbolischer Programmierung das
Byte 0 einer Temp-Variable beschreiben??

Das sollte eigentlich so gehen, wenn Deine Temp_Var "Zeit" heisst :
// Setzen der Max. Länge im Byte 0 mit z.B. 20 Zeichen
Code:
LAR1 P##Zeit
L  20
T LB[AR1,P#0,0]
// Setzen der tatsächliche Länge im Byte 0 mit z.B. 10 Zeichen
// falls das jemanden interessiert oder erforderlich wird
Code:
LAR1 P##Zeit
L 10
T LB[AR1,P#1.0]
Ich habs nicht ausprobiert, nur hingehackt.
Gruss
Question_mark
 

plc_tippser

Well-known member
Beiträge
2.500
Punkte Reaktionen
301
Das sollte eigentlich so gehen, wenn Deine Temp_Var "Zeit" heisst :
// Setzen der Max. Länge im Byte 0 mit z.B. 20 Zeichen
Code:

LAR1 P##Zeit
L 20
T LB[AR1,P#0,0]

Direkt ins Adressregister geht bei nem FB nicht, so meine ich mich zu erinnern. Aber über den Umweg wie oben beschrieben, gehts.

pt
 
A

Anonymous

Guest
Danke Question_mark u. plc_tippser,

Also bei mir funktioniert nur die Anweisung lt. Question_mark,
wie sie auch in der S7-Hilfe beschrieben ist !!
(habe ich damals überlesen, weil hat mir nix gesagt und
Adressregister was ist das und so...)

Jedenfalls mit
LAR1 P##text
L xy
T LB [AR1,P#0.0]
funzt das Ganze einwandfrei!!

Danke nochmal, bis zum nächsten Problem :lol:
 
Oben