Digitale Ein- und Ausgänge

Aufgabenstellung

Die digitalen Eingänge des Hubo sollen über CODESYS eingelesen und direkt auf den Ausgängen ausgegeben werden.

Lösung

Deklarationsteil

PROGRAM PLC_PRG
VAR
    // Die Hubos arbeiten mit Pullup Widerständen an den Eingängen. Der einfacheren Logik wegen invertieren wir hier das Signal der Eingänge.
    myMaster       :     Hubo.HuboDigitalIO := (i2cAddress := 16#20, pI2CMaster:=ADR(I2C_Master), inputInvertMask:=16#FF, outputInvertMask:=16#00);
    masterEingang  :     BYTE               := 0;
    masterAusgang  :     BYTE               := 0;
    bResult        :     Hubo.ERROR         := Hubo.ERROR.NO_ERROR;
END_VAR

HuboDigitalIO ist der zur Steuerung der MCP23017 Portexpander zu verwendende FB. Während der Deklaration übergibt man die I2C-Adresse des Bausteins (0x20…0x27), das I2C Busmasterobjekt (das ist ein Standardobjekt bei Raspberry Pi Projekten unter CODESYS) sowie optional zwei Invertierungsmasken zur logischen Invertierung der Ein- und/oder Ausgänge.

Funktionsrumpf

// Einmalige Initialisierung der Objekte. Folgeaufrufe sind unschädlich und werden ignoriert. 
IF (myMaster.Initialize() <> Hubo.ERROR.NO_ERROR) THEN
    RETURN;
END_IF

// Alle Eingangspuffer des MCP23017 für diesen Zyklus füllen.
IF (myMaster.ReadBuffer() <> Hubo.ERROR.NO_ERROR) THEN
    RETURN;
END_IF

// Gepufferte Eingangswerte in der Variable "masterEingang" merken.
bResult := myMaster.GetInputPortB(inputPortB => masterEingang);

// Nun schleifen wir die digitalen Eingänge 1:1 direkt auf die digitalen Ausgänge durch... 
masterAusgang := masterEingang; 
    
// ... und schreiben sie als neue digitale Ausgangswerte in den Ausgangspuffer.
bResult := myMaster.SetOutputPortA(outputPortA := masterAusgang); 

// Alle Ausgangspuffer für diesen Zyklus auf den MCP23017 schreiben.
IF myMaster.WriteBuffer() <> Hubo.ERROR.NO_ERROR THEN
    RETURN;
END_IF

Jeder der FB der Library bedarf einer einmaligen Initialisierung per Initialize(). Diese erfolgt zum Start des Programmes und verwirft Folgeaufrufe nach dem ersten Zyklus. Mittels ReadBuffer() werden die Eingänge des MCP23017 sowie die Werte des Output-Latchregisters gelesen.

Von nun an kann frei mit diesen Werten gearbeitet werden. Im vorliegenden Fall erfolgt eine einfache Zuweisung der Eingangswerte an die Variable masterAusgang. Mittels des Aufrufes von SetOutputPortA(masterAusgang) wird der Ausgangswert nun in den Puffer zur Übermittlung an die Ausgänge übertragen.

Der Aufruf von WriteBuffer() überträgt letztendlich die gepufferten Werte auf den MCP23017.

Kommentare sind geschlossen.