PDA

View Full Version : SCL: Variable mit dynamischen Namen (Bezeichner) deklarieren?



logo78
23.01.2012, 19:40
Hi,
benutze in meinem SCL Code Konstanten (Function_block) in der ich Stationsnamen als String abspeichere.
Diesen missbrauchten FB deklariere ich dann als Instanz in FB's, bei der ich diese Konstanten benötige.



FUNCTION_BLOCK Defaults


CONST
station01 := 'L0STA01xyz'; //Name der Station x im richtigen Format
END_CONST

VAR
station01 : string[10]:=station01
End_VAR

;
End_Function_Block

Ich möchte mir das zweimalige Schreiben ersparen. Kennt jmd einen workaround, bei der ich beim roten Bezeichner irgendwie dynamisch den namen der entspr. Konstante zuweisen kann?
Oder sonst eine Idee, wie ich das optimieren könnte?
Es sind sehr viele Stationen, der Inhalt ist wichtig für die Kommunikation mit einem übergeordneten System und Anhand vom Namen, sollte halt ganz intuitiv der Inhalt ersichtlich sein (ideal: bezeichner=inhalt).

xhasx
24.01.2012, 07:09
Wie wäre es wenn du den Stationsnamen an einer Eingangsvariable übergibst?

logo78
24.01.2012, 07:29
Du darfst dich virtuell gedrückt fühlen, wenn Du mir sagen kannst,
wie ich einen zusammengesetzten Datentyp (hier String) als eine
Konstante ('L0STA01xyz') einem FC/FB als IN übergeben kann.

Siemens erwartet an dieser Stelle "Adressen", wo er diesen String findet.
Sprich: Lokaldaten oder eben halt einen DB. Konstanten gehen nicht.
Oder ich würde es splitten in einen dutzend 'chars' als IN.

Ansonsten muss ich ja meine Konstanten (eigentlich Zeichenkette)
irgendwie in diesen DB bekommen, darum die anfängliche Fragestellung :)

Matze001
24.01.2012, 07:40
Wie wäre es mit einem Array of Station... das so groß machen wie du Stationen hast + Reserve...

Drauf zugreifen kannst du dann mittelst Station[01].Variable

Grüße

Marcel

MCerv
24.01.2012, 07:47
Wo ist Dein Problem mit dem deponieren der Zeichenkette im DB? Die Zeichenkette 'station01' bekommt eine feste Länge, hier 9+2 für die Hochkommas.

Ein Alternative wäre, wenn der Text 'station' immer gleich bleibt, einfach einen Zählindex hinzunehmen!

logo78
24.01.2012, 07:47
@Matze:
daran habe ich auch schon gedacht.
Allerdings möchte ich das 'Handling' dieser Variable
für den Endanwender (Inbetriebnehmer) so einfach
und intuitiv wie möglich gestalten, so das kein Spielraum
für Missverständnisse bleiben. Ziemlich schwierig mit Siemens.

Das Problem ist die Entwicklungsumgebung. Wenn du das
entsprechende Array Station[01].Variable auswählst/anklickst,
kriegste' im KOP/FUP-Editor nicht den Anfangs-bzw. Initialwert angezeigt. Nicht bei Arrays.

Wenn das angezeigt werden würde, so wie bei der Datensicht
eines DB's, würde man den "Inhalt" ('L0STA01xyz') sehen und es wäre
eine sehr gute Möglichkeit.

Edit: Typo.

logo78
24.01.2012, 07:51
Wo ist Dein Problem mit dem deponieren der Zeichenkette im DB? Die Zeichenkette 'station01' bekommt eine feste Länge, hier 9+2 für die Hochkommas.
Ein Alternative wäre, wenn der Text 'station' immer gleich bleibt, einfach einen Zählindex hinzunehmen!
Das Problem habe ich im Anfangsposting erwähnt. Exclusiv für dich, werde ich mich mal selbst zitieren.
[..]
Ich möchte mir das zweimalige Schreiben ersparen. Kennt jmd einen workaround, bei der ich beim roten Bezeichner irgendwie dynamisch den namen der entspr. Konstante zuweisen kann?
Es sind sehr viele Stationen, der Inhalt ist wichtig für die Kommunikation mit einem übergeordneten System und Anhand vom Namen, sollte halt ganz intuitiv der Inhalt ersichtlich sein (ideal: bezeichner=inhalt).[..]

MCerv
24.01.2012, 09:03
@logo78

soviele Stationen in einem FC? Ist ein Multiinstanzaufruf nicht möglich / sinvoll? Evtl. mit weiteren Unterbausteinen?

logo78
24.01.2012, 09:41
Danke für den gutgemeinten Hinweis. Mir sind die Techniken mit Unterbaustein, respektive Multiinstanzen bekannt.

Die Stationen sind nicht in einem FC. Wie oben bereits erwähnt, ist das in dem SCL deklarierte FB mit den "Konstanten" eine ART Workaround, dessen Werte dann in anderen FB's mitbenutzt werden können.
Eine Möglichkeit quasi in der bescheidenen Siemenswelt, bei der "globale Variablen" benutzt werden können.

Ich bin mir nicht sicher, ob du das Problem richtig verstanden hast. Ich helfe Dir :)
Du hast 100 Stationen die als Namen eine vordefinierte Zeichenkette (String[8]) haben.
Du musst in deinem Ablauf auf diese Strings zugreifen, neue Aufträge damit vergleichen, etc...
Aufgabe 1)Wie hämmere ich 100 mal einen String[8] in das SPS Programm, so dass es global überall benutzt werden kann.
Aufgabe 2)Wie kriege ich es hin, dass man trotzdem damit intuitiv arbeiten kann (Bezeichner=Inhalt). Schnödes Copy&Paste im SCL-Code ausgeschlossen.

Larry Laffer
24.01.2012, 09:46
Hallo,
eine SCL-Konstante ist keine Variable im eigentlichen Sinn. Im Grunde ist es nur ein Platzhalter für den vorgegebenen Inhalt. Somit ist es dann auch nicht möglich, auf diese "Konstante" in oder von einem anderen Baustein zuzugreifen. Das geht nur mit Variaben.
Du mußt dir also Global-Variablen (z.B. einen entsprechenden DB) erschaffen, den du dann entsprechend zuweisst und überall verwendest ...

Gruß
Larry

MCerv
24.01.2012, 10:11
@logo78

vielen Dank für die Einschätzungen meiner Fähigkeiten :D.



Hallo,
eine SCL-Konstante ist keine Variable im eigentlichen Sinn. Im Grunde ist es nur ein Platzhalter für den vorgegebenen Inhalt. Somit ist es dann auch nicht möglich, auf diese "Konstante" in oder von einem anderen Baustein zuzugreifen. Das geht nur mit Variaben.
Du mußt dir also Global-Variablen (z.B. einen entsprechenden DB) erschaffen, den du dann entsprechend zuweisst und überall verwendest ...

Gruß
Larry

Wie Larry schon sagt, wirst um das vergeben der globalen Namen nicht drumherumkommen!

Draüber kannst Du Dir das "einfach" gestalten:

z. B. über einen UDT im DB

evtl. einen Array vom Typ UDT im DB

Wenn Deine Stationen "nur" durch einen Index im Namen sich unterscheiden, wie ich Dir das auch schon mal oben vorgeschlagen haben, wäre die Arraynummer als Zählindex optimal! Sonst musst Du halt 100+ Namen für die UDT's vergeben.