Aufruf SFB aus SCL FB

vollmi

Level-3
Beiträge
5.425
Reaktionspunkte
1.403
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen

Ich versuche grad aus SCL einen SFB aufzurufen leider klappt das mit dem übersetzen nicht so wie es sollte.

Code:
VAR
  Exec_com  : SFB65002;    
  Exec_Stat : WORD ;
  COM1      : STRUCT     
               ID    : BYTE ;    
               Linie : BYTE ;    
               R_Nr  : BYTE ;    
               LEN   : BYTE ;    
               RD_WR : BYTE ;    
               Busy  : BYTE ;    
               Error : BYTE ;    
               Ready : BYTE ;    
               Reg_1 : INT ;    
               Reg_2 : INT ;    
               Reg_3 : INT ;    
               Reg_4 : INT ;    
               Reg_5 : INT ;    
               Reg_6 : INT ;    
              END_STRUCT ;    
END_VAR

BEGIN
        COM1.ID     := INT_TO_BYTE(ID);  (*ID des Modules von Schnittstelle laden und in Strukt transferieren*)
        COM1.Linie  := INT_TO_BYTE(CHA); (*Channel des Modules von Schnittstelle laden und in Strukt transferieren*)
        COM1.R_Nr   := 3;   (*Anfangsregister adressieren*)
        COM1.LEN    := 3;   (*Anzahl Register definieren*)
        COM1.Reg_2  := DINT_TO_INT(TIME_TO_DINT(TOUT)) / 1000; (*Timeout lesen in IEC Time Format, umrechnen in Int*)
        COM1.Reg_1  := AUT;  (*Ausgänge in Modulregister laden*)
        COM1.Reg_3  := BLINK;(*Ausgänge in Modulregister laden für Blinken*)
        Exec_com(OBJHandle                := OBJHandle, (*Transferieren zum Modul*)
                 Command                  := DW#16#1,
                 InputData                := COM1,
                 OutputData               := COM1,
                [COLOR=Red] Status                   := Exec_Stat);[/COLOR]

Beim Rot Markierten krieg ich einen Motz vom Compiler:
Ungültige Zuweisung

Der Exec_Com SFB hat vier in (word, dword, any, any) sowie einen out (word). Imho habe ich das auch korrekt deklariert.

Habe ich da einen groben Fehler drin?

mfG René
 
Versuchs mal so:
Code:
    Exec_com(OBJHandle                := OBJHandle, (*Transferieren zum Modul*)
                 Command                  := DW#16#1,
                 InputData                := COM1,
                 OutputData               := COM1);
    Status := Exec_com.Exec_Stat;

oder:
Code:
    Exec_com(OBJHandle                := OBJHandle, (*Transferieren zum Modul*)
                 Command                  := DW#16#1,
                 InputData                := COM1,
                 OutputData               := COM1);
    Exec_Stat := Exec_com.Status;

Je nachdem was bei dir zum SFB gehört, ich hab den nicht zur Hand. ;-)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
versuch mal deine Deklaration wie folgt zu ändern :
Code:
        Exec_com(OBJHandle                := OBJHandle, (*Transferieren zum Modul*)
                 Command                  := DW#16#1,
                 InputData                := COM1,
                 OutputData               := COM1[COLOR=red]);[/COLOR]
 
[COLOR=#ff0000]Exec_Stat := Exec_com.Status ;[/COLOR]
Ich vermute mal, das Status der Rückgabewert des Bausteins ist ...

Gruß
LL

Edit: Ralle war schneller :)
 
Genau letztere war die Lösung. Danke euch. Jetzt kann ich wenigstens übersetzten werde morgen mal testen ob das dann so auch funktioniert.

Wie ist denn das? Kann der SFB nicht auf die Schnittstelle schreiben (hier rot markiert)?

Code:
    Exec_com(OBJHandle                := OBJHandle, (*Transferieren zum Modul*)
                 Command                  := DW#16#1,
                 InputData                := COM1,
                 [COLOR=Red]OutputData               := COM1[/COLOR]);
    Exec_Stat := Exec_com.Status;
Wenn ich es so aufbaue? Müsste ich das COM1 Struct ebenfalls so einreihen?

Code:
COM1 := Exec_com.OutputData
Wird damit auch die komplette Struktur abgefüllt wie wenn ich es in AWL so abfülle.

Code:
    CALL  #Exec_com                   // Transferieren zum Modul
       OBJHandle :=#OBJHandle
       Command   :=DW#16#1
       InputData :=#COM1
       OutputData:=#COM1
       Status    :=#Exec_Stat
Da wird ebenfalls übers InputData die Struktur an die DLL übergeben.
Und nach bearbeitung die gesamte Struktur wieder ans OutputDate zurückgegeben.

mfG René
 
Wie ist denn das? Kann der SFB nicht auf die Schnittstelle schreiben (hier rot markiert)?

Hallo René,
doch ...SCL kann schon auf die Schnittstelle schreiben. Das, was du da hast ist einfach ein Syntax-Problem. IN- und IN_OUT-Parameter werden dem SFB (oder auch anderen Bausteinen) direkt übergeben - OUT-Parameter müssen so gehandelt werden, wie in dem Beispiel.

Wenn du da ganz sicher gehen willst, dann solltest du dir andere Bausteine immer mit "Einfügen - Bausteinaufruf" in dein Script holen - dann wird es dir als Vorschlag schon so (passend) angeboten ...

Gruß
LL
 
Zurück
Oben