Writing a PLC program
A simple PLC program for continuous image acquisition from a camera or a file source includes the following:
Variables
PROGRAM MAIN
VAR
hr : HRESULT;
fbCamera : FB_VN_SimpleCameraControl;
eState : ETcVnCameraState;
ipImageIn : ITcVnImage;
ipImageInDisp : ITcVnDisplayableImage;
nNewImageCounter : UINT;
END_VARName | Type | Description |
|---|---|---|
|
| All functions and many methods of the |
|
| Each camera and File Source Control is represented by a function block instance. In the simplest case this is an instance of the FB_VN_SimpleCameraControl, which covers the common properties of camera and File Source Control and can therefore be linked with both device types. Alternatively, FB_VN_GevCameraControl can be used for cameras and FB_VN_FileSourceControl for File Source Controls. |
|
| Each Vision device has a state of type ETcVnCameraState. |
|
| Images for processing are managed using ITcVnImage variables. In this sample, access to the camera input image is gained via |
|
| Images for display are managed via ITcVnDisplayableImages. |
Program code with state machine
Each Vision device has an internal state, TCVN_CS_INITIAL being the initial state. From this, the device can be brought into the TCVN_CS_ACQUIRING state using the StartAcquisition method. In this state, images can be captured and transferred. If an image is completely stored in the memory, it can be retrieved via fbCamera.GetCurrentImage(ipImageIn).
To check if an image was received completely and could be retrieved, the IF query queries the HRESULT of the method and whether the pointer to the memory area of the image is not 0. After that, you can start analyzing the image. To check and indicate that an image could be retrieved, the counter variable nNewImageCounter is incremented as an example.
F_VN_TransformIntoDisplayableImage then moves the image pointer to ipImageInDisp to display the image. The image can then no longer be retrieved via ipImageIn. Alternatively, a copy can be created with F_VN_CopyIntoDisplayableImage to display and edit the image.
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_IFFurther information on the state machine can be found in the API chapter Image Acquisition.