SCL: kleines Programm

Uli_87

Level-1
Beiträge
12
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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:
Code:
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
 
Hallo,
das würde dann eventuell so aussehen :
Code:
Ausgabewert:=dword_to_real(Wassermenge_01.dd[[COLOR=red][B]8])[/B][/COLOR];
Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Zuletzt bearbeitet:
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Also :
du erstellst keinen FC sondern einen FB.
Im VAR-Bereich deines FB erstellst du einen Bereich mit der benötigten Anzahl von Werten.
Code:
VAR
   meineDaten : ARRAY [1..10] of REAL ;
auf dieses ARRAY kannst du dann per Index zugreifen :
Code:
OUT_Real := meineDaten [IN_Index] ;
ungefähr so ...
Ist das dann was für dich ?
 
Nachtrag:
Sollten deine Werte Konstanten sein, so kannst du deren Werte auch schon gleich mit angeben :
Code:
VAR
   meineDaten : ARRAY [1..10] of REAL := 111.0,222.0,345.6 usw. ;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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!

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
 
das lässt sich doch auch in einer fc lösen.

hier mal in awl (sclist nicht so mein ding ;) )
Code:
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
 
Zuletzt bearbeitet:
Zurück
Oben