Die CODESYS Library „Hubo for CODESYS“ stellt Funktionsbausteine zur Verfügung, welche den Raspberry Pi in eine modulare Soft-SPS verwandelt. Dabei wird die komplette Palette aller Hubo Modelle unterstützt, womit ein Ausbau auf bis zu 8 Module mit 64 digitalen Ein- und ebenso vielen Ausgängen realisiert werden kann.
Während die CODESYS Runtime bereits von Haus aus den 1Wire Bus unterstützt, erlauben die Funktionsbausteine HuboDigitalIO und HuboAnalogInput den Zugriff auf die digitalen und analogen Schnittstellen. Sowohl die CODESYS Treiber, als auch deren Online-Hilfe finden Sie in der Download Rubrik.
Anbei seien zwei kurze Code-Beispiele gegeben, die verdeutlichen, wie einfach sich der Zugriff auf die Hardware mittels der CODESYS Library realisieren läßt.
Einlesen der analogen Eingänge des Hubo mittels der CODESYS Library
Das folgende Beispiel liest zyklisch die Rohwerte und Spannungen des AD Wandlers aus und speichert sie in den entsprechenden Variablen.
PROGRAM PLC_PRG VAR myADC : Hubo.HuboAnalogInput := (pSPIMaster := ADR(SPI_Master)); adValue0 : UINT; voltage0 : REAL; bResult : Hubo.ERROR := Hubo.ERROR.NO_ERROR; END_VAR // Einmalige Initialisierung und puffern der Werte des AD Wandlers. IF (myADC.Initialize() <> Hubo.ERROR.NO_ERROR) OR (myADC.ReadBuffer() <> Hubo.ERROR.NO_ERROR) THEN RETURN; END_IF // Auf einzelne AD-Kanäle mittels GetChannel() zugreifen. bResult := myADC.GetChannel(adChannel:=0, digit => adValue0, voltage => voltage0);
Einlesen und setzen der digitalen Ein- und Ausgänge des Hubo mittels der CODESYS Library
Dieses Beispiel liest alle 8 digitalen Eingänge des Hubo ein und gibt sie unmittelbar danach auf dessen 8 Digitalausgängen wieder aus.
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 // Einmalige Initialisierung und Füllen der MCP23017 Eingangs- und OLAT-Puffer. IF (myMaster.Initialize() <> Hubo.ERROR.NO_ERROR) OR (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