# Zugriff auf Variable über String mit Var-Namen



## grosser_marco (31 August 2009)

Hallo Leute,
habe ein ziemliches Problem:
Gibt es unter TwinCAT eine Möglichkeit, über einen String (der z.B. in einer Visu beschrieben wird und den Variablennamen enthält), im PLC-Programm auf die Variable dieses Namens zuzugreifen und sie abzufragen?
Z.B. Variable vom Typ BOOL: TEST1
Wenn in einem String (in der PLC) dann der Variablenname "TEST1" steht, kann man dann mittels dieses Strings auf die gleichnamige Variable zugreifen und ihren Signalzustand in der PLC abfragen/verarbeiten?

Danke im Voraus für eure Hilfe!
Marco


----------



## MasterOhh (1 September 2009)

Nochmal langsam zum mitschreiben.
Du willst extern mit einer Software auf Variablen in deiner SPS zugreifen, von denen du nur die Namen kennst?

Mit den ganzen Visualisierungen kenne ich mich nicht aus. Aber es funktioniert auf jeden Fall mit mit C++, Delphi, (Basic?) und LabView. 
TwinCat OCX ist eigentlich recht einfach zu handhaben, gewisse Grundkenntnisse in den jeweiligen Sprachen vorrausgesetzt. 

Ist es sowas, was dir vorschwebt, oder wandere ich hier auf dem Holzweg?


----------



## Larry Laffer (1 September 2009)

... wenn ich die Frage richtig verstanden habe, dann will der Themenstarter in einem String der SPS den Namen der Variablen übergeben, die sie be-/verarbeiten soll ...
Wenn ja, dann ginge das m.E. nur in dem in der SPS eine Routine programmiert wird, die den Inhalt des Strings abfragt/vergleicht und entsprechend dann die (schon bekannten) Variablen verwendet ...

Gruß
LL


----------



## grosser_marco (1 September 2009)

Larry Laffer hat recht...
Aber hat jemand eine Idee, wie ich eine Variable im PLC-Programm verarbeite, von der ich nur den Namen in einem String habe? Wie könnte man diese Variable anhand ihres Namens suchen und verarbeiten?


----------



## Ralle (1 September 2009)

Ich sehe das wie Larry, so wie du das gern hättest geht das nicht.

Du mußt den Variablennamen aus den String isolieren.
Dann per Stringvergleich in einer vordefinierten Liste nachsehen, ob ein Varname paßt. Für jeden Varnamen brauchst du dann die entsprechende Aktion mit dieser Variablen.


```
IF strVarName = 'Variable_1' THEN
	Var_Wert := Variable_1;
ELSE
	IF strVarName = 'Variable_2' THEN
        		Var_Wert := Variable_2;
      	ELSE
		IF strVarName = 'Variable_3' THEN
          		 Var_Wert := Variable_3;
          	END_IF
     	END_IF
END_IF
```


----------



## Rainer Hönle (1 September 2009)

Wäre es nicht einfacher, in der Visu den Wert der gewünschten Variablen zu ermitteln und diesen direkt einer anderen Variablenzuzuweisen, mit der dann in der PLC weitergearbeitet wird?
Die Variablennamen sind meines Wissens nach nicht im PLC-Programm zur Laufzeit verfügbar. Deshalb wäre auch eine vordefinierte Liste wie bei Ralle notwendig.


----------



## Grubba (2 September 2009)

Habe mir mal die Systemfunktionen von Twincat angesehen.

Da gibt es den FB:

-> PLC_ReadSymInfoByName

Der nimmt als Eingangsparameter den Namen der Variablen als String entgegen. Als Out gibt er zwar nicht direkt den Wert der Variablen aus, aber zumindest die Größe der Variablen und deren Adresse. 
Dann könnte man evtl. indirekt über die Adresse auf die Variable zugreifen.

Ist aber ohne Gewähr, weil ich noch nie mit TwinCat gearbeitet habe. Also am besten mal eben die Twincat-Hilfe nach "PLC_ReadSymInfoByName" befragen.


----------



## Cerberus (2 September 2009)

Grubba schrieb:


> Habe mir mal die Systemfunktionen von Twincat angesehen.
> 
> Da gibt es den FB:
> 
> ...


 
*Hier* der entsprechende Link zur Beckhoff-Hilfe.


----------



## Neals (2 September 2009)

Cerberus schrieb:


> *Hier* der entsprechende Link zur Beckhoff-Hilfe.



Und dann mit Index und Offset aus der Struktur, per AdsRead und AdsWrite auf die Variable zugreifen.


----------



## Cerberus (2 September 2009)

Neals schrieb:


> Und dann mit Index und Offset aus der Struktur, per AdsRead und AdsWrite auf die Variable zugreifen.


 
Ich glaube du wolltest eigtl folgende Links verwenden: Struktur, AdsRead und AdsWrite.


----------



## Ralle (2 September 2009)

Nicht schlecht, wenn das damit funktionieren würde. Damit könnte man auf jeden Fall mal experimentieren.


----------



## Cerberus (2 September 2009)

Ralle schrieb:


> Nicht schlecht, wenn das damit funktionieren würde. Damit könnte man auf jeden Fall mal experimentieren.


 
Ich habe es grad mal schnell bei mir auf dem Rechner ausprobiert. Funktioniert einwandfrei. Es muss allerdings beachtet werden, dass der komplette Pfad der Variable eingetragen wird.


----------



## grosser_marco (2 September 2009)

Leute, vielen Dank für eure Hilfestellung. Ich werd es probieren. Ich hatte schon gedacht, es geht gar nicht...
Super, danke!


----------



## Ralle (2 September 2009)

Cerberus schrieb:


> Ich habe es grad mal schnell bei mir auf dem Rechner ausprobiert. Funktioniert einwandfrei. Es muss allerdings beachtet werden, dass der komplette Pfad der Variable eingetragen wird.



Meinst du mit Pfad die Struktur oder das Array?? Erkläre mal bitte kurz, am Besten du zeigst den Code gleich mal, grins.


----------



## Cerberus (3 September 2009)

Ralle schrieb:


> Meinst du mit Pfad die Struktur oder das Array?? Erkläre mal bitte kurz, am Besten du zeigst den Code gleich mal, grins.


 
Mit Pfad meine ich Programm/FB/FN->Struktur->Variable. Dazu mal zwei Beispiele:

```
MAIN.Var   (* Variable Var im Programm Main *)
 
MAIN.Struct1.Var5   (* Variable Var5 in der Struktur Struct1 im Programm Main *)
```


----------

