ILSLib hinzugefügt

This commit is contained in:
2026-06-29 16:29:41 +02:00
parent 14a1c5172d
commit cd281dc8b2
249 changed files with 26501 additions and 0 deletions
@@ -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
+68
View File
@@ -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'
+13
View File
@@ -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
+167
View File
@@ -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
+10
View File
@@ -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
+13
View File
@@ -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
+315
View File
@@ -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
+475
View File
@@ -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
+10
View File
@@ -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
+57
View File
@@ -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
+63
View File
@@ -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
+524
View File
@@ -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
+6
View File
@@ -0,0 +1,6 @@
LibraryType:
Guid: 0678257d-ddb5-460a-a4ac-69f4da95e1e7
LibraryVersion:
VersionNumber: 2.0.2
Author: e.yueksel
IsDefault: true
+6
View File
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: UDT_MFRCtrl.xml
Hash: ia5Ybmih6KUb1UAZCcNHmDSCf8mh/M7Bn3w0vece/M0=
LibraryMetaFileHash: BORJ8JsdQ/k3ai0U6lB0Sv0RU0X0W14y7rsAafJm/es=
LibraryVersion:
Guid: 49f2be50-381b-4393-8619-be5f49876873
+85
View File
@@ -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
+75
View File
@@ -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>
+6
View File
@@ -0,0 +1,6 @@
LibraryType:
Guid: 54786651-aad8-47a2-81cb-747f166d4061
LibraryVersion:
VersionNumber: 2.0.2
Author: e.yueksel
IsDefault: true
+6
View File
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: UDT_MFRState.xml
Hash: WUhPfKonCfTHnOx6tuyEMcX/KIOeL90x3dB0Vv9YAgw=
LibraryMetaFileHash: vg0jMdA+dQlp3rSAs5xG28dp25ybygxR80sv6payO7A=
LibraryVersion:
Guid: cdacc796-61cb-4ba8-897c-888bf3bf6238
+70
View File
@@ -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
+13
View File
@@ -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
+75
View File
@@ -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="&quot;UDT_MFRCtrl&quot;">
<AttributeList>
<BooleanAttribute Name="SetPoint" SystemDefined="true">true</BooleanAttribute>
</AttributeList>
</Member>
<Member Name="UDT_State" Datatype="&quot;UDT_MFRState&quot;">
<AttributeList>
<BooleanAttribute Name="SetPoint" SystemDefined="true">true</BooleanAttribute>
</AttributeList>
</Member>
<Member Name="UDT_Scan" Datatype="&quot;UDT_MFRScanResult&quot;">
<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
+6
View File
@@ -0,0 +1,6 @@
LibraryType:
Guid: 147eef49-040b-42d5-ae7d-43bf675e04d5
LibraryVersion:
VersionNumber: 2.0.0
Author: e.yueksel
IsDefault: true
+11
View File
@@ -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
+304
View File
@@ -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>
+10
View File
@@ -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
+23
View File
@@ -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
+644
View File
@@ -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
+23
View File
@@ -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
+483
View File
@@ -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
+296
View File
@@ -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
+10
View File
@@ -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'
+6
View File
@@ -0,0 +1,6 @@
DocumentHash:
- FileName: FC_Ean8_CheckDigit.scl
Hash: R/NEMYYVcohoRaYvvfR00dVoXqRCxkaB2vrCapFAIKY=
LibraryMetaFileHash: kiYGeRw8WAjgxWPKrD0RU/pUGvFpQtxA5i+4VFRWOPU=
LibraryVersion:
Guid: 86087764-f9fa-4e00-99b4-fd1f0d046c81
+40
View File
@@ -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
+10
View File
@@ -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
+15
View File
@@ -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
+140
View File
@@ -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
+62
View File
@@ -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
+8
View File
@@ -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'
+13
View File
@@ -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
+58
View File
@@ -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
+63
View File
@@ -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
+8
View File
@@ -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'
+11
View File
@@ -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
+73
View File
@@ -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