Step 7 Siemens S7 Classic - I_STRNG funktioniert im GRAPH aber nicht in SCL

Burkhard

Level-2
Beiträge
161
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Experten der Siemens Step 7 Classic SPS. Ich habe heute wieder ein sonderbares Verhalten, das unerklärlich erscheint:

Folgende Funktionalität habe ich programmiert und es funktioniert ja auch:

1687337477054.png

Der Bytewert von 120 wird zuerst in einen Integer gewandelt und dann in einen Stringwert.

Ich habe mir dann überlegt, das ganze in SCL zu programmieren. Gesagt, getan:

1687338069793.png

Doch siehe da: Der I_STRNG im SCL funktioniert nicht. Dummerweise kann man im SCL keine Strings debuggen. Der String wird einfach nicht dargestellt.

Ich verstehe mal wieder die Welt nicht mehr.
 
Soweit wie ich das in Erinnerung habe muss hier der String zuerst initialisiert werden - das heißt, dass du vor der verwendung von I_String zunächst folgendes schreiben müßtest :
Code:
PrepStr12 := '' ;
Der leere String aus deinem Baustein hat keine Header-Info (also deklarierte Länge) - deshalb funktioniert es nicht ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Soweit wie ich das in Erinnerung habe muss hier der String zuerst initialisiert werden - das heißt, dass du vor der verwendung von I_String zunächst folgendes schreiben müßtest :
Code:
PrepStr1 := '' ;
Der leere String aus deinem Baustein hat keine Header-Info (also deklarierte Länge) - deshalb funktioniert es nicht ...

Also, das Initialisieren ist ja nun kein Problem, das kann ich machen.

Aber der String PREP_STR1 wird ja direkt von I_STRNG mit Daten befüllt, also muss sich auch I_STRNG um die Header-Info kümmern. Das kann ich so nicht gelten lassen. Wenn I_STRNG die Wandlung von Integer nach STRING durchführt, muss I_STRNG auch die tatsächliche Länge des Strings eintragen.
 
Ist ja auch wieder so 'n saublödes Beispiel von Siemens ->
liefert concat dann ein falsches Ergebnis, weil es lesend an in1 und in2 auf den noch nicht initialisierten String zugreift
oder kann es auch nicht in einen noch nicht initialisierten String schreiben?

Also z.B. x := concat (in1 := 'a', in2 := 'b'); wäre IMHO ja auch die Zuweisung eine (verketteten) Konstanten.


PS:
Laut dem letzten Post des TE ist aber wohl wirklich letzteres das Problem.
 
Das kann ich so nicht gelten lassen.

Im Step7 SCL Handbuch ist das initialisieren der String-Var auch dokumentiert:

Das war ein Missverständnis. Das mit dem Initialisieren habe ich verstanden, das wusste ich nicht, da es das beim Beckhoff TwinCat so nicht gibt. Es ist ein wenig umständlich, da der Compiler das gerne für mich tun könnte. Ich glaube ich hatte da was missverstanden, was der Larry L. gesagt hatte.

Danke noch mal für eure super geile Hilfe, ein sehr gutes Forum hier.

(y) (y)(y)(y)(y)(y)(y)(y)(y)(y)(y)(y)(y)(y)(y)(y)
(y) VIELEN DANK AN ALLE FORUMSTEILNEHMER(y)
(y)(y)(y)(y)(y)(y)(y)(y)(y)(y)(y)(y)(y)(y)(y)(y)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also, das Initialisieren ist ja nun kein Problem, das kann ich machen.

Aber der String PREP_STR1 wird ja direkt von I_STRNG mit Daten befüllt, also muss sich auch I_STRNG um die Header-Info kümmern. Das kann ich so nicht gelten lassen. Wenn I_STRNG die Wandlung von Integer nach STRING durchführt, muss I_STRNG auch die tatsächliche Länge des Strings eintragen.
Also noch einmal zum Verständnis :
Es geht hier nicht um die Zeichen im String sondern um die deklarierte Länge. Diese Info muss in den Header hinein und das macht SCL dann für dich wenn du einen Leerstring zuweist. Der FC I_String kann (oder will ?) das nicht machen - ich nehme an, dass er, weil es ein FC ist, nicht an diesen Teil der String-Info heran kommt ...
 
Soweit wie ich das in Erinnerung habe muss hier der String zuerst initialisiert werden - das heißt, dass du vor der verwendung von I_String zunächst folgendes schreiben müßtest :
Code:
PrepStr1 := '' ;
Der leere String aus deinem Baustein hat keine Header-Info (also deklarierte Länge) - deshalb funktioniert es nicht ...

Danky lieber Larry! Jetzt klappts!
 
@Burkhard :
das ist alles so Wissen, dass man sich anfänglich leidvoll erkämpfen mußte ...
Du darfst aber auch nicht CodeSys/TwinCat mit Step7/TIA vergleichen - auch wenn es oberflächlich in vielen Dingen ähnlich ist - dahinter stecken dann doch schon unterschiedliche Ansätze und Philosophien ... :cool:
 
liefert concat dann ein falsches Ergebnis, weil es lesend an in1 und in2 auf den noch nicht initialisierten String zugreift
oder kann es auch nicht in einen noch nicht initialisierten String schreiben?
Bei den EingangsVariablen müssten die AktualLängen bekannt sein und bei der AusgangsVariablen die MaximalLänge.
"Es" müsste die MaximalLänge des noch nicht initialisierten AusgangsStrings lesen und prüfen, ob das Ergebnis hinein passt bzw. falls es nicht passt, den ErgebnisString entsprechend kürzen. Aber woher nehmen die MaximalLänge?
"Es" müsste die neue aktuelle StringLänge eintragen/aktualisieren. Aber woher nehmen, wenn die MaximalLänge der AusgangsVariable nicht bekannt ist oder die AktualLängen der EingangsVariablen fehlen?
Ich sehe keine Chance für die Funktion, fehlende Angaben über MaximalLänge der AusgangsVariablen oder die AktualLängen der EingangsVariablen zu erraten/ermitteln/ergänzen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das wird wohl der Grund sein, warum man initialisieren muss. Dann wird die maximal mögliche Länge dieser Variable eingetragen.
Eine "dumme" Frage dazu hätte ich noch:
Das Initialisieren und vor allem das Füllen der LängenBytes geschieht doch genau dort, wo auch die Variable deklariert wird (und nicht erst zu einem beliebigen späteren ZeitPunkt, wenn die Information über die Deklaration schon nicht mehr so direkt "greifbar" ist)?
 
Aber bei der S7-300/400 ist der Temp-Bereich immer undefiniert.
Wenn ein String dort liegt, muss er explizit initialisiert werden...
 
Ja, bei S7-300/400 sind Variablen in TEMP immer uninitialisiert (mit unbestimmtem Inhalt), wo man zuerst was zuweisen/hineinschreiben muß. Daß TEMP-Variablen freundlicherweise initialisiert werden, wurde erst in TIA ab einer bestimmten CPU-Firmware und nur bei "optimierten" Bausteinen eingeführt. TIA soll ja die Arbeit vereinfachen für Programmierer, die keine Zeit haben, zu lernen, daß TEMP-Variablen generell uninitialisiert sind und man auf jeden Fall erst was hineinschreiben muß, bevor man daraus liest. ;)

Harald
 
Zurück
Oben