PUT / GET in SCL

Carsten77

Well-known member
Beiträge
78
Punkte Reaktionen
2
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo zusammen,

irgendwas scheine ich falsch zu machen aber ich komme nicht dahinter was es ist.
Ich möchte eine Put / Get S7-Verbindung zu einer anderen Steuerung aufbauen.
Habe das ganze aus Verzweiflung in FUP programmiert und auch zum Laufen gebracht.
In SCL schaffe ich das leider nicht. Immer wenn ich den Pointer im Aufruf an den entsprechenden Eingang / Ausgang schreibe, meckert der SCL-Editor.
Warum geht das nicht genauso wie in FUP. Hat da jemand Erfahrung und kann mir helfen? Kann zur Veranschaulichung auch gerne die Aufrufe mal posten wenn es was bringt!

Grüße
Carsten
 
OP
C

Carsten77

Well-known member
Beiträge
78
Punkte Reaktionen
2
Zuviel Werbung?
->Hier kostenlos registrieren
So sieht der Aufruf vereinfacht in SCL aus.

GET(REQ := M0.7 // IN: BOOL
,ID := 16#01 // IN: WORD
,ADDR_1 := P#DB112.DBX0.0 BYTE 2 //RT_DATEN_RCV.SRC_POINTER // INOUT: ANY
,RD_1 := P#DB114.DBX0.0 BYTE 2 //RT_DATEN_RCV.DST_POINTER // INOUT: ANY
);

bei der Übersetzung meckert der Editot dann : Unzulässiger Datentyp für Konstante
 

ducati

Well-known member
Beiträge
7.614
Punkte Reaktionen
1.704
Zuviel Werbung?
->Hier kostenlos registrieren
Also ich verstehs so, dass eine Konstante kein Pointer sein soll... probier mal ne IN_OUT Variable für den Pointer aus.

Hab hier nur die Hilfe vom SCL 5.3 da ists gut erklärt, wenns im TIA nicht so ist, dann bin ich mal wieder froh, nix mit TIA machen zu müssen.

Gruß.
 
Zuletzt bearbeitet:

ducati

Well-known member
Beiträge
7.614
Punkte Reaktionen
1.704
Zuviel Werbung?
->Hier kostenlos registrieren
Jo, entweder den Pointer über nen STRUCT selber zusammenbauen, oder von nem Eingang übernehmen...

selber zusammenbauen könnte dann so aussehen:

Code:
VAR_TEMP
 READ : ANY;   
 _READ AT READ : STRUCT                       
        ID : BYTE;  
        Typ : BYTE; 
        Laenge : WORD;  
        DBNr : WORD;  
        Adresse : DWORD;  
       END_STRUCT;  
 
 WRITE : ANY;
_WRITE AT WRITE : STRUCT                      
        ID : BYTE;  
        Typ : BYTE;  
        Laenge : WORD;  
        DBNr : WORD;  
        Adresse : DWORD;  
    END_STRUCT; 
   
END_VAR 

BEGINN;
       _READ.ID := 16#10;                // fest
        _READ.Typ :=  16#2;               // 2 für Byte (fest)
        _READ.Laenge := INT_TO_WORD(2);        // DB-Länge
        _READ.DBNr :=INT_TO_WORD(112);          // DB-Nummer
        _READ.Adresse := DW#16#84000000;  // fest
 
        _WRITE.ID := 16#10;  
        _WRITE.Typ :=  16#2;  
        _WRITE.Laenge :=INT_TO_WORD(2);  
        _WRITE.DBNr :=DINT_TO_WORD(112);  
        _WRITE.Adresse := DW#16#84000000;  

GET(REQ      := M0.7,           
       ID         := 16#01,        
       ADDR_1 := READ,     
       RD_1    := WRITE     
          );

ungetestet! aber so in etwas müsste es gehen, hat GET nen Rückgabewert?...

Gruß.

PS: trotzdem wären nähere Angaben vom TE von Vorteil. Was soll genau gemacht werden, ist es jetzt TIA etc...
 
Zuletzt bearbeitet:

Chefmech

Well-known member
Beiträge
267
Punkte Reaktionen
26
Code:
VAR_TEMP
    T_pMyAdr     :ANY;    //Adress-Pointer
END_VAR

BEGIN
    
     T_pMyAdr := "dbRecv".bData;          //zb. ein ByteArray, das du im DB definiert hast


    GET(REQ := M0.7 // IN: BOOL
         ,ID := 16#01 // IN: WORD
         ,ADDR_1 :=T_pMyAdr // INOUT: ANY
         ,RD_1 := .....//da natürlich auch ein Pointer...
         );
--> Du kannst einfach eine Variable vom Typ ANY anlegen, dann kannst du den Pointer auf den Datenbereich setzten (zb. ein Byte-Array oder eine struktur).
--> Mit einer AT-Sicht ist auch möglich, wobei das "selber basteln" eines Pointers nicht ganz einfach ist. Wenn immer möglich direkt zuweisen (zb. auch über ne IN_VAR)
 
Oben