# SCL: kleines Programm



## Uli_87 (5 Juni 2009)

Guten Morgen zusammen,

Seit kürzer Zeit wollte ich ein Baustein durch SCL erstellen der mir eine Spezifische funktion ermöglicht! Das wäre das dynamische auslesen eines DB.

Ich habe folgendes ohne erfolg versucht:

```
FUNCTION_BLOCK Abfluss

VAR_INPUT
INPUT      {S7_dynamic:='true'; S7_m_c:='true'; S7_unit:=''}:REAL:=0;                 
END_VAR    

VAR_OUTPUT 
Q_U        {S7_dynamic:='true'; S7_m_c:='true'; S7_unit:=''}:REAL:=0; 
Differenz  {S7_dynamic:='true'; S7_m_c:='true'; S7_unit:=''}:INT:=0; 
END_VAR

VAR
Max_value:                     REAL:=0;
Min_value:                     REAL:=0;
Adressenwert:                  INT:=0;
Ausgabewert:                   REAL:=0;
END_VAR

//************************************************************
//*** ANWEISUNGSTEIL ***
//************************************************************
BEGIN
Max_value:=962.70;
Min_value:=961.42;

INPUT:=961.50;

Adressenwert:=REAL_TO_INT((INPUT-Min_value)*100);

Ausgabewert:=Wassermenge_01.Value_[COLOR=Red][B]8[/B][/COLOR];

END_FUNCTION_BLOCK
```
Nun möchte ich eingentlich das *8 *durch die Variable Adressenwert ersetzen, somit das auslesen des DB dynamisch machen! Ist das möglich? Wie sieht die syntax aus?

Besten Dank
Uli


----------



## Larry Laffer (5 Juni 2009)

Hallo,
das würde dann eventuell so aussehen :
	
	



```
Ausgabewert:=dword_to_real(Wassermenge_01.dd[[COLOR=red][B]8])[/B][/COLOR];
```
Gruß
LL


----------



## Uli_87 (5 Juni 2009)

Danke für die schnelle Antwort,

vielleicht habe ich mich falsch ausgedrückt.

Ich muss so machen das die 8 zu einer variable wird, es kann dan 8 oder 15 oder irgend eine Zahl werden!

Habt ihr vielleicht eine Idee?

P.S. So wie es oben von mir beschrieben ist funktionierts, nur bekomme ich immer die Value_8, das was dann dynamisch werden soll

Gruss
Uli


----------



## xhasx (5 Juni 2009)

In WinCcflexible kannst du dir einen Variablennamen aus Strings zusammenbauen in SCL nicht (oder ich weiß es nicht)!

Zwei Nachteile:
1. Werden die Variablen erst zur Laufzeit erstellt fällst du bei Flexible erst in der Runtime auf die Schnauze und es wird ein Debugger gestartet...

2. Sollte sich der Symbolische Name deiner Variablen ändern musst überall im Projekt suchen wo du den Namen "Stringtechnisch" zusammenbaust...


Das Problem an der Sache ist dass die Variable erst zur Laufzeit erstellt würde dass der Syntaxcheck zur Projektierungszeit aber nicht kann.
Mach's über Indizes... wie mein Vorredener vorgeschlagen hat.


----------



## Uli_87 (5 Juni 2009)

Danke für die Antwort!

Naja dann funktioniert es nicht mit SCL, schade... 

Vielen Dank
Uli


----------



## Larry Laffer (5 Juni 2009)

Hallo Uli,
es würde funktionieren, wenn SCL den Aufbau der Datenquelle kennt.
Also befinden sich deine Daten entweder z.B. der Instanz, die du gerade programmierst (im VAR-Bereich deines FB).
Letztendlich adressiert der SCL-Compiler absolut. Deshalb müssen alle verwendeten Adressen im Moment des compilierens bekannt sein ...

Gruß
LL


----------



## Uli_87 (5 Juni 2009)

Leider habe ich noch nicht so viel erfahrung, verstehe nicht ganz was du meinst! Könntest du mir ein Beispiel machen wie ich es lösen könnte?

Vielen Dank


----------



## Larry Laffer (5 Juni 2009)

Gegenfrage :
was willst du machen ...?


----------



## Uli_87 (5 Juni 2009)

Also, ich habe ein DB erstellt der mehrere REAL werte beinhaltet, nun möchte ich ein FC erstellen der mir ein bestimmter Wert holt, das ganze kann ich über die indizes des DB machen, also sagen wir mal so... im DB sind folgende werte:

0.0: 150
4.0: 250
5.0: 350

nun habe ich ein eingan auf dem baustein (z.b. INT) mit folgenden werte:
1 oder 2 oder 3 (die sollten den folgenden werten entsprechen 1 sollte 150 zurückgeben 2 sollte 250 und 3 - 350 zurückgeben).

der DB fülle ich manuell, aber die auswahl der daten aus dem DB sollte dynamisch erfolgen!

Danke
Uli


----------



## Larry Laffer (5 Juni 2009)

Also :
du erstellst keinen FC sondern einen FB.
Im VAR-Bereich deines FB erstellst du einen Bereich mit der benötigten Anzahl von Werten. 
	
	



```
VAR
   meineDaten : ARRAY [1..10] of REAL ;
```
auf dieses ARRAY kannst du dann per Index zugreifen :
	
	



```
OUT_Real := meineDaten [IN_Index] ;
```
ungefähr so ...
Ist das dann was für dich ?


----------



## Larry Laffer (5 Juni 2009)

Nachtrag:
Sollten deine Werte Konstanten sein, so kannst du deren Werte auch schon gleich mit angeben :
	
	



```
VAR
   meineDaten : ARRAY [1..10] of REAL := 111.0,222.0,345.6 usw. ;
```


----------



## Uli_87 (5 Juni 2009)

Kann ich dann nicht über ein schon bestehendes DB index suchen? wie kann ich dan den DB einbinden? Die Werte vom DB kann ich dann beliebig geben?

Danke sieht gut aus

Gruss
Uli


----------



## Kai (5 Juni 2009)

Uli_87 schrieb:


> Also, ich habe ein DB erstellt der mehrere REAL werte beinhaltet, nun möchte ich ein FC erstellen der mir ein bestimmter Wert holt, das ganze kann ich über die indizes des DB machen, also sagen wir mal so... im DB sind folgende werte:
> 
> 0.0: 150
> 4.0: 250
> ...


 
http://www.sps-forum.de/showpost.php?p=158732&postcount=5

http://www.sps-forum.de/showpost.php?p=132967&postcount=6

http://www.sps-forum.de/showpost.php?p=132971&postcount=8

Gruß Kai


----------



## Uli_87 (5 Juni 2009)

Larry Laffer schrieb:


> Nachtrag:
> Sollten deine Werte Konstanten sein, so kannst du deren Werte auch schon gleich mit angeben :
> 
> 
> ...



So würde es vermutlich gehen, es sind aber ungefähr 150 verschiedene Werte, ist dann das nicht ein Problem?

Gruss
Uli


----------



## Larry Laffer (5 Juni 2009)

Uli_87 schrieb:


> es sind aber ungefähr 150 verschiedene Werte, ist dann das nicht ein Problem?


 Wenn es für dich kein Problem darstellt (du mußt ja die Werte vorgeben) - für SCL und den vorgeschlagenen FB ist es keins ...


----------



## volker (5 Juni 2009)

das lässt sich doch auch in einer fc lösen.

hier mal in awl (sclist nicht so mein ding  )

```
l db_nr //in
t t_db //temp
auf [t_db]

l wert_nummer /in
l 1
-i //da startadresse 0 und nicht 1 ist
l 4
*i //da ein wert 4 byte belegt
t t_adresse //temp //nicht benötigt; nur zum besseren verständnis
sld 3 //pointer erzeugen
lar1 //ins adressregister

l dbd[ar1,p#0.0]
t gewuenschter_wert //out
```
zum thema pointer guckst du auch hier http://www.sps-forum.de/showthread.php?t=8887


----------

