BaseSystemLib hinzugefügt

This commit is contained in:
2026-06-29 16:28:48 +02:00
parent a51a0c6fd1
commit 14a1c5172d
168 changed files with 6797 additions and 0 deletions
@@ -0,0 +1,10 @@
LibraryType:
Guid: 3342ee0b-33ee-4d32-9746-e58e39123b17
Comment:
de-DE: Cognex DM Barcode Reader
LibraryVersion:
VersionNumber: 2.0.4
Author: e.yueksel
IsDefault: true
Comment:
de-DE: Änderung im unterlagerten Baustein
@@ -0,0 +1,19 @@
DocumentHash:
- FileName: FB_BarcodeReaderCognex.scl
Hash: 4rFEFeAdq0tC32QHEP8AN5yefbKhwxAEdFcdHSCNsGc=
LibraryMetaFileHash: 6AEzsSMKgxcEeln7MzkJ58F/SOePAjBWRRDdTjBpDe4=
LibraryVersion:
Guid: 52e3e154-927c-43ca-a9f1-9b6026af3f8a
DependsOn:
- TypeName: stHMI_BRCognexDM
VersionNumber: 2.0.0
- TypeName: stCognexInterface
VersionNumber: 2.0.0
- TypeName: FB_Monitoring
VersionNumber: 2.0.5
- TypeName: UDT_MainState
VersionNumber: 2.0.0
- TypeName: UDT_BarcodeReader
VersionNumber: 2.0.1
- TypeName: UDT_SettingsBarcodeReader
VersionNumber: 2.0.0
@@ -0,0 +1,554 @@
FUNCTION_BLOCK "FB_BarcodeReaderCognex"
TITLE = FB_BarcodeReader
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : 'e.yueksel'
FAMILY : BarcodeReader
VERSION : 0.1
//Zusammensetzung aus FB_CameraCognex_Continuous und FB_StationScanner_WithCont
//Optimierte Variante (z.B. Schrittkette zusammengefasst)
//
//Dieser Baustein funktioniert nur mit Cognex Readern (z.B. DM260, DM280) und dem Cognex Profinet Interface und Triggermodus: Kontinuierlich (Continuous)!
VAR_INPUT
stInSettings : "UDT_SettingsBarcodeReader";
xInBorner : Bool; // NIU
xInStartReading : Bool; // Starte Lesevorgang
xInHandshakeDone : Bool; // Lesevorgang beendet Handshake rein
xInErrQuit : Bool; // Fehler rücksetzen
xInReset : Bool; // Baustein zurücksetzen
xInHWError : Bool; // Baugruppen Fehler
END_VAR
VAR_OUTPUT
xOutReadingDone : Bool; // Lesevorgang abgeschlossen / Handshake raus
xOutReadyForNewScan : Bool; // Reader ist bereit für Leseanforderung
nOutBarcode : LInt; // Letzter gelesener Barcode
sOutBarcode : String[20]; // Letzter gelesener Barcode (als Zeichenkette)
wOutErrorWord : Word; // Fehlercode
xOutCodeGood : Bool; // NIU
xOutCodeBad : Bool; // NIU
END_VAR
VAR_IN_OUT
stInOutInterface : "stCognexInterface";
stInOutControlUnitCabinet : "UDT_MainState";
stInOutHMI : "UDT_BarcodeReader";
END_VAR
VAR
xStartReading : Bool;
xTrigger : Bool;
xToggleBitFlg : Bool;
nBarcode : LInt;
sBarcodeString : String[20] := 'none';
GETIO_PART {InstructionName := 'GETIO_PART'; LibVersion := '1.2'; ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : GETIO_PART;
SETIO_PART {InstructionName := 'SETIO_PART'; LibVersion := '1.2'; ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : SETIO_PART;
stCtrlBitsIn : Struct
D0_DeviceReady : Bool;
D1_SystemReady : Bool;
D2_GoodRead : Bool;
D3_NoRead : Bool;
D4_ExtOut1 : Bool;
D5_ExtOut2 : Bool;
D6_Result1 : Bool;
D7_Result2 : Bool;
D8_ExtIn1 : Bool;
D9_ExtIn2 : Bool;
D10_Sensor1 : Bool;
D11_Sensor2 : Bool;
D12_Res : Bool;
D13_Res : Bool;
D14_Res : Bool;
D15_Toggle : Bool;
END_STRUCT;
nState : Int;
nLastStep { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int;
arStepHistory : Array[0..10] of Struct
StepNum : Int;
TimeStamp {InstructionName := 'DTL'; LibVersion := '1.0'} : DTL;
END_STRUCT;
nResultID : Int;
nResultCode : Int;
nResultExtended : Int;
"64Byte_IN_Data" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[0..63] of Byte;
tOnMonitoring {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
stHMI : "stHMI_BRCognexDM";
fbMonitoringCamRuntimeFail : "FB_Monitoring";
fbMonitoringCamGeneralFault : "FB_Monitoring";
stStatistics : Struct
nReads : UDInt;
nGoodRead : UDInt;
nBadRead : UDInt;
nGoodReadBarcodeChanged : UDInt;
nBadReadBarcodeChanged : UDInt;
tLastBarcodeRecv {InstructionName := 'DTL'; LibVersion := '1.0'; ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DTL;
tLastNoReadRecv {InstructionName := 'DTL'; LibVersion := '1.0'; ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DTL;
tLastReset {InstructionName := 'DTL'; LibVersion := '1.0'; ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DTL;
END_STRUCT;
END_VAR
VAR RETAIN
xReInit : Bool;
END_VAR
VAR
tPLCTime {InstructionName := 'DTL'; LibVersion := '1.0'} : DTL;
xCodeGood : Bool;
xCodeBad : Bool;
nBarcodeTarget : DInt;
sBarcodeTarget : String;
stTest : Struct
nGoodRead : Int;
nBadRead : Int;
nGoodReadBarcodeChanged : Int;
nBadReadBarcodeChanged : Int;
END_STRUCT;
END_VAR
VAR_TEMP
tReadIO_Status : DWord;
tReadIO_Error : Bool;
tWriteIO_Status_01 : DWord;
tWriteIO_Error_01 : Bool;
t_BC_iO : Bool;
t_BC_niO : Bool;
t_Format : Word;
t_Status : Int;
t_Time : Int;
xTemp : Bool;
nTempRetVal : Int;
tTempLocalTime {InstructionName := 'DTL'; LibVersion := '1.0'} : DTL;
END_VAR
VAR CONSTANT
"E_DeviceState.eInit1" : Int := 0;
"E_DeviceState.eInit2" : Int := 100;
"E_DeviceState.eNoJob" : Int := 200;
"E_DeviceState.eWaitReaderReady" : Int := 300;
"E_DeviceState.eWaitTriggerAck" : Int := 400;
"E_DeviceState.eGetResult" : Int := 500;
"E_DeviceState.eClearResult" : Int := 600;
"E_DeviceState.eOutput" : Int := 700;
"E_DeviceState.eHandshake" : Int := 800;
END_VAR
BEGIN
REGION Block Header
//=================================================================================
// Schönenberger Systeme GmbH / (c)Copyright 2025
//---------------------------------------------------------------------------------
// Title: FB_BarcodeReaderCognex
// Comment/Function: Cognex Barcode Reader
// Library/Family: BaseSystemLib/PROFINET/Devices
// Author: E.Yüksel
// Tested with: CPU 1515F-2 PN FW:V3.0
// Engineering: TIA Portal V20
// Restrictions: This function block ONLY works with Cognex Dataman Readers and PROFINET protocol
// Currently ONLY designed for Cognex trigger mode: Continuous
// Requirements: PLC (S7-1500)
//---------------------------------------------------------------------------------
// Change log table:
// Version | Date | Expert in charge | Changes applied
//----------|------------|------------------------|--------------------------------
// 01.00.00 | 25.04.2024 | Yüksel, Molina | First released version
// 02.00.00 | 20.11.2024 | Yüksel | Prepare for library integration
// 03.00.00 | 31.01.2025 | Yüksel | Refactoring, no functionality changes
//=================================================================================
END_REGION
REGION Info
(*
Errors:
00 Internal Error / Stepfailure
01 Results available before trigger
02 Runtime failure
03 Barcode ASCI failure
04 Res 4
05 ReadIO_Error
06 Res 6
07 Res 7
08 Res 8
09 Res 9
10 Res 10
11 Res 11
12 Res 12
13 Res 13
14 Camera not ready / General Fault
15 Modul reset
*)
END_REGION
REGION Read local plc time
// Lokale CPU Zeit auslesen
#nTempRetVal := RD_LOC_T(#tTempLocalTime);
END_REGION
REGION INIT
REGION First Scan
IF "FirstScan" THEN
#nState := #"E_DeviceState.eInit1";
END_IF;
END_REGION
REGION Reset statistics
IF NOT #xReInit AND NOT "FirstScan" AND #tTempLocalTime.YEAR > 1970 THEN
#stStatistics.nReads := 0;
#stStatistics.nGoodRead := 0;
#stStatistics.nBadRead := 0;
#stStatistics.nGoodReadBarcodeChanged := 0;
#stStatistics.nBadReadBarcodeChanged := 0;
#stStatistics.tLastBarcodeRecv := DTL#1970-01-01-00:00:00;
#stStatistics.tLastNoReadRecv := DTL#1970-01-01-00:00:00;
#stStatistics.tLastReset := DTL#1970-01-01-00:00:00;
#xReInit := TRUE;
#stStatistics.tLastReset := #tTempLocalTime;
END_IF;
IF #stInOutHMI.xResetStatistics THEN
#stStatistics.nReads := 0;
#stStatistics.nGoodRead := 0;
#stStatistics.nBadRead := 0;
#stStatistics.nGoodReadBarcodeChanged := 0;
#stStatistics.nBadReadBarcodeChanged := 0;
#stStatistics.tLastBarcodeRecv := DTL#1970-01-01-00:00:00;
#stStatistics.tLastNoReadRecv := DTL#1970-01-01-00:00:00;
#stStatistics.tLastReset := DTL#1970-01-01-00:00:00;
#stStatistics.tLastReset := #tTempLocalTime;
#stInOutHMI.xResetStatistics := FALSE;
END_IF;
END_REGION
END_REGION
REGION ErrorQuitt
IF #xInErrQuit THEN
#wOutErrorWord := 0;
END_IF;
END_REGION
REGION reset step sequence
IF #xInReset THEN
#nState := #"E_DeviceState.eInit1";
#wOutErrorWord := 0;
#wOutErrorWord.%X15 := TRUE;
END_IF;
END_REGION
REGION Err check camera ready
#wOutErrorWord.%X14 := #stInOutInterface.#xInCamGeneralFault;
END_REGION
REGION stepsequence
CASE #nState OF
#"E_DeviceState.eInit1":
REGION STEP 000 - INIT 1
#xOutReadyForNewScan := FALSE;
#xCodeBad := FALSE;
#xCodeGood := FALSE;
#xOutReadingDone := FALSE;
#stInOutInterface.xOutCamTriggerEnable := FALSE;
#stInOutInterface.xOutCamTrigger := FALSE;
#stInOutInterface.xOutCamResultsAck := FALSE;
#nOutBarcode := #nBarcode := 0;
#sOutBarcode := #sBarcodeString := '';
#wOutErrorWord := 0; // no Error
#nState := #"E_DeviceState.eInit2"; //Lade aktuelle Schrittnummer
END_REGION
#"E_DeviceState.eInit2":
REGION STEP 100 - INIT 2
#xOutReadyForNewScan := FALSE;
#xCodeBad := FALSE;
#xCodeGood := FALSE;
#xOutReadingDone := FALSE;
#stInOutInterface.xOutCamTriggerEnable := FALSE;
#stInOutInterface.xOutCamTrigger := FALSE;
#stInOutInterface.xOutCamResultsAck := TRUE; // Reader Ergebnisse quittieren
#nOutBarcode := #nBarcode := 0;
#sOutBarcode := #sBarcodeString := '';
//Transition
IF
NOT #stInOutInterface.xInCamResultsAvailable
THEN
#nState := #"E_DeviceState.eNoJob"; //Lade aktuelle Schrittnummer
END_IF;
END_REGION
#"E_DeviceState.eNoJob":
REGION STEP 200 - IDLE
#xCodeBad := FALSE;
#xCodeGood := FALSE;
IF #stInOutInterface.xInCamResultsAvailable OR #xInErrQuit THEN
#stInOutInterface.xOutCamResultsAck := TRUE;
ELSE
#stInOutInterface.xOutCamResultsAck := FALSE;
END_IF;
//#stInOutInterface.xOutCamResultsAck := #xInErrQuit;
#stInOutInterface.xOutCamTriggerEnable := FALSE;
#stInOutInterface.xOutCamTrigger := FALSE;
#xOutReadingDone := FALSE;
#nBarcode := #nOutBarcode := 0;
#xOutReadyForNewScan := TRUE;
//Transition
IF #xInStartReading THEN // Leseanforderung
#nState := #"E_DeviceState.eWaitReaderReady"; //Lade aktuelle Schrittnummer
END_IF;
END_REGION
#"E_DeviceState.eWaitReaderReady":
REGION STEP 300 - WAIT READER READY
#xOutReadyForNewScan := FALSE;
#stInOutInterface.xOutCamTriggerEnable := TRUE; // Freigabe an Barcode Reader
#stInOutInterface.xOutCamResultsAck := FALSE;
#wOutErrorWord.%X1 := #stInOutInterface.xInCamResultsAvailable; // Fehler wenn es schon Ergebnisse gibt
//Transition
IF #stInOutInterface.xInCamTriggerReady THEN // Barcode Reader meldet bereit
#stInOutInterface.xOutCamTrigger := TRUE; // Barcode Reader triggern
#nState := #"E_DeviceState.eWaitTriggerAck";
END_IF;
END_REGION
#"E_DeviceState.eWaitTriggerAck":
REGION STEP 400 - WAIT TRIGGER ACK
#xOutReadyForNewScan := FALSE;
#stInOutInterface.xOutCamTrigger := TRUE;
//Transition
IF #stInOutInterface.xInCamTriggerAck THEN
#nState := #"E_DeviceState.eGetResult";
END_IF;
END_REGION
#"E_DeviceState.eGetResult":
REGION STEP 500 - GET RESULT
// INFO:
// Beim Continous-Trigger (Modus der am Barcode Reader eingestellt wird) muss das Trigger-Signal im Gegensatz zum Single-Trigger immer high bleiben.
// Der Reader macht kontinuierlich Bilder und hört erst auf, wenn etwas gelesen wurde oder man den Trigger wegnimmt (z.B. nach Timeout)
// #stInOutInterface.xOutCamTrigger := #xInStartReading;
// Auf Ergebnis warten...
IF #stInOutInterface.xInCamResultsAvailable THEN // Ergebnis ist da
#stInOutInterface.xOutCamTrigger := FALSE; // Trigger wegnehmen
REGION Read data
#GETIO_PART(ID := #stInOutInterface.hwInCamInspectionResults, //Einlesen IN 64 Byte Daten
OFFSET := 0,
LEN := 64,
STATUS => #tReadIO_Status,
ERROR => #wOutErrorWord.%X5,
INPUTS := #"64Byte_IN_Data");
Chars_TO_Strg(Chars := #"64Byte_IN_Data",
pChars := 8, //Zeichen ab 8.Byte InData
Cnt := 14, //10 Zeichen
Strg => #sBarcodeString);
END_REGION
REGION Evaluation (+ optional check Ascii)
// ok - ASCI Zeichenprüfung 0 = 48 ... 9 = 57
IF NOT #stInSettings.xActivateCheckASCI OR // next Step wenn ASCI Prüfung nicht aktiv
(#"64Byte_IN_Data"[08] >= 48 AND //Prüfung 1. Zeichen auf Zahlen größer/gleich 0
#"64Byte_IN_Data"[08] <= 57 AND //Prüfung 1. Zeichen auf Zahlen kleiner/gleich 9
#"64Byte_IN_Data"[15] >= 48 AND //Prüfung 10. Zeichen auf Zahlen kleiner/gleich 0
#"64Byte_IN_Data"[15] <= 57) //Prüfung 10. Zeichen auf Zahlen kleiner/gleich 9
THEN
REGION SUCCESS
#stStatistics.tLastBarcodeRecv := #tTempLocalTime;
#stStatistics.nReads += 1;
#stStatistics.nGoodRead += 1;
#xCodeGood := TRUE;
#wOutErrorWord.%X3 := FALSE;
REGION Convert to Integer
STRG_VAL(IN := #sBarcodeString, //Barcode nach DWord
FORMAT := w#16#0,
P := 1, //Ab Zeichen 1 bis zu Ungültigem wert umwandeln //
OUT => #nBarcode);
END_REGION
END_REGION
ELSE
REGION FAIL / BAD
#stStatistics.nReads += 1;
#stStatistics.nBadRead += 1;
#stStatistics.tLastNoReadRecv := #tTempLocalTime;
#wOutErrorWord.%X3 := TRUE; // Fehler ASCI Prüfung! zb NoRead von Cam
#xCodeBad := TRUE;
#nBarcode := -1;
#sBarcodeString := 'NO READ'; // NEU
END_REGION
END_IF;
END_REGION
REGION Acknowledge & Transition
//Transition
#stInOutInterface.xOutCamResultsAck := TRUE;
#nState := #"E_DeviceState.eClearResult";
END_REGION
END_IF;
END_REGION
#"E_DeviceState.eClearResult":
REGION STEP 600 - CLEAR RESULT
#stInOutInterface.xOutCamResultsAck := TRUE; //Leseergebnis quittieren
//Transition
IF
NOT #stInOutInterface.xInCamResultsAvailable // Auf Handshake warten
THEN
#nState := #"E_DeviceState.eOutput"; // Nächster Schritt
END_IF;
END_REGION
#"E_DeviceState.eOutput":
REGION STEP 700 - WRITE OUTPUT
#xOutReadyForNewScan := FALSE;
#stInOutInterface.xOutCamTriggerEnable := FALSE; // Freigabe wegnehmen
#stInOutInterface.xOutCamTrigger := FALSE;
#nOutBarcode := #nBarcode;
#sOutBarcode := #sBarcodeString;
#xOutReadingDone := TRUE;
//Transition
#nState := #"E_DeviceState.eHandshake";
END_REGION
#"E_DeviceState.eHandshake":
REGION STEP 800 - HANDSHAKE
#xOutReadyForNewScan := FALSE;
#xOutReadingDone := TRUE;
#stInOutInterface.xOutCamTriggerEnable := FALSE; // Freigabe wegnehmen
#stInOutInterface.xOutCamTrigger := FALSE;
IF #xInHandshakeDone THEN // Handshake
#nState := #"E_DeviceState.eNoJob";
END_IF;
END_REGION
ELSE //keine gültige Schrittnummer vorhanden
#wOutErrorWord.%X0 := true;
END_CASE;
REGION Step history
IF
#nState <> #nLastStep
THEN
#t_Status := MOVE_BLK_VARIANT(SRC := #arStepHistory,
COUNT := 10,
SRC_INDEX := 0,
DEST_INDEX := 1,
DEST => #arStepHistory);
#t_Status := RD_LOC_T(#arStepHistory[0].TimeStamp); //Zeitstempel
#arStepHistory[0].StepNum := #nState;
#nLastStep := #nState;
END_IF;
END_REGION
END_REGION
REGION Output
#xOutCodeGood := #xCodeGood;
#xOutCodeBad := #xCodeBad;
END_REGION
REGION Runtime monitoring
IF #tOnMonitoring.Q THEN // TIMEOUT
#stStatistics.nReads += 1;
#stStatistics.nBadRead += 1;
#stStatistics.tLastNoReadRecv := #tTempLocalTime;
#xCodeBad := TRUE;
#wOutErrorWord.%X2 := TRUE; // Runtime failure
#nBarcode := -1;
#sBarcodeString := 'NO-READ';
#nState := #"E_DeviceState.eOutput";
END_IF;
END_REGION
REGION HMI / Visu
#stHMI.In16.%X0 := #stInOutInterface.xInCamTriggerReady;
#stHMI.In16.%X1 := #stInOutInterface.xInCamTriggerAck;
#stHMI.In16.%X2 := #stInOutInterface.xInCamResultsAvailable;
#stHMI.In16.%X3 := #stInOutInterface.xInCamGeneralFault;
#stHMI.BarcodeString := #sBarcodeString;
#stHMI.Barcode := #nBarcode;
#stHMI.ResultID := #nResultID;
#stHMI.ErrorWord := #wOutErrorWord;
IF #stInOutInterface.xInCamGeneralFault OR #xInHWError THEN // Kamera nicht bereit
#stInOutHMI.bStatus := 2; // ERROR
ELSE
CASE #nState OF
#"E_DeviceState.eInit1", #"E_DeviceState.eInit2":
#stInOutHMI.bStatus := 0; // NOT_AVAILABLE
#"E_DeviceState.eNoJob", #"E_DeviceState.eWaitReaderReady", #"E_DeviceState.eWaitTriggerAck",
#"E_DeviceState.eGetResult", #"E_DeviceState.eClearResult", #"E_DeviceState.eOutput",
#"E_DeviceState.eHandshake":
#stInOutHMI.bStatus := 1; // AVAILABLE
ELSE //Fallback
#stInOutHMI.bStatus := 0; // NOT AVAILABLE
END_CASE;
END_IF;
#stInOutHMI.nMode := 2; // Continuous
#stInOutHMI.stBRInterface := #stHMI;
#stInOutHMI.nNumberScans := #stStatistics.nReads;
#stInOutHMI.nNumberNoReads := #stStatistics.nBadRead;
#stInOutHMI.nNoReadPercentage := REAL_TO_USINT((UDINT_TO_REAL(#stStatistics.nBadRead) / UDINT_TO_REAL(#stStatistics.nReads)) * 100);
#stInOutHMI.tLastBarcodeRecv := #stStatistics.tLastBarcodeRecv;
#stInOutHMI.tLastNoReadRecv := #stStatistics.tLastNoReadRecv;
#stInOutHMI.tLastReset := #stStatistics.tLastReset;
END_REGION
REGION Timer
#tOnMonitoring(IN := #stInOutInterface.xOutCamTriggerEnable,
PT := #stInSettings.tTimeout);
END_REGION
REGION Monitoring
#fbMonitoringCamRuntimeFail.stSettings.nErrorType := 2;
#fbMonitoringCamRuntimeFail.stSettings.xErrLedIfMachineIsOff := TRUE;
#fbMonitoringCamRuntimeFail.stSettings.xSelfQuit := TRUE;
#fbMonitoringCamRuntimeFail(sInFctnName := CONCAT_STRING(IN1:='Barcode Reader: ', IN2:= #stInOutHMI.sLocation),
sInPrefix := #stInOutHMI.sUnit,
sInSuffix := #stInOutHMI.sIpAdress,
InOutMachineState := #stInOutControlUnitCabinet,
xInQuitError := #stInOutControlUnitCabinet.xQuitError,
xInSignal := NOT #tOnMonitoring.Q,
sInAlarmMessage := 'Laufzeitfehler',
wInTextListId_Function := 1,
wInTextListId_Message := 1);
#fbMonitoringCamGeneralFault.stSettings.nErrorType := 1;
#fbMonitoringCamGeneralFault.stSettings.xErrLedIfMachineIsOff := TRUE;
#fbMonitoringCamGeneralFault.stSettings.xSelfQuit := TRUE;
#fbMonitoringCamGeneralFault(sInFctnName := CONCAT_STRING(IN1:='Barcode Reader: ', IN2:= #stInOutHMI.sLocation),
sInPrefix := #stInOutHMI.sUnit,
sInSuffix := #stInOutHMI.sIpAdress,
InOutMachineState := #stInOutControlUnitCabinet,
xInQuitError := #stInOutControlUnitCabinet.xQuitError,
xInSignal := NOT #stInOutInterface.xInCamGeneralFault AND NOT #xInHWError,
sInAlarmMessage := 'Barcode Reader ist nicht bereit.',
wInTextListId_Function := 1,
wInTextListId_Message := 1);
END_REGION
REGION Event Log
// Pro Event wird ein Aufruf benötigt
//TODO
END_REGION
END_FUNCTION_BLOCK
@@ -0,0 +1,8 @@
LibraryType:
Guid: 05646a02-da52-45d6-8bda-9aae3887a902
Comment:
de-DE: HMI Barcode Reader Interface
LibraryVersion:
VersionNumber: 2.0.1
Author: e.yueksel
IsDefault: true
@@ -0,0 +1,9 @@
DocumentHash:
- FileName: UDT_BarcodeReader.xml
Hash: qvIBnqvITx1xwHE9SSsLnWLseRNEbya8p0X1zJHLLQ8=
LibraryMetaFileHash: +m3hhiCBCcwveV1S82lVQ8/koMYibJlthp0wtBAmKaE=
LibraryVersion:
Guid: 938eb73b-d543-45c9-93b1-e09754c1416f
DependsOn:
- TypeName: stHMI_BRCognexDM
VersionNumber: 2.0.0
@@ -0,0 +1,135 @@
<?xml version="1.0" encoding="utf-8"?>
<Document>
<Engineering version="V20" />
<SW.Types.PlcStruct ID="0">
<AttributeList>
<Interface><Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v5">
<Section Name="None">
<Member Name="bStatus" Datatype="Byte">
<Comment>
<MultiLanguageText Lang="de-DE">Standardized status</MultiLanguageText>
</Comment>
</Member>
<Member Name="nMode" Datatype="Int">
<Comment>
<MultiLanguageText Lang="de-DE">Kamera Triggermodus (Single, Continuous...)</MultiLanguageText>
</Comment>
</Member>
<Member Name="nInternalNumber" Datatype="USInt">
<Comment>
<MultiLanguageText Lang="de-DE">Interne Nummerierung</MultiLanguageText>
</Comment>
</Member>
<Member Name="sUnit" Datatype="String[20]">
<Comment>
<MultiLanguageText Lang="de-DE">Kamera Bezeichnung (z.B. DM262-9FC5D4)</MultiLanguageText>
</Comment>
</Member>
<Member Name="sLocation" Datatype="String[30]">
<Comment>
<MultiLanguageText Lang="de-DE">Standort</MultiLanguageText>
</Comment>
</Member>
<Member Name="sIpAdress" Datatype="String[20]">
<Comment>
<MultiLanguageText Lang="de-DE">IP-Adresse</MultiLanguageText>
</Comment>
</Member>
<Member Name="rThreshold" Datatype="Real">
<Comment>
<MultiLanguageText Lang="de-DE">Schwellwert um die Lesequalität zu bewerten (z.B. 99 [%])</MultiLanguageText>
</Comment>
</Member>
<Member Name="stBRInterface" Datatype="&quot;stHMI_BRCognexDM&quot;">
<Comment>
<MultiLanguageText Lang="de-DE">Schnittstelle Kamera Baustein</MultiLanguageText>
</Comment>
</Member>
<Member Name="nNumberScans" Datatype="UDInt">
<Comment>
<MultiLanguageText Lang="de-DE">Anzahl Scans</MultiLanguageText>
</Comment>
</Member>
<Member Name="nNumberNoReads" Datatype="UDInt">
<Comment>
<MultiLanguageText Lang="de-DE">Anzahl No-Read</MultiLanguageText>
</Comment>
</Member>
<Member Name="nNoReadPercentage" Datatype="USInt">
<Comment>
<MultiLanguageText Lang="de-DE">No-Read in Prozent</MultiLanguageText>
</Comment>
</Member>
<Member Name="tLastBarcodeRecv" Datatype="DTL" Version="1.0">
<Comment>
<MultiLanguageText Lang="de-DE">Letzter Barcode empfangen </MultiLanguageText>
</Comment>
</Member>
<Member Name="tLastNoReadRecv" Datatype="DTL" Version="1.0">
<Comment>
<MultiLanguageText Lang="de-DE">Letzter No-Read empfangen </MultiLanguageText>
</Comment>
</Member>
<Member Name="tLastReset" Datatype="DTL" Version="1.0">
<Comment>
<MultiLanguageText Lang="de-DE">Letzter Reset</MultiLanguageText>
</Comment>
</Member>
<Member Name="xResetStatistics" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Alle Statistiken rücksetzen</MultiLanguageText>
</Comment>
</Member>
</Section>
</Sections></Interface>
<Name>UDT_BarcodeReader</Name>
<Namespace />
</AttributeList>
<ObjectList>
<MultilingualText ID="1" CompositionName="Comment">
<ObjectList>
<MultilingualTextItem ID="2" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
<MultilingualTextItem ID="3" CompositionName="Items">
<AttributeList>
<Culture>en-US</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
<MultilingualTextItem ID="4" CompositionName="Items">
<AttributeList>
<Culture>cs-CZ</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
<MultilingualText ID="5" CompositionName="Title">
<ObjectList>
<MultilingualTextItem ID="6" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
<MultilingualTextItem ID="7" CompositionName="Items">
<AttributeList>
<Culture>en-US</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
<MultilingualTextItem ID="8" CompositionName="Items">
<AttributeList>
<Culture>cs-CZ</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
</ObjectList>
</SW.Types.PlcStruct>
</Document>
@@ -0,0 +1,12 @@
LibraryType:
Guid: 9cd149c5-120a-4c6b-b374-72d0804fee13
Comment:
de-DE: Schrittkette optimiert, bisher fehlende Ausgänge werden jetzt beschrieben
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: |-
Einstellungen für Barcode-Reader
Freigegeben für IBN (EY, 22.04.2025)
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: UDT_SettingsBarcodeReader.xml
Hash: WIqXsAFeE/opnVa20/ZCVUkon6tOnniE9KMUlnjvY2Y=
LibraryMetaFileHash: OTpcVojAkzlEEy/DPvJe96WcLeEDZJvnkXLUgt3MvdA=
LibraryVersion:
Guid: 6be7977f-bd26-4a22-a946-663b8c2af2c1
@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<Document>
<Engineering version="V20" />
<SW.Types.PlcStruct ID="0">
<AttributeList>
<Interface><Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v5">
<Section Name="None">
<Member Name="nStation" Datatype="Int">
<Comment>
<MultiLanguageText Lang="de-DE">Nummer</MultiLanguageText>
</Comment>
</Member>
<Member Name="nScannerPurpose" Datatype="USInt">
<Comment>
<MultiLanguageText Lang="de-DE">Leser Aufgabe (Trolley Barcode, Teil Barcode...)</MultiLanguageText>
</Comment>
</Member>
<Member Name="xActivateCheckASCI" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">ASCI Prüfung aktiveren</MultiLanguageText>
</Comment>
<StartValue>true</StartValue>
</Member>
<Member Name="tTimeout" Datatype="Time">
<Comment>
<MultiLanguageText Lang="de-DE">Timeout Lesung</MultiLanguageText>
</Comment>
<StartValue>T#5s</StartValue>
</Member>
</Section>
</Sections></Interface>
<Name>UDT_SettingsBarcodeReader</Name>
<Namespace />
</AttributeList>
<ObjectList>
<MultilingualText ID="1" CompositionName="Comment">
<ObjectList>
<MultilingualTextItem ID="2" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
<MultilingualText ID="3" CompositionName="Title">
<ObjectList>
<MultilingualTextItem ID="4" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
</ObjectList>
</SW.Types.PlcStruct>
</Document>
@@ -0,0 +1,12 @@
LibraryType:
Guid: 522f83ce-0f0f-4b78-ad1b-5bd95073250a
Comment:
de-DE: Cognex PROFINET Interface
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: |-
Cognex PROFINET Interface
Freigegeben für IBN (EY, 22.04.2025)
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: stCognexInterface.xml
Hash: J+LAf7w1glPlo9Ow1PIqSnnM5HGz4UPc30sj3AR/oKU=
LibraryMetaFileHash: XheQv51sz6RtFuNhNKVf2R1rrw7mGvCKbif6zVxhlPM=
LibraryVersion:
Guid: fd4fcb5f-2541-42a7-b6e0-a0e94d47950e
@@ -0,0 +1,87 @@
<?xml version="1.0" encoding="utf-8"?>
<Document>
<Engineering version="V20" />
<SW.Types.PlcStruct ID="0">
<AttributeList>
<Interface><Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v5">
<Section Name="None">
<Member Name="xInCamTriggerReady" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Cognex Acquisition Status Module</MultiLanguageText>
</Comment>
</Member>
<Member Name="xInCamTriggerAck" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Cognex Acquisition Status Module</MultiLanguageText>
</Comment>
</Member>
<Member Name="xInCamResultsAvailable" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Cognex Results Status Module</MultiLanguageText>
</Comment>
</Member>
<Member Name="xInCamGeneralFault" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Cognex Results Status Module</MultiLanguageText>
</Comment>
</Member>
<Member Name="wInCamResultID" Datatype="Word">
<Comment>
<MultiLanguageText Lang="de-DE">Cognex Result Data Module</MultiLanguageText>
</Comment>
</Member>
<Member Name="wInCamResultCode" Datatype="Word">
<Comment>
<MultiLanguageText Lang="de-DE">Cognex Result Data Module</MultiLanguageText>
</Comment>
</Member>
<Member Name="wInCamResultExtended" Datatype="Word">
<Comment>
<MultiLanguageText Lang="de-DE">Cognex Result Data Module</MultiLanguageText>
</Comment>
</Member>
<Member Name="hwInCamInspectionResults" Datatype="HW_SUBMODULE" />
<Member Name="xOutCamTriggerEnable" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Cognex Acquisition Control Module</MultiLanguageText>
</Comment>
</Member>
<Member Name="xOutCamTrigger" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Cogenx Acquisition Control Module</MultiLanguageText>
</Comment>
</Member>
<Member Name="xOutCamResultsAck" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Cognex Results Control Module</MultiLanguageText>
</Comment>
</Member>
</Section>
</Sections></Interface>
<Name>stCognexInterface</Name>
<Namespace />
</AttributeList>
<ObjectList>
<MultilingualText ID="1" CompositionName="Comment">
<ObjectList>
<MultilingualTextItem ID="2" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
<MultilingualText ID="3" CompositionName="Title">
<ObjectList>
<MultilingualTextItem ID="4" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
</ObjectList>
</SW.Types.PlcStruct>
</Document>
@@ -0,0 +1,12 @@
LibraryType:
Guid: ba76061d-44fd-44db-918c-8781346850fc
Comment:
de-DE: Cognex Barcode Reader HMI Interface
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: |-
Cognex Barcode Reader HMI Interface
Freigegeben für IBN (22.04.2025)
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: stHMI_BRCognexDM.xml
Hash: r2yXtsMPR1tYYayK89wCaBfoYnfvbcC8U08Pmqz3ghQ=
LibraryMetaFileHash: 2QmCAfK/VMBYGEhHb3XXb2Mlozb9v/F06igsbe8CqUI=
LibraryVersion:
Guid: 4292f22b-ef2b-4a96-8038-d15fd7be6b5a
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<Document>
<Engineering version="V20" />
<SW.Types.PlcStruct ID="0">
<AttributeList>
<Interface><Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v5">
<Section Name="None">
<Member Name="In16" Datatype="Word" />
<Member Name="Out16" Datatype="Word" />
<Member Name="Barcode" Datatype="LInt" />
<Member Name="BarcodeString" Datatype="String" />
<Member Name="ResultID" Datatype="Int" />
<Member Name="ErrorWord" Datatype="Word" />
</Section>
</Sections></Interface>
<Name>stHMI_BRCognexDM</Name>
<Namespace />
</AttributeList>
<ObjectList>
<MultilingualText ID="1" CompositionName="Comment">
<ObjectList>
<MultilingualTextItem ID="2" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
<MultilingualText ID="3" CompositionName="Title">
<ObjectList>
<MultilingualTextItem ID="4" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
</ObjectList>
</SW.Types.PlcStruct>
</Document>
@@ -0,0 +1,14 @@
LibraryType:
Guid: ff362ef5-3706-4678-9b8f-9b5edec9d6cc
Comment:
de-DE: Encoder TR
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: |-
CHANGED: Angleich an ILS Testversion (Stand: 03.02.2025)
CHANGED: Globale Konstante "cEncoderScaling" gegen lokale Konstante getauscht
Freigegeben für IBN (EY, 22.04.2025)
@@ -0,0 +1,9 @@
DocumentHash:
- FileName: FB_EncoderTR.scl
Hash: lAU38Ds+TsapS+ZQ4p5ClovY85o6+dj/r4TM8y2vS/4=
LibraryMetaFileHash: QwiMrqRTP+HgutRyzKwkQFevBlA6qZIO3E9CXAnzj0g=
LibraryVersion:
Guid: 46ef14f8-3462-4511-aec5-4139a799256f
DependsOn:
- TypeName: UDT_Sensor
VersionNumber: 2.0.0
@@ -0,0 +1,197 @@
FUNCTION_BLOCK "FB_EncoderTR"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
nInPosAct : DInt;
xInPresetAdjQuit : Bool;
xInPresetAdjSet : Bool;
nInPresetAdjSetValue : DInt; // Abweichung in mm
nInPitch : DInt := 254;
nInEncoderMax : DInt;
nInHooksSorterMax : DInt;
stInSensorReference { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "UDT_Sensor";
END_VAR
VAR_OUTPUT
xOutPresetAdjSet : Bool;
nOutPresetAdjSetValue : DInt;
nOutPosAct : DInt;
nOutPosActDif : DInt;
bOutReferenced : Bool;
nOutPosPitch : DInt;
nOutPosPitchDif : DInt;
nOutPosPitchPart : DInt; // Skaliert [0-100]%
END_VAR
VAR
arIncremente : Array[0..40] of DInt;
nPos : Int;
xSensorFlag : Bool;
nStateAdjustment : Int;
nPosActDif { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt;
nPosPitchDif : DInt;
nPosAct : DInt;
nPosPitchAct : DInt;
nTest : Array[0..40] of DInt;
nPosPitchPart : DInt;
END_VAR
VAR CONSTANT
cReferenceValue : DInt;
cEncoderScaling : DInt := 100; // Scalierung des Encoders pro Teilung
END_VAR
BEGIN
REGION GeberParameter
(*
Einstellungen für Pinband ILS Testanlage
Anzahl Taschen: 54 Stück (länge des Bandes)
Durchmesser: 278mm
Kettenteilung (pro Tasche): 250mm
Eingabe im Geber:
Gesamtmesslänge = 13500 (Bandteilung * Anzahl Taschen)
Umdrehungen Zähler = 154575
Umdrehungen Nenner = 10000
-> PosAct = Position in mm
Einstellungen für Fingerband ILS Testanlage
Anzahl Taschen: 26 Stück (länge der Kette)
Kettenrad: 17 Zähne
Kettenteilung (pro Tasche): 254mm
Kettenglieder pro Tasche: 32 Stück
Eingabe im Geber:
Gesamtmesslänge = 6604 (Kettenteilung * Anzahl Taschen)
Umdrehungen Zähler = 244706 (Anzahl Taschen * Kettenglieder pro Tasche)
Umdrehungen Nenner = 10000 (Kettenrad)
-> PosAct = Position in mm
*)
END_REGION
REGION Adjustment
CASE #nStateAdjustment OF
0: // Undefined
#bOutReferenced := 0;
#nStateAdjustment := 10;
10: // Wait for Reference Sensor 1st Time
IF #stInSensorReference.xDirectEdgePos THEN
#nStateAdjustment := 15;
END_IF;
15: // Wait for Reference Sensor 2nd Time
IF #stInSensorReference.xDirectEdgePos THEN
#nStateAdjustment := 20;
#xOutPresetAdjSet := 1;
IF #xInPresetAdjSet THEN
#nOutPresetAdjSetValue := #nInPresetAdjSetValue;
ELSE
#nOutPresetAdjSetValue := #cReferenceValue;
END_IF;
END_IF;
20: // Wait for Quit
#xOutPresetAdjSet := 1;
IF #xInPresetAdjSet THEN
#nOutPresetAdjSetValue := #nInPresetAdjSetValue;
ELSE
#nOutPresetAdjSetValue := #cReferenceValue;
END_IF;
IF #xInPresetAdjQuit THEN
#xOutPresetAdjSet := 0;
#nStateAdjustment := 30;
END_IF;
30: // Wait for Reset the #xInPresetAdjSet Input
IF NOT #xInPresetAdjSet THEN
#nStateAdjustment := 100;
#nTest[1] := 0;
END_IF;
100: // First Refernce Set
#bOutReferenced := 1;
IF #xInPresetAdjSet THEN
#nStateAdjustment := 0;
END_IF;
END_CASE;
END_REGION
REGION Positionsänderung ermitteln
#nPosActDif := #nInPosAct - #nPosAct;
IF (#nInPosAct < #nPosAct) AND // Wenn die neue Position kleiner ist als der alte Wert
ABS(#nPosActDif) > (#nInEncoderMax / 2) THEN // Und die differenz Größer als die Hälfte des Encoderendwertes
#nPosActDif := #nInEncoderMax - #nPosAct;
#nPosActDif += #nInPosAct;
#nPosAct := #nInPosAct;
ELSIF #nPosActDif > 0 THEN
#nPosAct := #nInPosAct;
ELSE
#nPosActDif := 0;
#nPosAct := #nInPosAct;
END_IF;
(*
IF #nPosActDif > 0 THEN
#nPosAct := #nInPosAct;
ELSIF ABS(#nPosActDif) > ("cEncoderMax" / 2) THEN
#nPosActDif := "cEncoderMax" - #nPosAct;
#nPosActDif += #nInPosAct;
#nPosAct := #nInPosAct;
ELSE
#nPosActDif := 0;
#nPosAct := #nInPosAct;
END_IF;
*)
END_REGION
REGION Pitch
#nOutPosPitch := #nInPosAct / #nInPitch; // Taschennummer nach Encoder
//#nOutPosPitchPart := REAL_TO_DINT(((#nInPosAct MOD #nInPitch)));
//TEST MOLINA ANFANG
#nOutPosPitchPart := (#"cEncoderScaling" * (#nInPosAct MOD #nInPitch)) / #nInPitch; // Skalierter Restwert Taschenzwischenschritt
//TEST MOLINA ENDE
#nPosPitchDif := #nOutPosPitch - #nPosPitchAct;
IF ABS(#nPosPitchDif) > (#nInHooksSorterMax / 2) THEN
#nPosPitchDif := #nInHooksSorterMax - #nPosPitchAct;
#nPosPitchDif += #nOutPosPitch;
#nPosPitchAct := #nOutPosPitch;
ELSIF #nPosPitchDif > 0 THEN
#nPosPitchAct := #nOutPosPitch;
ELSE
#nPosPitchDif := 0;
#nPosPitchAct := #nOutPosPitch;
END_IF;
END_REGION
REGION Outputs
IF #nStateAdjustment = 100 THEN
#nOutPosAct := #nInPosAct;
END_IF;
#nOutPosActDif := #nPosActDif;
#nOutPosPitchDif := #nPosPitchDif;
#nTest[0] += #nPosPitchDif;
IF #stInSensorReference.xDirectEdgePos THEN
#nTest[1] += 1;
END_IF;
END_REGION
REGION Statistic
#arIncremente[#nPos] += #nPosActDif;
IF #stInSensorReference.xDirectEdgePos THEN
(*
#nPosActDif := #nInPosAct - #nPosAct;
IF #nPosActDif > 0 THEN
#nPosAct := #nInPosAct;
ELSIF ABS(#nPosActDif) > ("cEncoderMax" / 2) THEN
#nPosActDif := "cEncoderMax" - #nPosAct;
#nPosActDif += #nInPosAct;
#nPosAct := #nInPosAct;
ELSE
#nPosActDif := 0;
#nPosAct := #nInPosAct;
END_IF;
*)
#nPos += 1;
IF #nPos > 40 THEN
#nPos := 0;
END_IF;
END_IF;
END_REGION
END_FUNCTION_BLOCK
@@ -0,0 +1,10 @@
LibraryType:
Guid: a35365d7-dff1-4ac5-9689-8750d7467e8e
Comment:
de-DE: Sensor Interface (Flanken, Stau etc.)
LibraryVersion:
VersionNumber: 2.0.3
Author: e.yueksel
IsDefault: true
Comment:
de-DE: aktualisiert wegen unterlagerter Änderung
@@ -0,0 +1,15 @@
DocumentHash:
- FileName: FB_SensorInput.scl
Hash: AlAVLvJXtSwVO/JfArSvLoOOdNN4MVw9gFmg6QucV+M=
LibraryMetaFileHash: CyRGpaSqwJewa6ic6V5dGHgKYoRJ9vxuiRUgbTHGAhs=
LibraryVersion:
Guid: b1b8d1e1-2be4-46f5-8e3b-08cc20f9ff04
DependsOn:
- TypeName: FB_Monitoring
VersionNumber: 2.0.5
- TypeName: UDT_Sensor
VersionNumber: 2.0.0
- TypeName: UDT_HMI_Sensor
VersionNumber: 2.0.0
- TypeName: UDT_MainState
VersionNumber: 2.0.0
@@ -0,0 +1,183 @@
FUNCTION_BLOCK "FB_SensorInput"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
sInFctName : String[10]; // Sensor Funktion (z.B. Stau)
sInName : String[10]; // Sensor BMK
xInSensor : Bool;
tInDelay : Time := T#150ms;
tInFlicker : Time := T#20ms;
tInJamR : Time := T#3000ms;
tInJamF : Time := T#2000ms;
tInSenFreeShort : Time := T#4000ms;
tInSenFreeLong : Time := T#7000ms;
xInMonitorJam : Bool;
END_VAR
VAR_OUTPUT
xOutFlickerError : Bool;
xOutJam : Bool;
xOutFreeShort : Bool;
xOutFreeLong : Bool;
nOutCntFlicker : Int;
END_VAR
VAR_IN_OUT
stInOutSensor : "UDT_Sensor";
stInOutHMI : "UDT_HMI_Sensor";
stInOutControlUnitCabinet : "UDT_MainState";
END_VAR
VAR
tOnNoSensorChange {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
nCntFlickerPos : Int;
nCntFlickerNeg : Int;
xSensorFlag : Bool;
xSensorDbncdFlag : Bool;
xSensorDbncd { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
nActualDay : USInt;
xJam : Bool;
fbMonitoringJam : "FB_Monitoring";
END_VAR
VAR_TEMP
tSensor : Bool;
tDebug : Int;
END_VAR
BEGIN
// ------------------------------------------------
// GLOBAL INFORMATION - do before other FB calls
// ------------------------------------------------
REGION read inputs
#tSensor := (NOT #stInOutHMI.stSensorControl.xControlWithHMI AND #xInSensor) OR
(#stInOutHMI.stSensorControl.xControlWithHMI AND #stInOutHMI.stSensorControl.xSensor);
END_REGION
REGION logic
#stInOutSensor.xDirectSensor := #tSensor;
#stInOutSensor.xDirectEdgePos := #tSensor AND NOT #xSensorFlag AND NOT "FirstScan";
#stInOutSensor.xDirectEdgeNeg := NOT #tSensor AND #xSensorFlag AND NOT "FirstScan";
IF #tSensor AND
((#xSensorFlag = #tSensor AND #tOnNoSensorChange.ET >= #tInDelay) OR "FirstScan") THEN
#xSensorDbncd := TRUE;
ELSIF NOT #tSensor AND
((#xSensorFlag = #tSensor AND #tOnNoSensorChange.ET >= #tInDelay) OR "FirstScan") THEN
#xSensorDbncd := FALSE;
END_IF;
#stInOutSensor.xDbncdEdgePos := #xSensorDbncd AND NOT #xSensorDbncdFlag;
#stInOutSensor.xDbncdEdgeNeg := NOT #xSensorDbncd AND #xSensorDbncdFlag;
END_REGION
REGION detect flickering
#xOutFlickerError := FALSE;
IF #tSensor AND NOT #xSensorFlag AND //ging kurzzeitig auf 0
#tOnNoSensorChange.ET <= #tInFlicker AND
NOT #stInOutHMI.stSensorControl.xControlWithHMI THEN
#xOutFlickerError := TRUE;
#nCntFlickerNeg += 1;
ELSIF
NOT #tSensor AND #xSensorFlag AND // geht kurzzeitig auf 1
#tOnNoSensorChange.ET <= #tInFlicker AND
NOT #stInOutHMI.stSensorControl.xControlWithHMI THEN
#xOutFlickerError := TRUE;
#nCntFlickerPos += 1;
END_IF;
(* // Am Ende des Tages die Zähler zurücksetzten
IF "DB_MachineGlobal".DTL_TimePLC.DAY <> #nActualDay THEN
#nActualDay := "DB_MachineGlobal".DTL_TimePLC.DAY;
#nCntFlickerNeg := 0;
#nCntFlickerPos := 0;
END_IF; *)
END_REGION
REGION timer
#tOnNoSensorChange(IN := (#tSensor = #xSensorFlag),
PT := T#10000S);
END_REGION
REGION flags
#xSensorFlag := #tSensor;
#xSensorDbncdFlag := #xSensorDbncd;
END_REGION
REGION detect jam signal
IF #tSensor AND #tOnNoSensorChange.ET > #tInJamR THEN
#xJam := TRUE;
ELSIF NOT #tSensor AND #tOnNoSensorChange.ET > #tInJamF THEN
#xJam := FALSE;
END_IF;
END_REGION
REGION detect if sensor is false for period of time
IF NOT #tSensor AND #tOnNoSensorChange.ET > #tInSenFreeShort THEN
#xOutFreeShort := TRUE;
ELSE
#xOutFreeShort := FALSE;
END_IF;
IF NOT #tSensor AND #tOnNoSensorChange.ET > #tInSenFreeLong THEN
#xOutFreeLong := TRUE;
ELSE
#xOutFreeLong := FALSE;
END_IF;
END_REGION ;
REGION write outputs
#xOutJam := #xJam;
#stInOutSensor.xDbncdSensor := #xSensorDbncd;
#stInOutSensor.sName := #sInName;
#stInOutSensor.xJam := #xJam;
IF #tOnNoSensorChange.ET >= #tInDelay THEN //
#stInOutSensor.tDirectChangeLast := #tOnNoSensorChange.ET;
ELSE
#stInOutSensor.tDirectChangeLast := T#0s;
END_IF;
#nOutCntFlicker := #nCntFlickerNeg + #nCntFlickerPos;
END_REGION
REGION HMI interface
#stInOutHMI.stSensorStatus.sName := #sInName;
#stInOutHMI.stSensorStatus.xDirectSensor := #tSensor;
#stInOutHMI.stSensorStatus.xDirectEdgePos := #tSensor AND NOT #xSensorFlag AND NOT "FirstScan";
#stInOutHMI.stSensorStatus.xDirectEdgeNeg := NOT #tSensor AND #xSensorFlag AND NOT "FirstScan";
IF #tOnNoSensorChange.ET >= #tInDelay THEN
#stInOutHMI.stSensorStatus.tDirectChangeLast := #tOnNoSensorChange.ET;
ELSE
#stInOutHMI.stSensorStatus.tDirectChangeLast := T#0s;
END_IF;
#stInOutHMI.stSensorStatus.xDbncdSensor := #xSensorDbncd;
#stInOutHMI.stSensorStatus.xDbncdEdgePos := #xSensorDbncd AND NOT #xSensorDbncdFlag;
#stInOutHMI.stSensorStatus.xDbncdEdgeNeg := NOT #xSensorDbncd AND #xSensorDbncdFlag;
#stInOutHMI.stSensorStatus.xJam := #xJam;
END_REGION
REGION monitoring jam
#fbMonitoringJam.stSettings.nErrorType := 1;
#fbMonitoringJam.stSettings.xErrLedIfMachineIsOff := TRUE;
#fbMonitoringJam.stSettings.xSelfQuit := TRUE;
#fbMonitoringJam.stSettings.tDelay := T#1s;
#fbMonitoringJam(sInFctnName := 'Stauueberwachung',
sInPrefix := #sInFctName,
sInAlarmMessage := 'Sensor meldet Stau',
sInSuffix := #sInName,
wInTextListId_Message := 2,
InOutMachineState := #stInOutControlUnitCabinet,
xInSignal := (NOT #xJam) OR NOT #xInMonitorJam);
END_REGION
END_FUNCTION_BLOCK
@@ -0,0 +1,11 @@
LibraryType:
Guid: 7dd56464-1b63-4d64-b2d7-887bdb82e393
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: |-
HMI Schnittstelle Sensor gesamt
Freigegeben für IBN (EY, 22.04.2025)
@@ -0,0 +1,13 @@
DocumentHash:
- FileName: UDT_HMI_Sensor.xml
Hash: pdpSaxLHHvmtFPis2kxAHCIGbaHxTFdN8tJtZWBViZ0=
LibraryMetaFileHash: pjTVRyZilhDWD1G0TlCpop0/Hr20FaE5CeWAuYTlLsQ=
LibraryVersion:
Guid: b57e71d3-bb28-42e3-98c8-056af10bfdcb
DependsOn:
- TypeName: UDT_Sensor
VersionNumber: 2.0.0
- TypeName: UDT_HMI_Sensor_Config
VersionNumber: 2.0.0
- TypeName: UDT_HMI_Sensor_Control
VersionNumber: 2.0.0
@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<Document>
<Engineering version="V20" />
<SW.Types.PlcStruct ID="0">
<AttributeList>
<Interface><Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v5">
<Section Name="None">
<Member Name="stSensorStatus" Datatype="&quot;UDT_Sensor&quot;">
<AttributeList>
<BooleanAttribute Name="SetPoint" SystemDefined="true">true</BooleanAttribute>
</AttributeList>
</Member>
<Member Name="stSensorConfig" Datatype="&quot;UDT_HMI_SensorConfig&quot;">
<AttributeList>
<BooleanAttribute Name="SetPoint" SystemDefined="true">true</BooleanAttribute>
</AttributeList>
</Member>
<Member Name="stSensorControl" Datatype="&quot;UDT_HMI_SensorCtrl&quot;">
<AttributeList>
<BooleanAttribute Name="SetPoint" SystemDefined="true">true</BooleanAttribute>
</AttributeList>
</Member>
</Section>
</Sections></Interface>
<Name>UDT_HMI_Sensor</Name>
<Namespace />
</AttributeList>
<ObjectList>
<MultilingualText ID="1" CompositionName="Comment">
<ObjectList>
<MultilingualTextItem ID="2" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
<MultilingualText ID="3" CompositionName="Title">
<ObjectList>
<MultilingualTextItem ID="4" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
</ObjectList>
</SW.Types.PlcStruct>
</Document>
@@ -0,0 +1,11 @@
LibraryType:
Guid: 50f6123e-5cf5-451c-991a-e3b8c4fc53e6
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: |-
HMI: Sensor Konfiguration
Freigegeben für IBN (EY, 22.04.2025)
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: UDT_HMI_Sensor_Config.xml
Hash: qVtFL7MkmbLJxHZ7EimCYQhPUE1d68oJJe/I6gMX/4A=
LibraryMetaFileHash: mDWR4ZOzDreembK/g+lNYKUCuVdT/bM6lH3CjStr054=
LibraryVersion:
Guid: e4319c82-04b6-4bf6-856a-f001cb82348c
@@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<Document>
<Engineering version="V20" />
<SW.Types.PlcStruct ID="0">
<AttributeList>
<Interface><Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v5">
<Section Name="None">
<Member Name="tDelay" Datatype="Time">
<Comment>
<MultiLanguageText Lang="de-DE">Entprellzeit für Debounced</MultiLanguageText>
</Comment>
</Member>
<Member Name="tFlicker" Datatype="Time">
<Comment>
<MultiLanguageText Lang="de-DE">Zeit die als "Flackern" eingestuft wird</MultiLanguageText>
</Comment>
</Member>
<Member Name="tJamR" Datatype="Time">
<Comment>
<MultiLanguageText Lang="de-DE">Zeit bis Stau steigende Flanke</MultiLanguageText>
</Comment>
</Member>
<Member Name="tJamF" Datatype="Time">
<Comment>
<MultiLanguageText Lang="de-DE">Zeit bis Stau fallende Flanke</MultiLanguageText>
</Comment>
</Member>
<Member Name="tSenFreeShort" Datatype="Time">
<Comment>
<MultiLanguageText Lang="de-DE">Sensor seit Zeit x frei (Zeit 1, kurz)</MultiLanguageText>
</Comment>
</Member>
<Member Name="tSenFreeLong" Datatype="Time">
<Comment>
<MultiLanguageText Lang="de-DE">Sensor seit Ueit x frei (Zeit 2, lang)</MultiLanguageText>
</Comment>
</Member>
</Section>
</Sections></Interface>
<Name>UDT_HMI_Sensor_Config</Name>
<Namespace />
</AttributeList>
<ObjectList>
<MultilingualText ID="1" CompositionName="Comment">
<ObjectList>
<MultilingualTextItem ID="2" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
<MultilingualText ID="3" CompositionName="Title">
<ObjectList>
<MultilingualTextItem ID="4" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
</ObjectList>
</SW.Types.PlcStruct>
</Document>
@@ -0,0 +1,11 @@
LibraryType:
Guid: 09d91f68-6a2d-4805-86d6-9574c935a865
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: |-
HMI: Sensor kontrollieren
Freigegeben für IBN (EY, 22.04.2025)
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: UDT_HMI_Sensor_Control.xml
Hash: bWLPsGarsUcnfdbdiUbARe+Bjt4MWYui0farXKX091w=
LibraryMetaFileHash: 4h5gTdhZdANRu7ObG4Q0GM5Z+gROxsHK6PIhP8+U3KM=
LibraryVersion:
Guid: 0315a473-65a3-42eb-8abe-27c8b0341757
@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<Document>
<Engineering version="V20" />
<SW.Types.PlcStruct ID="0">
<AttributeList>
<Interface><Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v5">
<Section Name="None">
<Member Name="xControlWithHMI" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Sensor per HMI steuern aktivieren</MultiLanguageText>
</Comment>
</Member>
<Member Name="xSensor" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Sensor HMI</MultiLanguageText>
</Comment>
</Member>
</Section>
</Sections></Interface>
<Name>UDT_HMI_Sensor_Control</Name>
<Namespace />
</AttributeList>
<ObjectList>
<MultilingualText ID="1" CompositionName="Comment">
<ObjectList>
<MultilingualTextItem ID="2" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
<MultilingualText ID="3" CompositionName="Title">
<ObjectList>
<MultilingualTextItem ID="4" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
</ObjectList>
</SW.Types.PlcStruct>
</Document>
@@ -0,0 +1,13 @@
LibraryType:
Guid: daf03d56-a8bc-4c33-9e87-b6b4ed277fe3
Comment:
de-DE: 'Anwenderdatentyp für Separator '
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
Comment:
de-DE: |-
Standard Sensor Interface
Freigegeben für IBN (EY, 22.04.2025)
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: UDT_Sensor.xml
Hash: gZqmsqXcGDYJlbUue+QglmkruFD+MU4TdxwktDL+wSM=
LibraryMetaFileHash: fmiqCPUQjv/AmVJlc2IJ0GwWtyG6giYM7RrNeIVaX2Y=
LibraryVersion:
Guid: d053d64c-e366-43e2-bd21-474f5cd34c8f
@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<Document>
<Engineering version="V20" />
<SW.Types.PlcStruct ID="0">
<AttributeList>
<Interface><Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v5">
<Section Name="None">
<Member Name="sName" Datatype="String[10]">
<Comment>
<MultiLanguageText Lang="de-DE">Sensor BMK</MultiLanguageText>
</Comment>
</Member>
<Member Name="xDirectSensor" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Direktes Signal ohne Verarbeitung</MultiLanguageText>
</Comment>
</Member>
<Member Name="xDirectEdgePos" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Positive Flanke</MultiLanguageText>
</Comment>
</Member>
<Member Name="xDirectEdgeNeg" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Negative Flanke</MultiLanguageText>
</Comment>
</Member>
<Member Name="tDirectChangeLast" Datatype="Time">
<Comment>
<MultiLanguageText Lang="de-DE">Zeit seit letzter Änderung Signalwechsel</MultiLanguageText>
</Comment>
</Member>
<Member Name="xDbncdSensor" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Entprelltes Signal</MultiLanguageText>
</Comment>
</Member>
<Member Name="xDbncdEdgePos" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Entprellte positive Flanke</MultiLanguageText>
</Comment>
</Member>
<Member Name="xDbncdEdgeNeg" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Entprellte negative Flanke</MultiLanguageText>
</Comment>
</Member>
<Member Name="xJam" Datatype="Bool">
<Comment>
<MultiLanguageText Lang="de-DE">Stau Indikator</MultiLanguageText>
</Comment>
</Member>
</Section>
</Sections></Interface>
<Name>UDT_Sensor</Name>
<Namespace />
</AttributeList>
<ObjectList>
<MultilingualText ID="1" CompositionName="Comment">
<ObjectList>
<MultilingualTextItem ID="2" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
<MultilingualText ID="3" CompositionName="Title">
<ObjectList>
<MultilingualTextItem ID="4" CompositionName="Items">
<AttributeList>
<Culture>de-DE</Culture>
<Text />
</AttributeList>
</MultilingualTextItem>
</ObjectList>
</MultilingualText>
</ObjectList>
</SW.Types.PlcStruct>
</Document>