SPS- Programmierung mit ST

nach IEC 61131 mit CODESYS V2.3, CODESYS V3, e!COCKPIT

Vorlagen Kapitel 14  Kommunikation Controller–Feldbuskoppler, Modbus

  Kopieren Sie den Programmcode und fügen Sie diesen in Ihre Entwicklungsumgebung ein.
      


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
  


© Vogel Buchverlag