ILSLib hinzugefügt
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
LibraryType:
|
||||
Guid: 330e3c73-0c6f-428c-bd04-06e779578b19
|
||||
Comment:
|
||||
de-DE: 'CHNAGED: optimierung sk'
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.0
|
||||
Author: t.molina
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: 'CHANGED: übersetzt'
|
||||
@@ -0,0 +1,13 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_EventLog_Booking.scl
|
||||
Hash: GAon6neSeTmiehUphFkhTmaLaBHrrxX3sBljzfsju0Y=
|
||||
LibraryMetaFileHash: z7G26GfUmp5lBsYs6w3/RCCs3hdtM3iVof8oJMgmOl4=
|
||||
LibraryVersion:
|
||||
Guid: 6e61feb0-b755-46ad-858d-a6af74114a38
|
||||
DependsOn:
|
||||
- TypeName: stEventBookingInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_DateAsString
|
||||
VersionNumber: 0.0.14
|
||||
- TypeName: FC_TimeAsString
|
||||
VersionNumber: 0.0.14
|
||||
@@ -0,0 +1,68 @@
|
||||
FUNCTION_BLOCK "FB_EventLog_Booking"
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
xInTrigger : Bool;
|
||||
stInEventBookingInfo : "stEventBookingInfo";
|
||||
END_VAR
|
||||
|
||||
VAR
|
||||
fbPaEventLogBooking {InstructionName := 'Program_Alarm'; LibVersion := '1.0'} : Program_Alarm;
|
||||
wStatus : Word;
|
||||
sLogMessage : String;
|
||||
sDelimiter : String[1] := ',';
|
||||
sFunction : String[10];
|
||||
xTriggerFlag : Bool;
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
xError : Bool;
|
||||
tRunProgramAlarm : Bool;
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
REGION Call: Program Alarm
|
||||
IF #xTriggerFlag XOR #xInTrigger THEN
|
||||
|
||||
REGION Meldetext
|
||||
#sDelimiter := ';';
|
||||
#sFunction := 'Umbuchung';
|
||||
#sLogMessage := CONCAT_STRING(IN1 := "FC_DateAsString"(),
|
||||
IN2 := #sDelimiter,
|
||||
IN3 := "FC_TimeAsString"(),
|
||||
IN4 := #sDelimiter,
|
||||
IN5 := #sFunction,
|
||||
IN6 := #sDelimiter,
|
||||
IN7 := 'Carrier(',
|
||||
IN8 := 'Barcode:',
|
||||
IN9 := #stInEventBookingInfo.sBarcode,
|
||||
IN10 := #sDelimiter,
|
||||
IN11 := 'JobNo:',
|
||||
IN12 := #stInEventBookingInfo.sJobNo,
|
||||
IN13 := #sDelimiter,
|
||||
IN14 := 'ProdNo:',
|
||||
IN15 := #stInEventBookingInfo.sProductNo,
|
||||
IN16 := #sDelimiter,
|
||||
IN17 := 'Dest:',
|
||||
IN18 := #stInEventBookingInfo.sDest,
|
||||
IN19 := ')',
|
||||
IN20 := ' von ',
|
||||
IN21 := #stInEventBookingInfo.sJamSrc,
|
||||
IN22 := ' zu ',
|
||||
IN23 := #stInEventBookingInfo.sJamDest,
|
||||
IN24 := ' gebucht');
|
||||
END_REGION
|
||||
|
||||
#fbPaEventLogBooking(SIG := #xInTrigger,
|
||||
SD_1 := #sLogMessage,
|
||||
Status => #wStatus,
|
||||
Error => #xError);
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
REGION Flanken
|
||||
#xTriggerFlag := #xInTrigger;
|
||||
END_REGION
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
LibraryType:
|
||||
Guid: 873575bd-45c1-4e5d-ad81-32da723bf561
|
||||
Comment:
|
||||
de-DE: Teststand vom 18.04.2025 aus der Testanlage ILS LL
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.0
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: Teststand vom 18.04.2025 aus der Testanlage ILS LL
|
||||
@@ -0,0 +1,13 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_EventLog_Correction.scl
|
||||
Hash: 2MCjddGTpTlcpniYQ4ikq6Gu8vJ5Ca/+sZPRS2h5Us8=
|
||||
LibraryMetaFileHash: gW+x1UWxB3WvyA9zs9xWcrTzUK0gswtXPnPxI1ojOYk=
|
||||
LibraryVersion:
|
||||
Guid: ef6d16a4-e489-47fe-ac26-6e1120abf3dc
|
||||
DependsOn:
|
||||
- TypeName: stEventCorrectionInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_DateAsString
|
||||
VersionNumber: 0.0.14
|
||||
- TypeName: FC_TimeAsString
|
||||
VersionNumber: 0.0.14
|
||||
@@ -0,0 +1,141 @@
|
||||
FUNCTION_BLOCK "FB_EventLog_Correction"
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
xInTrigger : Bool;
|
||||
stInEventCorrectionInfo : "stEventCorrectionInfo";
|
||||
END_VAR
|
||||
|
||||
VAR
|
||||
fbPaEventLogCorrection {InstructionName := 'Program_Alarm'; LibVersion := '1.0'} : Program_Alarm;
|
||||
wStatus : Word;
|
||||
sLogMessage : String;
|
||||
sDelimiter : String[1] := ',';
|
||||
sFunction : String[10];
|
||||
xTriggerFlag : Bool;
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
xError : Bool;
|
||||
tRunProgramAlarm : Bool;
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
REGION Call Logging Program Alarm
|
||||
IF #xTriggerFlag XOR #xInTrigger THEN
|
||||
|
||||
REGION Build Message
|
||||
#sDelimiter := ';';
|
||||
#sFunction := 'Korrektur';
|
||||
|
||||
CASE #stInEventCorrectionInfo.nCorrectionType OF
|
||||
0:
|
||||
#sLogMessage := CONCAT_STRING(IN1 := "FC_DateAsString"(),
|
||||
IN2 := #sDelimiter,
|
||||
IN3 := "FC_TimeAsString"(),
|
||||
IN4 := #sDelimiter,
|
||||
IN5 := #sFunction,
|
||||
IN6 := #sDelimiter,
|
||||
IN7 := 'Carrier(',
|
||||
IN8 := 'Barcode:',
|
||||
IN9 := #stInEventCorrectionInfo.sBarcode,
|
||||
IN10 := #sDelimiter,
|
||||
IN11 := 'JobNo:',
|
||||
IN12 := #stInEventCorrectionInfo.sJobNo,
|
||||
IN13 := #sDelimiter,
|
||||
IN14 := 'ProdNo:',
|
||||
IN15 := #stInEventCorrectionInfo.sProductNo,
|
||||
IN16 := #sDelimiter,
|
||||
IN17 := 'Dest:',
|
||||
IN18 := #stInEventCorrectionInfo.sDest,
|
||||
IN19 := ')',
|
||||
IN20 := ' aus HJ entfernt');
|
||||
1:
|
||||
#sLogMessage := CONCAT_STRING(IN1 := "FC_DateAsString"(),
|
||||
IN2 := #sDelimiter,
|
||||
IN3 := "FC_TimeAsString"(),
|
||||
IN4 := #sDelimiter,
|
||||
IN5 := #sFunction,
|
||||
IN6 := #sDelimiter,
|
||||
IN7 := 'Carrier(',
|
||||
IN8 := 'Barcode:',
|
||||
IN9 := #stInEventCorrectionInfo.sBarcode,
|
||||
IN10 := #sDelimiter,
|
||||
IN11 := 'JobNo:',
|
||||
IN12 := #stInEventCorrectionInfo.sJobNo,
|
||||
IN13 := #sDelimiter,
|
||||
IN14 := 'ProdNo:',
|
||||
IN15 := #stInEventCorrectionInfo.sProductNo,
|
||||
IN16 := #sDelimiter,
|
||||
IN17 := 'Dest:',
|
||||
IN18 := #stInEventCorrectionInfo.sDest,
|
||||
IN19 := ')',
|
||||
IN20 := ' in ',
|
||||
IN21 := #stInEventCorrectionInfo.sLoc,
|
||||
IN22 := ' Pos ',
|
||||
IN23 := #stInEventCorrectionInfo.sPos,
|
||||
IN24 := ' entfernt und Rest nachgeschoben');
|
||||
2:
|
||||
#sLogMessage := CONCAT_STRING(IN1 := "FC_DateAsString"(),
|
||||
IN2 := #sDelimiter,
|
||||
IN3 := "FC_TimeAsString"(),
|
||||
IN4 := #sDelimiter,
|
||||
IN5 := #sFunction,
|
||||
IN6 := #sDelimiter,
|
||||
IN7 := 'Carrier(',
|
||||
IN8 := 'Barcode:',
|
||||
IN9 := #stInEventCorrectionInfo.sBarcode,
|
||||
IN10 := #sDelimiter,
|
||||
IN11 := 'JobNo:',
|
||||
IN12 := #stInEventCorrectionInfo.sJobNo,
|
||||
IN13 := #sDelimiter,
|
||||
IN14 := 'ProdNo:',
|
||||
IN15 := #stInEventCorrectionInfo.sProductNo,
|
||||
IN16 := #sDelimiter,
|
||||
IN17 := 'Dest:',
|
||||
IN18 := #stInEventCorrectionInfo.sDest,
|
||||
IN19 := ')',
|
||||
IN20 := ' in ',
|
||||
IN21 := #stInEventCorrectionInfo.sLoc,
|
||||
IN22 := ' Pos ',
|
||||
IN23 := #stInEventCorrectionInfo.sPos,
|
||||
IN24 := ' durch Dummy ersetzt');
|
||||
3:
|
||||
#sLogMessage := CONCAT_STRING(IN1 := "FC_DateAsString"(),
|
||||
IN2 := #sDelimiter,
|
||||
IN3 := "FC_TimeAsString"(),
|
||||
IN4 := #sDelimiter,
|
||||
IN5 := #sFunction,
|
||||
IN6 := #sDelimiter,
|
||||
IN7 := 'Carrier(',
|
||||
IN8 := 'Barcode:',
|
||||
IN9 := #stInEventCorrectionInfo.sBarcode,
|
||||
IN10 := #sDelimiter,
|
||||
IN11 := 'JobNo:',
|
||||
IN12 := #stInEventCorrectionInfo.sJobNo,
|
||||
IN13 := #sDelimiter,
|
||||
IN14 := 'ProdNo:',
|
||||
IN15 := #stInEventCorrectionInfo.sProductNo,
|
||||
IN16 := #sDelimiter,
|
||||
IN17 := 'Dest:',
|
||||
IN18 := #stInEventCorrectionInfo.sDest,
|
||||
IN19 := ')',
|
||||
IN20 := #sDelimiter,
|
||||
IN21 := ' in Hyper-Jam eingefuegt');
|
||||
END_CASE;
|
||||
|
||||
END_REGION
|
||||
|
||||
#fbPaEventLogCorrection(SIG := #xInTrigger,
|
||||
SD_1 := #sLogMessage,
|
||||
Status => #wStatus,
|
||||
Error => #xError);
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
REGION Flags
|
||||
#xTriggerFlag := #xInTrigger;
|
||||
END_REGION
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
LibraryType:
|
||||
Guid: 7b2f674e-09cf-4295-8f62-286c90fb1e37
|
||||
Comment:
|
||||
de-DE: Teststand vom 18.04.2025 aus der Testanlage ILS LL
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.0
|
||||
Author: t.molina
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: 'CHANGED: übersetzt'
|
||||
@@ -0,0 +1,13 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_EventLog_Scan.scl
|
||||
Hash: lDZF2kT/iz7kyoDW4KkkP2kXs5UKAZhYt/nubJlWK0M=
|
||||
LibraryMetaFileHash: WZh1tYScxyawfVngye9trL+/OlZLmUGH7rfPBpwMhzA=
|
||||
LibraryVersion:
|
||||
Guid: 0c32dfac-9456-4f09-94aa-e0c5522ed860
|
||||
DependsOn:
|
||||
- TypeName: stEventScanInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_DateAsString
|
||||
VersionNumber: 0.0.14
|
||||
- TypeName: FC_TimeAsString
|
||||
VersionNumber: 0.0.14
|
||||
@@ -0,0 +1,167 @@
|
||||
FUNCTION_BLOCK "FB_EventLog_Scan"
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
xInTrigger : Bool;
|
||||
stInEventScanInfo : "stEventScanInfo";
|
||||
END_VAR
|
||||
|
||||
VAR
|
||||
fbPaEventLogScan {InstructionName := 'Program_Alarm'; LibVersion := '1.0'} : Program_Alarm;
|
||||
wStatus : Word;
|
||||
sLogMessage : String;
|
||||
sDelimiter : String[1] := ',';
|
||||
sFunction : String[10];
|
||||
xTriggerFlag : Bool;
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
xError : Bool;
|
||||
tRunProgramAlarm : Bool;
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
REGION Call: Program Alarm
|
||||
IF #xTriggerFlag XOR #xInTrigger THEN
|
||||
|
||||
REGION Meldetext
|
||||
#sDelimiter := ';';
|
||||
#sFunction := 'Scan';
|
||||
|
||||
CASE #stInEventScanInfo.nScanType OF
|
||||
0:
|
||||
#sLogMessage := CONCAT_STRING(IN1 := "FC_DateAsString"(),
|
||||
IN2 := #sDelimiter,
|
||||
IN3 := "FC_TimeAsString"(),
|
||||
IN4 := #sDelimiter,
|
||||
IN5 := #sFunction,
|
||||
IN6 := #sDelimiter,
|
||||
IN7 := 'Carrier(',
|
||||
IN8 := 'Barcode:',
|
||||
IN9 := #stInEventScanInfo.sBarcode,
|
||||
IN10 := #sDelimiter,
|
||||
IN11 := 'JobNo:',
|
||||
IN12 := #stInEventScanInfo.sJobNo,
|
||||
IN13 := #sDelimiter,
|
||||
IN14 := 'ProdNo:',
|
||||
IN15 := #stInEventScanInfo.sProductNo,
|
||||
IN16 := #sDelimiter,
|
||||
IN17 := 'Dest:',
|
||||
IN18 := #stInEventScanInfo.sDest,
|
||||
IN19 := ')',
|
||||
IN20 := ' bei SC',
|
||||
IN21 := #stInEventScanInfo.sReaderId,
|
||||
IN22 := ' Mat.Nr. nicht lesbar');
|
||||
|
||||
1:
|
||||
#sLogMessage := CONCAT_STRING(IN1 := "FC_DateAsString"(),
|
||||
IN2 := #sDelimiter,
|
||||
IN3 := "FC_TimeAsString"(),
|
||||
IN4 := #sDelimiter,
|
||||
IN5 := #sFunction,
|
||||
IN6 := #sDelimiter,
|
||||
IN7 := 'Carrier(',
|
||||
IN8 := 'Barcode:',
|
||||
IN9 := #stInEventScanInfo.sBarcode,
|
||||
IN10 := '(erwartet)',
|
||||
IN11 := #sDelimiter,
|
||||
IN12 := 'JobNo:',
|
||||
IN13 := #stInEventScanInfo.sJobNo,
|
||||
IN14 := #sDelimiter,
|
||||
IN15 := 'ProdNo:',
|
||||
IN16 := #stInEventScanInfo.sProductNo,
|
||||
IN17 := #sDelimiter,
|
||||
IN18 := 'Dest:',
|
||||
IN19 := #stInEventScanInfo.sDest,
|
||||
IN20 := ')',
|
||||
IN21 := ' bei SC',
|
||||
IN22 := #stInEventScanInfo.sReaderId,
|
||||
IN23 := ' nicht lesbar');
|
||||
2:
|
||||
#sLogMessage := CONCAT_STRING(IN1 := "FC_DateAsString"(),
|
||||
IN2 := #sDelimiter,
|
||||
IN3 := "FC_TimeAsString"(),
|
||||
IN4 := #sDelimiter,
|
||||
IN5 := #sFunction,
|
||||
IN6 := #sDelimiter,
|
||||
IN7 := 'Carrier(',
|
||||
IN8 := 'Barcode:',
|
||||
IN9 := #stInEventScanInfo.sBarcode,
|
||||
IN10 := #sDelimiter,
|
||||
IN11 := 'JobNo:',
|
||||
IN12 := #stInEventScanInfo.sJobNo,
|
||||
IN13 := #sDelimiter,
|
||||
IN14 := 'ProdNo:',
|
||||
IN15 := #stInEventScanInfo.sProductNo,
|
||||
IN16 := #sDelimiter,
|
||||
IN17 := 'Dest:',
|
||||
IN18 := #stInEventScanInfo.sDest,
|
||||
IN19 := ')',
|
||||
IN20 := ' bei SC',
|
||||
IN21 := #stInEventScanInfo.sReaderId,
|
||||
IN22 := ' neu hinzugefuegt');
|
||||
3:
|
||||
#sLogMessage := CONCAT_STRING(IN1 := "FC_DateAsString"(),
|
||||
IN2 := #sDelimiter,
|
||||
IN3 := "FC_TimeAsString"(),
|
||||
IN4 := #sDelimiter,
|
||||
IN5 := #sFunction,
|
||||
IN6 := #sDelimiter,
|
||||
IN7 := 'Carrier(',
|
||||
IN8 := 'Barcode:',
|
||||
IN9 := #stInEventScanInfo.sBarcode,
|
||||
IN10 := #sDelimiter,
|
||||
IN11 := 'JobNo:',
|
||||
IN12 := #stInEventScanInfo.sJobNo,
|
||||
IN13 := #sDelimiter,
|
||||
IN14 := 'ProdNo:',
|
||||
IN15 := #stInEventScanInfo.sProductNo,
|
||||
IN16 := #sDelimiter,
|
||||
IN17 := 'Dest:',
|
||||
IN18 := #stInEventScanInfo.sDest,
|
||||
IN19 := ')',
|
||||
IN20 := ' bei SC',
|
||||
IN21 := #stInEventScanInfo.sReaderId,
|
||||
IN22 := ' unbekannter Carrier hinzugefuegt');
|
||||
// Good Reads
|
||||
4:
|
||||
#sLogMessage := CONCAT_STRING(IN1 := "FC_DateAsString"(),
|
||||
IN2 := #sDelimiter,
|
||||
IN3 := "FC_TimeAsString"(),
|
||||
IN4 := #sDelimiter,
|
||||
IN5 := #sFunction,
|
||||
IN6 := #sDelimiter,
|
||||
IN7 := 'Carrier(',
|
||||
IN8 := 'Barcode:',
|
||||
IN9 := #stInEventScanInfo.sBarcode,
|
||||
IN10 := #sDelimiter,
|
||||
IN11 := 'JobNo:',
|
||||
IN12 := #stInEventScanInfo.sJobNo,
|
||||
IN13 := #sDelimiter,
|
||||
IN14 := 'ProdNo:',
|
||||
IN15 := #stInEventScanInfo.sProductNo,
|
||||
IN16 := #sDelimiter,
|
||||
IN17 := 'Dest:',
|
||||
IN18 := #stInEventScanInfo.sDest,
|
||||
IN19 := ')',
|
||||
IN20 := ' bei SC',
|
||||
IN21 := #stInEventScanInfo.sReaderId,
|
||||
IN22 := ' gelesen');
|
||||
|
||||
END_CASE;
|
||||
|
||||
END_REGION
|
||||
|
||||
#fbPaEventLogScan(SIG := #xInTrigger,
|
||||
SD_1 := #sLogMessage,
|
||||
Status => #wStatus,
|
||||
Error => #xError);
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
REGION Flanken
|
||||
#xTriggerFlag := #xInTrigger;
|
||||
END_REGION
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
LibraryType:
|
||||
Guid: 0fb07577-0755-4aaa-8aa1-ed98c4a96d46
|
||||
Comment:
|
||||
de-DE: Initial
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.7
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: hmi
|
||||
@@ -0,0 +1,13 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_Conveyor.scl
|
||||
Hash: AkZneABZ/ZCE9GXeWUHhfZTOBC1MY7O564ODdIqVrq8=
|
||||
LibraryMetaFileHash: uWjDioIkDAD8yLZibEPleeTTDnw+RI6TcYbR0dTPsLA=
|
||||
LibraryVersion:
|
||||
Guid: 80031440-bc66-4cb7-9dd8-353095fb8de0
|
||||
DependsOn:
|
||||
- TypeName: UDT_MainState
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_Monitoring
|
||||
VersionNumber: 2.0.5
|
||||
- TypeName: UDT_Conveyor
|
||||
VersionNumber: 0.0.15
|
||||
@@ -0,0 +1,315 @@
|
||||
FUNCTION_BLOCK "FB_Conveyor"
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
xInEnabled : Bool := true; // This is for enabling or disabling this conveyor - e.G. for Testing
|
||||
xInAutomaticMode : Bool; // When DriveGroup is in Automatic-Mode
|
||||
xInMotorProtectionMonitoring : Bool; // Motor-Circuite-Breaker Monitoring; 0 = Error
|
||||
xInRequestRun : Bool;
|
||||
xInManualMode : Bool; // HMI Override
|
||||
xInGridSen : Bool; // Rastersensor
|
||||
xInGridQuit : Bool; // Rasterfehler quittieren
|
||||
Settings : Struct
|
||||
tEnergySafeTime : Time := T#60s;
|
||||
tStartingTime : Time := T#50ms;
|
||||
xGridActive : Bool; // Überwachung Rastersensor aktiv
|
||||
sGridSenName : String[10]; // für fehlermeldung
|
||||
sMotorProtectName : String[10]; // für fehlermeldung
|
||||
END_STRUCT;
|
||||
END_VAR
|
||||
|
||||
VAR_OUTPUT
|
||||
xOutPowerContactor : Bool; // Power contactor for motor
|
||||
xOutConveyorFullSpeed : Bool;
|
||||
xOutGridError : Bool; // Meldeausgang für Rasterfehler
|
||||
END_VAR
|
||||
|
||||
VAR_IN_OUT
|
||||
stInOutControlUnitCabinet : "UDT_MainState";
|
||||
stInOutInterfaceHMI : "UDT_HMI_Conveyor"; // Nur für HMI
|
||||
END_VAR
|
||||
|
||||
VAR
|
||||
nState : Int := -10;
|
||||
nStateHold : Int := -10;
|
||||
sStateText : String;
|
||||
xReadyToStart : Bool;
|
||||
xAutomaticMode : Bool;
|
||||
TOnStartUpWarningTimer {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
||||
tStartUpTime : Time := T#50ms;
|
||||
TOnEnergySafeTimer {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
||||
tEnergySafeTime : Time := T#60s;
|
||||
TOnStandstillTimer {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
||||
tStandstillTime : Time := T#50ms;
|
||||
TONStateTimer {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
||||
xStateTimer : Bool;
|
||||
tStateTimer : Time;
|
||||
tRestlaufzeit : Time;
|
||||
TOnGridTimer {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Timer für Rasterüberwachung
|
||||
rTrigGrid {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG; // Flanke von Rastersensor
|
||||
xGridError : Bool; // Fehlerbit bei fehlendem Rastersignal
|
||||
fbMonitoringGridError : "FB_Monitoring";
|
||||
fbMonitoringMotorProtection : "FB_Monitoring";
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
REGION Automatic Mode
|
||||
#xAutomaticMode := (#xInAutomaticMode OR #stInOutInterfaceHMI.xSemiAuto) AND #xInEnabled AND NOT #stInOutInterfaceHMI.xDisableConveyor;
|
||||
END_REGION
|
||||
|
||||
REGION ReadyToStart
|
||||
#xReadyToStart := #xInMotorProtectionMonitoring AND #xInEnabled;
|
||||
END_REGION ;
|
||||
// ------------------------------------------------
|
||||
// Main State Machine
|
||||
// ------------------------------------------------
|
||||
REGION MainStateMachine
|
||||
CASE #nState OF
|
||||
"E_DeviceState.eUndefined":
|
||||
REGION Undefined
|
||||
#sStateText := 'StartUp';
|
||||
#nState := "E_DeviceState.eStopped";
|
||||
#xStateTimer := 0;
|
||||
END_REGION ;
|
||||
"E_DeviceState.eStopped":
|
||||
REGION Stopped
|
||||
#sStateText := 'Stopped';
|
||||
IF #xReadyToStart AND NOT #Settings.xGridActive THEN
|
||||
#nState := "E_DeviceState.eIdle";
|
||||
ELSIF #xReadyToStart AND #Settings.xGridActive AND NOT #xGridError THEN
|
||||
#nState := "E_DeviceState.eIdle";
|
||||
END_IF;
|
||||
END_REGION ;
|
||||
"E_DeviceState.eIdle":
|
||||
REGION IDLE
|
||||
#sStateText := 'IDLE: Wait';
|
||||
IF NOT #xReadyToStart THEN
|
||||
#nState := "E_DeviceState.eStopped";
|
||||
ELSIF #xAutomaticMode THEN
|
||||
#nState := "E_DeviceState.eStarting";
|
||||
ELSIF #xInManualMode THEN
|
||||
#nState := 500;
|
||||
END_IF;
|
||||
END_REGION ;
|
||||
"E_DeviceState.eStarting":
|
||||
REGION Starting
|
||||
#sStateText := 'STARTING: Warning Timer';
|
||||
IF NOT #xAutomaticMode THEN
|
||||
#nState := "E_DeviceState.eStopping";
|
||||
ELSIF #TOnStartUpWarningTimer.Q THEN
|
||||
#nState := "E_DeviceState.eExecute";
|
||||
//#bInRequestRun := 0;
|
||||
END_IF;
|
||||
END_REGION ;
|
||||
500:
|
||||
REGION Manual Mode
|
||||
#sStateText := 'JOG: Manual Mode';
|
||||
IF NOT #xInManualMode THEN
|
||||
#nState := "E_DeviceState.eStopping";
|
||||
END_IF;
|
||||
END_REGION ;
|
||||
"E_DeviceState.eExecute":
|
||||
REGION Execute
|
||||
#sStateText := 'EXECUTE: Running';
|
||||
IF NOT #xAutomaticMode THEN
|
||||
#nState := "E_DeviceState.eStopping";
|
||||
ELSIF #Settings.xGridActive AND #xGridError THEN
|
||||
#nState := "E_DeviceState.eStopping";
|
||||
ELSIF #TOnEnergySafeTimer.Q THEN
|
||||
#nState := "E_DeviceState.eHolding";
|
||||
#nStateHold := "E_DeviceState.eExecute";
|
||||
END_IF;
|
||||
END_REGION ;
|
||||
// ------------------------------------------------
|
||||
// HELD
|
||||
// ------------------------------------------------
|
||||
|
||||
"E_DeviceState.eHolding":
|
||||
REGION Holding
|
||||
#sStateText := 'HOLDING: Start Energy Safing';
|
||||
IF #TOnStandstillTimer.Q THEN
|
||||
#nState := "E_DeviceState.eHeld";
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
"E_DeviceState.eHeld":
|
||||
REGION Held
|
||||
#sStateText := 'HELD: Is Energy Safing';
|
||||
//ipAlarmSystem.Set(nAlarmNoOffset + 0);
|
||||
IF NOT #xAutomaticMode THEN
|
||||
#nState := "E_DeviceState.eStopping";
|
||||
ELSIF #xInRequestRun THEN
|
||||
#nState := "E_DeviceState.eUnholding";
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
"E_DeviceState.eUnholding":
|
||||
REGION Unholding
|
||||
#sStateText := 'Un-Holding: Stops Energy Safing';
|
||||
#xStateTimer := 1;
|
||||
#tStateTimer := #tStandstillTime;
|
||||
IF #TONStateTimer.Q THEN
|
||||
#nState := #nStateHold;
|
||||
#xStateTimer := 0;
|
||||
//ipAlarmSystem.Clr (nAlarmNoOffset + 0);
|
||||
END_IF;
|
||||
END_REGION
|
||||
// ------------------------------------------------
|
||||
// STOPPING
|
||||
// ------------------------------------------------
|
||||
|
||||
"E_DeviceState.eStopping":
|
||||
REGION Stopping
|
||||
#sStateText := 'Stopping';
|
||||
IF #TOnStandstillTimer.Q THEN
|
||||
//ipAlarmSystem.Clr (nAlarmNoOffset + 0);
|
||||
//ipAlarmSystem.Clr (nAlarmNoOffset + 3);
|
||||
#nState := "E_DeviceState.eStopped";
|
||||
END_IF;
|
||||
#xStateTimer := 0;
|
||||
END_REGION
|
||||
END_CASE;
|
||||
END_REGION
|
||||
//------------------------------------------------
|
||||
// Stop Conveyor by ChainBreakMonitor and MotorProtection
|
||||
//------------------------------------------------
|
||||
IF (NOT #xReadyToStart) AND
|
||||
(#nState > "E_DeviceState.eIdle") AND
|
||||
(#nState < "E_DeviceState.eStopping") THEN
|
||||
#nState := "E_DeviceState.eStopping";
|
||||
END_IF;
|
||||
|
||||
REGION Rastersensor
|
||||
#rTrigGrid(CLK := #xInGridSen);
|
||||
|
||||
#TOnGridTimer(IN := NOT #rTrigGrid.Q AND #xOutPowerContactor,
|
||||
PT := T#3s);
|
||||
|
||||
IF #Settings.xGridActive AND #xOutConveyorFullSpeed AND #TOnGridTimer.Q THEN
|
||||
#xGridError := TRUE;
|
||||
ELSIF (#xGridError AND #xInGridQuit) OR (#xGridError AND NOT #Settings.xGridActive) THEN
|
||||
#xGridError := FALSE;
|
||||
END_IF;
|
||||
|
||||
#xOutGridError := #xGridError;
|
||||
END_REGION
|
||||
//------------------------------------------------
|
||||
// Outputs
|
||||
//------------------------------------------------
|
||||
REGION Outputs
|
||||
#xOutPowerContactor :=
|
||||
((#nState = "E_DeviceState.eExecute") OR
|
||||
//(nState = E_DeviceState.eUnsuspending) OR
|
||||
(#nState = "E_DeviceState.eUnholding") OR
|
||||
(#nState = "E_DeviceState.eSuspending") OR
|
||||
#stInOutInterfaceHMI.xManual OR
|
||||
(#nState = 500));
|
||||
#xOutConveyorFullSpeed := #nState = "E_DeviceState.eExecute";
|
||||
END_REGION ;
|
||||
(*
|
||||
bOutLampMotorRunning := (#nState = "E_DeviceState.eStarting") OR
|
||||
(#nState = "E_DeviceState.eExecute") OR
|
||||
(#nState = "E_DeviceState.eHolding") OR
|
||||
(#nState = "E_DeviceState.eSuspending") OR
|
||||
(#nState = "E_DeviceState.eUnsuspending") OR
|
||||
(#nState = "E_DeviceState.eStopping");
|
||||
*)
|
||||
//------------------------------------------------
|
||||
// Timer
|
||||
//------------------------------------------------
|
||||
REGION Timer
|
||||
#tStartUpTime := #Settings.tStartingTime;
|
||||
#TOnStartUpWarningTimer(IN := #nState = "E_DeviceState.eStarting",
|
||||
PT := #tStartUpTime);
|
||||
#TOnEnergySafeTimer(
|
||||
IN := ((#nState = "E_DeviceState.eExecute") OR (#nState = "E_DeviceState.eSuspending")) AND
|
||||
(NOT #xInRequestRun),
|
||||
ET => #tRestlaufzeit,
|
||||
PT := #Settings.tEnergySafeTime);
|
||||
#TOnStandstillTimer(IN := (#nState = "E_DeviceState.eStopping") OR (#nState = "E_DeviceState.eHolding"),
|
||||
PT := #tStandstillTime);
|
||||
#TONStateTimer(IN := #xStateTimer,
|
||||
PT := #tStateTimer);
|
||||
END_REGION
|
||||
|
||||
REGION Visu
|
||||
|
||||
#stInOutInterfaceHMI.nState := #nState;
|
||||
#stInOutInterfaceHMI.sStateText := #sStateText;
|
||||
|
||||
REGION Status
|
||||
IF #xReadyToStart THEN // Keine Fehler (Safety, ChainBreak, MotorProtection)
|
||||
CASE #nState OF
|
||||
"E_DeviceState.eUndefined", "E_DeviceState.eStopping", "E_DeviceState.eStopped", "E_DeviceState.eIdle":
|
||||
#stInOutInterfaceHMI.bStatus := 0; // NOT_AVAILABLE
|
||||
"E_DeviceState.eStarting", 500, "E_DeviceState.eExecute", "E_DeviceState.eHolding", "E_DeviceState.eHeld", "E_DeviceState.eUnholding", "E_DeviceState.eSuspending", "E_DeviceState.eSuspended", "E_DeviceState.eUnsuspending":
|
||||
#stInOutInterfaceHMI.bStatus := 1; // AVAILABLE
|
||||
ELSE //Fallback
|
||||
#stInOutInterfaceHMI.bStatus := 0; // NOT AVAILABLE
|
||||
END_CASE;
|
||||
ELSE // Fehler
|
||||
#stInOutInterfaceHMI.bStatus := 2; // ERROR
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
REGION Modes
|
||||
// Int16 Bit-codiert
|
||||
#stInOutInterfaceHMI.nMode.%X0 := (#nState = "E_DeviceState.eUndefined") OR (#nState = "E_DeviceState.eStopped") OR (#nState = "E_DeviceState.eIdle"); // The device is turned off
|
||||
#stInOutInterfaceHMI.nMode.%X1 := (#nState = "E_DeviceState.eStarting") OR (#nState = "E_DeviceState.eExecute") OR (#nState = "E_DeviceState.eUnholding"); // The device is turned on
|
||||
#stInOutInterfaceHMI.nMode.%X2 := #stInOutInterfaceHMI.xDisableConveyor OR #stInOutInterfaceHMI.xManual OR #stInOutInterfaceHMI.xSemiAuto OR (#nState = 500) (* OR #xViSuManualMode OR #xViSuSemiAutoMode *); // The device is being manually operated
|
||||
#stInOutInterfaceHMI.nMode.%X3 := (#nState = "E_DeviceState.eHeld"); //The device only is on when the device is needed (like standby)
|
||||
#stInOutInterfaceHMI.nMode.%X10 := (#nState = "E_DeviceState.eSuspended"); // Overflow Error is set for this device
|
||||
END_REGION
|
||||
|
||||
#stInOutInterfaceHMI.xIsInAutomatic := #xAutomaticMode;
|
||||
#stInOutInterfaceHMI.xEnergySaveReq := (NOT #xInRequestRun);
|
||||
#stInOutInterfaceHMI.xPowerContactor := #xOutPowerContactor;
|
||||
#stInOutInterfaceHMI.xPluggedChainBreak := #Settings.xGridActive;
|
||||
#stInOutInterfaceHMI.xStatusChainBreak := (#Settings.xGridActive AND NOT #xGridError) OR NOT #Settings.xGridActive;
|
||||
#stInOutInterfaceHMI.xStatusMotorProtect := #xInMotorProtectionMonitoring;
|
||||
#stInOutInterfaceHMI.xConveyorFull1 := FALSE;
|
||||
#stInOutInterfaceHMI.xConveyorFull2 := FALSE;
|
||||
#stInOutInterfaceHMI.xReady2Receive := TRUE;
|
||||
#stInOutInterfaceHMI.xNextConveyorReady := TRUE;
|
||||
|
||||
END_REGION
|
||||
|
||||
|
||||
REGION Monitoring
|
||||
|
||||
REGION Grid Error
|
||||
#fbMonitoringGridError.stSettings.nErrorType := 1;
|
||||
#fbMonitoringGridError.stSettings.xErrLedIfMachineIsOff := TRUE;
|
||||
#fbMonitoringGridError.stSettings.xSelfQuit := TRUE;
|
||||
#fbMonitoringGridError.stSettings.tDelay := T#1s;
|
||||
#fbMonitoringGridError(sInPrefix := #stInOutInterfaceHMI.sConveyorName,
|
||||
wInTextListId_Function := 400,
|
||||
wInTextListId_Message := 400,
|
||||
sInSuffix := #Settings.sMotorProtectName,
|
||||
InOutMachineState := #stInOutControlUnitCabinet,
|
||||
xInQuitError := #xInGridQuit,
|
||||
xInSignal := NOT #xGridError,
|
||||
sInAlarmMessage := 'Fehler Rastersensorueberwachung');
|
||||
END_REGION
|
||||
|
||||
|
||||
REGION Motorschutz
|
||||
#fbMonitoringMotorProtection.stSettings.nErrorType := 1;
|
||||
#fbMonitoringMotorProtection.stSettings.xErrLedIfMachineIsOff := TRUE;
|
||||
#fbMonitoringMotorProtection.stSettings.xSelfQuit := TRUE;
|
||||
#fbMonitoringMotorProtection.stSettings.tDelay := T#1s;
|
||||
#fbMonitoringMotorProtection(sInPrefix := #stInOutInterfaceHMI.sConveyorName,
|
||||
wInTextListId_Function := 400,
|
||||
wInTextListId_Message := 401,
|
||||
sInSuffix := #Settings.sMotorProtectName,
|
||||
InOutMachineState := #stInOutControlUnitCabinet,
|
||||
xInQuitError := #stInOutControlUnitCabinet.xQuitError,
|
||||
xInSignal := #xInMotorProtectionMonitoring,
|
||||
sInAlarmMessage := 'Fehler Motorschutzschalter');
|
||||
END_REGION
|
||||
|
||||
|
||||
END_REGION
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
LibraryType:
|
||||
Guid: 7d4d00d5-3a74-48f2-a16d-c1df371b6b73
|
||||
Comment:
|
||||
de-DE: Initial
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.6
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: Monitoring MoSchu
|
||||
@@ -0,0 +1,13 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_Conveyor_Sort.scl
|
||||
Hash: OAHKG7Elzue3Gas/evCuv9ggYtU+MH5kA+1TJi90RgA=
|
||||
LibraryMetaFileHash: G62tAZiPi7WBemXkAmWxMHsyC/Ye060c8SQGQXh0CSw=
|
||||
LibraryVersion:
|
||||
Guid: aa2b6c0a-fa07-4b36-bb79-186128730907
|
||||
DependsOn:
|
||||
- TypeName: FB_Monitoring
|
||||
VersionNumber: 2.0.5
|
||||
- TypeName: UDT_MainState
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Conveyor
|
||||
VersionNumber: 0.0.15
|
||||
@@ -0,0 +1,475 @@
|
||||
FUNCTION_BLOCK "FB_Conveyor_Sort"
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
xInEnabled : Bool;
|
||||
xInFull : Bool; // If Connected Tracks are Full, Conveyor will set to Suspend
|
||||
xInNextConveyorReady : Bool; // NextConveyor.xOutReadyToReceive
|
||||
xInAutomaticMode : Bool; // nState = E_DeviceState.eExecute
|
||||
xInEnergySafeRequest : Bool; // ConveyorInputSensor
|
||||
xInChainBreakMonitoring : Bool; // ChainBreakSensor
|
||||
xInChainBreakMonitoringSmoothing : Bool;
|
||||
xInMotorProtectionMonitoring : Bool; // MotorProtectionInput
|
||||
xInSafetyEnable : Bool; // fbSafetyEStopConveyor
|
||||
xInGridSen : Bool; // Rastersensor
|
||||
xInGridQuit : Bool; // Rasterfehler quittieren
|
||||
Settings : Struct
|
||||
tEnergySafeTime : Time;
|
||||
tStartingTime : Time := T#750ms;
|
||||
xGridActive : Bool; // Überwachung Rastersensor aktiv
|
||||
sMotorProtectName : String[10];
|
||||
END_STRUCT;
|
||||
END_VAR
|
||||
|
||||
VAR_OUTPUT
|
||||
xOutPowerContactor : Bool; // PowerContactor for Motor
|
||||
xOutConveyorFullSpeed : Bool;
|
||||
xOutMotStat : Bool;
|
||||
xOutReadyToReceive : Bool; // For xInNextConveyorReady
|
||||
xOutLampMotorRunning : Bool;
|
||||
eOutState : Int;
|
||||
sOutState : String[30];
|
||||
xOutInExecute : Bool;
|
||||
xOutInSafeState : Bool;
|
||||
xOutGridError : Bool; // Meldeausgang für Rasterfehler
|
||||
END_VAR
|
||||
|
||||
VAR_IN_OUT
|
||||
stInOutControlUnitCabinet : "UDT_MainState";
|
||||
stInOutInterfaceHMI : "UDT_Conveyor"; // Nur für HMI
|
||||
END_VAR
|
||||
|
||||
VAR
|
||||
xErrorChain : Bool;
|
||||
xErrorMotorProtection : Bool;
|
||||
StartWarningRequestFlag : Bool;
|
||||
StartWarningRequest : Bool;
|
||||
StateToStartFlag : Bool;
|
||||
StateToStart : Bool;
|
||||
StateToStopFlag : Bool;
|
||||
StateToStop : Bool;
|
||||
xReadyToStart : Bool;
|
||||
nState : Int := -10;
|
||||
nStateHold : Int; // Aus CRoot -->
|
||||
sStateText : String;
|
||||
xEnergySafeRequest : Bool;
|
||||
"//TIMER" : Int;
|
||||
TOfChainBreakTimer {InstructionName := 'TOF_TIME'; LibVersion := '1.0'} : TOF_TIME;
|
||||
END_VAR
|
||||
VAR RETAIN
|
||||
tChainBreakTime : Time := T#1s;
|
||||
END_VAR
|
||||
VAR
|
||||
TOnStartingWarningTimer {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Aus CRoot -->
|
||||
END_VAR
|
||||
VAR RETAIN
|
||||
tStartingWarningTime : Time := T#750ms;
|
||||
END_VAR
|
||||
VAR
|
||||
TOnEnergySafeTimer {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Aus CRoot -->
|
||||
END_VAR
|
||||
VAR RETAIN
|
||||
tEnergySafeTime : Time := T#1m;
|
||||
END_VAR
|
||||
VAR
|
||||
TOnNextConveyorReadyTimer {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Timer On-Delay for xInNextConveyorReady -> Then Suspend
|
||||
END_VAR
|
||||
VAR RETAIN
|
||||
tNextConveyorReadyTime : Time := T#1s; // Time for Conveyor Ready
|
||||
END_VAR
|
||||
VAR
|
||||
TOnFullTimer {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Timer On-Delay for Conveyor is Full
|
||||
END_VAR
|
||||
VAR RETAIN
|
||||
tFullTime : Time := T#500ms; // Time for Conveyor is Full - Init is 3s
|
||||
END_VAR
|
||||
VAR
|
||||
TONStateTimer {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Aus CRoot -->
|
||||
xStateTimer : Bool;
|
||||
tStateTimer : Time;
|
||||
xAutomaticMode : Bool; // xInAutomaticMode + Enable
|
||||
fbMonitoringChainBreak : "FB_Monitoring";
|
||||
fbMonitoringMotorProtection : "FB_Monitoring";
|
||||
TOnGridTimer {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Timer für Rasterüberwachung
|
||||
rTrigGrid {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG; // Flanke von Rastersensor
|
||||
xGridError : Bool; // Fehlerbit bei fehlendem Rastersignal
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
#xEnergySafeRequest := #xInEnergySafeRequest;
|
||||
#xAutomaticMode := (#xInAutomaticMode OR #stInOutInterfaceHMI.xSemiAuto) AND #xInEnabled AND NOT #stInOutInterfaceHMI.xDisableConveyor;
|
||||
|
||||
REGION RootProperties
|
||||
|
||||
REGION ErrorChain
|
||||
IF "DB_MachineGlobal".nMachineMode = "E_MachineMode.eOn" THEN
|
||||
#xErrorChain := (NOT #TOfChainBreakTimer.Q) (*OR (ipAlarmSystem.HI (nAlarmNoOffset + 2))*);
|
||||
ELSE
|
||||
#xErrorChain := 0;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
REGION ErrorMotorProtection
|
||||
IF "DB_MachineGlobal".nMachineMode = "E_MachineMode.eOn" THEN
|
||||
#xErrorMotorProtection := (NOT #xInMotorProtectionMonitoring) (* OR (ipAlarmSystem.HI (nAlarmNoOffset + 1)) *);
|
||||
ELSE
|
||||
#xErrorMotorProtection := 0;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
REGION InExecute
|
||||
#xOutInExecute := #nState >= "E_DeviceState.eExecute";
|
||||
END_REGION
|
||||
|
||||
REGION InSafeState
|
||||
#xOutInSafeState := #nState <= "E_DeviceState.eIdle";
|
||||
END_REGION
|
||||
|
||||
REGION ReadyToStart
|
||||
#xReadyToStart := (NOT #xErrorChain) AND
|
||||
(#xInSafetyEnable) AND
|
||||
(NOT #xErrorMotorProtection);
|
||||
END_REGION
|
||||
|
||||
REGION StartWarningRequest
|
||||
IF #StartWarningRequestFlag THEN
|
||||
#StartWarningRequest := #nState = "E_DeviceState.eStarting";
|
||||
#StartWarningRequestFlag := 0;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
REGION StateToStart
|
||||
IF #nState = "E_DeviceState.eIdle" AND #StateToStartFlag THEN
|
||||
#nState := "E_DeviceState.eStarting";
|
||||
#StateToStart := 1; // benötigt?? Wird nirgendwo zurückgesetzt?
|
||||
#StateToStartFlag := 0;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
REGION StateToStop
|
||||
IF (#nState > "E_DeviceState.eIdle") AND #StateToStopFlag = 1 THEN
|
||||
#nState := "E_DeviceState.eStopping";
|
||||
#StateToStop := 1; // benötigt?? Wird nirgendwo zurückgesetzt?
|
||||
#StateToStopFlag := 0;
|
||||
END_IF;
|
||||
END_REGION
|
||||
END_REGION
|
||||
|
||||
REGION StateMain
|
||||
CASE #nState OF
|
||||
"E_DeviceState.eUndefined":
|
||||
REGION Undefined
|
||||
#sStateText := 'StartUp';
|
||||
#nState := "E_DeviceState.eStopped";
|
||||
END_REGION
|
||||
|
||||
"E_DeviceState.eStopped":
|
||||
REGION Stopped
|
||||
#sStateText := 'Stopped';
|
||||
IF #xReadyToStart AND NOT #Settings.xGridActive THEN
|
||||
#nState := "E_DeviceState.eIdle";
|
||||
ELSIF #xReadyToStart AND #Settings.xGridActive AND NOT #xGridError THEN
|
||||
#nState := "E_DeviceState.eIdle";
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
"E_DeviceState.eIdle":
|
||||
REGION IDLE
|
||||
#sStateText := 'IDLE: Wait';
|
||||
IF NOT #xReadyToStart THEN
|
||||
#nState := "E_DeviceState.eStopped";
|
||||
ELSIF #xAutomaticMode THEN
|
||||
#nState := "E_DeviceState.eStarting";
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
"E_DeviceState.eStarting":
|
||||
REGION Starting
|
||||
#sStateText := 'STARTING: Warning Timer';
|
||||
IF NOT #xAutomaticMode THEN
|
||||
#nState := "E_DeviceState.eStopping";
|
||||
ELSIF #TOnStartingWarningTimer.Q THEN
|
||||
#nState := "E_DeviceState.eExecute";
|
||||
#xEnergySafeRequest := 0;
|
||||
#xStateTimer := 0;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
"E_DeviceState.eExecute":
|
||||
REGION Execute
|
||||
#sStateText := 'EXECUTE: Running';
|
||||
IF NOT #xAutomaticMode THEN
|
||||
#nState := "E_DeviceState.eStopping";
|
||||
ELSIF #Settings.xGridActive AND #xGridError THEN
|
||||
#nState := "E_DeviceState.eStopping";
|
||||
ELSIF #TOnEnergySafeTimer.Q THEN
|
||||
#nState := "E_DeviceState.eHolding";
|
||||
#nStateHold := "E_DeviceState.eExecute";
|
||||
ELSIF #TOnFullTimer.Q OR #TOnNextConveyorReadyTimer.Q THEN //Könnte man vereinfachen
|
||||
#nState := "E_DeviceState.eSuspending";
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
// ------------------------------------------------
|
||||
// HELD
|
||||
// ------------------------------------------------
|
||||
"E_DeviceState.eHolding":
|
||||
#sStateText := 'HOLDING: Start Energy Safing';
|
||||
// IF #TOnStandstillTimer.Q THEN
|
||||
#nState := "E_DeviceState.eHeld";
|
||||
// END_IF;
|
||||
|
||||
"E_DeviceState.eHeld":
|
||||
REGION Held
|
||||
#sStateText := 'HELD: Is Energy Safing';
|
||||
//ipAlarmSystem.Set(nAlarmNoOffset + 0);
|
||||
IF NOT #xAutomaticMode THEN
|
||||
#nState := "E_DeviceState.eStopping";
|
||||
ELSIF NOT #xInEnergySafeRequest THEN
|
||||
#nState := "E_DeviceState.eUnholding";
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
"E_DeviceState.eUnholding":
|
||||
#sStateText := 'Un-Holding: Stops Energy Safing';
|
||||
#xStateTimer := 1;
|
||||
IF #TONStateTimer.Q THEN
|
||||
#nState := #nStateHold;
|
||||
#xStateTimer := 0;
|
||||
//ipAlarmSystem.Clr(nAlarmNoOffset + 0);
|
||||
END_IF;
|
||||
// ------------------------------------------------
|
||||
// SUSPENDED
|
||||
// ------------------------------------------------
|
||||
"E_DeviceState.eSuspending":
|
||||
#sStateText := 'SUSPENDING: This state is a result of a command change from the EXECUTE state. This state is typically required prior to the SUSPENDED wait state, and prepares the machine (ie stops glue cycles, stops carton feeds, etc) prior to the SUSPEND state.';
|
||||
IF NOT #xInAutomaticMode THEN
|
||||
#nState := "E_DeviceState.eStopping";
|
||||
ELSIF NOT #xInFull THEN
|
||||
#nState := "E_DeviceState.eUnsuspending";
|
||||
END_IF;
|
||||
|
||||
"E_DeviceState.eSuspended":
|
||||
REGION Suspended
|
||||
#sStateText := 'SUSPENDED: The machine may be running at the relevant setpoint speed, there is no product being produced. This state can be reached as a result of a machine status, and differs from HELD in that HELD is typically a result of an operator request.';
|
||||
//ipAlarmSystem.Set(nAlarmNoOffset + 3);
|
||||
IF NOT #xAutomaticMode THEN
|
||||
#nState := "E_DeviceState.eStopping";
|
||||
ELSIF #xInNextConveyorReady THEN
|
||||
#nState := "E_DeviceState.eUnsuspending";
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
"E_DeviceState.eUnsuspending":
|
||||
#sStateText := 'UN-SUSPENDING: This state is a result of a request from SUSPENDED state to go back to the EXECUTE state. This actions of this state may include: ramping up speeds, turning on vaccums, the re-engagement of clutches.';
|
||||
#xStateTimer := 1;
|
||||
//#TONStateTimer.PT := #tStandstillTime;
|
||||
IF #TONStateTimer.Q THEN
|
||||
//ipAlarmSystem.Clr (nAlarmNoOffset + 3);
|
||||
#nState := "E_DeviceState.eExecute";
|
||||
#xStateTimer := 0;
|
||||
END_IF;
|
||||
"E_DeviceState.eStopping":
|
||||
REGION Stopping
|
||||
#sStateText := 'STOPPING: This state executes the logic which brings the machine to a controlled and safe stop';
|
||||
#nState := "E_DeviceState.eStopped";
|
||||
END_REGION
|
||||
END_CASE;
|
||||
END_REGION
|
||||
|
||||
REGION Rastersensor
|
||||
#rTrigGrid(CLK := #xInGridSen);
|
||||
|
||||
#TOnGridTimer(IN := NOT #rTrigGrid.Q AND #xOutPowerContactor,
|
||||
PT := T#3s);
|
||||
|
||||
IF #Settings.xGridActive AND #xOutConveyorFullSpeed AND #TOnGridTimer.Q THEN
|
||||
#xGridError := TRUE;
|
||||
ELSIF (#xGridError AND #xInGridQuit) OR (#xGridError AND NOT #Settings.xGridActive) THEN
|
||||
#xGridError := FALSE;
|
||||
END_IF;
|
||||
|
||||
#xOutGridError := #xGridError;
|
||||
END_REGION
|
||||
|
||||
REGION Outputs
|
||||
#xOutPowerContactor := (#nState = "E_DeviceState.eExecute") OR (#nState = "E_DeviceState.eUnsuspending") OR (#nState = "E_DeviceState.eUnholding");
|
||||
#xOutConveyorFullSpeed := #TOnStartingWarningTimer.Q;//#nState = "E_DeviceState.eExecute";
|
||||
#xOutMotStat := #xOutPowerContactor;
|
||||
|
||||
#xOutLampMotorRunning := (#nState = "E_DeviceState.eStarting") OR
|
||||
(#nState = "E_DeviceState.eExecute") OR
|
||||
(#nState = "E_DeviceState.eHolding") OR
|
||||
(#nState = "E_DeviceState.eUnsuspending") OR
|
||||
(#nState = "E_DeviceState.eStopping");
|
||||
|
||||
// ?????????
|
||||
#xOutReadyToReceive := (#nState = "E_DeviceState.eExecute");
|
||||
END_REGION
|
||||
|
||||
REGION Timer
|
||||
#TOfChainBreakTimer(IN := #xInChainBreakMonitoring,
|
||||
PT := #tChainBreakTime);
|
||||
|
||||
#tStartingWarningTime := #Settings.tStartingTime;
|
||||
#TOnStartingWarningTimer(IN := #nState = "E_DeviceState.eStarting" OR #nState = "E_DeviceState.eExecute",
|
||||
PT := #tStartingWarningTime);
|
||||
|
||||
// Begrenzen
|
||||
IF #stInOutInterfaceHMI.tEnergySafeTime <= T#0s THEN
|
||||
#stInOutInterfaceHMI.tEnergySafeTime := #tEnergySafeTime;
|
||||
END_IF;
|
||||
|
||||
#TOnEnergySafeTimer(IN := ((#nState = "E_DeviceState.eExecute") OR (#nState = "E_DeviceState.eSuspending")) AND
|
||||
(#xInEnergySafeRequest),
|
||||
PT := (* #stInOutHMI.tEnergySafeTime *)#Settings.tEnergySafeTime);
|
||||
#TOnNextConveyorReadyTimer(IN := NOT #xInNextConveyorReady,
|
||||
PT := #tNextConveyorReadyTime);
|
||||
#TOnFullTimer(IN := (#nState = "E_DeviceState.eExecute") AND #xInFull,
|
||||
PT := #tFullTime);
|
||||
|
||||
#TONStateTimer(IN := #xStateTimer,
|
||||
PT := #tStateTimer);
|
||||
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION StateStatus
|
||||
CASE #nState OF
|
||||
0..9:
|
||||
#eOutState := "E_DeviceState.eStopped";
|
||||
#sOutState := 'Stopped';
|
||||
(* // #sStateColor := F_ImageSelectString(sImagePool := MachineParameter.cImagePoolPath, nImageNo := sw_300_300); *)
|
||||
10..99:
|
||||
#eOutState := "E_DeviceState.eResetting";
|
||||
#sOutState := 'Resetting';
|
||||
100..109:
|
||||
#eOutState := "E_DeviceState.eIdle";
|
||||
#sOutState := 'Idle';
|
||||
(* // #sStateColor := F_ImageSelectString(sImagePool := MachineParameter.cImagePoolPath, nImageNo := grau_300_300); *)
|
||||
110..999:
|
||||
#eOutState := "E_DeviceState.eStarting";
|
||||
#sOutState := 'Starting';
|
||||
// #sStateColor := F_ImageSelectString(sImagePool := MachineParameter.cImagePoolPath, nImageNo := gelb_300_300);
|
||||
1000..1999:
|
||||
#eOutState := "E_DeviceState.eExecute";
|
||||
#sOutState := 'Execute';
|
||||
// #sStateColor := F_ImageSelectString(sImagePool := MachineParameter.cImagePoolPath, nImageNo := gruen_300_300);
|
||||
2000..2499:
|
||||
#eOutState := "E_DeviceState.eCompleting";
|
||||
#sOutState := 'Completing';
|
||||
// #sStateColor := F_ImageSelectString(sImagePool := MachineParameter.cImagePoolPath, nImageNo := gelb_300_300);
|
||||
2500..2999:
|
||||
#eOutState := "E_DeviceState.eComplete";
|
||||
#sOutState := 'eComplete';
|
||||
// #sStateColor := F_ImageSelectString(sImagePool := MachineParameter.cImagePoolPath, nImageNo := ws_300_300);
|
||||
3000..3499:
|
||||
#eOutState := "E_DeviceState.eHolding";
|
||||
#sOutState := 'Holding';
|
||||
3500..3599:
|
||||
#eOutState := "E_DeviceState.eHeld";
|
||||
#sOutState := 'Held';
|
||||
3600..3999:
|
||||
#eOutState := "E_DeviceState.eUnholding";
|
||||
#sOutState := 'Unholding';
|
||||
4000..4499:
|
||||
#eOutState := "E_DeviceState.eSuspending";
|
||||
#sOutState := 'Suspending';
|
||||
4500..4599:
|
||||
#eOutState := "E_DeviceState.eSuspended";
|
||||
#sOutState := 'Suspended';
|
||||
// #sStateColor := F_ImageSelectString(sImagePool := MachineParameter.cImagePoolPath, nImageNo := blau_300_300);
|
||||
4600..4999:
|
||||
#eOutState := "E_DeviceState.eUnsuspending";
|
||||
#sOutState := 'Unsuspending';
|
||||
5000..5999:
|
||||
#eOutState := "E_DeviceState.eStopping";
|
||||
#sOutState := 'Stopping';
|
||||
// #sStateColor := F_ImageSelectString(sImagePool := MachineParameter.cImagePoolPath, nImageNo := rot_300_300);
|
||||
6000..6499:
|
||||
#eOutState := "E_DeviceState.eAborting";
|
||||
#sOutState := 'Aborting';
|
||||
6500..6599:
|
||||
#eOutState := "E_DeviceState.eAborted";
|
||||
#sOutState := 'Aborted';
|
||||
6600..6999:
|
||||
#eOutState := "E_DeviceState.eClearing";
|
||||
#sOutState := 'Clearing';
|
||||
10000..11000:
|
||||
#eOutState := "E_DeviceState.eHeld";
|
||||
#sOutState := 'Held';
|
||||
// #sStateColor := F_ImageSelectString(sImagePool := MachineParameter.cImagePoolPath, nImageNo := rot_300_300);
|
||||
ELSE
|
||||
#eOutState := "E_DeviceState.eUndefined";
|
||||
#sOutState := 'Undefined';
|
||||
// #sStateColor := F_ImageSelectString(sImagePool := MachineParameter.cImagePoolPath, nImageNo := rot_300_300);
|
||||
END_CASE;
|
||||
END_REGION
|
||||
|
||||
REGION Visu
|
||||
|
||||
#stInOutInterfaceHMI.nState := #nState;
|
||||
#stInOutInterfaceHMI.sStateText := #sStateText;
|
||||
|
||||
REGION Status
|
||||
IF #xReadyToStart THEN // Keine Fehler (Safety, ChainBreak, MotorProtection)
|
||||
CASE #nState OF
|
||||
"E_DeviceState.eUndefined", "E_DeviceState.eStopping", "E_DeviceState.eStopped", "E_DeviceState.eIdle":
|
||||
#stInOutInterfaceHMI.bStatus := 0; // NOT_AVAILABLE
|
||||
"E_DeviceState.eStarting", 500, "E_DeviceState.eExecute", "E_DeviceState.eHolding", "E_DeviceState.eHeld", "E_DeviceState.eUnholding", "E_DeviceState.eSuspending", "E_DeviceState.eSuspended", "E_DeviceState.eUnsuspending":
|
||||
#stInOutInterfaceHMI.bStatus := 1; // AVAILABLE
|
||||
ELSE //Fallback
|
||||
#stInOutInterfaceHMI.bStatus := 0; // NOT AVAILABLE
|
||||
END_CASE;
|
||||
ELSE // Fehler
|
||||
#stInOutInterfaceHMI.bStatus := 2; // ERROR
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
REGION Modes
|
||||
// Int16 Bit-codiert
|
||||
#stInOutInterfaceHMI.nMode.%X0 := (#nState = "E_DeviceState.eUndefined") OR (#nState = "E_DeviceState.eStopped") OR (#nState = "E_DeviceState.eIdle"); // The device is turned off
|
||||
#stInOutInterfaceHMI.nMode.%X1 := (#nState = "E_DeviceState.eStarting") OR (#nState = "E_DeviceState.eExecute") OR (#nState = "E_DeviceState.eUnholding"); // The device is turned on
|
||||
#stInOutInterfaceHMI.nMode.%X2 := #stInOutInterfaceHMI.xDisableConveyor OR #stInOutInterfaceHMI.xManual OR #stInOutInterfaceHMI.xSemiAuto OR (#nState = 500) (* OR #xViSuManualMode OR #xViSuSemiAutoMode *); // The device is being manually operated
|
||||
#stInOutInterfaceHMI.nMode.%X3 := (#nState = "E_DeviceState.eHeld"); //The device only is on when the device is needed (like standby)
|
||||
#stInOutInterfaceHMI.nMode.%X10 := (#nState = "E_DeviceState.eSuspended"); // Overflow Error is set for this device
|
||||
END_REGION
|
||||
|
||||
#stInOutInterfaceHMI.xIsInAutomatic := #xAutomaticMode;
|
||||
#stInOutInterfaceHMI.xEnergySaveReq := (#xInEnergySafeRequest);
|
||||
#stInOutInterfaceHMI.xPowerContactor := #xOutPowerContactor;
|
||||
#stInOutInterfaceHMI.xPluggedChainBreak := #Settings.xGridActive;
|
||||
#stInOutInterfaceHMI.xStatusChainBreak := (#Settings.xGridActive AND NOT #xGridError) OR NOT #Settings.xGridActive;
|
||||
#stInOutInterfaceHMI.xStatusMotorProtect := #xInMotorProtectionMonitoring;
|
||||
#stInOutInterfaceHMI.xConveyorFull1 := FALSE;
|
||||
#stInOutInterfaceHMI.xConveyorFull2 := FALSE;
|
||||
#stInOutInterfaceHMI.xReady2Receive := TRUE;
|
||||
#stInOutInterfaceHMI.xNextConveyorReady := TRUE;
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION Monitoring
|
||||
#fbMonitoringChainBreak.stSettings.nErrorType := 1;
|
||||
#fbMonitoringChainBreak.stSettings.xErrLedIfMachineIsOff := TRUE;
|
||||
#fbMonitoringChainBreak.stSettings.xSelfQuit := TRUE;
|
||||
#fbMonitoringChainBreak(sInFctnName := 'Sort Conveyor',
|
||||
InOutMachineState := #stInOutControlUnitCabinet,
|
||||
xInQuitError := #stInOutControlUnitCabinet.xQuitError,
|
||||
xInSignal := NOT #xErrorChain,
|
||||
sInAlarmMessage := 'Kettenspannung nicht ausreichend oder Kette gebrochen! Ueberpruefen Sie die Kette.');
|
||||
|
||||
#fbMonitoringMotorProtection.stSettings.nErrorType := 1;
|
||||
#fbMonitoringMotorProtection.stSettings.xErrLedIfMachineIsOff := TRUE;
|
||||
#fbMonitoringMotorProtection.stSettings.xSelfQuit := TRUE;
|
||||
#fbMonitoringMotorProtection.stSettings.tDelay := T#1s;
|
||||
#fbMonitoringMotorProtection(sInPrefix := #stInOutInterfaceHMI.sConveyorName,
|
||||
wInTextListId_Function := 400,
|
||||
wInTextListId_Message := 401,
|
||||
sInSuffix := #Settings.sMotorProtectName,
|
||||
InOutMachineState := #stInOutControlUnitCabinet,
|
||||
xInQuitError := #stInOutControlUnitCabinet.xQuitError,
|
||||
xInSignal := #xInMotorProtectionMonitoring);
|
||||
END_REGION
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
LibraryType:
|
||||
Guid: d0ad9446-bc78-42a5-b84b-49a4797c28ac
|
||||
Comment:
|
||||
de-DE: Initial
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.32
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: DoNotDeleteOnScanCorrection benutzt um Meldung "Carrier kommt nicht an" einstellbar zu machen
|
||||
@@ -0,0 +1,57 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_ILS_MTRO_1Sep.scl
|
||||
Hash: umhqNyG9FtW9SgmMzYIetWW2VbMzr2vIZ4SZtZBjNkc=
|
||||
LibraryMetaFileHash: hzrYxyjc0YkD2PM6EBe8rUOdl36+kofESSfQNFnClu8=
|
||||
LibraryVersion:
|
||||
Guid: 574d1c63-2f47-400a-81d4-5ae98e38068a
|
||||
DependsOn:
|
||||
- TypeName: UDT_MainState
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_SetAlarmAndLog
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: FB_ILS_STRO_Sep
|
||||
VersionNumber: 2.0.8
|
||||
- TypeName: FB_StateManager
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Response
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: SettingsSeparator
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: UDT_SettingsBarcodeReader
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Sensor
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stCarrier
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stEventCorrectionInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_EventLog_Booking
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stJamData
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stEventBookingInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_BarcodeReaderCognex
|
||||
VersionNumber: 2.0.4
|
||||
- TypeName: stCognexInterface
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_HMI_TRO
|
||||
VersionNumber: 2.0.4
|
||||
- TypeName: FB_EventLog_Correction
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_EventLog_Scan
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_Monitoring
|
||||
VersionNumber: 2.0.5
|
||||
- TypeName: UDT_Request
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stEventScanInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_CarrAccumulate1Sep
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_Route
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: FC_TSHR_Shift
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: FC_Ean8_CheckDigit
|
||||
VersionNumber: 2.0.0
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
LibraryType:
|
||||
Guid: 2dfa028b-93e2-4db3-a2df-573dd5f5a859
|
||||
Comment:
|
||||
de-DE: initial
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.32
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
@@ -0,0 +1,51 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_ILS_MTRO_1Sep1Swi.scl
|
||||
Hash: Br5ZHa/6Yd6pW6CiwiDx/Ju0wsXPfgZ5++n/Uy45Zrg=
|
||||
LibraryMetaFileHash: ykUAEsyT2ZOfMgaTTZTQEsCCIlSuM6tCeDahIMzVlQg=
|
||||
LibraryVersion:
|
||||
Guid: 9b45df8c-7bb0-44b6-97db-967b2a2d5925
|
||||
DependsOn:
|
||||
- TypeName: UDT_MainState
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stCognexInterface
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: SettingsSeparator
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: SettingsSwitch
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_SettingsBarcodeReader
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_StateManager
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_ILS_STRO_Sep
|
||||
VersionNumber: 2.0.8
|
||||
- TypeName: FB_ILS_STRO_Switch
|
||||
VersionNumber: 2.0.3
|
||||
- TypeName: stEventCorrectionInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_Monitoring
|
||||
VersionNumber: 2.0.5
|
||||
- TypeName: UDT_HMI_TRO
|
||||
VersionNumber: 2.0.4
|
||||
- TypeName: UDT_Sensor
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Request
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Response
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stEventBookingInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stCarrier
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stJamData
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_BarcodeReaderCognex
|
||||
VersionNumber: 2.0.4
|
||||
- TypeName: stEventScanInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_Ean8_CheckDigit
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_Route
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: FC_TSHR_Shift
|
||||
VersionNumber: 2.0.1
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
LibraryType:
|
||||
Guid: ee0a8e96-59fd-4b31-b321-6af5535f2d37
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.5
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: Initial
|
||||
@@ -0,0 +1,47 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_ILS_MTRO_1Sep2Swi.scl
|
||||
Hash: ezNcvr15nq3IymiSoglgFPBP7lCoI1RCxwhQHFwariI=
|
||||
LibraryMetaFileHash: ZdidBrjxDChTe+r5p/+8cYV6xW2yCj/02uWN9ly3TwI=
|
||||
LibraryVersion:
|
||||
Guid: 49847e72-1709-4b34-a0c5-c734164c1f45
|
||||
DependsOn:
|
||||
- TypeName: UDT_Sensor
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: SettingsSeparator
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: SettingsSwitch
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_SettingsBarcodeReader
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Response
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Request
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_MainState
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stCognexInterface
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stCarrier
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stJamData
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_HMI_TRO
|
||||
VersionNumber: 2.0.4
|
||||
- TypeName: FB_StateManager
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_ILS_STRO_Sep
|
||||
VersionNumber: 2.0.8
|
||||
- TypeName: FB_ILS_STRO_Switch
|
||||
VersionNumber: 2.0.3
|
||||
- TypeName: FB_BarcodeReaderCognex
|
||||
VersionNumber: 2.0.4
|
||||
- TypeName: stEventBookingInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stEventScanInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stEventCorrectionInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_Ean8_CheckDigit
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_Route
|
||||
VersionNumber: 2.0.1
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,10 @@
|
||||
LibraryType:
|
||||
Guid: 63d716e2-f16e-400d-9ae2-7c900ae1baaa
|
||||
Comment:
|
||||
de-DE: Spezial TRO mit SSCC (im Test)
|
||||
LibraryVersion:
|
||||
VersionNumber: 0.0.8
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: Spezial TRO mit SSCC
|
||||
@@ -0,0 +1,59 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_ILS_MTRO_1Sep_SSCC.scl
|
||||
Hash: C2W6IrOSvJvrHD4EsDODFr8pfn5FCmXHKBGuoheWL0o=
|
||||
LibraryMetaFileHash: SztRLFJMpsj0TCiK3yfu0MDP8gaYpmZAh9h+yuTHeD4=
|
||||
LibraryVersion:
|
||||
Guid: 184eacf8-1dc0-461f-b2c0-7c7695663004
|
||||
DependsOn:
|
||||
- TypeName: UDT_MainState
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_SetAlarmAndLog
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: FB_ILS_STRO_Sep
|
||||
VersionNumber: 2.0.8
|
||||
- TypeName: FB_StateManager
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Response
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: SettingsSeparator
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: UDT_SettingsBarcodeReader
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Sensor
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stCarrier
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stEventCorrectionInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_EventLog_Booking
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stJamData
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stEventBookingInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_BarcodeReaderCognex
|
||||
VersionNumber: 2.0.4
|
||||
- TypeName: stCognexInterface
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_HMI_TRO
|
||||
VersionNumber: 2.0.4
|
||||
- TypeName: FB_EventLog_Correction
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_EventLog_Scan
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_Monitoring
|
||||
VersionNumber: 2.0.5
|
||||
- TypeName: UDT_Request
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stEventScanInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_CarrAccumulate1Sep
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_SsccBarcodeReader
|
||||
VersionNumber: 0.0.6
|
||||
- TypeName: FC_Route
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: FC_TSHR_Shift
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: FC_Ean8_CheckDigit
|
||||
VersionNumber: 2.0.0
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
LibraryType:
|
||||
Guid: 20cde367-3b9c-47ac-a37d-81376520ad0c
|
||||
LibraryVersion:
|
||||
VersionNumber: 3.0.25
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: Änderung bei UnloadStation (unterlagert)
|
||||
@@ -0,0 +1,85 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_ILS_MTRO_PinStore_Auto.scl
|
||||
Hash: /UCrEElUzeqrXW8RY8gEHrDLt4DMBYZprgOTZIkDYyk=
|
||||
LibraryMetaFileHash: 30luMnC4OZLH2IAPu8Whn8fFX/PnYL4rZfsWCRHzXyM=
|
||||
LibraryVersion:
|
||||
Guid: 6d3f3d13-565a-4cd3-a766-c23713547842
|
||||
DependsOn:
|
||||
- TypeName: UDT_HMI_TRO_PinStore
|
||||
VersionNumber: 2.0.2
|
||||
- TypeName: UDT_SettingsBarcodeReader
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_UnloadingStation
|
||||
VersionNumber: 0.0.6
|
||||
- TypeName: stConveyorStations
|
||||
VersionNumber: 2.0.3
|
||||
- TypeName: FB_StationUnloadPin
|
||||
VersionNumber: 2.0.6
|
||||
- TypeName: UDT_MainState
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stStorageLine
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stEventCorrectionInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stEventBookingInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_ILS_STRO_Sep
|
||||
VersionNumber: 2.0.8
|
||||
- TypeName: stCognexInterface
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_BarcodeReaderCognex
|
||||
VersionNumber: 2.0.4
|
||||
- TypeName: FB_EventLog_Booking
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_StateManager
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: SettingsSeparator
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: CarrierStatisticsStore
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Sensor
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stEventScanInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Response
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Request
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_SepPrio
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stJamData
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_CarrAccumulate1Sep
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_MFR_StoreTRO
|
||||
VersionNumber: 2.0.2
|
||||
- TypeName: FB_PriorityManager
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_PrioParameter
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_MTRO_Prio
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_EventLog_Correction
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_EventLog_Scan
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stCarrier
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stCarrierPin
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_TSHR_Shift
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: FC_SHR_HangerAddPin
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: FC_Route
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: FC_Ean8_CheckDigit
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_TargetDecision
|
||||
VersionNumber: 2.0.9
|
||||
- TypeName: FC_TSHR_AddAtEnd
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_SHR_CyclePin
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_SHR_CheckStationPin
|
||||
VersionNumber: 2.0.0
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,10 @@
|
||||
LibraryType:
|
||||
Guid: 901da2f1-dd37-4f9f-ad1c-457a2942dfb5
|
||||
Comment:
|
||||
de-DE: Initial
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.44
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: unterlagerte Änderung + Error an HMI
|
||||
@@ -0,0 +1,63 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_ILS_MTRO_Vario.scl
|
||||
Hash: ij8+quD1+6/Y2Gll+lwVcUtBDYJ55Jr2O9+3zkrVYWk=
|
||||
LibraryMetaFileHash: nsBzoQhuClVvQibr/51Q+TUKf5a3/vLnUmtaLITQ8Kg=
|
||||
LibraryVersion:
|
||||
Guid: 8b55333c-b1cd-4393-90bf-b434182d114b
|
||||
DependsOn:
|
||||
- TypeName: FB_ILS_STRO_Vario
|
||||
VersionNumber: 2.0.18
|
||||
- TypeName: UDT_MainState
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_HMI_TRO
|
||||
VersionNumber: 2.0.4
|
||||
- TypeName: FB_StateManager
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Response
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: SettingsSeparator
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: FB_ILS_STRO_Sep
|
||||
VersionNumber: 2.0.8
|
||||
- TypeName: FB_BarcodeReaderCognex
|
||||
VersionNumber: 2.0.4
|
||||
- TypeName: stCognexInterface
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stCarrier
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_Monitoring
|
||||
VersionNumber: 2.0.5
|
||||
- TypeName: stEventBookingInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: SettingsVario
|
||||
VersionNumber: 2.0.5
|
||||
- TypeName: stJamData
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Request
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_CarrAccumulate1Sep
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_SettingsVarioFingerMonitoring
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_SetAlarmAndLog
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: UDT_SettingsBarcodeReader
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Sensor
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_EventLog_Booking
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stEventCorrectionInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stEventScanInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_EventLog_Correction
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_EventLog_Scan
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_Route
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: FC_TSHR_Shift
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: FC_Ean8_CheckDigit
|
||||
VersionNumber: 2.0.0
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,10 @@
|
||||
LibraryType:
|
||||
Guid: 61279537-838f-481a-b050-d5fb621f0c51
|
||||
Comment:
|
||||
de-DE: Spezial TRO mit SSCC
|
||||
LibraryVersion:
|
||||
VersionNumber: 0.0.6
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: Spezial TRO mit SSCC
|
||||
@@ -0,0 +1,19 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_SsccBarcodeReader.scl
|
||||
Hash: s4Af9OzYrvEKvlTQhFvtyxRQaXTM+eaAWgKjTuKcPc4=
|
||||
LibraryMetaFileHash: mkFaUnatdEjxr6uhF/FwU8O4IU0JFGOxZWgP7l7jJcc=
|
||||
LibraryVersion:
|
||||
Guid: 2695c196-6166-42c7-8d1e-1f7bc4316779
|
||||
DependsOn:
|
||||
- TypeName: UDT_SettingsBarcodeReader
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stCognexInterface
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_MainState
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_BarcodeReader
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: stHMI_BRCognexDM
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_Monitoring
|
||||
VersionNumber: 2.0.5
|
||||
@@ -0,0 +1,524 @@
|
||||
FUNCTION_BLOCK "FB_SsccBarcodeReader"
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
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
|
||||
tInPlcTime {InstructionName := 'DTL'; LibVersion := '1.0'} : DTL; // SPS Zeit (z.B. für Zeitstempel)
|
||||
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
|
||||
GETIO_PART {InstructionName := 'GETIO_PART'; LibVersion := '1.2'; ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : GETIO_PART;
|
||||
xStartReading : Bool;
|
||||
xTrigger : Bool;
|
||||
xToggleBitFlg : Bool;
|
||||
nBarcode : LInt;
|
||||
sBarcodeString : String[20] := 'none';
|
||||
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";
|
||||
fbMonitoringCamGeneralFault : "FB_Monitoring";
|
||||
fbMonitoringCamRuntimeFail : "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;
|
||||
tPLCTime {InstructionName := 'DTL'; LibVersion := '1.0'} : DTL;
|
||||
END_VAR
|
||||
VAR RETAIN
|
||||
xReInit : Bool;
|
||||
END_VAR
|
||||
VAR
|
||||
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;
|
||||
END_VAR
|
||||
|
||||
VAR CONSTANT
|
||||
"E_DeviceState.eInit2" : Int := 100;
|
||||
"E_DeviceState.eInit1" : Int := 0;
|
||||
"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 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 #tInPlcTime.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 := #tInPlcTime;
|
||||
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 := 20, //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 := #tInPlcTime;
|
||||
#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 := #tInPlcTime;
|
||||
#wOutErrorWord.%X3 := TRUE; // Fehler ASCI Prüfung! zb NoRead von Cam
|
||||
#xCodeBad := TRUE;
|
||||
#nBarcode := -1;
|
||||
#sBarcodeString := 'NOREAD'; // 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 := #tInPlcTime;
|
||||
#xCodeBad := TRUE;
|
||||
#wOutErrorWord.%X2 := TRUE; // Runtime failure
|
||||
#nBarcode := -1;
|
||||
#sBarcodeString := 'NOREAD';
|
||||
#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,6 @@
|
||||
LibraryType:
|
||||
Guid: 0678257d-ddb5-460a-a4ac-69f4da95e1e7
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.2
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
@@ -0,0 +1,6 @@
|
||||
DocumentHash:
|
||||
- FileName: UDT_MFRCtrl.xml
|
||||
Hash: ia5Ybmih6KUb1UAZCcNHmDSCf8mh/M7Bn3w0vece/M0=
|
||||
LibraryMetaFileHash: BORJ8JsdQ/k3ai0U6lB0Sv0RU0X0W14y7rsAafJm/es=
|
||||
LibraryVersion:
|
||||
Guid: 49f2be50-381b-4393-8619-be5f49876873
|
||||
@@ -0,0 +1,85 @@
|
||||
<?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="xStart" Datatype="Bool">
|
||||
<Comment>
|
||||
<MultiLanguageText Lang="de-DE">Freigabe an TRO</MultiLanguageText>
|
||||
</Comment>
|
||||
</Member>
|
||||
<Member Name="nLine" Datatype="DInt">
|
||||
<Comment>
|
||||
<MultiLanguageText Lang="de-DE">Linie</MultiLanguageText>
|
||||
</Comment>
|
||||
</Member>
|
||||
<Member Name="nMode" Datatype="Int">
|
||||
<Comment>
|
||||
<MultiLanguageText Lang="de-DE">Modus (0: Undefiniert | 1: Job mit Anzahl | 2: RapidFire (bis xStart = False) | 3: Initialisieren/Entleeren </MultiLanguageText>
|
||||
</Comment>
|
||||
</Member>
|
||||
<Member Name="nAmount" Datatype="Int">
|
||||
<Comment>
|
||||
<MultiLanguageText Lang="de-DE">Anzahl die gefahren werden soll bei Modus 1</MultiLanguageText>
|
||||
</Comment>
|
||||
</Member>
|
||||
<Member Name="nAmountOffset" Datatype="Int">
|
||||
<Comment>
|
||||
<MultiLanguageText Lang="de-DE">Offset für die Anzahl die gefahren werden soll bei Modus 1 (nAmount + nAmountOffset) </MultiLanguageText>
|
||||
</Comment>
|
||||
</Member>
|
||||
</Section>
|
||||
</Sections></Interface>
|
||||
<Name>UDT_MFRCtrl</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,6 @@
|
||||
LibraryType:
|
||||
Guid: b7c68d43-4365-44de-ab7f-fba3395c1007
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.2
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
@@ -0,0 +1,6 @@
|
||||
DocumentHash:
|
||||
- FileName: UDT_MFRScanResult.xml
|
||||
Hash: 3CXSh2gEmrywZl/NhspsHfrtRA9IJ/668JI9dxJpplU=
|
||||
LibraryMetaFileHash: cunPZD1SOwG27X/vitI7uTFs5V3rKtgCnFWGZ8YQgFc=
|
||||
LibraryVersion:
|
||||
Guid: b555681d-cc30-4f08-a0b2-dee1619f6f91
|
||||
@@ -0,0 +1,75 @@
|
||||
<?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="xBusy" Datatype="Bool">
|
||||
<Comment>
|
||||
<MultiLanguageText Lang="de-DE">MFR Baustein ist beschäftigt</MultiLanguageText>
|
||||
</Comment>
|
||||
</Member>
|
||||
<Member Name="xNewCarrier" Datatype="Bool">
|
||||
<Comment>
|
||||
<MultiLanguageText Lang="de-DE">Neuer Carrier vom TRO gemeldet</MultiLanguageText>
|
||||
</Comment>
|
||||
</Member>
|
||||
<Member Name="nBarcode" Datatype="DInt">
|
||||
<Comment>
|
||||
<MultiLanguageText Lang="de-DE">Barcode vom Carrier der gemeldet wird</MultiLanguageText>
|
||||
</Comment>
|
||||
</Member>
|
||||
</Section>
|
||||
</Sections></Interface>
|
||||
<Name>UDT_MFRScanResult</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,6 @@
|
||||
LibraryType:
|
||||
Guid: 54786651-aad8-47a2-81cb-747f166d4061
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.2
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
@@ -0,0 +1,6 @@
|
||||
DocumentHash:
|
||||
- FileName: UDT_MFRState.xml
|
||||
Hash: WUhPfKonCfTHnOx6tuyEMcX/KIOeL90x3dB0Vv9YAgw=
|
||||
LibraryMetaFileHash: vg0jMdA+dQlp3rSAs5xG28dp25ybygxR80sv6payO7A=
|
||||
LibraryVersion:
|
||||
Guid: cdacc796-61cb-4ba8-897c-888bf3bf6238
|
||||
@@ -0,0 +1,70 @@
|
||||
<?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="xReady" Datatype="Bool">
|
||||
<Comment>
|
||||
<MultiLanguageText Lang="de-DE">TRO bereit für nächste Anfrage</MultiLanguageText>
|
||||
</Comment>
|
||||
</Member>
|
||||
<Member Name="xBusy" Datatype="Bool">
|
||||
<Comment>
|
||||
<MultiLanguageText Lang="de-DE">TRO ist in Bearbeitung</MultiLanguageText>
|
||||
</Comment>
|
||||
</Member>
|
||||
</Section>
|
||||
</Sections></Interface>
|
||||
<Name>UDT_MFRState</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,6 @@
|
||||
LibraryType:
|
||||
Guid: 81de2ed6-0fbf-428c-bb68-76dfe2a4b58a
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.2
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
@@ -0,0 +1,13 @@
|
||||
DocumentHash:
|
||||
- FileName: UDT_MFR_StoreTRO.xml
|
||||
Hash: gINNOVmyQuRKMWwSa16+ZLPxizwFFHxuWUH6DI8gfFY=
|
||||
LibraryMetaFileHash: bEzpYnSmSIIFxVLaeI+YJuCoxGpqFLxoW9O05xIkB80=
|
||||
LibraryVersion:
|
||||
Guid: 5923cf16-1648-4160-81b0-6e1d8b948fa1
|
||||
DependsOn:
|
||||
- TypeName: UDT_MFRCtrl
|
||||
VersionNumber: 2.0.2
|
||||
- TypeName: UDT_MFRState
|
||||
VersionNumber: 2.0.2
|
||||
- TypeName: UDT_MFRScanResult
|
||||
VersionNumber: 2.0.2
|
||||
@@ -0,0 +1,75 @@
|
||||
<?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="UDT_Ctrl" Datatype=""UDT_MFRCtrl"">
|
||||
<AttributeList>
|
||||
<BooleanAttribute Name="SetPoint" SystemDefined="true">true</BooleanAttribute>
|
||||
</AttributeList>
|
||||
</Member>
|
||||
<Member Name="UDT_State" Datatype=""UDT_MFRState"">
|
||||
<AttributeList>
|
||||
<BooleanAttribute Name="SetPoint" SystemDefined="true">true</BooleanAttribute>
|
||||
</AttributeList>
|
||||
</Member>
|
||||
<Member Name="UDT_Scan" Datatype=""UDT_MFRScanResult"">
|
||||
<AttributeList>
|
||||
<BooleanAttribute Name="SetPoint" SystemDefined="true">true</BooleanAttribute>
|
||||
</AttributeList>
|
||||
</Member>
|
||||
</Section>
|
||||
</Sections></Interface>
|
||||
<Name>UDT_MFR_StoreTRO</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,10 @@
|
||||
LibraryType:
|
||||
Guid: 7d35be77-2a72-4530-b111-2a609340cc24
|
||||
Comment:
|
||||
de-DE: Initial
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.0
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: Initial
|
||||
@@ -0,0 +1,9 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_CarrAccumulate1Sep.scl
|
||||
Hash: N6cbGozMRL5O0uRLedHuJdl8V+0Q+CiRYK3PiQpUby0=
|
||||
LibraryMetaFileHash: L9r6Lmj4aURbtB++qYCQX/yQy2f8AdK1Wg/TnpZuXKU=
|
||||
LibraryVersion:
|
||||
Guid: 2ad8b4f4-249f-4013-ac79-66401f0d4420
|
||||
DependsOn:
|
||||
- TypeName: UDT_Sensor
|
||||
VersionNumber: 2.0.0
|
||||
@@ -0,0 +1,56 @@
|
||||
FUNCTION_BLOCK "FB_CarrAccumulate1Sep"
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
stInSensor1 : "UDT_Sensor"; // Sensor vom 1. Sep
|
||||
xInConvActive : Bool; // Conveyor Rückmeldung
|
||||
stInTimes : Struct
|
||||
tFreeSen1 : Time := T#5000ms; // Zeit welche Sep 1 frei ist
|
||||
tTimerWait : Time := T#10000ms; // Wartezeit
|
||||
END_STRUCT;
|
||||
END_VAR
|
||||
|
||||
VAR_OUTPUT
|
||||
xOutLockSep1 : Bool; // true = Sep 1 wird gesperrt
|
||||
END_VAR
|
||||
|
||||
VAR
|
||||
tOn1 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Timer zählt wie lange Sep 1 warten muss
|
||||
xTimerQ : Bool; // Timerausgang
|
||||
xLockSep1 : Bool;
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
(*
|
||||
<====== Fahrtrichtung <======
|
||||
... -------<----------|o|--------<------ ...
|
||||
Sep 1
|
||||
|
||||
Sep 1 lässt Carrier raus die sich angestaut haben, bis In-Sensor wieder mal eine gewisse Zeit frei ist.
|
||||
Dann beginnt Wartezeit wenn in diesem Zustand Sep 1 erstmals wieder ein In-Signal bekommt. Usw....
|
||||
|
||||
*)
|
||||
|
||||
IF NOT #stInSensor1.xDirectSensor AND #stInSensor1.tDirectChangeLast > #stInTimes.tFreeSen1 THEN
|
||||
#xLockSep1 := TRUE;
|
||||
ELSIF #xTimerQ THEN
|
||||
#xLockSep1 := FALSE;
|
||||
END_IF;
|
||||
|
||||
REGION Timer
|
||||
#tOn1(IN := #xLockSep1 AND #stInSensor1.xDirectSensor AND #xInConvActive, //Conveyoer Full Speed ok und Sep 1 wartet
|
||||
PT := #stInTimes.tTimerWait);
|
||||
|
||||
|
||||
#xTimerQ := #tOn1.Q (* OR (#stInSensor1.xDirectSensor AND #stInSensor1.tDirectChangeLast > #stInTimes.tFullSen1) *);
|
||||
END_REGION
|
||||
|
||||
|
||||
REGION Outputs
|
||||
#xOutLockSep1 := #xLockSep1;
|
||||
END_REGION
|
||||
|
||||
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
LibraryType:
|
||||
Guid: 9efcce89-7b06-4891-9641-6b68006aed8c
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.0
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
@@ -0,0 +1,13 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_PriorityManager.scl
|
||||
Hash: NzWfLNwbHCgIQ09FjswCJqLBoUjRikdGfu39QrN0RqE=
|
||||
LibraryMetaFileHash: kqGkOm3+D2226hP+I8rIYA7hPZUG3JNIJHrkpd/7btg=
|
||||
LibraryVersion:
|
||||
Guid: d2f29772-001f-478c-97e1-1fcccbe27ee7
|
||||
DependsOn:
|
||||
- TypeName: UDT_Request
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Response
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_PrioParameter
|
||||
VersionNumber: 2.0.0
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,6 @@
|
||||
LibraryType:
|
||||
Guid: 147eef49-040b-42d5-ae7d-43bf675e04d5
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.0
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
@@ -0,0 +1,11 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_SepPrio.scl
|
||||
Hash: TiobJ+rsdBzTeu+UkBCNDx/iaFdgdPd64yzefoiS5DY=
|
||||
LibraryMetaFileHash: /SJOtlF6TYllHtWLntRFYmq6E9lvJkhN6tgxX7jkSrQ=
|
||||
LibraryVersion:
|
||||
Guid: e2fffa67-74ab-4d49-9905-ebe62964e7d5
|
||||
DependsOn:
|
||||
- TypeName: FB_StateManager
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stJamData
|
||||
VersionNumber: 2.0.0
|
||||
@@ -0,0 +1,304 @@
|
||||
FUNCTION_BLOCK "FB_SepPrio"
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
xInSepReq1 : Bool; // Anforderung von Sep1
|
||||
xInSepReq2 : Bool; // Anforderung von Sep2
|
||||
xInSepReq3 : Bool; // Anforderung von Sep3
|
||||
xInSepRelease1 : Bool; // Sep 1 hat rausgelassen
|
||||
xInSepRelease2 : Bool; // Sep 2 hat rausgelassen
|
||||
xInSepRelease3 : Bool; // Sep 3 hat rausgelassen
|
||||
xInActive : Bool; // Freigabe grundsätzlich für Separatoren
|
||||
xInCarRun : Bool; // NIU Motor läuft
|
||||
tInTime3 : Time; // Zeit die Sep 3 braucht
|
||||
tInTime2 : Time; // Zeit die Sep 2 braucht
|
||||
END_VAR
|
||||
|
||||
VAR_OUTPUT
|
||||
xOutSepGo1 : Bool; // Freigabe für einzelnen Sep 1
|
||||
xOutSepGo2 : Bool; // Freigabe für einzelnen Sep 2
|
||||
xOutSepGo3 : Bool; // Freigabe für einzelnen Sep 3
|
||||
END_VAR
|
||||
|
||||
VAR_IN_OUT
|
||||
InOutJam : "stJamData";
|
||||
END_VAR
|
||||
|
||||
VAR
|
||||
fbStateManager : "FB_StateManager";
|
||||
nState : Int; // Schritt
|
||||
tTime3 {InstructionName := 'TOF_TIME'; LibVersion := '1.0'} : TOF_TIME; // Timer von Sep 3
|
||||
tTime2 {InstructionName := 'TOF_TIME'; LibVersion := '1.0'} : TOF_TIME; // Timer von Sep 2
|
||||
tTime1 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
||||
rTrigNotActive {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
|
||||
rTrig2 {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
|
||||
fTrig3 {InstructionName := 'F_TRIG'; LibVersion := '1.0'} : F_TRIG;
|
||||
fTrig2 {InstructionName := 'F_TRIG'; LibVersion := '1.0'} : F_TRIG;
|
||||
xTimeBit3 : Bool; // Merker für Timer falls unterbrochen wird
|
||||
xTimeBit2 : Bool; // Merker für Timer falls unterbrochen wird
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
tmpActUnivTon : Bool;
|
||||
END_VAR
|
||||
|
||||
VAR CONSTANT
|
||||
cOff : Int := 0;
|
||||
cWaitAll : Int := 1;
|
||||
cWaitFor3 : Int := 30;
|
||||
cWaitFor2 : Int := 20;
|
||||
cOnlySep1 : Int := 10;
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
(*
|
||||
_______________________<==
|
||||
| | |
|
||||
| | |
|
||||
\ \ \
|
||||
\ \ \
|
||||
______3______2______1_____==>
|
||||
|
||||
3 hat vor 2 und 1 Vorfahrt
|
||||
2 hat vor 1 Vorfahrt aber muss Zeit 3 abwarten
|
||||
1 muss Zeit 3 und 2 abwarten
|
||||
|
||||
*)
|
||||
|
||||
|
||||
REGION Schrittkette
|
||||
CASE #nState OF
|
||||
#cOff:
|
||||
REGION 000: Off
|
||||
#xOutSepGo3 := FALSE;
|
||||
#xOutSepGo2 := FALSE;
|
||||
#xOutSepGo1 := FALSE;
|
||||
|
||||
// IF #xInActive THEN
|
||||
#nState := #cWaitAll;
|
||||
// END_IF;
|
||||
END_REGION
|
||||
#cWaitAll:
|
||||
REGION 001: Wait All
|
||||
#xOutSepGo3 := FALSE;
|
||||
#xOutSepGo2 := FALSE;
|
||||
#xOutSepGo1 := FALSE;
|
||||
//***************NEU***********
|
||||
#nState := 005;
|
||||
//*************NEU ENDE*******
|
||||
|
||||
|
||||
(*IF NOT #xInActive THEN
|
||||
#nState := #cOff;*)
|
||||
// //********************Kombinationen mit Sep3*************************************************
|
||||
// IF #xInSepReq3 AND #xInSepReq2 AND #xInSepReq1 THEN
|
||||
// #xOutSepGo3 := TRUE;
|
||||
// #xOutSepGo2 := false;//TRUE;
|
||||
// #xOutSepGo1 := false;//TRUE;
|
||||
// #nState := #cWaitFor3;
|
||||
// ELSIF #xInSepReq3 AND (#xInSepReq2 OR NOT #xInSepReq1) THEN
|
||||
// #xOutSepGo3 := TRUE;
|
||||
// #xOutSepGo2 := false;//TRUE;
|
||||
// #xOutSepGo1 := FALSE;
|
||||
// #nState := #cWaitFor3;
|
||||
// ELSIF #xInSepReq3 AND (NOT #xInSepReq2 OR #xInSepReq1) THEN
|
||||
// #xOutSepGo3 := TRUE;
|
||||
// #xOutSepGo2 := FALSE;
|
||||
// #xOutSepGo1 := false;//TRUE;
|
||||
// #nState := #cWaitFor3;
|
||||
// ELSIF #xInSepReq3 AND (NOT #xInSepReq2 AND NOT #xInSepReq1) THEN
|
||||
// #xOutSepGo3 := TRUE;
|
||||
// #xOutSepGo2 := FALSE;
|
||||
// #xOutSepGo1 := FALSE;
|
||||
// #nState := #cWaitFor3;
|
||||
// //********************Kombinationen ohne Sep3************************************************
|
||||
// ELSIF NOT #xInSepReq3 AND (#xInSepReq2 AND #xInSepReq1) THEN
|
||||
// #xOutSepGo3 := FALSE;
|
||||
// #xOutSepGo2 := TRUE;
|
||||
// #xOutSepGo1 := false;//TRUE;
|
||||
// #nState := #cWaitFor2;
|
||||
// ELSIF NOT #xInSepReq3 AND (#xInSepReq2 AND NOT #xInSepReq1) THEN
|
||||
// #xOutSepGo3 := FALSE;
|
||||
// #xOutSepGo2 := TRUE;
|
||||
// #xOutSepGo1 := FALSE;
|
||||
// #nState := #cWaitFor2;
|
||||
// //********************Nur Sep1 alleine***************************************************
|
||||
// ELSIF NOT #xInSepReq3 AND (NOT #xInSepReq2 AND #xInSepReq1) THEN
|
||||
// #xOutSepGo3 := FALSE;
|
||||
// #xOutSepGo2 := FALSE;
|
||||
// #xOutSepGo1 := TRUE;
|
||||
// #nState := #cOnlySep1;
|
||||
// END_IF;
|
||||
END_REGION
|
||||
005:
|
||||
REGION 005: NEU Zwischenschritt
|
||||
#xOutSepGo3 := FALSE;
|
||||
#xOutSepGo2 := FALSE;
|
||||
#xOutSepGo1 := FALSE;
|
||||
|
||||
IF #fbStateManager.tOutTimeInStep > T#6s THEN
|
||||
IF #xInSepReq1 THEN
|
||||
#nState := 006; // Embi
|
||||
// #nState := 010;
|
||||
ELSIF #xInSepReq2 THEN
|
||||
#nState := 16; // Embi
|
||||
// #nState := 020;
|
||||
// ELSIF #xInSepReq3 THEN
|
||||
// #nState := 26; // Embi
|
||||
// #nState := 030;
|
||||
END_IF;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
006:
|
||||
REGION 006: Warten auf freie Ausfahrt
|
||||
#xOutSepGo3 := FALSE;
|
||||
#xOutSepGo2 := FALSE;
|
||||
#xOutSepGo1 := FALSE;
|
||||
IF #InOutJam.Status.nCount = 0 OR #fbStateManager.tOutTimeInStep > T#24s THEN
|
||||
#nState := #cOnlySep1;
|
||||
END_IF;
|
||||
END_REGION
|
||||
#cOnlySep1:
|
||||
REGION 010: Only Sep 1
|
||||
#xOutSepGo3 := FALSE;
|
||||
#xOutSepGo2 := FALSE;
|
||||
#xOutSepGo1 := TRUE;
|
||||
|
||||
//***************NEU***********
|
||||
IF #fbStateManager.tOutTimeInStep > T#10s THEN
|
||||
#nState := 015;
|
||||
END_IF;
|
||||
//*************NEU ENDE*******
|
||||
|
||||
// IF (#xInSepReq2 OR #xInSepReq3) AND #tTime1.Q THEN //Wird sofort von 2 oder 3 unterbrochen
|
||||
// #xOutSepGo3 := FALSE;
|
||||
// #xOutSepGo2 := FALSE;
|
||||
// #xOutSepGo1 := FALSE;
|
||||
// #nState := #cWaitAll;
|
||||
// END_IF;
|
||||
END_REGION
|
||||
015:
|
||||
REGION 015: NEU Zwischenschritt
|
||||
#xOutSepGo3 := FALSE;
|
||||
#xOutSepGo2 := FALSE;
|
||||
#xOutSepGo1 := FALSE;
|
||||
|
||||
IF #fbStateManager.tOutTimeInStep > T#4s THEN
|
||||
IF #xInSepReq2 THEN
|
||||
#nState := 16; // Embi
|
||||
// #nState := 020;
|
||||
// ELSIF #xInSepReq3 THEN
|
||||
// #nState := 26; // Embi
|
||||
// #nState := 030;
|
||||
ELSIF #xInSepReq1 THEN
|
||||
#nState := 6; // Embi
|
||||
// #nState := 010;
|
||||
END_IF;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
016:
|
||||
REGION 16: Warten auf freie Ausfahrt
|
||||
#xOutSepGo3 := FALSE;
|
||||
#xOutSepGo2 := FALSE;
|
||||
#xOutSepGo1 := FALSE;
|
||||
IF #InOutJam.Status.nCount = 0 OR #fbStateManager.tOutTimeInStep > T#26s THEN
|
||||
#nState := #cWaitFor2;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
#cWaitFor2:
|
||||
REGION 020: Wait for 2
|
||||
#xOutSepGo3 := FALSE;
|
||||
#xOutSepGo2 := TRUE;
|
||||
#xOutSepGo1 := FALSE;
|
||||
|
||||
//***************NEU***********
|
||||
IF #fbStateManager.tOutTimeInStep > T#11s THEN
|
||||
// #nState := 025;
|
||||
#nState := 5;
|
||||
END_IF;
|
||||
//*************NEU ENDE*******
|
||||
|
||||
(*IF NOT #xInActive THEN
|
||||
#nState := #cOff;*)
|
||||
// IF #fTrig2.Q THEN //Bis Sep 2 fertig....
|
||||
// #xOutSepGo3 := FALSE;
|
||||
// #xOutSepGo2 := FALSE;
|
||||
// #xOutSepGo1 := FALSE;
|
||||
// #nState := #cWaitAll;
|
||||
// ELSIF #xInSepReq3 THEN //...oder sofort durch Sep 3 unterbrochen
|
||||
// #xOutSepGo3 := TRUE;
|
||||
// #xOutSepGo2 := FALSE;
|
||||
// #xOutSepGo1 := FALSE;
|
||||
// #nState := #cWaitFor3;
|
||||
// END_IF;
|
||||
END_REGION
|
||||
025:
|
||||
REGION 025: NEU Zwischenschritt
|
||||
#xOutSepGo3 := FALSE;
|
||||
#xOutSepGo2 := FALSE;
|
||||
#xOutSepGo1 := FALSE;
|
||||
|
||||
IF #fbStateManager.tOutTimeInStep > T#5s THEN
|
||||
IF #xInSepReq3 THEN
|
||||
#nState := 26; // Embi
|
||||
// #nState := 030;
|
||||
ELSIF #xInSepReq1 THEN
|
||||
#nState := 6; // Embi
|
||||
// #nState := 010;
|
||||
ELSIF #xInSepReq2 THEN
|
||||
#nState := 16; // Embi
|
||||
// #nState := 020;
|
||||
END_IF;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
026:
|
||||
REGION 26: Warten auf freie Ausfahrt
|
||||
#xOutSepGo3 := FALSE;
|
||||
#xOutSepGo2 := FALSE;
|
||||
#xOutSepGo1 := FALSE;
|
||||
IF #InOutJam.Status.nCount = 0 OR #fbStateManager.tOutTimeInStep > T#25s THEN
|
||||
#nState := #cWaitFor3;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
#cWaitFor3:
|
||||
REGION 030: Wait for 3
|
||||
#xOutSepGo3 := TRUE;
|
||||
#xOutSepGo2 := FALSE;
|
||||
#xOutSepGo1 := FALSE;
|
||||
|
||||
//***************NEU***********
|
||||
IF #fbStateManager.tOutTimeInStep > T#11s THEN //war 8s
|
||||
#nState := 005;
|
||||
END_IF;
|
||||
//*************NEU ENDE*******
|
||||
|
||||
(*IF NOT #xInActive THEN
|
||||
#nState := #cOff;*)
|
||||
// IF #fTrig3.Q THEN //Bis Sep 3 fertig ist
|
||||
// #xOutSepGo3 := FALSE;
|
||||
// #xOutSepGo2 := FALSE;
|
||||
// #xOutSepGo1 := FALSE;
|
||||
// #nState := #cWaitAll;
|
||||
// END_IF;
|
||||
END_REGION
|
||||
ELSE
|
||||
;
|
||||
END_CASE;
|
||||
END_REGION
|
||||
|
||||
REGION State Manager
|
||||
#fbStateManager.stInSettings.nStartState := 0;
|
||||
#fbStateManager.stInSettings.xActUnivTOn := TRUE;
|
||||
#fbStateManager.stInSettings.xRestartAtStartState := FALSE;
|
||||
#fbStateManager(xInFunctionEnabled:=TRUE,
|
||||
xInRunUnivTOn:=#tmpActUnivTon,
|
||||
nInOutState:=#nState);
|
||||
END_REGION
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
LibraryType:
|
||||
Guid: b2b7bae2-df01-45c1-b728-4f21f6dccf2b
|
||||
Comment:
|
||||
de-DE: Initial
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.2
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
@@ -0,0 +1,9 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_SupervisionRasterSensor.scl
|
||||
Hash: brsi2hAS6wrw9/jmi3v1V82anQUbZwQLOrO9MMcjTSE=
|
||||
LibraryMetaFileHash: rP2CWmPh58VX2bM7MLVbOLWLkCnAMh6UXNcah+oCJ6c=
|
||||
LibraryVersion:
|
||||
Guid: 3b4a840b-d014-4f13-8b4b-a11a10747b6c
|
||||
DependsOn:
|
||||
- TypeName: UDT_Sensor
|
||||
VersionNumber: 2.0.0
|
||||
@@ -0,0 +1,74 @@
|
||||
FUNCTION_BLOCK "FB_SupervisionRasterSensor"
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
stInSenRaster : "UDT_Sensor"; // Das Signal das überwacht wird
|
||||
xInMotorRun : Bool; // Motor dreht sich
|
||||
stInSettings : Struct // Einstellungen
|
||||
xInEnableSupervision : Bool := false; // Überwachung aktiviert
|
||||
tInDelayMotorRun : Time := T#200ms; // Motor Delay
|
||||
tInRasterHigh : Time := T#100ms; // High Signal
|
||||
tInRasterLow : Time := T#100ms; // Low Signal
|
||||
sInConveyorName : String;
|
||||
wInTextListFunctionId : Word;
|
||||
wInTextListMessageId : Word;
|
||||
END_STRUCT;
|
||||
xInErrorQuit : Bool; // Quittieren z.B. Button Reset
|
||||
END_VAR
|
||||
|
||||
VAR_OUTPUT
|
||||
xOutErrorRasterSensor : Bool; // Fehler ausgeben
|
||||
END_VAR
|
||||
|
||||
VAR
|
||||
tOn_RasterHigh {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Überwachungszeit High-Signal
|
||||
tOn_RasterLow {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Überwachungszeit Low-Signal
|
||||
tOnMotorRunningDelay {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Motor Delay Timer
|
||||
xErrorRasterSensor : Bool; // Fehler
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
REGION Überwachung Raster Sensor
|
||||
|
||||
#tOnMotorRunningDelay(IN := #xInMotorRun, // CarouselRun muss delayed benutzt werden, wegen Anfahrzeit vom ETF
|
||||
PT := #stInSettings.tInDelayMotorRun);
|
||||
|
||||
#tOn_RasterHigh(IN := #xInMotorRun AND #tOnMotorRunningDelay.Q AND #stInSenRaster.xDirectSensor,
|
||||
PT := #stInSettings.tInRasterHigh);
|
||||
|
||||
#tOn_RasterLow(IN := #xInMotorRun AND #tOnMotorRunningDelay.Q AND NOT #stInSenRaster.xDirectSensor,
|
||||
PT := #stInSettings.tInRasterLow);
|
||||
|
||||
IF #tOn_RasterHigh.Q OR #tOn_RasterLow.Q THEN // Wenn einer der beiden Timer abläuft, dann Fehler!
|
||||
#xErrorRasterSensor := TRUE;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
REGION Quittieren
|
||||
IF #xErrorRasterSensor AND #stInSettings.xInEnableSupervision AND #xInErrorQuit THEN
|
||||
#xErrorRasterSensor := FALSE;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
REGION Ausgänge
|
||||
#xOutErrorRasterSensor := #xErrorRasterSensor AND #stInSettings.xInEnableSupervision; // Fehler ausgeben, wenn Überwachung aktiviert
|
||||
END_REGION
|
||||
|
||||
(* REGION Monitoring
|
||||
#fbMonitoring.stSettings.nErrorType := 1;
|
||||
#fbMonitoring.stSettings.xErrLedIfMachineIsOff := TRUE;
|
||||
#fbMonitoring.stSettings.xSelfQuit := TRUE;
|
||||
#fbMonitoring.stSettings.tDelay := T#1s;
|
||||
#fbMonitoring(sInFctnName := 'Rastersensorueberwachung',
|
||||
sInPrefix := #stInSettings.sInConveyorName,
|
||||
wInTextListId_Function := #stInSettings.wInTextListFunctionId,
|
||||
wInTextListId_Message := #stInSettings.wInTextListMessageId,
|
||||
sInSuffix := #stInSenRaster.sName,
|
||||
InOutMachineState := "DB_MachineGlobal".stStateMain,
|
||||
xInQuitError := "DB_MachineGlobal".stStateMain.xQuitError,
|
||||
xInSignal := NOT #xErrorRasterSensor,
|
||||
sInAlarmMessage := 'Rastersensorueberwachung ausgeloest');
|
||||
END_REGION *)
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
LibraryType:
|
||||
Guid: 2ed8a6f8-c110-4695-b999-af4dbf845bb4
|
||||
Comment:
|
||||
de-DE: Initial
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.0
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: Initial
|
||||
@@ -0,0 +1,11 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_VarioFingerMonitoring.scl
|
||||
Hash: hO+7ulxM45sR+Y0DWMaxvkMhvex1mfxH3l0j+rQL7S4=
|
||||
LibraryMetaFileHash: z1/42ZPNlHM3vfq0hKE+ij6RojciR6JTY4/0RBG4HBk=
|
||||
LibraryVersion:
|
||||
Guid: b65fb0a1-003f-4b71-8c59-64c01a419f06
|
||||
DependsOn:
|
||||
- TypeName: UDT_SettingsVarioFingerMonitoring
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Sensor
|
||||
VersionNumber: 2.0.0
|
||||
@@ -0,0 +1,43 @@
|
||||
FUNCTION_BLOCK "FB_VarioFingerMonitoring"
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
stInSenFinger : "UDT_Sensor"; // Das zu überwachende Fingerabfrage-Signal
|
||||
xInMotorRun : Bool; // Vario an
|
||||
stInSettings : "UDT_SettingsVarioFingerMonitoring"; // Parameter Einstellungen
|
||||
END_VAR
|
||||
|
||||
VAR_OUTPUT
|
||||
xOutErrorSignal : Bool; // Fehler Ausgang
|
||||
END_VAR
|
||||
|
||||
VAR
|
||||
tOn_SignalHigh {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Einschaltverzögerung High Signal
|
||||
tOn_SignalLow {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Einschaltverzögerung Low Signal
|
||||
tOnMotorRunningDelay {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Einschaltverzögerung Vario an
|
||||
xErrorSignal : Bool; // Fehler
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
REGION Überwachung Raster Sensor
|
||||
|
||||
#tOnMotorRunningDelay(IN := #xInMotorRun, // CarouselRun muss delayed benutzt werden, wegen Anfahrzeit vom ETF
|
||||
PT := #stInSettings.tDelayMotorRun);
|
||||
|
||||
#tOn_SignalHigh(IN := #xInMotorRun AND #tOnMotorRunningDelay.Q AND #stInSenFinger.xDirectSensor,
|
||||
PT := #stInSettings.tSignalHigh);
|
||||
|
||||
#tOn_SignalLow(IN := #xInMotorRun AND #tOnMotorRunningDelay.Q AND NOT #stInSenFinger.xDirectSensor,
|
||||
PT := #stInSettings.tSignalLow);
|
||||
|
||||
#xErrorSignal := #tOn_SignalHigh.Q OR #tOn_SignalLow.Q; // Wenn einer der beiden Timer abläuft, dann Fehler!
|
||||
END_REGION
|
||||
|
||||
REGION Ausgänge
|
||||
|
||||
#xOutErrorSignal := #xErrorSignal AND #stInSettings.xEnableSupervision; // Fehler ausgeben, wenn Überwachung aktiviert
|
||||
|
||||
END_REGION
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
LibraryType:
|
||||
Guid: a394caf2-9e35-454c-b109-30b66c22bddd
|
||||
LibraryVersion:
|
||||
VersionNumber: 0.0.7
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: Bugfix bei 3 Sources
|
||||
@@ -0,0 +1,15 @@
|
||||
DocumentHash:
|
||||
- FileName: Fb_PriorityManagerV2.scl
|
||||
Hash: wqqBp67364m0gt+16CtbP8q4g79tHCbzSx8tBn/Ivl4=
|
||||
LibraryMetaFileHash: 6XcCS8ObOmcFHFc3eoOsI0dRjol0UJSqGnS3J29XZwU=
|
||||
LibraryVersion:
|
||||
Guid: 9a9ac382-d0ec-462d-9753-478a90c82276
|
||||
DependsOn:
|
||||
- TypeName: UDT_Request
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Response
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_PrioParameter
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: udt_InterruptParameter
|
||||
VersionNumber: 0.0.1
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,6 @@
|
||||
LibraryType:
|
||||
Guid: 97355db0-90c7-4394-9656-3acdfec45b04
|
||||
LibraryVersion:
|
||||
VersionNumber: 0.0.1
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
@@ -0,0 +1,6 @@
|
||||
DocumentHash:
|
||||
- FileName: udt_InterruptParameter.xml
|
||||
Hash: /NW/PME3L1cRjrOlhQBiYc3MllTZmwH9rHeW0kDHx+8=
|
||||
LibraryMetaFileHash: JrEilA2LwOeiJO3O1jHkH6aZ5ts+YupQo1GyUy1aXTE=
|
||||
LibraryVersion:
|
||||
Guid: bd3b46ca-0cf0-47fc-9154-7e6e814179d1
|
||||
@@ -0,0 +1,64 @@
|
||||
<?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="n_MainSource" Datatype="USInt" />
|
||||
<Member Name="n_InterruptSource" Datatype="USInt" />
|
||||
<Member Name="t_InterruptDuration" Datatype="Time" />
|
||||
<Member Name="t_PathClearDelay" Datatype="Time" />
|
||||
</Section>
|
||||
</Sections></Interface>
|
||||
<Name>udt_InterruptParameter</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,10 @@
|
||||
LibraryType:
|
||||
Guid: d73846b1-6cd6-414c-ac23-6600e2c98ae1
|
||||
Comment:
|
||||
de-DE: initial
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.8
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: Änderung im unterlagerten Baustein
|
||||
@@ -0,0 +1,23 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_ILS_STRO_Sep.scl
|
||||
Hash: ClpGJAP0rCePPppOePfUPWKhtBF5jadrRtG4uqH1LqQ=
|
||||
LibraryMetaFileHash: bMOFh4gjS1nJGgij/mqFtWyO0w1x3qlbe7js1JoclZA=
|
||||
LibraryVersion:
|
||||
Guid: 456c4cee-f3c8-4642-aa97-cf33a9152512
|
||||
DependsOn:
|
||||
- TypeName: UDT_HMI_Separator
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_Monitoring
|
||||
VersionNumber: 2.0.5
|
||||
- TypeName: UDT_MainState
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_StateManager
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stCarrier
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: IntfSeparator
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: SettingsSeparator
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: UDT_Sensor
|
||||
VersionNumber: 2.0.0
|
||||
@@ -0,0 +1,644 @@
|
||||
FUNCTION_BLOCK "FB_ILS_STRO_Sep"
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
xInConveyorRun : Bool; // Antrieb läuft
|
||||
stInTrolley : "UDT_Sensor"; // Separator In-Sensor
|
||||
xInReceiveReady : Bool; // Freigabe
|
||||
xInErrQuit : Bool; // Fehler quittieren
|
||||
xInReset : Bool; // Baustein rücksetzen
|
||||
xInPinSort : Bool := false; // Sep für das Einsortieren am Pinband
|
||||
stInSettings : "SettingsSeparator";
|
||||
END_VAR
|
||||
|
||||
VAR_OUTPUT
|
||||
stOutMainTro : "IntfSeparator"; // Interface für MainTro
|
||||
xOutConveyorRequest : Bool;
|
||||
xOutTrolleyRequest : Bool;
|
||||
xOutTrolleyInSep : Bool;
|
||||
xOutTrolleyReleasedEdge : Bool; // Flanke bei neuen Trolley am Ausgang
|
||||
xOutStopper : Bool;
|
||||
wOutErrorWord : Word;
|
||||
END_VAR
|
||||
|
||||
VAR_IN_OUT
|
||||
stInOutMainState : "UDT_MainState";
|
||||
stInOutHMI : "UDT_HMI_Separator"; // HMI Schnittstelle
|
||||
stInOutCarrDataInJam : Array[*] of "stCarrier";
|
||||
END_VAR
|
||||
|
||||
VAR
|
||||
fbStateManager : "FB_StateManager";
|
||||
stCarrierDummy { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "stCarrier";
|
||||
tOnHandling {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
||||
tOnTrailing {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
||||
tOnMonitoring {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
||||
END_VAR
|
||||
VAR RETAIN
|
||||
CountCarr {InstructionName := 'CTU_UDINT'; LibVersion := '1.0'} : CTU_UDINT;
|
||||
END_VAR
|
||||
VAR
|
||||
rTrigCount {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
|
||||
nArrayMax : Int;
|
||||
END_VAR
|
||||
VAR RETAIN
|
||||
nState : Int;
|
||||
END_VAR
|
||||
VAR
|
||||
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;
|
||||
fbMonitoringCarrStuck : "FB_Monitoring"; // Carrier verlässt Separator nicht
|
||||
fbMonitoringCarrMismatch : "FB_Monitoring"; // Separator Sensorik unplausibel (z.B. Part-Sensor ohne In-Sensor)
|
||||
wErrorWord : Word;
|
||||
stSimuSeparator : Struct
|
||||
nState : Int;
|
||||
xSensor : Bool;
|
||||
END_STRUCT;
|
||||
stSimuSensor : "UDT_Sensor";
|
||||
xCorrectionDone : Bool; // Einmal probieren
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
t_Status : Int;
|
||||
t_Handling : Bool;
|
||||
t_Trailing : Bool;
|
||||
t_Monitoring : Bool;
|
||||
tmpActUnivTon : Bool;
|
||||
nCount : UDInt;
|
||||
tmpCarrierEmpty : "stCarrier";
|
||||
tTrolley : "UDT_Sensor";
|
||||
END_VAR
|
||||
|
||||
VAR CONSTANT
|
||||
c000_StepInit : Int := 0; // Init
|
||||
c100_StepWaitForTrolley : Int := 100; // Warte auf Trolley
|
||||
c110_StepWaitForRelease : Int := 110; // Warte auf Freigabe
|
||||
c120_StepOpen : Int := 120; // Separator öffnen
|
||||
c130_StepWaitForLeave : Int := 130; // Warte auf Trolley verlassen
|
||||
c140_StepClose1 : Int := 140; // Separator schliessen
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
// Prinzip: Unabhängig von Single Carrier oder Minitrolley -> Einzelachse am Separator takten
|
||||
// Separator übernimmt nur die simple Funktion eines Separator-Moduls (In-Sensor, Stopper Auf, Stopper Zu)
|
||||
// Alle anderen Überprüfungen (z.B. Zappler, Scanner) werden vom MainTro übernommen
|
||||
|
||||
#nArrayMax := DINT_TO_INT(UPPER_BOUND(ARR := #stInOutCarrDataInJam, DIM := 1));
|
||||
|
||||
REGION Info
|
||||
(*Errors
|
||||
#wOutErrorWord.%X0 Step failure
|
||||
#wOutErrorWord.%X1 Carrier stuck
|
||||
#wOutErrorWord.%X2 Carrier mismatch
|
||||
#wOutErrorWord.%X3 Carrier not arriving
|
||||
#wOutErrorWord.%X4 Motor not running
|
||||
#wOutErrorWord.%X5 res5
|
||||
#wOutErrorWord.%X6 res6
|
||||
#wOutErrorWord.%X7 res7
|
||||
#wOutErrorWord.%X8 res8
|
||||
#wOutErrorWord.%X9 res9
|
||||
#wOutErrorWord.%X10 res10
|
||||
#wOutErrorWord.%X11 res11
|
||||
#wOutErrorWord.%X12 res12
|
||||
#wOutErrorWord.%X13 res13
|
||||
#wOutErrorWord.%X14 res14
|
||||
#wOutErrorWord.%X15 Modul reset
|
||||
*)
|
||||
END_REGION
|
||||
|
||||
REGION MT Separator Simu
|
||||
//Simuliert Ablauf für Minitrolley (Sensorverhalten mit Timern nachgebildet)
|
||||
IF #stInSettings.stSimu.xActive THEN
|
||||
IF NOT #stInOutCarrDataInJam[1].bStatus.%X0 THEN
|
||||
#stSimuSeparator.nState := 100;
|
||||
END_IF;
|
||||
|
||||
CASE #stSimuSeparator.nState OF
|
||||
100: //INIT / STANDBY
|
||||
#stSimuSeparator.xSensor := FALSE;
|
||||
IF #stInOutCarrDataInJam[1].bStatus.%X0
|
||||
// AND #stInOutCarrDataInJam[1].nSimuPos = #stInSettings.stSimu.stJamConfig.nMaxPos
|
||||
AND (#stOutMainTro.nStatus = "SepState_WaitForBt" OR #stOutMainTro.nStatus = "SepState_WaitForReq")
|
||||
THEN
|
||||
#stSimuSeparator.nState := 200;
|
||||
END_IF;
|
||||
200: // First MT
|
||||
#stSimuSeparator.xSensor := TRUE;
|
||||
IF #stOutMainTro.nStatus = "SepState_Open" THEN
|
||||
#tmpActUnivTon := TRUE;
|
||||
IF #fbStateManager.tOutUnivTonR > #stInSettings.stSimu.tSenTime THEN
|
||||
#stSimuSeparator.xSensor := FALSE;
|
||||
#stSimuSeparator.nState := 300;
|
||||
END_IF;
|
||||
END_IF;
|
||||
300:
|
||||
IF #stOutMainTro.nStatus = "SepState_WaitForSecondLeg" THEN
|
||||
#stSimuSeparator.nState := 400;
|
||||
END_IF;
|
||||
400:
|
||||
#stSimuSeparator.xSensor := TRUE;
|
||||
IF #stOutMainTro.nStatus = "SepState_OpenSecond" THEN
|
||||
#tmpActUnivTon := TRUE;
|
||||
IF #fbStateManager.tOutUnivTonR > #stInSettings.stSimu.tSenTime THEN
|
||||
#stSimuSeparator.xSensor := FALSE;
|
||||
#stSimuSeparator.nState := 100;
|
||||
END_IF;
|
||||
END_IF;
|
||||
END_CASE;
|
||||
|
||||
END_IF;
|
||||
REGION Sensor Simu
|
||||
// #fbSimuSensorInput(sInName := #stInTrolley.sName,
|
||||
// xInSensor := #stSimuSeparator.xSensor,
|
||||
// stInOutSensor := #stSimuSensor,
|
||||
// stInOutHMI:= #stInOutHMI.
|
||||
// stInOutControlUnitCabinet:=#stInOutMainState);
|
||||
END_REGION
|
||||
|
||||
REGION State Manager Simu
|
||||
(* #fbStateManager.stInSettings.nStartState := 0;
|
||||
#fbStateManager.stInSettings.xActUnivTOn := TRUE;
|
||||
#fbStateManager.stInSettings.xRestartAtStartState := FALSE;
|
||||
#fbStateManager(xInFunctionEnabled := TRUE,
|
||||
xInRunUnivTOn := #tmpActUnivTon,
|
||||
nInOutState := #stSimuSeparator.#nState); *)
|
||||
END_REGION
|
||||
END_REGION
|
||||
|
||||
REGION Sensor Simu
|
||||
IF #stInSettings.stSimu.xActive THEN
|
||||
#tTrolley := #stSimuSensor;
|
||||
ELSE
|
||||
#tTrolley := #stInTrolley;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
REGION ErrorQuitt
|
||||
IF #xInErrQuit THEN
|
||||
#wErrorWord := 0;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
REGION Reset
|
||||
IF #xInReset THEN
|
||||
#nState := 000; // Setz alles auf 0
|
||||
#wErrorWord.%X15 := true; // warning, modul reset
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
|
||||
REGION Step sequence
|
||||
CASE #nState OF
|
||||
#c000_StepInit:
|
||||
REGION Step 000 - init
|
||||
//akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_Init";
|
||||
//Outputs
|
||||
#xOutStopper := FALSE; //Separator zu
|
||||
#xOutTrolleyReleasedEdge := FALSE; //Datenübergabe rücksetzen
|
||||
#xOutConveyorRequest := FALSE; // Förderer Anforderung rücksetzen
|
||||
#xOutTrolleyRequest := FALSE; // Trolley Anforderung rücksetzen
|
||||
#xOutTrolleyInSep := FALSE; // Trolley im Separator rücksetzen
|
||||
|
||||
// SCHRITT 0 NICHT ENTFERNEN!
|
||||
// STATE MANAGER MACHT DEN SCHRITTWECHSEL!
|
||||
|
||||
END_REGION
|
||||
#c100_StepWaitForTrolley:
|
||||
REGION Step 100 - wait for trolley
|
||||
//akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_WaitForBt"; // TODO
|
||||
|
||||
#xOutStopper := FALSE; // Separator zu
|
||||
#xOutTrolleyReleasedEdge := FALSE; // Datenübergabe rücksetzen
|
||||
#xOutConveyorRequest := FALSE; // Förderer Anforderung rücksetzen
|
||||
#xOutTrolleyRequest := TRUE; // Trolley Anforderung
|
||||
|
||||
#xCorrectionDone := FALSE;
|
||||
|
||||
IF #tTrolley.xDirectSensor THEN // Trolley im Separator
|
||||
#nState := #c110_StepWaitForRelease; // Schrittwechsel
|
||||
END_IF;
|
||||
END_REGION
|
||||
#c110_StepWaitForRelease:
|
||||
REGION Step 110 - wait release request
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_WaitForReq";
|
||||
// Outputs
|
||||
#xOutStopper := FALSE; // Separator ZU
|
||||
#xOutTrolleyRequest := FALSE;
|
||||
#xOutTrolleyInSep := (#xInPinSort AND #tTrolley.xDirectSensor) OR (NOT #xInPinSort AND #tTrolley.xDbncdSensor);
|
||||
#xOutConveyorRequest := #xInReceiveReady AND NOT #stInOutHMI.stControl.xLockSeparator; //Bedingung von Außen erfüllt -> Conv anfordern
|
||||
|
||||
#xCorrectionDone := FALSE;
|
||||
//Transition
|
||||
|
||||
IF #xInConveyorRun AND #xInReceiveReady AND #tTrolley.xDbncdSensor AND NOT #stInOutHMI.stControl.xLockSeparator THEN
|
||||
#nState := #c120_StepOpen;
|
||||
ELSIF NOT #tTrolley.xDirectSensor THEN
|
||||
#nState := #c100_StepWaitForTrolley;
|
||||
END_IF;
|
||||
|
||||
(* //Transition
|
||||
//Separator Pinband
|
||||
IF #xInPinSort AND #xInConveyorRun AND NOT #xInScanDone AND #fbStateManager.tOutTimeInStep > T#80ms AND
|
||||
#tTrolley.xDirectSensor THEN
|
||||
#nState := #cStepOpen1;
|
||||
// ELSIF #xInPinSort AND #xInConveyorRun AND #xInScanWrongLeg AND
|
||||
// #tTrolley.xDirectSensor THEN
|
||||
// #nState := #cStepOpen2Correction";
|
||||
//Normal
|
||||
ELSIF (#xInConveyorRun AND
|
||||
((#xInPluggedScan AND #xInScanDone) OR NOT #xInPluggedScan) AND
|
||||
((#xInPluggedZappl AND #xInZappl) OR NOT #xInPluggedZappl) AND
|
||||
#xInReceiveReady AND
|
||||
|
||||
((#tTrolley.xDbncdSensor AND NOT #xInPluggedScan) OR
|
||||
(#tTrolley.xDirectSensor AND #xInPluggedScan)) AND //Freigabe
|
||||
|
||||
NOT #stInOutHMI.stControl.xLockSeparator) // Keine HMI-Sperre
|
||||
OR (#stInOutHMI.stControl.xReleaseOverride AND #tTrolley.xDbncdSensor) // HMI Override
|
||||
THEN
|
||||
#nState := #cStepOpen1;
|
||||
//Fehlerhafte Lesung erkannt
|
||||
ELSIF (#xInConveyorRun AND
|
||||
#xInPluggedScan AND #xInScanWrongLeg AND
|
||||
#xInReceiveReady AND
|
||||
#tTrolley.xDirectSensor AND //Freigabe
|
||||
|
||||
NOT #stInOutHMI.stControl.xLockSeparator) // Keine HMI-Sperre
|
||||
OR (#stInOutHMI.stControl.xReleaseOverride AND #tTrolley.xDbncdSensor) // HMI Override
|
||||
THEN
|
||||
#nState := #cStepOpen2Correction;
|
||||
// ??????????????????????????????? Kein Receive?!
|
||||
(* ELSIF (NOT #xInPluggedScan AND
|
||||
NOT #xInPluggedZappl AND
|
||||
#tTrolley.xDbncdSensor AND //Freigabe
|
||||
|
||||
NOT #stInOutHMI.stControl.xLockSeparator) // Keine HMI-Sperre
|
||||
OR (#stInOutHMI.stControl.xReleaseOverride AND #tTrolley.xDbncdSensor) // HMI Override
|
||||
THEN
|
||||
#nState := #cStepOpen1; *)
|
||||
// Trolley nicht mehr da
|
||||
ELSIF NOT #tTrolley.xDirectSensor THEN
|
||||
#nState := #cStepWaitForTrolley1;
|
||||
END_IF; *)
|
||||
END_REGION
|
||||
|
||||
#c120_StepOpen:
|
||||
REGION Step 120 - separator open
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_Open";
|
||||
|
||||
//Outputs
|
||||
#xOutConveyorRequest := TRUE; // motor on
|
||||
#xOutStopper := TRUE; // stopper open
|
||||
#xOutTrolleyInSep := FALSE;
|
||||
|
||||
//Überwachung
|
||||
#t_Monitoring := #xInConveyorRun;
|
||||
IF #tOnMonitoring.Q THEN
|
||||
#wOutErrorWord.%X1 := TRUE; // err trolley stuck
|
||||
END_IF;
|
||||
|
||||
// Transition
|
||||
IF NOT #tTrolley.xDbncdSensor THEN
|
||||
#nState := #c130_StepWaitForLeave;
|
||||
ELSIF #tOnMonitoring.Q AND #stInSettings.xStuckCorrection AND NOT #xCorrectionDone THEN
|
||||
#nState := 121;
|
||||
END_IF;
|
||||
|
||||
(* //Transition
|
||||
//Korrektur
|
||||
IF #xInPinSort AND #xInScanWrongLeg THEN
|
||||
#nState := #cStepOpen2Correction;
|
||||
//Mit Scanner
|
||||
ELSIF #xInPluggedScan AND NOT #tTrolley.xDirectSensor THEN
|
||||
(* #xInConveyorRun AND *) // motor on?
|
||||
#xOutStopper := FALSE;
|
||||
#nState := #cStepWaitForRelease2;
|
||||
#xOutFirstLegReleasedEdge := TRUE;
|
||||
// Ohne Scanner
|
||||
ELSIF NOT #xInPluggedScan AND
|
||||
NOT #tTrolley.xDbncdSensor // trolley running out?
|
||||
THEN
|
||||
#nState := #cStepWaitForLeave1;
|
||||
END_IF; *)
|
||||
END_REGION
|
||||
|
||||
121:
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_Open";
|
||||
|
||||
//Outputs
|
||||
#xOutConveyorRequest := TRUE; // motor on
|
||||
#xOutStopper := FALSE; // stopper open
|
||||
#xOutTrolleyInSep := FALSE;
|
||||
|
||||
#xCorrectionDone := TRUE;
|
||||
|
||||
IF #fbStateManager.tOutTimeInStep > t#500ms THEN
|
||||
#nState := #c120_StepOpen;
|
||||
END_IF;
|
||||
#c130_StepWaitForLeave:
|
||||
REGION Step 130 - wait trolley exit
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_WaitForLeaveFirst";
|
||||
|
||||
//Outputs
|
||||
#xOutConveyorRequest := TRUE; // motor on
|
||||
#xOutStopper := TRUE; // stopper open
|
||||
#t_Trailing := #xInConveyorRun AND NOT #tTrolley.xDirectSensor; // Zeit neu aufziehen wenn Sensor frei wird
|
||||
|
||||
#xCorrectionDone := FALSE;
|
||||
// Transition
|
||||
IF #tOnTrailing.Q THEN
|
||||
#nState := #c140_StepClose1;
|
||||
#xOutTrolleyReleasedEdge := TRUE;
|
||||
END_IF;
|
||||
END_REGION
|
||||
#c140_StepClose1:
|
||||
REGION Step 140 - separator close
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_Finish";
|
||||
|
||||
#xCorrectionDone := FALSE;
|
||||
//Outputs
|
||||
#xOutTrolleyReleasedEdge := FALSE; // Datenübergabe
|
||||
#xOutStopper := FALSE; // Separator ZU
|
||||
#t_Handling := #xInConveyorRun;
|
||||
|
||||
//Transition
|
||||
#nState := #c100_StepWaitForTrolley;
|
||||
|
||||
END_REGION
|
||||
(* #cStepWaitForTrolley2:
|
||||
REGION Step 200 - wait for trolley second
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_WaitForSecondLeg";
|
||||
|
||||
//Outputs
|
||||
#xOutStopper := FALSE; // Separator ZU
|
||||
#xOutTrolleyReleasedEdge := FALSE; // Datenübergabe
|
||||
#xOutFirstLegReleasedEdge := FALSE;
|
||||
#xOutConveyorRequest := FALSE; //
|
||||
#xOutTrolleyRequest := TRUE;
|
||||
#xOutTrolleyScanRdy := FALSE;
|
||||
|
||||
// Transition
|
||||
// MT 2.Bein kommt nicht..
|
||||
IF #fbStateManager.tOutTimeInStep > T#3s AND #xInConveyorRun AND
|
||||
NOT #xInPluggedScan THEN
|
||||
#nState := #cStepWaitForTrolley1;
|
||||
END_IF;
|
||||
|
||||
//Normal
|
||||
IF
|
||||
#tTrolley.xDirectSensor // Trolley im Separator
|
||||
THEN
|
||||
#nState := #cStepWaitForRelease2;
|
||||
END_IF;
|
||||
END_REGION
|
||||
#cStepWaitForRelease2:
|
||||
REGION Step 210 - wait release request second
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_WaitForReqSecond";
|
||||
|
||||
//Outputs
|
||||
#xOutStopper := FALSE; // Separator ZU
|
||||
#xOutTrolleyRequest := FALSE;
|
||||
#xOutTrolleyInSep := (#xInPinSort AND #tTrolley.xDirectSensor) OR (NOT #xInPinSort AND #tTrolley.xDbncdSensor);
|
||||
#xOutConveyorRequest := #xInReceiveReady AND NOT #stInOutHMI.stControl.xLockSeparator; //Bedingung von Außen erfüllt -> Conv anfordern
|
||||
#xOutTrolleyScanRdy := #xInPluggedScan (* AND #xInScanDone *);
|
||||
|
||||
//Transition
|
||||
|
||||
// IF (#xInConveyorRun AND
|
||||
// ((#xInPinSort AND #xInScanWrongLeg) OR (#xInPinSort AND #xInScanDone)) AND
|
||||
// ((#xInPluggedZappl AND #xInZappl) OR NOT #xInPluggedZappl) AND
|
||||
// #xInReceiveReady AND
|
||||
|
||||
// ((#tTrolley.xDbncdSensor AND NOT #xInPluggedScan) OR
|
||||
// (#tTrolley.xDirectSensor AND #xInPluggedScan)) AND //Freigabe
|
||||
|
||||
// NOT #stInOutHMI.stControl.xLockSeparator) // Keine HMI-Sperre
|
||||
// OR (#stInOutHMI.stControl.xReleaseOverride AND #tTrolley.xDbncdSensor) // HMI Override
|
||||
// THEN
|
||||
// #nState := #cStepOpen2Correction;
|
||||
IF (#xInConveyorRun AND
|
||||
((#xInPluggedScan (* AND #xInScanDone *)) OR NOT #xInPluggedScan) AND
|
||||
((#xInPluggedZappl AND #xInZappl) OR NOT #xInPluggedZappl) AND
|
||||
#xInReceiveReady AND
|
||||
|
||||
((#tTrolley.xDbncdSensor AND NOT #xInPluggedScan) OR
|
||||
(#tTrolley.xDirectSensor AND #xInPluggedScan)) AND //Freigabe
|
||||
|
||||
NOT #stInOutHMI.stControl.xLockSeparator) // Keine HMI-Sperre
|
||||
OR (#stInOutHMI.stControl.xReleaseOverride AND #tTrolley.xDbncdSensor) // HMI Override
|
||||
THEN
|
||||
#nState := #cStepOpen2;
|
||||
ELSIF NOT #tTrolley.xDirectSensor THEN
|
||||
#nState := #cStepWaitForTrolley2;
|
||||
END_IF;
|
||||
END_REGION
|
||||
#cStepOpen2:
|
||||
REGION Step 220 - separator open second
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_OpenSecond";
|
||||
|
||||
// Outputs
|
||||
#xOutConveyorRequest := TRUE; // motor on
|
||||
#xOutStopper := TRUE; // stopper open
|
||||
#xOutTrolleyInSep := FALSE;
|
||||
#xOutTrolleyScanRdy := FALSE;
|
||||
|
||||
#t_Monitoring := #xInConveyorRun;
|
||||
IF #tOnMonitoring.Q THEN
|
||||
#wErrorWord.%X1 := TRUE; // err trolley stuck
|
||||
END_IF;
|
||||
|
||||
// Transition
|
||||
// Mit Scanner
|
||||
IF #xInPluggedScan AND NOT #tTrolley.xDirectSensor THEN
|
||||
#xOutStopper := FALSE;
|
||||
#nState := #cStepWaitForTrolley1;
|
||||
#xOutTrolleyReleasedEdge := TRUE; // Datenübergabe
|
||||
// Ohne Scanner
|
||||
ELSIF NOT #xInPluggedScan AND
|
||||
(* #xInConveyorRun AND *) // monor on?
|
||||
NOT #tTrolley.xDbncdSensor // trolley running out?
|
||||
THEN
|
||||
#nState := #cStepWaitForLeave2;
|
||||
END_IF;
|
||||
END_REGION
|
||||
#cStepOpen2Correction:
|
||||
REGION Step 225 - separator open second without Data
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_OpenSecondCorrection";
|
||||
|
||||
// Outputs
|
||||
#xOutConveyorRequest := TRUE; // motor on
|
||||
#xOutStopper := TRUE; // stopper open
|
||||
#xOutTrolleyInSep := FALSE;
|
||||
#xOutTrolleyScanRdy := FALSE;
|
||||
|
||||
#t_Monitoring := #xInConveyorRun;
|
||||
IF #tOnMonitoring.Q THEN
|
||||
#wErrorWord.%X1 := TRUE; // err trolley stuck
|
||||
END_IF;
|
||||
|
||||
// Transition
|
||||
IF #xInPluggedScan AND NOT #tTrolley.xDirectSensor THEN
|
||||
#xOutStopper := FALSE;
|
||||
#nState := #cStepWaitForTrolley1;
|
||||
END_IF;
|
||||
END_REGION
|
||||
#cStepWaitForLeave2:
|
||||
REGION Step 230 - wait trolley exit second
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_WaitForLeaveSecond";
|
||||
|
||||
// Output
|
||||
#xOutConveyorRequest := TRUE; // motor on
|
||||
#xOutStopper := TRUE; // stopper open
|
||||
#t_Trailing := TRUE(* #xInConveyorRun *);
|
||||
|
||||
// Transition
|
||||
IF #tOnTrailing.Q THEN //....ansonsten schließe normal nach Trailing-Zeit
|
||||
#nState := #cStepClose2;
|
||||
#xOutTrolleyReleasedEdge := TRUE; // Datenübergabe
|
||||
END_IF;
|
||||
|
||||
END_REGION
|
||||
#cStepClose2:
|
||||
REGION Step 240 - separator close second
|
||||
// akt. Zustand
|
||||
#stOutMainTro.nStatus := "SepState_Finish";
|
||||
|
||||
// Outputs
|
||||
#xOutTrolleyReleasedEdge := FALSE;
|
||||
#xOutStopper := FALSE; // Separator ZU
|
||||
#t_Handling := TRUE;(* #xInConveyorRun *)
|
||||
|
||||
// Transition
|
||||
//WENN HIER BEARBEITUNGSZEIT EINGEFÜGT WIRD MUSS DER COUNTER UNTEN MIT FLANKE VERSORGT WERDEN
|
||||
IF
|
||||
#tOnHandling.Q
|
||||
THEN
|
||||
#nState := #cStepWaitForTrolley1;
|
||||
END_IF;
|
||||
END_REGION *)
|
||||
ELSE
|
||||
#wErrorWord.%X0 := true; // stepp error
|
||||
END_CASE;
|
||||
|
||||
REGION State Manager
|
||||
#fbStateManager.stInSettings.nStartState := #c100_StepWaitForTrolley;
|
||||
#fbStateManager.stInSettings.xActUnivTOn := TRUE;
|
||||
#fbStateManager.stInSettings.xRestartAtStartState := FALSE;
|
||||
#fbStateManager(xInFunctionEnabled := TRUE,
|
||||
xInRunUnivTOn := #tmpActUnivTon,
|
||||
nInOutState := #nState);
|
||||
END_REGION
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION Counter
|
||||
// #CountCarr(CU:=#nState = 040 AND NOT #xOutStopper,
|
||||
// PV:=1,
|
||||
// CV=>#nCount);
|
||||
END_REGION
|
||||
|
||||
REGION Monitoring
|
||||
REGION Carrier stuck
|
||||
#fbMonitoringCarrStuck.stSettings.nErrorType := 1;
|
||||
#fbMonitoringCarrStuck.stSettings.xErrLedIfMachineIsOff := TRUE;
|
||||
#fbMonitoringCarrStuck.stSettings.xSelfQuit := TRUE;
|
||||
#fbMonitoringCarrStuck(sInFctnName := #stInOutHMI.stConfig.sName,
|
||||
sInPrefix := 'Ausfahren Carrier',
|
||||
sInSuffix := #stInOutHMI.stConfig.sName,
|
||||
wInTextListId_Function := 200,
|
||||
wInTextListId_Message := 201,
|
||||
InOutMachineState := #stInOutMainState,
|
||||
xInQuitError := #xInErrQuit OR #stInOutMainState.xQuitError,
|
||||
xInSignal := NOT #tOnMonitoring.Q,
|
||||
sInAlarmMessage := 'Carrier verlaesst Separator nicht');
|
||||
END_REGION
|
||||
|
||||
REGION Carrier Mismatch
|
||||
#fbMonitoringCarrMismatch.stSettings.nErrorType := 1;
|
||||
#fbMonitoringCarrMismatch.stSettings.xErrLedIfMachineIsOff := TRUE;
|
||||
#fbMonitoringCarrMismatch.stSettings.xSelfQuit := TRUE;
|
||||
#fbMonitoringCarrMismatch(sInFctnName := #stInOutHMI.stConfig.sName,
|
||||
sInPrefix := 'Carrier Mismatch',
|
||||
InOutMachineState := #stInOutMainState,
|
||||
xInQuitError := #xInErrQuit OR #stInOutMainState.xQuitError,
|
||||
xInSignal := TRUE, //NOT #wOutErrorWord.%X2,
|
||||
sInAlarmMessage := 'Carrier im Separator ist falsch');
|
||||
END_REGION
|
||||
END_REGION
|
||||
|
||||
REGION Timer
|
||||
|
||||
#tOnHandling(IN := #t_Handling,
|
||||
PT := #stInSettings.tHandlingTime);
|
||||
|
||||
#tOnTrailing(IN := #t_Trailing,
|
||||
PT := #stInSettings.tTrailingTime);
|
||||
|
||||
#tOnMonitoring(IN := #t_Monitoring,
|
||||
PT := t#4999ms,
|
||||
Q => #wErrorWord.%X1);
|
||||
END_REGION
|
||||
|
||||
REGION HMI
|
||||
|
||||
#stInOutHMI.InSensor := #tTrolley;
|
||||
|
||||
REGION Status
|
||||
#stInOutHMI.stStatus.nState := #nState;
|
||||
#stInOutHMI.stStatus.xSepStatus := #xOutStopper;
|
||||
|
||||
IF #wErrorWord > 0 THEN // Keine Fehler
|
||||
#stInOutHMI.stStatus.bStatus := 2; // ERROR
|
||||
ELSIF #stInOutHMI.stControl.xLockSeparator OR #stInOutHMI.stControl.xReleaseOverride THEN
|
||||
#stInOutHMI.stStatus.bStatus := 3; // HMI Control aktiv
|
||||
ELSE
|
||||
CASE #nState OF
|
||||
0:
|
||||
#stInOutHMI.stStatus.bStatus := 0; // NOT_AVAILABLE
|
||||
1, 10, 20, 30, 40, 101, 110, 120, 130, 140:
|
||||
#stInOutHMI.stStatus.bStatus := 1; // AVAILABLE
|
||||
ELSE //Fallback
|
||||
#stInOutHMI.stStatus.bStatus := 0; // NOT AVAILABLE
|
||||
END_CASE;
|
||||
END_IF;
|
||||
|
||||
#stInOutHMI.stStatus.xBtInSeparator := #tTrolley.xDbncdSensor;
|
||||
#stInOutHMI.stStatus.xError := #wErrorWord > 0;
|
||||
#stInOutHMI.stStatus.Errors.xBtNotLeaving := #wErrorWord.%X1;
|
||||
// #stInOutHMI.stStatus.nCounterBt := #nCount;
|
||||
#stInOutHMI.stStatus.xSepIsLocked := #stInOutHMI.stControl.xLockSeparator;
|
||||
END_REGION
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION MainTRO
|
||||
|
||||
#stOutMainTro.xJamAtEntry := "cTodoFalse";
|
||||
#stOutMainTro.xBtPresent := #tTrolley.xDbncdSensor;
|
||||
#stOutMainTro.xCarouselInRun := #xInConveyorRun;
|
||||
// #stOutMainTro.nCounterBt := 0; TODO
|
||||
|
||||
END_REGION
|
||||
|
||||
|
||||
REGION Outputs
|
||||
#wOutErrorWord := #wErrorWord;
|
||||
END_REGION
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
LibraryType:
|
||||
Guid: 2b644f30-a3a6-4abb-8b59-ef341fedf9f8
|
||||
Comment:
|
||||
de-DE: initial
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.3
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: Änderung im unterlagerten Baustein
|
||||
@@ -0,0 +1,27 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_ILS_STRO_Switch.scl
|
||||
Hash: 9P7RKDDJCB4ecgwkOerVkPhsWbM1ghmNTGB0JOHqz9Y=
|
||||
LibraryMetaFileHash: tW3IwZXtEUOhYe6m3WeSsBHU1VQgvUFATsU5LGcHoMI=
|
||||
LibraryVersion:
|
||||
Guid: 91175451-8c0e-4789-b302-fd2c134e9d15
|
||||
DependsOn:
|
||||
- TypeName: IntfSwitch
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: S2MSwitch
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_SetAlarmAndLog
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: SettingsSwitch
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_MainState
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_StateManager
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Sensor
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_UnloadingStation
|
||||
VersionNumber: 0.0.6
|
||||
- TypeName: FC_Uint2TroString
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_usint2String
|
||||
VersionNumber: 2.0.0
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,10 @@
|
||||
LibraryType:
|
||||
Guid: fdb28b91-85cc-4257-9a7f-4ee21454e413
|
||||
Comment:
|
||||
de-DE: Initial
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.18
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: Monitoring, Aufräumen, Kommentieren
|
||||
@@ -0,0 +1,23 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_ILS_STRO_Vario.scl
|
||||
Hash: Ll36gRlWS0phSkYkE0m2ct+2Cyo/U78RVe/T2hhXEmE=
|
||||
LibraryMetaFileHash: 5hsMvUxuDSEOmiTQZdE8Ql+qyqi2hW6MyrV+d0jxvZ4=
|
||||
LibraryVersion:
|
||||
Guid: 6dc92fd5-41a8-4cf5-b077-be95aec75ae1
|
||||
DependsOn:
|
||||
- TypeName: UDT_MainState
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Vario
|
||||
VersionNumber: 2.0.1
|
||||
- TypeName: FB_StateManager
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: SettingsVario
|
||||
VersionNumber: 2.0.5
|
||||
- TypeName: stCarrier
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FB_Monitoring
|
||||
VersionNumber: 2.0.5
|
||||
- TypeName: FB_SupervisionRasterSensor
|
||||
VersionNumber: 2.0.2
|
||||
- TypeName: UDT_Sensor
|
||||
VersionNumber: 2.0.0
|
||||
@@ -0,0 +1,483 @@
|
||||
FUNCTION_BLOCK "FB_ILS_STRO_Vario"
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
stInSettings : "SettingsVario"; // Einstellungen Vario
|
||||
xInReleaseEdge : Bool; // Flanke Carrier rausgelassen
|
||||
stInSenConvFingerInPos : "UDT_Sensor"; // Mitnehmerfinger in Position (FingerInPos)
|
||||
stInSenJam : "UDT_Sensor"; // Stausensor nach Vario (Jam)
|
||||
stInSenLastPos : "UDT_Sensor"; // Letzte Position erreicht (Full)
|
||||
stInSenCarrInPos : "UDT_Sensor"; // Carrier in Position (CarrInPos)
|
||||
xInRelease : Bool := false; // Freigabe zum Entleeren
|
||||
xInRequest : Bool; // Anfrage an Vario
|
||||
xInMotorProtection : Bool := false; // Motorschutz
|
||||
xInErrorQuit : Bool; // Fehler quittieren Überwachung Finger
|
||||
xInAutomatic : Bool; // Automatik
|
||||
END_VAR
|
||||
|
||||
VAR_OUTPUT
|
||||
xOutMotor : Bool := false; // Antrieb raumgängiger Förderer
|
||||
xOutConveyorReady : Bool := false; // Vario bereit
|
||||
xOutConveyorReleaseReq : Bool := false;
|
||||
wOutErrorWord : Word; // Fehler rausgeben
|
||||
END_VAR
|
||||
|
||||
VAR_IN_OUT
|
||||
arInOutJamFinger : Array[*] of "stCarrier"; // Daten Staubereich auf Vario
|
||||
stInOutHMI : "UDT_Vario"; // HMI Schnittstelle
|
||||
stInOutControlUnitCabinet : "UDT_MainState"; // Main State Schnittstelle
|
||||
END_VAR
|
||||
|
||||
VAR
|
||||
fbStateManager : "FB_StateManager"; // Schrittkette Manager
|
||||
fbFingerControl : "FB_SupervisionRasterSensor"; // Überwachung Finger
|
||||
sStateText : String := ''; // Schritt Text (zum Beobachten)
|
||||
END_VAR
|
||||
VAR RETAIN
|
||||
nState : Int := 0; // Schritt
|
||||
nStateLast : Int := 0; // vorheriger Schritt (für State Manager)
|
||||
xRunMotor : Bool := false; // Motor Start
|
||||
xConveyorReady : Bool := false; // Förderer ist bereit
|
||||
tOnAllBtOut {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Timer: Vario Entleerungsfahrt
|
||||
counterCarrier {InstructionName := 'CTU_INT'; LibVersion := '1.0'} : CTU_INT; // Zum Eintakten von Carriern
|
||||
nCounterCatch : Int := 0; // Zum Eintakten von Carriern
|
||||
END_VAR
|
||||
VAR
|
||||
xErrorBtNotReaching : Bool := false; // NIU
|
||||
tOn_ErrorConv {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // NIU
|
||||
tOn_WaitForStop {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Für Testmodus
|
||||
tOnJamCarrierInPos {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Prüfung: Vario dreht, aber Carrier in Position ist an
|
||||
xSensorError : Bool; // Fehler Carrier in Position Sensor
|
||||
fbMonitoringFinger : "FB_Monitoring"; // Monitoring Finger Überwachung
|
||||
fbMonitoringMotorProtection : "FB_Monitoring"; // Motorschutzüberwachung
|
||||
fbMonitoringCarrierInPos : "FB_Monitoring"; // Überwachung Sensor "CarrInPos"
|
||||
xClearDone : Bool; // Prüffahrt um Finger leer zu fahren abgeschlossen
|
||||
"////////" : Bool; // NIU
|
||||
xTestMode : Bool; // Testmodus aktivieren
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
tmpActUnivTon : Bool; // Siehe State Manager
|
||||
nArrayMaxFinger : DInt; // Array größe
|
||||
END_VAR
|
||||
|
||||
VAR CONSTANT
|
||||
c0000_StepOff : Int := 0; // Aus
|
||||
c0100_StepUndefined : Int := 100; // Undefiniert
|
||||
c0200_StepReceive : Int := 200; // Förderer wartet auf Arbeit / Bereit aufzunehmen
|
||||
c1200_StepWaitTime : Int := 1200; // Förderer wartet vor Fahrt
|
||||
c2000_StepJog : Int := 2000; // Förderer eine Position weiter fahren (Jog Fw)
|
||||
c2200_StepNormalStop : Int := 2200; // Normal anhalten
|
||||
c2250_StepQuickStop : Int := 2250; // Sofort anhalten
|
||||
c2500_StepCheckVario : Int := 2500; // Prüfen ob wirklich leer (NIU)
|
||||
c3000_StepEmptying : Int := 3000; // Förderer entleeren
|
||||
c5000_StepEnding : Int := 5000; // Förderer Ablauf beenden (Positionierung)
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
REGION Arraygrößen
|
||||
#nArrayMaxFinger := UPPER_BOUND(ARR := #arInOutJamFinger, DIM := 1);
|
||||
END_REGION
|
||||
|
||||
REGION State Machine
|
||||
// Off
|
||||
// Idle (keine Daten und Prüffahrt abgeschlossen)
|
||||
// Anforderung MTRO / Separator
|
||||
// -> Entleeren
|
||||
// Entleeren (Fahre bis Stau oder keine Daten)
|
||||
// 1. Anforderung MTRO / Separator
|
||||
// -> Entleeren Pausieren
|
||||
// 2. Keine Daten mehr
|
||||
// -> Idle
|
||||
// Entleeren Pausieren
|
||||
//
|
||||
|
||||
CASE #nState OF
|
||||
#c0000_StepOff:
|
||||
REGION 0000: Off
|
||||
|
||||
// Aktueller Zustand
|
||||
#sStateText := 'OFF';
|
||||
|
||||
// Statics
|
||||
#xRunMotor := FALSE;
|
||||
#xConveyorReady := FALSE;
|
||||
|
||||
END_REGION
|
||||
|
||||
#c0100_StepUndefined:
|
||||
REGION 0100: Undefined
|
||||
|
||||
// Aktueller Zustand
|
||||
#sStateText := 'UNDEFINED';
|
||||
|
||||
// Statics
|
||||
#xRunMotor := FALSE;
|
||||
#xConveyorReady := FALSE;
|
||||
|
||||
#nState := #c0200_StepReceive;
|
||||
END_REGION
|
||||
|
||||
#c0200_StepReceive:
|
||||
REGION 0200: Receive
|
||||
|
||||
// Aktueller Zustand
|
||||
#sStateText := 'RECEIVE';
|
||||
|
||||
// Statics
|
||||
|
||||
#xRunMotor := FALSE;
|
||||
#xConveyorReady := #xInMotorProtection;
|
||||
|
||||
// Transition
|
||||
//
|
||||
IF #xTestMode OR #stInOutHMI.stControl.xTestMode THEN
|
||||
#xConveyorReady := FALSE;
|
||||
#nState := #c2000_StepJog;
|
||||
ELSE
|
||||
|
||||
IF (#xConveyorReady AND #counterCarrier.QU) OR ((* #arInOutJamFinger[1].bStatus.%X0 AND *)NOT #xInRequest AND NOT #xClearDone AND #fbStateManager.tOutTimeInStep > T#5000ms) THEN
|
||||
#nState := #c1200_StepWaitTime;
|
||||
|
||||
// ELSIF (#arInOutJamFinger[1].stCarrData.xOnline AND NOT #xClearDone AND NOT #xInRequest AND #fbStateManager.tOutTimeInStep > T#5000ms) AND
|
||||
// (NOT #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > T#3000ms) THEN
|
||||
// #nState := #c2500_StepCheckVario;
|
||||
// ELSIF #arInOutJamFinger[1].stCarrData.xOnline AND NOT #xInRequest AND #fbStateManager.tOutTimeInStep > T#5000ms THEN
|
||||
// #nState := #c3000_StepEmptying;
|
||||
END_IF;
|
||||
END_IF;
|
||||
|
||||
END_REGION
|
||||
|
||||
#c1200_StepWaitTime:
|
||||
REGION 1200: Wait
|
||||
// Aktueller Zustand
|
||||
#sStateText := 'WAIT FOR TIMER';
|
||||
|
||||
#xRunMotor := FALSE;
|
||||
#xConveyorReady := FALSE;
|
||||
|
||||
IF #fbStateManager.tOutTimeInStep > #stInSettings.tWaitForJog (* AND NOT #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > T#3000ms *) THEN
|
||||
IF #xInRequest THEN
|
||||
#xClearDone := FALSE;
|
||||
#nState := #c2000_StepJog;
|
||||
ELSIF NOT #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > T#2s THEN
|
||||
#nState := #c3000_StepEmptying;
|
||||
(* ELSE
|
||||
#nState := #c3000_StepEmptying; *)
|
||||
END_IF;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
|
||||
#c2000_StepJog:
|
||||
REGION 2000: Jog
|
||||
|
||||
// Aktueller Zustand
|
||||
#sStateText := 'JOG';
|
||||
|
||||
// Statics
|
||||
#xRunMotor := TRUE;
|
||||
#xConveyorReady := FALSE;
|
||||
|
||||
IF #xTestMode OR #stInOutHMI.stControl.xTestMode THEN
|
||||
IF #stInSenConvFingerInPos.xDirectEdgePos THEN
|
||||
#nState := #c2200_StepNormalStop;
|
||||
END_IF;
|
||||
ELSE
|
||||
IF ((* #fbStateManager.tOutTimeInStep > T#1000ms OR *)#fbFingerControl.xOutErrorRasterSensor) OR (NOT #stInSettings.xLongSlope AND #stInSenJam.xDirectSensor AND #stInSenLastPos.xDirectSensor)
|
||||
OR (#stInSettings.xLongSlope AND #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > #stInSettings.tJamSenDelay AND #stInSenLastPos.xDirectSensor)
|
||||
THEN
|
||||
#nState := #c2250_StepQuickStop;
|
||||
ELSIF (#stInSenJam.xDirectEdgePos AND NOT #stInSettings.xJamSenDelayActive)
|
||||
OR (#stInSettings.xJamSenDelayActive AND #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > #stInSettings.tJamSenDelay)
|
||||
THEN
|
||||
#nState := #c2200_StepNormalStop;
|
||||
ELSIF #stInSenConvFingerInPos.xDirectEdgePos THEN //////EMBI TEST
|
||||
#nState := #c0200_StepReceive;
|
||||
END_IF;
|
||||
END_IF;
|
||||
|
||||
END_REGION
|
||||
|
||||
#c2200_StepNormalStop: //normal anhalten
|
||||
REGION 2200: Normal Stop
|
||||
|
||||
// Aktueller Zustand
|
||||
#sStateText := 'NORMAL STOP';
|
||||
|
||||
#xRunMotor := FALSE;
|
||||
#xConveyorReady := FALSE;
|
||||
|
||||
#xConveyorReady := FALSE;
|
||||
|
||||
IF #xTestMode OR #stInOutHMI.stControl.xTestMode THEN
|
||||
|
||||
IF #tOn_WaitForStop.Q THEN
|
||||
#nState := #c0200_StepReceive;
|
||||
END_IF;
|
||||
|
||||
ELSE
|
||||
|
||||
IF (NOT #stInSenLastPos.xDirectSensor AND #stInSenLastPos.tDirectChangeLast > T#2s AND #stInSenJam.xDbncdSensor) OR
|
||||
(NOT #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > T#3000ms) THEN
|
||||
#nState := #c5000_StepEnding;
|
||||
END_IF;
|
||||
END_IF;
|
||||
|
||||
END_REGION
|
||||
|
||||
#c2250_StepQuickStop:
|
||||
REGION 2250: Quick Stop
|
||||
|
||||
// Aktueller Zustand
|
||||
#sStateText := 'QUICK STOP';
|
||||
|
||||
#xRunMotor := FALSE;
|
||||
#xConveyorReady := FALSE;
|
||||
|
||||
IF ((NOT #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > T#3000ms) OR
|
||||
(NOT #stInSenLastPos.xDirectSensor AND #stInSenLastPos.tDirectChangeLast > T#3000ms)) AND
|
||||
NOT #fbFingerControl.xOutErrorRasterSensor
|
||||
THEN
|
||||
#nState := #c1200_StepWaitTime;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
#c3000_StepEmptying:
|
||||
REGION 3000: Emptying
|
||||
|
||||
// Aktueller Zustand
|
||||
#sStateText := 'EMPTYING CONVEYOR';
|
||||
|
||||
// Statics
|
||||
|
||||
#xRunMotor := TRUE;
|
||||
#xConveyorReady := FALSE;
|
||||
|
||||
/////////////////////
|
||||
|
||||
IF (NOT #stInSettings.xLongSlope AND #stInSenJam.xDirectSensor AND #stInSenLastPos.xDirectSensor)
|
||||
OR (#stInSettings.xLongSlope AND #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > #stInSettings.tJamSenDelay AND #stInSenLastPos.xDirectSensor)
|
||||
THEN
|
||||
#nState := #c2250_StepQuickStop;
|
||||
ELSIF (#stInSenJam.xDirectEdgePos AND NOT #stInSettings.xJamSenDelayActive)
|
||||
OR (#stInSettings.xJamSenDelayActive AND #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > #stInSettings.tJamSenDelay)
|
||||
THEN
|
||||
#nState := #c2200_StepNormalStop;
|
||||
ELSIF #xInRequest THEN
|
||||
#xClearDone := FALSE;
|
||||
#nState := #c5000_StepEnding;
|
||||
ELSIF #tOnAllBtOut.Q THEN
|
||||
#xClearDone := TRUE;
|
||||
#nState := #c5000_StepEnding;
|
||||
// ELSIF #tOnAllBtOut.Q THEN // Freigabe zum Entleeren ist wieder/noch da und Carousel-Motor läuft
|
||||
// // Wenn nach einer gewissen Zeit nichts mehr kommt --> Alle Bt draußen --> Kette leer
|
||||
// #nState := #c5000_StepEnding; // Weiter
|
||||
END_IF;
|
||||
///////////////////
|
||||
|
||||
END_REGION
|
||||
|
||||
#c5000_StepEnding:
|
||||
REGION 5000: Ending Step
|
||||
|
||||
(*Dieser Schritt wird nur nach dem Entleeren angesprungen
|
||||
damit sich die Kette zum Schluss noch richtig positioniert*)
|
||||
|
||||
//Aktueller Zustand
|
||||
#sStateText := 'STOPPING CONVEYOR';
|
||||
|
||||
//Statics
|
||||
#xRunMotor := TRUE;
|
||||
#xConveyorReady := FALSE;
|
||||
|
||||
// Transition
|
||||
IF ((* #fbStateManager.tOutTimeInStep > T#1000ms OR *)#fbFingerControl.xOutErrorRasterSensor) OR (NOT #stInSettings.xLongSlope AND #stInSenJam.xDirectSensor AND #stInSenLastPos.xDirectSensor)
|
||||
OR (#stInSettings.xLongSlope AND #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > #stInSettings.tJamSenDelay AND #stInSenLastPos.xDirectSensor)
|
||||
THEN
|
||||
#xClearDone := FALSE;
|
||||
#nState := #c2250_StepQuickStop;
|
||||
ELSIF #stInSenConvFingerInPos.xDirectEdgePos (*or #fbStateManager.tOutTimeInStep > T#800ms OR *) (* #stInSenLastPos.xDirectEdgePos *)(* #stInSenConvFingerInPos.xDirectSensor *)THEN
|
||||
#nState := #c0200_StepReceive;
|
||||
ELSIF (#stInSenJam.xDirectEdgePos AND NOT #stInSettings.xJamSenDelayActive)
|
||||
// OR (#stInSettings.xJamSenDelayActive AND #stInSenJam.xDirectSensor AND #stInSenJam.tDirectChangeLast > #stInSettings.tJamSenDelay)
|
||||
THEN
|
||||
#nState := #c2200_StepNormalStop;
|
||||
END_IF;
|
||||
|
||||
END_REGION
|
||||
|
||||
END_CASE;
|
||||
END_REGION
|
||||
|
||||
REGION Timer
|
||||
//Entleerungsfahrt Dauer
|
||||
#tOnAllBtOut(IN := #nState = #c3000_StepEmptying,
|
||||
PT := #stInSettings.tConvEmpty);
|
||||
|
||||
//Wird für Testmodus verwendet, Start Stopp Intervall
|
||||
#tOn_WaitForStop(IN := #nState = #c2200_StepNormalStop,
|
||||
PT := #stInSettings.tWaitForStop);
|
||||
END_REGION
|
||||
|
||||
REGION Carrier zählen
|
||||
#counterCarrier(CU := #xInReleaseEdge,
|
||||
R := #nState > #c0200_StepReceive,
|
||||
PV := #stInSettings.nCountCarrier,
|
||||
CV => #nCounterCatch);
|
||||
END_REGION
|
||||
|
||||
REGION Überwachung Finger
|
||||
|
||||
#fbFingerControl.stInSettings.xInEnableSupervision := TRUE;
|
||||
#fbFingerControl.stInSettings.tInDelayMotorRun := #stInSettings.tRasterDelayMotorRun;
|
||||
#fbFingerControl.stInSettings.tInRasterHigh := #stInSettings.tRasterHigh;
|
||||
#fbFingerControl.stInSettings.tInRasterLow := #stInSettings.tRasterLow;
|
||||
#fbFingerControl.stInSettings.sInConveyorName := #stInOutHMI.stConveyor.sConveyorName;
|
||||
#fbFingerControl(stInSenRaster := #stInSenConvFingerInPos,
|
||||
xInErrorQuit := #xInErrorQuit,
|
||||
xInMotorRun := #xRunMotor);
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION Überwachung Carrier in Pos Sensor
|
||||
#tOnJamCarrierInPos(IN := #xRunMotor,
|
||||
PT := t#3600s);
|
||||
|
||||
IF #tOnJamCarrierInPos.ET > T#1s AND #stInSenCarrInPos.xDirectSensor AND #stInSenCarrInPos.tDirectChangeLast > t#3s THEN
|
||||
#xSensorError := TRUE;
|
||||
END_IF;
|
||||
|
||||
IF #xSensorError AND #xInErrorQuit THEN
|
||||
#xSensorError := FALSE;
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
REGION StateManager
|
||||
|
||||
#fbStateManager.stInSettings.nStartState := #c0200_StepReceive;
|
||||
#fbStateManager.stInSettings.xActUnivTOn := TRUE;
|
||||
#fbStateManager.stInSettings.xRestartAtStartState := FALSE;
|
||||
#fbStateManager(xInFunctionEnabled := ((#xInAutomatic AND #stInOutControlUnitCabinet.xRunning) OR #stInOutHMI.stConveyor.xSemiAuto) AND NOT #stInOutHMI.stConveyor.xDisableConveyor AND NOT #fbFingerControl.xOutErrorRasterSensor AND NOT #xSensorError,
|
||||
xInRunUnivTOn := #tmpActUnivTon,
|
||||
nOutStateLast => #nStateLast,
|
||||
nInOutState := #nState);
|
||||
END_REGION
|
||||
|
||||
REGION Ausgänge
|
||||
|
||||
// Das ist der Motor vom Förderer
|
||||
#xOutMotor := #xRunMotor OR #stInOutHMI.stConveyor.xManual; // Förderer-Motor angefordert und kein Bereichshalt
|
||||
#xOutConveyorReady := #xConveyorReady; //Förderer bereit (aus SK) und kein Bereichshalt Förderer
|
||||
|
||||
//????????????????????????????
|
||||
#xOutConveyorReleaseReq := #nState = #c3000_StepEmptying OR #nState = #c1200_StepWaitTime;
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION Visu
|
||||
|
||||
#stInOutHMI.stConveyor.nType := 7; // Vario
|
||||
|
||||
#stInOutHMI.stConveyor.nState := #nState;
|
||||
#stInOutHMI.stConveyor.sStateText := #sStateText;
|
||||
|
||||
#stInOutHMI.FingerSensor := #stInSenConvFingerInPos;
|
||||
#stInOutHMI.JamSensor := #stInSenJam;
|
||||
#stInOutHMI.LastPosSensor := #stInSenLastPos;
|
||||
|
||||
REGION Status
|
||||
IF #xInMotorProtection THEN
|
||||
IF #fbStateManager.xInFunctionEnabled THEN
|
||||
CASE #nState OF
|
||||
#c0000_StepOff, #c0100_StepUndefined:
|
||||
#stInOutHMI.stConveyor.bStatus := 0; // NOT_AVAILABLE
|
||||
#c0200_StepReceive, #c1200_StepWaitTime, #c2000_StepJog, #c2250_StepQuickStop, #c2200_StepNormalStop, #c3000_StepEmptying, #c5000_StepEnding:
|
||||
#stInOutHMI.stConveyor.bStatus := 1; // AVAILABLE
|
||||
ELSE //Fallback
|
||||
#stInOutHMI.stConveyor.bStatus := 0; // NOT_AVAILABLE
|
||||
END_CASE;
|
||||
ELSE
|
||||
#stInOutHMI.stConveyor.bStatus := 0; // NOT_AVAILABLE
|
||||
END_IF;
|
||||
ELSE
|
||||
#stInOutHMI.stConveyor.bStatus := 2; // ERROR
|
||||
END_IF;
|
||||
END_REGION
|
||||
REGION Modes
|
||||
// Int16 Bit-codiert
|
||||
#stInOutHMI.stConveyor.nMode.%X0 := (#nState = #c0000_StepOff) OR (#nState = #c0100_StepUndefined) OR (#nState = #c0200_StepReceive) OR (#nState = #c1200_StepWaitTime) OR (#nState = #c2200_StepNormalStop) OR (#nState = #c2250_StepQuickStop); // The device is turned off
|
||||
#stInOutHMI.stConveyor.nMode.%X1 := (#nState = #c2000_StepJog) OR (#nState = #c3000_StepEmptying) OR (#nState = #c5000_StepEnding);
|
||||
#stInOutHMI.stConveyor.nMode.%X2 := #stInOutHMI.stConveyor.xDisableConveyor OR #stInOutHMI.stConveyor.xManual OR #stInOutHMI.stConveyor.xSemiAuto OR #xTestMode OR #stInOutHMI.stControl.xTestMode (* OR #xViSuManualMode OR #xViSuSemiAutoMode *); // The device is being manually operated
|
||||
#stInOutHMI.stConveyor.nMode.%X3 := FALSE;//(#nState = #STOPPED); //The device only is on when the device is needed (like standby)
|
||||
#stInOutHMI.stConveyor.nMode.%X10 := FALSE; // Overflow Error is set for this device
|
||||
END_REGION
|
||||
#stInOutHMI.stConveyor.xIsInAutomatic := #stInOutControlUnitCabinet.xRunning;
|
||||
#stInOutHMI.stConveyor.xEnergySaveReq := FALSE;
|
||||
#stInOutHMI.stConveyor.xPowerContactor := #xOutMotor;
|
||||
#stInOutHMI.stConveyor.xPluggedChainBreak := FALSE;
|
||||
#stInOutHMI.stConveyor.xStatusChainBreak := TRUE;
|
||||
#stInOutHMI.stConveyor.xStatusMotorProtect := #xInMotorProtection;
|
||||
#stInOutHMI.stConveyor.xConveyorFull1 := FALSE;
|
||||
#stInOutHMI.stConveyor.xConveyorFull2 := FALSE;
|
||||
#stInOutHMI.stConveyor.xReady2Receive := TRUE;
|
||||
#stInOutHMI.stConveyor.xNextConveyorReady := TRUE;
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION Monitoring
|
||||
REGION Fingerüberwachung
|
||||
#fbMonitoringFinger.stSettings.nErrorType := 1;
|
||||
#fbMonitoringFinger.stSettings.xErrLedIfMachineIsOff := TRUE;
|
||||
#fbMonitoringFinger.stSettings.xSelfQuit := TRUE;
|
||||
#fbMonitoringFinger.stSettings.tDelay := T#1s;
|
||||
#fbMonitoringFinger(wInTextListId_Function := 300,
|
||||
sInPrefix := #stInOutHMI.stConveyor.sConveyorName,
|
||||
wInTextListId_Message := 301,
|
||||
sInSuffix := #stInOutHMI.FingerSensor.sName,
|
||||
xInQuitError := #stInOutControlUnitCabinet.xQuitError OR #xInErrorQuit,
|
||||
xInSignal := NOT #fbFingerControl.xOutErrorRasterSensor,
|
||||
InOutMachineState := #stInOutControlUnitCabinet);
|
||||
END_REGION
|
||||
|
||||
REGION Motorschutz
|
||||
#fbMonitoringMotorProtection.stSettings.nErrorType := 1;
|
||||
#fbMonitoringMotorProtection.stSettings.xErrLedIfMachineIsOff := TRUE;
|
||||
#fbMonitoringMotorProtection.stSettings.xSelfQuit := TRUE;
|
||||
#fbMonitoringMotorProtection.stSettings.tDelay := T#1s;
|
||||
#fbMonitoringMotorProtection(wInTextListId_Function := 300,
|
||||
sInPrefix := #stInOutHMI.stConveyor.sConveyorName,
|
||||
wInTextListId_Message := 401,
|
||||
sInSuffix := #stInOutHMI.stConveyor.sContactor,
|
||||
xInQuitError := #stInOutControlUnitCabinet.xQuitError OR #xInErrorQuit,
|
||||
xInSignal := #xInMotorProtection,
|
||||
InOutMachineState := #stInOutControlUnitCabinet);
|
||||
END_REGION
|
||||
|
||||
REGION Carrier in Pos
|
||||
#fbMonitoringCarrierInPos.stSettings.nErrorType := 1;
|
||||
#fbMonitoringCarrierInPos.stSettings.xErrLedIfMachineIsOff := TRUE;
|
||||
#fbMonitoringCarrierInPos.stSettings.xSelfQuit := TRUE;
|
||||
#fbMonitoringCarrierInPos.stSettings.tDelay := T#1s;
|
||||
#fbMonitoringCarrierInPos(wInTextListId_Function := 300,
|
||||
sInPrefix := #stInOutHMI.stConveyor.sConveyorName,
|
||||
wInTextListId_Message := 302,
|
||||
sInSuffix := #stInSenCarrInPos.sName,
|
||||
xInQuitError := #stInOutControlUnitCabinet.xQuitError OR #xInErrorQuit,
|
||||
xInSignal := NOT #xSensorError,
|
||||
InOutMachineState := #stInOutControlUnitCabinet);
|
||||
|
||||
END_REGION
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION Error
|
||||
#wOutErrorWord.%X0 := #stInOutHMI.stConveyor.bStatus = 2; //Error
|
||||
#wOutErrorWord.%X1 := #fbFingerControl.xOutErrorRasterSensor; //Fingerfehler
|
||||
#wOutErrorWord.%X2 := NOT #xInMotorProtection; //Motorschutzfehler
|
||||
#wOutErrorWord.%X3 := #xSensorError;
|
||||
END_REGION
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
LibraryType:
|
||||
Guid: 3d0c7919-902b-47bd-98b6-b1baea1057d3
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.6
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: Monitoring Update
|
||||
@@ -0,0 +1,23 @@
|
||||
DocumentHash:
|
||||
- FileName: FB_StationUnloadPin.scl
|
||||
Hash: q/+gqEyu6e6ldC6QMMo2TZadq/PGbT9IxQG0y2nMnxk=
|
||||
LibraryMetaFileHash: rFn/h2cLTyXm8U7IjoyzTHVC63letxreqp9J4QWH9oY=
|
||||
LibraryVersion:
|
||||
Guid: 3af372a4-e06c-4b34-9436-a82db4db70d2
|
||||
DependsOn:
|
||||
- TypeName: FB_Monitoring
|
||||
VersionNumber: 2.0.5
|
||||
- TypeName: UDT_MainState
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stConveyorStations
|
||||
VersionNumber: 2.0.3
|
||||
- TypeName: UDT_UnloadingStation
|
||||
VersionNumber: 0.0.6
|
||||
- TypeName: stCarrier
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: UDT_Sensor
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_SHR_ExtractedHangerPin
|
||||
VersionNumber: 2.0.3
|
||||
- TypeName: FC_SHR_TargetSet_ReRoutePin
|
||||
VersionNumber: 2.0.3
|
||||
@@ -0,0 +1,296 @@
|
||||
FUNCTION_BLOCK "FB_StationUnloadPin"
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
xInStartUnloading : Bool;
|
||||
xInStopUnloading : Bool;
|
||||
xInNextHanger : Bool;
|
||||
xInBefore : Bool;
|
||||
stInPartAfterSwitch : "UDT_Sensor";
|
||||
nInBarcode : DInt;
|
||||
sInBarcode : String;
|
||||
xInReRouteAllowed : Bool := TRUE;
|
||||
xInUnloadingCheckSensor : Bool;
|
||||
xInMonitorUnloading : Bool;
|
||||
xInQuitLocal : Bool;
|
||||
xInBypass : Bool;
|
||||
END_VAR
|
||||
|
||||
VAR_OUTPUT
|
||||
xOutUnloadingDone : Bool;
|
||||
nOutBarcode : DInt;
|
||||
sOutBarcode : String;
|
||||
xOutSwitch : Bool;
|
||||
xOutLineOverloaded : Bool;
|
||||
xOutLineOverloadAhead : Bool;
|
||||
wOutErrorWord : Word;
|
||||
xOutLineOverloadedHigh : Bool;
|
||||
xOutLineOverloadedLow : Bool;
|
||||
xOutUnloadingFail : Bool;
|
||||
xOutUnloadingError : Bool;
|
||||
END_VAR
|
||||
|
||||
VAR_IN_OUT
|
||||
stInOutControlUnitCabinet : "UDT_MainState";
|
||||
stInOutConveyorStations : "stConveyorStations";
|
||||
arInOutCarrier : Array[*] of "stCarrier";
|
||||
nNoReadCounter : UDInt;
|
||||
stInOutHMI : "UDT_HMI_UnloadingStation";
|
||||
END_VAR
|
||||
|
||||
VAR
|
||||
nState : Int := -10;
|
||||
TOnLineFullTimer {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
||||
tOnUnloadingCheck {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
||||
END_VAR
|
||||
VAR RETAIN
|
||||
CountSwitch {InstructionName := 'CTU_UDINT'; LibVersion := '1.0'} : CTU_UDINT;
|
||||
nCount : UDInt;
|
||||
END_VAR
|
||||
VAR
|
||||
rTrigSwitch {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
|
||||
rTrigUnload {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
|
||||
tUnloadingCheckTime : Time := T#5s;
|
||||
xUnloadingCheck : Bool;
|
||||
tLineFullTime : Time := T#3s;
|
||||
tOnStateTimer {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
||||
xStateTimer : Bool;
|
||||
tStateTimer : Time;
|
||||
xFlgTrolleySensor : Bool;
|
||||
xFlgStartUnloading : Bool;
|
||||
fbMonitoringLineOverload : "FB_Monitoring";
|
||||
fbMonitoringUnloadError : "FB_Monitoring";
|
||||
xEdgeStoreLineOverload : Bool;
|
||||
stHangerStatus { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
|
||||
xOnline { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
nTarget { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int;
|
||||
xDoubleHangerOkay { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
xTargetDoubleHanger { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
xNoRead { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
xPartMissing { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
xTargetSetByMFS { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
xReportedToMFS { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
xReRouteOverflow { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
xReRouteBalancing { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
xReRouteUnavailable { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
END_STRUCT;
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
t_status : Bool;
|
||||
tmpSuccess : Bool;
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
REGION xOutLineOverloaded Stau
|
||||
IF #TOnLineFullTimer.Q THEN
|
||||
//OR
|
||||
//#tOnUnloadingCheck.Q THEN
|
||||
#xFlgTrolleySensor := TRUE;
|
||||
#xOutLineOverloaded := 1;
|
||||
ELSE
|
||||
#xFlgTrolleySensor := FALSE;
|
||||
#xOutLineOverloaded := 0;
|
||||
END_IF;
|
||||
|
||||
// Detect change of Line Overload
|
||||
#xOutLineOverloadedHigh := #TOnLineFullTimer.Q AND NOT #xEdgeStoreLineOverload;
|
||||
|
||||
#xOutLineOverloadedLow := NOT #TOnLineFullTimer.Q AND #xEdgeStoreLineOverload;
|
||||
|
||||
#xEdgeStoreLineOverload := #TOnLineFullTimer.Q;
|
||||
|
||||
END_REGION
|
||||
|
||||
IF #xInStartUnloading AND #xFlgTrolleySensor AND #xInReRouteAllowed THEN
|
||||
#xOutUnloadingFail := TRUE;
|
||||
#nOutBarcode := #nInBarcode;
|
||||
#sOutBarcode := #sInBarcode;
|
||||
"FC_SHR_TargetSet_ReRoutePin"(nInBarcodeNo := #nInBarcode,
|
||||
nInTarget := INT_TO_USINT(#stInOutConveyorStations.stData.nStations),
|
||||
xOutSuccess => #tmpSuccess,
|
||||
stInOutConveyorStations := #stInOutConveyorStations);
|
||||
ELSE
|
||||
#xOutUnloadingFail := FALSE;
|
||||
END_IF;
|
||||
|
||||
#rTrigUnload(CLK:=#xInStartUnloading);
|
||||
|
||||
REGION Schrittkette
|
||||
CASE #nState OF
|
||||
-10: // Init
|
||||
#xOutSwitch := 0;
|
||||
#xStateTimer := 0;
|
||||
#xOutUnloadingDone := 0;
|
||||
#nState := 0;
|
||||
|
||||
0: // Standby
|
||||
#xOutUnloadingDone := 0;
|
||||
|
||||
// IF #tOnStateTimer.Q (* #xFlgTrolleySensor *)THEN // Wenn Weiche voll //VON MYTHERESA -> STÖRT HIER, TEST
|
||||
// #xUnloadingCheck := FALSE; // nicht möglich, da Flankenauswertung, bei dauerbelegtem Sensor sinnfrei
|
||||
// #xOutSwitch := 0; // Switch schliessen
|
||||
// END_IF;
|
||||
|
||||
IF #rTrigUnload.Q (* AND NOT #tOnStateTimer.Q *)THEN //VON MYTHERESA -> STÖRT HIER, TEST
|
||||
#xOutSwitch := 1;
|
||||
#nOutBarcode := #nInBarcode;
|
||||
#sOutBarcode := #sInBarcode;
|
||||
IF #xInMonitorUnloading THEN
|
||||
#xUnloadingCheck := 1;
|
||||
END_IF;
|
||||
"FC_SHR_ExtractedHangerPin"(xInUnloadingDone := TRUE,
|
||||
nInBarcode := #nOutBarcode,
|
||||
xInBypass:= #xInBypass,
|
||||
stInOutConveyorStations := #stInOutConveyorStations,
|
||||
arInOutCarrier:= #arInOutCarrier);
|
||||
#xOutUnloadingDone := 1;
|
||||
ELSIF #xInStopUnloading THEN
|
||||
#xOutSwitch := 0;
|
||||
END_IF;
|
||||
|
||||
1100: // Warten bis fertig mit Switch offen lassen
|
||||
#xOutSwitch := 1;
|
||||
IF NOT #xInStartUnloading THEN
|
||||
#nState := 1110; // Switch offen lassen
|
||||
END_IF;
|
||||
|
||||
1110: // Switch offen lassen
|
||||
#xOutSwitch := 1;
|
||||
#xOutUnloadingDone := 1;
|
||||
#nState := 0;
|
||||
1200: // Warten bis fertig mit Switch offen lassen
|
||||
#xOutSwitch := 1;
|
||||
IF NOT #xInStartUnloading THEN
|
||||
"FC_SHR_ExtractedHangerPin"(xInUnloadingDone := NOT #xInStartUnloading,
|
||||
nInBarcode := #nOutBarcode,
|
||||
xInBypass:=#xInBypass,
|
||||
stInOutConveyorStations := #stInOutConveyorStations,
|
||||
arInOutCarrier:= #arInOutCarrier);
|
||||
#nState := 1210; // Switch offen lassen
|
||||
END_IF;
|
||||
1210: // Switch schließen
|
||||
#xOutSwitch := 0;
|
||||
#xOutUnloadingDone := 1;
|
||||
#nState := 0;
|
||||
1300: //Switch vorher öffnen
|
||||
#xOutSwitch := 1;
|
||||
#nState := 0;
|
||||
END_CASE;
|
||||
END_REGION
|
||||
REGION Counter
|
||||
#rTrigSwitch(CLK := #xOutSwitch);
|
||||
#CountSwitch(CU := #rTrigSwitch.Q,
|
||||
PV := 1,
|
||||
CV => #nCount);
|
||||
END_REGION ;
|
||||
REGION Timer
|
||||
#tOnStateTimer(IN := #xFlgTrolleySensor,//xStateTimer,
|
||||
PT := T#800ms);//#tStateTimer);
|
||||
|
||||
#TOnLineFullTimer(IN := #stInPartAfterSwitch.xDbncdSensor,
|
||||
PT := #tLineFullTime);
|
||||
|
||||
IF #xInUnloadingCheckSensor AND // Sensor nach Weiche
|
||||
#xUnloadingCheck AND // Monitoring aktiviert
|
||||
NOT #tOnUnloadingCheck.Q // Monitoring nicht bereits ausgeschlagen
|
||||
THEN
|
||||
#xUnloadingCheck := FALSE;
|
||||
END_IF;
|
||||
|
||||
IF #tOnUnloadingCheck.Q AND // Monitoring ausgeschlagen?
|
||||
(#stInOutControlUnitCabinet.xQuitError OR #xInQuitLocal) // dann am Schaltschrank zu quittieren
|
||||
THEN
|
||||
#xUnloadingCheck := FALSE; // Monitoring Ende
|
||||
END_IF;
|
||||
|
||||
// Timer bis Teil am Sensor vorbei muss
|
||||
#tOnUnloadingCheck(IN := #xUnloadingCheck AND #stInOutControlUnitCabinet.xRunning,
|
||||
PT := #tUnloadingCheckTime);
|
||||
|
||||
#xOutUnloadingError := #tOnUnloadingCheck.Q;
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION Flanken
|
||||
|
||||
#xFlgStartUnloading := #xInStartUnloading;
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION Monitoring
|
||||
|
||||
#fbMonitoringLineOverload.stSettings.nErrorType := 1;
|
||||
#fbMonitoringLineOverload.stSettings.xErrLedIfMachineIsOff := TRUE;
|
||||
#fbMonitoringLineOverload.stSettings.xSelfQuit := TRUE;
|
||||
#fbMonitoringLineOverload(sInFctnName := #stInOutHMI.sName,
|
||||
wInTextListId_Function := 500,
|
||||
wInTextListId_Message := 500,
|
||||
sInSuffix := #stInPartAfterSwitch.sName,
|
||||
InOutMachineState := #stInOutControlUnitCabinet,
|
||||
xInQuitError := #stInOutControlUnitCabinet.xQuitError OR #xInQuitLocal,
|
||||
xInSignal := NOT #TOnLineFullTimer.Q,
|
||||
sInAlarmMessage := 'Die Linie ist voll');
|
||||
|
||||
#fbMonitoringUnloadError.stSettings.nErrorType := 1;
|
||||
#fbMonitoringUnloadError.stSettings.xErrLedIfMachineIsOff := TRUE;
|
||||
#fbMonitoringUnloadError.stSettings.xSelfQuit := TRUE;
|
||||
#fbMonitoringUnloadError(sInFctnName := #stInOutHMI.sName,
|
||||
wInTextListId_Function := 500,
|
||||
wInTextListId_Message := 501,
|
||||
sInSuffix := #stInPartAfterSwitch.sName,
|
||||
InOutMachineState := #stInOutControlUnitCabinet,
|
||||
xInQuitError := #stInOutControlUnitCabinet.xQuitError OR #xInQuitLocal,
|
||||
xInSignal := NOT #xOutUnloadingError,
|
||||
sInAlarmMessage := 'Laufzeitfehler bei Weiche/Abwurf');
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION Visu
|
||||
REGION Status
|
||||
IF NOT #xOutUnloadingError AND (NOT #wOutErrorWord > 0) THEN
|
||||
IF #stInOutHMI.xEnableControl THEN
|
||||
#stInOutHMI.bStatus := 3;
|
||||
ELSE
|
||||
CASE #nState OF
|
||||
-10:
|
||||
#stInOutHMI.bStatus := 0; // NOT_AVAILABLE
|
||||
0, 1100, 1110, 1200, 1210, 1300:
|
||||
#stInOutHMI.bStatus := 1; // AVAILABLE
|
||||
ELSE //Fallback
|
||||
#stInOutHMI.bStatus := 0; // NOT AVAILABLE
|
||||
END_CASE;
|
||||
END_IF;
|
||||
ELSE // Fehler
|
||||
#stInOutHMI.bStatus := 2; // ERROR
|
||||
END_IF;
|
||||
END_REGION
|
||||
|
||||
REGION Modes
|
||||
// Int16 Bit-codiert
|
||||
#stInOutHMI.nMode.%X0 := (#nState = -10); // The device is turned off
|
||||
#stInOutHMI.nMode.%X1 := (#nState = 0) OR (#nState = 1100) OR (#nState = 1110) OR (#nState = 1200) OR (#nState = 1210) OR (#nState = 1300); // The device is turned on
|
||||
#stInOutHMI.nMode.%X2 := #stInOutHMI.xEnableControl; //Hand
|
||||
#stInOutHMI.nMode.%X3 := FALSE; //NIU
|
||||
#stInOutHMI.nMode.%X10 := #xOutUnloadingError; // Timeout Error
|
||||
END_REGION
|
||||
|
||||
// Idee: Schrittkette setzt im Normalfall den Switch.
|
||||
// Wenn EnableControl TRUE ist, dann wird der Ausgang hier einfach überschrieben mit dem HMI-Wert
|
||||
REGION Handbetrieb
|
||||
IF #stInOutHMI.xEnableControl THEN
|
||||
#xOutSwitch := #stInOutHMI.xSetSwitch;
|
||||
ELSE
|
||||
#stInOutHMI.xSetSwitch := #xOutSwitch;
|
||||
END_IF;
|
||||
|
||||
#stInOutHMI.xInHome := NOT #xOutSwitch;
|
||||
#stInOutHMI.xInWork := #xOutSwitch;
|
||||
|
||||
END_REGION
|
||||
|
||||
#stInOutHMI.xLineFull := #TOnLineFullTimer.Q;
|
||||
END_REGION
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
LibraryType:
|
||||
Guid: 72f65cd0-2f82-4e9a-944e-763573262fcb
|
||||
Comment:
|
||||
de-DE: 'CHNAGED: optimierung sk'
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.0
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: 'CHNAGED: optimierung sk'
|
||||
@@ -0,0 +1,6 @@
|
||||
DocumentHash:
|
||||
- FileName: FC_Ean8_CheckDigit.scl
|
||||
Hash: R/NEMYYVcohoRaYvvfR00dVoXqRCxkaB2vrCapFAIKY=
|
||||
LibraryMetaFileHash: kiYGeRw8WAjgxWPKrD0RU/pUGvFpQtxA5i+4VFRWOPU=
|
||||
LibraryVersion:
|
||||
Guid: 86087764-f9fa-4e00-99b4-fd1f0d046c81
|
||||
@@ -0,0 +1,40 @@
|
||||
FUNCTION "FC_Ean8_CheckDigit" : Void
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
sInDigits : String; // Barcode String (muss 7-stellig sein)
|
||||
END_VAR
|
||||
|
||||
VAR_OUTPUT
|
||||
sOutBarcode : String; // 8-stelliges Resultat als String
|
||||
nOutBarcode : DInt; // 8-stelliges Resultat als DINT
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
sBarcode : String; // Resultat als String
|
||||
nLengthString : Int; // Ermittelte Länge des Eingangsstrings
|
||||
nSum : Int; // Zwischensumme der berechneten Prüfziffer
|
||||
nCheckDigit : Int; // berechnete Prüfziffer
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
(*
|
||||
Prüft ob String siebenstellig ist.
|
||||
Falls nein, dann RETURN.
|
||||
Falls ja, dann errechne die Prüfziffer nach EAN8 und gebe Barcode als DINT sowie String aus.
|
||||
*)
|
||||
#nLengthString := LEN(#sInDigits);
|
||||
IF #nLengthString <> 7 THEN
|
||||
RETURN;
|
||||
END_IF;
|
||||
#nSum := STRING_TO_INT(#sInDigits[7]) * 3 + STRING_TO_INT(#sInDigits[6]) + STRING_TO_INT(#sInDigits[5]) * 3 + STRING_TO_INT(#sInDigits[4]) + STRING_TO_INT(#sInDigits[3]) * 3 + STRING_TO_INT(#sInDigits[2]) + STRING_TO_INT(#sInDigits[1]) * 3 ;
|
||||
#nCheckDigit := 10 - (#nSum MOD 10);
|
||||
IF #nCheckDigit = 10 THEN
|
||||
#nCheckDigit := 0;
|
||||
END_IF;
|
||||
#sOutBarcode := #sBarcode := CONCAT(IN1 := #sInDigits, IN2 := DELETE(IN:=INT_TO_STRING(#nCheckDigit), L:=1, P:=1));
|
||||
#nOutBarcode := STRING_TO_DINT(#sBarcode);
|
||||
|
||||
END_FUNCTION
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
LibraryType:
|
||||
Guid: 487f8a43-4b39-46f6-a1db-76a1b3e0f176
|
||||
Comment:
|
||||
de-DE: Initial
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.1
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: Änderung bei FC_TSHR_Shift
|
||||
@@ -0,0 +1,15 @@
|
||||
DocumentHash:
|
||||
- FileName: FC_Route.scl
|
||||
Hash: hIPhdrG77606oePl5SdGa7CHfrpBJY76vgPixX8iMW0=
|
||||
LibraryMetaFileHash: pJYnAbURN79vKAyF0lpkfpnLgEHsh+6NHtKXtFDTF8c=
|
||||
LibraryVersion:
|
||||
Guid: a5ef1d68-80ec-445d-a745-78efb8a2a107
|
||||
DependsOn:
|
||||
- TypeName: stEventBookingInfo
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stCarrier
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_TSHR_AddAtEnd
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_TSHR_Shift
|
||||
VersionNumber: 2.0.1
|
||||
@@ -0,0 +1,140 @@
|
||||
FUNCTION "FC_Route" : Void
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
xInSingle : Bool; // true = einzelner Carrier wird losgeschickt, false = Array
|
||||
xInSeparate : Bool; // Carrier und Ladung trennen
|
||||
xInSepEdge : Bool; // Flanke vom Separator
|
||||
xInSensor : Bool; // Sensor Eingang falls dieser verwendet wird
|
||||
xInDelay : Bool; // true = Car werden auf den Weg geschickt bis Sensor kommt
|
||||
stInCarrier : "stCarrier"; // Einzelner Carrier für den Eingang
|
||||
END_VAR
|
||||
|
||||
VAR_OUTPUT
|
||||
stOutBookingInfo : "stEventBookingInfo"; // Infos für Logging
|
||||
END_VAR
|
||||
|
||||
VAR_IN_OUT
|
||||
arJamEntr : Array[*] of "stCarrier"; // Jam am Eingang (Platzhalter verwenden falls kein Jam vorhanden)
|
||||
arOnTheWay : Array[*] of "stCarrier"; // Carrier die für die Travel-Time unterwegs sind
|
||||
arJamExit : Array[*] of "stCarrier"; // Jam am Ausgang (Platzhalter verwenden falls kein Jam vorhanden)
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
stCarrier : "stCarrier"; // Merker vom Eingang
|
||||
stLoadOnly : "stCarrier"; // Nur Ladung am Ende
|
||||
stCarrierOnly : "stCarrier";
|
||||
nCounter1 : DInt; // Temp für TSHR
|
||||
nCounter2 : DInt; // Temp für TSHR
|
||||
xResult1 : Bool; // Temp für TSHR
|
||||
xResult2 : Bool; // Temp für TSHR
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
REGION Abfrage ob Singlecarrier oder Array
|
||||
IF #xInSingle THEN
|
||||
#stCarrier := #stInCarrier; //falls kein Array vorhanden, wird hier ein einzlener Carrier verwendet
|
||||
ELSE
|
||||
#stCarrier := #arJamEntr[1]; //erster Carrier des Eingangs-Staubereichs
|
||||
END_IF;
|
||||
END_REGION
|
||||
REGION Weiterbuchen
|
||||
IF NOT #xInDelay THEN //Shift zum Ziel-Bereich sofort
|
||||
IF #xInSepEdge AND NOT #xInSeparate THEN
|
||||
REGION Carrier normal weiterschieben
|
||||
"FC_TSHR_AddAtEnd"(stInTrolley := #stCarrier,
|
||||
nOutCounter => #nCounter1,
|
||||
xOutResult => #xResult1,
|
||||
arTSHR := #arJamExit);
|
||||
|
||||
"FC_TSHR_Shift"(xInShiftBack := TRUE,
|
||||
arTSHR := #arJamEntr);
|
||||
|
||||
REGION Event Log
|
||||
// Info rausgeben an Log-Baustein
|
||||
#stOutBookingInfo.sBarcode := DELETE(IN := DINT_TO_STRING(#stCarrier.nBarcode), L := 1, P := 1);
|
||||
#stOutBookingInfo.sDest := DELETE(IN := INT_TO_STRING(#stCarrier.nDestination), L := 1, P := 1);
|
||||
// #stOutBookingInfo.sJobNo := DELETE(IN := DINT_TO_STRING(#stCarrier.stLoadData.nJobNo), L := 1, P := 1);
|
||||
// #stOutBookingInfo.sProductNo := DELETE(IN := DINT_TO_STRING(#stCarrier.stLoadData.nProductNo), L := 1, P := 1);
|
||||
|
||||
END_REGION
|
||||
|
||||
|
||||
END_REGION
|
||||
ELSIF #xInSepEdge AND #xInSeparate THEN
|
||||
REGION Carrier/Ladung getrennt weiterschieben
|
||||
|
||||
#stCarrierOnly := #stCarrier;
|
||||
#stCarrierOnly.bStatus.%X1 := FALSE;
|
||||
#stLoadOnly := #stCarrier;
|
||||
|
||||
REGION Carrier
|
||||
|
||||
"FC_TSHR_AddAtEnd"(stInTrolley := #stCarrierOnly,
|
||||
nOutCounter => #nCounter1,
|
||||
xOutResult => #xResult1,
|
||||
arTSHR := #arJamExit);
|
||||
|
||||
END_REGION
|
||||
|
||||
REGION Ladung
|
||||
"FC_TSHR_AddAtEnd"(stInTrolley := #stLoadOnly,
|
||||
nOutCounter => #nCounter1,
|
||||
xOutResult => #xResult1,
|
||||
arTSHR := #arOnTheWay);
|
||||
|
||||
END_REGION
|
||||
|
||||
"FC_TSHR_Shift"(xInShiftBack := TRUE,
|
||||
arTSHR := #arJamEntr);
|
||||
|
||||
REGION Event Log
|
||||
// Info rausgeben an Log-Baustein
|
||||
#stOutBookingInfo.sBarcode := DELETE(IN := DINT_TO_STRING(#stCarrier.nBarcode), L := 1, P := 1);
|
||||
#stOutBookingInfo.sDest := DELETE(IN := INT_TO_STRING(#stCarrier.nDestination), L := 1, P := 1);
|
||||
END_REGION
|
||||
|
||||
END_REGION
|
||||
END_IF;
|
||||
ELSE //Shift zum Ziel-Bereich über Verzögerung
|
||||
IF #xInSepEdge THEN
|
||||
REGION Carrier auf den Weg schieben
|
||||
"FC_TSHR_AddAtEnd"(stInTrolley := #stCarrier,
|
||||
nOutCounter => #nCounter1,
|
||||
xOutResult => #xResult1,
|
||||
arTSHR := #arOnTheWay);
|
||||
|
||||
"FC_TSHR_Shift"(xInShiftBack := TRUE,
|
||||
arTSHR := #arJamEntr);
|
||||
END_REGION
|
||||
|
||||
REGION Event Log
|
||||
// Info rausgeben an Log-Baustein
|
||||
#stOutBookingInfo.sBarcode := DELETE(IN := DINT_TO_STRING(#stCarrier.nBarcode), L := 1, P := 1);
|
||||
#stOutBookingInfo.sDest := DELETE(IN := INT_TO_STRING(#stCarrier.nDestination), L := 1, P := 1);
|
||||
END_REGION
|
||||
|
||||
END_IF;
|
||||
IF #xInSensor THEN
|
||||
REGION Carrier unterwegs wird durch Sensor quittiert
|
||||
"FC_TSHR_AddAtEnd"(stInTrolley := #arOnTheWay[1],
|
||||
nOutCounter => #nCounter2,
|
||||
xOutResult => #xResult2,
|
||||
arTSHR := #arJamExit);
|
||||
|
||||
"FC_TSHR_Shift"(xInShiftBack := TRUE,
|
||||
arTSHR := #arOnTheWay);
|
||||
END_REGION
|
||||
|
||||
REGION Event Log
|
||||
// Info rausgeben an Log-Baustein
|
||||
#stOutBookingInfo.sBarcode := DELETE(IN := DINT_TO_STRING(#stCarrier.nBarcode), L := 1, P := 1);
|
||||
#stOutBookingInfo.sDest := DELETE(IN := INT_TO_STRING(#stCarrier.nDestination), L := 1, P := 1);
|
||||
END_REGION
|
||||
|
||||
END_IF;
|
||||
END_IF;
|
||||
END_REGION
|
||||
END_FUNCTION
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
LibraryType:
|
||||
Guid: 6caf52bc-45ea-42bb-8864-ebe669724132
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.0
|
||||
Author: t.molina
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: 'CHANGED: übersetzt'
|
||||
@@ -0,0 +1,9 @@
|
||||
DocumentHash:
|
||||
- FileName: FC_SHR_CheckStationPin.scl
|
||||
Hash: nkMI480Ra4JgkPn02PCjzTtghlbgHDHdwzY/qUbRsZI=
|
||||
LibraryMetaFileHash: yE1mYrZG1jiaC+YKm95dBPJV/BUzcSI0edoqzGeOMfk=
|
||||
LibraryVersion:
|
||||
Guid: be754d41-5565-4ed2-98d8-6257307063cd
|
||||
DependsOn:
|
||||
- TypeName: stConveyorStations
|
||||
VersionNumber: 2.0.3
|
||||
@@ -0,0 +1,62 @@
|
||||
FUNCTION "FC_SHR_CheckStationPin" : Void
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
nInStation : Int;
|
||||
xInTargetStation : Bool;
|
||||
nInConvStations : Int; // neu hinzugefügt, statt Konstante
|
||||
nInStationsMax : Int; // neu hinzugefügt, statt Konstante
|
||||
END_VAR
|
||||
|
||||
VAR_OUTPUT
|
||||
xOutStationHi : Bool;
|
||||
xOutStationNHi : Bool;
|
||||
xOutStationHiBefore : Bool;
|
||||
nOutBarcode : DInt;
|
||||
sOutBarcode : String;
|
||||
END_VAR
|
||||
|
||||
VAR_IN_OUT
|
||||
stInOutConveyorStations : "stConveyorStations";
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
nCounter : Int;
|
||||
xStationHi : Bool;
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
// *************************************************************
|
||||
// Prüft ob Hanger aus dem Online-Register Station erreicht hat
|
||||
// *************************************************************
|
||||
|
||||
IF #stInOutConveyorStations.stData.nTrolleysOnline = 0 OR
|
||||
(#nInStation > #nInStationsMax) THEN
|
||||
RETURN;
|
||||
END_IF;
|
||||
|
||||
FOR #nCounter := 1 TO #nInConvStations DO
|
||||
IF #stInOutConveyorStations.arTrolleysOnline[#nCounter].stCarrier.bStatus.%X0 AND // Teil vorhanden
|
||||
((#stInOutConveyorStations.arTrolleysOnline[#nCounter].stPinValues.nTarget = #nInStation) OR NOT #xInTargetStation) AND // Zielstation GLEICH der eigenen Station
|
||||
(#stInOutConveyorStations.arTrolleysOnline[#nCounter].stPinValues.nPosAct >= #stInOutConveyorStations.arStationsPos[#nInStation].nPosIncr) THEN
|
||||
|
||||
#xStationHi := 1; //sagt Abwurf abbiegen
|
||||
|
||||
IF #xStationHi THEN
|
||||
#nOutBarcode := #stInOutConveyorStations.arTrolleysOnline[#nCounter].stCarrier.nBarcode;
|
||||
END_IF;
|
||||
EXIT;
|
||||
ELSIF
|
||||
#stInOutConveyorStations.arTrolleysOnline[#nCounter].stCarrier.bStatus.%X0 AND // Teil vorhanden
|
||||
((#stInOutConveyorStations.arTrolleysOnline[#nCounter].stPinValues.nTarget > #nInStation) OR NOT #xInTargetStation) AND // Zielstation GRÖßER der eigenen Station
|
||||
(#stInOutConveyorStations.arTrolleysOnline[#nCounter].stPinValues.nPosAct >= #stInOutConveyorStations.arStationsPos[#nInStation].nPosIncr) AND
|
||||
(#stInOutConveyorStations.arTrolleysOnline[#nCounter].stPinValues.nPosAct < #stInOutConveyorStations.arStationsPos[#nInStation].nPosIncr + 150) THEN
|
||||
|
||||
#xOutStationNHi := 1; //sagt Abwurf geradeaus
|
||||
EXIT;
|
||||
END_IF;
|
||||
END_FOR;
|
||||
#xOutStationHi := #xStationHi;
|
||||
END_FUNCTION
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
LibraryType:
|
||||
Guid: ae3ad50b-36d6-449e-8326-46d4e3b3c847
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.0
|
||||
Author: t.molina
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: 'CHANGED: übersetzt'
|
||||
@@ -0,0 +1,13 @@
|
||||
DocumentHash:
|
||||
- FileName: FC_SHR_CyclePin.scl
|
||||
Hash: 5Kwg7lZUM2fqIhMBTpVACHs/GGTG39fxI16w+9mc5+4=
|
||||
LibraryMetaFileHash: Zw+wjPFKzwXmUUpWTY7dgAvnGJBXef9gOjg0TjIrv68=
|
||||
LibraryVersion:
|
||||
Guid: 5abe1ca8-d687-4973-82d3-c99f7603ddad
|
||||
DependsOn:
|
||||
- TypeName: stCarrierPin
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_TSHR_AddAtEnd
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stConveyorStations
|
||||
VersionNumber: 2.0.3
|
||||
@@ -0,0 +1,58 @@
|
||||
FUNCTION "FC_SHR_CyclePin" : Void
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
nInPosDiff : DInt; // zykl. Differenz der Inkremente
|
||||
nInPosPitchPart : DInt;
|
||||
nInConvStations : Int; // neu hinzugefügt, statt Konstante
|
||||
nInStationsMax : Int; // neu hinzugefügt, statt Konstante
|
||||
END_VAR
|
||||
|
||||
VAR_IN_OUT
|
||||
stInOutConveyorStations : "stConveyorStations";
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
nCounter : Int;
|
||||
stEmptyTrolley : "stCarrierPin";
|
||||
nLastStationPos : DInt;
|
||||
Temp_1 : DInt;
|
||||
Temp_2 : Bool;
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
// ****************************************
|
||||
// Zyklischer Aufruf für Online-Register
|
||||
// ****************************************
|
||||
|
||||
// IF #stConveyorStations.nTrolleysOnline = 0 THEN
|
||||
// ;//RETURN;
|
||||
// END_IF;
|
||||
|
||||
#stInOutConveyorStations.stData.nPosActPart := #nInPosPitchPart;
|
||||
IF #nInPosDiff > 0 THEN
|
||||
// Trolleys aus Stationen entfernen / Anzahl der Trolleys ermitteln
|
||||
#stInOutConveyorStations.stData.nTrolleysOnline := 0;
|
||||
FOR #nCounter := 1 TO #nInConvStations DO
|
||||
|
||||
|
||||
// Wenn Trolley über letzte Station hinaus, dann löschen
|
||||
IF (#stInOutConveyorStations.stData.nStations > 0) AND (#stInOutConveyorStations.stData.nStations <= #nInStationsMax) THEN
|
||||
IF #stInOutConveyorStations.arTrolleysOnline[#nCounter].stPinValues.nPosAct > #stInOutConveyorStations.arStationsPos[#stInOutConveyorStations.stData.nStations].nPosIncr THEN
|
||||
"FC_TSHR_AddAtEnd"(stInTrolley := #stInOutConveyorStations.arTrolleysOnline[#nCounter].stCarrier,
|
||||
nOutCounter => #Temp_1,
|
||||
xOutResult => #Temp_2,
|
||||
arTSHR := "DB_HyperJam".stHyperJam.arCarrier); //TODO Zugriff über inout Schnittstelle...
|
||||
#stInOutConveyorStations.arTrolleysOnline[#nCounter] := #stEmptyTrolley;
|
||||
END_IF;
|
||||
END_IF;
|
||||
// Ansonsten online bleiben
|
||||
IF #stInOutConveyorStations.arTrolleysOnline[#nCounter].stCarrier.bStatus.%X0 THEN
|
||||
#stInOutConveyorStations.stData.nTrolleysOnline += 1;
|
||||
#stInOutConveyorStations.arTrolleysOnline[#nCounter].stPinValues.nPosAct += #nInPosDiff;
|
||||
END_IF;
|
||||
END_FOR;
|
||||
END_IF;
|
||||
END_FUNCTION
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
LibraryType:
|
||||
Guid: c15aaa61-01ed-4442-82db-06b58abeebb9
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.3
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: aktualisiert wegen unterlagerter Änderung
|
||||
@@ -0,0 +1,15 @@
|
||||
DocumentHash:
|
||||
- FileName: FC_SHR_ExtractedHangerPin.scl
|
||||
Hash: XyeHlDaPDHU4l/mIlfqMRb1ThUJh7fOEVbU6xxXAuso=
|
||||
LibraryMetaFileHash: WzpdUNPAj9I5FTy+OuK14GfR78f5T0kQJt9dQatgSsQ=
|
||||
LibraryVersion:
|
||||
Guid: 94bbd898-ab59-4c22-a0ee-320804d0387a
|
||||
DependsOn:
|
||||
- TypeName: stConveyorStations
|
||||
VersionNumber: 2.0.3
|
||||
- TypeName: stCarrierPin
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stCarrier
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: FC_TSHR_AddAtEnd
|
||||
VersionNumber: 2.0.0
|
||||
@@ -0,0 +1,63 @@
|
||||
FUNCTION "FC_SHR_ExtractedHangerPin" : Void
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
xInUnloadingDone : Bool; // trigger zum Offline Setzen des Trolleys
|
||||
nInBarcode : DInt; // Arrayposition in arTrolleysOnline
|
||||
xInBypass : Bool;
|
||||
END_VAR
|
||||
|
||||
VAR_IN_OUT
|
||||
stInOutConveyorStations : "stConveyorStations";
|
||||
arInOutCarrier : Array[*] of "stCarrier";
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
nCounter : Int; // Arraynummer bzw. Haken / Trolley
|
||||
nTrolleyPosition : Int;
|
||||
stEmptyTrolley : "stCarrierPin";
|
||||
tempTrolley : "stCarrier";
|
||||
TempCounter : DInt;
|
||||
TempResult : Bool;
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
// ****************************************
|
||||
// Setzt im Online-Register den Hanger im Abwurf auf Not Online
|
||||
// ****************************************
|
||||
// Passenden Eintrag finden
|
||||
IF #xInUnloadingDone THEN
|
||||
FOR #nCounter := 1 TO ("cHooksSorterMaxPin") DO
|
||||
IF #stInOutConveyorStations.arTrolleysOnline[#nCounter].stCarrier.nBarcode = #nInBarcode THEN
|
||||
EXIT;
|
||||
END_IF;
|
||||
END_FOR;
|
||||
// Wenn Eintrag gefunden, dann eintragen.
|
||||
IF #nCounter < "cHooksSorterMaxPin" THEN
|
||||
// #arOutTrolleyShiftRegister.arTrolley[1] := #arInOutTrolleysOnline[#nCounter].stTrolleyLoad;
|
||||
IF NOT #xInBypass THEN //Wenn der Carrier am Block vorbeifährt (Bypass) NICHT buchen *****NEU*****
|
||||
#tempTrolley := #stInOutConveyorStations.arTrolleysOnline[#nCounter].stCarrier;
|
||||
"FC_TSHR_AddAtEnd"(stInTrolley := #tempTrolley,
|
||||
nOutCounter => #TempCounter,
|
||||
xOutResult => #TempResult,
|
||||
arTSHR := #arInOutCarrier);
|
||||
END_IF;
|
||||
|
||||
IF NOT #TempResult
|
||||
AND NOT #xInBypass //***NEU***
|
||||
THEN
|
||||
RETURN;
|
||||
ELSE
|
||||
// Leeren des Hangers am Abwurf
|
||||
#stInOutConveyorStations.stData.nTrolleysOnline -= 1;
|
||||
// Alles im Online-Register eins weiter schieben
|
||||
FOR #nCounter := #nCounter TO ("cHooksSorterMaxPin" - 1) DO // Weiterkopieren um eine Position
|
||||
#stInOutConveyorStations.arTrolleysOnline[#nCounter] := #stInOutConveyorStations.arTrolleysOnline[#nCounter + 1];
|
||||
END_FOR;
|
||||
#stInOutConveyorStations.arTrolleysOnline["cHooksSorterMaxPin"] := #stEmptyTrolley;
|
||||
END_IF;
|
||||
END_IF;
|
||||
END_IF;
|
||||
END_FUNCTION
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
LibraryType:
|
||||
Guid: fbb06663-2a05-4c23-84a0-4d267ee6e385
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.1
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: 'CHANGED: übersetzt'
|
||||
@@ -0,0 +1,11 @@
|
||||
DocumentHash:
|
||||
- FileName: FC_SHR_HangerAddPin.scl
|
||||
Hash: SCQ7PgamkaxUa5QWVzGXY8NpJp3tKxxHpFGN8B/C5QE=
|
||||
LibraryMetaFileHash: p7/L2jLnZLmPRtZL/Yb3rkBbLHJMxvNbFxE1zg7hips=
|
||||
LibraryVersion:
|
||||
Guid: 6640f592-83b1-4a46-8526-d2f636c28047
|
||||
DependsOn:
|
||||
- TypeName: stCarrierPin
|
||||
VersionNumber: 2.0.0
|
||||
- TypeName: stConveyorStations
|
||||
VersionNumber: 2.0.3
|
||||
@@ -0,0 +1,73 @@
|
||||
FUNCTION "FC_SHR_HangerAddPin" : Void
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
stInCarrier : "stCarrierPin";
|
||||
nInPos : DInt; // Aktuelle Position auf der Kette
|
||||
nInTarget : USInt; // Ziel-Station f. Trolley bei My Theresa = 1
|
||||
nInConvStations : Int; // neu hinzugefügt, statt Konstante
|
||||
nInStationsMax : Int; // neu hinzugefügt, statt Konstante
|
||||
END_VAR
|
||||
|
||||
VAR_IN_OUT
|
||||
stInOutConveyorStations : "stConveyorStations";
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
nCounter : Int; // Arraynummer bzw. Haken / Trolley
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
// ****************************************
|
||||
// Setzt im Online-Register einen neuen Hanger (am Anfang)
|
||||
// ****************************************
|
||||
|
||||
IF #stInOutConveyorStations.arTrolleysOnline[1].stPinValues.nPosAct = #stInOutConveyorStations.arStationsPos[#nInPos].nPosIncr THEN // Wenn bereits ein Bügel eingetragen ist auf der Position
|
||||
RETURN;
|
||||
END_IF;
|
||||
// Alles im Online-Register eins weiter schieben
|
||||
FOR #nCounter := (#nInConvStations - 1) TO 1 BY -1 DO // Weiterkopieren um eine Position
|
||||
#stInOutConveyorStations.arTrolleysOnline[#nCounter + 1] := #stInOutConveyorStations.arTrolleysOnline[#nCounter];
|
||||
END_FOR;
|
||||
// Startwerte setzen
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X0 := TRUE;
|
||||
IF #nInTarget >= 1 AND #nInTarget <= #nInStationsMax THEN
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stPinValues.nTarget := #nInTarget;
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stPinValues.nTargetPos := #stInOutConveyorStations.arStationsPos[#nInTarget].nPosIncr;
|
||||
END_IF;
|
||||
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.nBarcode := #stInCarrier.stCarrier.nBarcode;
|
||||
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stPinValues.nPosAct := #stInOutConveyorStations.arStationsPos[#nInPos].nPosIncr;
|
||||
#stInOutConveyorStations.stData.nTrolleysOnline += 1;
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X1 := #stInCarrier.stCarrier.bStatus.%X1;
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X2 := #stInCarrier.stCarrier.bStatus.%X2;
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X3 := #stInCarrier.stCarrier.bStatus.%X3;
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X4 := #stInCarrier.stCarrier.bStatus.%X4;
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X5 := #stInCarrier.stCarrier.bStatus.%X5;
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X6 := #stInCarrier.stCarrier.bStatus.%X6;
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X7 := #stInCarrier.stCarrier.bStatus.%X7;
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X8 := #stInCarrier.stCarrier.bStatus.%X8;
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X9 := #stInCarrier.stCarrier.bStatus.%X9;
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X10 := #stInCarrier.stCarrier.bStatus.%X10;
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X11 := #stInCarrier.stCarrier.bStatus.%X11;
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X12 := #stInCarrier.stCarrier.bStatus.%X12;
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X13 := #stInCarrier.stCarrier.bStatus.%X13;
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X14 := #stInCarrier.stCarrier.bStatus.%X14;
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.bStatus.%X15 := #stInCarrier.stCarrier.bStatus.%X15;
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.nDestination := #stInCarrier.stCarrier.nDestination; // EMBI 11.06.2025
|
||||
|
||||
// Dummy-Barcode für Hanger vergeben. Negative Werte sind Dummys
|
||||
#stInOutConveyorStations.stData.nBarcodeNew -= 1;
|
||||
IF #stInOutConveyorStations.stData.nBarcodeNew < -2000000 THEN // Wenn Zähler Kleiner als 2 Mio dann von vorne anfangen.
|
||||
#stInOutConveyorStations.stData.nBarcodeNew := -1;
|
||||
END_IF;
|
||||
|
||||
IF #stInCarrier.stCarrier.nBarcode > 0 THEN
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.nBarcode := #stInCarrier.stCarrier.nBarcode;
|
||||
ELSE
|
||||
#stInOutConveyorStations.arTrolleysOnline[1].stCarrier.nBarcode := #stInOutConveyorStations.stData.nBarcodeNew;
|
||||
END_IF;
|
||||
END_FUNCTION
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
LibraryType:
|
||||
Guid: bb985cb7-f19e-4e7f-9500-9a5edcac2865
|
||||
LibraryVersion:
|
||||
VersionNumber: 2.0.3
|
||||
Author: e.yueksel
|
||||
IsDefault: true
|
||||
Comment:
|
||||
de-DE: aktualisiert wegen unterlagerter Änderung
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user