variable string länge deklarieren

Grisu88

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

ich habe eine Frage zu strings und zwar möchte ich einen beliebigen string an einen Funktionsbaustein übergeben.

Code:
 CALL  "SNMP_Protokoll" , DB400
       DB_NUMBER:=
       CREA_DB  :=
       DEL_DB   :=
       COMMUNITY:= 'public'

Im Instanzdatenbaustein dieses Funktionsblocks ist die IN Variable mit dem Typ String gekennzeichnet (maximale Länge 254). Wenn ich jedoch, wie im obrigen Code gezeigt, den String 'public' angebe, gibt es ein Längen Konflikt. Der String ist lediglich 6 Byte lang und nicht 254. Ich möchte nun das die String Länge, die im Instant Datenbaustein deklariert ist eine variable Länge hat, so das man beliebige Strings dem Funktionsblock übergeben kann. Gibt es da eine Möglichkeit?

Gruß Tim
 
Ein String hat ja 2 Byte als Kopf, die maximale Länge und die tatsächliche Länge.
Ich würde mal versuchen in einem DB einen String 254 anzulegen und dort 'public' hineinschreiben, das Byte 0 sollte dann 254 enthalten, das Byte 1 sollte 6 enthalten. Dann mal diesen DB-String an COMMUNITY anlegen.

Alternativ kann man das auch mit einem in Temp deklarierten String versuchen, dann muß man aber Byte 0 und 1 selbst mit der richtigen Länge beschreiben, den String sozusagen initialisieren.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Den String in einer Datenbank ablegen der die Maximale Länge 254 hat und dort 'public' reinschreiben funktioniert alles ;-) (das war mein erster Ansatz). Jedoch fand ich es unkomfortabel den Wert in der Datenbank zu ändern, daher die Idee mit dem Eingangsstring.

Wie genau funktioniert das mit dem Temp deklarierten String?
 
Zuletzt bearbeitet von einem Moderator:
Den String in einer Datenbank ablegen der die Maximale Länge 254 hat und dort 'public' reinschreiben funktioniert alles ;-) (das war mein erster Ansatz). Jedoch fand ich es unkomfortabel den Wert in der Datenbank zu ändern, daher die Idee mit dem Eingangsstring.

Wie genau funktioniert das mit dem Temp deklarierten String?

Entschuldigem, ich hatte den falschen Butten erwischt und das Ganze direkt in deinen Kommentar geschrieben.:eek: Deshalb steht in deinem Post jetzt geändert durch Ralle, schäm.

Mal so in aller Schnelle aus dem Kopf:
Du legst in Temp einen String 254 an. Gut wäre es, diesen String dann per ind. Adressierung mit Daten zu befüllen,

L P##MyString
LAR1

L 254
T LB[AR1, P#0.0]
L 6
T LB[AR1, P#1.0]
L 'p'
T LB[AR1, P#2.0]
...

Dann mit MyString arbeiten.

Am einfachsten geht die gesamte Stringbearbeitung in SCL zu erledigen.

MyString := 'public';

Aber Achtung, die Lokalvariablen in der SPS sind begrenzt, da kann man nicht mit allzu vielen deklarierten Temp-Strings arbeiten!
 
hmm so ganz ist das noch nicht was ich möchte :p. Also das was am Ende rauskommen soll, ist ein Funktionsblock bei dem man einen beliebigen string wie im Code von mir oben gezeigt eingeben kann. Das heißt es soll nicht jede einzelne Variable per ind. Adressierung angeben werden :p oder hab ich den Vorschlag falsch verstanden?

mit scl ist das so eine Sache, damit hab ich mich noch nie beschäftigt und es sollte ein reiner awl code werden :p
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Na ja, so wie du das machst, also 'public' direkt ranschreiben, das ist ja nicht variabel, dann würde ich doch die DB-Variante wählen. Ich mache es oft so, dass ich mir einem DB anlege, in dem alle Strings eingetragen sind, die ich z.Bsp. für eine Kommunikation benötige. Diese lege ich dann an die Bausteine, wenn es Variabel sein muß, dann mache ich das per Any-Pointer. Ich würde auch überlegen, ob es wirklich String 254 sein muß, oder ob.Z.Bsp. String 30 auch reicht, es müssen dann halt alle Strings als String 30 definiert werden. Als einfachste Variante habe ich mir mal einen ganz einfachen FC geschrieben, der machte in SCL nur

String_Out := String_IN;

Dann konnte man im SPS-Programm diesen Baustein z.Bsp. in einer Schrittkette einfach aufrufen und Strings umkopieren. Im Prinzip ist das nicht anderes als ein einfacher Blockmove, aber halt als eigener Baustein mit den entsprechenden verständlichen IN-Out-Bezeichnungen.
 
Ralle, ich denke eher das sein Ansatz ein anderer ist...

Ich vermute es soll in etwa so ablaufen:

Es wird ein Baustein erstellt, z.B. für einen Zylinder.
An diesen will er seine E/A dranbauen, und einen String für den Namen des Zylinders.
Das wird dann gleich aus der Visu gelesen und angezeigt. Somit für Faule Visu-Bastler ideal :rolleyes:

Da ist das mit dem Strings wo anders anlegen wieder für die Katze, und man hat eigtl. den Komfort wieder verloren.

Grüße

Marcel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ralle, ich denke eher das sein Ansatz ein anderer ist...

Ich vermute es soll in etwa so ablaufen:

Es wird ein Baustein erstellt, z.B. für einen Zylinder.
An diesen will er seine E/A dranbauen, und einen String für den Namen des Zylinders.
Das wird dann gleich aus der Visu gelesen und angezeigt. Somit für Faule Visu-Bastler ideal :rolleyes:

Da ist das mit dem Strings wo anders anlegen wieder für die Katze, und man hat eigtl. den Komfort wieder verloren.

Grüße

Marcel

Ja ich verstehe, dann sollte er vielleicht wirklich alles z.Bsp. mit String 30 machen und auch 'public........................' an den Input schreiben.
Oder er muss vor dem Baustein immer 'zu Fuß' in eine passende Temp umkopieren.
 
das mit 'public........................' würde zwar den Längen Konflikt lösen, jedoch brauch ich die tatsächliche Länge des Wortes (hier "public" also 6) im funktionsbaustein selber.
 
Zurück
Oben