- Beiträge
- 5.442
- Reaktionspunkte
- 1.412
TYPE UDT1
VERSION : 0.1
STRUCT
Status : INT ;
Befehl : INT ;
END_STRUCT ;
END_TYPE
... Ich dachte halt es wäre irgendwie möglich nur zu sagen DU liegst eigentlich in diesem DB. als würde man direkt mit Pointern schaffen ohne das wirklich erst umzukopieren. sozusagen eine AT sicht mit Struktur auf einen Globalen DB Bereich.
FUNCTION_BLOCK Obj_Beispiel
TITLE = 'Beispiel als Objekt ausgeführt'
// Beispiel wie man einen UDT frei an einen Pointer hängt.
// Um z.B. eine unspezifizierte Datenmenge mit einem UDT zu belegen und trotzdem Symbolisch den Baustein anhängen zu können
//
// V1.0 Startversion
VERSION : '1.0'
AUTHOR : VoR
NAME : KLP
FAMILY : TUV
VAR_INPUT
LS_PAR : ANY; // Hier wird das Erste Wort aus dem LS DB aufgelegt
pLS_PAR AT LS_PAR : ANY_POINTER;
END_VAR
VAR_OUTPUT
Istposition : INT; // Anzeigevariable
END_VAR
VAR_TEMP
KLP : LS_ABL_KLP; // temporäre Variablen mit UDT Belegt
END_VAR
(*Pointer auf UDT schreiben zum arbeiten*)
pLS_PAR.Bereichstyp := 2; // Typ des Bereichs soll Byte sein (INT = 2)
pLS_PAR.Anzahl_Werte := 22; // Länge des Pointers weil wir einen Any ohne Länge angeben wollen
// Muss so lange sein wie der UDT der angezeigt werden soll.
Ret := BLKMOV(SRCBLK := LS_PAR ,DSTBLK := KLP); // Kopieren in die Temporäre Variable.
(*Eigentlicher Programmteil starten*)
KLP.BF_Soll := TRUE; // Klappe soll nach Sollwert fahren
Istposition := KLP.Istposition / 10; // Istwert der Klappe umrechnen
(*Hier wird der Pointer zurückgeschrieben*)
Ret := BLKMOV(SRCBLK := KLP ,DSTBLK := LS_PAR);
END_FUNCTION_BLOCK
call Obj_Beispiel, IDB_Obj_Beispiel
LS_PAR := "IO".ErstesWort
Du machst dir einen IN-Parametzer (oder IN_OUT-Parameter) vom Typ deines DB's und legst darauf komplett deine AT-Sicht
FUNCTION_BLOCK SlaveBSENDRCV
TITLE = 'Kommunikationsbaustein'
// Dieser Baustein bietet den Server an.
// Passt zum Baustein MasterCom mit BSEND/RECV
//
// 1.0 Erste Version
VERSION : '1.0'
AUTHOR : VoR
NAME : KLP
FAMILY : TUV
VAR_INPUT
DB_1_Recv : BLOCK_DB ; // DB der von AS nach LST geht
DB_1_Send : BLOCK_DB ; // DB der von LST nach AS geht
ID : WORD ; //Primäre Verbindung
ID_Red : WORD ; //Sekundäre Verbindung
END_VAR
VAR
PUT : "BSEND";
GET : "BRCV";
save_status_Put : WORD ;
save_status_GEt : WORD ;
Zeit_alt : TIME ;
END_VAR
VAR_TEMP
zDB_1_Recv : ANY ;
pDB_1_Recv AT zDB_1_Recv : ANY_POINTER;
zDB_1_Send : ANY ;
pDB_1_Send AT zDB_1_Send : ANY_POINTER;
wDummy : WORD ;
RetVAL : INT ;
Write_Prot : BOOL ;
Zeit : TIME ;
Anzahl_Werte_RECV: WORD;
Anzahl_Werte_SEND: WORD;
END_VAR
DB_1_send.DW[0] := DB_1_recv.DW[0]; // Watchdog wieder zurückkopieren
Zeit := TIME_TCK();
(*Pointer aufbereiten*)
(*Empfangen*)
pDB_1_Recv.syntaxid := B#16#10; ; // Typ des Bereichs soll Byte sein (INT = 2)
pDB_1_Recv.Bereichstyp := 2; // Typ des Bereichs soll Byte sein (INT = 2)
pDB_1_Recv.DB_Nr := WORD_TO_INT(BLOCK_DB_TO_WORD(DB_1_Recv)); // Länge des Pointers weil wir einen Any ohne Länge angeben wollen
RetVAL := TEST_DB(DB_NUMBER := BLOCK_DB_TO_WORD(DB_1_Recv),DB_LENGTH := Anzahl_Werte_RECV ,WRITE_PROT := Write_Prot);
pDB_1_Recv.Anzahl_Werte := WORD_TO_INT(Anzahl_Werte_RECV); // Länge des Pointers weil wir einen Any ohne Länge angeben wollen
pDB_1_Recv.Startadresse := DW#16#84000000;
(*Senden*)
pDB_1_send.syntaxid := B#16#10; ; // Typ des Bereichs soll Byte sein (INT = 2)
pDB_1_send.Bereichstyp := 2; // Typ des Bereichs soll Byte sein (INT = 2)
pDB_1_send.DB_Nr := WORD_TO_INT(BLOCK_DB_TO_WORD(DB_1_send)); // Länge des Pointers weil wir einen Any ohne Länge angeben wollen
RetVAL := TEST_DB(DB_NUMBER := BLOCK_DB_TO_WORD(DB_1_send),DB_LENGTH := Anzahl_Werte_SEND ,WRITE_PROT := Write_Prot);
pDB_1_send.Anzahl_Werte := WORD_TO_INT(Anzahl_Werte_SEND); // Länge des Pointers weil wir einen Any ohne Länge angeben wollen
pDB_1_send.Startadresse := DW#16#84000000;
PUT(ID := ID // IN: WORD
,R_ID := w#16#3 // IN: DWORD
,SD_1 := zDB_1_Send // INOUT: ANY
,LEN := Anzahl_Werte_SEND // INOUT: WORD
);
PUT.REQ := TRUE;
IF PUT.ERROR OR PUT.DONE THEN
Put.Req := False;
END_IF;
IF PUT.ERROR THEN
save_status_Put := PUT.STATUS;
END_IF;
GET(EN_R := TRUE // IN: BOOL
,ID := ID // IN: WORD
,R_ID := w#16#1 // IN: DWORD
,RD_1 := zDB_1_ReCV // INOUT: ANY
,LEN := Anzahl_Werte_RECV // INOUT: WORD
);
IF GET.ERROR THEN
save_status_GET := GET.STATUS;
END_IF;
END_FUNCTION_BLOCK
Du kannst einen UDT an IN_OUT übergeben, dann kannst Du ohne umkopieren symbolisch zugreifen.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?