Array in Datenbaustein schieben

bayerguard

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

ich habe ein 2 dimensionales Array mit SCL erstellt und gleichzeitig auch den DB dazu. Wie kann ich mein beschriebenes Array aus dem SCL-Prog in den Datenbaustein schreiben.

Kann ich das Array als Ausgangsvariable verwenden oder geht das irgendwie anders.
Denn, wenn ich es ausprobiere, dann krieg ich immer einen Bereichsfehler, als wenn der auf den DB schreiben, aber der DB in diesem Bereich gar nicht definiert ist.

greets
 
Aus dem hohlen Bauch raus würde ich sagen leg eine UDT mit einem Array an und verwende diese sowohl im DB als auch im SCL Baustein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... ich habe nicht so ganz verstanden, was du da vorhast ...

Mein Vorschlag aber trotzdem :
Verwende für dein SCL-Programm einen FB - dieser hat dann einen eigenen DB. Dorthin werden alle Daten, die du im STAT-Bereich deklariert hast, geschrieben.

Falls du etwas anderes wünscht, dann bitte eine genauere Beschreibung. Außerdem ist es für Ratschläge immer hilfreich, wenn man den schon erstellten Code mit-postet ...

Gruß
LL
 
Hallo,

also ich habe in einem SCL-Prog ein Array definiert, (ARRAY[1..5,1..2] of REAL), dieses Array soll dann an andere SCL-Progs übergeben werden. Also muss man es ja als Eingangs- bzw. Ausgangsvariable im jeweiligen SCL-Prog definieren.
Ich habe mir gedacht, die Übergabe funktioniert am besten, wenn ich einen DB dazwischen schalte und ihn dieses Array übergebe.
Sozusagen soll das Array eine globale Variable sein, auf die mehrere SCL-Progs zugreifen können.

Und dann ist die Frage, wie realisiere ich das?
Speziell auch der Syntax, also was ich an die SCL-Box dran schreibe.
Step7 generiert sich bei der symbolischen Programmierung seinen Pointer selbst, aber es schreibt in den Pointer ja immer nur das Anfangsbit des Arrays im DB.
Werden die folgenden Bits auch beschrieben, wenn der Pointer nur auf das Anfangsbit zeigt ?

Ich hoffe, das war jetzt ein bisschen verständlicher!

greets
 
Hallo,
dein Stichwort heißt hier ANY-Pointer. Bitte zu diesem thema auch mal entsprechende Beiträge in der Rubrik FAQ des Forums durchlesen (ANY).
Mit dem ANY-Pointer kannst du sowohl den Daten-Einstiegspunkt wie auch den Datentyp und die Länge des Datenbereichs übergeben.

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo bayerguard,

das geht in SCL recht einfach.

Ein sinnloses Beispiel:
Code:
//**************************************
DATA_BLOCK DB_ARR
//**************************************
  STRUCT
    A                       : ARRAY[1..5,1..2] OF REAL;
    B                       : ARRAY[1..5,1..2] OF REAL;
    C                       : ARRAY[1..5,1..2] OF REAL;
  END_STRUCT
BEGIN
END_DATA_BLOCK
 
//**************************************
FUNCTION "TEST_ARRAY": VOID
//**************************************
VAR_IN_OUT
  ARR_A                     : ARRAY[1..5,1..2] of REAL;
END_VAR
BEGIN
  ARR_A[1,1] := 4712.1;
  ARR_A[2,1] := 4712.2;
  ARR_A[3,1] := 4712.3;
  ARR_A[4,1] := 4712.4;
END_FUNCTION
 
//**************************************
ORGANIZATION_BLOCK OB1
//**************************************
VAR_TEMP
  info : ARRAY[0..19] OF BYTE;
END_VAR
BEGIN
  TEST_ARRAY(ARR_A := "DB_ARR".A);
END_ORGANIZATION_BLOCK


btw: Man kann übrigens auch sehr einfach komplette ARRAYs oder UDTs kopieren.
Code:
//**************************************
FUNCTION "HMI_MESSWERT": VOID
//**************************************
VAR_INPUT
  ID_HMI, ID_MESSWERT               : INT;
  INIT                              : BOOL;
END_VAR
VAR_IN_OUT
  UNI, MESSWERT                     : UDT183;
END_VAR
BEGIN
  IF ID_HMI=ID_MESSWERT THEN
    IF INIT
      THEN UNI:=MESSWERT;
      ELSE MESSWERT:=UNI;
    END_IF;
  END_IF;
END_FUNCTION


Gruß, Onkel
 
Zuletzt bearbeitet:
Zurück
Oben