Pointer auf Struktur (SCL)?

Zuviel Werbung?
-> Hier kostenlos registrieren
Jetzt glaube ich das ich habe es verstanden.
Es gibt viele Wege nach Rom. Hier ist ein Beispiel mit ein Global-DB:
(warnung: nicht getestet)

Code:
TYPE UDT_dataset_pro_byte
    STRUCT
    bi0, bi1, bi2, bi3, b4, b5, bi6, b7 : BOOL ;
    by0, by2 : BYTE ; // warum 2 bytes ?
    in0 : INT ; // byte-wert interpretiert als INT ?
    END_STRUCT
END_TYPE
 
DATA_BLOCK PLC_data  
    STRUCT 
        vals  : ARRAY[0..99] OF UDT_dataset_pro_byte ; // es soll einfach gross genug sein !
    END_STRUCT
BEGIN
END_DATA_BLOCK
 
FUNCTION Copy_via_db : VOID
 
VAR_input
    structStartAddress : INT ;
    iInputStartByte : INT ;
    iOutputStartByte : INT ;
    iNoOfBytes : INT ;
END_VAR
 
VAR_TEMP
    structCurrentAddress : INT ;
    iInputCurrentByte : INT ;
    iOutputCurrentByte : INT ;
    iCurrentByteNo : INT ;
    tempBYTE : BYTE ;
    tempINT : INT ;
END_VAR
 
FOR iCurrentByteNo := 1 TO iNoOfBytes BY 1 DO
    iInputCurrentByte := iInputStartByte + iCurrentByteNo - 1 ;
    iOutputCurrentByte := iOutputStartByte + iCurrentByteNo - 1 ;
    structCurrentAddress := structStartAddress + iCurrentByteNo - 1 ; // Zufällig zählt Struct nummer und E/A Bytenummer gleich.
    tempBYTE := IB[iInputCurrentByte] ;
    PLC_data.vals[structCurrentAddress].by0 := tempBYTE ; // tu etwas mit der DB abhängig von die Eingänge
    tempINT := BYTE_TO_INT(tempBYTE) ;
    PLC_data.vals[structCurrentAddress].in0 := tempINT ; // tu etwas mehr
    IF tempInt > 0 THEN  // tu etwas mit die Ausgänge abhängig von der DB wert.
        QB[iOutputCurrentByte] :=  PLC_data.vals[structCurrentAddress].by0 ;
    END_IF ; 
END_FOR ;
 
END_FUNCTION
 
 
 
FUNCTION Sample_Call : VOID
 
Copy_via_db(structStartAddress := 0
            ,iInputStartByte :=  2
            ,iOutputStartByte := 2 
            ,iNoOfBytes :=  6
            );
 
Copy_via_db(structStartAddress := 10
            ,iInputStartByte :=  12
            ,iOutputStartByte := 14 
            ,iNoOfBytes :=  4
            );
END_FUNCTION
 
@ LL
Das wäre dann wohl die Lösung!
Ich kann mir nur nicht Recht vorstellen wie da die Syntax aussehen soll...
(Aufruf von z.B. OB1 und auch Bearbeitung innerhalb des FB_NEU)
Kannst du mir ein Beispiel geben?

Hab gedacht, daß innerhalb der eckigen Klammern von ARRAY nur ganze Zahlen möglich sind, keine Variablen.


@ Jesper
Danke für deinen Lösungsvorschlag. Schaut ja bei weitem komplizierter aus als ich mir das gedacht hätte!
Ich werde das später mal testen, für jetzt brauch ich mal eine Pause...

Gruss
momo
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@momo99
Nein es ist gar nicht kompliziert.
Auf nur eine A4-Seite hast Du folgenes:
  • Der Typendeklaration von deiner Standard daten.
  • Der Global-DB.
  • Der Daten-behandlungs-FC mit beispiele wie man die Daten manipulieren kann.
  • Beispiele von wie du die Daten-behandlungs-FC aufrufe kann, genau wie DU es willst mit verschiedene anzahl von Bytes.
 
Hab gedacht, daß innerhalb der eckigen Klammern von ARRAY nur ganze Zahlen möglich sind, keine Variablen.
Bei AWL stimmt das so - bei SCL kannst du hier auch eine Variable (vom Typ INT) einsetzen. Das ist ja gerade der Clou bei SCL.

Ich kann mir nur nicht Recht vorstellen wie da die Syntax aussehen soll...
Aufruf von z.B. OB1 und auch Bearbeitung innerhalb des FB_NEU)
Kannst du mir ein Beispiel geben?
Da müßtest du mir erstmal noch ein bißchen auf die Sprünge helfen.

Du kannst auf jeden Fall aus einem ARRAY of UDT einen einzelnen UDT-Bereich an einen anderen Baustein weiterreichen (vorausgesetzt dieser kennt den UDT und dessen Aufbau auch).

Ich setze dies gerne ein um aus dem Instanz-Bereich meines "Master-FB" einen Sektions-Bereich auf die IN_OUT-Schnittstelle desselben FB's auszugeben. Ich habe dann ein ARRAY [1..x] of UDT11 und eine IN_OUT-Variable vom Typ UDT11 und dieser weise ich dann den entsprechenden Teilbereich zu. In etwa so :
Code:
VAR
   Station : ARRAY[1..50] of UDT11 ;
 
VAR_IN_OUT
   Stations_Daten : UDT11 ;
 
und dann im Code :
   Stations_Daten  := Station[i] ;
 
bzw. beim Zurückschreiben :
   Station[i]  := Stations_Daten ;
Gruß
LL
 
@ LL

Im Ansatz ist das genau was ich suche, ich habe nur folgende Probleme damit:

Code:
VAR
Station: Array[1..50] OF UDT 11
Wenn ich das richtig verstehe würde das für mein Beispiel bedeuten, daß ich innerhalb des FB_NEU ein Array erstellen muß, das alle möglichen Eingabebereiche abdeckt, z.B. [0..255]. Egal wie viele Bytes dann im Programm bearbeitet werden müssen hätte ich einen relativ grossen IDB.
(Als Bibl-Baustein könnte das bei kleineren CPU´s problematisch sein.)

Mein zweites Problem ist die Syntax (Struct-Parameter). Ich habe mir den FB laut deinen Angaben gebastelt
Code:
FUNCTION_BLOCK FB1001

VAR
    STG:    ARRAY[1..255] OF UDT_SPS;
END_VAR

VAR_IN_OUT
    STG_Daten: UDT_SPS;
END_VAR

RETURN;
END_FUNCTION_BLOCK
und will ihn aufrufen. Was muss ich jetzt als Parameter bei "STG_Daten" hinschreiben (ausgehend von den jpg.´s im 1.Post) ?
Code:
      CALL  FB  1001 , DB1001
       STG_Daten:=
Ich hab ja den ganzen DB_SPS als Struktur, nur - wie sage ich das der SPS daß sie mich auch versteht?

Und die Sache mit Array[1..x] verstehe ich nicht:confused:
Bei der Variablendefinition kann ich das nicht so angeben, ist imho ja auch logisch, das würde ja den IDB dynamisch verändern...

Gruss
momo
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich das richtig verstehe würde das für mein Beispiel bedeuten, daß ich innerhalb des FB_NEU ein Array erstellen muß, das alle möglichen Eingabebereiche abdeckt, z.B. [0..255]. Egal wie viele Bytes dann im Programm bearbeitet werden müssen hätte ich einen relativ grossen IDB.
(Als Bibl-Baustein könnte das bei kleineren CPU´s problematisch sein.)
Stimmt ... das ist so und liesse sich auch hier nicht umgehen ...

Mein zweites Problem ist die Syntax (Struct-Parameter). Ich habe mir den FB laut deinen Angaben gebastelt ...
und will ihn aufrufen. Was muss ich jetzt als Parameter bei "STG_Daten" hinschreiben (ausgehend von den jpg.´s im 1.Post) ?
Ich hab ja den ganzen DB_SPS als Struktur, nur - wie sage ich das der SPS daß sie mich auch versteht?
Wo es in der Haupt-Struktur landet bestimmst du über deinen Index (Eingangsbyte).
Um die Struktur im aufrufenden Baustein verwenden zu können muß sie dort natürlich auch angelegt sein - z.B. im TEMP-Bereich ...

Und die Sache mit Array[1..x] verstehe ich nicht:confused:
Bei der Variablendefinition kann ich das nicht so angeben, ist imho ja auch logisch, das würde ja den IDB dynamisch verändern...
Das schreibe ich immer gerne so hin, weil ich ja nicht weiß, wie groß der Andere sein ARRAY dimensionieren will. Für "x" mußt du natürlich deinen Endwert als Konstante eingeben ...

Gruß
LL
 
@ LL

Ich denke jetzt habe ich es endlich behirnt!

Was ich als Ergebnis haben will kann ich mir jetzt Dank eurer Hilfe basteln.

Wie ich die Sache mit dem (grossen) IDB löse muss ich noch sehen. Ich habe ja meinen Global-DB der vom Anwender in der richtigen Grösse angelegt ist.
Dahin müsste ich doch meine Daten direkt nach Auswertung hinschreiben können, sodaß ich nur einen Temp-Datenbereich brauche.

Mal sehen...
 
Zurück
Oben