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.