SPS-Programm schreiben
Zu einem einfachen SPS-Programm zur kontinuierlichen Bild-Akquise von einer Kamera oder einem File Source gehört Folgendes:
Variablen
PROGRAM MAIN
VAR
hr : HRESULT;
fbCamera : FB_VN_SimpleCameraControl;
eState : ETcVnCameraState;
ipImageIn : ITcVnImage;
ipImageInDisp : ITcVnDisplayableImage;
nNewImageCounter : UINT;
END_VAR
Name | Typ | Beschreibung |
---|---|---|
|
| Alle Funktionen und viele Methoden der |
|
| Kameras und File Source Controls werden jeweils durch eine Funktionsbausteininstanz repräsentiert. Im einfachsten Fall ist dies eine Instanz vom FB_VN_SimpleCameraControl die die gemeinsamen Eigenschaften von Kamera und File Source Control abdeckt und daher mit beiden Gerätetypen verknüpft werden kann. Alternativ gibt es noch den FB_VN_GevCameraControl für Kameras und den FB_VN_FileSourceControl für File Source Controls. |
|
| Jedes Vision-Gerät hat einen Zustand vom Typ ETcVnCameraState. |
|
| Bilder zur Verarbeitung werden über Variablen vom Typ ITcVnImage verwaltet. In diesem Beispiel erhält man über |
|
| Bilder, die dargestellt werden sollen, werden über ITcVnDisplayableImages verwaltet. |
Programmcode mit Zustandsautomat
Jedes Vision-Gerät hat einen internen Zustand, wobei TCVN_CS_INITIAL
der Anfangszustand ist. Von diesem kann das Gerät mit der Methode StartAcquisition
in den TCVN_CS_ACQUIRING
Zustand gebracht werden. In diesem können Bilder aufgenommen und übertragen werden. Liegt ein Bild vollständig im Speicher vor, kann es über fbCamera.GetCurrentImage(ipImageIn)
abgerufen werden.
Zur Überprüfung, ob ein Bild vollständig empfangen wurde und abgerufen werden konnte, wird in der IF-Abfrage das HRESULT
der Methode und der Pointer auf den Speicherbereich des Bildes auf ungleich 0 abgefragt. Danach kann mit der Analyse des Bildes begonnen werden. Zur Überprüfung und Anzeige dass ein Bild abgerufen werden konnte, wird beispielhaft die Zählervariable nNewImageCounter
inkrementiert.
F_VN_TransformIntoDisplayableImage verschiebt den Bild-Pointer anschließend in ipImageInDisp
, um das Bild anzuzeigen. Das Bild kann danach nicht mehr über ipImageIn
abgerufen werden, alternativ kann mit F_VN_CopyIntoDisplayableImage auch eine Kopie erzeugt werden, um das Bild sowohl anzeigen als auch weiterbearbeiten zu können.
eState := fbCamera.GetState();
IF eState = TCVN_CS_ERROR THEN
hr := fbCamera.Reset();
ELSIF eState < TCVN_CS_ACQUIRING THEN
hr := fbCamera.StartAcquisition();
ELSIF eState = TCVN_CS_ACQUIRING THEN
hr := fbCamera.GetCurrentImage(ipImageIn);
// Check if new Image was received
IF SUCCEEDED(hr) AND ipImageIn <> 0 THEN
nNewImageCounter := nNewImageCounter + 1;
// Place to call vision algorithms
hr := F_VN_TransformIntoDisplayableImage (ipImageIn, ipImageInDisp, hr);
END_IF
END_IF
Weitere Infos zum Zustandsautomat finden Sie imAPI-Kapitel Image Acquisition.