Der Datentyp String

STEP7 ist die Programmiersprache der SIMATIC S7-Steuerungen. Allgemeine Fragen.
Antworten
Miguel
SPSTreff-User
Beiträge: 6
Registriert: 21 Okt 2010, 17:50

Der Datentyp String

Beitrag von Miguel »

Hallo, --> zum Datentyp String (WinSPS V 4)

wenn ich in einem globalen DB einen String deklariere, wie b0:string[] und
diesen nicht im DB mit Anfangs- und Aktual-Werten vorbelege, dann gibt
mir die IEC Funktion FC 21 stets den Wert 0 aus, Dieser Wert repräsentiert
die Länge der aktuellen Stringvariablen. Daran ändert sich auch nichts, wenn ich mit
Lade- und Transferbefehlen nach und nach die String-Variable vom OB1
aus mit Char-Zeichen befülle und dies im Simulationsmodus beobachte (Variablentabelle).

Ich dachte: pro Zeichen, dass ich in eine String-Variabe, die sich in einem
Global-DB befindet, transferiere, erhöht sich auch die Länge um jeweils
1, die mir FC 21 in einem Merkerwort ausgibt.

Die FC 21 spuckt immer nur die Länge aus, die im DB der Länge des Aktual-Wertes im DB ent-
spricht, diesen muss ich aber per Hand eingeben (also mit Werten vorbelegen); das ist
die einzige Chance zur Veränderung des Längenwertes, den mir FC 21 ausgibt.


CALL FC 21
IN0:="db1".b0
RET_VAL:=MW5
NOP 0


Kann diese Wirkungsweise jemand bstätigen? Oder betrifft diese nur
den Simulationsmodus? Es fällt auf, dass die Länge einer String-Variable
nur manuell im DB geändert werden kann und nicht z. B. von OB1 aus?
(Alle relevanten Bausteine befinden sich im Arbeitsspeicher der Soft-SPS.)


--------------------------------------------------------------------------------------

Darf man folgendes machen:

L 'AB'
T stringVariable[1]

Hier wird lediglich 'B' in diesen Speicherplatz geschrieben,
am Speicherplatz stringVariable[2] steht der Wert, der
im Aktualwert der StringVariablen im Globa-DB steht (unter der
Voraussetzung, dass nirgends sonst im Programm aktiv auf
stringVariable[2] ein Wert transferiert wurde? Der Wert 'A'
wird also in keinem Fall transferiert?
D. h. 2 Zeichen gleichzeitig transferieren funktioniert nicht?
Erfolg tritt nur beim ersten Zeichen ein?


--------------------------------------------------------------------------------------


Weiterhin: Wenn beim Aktualwert (einer String-Variablen) in einem Global-DB
nur zwei Hochkomma '' stehen, dann kann z. B. vom OB1 aus kein einziges
Zeichen in diese String-Variable transferiert werden. Ausser man schreibt
in die eckige Klammer der String-Variablen eine Zahl hinein.

Ist das von S7 so gewollt?



Gruss, Miguel

Benutzeravatar
Weiss_MHJ
Site Admin
Beiträge: 673
Registriert: 13 Apr 2010, 16:34
Kontaktdaten:

Beitrag von Weiss_MHJ »

Hallo,

anbei die Antworten:

zu 1:
Beim Befüllen einer String-Variable wird die Länge nicht automatisch angepasst. Dies muss der Programmierer erledigen.

zu 2:
L 'AB'
T stringVariable[1]

Ein Feld eines Strings besteht aus dem Typ Char. Dieser Typ ist 8-Bit breit, weshalb die Transferoperation eine Byteoperation ist.

zu 3:
Das ist mir nicht ganz klar, wie beschreiben Sie den String im OB1?

Gruss
Weiss

SPS-Starter
SPSTreff-User
Beiträge: 3
Registriert: 21 Okt 2010, 10:04

Beitrag von SPS-Starter »

Guten Abend liebe SPS Gemeinschaft,
Nach einiger Literaturrecherche und eigenem Herumspielen 1 und 2 bestätigen.

Habe aber auch noch so meine Probleme.
Ein kurzes Beispiel aus dem Step7-Chrshkurs Seite:140

Str:String[10] ist mit „Name“ vorbelegt sieht wie folgt aus:
Byte n +0 | 10 | max. Länge des String
Byte n+1 | 4 | belegte Länge des String
Byte n+2| N | Zeichen 1
Byte n+3 | a | Zeichen 2
Byte n+4 | m | Zeichen 3
Byte n+5| e | Zeichen 4
Byte n+6 | 0 | Zeichen 5
Byte n+7 | 0 | Zeichen 6
Byte n+8 | 0 | Zeichen 7
Byte n+9 | 0 | Zeichen 8
Byte n+10 | 0 | Zeichen 9
Byte n+11 | 0 | Zeichen 10
Von Hand gefüllt würde es so aus sehen:

Code: Alles auswählen

L 'N'
T str[1]
L 'a'
T str[2]
L 'm‘
T str[3]
L 'e‘
T str[4]
Habe aber keine chance die Längen wie folgt ein einzutragen:

Code: Alles auswählen

L 4 // in Hex
T str[11]
L A // in Hex
T str[12]

Es ist wahrscheinlich die einfachste Methode einen String in einen DB zuschreiben und diesen dann zuübergeben…



Gruß SPS-Stater
[/quote][/code]

Benutzeravatar
Weiss_MHJ
Site Admin
Beiträge: 673
Registriert: 13 Apr 2010, 16:34
Kontaktdaten:

Beitrag von Weiss_MHJ »

Hallo,

wieso tragen Sie die Längenangaben in die Bytes 11 und 12 ein?
Diese müssen in den Bytes 0 und 1 des Strings stehen. so wie dies auch in Ihrem Auszug aus dem S7-Crashkurs angegeben ist.

Gruss

Miguel
SPSTreff-User
Beiträge: 6
Registriert: 21 Okt 2010, 17:50

Beitrag von Miguel »

Vielen Dank für die Anmerkungen!

zu 3) Das Laden:

L 'F'
T "db1".b0[]

Situtation im DB1: b0 String[]

Im Aktualwert steht ''
Anfangswert: Hier steht nichts.

Dann kann vom OB1 aus kein Zeichen in den String transferiert werden.
In dem Augenblich, wo ich bei der Deklaration des Strings in die
eckige Klammer mind. 1 reinschreibe klappt der Transfer. Gut, akzeptiert!

Mit der SFC 20 und damit indirekter Adressierung kann ich damit
die Längen in einem String anpassen.

Danke, Miguel

Benutzeravatar
Weiss_MHJ
Site Admin
Beiträge: 673
Registriert: 13 Apr 2010, 16:34
Kontaktdaten:

Beitrag von Weiss_MHJ »

Hallo,

wenn Sie einen String ohne Längenangabe in einem DB anlegen, dann werden für den String 2 Bytes Speicher reserviert (1 Byte Max-Länge, 1 Byte belegte Länge). Dieser Speicher ist statisch, d.h. er kann durch das Kopieren eines Strings in den String-Parameter des DBs nicht verändert werden. Da im String-Parameter kein Platz für ein Zeichen ist, kann dieser nicht befüllt werden.
Das Problem wird deutlich, wenn Sie hinter dem String-Parameter einen weiteren Parameter z.B. vom Typ Byte anlegen. Dieser wird dann von der Speicheradresse her, 2 Bytes hinter dem String-Parameter platziert.
Würde nun der Speicher für den String-Parameter dynamisch erhöht werden, würde sich die Lage des Parameters dahinter immer wieder verschieben. Dies ist somit nicht möglich.

Wenn Sie einen String-Parameter anlegen, dann sollten Sie immer so viel Zeichen reservieren, wie Sie max. darin ablegen möchten. Die IEC-Funktionen, welche Strings bearbeiten, beeinflussen die belegte Länge, nicht die max. Länge.

Beispiel FC16 aus den IEC-Funktionen.
Diese Funktion wandelt einen INT in einen String. Wenn Sie diese Funktione folgendermaßen aufrufen

CALL FC 16
IN0:=10 //Zu wandelnder INT
RET_VAL:=DB1.Var1 //Ziel-String

Dann wird die Zahl 10 in den String "+10" gewandelt und in den Stringparameter im DB1 kopiert. Dieser Stringparameter hat daraufhin die belegte Länge 3. Die max. Länge ändert sich natürlich nicht, denn der reservierte Speicher für den Parameter ist ja der Gleiche.

Gruss
Weiss

Antworten