| Aufgabe 14.1 |
Gebäudeautomatisation mit
e!COCKPIT Lösung aus 14.1
PROGRAM PLC_PRG
(******************************************************************
Firma: ......; Version: 1.0; Datum: .......
Funktion: Etage 2, Büro 1, Wechselschaltung mit
Bibliotheksbaustein
Kommunikation Controller-Feldbuskoppler
1.) Liest vom Slave 192.168.178.101 die DI und schreibt
diese in utResponse.awData[]
2.) Schreibt von utQuery.awWriteData[] die Werte in die
DO vom Slave
Bibliotheken: WagoAppPlcModbus
*******************************************************************)
VAR
KOMMU_E2: FbMbMasterUdp; // Instanz für Etage 2
utQuery: typMbQuery:= (bUnitId := 1, //
Slaveaddress
bFunctionCode := 16#17, // Register lesen/schreiben
uiReadAddress := 0, // Startaddress
uiReadQuantity := 1, // Quantität der Register
uiWriteAddress := 0,
uiWriteQuantity := 1,
awWriteData := [124(0)]);
xTxTrigger: BOOL;(*Job zu starten. Variable wird
vom Master
zurückgesetzt,
wenn der Job erledigt ist.*)
utResponse: typMbResponse;
tonDelay:TON := (PT := T#20MS); // Zeit zwischen
zwei Anträgen
xError:BOOL;
END_VAR
// Verzögerung zwischen zwei Anfragen
tonDelay( IN := (NOT tonDelay.Q) AND (NOT xTxTrigger));
xTxTrigger S= tonDelay.Q; // die nächste Anfrage
auslösen
//2. Etage: Slave über Modbus lesen und beschreiben
KOMMU_E2(xConnect:= TRUE,
sHost:=
'192.168.178.101',
wPort:=
502,
eFrameType:=
eMbFrameType.ETHERNET,
tTimeOut:=
T#30MS,
utQuery:=
utQuery,
xTrigger:=
xTxTrigger,
utResponse:=
utResponse,
xIsOpen=>
,
xError=>
xError,
oStatus=>
);
//Etage 2: Slave-Eingänge lesen DI1, DI2 und Ausgänge
DO1, DO2 beschreiben
utQuery.awWriteData[0].0:= utResponse.awData[0].0
XOR utResponse.awData[0].1;
utQuery.awWriteData[0].1:= utQuery.awWriteData[0].0;
FUNCTION_BLOCK LICHT_SZENEN
(*6 Szenen mit 3 Ausgänge*)
VAR_INPUT
IN:BOOL;(*schaltet die Szene um*)
tAUS:TIME:=T#2S;(*Ausschalten wenn IN länger als
tAus TRUE ist*)
END_VAR
VAR_OUTPUT
OUT1, OUT2, OUT3:BOOL;
END_VAR
VAR
CTU1: CTU;
TON1: TON;
END_VAR
CTU1(CU:= IN);(*hoch zählen*)
CASE CTU1.CV OF
0: OUT1:= FALSE; OUT2:= FALSE; OUT3:= FALSE;
1: OUT1:= FALSE; OUT2:= TRUE; OUT3:= FALSE;
2: OUT1:= FALSE; OUT2:= TRUE; OUT3:= TRUE;
3: OUT1:= TRUE; OUT2:= TRUE; OUT3:= FALSE;
4: OUT1:= TRUE; OUT2:= FALSE; OUT3:= TRUE;
5: OUT1:= TRUE; OUT2:= TRUE; OUT3:= TRUE;
END_CASE;
(*Ausschalten wenn IN länger als tAus TRUE ist*)
TON1(IN:= IN, PT:= tAUS);
IF CTU1.CV > 5 OR TON1.Q THEN
CTU1.RESET:= TRUE;
ELSE CTU1.RESET:= FALSE;
END_IF
|