Data Matrix Code Reading
In diesem Beispiel werden
- über die Funktion F_VN_ReadDataMatrixCodeExp jeweils ein Data Matrix Code pro Bild ausgelesen
- und die Ausführungszeit der Funktion über einen sogenannten Watchdog überwacht.
Erläuterung
Die Funktion F_VN_ReadDataMatrixCodeExp sucht nach Data Matrix Codes im vorgegebenen Bild und liest diese aus. Dabei kann im Gegensatz zur Funktion F_VN_ReadDataMatrixCode die Anzahl der zu suchenden Codes je Bild vorgegeben werden. In diesem Beispiel ist das ein Code pro Bild. Zudem wird die Kontur des gefundenen Codes zurückgegeben. Als Suchstrategie wird TCVN_CSS_ONLY_NOT_FLIPPED
gewählt, da das Bild nicht gespiegelt ist.
Wenn sich im Bild Bereiche befinden, die ähnlich wie Codes aussehen, oder wenn gar kein Code im Bild vorhanden ist, kann sich dies negativ auf die Ausführungszeit auswirken. Um Zykluszeitüberschreitungen zu verhindern, wird die Funktion F_VN_ReadDataMatrixCodeExp in diesem Beispiel mit Hilfe eines Watchdogs überwacht (siehe dazu das Beispiel Blob Detection mit Watchdog Überwachung).
Variablen
hr : HRESULT;
ipImageIn : ITcVnImage;
ipImageInDisp : ITcVnDisplayableImage;
ipImageRes : ITcVnImage;
ipImageResDisp : ITcVnDisplayableImage;
// Data Matrix Code
ipCodeDecodedList : ITcVnContainer;
ipCodeContourList : ITcVnContainer;
sCodeAsString : STRING(255);
// Watchdog
hrWD : HRESULT;
tStop : DINT := 20000;
tRest : DINT;
// Output
sText : STRING;
// Color
aColorRed : TcVnVector4_LREAL := [255, 0, 0];
Code
// Execute the DMC Code Reading Function monitored by the Watchdog function
// ---------------------------------------------------------------
hrWD := F_VN_StartRelWatchdog(tStop, S_OK);
hr := F_VN_ReadDataMatrixCodeExp(
ipSrcImage := ipImageIn,
ipDecodedData := ipCodeDecodedList,
ipContours := ipCodeContourList,
nCodeNumber := 1,
eSearchStrategy := TCVN_CSS_ONLY_NOT_FLIPPED,
hrPrev := hr
);
hrWD := F_VN_StopWatchdog(hrWD, tRest => tRest);
// Check if the function was executed successfully
IF hr = S_OK THEN
// Export Code into String
hr := F_VN_ExportSubContainer_String(ipCodeDecodedList, 0, sCodeAsString, 255, hr);
// Write Code into Result Image
hr := F_VN_PutText(sCodeAsString, ipImageRes, 25, 50, ETcVnFontType.TCVN_FT_HERSHEY_PLAIN, 2, aColorRed, hr);
// Draw Code Contour into Result Image
hr := F_VN_DrawContours(ipCodeContourList, 0, ipImageRes, aColorRed, 3, hr);
ELSE
// Write HRESULT into Result Image
sText := CONCAT('Returncode ', DINT_TO_STRING(hr));
hr := F_VN_PutLabelExp(sText, ipImageRes, 25, 50, 2, 2, ETcVnFontType.TCVN_FT_HERSHEY_PLAIN, aColorRed, aColorWhite, ETcVnLineType.TCVN_LT_8_CONNECTED, hr);
END_IF
// Write Code Reading proceeded time into Result Image
sText := CONCAT(CONCAT('Time: ', DINT_TO_STRING(tStop - tRest)), 'us');
hr := F_VN_PutText(sText, ipImageRes, 25, 80, ETcVnFontType.TCVN_FT_HERSHEY_PLAIN, 2, aColorRed, hr);