From 2cf730b338438453b4a5b7de112b11ec10aed3a6 Mon Sep 17 00:00:00 2001 From: Embi Date: Wed, 8 Jul 2026 12:13:12 +0200 Subject: [PATCH] UH07 Original .awl Bausteine von Andi importiert --- .../0_HWtoVP/Basics/HWtoVP_Antriebe.awl | 389 +- .../0_HWtoVP/Basics/HWtoVP_Sensoren.awl | 311 +- .../0_HWtoVP/Basics/HWtoVP_Zylinder.awl | 271 +- .../Anlage/0_HWtoVP/HWtoOB_Bereich.awl | 31 +- .../Omnifahren_HWtoVP/HWtoVP_Draussen.awl | 146 +- .../Omnifahren_HWtoVP/HWtoVP_Leser_FC.awl | 161 +- .../Omnifahren_HWtoVP/HWtoVP_OmniFahren.awl | 1078 ++-- .../Omnifahren_HWtoVP/HWtoVP_Ziel_FC.awl | 578 +- .../1_Vollpuffer/Basics/VP_Antriebe.awl | 233 +- .../1_Vollpuffer/Basics/VP_Sensoren.awl | 1242 ++-- .../1_Vollpuffer/Basics/VP_Zylinder.awl | 2663 ++++++--- .../Omnifahren_Vollpuffer/VP_Draussen_FC.awl | 134 +- .../Omnifahren_Vollpuffer/VP_Leser_FC.awl | 161 +- .../Omnifahren_Vollpuffer/VP_OmniFahren.awl | 389 +- .../Omnifahren_Vollpuffer/VP_Ziel_FC.awl | 907 +-- .../Sorter_Vollpuffer/VP_Sorter_A.awl | 1656 +++--- .../Sorter_Vollpuffer/VP_Sorter_B.awl | 1065 ++-- .../Anlage/1_Vollpuffer/VP_Bereich.awl | 41 +- .../2_VPtoEP/Basics/VPtoEP_Antriebe.awl | 351 +- .../2_VPtoEP/Basics/VPtoEP_Sensoren.awl | 278 +- .../2_VPtoEP/Basics/VPtoEP_Zylinder.awl | 183 +- .../Omnifahren_VPtoEP/VPtoEP_Draussen_FC.awl | 82 +- .../Omnifahren_VPtoEP/VPtoEP_Leser_FC.awl | 79 +- .../Omnifahren_VPtoEP/VPtoEP_OmniFahren.awl | 643 ++- .../Omnifahren_VPtoEP/VPtoEP_Ziel_FC.awl | 187 +- .../Anlage/2_VPtoEP/VPtoEP_Bereich.awl | 31 +- .../3_Entnahmepuffer/Basics/EP_Sensoren.awl | 101 +- .../3_Entnahmepuffer/Basics/EP_Zylinder.awl | 112 +- .../Anlage/3_Entnahmepuffer/EP_Bereich.awl | 33 +- .../EP_Draussen_FC.awl | 61 +- .../Omnifahren_Entnahmepuffer/EP_Leser_FC.awl | 71 +- .../EP_OmniFahren.awl | 131 +- .../Omnifahren_Entnahmepuffer/EP_Ziel_FC.awl | 284 +- .../Sorter_Entnahmepuffer/EP_Sorter.awl | 703 ++- .../4_EPtoLP/Basics/EPtoLP_Antriebe.awl | 291 +- .../4_EPtoLP/Basics/EPtoLP_Sensoren.awl | 296 +- .../4_EPtoLP/Basics/EPtoLP_Zylinder.awl | 199 +- .../Anlage/4_EPtoLP/EPtoLP_Bereich.awl | 31 +- .../Omnifahren_EPtoLP/EPtoLP_Draussen.awl | 63 +- .../Omnifahren_EPtoLP/EPtoLP_OmniFahren.awl | 869 ++- .../Omnifahren_EPtoLP/EPtoLP_Ziel_FC.awl | 123 +- .../5_Leerpuffer/Basics/LP_Sensoren.awl | 221 +- .../5_Leerpuffer/Basics/LP_Zylinder.awl | 336 +- .../Anlage/5_Leerpuffer/LP_Bereich.awl | 40 +- .../Omnifahren_Leerpuffer/LP_Draussen_FC.awl | 61 +- .../Omnifahren_Leerpuffer/LP_OmniFahren.awl | 119 +- .../Omnifahren_Leerpuffer/LP_Ziel_FC.awl | 205 +- .../Sorter_Leerpuffer/LP_Sorter.awl | 888 +-- .../6_LPtoHW/Basics/LPtoHW_Antriebe.awl | 332 +- .../6_LPtoHW/Basics/LPtoHW_Sensoren.awl | 363 +- .../6_LPtoHW/Basics/LPtoHW_Zylinder.awl | 227 +- .../Anlage/6_LPtoHW/LPtoHW_Bereich.awl | 31 +- .../Omnifahren_LPtoHW/LPtoHW_Draussen_FC.awl | 167 +- .../Omnifahren_LPtoHW/LPtoHW_Leser_FC.awl | 120 +- .../Omnifahren_LPtoHW/LPtoHW_OmniFahren.awl | 951 +-- .../Omnifahren_LPtoHW/LPtoHW_Ziel_FC.awl | 277 +- .../Anlage/OutBound_Bereich.awl | 4608 +++++++-------- .../Logistik/PufferZeiger_ermitteln.awl | 94 +- .../Reservierung_in_Puffer_eintragen.awl | 257 +- .../Logistik/SchleusenZeiger_ermitteln.awl | 84 +- .../Simulation_Aus_VP_Trolley_starten.awl | 373 +- .../Logistik/Trolley_DL_Check_ID.awl | 99 +- .../Logistik/Trolley_DL_Neue_Pos.awl | 172 +- .../Logistik/Trolleydaten_löschen.awl | 63 +- .../Logistik/Trolleydaten_neu_anlegen.awl | 96 +- .../Logistik/Trolleydaten_ändern.awl | 106 +- .../Logistik/Wandel_FC_für_DB1000.awl | 29 +- .../Module/BCD (4stellig)_to_INT.awl | 174 +- .../Programmbausteine/Module/DBMOV.awl | 114 +- .../Programmbausteine/Module/DL_Einsprung.awl | 101 +- .../Module/DatenFindOffsetSort.awl | 1319 +++-- .../Programmbausteine/Module/DatenIn.awl | 1170 ++-- .../Programmbausteine/Module/DatenInSort.awl | 1026 ++-- .../Programmbausteine/Module/DatenOut.awl | 1873 +++--- .../Programmbausteine/Module/DatenOutSort.awl | 1134 ++-- .../Programmbausteine/Module/DatenReset.awl | 472 +- .../Module/DatenResetSort.awl | 342 +- .../Module/Err_vorhanden.awl | 128 +- .../Programmbausteine/Module/FIFOChange.awl | 632 +- .../Programmbausteine/Module/FIFOSearch.awl | 797 +-- .../Programmbausteine/Module/FifoIn.awl | 1070 ++-- .../Programmbausteine/Module/FifoOut.awl | 1067 ++-- .../Programmbausteine/Module/FifoReset.awl | 400 +- .../Module/INT_to_BCD (4stellig).awl | 92 +- .../Module/MAntrieb_PowerSave.awl | 1013 ++-- .../Programmbausteine/Module/MAntrieb_all.awl | 1013 ++-- .../Module/MAusfahrFreigabe.awl | 1049 ++-- .../Module/MAusfahrFreigabe_neu.awl | 149 +- .../Programmbausteine/Module/MBlinken.awl | 292 +- .../Module/MHMEntnahmepuffer.awl | 402 +- .../Module/MHMLeerpuffer.awl | 2898 +++++----- .../Module/MHMOmniBereich_Plus.awl | 2690 ++++----- .../Module/MHMOmniSchleuse.awl | 4825 ++++++++-------- .../Module/MHMOmniSchleuse_Plus.awl | 4708 +++++++-------- .../Module/MHMOmniWeiche_Plus.awl | 1805 +++--- .../Module/MHMVollpuffer.awl | 5100 +++++++++-------- .../Module/MHMÜbergang_ohne_Schleuse.awl | 185 +- .../Module/MHMÜberlauf_VP.awl | 2378 ++++---- .../Programmbausteine/Module/MImpulsGeber.awl | 209 +- .../Programmbausteine/Module/MSensoren.awl | 163 +- .../Module/MSepSorterRein.awl | 4725 +++++++-------- .../Module/MSorter_Uebergabe.awl | 1226 ++-- .../Programmbausteine/Module/MStartSync.awl | 2770 ++++----- .../Module/MWeiche_Sorter.awl | 2369 ++++---- .../Module/MWeiche_Sorter_EP.awl | 2365 ++++---- .../Programmbausteine/Module/MZylinder.awl | 346 +- .../Module/Save_CARR_Gesendet.awl | 116 +- .../Programmbausteine/Module/Save_Ziel.awl | 64 +- .../Programmbausteine/Module/Set_Input.awl | 59 +- .../Programmbausteine/Module/Set_Output.awl | 59 +- .../Visualisierung/Visu_CheckTrolley.awl | 368 +- .../Visualisierung/Visu_HMLeerPuffer.awl | 870 +-- .../Visu_HMOmniBereich_Plus.awl | 708 +-- .../Visualisierung/Visu_HMOmniSchleuse.awl | 750 +-- .../Visu_HMOmniSchleuse_Plus.awl | 736 +-- .../Visualisierung/Visu_HMOmniWeiche_Plus.awl | 550 +- .../Visualisierung/Visu_HMVollPuffer.awl | 966 ++-- .../Visualisierung/Visu_Sorter_Rein.awl | 772 +-- .../Visualisierung/Visu_StartSync_Visu.awl | 550 +- .../Visualisierung/Visu_Weiche_Sorter.awl | 582 +- .../_All/CYC_INT8_(10ms).awl | 117 +- .../_All/Cycle Execution.awl | 1114 ++-- .../Programmbausteine/_All/LTest.awl | 364 +- .../Programmbausteine/_All/Startup.awl | 73 +- .../xCommunication/FB_CommunicationWCSBL.scl | 6 +- 125 files changed, 49373 insertions(+), 41019 deletions(-) diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Basics/HWtoVP_Antriebe.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Basics/HWtoVP_Antriebe.awl index 37b727a..836ca6b 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Basics/HWtoVP_Antriebe.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Basics/HWtoVP_Antriebe.awl @@ -1,169 +1,286 @@ -=== FB 199: HWtoVP_Antriebe [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - MA0200 : "MAntrieb_PowerSave" - MA0201 : "MAntrieb_PowerSave" - MA0260 : "MAntrieb_PowerSave" - MA0261 : "MAntrieb_PowerSave" - MA0262 : "MAntrieb_PowerSave" - MA0263 : "MAntrieb_PowerSave" - MA0140 : "MAntrieb_PowerSave" - MA0141 : "MAntrieb_PowerSave" - MA0142 : "MAntrieb_PowerSave" - MA0143 : "MAntrieb_PowerSave" - MA0144 : "MAntrieb_PowerSave" - Temp: - Auto : Bool // Automatik Linie ist aktiv - Hand : Bool // Hand Linie ist aktiv - BereichErr : Bool // Bereichsstörung -> Antrieb stoppen - QKontroll : Bool // Frequenzumrichter schon 3s Netz EIN - FuKontroll : Bool // Frequenzumrichter schon 3s Netz EIN - Quit : Bool // Motorschutz-Störung quittieren - Qok : Bool // Motorschutz ok - Jog1 : Bool // Geschwindigkeit 1 - Jog2 : Bool // Geschwindigkeit 2 - Betrieb : Bool // Betriebsart aktiv - FC105_RET : Word // Returnwert von FC105 - Antrieb1 : Bool // Antrieb dazuschalten - Antrieb2 : Bool // Antrieb dazuschalten - F1 : Bool // Geschwindigkeit 1 aktiviert - F2 : Bool // Geschwindigkeit 2 aktiviert - F3 : Bool // Geschwindigkeit 3 aktiviert - Constant: +FUNCTION_BLOCK "HWtoVP_Antriebe" +TITLE = Antriebe HW > VP +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + MA0200 : "MAntrieb_PowerSave"; + MA0201 : "MAntrieb_PowerSave"; + MA0260 : "MAntrieb_PowerSave"; + MA0261 : "MAntrieb_PowerSave"; + MA0262 : "MAntrieb_PowerSave"; + MA0263 : "MAntrieb_PowerSave"; + MA0140 : "MAntrieb_PowerSave"; + MA0141 : "MAntrieb_PowerSave"; + MA0142 : "MAntrieb_PowerSave"; + MA0143 : "MAntrieb_PowerSave"; + MA0144 : "MAntrieb_PowerSave"; + END_VAR ---- NW 1: Übergabe des Bereichstatus System UC072/A01 --- - A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto - - A( - A "DOutbound_Bereich".A01_UC072.BereichErr - O "DOutbound_Bereich".A01_UZ7201.Area_Stop - O "DOutbound_Bereich".A01_UZ7202.Area_Stop - ) - AN "SGes".Simulation_ohne_HW_aktiv - = BereichErr - - AN BereichErr - L S5T#1S - OnDelay "T192" - - A "T192" - = QKontroll - = FuKontroll - - A "DOutbound_Bereich".A01_UC072.StOk_aktiv - = Quit + VAR_TEMP + Auto : Bool; // Automatik Linie ist aktiv + Hand : Bool; // Hand Linie ist aktiv + BereichErr : Bool; // Bereichsstörung -> Antrieb stoppen + QKontroll : Bool; // Frequenzumrichter schon 3s Netz EIN + FuKontroll : Bool; // Frequenzumrichter schon 3s Netz EIN + Quit : Bool; // Motorschutz-Störung quittieren + Qok : Bool; // Motorschutz ok + Jog1 : Bool; // Geschwindigkeit 1 + Jog2 : Bool; // Geschwindigkeit 2 + Betrieb : Bool; // Betriebsart aktiv + FC105_RET : Word; // Returnwert von FC105 + Antrieb1 : Bool; // Antrieb dazuschalten + Antrieb2 : Bool; // Antrieb dazuschalten + F1 : Bool; // Geschwindigkeit 1 aktiviert + F2 : Bool; // Geschwindigkeit 2 aktiviert + F3 : Bool; // Geschwindigkeit 3 aktiviert + END_VAR ---- NW 2: MA0200 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0200", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0200", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0200, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +BEGIN +NETWORK +TITLE = Übergabe des Bereichstatus System UC072/A01 + U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; + + U(; + U "DOutbound_Bereich".A01_UC072.BereichErr; + O "DOutbound_Bereich".A01_UZ7201.Area_Stop; + O "DOutbound_Bereich".A01_UZ7202.Area_Stop; + ); + UN "SGes".Simulation_ohne_HW_aktiv; + = #BereichErr; + + UN #BereichErr; + L S5T#1S; + SE "T192"; + + U "T192"; + = #QKontroll; + = #FuKontroll; + + U "DOutbound_Bereich".A01_UC072.StOk_aktiv; + = #Quit; + +NETWORK +TITLE = MA0200 + CALL #MA0200 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0200" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0200" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0200 + ); - ---- NW 3: MA0201 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0201", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0201", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0201, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0201 + CALL #MA0201 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0201" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0201" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0201 + ); +NETWORK +TITLE = Übergabe des Bereichstatus System UC073/A01 + U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; ---- NW 4: Übergabe des Bereichstatus System UC073/A01 --- - A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto + CLR; + = #Hand; - CLR - = Hand + U "DOutbound_Bereich".A01_UC073.BereichErr; + UN "SGes".Simulation_ohne_HW_aktiv; + = #BereichErr; - A "DOutbound_Bereich".A01_UC073.BereichErr - AN "SGes".Simulation_ohne_HW_aktiv - = BereichErr + UN #BereichErr; + L S5T#1S; + SE "T193"; - AN BereichErr - L S5T#1S - OnDelay "T193" + U "T193"; + = #QKontroll; + = #FuKontroll; - A "T193" - = QKontroll - = FuKontroll + U "DOutbound_Bereich".A01_UC073.StOk_aktiv; + = #Quit; - A "DOutbound_Bereich".A01_UC073.StOk_aktiv - = Quit +NETWORK +TITLE = MA0260 + CALL #MA0260 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0260" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0260" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0260 + ); ---- NW 5: MA0260 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0260", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0260", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0260, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0261 + CALL #MA0261 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0261" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0261" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0261 + ); - ---- NW 6: MA0261 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0261", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0261", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0261, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0262 + CALL #MA0262 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0262" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0262" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0262 + ); - ---- NW 7: MA0262 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0262", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0262", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0262, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0263 + CALL #MA0263 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0263" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0263" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0263 + ); +NETWORK +TITLE = Übergabe des Bereichstatus System UC071/A01 + U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; ---- NW 8: MA0263 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0263", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0263", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0263, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) + CLR; + = #Hand; + + U(; + O "DOutbound_Bereich".A01_UC071.BereichErr; + O "DOutbound_Bereich".A01_UZ7102.Area_Stop; + ); + UN "SGes".Simulation_ohne_HW_aktiv; + = #BereichErr; + + UN #BereichErr; + L S5T#1S; + SE "T191"; + + U "T191"; + = #QKontroll; + = #FuKontroll; + + U "DOutbound_Bereich".A01_UC071.StOk_aktiv; + = #Quit; + +NETWORK +TITLE = MA0140 + CALL #MA0140 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0140" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0140" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0140 + ); - ---- NW 9: Übergabe des Bereichstatus System UC071/A01 --- - A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto - - CLR - = Hand - - A( - O "DOutbound_Bereich".A01_UC071.BereichErr - O "DOutbound_Bereich".A01_UZ7102.Area_Stop - ) - AN "SGes".Simulation_ohne_HW_aktiv - = BereichErr - - AN BereichErr - L S5T#1S - OnDelay "T191" - - A "T191" - = QKontroll - = FuKontroll - - A "DOutbound_Bereich".A01_UC071.StOk_aktiv - = Quit +NETWORK +TITLE = MA0141 + CALL #MA0141 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0141" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0141" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0141 + ); ---- NW 10: MA0140 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0140", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0140", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0140, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0142 + CALL #MA0142 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0142" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0142" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0142 + ); - ---- NW 11: MA0141 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0141", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0141", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0141, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0143 + CALL #MA0143 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0143" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0143" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0143 + ); +NETWORK +TITLE = MA0144 + CALL #MA0144 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0144" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0144" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0144 + ); ---- NW 12: MA0142 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0142", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0142", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0142, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = Ende + BE; - - ---- NW 13: MA0143 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0143", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0143", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0143, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) - - - ---- NW 14: MA0144 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0144", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0144", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0144, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) - - ---- NW 15: Ende --- - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Basics/HWtoVP_Sensoren.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Basics/HWtoVP_Sensoren.awl index 07ad51f..03f23b4 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Basics/HWtoVP_Sensoren.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Basics/HWtoVP_Sensoren.awl @@ -1,111 +1,244 @@ -=== FB 190: HWtoVP_Sensoren [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Stau_BG3730 : "MSensoren" // Stau am Sensor Einfahrt MA0201 - Stau_BG4202 : "MSensoren" // Stau am Sensor Einfahrt MA0261 - Stau_BG4204 : "MSensoren" // Stau am Sensor Einfahrt MA0262 - Stau_BG4206 : "MSensoren" // Stau am Sensor Einfahrt MA0263 - Stau_BG4210 : "MSensoren" // Stau am Sensor Weiche MB4210 - Stau_BG4211 : "MSensoren" // Stau am Sensor Weiche MB4210 - Stau_BG4213 : "MSensoren" // Stau am Sensor - Stau_BG4215 : "MSensoren" // Stau am Sensor Einfahrt MA140 - Stau_BG3144 : "MSensoren" // Stau am Sensor Einfahrt Schleuse3144 - Stau_BG3142 : "MSensoren" // Stau am Sensor Einfahrt Schleuse3142 - Stau_BG3130 : "MSensoren" // Stau am Sensor Einfahrt Schleuse3130 - Stau_BG3127 : "MSensoren" // Stau am Sensor Einfahrt Schleuse3127 - Stau_BG3132 : "MSensoren" // Stau am Sensor Einfahrt Schleuse3132 - Stau_BG3133 : "MSensoren" // Stau am Sensor Einfahrt Schleuse3132 - Stau_BG3135 : "MSensoren" // Stau am Sensor Einfahrt Schleuse3135 - Stau_BG4216 : "MSensoren" // Stau am Sensor Einfahrt MA140 - Stau_BG3724 : "MSensoren" // Stau am Sensor Einfahrt MA200 - Stau_BG4201 : "MSensoren" // Stau am Sensor hinter BST2 - Temp: - T_Ein : Int // Vorgabe Einschaltverzögerung - T_Aus : Int // Zwischenspeicher Ausschaltverzögerung - F1 : Bool // Geschwindigkeit 1 aktiviert - F2 : Bool // Geschwindigkeit 2 aktiviert - F3 : Bool // Geschwindigkeit 3 aktiviert - ESensor : Bool // Sensoren - Antrieb : Bool - VReal : Real // GeschwindigkeitinReal - Zeit : Int // Zeit für Ausschaltverzögerung LT1100 - Aktiv : Bool // Zeit aktivieren - Constant: +FUNCTION_BLOCK "HWtoVP_Sensoren" +TITLE = Sensoren Outbound: HW > VP +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + Stau_BG3730 : "MSensoren"; // Stau am Sensor Einfahrt MA0201 + Stau_BG4202 : "MSensoren"; // Stau am Sensor Einfahrt MA0261 + Stau_BG4204 : "MSensoren"; // Stau am Sensor Einfahrt MA0262 + Stau_BG4206 : "MSensoren"; // Stau am Sensor Einfahrt MA0263 + Stau_BG4210 : "MSensoren"; // Stau am Sensor Weiche MB4210 + Stau_BG4211 : "MSensoren"; // Stau am Sensor Weiche MB4210 + Stau_BG4213 : "MSensoren"; // Stau am Sensor + Stau_BG4215 : "MSensoren"; // Stau am Sensor Einfahrt MA140 + Stau_BG3144 : "MSensoren"; // Stau am Sensor Einfahrt Schleuse3144 + Stau_BG3142 : "MSensoren"; // Stau am Sensor Einfahrt Schleuse3142 + Stau_BG3130 : "MSensoren"; // Stau am Sensor Einfahrt Schleuse3130 + Stau_BG3127 : "MSensoren"; // Stau am Sensor Einfahrt Schleuse3127 + Stau_BG3132 : "MSensoren"; // Stau am Sensor Einfahrt Schleuse3132 + Stau_BG3133 : "MSensoren"; // Stau am Sensor Einfahrt Schleuse3132 + Stau_BG3135 : "MSensoren"; // Stau am Sensor Einfahrt Schleuse3135 + Stau_BG4216 : "MSensoren"; // Stau am Sensor Einfahrt MA140 + Stau_BG3724 : "MSensoren"; // Stau am Sensor Einfahrt MA200 + Stau_BG4201 : "MSensoren"; // Stau am Sensor hinter BST2 + END_VAR ---- NW 1: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3730", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) + VAR_TEMP + T_Ein : Int; // Vorgabe Einschaltverzögerung + T_Aus : Int; // Zwischenspeicher Ausschaltverzögerung + F1 : Bool; // Geschwindigkeit 1 aktiviert + F2 : Bool; // Geschwindigkeit 2 aktiviert + F3 : Bool; // Geschwindigkeit 3 aktiviert + ESensor : Bool; // Sensoren + Antrieb : Bool; + VReal : Real; // GeschwindigkeitinReal + Zeit : Int; // Zeit für Ausschaltverzögerung LT1100 + Aktiv : Bool; // Zeit aktivieren + END_VAR ---- NW 2: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4202", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +BEGIN +NETWORK +TITLE = Stau am Sensor Einfahrt MA0201 +//Sensoren entprellen + CALL #Stau_BG3730 + ( ESensor := "BG3730" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Einfahrt MA0261 +//Sensoren entprellen + CALL #Stau_BG4202 + ( ESensor := "BG4202" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 3: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4204", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor Einfahrt MA0262 +//Sensoren entprellen + CALL #Stau_BG4204 + ( ESensor := "BG4204" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Einfahrt MA0263 +//Sensoren entprellen + CALL #Stau_BG4206 + ( ESensor := "BG4206" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 4: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4206", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor vor Weiche MB4210 +//Sensoren entprellen + CALL #Stau_BG4210 + ( ESensor := "BG4210" , + T_Ein := 80 , + T_Aus := 101 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor nach Weiche MB4210 +//Sensoren entprellen + CALL #Stau_BG4211 + ( ESensor := "BG4211" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 5: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4210", T_Ein:=80, T_Aus:=101, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor Weiche MB4213 +//Sensoren entprellen + CALL #Stau_BG4213 + ( ESensor := "BG4213" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Einfahrt MA0140 +//Sensoren entprellen + CALL #Stau_BG4215 + ( ESensor := "BG4215" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 6: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4211", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor Einfahrt Schleuse3144 +//Sensoren entprellen + CALL #Stau_BG3144 + ( ESensor := "BG3144" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Einfahrt Schleuse3142 +//Sensoren entprellen + CALL #Stau_BG3142 + ( ESensor := "BG3142" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := True + ); ---- NW 7: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4213", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor Einfahrt Schleuse3130 +//Sensoren entprellen + CALL #Stau_BG3130 + ( ESensor := "BG3130" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := True + ); +NETWORK +TITLE = Stau am Sensor Einfahrt Schleuse3127 +//Sensoren entprellen + CALL #Stau_BG3127 + ( ESensor := "BG3127" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 8: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4215", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor Einfahrt Schleuse3132 +//Sensoren entprellen + CALL #Stau_BG3132 + ( ESensor := "BG3132" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Einfahrt Schleuse3133 +//Sensoren entprellen + CALL #Stau_BG3133 + ( ESensor := "BG3133" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 9: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3144", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor Einfahrt Schleuse3135 +//Sensoren entprellen + CALL #Stau_BG3135 + ( ESensor := "BG3135" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Einfahrt Schleuse4207 +//Sensoren entprellen + CALL #Stau_BG4216 + ( ESensor := "BG4216" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 10: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3142", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=True) +NETWORK +TITLE = Stau am Sensor Einfahrt MA0200 +//Sensoren entprellen + CALL #Stau_BG3724 + ( ESensor := "BG3724" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor hinter BST2 +//Sensoren entprellen + CALL #Stau_BG4201 + ( ESensor := "BG4201" , + T_Ein := 1 , + T_Aus := 30 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 11: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3130", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=True) +NETWORK +TITLE = Ende + BE; - ---- NW 12: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3127", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 13: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3132", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 14: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3133", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 15: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3135", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 16: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4216", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 17: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3724", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 18: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4201", T_Ein:=1, T_Aus:=30, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 19: Ende --- - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Basics/HWtoVP_Zylinder.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Basics/HWtoVP_Zylinder.awl index 99c8962..ce84a82 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Basics/HWtoVP_Zylinder.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Basics/HWtoVP_Zylinder.awl @@ -1,117 +1,202 @@ -=== FB 192: HWtoVP_Zylinder [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Schleuse_3725 : "MZylinder" // - Schleuse_4200 : "MZylinder" - Schleuse_4207 : "MZylinder" - Schleuse_4212 : "MZylinder" - Schleuse_4214 : "MZylinder" - Schleuse_3143 : "MZylinder" // - Schleuse_3141 : "MZylinder" // - Weiche_3137 : "MZylinder" // - Weiche_3140 : "MZylinder" // - Schleuse_3131 : "MZylinder" // - Schleuse_3134 : "MZylinder" // - Schleuse_3136 : "MZylinder" // - Schleuse_4217 : "MZylinder" // - Temp: - Auto : Bool // Automatik ist aktiv - Hand : Bool // Hand ist aktiv - ZylAst : Bool // Zylinder ansteuern - Constant: +FUNCTION_BLOCK "HWtoVP_Zylinder" +TITLE = Zylinder Outbound Highway > Vollpuffer +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 + VAR + Schleuse_3725 : "MZylinder"; // + Schleuse_4200 : "MZylinder"; + Schleuse_4207 : "MZylinder"; + Schleuse_4212 : "MZylinder"; + Schleuse_4214 : "MZylinder"; + Schleuse_3143 : "MZylinder"; // + Schleuse_3141 : "MZylinder"; // + Weiche_3137 : "MZylinder"; // + Weiche_3140 : "MZylinder"; // + Schleuse_3131 : "MZylinder"; // + Schleuse_3134 : "MZylinder"; // + Schleuse_3136 : "MZylinder"; // + Schleuse_4217 : "MZylinder"; // + END_VAR ---- NW 1: Übergabe des Bereichstatus System UC072/A01 --- - A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto - - A( - A "DOutbound_Bereich".A01_UC072.BereichErr - O "DOutbound_Bereich".A01_UZ7201.Area_Stop - O "DOutbound_Bereich".A01_UZ7202.Area_Stop - ) - AN "SGes".Simulation_ohne_HW_aktiv - JC Next // Zylinder-Stellung nicht mehr ändern + VAR_TEMP + Auto : Bool; // Automatik ist aktiv + Hand : Bool; // Hand ist aktiv + ZylAst : Bool; // Zylinder ansteuern + END_VAR ---- NW 2: Schleuse_3725 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3725", ZylGst:=?) +BEGIN +NETWORK +TITLE = Übergabe des Bereichstatus System UC072/A01 + U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; + U(; + U "DOutbound_Bereich".A01_UC072.BereichErr; + O "DOutbound_Bereich".A01_UZ7201.Area_Stop; + O "DOutbound_Bereich".A01_UZ7202.Area_Stop; + ); + UN "SGes".Simulation_ohne_HW_aktiv; + SPB Next ;//Zylinder-Stellung nicht mehr ändern ---- NW 3: Übergabe des Bereichstatus System UC073/A01 --- -Next: A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto +NETWORK +TITLE = Schleuse_3725 + CALL #Schleuse_3725 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3725" + ); - A "DOutbound_Bereich".A01_UC073.BereichErr - AN "SGes".Simulation_ohne_HW_aktiv - JC Next2 // Zylinder-Stellung nicht mehr ändern +NETWORK +TITLE = Übergabe des Bereichstatus System UC073/A01 +Next: U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; + U "DOutbound_Bereich".A01_UC073.BereichErr; + UN "SGes".Simulation_ohne_HW_aktiv; + SPB Next2 ;//Zylinder-Stellung nicht mehr ändern ---- NW 4: Schleuse_4200 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4200", ZylGst:=?) +NETWORK +TITLE = Schleuse_4200 + CALL #Schleuse_4200 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4200" + ); +NETWORK +TITLE = Schleuse_4207 + CALL #Schleuse_4207 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4207" + ); ---- NW 5: Schleuse_4207 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4207", ZylGst:=?) +NETWORK +TITLE = Schleuse_4212 + CALL #Schleuse_4212 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4212" + ); +NETWORK +TITLE = Schleuse_4214 + CALL #Schleuse_4214 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4214" + ); ---- NW 6: Schleuse_4212 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4212", ZylGst:=?) +NETWORK +TITLE = Übergabe des Bereichstatus System UC071/A01 +Next2: U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; + U(; + O "DOutbound_Bereich".A01_UC071.BereichErr; + O "DOutbound_Bereich".A01_UZ7102.Area_Stop; + ); + UN "SGes".Simulation_ohne_HW_aktiv; + SPB Next3 ;//Zylinder-Stellung nicht mehr ändern ---- NW 7: Schleuse_4214 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4214", ZylGst:=?) +NETWORK +TITLE = Schleuse_3143 + CALL #Schleuse_3143 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3143" + ); +NETWORK +TITLE = Schleuse_3141 + CALL #Schleuse_3141 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3141" + ); ---- NW 8: Übergabe des Bereichstatus System UC071/A01 --- -Next2: A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto +NETWORK +TITLE = Weiche_3137 + CALL #Weiche_3137 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3137" + ); - A( - O "DOutbound_Bereich".A01_UC071.BereichErr - O "DOutbound_Bereich".A01_UZ7102.Area_Stop - ) - AN "SGes".Simulation_ohne_HW_aktiv - JC Next3 // Zylinder-Stellung nicht mehr ändern +NETWORK +TITLE = Weiche_3140 + CALL #Weiche_3140 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3140" + ); +NETWORK +TITLE = Schleuse_3131 + CALL #Schleuse_3131 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3131" + ); ---- NW 9: Schleuse_3143 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3143", ZylGst:=?) +NETWORK +TITLE = Schleuse_3134 + CALL #Schleuse_3134 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3134" + ); +NETWORK +TITLE = Schleuse_3136 + CALL #Schleuse_3136 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3136" + ); ---- NW 10: Schleuse_3141 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3141", ZylGst:=?) +NETWORK +TITLE = Schleuse_4217 + CALL #Schleuse_4217 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4217" + ); +NETWORK +TITLE = Ende +Next3: BE; ---- NW 11: Weiche_3137 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3137", ZylGst:=?) - - ---- NW 12: Weiche_3140 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3140", ZylGst:=?) - - ---- NW 13: Schleuse_3131 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3131", ZylGst:=?) - - ---- NW 14: Schleuse_3134 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3134", ZylGst:=?) - - ---- NW 15: Schleuse_3136 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3136", ZylGst:=?) - - ---- NW 16: Schleuse_4217 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4217", ZylGst:=?) - - ---- NW 17: Ende --- -Next3: BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/HWtoOB_Bereich.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/HWtoOB_Bereich.awl index f23678e..e956dcc 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/HWtoOB_Bereich.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/HWtoOB_Bereich.awl @@ -1,23 +1,22 @@ -=== FC 100: HWtoOB_Bereich [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Constant: - Return: - Ret_Val : Void +FUNCTION "HWtoOB_Bereich" : Void +TITLE = Bereich Outbound: HW > VP +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 ---- NW 1: Baustein-Aufrufe --- -CALL FB "HWtoVP_Sensoren" , +BEGIN +NETWORK +TITLE = Baustein-Aufrufe + CALL "HWtoVP_Sensoren", "DHWtoVP_Sensoren"; -CALL FB "HWtoVP_OmniFahren" , + CALL "HWtoVP_OmniFahren", "DHWtoVP_OmniFahren"; -CALL FB "HWtoVP_Zylinder" , + CALL "HWtoVP_Zylinder", "DHWtoVP_Zylinder"; -CALL FB "HWtoVP_Antriebe" , + CALL "HWtoVP_Antriebe", "DHWtoVP_Antriebe"; +NETWORK +TITLE = Ende + BE; ---- NW 2: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Omnifahren_HWtoVP/HWtoVP_Draussen.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Omnifahren_HWtoVP/HWtoVP_Draussen.awl index a55e173..108d143 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Omnifahren_HWtoVP/HWtoVP_Draussen.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Omnifahren_HWtoVP/HWtoVP_Draussen.awl @@ -1,84 +1,104 @@ -=== FC 182: HWtoVP_Draussen [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Error.Bit : Bool - Constant: - Return: - Ret_Val : Void - ---- NW 1: Rückmeldung --- - SET // Rückmeldungen erst mal resetten - R "M180.6" // Weiterfahrt von Ziel-FC erlaubt +FUNCTION "HWtoVP_Draussen" : Void +TITLE = Draussen-FC: HW > VP +{ S7_Optimized_Access := 'FALSE' ; S7_Pass_Registers := 'TRUE' } +AUTHOR : AE +VERSION : 0.1 + VAR_TEMP + "Error.Bit" : Bool; + END_VAR ---- NW 2: Schleuse 4207 (Vor ByPass vom LP): Ausgefahren ? --- - L "MW190" - L 4207 // Aufruf von Schleuse 4207? - <>I // Nein! - JC X4207E +BEGIN +NETWORK +TITLE = Rückmeldung + SET;//Rückmeldungen erst mal resetten + R "M180.6";//Weiterfahrt von Ziel-FC erlaubt - L "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.Weichen_Ziel - L 16#4224 // Gerade ? Also zum AMR-Bereich? - ==I // Ja ! - BEC +NETWORK +TITLE = Schleuse 4207 (Vor ByPass vom LP): Ausgefahren ? + L "MW190"; + L 4207 ;//Aufruf von Schleuse 4207? + <>I;//Nein! + SPB X4207E; -// Partner-Trolley will zu VP fahren: -// Bei Partner (Schleuse 4221) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf) - L 0 - T "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.Sk.Akt_Schritt + L "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.Weichen_Ziel; + L 16#4224 ;//Gerade ? Also zum AMR-Bereich? + ==I ;//Ja ! + BEB; -X4207E: NOP 0 +//Partner-Trolley will zu VP fahren: +//Bei Partner (Schleuse 4221) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf) + L 0; + T "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.Sk.Akt_Schritt; +X4207E: NOP 0; ---- NW 3: Schleuse 3141: (Vor Einfahrt Kontrollplatz) --- - L "MW190" - L 3141 // Aufruf von Schleuse 3141 ? - <>I // Nein! - JC X3141E +NETWORK +TITLE = Schleuse 3141: (Vor Einfahrt Kontrollplatz) + L "MW190"; + L 3141 ;//Aufruf von Schleuse 3141 ? + <>I;//Nein! + SPB X3141E; -// Bei Partner (Schleuse 3136) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf) - L 0 - T "DHWtoVP_OmniFahren".Schleuse_3136.Dyn.Sk.Akt_Schritt +//Bei Partner (Schleuse 3136) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf) + L 0; + T "DHWtoVP_OmniFahren".Schleuse_3136.Dyn.Sk.Akt_Schritt; -// Leerer Trolley vom Leerpuffer? - L "MD182" // ShopGroup - L DINT#-1 // Leer-Trolley? - ==D // Ja ! - BEC // Kein Telegramm! +//Leerer Trolley vom Leerpuffer? + L "MD182" ;//ShopGroup + L DINT#-1 ;//Leer-Trolley? + ==D ;//Ja ! + BEB;//Kein Telegramm! -// GOHDUM an Host senden: - L "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.Weichen_Ziel - BTI - T "Daten_für_SendFIFO".Puffer_LinienNr +//GOHDUM an Host senden: + L "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.Weichen_Ziel; + BTI; + T "Daten_für_SendFIFO".Puffer_LinienNr; -CALL FB "Daten_in_SendFIFO_speichern" , (TelegrammKennung[1]:='G', TelegrammKennung[2]:='O', TelegrammKennung[3]:='H', TelegrammKennung[4]:='D', TelegrammKennung[5]:='U', TelegrammKennung[6]:='M', TelegrammKennung[7]:=?, TelegrammKennung[8]:=?, TelegrammKennung[9]:=?, TelegrammKennung[10]:=?, TrolleyID:="DHWtoVP_OmniFahren".Schleuse_3141.Dyn.TrolleyID_Schleuse, StationsNr:=3141, Puffer_LinienNr:=?, StoreGroup:=?, Status_1_Int:=?, Status_2_Bit[0]:=?, Status_2_Bit[1]:=?, Status_2_Bit[2]:=?, Status_2_Bit[3]:=?, Status_2_Bit[4]:=?, Status_2_Bit[5]:=?, Status_2_Bit[6]:=?, Status_2_Bit[7]:=?, Reserve[1]_Int:=?, Reserve[2]_Int:=?, Port:=2, Ret_Val_FIFO_IN:="MB199", Error:="Error.Bit") + CALL "Daten_in_SendFIFO_speichern", "Daten_für_SendFIFO" + ( "TelegrammKennung[1]" := 'G' , + "TelegrammKennung[2]" := 'O' , + "TelegrammKennung[3]" := 'H' , + "TelegrammKennung[4]" := 'D' , + "TelegrammKennung[5]" := 'U' , + "TelegrammKennung[6]" := 'M' , + TrolleyID := "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.TrolleyID_Schleuse , + StationsNr := 3141 , + Port := 2 , + Ret_Val_FIFO_IN := "MB199" , + Error := #"Error.Bit" + ); -// Endziel wieder nullen: -CALL FC "Trolleydaten_ändern" (Gesamt_Trolley_DL:=1000, TrolleyID:="DHWtoVP_OmniFahren".Schleuse_3141.Dyn.TrolleyID_Schleuse, Endziel:=W#16#0, ShopGroup:=0) +//Endziel wieder nullen: + CALL "Trolleydaten_ändern" + ( Gesamt_Trolley_DL := 1000 , + TrolleyID := "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.TrolleyID_Schleuse , + Endziel := 0 , + ShopGroup := 0 + ); - BEU + BEA; -X3141E: NOP 0 +X3141E: NOP 0; +NETWORK +TITLE = Schleuse 3136: (Vor Einfahrt Kontrollplatz) + L "MW190"; + L 3136 ;//Aufruf von Schleuse 3136 ? + <>I;//Nein! + SPB X3136E; ---- NW 4: Schleuse 3136: (Vor Einfahrt Kontrollplatz) --- - L "MW190" - L 3136 // Aufruf von Schleuse 3136 ? - <>I // Nein! - JC X3136E +//Bei Partner (Schleuse 3141) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf) + L 0; + T "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.Sk.Akt_Schritt; -// Bei Partner (Schleuse 3141) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf) - L 0 - T "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.Sk.Akt_Schritt + BEA; - BEU +X3136E: NOP 0; -X3136E: NOP 0 +NETWORK +TITLE = Ende + BE; - ---- NW 5: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Omnifahren_HWtoVP/HWtoVP_Leser_FC.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Omnifahren_HWtoVP/HWtoVP_Leser_FC.awl index 9f5c9da..2c2e022 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Omnifahren_HWtoVP/HWtoVP_Leser_FC.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Omnifahren_HWtoVP/HWtoVP_Leser_FC.awl @@ -1,101 +1,120 @@ -=== FC 180: HWtoVP_Leser_FC [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Zielebene : Word - Constant: - Return: - Ret_Val : Void - ---- NW 1: Rückmeldung --- -// Keine - L 0 // Evtl. Zwischenziel (MW196) - T "MW196" +FUNCTION "HWtoVP_Leser_FC" : Void +TITLE = Leser-FC: ZG +{ S7_Optimized_Access := 'FALSE' ; S7_Pass_Registers := 'TRUE' } +AUTHOR : AE +VERSION : 0.1 + VAR_TEMP + Zielebene : Word; + END_VAR ---- NW 2: Schleuse 3143: (Anfrage KontrollPlatz) --- - L "MW190" // Schleusen-Nr. - L 3143 // Aufruf von Schleuse ? - <>I // Nein! - JC X3143E +BEGIN +NETWORK +TITLE = Rückmeldung - AN "M180.0" // Lesefehler - JC Y3143 + //Keine + L 0;//Evtl. Zwischenziel (MW196) + T "MW196"; - BEU +NETWORK +TITLE = Schleuse 3143: (Anfrage KontrollPlatz) + L "MW190" ;//Schleusen-Nr. + L 3143 ;//Aufruf von Schleuse ? + <>I;//Nein! + SPB X3143E; -Y3143: AN "M180.1" // unbekannt in TrolleysDL - BEC + UN "M180.0";//Lesefehler + SPB Y3143; -// Daten in Datenbank erzeugen: - L "DHWtoVP_OmniFahren".Schleuse_3143.Dyn.TrolleyID_Schleuse - L DINT#0 // ID bekannt? - ==D // Nein - BEC + BEA; -CALL FC "Trolleydaten_neu_anlegen" (Gesamt_Trolley_DL:="DHWtoVP_OmniFahren".Schleuse_3143.Schleuse.Gesamt_Trolley_DL, TrolleyID:="DHWtoVP_OmniFahren".Schleuse_3143.Dyn.TrolleyID_Schleuse, Endziel:=16#B000, ShopGroup:=DINT#0) // Voll-Puffer-Bereich +Y3143: UN "M180.1" ;//unbekannt in TrolleysDL + BEB; - BEU +//Daten in Datenbank erzeugen: + L "DHWtoVP_OmniFahren".Schleuse_3143.Dyn.TrolleyID_Schleuse; + L DINT#0 ;//ID bekannt? + ==D;//Nein + BEB; -X3143E: NOP 0 + CALL "Trolleydaten_neu_anlegen" + ( Gesamt_Trolley_DL := "DHWtoVP_OmniFahren".Schleuse_3143.Schleuse.Gesamt_Trolley_DL , + TrolleyID := "DHWtoVP_OmniFahren".Schleuse_3143.Dyn.TrolleyID_Schleuse , + Endziel := 16#B000 , //Voll-Puffer-Bereich + ShopGroup := DINT#0 + ); + BEA; ---- NW 3: Schleuse 3141: (Vor Einfahrt KontrollPlatz) --- - L "MW190" // Schleusen-Nr. - L 3141 // Aufruf von Schleuse ? - <>I // Nein! - JC X3141E +X3143E: NOP 0; - AN "M180.0" // Lesefehler - JC Y3141 +NETWORK +TITLE = Schleuse 3141: (Vor Einfahrt KontrollPlatz) + L "MW190" ;//Schleusen-Nr. + L 3141 ;//Aufruf von Schleuse ? + <>I;//Nein! + SPB X3141E; - BEU + UN "M180.0";//Lesefehler + SPB Y3141; -Y3141: AN "M180.1" // unbekannt in TrolleysDL - BEC + BEA; -// Daten in Datenbank erzeugen: - L "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.TrolleyID_Schleuse - L DINT#0 // ID bekannt? - ==D // Nein - BEC +Y3141: UN "M180.1" ;//unbekannt in TrolleysDL + BEB; -CALL FC "Trolleydaten_neu_anlegen" (Gesamt_Trolley_DL:="DHWtoVP_OmniFahren".Schleuse_3141.Schleuse.Gesamt_Trolley_DL, TrolleyID:="DHWtoVP_OmniFahren".Schleuse_3141.Dyn.TrolleyID_Schleuse, Endziel:=16#B000, ShopGroup:=DINT#0) // Voll-Puffer-Bereich +//Daten in Datenbank erzeugen: + L "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.TrolleyID_Schleuse; + L DINT#0 ;//ID bekannt? + ==D;//Nein + BEB; - BEU + CALL "Trolleydaten_neu_anlegen" + ( Gesamt_Trolley_DL := "DHWtoVP_OmniFahren".Schleuse_3141.Schleuse.Gesamt_Trolley_DL , + TrolleyID := "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.TrolleyID_Schleuse , + Endziel := 16#B000 , //Voll-Puffer-Bereich + ShopGroup := DINT#0 + ); -X3141E: NOP 0 + BEA; +X3141E: NOP 0; ---- NW 4: Schleuse 3134: (KontrollPlatz) --- - L "MW190" // Schleusen-Nr. - L 3134 // Aufruf von Schleuse ? - <>I // Nein! - JC X3134E +NETWORK +TITLE = Schleuse 3134: (KontrollPlatz) + L "MW190" ;//Schleusen-Nr. + L 3134 ;//Aufruf von Schleuse ? + <>I;//Nein! + SPB X3134E; - AN "M180.0" // Lesefehler - JC Y3134 + UN "M180.0";//Lesefehler + SPB Y3134; - BEU + BEA; -Y3134: AN "M180.1" // unbekannt in TrolleysDL - BEC +Y3134: UN "M180.1" ;//unbekannt in TrolleysDL + BEB; -// Daten in Datenbank erzeugen: - L "DHWtoVP_OmniFahren".Schleuse_3134.Dyn.TrolleyID_Schleuse - L DINT#0 // ID bekannt? - ==D // Nein - BEC +//Daten in Datenbank erzeugen: + L "DHWtoVP_OmniFahren".Schleuse_3134.Dyn.TrolleyID_Schleuse; + L DINT#0 ;//ID bekannt? + ==D;//Nein + BEB; -CALL FC "Trolleydaten_neu_anlegen" (Gesamt_Trolley_DL:="DHWtoVP_OmniFahren".Schleuse_3134.Schleuse.Gesamt_Trolley_DL, TrolleyID:="DHWtoVP_OmniFahren".Schleuse_3134.Dyn.TrolleyID_Schleuse, Endziel:=16#B000, ShopGroup:=DINT#0) // Voll-Puffer-Bereich + CALL "Trolleydaten_neu_anlegen" + ( Gesamt_Trolley_DL := "DHWtoVP_OmniFahren".Schleuse_3134.Schleuse.Gesamt_Trolley_DL , + TrolleyID := "DHWtoVP_OmniFahren".Schleuse_3134.Dyn.TrolleyID_Schleuse , + Endziel := 16#B000 , //Voll-Puffer-Bereich + ShopGroup := DINT#0 + ); - BEU + BEA; -X3134E: NOP 0 +X3134E: NOP 0; +NETWORK +TITLE = Ende + BE; ---- NW 5: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Omnifahren_HWtoVP/HWtoVP_OmniFahren.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Omnifahren_HWtoVP/HWtoVP_OmniFahren.awl index 8b2dcb1..c8f2f5e 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Omnifahren_HWtoVP/HWtoVP_OmniFahren.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Omnifahren_HWtoVP/HWtoVP_OmniFahren.awl @@ -1,385 +1,695 @@ -=== FB 128: HWtoVP_OmniFahren [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Schleuse_3725 : "MHMOmniSchleuse" - Bereich_3731 : "MHMOmniBereich_Plus" - Schleuse_4200 : "MHMOmniSchleuse" - Bereich_4203 : "MHMOmniBereich_Plus" - Schleuse_4207 : "MHMOmniSchleuse_Plus" - Schleuse_4212 : "MHMOmniSchleuse" - Schleuse_4214 : "MHMOmniSchleuse" - Bereich_3145 : "MHMOmniBereich_Plus" - Schleuse_3143 : "MHMOmniSchleuse_Plus" - Schleuse_3141 : "MHMOmniSchleuse_Plus" - Weiche_3140 : "MHMOmniWeiche_Plus" - Schleuse_3131 : "MHMOmniSchleuse" - Schleuse_3134 : "MHMOmniSchleuse" - Schleuse_3136 : "MHMOmniSchleuse_Plus" - Schleuse_4217 : "MHMOmniSchleuse_Plus" - Übergang_4205 : "MHMÜbergang_ohne_Schleuse" - Test_RFID : Struct - Flanke : Bool - Stop_Wegen_Test : Bool - Temp: - ErrQuit : Bool - ErrAnz : Bool - Stau_raus : Bool - Start_ok : Bool - B_aktiv : Bool - B_vor_Schleuse : Bool - B_nach_Schleuse : Bool - Antrieb_aktiv : Bool - Antrieb_vor : Bool - Antrieb_stop : Bool - Fahren_Ok : Bool - Antrieb_nicht_stoppen : Bool - Constant: - ---- NW 1: Systemzeug --- -// HW > VP-Bereich: - A "DOutbound_Bereich".A01_UH07.AnlageEin - = Schleuse_3725.Dyn.Sk.Auto_akt - = Bereich_3731.Dyn.Sk.Auto_akt - = Schleuse_4200.Dyn.Sk.Auto_akt - = Bereich_4203.Dyn.Sk.Auto_akt - = Schleuse_4217.Dyn.Sk.Auto_akt - = Schleuse_4207.Dyn.Sk.Auto_akt - = Schleuse_4212.Dyn.Sk.Auto_akt - = Schleuse_4214.Dyn.Sk.Auto_akt - = Bereich_3145.Dyn.Sk.Auto_akt - = Schleuse_3143.Dyn.Sk.Auto_akt - = Schleuse_3141.Dyn.Sk.Auto_akt - = Weiche_3140.Dyn.Status.Auto_akt - = Schleuse_3131.Dyn.Sk.Auto_akt - = Schleuse_3134.Dyn.Sk.Auto_akt - = Schleuse_3136.Dyn.Sk.Auto_akt - - AN "DOutbound_Bereich".A01_UC072.BereichErr - = Schleuse_3725.Dyn.Sk.Bereich_ok - = Bereich_3731.Dyn.Sk.Bereich_ok - AN "DOutbound_Bereich".A01_UC073.BereichErr - = Schleuse_4200.Dyn.Sk.Bereich_ok - = Bereich_4203.Dyn.Sk.Bereich_ok - = Schleuse_4217.Dyn.Sk.Bereich_ok - = Schleuse_4207.Dyn.Sk.Bereich_ok - = Schleuse_4212.Dyn.Sk.Bereich_ok - = Schleuse_4214.Dyn.Sk.Bereich_ok - AN "DOutbound_Bereich".A01_UC071.BereichErr - = Bereich_3145.Dyn.Sk.Bereich_ok - = Schleuse_3143.Dyn.Sk.Bereich_ok - = Schleuse_3141.Dyn.Sk.Bereich_ok - = Weiche_3140.Dyn.Status.Bereich_ok - = Schleuse_3131.Dyn.Sk.Bereich_ok - = Schleuse_3134.Dyn.Sk.Bereich_ok - = Schleuse_3136.Dyn.Sk.Bereich_ok - - ---- NW 2: Störungen quittieren UZ7202 --- - A "DOutbound_Bereich".A01_UZ7202.StOk_aktiv - O "DOutbound_Bereich".A01_UC072.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 3: Schleuse 3725 (vor AFS) --- -// Schnittstelle von AMR: - A "DSchnittstelle_zu_AMR".From_UH06.MA0200_A_vor - S "DHWtoVP_Antriebe".MA0200.Stat.A_vor - - A "DSchnittstelle_zu_AMR".From_UH06.MA0200_A_start - S "DHWtoVP_Antriebe".MA0200.Stat.A_start - -// Schnittstelle zu AMR: - A Schleuse_3725.Dyn.Sk.Bereich_ok // Kein Sensor in UH06 verbaut! - A Schleuse_3725.Dyn.Sk.Auto_akt - AN "DHWtoVP_Sensoren".Stau_BG3724.Stat.B_Akt - = "DSchnittstelle_zu_AMR".To_UH06.MA0200_kein_Stau - - A "MA0200" - = "DSchnittstelle_zu_AMR".To_UH06.MA0200_aktiv - - A "BG3724" - = "DSchnittstelle_zu_AMR".To_UH06.BG3724_aktiv - -CALL FB "None" , (Schleusen_Nr:=3725, ErrQuit:=ErrQuit, B_VorSchleuse:="BG3724", B_InSchleuse:="BG3725", B_AusSchleuse:="BG3730", B_Stau_raus:="DHWtoVP_Sensoren".Stau_BG3730.Stat.B_Akt, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0200", Antrieb_plus_aktiv:="MA0201", Schleuse_geöffnet:="MB3725", RestZeit_Bereich_plus:=Bereich_3731.Dyn.Restzeit, Y_Schleuse_Auf:="DHWtoVP_Zylinder".Schleuse_3725.Stat.Ast, Error:=DB708.DBW536, Antrieb_Schleuse_vor:="DHWtoVP_Antriebe".MA0200.Stat.A_vor, Antrieb_Schleuse_start:="DHWtoVP_Antriebe".MA0200.Stat.A_start, Antrieb_Schleuse_stop:="DHWtoVP_Antriebe".MA0200.Stat.Stop_vor, Antrieb_Schleuse_PS:="DHWtoVP_Antriebe".MA0200.Stat.A_PS, Antrieb_plus_vor:=Bereich_3731.Dyn.Status.Trolley_kommt_in_Bereich, Antrieb_plus_start:=?, hStOk:=ErrAnz) - - ---- NW 4: Bereich 3731 (vor BST 2) --- - AN "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3 - AN "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4 - AN "7_HMI_Err_UH07_OB".System.BST2_Feueralarm - AN "7_HMI_Err_UH07_OB".System.BST2_Geschlossen - AN "7_HMI_Err_UH07_OB".System."BST2_Störung" - A Schleuse_4200.Dyn.Sk.Bereich_ok - = Fahren_Ok - - A "BG3730" - A "MB3725" - = B_vor_Schleuse - - A "DHWtoVP_Sensoren".Stau_BG4201.Stat.B_Akt - = Stau_raus - -CALL FB "None" , (Bereichs_Nr:=3731, ErrQuit:=ErrQuit, B_BereichsAnfang:=B_vor_Schleuse, B_BereichsEnde:="BG3731", B_Zähl:="BG4201", B_Stau_raus:=Stau_raus, Start_Ok:=Fahren_Ok, Antrieb_Bereich_aktiv:="MA0201", Antrieb_plus_aktiv:="MA0260", RestZeit_Bereich_plus:=?, Antrieb_Bereich_vor:="DHWtoVP_Antriebe".MA0201.Stat.A_vor, Antrieb_Bereich_stop:="DHWtoVP_Antriebe".MA0201.Stat.Stop_vor, Error:=DB708.DBW458, Antrieb_Bereich_start:="DHWtoVP_Antriebe".MA0201.Stat.A_start, Antrieb_plus_vor:="DHWtoVP_Antriebe".MA0260.Stat.A_vor, Antrieb_plus_start:="DHWtoVP_Antriebe".MA0260.Stat.A_start, Antrieb_minus_vor:="DHWtoVP_Antriebe".MA0200.Stat.A_vor, hStOk:=ErrAnz) - - ---- NW 5: Störungen anzeigen UZ7202 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7202.StOk_blinken - S "DOutbound_Bereich".A01_UC072.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 6: Störungen quittieren UZ7202/7302 --- - A "DOutbound_Bereich".A01_UZ7202.StOk_aktiv - O "DOutbound_Bereich".A01_UZ7302.StOk_aktiv - O "DOutbound_Bereich".A01_UC073.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 7: Schleuse 4200 (hinter BST 2) --- -CALL FB "None" , (Schleusen_Nr:=4200, ErrQuit:=ErrQuit, B_VorSchleuse:=?, B_InSchleuse:="BG4200", B_AusSchleuse:="BG4202", B_Stau_raus:="DHWtoVP_Sensoren".Stau_BG4202.Stat.B_Akt, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0260", Antrieb_plus_aktiv:="MA0261", Schleuse_geöffnet:="MB4200", RestZeit_Bereich_plus:=Bereich_4203.Dyn.Restzeit, Y_Schleuse_Auf:="DHWtoVP_Zylinder".Schleuse_4200.Stat.Ast, Error:=DB708.DBW538, Antrieb_Schleuse_vor:="DHWtoVP_Antriebe".MA0260.Stat.A_vor, Antrieb_Schleuse_start:="DHWtoVP_Antriebe".MA0260.Stat.A_start, Antrieb_Schleuse_stop:="DHWtoVP_Antriebe".MA0260.Stat.Stop_vor, Antrieb_Schleuse_PS:="DHWtoVP_Antriebe".MA0260.Stat.A_PS, Antrieb_plus_vor:=Bereich_4203.Dyn.Status.Trolley_kommt_in_Bereich, Antrieb_plus_start:=?, hStOk:=ErrAnz) - - ---- NW 8: Bereich 4203 --- - A "BG4202" - A "MB4200" - = B_vor_Schleuse - - A "DHWtoVP_Sensoren".Stau_BG4204.Stat.B_Akt - O "DHWtoVP_Sensoren".Stau_BG4206.Stat.B_Akt - = Stau_raus - -CALL FB "None" , (Bereichs_Nr:=4203, ErrQuit:=ErrQuit, B_BereichsAnfang:=B_vor_Schleuse, B_BereichsEnde:="BG4203", B_Zähl:="BG4204", B_Stau_raus:=Stau_raus, Start_Ok:=1, Antrieb_Bereich_aktiv:="MA0261", Antrieb_plus_aktiv:="MA0262", RestZeit_Bereich_plus:=?, Antrieb_Bereich_vor:="DHWtoVP_Antriebe".MA0261.Stat.A_vor, Antrieb_Bereich_stop:="DHWtoVP_Antriebe".MA0261.Stat.Stop_vor, Error:=DB708.DBW464, Antrieb_Bereich_start:="DHWtoVP_Antriebe".MA0261.Stat.A_start, Antrieb_plus_vor:="DHWtoVP_Antriebe".MA0262.Stat.A_vor, Antrieb_plus_start:="DHWtoVP_Antriebe".MA0262.Stat.A_start, Antrieb_minus_vor:="DHWtoVP_Antriebe".MA0260.Stat.A_vor, hStOk:=ErrAnz) - - ---- NW 9: Störungen anzeigen UZ7202/7302 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7202.StOk_blinken - S "DOutbound_Bereich".A01_UZ7302.StOk_blinken - S "DOutbound_Bereich".A01_UC073.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 10: Störungen quittieren UZ7302/7303 --- - A "DOutbound_Bereich".A01_UZ7302.StOk_aktiv - O "DOutbound_Bereich".A01_UZ7303.StOk_aktiv - O "DOutbound_Bereich".A01_UC073.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 11: MA0262 / Übergang 4205 --- -CALL FB "None" , (ErrQuit:=ErrQuit, B_Anfang:="BG4204", B_Am_Übergang:="BG4205", B_Stau_Antrieb_plus:="BG4206", Antrieb_aktiv:="MA0262", Antrieb_plus_aktiv:="MA0263", Antrieb_vor:="DHWtoVP_Antriebe".MA0262.Stat.A_vor, Antrieb_start:="DHWtoVP_Antriebe".MA0262.Stat.A_start, Antrieb_stop:="DHWtoVP_Antriebe".MA0262.Stat.A_PS, Antrieb_plus_vor:="DHWtoVP_Antriebe".MA0263.Stat.A_vor, Antrieb_plus_start:="DHWtoVP_Antriebe".MA0263.Stat.A_start) - - ---- NW 12: Schleuse 4217 (Vor RFID-Gate) --- - A( - O "DI0246" // Rückmeldung von RFID-Gate - O "DI0247" - ) -// / UN #Test_RFID.Stop_Wegen_Test - = Start_ok - -// Meldungen für RFID-Gate: - A "BG4217" - AN "MB4217" - AN Start_ok - = "7_HMI_Err_UH07_OB".RFID_Gate.Gate_nicht_bereit - - A "DI0247" - = "7_HMI_Err_UH07_OB".RFID_Gate.Gate_ByPAss - -CALL FB "None" , (Schleusen_Nr:=4217, ErrQuit:=ErrQuit, B_VorSchleuse:="BG4206", B_InSchleuse:="BG4217", B_Zähl:="BG4216", B_Stau_raus:="DHWtoVP_Sensoren".Stau_BG4216.Stat.B_Akt, Start_Ok:=Start_ok, Antrieb_Schleuse_aktiv:="MA0263", Antrieb_plus_aktiv:="MA0263", Schleuse_geöffnet:="MB4217", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DHWtoVP_Zylinder".Schleuse_4217.Stat.Ast, Error:=DB708.DBW580, Antrieb_Schleuse_vor:="DHWtoVP_Antriebe".MA0263.Stat.A_vor, Antrieb_Schleuse_start:="DHWtoVP_Antriebe".MA0263.Stat.A_start, Antrieb_Schleuse_stop:="DHWtoVP_Antriebe".MA0263.Stat.Stop_vor, Antrieb_Schleuse_PS:="DHWtoVP_Antriebe".MA0263.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) // da schon oben verwendet | da schon oben verwendet - - A Schleuse_4217.Dyn.Sk.Bereich_ok - = "DQ0246" - A "MB4217" - = "DQ0247" - - ---- NW 13: Schleuse 4207 (Plus) --- - A "DHWtoVP_Sensoren".Stau_BG4210.Stat.B_Akt - O "DHWtoVP_Sensoren".Stau_BG4211.Stat.B_Akt - = Stau_raus - - AN "MB4223" // Weiche Einfahrt ByPass - AN "MB4210" - = Start_ok - -CALL FB "None" , (Schleusen_Nr:=4207, ErrQuit:=ErrQuit, B_VorSchleuse:="BG4216", B_InSchleuse:="BG4207", B_Zähl:="BG4211", B_Stau_raus:=Stau_raus, Start_Ok:=Start_ok, Antrieb_Schleuse_aktiv:="MA0263", Antrieb_plus_aktiv:="MA0264", Schleuse_geöffnet:="MB4207", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DHWtoVP_Zylinder".Schleuse_4207.Stat.Ast, Error:=DB708.DBW540, Antrieb_Schleuse_vor:="DHWtoVP_Antriebe".MA0263.Stat.A_vor, Antrieb_Schleuse_start:="DHWtoVP_Antriebe".MA0263.Stat.A_start, Antrieb_Schleuse_stop:="DHWtoVP_Antriebe".MA0263.Stat.Stop_vor, Antrieb_Schleuse_PS:="DHWtoVP_Antriebe".MA0263.Stat.A_PS, Antrieb_plus_vor:="DLPtoHW_Antriebe".MA0264.Stat.A_vor, Antrieb_plus_start:="DLPtoHW_Antriebe".MA0264.Stat.A_start, hStOk:=ErrAnz) - - A "MA0263" - A( - L Schleuse_4207.Dyn.Raus_Trolleys - L 0 - >I - O "BG4211" - ) - S "DLPtoHW_Antriebe".MA0264.Stat.A_vor - - ---- NW 14: Störungen anzeigen UZ7302/7303 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7302.StOk_blinken - S "DOutbound_Bereich".A01_UZ7303.StOk_blinken - S "DOutbound_Bereich".A01_UC073.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 15: Störungen quittieren UZ7303 --- - A "DOutbound_Bereich".A01_UZ7303.StOk_aktiv - O "DOutbound_Bereich".A01_UC073.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 16: Schleuse 4212 --- -CALL FB "None" , (Schleusen_Nr:=4212, ErrQuit:=ErrQuit, B_VorSchleuse:="BG4211", B_InSchleuse:="BG4212", B_AusSchleuse:="BG4213", B_Stau_raus:="DHWtoVP_Sensoren".Stau_BG4213.Stat.B_Akt, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0263", Antrieb_plus_aktiv:="MA0263", Schleuse_geöffnet:="MB4212", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DHWtoVP_Zylinder".Schleuse_4212.Stat.Ast, Error:=DB708.DBW542, Antrieb_Schleuse_vor:="DHWtoVP_Antriebe".MA0263.Stat.A_vor, Antrieb_Schleuse_start:="DHWtoVP_Antriebe".MA0263.Stat.A_start, Antrieb_Schleuse_stop:="DHWtoVP_Antriebe".MA0263.Stat.Stop_vor, Antrieb_Schleuse_PS:="DHWtoVP_Antriebe".MA0263.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) // da schon oben verwendet | da schon oben verwendet - - ---- NW 17: Schleuse 4214 --- -CALL FB "None" , (Schleusen_Nr:=4214, ErrQuit:=ErrQuit, B_VorSchleuse:="BG4213", B_InSchleuse:="BG4214", B_AusSchleuse:="BG4215", B_Stau_raus:="DHWtoVP_Sensoren".Stau_BG4215.Stat.B_Akt, Start_Ok:=Bereich_3145.Dyn.Sk.Bereich_ok, Antrieb_Schleuse_aktiv:="MA0263", Antrieb_plus_aktiv:="MA0140", Schleuse_geöffnet:="MB4214", RestZeit_Bereich_plus:=Bereich_3145.Dyn.Restzeit, Y_Schleuse_Auf:="DHWtoVP_Zylinder".Schleuse_4214.Stat.Ast, Error:=DB708.DBW544, Antrieb_Schleuse_vor:="DHWtoVP_Antriebe".MA0263.Stat.A_vor, Antrieb_Schleuse_start:="DHWtoVP_Antriebe".MA0263.Stat.A_start, Antrieb_Schleuse_stop:="DHWtoVP_Antriebe".MA0263.Stat.Stop_vor, Antrieb_Schleuse_PS:="DHWtoVP_Antriebe".MA0263.Stat.A_PS, Antrieb_plus_vor:=Bereich_3145.Dyn.Status.Trolley_kommt_in_Bereich, Antrieb_plus_start:=?, hStOk:=ErrAnz) - - ---- NW 18: Störungen anzeigen UZ7303 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7303.StOk_blinken - S "DOutbound_Bereich".A01_UC073.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 19: Störungen quittieren UZ7303/7101 --- - A "DOutbound_Bereich".A01_UZ7303.StOk_aktiv - O "DOutbound_Bereich".A01_UZ7101.StOk_aktiv - O "DOutbound_Bereich".A01_UC073.StOk_aktiv - O "DOutbound_Bereich".A01_UC071.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 20: Bereich 3145 --- - A "BG4215" - A "MB4214" - = B_vor_Schleuse - -CALL FB "None" , (Bereichs_Nr:=3145, ErrQuit:=ErrQuit, B_BereichsAnfang:=B_vor_Schleuse, B_BereichsEnde:="BG3145", B_Zähl:="BG3144", B_Stau_raus:="DHWtoVP_Sensoren".Stau_BG3144.Stat.B_Akt, Start_Ok:=1, Antrieb_Bereich_aktiv:="MA0140", Antrieb_plus_aktiv:="MA0141", RestZeit_Bereich_plus:=?, Antrieb_Bereich_vor:="DHWtoVP_Antriebe".MA0140.Stat.A_vor, Antrieb_Bereich_stop:="DHWtoVP_Antriebe".MA0140.Stat.Stop_vor, Error:=DB708.DBW450, Antrieb_Bereich_start:="DHWtoVP_Antriebe".MA0140.Stat.A_start, Antrieb_plus_vor:="DHWtoVP_Antriebe".MA0141.Stat.A_vor, Antrieb_plus_start:="DHWtoVP_Antriebe".MA0141.Stat.A_start, Antrieb_minus_vor:="DHWtoVP_Antriebe".MA0263.Stat.A_vor, hStOk:=ErrAnz) - - ---- NW 21: Störungen anzeigen UZ7303/7101 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7303.StOk_blinken - S "DOutbound_Bereich".A01_UZ7101.StOk_blinken - S "DOutbound_Bereich".A01_UC073.StOk_blinken - S "DOutbound_Bereich".A01_UC071.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 22: Störungen quittieren UZ7101/7102 --- - A "DOutbound_Bereich".A01_UZ7101.StOk_aktiv - O "DOutbound_Bereich".A01_UZ7102.StOk_aktiv - O "DOutbound_Bereich".A01_UC071.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 23: Schleuse 3143 --- -CALL FB "None" , (Schleusen_Nr:=3143, ErrQuit:=ErrQuit, B_VorSchleuse:="BG3144", B_InSchleuse:="BG3143", B_Zähl:="BG3142", B_Stau_raus:="DHWtoVP_Sensoren".Stau_BG3142.Stat.B_Akt, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0141", Antrieb_plus_aktiv:="MA0141", Schleuse_geöffnet:="MB3143", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DHWtoVP_Zylinder".Schleuse_3143.Stat.Ast, Error:=DB708.DBW514, Antrieb_Schleuse_vor:="DHWtoVP_Antriebe".MA0141.Stat.A_vor, Antrieb_Schleuse_start:="DHWtoVP_Antriebe".MA0141.Stat.A_start, Antrieb_Schleuse_stop:="DHWtoVP_Antriebe".MA0141.Stat.Stop_vor, Antrieb_Schleuse_PS:="DHWtoVP_Antriebe".MA0141.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) - - ---- NW 24: Schleuse 3141 (vor Weiche zum KontrollPlatz) --- - AN "MB3136" // Andere Quelle aktiv - = Start_ok - -CALL FB "None" , (Schleusen_Nr:=3141, ErrQuit:=ErrQuit, B_VorSchleuse:="BG3142", B_InSchleuse:="BG3141", B_Zähl:=?, B_Stau_raus:=?, Start_Ok:=Start_ok, Antrieb_Schleuse_aktiv:="MA0141", Antrieb_plus_aktiv:="MA0141", Schleuse_geöffnet:="MB3141", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DHWtoVP_Zylinder".Schleuse_3141.Stat.Ast, Error:=DB708.DBW512, Antrieb_Schleuse_vor:="DHWtoVP_Antriebe".MA0141.Stat.A_vor, Antrieb_Schleuse_start:="DHWtoVP_Antriebe".MA0141.Stat.A_start, Antrieb_Schleuse_stop:="DHWtoVP_Antriebe".MA0141.Stat.Stop_vor, Antrieb_Schleuse_PS:="DHWtoVP_Antriebe".MA0141.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) // über Weiche | über Ziel-FC | über Weiche | über Weiche - - A "MB3141" - R "DHWtoVP_Zylinder".Weiche_3137.Stat.Ast // Einfahrt-Weiche von Kontrollplatz - - ---- NW 25: Weiche 3140 (zum Kontrollplatz) --- - SET - R Antrieb_vor - R Antrieb_stop - - A "MA0141" - A "MA0143" - = Antrieb_aktiv - -CALL FB "None" , (Weichen_Nr:=3140, ErrQuit:=ErrQuit, Fahren_Ok:=1, B_Ziel_gerade:="BG3127", B_Ziel_abzweig:="BG3130", Antrieb_Weiche_aktiv:=Antrieb_aktiv, Antrieb_Gerade_aktiv:="MA0144", Antrieb_Abzweig_aktiv:="MA0142", Weiche_ist_AST:="MB3140", Y_Weiche_gerade:=?, Y_Weiche_abzweig:="DHWtoVP_Zylinder".Weiche_3140.Stat.Ast, Error:=DB708.DBW510, Antrieb_Weiche_vor:=Antrieb_vor, Antrieb_Weiche_stop:=Antrieb_stop, Antrieb_Weiche_gerade_vor:="DHWtoVP_Antriebe".MA0144.Stat.A_vor, Antrieb_Weiche_gerade_stop:="DHWtoVP_Antriebe".MA0144.Stat.Stop_vor, Antrieb_Weiche_abzweig_vor:="DHWtoVP_Antriebe".MA0142.Stat.A_vor, Antrieb_Weiche_abzweig_stop:="DHWtoVP_Antriebe".MA0142.Stat.Stop_vor, hStOk:=ErrAnz) - - A Antrieb_vor - S "DHWtoVP_Antriebe".MA0141.Stat.A_vor - S "DHWtoVP_Antriebe".MA0143.Stat.A_vor - A Antrieb_stop - S "DHWtoVP_Antriebe".MA0141.Stat.Stop_vor - S "DHWtoVP_Antriebe".MA0142.Stat.Stop_vor - - CLR // / - S "DHWtoVP_Antriebe".MA0141.Stat.Stop_vor - S "DHWtoVP_Antriebe".MA0142.Stat.Stop_vor - S "DHWtoVP_Antriebe".MA0144.Stat.Stop_vor - - ---- NW 26: Schleuse 3131(vor Kontrollplatz) --- - A "DHWtoVP_Sensoren".Stau_BG3132.Stat.B_Akt - O "DHWtoVP_Sensoren".Stau_BG3133.Stat.B_Akt - = Stau_raus - -CALL FB "None" , (Schleusen_Nr:=3131, ErrQuit:=ErrQuit, B_VorSchleuse:="BG3130", B_InSchleuse:="BG3131", B_AusSchleuse:="BG3132", B_Stau_raus:=Stau_raus, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0142", Antrieb_plus_aktiv:="MA0142", Schleuse_geöffnet:="MB3131", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DHWtoVP_Zylinder".Schleuse_3131.Stat.Ast, Error:=DB708.DBW504, Antrieb_Schleuse_vor:="DHWtoVP_Antriebe".MA0142.Stat.A_vor, Antrieb_Schleuse_start:="DHWtoVP_Antriebe".MA0142.Stat.A_start, Antrieb_Schleuse_stop:="DHWtoVP_Antriebe".MA0142.Stat.Stop_vor, Antrieb_Schleuse_PS:="DHWtoVP_Antriebe".MA0142.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) - - ---- NW 27: Schleuse 3134 (Kontrollplatz) --- - A "BG3133" - AN "BG3134" - O "BG3132" - = B_vor_Schleuse - -// Untere Anzeigen werden im Ziel-FC gesetzt: - L Schleuse_3134.Dyn.Sk.Akt_Schritt - L 12 - <>I - R "PF0136" // Trolley starten ok - -CALL FB "None" , (Schleusen_Nr:=3134, ErrQuit:=ErrQuit, B_VorSchleuse:=B_vor_Schleuse, B_InSchleuse:="BG3134", B_AusSchleuse:="BG3135", B_Stau_raus:="DHWtoVP_Sensoren".Stau_BG3135.Stat.B_Akt, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0142", Antrieb_plus_aktiv:="MA0143", Schleuse_geöffnet:="MB3134", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DHWtoVP_Zylinder".Schleuse_3134.Stat.Ast, Error:=DB708.DBW506, Antrieb_Schleuse_vor:="DHWtoVP_Antriebe".MA0142.Stat.A_vor, Antrieb_Schleuse_start:="DHWtoVP_Antriebe".MA0142.Stat.A_start, Antrieb_Schleuse_stop:="DHWtoVP_Antriebe".MA0142.Stat.Stop_vor, Antrieb_Schleuse_PS:="DHWtoVP_Antriebe".MA0142.Stat.A_PS, Antrieb_plus_vor:="DHWtoVP_Antriebe".MA0143.Stat.A_vor, Antrieb_plus_start:="DHWtoVP_Antriebe".MA0143.Stat.A_start, hStOk:=ErrAnz) - - ---- NW 28: Schleuse 3136 (vor Weiche aus KontrollPlatz) --- -// Förderer nach Kontrollplatz einschalten: - A "BG3135" - A( - ON Schleuse_3136.Dyn.Error.Err_Stau_Einfahrt - ON "BG3136" - ) - S "DHWtoVP_Antriebe".MA0143.Stat.A_vor - - AN "MB3141" // Andere Quelle aktiv - = Start_ok - -CALL FB "None" , (Schleusen_Nr:=3136, ErrQuit:=ErrQuit, B_VorSchleuse:="BG3135", B_InSchleuse:="BG3136", B_Zähl:=?, B_Stau_raus:=?, Start_Ok:=Start_ok, Antrieb_Schleuse_aktiv:="MA0143", Antrieb_plus_aktiv:="MA0141", Schleuse_geöffnet:="MB3136", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DHWtoVP_Zylinder".Schleuse_3136.Stat.Ast, Error:=DB708.DBW508, Antrieb_Schleuse_vor:="DHWtoVP_Antriebe".MA0143.Stat.A_vor, Antrieb_Schleuse_start:="DHWtoVP_Antriebe".MA0143.Stat.A_start, Antrieb_Schleuse_stop:="DHWtoVP_Antriebe".MA0143.Stat.Stop_vor, Antrieb_Schleuse_PS:="DHWtoVP_Antriebe".MA0143.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) // über Weiche | über Ziel-FC | über Weiche | über Weiche - - A "MB3136" - S "DHWtoVP_Zylinder".Weiche_3137.Stat.Ast // Einfahrt-Weiche von Kontrollplatz - - ---- NW 29: Störungen anzeigen UZ7101/7102 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7101.StOk_blinken - S "DOutbound_Bereich".A01_UZ7102.StOk_blinken - S "DOutbound_Bereich".A01_UC071.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 30: Ende --- - BE +FUNCTION_BLOCK "HWtoVP_OmniFahren" +TITLE = Omnifahren Outbound Highway > Vollpuffer +{ S7_Optimized_Access := 'FALSE' } +VERSION : 0.1 + VAR + Schleuse_3725 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Bereich_3731 : "MHMOmniBereich_Plus"; + Schleuse_4200 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Bereich_4203 : "MHMOmniBereich_Plus"; + Schleuse_4207 { S7_SetPoint := 'False'} : "MHMOmniSchleuse_Plus"; + Schleuse_4212 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Schleuse_4214 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Bereich_3145 : "MHMOmniBereich_Plus"; + Schleuse_3143 { S7_SetPoint := 'False'} : "MHMOmniSchleuse_Plus"; + Schleuse_3141 { S7_SetPoint := 'False'} : "MHMOmniSchleuse_Plus"; + Weiche_3140 : "MHMOmniWeiche_Plus"; + Schleuse_3131 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Schleuse_3134 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Schleuse_3136 { S7_SetPoint := 'False'} : "MHMOmniSchleuse_Plus"; + Schleuse_4217 { S7_SetPoint := 'False'} : "MHMOmniSchleuse_Plus"; + Übergang_4205 { S7_SetPoint := 'False'} : "MHMÜbergang_ohne_Schleuse"; + Test_RFID : Struct + Flanke : Bool; + Stop_Wegen_Test : Bool; + END_STRUCT; + END_VAR + + VAR_TEMP + ErrQuit : Bool; + ErrAnz : Bool; + Stau_raus : Bool; + Start_ok : Bool; + B_aktiv : Bool; + B_vor_Schleuse : Bool; + B_nach_Schleuse : Bool; + Antrieb_aktiv : Bool; + Antrieb_vor : Bool; + Antrieb_stop : Bool; + Fahren_Ok : Bool; + Antrieb_nicht_stoppen : Bool; + END_VAR + + +BEGIN +NETWORK +TITLE = Systemzeug + +//HW > VP-Bereich: + U "DOutbound_Bereich".A01_UH07.AnlageEin; + = #Schleuse_3725.Dyn.Sk.Auto_akt; + = #Bereich_3731.Dyn.Sk.Auto_akt; + = #Schleuse_4200.Dyn.Sk.Auto_akt; + = #Bereich_4203.Dyn.Sk.Auto_akt; + = #Schleuse_4217.Dyn.Sk.Auto_akt; + = #Schleuse_4207.Dyn.Sk.Auto_akt; + = #Schleuse_4212.Dyn.Sk.Auto_akt; + = #Schleuse_4214.Dyn.Sk.Auto_akt; + = #Bereich_3145.Dyn.Sk.Auto_akt; + = #Schleuse_3143.Dyn.Sk.Auto_akt; + = #Schleuse_3141.Dyn.Sk.Auto_akt; + = #Weiche_3140.Dyn.Status.Auto_akt; + = #Schleuse_3131.Dyn.Sk.Auto_akt; + = #Schleuse_3134.Dyn.Sk.Auto_akt; + = #Schleuse_3136.Dyn.Sk.Auto_akt; + + UN "DOutbound_Bereich".A01_UC072.BereichErr; + = #Schleuse_3725.Dyn.Sk.Bereich_ok; + = #Bereich_3731.Dyn.Sk.Bereich_ok; + UN "DOutbound_Bereich".A01_UC073.BereichErr; + = #Schleuse_4200.Dyn.Sk.Bereich_ok; + = #Bereich_4203.Dyn.Sk.Bereich_ok; + = #Schleuse_4217.Dyn.Sk.Bereich_ok; + = #Schleuse_4207.Dyn.Sk.Bereich_ok; + = #Schleuse_4212.Dyn.Sk.Bereich_ok; + = #Schleuse_4214.Dyn.Sk.Bereich_ok; + UN "DOutbound_Bereich".A01_UC071.BereichErr; + = #Bereich_3145.Dyn.Sk.Bereich_ok; + = #Schleuse_3143.Dyn.Sk.Bereich_ok; + = #Schleuse_3141.Dyn.Sk.Bereich_ok; + = #Weiche_3140.Dyn.Status.Bereich_ok; + = #Schleuse_3131.Dyn.Sk.Bereich_ok; + = #Schleuse_3134.Dyn.Sk.Bereich_ok; + = #Schleuse_3136.Dyn.Sk.Bereich_ok; + +NETWORK +TITLE = Störungen quittieren UZ7202 + U "DOutbound_Bereich".A01_UZ7202.StOk_aktiv; + O "DOutbound_Bereich".A01_UC072.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Schleuse 3725 (vor AFS) + +//Schnittstelle von AMR: + U "DSchnittstelle_zu_AMR".From_UH06.MA0200_A_vor; + S "DHWtoVP_Antriebe".MA0200.Stat.A_vor; + + U "DSchnittstelle_zu_AMR".From_UH06.MA0200_A_start; + S "DHWtoVP_Antriebe".MA0200.Stat.A_start; + +//Schnittstelle zu AMR: + U #Schleuse_3725.Dyn.Sk.Bereich_ok;//Kein Sensor in UH06 verbaut! + U #Schleuse_3725.Dyn.Sk.Auto_akt; + UN "DHWtoVP_Sensoren".Stau_BG3724.Stat.B_Akt; + = "DSchnittstelle_zu_AMR".To_UH06.MA0200_kein_Stau; + + U "MA0200"; + = "DSchnittstelle_zu_AMR".To_UH06.MA0200_aktiv; + + U "BG3724"; + = "DSchnittstelle_zu_AMR".To_UH06.BG3724_aktiv; + + CALL #Schleuse_3725 + ( Schleusen_Nr := 3725 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG3724" , + B_InSchleuse := "BG3725" , + B_AusSchleuse := "BG3730" , + B_Stau_raus := "DHWtoVP_Sensoren".Stau_BG3730.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0200" , + Antrieb_plus_aktiv := "MA0201" , + Schleuse_geöffnet := "MB3725" , + RestZeit_Bereich_plus := #Bereich_3731.Dyn.Restzeit , + Y_Schleuse_Auf := "DHWtoVP_Zylinder".Schleuse_3725.Stat.Ast , + Error := %DB708.DBW536 , + Antrieb_Schleuse_vor := "DHWtoVP_Antriebe".MA0200.Stat.A_vor , + Antrieb_Schleuse_start := "DHWtoVP_Antriebe".MA0200.Stat.A_start , + Antrieb_Schleuse_stop := "DHWtoVP_Antriebe".MA0200.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DHWtoVP_Antriebe".MA0200.Stat.A_PS , + Antrieb_plus_vor := #Bereich_3731.Dyn.Status.Trolley_kommt_in_Bereich , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Bereich 3731 (vor BST 2) + UN "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3; + UN "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4; + UN "7_HMI_Err_UH07_OB".System.BST2_Feueralarm; + UN "7_HMI_Err_UH07_OB".System.BST2_Geschlossen; + UN "7_HMI_Err_UH07_OB".System.BST2_Störung; + U #Schleuse_4200.Dyn.Sk.Bereich_ok; + = #Fahren_Ok; + + U "BG3730"; + U "MB3725"; + = #B_vor_Schleuse; + + U "DHWtoVP_Sensoren".Stau_BG4201.Stat.B_Akt; + = #Stau_raus; + + CALL #Bereich_3731 + ( Bereichs_Nr := 3731 , + ErrQuit := #ErrQuit , + B_BereichsAnfang := #B_vor_Schleuse , + B_BereichsEnde := "BG3731" , + B_Zähl := "BG4201" , + B_Stau_raus := #Stau_raus , + Start_Ok := #Fahren_Ok , + Antrieb_Bereich_aktiv := "MA0201" , + Antrieb_plus_aktiv := "MA0260" , + Antrieb_Bereich_vor := "DHWtoVP_Antriebe".MA0201.Stat.A_vor , + Antrieb_Bereich_stop := "DHWtoVP_Antriebe".MA0201.Stat.Stop_vor , + Error := %DB708.DBW458 , + Antrieb_Bereich_start := "DHWtoVP_Antriebe".MA0201.Stat.A_start , + Antrieb_plus_vor := "DHWtoVP_Antriebe".MA0260.Stat.A_vor , + Antrieb_plus_start := "DHWtoVP_Antriebe".MA0260.Stat.A_start , + Antrieb_minus_vor := "DHWtoVP_Antriebe".MA0200.Stat.A_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Störungen anzeigen UZ7202 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7202.StOk_blinken; + S "DOutbound_Bereich".A01_UC072.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Störungen quittieren UZ7202/7302 + U "DOutbound_Bereich".A01_UZ7202.StOk_aktiv; + O "DOutbound_Bereich".A01_UZ7302.StOk_aktiv; + O "DOutbound_Bereich".A01_UC073.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Schleuse 4200 (hinter BST 2) + CALL #Schleuse_4200 + ( Schleusen_Nr := 4200 , + ErrQuit := #ErrQuit , + B_InSchleuse := "BG4200" , + B_AusSchleuse := "BG4202" , + B_Stau_raus := "DHWtoVP_Sensoren".Stau_BG4202.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0260" , + Antrieb_plus_aktiv := "MA0261" , + Schleuse_geöffnet := "MB4200" , + RestZeit_Bereich_plus := #Bereich_4203.Dyn.Restzeit , + Y_Schleuse_Auf := "DHWtoVP_Zylinder".Schleuse_4200.Stat.Ast , + Error := %DB708.DBW538 , + Antrieb_Schleuse_vor := "DHWtoVP_Antriebe".MA0260.Stat.A_vor , + Antrieb_Schleuse_start := "DHWtoVP_Antriebe".MA0260.Stat.A_start , + Antrieb_Schleuse_stop := "DHWtoVP_Antriebe".MA0260.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DHWtoVP_Antriebe".MA0260.Stat.A_PS , + Antrieb_plus_vor := #Bereich_4203.Dyn.Status.Trolley_kommt_in_Bereich , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Bereich 4203 + U "BG4202"; + U "MB4200"; + = #B_vor_Schleuse; + + U "DHWtoVP_Sensoren".Stau_BG4204.Stat.B_Akt; + O "DHWtoVP_Sensoren".Stau_BG4206.Stat.B_Akt; + = #Stau_raus; + + CALL #Bereich_4203 + ( Bereichs_Nr := 4203 , + ErrQuit := #ErrQuit , + B_BereichsAnfang := #B_vor_Schleuse , + B_BereichsEnde := "BG4203" , + B_Zähl := "BG4204" , + B_Stau_raus := #Stau_raus , + Start_Ok := 1 , + Antrieb_Bereich_aktiv := "MA0261" , + Antrieb_plus_aktiv := "MA0262" , + Antrieb_Bereich_vor := "DHWtoVP_Antriebe".MA0261.Stat.A_vor , + Antrieb_Bereich_stop := "DHWtoVP_Antriebe".MA0261.Stat.Stop_vor , + Error := %DB708.DBW464 , + Antrieb_Bereich_start := "DHWtoVP_Antriebe".MA0261.Stat.A_start , + Antrieb_plus_vor := "DHWtoVP_Antriebe".MA0262.Stat.A_vor , + Antrieb_plus_start := "DHWtoVP_Antriebe".MA0262.Stat.A_start , + Antrieb_minus_vor := "DHWtoVP_Antriebe".MA0260.Stat.A_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Störungen anzeigen UZ7202/7302 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7202.StOk_blinken; + S "DOutbound_Bereich".A01_UZ7302.StOk_blinken; + S "DOutbound_Bereich".A01_UC073.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Störungen quittieren UZ7302/7303 + U "DOutbound_Bereich".A01_UZ7302.StOk_aktiv; + O "DOutbound_Bereich".A01_UZ7303.StOk_aktiv; + O "DOutbound_Bereich".A01_UC073.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = MA0262 / Übergang 4205 + CALL #Übergang_4205 + ( ErrQuit := #ErrQuit , + B_Anfang := "BG4204" , + B_Am_Übergang := "BG4205" , + B_Stau_Antrieb_plus := "BG4206" , + Antrieb_aktiv := "MA0262" , + Antrieb_plus_aktiv := "MA0263" , + Antrieb_vor := "DHWtoVP_Antriebe".MA0262.Stat.A_vor , + Antrieb_start := "DHWtoVP_Antriebe".MA0262.Stat.A_start , + Antrieb_stop := "DHWtoVP_Antriebe".MA0262.Stat.A_PS , + Antrieb_plus_vor := "DHWtoVP_Antriebe".MA0263.Stat.A_vor , + Antrieb_plus_start := "DHWtoVP_Antriebe".MA0263.Stat.A_start + ); + +NETWORK +TITLE = Schleuse 4217 (Vor RFID-Gate) + U(; + O "DI0246" ;//Rückmeldung von RFID-Gate + O "DI0247"; + ); +/// UN #Test_RFID.Stop_Wegen_Test + = #Start_ok; + +//Meldungen für RFID-Gate: + U "BG4217"; + UN "MB4217"; + UN #Start_ok; + = "7_HMI_Err_UH07_OB".RFID_Gate.Gate_nicht_bereit; + + U "DI0247"; + = "7_HMI_Err_UH07_OB".RFID_Gate.Gate_ByPAss; + + CALL #Schleuse_4217 + ( Schleusen_Nr := 4217 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG4206" , + B_InSchleuse := "BG4217" , + B_Zähl := "BG4216" , + B_Stau_raus := "DHWtoVP_Sensoren".Stau_BG4216.Stat.B_Akt , + Start_Ok := #Start_ok , + Antrieb_Schleuse_aktiv := "MA0263" , + Antrieb_plus_aktiv := "MA0263" , + Schleuse_geöffnet := "MB4217" , + Y_Schleuse_Auf := "DHWtoVP_Zylinder".Schleuse_4217.Stat.Ast , + Error := %DB708.DBW580 , + Antrieb_Schleuse_vor := "DHWtoVP_Antriebe".MA0263.Stat.A_vor , + Antrieb_Schleuse_start := "DHWtoVP_Antriebe".MA0263.Stat.A_start , + Antrieb_Schleuse_stop := "DHWtoVP_Antriebe".MA0263.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DHWtoVP_Antriebe".MA0263.Stat.A_PS , + Antrieb_plus_vor := , //da schon oben verwendet + Antrieb_plus_start := , //da schon oben verwendet + hStOk := #ErrAnz + ); + + U #Schleuse_4217.Dyn.Sk.Bereich_ok; + = "DQ0246"; + U "MB4217"; + = "DQ0247"; + +NETWORK +TITLE = Schleuse 4207 (Plus) + U "DHWtoVP_Sensoren".Stau_BG4210.Stat.B_Akt; + O "DHWtoVP_Sensoren".Stau_BG4211.Stat.B_Akt; + = #Stau_raus; + + UN "MB4223" ;//Weiche Einfahrt ByPass + UN "MB4210"; + = #Start_ok; + + CALL #Schleuse_4207 + ( Schleusen_Nr := 4207 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG4216" , + B_InSchleuse := "BG4207" , + B_Zähl := "BG4211" , + B_Stau_raus := #Stau_raus , + Start_Ok := #Start_ok , + Antrieb_Schleuse_aktiv := "MA0263" , + Antrieb_plus_aktiv := "MA0264" , + Schleuse_geöffnet := "MB4207" , + Y_Schleuse_Auf := "DHWtoVP_Zylinder".Schleuse_4207.Stat.Ast , + Error := %DB708.DBW540 , + Antrieb_Schleuse_vor := "DHWtoVP_Antriebe".MA0263.Stat.A_vor , + Antrieb_Schleuse_start := "DHWtoVP_Antriebe".MA0263.Stat.A_start , + Antrieb_Schleuse_stop := "DHWtoVP_Antriebe".MA0263.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DHWtoVP_Antriebe".MA0263.Stat.A_PS , + Antrieb_plus_vor := "DLPtoHW_Antriebe".MA0264.Stat.A_vor , + Antrieb_plus_start := "DLPtoHW_Antriebe".MA0264.Stat.A_start , + hStOk := #ErrAnz + ); + + U "MA0263"; + U(; + L #Schleuse_4207.Dyn.Raus_Trolleys; + L 0; + >I; + O "BG4211"; + ); + S "DLPtoHW_Antriebe".MA0264.Stat.A_vor; + +NETWORK +TITLE = Störungen anzeigen UZ7302/7303 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7302.StOk_blinken; + S "DOutbound_Bereich".A01_UZ7303.StOk_blinken; + S "DOutbound_Bereich".A01_UC073.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Störungen quittieren UZ7303 + U "DOutbound_Bereich".A01_UZ7303.StOk_aktiv; + O "DOutbound_Bereich".A01_UC073.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Schleuse 4212 + CALL #Schleuse_4212 + ( Schleusen_Nr := 4212 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG4211" , + B_InSchleuse := "BG4212" , + B_AusSchleuse := "BG4213" , + B_Stau_raus := "DHWtoVP_Sensoren".Stau_BG4213.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0263" , + Antrieb_plus_aktiv := "MA0263" , + Schleuse_geöffnet := "MB4212" , + Y_Schleuse_Auf := "DHWtoVP_Zylinder".Schleuse_4212.Stat.Ast , + Error := %DB708.DBW542 , + Antrieb_Schleuse_vor := "DHWtoVP_Antriebe".MA0263.Stat.A_vor , + Antrieb_Schleuse_start := "DHWtoVP_Antriebe".MA0263.Stat.A_start , + Antrieb_Schleuse_stop := "DHWtoVP_Antriebe".MA0263.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DHWtoVP_Antriebe".MA0263.Stat.A_PS , + Antrieb_plus_vor := , //da schon oben verwendet + Antrieb_plus_start := , //da schon oben verwendet + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Schleuse 4214 + CALL #Schleuse_4214 + ( Schleusen_Nr := 4214 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG4213" , + B_InSchleuse := "BG4214" , + B_AusSchleuse := "BG4215" , + B_Stau_raus := "DHWtoVP_Sensoren".Stau_BG4215.Stat.B_Akt , + Start_Ok := #Bereich_3145.Dyn.Sk.Bereich_ok , + Antrieb_Schleuse_aktiv := "MA0263" , + Antrieb_plus_aktiv := "MA0140" , + Schleuse_geöffnet := "MB4214" , + RestZeit_Bereich_plus := #Bereich_3145.Dyn.Restzeit , + Y_Schleuse_Auf := "DHWtoVP_Zylinder".Schleuse_4214.Stat.Ast , + Error := %DB708.DBW544 , + Antrieb_Schleuse_vor := "DHWtoVP_Antriebe".MA0263.Stat.A_vor , + Antrieb_Schleuse_start := "DHWtoVP_Antriebe".MA0263.Stat.A_start , + Antrieb_Schleuse_stop := "DHWtoVP_Antriebe".MA0263.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DHWtoVP_Antriebe".MA0263.Stat.A_PS , + Antrieb_plus_vor := #Bereich_3145.Dyn.Status.Trolley_kommt_in_Bereich , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Störungen anzeigen UZ7303 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7303.StOk_blinken; + S "DOutbound_Bereich".A01_UC073.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Störungen quittieren UZ7303/7101 + U "DOutbound_Bereich".A01_UZ7303.StOk_aktiv; + O "DOutbound_Bereich".A01_UZ7101.StOk_aktiv; + O "DOutbound_Bereich".A01_UC073.StOk_aktiv; + O "DOutbound_Bereich".A01_UC071.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Bereich 3145 + U "BG4215"; + U "MB4214"; + = #B_vor_Schleuse; + + CALL #Bereich_3145 + ( Bereichs_Nr := 3145 , + ErrQuit := #ErrQuit , + B_BereichsAnfang := #B_vor_Schleuse , + B_BereichsEnde := "BG3145" , + B_Zähl := "BG3144" , + B_Stau_raus := "DHWtoVP_Sensoren".Stau_BG3144.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Bereich_aktiv := "MA0140" , + Antrieb_plus_aktiv := "MA0141" , + Antrieb_Bereich_vor := "DHWtoVP_Antriebe".MA0140.Stat.A_vor , + Antrieb_Bereich_stop := "DHWtoVP_Antriebe".MA0140.Stat.Stop_vor , + Error := %DB708.DBW450 , + Antrieb_Bereich_start := "DHWtoVP_Antriebe".MA0140.Stat.A_start , + Antrieb_plus_vor := "DHWtoVP_Antriebe".MA0141.Stat.A_vor , + Antrieb_plus_start := "DHWtoVP_Antriebe".MA0141.Stat.A_start , + Antrieb_minus_vor := "DHWtoVP_Antriebe".MA0263.Stat.A_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Störungen anzeigen UZ7303/7101 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7303.StOk_blinken; + S "DOutbound_Bereich".A01_UZ7101.StOk_blinken; + S "DOutbound_Bereich".A01_UC073.StOk_blinken; + S "DOutbound_Bereich".A01_UC071.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Störungen quittieren UZ7101/7102 + U "DOutbound_Bereich".A01_UZ7101.StOk_aktiv; + O "DOutbound_Bereich".A01_UZ7102.StOk_aktiv; + O "DOutbound_Bereich".A01_UC071.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Schleuse 3143 + CALL #Schleuse_3143 + ( Schleusen_Nr := 3143 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG3144" , + B_InSchleuse := "BG3143" , + B_Zähl := "BG3142" , + B_Stau_raus := "DHWtoVP_Sensoren".Stau_BG3142.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0141" , + Antrieb_plus_aktiv := "MA0141" , + Schleuse_geöffnet := "MB3143" , + Y_Schleuse_Auf := "DHWtoVP_Zylinder".Schleuse_3143.Stat.Ast , + Error := %DB708.DBW514 , + Antrieb_Schleuse_vor := "DHWtoVP_Antriebe".MA0141.Stat.A_vor , + Antrieb_Schleuse_start := "DHWtoVP_Antriebe".MA0141.Stat.A_start , + Antrieb_Schleuse_stop := "DHWtoVP_Antriebe".MA0141.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DHWtoVP_Antriebe".MA0141.Stat.A_PS , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Schleuse 3141 (vor Weiche zum KontrollPlatz) + UN "MB3136" ;//Andere Quelle aktiv + = #Start_ok; + + CALL #Schleuse_3141 + ( Schleusen_Nr := 3141 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG3142" , + B_InSchleuse := "BG3141" , + B_Zähl := , //über Weiche + B_Stau_raus := , //über Ziel-FC + Start_Ok := #Start_ok , + Antrieb_Schleuse_aktiv := "MA0141" , + Antrieb_plus_aktiv := "MA0141" , + Schleuse_geöffnet := "MB3141" , + Y_Schleuse_Auf := "DHWtoVP_Zylinder".Schleuse_3141.Stat.Ast , + Error := %DB708.DBW512 , + Antrieb_Schleuse_vor := "DHWtoVP_Antriebe".MA0141.Stat.A_vor , + Antrieb_Schleuse_start := "DHWtoVP_Antriebe".MA0141.Stat.A_start , + Antrieb_Schleuse_stop := "DHWtoVP_Antriebe".MA0141.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DHWtoVP_Antriebe".MA0141.Stat.A_PS , + Antrieb_plus_vor := , //über Weiche + Antrieb_plus_start := , //über Weiche + hStOk := #ErrAnz + ); + + U "MB3141"; + R "DHWtoVP_Zylinder".Weiche_3137.Stat.Ast;//Einfahrt-Weiche von Kontrollplatz + +NETWORK +TITLE = Weiche 3140 (zum Kontrollplatz) + SET; + R #Antrieb_vor; + R #Antrieb_stop; + + U "MA0141"; + U "MA0143"; + = #Antrieb_aktiv; + + CALL #Weiche_3140 + ( Weichen_Nr := 3140 , + ErrQuit := #ErrQuit , + Fahren_Ok := 1 , + B_Ziel_gerade := "BG3127" , + B_Ziel_abzweig := "BG3130" , + Antrieb_Weiche_aktiv := #Antrieb_aktiv , + Antrieb_Gerade_aktiv := "MA0144" , + Antrieb_Abzweig_aktiv := "MA0142" , + Weiche_ist_AST := "MB3140" , + Y_Weiche_abzweig := "DHWtoVP_Zylinder".Weiche_3140.Stat.Ast , + Error := %DB708.DBW510 , + Antrieb_Weiche_vor := #Antrieb_vor , + Antrieb_Weiche_stop := #Antrieb_stop , + Antrieb_Weiche_gerade_vor := "DHWtoVP_Antriebe".MA0144.Stat.A_vor , + Antrieb_Weiche_gerade_stop := "DHWtoVP_Antriebe".MA0144.Stat.Stop_vor , + Antrieb_Weiche_abzweig_vor := "DHWtoVP_Antriebe".MA0142.Stat.A_vor , + Antrieb_Weiche_abzweig_stop := "DHWtoVP_Antriebe".MA0142.Stat.Stop_vor , + hStOk := #ErrAnz + ); + + U #Antrieb_vor; + S "DHWtoVP_Antriebe".MA0141.Stat.A_vor; + S "DHWtoVP_Antriebe".MA0143.Stat.A_vor; + U #Antrieb_stop; + S "DHWtoVP_Antriebe".MA0141.Stat.Stop_vor; + S "DHWtoVP_Antriebe".MA0142.Stat.Stop_vor; + + CLR ;/// + S "DHWtoVP_Antriebe".MA0141.Stat.Stop_vor; + S "DHWtoVP_Antriebe".MA0142.Stat.Stop_vor; + S "DHWtoVP_Antriebe".MA0144.Stat.Stop_vor; + +NETWORK +TITLE = Schleuse 3131(vor Kontrollplatz) + U "DHWtoVP_Sensoren".Stau_BG3132.Stat.B_Akt; + O "DHWtoVP_Sensoren".Stau_BG3133.Stat.B_Akt; + = #Stau_raus; + + CALL #Schleuse_3131 + ( Schleusen_Nr := 3131 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG3130" , + B_InSchleuse := "BG3131" , + B_AusSchleuse := "BG3132" , + B_Stau_raus := #Stau_raus , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0142" , + Antrieb_plus_aktiv := "MA0142" , + Schleuse_geöffnet := "MB3131" , + Y_Schleuse_Auf := "DHWtoVP_Zylinder".Schleuse_3131.Stat.Ast , + Error := %DB708.DBW504 , + Antrieb_Schleuse_vor := "DHWtoVP_Antriebe".MA0142.Stat.A_vor , + Antrieb_Schleuse_start := "DHWtoVP_Antriebe".MA0142.Stat.A_start , + Antrieb_Schleuse_stop := "DHWtoVP_Antriebe".MA0142.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DHWtoVP_Antriebe".MA0142.Stat.A_PS , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Schleuse 3134 (Kontrollplatz) + U "BG3133"; + UN "BG3134"; + O "BG3132"; + = #B_vor_Schleuse; + +//Untere Anzeigen werden im Ziel-FC gesetzt: + L #Schleuse_3134.Dyn.Sk.Akt_Schritt; + L 12; + <>I; + R "PF0136" ;//Trolley starten ok + + CALL #Schleuse_3134 + ( Schleusen_Nr := 3134 , + ErrQuit := #ErrQuit , + B_VorSchleuse := #B_vor_Schleuse , + B_InSchleuse := "BG3134" , + B_AusSchleuse := "BG3135" , + B_Stau_raus := "DHWtoVP_Sensoren".Stau_BG3135.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0142" , + Antrieb_plus_aktiv := "MA0143" , + Schleuse_geöffnet := "MB3134" , + Y_Schleuse_Auf := "DHWtoVP_Zylinder".Schleuse_3134.Stat.Ast , + Error := %DB708.DBW506 , + Antrieb_Schleuse_vor := "DHWtoVP_Antriebe".MA0142.Stat.A_vor , + Antrieb_Schleuse_start := "DHWtoVP_Antriebe".MA0142.Stat.A_start , + Antrieb_Schleuse_stop := "DHWtoVP_Antriebe".MA0142.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DHWtoVP_Antriebe".MA0142.Stat.A_PS , + Antrieb_plus_vor := "DHWtoVP_Antriebe".MA0143.Stat.A_vor , + Antrieb_plus_start := "DHWtoVP_Antriebe".MA0143.Stat.A_start , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Schleuse 3136 (vor Weiche aus KontrollPlatz) + +//Förderer nach Kontrollplatz einschalten: + U "BG3135"; + U(; + ON #Schleuse_3136.Dyn.Error.Err_Stau_Einfahrt; + ON "BG3136"; + ); + S "DHWtoVP_Antriebe".MA0143.Stat.A_vor; + + UN "MB3141" ;//Andere Quelle aktiv + = #Start_ok; + + CALL #Schleuse_3136 + ( Schleusen_Nr := 3136 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG3135" , + B_InSchleuse := "BG3136" , + B_Zähl := , //über Weiche + B_Stau_raus := , //über Ziel-FC + Start_Ok := #Start_ok , + Antrieb_Schleuse_aktiv := "MA0143" , + Antrieb_plus_aktiv := "MA0141" , + Schleuse_geöffnet := "MB3136" , + Y_Schleuse_Auf := "DHWtoVP_Zylinder".Schleuse_3136.Stat.Ast , + Error := %DB708.DBW508 , + Antrieb_Schleuse_vor := "DHWtoVP_Antriebe".MA0143.Stat.A_vor , + Antrieb_Schleuse_start := "DHWtoVP_Antriebe".MA0143.Stat.A_start , + Antrieb_Schleuse_stop := "DHWtoVP_Antriebe".MA0143.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DHWtoVP_Antriebe".MA0143.Stat.A_PS , + Antrieb_plus_vor := , //über Weiche + Antrieb_plus_start := , //über Weiche + hStOk := #ErrAnz + ); + + U "MB3136"; + S "DHWtoVP_Zylinder".Weiche_3137.Stat.Ast;//Einfahrt-Weiche von Kontrollplatz + +NETWORK +TITLE = Störungen anzeigen UZ7101/7102 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7101.StOk_blinken; + S "DOutbound_Bereich".A01_UZ7102.StOk_blinken; + S "DOutbound_Bereich".A01_UC071.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Omnifahren_HWtoVP/HWtoVP_Ziel_FC.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Omnifahren_HWtoVP/HWtoVP_Ziel_FC.awl index 7829d13..74a10ee 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Omnifahren_HWtoVP/HWtoVP_Ziel_FC.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/0_HWtoVP/Omnifahren_HWtoVP/HWtoVP_Ziel_FC.awl @@ -1,284 +1,320 @@ -=== FC 181: HWtoVP_Ziel_FC [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Ziel_hex : Word - Ziel_int : Int - Zielebene : Word - Error : Byte - Position : Int - Lager_DB : Int - Lager_DW : Int - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - SSDW : Int - EndZiel : Word - Variante : Int - AbrufID : DInt - Fahrlisten_TrolleyID : DInt - Fahrlisten_AbrufID : DInt - Fahrlisten_Lager : Int - Trolley_unbekannt : Bool // Trolley ist nicht in DL - Express_Abruf : Bool - Error.Bit : Bool - Constant: - Return: - Ret_Val : Void - ---- NW 1: Rückmeldung --- - SET // Rückmeldungen erst mal resetten - R "M180.6" // Weiterfahrt von Ziel-FC erlaubt - - ---- NW 2: Schleuse 3731: (BST 2) --- - L "MW190" - L 3731 // Aufruf von Schleuse XXXX? - <>I // Nein! - JC X3731E - - SET - S "M180.6" // Weiterfahrt ist erlaubt +FUNCTION "HWtoVP_Ziel_FC" : Void +TITLE = Ziel-FC: HW>VP_OmniFahren +{ S7_Optimized_Access := 'FALSE' ; S7_Pass_Registers := 'TRUE' } +AUTHOR : AE +VERSION : 0.1 + VAR_TEMP + Ziel_hex : Word; + Ziel_int : Int; + Zielebene : Word; + Error : Byte; + Position : Int; + Lager_DB : Int; + Lager_DW : Int; + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + SSDW : Int; + EndZiel : Word; + Variante : Int; + AbrufID : DInt; + Fahrlisten_TrolleyID : DInt; + Fahrlisten_AbrufID : DInt; + Fahrlisten_Lager : Int; + Trolley_unbekannt : Bool; // Trolley ist nicht in DL + Express_Abruf : Bool; + "Error.Bit" : Bool; + END_VAR + + +BEGIN +NETWORK +TITLE = Rückmeldung + SET;//Rückmeldungen erst mal resetten + R "M180.6";//Weiterfahrt von Ziel-FC erlaubt + +NETWORK +TITLE = Schleuse 3731: (BST 2) + L "MW190"; + L 3731 ;//Aufruf von Schleuse XXXX? + <>I;//Nein! + SPB X3731E; + + SET; + S "M180.6" ;//Weiterfahrt ist erlaubt + + BEA; + +X3731E: NOP 0; + +NETWORK +TITLE = Bereich 4203: Weiterfahren erlaubt ? (AFS von BST) + L "MW190"; + L 4203 ;//Aufruf von Schleuse 4203 ? + <>I;//Nein! + SPB X4203E; + + SET; + S "M180.6" ;//Weiterfahrt ist erlaubt + + BEA; + +X4203E: NOP 0; + +NETWORK +TITLE = Schleuse 4207: (Vor BypPass von LP) + L "MW190"; + L 4207 ;//Aufruf von Schleuse XXXX? + <>I;//Nein! + SPB X4207E; + +//Quell-Steuerung: + L "DLPtoHW_OmniFahren".Weiche_4223.Dyn.Weichen_Ziel; + L 16#4211;//Fahren Trolleys zu BG4211? + ==I;//Ja! + O "MB4223";//Weiche ist auf Abzweig + O "DLPtoHW_OmniFahren".Weiche_4223.Dyn.Status.Reset_aktiv; + BEB;//Warten ! + +//Ziel-Check: + UN "MB4223" ;//Weiche Einfahrt ByPass + UN "MB4210"; + UN "DHWtoVP_Sensoren".Stau_BG4210.Stat.B_Akt; + UN "DHWtoVP_Sensoren".Stau_BG4211.Stat.B_Akt; + S "M180.6" ;//Weiterfahrt ist erlaubt + + BEA; + +X4207E: NOP 0; + +NETWORK +TITLE = Bereich 3145: Weiterfahren erlaubt ? (AFS von 1.Ebene) + L "MW190"; + L 3145 ;//Aufruf von Schleuse 3145 ? + <>I;//Nein! + SPB X3145E; + + SET; + S "M180.6" ;//Weiterfahrt ist erlaubt + + BEA; + +X3145E: NOP 0; + +NETWORK +TITLE = Schleuse 3143: (Anfrage KontrollPlatz) + L "MW190"; + L 3143 ;//Aufruf von Schleuse XXXX? + <>I;//Nein! + SPB X3143E; + + L "MD182" ;//ShopGroup + L DINT#-1 ;//Leer-Trolley? + ==D ;//Ja ! + S "M180.6" ;//Weiterfahrt ist erlaubt + BEB;//Kein Telegramm! + + U "SGes".Ohne_PC_Fahren;//Also ohne Anfrage + S "M180.6" ;//Weiterfahrt ist erlaubt + SPB N3143; + +//GOHDReqM an Host senden: + U "DHWtoVP_OmniFahren".Schleuse_3143.Status2.Telegramm_gesendet; + S "M180.6" ;//Weiterfahrt ist erlaubt + BEB; + + L "DHWtoVP_OmniFahren".Schleuse_3143.Dyn.TrolleyID_Schleuse; + L 0;//Barcode bekannt? + ==D;//Nein! + BEB;//Warten! + + CALL "Daten_in_SendFIFO_speichern", "Daten_für_SendFIFO" + ( "TelegrammKennung[1]" := 'G' , + "TelegrammKennung[2]" := 'O' , + "TelegrammKennung[3]" := 'H' , + "TelegrammKennung[4]" := 'D' , + "TelegrammKennung[5]" := 'R' , + "TelegrammKennung[6]" := 'e' , + "TelegrammKennung[7]" := 'q' , + "TelegrammKennung[8]" := 'M' , + TrolleyID := "DHWtoVP_OmniFahren".Schleuse_3143.Dyn.TrolleyID_Schleuse , + StationsNr := 3143 , + Port := 2 , + Ret_Val_FIFO_IN := "MB199" , + Error := #"Error.Bit" + ); + + UN #"Error.Bit"; + S "DHWtoVP_OmniFahren".Schleuse_3143.Status2.Telegramm_gesendet; + +//Trolleydaten neu anlegen: (Falls noch als Daten-Leiche vorhanden war) +N3143: CALL "Trolleydaten_neu_anlegen" + ( Gesamt_Trolley_DL := "DHWtoVP_OmniFahren".Schleuse_3143.Schleuse.Gesamt_Trolley_DL , + TrolleyID := "DHWtoVP_OmniFahren".Schleuse_3143.Dyn.TrolleyID_Schleuse , + Endziel := 16#0000 , //Kein Ziel + ShopGroup := DINT#0 + ); + + BEA; + +X3143E: NOP 0; + +NETWORK +TITLE = Schleuse 3141: (Vor Einfahrt Kontrollplatz) + L "MW190"; + L 3141 ;//Aufruf von Schleuse XXXX? + <>I;//Nein! + SPB X3141E; + +//Quell-Steuerung: + L "DHWtoVP_OmniFahren".Schleuse_3136.Dyn.Raus_Trolleys; + L 0; + >I;//Weiche von 2.Quelle schon belegt + O "MB3136" ;//Andere Quelle aktiv + BEB; + +//Leerer Trolley vom Leerpuffer? + L "MD182" ;//ShopGroup + L DINT#-1 ;//Leer-Trolley? + ==D ;//Ja ! + O "SGes".Ohne_PC_Fahren;//Also Ziel simulieren + SPB G3141;//Kein Telegramm! + +//Telegramm schon gesendet? + L "MW194" ;//Endziel + L 16#3130 ;//sinnvoll? + <>I ;//Nein! (nochmalige Anfrage) + U(; + TAK; + L 16#3127 ;//sinnvoll? + <>I ;//Nein! (nochmalige Anfrage) + ); + UN "DHWtoVP_OmniFahren".Schleuse_3141.Status2.Telegramm_gesendet; + SPB T3141; + +//Ziel-Check: + L "MW194";//EndZiel (wurde über Host-Telegramm in Datenbank eingetragen) + L 16#3130 ;//Kontroll-Platz? + ==I;//Ja ! + SPB A3141 ;//Abzweig fahren + + TAK; + L 16#3127 ;//Zum VP? + ==I;//Ja ! + SPB G3141; + + U "10s-Impuls";//Nach 10s + R "DHWtoVP_OmniFahren".Schleuse_3141.Status2.Telegramm_gesendet;//Erneute Anfrage + + BEA; + +A3141: L 16#3130; + T "MW198" ;//Weichenziel + + UN "DHWtoVP_Sensoren".Stau_BG3130.Stat.B_Akt; + S "M180.6" ;//Weiterfahrt ist erlaubt + + BEA; + +G3141: L 16#3127; + T "MW198" ;//Weichenziel + + UN "DHWtoVP_Sensoren".Stau_BG3127.Stat.B_Akt; + S "M180.6" ;//Weiterfahrt ist erlaubt + + BEA; + +//GOHDReqM an Host senden: +T3141: L "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.TrolleyID_Schleuse; + L 0;//Barcode bekannt? + ==D;//Nein! + BEB;//Warten! + + CALL "Daten_in_SendFIFO_speichern", "Daten_für_SendFIFO" + ( "TelegrammKennung[1]" := 'G' , + "TelegrammKennung[2]" := 'O' , + "TelegrammKennung[3]" := 'H' , + "TelegrammKennung[4]" := 'D' , + "TelegrammKennung[5]" := 'R' , + "TelegrammKennung[6]" := 'e' , + "TelegrammKennung[7]" := 'q' , + "TelegrammKennung[8]" := 'M' , + TrolleyID := "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.TrolleyID_Schleuse , + StationsNr := 3143 , //3141 + Port := 2 , + Ret_Val_FIFO_IN := "MB199" , + Error := #"Error.Bit" + ); + + UN #"Error.Bit"; + S "DHWtoVP_OmniFahren".Schleuse_3141.Status2.Telegramm_gesendet; + + BEA; + +X3141E: NOP 0; + +NETWORK +TITLE = Schleuse 3134: (Kontrollplatz) + L "MW190"; + L 3134 ;//Aufruf von Schleuse XXXX? + <>I;//Nein! + SPB X3134E; + +//Trolley kann gestartet werden: (Vorerst immer) + U "BG3134" ;//Trolley ist in Schleuse + U "Clock_2Hz"; + = "PF0136"; + +//Ausfahren mit Taste: + U "SF0136"; + S "M180.6" ;//Weiterfahrt ist erlaubt + + BEA; + +X3134E: NOP 0; + +NETWORK +TITLE = Schleuse 3136: (Vor Ausfahrt Kontrollplatz) + L "MW190"; + L 3136 ;//Aufruf von Schleuse XXXX? + <>I;//Nein! + SPB X3136E; - BEU - -X3731E: NOP 0 +//Quell-Steuerung: + L "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.Raus_Trolleys; + L 0; + >I;//Weiche von 2.Quelle schon belegt + O "MB3141" ;//Andere Quelle aktiv + BEB; +//Ziel-Check: + L #EndZiel; + L 16#BAAA ;//Kontroll-Platz? + ==I;//Ja ! + SPB A3136 ;//Abzweig fahren ---- NW 3: Bereich 4203: Weiterfahren erlaubt ? (AFS von BST) --- - L "MW190" - L 4203 // Aufruf von Schleuse 4203 ? - <>I // Nein! - JC X4203E - - SET - S "M180.6" // Weiterfahrt ist erlaubt - - BEU - -X4203E: NOP 0 - - ---- NW 4: Schleuse 4207: (Vor BypPass von LP) --- - L "MW190" - L 4207 // Aufruf von Schleuse XXXX? - <>I // Nein! - JC X4207E - -// Quell-Steuerung: - L "DLPtoHW_OmniFahren".Weiche_4223.Dyn.Weichen_Ziel - L 16#4211 // Fahren Trolleys zu BG4211? - ==I // Ja! - O "MB4223" // Weiche ist auf Abzweig - O "DLPtoHW_OmniFahren".Weiche_4223.Dyn.Status.Reset_aktiv - BEC // Warten ! - -// Ziel-Check: - AN "MB4223" // Weiche Einfahrt ByPass - AN "MB4210" - AN "DHWtoVP_Sensoren".Stau_BG4210.Stat.B_Akt - AN "DHWtoVP_Sensoren".Stau_BG4211.Stat.B_Akt - S "M180.6" // Weiterfahrt ist erlaubt - - BEU - -X4207E: NOP 0 - - ---- NW 5: Bereich 3145: Weiterfahren erlaubt ? (AFS von 1.Ebene) --- - L "MW190" - L 3145 // Aufruf von Schleuse 3145 ? - <>I // Nein! - JC X3145E - - SET - S "M180.6" // Weiterfahrt ist erlaubt - - BEU - -X3145E: NOP 0 - - ---- NW 6: Schleuse 3143: (Anfrage KontrollPlatz) --- - L "MW190" - L 3143 // Aufruf von Schleuse XXXX? - <>I // Nein! - JC X3143E - - L "MD182" // ShopGroup - L DINT#-1 // Leer-Trolley? - ==D // Ja ! - S "M180.6" // Weiterfahrt ist erlaubt - BEC // Kein Telegramm! - - A "SGes".Ohne_PC_Fahren // Also ohne Anfrage - S "M180.6" // Weiterfahrt ist erlaubt - JC N3143 + SPA G3136; -// GOHDReqM an Host senden: - A "DHWtoVP_OmniFahren".Schleuse_3143.Status2.Telegramm_gesendet - S "M180.6" // Weiterfahrt ist erlaubt - BEC +A3136: L 16#3130; + T "MW198" ;//Weichenziel - L "DHWtoVP_OmniFahren".Schleuse_3143.Dyn.TrolleyID_Schleuse - L 0 // Barcode bekannt? - ==D // Nein! - BEC // Warten! + UN "DHWtoVP_Sensoren".Stau_BG3130.Stat.B_Akt; + S "M180.6" ;//Weiterfahrt ist erlaubt -CALL FB "Daten_in_SendFIFO_speichern" , (TelegrammKennung[1]:='G', TelegrammKennung[2]:='O', TelegrammKennung[3]:='H', TelegrammKennung[4]:='D', TelegrammKennung[5]:='R', TelegrammKennung[6]:='e', TelegrammKennung[7]:='q', TelegrammKennung[8]:='M', TelegrammKennung[9]:=?, TelegrammKennung[10]:=?, TrolleyID:="DHWtoVP_OmniFahren".Schleuse_3143.Dyn.TrolleyID_Schleuse, StationsNr:=3143, Puffer_LinienNr:=?, StoreGroup:=?, Status_1_Int:=?, Status_2_Bit[0]:=?, Status_2_Bit[1]:=?, Status_2_Bit[2]:=?, Status_2_Bit[3]:=?, Status_2_Bit[4]:=?, Status_2_Bit[5]:=?, Status_2_Bit[6]:=?, Status_2_Bit[7]:=?, Reserve[1]_Int:=?, Reserve[2]_Int:=?, Port:=2, Ret_Val_FIFO_IN:="MB199", Error:="Error.Bit") + BEA; - AN "Error.Bit" - S "DHWtoVP_OmniFahren".Schleuse_3143.Status2.Telegramm_gesendet +G3136: L 16#3127; + T "MW198" ;//Weichenziel -// Trolleydaten neu anlegen: (Falls noch als Daten-Leiche vorhanden war) -N3143: CALL FC "Trolleydaten_neu_anlegen" (Gesamt_Trolley_DL:="DHWtoVP_OmniFahren".Schleuse_3143.Schleuse.Gesamt_Trolley_DL, TrolleyID:="DHWtoVP_OmniFahren".Schleuse_3143.Dyn.TrolleyID_Schleuse, Endziel:=16#0000, ShopGroup:=DINT#0) // Kein Ziel + UN "DHWtoVP_Sensoren".Stau_BG3127.Stat.B_Akt; + S "M180.6" ;//Weiterfahrt ist erlaubt - BEU + BEA; -X3143E: NOP 0 +X3136E: NOP 0; +NETWORK +TITLE = Ende + BE; ---- NW 7: Schleuse 3141: (Vor Einfahrt Kontrollplatz) --- - L "MW190" - L 3141 // Aufruf von Schleuse XXXX? - <>I // Nein! - JC X3141E - -// Quell-Steuerung: - L "DHWtoVP_OmniFahren".Schleuse_3136.Dyn.Raus_Trolleys - L 0 - >I // Weiche von 2.Quelle schon belegt - O "MB3136" // Andere Quelle aktiv - BEC - -// Leerer Trolley vom Leerpuffer? - L "MD182" // ShopGroup - L DINT#-1 // Leer-Trolley? - ==D // Ja ! - O "SGes".Ohne_PC_Fahren // Also Ziel simulieren - JC G3141 // Kein Telegramm! - -// Telegramm schon gesendet? - L "MW194" // Endziel - L 16#3130 // sinnvoll? - <>I // Nein! (nochmalige Anfrage) - A( - CAC - L 16#3127 // sinnvoll? - <>I // Nein! (nochmalige Anfrage) - ) - AN "DHWtoVP_OmniFahren".Schleuse_3141.Status2.Telegramm_gesendet - JC T3141 - -// Ziel-Check: - L "MW194" // EndZiel (wurde über Host-Telegramm in Datenbank eingetragen) - L 16#3130 // Kontroll-Platz? - ==I // Ja ! - JC A3141 // Abzweig fahren - - CAC - L 16#3127 // Zum VP? - ==I // Ja ! - JC G3141 - - A "10s-Impuls" // Nach 10s - R "DHWtoVP_OmniFahren".Schleuse_3141.Status2.Telegramm_gesendet // Erneute Anfrage - - BEU - -A3141: L 16#3130 - T "MW198" // Weichenziel - - AN "DHWtoVP_Sensoren".Stau_BG3130.Stat.B_Akt - S "M180.6" // Weiterfahrt ist erlaubt - - BEU - -G3141: L 16#3127 - T "MW198" // Weichenziel - - AN "DHWtoVP_Sensoren".Stau_BG3127.Stat.B_Akt - S "M180.6" // Weiterfahrt ist erlaubt - - BEU - -// GOHDReqM an Host senden: -T3141: L "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.TrolleyID_Schleuse - L 0 // Barcode bekannt? - ==D // Nein! - BEC // Warten! - -CALL FB "Daten_in_SendFIFO_speichern" , (TelegrammKennung[1]:='G', TelegrammKennung[2]:='O', TelegrammKennung[3]:='H', TelegrammKennung[4]:='D', TelegrammKennung[5]:='R', TelegrammKennung[6]:='e', TelegrammKennung[7]:='q', TelegrammKennung[8]:='M', TelegrammKennung[9]:=?, TelegrammKennung[10]:=?, TrolleyID:="DHWtoVP_OmniFahren".Schleuse_3141.Dyn.TrolleyID_Schleuse, StationsNr:=3143, Puffer_LinienNr:=?, StoreGroup:=?, Status_1_Int:=?, Status_2_Bit[0]:=?, Status_2_Bit[1]:=?, Status_2_Bit[2]:=?, Status_2_Bit[3]:=?, Status_2_Bit[4]:=?, Status_2_Bit[5]:=?, Status_2_Bit[6]:=?, Status_2_Bit[7]:=?, Reserve[1]_Int:=?, Reserve[2]_Int:=?, Port:=2, Ret_Val_FIFO_IN:="MB199", Error:="Error.Bit") // 3141 - - AN "Error.Bit" - S "DHWtoVP_OmniFahren".Schleuse_3141.Status2.Telegramm_gesendet - - BEU - -X3141E: NOP 0 - - ---- NW 8: Schleuse 3134: (Kontrollplatz) --- - L "MW190" - L 3134 // Aufruf von Schleuse XXXX? - <>I // Nein! - JC X3134E - -// Trolley kann gestartet werden: (Vorerst immer) - A "BG3134" // Trolley ist in Schleuse - A "Clock_2Hz" - = "PF0136" - -// Ausfahren mit Taste: - A "SF0136" - S "M180.6" // Weiterfahrt ist erlaubt - - BEU - -X3134E: NOP 0 - - ---- NW 9: Schleuse 3136: (Vor Ausfahrt Kontrollplatz) --- - L "MW190" - L 3136 // Aufruf von Schleuse XXXX? - <>I // Nein! - JC X3136E - -// Quell-Steuerung: - L "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.Raus_Trolleys - L 0 - >I // Weiche von 2.Quelle schon belegt - O "MB3141" // Andere Quelle aktiv - BEC - -// Ziel-Check: - L EndZiel - L 16#BAAA // Kontroll-Platz? - ==I // Ja ! - JC A3136 // Abzweig fahren - - JU G3136 - -A3136: L 16#3130 - T "MW198" // Weichenziel - - AN "DHWtoVP_Sensoren".Stau_BG3130.Stat.B_Akt - S "M180.6" // Weiterfahrt ist erlaubt - - BEU - -G3136: L 16#3127 - T "MW198" // Weichenziel - - AN "DHWtoVP_Sensoren".Stau_BG3127.Stat.B_Akt - S "M180.6" // Weiterfahrt ist erlaubt - - BEU - -X3136E: NOP 0 - - ---- NW 10: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Basics/VP_Antriebe.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Basics/VP_Antriebe.awl index 39d5dd4..d5f1c68 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Basics/VP_Antriebe.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Basics/VP_Antriebe.awl @@ -1,103 +1,160 @@ -=== FB 1199: VP_Antriebe [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - MA0145 : "MAntrieb_PowerSave" - MA0146 : "MAntrieb_PowerSave" - MA0147 : "MAntrieb_PowerSave" - MA0150 : "MAntrieb_PowerSave" - MA0152 : "MAntrieb_PowerSave" - Temp: - Auto : Bool // Automatik Linie ist aktiv - Hand : Bool // Hand Linie ist aktiv - BereichErr : Bool // Bereichsstörung -> Antrieb stoppen - QKontroll : Bool // Frequenzumrichter schon 3s Netz EIN - FuKontroll : Bool // Frequenzumrichter schon 3s Netz EIN - Quit : Bool // Motorschutz-Störung quittieren - Qok : Bool // Motorschutz ok - Jog1 : Bool // Geschwindigkeit 1 - Jog2 : Bool // Geschwindigkeit 2 - Betrieb : Bool // Betriebsart aktiv - FC105_RET : Word // Returnwert von FC105 - Antrieb1 : Bool // Antrieb dazuschalten - Antrieb2 : Bool // Antrieb dazuschalten - F1 : Bool // Geschwindigkeit 1 aktiviert - F2 : Bool // Geschwindigkeit 2 aktiviert - F3 : Bool // Geschwindigkeit 3 aktiviert - BereichErr_Zusatz_7102 : Bool // Bereichsstörung -> Antrieb stoppen - BereichErr_Zusatz_7104 : Bool // Bereichsstörung -> Antrieb stoppen - BereichErr_Zusatz_7102_7104 : Bool // Bereichsstörung -> Antrieb stoppen - Constant: +FUNCTION_BLOCK "VP_Antriebe" +TITLE = Antriebe UC071 +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + MA0145 : "MAntrieb_PowerSave"; + MA0146 : "MAntrieb_PowerSave"; + MA0147 : "MAntrieb_PowerSave"; + MA0150 : "MAntrieb_PowerSave"; + MA0152 : "MAntrieb_PowerSave"; + END_VAR ---- NW 1: Übergabe des Bereichstatus System UC071/A01 --- - A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto - - CLR - = Hand - - A "DOutbound_Bereich".A01_UC071.BereichErr - = BereichErr - -// Bereichhalte: - A( - O BereichErr - O "DOutbound_Bereich".A01_UZ7102.Area_Stop - ) - AN "SGes".Simulation_ohne_HW_aktiv - = BereichErr_Zusatz_7102 - - A( - O BereichErr - O "DOutbound_Bereich".A01_UZ7104.Area_Stop - ) - AN "SGes".Simulation_ohne_HW_aktiv - = BereichErr_Zusatz_7104 - - A( - O BereichErr - O BereichErr_Zusatz_7102 - O BereichErr_Zusatz_7104 - ) - AN "SGes".Simulation_ohne_HW_aktiv - = BereichErr_Zusatz_7102_7104 - - A "T191" - = QKontroll - = FuKontroll - - A "DOutbound_Bereich".A01_UC071.StOk_aktiv - = Quit + VAR_TEMP + Auto : Bool; // Automatik Linie ist aktiv + Hand : Bool; // Hand Linie ist aktiv + BereichErr : Bool; // Bereichsstörung -> Antrieb stoppen + QKontroll : Bool; // Frequenzumrichter schon 3s Netz EIN + FuKontroll : Bool; // Frequenzumrichter schon 3s Netz EIN + Quit : Bool; // Motorschutz-Störung quittieren + Qok : Bool; // Motorschutz ok + Jog1 : Bool; // Geschwindigkeit 1 + Jog2 : Bool; // Geschwindigkeit 2 + Betrieb : Bool; // Betriebsart aktiv + FC105_RET : Word; // Returnwert von FC105 + Antrieb1 : Bool; // Antrieb dazuschalten + Antrieb2 : Bool; // Antrieb dazuschalten + F1 : Bool; // Geschwindigkeit 1 aktiviert + F2 : Bool; // Geschwindigkeit 2 aktiviert + F3 : Bool; // Geschwindigkeit 3 aktiviert + BereichErr_Zusatz_7102 : Bool; // Bereichsstörung -> Antrieb stoppen + BereichErr_Zusatz_7104 : Bool; // Bereichsstörung -> Antrieb stoppen + BereichErr_Zusatz_7102_7104 : Bool; // Bereichsstörung -> Antrieb stoppen + END_VAR ---- NW 2: MA0145 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr_Zusatz_7102, Q:="FC0145", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0145", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0145, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +BEGIN +NETWORK +TITLE = Übergabe des Bereichstatus System UC071/A01 + U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; + + CLR; + = #Hand; + + U "DOutbound_Bereich".A01_UC071.BereichErr; + = #BereichErr; + +//Bereichhalte: + U(; + O #BereichErr; + O "DOutbound_Bereich".A01_UZ7102.Area_Stop; + ); + UN "SGes".Simulation_ohne_HW_aktiv; + = #BereichErr_Zusatz_7102; + + U(; + O #BereichErr; + O "DOutbound_Bereich".A01_UZ7104.Area_Stop; + ); + UN "SGes".Simulation_ohne_HW_aktiv; + = #BereichErr_Zusatz_7104; + + U(; + O #BereichErr; + O #BereichErr_Zusatz_7102; + O #BereichErr_Zusatz_7104; + ); + UN "SGes".Simulation_ohne_HW_aktiv; + = #BereichErr_Zusatz_7102_7104; + + U "T191"; + = #QKontroll; + = #FuKontroll; + + U "DOutbound_Bereich".A01_UC071.StOk_aktiv; + = #Quit; + +NETWORK +TITLE = MA0145 + CALL #MA0145 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr_Zusatz_7102 , + Q := "FC0145" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0145" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0145 + ); - ---- NW 3: MA0146 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr_Zusatz_7102, Q:="FC0146", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0146", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0146, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0146 + CALL #MA0146 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr_Zusatz_7102 , + Q := "FC0146" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0146" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0146 + ); - ---- NW 4: MA0147 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr_Zusatz_7104, Q:="FC0147", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0147", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0147, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0147 + CALL #MA0147 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr_Zusatz_7104 , + Q := "FC0147" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0147" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0147 + ); - ---- NW 5: MA0150 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr_Zusatz_7104, Q:="FC0150", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0150", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0150, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0150 + CALL #MA0150 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr_Zusatz_7104 , + Q := "FC0150" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0150" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0150 + ); - ---- NW 6: MA0152 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr_Zusatz_7102_7104, Q:="FC0152", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0152", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0152, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0152 + CALL #MA0152 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr_Zusatz_7102_7104 , + Q := "FC0152" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0152" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0152 + ); +NETWORK +TITLE = Ende + BE; ---- NW 7: Ende --- - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Basics/VP_Sensoren.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Basics/VP_Sensoren.awl index 3f92e6f..8b0a414 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Basics/VP_Sensoren.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Basics/VP_Sensoren.awl @@ -1,380 +1,864 @@ -=== FB 1190: VP_Sensoren [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Stau_VP1 : "MSensoren" - Stau_VP2 : "MSensoren" - Stau_VP3 : "MSensoren" - Stau_VP4 : "MSensoren" - Stau_VP5 : "MSensoren" - Stau_VP6 : "MSensoren" - Stau_VP7 : "MSensoren" - Stau_VP8 : "MSensoren" - Stau_VP9 : "MSensoren" - Stau_VP10 : "MSensoren" - Stau_VP11 : "MSensoren" - Stau_VP12 : "MSensoren" - Stau_VP13 : "MSensoren" - Stau_VP14 : "MSensoren" - Stau_VP15 : "MSensoren" - Stau_VP16 : "MSensoren" - Stau_VP17 : "MSensoren" - Stau_VP18 : "MSensoren" - Stau_VP19 : "MSensoren" - Stau_VP20 : "MSensoren" - Stau_VP21 : "MSensoren" - Stau_VP22 : "MSensoren" - Stau_VP23 : "MSensoren" - Stau_VP24 : "MSensoren" - Stau_VP25 : "MSensoren" - Stau_VP26 : "MSensoren" - Stau_VP27 : "MSensoren" - Stau_VP28 : "MSensoren" - Stau_VP29 : "MSensoren" - Stau_VP30 : "MSensoren" - Stau_VP31 : "MSensoren" - Stau_VP32 : "MSensoren" - Stau_VP33 : "MSensoren" - Stau_VP34 : "MSensoren" - Stau_VP35 : "MSensoren" - Stau_VP36 : "MSensoren" - Stau_VP37 : "MSensoren" - Stau_VP38 : "MSensoren" - Stau_VP39 : "MSensoren" - Stau_VP40 : "MSensoren" - Stau_VP41 : "MSensoren" - Stau_VP42 : "MSensoren" - Stau_VP43 : "MSensoren" - Stau_VP44 : "MSensoren" - Stau_VP45 : "MSensoren" - Stau_VP46 : "MSensoren" - Stau_VP47 : "MSensoren" - Stau_VP48 : "MSensoren" - Stau_VP49 : "MSensoren" - Stau_VP50 : "MSensoren" - Stau_VP51 : "MSensoren" - Stau_BG3062 : "MSensoren" - Stau_BG3061 : "MSensoren" - Stau_BG3060 : "MSensoren" - Stau_BG3003 : "MSensoren" - Stau_BG3002 : "MSensoren" - Stau_BG3001 : "MSensoren" - Stau_BG3420 : "MSensoren" - Stau_BG3481 : "MSensoren" - Stau_BG3181 : "MSensoren" - Stau_BG3182 : "MSensoren" - Stau_BG3183 : "MSensoren" - Stau_BG3184 : "MSensoren" - Stau_BG3240 : "MSensoren" - Stau_BG3241 : "MSensoren" - Stau_BG3242 : "MSensoren" - Stau_BG3243 : "MSensoren" - Stau_BG3246 : "MSensoren" - An_BG3120 : "MSensoren" - An_BG3003 : "MSensoren" - Temp: - T_Ein : Int // Vorgabe Einschaltverzögerung - T_Aus : Int // Zwischenspeicher Ausschaltverzögerung - F1 : Bool // Geschwindigkeit 1 aktiviert - F2 : Bool // Geschwindigkeit 2 aktiviert - F3 : Bool // Geschwindigkeit 3 aktiviert - ESensor : Bool // Sensoren - Antrieb : Bool - VReal : Real // GeschwindigkeitinReal - Zeit : Int // Zeit für Ausschaltverzögerung LT1100 - Aktiv : Bool // Zeit aktivieren - Constant: - ---- NW 1: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3087", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 2: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3086", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 3: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3085", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 4: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3084", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 5: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3083", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 6: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3082", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 7: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3081", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 8: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3080", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 9: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3077", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 10: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3076", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 11: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3075", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 12: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3074", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 13: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3073", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 14: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3072", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 15: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3071", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 16: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3070", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 17: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3067", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 18: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3066", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 19: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3065", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 20: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3064", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 21: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3063", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 22: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3027", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 23: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3026", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 24: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3025", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 25: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3024", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 26: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3023", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 27: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3022", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 28: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3021", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 29: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3020", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 30: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3017", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 31: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3016", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 32: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3015", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 33: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3014", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 34: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3013", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 35: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3012", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 36: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3011", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 37: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3010", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 38: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3007", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 39: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3006", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 40: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3005", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 41: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3435", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 42: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3434", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 43: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3433", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 44: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3432", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 45: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3431", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 46: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3430", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 47: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3427", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 48: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3426", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 49: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3425", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 50: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3424", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 51: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3423", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 52: Stau Sorter Rein A --- -CALL FB "None" , (ESensor:="BG3062", T_Ein:=80, T_Aus:=11, tein_aktiv:="MA0145", taus_aktiv:=TRUE) - - ---- NW 53: Stau Sorter Rein A --- -CALL FB "None" , (ESensor:="BG3061", T_Ein:=80, T_Aus:=11, tein_aktiv:="MA0145", taus_aktiv:=TRUE) - - ---- NW 54: Stau Sorter Rein A --- -CALL FB "None" , (ESensor:="BG3060", T_Ein:=80, T_Aus:=11, tein_aktiv:="MA0145", taus_aktiv:=TRUE) - - ---- NW 55: Stau Sorter Rein B --- -CALL FB "None" , (ESensor:="BG3003", T_Ein:=80, T_Aus:=11, tein_aktiv:="MA0146", taus_aktiv:=TRUE) - - ---- NW 56: Stau Sorter Rein B --- -CALL FB "None" , (ESensor:="BG3002", T_Ein:=80, T_Aus:=11, tein_aktiv:="MA0146", taus_aktiv:=TRUE) - - ---- NW 57: Stau Sorter Rein B --- -CALL FB "None" , (ESensor:="BG3001", T_Ein:=80, T_Aus:=11, tein_aktiv:="MA0146", taus_aktiv:=TRUE) - - ---- NW 58: Stau Sorter Rein B --- -CALL FB "None" , (ESensor:="BG3420", T_Ein:=80, T_Aus:=11, tein_aktiv:="MA0146", taus_aktiv:=TRUE) - - ---- NW 59: Stau Puffer Raus B --- -CALL FB "None" , (ESensor:="BG3481", T_Ein:=80, T_Aus:=11, tein_aktiv:="MA0147", taus_aktiv:=TRUE) - - ---- NW 60: Stau Puffer Raus B --- -CALL FB "None" , (ESensor:="BG3181", T_Ein:=80, T_Aus:=11, tein_aktiv:="MA0147", taus_aktiv:=TRUE) - - ---- NW 61: Stau Puffer Raus B --- -CALL FB "None" , (ESensor:="BG3182", T_Ein:=80, T_Aus:=11, tein_aktiv:="MA0147", taus_aktiv:=TRUE) - - ---- NW 62: Stau Puffer Raus B --- -CALL FB "None" , (ESensor:="BG3183", T_Ein:=80, T_Aus:=11, tein_aktiv:="MA0147", taus_aktiv:=TRUE) - - ---- NW 63: Stau Puffer Raus A --- -CALL FB "None" , (ESensor:="BG3184", T_Ein:=80, T_Aus:=11, tein_aktiv:="MA0150", taus_aktiv:=TRUE) - - ---- NW 64: Stau Puffer Raus A --- -CALL FB "None" , (ESensor:="BG3184", T_Ein:=80, T_Aus:=11, tein_aktiv:="MA0150", taus_aktiv:=TRUE) - - ---- NW 65: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3241", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 66: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3242", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 67: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3243", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 68: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3246", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 69: Sensoren entprellen --- - A "MA0152" - A "MA0145" - = Antrieb - -CALL FB "None" , (ESensor:="BG3120", T_Ein:=01, T_Aus:=100, tein_aktiv:=TRUE, taus_aktiv:=Antrieb) - - ---- NW 70: Sensoren entprellen --- - A "MA0145" - A "MA0146" - = Antrieb - -CALL FB "None" , (ESensor:="BG3003", T_Ein:=01, T_Aus:=100, tein_aktiv:=TRUE, taus_aktiv:=Antrieb) - - ---- NW 71: Ende --- - BE +FUNCTION_BLOCK "VP_Sensoren" +TITLE = Einige Sensoren entprellen Vollpuffer +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + Stau_VP1 : "MSensoren"; + Stau_VP2 : "MSensoren"; + Stau_VP3 : "MSensoren"; + Stau_VP4 : "MSensoren"; + Stau_VP5 : "MSensoren"; + Stau_VP6 : "MSensoren"; + Stau_VP7 : "MSensoren"; + Stau_VP8 : "MSensoren"; + Stau_VP9 : "MSensoren"; + Stau_VP10 : "MSensoren"; + Stau_VP11 : "MSensoren"; + Stau_VP12 : "MSensoren"; + Stau_VP13 : "MSensoren"; + Stau_VP14 : "MSensoren"; + Stau_VP15 : "MSensoren"; + Stau_VP16 : "MSensoren"; + Stau_VP17 : "MSensoren"; + Stau_VP18 : "MSensoren"; + Stau_VP19 : "MSensoren"; + Stau_VP20 : "MSensoren"; + Stau_VP21 : "MSensoren"; + Stau_VP22 : "MSensoren"; + Stau_VP23 : "MSensoren"; + Stau_VP24 : "MSensoren"; + Stau_VP25 : "MSensoren"; + Stau_VP26 : "MSensoren"; + Stau_VP27 : "MSensoren"; + Stau_VP28 : "MSensoren"; + Stau_VP29 : "MSensoren"; + Stau_VP30 : "MSensoren"; + Stau_VP31 : "MSensoren"; + Stau_VP32 : "MSensoren"; + Stau_VP33 : "MSensoren"; + Stau_VP34 : "MSensoren"; + Stau_VP35 : "MSensoren"; + Stau_VP36 : "MSensoren"; + Stau_VP37 : "MSensoren"; + Stau_VP38 : "MSensoren"; + Stau_VP39 : "MSensoren"; + Stau_VP40 : "MSensoren"; + Stau_VP41 : "MSensoren"; + Stau_VP42 : "MSensoren"; + Stau_VP43 : "MSensoren"; + Stau_VP44 : "MSensoren"; + Stau_VP45 : "MSensoren"; + Stau_VP46 : "MSensoren"; + Stau_VP47 : "MSensoren"; + Stau_VP48 : "MSensoren"; + Stau_VP49 : "MSensoren"; + Stau_VP50 : "MSensoren"; + Stau_VP51 : "MSensoren"; + Stau_BG3062 : "MSensoren"; + Stau_BG3061 : "MSensoren"; + Stau_BG3060 : "MSensoren"; + Stau_BG3003 : "MSensoren"; + Stau_BG3002 : "MSensoren"; + Stau_BG3001 : "MSensoren"; + Stau_BG3420 : "MSensoren"; + Stau_BG3481 : "MSensoren"; + Stau_BG3181 : "MSensoren"; + Stau_BG3182 : "MSensoren"; + Stau_BG3183 : "MSensoren"; + Stau_BG3184 : "MSensoren"; + Stau_BG3240 : "MSensoren"; + Stau_BG3241 : "MSensoren"; + Stau_BG3242 : "MSensoren"; + Stau_BG3243 : "MSensoren"; + Stau_BG3246 : "MSensoren"; + An_BG3120 : "MSensoren"; + An_BG3003 : "MSensoren"; + END_VAR + + VAR_TEMP + T_Ein : Int; // Vorgabe Einschaltverzögerung + T_Aus : Int; // Zwischenspeicher Ausschaltverzögerung + F1 : Bool; // Geschwindigkeit 1 aktiviert + F2 : Bool; // Geschwindigkeit 2 aktiviert + F3 : Bool; // Geschwindigkeit 3 aktiviert + ESensor : Bool; // Sensoren + Antrieb : Bool; + VReal : Real; // GeschwindigkeitinReal + Zeit : Int; // Zeit für Ausschaltverzögerung LT1100 + Aktiv : Bool; // Zeit aktivieren + END_VAR + + +BEGIN +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP1 + ( ESensor := "BG3087" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP2 + ( ESensor := "BG3086" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP3 + ( ESensor := "BG3085" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP4 + ( ESensor := "BG3084" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP5 + ( ESensor := "BG3083" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP6 + ( ESensor := "BG3082" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP7 + ( ESensor := "BG3081" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP8 + ( ESensor := "BG3080" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP9 + ( ESensor := "BG3077" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP10 + ( ESensor := "BG3076" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP11 + ( ESensor := "BG3075" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP12 + ( ESensor := "BG3074" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP13 + ( ESensor := "BG3073" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP14 + ( ESensor := "BG3072" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP15 + ( ESensor := "BG3071" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP16 + ( ESensor := "BG3070" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP17 + ( ESensor := "BG3067" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP18 + ( ESensor := "BG3066" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP19 + ( ESensor := "BG3065" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP20 + ( ESensor := "BG3064" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP21 + ( ESensor := "BG3063" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP22 + ( ESensor := "BG3027" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP23 + ( ESensor := "BG3026" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP24 + ( ESensor := "BG3025" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP25 + ( ESensor := "BG3024" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP26 + ( ESensor := "BG3023" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP27 + ( ESensor := "BG3022" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP28 + ( ESensor := "BG3021" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP29 + ( ESensor := "BG3020" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP30 + ( ESensor := "BG3017" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP31 + ( ESensor := "BG3016" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP32 + ( ESensor := "BG3015" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP33 + ( ESensor := "BG3014" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP34 + ( ESensor := "BG3013" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP35 + ( ESensor := "BG3012" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP36 + ( ESensor := "BG3011" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP37 + ( ESensor := "BG3010" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP38 + ( ESensor := "BG3007" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP39 + ( ESensor := "BG3006" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP40 + ( ESensor := "BG3005" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP41 + ( ESensor := "BG3435" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP42 + ( ESensor := "BG3434" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP43 + ( ESensor := "BG3433" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP44 + ( ESensor := "BG3432" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP45 + ( ESensor := "BG3431" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP46 + ( ESensor := "BG3430" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP47 + ( ESensor := "BG3427" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP48 + ( ESensor := "BG3426" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP49 + ( ESensor := "BG3425" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP50 + ( ESensor := "BG3424" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau VollPuffer +//Sensoren entprellen + CALL #Stau_VP51 + ( ESensor := "BG3423" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau Sorter Rein A + CALL #Stau_BG3062 + ( ESensor := "BG3062" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := "MA0145" , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau Sorter Rein A + CALL #Stau_BG3061 + ( ESensor := "BG3061" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := "MA0145" , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau Sorter Rein A + CALL #Stau_BG3060 + ( ESensor := "BG3060" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := "MA0145" , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau Sorter Rein B + CALL #Stau_BG3003 + ( ESensor := "BG3003" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := "MA0146" , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau Sorter Rein B + CALL #Stau_BG3002 + ( ESensor := "BG3002" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := "MA0146" , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau Sorter Rein B + CALL #Stau_BG3001 + ( ESensor := "BG3001" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := "MA0146" , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau Sorter Rein B + CALL #Stau_BG3420 + ( ESensor := "BG3420" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := "MA0146" , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau Puffer Raus B + CALL #Stau_BG3481 + ( ESensor := "BG3481" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := "MA0147" , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau Puffer Raus B + CALL #Stau_BG3181 + ( ESensor := "BG3181" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := "MA0147" , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau Puffer Raus B + CALL #Stau_BG3182 + ( ESensor := "BG3182" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := "MA0147" , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau Puffer Raus B + CALL #Stau_BG3183 + ( ESensor := "BG3183" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := "MA0147" , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau Puffer Raus A + CALL #Stau_BG3184 + ( ESensor := "BG3184" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := "MA0150" , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau Puffer Raus A + CALL #Stau_BG3240 + ( ESensor := "BG3184" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := "MA0150" , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau Fahrstrecke +//Sensoren entprellen + CALL #Stau_BG3241 + ( ESensor := "BG3241" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau Fahrstrecke +//Sensoren entprellen + CALL #Stau_BG3242 + ( ESensor := "BG3242" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau Fahrstrecke +//Sensoren entprellen + CALL #Stau_BG3243 + ( ESensor := "BG3243" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Stau Fahrstrecke +//Sensoren entprellen + CALL #Stau_BG3246 + ( ESensor := "BG3246" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); + +NETWORK +TITLE = Am SynchronPunkt Sorter A +//Sensoren entprellen + U "MA0152"; + U "MA0145"; + = #Antrieb; + + CALL #An_BG3120 + ( ESensor := "BG3120" , + T_Ein := 01 , + T_Aus := 100 , + tein_aktiv := TRUE , + taus_aktiv := #Antrieb + ); + +NETWORK +TITLE = An der Übergabe Sorter A / B +//Sensoren entprellen + U "MA0145"; + U "MA0146"; + = #Antrieb; + + CALL #An_BG3003 + ( ESensor := "BG3003" , + T_Ein := 01 , + T_Aus := 100 , + tein_aktiv := TRUE , + taus_aktiv := #Antrieb + ); + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Basics/VP_Zylinder.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Basics/VP_Zylinder.awl index 3283c55..4482772 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Basics/VP_Zylinder.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Basics/VP_Zylinder.awl @@ -1,855 +1,1810 @@ -=== FB 1192: VP_Zylinder [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Sorter_3121 : "MZylinder" // - Sorter_3123 : "MZylinder" // - Weiche_3120 : "MZylinder" // - Schleuse_3244 : "MZylinder" // - Weiche_3245 : "MZylinder" // - Weiche_VP1 : "MZylinder" // - Weiche_VP2 : "MZylinder" - Weiche_VP3 : "MZylinder" - Weiche_VP4 : "MZylinder" - Weiche_VP5 : "MZylinder" - Weiche_VP6 : "MZylinder" - Weiche_VP7 : "MZylinder" - Weiche_VP8 : "MZylinder" - Weiche_VP9 : "MZylinder" - Weiche_VP10 : "MZylinder" - Weiche_VP11 : "MZylinder" - Weiche_VP12 : "MZylinder" - Weiche_VP13 : "MZylinder" - Weiche_VP14 : "MZylinder" - Weiche_VP15 : "MZylinder" - Weiche_VP16 : "MZylinder" - Weiche_VP17 : "MZylinder" - Weiche_VP18 : "MZylinder" - Weiche_VP19 : "MZylinder" - Weiche_VP20 : "MZylinder" - Weiche_VP21 : "MZylinder" - Weiche_VP22 : "MZylinder" - Weiche_VP23 : "MZylinder" - Weiche_VP24 : "MZylinder" - Weiche_VP25 : "MZylinder" - Weiche_VP26 : "MZylinder" - Weiche_VP27 : "MZylinder" - Weiche_VP28 : "MZylinder" - Weiche_VP29 : "MZylinder" - Weiche_VP30 : "MZylinder" - Weiche_VP31 : "MZylinder" - Weiche_VP32 : "MZylinder" - Weiche_VP33 : "MZylinder" - Weiche_VP34 : "MZylinder" - Weiche_VP35 : "MZylinder" - Weiche_VP36 : "MZylinder" - Weiche_VP37 : "MZylinder" - Weiche_VP38 : "MZylinder" - Weiche_VP39 : "MZylinder" - Weiche_VP40 : "MZylinder" - Weiche_VP41 : "MZylinder" - Weiche_VP42 : "MZylinder" - Weiche_VP43 : "MZylinder" - Weiche_VP44 : "MZylinder" - Weiche_VP45 : "MZylinder" - Weiche_VP46 : "MZylinder" - Weiche_VP47 : "MZylinder" - Weiche_VP48 : "MZylinder" - Weiche_VP49 : "MZylinder" - Weiche_VP50 : "MZylinder" - Weiche_VP51 : "MZylinder" - Schleuse_Mitte_VP1 : "MZylinder" // - Schleuse_Mitte_VP2 : "MZylinder" - Schleuse_Mitte_VP3 : "MZylinder" - Schleuse_Mitte_VP4 : "MZylinder" - Schleuse_Mitte_VP5 : "MZylinder" - Schleuse_Mitte_VP6 : "MZylinder" - Schleuse_Mitte_VP7 : "MZylinder" - Schleuse_Mitte_VP8 : "MZylinder" - Schleuse_Mitte_VP9 : "MZylinder" - Schleuse_Mitte_VP10 : "MZylinder" - Schleuse_Mitte_VP11 : "MZylinder" - Schleuse_Mitte_VP12 : "MZylinder" - Schleuse_Mitte_VP13 : "MZylinder" - Schleuse_Mitte_VP14 : "MZylinder" - Schleuse_Mitte_VP15 : "MZylinder" - Schleuse_Mitte_VP16 : "MZylinder" - Schleuse_Mitte_VP17 : "MZylinder" - Schleuse_Mitte_VP18 : "MZylinder" - Schleuse_Mitte_VP19 : "MZylinder" - Schleuse_Mitte_VP20 : "MZylinder" - Schleuse_Mitte_VP21 : "MZylinder" - Schleuse_Mitte_VP22 : "MZylinder" - Schleuse_Mitte_VP23 : "MZylinder" - Schleuse_Mitte_VP24 : "MZylinder" - Schleuse_Mitte_VP25 : "MZylinder" - Schleuse_Mitte_VP26 : "MZylinder" - Schleuse_Mitte_VP27 : "MZylinder" - Schleuse_Mitte_VP28 : "MZylinder" - Schleuse_Mitte_VP29 : "MZylinder" - Schleuse_Mitte_VP30 : "MZylinder" - Schleuse_Mitte_VP31 : "MZylinder" - Schleuse_Mitte_VP32 : "MZylinder" - Schleuse_Mitte_VP33 : "MZylinder" - Schleuse_Mitte_VP34 : "MZylinder" - Schleuse_Mitte_VP35 : "MZylinder" - Schleuse_Mitte_VP36 : "MZylinder" - Schleuse_Mitte_VP37 : "MZylinder" - Schleuse_Mitte_VP38 : "MZylinder" - Schleuse_Mitte_VP39 : "MZylinder" - Schleuse_Mitte_VP40 : "MZylinder" - Schleuse_Mitte_VP41 : "MZylinder" - Schleuse_Mitte_VP42 : "MZylinder" - Schleuse_Mitte_VP43 : "MZylinder" - Schleuse_Mitte_VP44 : "MZylinder" - Schleuse_Mitte_VP45 : "MZylinder" - Schleuse_Mitte_VP46 : "MZylinder" - Schleuse_Mitte_VP47 : "MZylinder" - Schleuse_Mitte_VP48 : "MZylinder" - Schleuse_Mitte_VP49 : "MZylinder" - Schleuse_Mitte_VP50 : "MZylinder" - Schleuse_Mitte_VP51 : "MZylinder" - Schleuse_Ausfahrt_VP1 : "MZylinder" // - Schleuse_Ausfahrt_VP2 : "MZylinder" - Schleuse_Ausfahrt_VP3 : "MZylinder" - Schleuse_Ausfahrt_VP4 : "MZylinder" - Schleuse_Ausfahrt_VP5 : "MZylinder" - Schleuse_Ausfahrt_VP6 : "MZylinder" - Schleuse_Ausfahrt_VP7 : "MZylinder" - Schleuse_Ausfahrt_VP8 : "MZylinder" - Schleuse_Ausfahrt_VP9 : "MZylinder" - Schleuse_Ausfahrt_VP10 : "MZylinder" - Schleuse_Ausfahrt_VP11 : "MZylinder" - Schleuse_Ausfahrt_VP12 : "MZylinder" - Schleuse_Ausfahrt_VP13 : "MZylinder" - Schleuse_Ausfahrt_VP14 : "MZylinder" - Schleuse_Ausfahrt_VP15 : "MZylinder" - Schleuse_Ausfahrt_VP16 : "MZylinder" - Schleuse_Ausfahrt_VP17 : "MZylinder" - Schleuse_Ausfahrt_VP18 : "MZylinder" - Schleuse_Ausfahrt_VP19 : "MZylinder" - Schleuse_Ausfahrt_VP20 : "MZylinder" - Schleuse_Ausfahrt_VP21 : "MZylinder" - Schleuse_Ausfahrt_VP22 : "MZylinder" - Schleuse_Ausfahrt_VP23 : "MZylinder" - Schleuse_Ausfahrt_VP24 : "MZylinder" - Schleuse_Ausfahrt_VP25 : "MZylinder" - Schleuse_Ausfahrt_VP26 : "MZylinder" - Schleuse_Ausfahrt_VP27 : "MZylinder" - Schleuse_Ausfahrt_VP28 : "MZylinder" - Schleuse_Ausfahrt_VP29 : "MZylinder" - Schleuse_Ausfahrt_VP30 : "MZylinder" - Schleuse_Ausfahrt_VP31 : "MZylinder" - Schleuse_Ausfahrt_VP32 : "MZylinder" - Schleuse_Ausfahrt_VP33 : "MZylinder" - Schleuse_Ausfahrt_VP34 : "MZylinder" - Schleuse_Ausfahrt_VP35 : "MZylinder" - Schleuse_Ausfahrt_VP36 : "MZylinder" - Schleuse_Ausfahrt_VP37 : "MZylinder" - Schleuse_Ausfahrt_VP38 : "MZylinder" - Schleuse_Ausfahrt_VP39 : "MZylinder" - Schleuse_Ausfahrt_VP40 : "MZylinder" - Schleuse_Ausfahrt_VP41 : "MZylinder" - Schleuse_Ausfahrt_VP42 : "MZylinder" - Schleuse_Ausfahrt_VP43 : "MZylinder" - Schleuse_Ausfahrt_VP44 : "MZylinder" - Schleuse_Ausfahrt_VP45 : "MZylinder" - Schleuse_Ausfahrt_VP46 : "MZylinder" - Schleuse_Ausfahrt_VP47 : "MZylinder" - Schleuse_Ausfahrt_VP48 : "MZylinder" - Schleuse_Ausfahrt_VP49 : "MZylinder" - Schleuse_Ausfahrt_VP50 : "MZylinder" - Schleuse_Ausfahrt_VP51 : "MZylinder" - Temp: - Auto : Bool // Automatik ist aktiv - Hand : Bool // Hand ist aktiv - ZylAst : Bool // Zylinder ansteuern - BereichErr_Zusatz_7102 : Bool // Bereichsstörung -> Antrieb stoppen - BereichErr_Zusatz_7104 : Bool // Bereichsstörung -> Antrieb stoppen - BereichErr_Zusatz_7102_7104 : Bool // Bereichsstörung -> Antrieb stoppen - Constant: - ---- NW 1: Übergabe des Bereichstatus System UC071/A01 --- - A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto - -// Bereichhalte: - A( - O "DOutbound_Bereich".A01_UC071.BereichErr - O "DOutbound_Bereich".A01_UZ7102.Area_Stop - ) - AN "SGes".Simulation_ohne_HW_aktiv - = BereichErr_Zusatz_7102 - - A( - O "DOutbound_Bereich".A01_UC071.BereichErr - O "DOutbound_Bereich".A01_UZ7104.Area_Stop - ) - AN "SGes".Simulation_ohne_HW_aktiv - = BereichErr_Zusatz_7104 - - A( - O "DOutbound_Bereich".A01_UC071.BereichErr - O BereichErr_Zusatz_7102 - O BereichErr_Zusatz_7104 - ) - AN "SGes".Simulation_ohne_HW_aktiv - = BereichErr_Zusatz_7102_7104 - - A "DOutbound_Bereich".A01_UC071.BereichErr - JC Next // Zylinder-Stellung nicht mehr ändern - - ---- NW 2: Übergabe Area-Stop 7102 --- - A BereichErr_Zusatz_7102 - JC Next1 // Zylinder-Stellung nicht mehr ändern - - ---- NW 3: Schleuse_3121 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3121", ZylGst:=?) - - ---- NW 4: Schleuse_3123 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3123", ZylGst:=?) - - ---- NW 5: Weiche_3120 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3120", ZylGst:=?) - - ---- NW 6: Weiche_VP1 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3087", ZylGst:=?) - - ---- NW 7: Weiche_VP2 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3086", ZylGst:=?) - - ---- NW 8: Weiche_VP3 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3085", ZylGst:=?) - - ---- NW 9: Weiche_VP4 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3084", ZylGst:=?) - - ---- NW 10: Weiche_VP5 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3083", ZylGst:=?) - - ---- NW 11: Weiche_VP6 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3082", ZylGst:=?) - - ---- NW 12: Weiche_VP7 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3081", ZylGst:=?) - - ---- NW 13: Weiche_VP8 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3080", ZylGst:=?) - - ---- NW 14: Weiche_VP9 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3077", ZylGst:=?) - - ---- NW 15: Weiche_VP10 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3076", ZylGst:=?) - - ---- NW 16: Weiche_VP11 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3075", ZylGst:=?) - - ---- NW 17: Weiche_VP12 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3074", ZylGst:=?) - - ---- NW 18: Weiche_VP13 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3073", ZylGst:=?) - - ---- NW 19: Weiche_VP14 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3072", ZylGst:=?) - - ---- NW 20: Weiche_VP15 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3071", ZylGst:=?) - - ---- NW 21: Weiche_VP16 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3070", ZylGst:=?) - - ---- NW 22: Weiche_VP17 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3067", ZylGst:=?) - - ---- NW 23: Weiche_VP18 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3066", ZylGst:=?) - - ---- NW 24: Weiche_VP19 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3065", ZylGst:=?) - - ---- NW 25: Weiche_VP20 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3064", ZylGst:=?) - - ---- NW 26: Weiche_VP21 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3063", ZylGst:=?) - - ---- NW 27: Weiche_VP22 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3027", ZylGst:=?) - - ---- NW 28: Weiche_VP23 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3026", ZylGst:=?) - - ---- NW 29: Weiche_VP24 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3025", ZylGst:=?) - - ---- NW 30: Weiche_VP25 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3024", ZylGst:=?) - - ---- NW 31: Weiche_VP26 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3023", ZylGst:=?) - - ---- NW 32: Weiche_VP27 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3022", ZylGst:=?) - - ---- NW 33: Weiche_VP28 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3021", ZylGst:=?) - - ---- NW 34: Weiche_VP29 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3020", ZylGst:=?) - - ---- NW 35: Weiche_VP30 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3017", ZylGst:=?) - - ---- NW 36: Weiche_VP31 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3016", ZylGst:=?) - - ---- NW 37: Weiche_VP32 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3015", ZylGst:=?) - - ---- NW 38: Weiche_VP33 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3014", ZylGst:=?) - - ---- NW 39: Weiche_VP34 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3013", ZylGst:=?) - - ---- NW 40: Weiche_VP35 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3012", ZylGst:=?) - - ---- NW 41: Weiche_VP36 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3011", ZylGst:=?) - - ---- NW 42: Weiche_VP37 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3010", ZylGst:=?) - - ---- NW 43: Weiche_VP38 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3007", ZylGst:=?) - - ---- NW 44: Weiche_VP39 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3006", ZylGst:=?) - - ---- NW 45: Weiche_VP40 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3005", ZylGst:=?) - - ---- NW 46: Weiche_VP41 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3435", ZylGst:=?) - - ---- NW 47: Weiche_VP42 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3434", ZylGst:=?) - - ---- NW 48: Weiche_VP43 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3433", ZylGst:=?) - - ---- NW 49: Weiche_VP44 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3432", ZylGst:=?) - - ---- NW 50: Weiche_VP45 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3431", ZylGst:=?) - - ---- NW 51: Weiche_VP46 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3430", ZylGst:=?) - - ---- NW 52: Weiche_VP47 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3427", ZylGst:=?) - - ---- NW 53: Weiche_VP48 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3426", ZylGst:=?) - - ---- NW 54: Weiche_VP49 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3425", ZylGst:=?) - - ---- NW 55: Weiche_VP50 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3424", ZylGst:=?) - - ---- NW 56: Weiche_VP51 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:=?, ZylGst:=?) // "MB3423" - - ---- NW 57: Übergabe Area-Stop 7102_7104 --- -Next1: A BereichErr_Zusatz_7102_7104 - JC Next2 // Zylinder-Stellung nicht mehr ändern - - ---- NW 58: Schleuse_Mitte_VP1 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3114", ZylGst:=?) - - ---- NW 59: Schleuse_Mitte_VP2 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3113", ZylGst:=?) - - ---- NW 60: Schleuse_Mitte_VP3 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3112", ZylGst:=?) - - ---- NW 61: Schleuse_Mitte_VP4 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3111", ZylGst:=?) - - ---- NW 62: Schleuse_Mitte_VP5 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3110", ZylGst:=?) - - ---- NW 63: Schleuse_Mitte_VP6 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3107", ZylGst:=?) - - ---- NW 64: Schleuse_Mitte_VP7 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3106", ZylGst:=?) - - ---- NW 65: Schleuse_Mitte_VP8 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3105", ZylGst:=?) - - ---- NW 66: Schleuse_Mitte_VP9 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3104", ZylGst:=?) - - ---- NW 67: Schleuse_Mitte_VP10 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3103", ZylGst:=?) - - ---- NW 68: Schleuse_Mitte_VP11 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3102", ZylGst:=?) - - ---- NW 69: Schleuse_Mitte_VP12 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3101", ZylGst:=?) - - ---- NW 70: Schleuse_Mitte_VP13 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3100", ZylGst:=?) - - ---- NW 71: Schleuse_Mitte_VP14 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3097", ZylGst:=?) - - ---- NW 72: Schleuse_Mitte_VP15 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3096", ZylGst:=?) - - ---- NW 73: Schleuse_Mitte_VP16 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3095", ZylGst:=?) - - ---- NW 74: Schleuse_Mitte_VP17 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3094", ZylGst:=?) - - ---- NW 75: Schleuse_Mitte_VP18 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3093", ZylGst:=?) - - ---- NW 76: Schleuse_Mitte_VP19 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3092", ZylGst:=?) - - ---- NW 77: Schleuse_Mitte_VP20 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3091", ZylGst:=?) - - ---- NW 78: Schleuse_Mitte_VP21 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3090", ZylGst:=?) - - ---- NW 79: Schleuse_Mitte_VP22 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3052", ZylGst:=?) - - ---- NW 80: Schleuse_Mitte_VP23 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3051", ZylGst:=?) - - ---- NW 81: Schleuse_Mitte_VP24 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3050", ZylGst:=?) - - ---- NW 82: Schleuse_Mitte_VP25 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3047", ZylGst:=?) - - ---- NW 83: Schleuse_Mitte_VP26 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3046", ZylGst:=?) - - ---- NW 84: Schleuse_Mitte_VP27 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3045", ZylGst:=?) - - ---- NW 85: Schleuse_Mitte_VP28 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3044", ZylGst:=?) - - ---- NW 86: Schleuse_Mitte_VP29 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3043", ZylGst:=?) - - ---- NW 87: Schleuse_Mitte_VP30 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3042", ZylGst:=?) - - ---- NW 88: Schleuse_Mitte_VP31 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3041", ZylGst:=?) - - ---- NW 89: Schleuse_Mitte_VP32 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3040", ZylGst:=?) - - ---- NW 90: Schleuse_Mitte_VP33 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3037", ZylGst:=?) - - ---- NW 91: Schleuse_Mitte_VP34 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3036", ZylGst:=?) - - ---- NW 92: Schleuse_Mitte_VP35 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3035", ZylGst:=?) - - ---- NW 93: Schleuse_Mitte_VP36 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3034", ZylGst:=?) - - ---- NW 94: Schleuse_Mitte_VP37 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3033", ZylGst:=?) - - ---- NW 95: Schleuse_Mitte_VP38 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3032", ZylGst:=?) - - ---- NW 96: Schleuse_Mitte_VP39 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3031", ZylGst:=?) - - ---- NW 97: Schleuse_Mitte_VP40 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3030", ZylGst:=?) - - ---- NW 98: Schleuse_Mitte_VP41 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3462", ZylGst:=?) - - ---- NW 99: Schleuse_Mitte_VP42 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3461", ZylGst:=?) - - ---- NW 100: Schleuse_Mitte_VP43 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3460", ZylGst:=?) - - ---- NW 101: Schleuse_Mitte_VP44 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3457", ZylGst:=?) - - ---- NW 102: Schleuse_Mitte_VP45 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3456", ZylGst:=?) - - ---- NW 103: Schleuse_Mitte_VP46 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3455", ZylGst:=?) - - ---- NW 104: Schleuse_Mitte_VP47 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3454", ZylGst:=?) - - ---- NW 105: Schleuse_Mitte_VP48 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3453", ZylGst:=?) - - ---- NW 106: Schleuse_Mitte_VP49 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3452", ZylGst:=?) - - ---- NW 107: Schleuse_Mitte_VP50 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3451", ZylGst:=?) - - ---- NW 108: Schleuse_Mitte_VP51 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3450", ZylGst:=?) - - ---- NW 109: Übergabe Area-Stop 7104 --- -Next2: A BereichErr_Zusatz_7104 - JC Next // Zylinder-Stellung nicht mehr ändern - - ---- NW 110: Schleuse_Ausfahrt_VP1 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3273", ZylGst:=?) - - ---- NW 111: Schleuse_Ausfahrt_VP2 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3272", ZylGst:=?) - - ---- NW 112: Schleuse_Ausfahrt_VP3 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3271", ZylGst:=?) - - ---- NW 113: Schleuse_Ausfahrt_VP4 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3270", ZylGst:=?) - - ---- NW 114: Schleuse_Ausfahrt_VP5 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3267", ZylGst:=?) - - ---- NW 115: Schleuse_Ausfahrt_VP6 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3266", ZylGst:=?) - - ---- NW 116: Schleuse_Ausfahrt_VP7 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3265", ZylGst:=?) - - ---- NW 117: Schleuse_Ausfahrt_VP8 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3264", ZylGst:=?) - - ---- NW 118: Schleuse_Ausfahrt_VP9 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3263", ZylGst:=?) - - ---- NW 119: Schleuse_Ausfahrt_VP10 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3262", ZylGst:=?) - - ---- NW 120: Schleuse_Ausfahrt_VP11 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3261", ZylGst:=?) - - ---- NW 121: Schleuse_Ausfahrt_VP12 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3260", ZylGst:=?) - - ---- NW 122: Schleuse_Ausfahrt_VP13 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3257", ZylGst:=?) - - ---- NW 123: Schleuse_Ausfahrt_VP14 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3256", ZylGst:=?) - - ---- NW 124: Schleuse_Ausfahrt_VP15 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3255", ZylGst:=?) - - ---- NW 125: Schleuse_Ausfahrt_VP16 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3254", ZylGst:=?) - - ---- NW 126: Schleuse_Ausfahrt_VP17 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3253", ZylGst:=?) - - ---- NW 127: Schleuse_Ausfahrt_VP18 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3252", ZylGst:=?) - - ---- NW 128: Schleuse_Ausfahrt_VP19 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3215", ZylGst:=?) - - ---- NW 129: Schleuse_Ausfahrt_VP20 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3214", ZylGst:=?) - - ---- NW 130: Schleuse_Ausfahrt_VP21 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3213", ZylGst:=?) - - ---- NW 131: Schleuse_Ausfahrt_VP22 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3212", ZylGst:=?) - - ---- NW 132: Schleuse_Ausfahrt_VP23 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3211", ZylGst:=?) - - ---- NW 133: Schleuse_Ausfahrt_VP24 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3210", ZylGst:=?) - - ---- NW 134: Schleuse_Ausfahrt_VP25 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3207", ZylGst:=?) - - ---- NW 135: Schleuse_Ausfahrt_VP26 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3206", ZylGst:=?) - - ---- NW 136: Schleuse_Ausfahrt_VP27 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3205", ZylGst:=?) - - ---- NW 137: Schleuse_Ausfahrt_VP28 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3204", ZylGst:=?) - - ---- NW 138: Schleuse_Ausfahrt_VP29 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3203", ZylGst:=?) - - ---- NW 139: Schleuse_Ausfahrt_VP30 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3202", ZylGst:=?) - - ---- NW 140: Schleuse_Ausfahrt_VP31 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3201", ZylGst:=?) - - ---- NW 141: Schleuse_Ausfahrt_VP32 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3200", ZylGst:=?) - - ---- NW 142: Schleuse_Ausfahrt_VP33 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3197", ZylGst:=?) - - ---- NW 143: Schleuse_Ausfahrt_VP34 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3196", ZylGst:=?) - - ---- NW 144: Schleuse_Ausfahrt_VP35 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3195", ZylGst:=?) - - ---- NW 145: Schleuse_Ausfahrt_VP36 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3194", ZylGst:=?) - - ---- NW 146: Schleuse_Ausfahrt_VP37 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3193", ZylGst:=?) - - ---- NW 147: Schleuse_Ausfahrt_VP38 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3192", ZylGst:=?) - - ---- NW 148: Schleuse_Ausfahrt_VP39 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3191", ZylGst:=?) - - ---- NW 149: Schleuse_Ausfahrt_VP40 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3190", ZylGst:=?) - - ---- NW 150: Schleuse_Ausfahrt_VP41 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3494", ZylGst:=?) - - ---- NW 151: Schleuse_Ausfahrt_VP42 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3493", ZylGst:=?) - - ---- NW 152: Schleuse_Ausfahrt_VP43 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3492", ZylGst:=?) - - ---- NW 153: Schleuse_Ausfahrt_VP44 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3491", ZylGst:=?) - - ---- NW 154: Schleuse_Ausfahrt_VP45 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3490", ZylGst:=?) - - ---- NW 155: Schleuse_Ausfahrt_VP46 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3487", ZylGst:=?) - - ---- NW 156: Schleuse_Ausfahrt_VP47 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3486", ZylGst:=?) - - ---- NW 157: Schleuse_Ausfahrt_VP48 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3485", ZylGst:=?) - - ---- NW 158: Schleuse_Ausfahrt_VP49 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3484", ZylGst:=?) - - ---- NW 159: Schleuse_Ausfahrt_VP50 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3483", ZylGst:=?) - - ---- NW 160: Schleuse_Ausfahrt_VP51 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3482", ZylGst:=?) - - ---- NW 161: Schleuse_3244 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3244", ZylGst:=?) - - ---- NW 162: Weiche_3245 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3245", ZylGst:=?) - - ---- NW 163: Ende --- -Next: BE +FUNCTION_BLOCK "VP_Zylinder" +TITLE = Zylinder Outbound Vollpuffer +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 + VAR + Sorter_3121 : "MZylinder"; // + Sorter_3123 : "MZylinder"; // + Weiche_3120 : "MZylinder"; // + Schleuse_3244 : "MZylinder"; // + Weiche_3245 : "MZylinder"; // + Weiche_VP1 : "MZylinder"; // + Weiche_VP2 : "MZylinder"; + Weiche_VP3 : "MZylinder"; + Weiche_VP4 : "MZylinder"; + Weiche_VP5 : "MZylinder"; + Weiche_VP6 : "MZylinder"; + Weiche_VP7 : "MZylinder"; + Weiche_VP8 : "MZylinder"; + Weiche_VP9 : "MZylinder"; + Weiche_VP10 : "MZylinder"; + Weiche_VP11 : "MZylinder"; + Weiche_VP12 : "MZylinder"; + Weiche_VP13 : "MZylinder"; + Weiche_VP14 : "MZylinder"; + Weiche_VP15 : "MZylinder"; + Weiche_VP16 : "MZylinder"; + Weiche_VP17 : "MZylinder"; + Weiche_VP18 : "MZylinder"; + Weiche_VP19 : "MZylinder"; + Weiche_VP20 : "MZylinder"; + Weiche_VP21 : "MZylinder"; + Weiche_VP22 : "MZylinder"; + Weiche_VP23 : "MZylinder"; + Weiche_VP24 : "MZylinder"; + Weiche_VP25 : "MZylinder"; + Weiche_VP26 : "MZylinder"; + Weiche_VP27 : "MZylinder"; + Weiche_VP28 : "MZylinder"; + Weiche_VP29 : "MZylinder"; + Weiche_VP30 : "MZylinder"; + Weiche_VP31 : "MZylinder"; + Weiche_VP32 : "MZylinder"; + Weiche_VP33 : "MZylinder"; + Weiche_VP34 : "MZylinder"; + Weiche_VP35 : "MZylinder"; + Weiche_VP36 : "MZylinder"; + Weiche_VP37 : "MZylinder"; + Weiche_VP38 : "MZylinder"; + Weiche_VP39 : "MZylinder"; + Weiche_VP40 : "MZylinder"; + Weiche_VP41 : "MZylinder"; + Weiche_VP42 : "MZylinder"; + Weiche_VP43 : "MZylinder"; + Weiche_VP44 : "MZylinder"; + Weiche_VP45 : "MZylinder"; + Weiche_VP46 : "MZylinder"; + Weiche_VP47 : "MZylinder"; + Weiche_VP48 : "MZylinder"; + Weiche_VP49 : "MZylinder"; + Weiche_VP50 : "MZylinder"; + Weiche_VP51 : "MZylinder"; + Schleuse_Mitte_VP1 : "MZylinder"; // + Schleuse_Mitte_VP2 : "MZylinder"; + Schleuse_Mitte_VP3 : "MZylinder"; + Schleuse_Mitte_VP4 : "MZylinder"; + Schleuse_Mitte_VP5 : "MZylinder"; + Schleuse_Mitte_VP6 : "MZylinder"; + Schleuse_Mitte_VP7 : "MZylinder"; + Schleuse_Mitte_VP8 : "MZylinder"; + Schleuse_Mitte_VP9 : "MZylinder"; + Schleuse_Mitte_VP10 : "MZylinder"; + Schleuse_Mitte_VP11 : "MZylinder"; + Schleuse_Mitte_VP12 : "MZylinder"; + Schleuse_Mitte_VP13 : "MZylinder"; + Schleuse_Mitte_VP14 : "MZylinder"; + Schleuse_Mitte_VP15 : "MZylinder"; + Schleuse_Mitte_VP16 : "MZylinder"; + Schleuse_Mitte_VP17 : "MZylinder"; + Schleuse_Mitte_VP18 : "MZylinder"; + Schleuse_Mitte_VP19 : "MZylinder"; + Schleuse_Mitte_VP20 : "MZylinder"; + Schleuse_Mitte_VP21 : "MZylinder"; + Schleuse_Mitte_VP22 : "MZylinder"; + Schleuse_Mitte_VP23 : "MZylinder"; + Schleuse_Mitte_VP24 : "MZylinder"; + Schleuse_Mitte_VP25 : "MZylinder"; + Schleuse_Mitte_VP26 : "MZylinder"; + Schleuse_Mitte_VP27 : "MZylinder"; + Schleuse_Mitte_VP28 : "MZylinder"; + Schleuse_Mitte_VP29 : "MZylinder"; + Schleuse_Mitte_VP30 : "MZylinder"; + Schleuse_Mitte_VP31 : "MZylinder"; + Schleuse_Mitte_VP32 : "MZylinder"; + Schleuse_Mitte_VP33 : "MZylinder"; + Schleuse_Mitte_VP34 : "MZylinder"; + Schleuse_Mitte_VP35 : "MZylinder"; + Schleuse_Mitte_VP36 : "MZylinder"; + Schleuse_Mitte_VP37 : "MZylinder"; + Schleuse_Mitte_VP38 : "MZylinder"; + Schleuse_Mitte_VP39 : "MZylinder"; + Schleuse_Mitte_VP40 : "MZylinder"; + Schleuse_Mitte_VP41 : "MZylinder"; + Schleuse_Mitte_VP42 : "MZylinder"; + Schleuse_Mitte_VP43 : "MZylinder"; + Schleuse_Mitte_VP44 : "MZylinder"; + Schleuse_Mitte_VP45 : "MZylinder"; + Schleuse_Mitte_VP46 : "MZylinder"; + Schleuse_Mitte_VP47 : "MZylinder"; + Schleuse_Mitte_VP48 : "MZylinder"; + Schleuse_Mitte_VP49 : "MZylinder"; + Schleuse_Mitte_VP50 : "MZylinder"; + Schleuse_Mitte_VP51 : "MZylinder"; + Schleuse_Ausfahrt_VP1 : "MZylinder"; // + Schleuse_Ausfahrt_VP2 : "MZylinder"; + Schleuse_Ausfahrt_VP3 : "MZylinder"; + Schleuse_Ausfahrt_VP4 : "MZylinder"; + Schleuse_Ausfahrt_VP5 : "MZylinder"; + Schleuse_Ausfahrt_VP6 : "MZylinder"; + Schleuse_Ausfahrt_VP7 : "MZylinder"; + Schleuse_Ausfahrt_VP8 : "MZylinder"; + Schleuse_Ausfahrt_VP9 : "MZylinder"; + Schleuse_Ausfahrt_VP10 : "MZylinder"; + Schleuse_Ausfahrt_VP11 : "MZylinder"; + Schleuse_Ausfahrt_VP12 : "MZylinder"; + Schleuse_Ausfahrt_VP13 : "MZylinder"; + Schleuse_Ausfahrt_VP14 : "MZylinder"; + Schleuse_Ausfahrt_VP15 : "MZylinder"; + Schleuse_Ausfahrt_VP16 : "MZylinder"; + Schleuse_Ausfahrt_VP17 : "MZylinder"; + Schleuse_Ausfahrt_VP18 : "MZylinder"; + Schleuse_Ausfahrt_VP19 : "MZylinder"; + Schleuse_Ausfahrt_VP20 : "MZylinder"; + Schleuse_Ausfahrt_VP21 : "MZylinder"; + Schleuse_Ausfahrt_VP22 : "MZylinder"; + Schleuse_Ausfahrt_VP23 : "MZylinder"; + Schleuse_Ausfahrt_VP24 : "MZylinder"; + Schleuse_Ausfahrt_VP25 : "MZylinder"; + Schleuse_Ausfahrt_VP26 : "MZylinder"; + Schleuse_Ausfahrt_VP27 : "MZylinder"; + Schleuse_Ausfahrt_VP28 : "MZylinder"; + Schleuse_Ausfahrt_VP29 : "MZylinder"; + Schleuse_Ausfahrt_VP30 : "MZylinder"; + Schleuse_Ausfahrt_VP31 : "MZylinder"; + Schleuse_Ausfahrt_VP32 : "MZylinder"; + Schleuse_Ausfahrt_VP33 : "MZylinder"; + Schleuse_Ausfahrt_VP34 : "MZylinder"; + Schleuse_Ausfahrt_VP35 : "MZylinder"; + Schleuse_Ausfahrt_VP36 : "MZylinder"; + Schleuse_Ausfahrt_VP37 : "MZylinder"; + Schleuse_Ausfahrt_VP38 : "MZylinder"; + Schleuse_Ausfahrt_VP39 : "MZylinder"; + Schleuse_Ausfahrt_VP40 : "MZylinder"; + Schleuse_Ausfahrt_VP41 : "MZylinder"; + Schleuse_Ausfahrt_VP42 : "MZylinder"; + Schleuse_Ausfahrt_VP43 : "MZylinder"; + Schleuse_Ausfahrt_VP44 : "MZylinder"; + Schleuse_Ausfahrt_VP45 : "MZylinder"; + Schleuse_Ausfahrt_VP46 : "MZylinder"; + Schleuse_Ausfahrt_VP47 : "MZylinder"; + Schleuse_Ausfahrt_VP48 : "MZylinder"; + Schleuse_Ausfahrt_VP49 : "MZylinder"; + Schleuse_Ausfahrt_VP50 : "MZylinder"; + Schleuse_Ausfahrt_VP51 : "MZylinder"; + END_VAR + + VAR_TEMP + Auto : Bool; // Automatik ist aktiv + Hand : Bool; // Hand ist aktiv + ZylAst : Bool; // Zylinder ansteuern + BereichErr_Zusatz_7102 : Bool; // Bereichsstörung -> Antrieb stoppen + BereichErr_Zusatz_7104 : Bool; // Bereichsstörung -> Antrieb stoppen + BereichErr_Zusatz_7102_7104 : Bool; // Bereichsstörung -> Antrieb stoppen + END_VAR + + +BEGIN +NETWORK +TITLE = Übergabe des Bereichstatus System UC071/A01 + U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; + +//Bereichhalte: + U(; + O "DOutbound_Bereich".A01_UC071.BereichErr; + O "DOutbound_Bereich".A01_UZ7102.Area_Stop; + ); + UN "SGes".Simulation_ohne_HW_aktiv; + = #BereichErr_Zusatz_7102; + + U(; + O "DOutbound_Bereich".A01_UC071.BereichErr; + O "DOutbound_Bereich".A01_UZ7104.Area_Stop; + ); + UN "SGes".Simulation_ohne_HW_aktiv; + = #BereichErr_Zusatz_7104; + + U(; + O "DOutbound_Bereich".A01_UC071.BereichErr; + O #BereichErr_Zusatz_7102; + O #BereichErr_Zusatz_7104; + ); + UN "SGes".Simulation_ohne_HW_aktiv; + = #BereichErr_Zusatz_7102_7104; + + U "DOutbound_Bereich".A01_UC071.BereichErr; + SPB Next ;//Zylinder-Stellung nicht mehr ändern + +NETWORK +TITLE = Übergabe Area-Stop 7102 + U #BereichErr_Zusatz_7102; + SPB Next1 ;//Zylinder-Stellung nicht mehr ändern + +NETWORK +TITLE = Schleuse_3121 + CALL #Sorter_3121 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3121" + ); + +NETWORK +TITLE = Schleuse_3123 + CALL #Sorter_3123 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3123" + ); + +NETWORK +TITLE = Weiche_3120 + CALL #Weiche_3120 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3120" + ); + +NETWORK +TITLE = Weiche_VP1 + CALL #Weiche_VP1 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3087" + ); + +NETWORK +TITLE = Weiche_VP2 + CALL #Weiche_VP2 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3086" + ); + +NETWORK +TITLE = Weiche_VP3 + CALL #Weiche_VP3 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3085" + ); + +NETWORK +TITLE = Weiche_VP4 + CALL #Weiche_VP4 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3084" + ); + +NETWORK +TITLE = Weiche_VP5 + CALL #Weiche_VP5 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3083" + ); + +NETWORK +TITLE = Weiche_VP6 + CALL #Weiche_VP6 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3082" + ); + +NETWORK +TITLE = Weiche_VP7 + CALL #Weiche_VP7 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3081" + ); + +NETWORK +TITLE = Weiche_VP8 + CALL #Weiche_VP8 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3080" + ); + +NETWORK +TITLE = Weiche_VP9 + CALL #Weiche_VP9 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3077" + ); + +NETWORK +TITLE = Weiche_VP10 + CALL #Weiche_VP10 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3076" + ); + +NETWORK +TITLE = Weiche_VP11 + CALL #Weiche_VP11 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3075" + ); + +NETWORK +TITLE = Weiche_VP12 + CALL #Weiche_VP12 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3074" + ); + +NETWORK +TITLE = Weiche_VP13 + CALL #Weiche_VP13 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3073" + ); + +NETWORK +TITLE = Weiche_VP14 + CALL #Weiche_VP14 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3072" + ); + +NETWORK +TITLE = Weiche_VP15 + CALL #Weiche_VP15 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3071" + ); + +NETWORK +TITLE = Weiche_VP16 + CALL #Weiche_VP16 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3070" + ); + +NETWORK +TITLE = Weiche_VP17 + CALL #Weiche_VP17 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3067" + ); + +NETWORK +TITLE = Weiche_VP18 + CALL #Weiche_VP18 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3066" + ); + +NETWORK +TITLE = Weiche_VP19 + CALL #Weiche_VP19 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3065" + ); + +NETWORK +TITLE = Weiche_VP20 + CALL #Weiche_VP20 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3064" + ); + +NETWORK +TITLE = Weiche_VP21 + CALL #Weiche_VP21 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3063" + ); + +NETWORK +TITLE = Weiche_VP22 + CALL #Weiche_VP22 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3027" + ); + +NETWORK +TITLE = Weiche_VP23 + CALL #Weiche_VP23 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3026" + ); + +NETWORK +TITLE = Weiche_VP24 + CALL #Weiche_VP24 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3025" + ); + +NETWORK +TITLE = Weiche_VP25 + CALL #Weiche_VP25 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3024" + ); + +NETWORK +TITLE = Weiche_VP26 + CALL #Weiche_VP26 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3023" + ); + +NETWORK +TITLE = Weiche_VP27 + CALL #Weiche_VP27 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3022" + ); + +NETWORK +TITLE = Weiche_VP28 + CALL #Weiche_VP28 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3021" + ); + +NETWORK +TITLE = Weiche_VP29 + CALL #Weiche_VP29 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3020" + ); + +NETWORK +TITLE = Weiche_VP30 + CALL #Weiche_VP30 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3017" + ); + +NETWORK +TITLE = Weiche_VP31 + CALL #Weiche_VP31 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3016" + ); + +NETWORK +TITLE = Weiche_VP32 + CALL #Weiche_VP32 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3015" + ); + +NETWORK +TITLE = Weiche_VP33 + CALL #Weiche_VP33 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3014" + ); + +NETWORK +TITLE = Weiche_VP34 + CALL #Weiche_VP34 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3013" + ); + +NETWORK +TITLE = Weiche_VP35 + CALL #Weiche_VP35 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3012" + ); + +NETWORK +TITLE = Weiche_VP36 + CALL #Weiche_VP36 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3011" + ); + +NETWORK +TITLE = Weiche_VP37 + CALL #Weiche_VP37 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3010" + ); + +NETWORK +TITLE = Weiche_VP38 + CALL #Weiche_VP38 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3007" + ); + +NETWORK +TITLE = Weiche_VP39 + CALL #Weiche_VP39 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3006" + ); + +NETWORK +TITLE = Weiche_VP40 + CALL #Weiche_VP40 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3005" + ); + +NETWORK +TITLE = Weiche_VP41 + CALL #Weiche_VP41 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3435" + ); + +NETWORK +TITLE = Weiche_VP42 + CALL #Weiche_VP42 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3434" + ); + +NETWORK +TITLE = Weiche_VP43 + CALL #Weiche_VP43 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3433" + ); + +NETWORK +TITLE = Weiche_VP44 + CALL #Weiche_VP44 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3432" + ); + +NETWORK +TITLE = Weiche_VP45 + CALL #Weiche_VP45 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3431" + ); + +NETWORK +TITLE = Weiche_VP46 + CALL #Weiche_VP46 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3430" + ); + +NETWORK +TITLE = Weiche_VP47 + CALL #Weiche_VP47 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3427" + ); + +NETWORK +TITLE = Weiche_VP48 + CALL #Weiche_VP48 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3426" + ); + +NETWORK +TITLE = Weiche_VP49 + CALL #Weiche_VP49 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3425" + ); + +NETWORK +TITLE = Weiche_VP50 + CALL #Weiche_VP50 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3424" + ); + +NETWORK +TITLE = Weiche_VP51 + CALL #Weiche_VP51 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := //"MB3423" + ); + +NETWORK +TITLE = Übergabe Area-Stop 7102_7104 +Next1: U #BereichErr_Zusatz_7102_7104; + SPB Next2 ;//Zylinder-Stellung nicht mehr ändern + +NETWORK +TITLE = Schleuse_Mitte_VP1 + CALL #Schleuse_Mitte_VP1 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3114" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP2 + CALL #Schleuse_Mitte_VP2 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3113" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP3 + CALL #Schleuse_Mitte_VP3 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3112" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP4 + CALL #Schleuse_Mitte_VP4 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3111" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP5 + CALL #Schleuse_Mitte_VP5 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3110" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP6 + CALL #Schleuse_Mitte_VP6 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3107" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP7 + CALL #Schleuse_Mitte_VP7 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3106" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP8 + CALL #Schleuse_Mitte_VP8 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3105" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP9 + CALL #Schleuse_Mitte_VP9 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3104" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP10 + CALL #Schleuse_Mitte_VP10 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3103" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP11 + CALL #Schleuse_Mitte_VP11 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3102" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP12 + CALL #Schleuse_Mitte_VP12 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3101" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP13 + CALL #Schleuse_Mitte_VP13 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3100" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP14 + CALL #Schleuse_Mitte_VP14 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3097" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP15 + CALL #Schleuse_Mitte_VP15 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3096" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP16 + CALL #Schleuse_Mitte_VP16 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3095" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP17 + CALL #Schleuse_Mitte_VP17 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3094" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP18 + CALL #Schleuse_Mitte_VP18 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3093" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP19 + CALL #Schleuse_Mitte_VP19 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3092" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP20 + CALL #Schleuse_Mitte_VP20 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3091" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP21 + CALL #Schleuse_Mitte_VP21 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3090" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP22 + CALL #Schleuse_Mitte_VP22 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3052" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP23 + CALL #Schleuse_Mitte_VP23 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3051" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP24 + CALL #Schleuse_Mitte_VP24 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3050" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP25 + CALL #Schleuse_Mitte_VP25 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3047" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP26 + CALL #Schleuse_Mitte_VP26 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3046" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP27 + CALL #Schleuse_Mitte_VP27 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3045" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP28 + CALL #Schleuse_Mitte_VP28 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3044" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP29 + CALL #Schleuse_Mitte_VP29 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3043" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP30 + CALL #Schleuse_Mitte_VP30 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3042" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP31 + CALL #Schleuse_Mitte_VP31 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3041" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP32 + CALL #Schleuse_Mitte_VP32 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3040" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP33 + CALL #Schleuse_Mitte_VP33 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3037" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP34 + CALL #Schleuse_Mitte_VP34 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3036" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP35 + CALL #Schleuse_Mitte_VP35 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3035" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP36 + CALL #Schleuse_Mitte_VP36 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3034" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP37 + CALL #Schleuse_Mitte_VP37 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3033" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP38 + CALL #Schleuse_Mitte_VP38 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3032" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP39 + CALL #Schleuse_Mitte_VP39 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3031" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP40 + CALL #Schleuse_Mitte_VP40 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3030" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP41 + CALL #Schleuse_Mitte_VP41 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3462" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP42 + CALL #Schleuse_Mitte_VP42 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3461" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP43 + CALL #Schleuse_Mitte_VP43 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3460" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP44 + CALL #Schleuse_Mitte_VP44 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3457" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP45 + CALL #Schleuse_Mitte_VP45 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3456" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP46 + CALL #Schleuse_Mitte_VP46 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3455" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP47 + CALL #Schleuse_Mitte_VP47 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3454" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP48 + CALL #Schleuse_Mitte_VP48 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3453" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP49 + CALL #Schleuse_Mitte_VP49 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3452" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP50 + CALL #Schleuse_Mitte_VP50 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3451" + ); + +NETWORK +TITLE = Schleuse_Mitte_VP51 + CALL #Schleuse_Mitte_VP51 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3450" + ); + +NETWORK +TITLE = Übergabe Area-Stop 7104 +Next2: U #BereichErr_Zusatz_7104; + SPB Next ;//Zylinder-Stellung nicht mehr ändern + +NETWORK +TITLE = Schleuse_Ausfahrt_VP1 + CALL #Schleuse_Ausfahrt_VP1 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3273" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP2 + CALL #Schleuse_Ausfahrt_VP2 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3272" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP3 + CALL #Schleuse_Ausfahrt_VP3 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3271" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP4 + CALL #Schleuse_Ausfahrt_VP4 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3270" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP5 + CALL #Schleuse_Ausfahrt_VP5 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3267" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP6 + CALL #Schleuse_Ausfahrt_VP6 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3266" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP7 + CALL #Schleuse_Ausfahrt_VP7 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3265" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP8 + CALL #Schleuse_Ausfahrt_VP8 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3264" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP9 + CALL #Schleuse_Ausfahrt_VP9 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3263" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP10 + CALL #Schleuse_Ausfahrt_VP10 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3262" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP11 + CALL #Schleuse_Ausfahrt_VP11 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3261" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP12 + CALL #Schleuse_Ausfahrt_VP12 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3260" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP13 + CALL #Schleuse_Ausfahrt_VP13 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3257" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP14 + CALL #Schleuse_Ausfahrt_VP14 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3256" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP15 + CALL #Schleuse_Ausfahrt_VP15 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3255" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP16 + CALL #Schleuse_Ausfahrt_VP16 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3254" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP17 + CALL #Schleuse_Ausfahrt_VP17 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3253" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP18 + CALL #Schleuse_Ausfahrt_VP18 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3252" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP19 + CALL #Schleuse_Ausfahrt_VP19 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3215" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP20 + CALL #Schleuse_Ausfahrt_VP20 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3214" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP21 + CALL #Schleuse_Ausfahrt_VP21 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3213" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP22 + CALL #Schleuse_Ausfahrt_VP22 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3212" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP23 + CALL #Schleuse_Ausfahrt_VP23 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3211" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP24 + CALL #Schleuse_Ausfahrt_VP24 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3210" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP25 + CALL #Schleuse_Ausfahrt_VP25 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3207" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP26 + CALL #Schleuse_Ausfahrt_VP26 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3206" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP27 + CALL #Schleuse_Ausfahrt_VP27 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3205" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP28 + CALL #Schleuse_Ausfahrt_VP28 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3204" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP29 + CALL #Schleuse_Ausfahrt_VP29 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3203" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP30 + CALL #Schleuse_Ausfahrt_VP30 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3202" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP31 + CALL #Schleuse_Ausfahrt_VP31 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3201" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP32 + CALL #Schleuse_Ausfahrt_VP32 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3200" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP33 + CALL #Schleuse_Ausfahrt_VP33 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3197" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP34 + CALL #Schleuse_Ausfahrt_VP34 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3196" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP35 + CALL #Schleuse_Ausfahrt_VP35 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3195" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP36 + CALL #Schleuse_Ausfahrt_VP36 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3194" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP37 + CALL #Schleuse_Ausfahrt_VP37 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3193" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP38 + CALL #Schleuse_Ausfahrt_VP38 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3192" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP39 + CALL #Schleuse_Ausfahrt_VP39 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3191" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP40 + CALL #Schleuse_Ausfahrt_VP40 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3190" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP41 + CALL #Schleuse_Ausfahrt_VP41 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3494" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP42 + CALL #Schleuse_Ausfahrt_VP42 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3493" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP43 + CALL #Schleuse_Ausfahrt_VP43 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3492" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP44 + CALL #Schleuse_Ausfahrt_VP44 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3491" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP45 + CALL #Schleuse_Ausfahrt_VP45 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3490" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP46 + CALL #Schleuse_Ausfahrt_VP46 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3487" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP47 + CALL #Schleuse_Ausfahrt_VP47 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3486" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP48 + CALL #Schleuse_Ausfahrt_VP48 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3485" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP49 + CALL #Schleuse_Ausfahrt_VP49 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3484" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP50 + CALL #Schleuse_Ausfahrt_VP50 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3483" + ); + +NETWORK +TITLE = Schleuse_Ausfahrt_VP51 + CALL #Schleuse_Ausfahrt_VP51 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3482" + ); + +NETWORK +TITLE = Schleuse_3244 + CALL #Schleuse_3244 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3244" + ); + +NETWORK +TITLE = Weiche_3245 + CALL #Weiche_3245 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3245" + ); + +NETWORK +TITLE = Ende +Next: BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Omnifahren_Vollpuffer/VP_Draussen_FC.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Omnifahren_Vollpuffer/VP_Draussen_FC.awl index c44da40..abc5cb5 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Omnifahren_Vollpuffer/VP_Draussen_FC.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Omnifahren_Vollpuffer/VP_Draussen_FC.awl @@ -1,84 +1,94 @@ -=== FC 1182: VP_Draussen_FC [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Constant: - Return: - Ret_Val : Void +FUNCTION "VP_Draussen_FC" : Void +TITLE = Draussen-FC: VollPuffer +{ S7_Optimized_Access := 'FALSE' ; S7_Pass_Registers := 'TRUE' } +AUTHOR : AE +VERSION : 0.1 ---- NW 1: Rückmeldung --- - SET // Rückmeldungen erst mal resetten - R "M180.6" // Weiterfahrt von Ziel-FC erlaubt +BEGIN +NETWORK +TITLE = Rückmeldung + SET;//Rückmeldungen erst mal resetten + R "M180.6";//Weiterfahrt von Ziel-FC erlaubt +NETWORK +TITLE = Schleuse 3121 (Sorter VP_A von KontrollPlatz): Ausgefahren ? + L "MW190"; + L 3121 ;//Aufruf von Schleuse 3121 ? + <>I;//Nein! + SPB X3121E; ---- NW 2: Schleuse 3121 (Sorter VP_A von KontrollPlatz): Ausgefahren ? --- - L "MW190" - L 3121 // Aufruf von Schleuse 3121 ? - <>I // Nein! - JC X3121E + L "MD182" ;//ShopGroup - L "MD182" // ShopGroup + L "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_IDX; - L "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_IDX + CALL "Reservierung_in_Puffer_eintragen" + ( TrolleyID := "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_IDX , + Ziel := "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_DEST_Ziel , + ShopGroup := "MD182" , + Gesamt_Trolley_DL := 1000 + ); -CALL FC "Reservierung_in_Puffer_eintragen" (TrolleyID:="DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_IDX, Ziel:="DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_DEST_Ziel, ShopGroup:="MD182", Gesamt_Trolley_DL:=1000) +//Daten in Sep 3121 löschen: + L DINT#0; + T "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_IDX;//IDX + L 0; + T "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_DEST_Ziel; -// Daten in Sep 3121 löschen: - L DINT#0 - T "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_IDX // IDX - L 0 - T "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_DEST_Ziel +//Bei Partner (Schleuse 3123) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf) + L 0; + T "DVP_OmniFahren".Schleuse_3123.Dyn.Sk.Akt_Schritt; -// Bei Partner (Schleuse 3123) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf) - L 0 - T "DVP_OmniFahren".Schleuse_3123.Dyn.Sk.Akt_Schritt + L DINT#0; + T "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_IDX;//IDX + L 0; + T "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_DEST_Ziel; - L DINT#0 - T "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_IDX // IDX - L 0 - T "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_DEST_Ziel + BEA; - BEU +X3121E: NOP 0; -X3121E: NOP 0 +NETWORK +TITLE = Schleuse 3123 (Sorter VP_A von RückführStrecke): Ausgefahren ? + L "MW190"; + L 3123 ;//Aufruf von Schleuse 3123 ? + <>I;//Nein! + SPB X3123E; + SET; +/// R "M83.1" ---- NW 3: Schleuse 3123 (Sorter VP_A von RückführStrecke): Ausgefahren ? --- - L "MW190" - L 3123 // Aufruf von Schleuse 3123 ? - <>I // Nein! - JC X3123E + L "MD182" ;//ShopGroup + L "DVP_OmniFahren".Schleuse_3123.Dyn.Trolley_ShopGroup;//Shop-Gruppe - SET -// / R "M83.1" + CALL "Reservierung_in_Puffer_eintragen" + ( TrolleyID := "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_IDX , + Ziel := "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_DEST_Ziel , + ShopGroup := "MD182" , + Gesamt_Trolley_DL := 1000 + ); - L "MD182" // ShopGroup - L "DVP_OmniFahren".Schleuse_3123.Dyn.Trolley_ShopGroup // Shop-Gruppe +//Daten in Sep 3123 löschen: + L DINT#0; + T "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_IDX;//IDX + L 0; + T "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_DEST_Ziel; -CALL FC "Reservierung_in_Puffer_eintragen" (TrolleyID:="DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_IDX, Ziel:="DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_DEST_Ziel, ShopGroup:="MD182", Gesamt_Trolley_DL:=1000) +//Bei Partner (Schleuse 3121) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf) + L 0; + T "DVP_OmniFahren".Schleuse_3121.Dyn.Sk.Akt_Schritt; -// Daten in Sep 3123 löschen: - L DINT#0 - T "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_IDX // IDX - L 0 - T "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_DEST_Ziel + L DINT#0; + T "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_IDX;//IDX + L 0; + T "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_DEST_Ziel; -// Bei Partner (Schleuse 3121) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf) - L 0 - T "DVP_OmniFahren".Schleuse_3121.Dyn.Sk.Akt_Schritt + BEA; - L DINT#0 - T "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_IDX // IDX - L 0 - T "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_DEST_Ziel +X3123E: NOP 0; - BEU +NETWORK +TITLE = Ende + BE; -X3123E: NOP 0 - - ---- NW 4: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Omnifahren_Vollpuffer/VP_Leser_FC.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Omnifahren_Vollpuffer/VP_Leser_FC.awl index 3d58f30..7a68b85 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Omnifahren_Vollpuffer/VP_Leser_FC.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Omnifahren_Vollpuffer/VP_Leser_FC.awl @@ -1,101 +1,120 @@ -=== FC 1180: VP_Leser_FC [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Zielebene : Word - Constant: - Return: - Ret_Val : Void - ---- NW 1: Rückmeldung --- -// Keine - L 0 // Evtl. Zwischenziel (MW196) - T "MW196" +FUNCTION "VP_Leser_FC" : Void +TITLE = Leser-FC: Vollpuffer +{ S7_Optimized_Access := 'FALSE' ; S7_Pass_Registers := 'TRUE' } +AUTHOR : AE +VERSION : 0.1 + VAR_TEMP + Zielebene : Word; + END_VAR ---- NW 2: Schleuse 3121: (Sorter VP A / KontrollPlatz) --- - L "MW190" // Schleusen-Nr. - L 3121 // Aufruf von Schleuse ? - <>I // Nein! - JC X3121E +BEGIN +NETWORK +TITLE = Rückmeldung - AN "M180.0" // Lesefehler - JC Y3121 + //Keine + L 0;//Evtl. Zwischenziel (MW196) + T "MW196"; - BEU +NETWORK +TITLE = Schleuse 3121: (Sorter VP A / KontrollPlatz) + L "MW190" ;//Schleusen-Nr. + L 3121 ;//Aufruf von Schleuse ? + <>I;//Nein! + SPB X3121E; -Y3121: AN "M180.1" // unbekannt in TrolleysDL - BEC + UN "M180.0";//Lesefehler + SPB Y3121; -// Daten in Datenbank erzeugen: - L "DVP_OmniFahren".Schleuse_3121.Dyn.TrolleyID_Schleuse - L DINT#0 // ID bekannt? - ==D // Nein - BEC + BEA; -// /In Zukunft Anfrage bei Host! -CALL FC "Trolleydaten_neu_anlegen" (Gesamt_Trolley_DL:="DVP_OmniFahren".Schleuse_3121.Schleuse.Gesamt_Trolley_DL, TrolleyID:="DVP_OmniFahren".Schleuse_3121.Dyn.TrolleyID_Schleuse, Endziel:=16#0000, ShopGroup:=DINT#815) // / +Y3121: UN "M180.1" ;//unbekannt in TrolleysDL + BEB; - BEU +//Daten in Datenbank erzeugen: + L "DVP_OmniFahren".Schleuse_3121.Dyn.TrolleyID_Schleuse; + L DINT#0 ;//ID bekannt? + ==D;//Nein + BEB; -X3121E: NOP 0 +///In Zukunft Anfrage bei Host! + CALL "Trolleydaten_neu_anlegen" + ( Gesamt_Trolley_DL := "DVP_OmniFahren".Schleuse_3121.Schleuse.Gesamt_Trolley_DL , + TrolleyID := "DVP_OmniFahren".Schleuse_3121.Dyn.TrolleyID_Schleuse , + Endziel := 16#0000 , + ShopGroup := DINT#815 /// + ); + BEA; ---- NW 3: Schleuse 3123: (Sorter VP A / RückführStecke) --- - L "MW190" // Schleusen-Nr. - L 3123 // Aufruf von Schleuse ? - <>I // Nein! - JC X3123E +X3121E: NOP 0; - AN "M180.0" // Lesefehler - JC Y3123 +NETWORK +TITLE = Schleuse 3123: (Sorter VP A / RückführStecke) + L "MW190" ;//Schleusen-Nr. + L 3123 ;//Aufruf von Schleuse ? + <>I;//Nein! + SPB X3123E; - BEU + UN "M180.0";//Lesefehler + SPB Y3123; -Y3123: AN "M180.1" // unbekannt in TrolleysDL - BEC + BEA; -// Daten in Datenbank erzeugen: - L "DVP_OmniFahren".Schleuse_3123.Dyn.TrolleyID_Schleuse - L DINT#0 // ID bekannt? - ==D // Nein - BEC +Y3123: UN "M180.1" ;//unbekannt in TrolleysDL + BEB; -// /In Zukunft Anfrage bei Host! -CALL FC "Trolleydaten_neu_anlegen" (Gesamt_Trolley_DL:="DVP_OmniFahren".Schleuse_3123.Schleuse.Gesamt_Trolley_DL, TrolleyID:="DVP_OmniFahren".Schleuse_3123.Dyn.TrolleyID_Schleuse, Endziel:=16#0000, ShopGroup:=DINT#815) // / +//Daten in Datenbank erzeugen: + L "DVP_OmniFahren".Schleuse_3123.Dyn.TrolleyID_Schleuse; + L DINT#0 ;//ID bekannt? + ==D;//Nein + BEB; - BEU +///In Zukunft Anfrage bei Host! + CALL "Trolleydaten_neu_anlegen" + ( Gesamt_Trolley_DL := "DVP_OmniFahren".Schleuse_3123.Schleuse.Gesamt_Trolley_DL , + TrolleyID := "DVP_OmniFahren".Schleuse_3123.Dyn.TrolleyID_Schleuse , + Endziel := 16#0000 , + ShopGroup := DINT#815 /// + ); -X3123E: NOP 0 + BEA; +X3123E: NOP 0; ---- NW 4: Schleuse 3244: (nach Puffer-Ausfahrt) --- - L "MW190" // Schleusen-Nr. - L 3244 // Aufruf von Schleuse ? - <>I // Nein! - JC X3244E +NETWORK +TITLE = Schleuse 3244: (nach Puffer-Ausfahrt) + L "MW190" ;//Schleusen-Nr. + L 3244 ;//Aufruf von Schleuse ? + <>I;//Nein! + SPB X3244E; - AN "M180.0" // Lesefehler - JC Y3244 + UN "M180.0";//Lesefehler + SPB Y3244; - SET -// / S "DVP_OmniFahren".Schleuse_3244.Dyn.HMI.Abzweig_fahren/// + SET; +/// S "DVP_OmniFahren".Schleuse_3244.Dyn.HMI.Abzweig_fahren/// - BEU + BEA; -Y3244: AN "M180.1" // unbekannt in TrolleysDL - BEC +Y3244: UN "M180.1" ;//unbekannt in TrolleysDL + BEB; -// /In Zukunft Anfrage bei Host! -CALL FC "Trolleydaten_neu_anlegen" (Gesamt_Trolley_DL:="DVP_OmniFahren".Schleuse_3244.Schleuse.Gesamt_Trolley_DL, TrolleyID:="DVP_OmniFahren".Schleuse_3244.Dyn.TrolleyID_Schleuse, Endziel:=16#0000, ShopGroup:=815) // Erst mal, da kein Host! | / +///In Zukunft Anfrage bei Host! + CALL "Trolleydaten_neu_anlegen"//Erst mal, da kein Host! + ( Gesamt_Trolley_DL := "DVP_OmniFahren".Schleuse_3244.Schleuse.Gesamt_Trolley_DL , + TrolleyID := "DVP_OmniFahren".Schleuse_3244.Dyn.TrolleyID_Schleuse , + Endziel := 16#0000 , + ShopGroup := 815 /// + ); - BEU + BEA; -X3244E: NOP 0 +X3244E: NOP 0; +NETWORK +TITLE = Ende + BE; ---- NW 5: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Omnifahren_Vollpuffer/VP_OmniFahren.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Omnifahren_Vollpuffer/VP_OmniFahren.awl index 59f05c9..fabe3c5 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Omnifahren_Vollpuffer/VP_OmniFahren.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Omnifahren_Vollpuffer/VP_OmniFahren.awl @@ -1,191 +1,270 @@ -=== FB 1128: VP_OmniFahren [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Schleuse_3121 : "MHMOmniSchleuse" - Schleuse_3123 : "MHMOmniSchleuse" - Schleuse_3244 : "MHMOmniSchleuse_Plus" - Weiche_3245 : "MHMOmniWeiche_Plus" - Trolleys_starten : Struct - Flanke : Bool - Wartezeit_aktiv : Bool - Timer_Wartenzeit : Int - Einfahrt_VP : Struct - 3121_stop : Bool - 3123_stop : Bool - 3121_Ziel : Int - 3123_Ziel : Int - Ausfahrt_VP : Struct - 3244_stop : Bool - 3244_Ziel : Word - Temp: - ErrQuit : Bool - ErrAnz : Bool - Stau_raus : Bool - Start_ok : Bool - B_aktiv : Bool - B_vor_Schleuse : Bool - B_nach_Schleuse : Bool - Antrieb_aktiv : Bool - Antrieb_vor : Bool - Antrieb_stop : Bool - Fahren_Ok : Bool - PS_aktivieren : Bool - Constant: +FUNCTION_BLOCK "VP_OmniFahren" +TITLE = Omnifahren Outbound Vollpuffer +{ S7_Optimized_Access := 'FALSE' } +VERSION : 0.1 + VAR + Schleuse_3121 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Schleuse_3123 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Schleuse_3244 { S7_SetPoint := 'False'} : "MHMOmniSchleuse_Plus"; + Weiche_3245 : "MHMOmniWeiche_Plus"; + Trolleys_starten : Struct + Flanke : Bool; + Wartezeit_aktiv : Bool; + Timer_Wartenzeit { S7_SetPoint := 'True'} : Int; + END_STRUCT; + Einfahrt_VP : Struct + "3121_stop" : Bool; + "3123_stop" : Bool; + "3121_Ziel" : Int; + "3123_Ziel" : Int; + END_STRUCT; + Ausfahrt_VP : Struct + "3244_stop" : Bool; + "3244_Ziel" : Word; + END_STRUCT; + END_VAR ---- NW 1: Systemzeug --- -// VollPuffer-Bereich: - A "DOutbound_Bereich".A01_UH07.AnlageEin - = Schleuse_3121.Dyn.Sk.Auto_akt - = Schleuse_3123.Dyn.Sk.Auto_akt - = Schleuse_3244.Dyn.Sk.Auto_akt - = Weiche_3245.Dyn.Status.Auto_akt - - AN "DOutbound_Bereich".A01_UC071.BereichErr - = Schleuse_3121.Dyn.Sk.Bereich_ok - = Schleuse_3123.Dyn.Sk.Bereich_ok - = Schleuse_3244.Dyn.Sk.Bereich_ok - = Weiche_3245.Dyn.Status.Bereich_ok + VAR_TEMP + ErrQuit : Bool; + ErrAnz : Bool; + Stau_raus : Bool; + Start_ok : Bool; + B_aktiv : Bool; + B_vor_Schleuse : Bool; + B_nach_Schleuse : Bool; + Antrieb_aktiv : Bool; + Antrieb_vor : Bool; + Antrieb_stop : Bool; + Fahren_Ok : Bool; + PS_aktivieren : Bool; + END_VAR ---- NW 2: Störungen quittieren UZ7102 --- - A "DOutbound_Bereich".A01_UZ7102.StOk_aktiv - O "DOutbound_Bereich".A01_UC071.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit +BEGIN +NETWORK +TITLE = Systemzeug +//VollPuffer-Bereich: + U "DOutbound_Bereich".A01_UH07.AnlageEin; + = #Schleuse_3121.Dyn.Sk.Auto_akt; + = #Schleuse_3123.Dyn.Sk.Auto_akt; + = #Schleuse_3244.Dyn.Sk.Auto_akt; + = #Weiche_3245.Dyn.Status.Auto_akt; ---- NW 3: Schleuse 3121 --- -CALL FB "None" , (Schleusen_Nr:=3121, ErrQuit:=ErrQuit, B_VorSchleuse:="BG3127", B_InSchleuse:="BG3121", B_AusSchleuse:=?, B_Stau_raus:=?, Start_Ok:=?, Antrieb_Schleuse_aktiv:="MA0144", Antrieb_plus_aktiv:=?, Schleuse_geöffnet:="MB3121", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:=?, Error:=DB708.DBW500, Antrieb_Schleuse_vor:="DHWtoVP_Antriebe".MA0144.Stat.A_vor, Antrieb_Schleuse_start:="DHWtoVP_Antriebe".MA0144.Stat.A_start, Antrieb_Schleuse_stop:="DHWtoVP_Antriebe".MA0144.Stat.Stop_vor, Antrieb_Schleuse_PS:="DHWtoVP_Antriebe".MA0144.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) // weiterfahrt über Sorter-Sep | weiterfahrt über Sorter-Sep + UN "DOutbound_Bereich".A01_UC071.BereichErr; + = #Schleuse_3121.Dyn.Sk.Bereich_ok; + = #Schleuse_3123.Dyn.Sk.Bereich_ok; + = #Schleuse_3244.Dyn.Sk.Bereich_ok; + = #Weiche_3245.Dyn.Status.Bereich_ok; - AN Schleuse_3121.Dyn.Status.Reset_aktiv - JC NoR3121 +NETWORK +TITLE = Störungen quittieren UZ7102 + U "DOutbound_Bereich".A01_UZ7102.StOk_aktiv; + O "DOutbound_Bereich".A01_UC071.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; - L DINT#0 - T "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_IDX // IDX - L 0 - T "DVP_Sorter_A".Sorter_MB3121.Separator.Default_Ziel - T "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_DEST_Ziel +NETWORK +TITLE = Schleuse 3121 + CALL #Schleuse_3121 + ( Schleusen_Nr := 3121 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG3127" , + B_InSchleuse := "BG3121" , + B_AusSchleuse := , //weiterfahrt über Sorter-Sep + Antrieb_Schleuse_aktiv := "MA0144" , + Schleuse_geöffnet := "MB3121" , + Y_Schleuse_Auf := , //weiterfahrt über Sorter-Sep + Error := %DB708.DBW500 , + Antrieb_Schleuse_vor := "DHWtoVP_Antriebe".MA0144.Stat.A_vor , + Antrieb_Schleuse_start := "DHWtoVP_Antriebe".MA0144.Stat.A_start , + Antrieb_Schleuse_stop := "DHWtoVP_Antriebe".MA0144.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DHWtoVP_Antriebe".MA0144.Stat.A_PS , + hStOk := #ErrAnz + ); -NoR3121: NOP 0 + UN #Schleuse_3121.Dyn.Status.Reset_aktiv; + SPB NoR3121; + L DINT#0; + T "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_IDX;//IDX + L 0; + T "DVP_Sorter_A".Sorter_MB3121.Separator.Default_Ziel; + T "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_DEST_Ziel; ---- NW 4: Schleuse 3123 --- -CALL FB "None" , (Schleusen_Nr:=3123, ErrQuit:=ErrQuit, B_VorSchleuse:="BG3243", B_InSchleuse:="BG3123", B_AusSchleuse:=?, B_Stau_raus:=?, Start_Ok:=?, Antrieb_Schleuse_aktiv:="MA0152", Antrieb_plus_aktiv:=?, Schleuse_geöffnet:="MB3123", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:=?, Error:=DB708.DBW502, Antrieb_Schleuse_vor:="DVP_Antriebe".MA0152.Stat.A_vor, Antrieb_Schleuse_start:="DVP_Antriebe".MA0152.Stat.A_start, Antrieb_Schleuse_stop:="DVP_Antriebe".MA0152.Stat.Stop_vor, Antrieb_Schleuse_PS:="DVP_Antriebe".MA0152.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) // weiterfahrt über Sorter-Sep | weiterfahrt über Sorter-Sep +NoR3121: NOP 0; - AN Schleuse_3123.Dyn.Status.Reset_aktiv - JC NoR3123 +NETWORK +TITLE = Schleuse 3123 + CALL #Schleuse_3123 + ( Schleusen_Nr := 3123 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG3243" , + B_InSchleuse := "BG3123" , + B_AusSchleuse := , //weiterfahrt über Sorter-Sep + Antrieb_Schleuse_aktiv := "MA0152" , + Schleuse_geöffnet := "MB3123" , + Y_Schleuse_Auf := , //weiterfahrt über Sorter-Sep + Error := %DB708.DBW502 , + Antrieb_Schleuse_vor := "DVP_Antriebe".MA0152.Stat.A_vor , + Antrieb_Schleuse_start := "DVP_Antriebe".MA0152.Stat.A_start , + Antrieb_Schleuse_stop := "DVP_Antriebe".MA0152.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DVP_Antriebe".MA0152.Stat.A_PS , + hStOk := #ErrAnz + ); - L DINT#0 - T "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_IDX // IDX - L 0 - T "DVP_Sorter_A".Sorter_MB3123.Separator.Default_Ziel - T "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_DEST_Ziel + UN #Schleuse_3123.Dyn.Status.Reset_aktiv; + SPB NoR3123; -NoR3123: NOP 0 + L DINT#0; + T "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_IDX;//IDX + L 0; + T "DVP_Sorter_A".Sorter_MB3123.Separator.Default_Ziel; + T "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_DEST_Ziel; +NoR3123: NOP 0; ---- NW 5: Störungen anzeigen UZ7102 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7102.StOk_blinken - S "DOutbound_Bereich".A01_UC071.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken +NETWORK +TITLE = Störungen anzeigen UZ7102 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7102.StOk_blinken; + S "DOutbound_Bereich".A01_UC071.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; +NETWORK +TITLE = Störungen quittieren UZ7105 + U "DOutbound_Bereich".A01_UZ7105.StOk_aktiv; + O "DOutbound_Bereich".A01_UC071.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; ---- NW 6: Störungen quittieren UZ7105 --- - A "DOutbound_Bereich".A01_UZ7105.StOk_aktiv - O "DOutbound_Bereich".A01_UC071.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit +NETWORK +TITLE = Wartezeit bis erneuter Trolleystart sinnvoll (wegen Staubildung) + U "MB3244"; + FP #Trolleys_starten.Flanke; + S #Trolleys_starten.Wartezeit_aktiv; + SPBN Warten ;//Negierter Sprung + L 15 ;//Wartezeit in Sekunden + T #Trolleys_starten.Timer_Wartenzeit; ---- NW 7: Wartezeit bis erneuter Trolleystart sinnvoll (wegen Staubildung) --- - A "MB3244" - Rise Trolleys_starten.Flanke - S Trolleys_starten.Wartezeit_aktiv - JCN Warten // Negierter Sprung +Warten: UN #Trolleys_starten.Wartezeit_aktiv; + O; + U "MB3244";//Schleuse offen + UN "MA0150";//Aber Trolley fährt nicht + ON "1s-Impuls"; + SPB Wait; - L 15 // Wartezeit in Sekunden - T Trolleys_starten.Timer_Wartenzeit + L #Trolleys_starten.Timer_Wartenzeit; + + -1; + T #Trolleys_starten.Timer_Wartenzeit; + L 0; + >I; + SPB Wait; -Warten: AN Trolleys_starten.Wartezeit_aktiv - O - A "MB3244" // Schleuse offen - AN "MA0150" // Aber Trolley fährt nicht - ON "1s-Impuls" - JC Wait + SET; + R #Trolleys_starten.Wartezeit_aktiv; - L Trolleys_starten.Timer_Wartenzeit - + -1 - T Trolleys_starten.Timer_Wartenzeit - L 0 - >I - JC Wait +Wait: NOP 0; - SET - R Trolleys_starten.Wartezeit_aktiv +NETWORK +TITLE = Schleuse 3244 + SET; + R #PS_aktivieren; -Wait: NOP 0 + UN #Trolleys_starten.Wartezeit_aktiv; + = #Fahren_Ok; + CALL #Schleuse_3244 + ( Schleusen_Nr := 3244 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG3242" , + B_InSchleuse := "BG3244" , + B_Zähl := , //Über Weiche +1 + B_Stau_raus := , //Ziel-FC + Start_Ok := #Fahren_Ok , + Antrieb_Schleuse_aktiv := "MA0150" , + Antrieb_plus_aktiv := "MA0152" , + Schleuse_geöffnet := "MB3244" , + Y_Schleuse_Auf := "DVP_Zylinder".Schleuse_3244.Stat.Ast , + Error := %DB708.DBW516 , + Antrieb_Schleuse_vor := "DVP_Antriebe".MA0150.Stat.A_vor , + Antrieb_Schleuse_start := "DVP_Antriebe".MA0150.Stat.A_start , + Antrieb_Schleuse_stop := "DVP_Antriebe".MA0150.Stat.Stop_vor , + Antrieb_Schleuse_PS := #PS_aktivieren , + Antrieb_plus_vor := "DVP_Antriebe".MA0152.Stat.A_vor , + Antrieb_plus_start := "DVP_Antriebe".MA0152.Stat.A_start , + hStOk := #ErrAnz + ); ---- NW 8: Schleuse 3244 --- - SET - R PS_aktivieren + U #PS_aktivieren; + L s5t#40s; + SE "T28"; - AN Trolleys_starten.Wartezeit_aktiv - = Fahren_Ok + U "T28"; + = "DVP_Antriebe".MA0150.Stat.A_PS; -CALL FB "None" , (Schleusen_Nr:=3244, ErrQuit:=ErrQuit, B_VorSchleuse:="BG3242", B_InSchleuse:="BG3244", B_Zähl:=?, B_Stau_raus:=?, Start_Ok:=Fahren_Ok, Antrieb_Schleuse_aktiv:="MA0150", Antrieb_plus_aktiv:="MA0152", Schleuse_geöffnet:="MB3244", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DVP_Zylinder".Schleuse_3244.Stat.Ast, Error:=DB708.DBW516, Antrieb_Schleuse_vor:="DVP_Antriebe".MA0150.Stat.A_vor, Antrieb_Schleuse_start:="DVP_Antriebe".MA0150.Stat.A_start, Antrieb_Schleuse_stop:="DVP_Antriebe".MA0150.Stat.Stop_vor, Antrieb_Schleuse_PS:=PS_aktivieren, Antrieb_plus_vor:="DVP_Antriebe".MA0152.Stat.A_vor, Antrieb_plus_start:="DVP_Antriebe".MA0152.Stat.A_start, hStOk:=ErrAnz) // Über Weiche +1 | Ziel-FC +NETWORK +TITLE = Weiche 3245 + U "MA0150"; + U "MA0152"; + = #Antrieb_aktiv; + SET; + R #Antrieb_vor; + R #Antrieb_stop; - A PS_aktivieren - L s5t#40s - OnDelay "T28" + CALL #Weiche_3245 + ( Weichen_Nr := 3245 , + ErrQuit := #ErrQuit , + Fahren_Ok := 1 , + B_Ziel_gerade := "BG3246" , + B_Ziel_abzweig := "BG3243" , + Antrieb_Weiche_aktiv := #Antrieb_aktiv , + Antrieb_Gerade_aktiv := "MA0151" , + Antrieb_Abzweig_aktiv := "MA0152" , + Weiche_ist_AST := "MB3245" , + Y_Weiche_abzweig := "DVP_Zylinder".Weiche_3245.Stat.Ast , + Error := %DB708.DBW518 , + Antrieb_Weiche_vor := #Antrieb_vor , + Antrieb_Weiche_stop := #Antrieb_stop , + Antrieb_Weiche_gerade_vor := "DVPtoEP_Antriebe".MA0151.Stat.A_vor , + Antrieb_Weiche_gerade_stop := "DVPtoEP_Antriebe".MA0151.Stat.Stop_vor , + Antrieb_Weiche_abzweig_vor := "DVP_Antriebe".MA0152.Stat.A_vor , + Antrieb_Weiche_abzweig_stop := "DVP_Antriebe".MA0152.Stat.Stop_vor , + hStOk := #ErrAnz + ); - A "T28" - = "DVP_Antriebe".MA0150.Stat.A_PS + U #Antrieb_vor; + U(; + UN "MB3245";//Weiche gerade + UN "DVP_Sensoren".Stau_BG3246.Stat.B_Akt; + O; + U "MB3245" ;//Weiche auf Abzweig + UN "DVP_Sensoren".Stau_BG3243.Stat.B_Akt; + ); + S "DVP_Antriebe".MA0150.Stat.A_vor; + U #Antrieb_vor; + S "DVP_Antriebe".MA0152.Stat.A_vor; + S "DVP_Antriebe".MA0150.Stat.A_start; + S "DVP_Antriebe".MA0152.Stat.A_start; ---- NW 9: Weiche 3245 --- - A "MA0150" - A "MA0152" - = Antrieb_aktiv - SET - R Antrieb_vor - R Antrieb_stop + U #Antrieb_stop; + S "DVP_Antriebe".MA0150.Stat.Stop_vor; +/// S "DVP_Antriebe".MA0152.Stat.Stop_vor //Sonst Blockade -CALL FB "None" , (Weichen_Nr:=3245, ErrQuit:=ErrQuit, Fahren_Ok:=1, B_Ziel_gerade:="BG3246", B_Ziel_abzweig:="BG3243", Antrieb_Weiche_aktiv:=Antrieb_aktiv, Antrieb_Gerade_aktiv:="MA0151", Antrieb_Abzweig_aktiv:="MA0152", Weiche_ist_AST:="MB3245", Y_Weiche_gerade:=?, Y_Weiche_abzweig:="DVP_Zylinder".Weiche_3245.Stat.Ast, Error:=DB708.DBW518, Antrieb_Weiche_vor:=Antrieb_vor, Antrieb_Weiche_stop:=Antrieb_stop, Antrieb_Weiche_gerade_vor:="DVPtoEP_Antriebe".MA0151.Stat.A_vor, Antrieb_Weiche_gerade_stop:="DVPtoEP_Antriebe".MA0151.Stat.Stop_vor, Antrieb_Weiche_abzweig_vor:="DVP_Antriebe".MA0152.Stat.A_vor, Antrieb_Weiche_abzweig_stop:="DVP_Antriebe".MA0152.Stat.Stop_vor, hStOk:=ErrAnz) +NETWORK +TITLE = Störungen anzeigen UZ7105 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7105.StOk_blinken; + S "DOutbound_Bereich".A01_UC071.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; - A Antrieb_vor - A( - AN "MB3245" // Weiche gerade - AN "DVP_Sensoren".Stau_BG3246.Stat.B_Akt - O - A "MB3245" // Weiche auf Abzweig - AN "DVP_Sensoren".Stau_BG3243.Stat.B_Akt - ) - S "DVP_Antriebe".MA0150.Stat.A_vor +NETWORK +TITLE = Ende + BE; - A Antrieb_vor - S "DVP_Antriebe".MA0152.Stat.A_vor - S "DVP_Antriebe".MA0150.Stat.A_start - S "DVP_Antriebe".MA0152.Stat.A_start - - A Antrieb_stop - S "DVP_Antriebe".MA0150.Stat.Stop_vor -// / S "DVP_Antriebe".MA0152.Stat.Stop_vor //Sonst Blockade - - ---- NW 10: Störungen anzeigen UZ7105 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7105.StOk_blinken - S "DOutbound_Bereich".A01_UC071.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 11: Ende --- - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Omnifahren_Vollpuffer/VP_Ziel_FC.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Omnifahren_Vollpuffer/VP_Ziel_FC.awl index 10a69b2..091ebfb 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Omnifahren_Vollpuffer/VP_Ziel_FC.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Omnifahren_Vollpuffer/VP_Ziel_FC.awl @@ -1,424 +1,487 @@ -=== FC 1181: VP_Ziel_FC [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Ziel_hex : Word - Ziel_int : Int - Zielebene : Word - Error : Byte - Position : Int - Lager_DB : Int - Lager_DW : Int - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - SSDW : Int - EndZiel : Word - Variante : Int - AbrufID : DInt - Fahrlisten_TrolleyID : DInt - Fahrlisten_AbrufID : DInt - Fahrlisten_Lager : Int - ZielGruppe : Word - Trolley_unbekannt : Bool // Trolley ist nicht in DL - Express_Abruf : Bool - Error.Bit : Bool - Constant: - Return: - Ret_Val : Void - ---- NW 1: Rückmeldung --- - SET // Rückmeldungen erst mal resetten - R "M180.6" // Weiterfahrt von Ziel-FC erlaubt - - ---- NW 2: Schleuse 3121: Weiterfahren erlaubt ? (Sorter VP_A von KontrollPlatz) --- - L "MW190" - L 3121 // Aufruf von Schleuse 3121 ? - <>I // Nein! - JC X3121E - - L "VP_TravelFIFO_A".Travel_FIFO_BG3120.FIFO.ANZAHL - L 0 // Daten noch im Travel-FIFO? - <>I // Ja ! - O "MB3121" // Trolley fährt schon - O "DVP_OmniFahren".Einfahrt_VP."3121_stop" - BEC - - L 0 - T Ziel_hex - - A "SGes".Ohne_PC_Fahren // Also Ziel simulieren - JC Sim3121 - - AN "DVP_OmniFahren".Schleuse_3121.Status2.Telegramm_gesendet - JC T3121 - -// Shop-Group definiert ? - L "MD182" // ShopGroup - L DINT#0 // bekannt? - <>D // Ja ! - A( - CAC - L DINT#0815 // bekannt? - <>D // Ja ! - O "SGes".Ohne_PC_Fahren // 815 nur ohne PC fahren Ok! - ) - JC VP3121 - -// Erneute Anfrage bei Host! - A "10s-Impuls" - R "DVP_OmniFahren".Schleuse_3121.Status2.Telegramm_gesendet - - BEU - -// Voll-Puffer ermitteln oder Ziel schon fest? -VP3121: L Ziel_hex // Evtl. von Simulation - L 16#0 // schon angegeben? - <>I // Ja! - JC ZielFest3121 - -CALL FC "ShopGroup to Rein-Lager ermitteln" (ShopGroup:="MD182", Puffer:=Ziel_hex) - -// Ziel = Voll-Lager? -ZielFest3121: L Ziel_hex - L 16#F000 - AW - L 16#B000 // Ziel = VollLager ? - ==I // Ja! - R "7_HMI_Err_UH07_OB".Logistik.Kein_Platz_im_VollLager - JC LagerOk_3121 - - SET - S "7_HMI_Err_UH07_OB".Logistik.Kein_Platz_im_VollLager - - BEU // Nicht ins Lager fahren ! - -LagerOk_3121: L Ziel_hex - L 16#FFF - AW - BTI // Damit Int 101-151 als Ziel ! - T Ziel_int - -// Check, ob Ziel-Lager Inilauf aktiv hat: - T "MW220" - -CALL FC "DatenOut" (SSDB:=275, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=P#M220.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:=Position) // Eintrag lesen - - L "MB199" - L 2#1111111 // Bit 7 ausblenden - AW - L 0 // Fehler vorhanden? - <>I // Ja - BEC - - L "MW224" - T Lager_DB - L "MW226" - T Lager_DW - ITD - T AR1Start // Startwert mit Offset 0 - - L AR1Start // Startwert mit Offset 0 - + DINT#28 // Offset Status2 (Bit 7: Inilauf) - SLD 3 - L 7 // Damit DBX_Bit 7 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[Lager_DB] // Lager-DB öffnen - - A DBX [AR1Zeiger] // Lager hat Inilauf aktiv - BEC // Sonst kann der Inilauf nie beendet werden! - -// Check, ob Ziel-Lager Platz hat: - L AR1Start // Startwert mit Offset 0 - + DINT#28 // Offset Status2 (Bit 1: Piuffer hat Platz_IN) - SLD 3 - L 1 // Damit DBX_Bit 1 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[Lager_DB] // Lager-DB öffnen - - AN DBX [AR1Zeiger] // Lager hat keinen Platz - BEC - -// Ziel übergeben: - L Ziel_int - T "DVP_Sorter_A".Sorter_MB3121.Separator.Default_Ziel - T "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_DEST_Ziel - -// Scanner-IDX übergeben: - L "DVP_OmniFahren".Schleuse_3121.Dyn.TrolleyID_Schleuse - T "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_IDX // IDX - - CLR // Wird über MSorterRein (FB1423/5) gestartet! - S "M180.6" // Weiterfahrt ist erlaubt - - BEU - -// GOHDReqM an Host senden: -T3121: L "DVP_OmniFahren".Schleuse_3121.Dyn.TrolleyID_Schleuse - L 0 // Barcode bekannt? - ==D // Nein! - BEC // Warten! - -CALL FB "Daten_in_SendFIFO_speichern" , (TelegrammKennung[1]:='G', TelegrammKennung[2]:='O', TelegrammKennung[3]:='H', TelegrammKennung[4]:='D', TelegrammKennung[5]:='R', TelegrammKennung[6]:='e', TelegrammKennung[7]:='q', TelegrammKennung[8]:='M', TelegrammKennung[9]:=?, TelegrammKennung[10]:=?, TrolleyID:="DVP_OmniFahren".Schleuse_3121.Dyn.TrolleyID_Schleuse, StationsNr:=3121, Puffer_LinienNr:=?, StoreGroup:=?, Status_1_Int:=?, Status_2_Bit[0]:=?, Status_2_Bit[1]:=?, Status_2_Bit[2]:=?, Status_2_Bit[3]:=?, Status_2_Bit[4]:=?, Status_2_Bit[5]:=?, Status_2_Bit[6]:=?, Status_2_Bit[7]:=?, Reserve[1]_Int:=?, Reserve[2]_Int:=?, Port:=2, Ret_Val_FIFO_IN:="MB199", Error:="Error.Bit") +FUNCTION "VP_Ziel_FC" : Void +TITLE = Ziel-FC: Vollpuffer_OmniFahren +{ S7_Optimized_Access := 'FALSE' ; S7_Pass_Registers := 'TRUE' } +AUTHOR : AE +VERSION : 0.1 + VAR_TEMP + Ziel_hex : Word; + Ziel_int : Int; + Zielebene : Word; + Error : Byte; + Position : Int; + Lager_DB : Int; + Lager_DW : Int; + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + SSDW : Int; + EndZiel : Word; + Variante : Int; + AbrufID : DInt; + Fahrlisten_TrolleyID : DInt; + Fahrlisten_AbrufID : DInt; + Fahrlisten_Lager : Int; + ZielGruppe : Word; + Trolley_unbekannt : Bool; // Trolley ist nicht in DL + Express_Abruf : Bool; + "Error.Bit" : Bool; + END_VAR + + +BEGIN +NETWORK +TITLE = Rückmeldung + SET;//Rückmeldungen erst mal resetten + R "M180.6";//Weiterfahrt von Ziel-FC erlaubt + +NETWORK +TITLE = Schleuse 3121: Weiterfahren erlaubt ? (Sorter VP_A von KontrollPlatz) + L "MW190"; + L 3121 ;//Aufruf von Schleuse 3121 ? + <>I;//Nein! + SPB X3121E; + + L "VP_TravelFIFO_A".Travel_FIFO_BG3120.FIFO.ANZAHL; + L 0;//Daten noch im Travel-FIFO? + <>I;//Ja ! + O "MB3121" ;//Trolley fährt schon + O "DVP_OmniFahren".Einfahrt_VP."3121_stop"; + BEB; + + L 0; + T #Ziel_hex; + + U "SGes".Ohne_PC_Fahren;//Also Ziel simulieren + SPB Sim3121; + + UN "DVP_OmniFahren".Schleuse_3121.Status2.Telegramm_gesendet; + SPB T3121; + +//Shop-Group definiert ? + L "MD182" ;//ShopGroup + L DINT#0;//bekannt? + <>D;//Ja ! + U(; + TAK; + L DINT#0815 ;//bekannt? + <>D;//Ja ! + O "SGes".Ohne_PC_Fahren;//815 nur ohne PC fahren Ok! + ); + SPB VP3121; + +//Erneute Anfrage bei Host! + U "10s-Impuls"; + R "DVP_OmniFahren".Schleuse_3121.Status2.Telegramm_gesendet; + + BEA; + +//Voll-Puffer ermitteln oder Ziel schon fest? +VP3121: L #Ziel_hex ;//Evtl. von Simulation + L 16#0 ;//schon angegeben? + <>I;//Ja! + SPB ZielFest3121; + + CALL "ShopGroup_Rein-Lager ermitteln" + ( ShopGroup := "MD182" , + Puffer := #Ziel_hex + ); + +//Ziel = Voll-Lager? +ZielFest3121: L #Ziel_hex; + L 16#F000; + UW; + L 16#B000 ;//Ziel = VollLager ? + ==I ;//Ja! + R "7_HMI_Err_UH07_OB".Logistik.Kein_Platz_im_VollLager; + SPB LagerOk_3121; + + SET; + S "7_HMI_Err_UH07_OB".Logistik.Kein_Platz_im_VollLager; + + BEA;//Nicht ins Lager fahren ! + +LagerOk_3121: L #Ziel_hex; + L 16#FFF; + UW; + BTI ;//Damit Int 101-151 als Ziel ! + T #Ziel_int; + +//Check, ob Ziel-Lager Inilauf aktiv hat: + T "MW220"; + + CALL "DatenOut" + ( SSDB := 275 , + SSDW := 0 , + PARA := 16#0000 , //Eintrag lesen + SEARCHDATEN := P#M220.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := #Position + ); + + L "MB199"; + L 2#1111111 ;//Bit 7 ausblenden + UW; + L 0;//Fehler vorhanden? + <>I;//Ja + BEB; + + L "MW224"; + T #Lager_DB; + L "MW226"; + T #Lager_DW; + ITD; + T #AR1Start ;//Startwert mit Offset 0 + + L #AR1Start;//Startwert mit Offset 0 + + DINT#28 ;//Offset Status2 (Bit 7: Inilauf) + SLD 3; + L 7 ;//Damit DBX_Bit 7 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #Lager_DB] ;//Lager-DB öffnen + + U DBX[ #AR1Zeiger] ;//Lager hat Inilauf aktiv + BEB;//Sonst kann der Inilauf nie beendet werden! + +//Check, ob Ziel-Lager Platz hat: + L #AR1Start;//Startwert mit Offset 0 + + DINT#28 ;//Offset Status2 (Bit 1: Piuffer hat Platz_IN) + SLD 3; + L 1 ;//Damit DBX_Bit 1 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #Lager_DB] ;//Lager-DB öffnen + + UN DBX[ #AR1Zeiger] ;//Lager hat keinen Platz + BEB; + +//Ziel übergeben: + L #Ziel_int; + T "DVP_Sorter_A".Sorter_MB3121.Separator.Default_Ziel; + T "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_DEST_Ziel; + +//Scanner-IDX übergeben: + L "DVP_OmniFahren".Schleuse_3121.Dyn.TrolleyID_Schleuse; + T "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_IDX;//IDX + + CLR ;//Wird über MSorterRein (FB1423/5) gestartet! + S "M180.6" ;//Weiterfahrt ist erlaubt + + BEA; + +//GOHDReqM an Host senden: +T3121: L "DVP_OmniFahren".Schleuse_3121.Dyn.TrolleyID_Schleuse; + L 0;//Barcode bekannt? + ==D;//Nein! + BEB;//Warten! + + CALL "Daten_in_SendFIFO_speichern", "Daten_für_SendFIFO" + ( "TelegrammKennung[1]" := 'G' , + "TelegrammKennung[2]" := 'O' , + "TelegrammKennung[3]" := 'H' , + "TelegrammKennung[4]" := 'D' , + "TelegrammKennung[5]" := 'R' , + "TelegrammKennung[6]" := 'e' , + "TelegrammKennung[7]" := 'q' , + "TelegrammKennung[8]" := 'M' , + TrolleyID := "DVP_OmniFahren".Schleuse_3121.Dyn.TrolleyID_Schleuse , + StationsNr := 3121 , + Port := 2 , + Ret_Val_FIFO_IN := "MB199" , + Error := #"Error.Bit" + ); + + UN #"Error.Bit"; + S "DVP_OmniFahren".Schleuse_3121.Status2.Telegramm_gesendet; + + BEA; + +///Zum Testen bei Inbetriebnahme: +Sim3121: L "DVP_OmniFahren".Einfahrt_VP."3121_Ziel"; + T #Ziel_hex; + + //Shop-Group definiert ? + L "MD182" ;//ShopGroup + L DINT#0;//bekannt? + <>D;//Ja ! + SPB VP3121; + + CALL "Trolleydaten_neu_anlegen" + ( Gesamt_Trolley_DL := "DVP_OmniFahren".Schleuse_3121.Schleuse.Gesamt_Trolley_DL , + TrolleyID := "DVP_OmniFahren".Schleuse_3121.Dyn.TrolleyID_Schleuse , + Endziel := 16#0000 , + ShopGroup := DINT#815 /// + ); + + BEA; + +X3121E: NOP 0; + +NETWORK +TITLE = Schleuse 3123: Weiterfahren erlaubt ? (Sorter VP_A von RückführStrecke) + L "MW190"; + L 3123 ;//Aufruf von Schleuse 3123 ? + <>I;//Nein! + SPB X3123E; + + L "VP_TravelFIFO_A".Travel_FIFO_BG3120.FIFO.ANZAHL; + L 0;//Daten noch im Travel-FIFO? + <>I;//Ja ! + O "MB3123" ;//Trolley fährt schon + O "DVP_OmniFahren".Einfahrt_VP."3123_stop"; + BEB; + + L 0; + T #Ziel_hex; + + U "SGes".Ohne_PC_Fahren;//Also Ziel simulieren + SPB Sim3123; + + UN "DVP_OmniFahren".Schleuse_3123.Status2.Telegramm_gesendet; + SPB T3123; + + //Shop-Group definiert ? + L "MD182" ;//ShopGroup + L DINT#0;//bekannt? + <>D;//Ja ! + U(; + TAK; + L DINT#0815 ;//bekannt? + <>D;//Ja ! + O "SGes".Ohne_PC_Fahren;//815 nur ohne PC fahren Ok! + ); + SPB VP3123; + +//Erneute Anfrage bei Host! + U "10s-Impuls"; + R "DVP_OmniFahren".Schleuse_3123.Status2.Telegramm_gesendet; + + BEA; + +//Voll-Puffer ermitteln oder Ziel schon fest? +VP3123: L #Ziel_hex ;//Evtl. von Simulation + L 16#0 ;//schon angegeben? + <>I;//Ja! + SPB ZielFest3123; + + CALL "ShopGroup_Rein-Lager ermitteln" + ( ShopGroup := "MD182" , + Puffer := #Ziel_hex + ); + +//Ziel = Voll-Lager? +ZielFest3123: L #Ziel_hex; + L 16#F000; + UW; + L 16#B000 ;//Ziel = VollLager ? + ==I ;//Ja! + R "7_HMI_Err_UH07_OB".Logistik.Kein_Platz_im_VollLager; + SPB LagerOk_3123; + + SET; + S "7_HMI_Err_UH07_OB".Logistik.Kein_Platz_im_VollLager; + +//Im Kreis nur fahren, falls Stau in Rückführstrecke: + UN "DVP_Sensoren".Stau_BG3243.Stat.B_Akt; + BEB ;//Nicht ins Lager fahren ! + + L 16#B151 ;///Vorerst immer Lager 51 fahren + T #Ziel_hex; + +LagerOk_3123: L #Ziel_hex; + L 16#FFF; + UW; + BTI ;//Damit Int101-151 als Ziel ! + T #Ziel_int; + +//Check, ob Ziel-Lager Inilauf aktiv hat: + T "MW220"; + + CALL "DatenOut" + ( SSDB := 275 , + SSDW := 0 , + PARA := 16#0000 , //Eintrag lesen + SEARCHDATEN := P#M220.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := #Position + ); + + L "MB199"; + L 2#1111111 ;//Bit 7 ausblenden + UW; + L 0;//Fehler vorhanden? + <>I;//Ja + BEB; + + L "MW224"; + T #Lager_DB; + L "MW226"; + T #Lager_DW; + ITD; + T #AR1Start;//Startwert mit Offset 0 + + L #AR1Start;//Startwert mit Offset 0 + + DINT#28 ;//Offset Status2 (Bit 7: Inilauf) + SLD 3; + L 7 ;//Damit DBX_Bit 7 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #Lager_DB] ;//Lager-DB öffnen + + U DBX[ #AR1Zeiger] ;//Lager hat Inilauf aktiv + BEB;//Sonst kann der Inilauf nie beendet werden! + +//Check, ob Ziel-Lager Platz hat: + L #AR1Start;//Startwert mit Offset 0 + + DINT#28 ;//Offset Status2 (Bit 1: Puffer hat Platz_IN) + SLD 3; + L 1 ;//Damit DBX_Bit 1 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #Lager_DB] ;//Lager-DB öffnen + + UN DBX[ #AR1Zeiger] ;//Lager hat keinen Platz + BEB;//Sonst kann der Inilauf nie beendet werden! + +//Ziel übergeben: + L #Ziel_int; + T "DVP_Sorter_A".Sorter_MB3123.Separator.Default_Ziel; + T "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_DEST_Ziel; + +//Scanner-IDX übergeben: + L "DVP_OmniFahren".Schleuse_3123.Dyn.TrolleyID_Schleuse; + T "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_IDX;//IDX + + CLR ;//Wird über MSorterRein (FB1423/5) gestartet! + S "M180.6" ;//Weiterfahrt ist erlaubt + + BEA; + +//GOHDReqM an Host senden: +T3123: L "DVP_OmniFahren".Schleuse_3123.Dyn.TrolleyID_Schleuse; + L 0;//Barcode bekannt? + ==D;//Nein! + BEB;//Warten! + + CALL "Daten_in_SendFIFO_speichern", "Daten_für_SendFIFO" + ( "TelegrammKennung[1]" := 'G' , + "TelegrammKennung[2]" := 'O' , + "TelegrammKennung[3]" := 'H' , + "TelegrammKennung[4]" := 'D' , + "TelegrammKennung[5]" := 'R' , + "TelegrammKennung[6]" := 'e' , + "TelegrammKennung[7]" := 'q' , + "TelegrammKennung[8]" := 'M' , + TrolleyID := "DVP_OmniFahren".Schleuse_3123.Dyn.TrolleyID_Schleuse , + StationsNr := 3123 , + Port := 2 , + Ret_Val_FIFO_IN := "MB199" , + Error := #"Error.Bit" + ); + + UN #"Error.Bit"; + S "DVP_OmniFahren".Schleuse_3123.Status2.Telegramm_gesendet; + + BEA; + +///Zum Testen bei Inbetriebnahme: +Sim3123: L "DVP_OmniFahren".Einfahrt_VP."3123_Ziel"; + T #Ziel_hex; + + //Shop-Group definiert ? + L "MD182" ;//ShopGroup + L DINT#0;//bekannt? + <>D;//Ja ! + SPB VP3123; + + CALL "Trolleydaten_neu_anlegen" + ( Gesamt_Trolley_DL := "DVP_OmniFahren".Schleuse_3123.Schleuse.Gesamt_Trolley_DL , + TrolleyID := "DVP_OmniFahren".Schleuse_3123.Dyn.TrolleyID_Schleuse , + Endziel := 16#0000 , + ShopGroup := DINT#815 /// + ); + + BEA; + +X3123E: NOP 0; + +NETWORK +TITLE = Schleuse 3244: (Nach LagerAusfahrt) + L "MW190"; + L 3244 ;//Aufruf von Schleuse XXXX? + <>I;//Nein! + SPB PS5E; + + U "DVP_OmniFahren".Ausfahrt_VP."3244_stop"; + BEB; + + L "DVP_OmniFahren".Ausfahrt_VP."3244_Ziel"; + L 16#0;//Vorgabe? + ==I;//Nein! + SPB N3244; + + TAK; + L 16#B000;//Vollpuffer + ==I;//Ja! + SPB A3244; + + TAK; + L 16#E000 ;//Entnahmepuffer + ==I;//Ja! + SPB G3244; + + BEA; + +//Aufgrund der Daten fahren: +N3244: NOP 0; +//EndZiel = Entnahmepuffer? + L "MW194";//EndZiel + L 16#F000; + UW; + T #ZielGruppe; + L 16#E000 ;//Entnahme-Puffer + ==I;//Ja ! + SPB G3244 ;//Gerade fahren + +//Leer-Trolley?: + L "DVP_OmniFahren".Schleuse_3244.Dyn.Trolley_ShopGroup; + L DINT#-1 ;//leerer Trolley ? + ==D ;//Ja ! + U(; + L "DLLeerPuffer_leer".Datenlistenkopf.AnzahlEintraege; + L 5 ;//Genügend Platz vorhanden ? + >=I ;//Ja ! + ); + SPB G3244;//Gerade fahren + + SPA A3244 ;//Rest Abzweig fahren + +A3244: L 16#3243; + T "MW198" ;//Weichenziel + + UN "DVP_Sensoren".Stau_BG3243.Stat.B_Akt; + S "M180.6" ;//Weiterfahrt ist erlaubt + + BEA; + +G3244: L 16#3246; + T "MW198" ;//Weichenziel + + UN "DVP_Sensoren".Stau_BG3246.Stat.B_Akt; + S "M180.6" ;//Weiterfahrt ist erlaubt + + BEA; + +PS5E: NOP 0; + +NETWORK +TITLE = Ende + BE; - AN "Error.Bit" - S "DVP_OmniFahren".Schleuse_3121.Status2.Telegramm_gesendet - - BEU - -// /Zum Testen bei Inbetriebnahme: -Sim3121: L "DVP_OmniFahren".Einfahrt_VP."3121_Ziel" - T Ziel_hex - -// Shop-Group definiert ? - L "MD182" // ShopGroup - L DINT#0 // bekannt? - <>D // Ja ! - JC VP3121 - -CALL FC "Trolleydaten_neu_anlegen" (Gesamt_Trolley_DL:="DVP_OmniFahren".Schleuse_3121.Schleuse.Gesamt_Trolley_DL, TrolleyID:="DVP_OmniFahren".Schleuse_3121.Dyn.TrolleyID_Schleuse, Endziel:=16#0000, ShopGroup:=DINT#815) // / - - BEU - -X3121E: NOP 0 - - ---- NW 3: Schleuse 3123: Weiterfahren erlaubt ? (Sorter VP_A von RückführStrecke) --- - L "MW190" - L 3123 // Aufruf von Schleuse 3123 ? - <>I // Nein! - JC X3123E - - L "VP_TravelFIFO_A".Travel_FIFO_BG3120.FIFO.ANZAHL - L 0 // Daten noch im Travel-FIFO? - <>I // Ja ! - O "MB3123" // Trolley fährt schon - O "DVP_OmniFahren".Einfahrt_VP."3123_stop" - BEC - - L 0 - T Ziel_hex - - A "SGes".Ohne_PC_Fahren // Also Ziel simulieren - JC Sim3123 - - AN "DVP_OmniFahren".Schleuse_3123.Status2.Telegramm_gesendet - JC T3123 - -// Shop-Group definiert ? - L "MD182" // ShopGroup - L DINT#0 // bekannt? - <>D // Ja ! - A( - CAC - L DINT#0815 // bekannt? - <>D // Ja ! - O "SGes".Ohne_PC_Fahren // 815 nur ohne PC fahren Ok! - ) - JC VP3123 - -// Erneute Anfrage bei Host! - A "10s-Impuls" - R "DVP_OmniFahren".Schleuse_3123.Status2.Telegramm_gesendet - - BEU - -// Voll-Puffer ermitteln oder Ziel schon fest? -VP3123: L Ziel_hex // Evtl. von Simulation - L 16#0 // schon angegeben? - <>I // Ja! - JC ZielFest3123 - -CALL FC "ShopGroup to Rein-Lager ermitteln" (ShopGroup:="MD182", Puffer:=Ziel_hex) - -// Ziel = Voll-Lager? -ZielFest3123: L Ziel_hex - L 16#F000 - AW - L 16#B000 // Ziel = VollLager ? - ==I // Ja! - R "7_HMI_Err_UH07_OB".Logistik.Kein_Platz_im_VollLager - JC LagerOk_3123 - - SET - S "7_HMI_Err_UH07_OB".Logistik.Kein_Platz_im_VollLager - -// Im Kreis nur fahren, falls Stau in Rückführstrecke: - AN "DVP_Sensoren".Stau_BG3243.Stat.B_Akt - BEC // Nicht ins Lager fahren ! - - L 16#B151 // /Vorerst immer Lager 51 fahren - T Ziel_hex - -LagerOk_3123: L Ziel_hex - L 16#FFF - AW - BTI // Damit Int101-151 als Ziel ! - T Ziel_int - -// Check, ob Ziel-Lager Inilauf aktiv hat: - T "MW220" - -CALL FC "DatenOut" (SSDB:=275, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=P#M220.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:=Position) // Eintrag lesen - - L "MB199" - L 2#1111111 // Bit 7 ausblenden - AW - L 0 // Fehler vorhanden? - <>I // Ja - BEC - - L "MW224" - T Lager_DB - L "MW226" - T Lager_DW - ITD - T AR1Start // Startwert mit Offset 0 - - L AR1Start // Startwert mit Offset 0 - + DINT#28 // Offset Status2 (Bit 7: Inilauf) - SLD 3 - L 7 // Damit DBX_Bit 7 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[Lager_DB] // Lager-DB öffnen - - A DBX [AR1Zeiger] // Lager hat Inilauf aktiv - BEC // Sonst kann der Inilauf nie beendet werden! - -// Check, ob Ziel-Lager Platz hat: - L AR1Start // Startwert mit Offset 0 - + DINT#28 // Offset Status2 (Bit 1: Puffer hat Platz_IN) - SLD 3 - L 1 // Damit DBX_Bit 1 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[Lager_DB] // Lager-DB öffnen - - AN DBX [AR1Zeiger] // Lager hat keinen Platz - BEC // Sonst kann der Inilauf nie beendet werden! - -// Ziel übergeben: - L Ziel_int - T "DVP_Sorter_A".Sorter_MB3123.Separator.Default_Ziel - T "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_DEST_Ziel - -// Scanner-IDX übergeben: - L "DVP_OmniFahren".Schleuse_3123.Dyn.TrolleyID_Schleuse - T "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_IDX // IDX - - CLR // Wird über MSorterRein (FB1423/5) gestartet! - S "M180.6" // Weiterfahrt ist erlaubt - - BEU - -// GOHDReqM an Host senden: -T3123: L "DVP_OmniFahren".Schleuse_3123.Dyn.TrolleyID_Schleuse - L 0 // Barcode bekannt? - ==D // Nein! - BEC // Warten! - -CALL FB "Daten_in_SendFIFO_speichern" , (TelegrammKennung[1]:='G', TelegrammKennung[2]:='O', TelegrammKennung[3]:='H', TelegrammKennung[4]:='D', TelegrammKennung[5]:='R', TelegrammKennung[6]:='e', TelegrammKennung[7]:='q', TelegrammKennung[8]:='M', TelegrammKennung[9]:=?, TelegrammKennung[10]:=?, TrolleyID:="DVP_OmniFahren".Schleuse_3123.Dyn.TrolleyID_Schleuse, StationsNr:=3123, Puffer_LinienNr:=?, StoreGroup:=?, Status_1_Int:=?, Status_2_Bit[0]:=?, Status_2_Bit[1]:=?, Status_2_Bit[2]:=?, Status_2_Bit[3]:=?, Status_2_Bit[4]:=?, Status_2_Bit[5]:=?, Status_2_Bit[6]:=?, Status_2_Bit[7]:=?, Reserve[1]_Int:=?, Reserve[2]_Int:=?, Port:=2, Ret_Val_FIFO_IN:="MB199", Error:="Error.Bit") - - AN "Error.Bit" - S "DVP_OmniFahren".Schleuse_3123.Status2.Telegramm_gesendet - - BEU - -// /Zum Testen bei Inbetriebnahme: -Sim3123: L "DVP_OmniFahren".Einfahrt_VP."3123_Ziel" - T Ziel_hex - -// Shop-Group definiert ? - L "MD182" // ShopGroup - L DINT#0 // bekannt? - <>D // Ja ! - JC VP3123 - -CALL FC "Trolleydaten_neu_anlegen" (Gesamt_Trolley_DL:="DVP_OmniFahren".Schleuse_3123.Schleuse.Gesamt_Trolley_DL, TrolleyID:="DVP_OmniFahren".Schleuse_3123.Dyn.TrolleyID_Schleuse, Endziel:=16#0000, ShopGroup:=DINT#815) // / - - BEU - -X3123E: NOP 0 - - ---- NW 4: Schleuse 3244: (Nach LagerAusfahrt) --- - L "MW190" - L 3244 // Aufruf von Schleuse XXXX? - <>I // Nein! - JC PS5E - - A "DVP_OmniFahren".Ausfahrt_VP."3244_stop" - BEC - - L "DVP_OmniFahren".Ausfahrt_VP."3244_Ziel" - L 16#0 // Vorgabe? - ==I // Nein! - JC N3244 - - CAC - L 16#B000 // Vollpuffer - ==I // Ja! - JC A3244 - - CAC - L 16#E000 // Entnahmepuffer - ==I // Ja! - JC G3244 - - BEU - -// Aufgrund der Daten fahren: -N3244: NOP 0 -// EndZiel = Entnahmepuffer? - L "MW194" // EndZiel - L 16#F000 - AW - T ZielGruppe - L 16#E000 // Entnahme-Puffer - ==I // Ja ! - JC G3244 // Gerade fahren - -// Leer-Trolley?: - L "DVP_OmniFahren".Schleuse_3244.Dyn.Trolley_ShopGroup - L DINT#-1 // leerer Trolley ? - ==D // Ja ! - A( - L "DLLeerPuffer_leer".Datenlistenkopf.AnzahlEintraege - L 5 // Genügend Platz vorhanden ? - >=I // Ja ! - ) - JC G3244 // Gerade fahren - - JU A3244 // Rest Abzweig fahren - -A3244: L 16#3243 - T "MW198" // Weichenziel - - AN "DVP_Sensoren".Stau_BG3243.Stat.B_Akt - S "M180.6" // Weiterfahrt ist erlaubt - - BEU - -G3244: L 16#3246 - T "MW198" // Weichenziel - - AN "DVP_Sensoren".Stau_BG3246.Stat.B_Akt - S "M180.6" // Weiterfahrt ist erlaubt - - BEU - -PS5E: NOP 0 - - ---- NW 5: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Sorter_Vollpuffer/VP_Sorter_A.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Sorter_Vollpuffer/VP_Sorter_A.awl index 96784b4..c98123c 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Sorter_Vollpuffer/VP_Sorter_A.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Sorter_Vollpuffer/VP_Sorter_A.awl @@ -1,645 +1,1013 @@ -=== FB 1423: VP_Sorter_A [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Sorter_MB3121 : "MSepSorterRein" - Sync_BG3120 : "MStartSync" - Weiche_VP1 : "MWeiche_Sorter" - Weiche_VP2 : "MWeiche_Sorter" - Weiche_VP3 : "MWeiche_Sorter" - Weiche_VP4 : "MWeiche_Sorter" - Weiche_VP5 : "MWeiche_Sorter" - Weiche_VP6 : "MWeiche_Sorter" - Weiche_VP7 : "MWeiche_Sorter" - Weiche_VP8 : "MWeiche_Sorter" - Weiche_VP9 : "MWeiche_Sorter" - Weiche_VP10 : "MWeiche_Sorter" - Weiche_VP11 : "MWeiche_Sorter" - Weiche_VP12 : "MWeiche_Sorter" - Weiche_VP13 : "MWeiche_Sorter" - Weiche_VP14 : "MWeiche_Sorter" - Weiche_VP15 : "MWeiche_Sorter" - Weiche_VP16 : "MWeiche_Sorter" - Weiche_VP17 : "MWeiche_Sorter" - Weiche_VP18 : "MWeiche_Sorter" - Weiche_VP19 : "MWeiche_Sorter" - Weiche_VP20 : "MWeiche_Sorter" - Weiche_VP21 : "MWeiche_Sorter" - Weiche_VP22 : "MWeiche_Sorter" - Weiche_VP23 : "MWeiche_Sorter" - Weiche_VP24 : "MWeiche_Sorter" - Weiche_VP25 : "MWeiche_Sorter" - Übergabe_B3003 : "MSorter_Uebergabe" - Sorter_MB3123 : "MSepSorterRein" - Impuls_BG3125 : "MImpulsGeber" - Ohne_PC_fahren : Bool - Sorter3121_Ok : Bool // Sorter darf starten - Sorter3123_Ok : Bool // Sorter darf starten - Aus_Sorter_3121_gefahren : Bool // Sorter von Heber war gefahren - Aus_Sorter_3123_gefahren : Bool // Sorter von Heber war gefahren - Sorter1Reset : Bool - Sorter2Reset : Bool - Sorter_A_leer : Bool - Input: - Output: - InOut: - Static: - Dyn : Struct - GesamtSorterReset : Bool := 1 - Temp: - ErrQuit : Bool - ErrAnz : Bool - Antrieb : Bool - Stau : Bool - Start_Ok : Bool - Error_aktiv : Bool - Leer : Bool - Sorter_3121_startbereit : Bool - Sorter_3123_startbereit : Bool - Trolley_dazwischen : Bool - Err_DW : DInt - Err_Bits : Int - Constant: - ---- NW 1: Systemzeug --- - A "DOutbound_Bereich".A01_UH07.AnlageEin - = Sorter_MB3121.Dyn.Sk.Auto_akt - = Sorter_MB3123.Dyn.Sk.Auto_akt - - AN "DOutbound_Bereich".A01_UC071.BereichErr - = Sorter_MB3121.Dyn.Sk.Bereich_ok - = Sorter_MB3123.Dyn.Sk.Bereich_ok - -// Bereichshalt: - CLR // nicht verbaut - R Sorter_MB3121.Dyn.Sk.Bereich_ok - -// Sonderbetriebsarten Weichen: - CLR - = Weiche_VP1.Dyn.Status.Weichentest_aktiv - = Weiche_VP2.Dyn.Status.Weichentest_aktiv - = Weiche_VP3.Dyn.Status.Weichentest_aktiv - = Weiche_VP4.Dyn.Status.Weichentest_aktiv - = Weiche_VP5.Dyn.Status.Weichentest_aktiv - = Weiche_VP6.Dyn.Status.Weichentest_aktiv - = Weiche_VP7.Dyn.Status.Weichentest_aktiv - = Weiche_VP8.Dyn.Status.Weichentest_aktiv - = Weiche_VP9.Dyn.Status.Weichentest_aktiv - = Weiche_VP10.Dyn.Status.Weichentest_aktiv - = Weiche_VP11.Dyn.Status.Weichentest_aktiv - = Weiche_VP12.Dyn.Status.Weichentest_aktiv - = Weiche_VP13.Dyn.Status.Weichentest_aktiv - = Weiche_VP14.Dyn.Status.Weichentest_aktiv - = Weiche_VP15.Dyn.Status.Weichentest_aktiv - = Weiche_VP16.Dyn.Status.Weichentest_aktiv - = Weiche_VP17.Dyn.Status.Weichentest_aktiv - = Weiche_VP18.Dyn.Status.Weichentest_aktiv - = Weiche_VP19.Dyn.Status.Weichentest_aktiv - = Weiche_VP20.Dyn.Status.Weichentest_aktiv - = Weiche_VP21.Dyn.Status.Weichentest_aktiv - = Weiche_VP22.Dyn.Status.Weichentest_aktiv - = Weiche_VP23.Dyn.Status.Weichentest_aktiv - = Weiche_VP24.Dyn.Status.Weichentest_aktiv - = Weiche_VP25.Dyn.Status.Weichentest_aktiv - - A Sync_BG3120.Dyn.Status.TeachModus_Aktiv - = Weiche_VP1.Dyn.Status.TeachModus_aktiv - = Weiche_VP2.Dyn.Status.TeachModus_aktiv - = Weiche_VP3.Dyn.Status.TeachModus_aktiv - = Weiche_VP4.Dyn.Status.TeachModus_aktiv - = Weiche_VP5.Dyn.Status.TeachModus_aktiv - = Weiche_VP6.Dyn.Status.TeachModus_aktiv - = Weiche_VP7.Dyn.Status.TeachModus_aktiv - = Weiche_VP8.Dyn.Status.TeachModus_aktiv - = Weiche_VP9.Dyn.Status.TeachModus_aktiv - = Weiche_VP10.Dyn.Status.TeachModus_aktiv - = Weiche_VP11.Dyn.Status.TeachModus_aktiv - = Weiche_VP12.Dyn.Status.TeachModus_aktiv - = Weiche_VP13.Dyn.Status.TeachModus_aktiv - = Weiche_VP14.Dyn.Status.TeachModus_aktiv - = Weiche_VP15.Dyn.Status.TeachModus_aktiv - = Weiche_VP16.Dyn.Status.TeachModus_aktiv - = Weiche_VP17.Dyn.Status.TeachModus_aktiv - = Weiche_VP18.Dyn.Status.TeachModus_aktiv - = Weiche_VP19.Dyn.Status.TeachModus_aktiv - = Weiche_VP20.Dyn.Status.TeachModus_aktiv - = Weiche_VP21.Dyn.Status.TeachModus_aktiv - = Weiche_VP22.Dyn.Status.TeachModus_aktiv - = Weiche_VP23.Dyn.Status.TeachModus_aktiv - = Weiche_VP24.Dyn.Status.TeachModus_aktiv - = Weiche_VP25.Dyn.Status.TeachModus_aktiv - - CLR - = Sorter_MB3121.Dyn.Error.Korrektur_Modus_aktiv - - L 1474 // DLSeps - T "MW174" - L 1478 // DLWeichen - T "MW178" - -// Nach neuen Daten suchen: - A "1s-Impuls" - = "Weiche_NewData" - - ---- NW 2: Linien mit PLC_Ziel anfahren --- - A Ohne_PC_fahren - JCN En03 - - A "MB3121" - O "MB3123" - CU "Z101" - - L "Z101" - L 1 - I // Ja ! - ) - JC En03 - - SET - R "Z101" - - L Sorter_MB3121.Separator.Default_Ziel - L 0 // unbekannt ? - ==I - L 101 // Beginn mit Ausfahrziel 1.Puffer - JC X399 - -// Nächste Weiche suchen: - L Sorter_MB3121.Separator.Default_Ziel - T "MW200" - -CALL FC "DatenOut" (SSDB:="MW178", SSDW:=0, PARA:=WORD#16#0E00, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M200.0, Position:="MW196") // Nach angegeben Datenbyte suchen (Abzweig-Ziel) - - AN "M199.7" // Datensatz ist nicht vorhanden - O "M208.0" // Letzte Weiche - L 0 // Neubeginn - JC X400 - -X398: CALL FC "DatenOut" (SSDB:="MW178", SSDW:=0, PARA:=WORD#16#FF00, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M200.0, Position:="MW196") // Nächsten Datensatz lesen - - L "MW206" // Weichentyp - L 178 // Sorterweiche ? - <>I // Nein! - O "M199.2" // Ende erreicht - L 0 - JC X400 - - A "M208.5" // Weiche für PLC-Ziel disabled ! - JC X398 - - L "MW226" - T Sorter_MB3121.Separator.Default_Ziel - - JU En03 - -// 1.Weiche checken: -X399: T "MW200" - -CALL FC "DatenOut" (SSDB:="MW178", SSDW:=0, PARA:=WORD#16#0E00, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M200.0, Position:="MW196") // Nach angegeben Datenbyte suchen (Abzweig-Ziel) - - AN "M199.7" // Datensatz ist nicht vorhanden - JC En03 - - A "M208.5" // Weiche für PLC-Ziel disabled ! - JC X398 - - L "MW226" -X400: T Sorter_MB3121.Separator.Default_Ziel - -En03: NOP 0 - - ---- NW 3: Störungen --- -CALL FC "Err_vorhanden" (Check_DB:=708, Anfangs_DW:=DINT#206, Ende_DW:=DINT#314, Stoerung:=Error_aktiv, ErrDW:=Err_DW, ErrBits:=Err_Bits) // Störungsanzeige - A Error_aktiv // s.o. - = Error_aktiv // Sorter Lager Weichen-Störung (Sorter-Antrieb gestoppt!) - - A "BG3120" // Verlassen-Sensor - L S5T#250MS - OffDelay "T140" - - ---- NW 4: Störung quittieren UZ7102/7103 --- - A "DOutbound_Bereich".A01_UZ7102.StOk_aktiv - O "DOutbound_Bereich".A01_UZ7103.StOk_aktiv - = ErrQuit - - ---- NW 5: Umschaltung Sorter 3121 / Sorter3123 --- - A "MB3121" - S Aus_Sorter_3121_gefahren - AN "BG3121" - R Sorter3121_Ok - A "MB3123" - S Aus_Sorter_3123_gefahren - AN "BG3123" - R Sorter3123_Ok - - L Sorter_MB3121.Dyn.Stop_Ursache - L 16#B116 - ==I - = Sorter_3121_startbereit - A Sorter_3121_startbereit - AN Aus_Sorter_3121_gefahren - S Sorter3121_Ok - JC En05 - - L Sorter_MB3123.Dyn.Stop_Ursache - L 16#B116 - ==I - = Sorter_3123_startbereit - A Sorter_3123_startbereit - AN Aus_Sorter_3123_gefahren - S Sorter3123_Ok - JC En05 - - SET // Es kann keiner fahren - A( - O Sorter_3121_startbereit - O Sorter_3123_startbereit - ) - AN "BG3120" // Sync-Sensor - AN "MB3121" // Keiner mehr offen - AN "MB3123" - L s5t#1s - OnDelay "T11" - A "T11" - R Aus_Sorter_3121_gefahren - R Aus_Sorter_3123_gefahren - -En05: NOP 0 - - ---- NW 6: Sorter-GesamtReset --- -// Sorter-Reset starten: - A "DVP_OmniFahren".Schleuse_3121.Dyn.Status.Reset_aktiv // Bei Schleusen-Reset -> Sorter mit resetten! - AN "DVP_Sorter_A".Sorter_MB3121.Dyn.GesamtSorterReset_aktiv - S "DVP_Sorter_A".Sorter_MB3121.Dyn.GesamtSorterReset - - A "DVP_OmniFahren".Schleuse_3123.Dyn.Status.Reset_aktiv // Bei Schleusen-Reset -> Sorter mit resetten! - AN "DVP_Sorter_A".Sorter_MB3123.Dyn.GesamtSorterReset_aktiv - S "DVP_Sorter_A".Sorter_MB3123.Dyn.GesamtSorterReset - - ---- NW 7: Separator 3121 vor Sorter (Von Kontrollplatz) --- - L DB708.DBW204 // Err beim Synchronisieren - L 0 // Störung vorhanden ? - ==I // Nein ! - AN Sync_BG3120.Dyn.Stop // Rein-Separator stoppen - AN Error_aktiv // Sorter Batch Weichen-Störung (Sorter-Antrieb gestoppt!) -// Aufteilung Sep 1 <> Sep 2 - AN "MB3123" - A Sorter3121_Ok - AN Sorter_MB3121.Dyn.GesamtSorterReset_aktiv - AN Sorter_MB3123.Dyn.GesamtSorterReset_aktiv - A "SF0122" -// / U "M83.1" /// - = Start_Ok - - SET // Da Leiste im Sep und Zusatz-Zylinder im Separator -> BT steht sofort sauber im Sep - S Sorter_MB3121.Dyn.BT_beruhigt // 1. einfahrender BügelTräger ist im Sep - - A "T140" - = Sorter_MB3121.B_AusSep // Entprellung Verlassen-Sensor - -// Triggern / Scanner-Auswertung über HW>VP_Omnifahren (FC128/27) -// Ziel über Default-Ziel (HW>VP_Ziel_FC, FC181) - SET - R ErrAnz - -CALL FB "None" , (Separator_Nr:=3121, ErrQuit:=ErrQuit, B_VorSep:=?, B_ImSep:="BG3121", B_AusSep:=?, B_Beladen_im_Sep:=?, B_Pinsensor:="BG3125", B_Beladen_nach_Sep:=?, Start_Ok:=Start_Ok, Antrieb_aktiv:="MA0145", Antrieb_plus_aktiv:="MA0145", Y_Sep_Auf:="DVP_Zylinder".Sorter_3121.Stat.Ast, K_Sanner_triggern:=?, Sorter_Reset:=Sorter1Reset, Error:=DB708.DBW200, Antrieb_start:="DHWtoVP_Antriebe".MA0144.Stat.A_vor, Antrieb_plus_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - -// Default-Ziel jeden Zyklus neu!: - L 0 - T Sorter_MB3121.Separator.Default_Ziel - -// Dieser Sorter-Rein-Sep ist aktiv: - A "DVP_Zylinder".Sorter_3121.Stat.Ast - R "DVP_Zylinder".Weiche_3120.Stat.Ast // Weiche vor Sorter-Strang - -// Quer-Antrieb einschalten: - A "MB3121" - S "DVP_Antriebe".MA0152.Stat.A_vor - - ---- NW 8: Separator 3123 vor Sorter (Von Rückführstrecke) --- - L DB708.DBW204 // Err beim Synchronisieren - L 0 // Störung vorhanden ? - ==I // Nein ! - AN Sync_BG3120.Dyn.Stop // Rein-Separator stoppen - AN Error_aktiv // Sorter Batch Weichen-Störung (Sorter-Antrieb gestoppt!) -// Aufteilung Sep 1 <> Sep 2 - AN "MB3121" - A Sorter3123_Ok - AN Sorter_MB3121.Dyn.GesamtSorterReset_aktiv - AN Sorter_MB3123.Dyn.GesamtSorterReset_aktiv - = Start_Ok - - SET // Da Leiste im Sep und Zusatz-Zylinder im Separator -> BT steht sofort sauber im Sep - S Sorter_MB3123.Dyn.BT_beruhigt // 1. einfahrender BügelTräger ist im Sep - - A "T140" - = Sorter_MB3123.B_AusSep // Entprellung Verlassen-Sensor - -// Triggern / Scanner-Auswertung über MOmniSchleuse(FB274) -// Ziel über Default-Ziel (ZG_Ziel_FC, FC2181) - -CALL FB "None" , (Separator_Nr:=3123, ErrQuit:=ErrQuit, B_VorSep:=?, B_ImSep:="BG3123", B_AusSep:=?, B_Beladen_im_Sep:=?, B_Pinsensor:="BG3125", B_Beladen_nach_Sep:=?, Start_Ok:=Start_Ok, Antrieb_aktiv:="MA0152", Antrieb_plus_aktiv:="MA0145", Y_Sep_Auf:="DVP_Zylinder".Sorter_3123.Stat.Ast, K_Sanner_triggern:=?, Sorter_Reset:=Sorter2Reset, Error:=DB708.DBW202, Antrieb_start:="DVP_Antriebe".MA0152.Stat.A_vor, Antrieb_plus_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0152.Stat.Stop_vor, hStOk:=ErrAnz) - -// Default-Ziel jeden Zyklus neu!: - L 0 - T Sorter_MB3123.Separator.Default_Ziel // /wird pro Zyklus vom Ziel-FC übergeben! - -// Dieser Sorter-Rein-Sep ist aktiv: - A "DVP_Zylinder".Sorter_3123.Stat.Ast - S "DVP_Zylinder".Weiche_3120.Stat.Ast // Weiche vor Sorter-Strang - - ---- NW 9: Reset ist aktiv --- - A Sorter_MB3121.Dyn.GesamtSorterReset_aktiv - = "7_HMI_Err_UH07_OB".Sorter_MB3121.Reset_aktiv - A Sorter_MB3123.Dyn.GesamtSorterReset_aktiv - = "7_HMI_Err_UH07_OB".Sorter_MB3123.Reset_aktiv - - A Sorter_MB3121.Dyn.GesamtSorterReset_aktiv - O Sorter_MB3123.Dyn.GesamtSorterReset_aktiv - = Weiche_VP1.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP2.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP3.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP4.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP5.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP6.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP7.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP8.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP9.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP10.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP11.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP12.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP13.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP14.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP15.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP16.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP17.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP18.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP19.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP20.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP21.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP22.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP23.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP24.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP25.Dyn.Ohne_VerklemmKontrolle - -// Diesen Sorterbereich zurücksetzen: - A Sorter1Reset // Ein Zyklus - O Sorter2Reset // Ein Zyklus - S Sync_BG3120.Dyn.Reset - S Weiche_VP1.Dyn.Status.Reset - S Weiche_VP2.Dyn.Status.Reset - S Weiche_VP3.Dyn.Status.Reset - S Weiche_VP4.Dyn.Status.Reset - S Weiche_VP5.Dyn.Status.Reset - S Weiche_VP6.Dyn.Status.Reset - S Weiche_VP7.Dyn.Status.Reset - S Weiche_VP8.Dyn.Status.Reset - S Weiche_VP9.Dyn.Status.Reset - S Weiche_VP10.Dyn.Status.Reset - S Weiche_VP11.Dyn.Status.Reset - S Weiche_VP12.Dyn.Status.Reset - S Weiche_VP13.Dyn.Status.Reset - S Weiche_VP14.Dyn.Status.Reset - S Weiche_VP15.Dyn.Status.Reset - S Weiche_VP16.Dyn.Status.Reset - S Weiche_VP17.Dyn.Status.Reset - S Weiche_VP18.Dyn.Status.Reset - S Weiche_VP19.Dyn.Status.Reset - S Weiche_VP20.Dyn.Status.Reset - S Weiche_VP21.Dyn.Status.Reset - S Weiche_VP22.Dyn.Status.Reset - S Weiche_VP23.Dyn.Status.Reset - S Weiche_VP24.Dyn.Status.Reset - S Weiche_VP25.Dyn.Status.Reset - - ---- NW 10: Inkremente über Zahnrad-Sensor --- -CALL FB "None" , (Ink_DB:=1483, B_Zaehlen:="BG3125", Antrieb_aktiv:="MA0145", Quit:=ErrQuit, Zeit_Signal_zu_lang:=?, Zeit_Kein_Signal:=?, Signal:=?, Err_Kein_Signal:="7_HMI_Err_UH07_OB".Impulsgeber_3004.Kein_Signal, Err_Signal_zu_lang:="7_HMI_Err_UH07_OB".Impulsgeber_3004.Signal_zu_lang) - - A( - O "7_HMI_Err_UH07_OB".Impulsgeber_3004.Kein_Signal - O "7_HMI_Err_UH07_OB".Impulsgeber_3004.Signal_zu_lang - ) - AN ErrQuit - S "DVP_Antriebe".MA0145.Stat.Stop_vor - - A( - O "7_HMI_Err_UH07_OB".Impulsgeber_3004.Kein_Signal - O "7_HMI_Err_UH07_OB".Impulsgeber_3004.Signal_zu_lang - ) - S ErrAnz - - ---- NW 11: Sorter A-Antrieb nicht aktiv beim/nach Synchronisieren --- -// Antriebe Sorter A starten: - A "DVP_Sensoren".An_BG3120.Stat.B_Akt // damit Zeit ablaufen kann - S "DVP_Antriebe".MA0152.Stat.A_vor // Quer-Zuführung an - S "DVP_Antriebe".MA0145.Stat.A_start // Sorter A starten - -// Antrieb M0152 stoppen, da sonst Lücke zwischen 2 Trolleys kleiner wird - A "DVP_Sensoren".An_BG3120.Stat.B_Akt // Mit Zeitverzögerung! - AN "MA0145" // Aber Antrieb Sorter A nicht aktiv - S "DVP_Antriebe".MA0152.Stat.A_PS // Nicht stoppen, da sonst Lager-Ausfahrt blockiert - - ---- NW 12: Trolley synchronisieren BG3120 --- -// Teachen: Ref-Sensor ueber Sync-Sensor - A "BG3120" - AN Sync_BG3120.Dyn.Refpunkt_ok // Nur eimalige Auswertung - = Sync_BG3120.B_RefPunkt // uebergabe fuer unten - - A "MA0145" - L S5T#500ms - OffDelay "T143" - A "T143" - AN Sync_BG3120.Dyn.Status.TeachModus_Aktiv // sonst Probleme bei Doppelimpuls - O - A "MA0145" - A Sync_BG3120.Dyn.Status.TeachModus_Aktiv // sonst Probleme bei Doppelimpuls - = Antrieb - -// Keine Hauptstrangdaten vorhanden ? (Fuer Sync-Pkt): - L "VP_HS_A_oF".Datensortkopf.AnzahlEintraege - L "VP_HS_A_mF".Datensortkopf.AnzahlEintraege - +I - L 0 // Daten vorhanden ? - ==I // Nein ! - = "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - - A "BG3120" - L s5t#500ms // Da trotz Entprellung Doppel-Impulse - OffDelay "T144" - A "T144" - = Sync_BG3120.B_BT_da - -CALL FB "None" , (Sync_Nr:=3120, ErrQuit:=ErrQuit, B_BT_da:=?, B_RefPunkt:=?, B_TeachPunk:="BG3074", Antrieb_aktiv:=Antrieb, Error:=DB708.DBW204, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, hStOk:=ErrAnz) // Teach-Sensor - - A Sync_BG3120.Dyn.Error.Inkrementalgeber - S "DVP_Antriebe".MA0145.Stat.Stop_vor - -// Keine Hauptstrangdaten vorhanden ?: - L "VP_HS_A_oF".Datensortkopf.AnzahlEintraege - L "VP_HS_A_mF".Datensortkopf.AnzahlEintraege - +I - L 0 // Daten vorhanden ? - ==I // Nein ! - = "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - -// Reservierungen können gelöscht werden: - L "VP_TravelFIFO_A".Travel_FIFO_BG3120.FIFO.ANZAHL - L 0 // Daten vorhanden ? - ==I // Nein ! - A "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - = Sorter_A_leer - - ---- NW 13: Weiche 3087 / Vollpuffer VP1 --- -CALL FB "None" , (Weichen_Nr:=1, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP1.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3087", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP1.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW210, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 14: Weiche 3086 / Vollpuffer VP2 --- -CALL FB "None" , (Weichen_Nr:=2, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP2.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3086", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP2.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW212, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 15: Weiche 3085 / Vollpuffer VP3 --- -CALL FB "None" , (Weichen_Nr:=3, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP3.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3085", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP3.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW214, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 16: Weiche 3084 / Vollpuffer VP4 --- -CALL FB "None" , (Weichen_Nr:=4, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP4.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3084", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP4.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW216, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 17: Weiche 3083 / Vollpuffer VP5 --- -CALL FB "None" , (Weichen_Nr:=5, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP5.Stat.B_Akt, B_Gerade:="BG3062", B_Ausfahrt:="BG3083", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP5.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW218, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 18: Weiche 3082 / Vollpuffer VP6 --- -CALL FB "None" , (Weichen_Nr:=6, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP6.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3082", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP6.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW220, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 19: Weiche 3081 / Vollpuffer VP7 --- -CALL FB "None" , (Weichen_Nr:=7, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP7.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3081", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP7.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW222, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 20: Weiche 3080 / Vollpuffer VP8 --- -CALL FB "None" , (Weichen_Nr:=8, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP8.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3080", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP8.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW224, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 21: Weiche 3077 / Vollpuffer VP9 --- -CALL FB "None" , (Weichen_Nr:=9, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP9.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3077", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP9.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW226, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 22: Weiche 3076 / Vollpuffer VP10 --- -CALL FB "None" , (Weichen_Nr:=10, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP10.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3076", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP10.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW228, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 23: Weiche 3075 / Vollpuffer VP11 --- -CALL FB "None" , (Weichen_Nr:=11, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP11.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3075", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP11.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW230, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 24: Weiche 3074 / Vollpuffer VP12 --- -CALL FB "None" , (Weichen_Nr:=12, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP12.Stat.B_Akt, B_Gerade:="BG3061", B_Ausfahrt:="BG3074", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP12.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW232, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 25: Weiche 3073 / Vollpuffer VP13 --- -CALL FB "None" , (Weichen_Nr:=13, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP13.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3073", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP13.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW234, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 26: Weiche 3072 / Vollpuffer VP14 --- -CALL FB "None" , (Weichen_Nr:=14, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP14.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3072", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP14.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW236, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 27: Weiche 3071 / Vollpuffer VP15 --- -CALL FB "None" , (Weichen_Nr:=15, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP15.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3071", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP15.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW238, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 28: Weiche 3070 / Vollpuffer VP16 --- -CALL FB "None" , (Weichen_Nr:=16, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP16.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3070", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP16.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW240, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 29: Weiche 3067 / Vollpuffer VP17 --- -CALL FB "None" , (Weichen_Nr:=17, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP17.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3067", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP17.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW242, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 30: Weiche 3066 / Vollpuffer VP18 --- -CALL FB "None" , (Weichen_Nr:=18, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP18.Stat.B_Akt, B_Gerade:="BG3060", B_Ausfahrt:="BG3066", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP18.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW244, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 31: Weiche 3065 / Vollpuffer VP19 --- -CALL FB "None" , (Weichen_Nr:=19, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP19.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3065", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP19.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW246, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 32: Weiche 3064 / Vollpuffer VP20 --- -CALL FB "None" , (Weichen_Nr:=20, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP20.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3064", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP20.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW248, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 33: Weiche 3063 / Vollpuffer VP21 --- -CALL FB "None" , (Weichen_Nr:=21, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP21.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3063", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP21.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW250, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 34: Weiche 3027 / Vollpuffer VP22 --- -CALL FB "None" , (Weichen_Nr:=22, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP22.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3027", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP22.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW252, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 35: Weiche 3026 / Vollpuffer VP23 --- -CALL FB "None" , (Weichen_Nr:=23, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP23.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3026", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP23.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW254, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 36: Weiche 3025 / Vollpuffer VP24 --- -CALL FB "None" , (Weichen_Nr:=24, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP24.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3025", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP24.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW256, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 37: Weiche 3024 / Vollpuffer VP25 --- -CALL FB "None" , (Weichen_Nr:=25, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP25.Stat.B_Akt, B_Gerade:="BG3003", B_Ausfahrt:="BG3024", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP25.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW258, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 38: Übergabe BG3003 --- -CALL FB "None" , (Uebergabe_Nr:=3003, KorrekturFaktor:=1.0, ErrQuit:=ErrQuit, Antrieb_aktiv:=Antrieb, Error:=DB708.DBW206, Antrieb_start:="DVP_Antriebe".MA0145.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0145.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 39: Sorter B-Antrieb nicht aktiv bei Übergabe (Daten in Travel-FIFO B) --- - L "VP_TravelFIFO_B".Travel_FIFO_BG3003.FIFO.ANZAHL - L 0 // Daten vorhanden ? - >I // Ja ! - O "DVP_Sensoren".An_BG3003.Stat.B_Akt // Mit Zeitverzögerung! - = Trolley_dazwischen - -// Antrieb Sorter B starten: - L "DVP_Sorter_B".Weiche_VP26.Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - L DINT#0 // schon bekannt ? - >D // Ja ! - A "DVP_Sorter_B".Weiche_VP26.Y_Weiche_geradeaus - O Trolley_dazwischen - S "DVP_Antriebe".MA0145.Stat.A_vor // Sorter A an - S "DVP_Antriebe".MA0146.Stat.A_start // Sorter B starten - -// Antrieb Sorter A stoppen: - A Trolley_dazwischen - AN "MA0146" // Aber Antrieb Sorter B nicht aktiv - S "DVP_Antriebe".MA0145.Stat.Stop_vor - = "7_HMI_Err_UH07_OB".Sorter_Vollpuffer."Sorter A stop" - - ---- NW 40: Störungen anzeigen UZ7102/7103 --- - A ErrAnz - S "DOutbound_Bereich".A01_UZ7102.StOk_blinken - S "DOutbound_Bereich".A01_UZ7103.StOk_blinken - - ---- NW 41: Ende --- - BE +FUNCTION_BLOCK "VP_Sorter_A" +TITLE = Sorter A Vollpuffer 1-25 / Übergabe +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + Sorter_MB3121 : "MSepSorterRein"; + Sync_BG3120 : "MStartSync"; + Weiche_VP1 : "MWeiche_Sorter"; + Weiche_VP2 : "MWeiche_Sorter"; + Weiche_VP3 : "MWeiche_Sorter"; + Weiche_VP4 : "MWeiche_Sorter"; + Weiche_VP5 : "MWeiche_Sorter"; + Weiche_VP6 : "MWeiche_Sorter"; + Weiche_VP7 : "MWeiche_Sorter"; + Weiche_VP8 : "MWeiche_Sorter"; + Weiche_VP9 : "MWeiche_Sorter"; + Weiche_VP10 : "MWeiche_Sorter"; + Weiche_VP11 : "MWeiche_Sorter"; + Weiche_VP12 : "MWeiche_Sorter"; + Weiche_VP13 : "MWeiche_Sorter"; + Weiche_VP14 : "MWeiche_Sorter"; + Weiche_VP15 : "MWeiche_Sorter"; + Weiche_VP16 : "MWeiche_Sorter"; + Weiche_VP17 : "MWeiche_Sorter"; + Weiche_VP18 : "MWeiche_Sorter"; + Weiche_VP19 : "MWeiche_Sorter"; + Weiche_VP20 : "MWeiche_Sorter"; + Weiche_VP21 : "MWeiche_Sorter"; + Weiche_VP22 : "MWeiche_Sorter"; + Weiche_VP23 : "MWeiche_Sorter"; + Weiche_VP24 : "MWeiche_Sorter"; + Weiche_VP25 : "MWeiche_Sorter"; + Übergabe_B3003 { S7_SetPoint := 'False'} : "MSorter_Uebergabe"; + Sorter_MB3123 : "MSepSorterRein"; + Impuls_BG3125 : "MImpulsGeber"; + Ohne_PC_fahren { S7_SetPoint := 'True'} : Bool; + Sorter3121_Ok : Bool; // Sorter darf starten + Sorter3123_Ok : Bool; // Sorter darf starten + Aus_Sorter_3121_gefahren : Bool; // Sorter von Heber war gefahren + Aus_Sorter_3123_gefahren : Bool; // Sorter von Heber war gefahren + Sorter1Reset { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + Sorter2Reset { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + Sorter_A_leer : Bool; + END_VAR + + VAR_TEMP + ErrQuit : Bool; + ErrAnz : Bool; + Antrieb : Bool; + Stau : Bool; + Start_Ok : Bool; + Error_aktiv : Bool; + Leer : Bool; + Sorter_3121_startbereit : Bool; + Sorter_3123_startbereit : Bool; + Trolley_dazwischen : Bool; + Err_DW : DInt; + Err_Bits : Int; + END_VAR + + +BEGIN +NETWORK +TITLE = Systemzeug + U "DOutbound_Bereich".A01_UH07.AnlageEin; + = #Sorter_MB3121.Dyn.Sk.Auto_akt; + = #Sorter_MB3123.Dyn.Sk.Auto_akt; + + UN "DOutbound_Bereich".A01_UC071.BereichErr; + = #Sorter_MB3121.Dyn.Sk.Bereich_ok; + = #Sorter_MB3123.Dyn.Sk.Bereich_ok; + +//Bereichshalt: + CLR;//nicht verbaut + R #Sorter_MB3121.Dyn.Sk.Bereich_ok; + +//Sonderbetriebsarten Weichen: + CLR; + = #Weiche_VP1.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP2.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP3.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP4.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP5.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP6.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP7.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP8.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP9.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP10.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP11.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP12.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP13.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP14.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP15.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP16.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP17.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP18.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP19.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP20.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP21.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP22.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP23.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP24.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP25.Dyn.Status.Weichentest_aktiv; + + U #Sync_BG3120.Dyn.Status.TeachModus_Aktiv; + = #Weiche_VP1.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP2.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP3.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP4.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP5.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP6.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP7.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP8.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP9.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP10.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP11.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP12.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP13.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP14.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP15.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP16.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP17.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP18.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP19.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP20.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP21.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP22.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP23.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP24.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP25.Dyn.Status.TeachModus_aktiv; + + CLR; + = #Sorter_MB3121.Dyn.Error.Korrektur_Modus_aktiv; + + L 1474;//DLSeps + T "MW174"; + L 1478 ;//DLWeichen + T "MW178"; + +//Nach neuen Daten suchen: + U "1s-Impuls"; + = "Weiche_NewData"; + +NETWORK +TITLE = Linien mit PLC_Ziel anfahren + U #Ohne_PC_fahren; + SPBN En03; + + U "MB3121"; + O "MB3123"; + ZV "Z101"; + + L "Z101"; + L 1; + I;//Ja ! + ); + SPB En03; + + SET; + R "Z101"; + + L #Sorter_MB3121.Separator.Default_Ziel; + L 0 ;//unbekannt ? + ==I; + L 101 ;//Beginn mit Ausfahrziel 1.Puffer + SPB X399; + +//Nächste Weiche suchen: + L #Sorter_MB3121.Separator.Default_Ziel; + T "MW200"; + + CALL "DatenOut" + ( SSDB := "MW178" , + SSDW := 0 , + PARA := WORD#16#0E00 , //Nach angegeben Datenbyte suchen (Abzweig-Ziel) + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M200.0 , + Position := "MW196" + ); + + UN "M199.7" ;//Datensatz ist nicht vorhanden + O "M208.0" ;//Letzte Weiche + L 0;//Neubeginn + SPB X400; + +X398: CALL "DatenOut" + ( SSDB := "MW178" , + SSDW := 0 , + PARA := WORD#16#FF00 , //Nächsten Datensatz lesen + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M200.0 , + Position := "MW196" + ); + + L "MW206";//Weichentyp + L 178;//Sorterweiche ? + <>I;//Nein! + O "M199.2" ;//Ende erreicht + L 0; + SPB X400; + + U "M208.5" ;//Weiche für PLC-Ziel disabled ! + SPB X398; + + L "MW226"; + T #Sorter_MB3121.Separator.Default_Ziel; + + SPA En03; + +//1.Weiche checken: +X399: T "MW200"; + + CALL "DatenOut" + ( SSDB := "MW178" , + SSDW := 0 , + PARA := WORD#16#0E00 , //Nach angegeben Datenbyte suchen (Abzweig-Ziel) + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M200.0 , + Position := "MW196" + ); + + UN "M199.7" ;//Datensatz ist nicht vorhanden + SPB En03; + + U "M208.5" ;//Weiche für PLC-Ziel disabled ! + SPB X398; + + L "MW226"; +X400: T #Sorter_MB3121.Separator.Default_Ziel; + +En03: NOP 0; + +NETWORK +TITLE = Störungen + CALL "Err_vorhanden" //Störungsanzeige + ( Check_DB := 708 , + Anfangs_DW := DINT#206 , + Ende_DW := DINT#314 , + Stoerung := #Error_aktiv , + ErrDW := #Err_DW , + ErrBits := #Err_Bits + ); + U #Error_aktiv ;//s.o. + = #Error_aktiv ;//Sorter Lager Weichen-Störung (Sorter-Antrieb gestoppt!) + + U "BG3120" ;//Verlassen-Sensor + L S5T#250MS; + SA "T140"; + +NETWORK +TITLE = Störung quittieren UZ7102/7103 + U "DOutbound_Bereich".A01_UZ7102.StOk_aktiv; + O "DOutbound_Bereich".A01_UZ7103.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Umschaltung Sorter 3121 / Sorter3123 + U "MB3121"; + S #Aus_Sorter_3121_gefahren; + UN "BG3121"; + R #Sorter3121_Ok; + U "MB3123"; + S #Aus_Sorter_3123_gefahren; + UN "BG3123"; + R #Sorter3123_Ok; + + L #Sorter_MB3121.Dyn.Stop_Ursache; + L 16#B116; + ==I; + = #Sorter_3121_startbereit; + U #Sorter_3121_startbereit; + UN #Aus_Sorter_3121_gefahren; + S #Sorter3121_Ok; + SPB En05; + + L #Sorter_MB3123.Dyn.Stop_Ursache; + L 16#B116; + ==I; + = #Sorter_3123_startbereit; + U #Sorter_3123_startbereit; + UN #Aus_Sorter_3123_gefahren; + S #Sorter3123_Ok; + SPB En05; + + SET ;//Es kann keiner fahren + U(; + O #Sorter_3121_startbereit; + O #Sorter_3123_startbereit; + ); + UN "BG3120" ;//Sync-Sensor + UN "MB3121" ;//Keiner mehr offen + UN "MB3123"; + L s5t#1s; + SE "T11"; + U "T11"; + R #Aus_Sorter_3121_gefahren; + R #Aus_Sorter_3123_gefahren; + +En05: NOP 0; + +NETWORK +TITLE = Sorter-GesamtReset + +//Sorter-Reset starten: + U "DVP_OmniFahren".Schleuse_3121.Dyn.Status.Reset_aktiv;//Bei Schleusen-Reset -> Sorter mit resetten! + UN "DVP_Sorter_A".Sorter_MB3121.Dyn.GesamtSorterReset_aktiv; + S "DVP_Sorter_A".Sorter_MB3121.Dyn.GesamtSorterReset; + + U "DVP_OmniFahren".Schleuse_3123.Dyn.Status.Reset_aktiv;//Bei Schleusen-Reset -> Sorter mit resetten! + UN "DVP_Sorter_A".Sorter_MB3123.Dyn.GesamtSorterReset_aktiv; + S "DVP_Sorter_A".Sorter_MB3123.Dyn.GesamtSorterReset; + +NETWORK +TITLE = Separator 3121 vor Sorter (Von Kontrollplatz) + L %DB708.DBW204 ;//Err beim Synchronisieren + L 0;//Störung vorhanden ? + ==I;//Nein ! + UN #Sync_BG3120.Dyn.Stop;//Rein-Separator stoppen + UN #Error_aktiv;//Sorter Batch Weichen-Störung (Sorter-Antrieb gestoppt!) +//Aufteilung Sep 1 <> Sep 2 + UN "MB3123"; + U #Sorter3121_Ok; + UN #Sorter_MB3121.Dyn.GesamtSorterReset_aktiv; + UN #Sorter_MB3123.Dyn.GesamtSorterReset_aktiv; + U "SF0122"; +/// U "M83.1" /// + = #Start_Ok; + + SET ;//Da Leiste im Sep und Zusatz-Zylinder im Separator -> BT steht sofort sauber im Sep + S #Sorter_MB3121.Dyn.BT_beruhigt;//1. einfahrender BügelTräger ist im Sep + + U "T140"; + = #Sorter_MB3121.B_AusSep;//Entprellung Verlassen-Sensor + +//Triggern / Scanner-Auswertung über HW>VP_Omnifahren (FC128/27) +//Ziel über Default-Ziel (HW>VP_Ziel_FC, FC181) + SET; + R #ErrAnz; + + CALL #Sorter_MB3121 + ( Separator_Nr := 3121 , + ErrQuit := #ErrQuit , + B_ImSep := "BG3121" , + B_Pinsensor := "BG3125" , + Start_Ok := #Start_Ok , + Antrieb_aktiv := "MA0145" , + Antrieb_plus_aktiv := "MA0145" , + Y_Sep_Auf := "DVP_Zylinder".Sorter_3121.Stat.Ast , + Sorter_Reset := #Sorter1Reset , + Error := %DB708.DBW200 , + Antrieb_start := "DHWtoVP_Antriebe".MA0144.Stat.A_vor , + Antrieb_plus_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +//Default-Ziel jeden Zyklus neu!: + L 0; + T #Sorter_MB3121.Separator.Default_Ziel; + +//Dieser Sorter-Rein-Sep ist aktiv: + U "DVP_Zylinder".Sorter_3121.Stat.Ast; + R "DVP_Zylinder".Weiche_3120.Stat.Ast;//Weiche vor Sorter-Strang + +//Quer-Antrieb einschalten: + U "MB3121"; + S "DVP_Antriebe".MA0152.Stat.A_vor; + +NETWORK +TITLE = Separator 3123 vor Sorter (Von Rückführstrecke) + L %DB708.DBW204 ;//Err beim Synchronisieren + L 0;//Störung vorhanden ? + ==I;//Nein ! + UN #Sync_BG3120.Dyn.Stop;//Rein-Separator stoppen + UN #Error_aktiv;//Sorter Batch Weichen-Störung (Sorter-Antrieb gestoppt!) +//Aufteilung Sep 1 <> Sep 2 + UN "MB3121"; + U #Sorter3123_Ok; + UN #Sorter_MB3121.Dyn.GesamtSorterReset_aktiv; + UN #Sorter_MB3123.Dyn.GesamtSorterReset_aktiv; + = #Start_Ok; + + SET ;//Da Leiste im Sep und Zusatz-Zylinder im Separator -> BT steht sofort sauber im Sep + S #Sorter_MB3123.Dyn.BT_beruhigt;//1. einfahrender BügelTräger ist im Sep + + U "T140"; + = #Sorter_MB3123.B_AusSep;//Entprellung Verlassen-Sensor + +//Triggern / Scanner-Auswertung über MOmniSchleuse(FB274) +//Ziel über Default-Ziel (ZG_Ziel_FC, FC2181) + + CALL #Sorter_MB3123 + ( Separator_Nr := 3123 , + ErrQuit := #ErrQuit , + B_ImSep := "BG3123" , + B_Pinsensor := "BG3125" , + Start_Ok := #Start_Ok , + Antrieb_aktiv := "MA0152" , + Antrieb_plus_aktiv := "MA0145" , + Y_Sep_Auf := "DVP_Zylinder".Sorter_3123.Stat.Ast , + Sorter_Reset := #Sorter2Reset , + Error := %DB708.DBW202 , + Antrieb_start := "DVP_Antriebe".MA0152.Stat.A_vor , + Antrieb_plus_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0152.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +//Default-Ziel jeden Zyklus neu!: + L 0; + T #Sorter_MB3123.Separator.Default_Ziel;///wird pro Zyklus vom Ziel-FC übergeben! + +//Dieser Sorter-Rein-Sep ist aktiv: + U "DVP_Zylinder".Sorter_3123.Stat.Ast; + S "DVP_Zylinder".Weiche_3120.Stat.Ast;//Weiche vor Sorter-Strang + +NETWORK +TITLE = Reset ist aktiv + U #Sorter_MB3121.Dyn.GesamtSorterReset_aktiv; + = "7_HMI_Err_UH07_OB".Sorter_MB3121.Reset_aktiv; + U #Sorter_MB3123.Dyn.GesamtSorterReset_aktiv; + = "7_HMI_Err_UH07_OB".Sorter_MB3123.Reset_aktiv; + + U #Sorter_MB3121.Dyn.GesamtSorterReset_aktiv; + O #Sorter_MB3123.Dyn.GesamtSorterReset_aktiv; + = #Weiche_VP1.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP2.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP3.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP4.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP5.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP6.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP7.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP8.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP9.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP10.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP11.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP12.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP13.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP14.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP15.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP16.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP17.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP18.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP19.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP20.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP21.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP22.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP23.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP24.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP25.Dyn.Ohne_VerklemmKontrolle; + +//Diesen Sorterbereich zurücksetzen: + U #Sorter1Reset;//Ein Zyklus + O #Sorter2Reset ;//Ein Zyklus + S #Sync_BG3120.Dyn.Reset; + S #Weiche_VP1.Dyn.Status.Reset; + S #Weiche_VP2.Dyn.Status.Reset; + S #Weiche_VP3.Dyn.Status.Reset; + S #Weiche_VP4.Dyn.Status.Reset; + S #Weiche_VP5.Dyn.Status.Reset; + S #Weiche_VP6.Dyn.Status.Reset; + S #Weiche_VP7.Dyn.Status.Reset; + S #Weiche_VP8.Dyn.Status.Reset; + S #Weiche_VP9.Dyn.Status.Reset; + S #Weiche_VP10.Dyn.Status.Reset; + S #Weiche_VP11.Dyn.Status.Reset; + S #Weiche_VP12.Dyn.Status.Reset; + S #Weiche_VP13.Dyn.Status.Reset; + S #Weiche_VP14.Dyn.Status.Reset; + S #Weiche_VP15.Dyn.Status.Reset; + S #Weiche_VP16.Dyn.Status.Reset; + S #Weiche_VP17.Dyn.Status.Reset; + S #Weiche_VP18.Dyn.Status.Reset; + S #Weiche_VP19.Dyn.Status.Reset; + S #Weiche_VP20.Dyn.Status.Reset; + S #Weiche_VP21.Dyn.Status.Reset; + S #Weiche_VP22.Dyn.Status.Reset; + S #Weiche_VP23.Dyn.Status.Reset; + S #Weiche_VP24.Dyn.Status.Reset; + S #Weiche_VP25.Dyn.Status.Reset; + +NETWORK +TITLE = Inkremente über Zahnrad-Sensor + CALL #Impuls_BG3125 + ( Ink_DB := 1483 , + B_Zaehlen := "BG3125" , + Antrieb_aktiv := "MA0145" , + Quit := #ErrQuit , + Err_Kein_Signal := "7_HMI_Err_UH07_OB".Impulsgeber_3004.Kein_Signal , + Err_Signal_zu_lang := "7_HMI_Err_UH07_OB".Impulsgeber_3004.Signal_zu_lang + ); + + U(; + O "7_HMI_Err_UH07_OB".Impulsgeber_3004.Kein_Signal; + O "7_HMI_Err_UH07_OB".Impulsgeber_3004.Signal_zu_lang; + ); + UN #ErrQuit; + S "DVP_Antriebe".MA0145.Stat.Stop_vor; + + U(; + O "7_HMI_Err_UH07_OB".Impulsgeber_3004.Kein_Signal; + O "7_HMI_Err_UH07_OB".Impulsgeber_3004.Signal_zu_lang; + ); + S #ErrAnz; + +NETWORK +TITLE = Sorter A-Antrieb nicht aktiv beim/nach Synchronisieren + +//Antriebe Sorter A starten: + U "DVP_Sensoren".An_BG3120.Stat.B_Akt;//damit Zeit ablaufen kann + S "DVP_Antriebe".MA0152.Stat.A_vor;//Quer-Zuführung an + S "DVP_Antriebe".MA0145.Stat.A_start;//Sorter A starten + +//Antrieb M0152 stoppen, da sonst Lücke zwischen 2 Trolleys kleiner wird + U "DVP_Sensoren".An_BG3120.Stat.B_Akt;//Mit Zeitverzögerung! + UN "MA0145" ;//Aber Antrieb Sorter A nicht aktiv + S "DVP_Antriebe".MA0152.Stat.A_PS;//Nicht stoppen, da sonst Lager-Ausfahrt blockiert + +NETWORK +TITLE = Trolley synchronisieren BG3120 + +//Teachen: Ref-Sensor ueber Sync-Sensor + U "BG3120"; + UN #Sync_BG3120.Dyn.Refpunkt_ok;//Nur eimalige Auswertung + = #Sync_BG3120.B_RefPunkt;//uebergabe fuer unten + + U "MA0145"; + L S5T#500ms; + SA "T143"; + U "T143"; + UN #Sync_BG3120.Dyn.Status.TeachModus_Aktiv;//sonst Probleme bei Doppelimpuls + O; + U "MA0145"; + U #Sync_BG3120.Dyn.Status.TeachModus_Aktiv;//sonst Probleme bei Doppelimpuls + = #Antrieb; + +//Keine Hauptstrangdaten vorhanden ? (Fuer Sync-Pkt): + L "VP_HS_A_oF".Datensortkopf.AnzahlEintraege; + L "VP_HS_A_mF".Datensortkopf.AnzahlEintraege; + +I; + L 0;//Daten vorhanden ? + ==I;//Nein ! + = "Hauptstrang_leer";//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + + U "BG3120"; + L s5t#500ms;//Da trotz Entprellung Doppel-Impulse + SA "T144"; + U "T144"; + = #Sync_BG3120.B_BT_da; + + CALL #Sync_BG3120 + ( Sync_Nr := 3120 , + ErrQuit := #ErrQuit , + B_TeachPunk := "BG3074" , //Teach-Sensor + Antrieb_aktiv := #Antrieb , + Error := %DB708.DBW204 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + hStOk := #ErrAnz + ); + + U #Sync_BG3120.Dyn.Error.Inkrementalgeber; + S "DVP_Antriebe".MA0145.Stat.Stop_vor; + +//Keine Hauptstrangdaten vorhanden ?: + L "VP_HS_A_oF".Datensortkopf.AnzahlEintraege; + L "VP_HS_A_mF".Datensortkopf.AnzahlEintraege; + +I; + L 0;//Daten vorhanden ? + ==I;//Nein ! + = "Hauptstrang_leer" ;//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + +//Reservierungen können gelöscht werden: + L "VP_TravelFIFO_A".Travel_FIFO_BG3120.FIFO.ANZAHL; + L 0;//Daten vorhanden ? + ==I;//Nein ! + U "Hauptstrang_leer" ;//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + = #Sorter_A_leer; + +NETWORK +TITLE = Weiche 3087 / Vollpuffer VP1 + CALL #Weiche_VP1 + ( Weichen_Nr := 1 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP1.Stat.B_Akt , + B_Ausfahrt := "BG3087" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP1.Stat.Ast , + Error := %DB708.DBW210 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3086 / Vollpuffer VP2 + CALL #Weiche_VP2 + ( Weichen_Nr := 2 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP2.Stat.B_Akt , + B_Ausfahrt := "BG3086" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP2.Stat.Ast , + Error := %DB708.DBW212 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3085 / Vollpuffer VP3 + CALL #Weiche_VP3 + ( Weichen_Nr := 3 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP3.Stat.B_Akt , + B_Ausfahrt := "BG3085" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP3.Stat.Ast , + Error := %DB708.DBW214 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3084 / Vollpuffer VP4 + CALL #Weiche_VP4 + ( Weichen_Nr := 4 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP4.Stat.B_Akt , + B_Ausfahrt := "BG3084" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP4.Stat.Ast , + Error := %DB708.DBW216 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3083 / Vollpuffer VP5 + CALL #Weiche_VP5 + ( Weichen_Nr := 5 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP5.Stat.B_Akt , + B_Gerade := "BG3062" , + B_Ausfahrt := "BG3083" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP5.Stat.Ast , + Error := %DB708.DBW218 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3082 / Vollpuffer VP6 + CALL #Weiche_VP6 + ( Weichen_Nr := 6 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP6.Stat.B_Akt , + B_Ausfahrt := "BG3082" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP6.Stat.Ast , + Error := %DB708.DBW220 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3081 / Vollpuffer VP7 + CALL #Weiche_VP7 + ( Weichen_Nr := 7 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP7.Stat.B_Akt , + B_Ausfahrt := "BG3081" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP7.Stat.Ast , + Error := %DB708.DBW222 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3080 / Vollpuffer VP8 + CALL #Weiche_VP8 + ( Weichen_Nr := 8 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP8.Stat.B_Akt , + B_Ausfahrt := "BG3080" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP8.Stat.Ast , + Error := %DB708.DBW224 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3077 / Vollpuffer VP9 + CALL #Weiche_VP9 + ( Weichen_Nr := 9 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP9.Stat.B_Akt , + B_Ausfahrt := "BG3077" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP9.Stat.Ast , + Error := %DB708.DBW226 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3076 / Vollpuffer VP10 + CALL #Weiche_VP10 + ( Weichen_Nr := 10 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP10.Stat.B_Akt , + B_Ausfahrt := "BG3076" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP10.Stat.Ast , + Error := %DB708.DBW228 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3075 / Vollpuffer VP11 + CALL #Weiche_VP11 + ( Weichen_Nr := 11 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP11.Stat.B_Akt , + B_Ausfahrt := "BG3075" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP11.Stat.Ast , + Error := %DB708.DBW230 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3074 / Vollpuffer VP12 + CALL #Weiche_VP12 + ( Weichen_Nr := 12 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP12.Stat.B_Akt , + B_Gerade := "BG3061" , + B_Ausfahrt := "BG3074" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP12.Stat.Ast , + Error := %DB708.DBW232 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3073 / Vollpuffer VP13 + CALL #Weiche_VP13 + ( Weichen_Nr := 13 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP13.Stat.B_Akt , + B_Ausfahrt := "BG3073" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP13.Stat.Ast , + Error := %DB708.DBW234 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3072 / Vollpuffer VP14 + CALL #Weiche_VP14 + ( Weichen_Nr := 14 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP14.Stat.B_Akt , + B_Ausfahrt := "BG3072" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP14.Stat.Ast , + Error := %DB708.DBW236 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3071 / Vollpuffer VP15 + CALL #Weiche_VP15 + ( Weichen_Nr := 15 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP15.Stat.B_Akt , + B_Ausfahrt := "BG3071" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP15.Stat.Ast , + Error := %DB708.DBW238 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3070 / Vollpuffer VP16 + CALL #Weiche_VP16 + ( Weichen_Nr := 16 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP16.Stat.B_Akt , + B_Ausfahrt := "BG3070" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP16.Stat.Ast , + Error := %DB708.DBW240 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3067 / Vollpuffer VP17 + CALL #Weiche_VP17 + ( Weichen_Nr := 17 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP17.Stat.B_Akt , + B_Ausfahrt := "BG3067" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP17.Stat.Ast , + Error := %DB708.DBW242 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3066 / Vollpuffer VP18 + CALL #Weiche_VP18 + ( Weichen_Nr := 18 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP18.Stat.B_Akt , + B_Gerade := "BG3060" , + B_Ausfahrt := "BG3066" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP18.Stat.Ast , + Error := %DB708.DBW244 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3065 / Vollpuffer VP19 + CALL #Weiche_VP19 + ( Weichen_Nr := 19 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP19.Stat.B_Akt , + B_Ausfahrt := "BG3065" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP19.Stat.Ast , + Error := %DB708.DBW246 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3064 / Vollpuffer VP20 + CALL #Weiche_VP20 + ( Weichen_Nr := 20 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP20.Stat.B_Akt , + B_Ausfahrt := "BG3064" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP20.Stat.Ast , + Error := %DB708.DBW248 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3063 / Vollpuffer VP21 + CALL #Weiche_VP21 + ( Weichen_Nr := 21 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP21.Stat.B_Akt , + B_Ausfahrt := "BG3063" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP21.Stat.Ast , + Error := %DB708.DBW250 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3027 / Vollpuffer VP22 + CALL #Weiche_VP22 + ( Weichen_Nr := 22 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP22.Stat.B_Akt , + B_Ausfahrt := "BG3027" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP22.Stat.Ast , + Error := %DB708.DBW252 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3026 / Vollpuffer VP23 + CALL #Weiche_VP23 + ( Weichen_Nr := 23 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP23.Stat.B_Akt , + B_Ausfahrt := "BG3026" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP23.Stat.Ast , + Error := %DB708.DBW254 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3025 / Vollpuffer VP24 + CALL #Weiche_VP24 + ( Weichen_Nr := 24 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP24.Stat.B_Akt , + B_Ausfahrt := "BG3025" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP24.Stat.Ast , + Error := %DB708.DBW256 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3024 / Vollpuffer VP25 + CALL #Weiche_VP25 + ( Weichen_Nr := 25 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP25.Stat.B_Akt , + B_Gerade := "BG3003" , + B_Ausfahrt := "BG3024" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP25.Stat.Ast , + Error := %DB708.DBW258 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Übergabe BG3003 + CALL #Übergabe_B3003 + ( Uebergabe_Nr := 3003 , + KorrekturFaktor := 1.0 , + ErrQuit := #ErrQuit , + Antrieb_aktiv := #Antrieb , + Error := %DB708.DBW206 , + Antrieb_start := "DVP_Antriebe".MA0145.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0145.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Sorter B-Antrieb nicht aktiv bei Übergabe (Daten in Travel-FIFO B) + L "VP_TravelFIFO_B".Travel_FIFO_BG3003.FIFO.ANZAHL; + L 0;//Daten vorhanden ? + >I;//Ja ! + O "DVP_Sensoren".An_BG3003.Stat.B_Akt;//Mit Zeitverzögerung! + = #Trolley_dazwischen; + +//Antrieb Sorter B starten: + L "DVP_Sorter_B".Weiche_VP26.Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + L DINT#0 ;//schon bekannt ? + >D;//Ja ! + U "DVP_Sorter_B".Weiche_VP26.Y_Weiche_geradeaus; + O #Trolley_dazwischen; + S "DVP_Antriebe".MA0145.Stat.A_vor;//Sorter A an + S "DVP_Antriebe".MA0146.Stat.A_start;//Sorter B starten + +//Antrieb Sorter A stoppen: + U #Trolley_dazwischen; + UN "MA0146" ;//Aber Antrieb Sorter B nicht aktiv + S "DVP_Antriebe".MA0145.Stat.Stop_vor; + = "7_HMI_Err_UH07_OB".Sorter_Vollpuffer."Sorter A stop"; + +NETWORK +TITLE = Störungen anzeigen UZ7102/7103 + U #ErrAnz; + S "DOutbound_Bereich".A01_UZ7102.StOk_blinken; + S "DOutbound_Bereich".A01_UZ7103.StOk_blinken; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Sorter_Vollpuffer/VP_Sorter_B.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Sorter_Vollpuffer/VP_Sorter_B.awl index a6e86f0..4d68ebd 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Sorter_Vollpuffer/VP_Sorter_B.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/Sorter_Vollpuffer/VP_Sorter_B.awl @@ -1,377 +1,690 @@ -=== FB 1523: VP_Sorter_B [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Sync_BG3003 : "MStartSync" - Frei300 : Array[1..75] of Word - Weiche_VP26 : "MWeiche_Sorter" - Weiche_VP27 : "MWeiche_Sorter" - Weiche_VP28 : "MWeiche_Sorter" - Weiche_VP29 : "MWeiche_Sorter" - Weiche_VP30 : "MWeiche_Sorter" - Weiche_VP31 : "MWeiche_Sorter" - Weiche_VP32 : "MWeiche_Sorter" - Weiche_VP33 : "MWeiche_Sorter" - Weiche_VP34 : "MWeiche_Sorter" - Weiche_VP35 : "MWeiche_Sorter" - Weiche_VP36 : "MWeiche_Sorter" - Weiche_VP37 : "MWeiche_Sorter" - Weiche_VP38 : "MWeiche_Sorter" - Weiche_VP39 : "MWeiche_Sorter" - Weiche_VP40 : "MWeiche_Sorter" - Weiche_VP41 : "MWeiche_Sorter" - Weiche_VP42 : "MWeiche_Sorter" - Weiche_VP43 : "MWeiche_Sorter" - Weiche_VP44 : "MWeiche_Sorter" - Weiche_VP45 : "MWeiche_Sorter" - Weiche_VP46 : "MWeiche_Sorter" - Weiche_VP47 : "MWeiche_Sorter" - Weiche_VP48 : "MWeiche_Sorter" - Weiche_VP49 : "MWeiche_Sorter" - Weiche_VP50 : "MWeiche_Sorter" - Weiche_VP51 : "MWeiche_Sorter" - Impuls_BG3004 : "MImpulsGeber" - Sorter_B_leer : Bool - Temp: - ErrQuit : Bool - ErrAnz : Bool - Antrieb : Bool - Stau : Bool - Start_Ok : Bool - Error_aktiv : Bool - Leer : Bool - Err_DW : DInt - Err_Bits : Int - Constant: - ---- NW 1: Systemzeug --- -// Kein Sorterbeginn, nur Weichen - -// Sonderbetriebsarten Weichen: - CLR - = Weiche_VP26.Dyn.Status.Weichentest_aktiv - = Weiche_VP27.Dyn.Status.Weichentest_aktiv - = Weiche_VP28.Dyn.Status.Weichentest_aktiv - = Weiche_VP29.Dyn.Status.Weichentest_aktiv - = Weiche_VP30.Dyn.Status.Weichentest_aktiv - = Weiche_VP31.Dyn.Status.Weichentest_aktiv - = Weiche_VP32.Dyn.Status.Weichentest_aktiv - = Weiche_VP33.Dyn.Status.Weichentest_aktiv - = Weiche_VP34.Dyn.Status.Weichentest_aktiv - = Weiche_VP35.Dyn.Status.Weichentest_aktiv - = Weiche_VP36.Dyn.Status.Weichentest_aktiv - = Weiche_VP37.Dyn.Status.Weichentest_aktiv - = Weiche_VP38.Dyn.Status.Weichentest_aktiv - = Weiche_VP39.Dyn.Status.Weichentest_aktiv - = Weiche_VP40.Dyn.Status.Weichentest_aktiv - = Weiche_VP41.Dyn.Status.Weichentest_aktiv - = Weiche_VP42.Dyn.Status.Weichentest_aktiv - = Weiche_VP43.Dyn.Status.Weichentest_aktiv - = Weiche_VP44.Dyn.Status.Weichentest_aktiv - = Weiche_VP45.Dyn.Status.Weichentest_aktiv - = Weiche_VP46.Dyn.Status.Weichentest_aktiv - = Weiche_VP47.Dyn.Status.Weichentest_aktiv - = Weiche_VP48.Dyn.Status.Weichentest_aktiv - = Weiche_VP49.Dyn.Status.Weichentest_aktiv - = Weiche_VP50.Dyn.Status.Weichentest_aktiv - = Weiche_VP51.Dyn.Status.Weichentest_aktiv - - A Sync_BG3003.Dyn.Status.TeachModus_Aktiv - = Weiche_VP26.Dyn.Status.TeachModus_aktiv - = Weiche_VP27.Dyn.Status.TeachModus_aktiv - = Weiche_VP28.Dyn.Status.TeachModus_aktiv - = Weiche_VP29.Dyn.Status.TeachModus_aktiv - = Weiche_VP30.Dyn.Status.TeachModus_aktiv - = Weiche_VP31.Dyn.Status.TeachModus_aktiv - = Weiche_VP32.Dyn.Status.TeachModus_aktiv - = Weiche_VP33.Dyn.Status.TeachModus_aktiv - = Weiche_VP34.Dyn.Status.TeachModus_aktiv - = Weiche_VP35.Dyn.Status.TeachModus_aktiv - = Weiche_VP36.Dyn.Status.TeachModus_aktiv - = Weiche_VP37.Dyn.Status.TeachModus_aktiv - = Weiche_VP38.Dyn.Status.TeachModus_aktiv - = Weiche_VP39.Dyn.Status.TeachModus_aktiv - = Weiche_VP40.Dyn.Status.TeachModus_aktiv - = Weiche_VP41.Dyn.Status.TeachModus_aktiv - = Weiche_VP42.Dyn.Status.TeachModus_aktiv - = Weiche_VP43.Dyn.Status.TeachModus_aktiv - = Weiche_VP44.Dyn.Status.TeachModus_aktiv - = Weiche_VP45.Dyn.Status.TeachModus_aktiv - = Weiche_VP46.Dyn.Status.TeachModus_aktiv - = Weiche_VP47.Dyn.Status.TeachModus_aktiv - = Weiche_VP48.Dyn.Status.TeachModus_aktiv - = Weiche_VP49.Dyn.Status.TeachModus_aktiv - = Weiche_VP50.Dyn.Status.TeachModus_aktiv - = Weiche_VP51.Dyn.Status.TeachModus_aktiv - - L 1474 // DLSeps - T "MW174" - L 1578 // DLWeichen - T "MW178" - -// Nach neuen Daten suchen: - A "1s-Impuls" - = "Weiche_NewData" - - ---- NW 2: Störung quittieren UZ7103/7106 --- - A "DOutbound_Bereich".A01_UZ7103.StOk_aktiv - O "DOutbound_Bereich".A01_UZ7106.StOk_aktiv - = ErrQuit - - ---- NW 3: Reset ist aktiv --- - A "DVP_Sorter_A".Sorter_MB3121.Dyn.GesamtSorterReset_aktiv - O "DVP_Sorter_A".Sorter_MB3123.Dyn.GesamtSorterReset_aktiv - = Weiche_VP26.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP27.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP28.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP29.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP30.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP31.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP32.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP33.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP34.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP35.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP36.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP37.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP38.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP39.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP40.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP41.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP42.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP43.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP44.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP45.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP46.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP47.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP48.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP49.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP50.Dyn.Ohne_VerklemmKontrolle - = Weiche_VP51.Dyn.Ohne_VerklemmKontrolle - -// Diesen Sorterbereich zurücksetzen: - A "DVP_Sorter_A".Sorter1Reset // Ein Zyklus - O "DVP_Sorter_A".Sorter2Reset // Ein Zyklus - S Sync_BG3003.Dyn.Reset - S Weiche_VP26.Dyn.Status.Reset - S Weiche_VP27.Dyn.Status.Reset - S Weiche_VP28.Dyn.Status.Reset - S Weiche_VP29.Dyn.Status.Reset - S Weiche_VP30.Dyn.Status.Reset - S Weiche_VP31.Dyn.Status.Reset - S Weiche_VP32.Dyn.Status.Reset - S Weiche_VP33.Dyn.Status.Reset - S Weiche_VP34.Dyn.Status.Reset - S Weiche_VP35.Dyn.Status.Reset - S Weiche_VP36.Dyn.Status.Reset - S Weiche_VP37.Dyn.Status.Reset - S Weiche_VP38.Dyn.Status.Reset - S Weiche_VP39.Dyn.Status.Reset - S Weiche_VP40.Dyn.Status.Reset - S Weiche_VP41.Dyn.Status.Reset - S Weiche_VP42.Dyn.Status.Reset - S Weiche_VP43.Dyn.Status.Reset - S Weiche_VP44.Dyn.Status.Reset - S Weiche_VP45.Dyn.Status.Reset - S Weiche_VP46.Dyn.Status.Reset - S Weiche_VP47.Dyn.Status.Reset - S Weiche_VP48.Dyn.Status.Reset - S Weiche_VP49.Dyn.Status.Reset - S Weiche_VP50.Dyn.Status.Reset - S Weiche_VP51.Dyn.Status.Reset - - ---- NW 4: Inkremente über Zahnrad-Sensor --- -CALL FB "None" , (Ink_DB:=1583, B_Zaehlen:="BG3004", Antrieb_aktiv:="MA0146", Quit:=ErrQuit, Zeit_Signal_zu_lang:=?, Zeit_Kein_Signal:=?, Signal:=?, Err_Kein_Signal:="7_HMI_Err_UH07_OB".Impulsgeber_3004.Kein_Signal, Err_Signal_zu_lang:="7_HMI_Err_UH07_OB".Impulsgeber_3004.Signal_zu_lang) - - A( - O "7_HMI_Err_UH07_OB".Impulsgeber_3004.Kein_Signal - O "7_HMI_Err_UH07_OB".Impulsgeber_3004.Signal_zu_lang - ) - AN ErrQuit - S "DVP_Antriebe".MA0146.Stat.Stop_vor - - A( - O "7_HMI_Err_UH07_OB".Impulsgeber_3004.Kein_Signal - O "7_HMI_Err_UH07_OB".Impulsgeber_3004.Signal_zu_lang - ) - = ErrAnz - - ---- NW 5: Trolley synchronisieren BG3003 --- -// Teachen: Ref-Sensor ueber Sync-Sensor - A "BG3003" - AN Sync_BG3003.Dyn.Refpunkt_ok // Nur eimalige Auswertung - = Sync_BG3003.B_RefPunkt // uebergabe fuer unten - - A "MA0146" - L S5T#500ms - OffDelay "T153" - A "T153" - AN Sync_BG3003.Dyn.Status.TeachModus_Aktiv // sonst Probleme bei Doppelimpuls - O - A "MA0146" - A Sync_BG3003.Dyn.Status.TeachModus_Aktiv // sonst Probleme bei Doppelimpuls - = Antrieb - -// Keine Hauptstrangdaten vorhanden ? (Fuer Sync-Pkt): - L "VP_HS_B_oF".Datensortkopf.AnzahlEintraege - L "VP_HS_B_mF".Datensortkopf.AnzahlEintraege - +I - L 0 // Daten vorhanden ? - ==I // Nein ! - = "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - - A "BG3003" - L s5t#500ms // Da trotz Entprellung Doppel-Impulse - OffDelay "T154" - A "T154" - = Sync_BG3003.B_BT_da - -CALL FB "None" , (Sync_Nr:=3003, ErrQuit:=ErrQuit, B_BT_da:=?, B_RefPunkt:=?, B_TeachPunk:="BG3007", Antrieb_aktiv:=Antrieb, Error:=DB708.DBW208, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, hStOk:=ErrAnz) // Teach-Sensor - - A Sync_BG3003.Dyn.Error.Inkrementalgeber - S "DVP_Antriebe".MA0146.Stat.Stop_vor - -// Keine Hauptstrangdaten vorhanden ?: - L "VP_HS_B_oF".Datensortkopf.AnzahlEintraege - L "VP_HS_B_mF".Datensortkopf.AnzahlEintraege - +I - L 0 // Daten vorhanden ? - ==I // Nein ! - = "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - -// Reservierungen können gelöscht werden: - L "VP_TravelFIFO_B".Travel_FIFO_BG3003.FIFO.ANZAHL - L 0 // Daten vorhanden ? - ==I // Nein ! - A "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - = Sorter_B_leer - - ---- NW 6: Weiche 3023 / Vollpuffer VP26 --- -CALL FB "None" , (Weichen_Nr:=26, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP26.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3023", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP26.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW260, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 7: Weiche 3022/ Vollpuffer VP27 --- -CALL FB "None" , (Weichen_Nr:=27, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP27.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3022", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP27.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW262, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 8: Weiche 3021 / Vollpuffer VP28 --- -CALL FB "None" , (Weichen_Nr:=28, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP28.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3021", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP28.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW264, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 9: Weiche 3020/ Vollpuffer VP29 --- -CALL FB "None" , (Weichen_Nr:=29, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP29.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3020", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP29.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW266, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 10: Weiche 3017 / Vollpuffer VP30 --- -CALL FB "None" , (Weichen_Nr:=30, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP30.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3017", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP30.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW268, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 11: Weiche 3016 / Vollpuffer VP31 --- -CALL FB "None" , (Weichen_Nr:=31, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP31.Stat.B_Akt, B_Gerade:="BG3002", B_Ausfahrt:="BG3016", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP31.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW270, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 12: Weiche 3015 / Vollpuffer VP32 --- -CALL FB "None" , (Weichen_Nr:=32, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP32.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3015", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP32.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW272, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 13: Weiche 3014 / Vollpuffer VP33 --- -CALL FB "None" , (Weichen_Nr:=33, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP33.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3014", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP33.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW274, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 14: Weiche 3013 / Vollpuffer VP34 --- -CALL FB "None" , (Weichen_Nr:=34, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP34.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3013", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP34.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW276, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 15: Weiche 3012 / Vollpuffer VP35 --- -CALL FB "None" , (Weichen_Nr:=35, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP35.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3012", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP35.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW278, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 16: Weiche 3011/ Vollpuffer VP36 --- -CALL FB "None" , (Weichen_Nr:=36, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP36.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3011", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP36.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW280, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 17: Weiche 3010 / Vollpuffer VP37 --- -CALL FB "None" , (Weichen_Nr:=37, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP37.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3010", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP37.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW282, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 18: Weiche 3007 / Vollpuffer VP38 --- -CALL FB "None" , (Weichen_Nr:=38, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP38.Stat.B_Akt, B_Gerade:="BG3001", B_Ausfahrt:="BG3007", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP38.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW284, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 19: Weiche 3006 / Vollpuffer VP39 --- -CALL FB "None" , (Weichen_Nr:=39, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP39.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3006", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP39.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW286, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 20: Weiche 3005 / Vollpuffer VP40 --- -CALL FB "None" , (Weichen_Nr:=40, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP40.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3005", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP40.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW288, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 21: Weiche 3435 / Vollpuffer VP41 --- -CALL FB "None" , (Weichen_Nr:=41, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP41.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3435", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP41.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW290, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 22: Weiche 3434 / Vollpuffer VP42 --- -CALL FB "None" , (Weichen_Nr:=42, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP42.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3434", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP42.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW292, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 23: Weiche 3433 / Vollpuffer VP43 --- -CALL FB "None" , (Weichen_Nr:=43, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP43.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3433", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP43.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW294, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 24: Weiche 3432 / Vollpuffer VP44 --- -CALL FB "None" , (Weichen_Nr:=44, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP44.Stat.B_Akt, B_Gerade:="BG3420", B_Ausfahrt:="BG3432", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP44.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW296, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 25: Weiche 3431 / Vollpuffer VP45 --- -CALL FB "None" , (Weichen_Nr:=45, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP45.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3431", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP45.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW298, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 26: Weiche 3430 / Vollpuffer VP46 --- -CALL FB "None" , (Weichen_Nr:=46, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP46.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3430", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP46.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW300, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 27: Weiche 3427 / Vollpuffer VP47 --- -CALL FB "None" , (Weichen_Nr:=47, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP47.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3427", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP47.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW302, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 28: Weiche 3426 / Vollpuffer VP48 --- -CALL FB "None" , (Weichen_Nr:=48, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP48.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3426", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP48.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW304, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 29: Weiche 3425 / Vollpuffer VP49 --- -CALL FB "None" , (Weichen_Nr:=49, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP49.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3425", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP49.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW306, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 30: Weiche 3424 / Vollpuffer VP50 --- -CALL FB "None" , (Weichen_Nr:=50, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP50.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3424", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP50.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW308, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 31: Pseudo-Weiche 3423 / Vollpuffer VP51 --- -CALL FB "None" , (Weichen_Nr:=51, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DVP_Sensoren".Stau_VP51.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3423", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DVP_Zylinder".Weiche_VP51.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW310, Antrieb_start:="DVP_Antriebe".MA0146.Stat.A_start, Antrieb_stoppen:="DVP_Antriebe".MA0146.Stat.Stop_vor, hStOk:=ErrAnz) - -// Unbekannter Trolley kommt + Stau: - A "BG3422" - A "DVP_Sensoren".Stau_VP51.Stat.B_Akt - S "DVP_Antriebe".MA0146.Stat.Stop_vor - = "7_HMI_Err_UH07_OB".Sorter_Vollpuffer."Sorter B stop" - - - - - - ---- NW 32: Störungen anzeigen UZ7103/7106 --- - A ErrAnz - S "DOutbound_Bereich".A01_UZ7103.StOk_blinken - S "DOutbound_Bereich".A01_UZ7106.StOk_blinken - - ---- NW 33: Ende --- - BE +FUNCTION_BLOCK "VP_Sorter_B" +TITLE = Sorter B Vollpuffer 26-51 +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + Sync_BG3003 : "MStartSync"; + Frei300 : Array[1..75] of Word; + Weiche_VP26 : "MWeiche_Sorter"; + Weiche_VP27 : "MWeiche_Sorter"; + Weiche_VP28 : "MWeiche_Sorter"; + Weiche_VP29 : "MWeiche_Sorter"; + Weiche_VP30 : "MWeiche_Sorter"; + Weiche_VP31 : "MWeiche_Sorter"; + Weiche_VP32 : "MWeiche_Sorter"; + Weiche_VP33 : "MWeiche_Sorter"; + Weiche_VP34 : "MWeiche_Sorter"; + Weiche_VP35 : "MWeiche_Sorter"; + Weiche_VP36 : "MWeiche_Sorter"; + Weiche_VP37 : "MWeiche_Sorter"; + Weiche_VP38 : "MWeiche_Sorter"; + Weiche_VP39 : "MWeiche_Sorter"; + Weiche_VP40 : "MWeiche_Sorter"; + Weiche_VP41 : "MWeiche_Sorter"; + Weiche_VP42 : "MWeiche_Sorter"; + Weiche_VP43 : "MWeiche_Sorter"; + Weiche_VP44 : "MWeiche_Sorter"; + Weiche_VP45 : "MWeiche_Sorter"; + Weiche_VP46 : "MWeiche_Sorter"; + Weiche_VP47 : "MWeiche_Sorter"; + Weiche_VP48 : "MWeiche_Sorter"; + Weiche_VP49 : "MWeiche_Sorter"; + Weiche_VP50 : "MWeiche_Sorter"; + Weiche_VP51 : "MWeiche_Sorter"; + Impuls_BG3004 : "MImpulsGeber"; + Sorter_B_leer : Bool; + END_VAR + + VAR_TEMP + ErrQuit : Bool; + ErrAnz : Bool; + Antrieb : Bool; + Stau : Bool; + Start_Ok : Bool; + Error_aktiv : Bool; + Leer : Bool; + Err_DW : DInt; + Err_Bits : Int; + END_VAR + + +BEGIN +NETWORK +TITLE = Systemzeug + +//Kein Sorterbeginn, nur Weichen + +//Sonderbetriebsarten Weichen: + CLR; + = #Weiche_VP26.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP27.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP28.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP29.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP30.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP31.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP32.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP33.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP34.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP35.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP36.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP37.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP38.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP39.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP40.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP41.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP42.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP43.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP44.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP45.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP46.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP47.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP48.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP49.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP50.Dyn.Status.Weichentest_aktiv; + = #Weiche_VP51.Dyn.Status.Weichentest_aktiv; + + U #Sync_BG3003.Dyn.Status.TeachModus_Aktiv; + = #Weiche_VP26.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP27.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP28.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP29.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP30.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP31.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP32.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP33.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP34.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP35.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP36.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP37.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP38.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP39.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP40.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP41.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP42.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP43.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP44.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP45.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP46.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP47.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP48.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP49.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP50.Dyn.Status.TeachModus_aktiv; + = #Weiche_VP51.Dyn.Status.TeachModus_aktiv; + + L 1474;//DLSeps + T "MW174"; + L 1578 ;//DLWeichen + T "MW178"; + +//Nach neuen Daten suchen: + U "1s-Impuls"; + = "Weiche_NewData"; + +NETWORK +TITLE = Störung quittieren UZ7103/7106 + U "DOutbound_Bereich".A01_UZ7103.StOk_aktiv; + O "DOutbound_Bereich".A01_UZ7106.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Reset ist aktiv + U "DVP_Sorter_A".Sorter_MB3121.Dyn.GesamtSorterReset_aktiv; + O "DVP_Sorter_A".Sorter_MB3123.Dyn.GesamtSorterReset_aktiv; + = #Weiche_VP26.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP27.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP28.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP29.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP30.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP31.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP32.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP33.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP34.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP35.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP36.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP37.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP38.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP39.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP40.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP41.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP42.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP43.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP44.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP45.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP46.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP47.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP48.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP49.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP50.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_VP51.Dyn.Ohne_VerklemmKontrolle; + +//Diesen Sorterbereich zurücksetzen: + U "DVP_Sorter_A".Sorter1Reset;//Ein Zyklus + O "DVP_Sorter_A".Sorter2Reset ;//Ein Zyklus + S #Sync_BG3003.Dyn.Reset; + S #Weiche_VP26.Dyn.Status.Reset; + S #Weiche_VP27.Dyn.Status.Reset; + S #Weiche_VP28.Dyn.Status.Reset; + S #Weiche_VP29.Dyn.Status.Reset; + S #Weiche_VP30.Dyn.Status.Reset; + S #Weiche_VP31.Dyn.Status.Reset; + S #Weiche_VP32.Dyn.Status.Reset; + S #Weiche_VP33.Dyn.Status.Reset; + S #Weiche_VP34.Dyn.Status.Reset; + S #Weiche_VP35.Dyn.Status.Reset; + S #Weiche_VP36.Dyn.Status.Reset; + S #Weiche_VP37.Dyn.Status.Reset; + S #Weiche_VP38.Dyn.Status.Reset; + S #Weiche_VP39.Dyn.Status.Reset; + S #Weiche_VP40.Dyn.Status.Reset; + S #Weiche_VP41.Dyn.Status.Reset; + S #Weiche_VP42.Dyn.Status.Reset; + S #Weiche_VP43.Dyn.Status.Reset; + S #Weiche_VP44.Dyn.Status.Reset; + S #Weiche_VP45.Dyn.Status.Reset; + S #Weiche_VP46.Dyn.Status.Reset; + S #Weiche_VP47.Dyn.Status.Reset; + S #Weiche_VP48.Dyn.Status.Reset; + S #Weiche_VP49.Dyn.Status.Reset; + S #Weiche_VP50.Dyn.Status.Reset; + S #Weiche_VP51.Dyn.Status.Reset; + +NETWORK +TITLE = Inkremente über Zahnrad-Sensor + CALL #Impuls_BG3004 + ( Ink_DB := 1583 , + B_Zaehlen := "BG3004" , + Antrieb_aktiv := "MA0146" , + Quit := #ErrQuit , + Err_Kein_Signal := "7_HMI_Err_UH07_OB".Impulsgeber_3004.Kein_Signal , + Err_Signal_zu_lang := "7_HMI_Err_UH07_OB".Impulsgeber_3004.Signal_zu_lang + ); + + U(; + O "7_HMI_Err_UH07_OB".Impulsgeber_3004.Kein_Signal; + O "7_HMI_Err_UH07_OB".Impulsgeber_3004.Signal_zu_lang; + ); + UN #ErrQuit; + S "DVP_Antriebe".MA0146.Stat.Stop_vor; + + U(; + O "7_HMI_Err_UH07_OB".Impulsgeber_3004.Kein_Signal; + O "7_HMI_Err_UH07_OB".Impulsgeber_3004.Signal_zu_lang; + ); + = #ErrAnz; + +NETWORK +TITLE = Trolley synchronisieren BG3003 + +//Teachen: Ref-Sensor ueber Sync-Sensor + U "BG3003"; + UN #Sync_BG3003.Dyn.Refpunkt_ok;//Nur eimalige Auswertung + = #Sync_BG3003.B_RefPunkt;//uebergabe fuer unten + + U "MA0146"; + L S5T#500ms; + SA "T153"; + U "T153"; + UN #Sync_BG3003.Dyn.Status.TeachModus_Aktiv;//sonst Probleme bei Doppelimpuls + O; + U "MA0146"; + U #Sync_BG3003.Dyn.Status.TeachModus_Aktiv;//sonst Probleme bei Doppelimpuls + = #Antrieb; + +//Keine Hauptstrangdaten vorhanden ? (Fuer Sync-Pkt): + L "VP_HS_B_oF".Datensortkopf.AnzahlEintraege; + L "VP_HS_B_mF".Datensortkopf.AnzahlEintraege; + +I; + L 0;//Daten vorhanden ? + ==I;//Nein ! + = "Hauptstrang_leer";//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + + U "BG3003"; + L s5t#500ms;//Da trotz Entprellung Doppel-Impulse + SA "T154"; + U "T154"; + = #Sync_BG3003.B_BT_da; + + CALL #Sync_BG3003 + ( Sync_Nr := 3003 , + ErrQuit := #ErrQuit , + B_TeachPunk := "BG3007" , //Teach-Sensor + Antrieb_aktiv := #Antrieb , + Error := %DB708.DBW208 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + hStOk := #ErrAnz + ); + + U #Sync_BG3003.Dyn.Error.Inkrementalgeber; + S "DVP_Antriebe".MA0146.Stat.Stop_vor; + +//Keine Hauptstrangdaten vorhanden ?: + L "VP_HS_B_oF".Datensortkopf.AnzahlEintraege; + L "VP_HS_B_mF".Datensortkopf.AnzahlEintraege; + +I; + L 0;//Daten vorhanden ? + ==I;//Nein ! + = "Hauptstrang_leer" ;//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + +//Reservierungen können gelöscht werden: + L "VP_TravelFIFO_B".Travel_FIFO_BG3003.FIFO.ANZAHL; + L 0;//Daten vorhanden ? + ==I;//Nein ! + U "Hauptstrang_leer" ;//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + = #Sorter_B_leer; + +NETWORK +TITLE = Weiche 3023 / Vollpuffer VP26 + CALL #Weiche_VP26 + ( Weichen_Nr := 26 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP26.Stat.B_Akt , + B_Ausfahrt := "BG3023" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP26.Stat.Ast , + Error := %DB708.DBW260 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3022/ Vollpuffer VP27 + CALL #Weiche_VP27 + ( Weichen_Nr := 27 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP27.Stat.B_Akt , + B_Ausfahrt := "BG3022" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP27.Stat.Ast , + Error := %DB708.DBW262 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3021 / Vollpuffer VP28 + CALL #Weiche_VP28 + ( Weichen_Nr := 28 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP28.Stat.B_Akt , + B_Ausfahrt := "BG3021" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP28.Stat.Ast , + Error := %DB708.DBW264 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3020/ Vollpuffer VP29 + CALL #Weiche_VP29 + ( Weichen_Nr := 29 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP29.Stat.B_Akt , + B_Ausfahrt := "BG3020" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP29.Stat.Ast , + Error := %DB708.DBW266 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3017 / Vollpuffer VP30 + CALL #Weiche_VP30 + ( Weichen_Nr := 30 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP30.Stat.B_Akt , + B_Ausfahrt := "BG3017" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP30.Stat.Ast , + Error := %DB708.DBW268 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3016 / Vollpuffer VP31 + CALL #Weiche_VP31 + ( Weichen_Nr := 31 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP31.Stat.B_Akt , + B_Gerade := "BG3002" , + B_Ausfahrt := "BG3016" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP31.Stat.Ast , + Error := %DB708.DBW270 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3015 / Vollpuffer VP32 + CALL #Weiche_VP32 + ( Weichen_Nr := 32 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP32.Stat.B_Akt , + B_Ausfahrt := "BG3015" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP32.Stat.Ast , + Error := %DB708.DBW272 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3014 / Vollpuffer VP33 + CALL #Weiche_VP33 + ( Weichen_Nr := 33 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP33.Stat.B_Akt , + B_Ausfahrt := "BG3014" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP33.Stat.Ast , + Error := %DB708.DBW274 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3013 / Vollpuffer VP34 + CALL #Weiche_VP34 + ( Weichen_Nr := 34 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP34.Stat.B_Akt , + B_Ausfahrt := "BG3013" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP34.Stat.Ast , + Error := %DB708.DBW276 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3012 / Vollpuffer VP35 + CALL #Weiche_VP35 + ( Weichen_Nr := 35 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP35.Stat.B_Akt , + B_Ausfahrt := "BG3012" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP35.Stat.Ast , + Error := %DB708.DBW278 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3011/ Vollpuffer VP36 + CALL #Weiche_VP36 + ( Weichen_Nr := 36 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP36.Stat.B_Akt , + B_Ausfahrt := "BG3011" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP36.Stat.Ast , + Error := %DB708.DBW280 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3010 / Vollpuffer VP37 + CALL #Weiche_VP37 + ( Weichen_Nr := 37 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP37.Stat.B_Akt , + B_Ausfahrt := "BG3010" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP37.Stat.Ast , + Error := %DB708.DBW282 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3007 / Vollpuffer VP38 + CALL #Weiche_VP38 + ( Weichen_Nr := 38 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP38.Stat.B_Akt , + B_Gerade := "BG3001" , + B_Ausfahrt := "BG3007" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP38.Stat.Ast , + Error := %DB708.DBW284 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3006 / Vollpuffer VP39 + CALL #Weiche_VP39 + ( Weichen_Nr := 39 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP39.Stat.B_Akt , + B_Ausfahrt := "BG3006" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP39.Stat.Ast , + Error := %DB708.DBW286 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3005 / Vollpuffer VP40 + CALL #Weiche_VP40 + ( Weichen_Nr := 40 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP40.Stat.B_Akt , + B_Ausfahrt := "BG3005" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP40.Stat.Ast , + Error := %DB708.DBW288 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3435 / Vollpuffer VP41 + CALL #Weiche_VP41 + ( Weichen_Nr := 41 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP41.Stat.B_Akt , + B_Ausfahrt := "BG3435" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP41.Stat.Ast , + Error := %DB708.DBW290 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3434 / Vollpuffer VP42 + CALL #Weiche_VP42 + ( Weichen_Nr := 42 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP42.Stat.B_Akt , + B_Ausfahrt := "BG3434" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP42.Stat.Ast , + Error := %DB708.DBW292 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3433 / Vollpuffer VP43 + CALL #Weiche_VP43 + ( Weichen_Nr := 43 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP43.Stat.B_Akt , + B_Ausfahrt := "BG3433" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP43.Stat.Ast , + Error := %DB708.DBW294 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3432 / Vollpuffer VP44 + CALL #Weiche_VP44 + ( Weichen_Nr := 44 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP44.Stat.B_Akt , + B_Gerade := "BG3420" , + B_Ausfahrt := "BG3432" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP44.Stat.Ast , + Error := %DB708.DBW296 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3431 / Vollpuffer VP45 + CALL #Weiche_VP45 + ( Weichen_Nr := 45 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP45.Stat.B_Akt , + B_Ausfahrt := "BG3431" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP45.Stat.Ast , + Error := %DB708.DBW298 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3430 / Vollpuffer VP46 + CALL #Weiche_VP46 + ( Weichen_Nr := 46 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP46.Stat.B_Akt , + B_Ausfahrt := "BG3430" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP46.Stat.Ast , + Error := %DB708.DBW300 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3427 / Vollpuffer VP47 + CALL #Weiche_VP47 + ( Weichen_Nr := 47 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP47.Stat.B_Akt , + B_Ausfahrt := "BG3427" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP47.Stat.Ast , + Error := %DB708.DBW302 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3426 / Vollpuffer VP48 + CALL #Weiche_VP48 + ( Weichen_Nr := 48 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP48.Stat.B_Akt , + B_Ausfahrt := "BG3426" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP48.Stat.Ast , + Error := %DB708.DBW304 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3425 / Vollpuffer VP49 + CALL #Weiche_VP49 + ( Weichen_Nr := 49 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP49.Stat.B_Akt , + B_Ausfahrt := "BG3425" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP49.Stat.Ast , + Error := %DB708.DBW306 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3424 / Vollpuffer VP50 + CALL #Weiche_VP50 + ( Weichen_Nr := 50 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP50.Stat.B_Akt , + B_Ausfahrt := "BG3424" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP50.Stat.Ast , + Error := %DB708.DBW308 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Pseudo-Weiche 3423 / Vollpuffer VP51 + CALL #Weiche_VP51 + ( Weichen_Nr := 51 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DVP_Sensoren".Stau_VP51.Stat.B_Akt , + B_Ausfahrt := "BG3423" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DVP_Zylinder".Weiche_VP51.Stat.Ast , + Error := %DB708.DBW310 , + Antrieb_start := "DVP_Antriebe".MA0146.Stat.A_start , + Antrieb_stoppen := "DVP_Antriebe".MA0146.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +//Unbekannter Trolley kommt + Stau: + U "BG3422"; + U "DVP_Sensoren".Stau_VP51.Stat.B_Akt; + S "DVP_Antriebe".MA0146.Stat.Stop_vor; + = "7_HMI_Err_UH07_OB".Sorter_Vollpuffer."Sorter B stop"; + + + + + +NETWORK +TITLE = Störungen anzeigen UZ7103/7106 + U #ErrAnz; + S "DOutbound_Bereich".A01_UZ7103.StOk_blinken; + S "DOutbound_Bereich".A01_UZ7106.StOk_blinken; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/VP_Bereich.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/VP_Bereich.awl index 8150dbc..426ce01 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/VP_Bereich.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/1_Vollpuffer/VP_Bereich.awl @@ -1,33 +1,32 @@ -=== FC 1100: VP_Bereich [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Constant: - Return: - Ret_Val : Void +FUNCTION "VP_Bereich" : Void +TITLE = Bereich Outbound: Vollpuffer +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 ---- NW 1: Baustein-Aufrufe --- -CALL FB "VP_Sensoren" , +BEGIN +NETWORK +TITLE = Baustein-Aufrufe + CALL "VP_Sensoren", "DVP_Sensoren"; -CALL FB "VP_OmniFahren" , + CALL "VP_OmniFahren", "DVP_OmniFahren"; -CALL FB "VollPufferStreckenA" , + CALL "VollPufferStrecken_A", "DVollPufferStrecken_A"; -CALL FB "VollPufferStreckenB" , + CALL "VollPufferStrecken_B", "DVollPufferStrecken_B"; -CALL FB "VP_Sorter_A" , + CALL "VP_Sorter_A", "DVP_Sorter_A"; -CALL FB "VP_Sorter_B" , + CALL "VP_Sorter_B", "DVP_Sorter_B"; -CALL FB "VPAuslagern" , + CALL "VP_Auslagern", "DVP_Auslagern"; -CALL FB "VP_Zylinder" , + CALL "VP_Zylinder", "DVP_Zylinder"; -CALL FB "VP_Antriebe" , + CALL "VP_Antriebe", "DVP_Antriebe"; +NETWORK +TITLE = Ende + BE; ---- NW 2: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Basics/VPtoEP_Antriebe.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Basics/VPtoEP_Antriebe.awl index 7394394..c627c70 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Basics/VPtoEP_Antriebe.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Basics/VPtoEP_Antriebe.awl @@ -1,156 +1,255 @@ -=== FB 2199: VPtoEP_Antriebe [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - MA0151 : "MAntrieb_PowerSave" - MA0060 : "MAntrieb_PowerSave" - MA0061 : "MAntrieb_PowerSave" - MA0320 : "MAntrieb_PowerSave" - MA0321 : "MAntrieb_PowerSave" - MA0322 : "MAntrieb_PowerSave" - MA0323 : "MAntrieb_PowerSave" - MA0324 : "MAntrieb_PowerSave" - MA0325 : "MAntrieb_PowerSave" - Temp: - Auto : Bool // Automatik Linie ist aktiv - Hand : Bool // Hand Linie ist aktiv - BereichErr : Bool // Bereichsstörung -> Antrieb stoppen - QKontroll : Bool // Frequenzumrichter schon 3s Netz EIN - FuKontroll : Bool // Frequenzumrichter schon 3s Netz EIN - Quit : Bool // Motorschutz-Störung quittieren - Qok : Bool // Motorschutz ok - Jog1 : Bool // Geschwindigkeit 1 - Jog2 : Bool // Geschwindigkeit 2 - Betrieb : Bool // Betriebsart aktiv - FC105_RET : Word // Returnwert von FC105 - Antrieb1 : Bool // Antrieb dazuschalten - Antrieb2 : Bool // Antrieb dazuschalten - F1 : Bool // Geschwindigkeit 1 aktiviert - F2 : Bool // Geschwindigkeit 2 aktiviert - F3 : Bool // Geschwindigkeit 3 aktiviert - Constant: +FUNCTION_BLOCK "VPtoEP_Antriebe" +TITLE = Antriebe Outbound Vollpuffer > Entnahmepuffer +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + MA0151 : "MAntrieb_PowerSave"; + MA0060 : "MAntrieb_PowerSave"; + MA0061 : "MAntrieb_PowerSave"; + MA0320 : "MAntrieb_PowerSave"; + MA0321 : "MAntrieb_PowerSave"; + MA0322 : "MAntrieb_PowerSave"; + MA0323 : "MAntrieb_PowerSave"; + MA0324 : "MAntrieb_PowerSave"; + MA0325 : "MAntrieb_PowerSave"; + END_VAR ---- NW 1: Übergabe des Bereichstatus System UC071/A01 --- - A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto - - CLR - = Hand - - A( - O "DOutbound_Bereich".A01_UC071.BereichErr - O "DOutbound_Bereich".A01_UZ7104.Area_Stop - ) - AN "SGes".Simulation_ohne_HW_aktiv - = BereichErr - - A "T191" - = QKontroll - = FuKontroll - - A "DOutbound_Bereich".A01_UC071.StOk_aktiv - = Quit + VAR_TEMP + Auto : Bool; // Automatik Linie ist aktiv + Hand : Bool; // Hand Linie ist aktiv + BereichErr : Bool; // Bereichsstörung -> Antrieb stoppen + QKontroll : Bool; // Frequenzumrichter schon 3s Netz EIN + FuKontroll : Bool; // Frequenzumrichter schon 3s Netz EIN + Quit : Bool; // Motorschutz-Störung quittieren + Qok : Bool; // Motorschutz ok + Jog1 : Bool; // Geschwindigkeit 1 + Jog2 : Bool; // Geschwindigkeit 2 + Betrieb : Bool; // Betriebsart aktiv + FC105_RET : Word; // Returnwert von FC105 + Antrieb1 : Bool; // Antrieb dazuschalten + Antrieb2 : Bool; // Antrieb dazuschalten + F1 : Bool; // Geschwindigkeit 1 aktiviert + F2 : Bool; // Geschwindigkeit 2 aktiviert + F3 : Bool; // Geschwindigkeit 3 aktiviert + END_VAR ---- NW 2: MA0151 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0151", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=120, Antriebrueck:=?, Antriebvor:="MA0151", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0151, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +BEGIN +NETWORK +TITLE = Übergabe des Bereichstatus System UC071/A01 + U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; + + CLR; + = #Hand; + + U(; + O "DOutbound_Bereich".A01_UC071.BereichErr; + O "DOutbound_Bereich".A01_UZ7104.Area_Stop; + ); + UN "SGes".Simulation_ohne_HW_aktiv; + = #BereichErr; + + U "T191"; + = #QKontroll; + = #FuKontroll; + + U "DOutbound_Bereich".A01_UC071.StOk_aktiv; + = #Quit; + +NETWORK +TITLE = MA0151 + CALL #MA0151 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0151" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + T_Nachlauf := 120 , + Antriebvor := "MA0151" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0151 + ); +NETWORK +TITLE = Übergabe des Bereichstatus System UH07/A01 + U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; ---- NW 3: Übergabe des Bereichstatus System UH07/A01 --- - A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto + CLR; + = #Hand; - CLR - = Hand + U "DOutbound_Bereich".A01_UH07.BereichErr; + UN "SGes".Simulation_ohne_HW_aktiv; + = #BereichErr; - A "DOutbound_Bereich".A01_UH07.BereichErr - AN "SGes".Simulation_ohne_HW_aktiv - = BereichErr + UN #BereichErr; + L S5T#1S; + SE "T197"; - AN BereichErr - L S5T#1S - OnDelay "T197" + U "T197"; + = #QKontroll; + = #FuKontroll; - A "T197" - = QKontroll - = FuKontroll + U "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #Quit; - A "DOutbound_Bereich".A01_UH07.StOk_aktiv - = Quit +NETWORK +TITLE = MA0060 + CALL #MA0060 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0060" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0060" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0060 + ); ---- NW 4: MA0060 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0060", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0060", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0060, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0061 + CALL #MA0061 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0061" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0061" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0061 + ); +NETWORK +TITLE = Übergabe des Bereichstatus System UC074/A01 + U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; ---- NW 5: MA0061 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0061", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0061", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0061, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) + CLR; + = #Hand; + + U "DOutbound_Bereich".A01_UC074.BereichErr; + UN "SGes".Simulation_ohne_HW_aktiv; + = #BereichErr; + + UN #BereichErr; + L S5T#1S; + SE "T194"; + + U "T194"; + = #QKontroll; + = #FuKontroll; + + U "DOutbound_Bereich".A01_UC074.StOk_aktiv; + = #Quit; + +NETWORK +TITLE = MA0320 + CALL #MA0320 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0320" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0320" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0320 + ); - ---- NW 6: Übergabe des Bereichstatus System UC074/A01 --- - A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto - - CLR - = Hand - - A "DOutbound_Bereich".A01_UC074.BereichErr - AN "SGes".Simulation_ohne_HW_aktiv - = BereichErr - - AN BereichErr - L S5T#1S - OnDelay "T194" - - A "T194" - = QKontroll - = FuKontroll - - A "DOutbound_Bereich".A01_UC074.StOk_aktiv - = Quit +NETWORK +TITLE = MA0321 + CALL #MA0321 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0321" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0321" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0321 + ); ---- NW 7: MA0320 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0320", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0320", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0320, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0322 + CALL #MA0322 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0322" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + T_Nachlauf := 90 , + Antriebvor := "MA0322" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0322 + ); - ---- NW 8: MA0321 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0321", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0321", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0321, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0323 + CALL #MA0323 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0323" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0323" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0323 + ); - ---- NW 9: MA0322 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0322", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=90, Antriebrueck:=?, Antriebvor:="MA0322", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0322, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0324 + CALL #MA0324 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0324" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0324" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0324 + ); +NETWORK +TITLE = MA0325 + CALL #MA0325 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0325" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0325" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0325 + ); ---- NW 10: MA0323 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0323", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0323", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0323, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +/// U "M902.0" +/// UN "DEP_Sorter".Sync_BG4527.Dyn.Error.Keine_TeachPktdaten +/// S "MA0325" //Zusätzlich im Lastbaustein VP>EP_Antriebe, da Aufruf vor Sorter-FB +NETWORK +TITLE = Ende + BE; - ---- NW 11: MA0324 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0324", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0324", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0324, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) - - - ---- NW 12: MA0325 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0325", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0325", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0325, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) - -// / U "M902.0" -// / UN "DEP_Sorter".Sync_BG4527.Dyn.Error.Keine_TeachPktdaten -// / S "MA0325" //Zusätzlich im Lastbaustein VP>EP_Antriebe, da Aufruf vor Sorter-FB - - ---- NW 13: Ende --- - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Basics/VPtoEP_Sensoren.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Basics/VPtoEP_Sensoren.awl index 3c34a6d..afe5219 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Basics/VPtoEP_Sensoren.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Basics/VPtoEP_Sensoren.awl @@ -1,104 +1,216 @@ -=== FB 2190: VPtoEP_Sensoren [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Stau_BG3246 : "MSensoren" // Stau am Sensor Einfahrt MA0151 - Stau_BG3251 : "MSensoren" // Stau am Sensor Mitte MA0151 - Stau_BG3274 : "MSensoren" // Stau am Sensor Einfahrt MA0060 - Stau_BG3362 : "MSensoren" // Stau am Sensor Einfahrt MA0061 - Stau_BG3364 : "MSensoren" // Stau am Sensor Mitte MA0061 - Stau_BG4440 : "MSensoren" // Stau am Sensor nach BST1 - Stau_BG4442 : "MSensoren" // Stau am Sensor Einfahrt MA321 - Sack_BG4444 : "MSensoren" // Sack erkannt - Stau_BG4445 : "MSensoren" // Stau am Sensor Mitte MA321 - Stau_BG4447 : "MSensoren" // Stau am Sensor hinter Weiche4445 - Stau_BG4451 : "MSensoren" // Stau am Sensor Ausfahrt Schleuse4450 - Stau_BG4453 : "MSensoren" // Stau am Sensor Einfahrt MA0323 - Stau_BG4500 : "MSensoren" // Stau am Sensor Einfahrt MA0324 - Stau_BG4530 : "MSensoren" // Stau am Sensor Mitte MA0324 - Stau_BG4502 : "MSensoren" // Stau am Sensor Einfahrt MA0325 - Temp: - T_Ein : Int // Vorgabe Einschaltverzögerung - T_Aus : Int // Zwischenspeicher Ausschaltverzögerung - F1 : Bool // Geschwindigkeit 1 aktiviert - F2 : Bool // Geschwindigkeit 2 aktiviert - F3 : Bool // Geschwindigkeit 3 aktiviert - ESensor : Bool // Sensoren - Antrieb : Bool - VReal : Real // GeschwindigkeitinReal - Zeit : Int // Zeit für Ausschaltverzögerung LT1100 - Aktiv : Bool // Zeit aktivieren - Constant: +FUNCTION_BLOCK "VPtoEP_Sensoren" +TITLE = Sensoren Outbound: VP > EP +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + Stau_BG3246 : "MSensoren"; // Stau am Sensor Einfahrt MA0151 + Stau_BG3251 : "MSensoren"; // Stau am Sensor Mitte MA0151 + Stau_BG3274 : "MSensoren"; // Stau am Sensor Einfahrt MA0060 + Stau_BG3362 : "MSensoren"; // Stau am Sensor Einfahrt MA0061 + Stau_BG3364 : "MSensoren"; // Stau am Sensor Mitte MA0061 + Stau_BG4440 : "MSensoren"; // Stau am Sensor nach BST1 + Stau_BG4442 : "MSensoren"; // Stau am Sensor Einfahrt MA321 + Sack_BG4444 : "MSensoren"; // Sack erkannt + Stau_BG4445 : "MSensoren"; // Stau am Sensor Mitte MA321 + Stau_BG4447 : "MSensoren"; // Stau am Sensor hinter Weiche4445 + Stau_BG4451 : "MSensoren"; // Stau am Sensor Ausfahrt Schleuse4450 + Stau_BG4453 : "MSensoren"; // Stau am Sensor Einfahrt MA0323 + Stau_BG4500 : "MSensoren"; // Stau am Sensor Einfahrt MA0324 + Stau_BG4530 : "MSensoren"; // Stau am Sensor Mitte MA0324 + Stau_BG4502 : "MSensoren"; // Stau am Sensor Einfahrt MA0325 + END_VAR ---- NW 1: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3246", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) + VAR_TEMP + T_Ein : Int; // Vorgabe Einschaltverzögerung + T_Aus : Int; // Zwischenspeicher Ausschaltverzögerung + F1 : Bool; // Geschwindigkeit 1 aktiviert + F2 : Bool; // Geschwindigkeit 2 aktiviert + F3 : Bool; // Geschwindigkeit 3 aktiviert + ESensor : Bool; // Sensoren + Antrieb : Bool; + VReal : Real; // GeschwindigkeitinReal + Zeit : Int; // Zeit für Ausschaltverzögerung LT1100 + Aktiv : Bool; // Zeit aktivieren + END_VAR ---- NW 2: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3251", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +BEGIN +NETWORK +TITLE = Stau am Sensor Einfahrt MA0151 +//Sensoren entprellen + CALL #Stau_BG3246 + ( ESensor := "BG3246" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Mitte MA0151 +//Sensoren entprellen + CALL #Stau_BG3251 + ( ESensor := "BG3251" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 3: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3274", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor Einfahrt MA0060 +//Sensoren entprellen + CALL #Stau_BG3274 + ( ESensor := "BG3274" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Einfahrt MA0061 +//Sensoren entprellen + CALL #Stau_BG3362 + ( ESensor := "BG3362" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 4: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3362", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor Mitte MA0061 +//Sensoren entprellen + CALL #Stau_BG3364 + ( ESensor := "BG3364" , + T_Ein := 80 , + T_Aus := 21 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor hinter BST1 +//Sensoren entprellen + CALL #Stau_BG4440 + ( ESensor := "BG4440" , + T_Ein := 1 , + T_Aus := 30 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 5: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3364", T_Ein:=80, T_Aus:=21, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor Einfahrt MA0321 +//Sensoren entprellen + CALL #Stau_BG4442 + ( ESensor := "BG4442" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Sack in Schleuse 4221 erkannt (Vor ByPass zu VP) +//Sensoren entprellen + UN "MB4443" ;//Alt-Trolley noch beim Ausfahren + U(; + O "MA0321"; + O "BG4443"; + ); + = #Aktiv; ---- NW 6: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4440", T_Ein:=1, T_Aus:=30, tein_aktiv:=TRUE, taus_aktiv:=TRUE) + CALL #Sack_BG4444 + ( ESensor := "BG4444" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := #Aktiv , + taus_aktiv := "MB4443" + ); +NETWORK +TITLE = Stau am Sensor Mitte MA0321 +//Sensoren entprellen + CALL #Stau_BG4445 + ( ESensor := "BG4445" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 7: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4442", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor hinter Weiche4445 +//Sensoren entprellen + CALL #Stau_BG4447 + ( ESensor := "BG4447" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Ausfahrt Schleuse4450 +//Sensoren entprellen + CALL #Stau_BG4451 + ( ESensor := "BG4451" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 8: Sensoren entprellen --- - AN "MB4443" // Alt-Trolley noch beim Ausfahren - A( - O "MA0321" - O "BG4443" - ) - = Aktiv +NETWORK +TITLE = Stau am Sensor Einfahrt MA0323 +//Sensoren entprellen + CALL #Stau_BG4453 + ( ESensor := "BG4453" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); -CALL FB "None" , (ESensor:="BG4444", T_Ein:=1, T_Aus:=11, tein_aktiv:=Aktiv, taus_aktiv:="MB4443") +NETWORK +TITLE = Stau am Sensor Einfahrt MA0324 +//Sensoren entprellen + CALL #Stau_BG4500 + ( ESensor := "BG4500" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Mitte MA0324 +//Sensoren entprellen + CALL #Stau_BG4530 + ( ESensor := "BG4530" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 9: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4445", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor Einfahrt MA0325 +//Sensoren entprellen + CALL #Stau_BG4502 + ( ESensor := "BG4502" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Ende + BE; ---- NW 10: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4447", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 11: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4451", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 12: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4453", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 13: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4500", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 14: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4530", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 15: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4502", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 16: Ende --- - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Basics/VPtoEP_Zylinder.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Basics/VPtoEP_Zylinder.awl index 7ed0ab3..0adbb17 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Basics/VPtoEP_Zylinder.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Basics/VPtoEP_Zylinder.awl @@ -1,86 +1,135 @@ -=== FB 2192: VPtoEP_Zylinder [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Schleuse_3247 : "MZylinder" // - Schleuse_3275 : "MZylinder" // - Schleuse_3363 : "MZylinder" - Schleuse_3366 : "MZylinder" - Schleuse_4443 : "MZylinder" - Weiche_4445 : "MZylinder" // - Schleuse_4450 : "MZylinder" // - Temp: - Auto : Bool // Automatik ist aktiv - Hand : Bool // Hand ist aktiv - ZylAst : Bool // Zylinder ansteuern - Constant: +FUNCTION_BLOCK "VPtoEP_Zylinder" +TITLE = Zylinder Outbound Vollpuffer > Entnahmepuffer +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 + VAR + Schleuse_3247 : "MZylinder"; // + Schleuse_3275 : "MZylinder"; // + Schleuse_3363 : "MZylinder"; + Schleuse_3366 : "MZylinder"; + Schleuse_4443 : "MZylinder"; + Weiche_4445 : "MZylinder"; // + Schleuse_4450 : "MZylinder"; // + END_VAR ---- NW 1: Übergabe des Bereichstatus System UC071/A01 --- - A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto - - A( - O "DOutbound_Bereich".A01_UC071.BereichErr - O "DOutbound_Bereich".A01_UZ7104.Area_Stop - ) - AN "SGes".Simulation_ohne_HW_aktiv - JC Next // Zylinder-Stellung nicht mehr ändern + VAR_TEMP + Auto : Bool; // Automatik ist aktiv + Hand : Bool; // Hand ist aktiv + ZylAst : Bool; // Zylinder ansteuern + END_VAR ---- NW 2: Schleuse_3247 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3247", ZylGst:=?) +BEGIN +NETWORK +TITLE = Übergabe des Bereichstatus System UC071/A01 + U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; + U(; + O "DOutbound_Bereich".A01_UC071.BereichErr; + O "DOutbound_Bereich".A01_UZ7104.Area_Stop; + ); + UN "SGes".Simulation_ohne_HW_aktiv; + SPB Next ;//Zylinder-Stellung nicht mehr ändern ---- NW 3: Schleuse_3275 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3275", ZylGst:=?) +NETWORK +TITLE = Schleuse_3247 + CALL #Schleuse_3247 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3247" + ); +NETWORK +TITLE = Schleuse_3275 + CALL #Schleuse_3275 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3275" + ); ---- NW 4: Übergabe des Bereichstatus System UH07/A01 --- -Next: A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto +NETWORK +TITLE = Übergabe des Bereichstatus System UH07/A01 +Next: U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; - A "DOutbound_Bereich".A01_UH07.BereichErr - AN "SGes".Simulation_ohne_HW_aktiv - JC Next1 // Zylinder-Stellung nicht mehr ändern + U "DOutbound_Bereich".A01_UH07.BereichErr; + UN "SGes".Simulation_ohne_HW_aktiv; + SPB Next1 ;//Zylinder-Stellung nicht mehr ändern +NETWORK +TITLE = Schleuse_3363 + CALL #Schleuse_3363 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3363" + ); ---- NW 5: Schleuse_3363 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3363", ZylGst:=?) +NETWORK +TITLE = Schleuse_3366 + CALL #Schleuse_3366 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3366" + ); +NETWORK +TITLE = Übergabe des Bereichstatus System UC074/A01 +Next1: U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; ---- NW 6: Schleuse_3366 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3366", ZylGst:=?) + U "DOutbound_Bereich".A01_UC074.BereichErr; + UN "SGes".Simulation_ohne_HW_aktiv; + SPB Next2 ;//Zylinder-Stellung nicht mehr ändern +NETWORK +TITLE = Schleuse_4443 + CALL #Schleuse_4443 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4443" + ); ---- NW 7: Übergabe des Bereichstatus System UC074/A01 --- -Next1: A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto +NETWORK +TITLE = Weiche_4445 + CALL #Weiche_4445 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4445" + ); - A "DOutbound_Bereich".A01_UC074.BereichErr - AN "SGes".Simulation_ohne_HW_aktiv - JC Next2 // Zylinder-Stellung nicht mehr ändern + U "MB4445"; + = "MB4457"; +NETWORK +TITLE = Schleuse_4450 + CALL #Schleuse_4450 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4450" + ); ---- NW 8: Schleuse_4443 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4443", ZylGst:=?) +NETWORK +TITLE = Ende +Next2: BE; - ---- NW 9: Weiche_4445 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4445", ZylGst:=?) - - A "MB4445" - = "MB4457" - - ---- NW 10: Schleuse_4450 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4450", ZylGst:=?) - - ---- NW 11: Ende --- -Next2: BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Omnifahren_VPtoEP/VPtoEP_Draussen_FC.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Omnifahren_VPtoEP/VPtoEP_Draussen_FC.awl index 1d2a1ca..4e7427e 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Omnifahren_VPtoEP/VPtoEP_Draussen_FC.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Omnifahren_VPtoEP/VPtoEP_Draussen_FC.awl @@ -1,49 +1,57 @@ -=== FC 2182: VPtoEP_Draussen_FC [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Constant: - Return: - Ret_Val : Void +FUNCTION "VPtoEP_Draussen_FC" : Void +TITLE = Draussen-FC: VollPuffer +{ S7_Optimized_Access := 'FALSE' ; S7_Pass_Registers := 'TRUE' } +AUTHOR : AE +VERSION : 0.1 ---- NW 1: Rückmeldung --- - SET // Rückmeldungen erst mal resetten - R "M180.6" // Weiterfahrt von Ziel-FC erlaubt +BEGIN +NETWORK +TITLE = Rückmeldung + SET;//Rückmeldungen erst mal resetten + R "M180.6";//Weiterfahrt von Ziel-FC erlaubt +NETWORK +TITLE = Schleuse 4443 (Vor ByPass zum LP): Ausgefahren ? + L "MW190"; + L 4443 ;//Aufruf von Schleuse 4443 ? + <>I;//Nein! + SPB X4443E; ---- NW 2: Schleuse 4443 (Vor ByPass zum LP): Ausgefahren ? --- - L "MW190" - L 4443 // Aufruf von Schleuse 4443 ? - <>I // Nein! - JC X4443E +//Evtl. erkannten Sack löschen: + SET; + R "DVPtoEP_Sensoren".Sack_BG4444.Stat.B_Akt; -// Evtl. erkannten Sack löschen: - SET - R "DVPtoEP_Sensoren".Sack_BG4444.Stat.B_Akt + L "DVPtoEP_OmniFahren".Schleuse_4443.Dyn.Weichen_Ziel; + L 16#4461;//Abzweig ? + <>I;//Nein ! + SPB EP; - L "DVPtoEP_OmniFahren".Schleuse_4443.Dyn.Weichen_Ziel - L 16#4461 // Abzweig ? - <>I // Nein ! - JC EP +//Trolley fährt zum LP: +//Trolleydaten in DB1000 löschen, da zum LP fährt und danach kein Leser mehr! + CALL "Trolleydaten_löschen" + ( Gesamt_Trolley_DL := 1000 , + TrolleyID := "DVPtoEP_OmniFahren".Schleuse_4443.Dyn.TrolleyID_Schleuse //IDX"DLP>HW_OmniFahren".Schleuse_4221.Dyn.TrolleyID_Schleuse + ); -// Trolley fährt zum LP: -// Trolleydaten in DB1000 löschen, da zum LP fährt und danach kein Leser mehr! -CALL FC "Trolleydaten_löschen" (Gesamt_Trolley_DL:=1000, TrolleyID:="DVPtoEP_OmniFahren".Schleuse_4443.Dyn.TrolleyID_Schleuse) // IDX"DLP>HW_OmniFahren".Schleuse_4221.Dyn.TrolleyID_Schleuse +//Bei Partner (Schleuse 4466) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf) + L 0; + T "DEPtoLP_OmniFahren".Schleuse_4466.Dyn.Sk.Akt_Schritt; -// Bei Partner (Schleuse 4466) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf) - L 0 - T "DEPtoLP_OmniFahren".Schleuse_4466.Dyn.Sk.Akt_Schritt + BEA; - BEU +//Trolleydaten in DB1000 ändern: +EP: CALL "Trolleydaten_ändern" + ( Gesamt_Trolley_DL := 1000 , + TrolleyID := "DVPtoEP_OmniFahren".Schleuse_4443.Dyn.TrolleyID_Schleuse , //IDX + Endziel := 16#E000 , //Entnahmepuffer + ShopGroup := DINT#0 + ); -// Trolleydaten in DB1000 ändern: -EP: CALL FC "Trolleydaten_ändern" (Gesamt_Trolley_DL:=1000, TrolleyID:="DVPtoEP_OmniFahren".Schleuse_4443.Dyn.TrolleyID_Schleuse, Endziel:=16#E000, ShopGroup:=DINT#0) // IDX | Entnahmepuffer +X4443E: NOP 0; -X4443E: NOP 0 +NETWORK +TITLE = Ende + BE; - ---- NW 3: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Omnifahren_VPtoEP/VPtoEP_Leser_FC.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Omnifahren_VPtoEP/VPtoEP_Leser_FC.awl index dd383bb..46939f6 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Omnifahren_VPtoEP/VPtoEP_Leser_FC.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Omnifahren_VPtoEP/VPtoEP_Leser_FC.awl @@ -1,47 +1,56 @@ -=== FC 2180: VPtoEP_Leser_FC [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Zielebene : Word - Constant: - Return: - Ret_Val : Void - ---- NW 1: Rückmeldung --- -// Keine - L 0 // Evtl. Zwischenziel (MW196) - T "MW196" +FUNCTION "VPtoEP_Leser_FC" : Void +TITLE = Leser-FC: VP>EP +{ S7_Optimized_Access := 'FALSE' ; S7_Pass_Registers := 'TRUE' } +AUTHOR : AE +VERSION : 0.1 + VAR_TEMP + Zielebene : Word; + END_VAR ---- NW 2: Schleuse 4443: (Vor ByPass zurück zu LP) --- - L "MW190" // Schleusen-Nr. - L 4443 // Aufruf von Schleuse ? - <>I // Nein! - JC X4443E +BEGIN +NETWORK +TITLE = Rückmeldung - AN "M180.0" // Lesefehler - JC Y4443 + //Keine + L 0;//Evtl. Zwischenziel (MW196) + T "MW196"; - BEU +NETWORK +TITLE = Schleuse 4443: (Vor ByPass zurück zu LP) + L "MW190" ;//Schleusen-Nr. + L 4443 ;//Aufruf von Schleuse ? + <>I;//Nein! + SPB X4443E; -Y4443: AN "M180.1" // unbekannt in TrolleysDL - BEC + UN "M180.0";//Lesefehler + SPB Y4443; -// Daten in Datenbank erzeugen: - L "DVPtoEP_OmniFahren".Schleuse_4443.Dyn.TrolleyID_Schleuse - L DINT#0 // ID bekannt? - ==D // Nein - BEC + BEA; -CALL FC "Trolleydaten_neu_anlegen" (Gesamt_Trolley_DL:="DVPtoEP_OmniFahren".Schleuse_4443.Schleuse.Gesamt_Trolley_DL, TrolleyID:="DVPtoEP_OmniFahren".Schleuse_4443.Dyn.TrolleyID_Schleuse, Endziel:=16#C000, ShopGroup:=DINT#0) // Entnahme-Puffer-Bereich +Y4443: UN "M180.1" ;//unbekannt in TrolleysDL + BEB; - BEU +//Daten in Datenbank erzeugen: + L "DVPtoEP_OmniFahren".Schleuse_4443.Dyn.TrolleyID_Schleuse; + L DINT#0 ;//ID bekannt? + ==D;//Nein + BEB; -X4443E: NOP 0 + CALL "Trolleydaten_neu_anlegen" + ( Gesamt_Trolley_DL := "DVPtoEP_OmniFahren".Schleuse_4443.Schleuse.Gesamt_Trolley_DL , + TrolleyID := "DVPtoEP_OmniFahren".Schleuse_4443.Dyn.TrolleyID_Schleuse , + Endziel := 16#C000 , //Entnahme-Puffer-Bereich + ShopGroup := DINT#0 + ); + BEA; ---- NW 3: Ende --- - BE +X4443E: NOP 0; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Omnifahren_VPtoEP/VPtoEP_OmniFahren.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Omnifahren_VPtoEP/VPtoEP_OmniFahren.awl index ecf7170..e432e33 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Omnifahren_VPtoEP/VPtoEP_OmniFahren.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Omnifahren_VPtoEP/VPtoEP_OmniFahren.awl @@ -1,251 +1,460 @@ -=== FB 2128: VPtoEP_OmniFahren [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Schleuse_3247 : "MHMOmniSchleuse_Plus" - Schleuse_3275 : "MHMOmniSchleuse" - Bereich_3361 : "MHMOmniBereich_Plus" - Schleuse_3363 : "MHMOmniSchleuse" - Schleuse_3366 : "MHMOmniSchleuse" - Bereich_4441 : "MHMOmniBereich_Plus" - Schleuse_4443 : "MHMOmniSchleuse_Plus" - Weiche_4445 : "MHMOmniWeiche_Plus" - Schleuse_4450 : "MHMOmniSchleuse_Plus" - Bereich_4454 : "MHMOmniBereich_Plus" - Übergang_4501 : "MHMÜbergang_ohne_Schleuse" - Temp: - ErrQuit : Bool - ErrAnz : Bool - Stau_raus : Bool - Start_ok : Bool - B_aktiv : Bool - B_vor_Schleuse : Bool - B_nach_Schleuse : Bool - Antrieb_aktiv : Bool - Antrieb_vor : Bool - Antrieb_stop : Bool - Fahren_Ok : Bool - Antrieb_nicht_stoppen : Bool - Constant: +FUNCTION_BLOCK "VPtoEP_OmniFahren" +TITLE = Omnifahren Outbound Vollpuffer > Entnahmepuffer +{ S7_Optimized_Access := 'FALSE' } +VERSION : 0.1 + VAR + Schleuse_3247 { S7_SetPoint := 'False'} : "MHMOmniSchleuse_Plus"; + Schleuse_3275 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Bereich_3361 : "MHMOmniBereich_Plus"; + Schleuse_3363 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Schleuse_3366 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Bereich_4441 : "MHMOmniBereich_Plus"; + Schleuse_4443 { S7_SetPoint := 'False'} : "MHMOmniSchleuse_Plus"; + Weiche_4445 : "MHMOmniWeiche_Plus"; + Schleuse_4450 { S7_SetPoint := 'False'} : "MHMOmniSchleuse_Plus"; + Bereich_4454 : "MHMOmniBereich_Plus"; + Übergang_4501 { S7_SetPoint := 'False'} : "MHMÜbergang_ohne_Schleuse"; + END_VAR ---- NW 1: Systemzeug --- -// Verschiedene Bereiche: - A "DOutbound_Bereich".A01_UH07.AnlageEin - = Schleuse_3247.Dyn.Sk.Auto_akt - = Schleuse_3275.Dyn.Sk.Auto_akt - = Bereich_3361.Dyn.Sk.Auto_akt - = Schleuse_3363.Dyn.Sk.Auto_akt - = Schleuse_3366.Dyn.Sk.Auto_akt - = Bereich_4441.Dyn.Sk.Auto_akt - = Schleuse_4443.Dyn.Sk.Auto_akt - = Weiche_4445.Dyn.Status.Auto_akt - = Schleuse_4450.Dyn.Sk.Auto_akt - = Bereich_4454.Dyn.Sk.Auto_akt - - AN "DOutbound_Bereich".A01_UC071.BereichErr - = Schleuse_3247.Dyn.Sk.Bereich_ok - = Schleuse_3275.Dyn.Sk.Bereich_ok - AN "DOutbound_Bereich".A01_UH07.BereichErr - = Bereich_3361.Dyn.Sk.Bereich_ok - = Schleuse_3363.Dyn.Sk.Bereich_ok - = Schleuse_3366.Dyn.Sk.Bereich_ok - AN "DOutbound_Bereich".A01_UC074.BereichErr - = Bereich_4441.Dyn.Sk.Bereich_ok - = Schleuse_4443.Dyn.Sk.Bereich_ok - = Weiche_4445.Dyn.Status.Bereich_ok - = Schleuse_4450.Dyn.Sk.Bereich_ok - = Bereich_4454.Dyn.Sk.Bereich_ok + VAR_TEMP + ErrQuit : Bool; + ErrAnz : Bool; + Stau_raus : Bool; + Start_ok : Bool; + B_aktiv : Bool; + B_vor_Schleuse : Bool; + B_nach_Schleuse : Bool; + Antrieb_aktiv : Bool; + Antrieb_vor : Bool; + Antrieb_stop : Bool; + Fahren_Ok : Bool; + Antrieb_nicht_stoppen : Bool; + END_VAR ---- NW 2: Störungen quittieren UZ7105 --- - A "DOutbound_Bereich".A01_UZ7105.StOk_aktiv - O "DOutbound_Bereich".A01_UC071.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit +BEGIN +NETWORK +TITLE = Systemzeug + +//Verschiedene Bereiche: + U "DOutbound_Bereich".A01_UH07.AnlageEin; + = #Schleuse_3247.Dyn.Sk.Auto_akt; + = #Schleuse_3275.Dyn.Sk.Auto_akt; + = #Bereich_3361.Dyn.Sk.Auto_akt; + = #Schleuse_3363.Dyn.Sk.Auto_akt; + = #Schleuse_3366.Dyn.Sk.Auto_akt; + = #Bereich_4441.Dyn.Sk.Auto_akt; + = #Schleuse_4443.Dyn.Sk.Auto_akt; + = #Weiche_4445.Dyn.Status.Auto_akt; + = #Schleuse_4450.Dyn.Sk.Auto_akt; + = #Bereich_4454.Dyn.Sk.Auto_akt; + + UN "DOutbound_Bereich".A01_UC071.BereichErr; + = #Schleuse_3247.Dyn.Sk.Bereich_ok; + = #Schleuse_3275.Dyn.Sk.Bereich_ok; + UN "DOutbound_Bereich".A01_UH07.BereichErr; + = #Bereich_3361.Dyn.Sk.Bereich_ok; + = #Schleuse_3363.Dyn.Sk.Bereich_ok; + = #Schleuse_3366.Dyn.Sk.Bereich_ok; + UN "DOutbound_Bereich".A01_UC074.BereichErr; + = #Bereich_4441.Dyn.Sk.Bereich_ok; + = #Schleuse_4443.Dyn.Sk.Bereich_ok; + = #Weiche_4445.Dyn.Status.Bereich_ok; + = #Schleuse_4450.Dyn.Sk.Bereich_ok; + = #Bereich_4454.Dyn.Sk.Bereich_ok; + +NETWORK +TITLE = Störungen quittieren UZ7105 + U "DOutbound_Bereich".A01_UZ7105.StOk_aktiv; + O "DOutbound_Bereich".A01_UC071.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Schleuse 3247 + CALL #Schleuse_3247 + ( Schleusen_Nr := 3247 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG3246" , + B_InSchleuse := "BG3247" , + B_Zähl := "BG3251" , + B_Stau_raus := "DVPtoEP_Sensoren".Stau_BG3251.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0151" , + Antrieb_plus_aktiv := "MA0151" , + Schleuse_geöffnet := "MB3247" , + Y_Schleuse_Auf := "DVPtoEP_Zylinder".Schleuse_3247.Stat.Ast , + Error := %DB708.DBW520 , + Antrieb_Schleuse_vor := "DVPtoEP_Antriebe".MA0151.Stat.A_vor , + Antrieb_Schleuse_start := "DVPtoEP_Antriebe".MA0151.Stat.A_start , + Antrieb_Schleuse_stop := "DVPtoEP_Antriebe".MA0151.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DVPtoEP_Antriebe".MA0151.Stat.A_PS , + Antrieb_plus_vor := , //Identisch + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Schleuse 3275 + CALL #Schleuse_3275 + ( Schleusen_Nr := 3275 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG3251" , + B_InSchleuse := "BG3275" , + B_AusSchleuse := "BG3274" , + B_Stau_raus := "DVPtoEP_Sensoren".Stau_BG3274.Stat.B_Akt , + Start_Ok := #Bereich_3361.Dyn.Sk.Bereich_ok , + Antrieb_Schleuse_aktiv := "MA0151" , + Antrieb_plus_aktiv := "MA0060" , + Schleuse_geöffnet := "MB3275" , + RestZeit_Bereich_plus := #Bereich_3361.Dyn.Restzeit , + Y_Schleuse_Auf := "DVPtoEP_Zylinder".Schleuse_3275.Stat.Ast , + Error := %DB708.DBW570 , + Antrieb_Schleuse_vor := "DVPtoEP_Antriebe".MA0151.Stat.A_vor , + Antrieb_Schleuse_start := "DVPtoEP_Antriebe".MA0151.Stat.A_start , + Antrieb_Schleuse_stop := "DVPtoEP_Antriebe".MA0151.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DVPtoEP_Antriebe".MA0151.Stat.A_PS , + Antrieb_plus_vor := #Bereich_3361.Dyn.Status.Trolley_kommt_in_Bereich , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Störungen anzeigen UZ7105 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7105.StOk_blinken; + S "DOutbound_Bereich".A01_UC071.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Störungen quittieren UZ7105/0701 + U "DOutbound_Bereich".A01_UZ7105.StOk_aktiv; + O "DOutbound_Bereich".A01_UZ0701.StOk_aktiv; + O "DOutbound_Bereich".A01_UC071.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Bereich 3361 + U "BG3274"; + U "MB3275"; + = #B_vor_Schleuse; + + CALL #Bereich_3361 + ( Bereichs_Nr := 3361 , + ErrQuit := #ErrQuit , + B_BereichsAnfang := #B_vor_Schleuse , + B_BereichsEnde := "BG3361" , + B_Zähl := "BG3362" , + B_Stau_raus := "DVPtoEP_Sensoren".Stau_BG3362.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Bereich_aktiv := "MA0060" , + Antrieb_plus_aktiv := "MA0061" , + Antrieb_Bereich_vor := "DVPtoEP_Antriebe".MA0060.Stat.A_vor , + Antrieb_Bereich_stop := "DVPtoEP_Antriebe".MA0060.Stat.Stop_vor , + Error := %DB708.DBW454 , + Antrieb_Bereich_start := "DVPtoEP_Antriebe".MA0060.Stat.A_start , + Antrieb_plus_vor := "DVPtoEP_Antriebe".MA0061.Stat.A_vor , + Antrieb_plus_start := "DVPtoEP_Antriebe".MA0061.Stat.A_start , + Antrieb_minus_vor := "DVPtoEP_Antriebe".MA0151.Stat.A_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Störungen anzeigen UZ7105/0701 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7105.StOk_blinken; + S "DOutbound_Bereich".A01_UZ0701.StOk_blinken; + S "DOutbound_Bereich".A01_UC071.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Störungen quittieren UZ0701 + U "DOutbound_Bereich".A01_UZ0701.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Schleuse 3363 + CALL #Schleuse_3363 + ( Schleusen_Nr := 3363 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG3362" , + B_InSchleuse := "BG3363" , + B_AusSchleuse := "BG3364" , + B_Stau_raus := "DVPtoEP_Sensoren".Stau_BG3364.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0061" , + Antrieb_plus_aktiv := "MA0061" , + Schleuse_geöffnet := "MB3363" , + Y_Schleuse_Auf := "DVPtoEP_Zylinder".Schleuse_3363.Stat.Ast , + Error := %DB708.DBW528 , + Antrieb_Schleuse_vor := "DVPtoEP_Antriebe".MA0061.Stat.A_vor , + Antrieb_Schleuse_start := "DVPtoEP_Antriebe".MA0061.Stat.A_start , + Antrieb_Schleuse_stop := "DVPtoEP_Antriebe".MA0061.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DVPtoEP_Antriebe".MA0061.Stat.A_PS , + Antrieb_plus_vor := , //Identisch + hStOk := #ErrAnz + ); ---- NW 3: Schleuse 3247 --- -CALL FB "None" , (Schleusen_Nr:=3247, ErrQuit:=ErrQuit, B_VorSchleuse:="BG3246", B_InSchleuse:="BG3247", B_Zähl:="BG3251", B_Stau_raus:="DVPtoEP_Sensoren".Stau_BG3251.Stat.B_Akt, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0151", Antrieb_plus_aktiv:="MA0151", Schleuse_geöffnet:="MB3247", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DVPtoEP_Zylinder".Schleuse_3247.Stat.Ast, Error:=DB708.DBW520, Antrieb_Schleuse_vor:="DVPtoEP_Antriebe".MA0151.Stat.A_vor, Antrieb_Schleuse_start:="DVPtoEP_Antriebe".MA0151.Stat.A_start, Antrieb_Schleuse_stop:="DVPtoEP_Antriebe".MA0151.Stat.Stop_vor, Antrieb_Schleuse_PS:="DVPtoEP_Antriebe".MA0151.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) // Identisch +NETWORK +TITLE = Schleuse 3366 (vor BST 1) + UN "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3; + UN "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4; + UN "7_HMI_Err_UH07_OB".System.BST1_Feueralarm; + UN "7_HMI_Err_UH07_OB".System.BST1_Geschlossen; + UN "7_HMI_Err_UH07_OB".System.BST1_Störung; + U #Bereich_4441.Dyn.Sk.Bereich_ok; + = #Fahren_Ok; + CALL #Schleuse_3366 + ( Schleusen_Nr := 3366 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG3364" , + B_InSchleuse := "BG3366" , + B_AusSchleuse := "BG4440" , + B_Stau_raus := "DVPtoEP_Sensoren".Stau_BG4440.Stat.B_Akt , + Start_Ok := #Fahren_Ok , + Antrieb_Schleuse_aktiv := "MA0061" , + Antrieb_plus_aktiv := "MA0320" , + Schleuse_geöffnet := "MB3366" , + RestZeit_Bereich_plus := #Bereich_4441.Dyn.Restzeit , + Y_Schleuse_Auf := "DVPtoEP_Zylinder".Schleuse_3366.Stat.Ast , + Error := %DB708.DBW530 , + Antrieb_Schleuse_vor := "DVPtoEP_Antriebe".MA0061.Stat.A_vor , + Antrieb_Schleuse_start := "DVPtoEP_Antriebe".MA0061.Stat.A_start , + Antrieb_Schleuse_stop := "DVPtoEP_Antriebe".MA0061.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DVPtoEP_Antriebe".MA0061.Stat.A_PS , + Antrieb_plus_vor := #Bereich_4441.Dyn.Status.Trolley_kommt_in_Bereich , + hStOk := #ErrAnz + ); ---- NW 4: Schleuse 3275 --- -CALL FB "None" , (Schleusen_Nr:=3275, ErrQuit:=ErrQuit, B_VorSchleuse:="BG3251", B_InSchleuse:="BG3275", B_AusSchleuse:="BG3274", B_Stau_raus:="DVPtoEP_Sensoren".Stau_BG3274.Stat.B_Akt, Start_Ok:=Bereich_3361.Dyn.Sk.Bereich_ok, Antrieb_Schleuse_aktiv:="MA0151", Antrieb_plus_aktiv:="MA0060", Schleuse_geöffnet:="MB3275", RestZeit_Bereich_plus:=Bereich_3361.Dyn.Restzeit, Y_Schleuse_Auf:="DVPtoEP_Zylinder".Schleuse_3275.Stat.Ast, Error:=DB708.DBW570, Antrieb_Schleuse_vor:="DVPtoEP_Antriebe".MA0151.Stat.A_vor, Antrieb_Schleuse_start:="DVPtoEP_Antriebe".MA0151.Stat.A_start, Antrieb_Schleuse_stop:="DVPtoEP_Antriebe".MA0151.Stat.Stop_vor, Antrieb_Schleuse_PS:="DVPtoEP_Antriebe".MA0151.Stat.A_PS, Antrieb_plus_vor:=Bereich_3361.Dyn.Status.Trolley_kommt_in_Bereich, Antrieb_plus_start:=?, hStOk:=ErrAnz) +NETWORK +TITLE = Störungen anzeigen UZ0701 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ0701.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; +NETWORK +TITLE = Störungen quittieren UZ7401 + U "DOutbound_Bereich".A01_UZ7401.StOk_aktiv; + O "DOutbound_Bereich".A01_UC074.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; ---- NW 5: Störungen anzeigen UZ7105 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7105.StOk_blinken - S "DOutbound_Bereich".A01_UC071.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken +NETWORK +TITLE = Bereich 4441 (hinter BST 1) +//Falls Trolley hinter BST noch gespeichert + U "DVPtoEP_Sensoren".Stau_BG4440.Stat.B_Akt; + S "DVPtoEP_Antriebe".MA0320.Stat.A_start; ---- NW 6: Störungen quittieren UZ7105/0701 --- - A "DOutbound_Bereich".A01_UZ7105.StOk_aktiv - O "DOutbound_Bereich".A01_UZ0701.StOk_aktiv - O "DOutbound_Bereich".A01_UC071.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit + U "BG4440"; + U "MB3366"; + = #B_vor_Schleuse; + CALL #Bereich_4441 + ( Bereichs_Nr := 4441 , + ErrQuit := #ErrQuit , + B_BereichsAnfang := #B_vor_Schleuse , + B_BereichsEnde := "BG4441" , + B_Zähl := "BG4442" , + B_Stau_raus := "DVPtoEP_Sensoren".Stau_BG4442.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Bereich_aktiv := "MA0320" , + Antrieb_plus_aktiv := "MA0321" , + Antrieb_Bereich_vor := "DVPtoEP_Antriebe".MA0320.Stat.A_vor , + Antrieb_Bereich_stop := "DVPtoEP_Antriebe".MA0320.Stat.Stop_vor , + Error := %DB708.DBW474 , + Antrieb_Bereich_start := "DVPtoEP_Antriebe".MA0320.Stat.A_start , + Antrieb_plus_vor := "DVPtoEP_Antriebe".MA0321.Stat.A_vor , + Antrieb_plus_start := "DVPtoEP_Antriebe".MA0321.Stat.A_start , + hStOk := #ErrAnz + ); ---- NW 7: Bereich 3361 --- - A "BG3274" - A "MB3275" - = B_vor_Schleuse +NETWORK +TITLE = Schleuse 4443 + CALL #Schleuse_4443 + ( Schleusen_Nr := 4443 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG4442" , + B_InSchleuse := "BG4443" , + B_Zähl := , //über Weiche + B_Stau_raus := "DVPtoEP_Sensoren".Stau_BG4445.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0321" , + Antrieb_plus_aktiv := , //über Weiche + Schleuse_geöffnet := "MB4443" , + Y_Schleuse_Auf := "DVPtoEP_Zylinder".Schleuse_4443.Stat.Ast , + Error := %DB708.DBW554 , + Antrieb_Schleuse_vor := "DVPtoEP_Antriebe".MA0321.Stat.A_vor , + Antrieb_Schleuse_start := "DVPtoEP_Antriebe".MA0321.Stat.A_start , + Antrieb_Schleuse_stop := "DVPtoEP_Antriebe".MA0321.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DVPtoEP_Antriebe".MA0321.Stat.A_PS , + Antrieb_plus_vor := , //über Weiche + hStOk := #ErrAnz + ); -CALL FB "None" , (Bereichs_Nr:=3361, ErrQuit:=ErrQuit, B_BereichsAnfang:=B_vor_Schleuse, B_BereichsEnde:="BG3361", B_Zähl:="BG3362", B_Stau_raus:="DVPtoEP_Sensoren".Stau_BG3362.Stat.B_Akt, Start_Ok:=1, Antrieb_Bereich_aktiv:="MA0060", Antrieb_plus_aktiv:="MA0061", RestZeit_Bereich_plus:=?, Antrieb_Bereich_vor:="DVPtoEP_Antriebe".MA0060.Stat.A_vor, Antrieb_Bereich_stop:="DVPtoEP_Antriebe".MA0060.Stat.Stop_vor, Error:=DB708.DBW454, Antrieb_Bereich_start:="DVPtoEP_Antriebe".MA0060.Stat.A_start, Antrieb_plus_vor:="DVPtoEP_Antriebe".MA0061.Stat.A_vor, Antrieb_plus_start:="DVPtoEP_Antriebe".MA0061.Stat.A_start, Antrieb_minus_vor:="DVPtoEP_Antriebe".MA0151.Stat.A_vor, hStOk:=ErrAnz) +NETWORK +TITLE = Weiche 4445 + U "MA0321"; + U "MA0332"; + = #Antrieb_aktiv; + SET; + R #Antrieb_vor; + R #Antrieb_stop; ---- NW 8: Störungen anzeigen UZ7105/0701 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7105.StOk_blinken - S "DOutbound_Bereich".A01_UZ0701.StOk_blinken - S "DOutbound_Bereich".A01_UC071.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken + CALL #Weiche_4445 + ( Weichen_Nr := 4445 , + ErrQuit := #ErrQuit , + Fahren_Ok := 1 , + B_Ziel_gerade := "BG4447" , + B_Ziel_abzweig := "BG4461" , + Antrieb_Weiche_aktiv := #Antrieb_aktiv , + Antrieb_Gerade_aktiv := "MA0322" , + Antrieb_Abzweig_aktiv := "MA0331" , + Weiche_ist_AST := "MB4445" , + Y_Weiche_abzweig := "DVPtoEP_Zylinder".Weiche_4445.Stat.Ast , + Error := %DB708.DBW556 , + Antrieb_Weiche_vor := #Antrieb_vor , //da 2 Antriebe notwendig + Antrieb_Weiche_stop := #Antrieb_stop , + Antrieb_Weiche_gerade_vor := "DVPtoEP_Antriebe".MA0322.Stat.A_vor , + Antrieb_Weiche_gerade_stop := "DVPtoEP_Antriebe".MA0322.Stat.Stop_vor , + Antrieb_Weiche_abzweig_vor := "DEPtoLP_Antriebe".MA0331.Stat.A_vor , + Antrieb_Weiche_abzweig_stop := "DEPtoLP_Antriebe".MA0331.Stat.Stop_vor , + hStOk := #ErrAnz + ); + U #Antrieb_vor; + S "DVPtoEP_Antriebe".MA0321.Stat.A_vor; + S "DEPtoLP_Antriebe".MA0332.Stat.A_vor; + S "DVPtoEP_Antriebe".MA0321.Stat.A_start; + S "DEPtoLP_Antriebe".MA0332.Stat.A_start; ---- NW 9: Störungen quittieren UZ0701 --- - A "DOutbound_Bereich".A01_UZ0701.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit + U #Antrieb_stop; + S "DVPtoEP_Antriebe".MA0321.Stat.Stop_vor; + U #Antrieb_stop; + U "MB4445";//Nur bei Abzweig + S "DEPtoLP_Antriebe".MA0332.Stat.Stop_vor; ---- NW 10: Schleuse 3363 --- -CALL FB "None" , (Schleusen_Nr:=3363, ErrQuit:=ErrQuit, B_VorSchleuse:="BG3362", B_InSchleuse:="BG3363", B_AusSchleuse:="BG3364", B_Stau_raus:="DVPtoEP_Sensoren".Stau_BG3364.Stat.B_Akt, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0061", Antrieb_plus_aktiv:="MA0061", Schleuse_geöffnet:="MB3363", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DVPtoEP_Zylinder".Schleuse_3363.Stat.Ast, Error:=DB708.DBW528, Antrieb_Schleuse_vor:="DVPtoEP_Antriebe".MA0061.Stat.A_vor, Antrieb_Schleuse_start:="DVPtoEP_Antriebe".MA0061.Stat.A_start, Antrieb_Schleuse_stop:="DVPtoEP_Antriebe".MA0061.Stat.Stop_vor, Antrieb_Schleuse_PS:="DVPtoEP_Antriebe".MA0061.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) // Identisch +//Damit Partner fahren kann: + U #Weiche_4445.Dyn.Status.Weiche_frei; + R "DVPtoEP_Zylinder".Weiche_4445.Stat.Ast; +NETWORK +TITLE = Schleuse 4450 + SET; + R #Antrieb_vor; + CALL #Schleuse_4450 + ( Schleusen_Nr := 4450 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG4447" , + B_InSchleuse := "BG4450" , + B_Zähl := "BG4451" , + B_Stau_raus := "DVPtoEP_Sensoren".Stau_BG4451.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0322" , + Antrieb_plus_aktiv := "MA0323" , + Schleuse_geöffnet := "MB4450" , + RestZeit_Bereich_plus := #Bereich_4454.Dyn.Restzeit , + Y_Schleuse_Auf := "DVPtoEP_Zylinder".Schleuse_4450.Stat.Ast , + Error := %DB708.DBW558 , + Antrieb_Schleuse_vor := "DVPtoEP_Antriebe".MA0322.Stat.A_vor , + Antrieb_Schleuse_start := "DVPtoEP_Antriebe".MA0322.Stat.A_start , + Antrieb_Schleuse_stop := "DVPtoEP_Antriebe".MA0322.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DVPtoEP_Antriebe".MA0322.Stat.A_PS , + Antrieb_plus_vor := #Antrieb_vor , + hStOk := #ErrAnz + ); ---- NW 11: Schleuse 3366 (vor BST 1) --- - AN "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3 - AN "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4 - AN "7_HMI_Err_UH07_OB".System.BST1_Feueralarm - AN "7_HMI_Err_UH07_OB".System.BST1_Geschlossen - AN "7_HMI_Err_UH07_OB".System."BST1_Störung" - A Bereich_4441.Dyn.Sk.Bereich_ok - = Fahren_Ok + U #Antrieb_vor; + S "DVPtoEP_Antriebe".MA0322.Stat.A_vor; + S #Bereich_4454.Dyn.Status.Trolley_kommt_in_Bereich; -CALL FB "None" , (Schleusen_Nr:=3366, ErrQuit:=ErrQuit, B_VorSchleuse:="BG3364", B_InSchleuse:="BG3366", B_AusSchleuse:="BG4440", B_Stau_raus:="DVPtoEP_Sensoren".Stau_BG4440.Stat.B_Akt, Start_Ok:=Fahren_Ok, Antrieb_Schleuse_aktiv:="MA0061", Antrieb_plus_aktiv:="MA0320", Schleuse_geöffnet:="MB3366", RestZeit_Bereich_plus:=Bereich_4441.Dyn.Restzeit, Y_Schleuse_Auf:="DVPtoEP_Zylinder".Schleuse_3366.Stat.Ast, Error:=DB708.DBW530, Antrieb_Schleuse_vor:="DVPtoEP_Antriebe".MA0061.Stat.A_vor, Antrieb_Schleuse_start:="DVPtoEP_Antriebe".MA0061.Stat.A_start, Antrieb_Schleuse_stop:="DVPtoEP_Antriebe".MA0061.Stat.Stop_vor, Antrieb_Schleuse_PS:="DVPtoEP_Antriebe".MA0061.Stat.A_PS, Antrieb_plus_vor:=Bereich_4441.Dyn.Status.Trolley_kommt_in_Bereich, Antrieb_plus_start:=?, hStOk:=ErrAnz) +NETWORK +TITLE = Störungen anzeigen UZ7401 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7401.StOk_blinken; + S "DOutbound_Bereich".A01_UC074.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; +NETWORK +TITLE = Störungen quittieren UZ7401/7402 + U "DOutbound_Bereich".A01_UZ7401.StOk_aktiv; + O "DOutbound_Bereich".A01_UZ7402.StOk_aktiv; + O "DOutbound_Bereich".A01_UC074.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; ---- NW 12: Störungen anzeigen UZ0701 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ0701.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken +NETWORK +TITLE = Bereich 4454 + U "BG4453"; + U "MB4450"; + = #B_vor_Schleuse; + U "DVPtoEP_Sensoren".Stau_BG4500.Stat.B_Akt; + O "DVPtoEP_Sensoren".Stau_BG4530.Stat.B_Akt; + O "DVPtoEP_Sensoren".Stau_BG4502.Stat.B_Akt; + = #Stau_raus; ---- NW 13: Störungen quittieren UZ7401 --- - A "DOutbound_Bereich".A01_UZ7401.StOk_aktiv - O "DOutbound_Bereich".A01_UC074.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit + CALL #Bereich_4454 + ( Bereichs_Nr := 4454 , + ErrQuit := #ErrQuit , + B_BereichsAnfang := #B_vor_Schleuse , + B_BereichsEnde := "BG4454" , + B_Zähl := "BG4500" , + B_Stau_raus := #Stau_raus , + Start_Ok := 1 , + Antrieb_Bereich_aktiv := "MA0323" , + Antrieb_plus_aktiv := "MA0324" , + Antrieb_Bereich_vor := "DVPtoEP_Antriebe".MA0323.Stat.A_vor , + Antrieb_Bereich_stop := "DVPtoEP_Antriebe".MA0323.Stat.Stop_vor , + Error := %DB708.DBW476 , + Antrieb_Bereich_start := "DVPtoEP_Antriebe".MA0323.Stat.A_start , + Antrieb_plus_vor := "DVPtoEP_Antriebe".MA0324.Stat.A_vor , + Antrieb_plus_start := "DVPtoEP_Antriebe".MA0324.Stat.A_start , + Antrieb_minus_vor := "DVPtoEP_Antriebe".MA0322.Stat.A_vor , + hStOk := #ErrAnz + ); +NETWORK +TITLE = MA0324 / Übergang 4501 + U "BG4500"; + O "BG4530"; + = #B_vor_Schleuse; ---- NW 14: Bereich 4441 (hinter BST 1) --- -// Falls Trolley hinter BST noch gespeichert - A "DVPtoEP_Sensoren".Stau_BG4440.Stat.B_Akt - S "DVPtoEP_Antriebe".MA0320.Stat.A_start + CALL #Übergang_4501 + ( ErrQuit := #ErrQuit , + B_Anfang := #B_vor_Schleuse , + B_Am_Übergang := "BG4501" , + B_Stau_Antrieb_plus := "BG4502" , + Antrieb_aktiv := "MA0324" , + Antrieb_plus_aktiv := "MA0325" , + Antrieb_vor := "DVPtoEP_Antriebe".MA0324.Stat.A_vor , + Antrieb_start := "DVPtoEP_Antriebe".MA0324.Stat.A_start , + Antrieb_stop := "DVPtoEP_Antriebe".MA0324.Stat.A_PS , + Antrieb_plus_vor := "DVPtoEP_Antriebe".MA0325.Stat.A_vor , + Antrieb_plus_start := "DVPtoEP_Antriebe".MA0325.Stat.A_start + ); - A "BG4440" - A "MB3366" - = B_vor_Schleuse +NETWORK +TITLE = Störungen anzeigen UZ7401/7402 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7401.StOk_blinken; + S "DOutbound_Bereich".A01_UZ7402.StOk_blinken; + S "DOutbound_Bereich".A01_UC074.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; -CALL FB "None" , (Bereichs_Nr:=4441, ErrQuit:=ErrQuit, B_BereichsAnfang:=B_vor_Schleuse, B_BereichsEnde:="BG4441", B_Zähl:="BG4442", B_Stau_raus:="DVPtoEP_Sensoren".Stau_BG4442.Stat.B_Akt, Start_Ok:=1, Antrieb_Bereich_aktiv:="MA0320", Antrieb_plus_aktiv:="MA0321", RestZeit_Bereich_plus:=?, Antrieb_Bereich_vor:="DVPtoEP_Antriebe".MA0320.Stat.A_vor, Antrieb_Bereich_stop:="DVPtoEP_Antriebe".MA0320.Stat.Stop_vor, Error:=DB708.DBW474, Antrieb_Bereich_start:="DVPtoEP_Antriebe".MA0320.Stat.A_start, Antrieb_plus_vor:="DVPtoEP_Antriebe".MA0321.Stat.A_vor, Antrieb_plus_start:="DVPtoEP_Antriebe".MA0321.Stat.A_start, Antrieb_minus_vor:=?, hStOk:=ErrAnz) +NETWORK +TITLE = Ende + BE; - ---- NW 15: Schleuse 4443 --- -CALL FB "None" , (Schleusen_Nr:=4443, ErrQuit:=ErrQuit, B_VorSchleuse:="BG4442", B_InSchleuse:="BG4443", B_Zähl:=?, B_Stau_raus:="DVPtoEP_Sensoren".Stau_BG4445.Stat.B_Akt, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0321", Antrieb_plus_aktiv:=?, Schleuse_geöffnet:="MB4443", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DVPtoEP_Zylinder".Schleuse_4443.Stat.Ast, Error:=DB708.DBW554, Antrieb_Schleuse_vor:="DVPtoEP_Antriebe".MA0321.Stat.A_vor, Antrieb_Schleuse_start:="DVPtoEP_Antriebe".MA0321.Stat.A_start, Antrieb_Schleuse_stop:="DVPtoEP_Antriebe".MA0321.Stat.Stop_vor, Antrieb_Schleuse_PS:="DVPtoEP_Antriebe".MA0321.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) // über Weiche | über Weiche | über Weiche - - ---- NW 16: Weiche 4445 --- - A "MA0321" - A "MA0332" - = Antrieb_aktiv - - SET - R Antrieb_vor - R Antrieb_stop - -CALL FB "None" , (Weichen_Nr:=4445, ErrQuit:=ErrQuit, Fahren_Ok:=1, B_Ziel_gerade:="BG4447", B_Ziel_abzweig:="BG4461", Antrieb_Weiche_aktiv:=Antrieb_aktiv, Antrieb_Gerade_aktiv:="MA0322", Antrieb_Abzweig_aktiv:="MA0331", Weiche_ist_AST:="MB4445", Y_Weiche_gerade:=?, Y_Weiche_abzweig:="DVPtoEP_Zylinder".Weiche_4445.Stat.Ast, Error:=DB708.DBW556, Antrieb_Weiche_vor:=Antrieb_vor, Antrieb_Weiche_stop:=Antrieb_stop, Antrieb_Weiche_gerade_vor:="DVPtoEP_Antriebe".MA0322.Stat.A_vor, Antrieb_Weiche_gerade_stop:="DVPtoEP_Antriebe".MA0322.Stat.Stop_vor, Antrieb_Weiche_abzweig_vor:="DEPtoLP_Antriebe".MA0331.Stat.A_vor, Antrieb_Weiche_abzweig_stop:="DEPtoLP_Antriebe".MA0331.Stat.Stop_vor, hStOk:=ErrAnz) // da 2 Antriebe notwendig - - A Antrieb_vor - S "DVPtoEP_Antriebe".MA0321.Stat.A_vor - S "DEPtoLP_Antriebe".MA0332.Stat.A_vor - S "DVPtoEP_Antriebe".MA0321.Stat.A_start - S "DEPtoLP_Antriebe".MA0332.Stat.A_start - - A Antrieb_stop - S "DVPtoEP_Antriebe".MA0321.Stat.Stop_vor - - A Antrieb_stop - A "MB4445" // Nur bei Abzweig - S "DEPtoLP_Antriebe".MA0332.Stat.Stop_vor - -// Damit Partner fahren kann: - A Weiche_4445.Dyn.Status.Weiche_frei - R "DVPtoEP_Zylinder".Weiche_4445.Stat.Ast - - ---- NW 17: Schleuse 4450 --- - SET - R Antrieb_vor - -CALL FB "None" , (Schleusen_Nr:=4450, ErrQuit:=ErrQuit, B_VorSchleuse:="BG4447", B_InSchleuse:="BG4450", B_Zähl:="BG4451", B_Stau_raus:="DVPtoEP_Sensoren".Stau_BG4451.Stat.B_Akt, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0322", Antrieb_plus_aktiv:="MA0323", Schleuse_geöffnet:="MB4450", RestZeit_Bereich_plus:=Bereich_4454.Dyn.Restzeit, Y_Schleuse_Auf:="DVPtoEP_Zylinder".Schleuse_4450.Stat.Ast, Error:=DB708.DBW558, Antrieb_Schleuse_vor:="DVPtoEP_Antriebe".MA0322.Stat.A_vor, Antrieb_Schleuse_start:="DVPtoEP_Antriebe".MA0322.Stat.A_start, Antrieb_Schleuse_stop:="DVPtoEP_Antriebe".MA0322.Stat.Stop_vor, Antrieb_Schleuse_PS:="DVPtoEP_Antriebe".MA0322.Stat.A_PS, Antrieb_plus_vor:=Antrieb_vor, Antrieb_plus_start:=?, hStOk:=ErrAnz) - - A Antrieb_vor - S "DVPtoEP_Antriebe".MA0322.Stat.A_vor - S Bereich_4454.Dyn.Status.Trolley_kommt_in_Bereich - - ---- NW 18: Störungen anzeigen UZ7401 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7401.StOk_blinken - S "DOutbound_Bereich".A01_UC074.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 19: Störungen quittieren UZ7401/7402 --- - A "DOutbound_Bereich".A01_UZ7401.StOk_aktiv - O "DOutbound_Bereich".A01_UZ7402.StOk_aktiv - O "DOutbound_Bereich".A01_UC074.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 20: Bereich 4454 --- - A "BG4453" - A "MB4450" - = B_vor_Schleuse - - A "DVPtoEP_Sensoren".Stau_BG4500.Stat.B_Akt - O "DVPtoEP_Sensoren".Stau_BG4530.Stat.B_Akt - O "DVPtoEP_Sensoren".Stau_BG4502.Stat.B_Akt - = Stau_raus - -CALL FB "None" , (Bereichs_Nr:=4454, ErrQuit:=ErrQuit, B_BereichsAnfang:=B_vor_Schleuse, B_BereichsEnde:="BG4454", B_Zähl:="BG4500", B_Stau_raus:=Stau_raus, Start_Ok:=1, Antrieb_Bereich_aktiv:="MA0323", Antrieb_plus_aktiv:="MA0324", RestZeit_Bereich_plus:=?, Antrieb_Bereich_vor:="DVPtoEP_Antriebe".MA0323.Stat.A_vor, Antrieb_Bereich_stop:="DVPtoEP_Antriebe".MA0323.Stat.Stop_vor, Error:=DB708.DBW476, Antrieb_Bereich_start:="DVPtoEP_Antriebe".MA0323.Stat.A_start, Antrieb_plus_vor:="DVPtoEP_Antriebe".MA0324.Stat.A_vor, Antrieb_plus_start:="DVPtoEP_Antriebe".MA0324.Stat.A_start, Antrieb_minus_vor:="DVPtoEP_Antriebe".MA0322.Stat.A_vor, hStOk:=ErrAnz) - - ---- NW 21: MA0324 / Übergang 4501 --- - A "BG4500" - O "BG4530" - = B_vor_Schleuse - -CALL FB "None" , (ErrQuit:=ErrQuit, B_Anfang:=B_vor_Schleuse, B_Am_Übergang:="BG4501", B_Stau_Antrieb_plus:="BG4502", Antrieb_aktiv:="MA0324", Antrieb_plus_aktiv:="MA0325", Antrieb_vor:="DVPtoEP_Antriebe".MA0324.Stat.A_vor, Antrieb_start:="DVPtoEP_Antriebe".MA0324.Stat.A_start, Antrieb_stop:="DVPtoEP_Antriebe".MA0324.Stat.A_PS, Antrieb_plus_vor:="DVPtoEP_Antriebe".MA0325.Stat.A_vor, Antrieb_plus_start:="DVPtoEP_Antriebe".MA0325.Stat.A_start) - - ---- NW 22: Störungen anzeigen UZ7401/7402 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7401.StOk_blinken - S "DOutbound_Bereich".A01_UZ7402.StOk_blinken - S "DOutbound_Bereich".A01_UC074.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 23: Ende --- - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Omnifahren_VPtoEP/VPtoEP_Ziel_FC.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Omnifahren_VPtoEP/VPtoEP_Ziel_FC.awl index 8e92871..5fa2468 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Omnifahren_VPtoEP/VPtoEP_Ziel_FC.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/Omnifahren_VPtoEP/VPtoEP_Ziel_FC.awl @@ -1,120 +1,123 @@ -=== FC 2181: VPtoEP_Ziel_FC [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Ziel_hex : Word - Ziel_int : Int - Zielebene : Word - Error : Byte - Position : Int - Lager_DB : Int - Lager_DW : Int - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - SSDW : Int - EndZiel : Word - Variante : Int - AbrufID : DInt - Fahrlisten_TrolleyID : DInt - Fahrlisten_AbrufID : DInt - Fahrlisten_Lager : Int - Trolley_unbekannt : Bool // Trolley ist nicht in DL - Express_Abruf : Bool - Constant: - Return: - Ret_Val : Void - ---- NW 1: Rückmeldung --- - SET // Rückmeldungen erst mal resetten - R "M180.6" // Weiterfahrt von Ziel-FC erlaubt +FUNCTION "VPtoEP_Ziel_FC" : Void +TITLE = Ziel-FC: VP>EP +{ S7_Optimized_Access := 'FALSE' ; S7_Pass_Registers := 'TRUE' } +AUTHOR : AE +VERSION : 0.1 + VAR_TEMP + Ziel_hex : Word; + Ziel_int : Int; + Zielebene : Word; + Error : Byte; + Position : Int; + Lager_DB : Int; + Lager_DW : Int; + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + SSDW : Int; + EndZiel : Word; + Variante : Int; + AbrufID : DInt; + Fahrlisten_TrolleyID : DInt; + Fahrlisten_AbrufID : DInt; + Fahrlisten_Lager : Int; + Trolley_unbekannt : Bool; // Trolley ist nicht in DL + Express_Abruf : Bool; + END_VAR ---- NW 2: Bereich 3361: Weiterfahren erlaubt ? (Ende MA0060) --- - L "MW190" - L 3361 // Aufruf von Schleuse 3361 ? - <>I // Nein! - JC X3361E +BEGIN +NETWORK +TITLE = Rückmeldung + SET;//Rückmeldungen erst mal resetten + R "M180.6";//Weiterfahrt von Ziel-FC erlaubt - AN "DVPtoEP_Sensoren".Stau_BG3362.Stat.B_Akt - S "M180.6" // Weiterfahrt ist erlaubt +NETWORK +TITLE = Bereich 3361: Weiterfahren erlaubt ? (Ende MA0060) + L "MW190"; + L 3361 ;//Aufruf von Schleuse 3361 ? + <>I;//Nein! + SPB X3361E; - BEU + UN "DVPtoEP_Sensoren".Stau_BG3362.Stat.B_Akt; + S "M180.6" ;//Weiterfahrt ist erlaubt -X3361E: NOP 0 + BEA; +X3361E: NOP 0; ---- NW 3: Schleuse 3366: (BST 1) --- - L "MW190" - L 3366 // Aufruf von Schleuse XXXX? - <>I // Nein! - JC X3366E +NETWORK +TITLE = Schleuse 3366: (BST 1) + L "MW190"; + L 3366 ;//Aufruf von Schleuse XXXX? + <>I;//Nein! + SPB X3366E; - SET - S "M180.6" // Weiterfahrt ist erlaubt + SET; + S "M180.6" ;//Weiterfahrt ist erlaubt - BEU + BEA; -X3366E: NOP 0 +X3366E: NOP 0; +NETWORK +TITLE = Bereich 4441: Weiterfahren erlaubt ? (Ende MA0320) + L "MW190"; + L 4441 ;//Aufruf von Schleuse 4441 ? + <>I;//Nein! + SPB X4441E; ---- NW 4: Bereich 4441: Weiterfahren erlaubt ? (Ende MA0320) --- - L "MW190" - L 4441 // Aufruf von Schleuse 4441 ? - <>I // Nein! - JC X4441E + UN "DVPtoEP_Sensoren".Stau_BG4442.Stat.B_Akt; + S "M180.6" ;//Weiterfahrt ist erlaubt - AN "DVPtoEP_Sensoren".Stau_BG4442.Stat.B_Akt - S "M180.6" // Weiterfahrt ist erlaubt + BEA; - BEU +X4441E: NOP 0; -X4441E: NOP 0 +NETWORK +TITLE = Schleuse 4443: (Vor ByPass zurück zu LP) + L "MW190"; + L 4443 ;//Aufruf von Schleuse XXXX? + <>I;//Nein! + SPB PS5E; +//Ziel-Check: + L "DVPtoEP_OmniFahren".Schleuse_4443.Dyn.Trolley_ShopGroup; + L DINT#-1 ;//leerer Trolley ? + ==D ;//Ja ! + UN "DVPtoEP_Sensoren".Sack_BG4444.Stat.B_Akt;//Kein Sack erkannt + SPB A4443 ;//Abzweig fahren ---- NW 5: Schleuse 4443: (Vor ByPass zurück zu LP) --- - L "MW190" - L 4443 // Aufruf von Schleuse XXXX? - <>I // Nein! - JC PS5E + SPA G4443 ;//Rest Gerade fahren -// Ziel-Check: - L "DVPtoEP_OmniFahren".Schleuse_4443.Dyn.Trolley_ShopGroup - L DINT#-1 // leerer Trolley ? - ==D // Ja ! - AN "DVPtoEP_Sensoren".Sack_BG4444.Stat.B_Akt // Kein Sack erkannt - JC A4443 // Abzweig fahren +A4443: L 16#4461; + T "MW198" ;//Weichenziel - JU G4443 // Rest Gerade fahren +//Quell-Steuerung: + L "DEPtoLP_OmniFahren".Schleuse_4466.Dyn.Raus_Trolleys; + L 0 ;//Sind Trolleys zur Weiche MB4210 unterwegs? + >I;//Ja! + O "DEPtoLP_OmniFahren".Schleuse_4466.Dyn.Status.Reset_aktiv; + O "MB4466" ;//Andere Quelle aktiv + BEB; -A4443: L 16#4461 - T "MW198" // Weichenziel + UN "DEPtoLP_Sensoren".Stau_BG4461.Stat.B_Akt; + S "M180.6" ;//Weiterfahrt ist erlaubt -// Quell-Steuerung: - L "DEPtoLP_OmniFahren".Schleuse_4466.Dyn.Raus_Trolleys - L 0 // Sind Trolleys zur Weiche MB4210 unterwegs? - >I // Ja! - O "DEPtoLP_OmniFahren".Schleuse_4466.Dyn.Status.Reset_aktiv - O "MB4466" // Andere Quelle aktiv - BEC + BEA; - AN "DEPtoLP_Sensoren".Stau_BG4461.Stat.B_Akt - S "M180.6" // Weiterfahrt ist erlaubt +G4443: L 16#4447; + T "MW198" ;//Weichenziel - BEU + UN "DVPtoEP_Sensoren".Stau_BG4447.Stat.B_Akt; + S "M180.6" ;//Weiterfahrt ist erlaubt -G4443: L 16#4447 - T "MW198" // Weichenziel + BEA; - AN "DVPtoEP_Sensoren".Stau_BG4447.Stat.B_Akt - S "M180.6" // Weiterfahrt ist erlaubt +PS5E: NOP 0; - BEU +NETWORK +TITLE = Ende + BE; -PS5E: NOP 0 - - ---- NW 6: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/VPtoEP_Bereich.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/VPtoEP_Bereich.awl index 86d8593..5d17f7f 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/VPtoEP_Bereich.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/2_VPtoEP/VPtoEP_Bereich.awl @@ -1,23 +1,22 @@ -=== FC 2100: VPtoEP_Bereich [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Constant: - Return: - Ret_Val : Void +FUNCTION "VPtoEP_Bereich" : Void +TITLE = Bereich Outbound: VP > EP +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 ---- NW 1: Baustein-Aufrufe --- -CALL FB "VPtoEP_Sensoren" , +BEGIN +NETWORK +TITLE = Baustein-Aufrufe + CALL "VPtoEP_Sensoren", "DVPtoEP_Sensoren"; -CALL FB "VPtoEP_OmniFahren" , + CALL "VPtoEP_OmniFahren", "DVPtoEP_OmniFahren"; -CALL FB "VPtoEP_Zylinder" , + CALL "VPtoEP_Zylinder", "DVPtoEP_Zylinder"; -CALL FB "VPtoEP_Antriebe" , + CALL "VPtoEP_Antriebe", "DVPtoEP_Antriebe"; +NETWORK +TITLE = Ende + BE; ---- NW 2: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Basics/EP_Sensoren.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Basics/EP_Sensoren.awl index 701a7c2..cda07db 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Basics/EP_Sensoren.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Basics/EP_Sensoren.awl @@ -1,42 +1,77 @@ -=== FB 3190: EP_Sensoren [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Stau_EP1 : "MSensoren" - Stau_EP2 : "MSensoren" - Stau_EP3 : "MSensoren" - Stau_EP4 : "MSensoren" - Temp: - T_Ein : Int // Vorgabe Einschaltverzögerung - T_Aus : Int // Zwischenspeicher Ausschaltverzögerung - F1 : Bool // Geschwindigkeit 1 aktiviert - F2 : Bool // Geschwindigkeit 2 aktiviert - F3 : Bool // Geschwindigkeit 3 aktiviert - ESensor : Bool // Sensoren - Antrieb : Bool - VReal : Real // GeschwindigkeitinReal - Zeit : Int // Zeit für Ausschaltverzögerung LT1100 - Aktiv : Bool // Zeit aktivieren - Constant: +FUNCTION_BLOCK "EP_Sensoren" +TITLE = Einige Sensoren entprellen EntnahmePuffer +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + Stau_EP1 : "MSensoren"; + Stau_EP2 : "MSensoren"; + Stau_EP3 : "MSensoren"; + Stau_EP4 : "MSensoren"; + END_VAR ---- NW 1: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4504", T_Ein:=100, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) + VAR_TEMP + T_Ein : Int; // Vorgabe Einschaltverzögerung + T_Aus : Int; // Zwischenspeicher Ausschaltverzögerung + F1 : Bool; // Geschwindigkeit 1 aktiviert + F2 : Bool; // Geschwindigkeit 2 aktiviert + F3 : Bool; // Geschwindigkeit 3 aktiviert + ESensor : Bool; // Sensoren + Antrieb : Bool; + VReal : Real; // GeschwindigkeitinReal + Zeit : Int; // Zeit für Ausschaltverzögerung LT1100 + Aktiv : Bool; // Zeit aktivieren + END_VAR ---- NW 2: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4505", T_Ein:=100, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +BEGIN +NETWORK +TITLE = Stau EntnahmePuffer +//Sensoren entprellen + CALL #Stau_EP1 + ( ESensor := "BG4504" , + T_Ein := 100 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau EntnahmePuffer +//Sensoren entprellen + CALL #Stau_EP2 + ( ESensor := "BG4505" , + T_Ein := 100 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 3: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4506", T_Ein:=100, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau EntnahmePuffer +//Sensoren entprellen + CALL #Stau_EP3 + ( ESensor := "BG4506" , + T_Ein := 100 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau EntnahmePuffer +//Sensoren entprellen + CALL #Stau_EP4 + ( ESensor := "BG4507" , + T_Ein := 100 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 4: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4507", T_Ein:=100, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Ende + BE; - ---- NW 5: Ende --- - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Basics/EP_Zylinder.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Basics/EP_Zylinder.awl index 740ac87..0628608 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Basics/EP_Zylinder.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Basics/EP_Zylinder.awl @@ -1,50 +1,86 @@ -=== FB 3192: EP_Zylinder [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Sorter_4503 : "MZylinder" // - Weiche_EP1 : "MZylinder" // - Weiche_EP2 : "MZylinder" - Weiche_EP3 : "MZylinder" - Weiche_EP4 : "MZylinder" - Temp: - Auto : Bool // Automatik ist aktiv - Hand : Bool // Hand ist aktiv - ZylAst : Bool // Zylinder ansteuern - Constant: +FUNCTION_BLOCK "EP_Zylinder" +TITLE = Zylinder Outbound Entnahmepuffer +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 + VAR + Sorter_4503 : "MZylinder"; // + Weiche_EP1 : "MZylinder"; // + Weiche_EP2 : "MZylinder"; + Weiche_EP3 : "MZylinder"; + Weiche_EP4 : "MZylinder"; + END_VAR ---- NW 1: Übergabe des Bereichstatus System UC074/A01 --- - A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto - - A "DOutbound_Bereich".A01_UC074.BereichErr - AN "SGes".Simulation_ohne_HW_aktiv - JC Next // Zylinder-Stellung nicht mehr ändern + VAR_TEMP + Auto : Bool; // Automatik ist aktiv + Hand : Bool; // Hand ist aktiv + ZylAst : Bool; // Zylinder ansteuern + END_VAR ---- NW 2: Schleuse_4503 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4503", ZylGst:=?) +BEGIN +NETWORK +TITLE = Übergabe des Bereichstatus System UC074/A01 + U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; + U "DOutbound_Bereich".A01_UC074.BereichErr; + UN "SGes".Simulation_ohne_HW_aktiv; + SPB Next ;//Zylinder-Stellung nicht mehr ändern ---- NW 3: Weiche_EP1 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4504", ZylGst:=?) +NETWORK +TITLE = Schleuse_4503 + CALL #Sorter_4503 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4503" + ); +NETWORK +TITLE = Weiche_EP1 + CALL #Weiche_EP1 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4504" + ); ---- NW 4: Weiche_EP2 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4505", ZylGst:=?) +NETWORK +TITLE = Weiche_EP2 + CALL #Weiche_EP2 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4505" + ); +NETWORK +TITLE = Weiche_EP3 + CALL #Weiche_EP3 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4506" + ); ---- NW 5: Weiche_EP3 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4506", ZylGst:=?) +NETWORK +TITLE = Weiche_EP4 + CALL #Weiche_EP4 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 + ); +NETWORK +TITLE = Ende +Next: BE; ---- NW 6: Weiche_EP4 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:=?, ZylGst:=?) - - ---- NW 7: Ende --- -Next: BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/EP_Bereich.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/EP_Bereich.awl index ac1c50d..04cd2cf 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/EP_Bereich.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/EP_Bereich.awl @@ -1,25 +1,24 @@ -=== FC 3100: EP_Bereich [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Constant: - Return: - Ret_Val : Void +FUNCTION "EP_Bereich" : Void +TITLE = Bereich Outbound: EntnahmePuffer +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 ---- NW 1: Baustein-Aufrufe --- -CALL FB "EP_Sensoren" , +BEGIN +NETWORK +TITLE = Baustein-Aufrufe + CALL "EP_Sensoren", "DEP_Sensoren"; -CALL FB "EP_OmniFahren" , + CALL "EP_OmniFahren", "DEP_OmniFahren"; -CALL FB "EntnahmePufferStrecken" , + CALL "EntnahmePufferStrecken", "DEntnahmePufferStrecken"; -CALL FB "EP_Sorter" , + CALL "EP_Sorter", "DEP_Sorter"; -CALL FB "EP_Zylinder" , + CALL "EP_Zylinder", "DEP_Zylinder"; +NETWORK +TITLE = Ende + BE; ---- NW 2: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Omnifahren_Entnahmepuffer/EP_Draussen_FC.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Omnifahren_Entnahmepuffer/EP_Draussen_FC.awl index ce264d6..808dc72 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Omnifahren_Entnahmepuffer/EP_Draussen_FC.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Omnifahren_Entnahmepuffer/EP_Draussen_FC.awl @@ -1,38 +1,41 @@ -=== FC 3182: EP_Draussen_FC [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Constant: - Return: - Ret_Val : Void +FUNCTION "EP_Draussen_FC" : Void +TITLE = Draussen-FC: EntnahmePuffer +{ S7_Optimized_Access := 'FALSE' ; S7_Pass_Registers := 'TRUE' } +AUTHOR : AE +VERSION : 0.1 ---- NW 1: Rückmeldung --- - SET // Rückmeldungen erst mal resetten - R "M180.6" // Weiterfahrt von Ziel-FC erlaubt +BEGIN +NETWORK +TITLE = Rückmeldung + SET;//Rückmeldungen erst mal resetten + R "M180.6";//Weiterfahrt von Ziel-FC erlaubt +NETWORK +TITLE = Schleuse 4503 (Sorter EP): Ausgefahren ? + L "MW190"; + L 4503 ;//Aufruf von Schleuse 4503 ? + <>I;//Nein! + SPB X4503E; ---- NW 2: Schleuse 4503 (Sorter EP): Ausgefahren ? --- - L "MW190" - L 4503 // Aufruf von Schleuse 4503 ? - <>I // Nein! - JC X4503E +//Trolleydaten in DB1000 löschen, da danach zum LP fährt und dann kein Leser mehr! + CALL "Trolleydaten_löschen" + ( Gesamt_Trolley_DL := 1000 , + TrolleyID := "DEP_Sorter".Sorter_MB4503.Dyn.Scanner.Rec_IDX //IDX + ); -// Trolleydaten in DB1000 löschen, da danach zum LP fährt und dann kein Leser mehr! -CALL FC "Trolleydaten_löschen" (Gesamt_Trolley_DL:=1000, TrolleyID:="DEP_Sorter".Sorter_MB4503.Dyn.Scanner.Rec_IDX) // IDX +//Daten in Sep 4503 löschen: + L DINT#0; + T "DEP_Sorter".Sorter_MB4503.Dyn.Scanner.Rec_IDX;//IDX + L 0; + T "DEP_Sorter".Sorter_MB4503.Dyn.Scanner.Rec_DEST_Ziel; -// Daten in Sep 4503 löschen: - L DINT#0 - T "DEP_Sorter".Sorter_MB4503.Dyn.Scanner.Rec_IDX // IDX - L 0 - T "DEP_Sorter".Sorter_MB4503.Dyn.Scanner.Rec_DEST_Ziel + BEA; - BEU +X4503E: NOP 0; -X4503E: NOP 0 +NETWORK +TITLE = Ende + BE; - ---- NW 3: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Omnifahren_Entnahmepuffer/EP_Leser_FC.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Omnifahren_Entnahmepuffer/EP_Leser_FC.awl index 3a71b30..300a715 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Omnifahren_Entnahmepuffer/EP_Leser_FC.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Omnifahren_Entnahmepuffer/EP_Leser_FC.awl @@ -1,42 +1,51 @@ -=== FC 3180: EP_Leser_FC [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Zielebene : Word - Constant: - Return: - Ret_Val : Void - ---- NW 1: Rückmeldung --- -// Keine - L 0 // Evtl. Zwischenziel (MW196) - T "MW196" +FUNCTION "EP_Leser_FC" : Void +TITLE = Leser-FC: EntnahmePuffer +{ S7_Optimized_Access := 'FALSE' ; S7_Pass_Registers := 'TRUE' } +AUTHOR : AE +VERSION : 0.1 + VAR_TEMP + Zielebene : Word; + END_VAR ---- NW 2: Schleuse 4503: (Sorter EP) --- - L "MW190" // Schleusen-Nr. - L 4503 // Aufruf von Schleuse ? - <>I // Nein! - JC X4503E +BEGIN +NETWORK +TITLE = Rückmeldung - AN "M180.0" // Lesefehler - JC Y4503 + //Keine + L 0;//Evtl. Zwischenziel (MW196) + T "MW196"; - BEU +NETWORK +TITLE = Schleuse 4503: (Sorter EP) + L "MW190" ;//Schleusen-Nr. + L 4503 ;//Aufruf von Schleuse ? + <>I;//Nein! + SPB X4503E; -Y4503: AN "M180.1" // unbekannt in TrolleysDL - BEC + UN "M180.0";//Lesefehler + SPB Y4503; -// /In Zukunft Anfrage bei Host! -CALL FC "Trolleydaten_neu_anlegen" (Gesamt_Trolley_DL:="DEP_OmniFahren".Schleuse_4503.Schleuse.Gesamt_Trolley_DL, TrolleyID:="DEP_OmniFahren".Schleuse_4503.Dyn.TrolleyID_Schleuse, Endziel:=16#E201, ShopGroup:=0) // Erst mal, da kein Host! | Entnahme-Puffer 1 + BEA; - BEU +Y4503: UN "M180.1" ;//unbekannt in TrolleysDL + BEB; -X4503E: NOP 0 +///In Zukunft Anfrage bei Host! + CALL "Trolleydaten_neu_anlegen"//Erst mal, da kein Host! + ( Gesamt_Trolley_DL := "DEP_OmniFahren".Schleuse_4503.Schleuse.Gesamt_Trolley_DL , + TrolleyID := "DEP_OmniFahren".Schleuse_4503.Dyn.TrolleyID_Schleuse , + Endziel := 16#E201 , //Entnahme-Puffer 1 + ShopGroup := 0 + ); + BEA; ---- NW 3: Ende --- - BE +X4503E: NOP 0; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Omnifahren_Entnahmepuffer/EP_OmniFahren.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Omnifahren_Entnahmepuffer/EP_OmniFahren.awl index ef57184..b2091dd 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Omnifahren_Entnahmepuffer/EP_OmniFahren.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Omnifahren_Entnahmepuffer/EP_OmniFahren.awl @@ -1,68 +1,89 @@ -=== FB 3128: EP_OmniFahren [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Schleuse_4503 : "MHMOmniSchleuse" - EP_1_voll : Bool - EP_2_voll : Bool - EP_3_voll : Bool - EP_4_voll : Bool - Temp: - ErrQuit : Bool - ErrAnz : Bool - Stau_raus : Bool - Start_ok : Bool - B_aktiv : Bool - B_vor_Schleuse : Bool - B_nach_Schleuse : Bool - Antrieb_aktiv : Bool - Antrieb_start : Bool - Antrieb_stop : Bool - Fahren_Ok : Bool - Antrieb_nicht_stoppen : Bool - Constant: +FUNCTION_BLOCK "EP_OmniFahren" +TITLE = Omnifahren Outbound EntnahmePuffer +{ S7_Optimized_Access := 'FALSE' } +VERSION : 0.1 + VAR + Schleuse_4503 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + EP_1_voll { S7_SetPoint := 'True'} : Bool; + EP_2_voll { S7_SetPoint := 'True'} : Bool; + EP_3_voll { S7_SetPoint := 'True'} : Bool; + EP_4_voll { S7_SetPoint := 'True'} : Bool; + END_VAR ---- NW 1: Systemzeug --- -// VollPuffer-Bereich: - A "DOutbound_Bereich".A01_UH07.AnlageEin - = Schleuse_4503.Dyn.Sk.Auto_akt - - AN "DOutbound_Bereich".A01_UC074.BereichErr - = Schleuse_4503.Dyn.Sk.Bereich_ok + VAR_TEMP + ErrQuit : Bool; + ErrAnz : Bool; + Stau_raus : Bool; + Start_ok : Bool; + B_aktiv : Bool; + B_vor_Schleuse : Bool; + B_nach_Schleuse : Bool; + Antrieb_aktiv : Bool; + Antrieb_start : Bool; + Antrieb_stop : Bool; + Fahren_Ok : Bool; + Antrieb_nicht_stoppen : Bool; + END_VAR ---- NW 2: Störungen quittieren UZ7402 --- - A "DOutbound_Bereich".A01_UZ7402.StOk_aktiv - O "DOutbound_Bereich".A01_UC074.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit +BEGIN +NETWORK +TITLE = Systemzeug +//VollPuffer-Bereich: + U "DOutbound_Bereich".A01_UH07.AnlageEin; + = #Schleuse_4503.Dyn.Sk.Auto_akt; ---- NW 3: Schleuse 4503 --- -CALL FB "None" , (Schleusen_Nr:=4503, ErrQuit:=ErrQuit, B_VorSchleuse:="BG4502", B_InSchleuse:="BG4503", B_AusSchleuse:=?, B_Stau_raus:=?, Start_Ok:=?, Antrieb_Schleuse_aktiv:="MA0325", Antrieb_plus_aktiv:=?, Schleuse_geöffnet:="MB4503", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:=?, Error:=DB708.DBW564, Antrieb_Schleuse_vor:="DVPtoEP_Antriebe".MA0325.Stat.A_vor, Antrieb_Schleuse_start:="DVPtoEP_Antriebe".MA0325.Stat.A_start, Antrieb_Schleuse_stop:="DVPtoEP_Antriebe".MA0325.Stat.Stop_vor, Antrieb_Schleuse_PS:="DVPtoEP_Antriebe".MA0325.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) // weiterfahrt über Sorter-Sep + UN "DOutbound_Bereich".A01_UC074.BereichErr; + = #Schleuse_4503.Dyn.Sk.Bereich_ok; - AN Schleuse_4503.Dyn.Status.Reset_aktiv - JC NoR4503 +NETWORK +TITLE = Störungen quittieren UZ7402 + U "DOutbound_Bereich".A01_UZ7402.StOk_aktiv; + O "DOutbound_Bereich".A01_UC074.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; - L DINT#0 - T "DEP_Sorter".Sorter_MB4503.Dyn.Scanner.Rec_IDX // IDX - L 0 - T "DEP_Sorter".Sorter_MB4503.Separator.Default_Ziel - T "DEP_Sorter".Sorter_MB4503.Dyn.Scanner.Rec_DEST_Ziel +NETWORK +TITLE = Schleuse 4503 + CALL #Schleuse_4503 + ( Schleusen_Nr := 4503 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG4502" , + B_InSchleuse := "BG4503" , + B_AusSchleuse := , //weiterfahrt über Sorter-Sep + Antrieb_Schleuse_aktiv := "MA0325" , + Schleuse_geöffnet := "MB4503" , + Error := %DB708.DBW564 , + Antrieb_Schleuse_vor := "DVPtoEP_Antriebe".MA0325.Stat.A_vor , + Antrieb_Schleuse_start := "DVPtoEP_Antriebe".MA0325.Stat.A_start , + Antrieb_Schleuse_stop := "DVPtoEP_Antriebe".MA0325.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DVPtoEP_Antriebe".MA0325.Stat.A_PS , + hStOk := #ErrAnz + ); -NoR4503: NOP 0 + UN #Schleuse_4503.Dyn.Status.Reset_aktiv; + SPB NoR4503; + L DINT#0; + T "DEP_Sorter".Sorter_MB4503.Dyn.Scanner.Rec_IDX;//IDX + L 0; + T "DEP_Sorter".Sorter_MB4503.Separator.Default_Ziel; + T "DEP_Sorter".Sorter_MB4503.Dyn.Scanner.Rec_DEST_Ziel; ---- NW 4: Störungen anzeigen UZ7402 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7402.StOk_blinken - S "DOutbound_Bereich".A01_UC074.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken +NoR4503: NOP 0; +NETWORK +TITLE = Störungen anzeigen UZ7402 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7402.StOk_blinken; + S "DOutbound_Bereich".A01_UC074.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; ---- NW 5: Ende --- - BE +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Omnifahren_Entnahmepuffer/EP_Ziel_FC.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Omnifahren_Entnahmepuffer/EP_Ziel_FC.awl index 021d7b4..9a52960 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Omnifahren_Entnahmepuffer/EP_Ziel_FC.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Omnifahren_Entnahmepuffer/EP_Ziel_FC.awl @@ -1,165 +1,185 @@ -=== FC 3181: EP_Ziel_FC [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Ziel_hex : Word - Ziel_int : Int - Zielebene : Word - Error : Byte - Position : Int - Lager_DB : Int - Lager_DW : Int - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - SSDW : Int - EndZiel : Word - Variante : Int - AbrufID : DInt - Fahrlisten_TrolleyID : DInt - Fahrlisten_AbrufID : DInt - Fahrlisten_Lager : Int - Trolley_unbekannt : Bool // Trolley ist nicht in DL - Express_Abruf : Bool - Error.Bit : Bool - Constant: - Return: - Ret_Val : Void - ---- NW 1: Rückmeldung --- - SET // Rückmeldungen erst mal resetten - R "M180.6" // Weiterfahrt von Ziel-FC erlaubt +FUNCTION "EP_Ziel_FC" : Void +TITLE = Ziel-FC: EntnahmePuffer_OmniFahren +{ S7_Optimized_Access := 'FALSE' ; S7_Pass_Registers := 'TRUE' } +AUTHOR : AE +VERSION : 0.1 + VAR_TEMP + Ziel_hex : Word; + Ziel_int : Int; + Zielebene : Word; + Error : Byte; + Position : Int; + Lager_DB : Int; + Lager_DW : Int; + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + SSDW : Int; + EndZiel : Word; + Variante : Int; + AbrufID : DInt; + Fahrlisten_TrolleyID : DInt; + Fahrlisten_AbrufID : DInt; + Fahrlisten_Lager : Int; + Trolley_unbekannt : Bool; // Trolley ist nicht in DL + Express_Abruf : Bool; + "Error.Bit" : Bool; + END_VAR ---- NW 2: Schleuse 4503: Weiterfahren erlaubt ? (Sorter EP) --- - L "MW190" - L 4503 // Aufruf von Schleuse 4503 ? - <>I // Nein! - JC X4503E +BEGIN +NETWORK +TITLE = Rückmeldung + SET;//Rückmeldungen erst mal resetten + R "M180.6";//Weiterfahrt von Ziel-FC erlaubt - L "EP_TravelFIFO".Travel_FIFO_BG4527.FIFO.ANZAHL - L 0 // Daten noch im Travel-FIFO? - <>I // Ja ! - O "MB4503" // Trolley fährt schon - BEC +NETWORK +TITLE = Schleuse 4503: Weiterfahren erlaubt ? (Sorter EP) + L "MW190"; + L 4503 ;//Aufruf von Schleuse 4503 ? + <>I;//Nein! + SPB X4503E; - A "SGes".Ohne_PC_Fahren // Also Ziel simulieren - JC Sim + L "EP_TravelFIFO".Travel_FIFO_BG4527.FIFO.ANZAHL; + L 0;//Daten noch im Travel-FIFO? + <>I;//Ja ! + O "MB4503" ;//Trolley fährt schon + BEB; -// Telegramm schon gesendet? - AN "DEP_OmniFahren".Schleuse_4503.Status2.Telegramm_gesendet - JC T4503 + U "SGes".Ohne_PC_Fahren;//Also Ziel simulieren + SPB Sim; -SimOk: CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:="MW194", Int_Wert:=Ziel_int) +//Telegramm schon gesendet? + UN "DEP_OmniFahren".Schleuse_4503.Status2.Telegramm_gesendet; + SPB T4503; -// Ziel-Überprüfung auf voll: - L Ziel_int - L 1 - ==I - AN "DEP_Sensoren".Stau_EP1.Stat.B_Akt - JC ZielOk +SimOk: CALL "BCD (4stellig)_to_INT" + ( BCD_Wert := "MW194" , + Int_Wert := #Ziel_int + ); - CAC - L 2 - ==I - AN "DEP_Sensoren".Stau_EP2.Stat.B_Akt - JC ZielOk +//Ziel-Überprüfung auf voll: + L #Ziel_int; + L 1; + ==I; + UN "DEP_Sensoren".Stau_EP1.Stat.B_Akt; + SPB ZielOk; - CAC - L 3 - ==I - AN "DEP_Sensoren".Stau_EP3.Stat.B_Akt - JC ZielOk + TAK; + L 2; + ==I; + UN "DEP_Sensoren".Stau_EP2.Stat.B_Akt; + SPB ZielOk; - CAC - L 4 - ==I - AN "DEP_Sensoren".Stau_EP4.Stat.B_Akt - JC ZielOk + TAK; + L 3; + ==I; + UN "DEP_Sensoren".Stau_EP3.Stat.B_Akt; + SPB ZielOk; - A "10s-Impuls" // Nach 10s - R "DEP_OmniFahren".Schleuse_4503.Status2.Telegramm_gesendet // Erneute Anfrage + TAK; + L 4; + ==I; + UN "DEP_Sensoren".Stau_EP4.Stat.B_Akt; + SPB ZielOk; - BEU // Warten, da Ziel unklar oder voll + U "10s-Impuls";//Nach 10s + R "DEP_OmniFahren".Schleuse_4503.Status2.Telegramm_gesendet;//Erneute Anfrage -ZielOk: L Ziel_int - + 200 - T "DEP_Sorter".Sorter_MB4503.Separator.Default_Ziel - T "DEP_Sorter".Sorter_MB4503.Dyn.Scanner.Rec_DEST_Ziel + BEA;//Warten, da Ziel unklar oder voll -// Scanner-IDX übergeben: - L "DEP_OmniFahren".Schleuse_4503.Dyn.TrolleyID_Schleuse - T "DEP_Sorter".Sorter_MB4503.Dyn.Scanner.Rec_IDX // IDX +ZielOk: L #Ziel_int; + + 200; + T "DEP_Sorter".Sorter_MB4503.Separator.Default_Ziel; + T "DEP_Sorter".Sorter_MB4503.Dyn.Scanner.Rec_DEST_Ziel; - CLR // Wird über MSorterRein (FB1423/5) gestartet! - S "M180.6" // Weiterfahrt ist erlaubt +//Scanner-IDX übergeben: + L "DEP_OmniFahren".Schleuse_4503.Dyn.TrolleyID_Schleuse; + T "DEP_Sorter".Sorter_MB4503.Dyn.Scanner.Rec_IDX;//IDX - BEU + CLR ;//Wird über MSorterRein (FB1423/5) gestartet! + S "M180.6" ;//Weiterfahrt ist erlaubt -// GOHDReqM an Host senden: -T4503: L "DEP_OmniFahren".Schleuse_4503.Dyn.TrolleyID_Schleuse - L 0 // Barcode bekannt? - ==D // Nein! - BEC // Warten! + BEA; -// Pufferstatus (Stau) ermitteln: - A "DEP_Sensoren".Stau_EP1.Stat.B_Akt - = "Daten_für_SendFIFO"."Status_2_Bit[0]" - A "DEP_Sensoren".Stau_EP2.Stat.B_Akt - = "Daten_für_SendFIFO"."Status_2_Bit[1]" - A "DEP_Sensoren".Stau_EP3.Stat.B_Akt - = "Daten_für_SendFIFO"."Status_2_Bit[2]" - A "DEP_Sensoren".Stau_EP4.Stat.B_Akt - = "Daten_für_SendFIFO"."Status_2_Bit[3]" +//GOHDReqM an Host senden: +T4503: L "DEP_OmniFahren".Schleuse_4503.Dyn.TrolleyID_Schleuse; + L 0;//Barcode bekannt? + ==D;//Nein! + BEB;//Warten! -CALL FB "Daten_in_SendFIFO_speichern" , (TelegrammKennung[1]:='G', TelegrammKennung[2]:='O', TelegrammKennung[3]:='H', TelegrammKennung[4]:='D', TelegrammKennung[5]:='R', TelegrammKennung[6]:='e', TelegrammKennung[7]:='q', TelegrammKennung[8]:='M', TelegrammKennung[9]:=?, TelegrammKennung[10]:=?, TrolleyID:="DEP_OmniFahren".Schleuse_4503.Dyn.TrolleyID_Schleuse, StationsNr:=4503, Puffer_LinienNr:=?, StoreGroup:=?, Status_1_Int:=?, Status_2_Bit[0]:=?, Status_2_Bit[1]:=?, Status_2_Bit[2]:=?, Status_2_Bit[3]:=?, Status_2_Bit[4]:=?, Status_2_Bit[5]:=?, Status_2_Bit[6]:=?, Status_2_Bit[7]:=?, Reserve[1]_Int:=?, Reserve[2]_Int:=?, Port:=2, Ret_Val_FIFO_IN:="MB199", Error:="Error.Bit") +//Pufferstatus (Stau) ermitteln: + U "DEP_Sensoren".Stau_EP1.Stat.B_Akt; + = "Daten_für_SendFIFO"."Status_2_Bit[0]"; + U "DEP_Sensoren".Stau_EP2.Stat.B_Akt; + = "Daten_für_SendFIFO"."Status_2_Bit[1]"; + U "DEP_Sensoren".Stau_EP3.Stat.B_Akt; + = "Daten_für_SendFIFO"."Status_2_Bit[2]"; + U "DEP_Sensoren".Stau_EP4.Stat.B_Akt; + = "Daten_für_SendFIFO"."Status_2_Bit[3]"; - AN "Error.Bit" - S "DEP_OmniFahren".Schleuse_4503.Status2.Telegramm_gesendet + CALL "Daten_in_SendFIFO_speichern", "Daten_für_SendFIFO" + ( "TelegrammKennung[1]" := 'G' , + "TelegrammKennung[2]" := 'O' , + "TelegrammKennung[3]" := 'H' , + "TelegrammKennung[4]" := 'D' , + "TelegrammKennung[5]" := 'R' , + "TelegrammKennung[6]" := 'e' , + "TelegrammKennung[7]" := 'q' , + "TelegrammKennung[8]" := 'M' , + TrolleyID := "DEP_OmniFahren".Schleuse_4503.Dyn.TrolleyID_Schleuse , + StationsNr := 4503 , + Port := 2 , + Ret_Val_FIFO_IN := "MB199" , + Error := #"Error.Bit" + ); - BEU + UN #"Error.Bit"; + S "DEP_OmniFahren".Schleuse_4503.Status2.Telegramm_gesendet; -// /Zum Testen bei Inbetriebnahme ohne PC: -Sim: A "DEP_Sensoren".Stau_EP1.Stat.B_Akt - S "DEP_OmniFahren".EP_1_voll - L 16#1 // /Tests mit Puffer 1 - AN "DEP_OmniFahren".EP_1_voll - JC StartSim + BEA; - A "DEP_Sensoren".Stau_EP2.Stat.B_Akt - S "DEP_OmniFahren".EP_2_voll - L 16#2 // /Tests mit Puffer 2 - AN "DEP_OmniFahren".EP_2_voll - JC StartSim +///Zum Testen bei Inbetriebnahme ohne PC: +Sim: U "DEP_Sensoren".Stau_EP1.Stat.B_Akt; + S "DEP_OmniFahren".EP_1_voll; + L 16#1 ;///Tests mit Puffer 1 + UN "DEP_OmniFahren".EP_1_voll; + SPB StartSim; - A "DEP_Sensoren".Stau_EP3.Stat.B_Akt - S "DEP_OmniFahren".EP_3_voll - L 16#3 // /Tests mit Puffer 3 - AN "DEP_OmniFahren".EP_3_voll - JC StartSim + U "DEP_Sensoren".Stau_EP2.Stat.B_Akt; + S "DEP_OmniFahren".EP_2_voll; + L 16#2 ;///Tests mit Puffer 2 + UN "DEP_OmniFahren".EP_2_voll; + SPB StartSim; - A "DEP_Sensoren".Stau_EP4.Stat.B_Akt - S "DEP_OmniFahren".EP_4_voll - L 16#4 // /Tests mit Puffer 4 - AN "DEP_OmniFahren".EP_4_voll - JC StartSim + U "DEP_Sensoren".Stau_EP3.Stat.B_Akt; + S "DEP_OmniFahren".EP_3_voll; + L 16#3 ;///Tests mit Puffer 3 + UN "DEP_OmniFahren".EP_3_voll; + SPB StartSim; - SET - R "DEP_OmniFahren".EP_1_voll - R "DEP_OmniFahren".EP_2_voll - R "DEP_OmniFahren".EP_3_voll - R "DEP_OmniFahren".EP_4_voll + U "DEP_Sensoren".Stau_EP4.Stat.B_Akt; + S "DEP_OmniFahren".EP_4_voll; + L 16#4 ;///Tests mit Puffer 4 + UN "DEP_OmniFahren".EP_4_voll; + SPB StartSim; - BEU + SET; + R "DEP_OmniFahren".EP_1_voll; + R "DEP_OmniFahren".EP_2_voll; + R "DEP_OmniFahren".EP_3_voll; + R "DEP_OmniFahren".EP_4_voll; -StartSim: T "MW194" + BEA; - JU SimOk +StartSim: T "MW194"; -X4503E: NOP 0 + SPA SimOk; +X4503E: NOP 0; ---- NW 3: Ende --- - BE +NETWORK +TITLE = Ende + BE; + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Sorter_Entnahmepuffer/EP_Sorter.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Sorter_Entnahmepuffer/EP_Sorter.awl index 7676bad..4f65039 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Sorter_Entnahmepuffer/EP_Sorter.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/3_Entnahmepuffer/Sorter_Entnahmepuffer/EP_Sorter.awl @@ -1,296 +1,409 @@ -=== FB 3423: EP_Sorter [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Sorter_MB4503 : "MSepSorterRein" - Sync_BG4527 : "MStartSync" - Weiche_EP1 : "MWeiche_Sorter_EP" - Weiche_EP2 : "MWeiche_Sorter_EP" - Weiche_EP3 : "MWeiche_Sorter_EP" - Weiche_EP4 : "MWeiche_Sorter_EP" - Impuls_BG4526 : "MImpulsGeber" - Ohne_PC_fahren : Bool - SorterReset : Bool - Temp: - ErrQuit : Bool - ErrAnz : Bool - Antrieb : Bool - Stau : Bool - Start_Ok : Bool - Error_aktiv : Bool - Leer : Bool - Err_DW : DInt - Err_Bits : Int - Constant: - ---- NW 1: Systemzeug --- - A "DOutbound_Bereich".A01_UH07.AnlageEin - = Sorter_MB4503.Dyn.Sk.Auto_akt - - AN "DOutbound_Bereich".A01_UC074.BereichErr - = Sorter_MB4503.Dyn.Sk.Bereich_ok - -// Bereichshalt: - CLR // nicht verbaut - R Sorter_MB4503.Dyn.Sk.Bereich_ok - -// Sonderbetriebsarten Weichen: - CLR - = Weiche_EP1.Dyn.Status.Weichentest_aktiv - = Weiche_EP2.Dyn.Status.Weichentest_aktiv - = Weiche_EP3.Dyn.Status.Weichentest_aktiv - = Weiche_EP4.Dyn.Status.Weichentest_aktiv - - A Sync_BG4527.Dyn.Status.TeachModus_Aktiv - = Weiche_EP1.Dyn.Status.TeachModus_aktiv - = Weiche_EP2.Dyn.Status.TeachModus_aktiv - = Weiche_EP3.Dyn.Status.TeachModus_aktiv - = Weiche_EP4.Dyn.Status.TeachModus_aktiv - - CLR - = Sorter_MB4503.Dyn.Error.Korrektur_Modus_aktiv - - L 3474 // DLSeps - T "MW174" - L 3478 // DLWeichen - T "MW178" - -// Nach neuen Daten suchen: - A "1s-Impuls" - = "Weiche_NewData" - - ---- NW 2: Linien mit PLC_Ziel anfahren --- - A Ohne_PC_fahren - JCN En03 - - A "MB4503" - CU "Z102" - - L "Z102" - L 1 - I // Ja ! - ) - JC En03 - - SET - R "Z102" - - L Sorter_MB4503.Separator.Default_Ziel - L 0 // unbekannt ? - ==I - L 101 // Beginn mit Ausfahrziel 1.Puffer - JC X399 - -// Nächste Weiche suchen: - L Sorter_MB4503.Separator.Default_Ziel - T "MW200" - -CALL FC "DatenOut" (SSDB:="MW178", SSDW:=0, PARA:=WORD#16#0E00, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M200.0, Position:="MW196") // Nach angegeben Datenbyte suchen (Abzweig-Ziel) - - AN "M199.7" // Datensatz ist nicht vorhanden - O "M208.0" // Letzte Weiche - L 0 // Neubeginn - JC X400 - -X398: CALL FC "DatenOut" (SSDB:="MW178", SSDW:=0, PARA:=WORD#16#FF00, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M200.0, Position:="MW196") // Nächsten Datensatz lesen - - L "MW206" // Weichentyp - L 178 // Sorterweiche ? - <>I // Nein! - O "M199.2" // Ende erreicht - L 0 - JC X400 - - A "M208.5" // Weiche für PLC-Ziel disabled ! - JC X398 - - L "MW226" - T Sorter_MB4503.Separator.Default_Ziel - - JU En03 - -// 1.Weiche checken: -X399: T "MW200" - -CALL FC "DatenOut" (SSDB:="MW178", SSDW:=0, PARA:=WORD#16#0E00, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M200.0, Position:="MW196") // Nach angegeben Datenbyte suchen (Abzweig-Ziel) - - AN "M199.7" // Datensatz ist nicht vorhanden - JC En03 - - A "M208.5" // Weiche für PLC-Ziel disabled ! - JC X398 - - L "MW226" -X400: T Sorter_MB4503.Separator.Default_Ziel - -En03: NOP 0 - - ---- NW 3: Störung aktiv? --- -CALL FC "Err_vorhanden" (Check_DB:=708, Anfangs_DW:=DINT#154, Ende_DW:=DINT#162, Stoerung:=Error_aktiv, ErrDW:=Err_DW, ErrBits:=Err_Bits) // Störungsanzeige - A Error_aktiv // s.o. - = Error_aktiv // Sorter Lager Weichen-Störung (Sorter-Antrieb gestoppt!) - - A "BG4527" // Verlassen-Sensor - L S5T#250MS - OffDelay "T340" - - ---- NW 4: Störung quittieren UZ7402 --- - A "DOutbound_Bereich".A01_UZ7402.StOk_aktiv - = ErrQuit - - ---- NW 5: Sorter-GesamtReset --- -// Sorter-Reset starten: - A "DEP_OmniFahren".Schleuse_4503.Dyn.Status.Reset_aktiv // Bei Schleusen-Reset -> Sorter mit resetten! - S "DEP_Sorter".Sorter_MB4503.Dyn.GesamtSorterReset - - ---- NW 6: Separator 4503 vor Sorter --- - L DB708.DBW152 // Err beim Synchronisieren - L 0 // Störung vorhanden ? - ==I // Nein ! - AN Sync_BG4527.Dyn.Stop // Rein-Separator stoppen - AN Error_aktiv // Sorter Batch Weichen-Störung (Sorter-Antrieb gestoppt!) - AN Sorter_MB4503.Dyn.GesamtSorterReset_aktiv - = Start_Ok - - SET // Da Leiste im Sep und Zusatz-Zylinder im Separator -> BT steht sofort sauber im Sep - S Sorter_MB4503.Dyn.BT_beruhigt // 1. einfahrender BügelTräger ist im Sep - - A "T340" - = Sorter_MB4503.B_AusSep // Entprellung Verlassen-Sensor - -// Triggern / Scanner-Auswertung über EP_Omnifahren (FC3128/3) -// Ziel über Default-Ziel (EP_Ziel_FC, FC3181) - -CALL FB "None" , (Separator_Nr:=4503, ErrQuit:=ErrQuit, B_VorSep:=?, B_ImSep:="BG4503", B_AusSep:=?, B_Beladen_im_Sep:=?, B_Pinsensor:="BG4526", B_Beladen_nach_Sep:=?, Start_Ok:=Start_Ok, Antrieb_aktiv:="MA0325", Antrieb_plus_aktiv:="MA0325", Y_Sep_Auf:="DEP_Zylinder".Sorter_4503.Stat.Ast, K_Sanner_triggern:=?, Sorter_Reset:=SorterReset, Error:=DB708.DBW150, Antrieb_start:="DVPtoEP_Antriebe".MA0325.Stat.A_vor, Antrieb_plus_start:=?, Antrieb_stoppen:="DVPtoEP_Antriebe".MA0325.Stat.Stop_vor, hStOk:=ErrAnz) - -// Default-Ziel jeden Zyklus neu!: - L 0 - T Sorter_MB4503.Separator.Default_Ziel - - ---- NW 7: Reset ist aktiv --- - A Sorter_MB4503.Dyn.GesamtSorterReset_aktiv - = "7_HMI_Err_UH07_OB".Sorter_MB4503.Reset_aktiv - - A Sorter_MB4503.Dyn.GesamtSorterReset_aktiv - = Weiche_EP1.Dyn.Ohne_VerklemmKontrolle - = Weiche_EP2.Dyn.Ohne_VerklemmKontrolle - = Weiche_EP3.Dyn.Ohne_VerklemmKontrolle - = Weiche_EP4.Dyn.Ohne_VerklemmKontrolle - -// Diesen Sorterbereich zurücksetzen: - A SorterReset // Ein Zyklus - S Sync_BG4527.Dyn.Reset - S Weiche_EP1.Dyn.Status.Reset - S Weiche_EP2.Dyn.Status.Reset - S Weiche_EP3.Dyn.Status.Reset - S Weiche_EP4.Dyn.Status.Reset - - ---- NW 8: Inkremente über Zahnrad-Sensor --- -CALL FB "None" , (Ink_DB:=3483, B_Zaehlen:="BG4526", Antrieb_aktiv:="MA0325", Quit:=ErrQuit, Zeit_Signal_zu_lang:=?, Zeit_Kein_Signal:=?, Signal:=?, Err_Kein_Signal:="7_HMI_Err_UH07_OB".Impulsgeber_4526.Kein_Signal, Err_Signal_zu_lang:="7_HMI_Err_UH07_OB".Impulsgeber_4526.Signal_zu_lang) - - A( - O "7_HMI_Err_UH07_OB".Impulsgeber_4526.Kein_Signal - O "7_HMI_Err_UH07_OB".Impulsgeber_4526.Signal_zu_lang - ) - AN ErrQuit - S "DVPtoEP_Antriebe".MA0325.Stat.Stop_vor - - A( - O "7_HMI_Err_UH07_OB".Impulsgeber_4526.Kein_Signal - O "7_HMI_Err_UH07_OB".Impulsgeber_4526.Signal_zu_lang - ) - S ErrAnz - - ---- NW 9: Trolley synchronisieren BG4527 --- -// Teachen: Ref-Sensor ueber Sync-Sensor - A "BG4527" - AN Sync_BG4527.Dyn.Refpunkt_ok // Nur eimalige Auswertung - = Sync_BG4527.B_RefPunkt // uebergabe fuer unten - - A "MA0325" - L S5T#500ms - OffDelay "T343" - A "T343" - AN Sync_BG4527.Dyn.Status.TeachModus_Aktiv // sonst Probleme bei Doppelimpuls - O - A "MA0325" - A Sync_BG4527.Dyn.Status.TeachModus_Aktiv // sonst Probleme bei Doppelimpuls - = Antrieb - -// Keine Hauptstrangdaten vorhanden ? (Fuer Sync-Pkt): - L "EP_HS_oF".Datensortkopf.AnzahlEintraege - L "EP_HS_mF".Datensortkopf.AnzahlEintraege - +I - L 0 // Daten vorhanden ? - ==I // Nein ! - = "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - - A "BG4527" - L s5t#500ms // Da trotz Entprellung Doppel-Impulse - OffDelay "T344" - A "T344" - = Sync_BG4527.B_BT_da - -CALL FB "None" , (Sync_Nr:=4527, ErrQuit:=ErrQuit, B_BT_da:=?, B_RefPunkt:=?, B_TeachPunk:="BG4504", Antrieb_aktiv:=Antrieb, Error:=DB708.DBW152, Antrieb_start:="DVPtoEP_Antriebe".MA0325.Stat.A_start, hStOk:=ErrAnz) // Teach-Sensor - - A Sync_BG4527.Dyn.Error.Inkrementalgeber - S "DVPtoEP_Antriebe".MA0325.Stat.Stop_vor - -// Keine Hauptstrangdaten vorhanden ?: - L "EP_HS_oF".Datensortkopf.AnzahlEintraege - L "EP_HS_mF".Datensortkopf.AnzahlEintraege - +I - L 0 // Daten vorhanden ? - ==I // Nein ! - = "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - -// Spezial, da Sorter-Antrieb über SorterRein-Sep geht!: (Sonst Antriebs-Stop wegen PS) - AN "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - O "MB4503" // Neuer Sort-Trolley kommt - O "BG4527" - L s5t#20s - OffDelay "T341" - - A "T341" // Alle Sort-Trolleys sind ins Puffer ausgefahren - S "DVPtoEP_Antriebe".MA0325.Stat.A_vor - - ---- NW 10: Weiche 4504 / EntnahmePuffer EP1 --- -CALL FB "None" , (Weichen_Nr:=1, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:=0, B_Gerade:=?, B_Ausfahrt:="BG4504", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DEP_Zylinder".Weiche_EP1.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW154, Antrieb_start:="DVPtoEP_Antriebe".MA0325.Stat.A_start, Antrieb_stoppen:="DVPtoEP_Antriebe".MA0325.Stat.Stop_vor, hStOk:=ErrAnz) // "DEP_Sensoren".Stau_EP1.Stat.B_Akt - - ---- NW 11: Weiche 4505 / EntnahmePuffer EP2 --- -CALL FB "None" , (Weichen_Nr:=2, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:=0, B_Gerade:=?, B_Ausfahrt:="BG4505", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DEP_Zylinder".Weiche_EP2.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW156, Antrieb_start:="DVPtoEP_Antriebe".MA0325.Stat.A_start, Antrieb_stoppen:="DVPtoEP_Antriebe".MA0325.Stat.Stop_vor, hStOk:=ErrAnz) // "DEP_Sensoren".Stau_EP2.Stat.B_Akt - - ---- NW 12: Weiche 4506 / EntnahmePuffer EP3 --- -CALL FB "None" , (Weichen_Nr:=3, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:=0, B_Gerade:=?, B_Ausfahrt:="BG4506", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DEP_Zylinder".Weiche_EP3.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW158, Antrieb_start:="DVPtoEP_Antriebe".MA0325.Stat.A_start, Antrieb_stoppen:="DVPtoEP_Antriebe".MA0325.Stat.Stop_vor, hStOk:=ErrAnz) // "DEP_Sensoren".Stau_EP3.Stat.B_Akt - - ---- NW 13: Pseudo-Weiche / EntnahmePuffer EP4 --- -CALL FB "None" , (Weichen_Nr:=4, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:=0, B_Gerade:=?, B_Ausfahrt:="BG4507", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DEP_Zylinder".Weiche_EP4.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW160, Antrieb_start:="DVPtoEP_Antriebe".MA0325.Stat.A_start, Antrieb_stoppen:="DVPtoEP_Antriebe".MA0325.Stat.Stop_vor, hStOk:=ErrAnz) // "DEP_Sensoren".Stau_EP4.Stat.B_Akt - - ---- NW 14: Störungen anzeigen UZ7102/7103 --- - A ErrAnz - S "DOutbound_Bereich".A01_UZ7102.StOk_blinken - S "DOutbound_Bereich".A01_UZ7103.StOk_blinken - - ---- NW 15: Ende --- - BE +FUNCTION_BLOCK "EP_Sorter" +TITLE = Sorter EntnahmePuffer 1-4 +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + Sorter_MB4503 : "MSepSorterRein"; + Sync_BG4527 : "MStartSync"; + Weiche_EP1 : "MWeiche_Sorter_EP"; + Weiche_EP2 : "MWeiche_Sorter_EP"; + Weiche_EP3 : "MWeiche_Sorter_EP"; + Weiche_EP4 : "MWeiche_Sorter_EP"; + Impuls_BG4526 : "MImpulsGeber"; + Ohne_PC_fahren { S7_SetPoint := 'True'} : Bool; + SorterReset { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + END_VAR + + VAR_TEMP + ErrQuit : Bool; + ErrAnz : Bool; + Antrieb : Bool; + Stau : Bool; + Start_Ok : Bool; + Error_aktiv : Bool; + Leer : Bool; + Err_DW : DInt; + Err_Bits : Int; + END_VAR + + +BEGIN +NETWORK +TITLE = Systemzeug + U "DOutbound_Bereich".A01_UH07.AnlageEin; + = #Sorter_MB4503.Dyn.Sk.Auto_akt; + + UN "DOutbound_Bereich".A01_UC074.BereichErr; + = #Sorter_MB4503.Dyn.Sk.Bereich_ok; + +//Bereichshalt: + CLR;//nicht verbaut + R #Sorter_MB4503.Dyn.Sk.Bereich_ok; + +//Sonderbetriebsarten Weichen: + CLR; + = #Weiche_EP1.Dyn.Status.Weichentest_aktiv; + = #Weiche_EP2.Dyn.Status.Weichentest_aktiv; + = #Weiche_EP3.Dyn.Status.Weichentest_aktiv; + = #Weiche_EP4.Dyn.Status.Weichentest_aktiv; + + U #Sync_BG4527.Dyn.Status.TeachModus_Aktiv; + = #Weiche_EP1.Dyn.Status.TeachModus_aktiv; + = #Weiche_EP2.Dyn.Status.TeachModus_aktiv; + = #Weiche_EP3.Dyn.Status.TeachModus_aktiv; + = #Weiche_EP4.Dyn.Status.TeachModus_aktiv; + + CLR; + = #Sorter_MB4503.Dyn.Error.Korrektur_Modus_aktiv; + + L 3474 ;//DLSeps + T "MW174"; + L 3478 ;//DLWeichen + T "MW178"; + +//Nach neuen Daten suchen: + U "1s-Impuls"; + = "Weiche_NewData"; + +NETWORK +TITLE = Linien mit PLC_Ziel anfahren + U #Ohne_PC_fahren; + SPBN En03; + + U "MB4503"; + ZV "Z102"; + + L "Z102"; + L 1; + I;//Ja ! + ); + SPB En03; + + SET; + R "Z102"; + + L #Sorter_MB4503.Separator.Default_Ziel; + L 0 ;//unbekannt ? + ==I; + L 101 ;//Beginn mit Ausfahrziel 1.Puffer + SPB X399; + +//Nächste Weiche suchen: + L #Sorter_MB4503.Separator.Default_Ziel; + T "MW200"; + + CALL "DatenOut" + ( SSDB := "MW178" , + SSDW := 0 , + PARA := WORD#16#0E00 , //Nach angegeben Datenbyte suchen (Abzweig-Ziel) + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M200.0 , + Position := "MW196" + ); + + UN "M199.7" ;//Datensatz ist nicht vorhanden + O "M208.0" ;//Letzte Weiche + L 0;//Neubeginn + SPB X400; + +X398: CALL "DatenOut" + ( SSDB := "MW178" , + SSDW := 0 , + PARA := WORD#16#FF00 , //Nächsten Datensatz lesen + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M200.0 , + Position := "MW196" + ); + + L "MW206";//Weichentyp + L 178;//Sorterweiche ? + <>I;//Nein! + O "M199.2" ;//Ende erreicht + L 0; + SPB X400; + + U "M208.5" ;//Weiche für PLC-Ziel disabled ! + SPB X398; + + L "MW226"; + T #Sorter_MB4503.Separator.Default_Ziel; + + SPA En03; + +//1.Weiche checken: +X399: T "MW200"; + + CALL "DatenOut" + ( SSDB := "MW178" , + SSDW := 0 , + PARA := WORD#16#0E00 , //Nach angegeben Datenbyte suchen (Abzweig-Ziel) + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M200.0 , + Position := "MW196" + ); + + UN "M199.7" ;//Datensatz ist nicht vorhanden + SPB En03; + + U "M208.5" ;//Weiche für PLC-Ziel disabled ! + SPB X398; + + L "MW226"; +X400: T #Sorter_MB4503.Separator.Default_Ziel; + +En03: NOP 0; + +NETWORK +TITLE = Störung aktiv? + CALL "Err_vorhanden" //Störungsanzeige + ( Check_DB := 708 , + Anfangs_DW := DINT#154 , + Ende_DW := DINT#162 , + Stoerung := #Error_aktiv , + ErrDW := #Err_DW , + ErrBits := #Err_Bits + ); + U #Error_aktiv ;//s.o. + = #Error_aktiv ;//Sorter Lager Weichen-Störung (Sorter-Antrieb gestoppt!) + + U "BG4527" ;//Verlassen-Sensor + L S5T#250MS; + SA "T340"; + +NETWORK +TITLE = Störung quittieren UZ7402 + U "DOutbound_Bereich".A01_UZ7402.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Sorter-GesamtReset + +//Sorter-Reset starten: + U "DEP_OmniFahren".Schleuse_4503.Dyn.Status.Reset_aktiv;//Bei Schleusen-Reset -> Sorter mit resetten! + S "DEP_Sorter".Sorter_MB4503.Dyn.GesamtSorterReset; + +NETWORK +TITLE = Separator 4503 vor Sorter + L %DB708.DBW152 ;//Err beim Synchronisieren + L 0;//Störung vorhanden ? + ==I;//Nein ! + UN #Sync_BG4527.Dyn.Stop;//Rein-Separator stoppen + UN #Error_aktiv;//Sorter Batch Weichen-Störung (Sorter-Antrieb gestoppt!) + UN #Sorter_MB4503.Dyn.GesamtSorterReset_aktiv; + = #Start_Ok; + + SET ;//Da Leiste im Sep und Zusatz-Zylinder im Separator -> BT steht sofort sauber im Sep + S #Sorter_MB4503.Dyn.BT_beruhigt;//1. einfahrender BügelTräger ist im Sep + + U "T340"; + = #Sorter_MB4503.B_AusSep;//Entprellung Verlassen-Sensor + +//Triggern / Scanner-Auswertung über EP_Omnifahren (FC3128/3) +//Ziel über Default-Ziel (EP_Ziel_FC, FC3181) + + CALL #Sorter_MB4503 + ( Separator_Nr := 4503 , + ErrQuit := #ErrQuit , + B_ImSep := "BG4503" , + B_Pinsensor := "BG4526" , + Start_Ok := #Start_Ok , + Antrieb_aktiv := "MA0325" , + Antrieb_plus_aktiv := "MA0325" , + Y_Sep_Auf := "DEP_Zylinder".Sorter_4503.Stat.Ast , + Sorter_Reset := #SorterReset , + Error := %DB708.DBW150 , + Antrieb_start := "DVPtoEP_Antriebe".MA0325.Stat.A_vor , + Antrieb_stoppen := "DVPtoEP_Antriebe".MA0325.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +//Default-Ziel jeden Zyklus neu!: + L 0; + T #Sorter_MB4503.Separator.Default_Ziel; + +NETWORK +TITLE = Reset ist aktiv + U #Sorter_MB4503.Dyn.GesamtSorterReset_aktiv; + = "7_HMI_Err_UH07_OB".Sorter_MB4503.Reset_aktiv; + + U #Sorter_MB4503.Dyn.GesamtSorterReset_aktiv; + = #Weiche_EP1.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_EP2.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_EP3.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_EP4.Dyn.Ohne_VerklemmKontrolle; + +//Diesen Sorterbereich zurücksetzen: + U #SorterReset;//Ein Zyklus + S #Sync_BG4527.Dyn.Reset; + S #Weiche_EP1.Dyn.Status.Reset; + S #Weiche_EP2.Dyn.Status.Reset; + S #Weiche_EP3.Dyn.Status.Reset; + S #Weiche_EP4.Dyn.Status.Reset; + +NETWORK +TITLE = Inkremente über Zahnrad-Sensor + CALL #Impuls_BG4526 + ( Ink_DB := 3483 , + B_Zaehlen := "BG4526" , + Antrieb_aktiv := "MA0325" , + Quit := #ErrQuit , + Err_Kein_Signal := "7_HMI_Err_UH07_OB".Impulsgeber_4526.Kein_Signal , + Err_Signal_zu_lang := "7_HMI_Err_UH07_OB".Impulsgeber_4526.Signal_zu_lang + ); + + U(; + O "7_HMI_Err_UH07_OB".Impulsgeber_4526.Kein_Signal; + O "7_HMI_Err_UH07_OB".Impulsgeber_4526.Signal_zu_lang; + ); + UN #ErrQuit; + S "DVPtoEP_Antriebe".MA0325.Stat.Stop_vor; + + U(; + O "7_HMI_Err_UH07_OB".Impulsgeber_4526.Kein_Signal; + O "7_HMI_Err_UH07_OB".Impulsgeber_4526.Signal_zu_lang; + ); + S #ErrAnz; + +NETWORK +TITLE = Trolley synchronisieren BG4527 + +//Teachen: Ref-Sensor ueber Sync-Sensor + U "BG4527"; + UN #Sync_BG4527.Dyn.Refpunkt_ok;//Nur eimalige Auswertung + = #Sync_BG4527.B_RefPunkt;//uebergabe fuer unten + + U "MA0325"; + L S5T#500ms; + SA "T343"; + U "T343"; + UN #Sync_BG4527.Dyn.Status.TeachModus_Aktiv;//sonst Probleme bei Doppelimpuls + O; + U "MA0325"; + U #Sync_BG4527.Dyn.Status.TeachModus_Aktiv;//sonst Probleme bei Doppelimpuls + = #Antrieb; + +//Keine Hauptstrangdaten vorhanden ? (Fuer Sync-Pkt): + L "EP_HS_oF".Datensortkopf.AnzahlEintraege; + L "EP_HS_mF".Datensortkopf.AnzahlEintraege; + +I; + L 0;//Daten vorhanden ? + ==I;//Nein ! + = "Hauptstrang_leer";//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + + U "BG4527"; + L s5t#500ms;//Da trotz Entprellung Doppel-Impulse + SA "T344"; + U "T344"; + = #Sync_BG4527.B_BT_da; + + CALL #Sync_BG4527 + ( Sync_Nr := 4527 , + ErrQuit := #ErrQuit , + B_TeachPunk := "BG4504" , //Teach-Sensor + Antrieb_aktiv := #Antrieb , + Error := %DB708.DBW152 , + Antrieb_start := "DVPtoEP_Antriebe".MA0325.Stat.A_start , + hStOk := #ErrAnz + ); + + U #Sync_BG4527.Dyn.Error.Inkrementalgeber; + S "DVPtoEP_Antriebe".MA0325.Stat.Stop_vor; + +//Keine Hauptstrangdaten vorhanden ?: + L "EP_HS_oF".Datensortkopf.AnzahlEintraege; + L "EP_HS_mF".Datensortkopf.AnzahlEintraege; + +I; + L 0;//Daten vorhanden ? + ==I;//Nein ! + = "Hauptstrang_leer" ;//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + +//Spezial, da Sorter-Antrieb über SorterRein-Sep geht!: (Sonst Antriebs-Stop wegen PS) + UN "Hauptstrang_leer" ;//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + O "MB4503" ;//Neuer Sort-Trolley kommt + O "BG4527"; + L s5t#20s; + SA "T341"; + + U "T341" ;//Alle Sort-Trolleys sind ins Puffer ausgefahren + S "DVPtoEP_Antriebe".MA0325.Stat.A_vor; + +NETWORK +TITLE = Weiche 4504 / EntnahmePuffer EP1 + CALL #Weiche_EP1 + ( Weichen_Nr := 1 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := 0 , //"DEP_Sensoren".Stau_EP1.Stat.B_Akt + B_Ausfahrt := "BG4504" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DEP_Zylinder".Weiche_EP1.Stat.Ast , + Error := %DB708.DBW154 , + Antrieb_start := "DVPtoEP_Antriebe".MA0325.Stat.A_start , + Antrieb_stoppen := "DVPtoEP_Antriebe".MA0325.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 4505 / EntnahmePuffer EP2 + CALL #Weiche_EP2 + ( Weichen_Nr := 2 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := 0 , //"DEP_Sensoren".Stau_EP2.Stat.B_Akt + B_Ausfahrt := "BG4505" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DEP_Zylinder".Weiche_EP2.Stat.Ast , + Error := %DB708.DBW156 , + Antrieb_start := "DVPtoEP_Antriebe".MA0325.Stat.A_start , + Antrieb_stoppen := "DVPtoEP_Antriebe".MA0325.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 4506 / EntnahmePuffer EP3 + CALL #Weiche_EP3 + ( Weichen_Nr := 3 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := 0 , //"DEP_Sensoren".Stau_EP3.Stat.B_Akt + B_Ausfahrt := "BG4506" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DEP_Zylinder".Weiche_EP3.Stat.Ast , + Error := %DB708.DBW158 , + Antrieb_start := "DVPtoEP_Antriebe".MA0325.Stat.A_start , + Antrieb_stoppen := "DVPtoEP_Antriebe".MA0325.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Pseudo-Weiche / EntnahmePuffer EP4 + CALL #Weiche_EP4 + ( Weichen_Nr := 4 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := 0 , //"DEP_Sensoren".Stau_EP4.Stat.B_Akt + B_Ausfahrt := "BG4507" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DEP_Zylinder".Weiche_EP4.Stat.Ast , + Error := %DB708.DBW160 , + Antrieb_start := "DVPtoEP_Antriebe".MA0325.Stat.A_start , + Antrieb_stoppen := "DVPtoEP_Antriebe".MA0325.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Störungen anzeigen UZ7102/7103 + U #ErrAnz; + S "DOutbound_Bereich".A01_UZ7102.StOk_blinken; + S "DOutbound_Bereich".A01_UZ7103.StOk_blinken; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Basics/EPtoLP_Antriebe.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Basics/EPtoLP_Antriebe.awl index b154979..57d08d3 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Basics/EPtoLP_Antriebe.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Basics/EPtoLP_Antriebe.awl @@ -1,125 +1,222 @@ -=== FB 4199: EPtoLP_Antriebe [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - MA0326 : "MAntrieb_PowerSave" - MA0327 : "MAntrieb_PowerSave" - MA0330 : "MAntrieb_PowerSave" - MA0331 : "MAntrieb_PowerSave" - MA0332 : "MAntrieb_PowerSave" - MA0333 : "MAntrieb_PowerSave" - MA0062 : "MAntrieb_PowerSave" - MA0063 : "MAntrieb_PowerSave" - MA0064 : "MAntrieb_PowerSave" - Temp: - Auto : Bool // Automatik Linie ist aktiv - Hand : Bool // Hand Linie ist aktiv - BereichErr : Bool // Bereichsstörung -> Antrieb stoppen - QKontroll : Bool // Frequenzumrichter schon 3s Netz EIN - FuKontroll : Bool // Frequenzumrichter schon 3s Netz EIN - Quit : Bool // Motorschutz-Störung quittieren - Qok : Bool // Motorschutz ok - Jog1 : Bool // Geschwindigkeit 1 - Jog2 : Bool // Geschwindigkeit 2 - Betrieb : Bool // Betriebsart aktiv - FC105_RET : Word // Returnwert von FC105 - Antrieb1 : Bool // Antrieb dazuschalten - Antrieb2 : Bool // Antrieb dazuschalten - F1 : Bool // Geschwindigkeit 1 aktiviert - F2 : Bool // Geschwindigkeit 2 aktiviert - F3 : Bool // Geschwindigkeit 3 aktiviert - Constant: +FUNCTION_BLOCK "EPtoLP_Antriebe" +TITLE = Antriebe UC074 +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + MA0326 : "MAntrieb_PowerSave"; + MA0327 : "MAntrieb_PowerSave"; + MA0330 : "MAntrieb_PowerSave"; + MA0331 : "MAntrieb_PowerSave"; + MA0332 : "MAntrieb_PowerSave"; + MA0333 : "MAntrieb_PowerSave"; + MA0062 : "MAntrieb_PowerSave"; + MA0063 : "MAntrieb_PowerSave"; + MA0064 : "MAntrieb_PowerSave"; + END_VAR ---- NW 1: Übergabe des Bereichstatus System UC074/A01 --- - A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto - - CLR - = Hand - - A "DOutbound_Bereich".A01_UC074.BereichErr - AN "SGes".Simulation_ohne_HW_aktiv - = BereichErr - - A "T194" - = QKontroll - = FuKontroll - - A "DOutbound_Bereich".A01_UC074.StOk_aktiv - = Quit + VAR_TEMP + Auto : Bool; // Automatik Linie ist aktiv + Hand : Bool; // Hand Linie ist aktiv + BereichErr : Bool; // Bereichsstörung -> Antrieb stoppen + QKontroll : Bool; // Frequenzumrichter schon 3s Netz EIN + FuKontroll : Bool; // Frequenzumrichter schon 3s Netz EIN + Quit : Bool; // Motorschutz-Störung quittieren + Qok : Bool; // Motorschutz ok + Jog1 : Bool; // Geschwindigkeit 1 + Jog2 : Bool; // Geschwindigkeit 2 + Betrieb : Bool; // Betriebsart aktiv + FC105_RET : Word; // Returnwert von FC105 + Antrieb1 : Bool; // Antrieb dazuschalten + Antrieb2 : Bool; // Antrieb dazuschalten + F1 : Bool; // Geschwindigkeit 1 aktiviert + F2 : Bool; // Geschwindigkeit 2 aktiviert + F3 : Bool; // Geschwindigkeit 3 aktiviert + END_VAR ---- NW 2: MA0326 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0326", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0326", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0326, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +BEGIN +NETWORK +TITLE = Übergabe des Bereichstatus System UC074/A01 + U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; + + CLR; + = #Hand; + + U "DOutbound_Bereich".A01_UC074.BereichErr; + UN "SGes".Simulation_ohne_HW_aktiv; + = #BereichErr; + + U "T194"; + = #QKontroll; + = #FuKontroll; + + U "DOutbound_Bereich".A01_UC074.StOk_aktiv; + = #Quit; + +NETWORK +TITLE = MA0326 + CALL #MA0326 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0326" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0326" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0326 + ); - ---- NW 3: MA0327 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0327", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0327", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0327, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0327 + CALL #MA0327 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0327" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0327" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0327 + ); - ---- NW 4: MA0330 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0330", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0330", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0330, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0330 + CALL #MA0330 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0330" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0330" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0330 + ); - ---- NW 5: MA0331 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0331", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0331", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0331, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0331 + CALL #MA0331 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0331" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0331" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0331 + ); - ---- NW 6: MA0332 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0332", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0332", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0332, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0332 + CALL #MA0332 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0332" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0332" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0332 + ); - ---- NW 7: MA0333 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0333", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0333", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0333, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0333 + CALL #MA0333 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0333" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0333" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0333 + ); +NETWORK +TITLE = Übergabe des Bereichstatus System UH07/A01 + U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; ---- NW 8: Übergabe des Bereichstatus System UH07/A01 --- - A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto + CLR; + = #Hand; - CLR - = Hand + U "DOutbound_Bereich".A01_UH07.BereichErr; + UN "SGes".Simulation_ohne_HW_aktiv; + = #BereichErr; - A "DOutbound_Bereich".A01_UH07.BereichErr - AN "SGes".Simulation_ohne_HW_aktiv - = BereichErr + U "T197"; + = #QKontroll; + = #FuKontroll; - A "T197" - = QKontroll - = FuKontroll + U "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #Quit; - A "DOutbound_Bereich".A01_UH07.StOk_aktiv - = Quit +NETWORK +TITLE = MA0062 + CALL #MA0062 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0062" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0062" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0062 + ); ---- NW 9: MA0062 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0062", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0062", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0062, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0063 + CALL #MA0063 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0063" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0063" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0063 + ); +NETWORK +TITLE = MA0064 + CALL #MA0064 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0064" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0064" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0064 + ); ---- NW 10: MA0063 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0063", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0063", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0063, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +/// U "M900.0" +/// UN "DLP_Sorter".Sync_BG3306.Dyn.Error.Keine_TeachPktdaten +/// S "MA0064" +NETWORK +TITLE = Ende + BE; - ---- NW 11: MA0064 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0064", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0064", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0064, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) - -// / U "M900.0" -// / UN "DLP_Sorter".Sync_BG3306.Dyn.Error.Keine_TeachPktdaten -// / S "MA0064" - - ---- NW 12: Ende --- - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Basics/EPtoLP_Sensoren.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Basics/EPtoLP_Sensoren.awl index 40cf1ac..b0b527d 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Basics/EPtoLP_Sensoren.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Basics/EPtoLP_Sensoren.awl @@ -1,107 +1,233 @@ -=== FB 4190: EPtoLP_Sensoren [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Stau_BG4531 : "MSensoren" // Stau am Sensor Einfahrt MA0326 - Stau_BG4513 : "MSensoren" // Stau am Sensor Mitte MA0326 - Stau_BG4515 : "MSensoren" // Stau am Sensor Einfahrt MA0327 - Stau_BG4517 : "MSensoren" // Stau am Sensor Mitte MA0327 - Stau_BG4521 : "MSensoren" // Stau am Sensor Ende MA0327 - Stau_BG4455 : "MSensoren" // Stau am Sensor Einfahrt MA0330 - Stau_BG4457 : "MSensoren" // Stau am Sensor Einfahrt MA0331 - Stau_BG4467 : "MSensoren" // Stau am Sensor Mitte MA0331 - Stau_BG4461 : "MSensoren" // Stau am Sensor Einfahrt MA0332 - Stau_BG4460 : "MSensoren" // Stau am Sensor Mitte MA0332 - Stau_BG4464 : "MSensoren" // Stau am Sensor Einfahrt MA0330 - Stau_BG3367 : "MSensoren" // Stau am hinter BST 1 - Stau_BG3371 : "MSensoren" // Stau am Sensor Einfahrt MA0063 - Stau_BG3372 : "MSensoren" // Stau am Sensor Einfahrt MA0063 - Stau_BG3376 : "MSensoren" // Stau am Sensor Einfahrt MA0064 - Stau_BG3377 : "MSensoren" // Stau am Sensor Mitte MA0064 - Stau_BG3304 : "MSensoren" // Stau am Sensor vor Schleuse MB3305 - Temp: - T_Ein : Int // Vorgabe Einschaltverzögerung - T_Aus : Int // Zwischenspeicher Ausschaltverzögerung - F1 : Bool // Geschwindigkeit 1 aktiviert - F2 : Bool // Geschwindigkeit 2 aktiviert - F3 : Bool // Geschwindigkeit 3 aktiviert - ESensor : Bool // Sensoren - Antrieb : Bool - VReal : Real // GeschwindigkeitinReal - Zeit : Int // Zeit für Ausschaltverzögerung LT1100 - Aktiv : Bool // Zeit aktivieren - Constant: +FUNCTION_BLOCK "EPtoLP_Sensoren" +TITLE = Sensoren Outbound: EP > LP +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + Stau_BG4531 : "MSensoren"; // Stau am Sensor Einfahrt MA0326 + Stau_BG4513 : "MSensoren"; // Stau am Sensor Mitte MA0326 + Stau_BG4515 : "MSensoren"; // Stau am Sensor Einfahrt MA0327 + Stau_BG4517 : "MSensoren"; // Stau am Sensor Mitte MA0327 + Stau_BG4521 : "MSensoren"; // Stau am Sensor Ende MA0327 + Stau_BG4455 : "MSensoren"; // Stau am Sensor Einfahrt MA0330 + Stau_BG4457 : "MSensoren"; // Stau am Sensor Einfahrt MA0331 + Stau_BG4467 : "MSensoren"; // Stau am Sensor Mitte MA0331 + Stau_BG4461 : "MSensoren"; // Stau am Sensor Einfahrt MA0332 + Stau_BG4460 : "MSensoren"; // Stau am Sensor Mitte MA0332 + Stau_BG4464 : "MSensoren"; // Stau am Sensor Einfahrt MA0330 + Stau_BG3367 : "MSensoren"; // Stau am hinter BST 1 + Stau_BG3371 : "MSensoren"; // Stau am Sensor Einfahrt MA0063 + Stau_BG3372 : "MSensoren"; // Stau am Sensor Einfahrt MA0063 + Stau_BG3376 : "MSensoren"; // Stau am Sensor Einfahrt MA0064 + Stau_BG3377 : "MSensoren"; // Stau am Sensor Mitte MA0064 + Stau_BG3304 : "MSensoren"; // Stau am Sensor vor Schleuse MB3305 + END_VAR ---- NW 1: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4531", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) + VAR_TEMP + T_Ein : Int; // Vorgabe Einschaltverzögerung + T_Aus : Int; // Zwischenspeicher Ausschaltverzögerung + F1 : Bool; // Geschwindigkeit 1 aktiviert + F2 : Bool; // Geschwindigkeit 2 aktiviert + F3 : Bool; // Geschwindigkeit 3 aktiviert + ESensor : Bool; // Sensoren + Antrieb : Bool; + VReal : Real; // GeschwindigkeitinReal + Zeit : Int; // Zeit für Ausschaltverzögerung LT1100 + Aktiv : Bool; // Zeit aktivieren + END_VAR ---- NW 2: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4513", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +BEGIN +NETWORK +TITLE = Stau am Sensor nach Schleuse 4512 +//Sensoren entprellen + CALL #Stau_BG4531 + ( ESensor := "BG4531" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor nach Schleuse 4532 +//Sensoren entprellen + CALL #Stau_BG4513 + ( ESensor := "BG4513" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 3: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4515", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor Einfahrt MA0327 +//Sensoren entprellen + CALL #Stau_BG4515 + ( ESensor := "BG4515" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Mitte MA0327 +//Sensoren entprellen + CALL #Stau_BG4517 + ( ESensor := "BG4517" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 4: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4517", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor Ende MA0327 +//Sensoren entprellen + CALL #Stau_BG4521 + ( ESensor := "BG4521" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Einfahrt MA0330 +//Sensoren entprellen + CALL #Stau_BG4455 + ( ESensor := "BG4455" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 5: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4521", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor Einfahrt MA0331 +//Sensoren entprellen + CALL #Stau_BG4457 + ( ESensor := "BG4457" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Mitte MA0331 +//Sensoren entprellen + CALL #Stau_BG4467 + ( ESensor := "BG4467" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 6: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4455", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor Einfahrt MA0332 +//Sensoren entprellen + CALL #Stau_BG4461 + ( ESensor := "BG4461" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Ende MA0332 +//Sensoren entprellen + CALL #Stau_BG4460 + ( ESensor := "BG4460" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 7: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4457", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor Anfang MA0333 +//Sensoren entprellen + CALL #Stau_BG4464 + ( ESensor := "BG4464" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor hinter BST1 +//Sensoren entprellen + CALL #Stau_BG3367 + ( ESensor := "BG3367" , + T_Ein := 1 , + T_Aus := 30 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 8: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4467", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor vor MA0063 +//Sensoren entprellen + CALL #Stau_BG3371 + ( ESensor := "BG3371" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Anfang MA0063 +//Sensoren entprellen + CALL #Stau_BG3372 + ( ESensor := "BG3372" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 9: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4461", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor Einfahrt MA0064 +//Sensoren entprellen + CALL #Stau_BG3376 + ( ESensor := "BG3376" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Mitte MA0064 +//Sensoren entprellen + CALL #Stau_BG3377 + ( ESensor := "BG3377" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 10: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4460", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor Mitte MA0064 (vor Schleuse 3305) +//Sensoren entprellen + CALL #Stau_BG3304 + ( ESensor := "BG3304" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Ende + BE; ---- NW 11: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4464", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 12: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3367", T_Ein:=1, T_Aus:=30, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 13: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3371", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 14: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3372", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 15: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3376", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 16: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3377", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 17: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3304", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 18: Ende --- - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Basics/EPtoLP_Zylinder.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Basics/EPtoLP_Zylinder.awl index 4bb3a7c..555a829 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Basics/EPtoLP_Zylinder.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Basics/EPtoLP_Zylinder.awl @@ -1,85 +1,152 @@ -=== FB 4192: EPtoLP_Zylinder [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Schleuse_4512 : "MZylinder" // - Schleuse_4532 : "MZylinder" - Schleuse_4516 : "MZylinder" // - Schleuse_4522 : "MZylinder" // - Schleuse_4520 : "MZylinder" - Schleuse_4466 : "MZylinder" - Schleuse_4462 : "MZylinder" - Schleuse_4463 : "MZylinder" - Schleuse_3370 : "MZylinder" - Schleuse_3303 : "MZylinder" - Temp: - Auto : Bool // Automatik ist aktiv - Hand : Bool // Hand ist aktiv - ZylAst : Bool // Zylinder ansteuern - Constant: +FUNCTION_BLOCK "EPtoLP_Zylinder" +TITLE = Zylinder Outbound Entnahmepuffer > Leerpuffer +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 + VAR + Schleuse_4512 : "MZylinder"; // + Schleuse_4532 : "MZylinder"; + Schleuse_4516 : "MZylinder"; // + Schleuse_4522 : "MZylinder"; // + Schleuse_4520 : "MZylinder"; + Schleuse_4466 : "MZylinder"; + Schleuse_4462 : "MZylinder"; + Schleuse_4463 : "MZylinder"; + Schleuse_3370 : "MZylinder"; + Schleuse_3303 : "MZylinder"; + END_VAR ---- NW 1: Übergabe des Bereichstatus System UC074/A01 --- - A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto - - A "DOutbound_Bereich".A01_UC074.BereichErr - AN "SGes".Simulation_ohne_HW_aktiv - JC Next // Zylinder-Stellung nicht mehr ändern + VAR_TEMP + Auto : Bool; // Automatik ist aktiv + Hand : Bool; // Hand ist aktiv + ZylAst : Bool; // Zylinder ansteuern + END_VAR ---- NW 2: Schleuse_4512 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4512", ZylGst:=?) +BEGIN +NETWORK +TITLE = Übergabe des Bereichstatus System UC074/A01 + U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; + U "DOutbound_Bereich".A01_UC074.BereichErr; + UN "SGes".Simulation_ohne_HW_aktiv; + SPB Next ;//Zylinder-Stellung nicht mehr ändern ---- NW 3: Schleuse_4532 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4532", ZylGst:=?) +NETWORK +TITLE = Schleuse_4512 + CALL #Schleuse_4512 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4512" + ); +NETWORK +TITLE = Schleuse_4532 + CALL #Schleuse_4532 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4532" + ); ---- NW 4: Schleuse_4516 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4516", ZylGst:=?) +NETWORK +TITLE = Schleuse_4516 + CALL #Schleuse_4516 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4516" + ); +NETWORK +TITLE = Schleuse_4522 + CALL #Schleuse_4522 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4522" + ); ---- NW 5: Schleuse_4522 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4522", ZylGst:=?) +NETWORK +TITLE = Schleuse_4520 + CALL #Schleuse_4520 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4520" + ); +NETWORK +TITLE = Schleuse_4466 + CALL #Schleuse_4466 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4466" + ); ---- NW 6: Schleuse_4520 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4520", ZylGst:=?) +NETWORK +TITLE = Schleuse_4462 + CALL #Schleuse_4462 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4462" + ); +NETWORK +TITLE = Übergabe des Bereichstatus System UH07/A01 +Next: U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; ---- NW 7: Schleuse_4466 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4466", ZylGst:=?) + U "DOutbound_Bereich".A01_UH07.BereichErr; + UN "SGes".Simulation_ohne_HW_aktiv; + SPB Next1 ;//Zylinder-Stellung nicht mehr ändern +NETWORK +TITLE = Schleuse_4463 + CALL #Schleuse_4463 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4463" + ); ---- NW 8: Schleuse_4462 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4462", ZylGst:=?) +NETWORK +TITLE = Schleuse_3370 + CALL #Schleuse_3370 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3370" + ); +NETWORK +TITLE = Schleuse_3303 + CALL #Schleuse_3303 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3303" + ); ---- NW 9: Übergabe des Bereichstatus System UH07/A01 --- -Next: A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto +NETWORK +TITLE = Ende +Next1: BE; - A "DOutbound_Bereich".A01_UH07.BereichErr - AN "SGes".Simulation_ohne_HW_aktiv - JC Next1 // Zylinder-Stellung nicht mehr ändern - - ---- NW 10: Schleuse_4463 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4463", ZylGst:=?) - - ---- NW 11: Schleuse_3370 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3370", ZylGst:=?) - - ---- NW 12: Schleuse_3303 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3303", ZylGst:=?) - - ---- NW 13: Ende --- -Next1: BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/EPtoLP_Bereich.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/EPtoLP_Bereich.awl index 3bdc015..ab80a32 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/EPtoLP_Bereich.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/EPtoLP_Bereich.awl @@ -1,23 +1,22 @@ -=== FC 4100: EPtoLP_Bereich [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Constant: - Return: - Ret_Val : Void +FUNCTION "EPtoLP_Bereich" : Void +TITLE = Bereich Outbound: EP > LP +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 ---- NW 1: Baustein-Aufrufe --- -CALL FB "EPtoLP_Sensoren" , +BEGIN +NETWORK +TITLE = Baustein-Aufrufe + CALL "EPtoLP_Sensoren", "DEPtoLP_Sensoren"; -CALL FB "EPtoLP_OmniFahren" , + CALL "EPtoLP_OmniFahren", "DEPtoLP_OmniFahren"; -CALL FB "EPtoLP_Zylinder" , + CALL "EPtoLP_Zylinder", "DEPtoLP_Zylinder"; -CALL FB "EPtoLP_Antriebe" , + CALL "EPtoLP_Antriebe", "DEPtoLP_Antriebe"; +NETWORK +TITLE = Ende + BE; ---- NW 2: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Omnifahren_EPtoLP/EPtoLP_Draussen.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Omnifahren_EPtoLP/EPtoLP_Draussen.awl index 67de5a7..74a1203 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Omnifahren_EPtoLP/EPtoLP_Draussen.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Omnifahren_EPtoLP/EPtoLP_Draussen.awl @@ -1,38 +1,41 @@ -=== FC 4182: EPtoLP_Draussen [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Error.Bit : Bool - Constant: - Return: - Ret_Val : Void - ---- NW 1: Rückmeldung --- - SET // Rückmeldungen erst mal resetten - R "M180.6" // Weiterfahrt von Ziel-FC erlaubt +FUNCTION "EPtoLP_Draussen" : Void +TITLE = Draussen-FC: EP > LP +{ S7_Optimized_Access := 'FALSE' ; S7_Pass_Registers := 'TRUE' } +AUTHOR : AE +VERSION : 0.1 + VAR_TEMP + "Error.Bit" : Bool; + END_VAR ---- NW 2: Schleuse 4466 (Vor ByPass vom VP): Ausgefahren ? --- - L "MW190" - L 4466 // Aufruf von Schleuse 4466? - <>I // Nein! - JC X4466E +BEGIN +NETWORK +TITLE = Rückmeldung + SET;//Rückmeldungen erst mal resetten + R "M180.6";//Weiterfahrt von Ziel-FC erlaubt - L "DVPtoEP_OmniFahren".Schleuse_4443.Dyn.Weichen_Ziel - L 16#4461 // Abzweig ? - <>I // Nein ! - BEC +NETWORK +TITLE = Schleuse 4466 (Vor ByPass vom VP): Ausgefahren ? + L "MW190"; + L 4466 ;//Aufruf von Schleuse 4466? + <>I;//Nein! + SPB X4466E; -// Partner-Trolley will zu LP fahren: -// Bei Partner (Schleuse 4443) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf) - L 0 - T "DVPtoEP_OmniFahren".Schleuse_4443.Dyn.Sk.Akt_Schritt + L "DVPtoEP_OmniFahren".Schleuse_4443.Dyn.Weichen_Ziel; + L 16#4461;//Abzweig ? + <>I;//Nein ! + BEB; -X4466E: NOP 0 +//Partner-Trolley will zu LP fahren: +//Bei Partner (Schleuse 4443) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf) + L 0; + T "DVPtoEP_OmniFahren".Schleuse_4443.Dyn.Sk.Akt_Schritt; +X4466E: NOP 0; ---- NW 3: Ende --- - BE +NETWORK +TITLE = Ende + BE; + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Omnifahren_EPtoLP/EPtoLP_OmniFahren.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Omnifahren_EPtoLP/EPtoLP_OmniFahren.awl index 278f1e0..432cde3 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Omnifahren_EPtoLP/EPtoLP_OmniFahren.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Omnifahren_EPtoLP/EPtoLP_OmniFahren.awl @@ -1,303 +1,568 @@ -=== FB 4128: EPtoLP_OmniFahren [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Schleuse_4512 : "MHMOmniSchleuse_Plus" - Schleuse_4532 : "MHMOmniSchleuse_Plus" - Schleuse_4516 : "MHMOmniSchleuse" - Schleuse_4520 : "MHMOmniSchleuse" - Bereich_4456 : "MHMOmniBereich_Plus" - Schleuse_4466 : "MHMOmniSchleuse_Plus" - Schleuse_4462 : "MHMOmniSchleuse_Plus" - Bereich_4465 : "MHMOmniBereich_Plus" - Schleuse_3370 : "MHMOmniSchleuse" - Bereich_3373 : "MHMOmniBereich_Plus" - Schleuse_3303 : "MHMOmniSchleuse" - Schleuse_4522 : "MHMOmniSchleuse" - Schleuse_4463 : "MHMOmniSchleuse" - Übergang_4514 : "MHMÜbergang_ohne_Schleuse" - Trolleys_starten : Struct - Flanke : Bool - Wartezeit_aktiv : Bool - Timer_Wartenzeit : Int - Temp: - ErrQuit : Bool - ErrAnz : Bool - Stau_raus : Bool - Start_ok : Bool - B_aktiv : Bool - B_vor_Schleuse : Bool - B_nach_Schleuse : Bool - Antrieb_aktiv : Bool - Antrieb_start : Bool - Antrieb_stop : Bool - Fahren_Ok : Bool - Antrieb_nicht_stoppen : Bool - Constant: - ---- NW 1: Systemzeug --- -// Verschiedene Bereiche: - A "DOutbound_Bereich".A01_UH07.AnlageEin - = Schleuse_4512.Dyn.Sk.Auto_akt - = Schleuse_4532.Dyn.Sk.Auto_akt - = Schleuse_4516.Dyn.Sk.Auto_akt - = Schleuse_4522.Dyn.Sk.Auto_akt - = Schleuse_4520.Dyn.Sk.Auto_akt - = Bereich_4456.Dyn.Sk.Auto_akt - = Schleuse_4466.Dyn.Sk.Auto_akt - = Schleuse_4462.Dyn.Sk.Auto_akt - = Schleuse_4463.Dyn.Sk.Auto_akt - = Bereich_4465.Dyn.Sk.Auto_akt - = Schleuse_3370.Dyn.Sk.Auto_akt - = Bereich_3373.Dyn.Sk.Auto_akt - = Schleuse_3303.Dyn.Sk.Auto_akt - - AN "DOutbound_Bereich".A01_UC074.BereichErr - = Schleuse_4512.Dyn.Sk.Bereich_ok - = Schleuse_4532.Dyn.Sk.Bereich_ok - = Schleuse_4516.Dyn.Sk.Bereich_ok - = Schleuse_4522.Dyn.Sk.Bereich_ok - = Schleuse_4520.Dyn.Sk.Bereich_ok - = Bereich_4456.Dyn.Sk.Bereich_ok - = Schleuse_4466.Dyn.Sk.Bereich_ok - = Schleuse_4462.Dyn.Sk.Bereich_ok - = Schleuse_4463.Dyn.Sk.Bereich_ok - = Bereich_4465.Dyn.Sk.Bereich_ok - AN "DOutbound_Bereich".A01_UH07.BereichErr - = Schleuse_3370.Dyn.Sk.Bereich_ok - = Bereich_3373.Dyn.Sk.Bereich_ok - = Schleuse_3303.Dyn.Sk.Bereich_ok - - ---- NW 2: Störungen quittieren UZ7402/7403 --- - A "DOutbound_Bereich".A01_UZ7402.StOk_aktiv - O "DOutbound_Bereich".A01_UZ7403.StOk_aktiv - O "DOutbound_Bereich".A01_UC074.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 3: Schleuse 4512 --- -CALL FB "None" , (Schleusen_Nr:=4512, ErrQuit:=ErrQuit, B_VorSchleuse:="BG4511", B_InSchleuse:="BG4512", B_Zähl:="BG4531", B_Stau_raus:="DEPtoLP_Sensoren".Stau_BG4531.Stat.B_Akt, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0326", Antrieb_plus_aktiv:=?, Schleuse_geöffnet:="MB4512", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DEPtoLP_Zylinder".Schleuse_4512.Stat.Ast, Error:=DB708.DBW576, Antrieb_Schleuse_vor:="DEPtoLP_Antriebe".MA0326.Stat.A_vor, Antrieb_Schleuse_start:="DEPtoLP_Antriebe".MA0326.Stat.A_start, Antrieb_Schleuse_stop:="DEPtoLP_Antriebe".MA0326.Stat.Stop_vor, Antrieb_Schleuse_PS:="DEPtoLP_Antriebe".MA0326.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) // Identisch - - ---- NW 4: Schleuse 4532 --- - A "DEPtoLP_Sensoren".Stau_BG4513.Stat.B_Akt -// / O "DEP>LP_Sensoren".Stau_BG4515.Stat.B_Akt - = Stau_raus - -CALL FB "None" , (Schleusen_Nr:=4532, ErrQuit:=ErrQuit, B_VorSchleuse:="BG4531", B_InSchleuse:="BG4532", B_Zähl:="BG4513", B_Stau_raus:=Stau_raus, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0326", Antrieb_plus_aktiv:="MA0326", Schleuse_geöffnet:="MB4532", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DEPtoLP_Zylinder".Schleuse_4532.Stat.Ast, Error:=DB708.DBW578, Antrieb_Schleuse_vor:="DEPtoLP_Antriebe".MA0326.Stat.A_vor, Antrieb_Schleuse_start:="DEPtoLP_Antriebe".MA0326.Stat.A_start, Antrieb_Schleuse_stop:="DEPtoLP_Antriebe".MA0326.Stat.Stop_vor, Antrieb_Schleuse_PS:="DEPtoLP_Antriebe".MA0326.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) - - ---- NW 5: MA0326 / Übergang 4514 --- -CALL FB "None" , (ErrQuit:=ErrQuit, B_Anfang:="BG4513", B_Am_Übergang:="BG4514", B_Stau_Antrieb_plus:="BG4515", Antrieb_aktiv:="MA0326", Antrieb_plus_aktiv:="MA0327", Antrieb_vor:="DEPtoLP_Antriebe".MA0326.Stat.A_vor, Antrieb_start:="DEPtoLP_Antriebe".MA0326.Stat.A_start, Antrieb_stop:="DEPtoLP_Antriebe".MA0326.Stat.A_PS, Antrieb_plus_vor:="DEPtoLP_Antriebe".MA0327.Stat.A_vor, Antrieb_plus_start:="DEPtoLP_Antriebe".MA0327.Stat.A_start) - - ---- NW 6: Schleuse 4516 --- -CALL FB "None" , (Schleusen_Nr:=4516, ErrQuit:=ErrQuit, B_VorSchleuse:="BG4515", B_InSchleuse:="BG4516", B_AusSchleuse:="BG4517", B_Stau_raus:="DEPtoLP_Sensoren".Stau_BG4517.Stat.B_Akt, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0327", Antrieb_plus_aktiv:="MA0327", Schleuse_geöffnet:="MB4516", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DEPtoLP_Zylinder".Schleuse_4516.Stat.Ast, Error:=DB708.DBW566, Antrieb_Schleuse_vor:="DEPtoLP_Antriebe".MA0327.Stat.A_vor, Antrieb_Schleuse_start:="DEPtoLP_Antriebe".MA0327.Stat.A_start, Antrieb_Schleuse_stop:="DEPtoLP_Antriebe".MA0327.Stat.Stop_vor, Antrieb_Schleuse_PS:="DEPtoLP_Antriebe".MA0327.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) // Identisch - - ---- NW 7: Schleuse 4522 --- -CALL FB "None" , (Schleusen_Nr:=4522, ErrQuit:=ErrQuit, B_VorSchleuse:="BG4517", B_InSchleuse:="BG4522", B_AusSchleuse:="BG4521", B_Stau_raus:="DEPtoLP_Sensoren".Stau_BG4521.Stat.B_Akt, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0327", Antrieb_plus_aktiv:="MA0327", Schleuse_geöffnet:="MB4522", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DEPtoLP_Zylinder".Schleuse_4522.Stat.Ast, Error:=DB708.DBW582, Antrieb_Schleuse_vor:="DEPtoLP_Antriebe".MA0327.Stat.A_vor, Antrieb_Schleuse_start:="DEPtoLP_Antriebe".MA0327.Stat.A_start, Antrieb_Schleuse_stop:="DEPtoLP_Antriebe".MA0327.Stat.Stop_vor, Antrieb_Schleuse_PS:="DEPtoLP_Antriebe".MA0327.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) // Identisch - - ---- NW 8: Wartezeit bis erneuter Trolleystart sinnvoll (wegen Staubildung) --- - A "MB4520" - Rise Trolleys_starten.Flanke - S Trolleys_starten.Wartezeit_aktiv - JCN Warten // Negierter Sprung - - L 15 // Wartezeit in Sekunden - T Trolleys_starten.Timer_Wartenzeit - -Warten: AN Trolleys_starten.Wartezeit_aktiv - O - A "MB4520" // Schleuse offen - AN "MA0327" // Aber Trolley fährt nicht - ON "1s-Impuls" - JC Wait - - L Trolleys_starten.Timer_Wartenzeit - + -1 - T Trolleys_starten.Timer_Wartenzeit - L 0 - >I - JC Wait - - SET - R Trolleys_starten.Wartezeit_aktiv - -Wait: NOP 0 - - ---- NW 9: Schleuse 4520 --- - AN Trolleys_starten.Wartezeit_aktiv - = Fahren_Ok - - A "BG4517" - O "BG4521" - = B_vor_Schleuse - -CALL FB "None" , (Schleusen_Nr:=4520, ErrQuit:=ErrQuit, B_VorSchleuse:=B_vor_Schleuse, B_InSchleuse:="BG4520", B_AusSchleuse:="BG4455", B_Stau_raus:="DEPtoLP_Sensoren".Stau_BG4455.Stat.B_Akt, Start_Ok:=Fahren_Ok, Antrieb_Schleuse_aktiv:="MA0327", Antrieb_plus_aktiv:="MA0330", Schleuse_geöffnet:="MB4520", RestZeit_Bereich_plus:=Bereich_4456.Dyn.Restzeit, Y_Schleuse_Auf:="DEPtoLP_Zylinder".Schleuse_4520.Stat.Ast, Error:=DB708.DBW568, Antrieb_Schleuse_vor:="DEPtoLP_Antriebe".MA0327.Stat.A_vor, Antrieb_Schleuse_start:="DEPtoLP_Antriebe".MA0327.Stat.A_start, Antrieb_Schleuse_stop:="DEPtoLP_Antriebe".MA0327.Stat.Stop_vor, Antrieb_Schleuse_PS:="DEPtoLP_Antriebe".MA0327.Stat.A_PS, Antrieb_plus_vor:=Bereich_4456.Dyn.Status.Trolley_kommt_in_Bereich, Antrieb_plus_start:=?, hStOk:=ErrAnz) - - ---- NW 10: Störungen anzeigen UZ7402/7403 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7402.StOk_blinken - S "DOutbound_Bereich".A01_UZ7403.StOk_blinken - S "DOutbound_Bereich".A01_UC074.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 11: Störungen quittieren UZ7402/7401 --- - A "DOutbound_Bereich".A01_UZ7402.StOk_aktiv - O "DOutbound_Bereich".A01_UZ7401.StOk_aktiv - O "DOutbound_Bereich".A01_UC074.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 12: Bereich 4456 --- - A "MB4520" - A "BG4455" - = B_vor_Schleuse - - A "DEPtoLP_Sensoren".Stau_BG4457.Stat.B_Akt - O "DEPtoLP_Sensoren".Stau_BG4467.Stat.B_Akt - = Stau_raus - -CALL FB "None" , (Bereichs_Nr:=4456, ErrQuit:=ErrQuit, B_BereichsAnfang:=B_vor_Schleuse, B_BereichsEnde:="BG4456", B_Zähl:="BG4467", B_Stau_raus:=Stau_raus, Start_Ok:=1, Antrieb_Bereich_aktiv:="MA0330", Antrieb_plus_aktiv:="MA0331", RestZeit_Bereich_plus:=?, Antrieb_Bereich_vor:="DEPtoLP_Antriebe".MA0330.Stat.A_vor, Antrieb_Bereich_stop:="DEPtoLP_Antriebe".MA0330.Stat.Stop_vor, Error:=DB708.DBW478, Antrieb_Bereich_start:="DEPtoLP_Antriebe".MA0330.Stat.A_start, Antrieb_plus_vor:="DEPtoLP_Antriebe".MA0331.Stat.A_vor, Antrieb_plus_start:="DEPtoLP_Antriebe".MA0331.Stat.A_start, Antrieb_minus_vor:="DEPtoLP_Antriebe".MA0327.Stat.A_vor, hStOk:=ErrAnz) - - ---- NW 13: Störungen anzeigen UZ7402/7401 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7402.StOk_blinken - S "DOutbound_Bereich".A01_UZ7401.StOk_blinken - S "DOutbound_Bereich".A01_UC074.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 14: Störungen quittieren UZ7401 --- - A "DOutbound_Bereich".A01_UZ7401.StOk_aktiv - O "DOutbound_Bereich".A01_UC074.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 15: Schleuse 4466 --- - AN "MB4445" // Weiche Einfahrt ByPass - AN "MB4457" - = Start_ok - -CALL FB "None" , (Schleusen_Nr:=4466, ErrQuit:=ErrQuit, B_VorSchleuse:="BG4457", B_InSchleuse:="BG4466", B_Zähl:="BG4461", B_Stau_raus:="DEPtoLP_Sensoren".Stau_BG4461.Stat.B_Akt, Start_Ok:=Start_ok, Antrieb_Schleuse_aktiv:="MA0331", Antrieb_plus_aktiv:="MA0332", Schleuse_geöffnet:="MB4466", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DEPtoLP_Zylinder".Schleuse_4466.Stat.Ast, Error:=DB708.DBW562, Antrieb_Schleuse_vor:="DEPtoLP_Antriebe".MA0331.Stat.A_vor, Antrieb_Schleuse_start:="DEPtoLP_Antriebe".MA0331.Stat.A_start, Antrieb_Schleuse_stop:="DEPtoLP_Antriebe".MA0331.Stat.Stop_vor, Antrieb_Schleuse_PS:="DEPtoLP_Antriebe".MA0331.Stat.A_PS, Antrieb_plus_vor:="DEPtoLP_Antriebe".MA0332.Stat.A_vor, Antrieb_plus_start:="DEPtoLP_Antriebe".MA0332.Stat.A_start, hStOk:=ErrAnz) - - - ---- NW 16: Schleuse 4462 --- -CALL FB "None" , (Schleusen_Nr:=4462, ErrQuit:=ErrQuit, B_VorSchleuse:="BG4461", B_InSchleuse:="BG4462", B_Zähl:="BG4460", B_Stau_raus:="DEPtoLP_Sensoren".Stau_BG4460.Stat.B_Akt, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0332", Antrieb_plus_aktiv:=?, Schleuse_geöffnet:="MB4462", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DEPtoLP_Zylinder".Schleuse_4462.Stat.Ast, Error:=DB708.DBW560, Antrieb_Schleuse_vor:="DEPtoLP_Antriebe".MA0332.Stat.A_vor, Antrieb_Schleuse_start:="DEPtoLP_Antriebe".MA0332.Stat.A_start, Antrieb_Schleuse_stop:="DEPtoLP_Antriebe".MA0332.Stat.Stop_vor, Antrieb_Schleuse_PS:="DEPtoLP_Antriebe".MA0332.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) - - ---- NW 17: Schleuse 4463 --- -CALL FB "None" , (Schleusen_Nr:=4463, ErrQuit:=ErrQuit, B_VorSchleuse:="BG4460", B_InSchleuse:="BG4463", B_AusSchleuse:="BG4464", B_Stau_raus:="DEPtoLP_Sensoren".Stau_BG4464.Stat.B_Akt, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0332", Antrieb_plus_aktiv:="MA0333", Schleuse_geöffnet:="MB4463", RestZeit_Bereich_plus:=Bereich_4465.Dyn.Restzeit, Y_Schleuse_Auf:="DEPtoLP_Zylinder".Schleuse_4463.Stat.Ast, Error:=DB708.DBW584, Antrieb_Schleuse_vor:="DEPtoLP_Antriebe".MA0332.Stat.A_vor, Antrieb_Schleuse_start:="DEPtoLP_Antriebe".MA0332.Stat.A_start, Antrieb_Schleuse_stop:="DEPtoLP_Antriebe".MA0332.Stat.Stop_vor, Antrieb_Schleuse_PS:="DEPtoLP_Antriebe".MA0332.Stat.A_PS, Antrieb_plus_vor:=Bereich_4465.Dyn.Status.Trolley_kommt_in_Bereich, Antrieb_plus_start:=?, hStOk:=ErrAnz) - - ---- NW 18: Bereich 4465 (vor BST 1) --- - AN "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3 - AN "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4 - AN "7_HMI_Err_UH07_OB".System.BST1_Feueralarm - AN "7_HMI_Err_UH07_OB".System.BST1_Geschlossen - AN "7_HMI_Err_UH07_OB".System."BST1_Störung" - A Schleuse_3370.Dyn.Sk.Bereich_ok - = Fahren_Ok - -CALL FB "None" , (Bereichs_Nr:=4465, ErrQuit:=ErrQuit, B_BereichsAnfang:="BG4464", B_BereichsEnde:="BG4465", B_Zähl:="BG3367", B_Stau_raus:="DEPtoLP_Sensoren".Stau_BG3367.Stat.B_Akt, Start_Ok:=Fahren_Ok, Antrieb_Bereich_aktiv:="MA0333", Antrieb_plus_aktiv:="MA0062", RestZeit_Bereich_plus:=?, Antrieb_Bereich_vor:="DEPtoLP_Antriebe".MA0333.Stat.A_vor, Antrieb_Bereich_stop:="DEPtoLP_Antriebe".MA0333.Stat.Stop_vor, Error:=DB708.DBW480, Antrieb_Bereich_start:="DEPtoLP_Antriebe".MA0333.Stat.A_start, Antrieb_plus_vor:="DEPtoLP_Antriebe".MA0062.Stat.A_vor, Antrieb_plus_start:="DEPtoLP_Antriebe".MA0062.Stat.A_start, Antrieb_minus_vor:="DEPtoLP_Antriebe".MA0332.Stat.A_vor, hStOk:=ErrAnz) - - ---- NW 19: Störungen anzeigen UZ7401 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7401.StOk_blinken - S "DOutbound_Bereich".A01_UC074.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 20: Störungen quittieren UZ0701 --- - A "DOutbound_Bereich".A01_UZ0701.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 21: Schleuse 3370 (hinter BST 1) --- -// Hinter BST freiräumen: - A Bereich_4465.Dyn.Status."Trolley_fährt_aus" - O - A "DEPtoLP_Sensoren".Stau_BG3367.Stat.B_Akt - AN "BG3370" - S "DEPtoLP_Antriebe".MA0062.Stat.A_vor - - A "DEPtoLP_Sensoren".Stau_BG3371.Stat.B_Akt - O "DEPtoLP_Sensoren".Stau_BG3372.Stat.B_Akt - O "DEPtoLP_Sensoren".Stau_BG3377.Stat.B_Akt // Stau hinter ASF im EG - = Stau_raus - -CALL FB "None" , (Schleusen_Nr:=3370, ErrQuit:=ErrQuit, B_VorSchleuse:="DEPtoLP_Sensoren".Stau_BG3367.Stat.B_Akt, B_InSchleuse:="BG3370", B_AusSchleuse:="BG3372", B_Stau_raus:=Stau_raus, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0062", Antrieb_plus_aktiv:="MA0063", Schleuse_geöffnet:="MB3370", RestZeit_Bereich_plus:=Bereich_3373.Dyn.Restzeit, Y_Schleuse_Auf:="DEPtoLP_Zylinder".Schleuse_3370.Stat.Ast, Error:=DB708.DBW532, Antrieb_Schleuse_vor:="DEPtoLP_Antriebe".MA0062.Stat.A_vor, Antrieb_Schleuse_start:="DEPtoLP_Antriebe".MA0062.Stat.A_start, Antrieb_Schleuse_stop:="DEPtoLP_Antriebe".MA0062.Stat.Stop_vor, Antrieb_Schleuse_PS:="DEPtoLP_Antriebe".MA0062.Stat.A_PS, Antrieb_plus_vor:=Bereich_3373.Dyn.Status.Trolley_kommt_in_Bereich, Antrieb_plus_start:=?, hStOk:=ErrAnz) - - ---- NW 22: Störungen anzeigen UZ0701 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ0701.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 23: Störungen quittieren UZ0701/0702 --- - A "DOutbound_Bereich".A01_UZ0701.StOk_aktiv - O "DOutbound_Bereich".A01_UZ0702.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 24: Bereich 3373 (Runter ins EG) --- - A "MB3370" - A "BG3372" - = B_vor_Schleuse - - A "DEPtoLP_Sensoren".Stau_BG3376.Stat.B_Akt - O "DEPtoLP_Sensoren".Stau_BG3377.Stat.B_Akt - = Stau_raus - -CALL FB "None" , (Bereichs_Nr:=3373, ErrQuit:=ErrQuit, B_BereichsAnfang:=B_vor_Schleuse, B_BereichsEnde:="BG3373", B_Zähl:="BG3377", B_Stau_raus:=Stau_raus, Start_Ok:=1, Antrieb_Bereich_aktiv:="MA0063", Antrieb_plus_aktiv:="MA0064", RestZeit_Bereich_plus:=?, Antrieb_Bereich_vor:="DEPtoLP_Antriebe".MA0063.Stat.A_vor, Antrieb_Bereich_stop:="DEPtoLP_Antriebe".MA0063.Stat.Stop_vor, Error:=DB708.DBW456, Antrieb_Bereich_start:="DEPtoLP_Antriebe".MA0063.Stat.A_start, Antrieb_plus_vor:="DEPtoLP_Antriebe".MA0064.Stat.A_vor, Antrieb_plus_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_minus_vor:="DEPtoLP_Antriebe".MA0062.Stat.A_vor, hStOk:=ErrAnz) - - ---- NW 25: Störungen anzeigen UZ0701/0702 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ0701.StOk_blinken - S "DOutbound_Bereich".A01_UZ0702.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 26: Störungen quittieren UZ0702 --- - A "DOutbound_Bereich".A01_UZ0702.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 27: Schleuse 3303 --- -CALL FB "None" , (Schleusen_Nr:=3303, ErrQuit:=ErrQuit, B_VorSchleuse:="BG3377", B_InSchleuse:="BG3303", B_AusSchleuse:="BG3304", B_Stau_raus:="DEPtoLP_Sensoren".Stau_BG3304.Stat.B_Akt, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0064", Antrieb_plus_aktiv:="MA0064", Schleuse_geöffnet:="MB3303", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DEPtoLP_Zylinder".Schleuse_3303.Stat.Ast, Error:=DB708.DBW522, Antrieb_Schleuse_vor:="DEPtoLP_Antriebe".MA0064.Stat.A_vor, Antrieb_Schleuse_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_Schleuse_stop:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, Antrieb_Schleuse_PS:="DEPtoLP_Antriebe".MA0064.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) // wie oben - - ---- NW 28: Störungen anzeigen UZ0702 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ0702.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 29: Ende --- - BE +FUNCTION_BLOCK "EPtoLP_OmniFahren" +TITLE = Omnifahren Outbound Entnahmepuffer > Leerpuffer +{ S7_Optimized_Access := 'FALSE' } +VERSION : 0.1 + VAR + Schleuse_4512 { S7_SetPoint := 'False'} : "MHMOmniSchleuse_Plus"; + Schleuse_4532 { S7_SetPoint := 'False'} : "MHMOmniSchleuse_Plus"; + Schleuse_4516 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Schleuse_4520 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Bereich_4456 : "MHMOmniBereich_Plus"; + Schleuse_4466 { S7_SetPoint := 'False'} : "MHMOmniSchleuse_Plus"; + Schleuse_4462 { S7_SetPoint := 'False'} : "MHMOmniSchleuse_Plus"; + Bereich_4465 : "MHMOmniBereich_Plus"; + Schleuse_3370 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Bereich_3373 : "MHMOmniBereich_Plus"; + Schleuse_3303 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Schleuse_4522 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Schleuse_4463 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Übergang_4514 { S7_SetPoint := 'False'} : "MHMÜbergang_ohne_Schleuse"; + Trolleys_starten : Struct + Flanke : Bool; + Wartezeit_aktiv : Bool; + Timer_Wartenzeit { S7_SetPoint := 'True'} : Int; + END_STRUCT; + END_VAR + + VAR_TEMP + ErrQuit : Bool; + ErrAnz : Bool; + Stau_raus : Bool; + Start_ok : Bool; + B_aktiv : Bool; + B_vor_Schleuse : Bool; + B_nach_Schleuse : Bool; + Antrieb_aktiv : Bool; + Antrieb_start : Bool; + Antrieb_stop : Bool; + Fahren_Ok : Bool; + Antrieb_nicht_stoppen : Bool; + END_VAR + + +BEGIN +NETWORK +TITLE = Systemzeug + +//Verschiedene Bereiche: + U "DOutbound_Bereich".A01_UH07.AnlageEin; + = #Schleuse_4512.Dyn.Sk.Auto_akt; + = #Schleuse_4532.Dyn.Sk.Auto_akt; + = #Schleuse_4516.Dyn.Sk.Auto_akt; + = #Schleuse_4522.Dyn.Sk.Auto_akt; + = #Schleuse_4520.Dyn.Sk.Auto_akt; + = #Bereich_4456.Dyn.Sk.Auto_akt; + = #Schleuse_4466.Dyn.Sk.Auto_akt; + = #Schleuse_4462.Dyn.Sk.Auto_akt; + = #Schleuse_4463.Dyn.Sk.Auto_akt; + = #Bereich_4465.Dyn.Sk.Auto_akt; + = #Schleuse_3370.Dyn.Sk.Auto_akt; + = #Bereich_3373.Dyn.Sk.Auto_akt; + = #Schleuse_3303.Dyn.Sk.Auto_akt; + + UN "DOutbound_Bereich".A01_UC074.BereichErr; + = #Schleuse_4512.Dyn.Sk.Bereich_ok; + = #Schleuse_4532.Dyn.Sk.Bereich_ok; + = #Schleuse_4516.Dyn.Sk.Bereich_ok; + = #Schleuse_4522.Dyn.Sk.Bereich_ok; + = #Schleuse_4520.Dyn.Sk.Bereich_ok; + = #Bereich_4456.Dyn.Sk.Bereich_ok; + = #Schleuse_4466.Dyn.Sk.Bereich_ok; + = #Schleuse_4462.Dyn.Sk.Bereich_ok; + = #Schleuse_4463.Dyn.Sk.Bereich_ok; + = #Bereich_4465.Dyn.Sk.Bereich_ok; + UN "DOutbound_Bereich".A01_UH07.BereichErr; + = #Schleuse_3370.Dyn.Sk.Bereich_ok; + = #Bereich_3373.Dyn.Sk.Bereich_ok; + = #Schleuse_3303.Dyn.Sk.Bereich_ok; + +NETWORK +TITLE = Störungen quittieren UZ7402/7403 + U "DOutbound_Bereich".A01_UZ7402.StOk_aktiv; + O "DOutbound_Bereich".A01_UZ7403.StOk_aktiv; + O "DOutbound_Bereich".A01_UC074.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Schleuse 4512 + CALL #Schleuse_4512 + ( Schleusen_Nr := 4512 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG4511" , + B_InSchleuse := "BG4512" , + B_Zähl := "BG4531" , + B_Stau_raus := "DEPtoLP_Sensoren".Stau_BG4531.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0326" , + Schleuse_geöffnet := "MB4512" , + Y_Schleuse_Auf := "DEPtoLP_Zylinder".Schleuse_4512.Stat.Ast , + Error := %DB708.DBW576 , + Antrieb_Schleuse_vor := "DEPtoLP_Antriebe".MA0326.Stat.A_vor , + Antrieb_Schleuse_start := "DEPtoLP_Antriebe".MA0326.Stat.A_start , + Antrieb_Schleuse_stop := "DEPtoLP_Antriebe".MA0326.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DEPtoLP_Antriebe".MA0326.Stat.A_PS , + Antrieb_plus_vor := , //Identisch + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Schleuse 4532 + U "DEPtoLP_Sensoren".Stau_BG4513.Stat.B_Akt; +/// O "DEP>LP_Sensoren".Stau_BG4515.Stat.B_Akt + = #Stau_raus; + + CALL #Schleuse_4532 + ( Schleusen_Nr := 4532 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG4531" , + B_InSchleuse := "BG4532" , + B_Zähl := "BG4513" , + B_Stau_raus := #Stau_raus , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0326" , + Antrieb_plus_aktiv := "MA0326" , + Schleuse_geöffnet := "MB4532" , + Y_Schleuse_Auf := "DEPtoLP_Zylinder".Schleuse_4532.Stat.Ast , + Error := %DB708.DBW578 , + Antrieb_Schleuse_vor := "DEPtoLP_Antriebe".MA0326.Stat.A_vor , + Antrieb_Schleuse_start := "DEPtoLP_Antriebe".MA0326.Stat.A_start , + Antrieb_Schleuse_stop := "DEPtoLP_Antriebe".MA0326.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DEPtoLP_Antriebe".MA0326.Stat.A_PS , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = MA0326 / Übergang 4514 + CALL #Übergang_4514 + ( ErrQuit := #ErrQuit , + B_Anfang := "BG4513" , + B_Am_Übergang := "BG4514" , + B_Stau_Antrieb_plus := "BG4515" , + Antrieb_aktiv := "MA0326" , + Antrieb_plus_aktiv := "MA0327" , + Antrieb_vor := "DEPtoLP_Antriebe".MA0326.Stat.A_vor , + Antrieb_start := "DEPtoLP_Antriebe".MA0326.Stat.A_start , + Antrieb_stop := "DEPtoLP_Antriebe".MA0326.Stat.A_PS , + Antrieb_plus_vor := "DEPtoLP_Antriebe".MA0327.Stat.A_vor , + Antrieb_plus_start := "DEPtoLP_Antriebe".MA0327.Stat.A_start + ); + +NETWORK +TITLE = Schleuse 4516 + CALL #Schleuse_4516 + ( Schleusen_Nr := 4516 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG4515" , + B_InSchleuse := "BG4516" , + B_AusSchleuse := "BG4517" , + B_Stau_raus := "DEPtoLP_Sensoren".Stau_BG4517.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0327" , + Antrieb_plus_aktiv := "MA0327" , + Schleuse_geöffnet := "MB4516" , + Y_Schleuse_Auf := "DEPtoLP_Zylinder".Schleuse_4516.Stat.Ast , + Error := %DB708.DBW566 , + Antrieb_Schleuse_vor := "DEPtoLP_Antriebe".MA0327.Stat.A_vor , + Antrieb_Schleuse_start := "DEPtoLP_Antriebe".MA0327.Stat.A_start , + Antrieb_Schleuse_stop := "DEPtoLP_Antriebe".MA0327.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DEPtoLP_Antriebe".MA0327.Stat.A_PS , + Antrieb_plus_vor := , //Identisch + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Schleuse 4522 + CALL #Schleuse_4522 + ( Schleusen_Nr := 4522 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG4517" , + B_InSchleuse := "BG4522" , + B_AusSchleuse := "BG4521" , + B_Stau_raus := "DEPtoLP_Sensoren".Stau_BG4521.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0327" , + Antrieb_plus_aktiv := "MA0327" , + Schleuse_geöffnet := "MB4522" , + Y_Schleuse_Auf := "DEPtoLP_Zylinder".Schleuse_4522.Stat.Ast , + Error := %DB708.DBW582 , + Antrieb_Schleuse_vor := "DEPtoLP_Antriebe".MA0327.Stat.A_vor , + Antrieb_Schleuse_start := "DEPtoLP_Antriebe".MA0327.Stat.A_start , + Antrieb_Schleuse_stop := "DEPtoLP_Antriebe".MA0327.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DEPtoLP_Antriebe".MA0327.Stat.A_PS , + Antrieb_plus_vor := , //Identisch + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Wartezeit bis erneuter Trolleystart sinnvoll (wegen Staubildung) + U "MB4520"; + FP #Trolleys_starten.Flanke; + S #Trolleys_starten.Wartezeit_aktiv; + SPBN Warten ;//Negierter Sprung + + L 15 ;//Wartezeit in Sekunden + T #Trolleys_starten.Timer_Wartenzeit; + +Warten: UN #Trolleys_starten.Wartezeit_aktiv; + O; + U "MB4520" ;//Schleuse offen + UN "MA0327" ;//Aber Trolley fährt nicht + ON "1s-Impuls"; + SPB Wait; + + L #Trolleys_starten.Timer_Wartenzeit; + + -1; + T #Trolleys_starten.Timer_Wartenzeit; + L 0; + >I; + SPB Wait; + + SET; + R #Trolleys_starten.Wartezeit_aktiv; + +Wait: NOP 0; + +NETWORK +TITLE = Schleuse 4520 + UN #Trolleys_starten.Wartezeit_aktiv; + = #Fahren_Ok; + + U "BG4517"; + O "BG4521"; + = #B_vor_Schleuse; + + CALL #Schleuse_4520 + ( Schleusen_Nr := 4520 , + ErrQuit := #ErrQuit , + B_VorSchleuse := #B_vor_Schleuse , + B_InSchleuse := "BG4520" , + B_AusSchleuse := "BG4455" , + B_Stau_raus := "DEPtoLP_Sensoren".Stau_BG4455.Stat.B_Akt , + Start_Ok := #Fahren_Ok , + Antrieb_Schleuse_aktiv := "MA0327" , + Antrieb_plus_aktiv := "MA0330" , + Schleuse_geöffnet := "MB4520" , + RestZeit_Bereich_plus := #Bereich_4456.Dyn.Restzeit , + Y_Schleuse_Auf := "DEPtoLP_Zylinder".Schleuse_4520.Stat.Ast , + Error := %DB708.DBW568 , + Antrieb_Schleuse_vor := "DEPtoLP_Antriebe".MA0327.Stat.A_vor , + Antrieb_Schleuse_start := "DEPtoLP_Antriebe".MA0327.Stat.A_start , + Antrieb_Schleuse_stop := "DEPtoLP_Antriebe".MA0327.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DEPtoLP_Antriebe".MA0327.Stat.A_PS , + Antrieb_plus_vor := #Bereich_4456.Dyn.Status.Trolley_kommt_in_Bereich , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Störungen anzeigen UZ7402/7403 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7402.StOk_blinken; + S "DOutbound_Bereich".A01_UZ7403.StOk_blinken; + S "DOutbound_Bereich".A01_UC074.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Störungen quittieren UZ7402/7401 + U "DOutbound_Bereich".A01_UZ7402.StOk_aktiv; + O "DOutbound_Bereich".A01_UZ7401.StOk_aktiv; + O "DOutbound_Bereich".A01_UC074.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Bereich 4456 + U "MB4520"; + U "BG4455"; + = #B_vor_Schleuse; + + U "DEPtoLP_Sensoren".Stau_BG4457.Stat.B_Akt; + O "DEPtoLP_Sensoren".Stau_BG4467.Stat.B_Akt; + = #Stau_raus; + + CALL #Bereich_4456 + ( Bereichs_Nr := 4456 , + ErrQuit := #ErrQuit , + B_BereichsAnfang := #B_vor_Schleuse , + B_BereichsEnde := "BG4456" , + B_Zähl := "BG4467" , + B_Stau_raus := #Stau_raus , + Start_Ok := 1 , + Antrieb_Bereich_aktiv := "MA0330" , + Antrieb_plus_aktiv := "MA0331" , + Antrieb_Bereich_vor := "DEPtoLP_Antriebe".MA0330.Stat.A_vor , + Antrieb_Bereich_stop := "DEPtoLP_Antriebe".MA0330.Stat.Stop_vor , + Error := %DB708.DBW478 , + Antrieb_Bereich_start := "DEPtoLP_Antriebe".MA0330.Stat.A_start , + Antrieb_plus_vor := "DEPtoLP_Antriebe".MA0331.Stat.A_vor , + Antrieb_plus_start := "DEPtoLP_Antriebe".MA0331.Stat.A_start , + Antrieb_minus_vor := "DEPtoLP_Antriebe".MA0327.Stat.A_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Störungen anzeigen UZ7402/7401 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7402.StOk_blinken; + S "DOutbound_Bereich".A01_UZ7401.StOk_blinken; + S "DOutbound_Bereich".A01_UC074.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Störungen quittieren UZ7401 + U "DOutbound_Bereich".A01_UZ7401.StOk_aktiv; + O "DOutbound_Bereich".A01_UC074.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Schleuse 4466 + UN "MB4445" ;//Weiche Einfahrt ByPass + UN "MB4457"; + = #Start_ok; + + CALL #Schleuse_4466 + ( Schleusen_Nr := 4466 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG4457" , + B_InSchleuse := "BG4466" , + B_Zähl := "BG4461" , + B_Stau_raus := "DEPtoLP_Sensoren".Stau_BG4461.Stat.B_Akt , + Start_Ok := #Start_ok , + Antrieb_Schleuse_aktiv := "MA0331" , + Antrieb_plus_aktiv := "MA0332" , + Schleuse_geöffnet := "MB4466" , + Y_Schleuse_Auf := "DEPtoLP_Zylinder".Schleuse_4466.Stat.Ast , + Error := %DB708.DBW562 , + Antrieb_Schleuse_vor := "DEPtoLP_Antriebe".MA0331.Stat.A_vor , + Antrieb_Schleuse_start := "DEPtoLP_Antriebe".MA0331.Stat.A_start , + Antrieb_Schleuse_stop := "DEPtoLP_Antriebe".MA0331.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DEPtoLP_Antriebe".MA0331.Stat.A_PS , + Antrieb_plus_vor := "DEPtoLP_Antriebe".MA0332.Stat.A_vor , + Antrieb_plus_start := "DEPtoLP_Antriebe".MA0332.Stat.A_start , + hStOk := #ErrAnz + ); + + +NETWORK +TITLE = Schleuse 4462 + CALL #Schleuse_4462 + ( Schleusen_Nr := 4462 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG4461" , + B_InSchleuse := "BG4462" , + B_Zähl := "BG4460" , + B_Stau_raus := "DEPtoLP_Sensoren".Stau_BG4460.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0332" , + Schleuse_geöffnet := "MB4462" , + Y_Schleuse_Auf := "DEPtoLP_Zylinder".Schleuse_4462.Stat.Ast , + Error := %DB708.DBW560 , + Antrieb_Schleuse_vor := "DEPtoLP_Antriebe".MA0332.Stat.A_vor , + Antrieb_Schleuse_start := "DEPtoLP_Antriebe".MA0332.Stat.A_start , + Antrieb_Schleuse_stop := "DEPtoLP_Antriebe".MA0332.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DEPtoLP_Antriebe".MA0332.Stat.A_PS , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Schleuse 4463 + CALL #Schleuse_4463 + ( Schleusen_Nr := 4463 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG4460" , + B_InSchleuse := "BG4463" , + B_AusSchleuse := "BG4464" , + B_Stau_raus := "DEPtoLP_Sensoren".Stau_BG4464.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0332" , + Antrieb_plus_aktiv := "MA0333" , + Schleuse_geöffnet := "MB4463" , + RestZeit_Bereich_plus := #Bereich_4465.Dyn.Restzeit , + Y_Schleuse_Auf := "DEPtoLP_Zylinder".Schleuse_4463.Stat.Ast , + Error := %DB708.DBW584 , + Antrieb_Schleuse_vor := "DEPtoLP_Antriebe".MA0332.Stat.A_vor , + Antrieb_Schleuse_start := "DEPtoLP_Antriebe".MA0332.Stat.A_start , + Antrieb_Schleuse_stop := "DEPtoLP_Antriebe".MA0332.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DEPtoLP_Antriebe".MA0332.Stat.A_PS , + Antrieb_plus_vor := #Bereich_4465.Dyn.Status.Trolley_kommt_in_Bereich , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Bereich 4465 (vor BST 1) + UN "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3; + UN "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4; + UN "7_HMI_Err_UH07_OB".System.BST1_Feueralarm; + UN "7_HMI_Err_UH07_OB".System.BST1_Geschlossen; + UN "7_HMI_Err_UH07_OB".System.BST1_Störung; + U #Schleuse_3370.Dyn.Sk.Bereich_ok; + = #Fahren_Ok; + + CALL #Bereich_4465 + ( Bereichs_Nr := 4465 , + ErrQuit := #ErrQuit , + B_BereichsAnfang := "BG4464" , + B_BereichsEnde := "BG4465" , + B_Zähl := "BG3367" , + B_Stau_raus := "DEPtoLP_Sensoren".Stau_BG3367.Stat.B_Akt , + Start_Ok := #Fahren_Ok , + Antrieb_Bereich_aktiv := "MA0333" , + Antrieb_plus_aktiv := "MA0062" , + Antrieb_Bereich_vor := "DEPtoLP_Antriebe".MA0333.Stat.A_vor , + Antrieb_Bereich_stop := "DEPtoLP_Antriebe".MA0333.Stat.Stop_vor , + Error := %DB708.DBW480 , + Antrieb_Bereich_start := "DEPtoLP_Antriebe".MA0333.Stat.A_start , + Antrieb_plus_vor := "DEPtoLP_Antriebe".MA0062.Stat.A_vor , + Antrieb_plus_start := "DEPtoLP_Antriebe".MA0062.Stat.A_start , + Antrieb_minus_vor := "DEPtoLP_Antriebe".MA0332.Stat.A_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Störungen anzeigen UZ7401 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7401.StOk_blinken; + S "DOutbound_Bereich".A01_UC074.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Störungen quittieren UZ0701 + U "DOutbound_Bereich".A01_UZ0701.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Schleuse 3370 (hinter BST 1) + +//Hinter BST freiräumen: + U #Bereich_4465.Dyn.Status.Trolley_fährt_aus; + O; + U "DEPtoLP_Sensoren".Stau_BG3367.Stat.B_Akt; + UN "BG3370"; + S "DEPtoLP_Antriebe".MA0062.Stat.A_vor; + + U "DEPtoLP_Sensoren".Stau_BG3371.Stat.B_Akt; + O "DEPtoLP_Sensoren".Stau_BG3372.Stat.B_Akt; + O "DEPtoLP_Sensoren".Stau_BG3377.Stat.B_Akt;//Stau hinter ASF im EG + = #Stau_raus; + + CALL #Schleuse_3370 + ( Schleusen_Nr := 3370 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "DEPtoLP_Sensoren".Stau_BG3367.Stat.B_Akt , + B_InSchleuse := "BG3370" , + B_AusSchleuse := "BG3372" , + B_Stau_raus := #Stau_raus , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0062" , + Antrieb_plus_aktiv := "MA0063" , + Schleuse_geöffnet := "MB3370" , + RestZeit_Bereich_plus := #Bereich_3373.Dyn.Restzeit , + Y_Schleuse_Auf := "DEPtoLP_Zylinder".Schleuse_3370.Stat.Ast , + Error := %DB708.DBW532 , + Antrieb_Schleuse_vor := "DEPtoLP_Antriebe".MA0062.Stat.A_vor , + Antrieb_Schleuse_start := "DEPtoLP_Antriebe".MA0062.Stat.A_start , + Antrieb_Schleuse_stop := "DEPtoLP_Antriebe".MA0062.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DEPtoLP_Antriebe".MA0062.Stat.A_PS , + Antrieb_plus_vor := #Bereich_3373.Dyn.Status.Trolley_kommt_in_Bereich , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Störungen anzeigen UZ0701 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ0701.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Störungen quittieren UZ0701/0702 + U "DOutbound_Bereich".A01_UZ0701.StOk_aktiv; + O "DOutbound_Bereich".A01_UZ0702.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Bereich 3373 (Runter ins EG) + U "MB3370"; + U "BG3372"; + = #B_vor_Schleuse; + + U "DEPtoLP_Sensoren".Stau_BG3376.Stat.B_Akt; + O "DEPtoLP_Sensoren".Stau_BG3377.Stat.B_Akt; + = #Stau_raus; + + CALL #Bereich_3373 + ( Bereichs_Nr := 3373 , + ErrQuit := #ErrQuit , + B_BereichsAnfang := #B_vor_Schleuse , + B_BereichsEnde := "BG3373" , + B_Zähl := "BG3377" , + B_Stau_raus := #Stau_raus , + Start_Ok := 1 , + Antrieb_Bereich_aktiv := "MA0063" , + Antrieb_plus_aktiv := "MA0064" , + Antrieb_Bereich_vor := "DEPtoLP_Antriebe".MA0063.Stat.A_vor , + Antrieb_Bereich_stop := "DEPtoLP_Antriebe".MA0063.Stat.Stop_vor , + Error := %DB708.DBW456 , + Antrieb_Bereich_start := "DEPtoLP_Antriebe".MA0063.Stat.A_start , + Antrieb_plus_vor := "DEPtoLP_Antriebe".MA0064.Stat.A_vor , + Antrieb_plus_start := "DEPtoLP_Antriebe".MA0064.Stat.A_start , + Antrieb_minus_vor := "DEPtoLP_Antriebe".MA0062.Stat.A_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Störungen anzeigen UZ0701/0702 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ0701.StOk_blinken; + S "DOutbound_Bereich".A01_UZ0702.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Störungen quittieren UZ0702 + U "DOutbound_Bereich".A01_UZ0702.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Schleuse 3303 + CALL #Schleuse_3303 + ( Schleusen_Nr := 3303 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG3377" , + B_InSchleuse := "BG3303" , + B_AusSchleuse := "BG3304" , + B_Stau_raus := "DEPtoLP_Sensoren".Stau_BG3304.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0064" , + Antrieb_plus_aktiv := "MA0064" , + Schleuse_geöffnet := "MB3303" , + Y_Schleuse_Auf := "DEPtoLP_Zylinder".Schleuse_3303.Stat.Ast , + Error := %DB708.DBW522 , + Antrieb_Schleuse_vor := "DEPtoLP_Antriebe".MA0064.Stat.A_vor , + Antrieb_Schleuse_start := "DEPtoLP_Antriebe".MA0064.Stat.A_start , + Antrieb_Schleuse_stop := "DEPtoLP_Antriebe".MA0064.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DEPtoLP_Antriebe".MA0064.Stat.A_PS , + Antrieb_plus_vor := , //wie oben + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Störungen anzeigen UZ0702 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ0702.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Omnifahren_EPtoLP/EPtoLP_Ziel_FC.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Omnifahren_EPtoLP/EPtoLP_Ziel_FC.awl index c858397..d855ed6 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Omnifahren_EPtoLP/EPtoLP_Ziel_FC.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/4_EPtoLP/Omnifahren_EPtoLP/EPtoLP_Ziel_FC.awl @@ -1,74 +1,77 @@ -=== FC 4181: EPtoLP_Ziel_FC [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Ziel_hex : Word - Ziel_int : Int - Zielebene : Word - Error : Byte - Position : Int - Lager_DB : Int - Lager_DW : Int - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - SSDW : Int - EndZiel : Word - Variante : Int - AbrufID : DInt - Fahrlisten_TrolleyID : DInt - Fahrlisten_AbrufID : DInt - Fahrlisten_Lager : Int - Trolley_unbekannt : Bool // Trolley ist nicht in DL - Express_Abruf : Bool - Constant: - Return: - Ret_Val : Void - ---- NW 1: Rückmeldung --- - SET // Rückmeldungen erst mal resetten - R "M180.6" // Weiterfahrt von Ziel-FC erlaubt +FUNCTION "EPtoLP_Ziel_FC" : Void +TITLE = Ziel-FC: EP>LP_OmniFahren +{ S7_Optimized_Access := 'FALSE' ; S7_Pass_Registers := 'TRUE' } +AUTHOR : AE +VERSION : 0.1 + VAR_TEMP + Ziel_hex : Word; + Ziel_int : Int; + Zielebene : Word; + Error : Byte; + Position : Int; + Lager_DB : Int; + Lager_DW : Int; + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + SSDW : Int; + EndZiel : Word; + Variante : Int; + AbrufID : DInt; + Fahrlisten_TrolleyID : DInt; + Fahrlisten_AbrufID : DInt; + Fahrlisten_Lager : Int; + Trolley_unbekannt : Bool; // Trolley ist nicht in DL + Express_Abruf : Bool; + END_VAR ---- NW 2: Bereich 4465: (BST 1) --- - L "MW190" - L 4465 // Aufruf von Schleuse XXXX? - <>I // Nein! - JC X4465E +BEGIN +NETWORK +TITLE = Rückmeldung + SET;//Rückmeldungen erst mal resetten + R "M180.6";//Weiterfahrt von Ziel-FC erlaubt - SET - S "M180.6" // Weiterfahrt ist erlaubt +NETWORK +TITLE = Bereich 4465: (BST 1) + L "MW190"; + L 4465 ;//Aufruf von Schleuse XXXX? + <>I;//Nein! + SPB X4465E; - BEU + SET; + S "M180.6" ;//Weiterfahrt ist erlaubt -X4465E: NOP 0 + BEA; +X4465E: NOP 0; ---- NW 3: Schleuse 4466: (Vor Einfahrt ByPass) --- - L "MW190" - L 4466 // Aufruf von Schleuse XXXX? - <>I // Nein! - JC X4466E +NETWORK +TITLE = Schleuse 4466: (Vor Einfahrt ByPass) + L "MW190"; + L 4466 ;//Aufruf von Schleuse XXXX? + <>I;//Nein! + SPB X4466E; -// Quell-Steuerung: - L "DVPtoEP_OmniFahren".Weiche_4445.Dyn.Weichen_Ziel - L 16#4461 // Fahren Trolleys zu BG4461? - ==I // Ja! - O "MB4445" // Weiche ist auf Abzweig - O "DVPtoEP_OmniFahren".Weiche_4445.Dyn.Status.Reset_aktiv - BEC // Warten ! +//Quell-Steuerung: + L "DVPtoEP_OmniFahren".Weiche_4445.Dyn.Weichen_Ziel; + L 16#4461 ;//Fahren Trolleys zu BG4461? + ==I;//Ja! + O "MB4445" ;//Weiche ist auf Abzweig + O "DVPtoEP_OmniFahren".Weiche_4445.Dyn.Status.Reset_aktiv; + BEB;//Warten ! - AN "MB4445" // Weiche Einfahrt ByPass - AN "MB4457" - AN "DEPtoLP_Sensoren".Stau_BG4461.Stat.B_Akt - S "M180.6" // Weiterfahrt ist erlaubt + UN "MB4445" ;//Weiche Einfahrt ByPass + UN "MB4457"; + UN "DEPtoLP_Sensoren".Stau_BG4461.Stat.B_Akt; + S "M180.6" ;//Weiterfahrt ist erlaubt - BEU + BEA; -X4466E: NOP 0 +X4466E: NOP 0; +NETWORK +TITLE = Ende + BE; ---- NW 4: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Basics/LP_Sensoren.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Basics/LP_Sensoren.awl index 86db5d0..b2e36bb 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Basics/LP_Sensoren.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Basics/LP_Sensoren.awl @@ -1,82 +1,173 @@ -=== FB 5190: LP_Sensoren [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Stau_LP1 : "MSensoren" - Stau_LP2 : "MSensoren" - Stau_LP3 : "MSensoren" - Stau_LP4 : "MSensoren" - Stau_LP5 : "MSensoren" - Stau_LP6 : "MSensoren" - Stau_LP7 : "MSensoren" - Stau_LP8 : "MSensoren" - Stau_LP9 : "MSensoren" - Stau_LP10 : "MSensoren" - Stau_BG3322 : "MSensoren" // Stau am Sensor Einfahrt MA0065 - Stau_BG3327 : "MSensoren" // Stau am Sensor Einfahrt MA0065 - Temp: - T_Ein : Int // Vorgabe Einschaltverzögerung - T_Aus : Int // Zwischenspeicher Ausschaltverzögerung - F1 : Bool // Geschwindigkeit 1 aktiviert - F2 : Bool // Geschwindigkeit 2 aktiviert - F3 : Bool // Geschwindigkeit 3 aktiviert - ESensor : Bool // Sensoren - Antrieb : Bool - VReal : Real // GeschwindigkeitinReal - Zeit : Int // Zeit für Ausschaltverzögerung LT1100 - Aktiv : Bool // Zeit aktivieren - Constant: +FUNCTION_BLOCK "LP_Sensoren" +TITLE = Einige Sensoren entprellen Outbound Leerpuffer +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + Stau_LP1 : "MSensoren"; + Stau_LP2 : "MSensoren"; + Stau_LP3 : "MSensoren"; + Stau_LP4 : "MSensoren"; + Stau_LP5 : "MSensoren"; + Stau_LP6 : "MSensoren"; + Stau_LP7 : "MSensoren"; + Stau_LP8 : "MSensoren"; + Stau_LP9 : "MSensoren"; + Stau_LP10 : "MSensoren"; + Stau_BG3322 : "MSensoren"; // Stau am Sensor Einfahrt MA0065 + Stau_BG3327 : "MSensoren"; // Stau am Sensor Einfahrt MA0065 + END_VAR ---- NW 1: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3320", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) + VAR_TEMP + T_Ein : Int; // Vorgabe Einschaltverzögerung + T_Aus : Int; // Zwischenspeicher Ausschaltverzögerung + F1 : Bool; // Geschwindigkeit 1 aktiviert + F2 : Bool; // Geschwindigkeit 2 aktiviert + F3 : Bool; // Geschwindigkeit 3 aktiviert + ESensor : Bool; // Sensoren + Antrieb : Bool; + VReal : Real; // GeschwindigkeitinReal + Zeit : Int; // Zeit für Ausschaltverzögerung LT1100 + Aktiv : Bool; // Zeit aktivieren + END_VAR ---- NW 2: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3317", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +BEGIN +NETWORK +TITLE = Stau LeerPuffer +//Sensoren entprellen + CALL #Stau_LP1 + ( ESensor := "BG3320" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau LeerPuffer +//Sensoren entprellen + CALL #Stau_LP2 + ( ESensor := "BG3317" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 3: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3316", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau LeerPuffer +//Sensoren entprellen + CALL #Stau_LP3 + ( ESensor := "BG3316" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau LeerPuffer +//Sensoren entprellen + CALL #Stau_LP4 + ( ESensor := "BG3315" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 4: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3315", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau LeerPuffer +//Sensoren entprellen + CALL #Stau_LP5 + ( ESensor := "BG3314" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau LeerPuffer +//Sensoren entprellen + CALL #Stau_LP6 + ( ESensor := "BG3313" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 5: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3314", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau LeerPuffer +//Sensoren entprellen + CALL #Stau_LP7 + ( ESensor := "BG3312" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau LeerPuffer +//Sensoren entprellen + CALL #Stau_LP8 + ( ESensor := "BG3311" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 6: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3313", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau LeerPuffer +//Sensoren entprellen + CALL #Stau_LP9 + ( ESensor := "BG3310" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau LeerPuffer +//Sensoren entprellen + CALL #Stau_LP10 + ( ESensor := "BG3307" , + T_Ein := 01 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 7: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3312", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor vor Beladung +//Sensoren entprellen + CALL #Stau_BG3322 + ( ESensor := "BG3322" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Steigung vor Beladung +//Sensoren entprellen + CALL #Stau_BG3327 + ( ESensor := "BG3327" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 8: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3311", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Ende + BE; - ---- NW 9: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3310", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 10: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3307", T_Ein:=01, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 11: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3322", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 12: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3327", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 13: Ende --- - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Basics/LP_Zylinder.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Basics/LP_Zylinder.awl index a68dc2e..778ddb9 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Basics/LP_Zylinder.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Basics/LP_Zylinder.awl @@ -1,130 +1,262 @@ -=== FB 5192: LP_Zylinder [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Sorter_3305 : "MZylinder" // - Weiche_LP1 : "MZylinder" // - Weiche_LP2 : "MZylinder" - Weiche_LP3 : "MZylinder" - Weiche_LP4 : "MZylinder" - Weiche_LP5 : "MZylinder" - Weiche_LP6 : "MZylinder" - Weiche_LP7 : "MZylinder" - Weiche_LP8 : "MZylinder" - Weiche_LP9 : "MZylinder" - Weiche_LP10 : "MZylinder" - Schleuse_Ausfahrt_LP1 : "MZylinder" // - Schleuse_Ausfahrt_LP2 : "MZylinder" - Schleuse_Ausfahrt_LP3 : "MZylinder" - Schleuse_Ausfahrt_LP4 : "MZylinder" - Schleuse_Ausfahrt_LP5 : "MZylinder" - Schleuse_Ausfahrt_LP6 : "MZylinder" - Schleuse_Ausfahrt_LP7 : "MZylinder" - Schleuse_Ausfahrt_LP8 : "MZylinder" - Schleuse_Ausfahrt_LP9 : "MZylinder" - Schleuse_Ausfahrt_LP10 : "MZylinder" - Temp: - Auto : Bool // Automatik ist aktiv - Hand : Bool // Hand ist aktiv - ZylAst : Bool // Zylinder ansteuern - Constant: +FUNCTION_BLOCK "LP_Zylinder" +TITLE = Zylinder Outbound Leerpuffer +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 + VAR + Sorter_3305 : "MZylinder"; // + Weiche_LP1 : "MZylinder"; // + Weiche_LP2 : "MZylinder"; + Weiche_LP3 : "MZylinder"; + Weiche_LP4 : "MZylinder"; + Weiche_LP5 : "MZylinder"; + Weiche_LP6 : "MZylinder"; + Weiche_LP7 : "MZylinder"; + Weiche_LP8 : "MZylinder"; + Weiche_LP9 : "MZylinder"; + Weiche_LP10 : "MZylinder"; + Schleuse_Ausfahrt_LP1 : "MZylinder"; // + Schleuse_Ausfahrt_LP2 : "MZylinder"; + Schleuse_Ausfahrt_LP3 : "MZylinder"; + Schleuse_Ausfahrt_LP4 : "MZylinder"; + Schleuse_Ausfahrt_LP5 : "MZylinder"; + Schleuse_Ausfahrt_LP6 : "MZylinder"; + Schleuse_Ausfahrt_LP7 : "MZylinder"; + Schleuse_Ausfahrt_LP8 : "MZylinder"; + Schleuse_Ausfahrt_LP9 : "MZylinder"; + Schleuse_Ausfahrt_LP10 : "MZylinder"; + END_VAR ---- NW 1: Übergabe des Bereichstatus System UH07/A01 --- - A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto - - A "DOutbound_Bereich".A01_UH07.BereichErr - AN "SGes".Simulation_ohne_HW_aktiv - JC Next // Zylinder-Stellung nicht mehr ändern + VAR_TEMP + Auto : Bool; // Automatik ist aktiv + Hand : Bool; // Hand ist aktiv + ZylAst : Bool; // Zylinder ansteuern + END_VAR ---- NW 2: Schleuse_3305 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3305", ZylGst:=?) +BEGIN +NETWORK +TITLE = Übergabe des Bereichstatus System UH07/A01 + U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; + U "DOutbound_Bereich".A01_UH07.BereichErr; + UN "SGes".Simulation_ohne_HW_aktiv; + SPB Next ;//Zylinder-Stellung nicht mehr ändern ---- NW 3: Weiche_LP1 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3320", ZylGst:=?) +NETWORK +TITLE = Schleuse_3305 + CALL #Sorter_3305 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3305" + ); +NETWORK +TITLE = Weiche_LP1 + CALL #Weiche_LP1 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3320" + ); ---- NW 4: Weiche_LP2 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3317", ZylGst:=?) +NETWORK +TITLE = Weiche_LP2 + CALL #Weiche_LP2 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3317" + ); +NETWORK +TITLE = Weiche_LP3 + CALL #Weiche_LP3 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3316" + ); ---- NW 5: Weiche_LP3 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3316", ZylGst:=?) +NETWORK +TITLE = Weiche_LP4 + CALL #Weiche_LP4 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3315" + ); +NETWORK +TITLE = Weiche_LP5 + CALL #Weiche_LP5 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3314" + ); ---- NW 6: Weiche_LP4 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3315", ZylGst:=?) +NETWORK +TITLE = Weiche_LP6 + CALL #Weiche_LP6 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3313" + ); +NETWORK +TITLE = Weiche_LP7 + CALL #Weiche_LP7 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3312" + ); ---- NW 7: Weiche_LP5 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3314", ZylGst:=?) +NETWORK +TITLE = Weiche_LP8 + CALL #Weiche_LP8 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3311" + ); +NETWORK +TITLE = Weiche_LP9 + CALL #Weiche_LP9 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3310" + ); ---- NW 8: Weiche_LP6 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3313", ZylGst:=?) +NETWORK +TITLE = Weiche_LP10 + CALL #Weiche_LP10 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 + ); +NETWORK +TITLE = Schleuse_Ausfahrt_LP1 + CALL #Schleuse_Ausfahrt_LP1 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3341" + ); ---- NW 9: Weiche_LP7 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3312", ZylGst:=?) +NETWORK +TITLE = Schleuse_Ausfahrt_LP2 + CALL #Schleuse_Ausfahrt_LP2 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3340" + ); +NETWORK +TITLE = Schleuse_Ausfahrt_LP3 + CALL #Schleuse_Ausfahrt_LP3 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3337" + ); ---- NW 10: Weiche_LP8 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3311", ZylGst:=?) +NETWORK +TITLE = Schleuse_Ausfahrt_LP4 + CALL #Schleuse_Ausfahrt_LP4 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3336" + ); +NETWORK +TITLE = Schleuse_Ausfahrt_LP5 + CALL #Schleuse_Ausfahrt_LP5 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3335" + ); ---- NW 11: Weiche_LP9 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3310", ZylGst:=?) +NETWORK +TITLE = Schleuse_Ausfahrt_LP6 + CALL #Schleuse_Ausfahrt_LP6 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3334" + ); +NETWORK +TITLE = Schleuse_Ausfahrt_LP7 + CALL #Schleuse_Ausfahrt_LP7 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3333" + ); ---- NW 12: Weiche_LP10 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:=?, ZylGst:=?) +NETWORK +TITLE = Schleuse_Ausfahrt_LP8 + CALL #Schleuse_Ausfahrt_LP8 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3332" + ); +NETWORK +TITLE = Schleuse_Ausfahrt_LP9 + CALL #Schleuse_Ausfahrt_LP9 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3331" + ); ---- NW 13: Schleuse_Ausfahrt_LP1 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3341", ZylGst:=?) +NETWORK +TITLE = Schleuse_Ausfahrt_LP10 + CALL #Schleuse_Ausfahrt_LP10 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3330" + ); +NETWORK +TITLE = Ende +Next: BE; ---- NW 14: Schleuse_Ausfahrt_LP2 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3340", ZylGst:=?) - - ---- NW 15: Schleuse_Ausfahrt_LP3 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3337", ZylGst:=?) - - ---- NW 16: Schleuse_Ausfahrt_LP4 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3336", ZylGst:=?) - - ---- NW 17: Schleuse_Ausfahrt_LP5 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3335", ZylGst:=?) - - ---- NW 18: Schleuse_Ausfahrt_LP6 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3334", ZylGst:=?) - - ---- NW 19: Schleuse_Ausfahrt_LP7 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3333", ZylGst:=?) - - ---- NW 20: Schleuse_Ausfahrt_LP8 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3332", ZylGst:=?) - - ---- NW 21: Schleuse_Ausfahrt_LP9 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3331", ZylGst:=?) - - ---- NW 22: Schleuse_Ausfahrt_LP10 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3330", ZylGst:=?) - - ---- NW 23: Ende --- -Next: BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/LP_Bereich.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/LP_Bereich.awl index 13e7403..bde5cdf 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/LP_Bereich.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/LP_Bereich.awl @@ -1,30 +1,30 @@ -=== FC 5100: LP_Bereich [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Constant: - Return: - Ret_Val : Void +FUNCTION "LP_Bereich" : Void +TITLE = Bereich Outbound: Leerpuffer +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 ---- NW 1: Durchfahr- / Saugmodus --- -// In LeerPufferStrecken [FB5431] /Nw8ff +BEGIN +NETWORK +TITLE = Durchfahr- / Saugmodus ---- NW 2: Baustein-Aufrufe --- -CALL FB "LP_Sensoren" , +//In LeerPufferStrecken [FB5431] /Nw8ff +NETWORK +TITLE = Baustein-Aufrufe + CALL "LP_Sensoren", "DLP_Sensoren"; -CALL FB "LP_OmniFahren" , + CALL "LP_OmniFahren", "DLP_OmniFahren"; -CALL FB "LeerPufferStrecken" , + CALL "LeerPufferStrecken", "DLeerPufferStrecken"; -CALL FB "LP_Sorter" , + CALL "LP_Sorter", "DLP_Sorter"; -CALL FB "LP_Auslagern" , + CALL "LP_Auslagern", "DLP_Auslagern"; -CALL FB "LP_Zylinder" , + CALL "LP_Zylinder", "DLP_Zylinder"; +NETWORK +TITLE = Ende + BE; ---- NW 3: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Omnifahren_Leerpuffer/LP_Draussen_FC.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Omnifahren_Leerpuffer/LP_Draussen_FC.awl index e9e7a6a..acff64b 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Omnifahren_Leerpuffer/LP_Draussen_FC.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Omnifahren_Leerpuffer/LP_Draussen_FC.awl @@ -1,37 +1,42 @@ -=== FC 5182: LP_Draussen_FC [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Constant: - Return: - Ret_Val : Void +FUNCTION "LP_Draussen_FC" : Void +TITLE = Draussen-FC: LeerPuffer +{ S7_Optimized_Access := 'FALSE' ; S7_Pass_Registers := 'TRUE' } +AUTHOR : AE +VERSION : 0.1 ---- NW 1: Rückmeldung --- - SET // Rückmeldungen erst mal resetten - R "M180.6" // Weiterfahrt von Ziel-FC erlaubt +BEGIN +NETWORK +TITLE = Rückmeldung + SET;//Rückmeldungen erst mal resetten + R "M180.6";//Weiterfahrt von Ziel-FC erlaubt +NETWORK +TITLE = Schleuse 3305 (vor Sorter LP): Ausgefahren ? + L "MW190"; + L 3305 ;//Aufruf von Schleuse 3305 ? + <>I;//Nein! + SPB X3305E; ---- NW 2: Schleuse 3305 (vor Sorter LP): Ausgefahren ? --- - L "MW190" - L 3305 // Aufruf von Schleuse 3305 ? - <>I // Nein! - JC X3305E + CALL "Reservierung_in_Puffer_eintragen" + ( TrolleyID := "DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_IDX , + Ziel := "DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_DEST_Ziel , + ShopGroup := DINT#0 , + Gesamt_Trolley_DL := 0 + ); -CALL FC "Reservierung_in_Puffer_eintragen" (TrolleyID:="DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_IDX, Ziel:="DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_DEST_Ziel, ShopGroup:=DINT#0, Gesamt_Trolley_DL:=0) +//Daten in Sep 3305 löschen: + L DINT#0; + T "DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_IDX;//IDX + L 0; + T "DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_DEST_Ziel; -// Daten in Sep 3305 löschen: - L DINT#0 - T "DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_IDX // IDX - L 0 - T "DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_DEST_Ziel + BEA; - BEU +X3305E: NOP 0; -X3305E: NOP 0 +NETWORK +TITLE = Ende + BE; - ---- NW 3: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Omnifahren_Leerpuffer/LP_OmniFahren.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Omnifahren_Leerpuffer/LP_OmniFahren.awl index 436dfb2..3a90875 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Omnifahren_Leerpuffer/LP_OmniFahren.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Omnifahren_Leerpuffer/LP_OmniFahren.awl @@ -1,62 +1,83 @@ -=== FB 5128: LP_OmniFahren [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Schleuse_3305 : "MHMOmniSchleuse" - Temp: - ErrQuit : Bool - ErrAnz : Bool - Stau_raus : Bool - Start_ok : Bool - B_aktiv : Bool - B_vor_Schleuse : Bool - B_nach_Schleuse : Bool - Antrieb_aktiv : Bool - Antrieb_start : Bool - Antrieb_stop : Bool - Fahren_Ok : Bool - Antrieb_nicht_stoppen : Bool - Constant: +FUNCTION_BLOCK "LP_OmniFahren" +TITLE = Omnifahren Outbound Leerpuffer +{ S7_Optimized_Access := 'FALSE' } +VERSION : 0.1 + VAR + Schleuse_3305 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + END_VAR ---- NW 1: Systemzeug --- -// Verschiedene Bereiche: - A "DOutbound_Bereich".A01_UH07.AnlageEin - = Schleuse_3305.Dyn.Sk.Auto_akt - - AN "DOutbound_Bereich".A01_UH07.BereichErr - = Schleuse_3305.Dyn.Sk.Bereich_ok + VAR_TEMP + ErrQuit : Bool; + ErrAnz : Bool; + Stau_raus : Bool; + Start_ok : Bool; + B_aktiv : Bool; + B_vor_Schleuse : Bool; + B_nach_Schleuse : Bool; + Antrieb_aktiv : Bool; + Antrieb_start : Bool; + Antrieb_stop : Bool; + Fahren_Ok : Bool; + Antrieb_nicht_stoppen : Bool; + END_VAR ---- NW 2: Störungen quittieren UZ0702 --- - A "DOutbound_Bereich".A01_UZ0702.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit +BEGIN +NETWORK +TITLE = Systemzeug +//Verschiedene Bereiche: + U "DOutbound_Bereich".A01_UH07.AnlageEin; + = #Schleuse_3305.Dyn.Sk.Auto_akt; ---- NW 3: Schleuse 3305 --- -CALL FB "None" , (Schleusen_Nr:=3305, ErrQuit:=ErrQuit, B_VorSchleuse:="BG3304", B_InSchleuse:="BG3305", B_AusSchleuse:=?, B_Stau_raus:=?, Start_Ok:=?, Antrieb_Schleuse_aktiv:="MA0064", Antrieb_plus_aktiv:=?, Schleuse_geöffnet:="MB3305", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:=?, Error:=DB708.DBW524, Antrieb_Schleuse_vor:="DEPtoLP_Antriebe".MA0064.Stat.A_vor, Antrieb_Schleuse_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_Schleuse_stop:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, Antrieb_Schleuse_PS:="DEPtoLP_Antriebe".MA0064.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) // weiterfahrt über Sorter-Sep + UN "DOutbound_Bereich".A01_UH07.BereichErr; + = #Schleuse_3305.Dyn.Sk.Bereich_ok; - AN Schleuse_3305.Dyn.Status.Reset_aktiv - JC NoR3305 +NETWORK +TITLE = Störungen quittieren UZ0702 + U "DOutbound_Bereich".A01_UZ0702.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; - L DINT#0 - T "DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_IDX // IDX - L 0 - T "DLP_Sorter".Sorter_MB3305.Separator.Default_Ziel - T "DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_DEST_Ziel +NETWORK +TITLE = Schleuse 3305 + CALL #Schleuse_3305 + ( Schleusen_Nr := 3305 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG3304" , + B_InSchleuse := "BG3305" , + B_AusSchleuse := , //weiterfahrt über Sorter-Sep + Antrieb_Schleuse_aktiv := "MA0064" , + Schleuse_geöffnet := "MB3305" , + Error := %DB708.DBW524 , + Antrieb_Schleuse_vor := "DEPtoLP_Antriebe".MA0064.Stat.A_vor , + Antrieb_Schleuse_start := "DEPtoLP_Antriebe".MA0064.Stat.A_start , + Antrieb_Schleuse_stop := "DEPtoLP_Antriebe".MA0064.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DEPtoLP_Antriebe".MA0064.Stat.A_PS , + hStOk := #ErrAnz + ); -NoR3305: NOP 0 + UN #Schleuse_3305.Dyn.Status.Reset_aktiv; + SPB NoR3305; + L DINT#0; + T "DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_IDX;//IDX + L 0; + T "DLP_Sorter".Sorter_MB3305.Separator.Default_Ziel; + T "DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_DEST_Ziel; ---- NW 4: Störungen anzeigen UZ0702 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ0702.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken +NoR3305: NOP 0; +NETWORK +TITLE = Störungen anzeigen UZ0702 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ0702.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; ---- NW 5: Ende --- - BE +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Omnifahren_Leerpuffer/LP_Ziel_FC.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Omnifahren_Leerpuffer/LP_Ziel_FC.awl index 89a163c..d9787b1 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Omnifahren_Leerpuffer/LP_Ziel_FC.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Omnifahren_Leerpuffer/LP_Ziel_FC.awl @@ -1,119 +1,132 @@ -=== FC 5181: LP_Ziel_FC [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Ziel_hex : Word - Ziel_int : Int - Zielebene : Word - Error : Byte - Position : Int - Lager_DB : Int - Lager_DW : Int - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - SSDW : Int - EndZiel : Word - Variante : Int - AbrufID : DInt - Fahrlisten_TrolleyID : DInt - Fahrlisten_AbrufID : DInt - Fahrlisten_Lager : Int - Trolley_unbekannt : Bool // Trolley ist nicht in DL - Express_Abruf : Bool - Constant: - Return: - Ret_Val : Void - ---- NW 1: Rückmeldung --- - SET // Rückmeldungen erst mal resetten - R "M180.6" // Weiterfahrt von Ziel-FC erlaubt +FUNCTION "LP_Ziel_FC" : Void +TITLE = Ziel-FC: LeerPuffer_OmniFahren +{ S7_Optimized_Access := 'FALSE' ; S7_Pass_Registers := 'TRUE' } +AUTHOR : AE +VERSION : 0.1 + VAR_TEMP + Ziel_hex : Word; + Ziel_int : Int; + Zielebene : Word; + Error : Byte; + Position : Int; + Lager_DB : Int; + Lager_DW : Int; + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + SSDW : Int; + EndZiel : Word; + Variante : Int; + AbrufID : DInt; + Fahrlisten_TrolleyID : DInt; + Fahrlisten_AbrufID : DInt; + Fahrlisten_Lager : Int; + Trolley_unbekannt : Bool; // Trolley ist nicht in DL + Express_Abruf : Bool; + END_VAR ---- NW 2: Schleuse 3305: Weiterfahren erlaubt ? (Sorter LP) --- - L "MW190" - L 3305 // Aufruf von Schleuse 3305 ? - <>I // Nein! - JC X3305E +BEGIN +NETWORK +TITLE = Rückmeldung + SET;//Rückmeldungen erst mal resetten + R "M180.6";//Weiterfahrt von Ziel-FC erlaubt - A "MB3305" - BEC +NETWORK +TITLE = Schleuse 3305: Weiterfahren erlaubt ? (Sorter LP) + L "MW190"; + L 3305 ;//Aufruf von Schleuse 3305 ? + <>I;//Nein! + SPB X3305E; -// Leer-Puffer ermitteln: -CALL FC "Leerpuffer to Rein-Lager ermitteln" (Puffer:=Ziel_hex) + U "MB3305"; + BEB; -// Ziel = Leer-Lager? - L Ziel_hex - L 16#f000 - AW - L 16#A000 // Ziel = Leer-Lager ? - ==I // Ja! - JC LagerOk_3305 +//Leer-Puffer ermitteln: + CALL "Leerpuffer_Rein-Lager ermitteln" + ( Puffer := #Ziel_hex + ); - BEU // Kein Lager frei! +//Ziel = Leer-Lager? + L #Ziel_hex; + L 16#f000; + UW; + L 16#A000 ;//Ziel = Leer-Lager ? + ==I ;//Ja! + SPB LagerOk_3305; -LagerOk_3305: L Ziel_hex - L 16#FF - AW - BTI // Damit Int 1-10 als Ziel ! - T Ziel_int + BEA ;//Kein Lager frei! -// Check, ob Ziel-Lager Inilauf aktiv hat: - T "MW220" +LagerOk_3305: L #Ziel_hex; + L 16#FF; + UW; + BTI ;//Damit Int 1-10 als Ziel ! + T #Ziel_int; -CALL FC "DatenOut" (SSDB:=275, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=P#M220.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:=Position) // Eintrag lesen +//Check, ob Ziel-Lager Inilauf aktiv hat: + T "MW220"; - L "MB199" - L 2#1111111 // Bit 7 ausblenden - AW - L 0 // Fehler vorhanden? - <>I // Ja - JC Egal + CALL "DatenOut" + ( SSDB := 275 , + SSDW := 0 , + PARA := 16#0000 , //Eintrag lesen + SEARCHDATEN := P#M220.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := #Position + ); - L "MW224" - T Lager_DB - L "MW226" - T Lager_DW - ITD - T AR1Start // Startwert mit Offset 0 + L "MB199"; + L 2#1111111 ;//Bit 7 ausblenden + UW; + L 0;//Fehler vorhanden? + <>I;//Ja + SPB Egal; - L AR1Start // Startwert mit Offset 0 - + DINT#70 // Offset Status (Bit 7: Inilauf) - SLD 3 - L 7 // Damit DBX_Bit 7 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + L "MW224"; + T #Lager_DB; + L "MW226"; + T #Lager_DW; + ITD; + T #AR1Start;//Startwert mit Offset 0 - OPN DB[Lager_DB] // Lager-DB öffnen + L #AR1Start;//Startwert mit Offset 0 + + DINT#70 ;//Offset Status (Bit 7: Inilauf) + SLD 3; + L 7 ;//Damit DBX_Bit 7 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A DBX [AR1Zeiger] // Lager hat Inilauf aktiv - BEC // Sonst kann der Inilauf nie beendet werden! + AUF DB[ #Lager_DB] ;//Lager-DB öffnen -Egal: L Ziel_int - T "DLP_Sorter".Sorter_MB3305.Separator.Default_Ziel - T "DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_DEST_Ziel + U DBX[ #AR1Zeiger] ;//Lager hat Inilauf aktiv + BEB;//Sonst kann der Inilauf nie beendet werden! -// Pseudo-IDX übergeben: - L "DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_IDX // IDX - L DINT#0 // Daten schon erzeugt? - <>D // Ja! - BEC +Egal: L #Ziel_int; + T "DLP_Sorter".Sorter_MB3305.Separator.Default_Ziel; + T "DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_DEST_Ziel; - L "DLP_Sorter".Pseudo_IDX // Da kein Leser verbaut - L dint#1 - +D - T "DLP_Sorter".Pseudo_IDX - T "DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_IDX // IDX +//Pseudo-IDX übergeben: + L "DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_IDX;//IDX + L DINT#0 ;//Daten schon erzeugt? + <>D;//Ja! + BEB; - CLR // Wird über MSorterRein (FB5423/5) gestartet! - S "M180.6" // Weiterfahrt ist erlaubt + L "DLP_Sorter".Pseudo_IDX;//Da kein Leser verbaut + L dint#1; + +D; + T "DLP_Sorter".Pseudo_IDX; + T "DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_IDX;//IDX - BEU + CLR ;//Wird über MSorterRein (FB5423/5) gestartet! + S "M180.6" ;//Weiterfahrt ist erlaubt -X3305E: NOP 0 + BEA; +X3305E: NOP 0; ---- NW 3: Ende --- - BE +NETWORK +TITLE = Ende + BE; + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Sorter_Leerpuffer/LP_Sorter.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Sorter_Leerpuffer/LP_Sorter.awl index d4ffc2b..7e51841 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Sorter_Leerpuffer/LP_Sorter.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/5_Leerpuffer/Sorter_Leerpuffer/LP_Sorter.awl @@ -1,358 +1,532 @@ -=== FB 5423: LP_Sorter [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Sorter_MB3305 : "MSepSorterRein" - Sync_BG3306 : "MStartSync" - Weiche_LP1 : "MWeiche_Sorter" - Weiche_LP2 : "MWeiche_Sorter" - Weiche_LP3 : "MWeiche_Sorter" - Weiche_LP4 : "MWeiche_Sorter" - Weiche_LP5 : "MWeiche_Sorter" - Weiche_LP6 : "MWeiche_Sorter" - Weiche_LP7 : "MWeiche_Sorter" - Weiche_LP8 : "MWeiche_Sorter" - Weiche_LP9 : "MWeiche_Sorter" - Weiche_LP10 : "MWeiche_Sorter" - Impuls_BG3374 : "MImpulsGeber" - Pseudo_IDX : DInt // Pseudo-Trolley-Nr. da kein Leser vor Sorter - Ohne_PC_fahren : Bool - Input: - Output: - InOut: - Static: - Dyn : Struct - GesamtSorterReset : Bool := 1 - Temp: - ErrQuit : Bool - ErrAnz : Bool - Antrieb : Bool - Stau : Bool - Start_Ok : Bool - SorterReset : Bool - Error_aktiv : Bool - Leer : Bool - Err_DW : DInt - Err_Bits : Int - Constant: - ---- NW 1: Systemzeug --- - A "DOutbound_Bereich".A01_UH07.AnlageEin - = Sorter_MB3305.Dyn.Sk.Auto_akt - - AN "DOutbound_Bereich".A01_UH07.BereichErr - = Sorter_MB3305.Dyn.Sk.Bereich_ok - -// Bereichshalt: - CLR // nicht verbaut - R Sorter_MB3305.Dyn.Sk.Bereich_ok - -// Sonderbetriebsarten Weichen: - CLR - = Weiche_LP1.Dyn.Status.Weichentest_aktiv - = Weiche_LP2.Dyn.Status.Weichentest_aktiv - = Weiche_LP3.Dyn.Status.Weichentest_aktiv - = Weiche_LP4.Dyn.Status.Weichentest_aktiv - = Weiche_LP5.Dyn.Status.Weichentest_aktiv - = Weiche_LP6.Dyn.Status.Weichentest_aktiv - = Weiche_LP7.Dyn.Status.Weichentest_aktiv - = Weiche_LP8.Dyn.Status.Weichentest_aktiv - = Weiche_LP9.Dyn.Status.Weichentest_aktiv - = Weiche_LP10.Dyn.Status.Weichentest_aktiv - - A Sync_BG3306.Dyn.Status.TeachModus_Aktiv - = Weiche_LP1.Dyn.Status.TeachModus_aktiv - = Weiche_LP2.Dyn.Status.TeachModus_aktiv - = Weiche_LP3.Dyn.Status.TeachModus_aktiv - = Weiche_LP4.Dyn.Status.TeachModus_aktiv - = Weiche_LP5.Dyn.Status.TeachModus_aktiv - = Weiche_LP6.Dyn.Status.TeachModus_aktiv - = Weiche_LP7.Dyn.Status.TeachModus_aktiv - = Weiche_LP8.Dyn.Status.TeachModus_aktiv - = Weiche_LP9.Dyn.Status.TeachModus_aktiv - = Weiche_LP10.Dyn.Status.TeachModus_aktiv - - CLR - = Sorter_MB3305.Dyn.Error.Korrektur_Modus_aktiv - - L 5474 // DLSeps - T "MW174" - L 5478 // DLWeichen - T "MW178" - -// Nach neuen Daten suchen: - A "1s-Impuls" - = "Weiche_NewData" - - ---- NW 2: Linien mit PLC_Ziel anfahren --- - A Ohne_PC_fahren - JCN En03 - - A "MB3121" - O "MB3123" - CU "Z102" - - L "Z102" - L 1 - I // Ja ! - ) - JC En03 - - SET - R "Z102" - - L Sorter_MB3305.Separator.Default_Ziel - L 0 // unbekannt ? - ==I - L 5030 // Beginn mit Ausfahrziel 1.Puffer - JC X399 - -// Nächste Weiche suchen: - L Sorter_MB3305.Separator.Default_Ziel - T "MW200" - -CALL FC "DatenOut" (SSDB:="MW178", SSDW:=0, PARA:=WORD#16#0E00, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M200.0, Position:="MW196") // Nach angegeben Datenbyte suchen (Abzweig-Ziel) - - AN "M199.7" // Datensatz ist nicht vorhanden - O "M208.0" // Letzte Weiche - L 0 // Neubeginn - JC X400 - -X398: CALL FC "DatenOut" (SSDB:="MW178", SSDW:=0, PARA:=WORD#16#FF00, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M200.0, Position:="MW196") // Nächsten Datensatz lesen - - L "MW206" // Weichentyp - L 178 // Sorterweiche ? - <>I // Nein! - O "M199.2" // Ende erreicht - L 0 - JC X400 - - A "M208.5" // Weiche für PLC-Ziel disabled ! - JC X398 - - L "MW226" - T Sorter_MB3305.Separator.Default_Ziel - - JU En03 - -// 1.Weiche checken: -X399: T "MW200" - -CALL FC "DatenOut" (SSDB:="MW178", SSDW:=0, PARA:=WORD#16#0E00, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M200.0, Position:="MW196") // Nach angegeben Datenbyte suchen (Abzweig-Ziel) - - AN "M199.7" // Datensatz ist nicht vorhanden - JC En03 - - A "M208.5" // Weiche für PLC-Ziel disabled ! - JC X398 - - L "MW226" -X400: T Sorter_MB3305.Separator.Default_Ziel - -En03: NOP 0 - - ---- NW 3: Störung vorhanden ? --- -CALL FC "Err_vorhanden" (Check_DB:=708, Anfangs_DW:=DINT#100, Ende_DW:=DINT#122, Stoerung:=Error_aktiv, ErrDW:=Err_DW, ErrBits:=Err_Bits) // Störungsanzeige - A Error_aktiv // s.o. - = Error_aktiv // Sorter Lager Weichen-Störung (Sorter-Antrieb gestoppt!) - - A "BG3306" // Verlassen-Sensor - L S5T#250MS - OffDelay "T540" - - ---- NW 4: Störung quittieren UH07 --- - A "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 5: Sorter-GesamtReset --- -// Sorter-Reset starten: - A "DLP_OmniFahren".Schleuse_3305.Dyn.Status.Reset_aktiv // Bei Schleusen-Reset -> Sorter mit resetten! - AN "DLP_Sorter".Sorter_MB3305.Dyn.GesamtSorterReset_aktiv - S "DLP_Sorter".Sorter_MB3305.Dyn.GesamtSorterReset - - ---- NW 6: Separator 3305 vor Sorter --- - L DB708.DBW102 // Err beim Synchronisieren - L 0 // Störung vorhanden ? - ==I // Nein ! - AN Sync_BG3306.Dyn.Stop // Rein-Separator stoppen - AN Error_aktiv // Sorter Batch Weichen-Störung (Sorter-Antrieb gestoppt!) - AN Sorter_MB3305.Dyn.GesamtSorterReset_aktiv - = Start_Ok - - SET // Da Leiste im Sep und Zusatz-Zylinder im Separator -> BT steht sofort sauber im Sep - S Sorter_MB3305.Dyn.BT_beruhigt // 1. einfahrender BügelTräger ist im Sep - - A "T540" - = Sorter_MB3305.B_AusSep // Entprellung Verlassen-Sensor - -// Triggern / Scanner-Auswertung über HW>VP_Omnifahren (FC128/27) -// Ziel über Default-Ziel (HW>VP_Ziel_FC, FC181) - -CALL FB "None" , (Separator_Nr:=3305, ErrQuit:=ErrQuit, B_VorSep:=?, B_ImSep:="BG3305", B_AusSep:=?, B_Beladen_im_Sep:=?, B_Pinsensor:="BG3374", B_Beladen_nach_Sep:=?, Start_Ok:=Start_Ok, Antrieb_aktiv:="MA0064", Antrieb_plus_aktiv:="MA0064", Y_Sep_Auf:="DLP_Zylinder".Sorter_3305.Stat.Ast, K_Sanner_triggern:=?, Sorter_Reset:=SorterReset, Error:=DB708.DBW100, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_plus_start:="DEPtoLP_Antriebe".MA0064.Stat.A_vor, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz) - -// Default-Ziel jeden Zyklus neu!: - L 0 - T Sorter_MB3305.Separator.Default_Ziel - - ---- NW 7: Reset ist aktiv --- - A Sorter_MB3305.Dyn.GesamtSorterReset_aktiv - = "7_HMI_Err_UH07_OB".Sorter_MB3305.Reset_aktiv - - A Sorter_MB3305.Dyn.GesamtSorterReset_aktiv - = Weiche_LP1.Dyn.Ohne_VerklemmKontrolle - = Weiche_LP2.Dyn.Ohne_VerklemmKontrolle - = Weiche_LP3.Dyn.Ohne_VerklemmKontrolle - = Weiche_LP4.Dyn.Ohne_VerklemmKontrolle - = Weiche_LP5.Dyn.Ohne_VerklemmKontrolle - = Weiche_LP6.Dyn.Ohne_VerklemmKontrolle - = Weiche_LP7.Dyn.Ohne_VerklemmKontrolle - = Weiche_LP8.Dyn.Ohne_VerklemmKontrolle - = Weiche_LP9.Dyn.Ohne_VerklemmKontrolle - = Weiche_LP10.Dyn.Ohne_VerklemmKontrolle - -// Diesen Sorterbereich zurücksetzen: - A SorterReset // Ein Zyklus - S Sync_BG3306.Dyn.Reset - S Weiche_LP1.Dyn.Status.Reset - S Weiche_LP2.Dyn.Status.Reset - S Weiche_LP3.Dyn.Status.Reset - S Weiche_LP4.Dyn.Status.Reset - S Weiche_LP5.Dyn.Status.Reset - S Weiche_LP6.Dyn.Status.Reset - S Weiche_LP7.Dyn.Status.Reset - S Weiche_LP8.Dyn.Status.Reset - S Weiche_LP9.Dyn.Status.Reset - S Weiche_LP10.Dyn.Status.Reset - - ---- NW 8: Inkremente über Zahnrad-Sensor --- -CALL FB "None" , (Ink_DB:=5483, B_Zaehlen:="BG3374", Antrieb_aktiv:="MA0064", Quit:=ErrQuit, Zeit_Signal_zu_lang:=?, Zeit_Kein_Signal:=?, Signal:=?, Err_Kein_Signal:="7_HMI_Err_UH07_OB".Impulsgeber_3374.Kein_Signal, Err_Signal_zu_lang:="7_HMI_Err_UH07_OB".Impulsgeber_3374.Signal_zu_lang) - - A( - O "7_HMI_Err_UH07_OB".Impulsgeber_3374.Kein_Signal - O "7_HMI_Err_UH07_OB".Impulsgeber_3374.Signal_zu_lang - ) - AN ErrQuit - S "DEPtoLP_Antriebe".MA0064.Stat.Stop_vor - - A( - O "7_HMI_Err_UH07_OB".Impulsgeber_3374.Kein_Signal - O "7_HMI_Err_UH07_OB".Impulsgeber_3374.Signal_zu_lang - ) - S ErrAnz - - ---- NW 9: Trolley synchronisieren BG3306 --- -// Teachen: Ref-Sensor ueber Sync-Sensor - A "BG3306" - AN Sync_BG3306.Dyn.Refpunkt_ok // Nur eimalige Auswertung - = Sync_BG3306.B_RefPunkt // uebergabe fuer unten - - A "MA0064" - L S5T#500ms - OffDelay "T543" - A "T543" - AN Sync_BG3306.Dyn.Status.TeachModus_Aktiv // sonst Probleme bei Doppelimpuls - O - A "MA0064" - A Sync_BG3306.Dyn.Status.TeachModus_Aktiv // sonst Probleme bei Doppelimpuls - = Antrieb - -// Keine Hauptstrangdaten vorhanden ? (Fuer Sync-Pkt): - L "LP_HS_oF".Datensortkopf.AnzahlEintraege - L "LP_HS_mF".Datensortkopf.AnzahlEintraege - +I - L 0 // Daten vorhanden ? - ==I // Nein ! - = "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - - A "BG3306" - L s5t#500ms // Da trotz Entprellung Doppel-Impulse - OffDelay "T544" - A "T544" - = Sync_BG3306.B_BT_da - -CALL FB "None" , (Sync_Nr:=3306, ErrQuit:=ErrQuit, B_BT_da:=?, B_RefPunkt:=?, B_TeachPunk:=?, Antrieb_aktiv:=Antrieb, Error:=DB708.DBW102, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, hStOk:=ErrAnz) // Teach-Sensor - - A Sync_BG3306.Dyn.Error.Inkrementalgeber - S "DEPtoLP_Antriebe".MA0064.Stat.Stop_vor - -// Keine Hauptstrangdaten vorhanden ?: - L "LP_HS_oF".Datensortkopf.AnzahlEintraege - L "LP_HS_mF".Datensortkopf.AnzahlEintraege - +I - L 0 // Daten vorhanden ? - ==I // Nein ! - = "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - -// Spezial, da Sorter-Antrieb über SorterRein-Sep geht!: (Sonst Antriebs-Stop wegen PS) - AN "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - O "MB3305" // Neuer Sort-Trolley kommt - O "BG3306" - L s5t#20s - OffDelay "T541" - - A "T541" // Alle Sort-Trolleys sind ins Puffer ausgefahren - S "DEPtoLP_Antriebe".MA0064.Stat.A_vor - - ---- NW 10: Weiche 3320 / Leerpuffer LP1 --- -CALL FB "None" , (Weichen_Nr:=1, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DLP_Sensoren".Stau_LP1.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3320", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DLP_Zylinder".Weiche_LP1.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW104, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 11: Weiche 3317 / Leerpuffer LP2 --- -CALL FB "None" , (Weichen_Nr:=2, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DLP_Sensoren".Stau_LP2.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3317", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DLP_Zylinder".Weiche_LP2.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW106, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 12: Weiche 3316 / Leerpuffer LP3 --- -CALL FB "None" , (Weichen_Nr:=3, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DLP_Sensoren".Stau_LP3.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3316", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DLP_Zylinder".Weiche_LP3.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW108, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 13: Weiche 3315 / Leerpuffer LP4 --- -CALL FB "None" , (Weichen_Nr:=4, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DLP_Sensoren".Stau_LP4.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3315", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DLP_Zylinder".Weiche_LP4.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW110, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 14: Weiche 3314 / Leerpuffer LP5 --- -CALL FB "None" , (Weichen_Nr:=5, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DLP_Sensoren".Stau_LP5.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3314", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DLP_Zylinder".Weiche_LP5.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW112, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 15: Weiche 3313 / Leerpuffer LP6 --- -CALL FB "None" , (Weichen_Nr:=6, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DLP_Sensoren".Stau_LP6.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3313", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DLP_Zylinder".Weiche_LP6.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW114, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 16: Weiche 3312 / Leerpuffer LP7 --- -CALL FB "None" , (Weichen_Nr:=7, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DLP_Sensoren".Stau_LP7.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3312", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DLP_Zylinder".Weiche_LP7.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW116, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 17: Weiche 3311 / Leerpuffer LP8 --- -CALL FB "None" , (Weichen_Nr:=8, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DLP_Sensoren".Stau_LP8.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3311", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DLP_Zylinder".Weiche_LP8.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW118, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 18: Weiche 3310 / Leerpuffer LP9 --- -CALL FB "None" , (Weichen_Nr:=9, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DLP_Sensoren".Stau_LP9.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3310", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DLP_Zylinder".Weiche_LP9.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW120, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 19: Pseudo-Weiche / Leerpuffer LP10 --- -CALL FB "None" , (Weichen_Nr:=10, KorrekturFaktor:=?, ErrQuit:=ErrQuit, Stau_Ausfahrtbereich:="DLP_Sensoren".Stau_LP10.Stat.B_Akt, B_Gerade:=?, B_Ausfahrt:="BG3307", Antrieb_aktiv:=Antrieb, Y_Weiche_abzweigen:="DLP_Zylinder".Weiche_LP10.Stat.Ast, Y_Weiche_geradeaus:=?, Error:=DB708.DBW122, Antrieb_start:="DEPtoLP_Antriebe".MA0064.Stat.A_start, Antrieb_stoppen:="DEPtoLP_Antriebe".MA0064.Stat.Stop_vor, hStOk:=ErrAnz) - - ---- NW 20: Störungen anzeigen UH07 --- - A ErrAnz - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 21: Ende --- - BE +FUNCTION_BLOCK "LP_Sorter" +TITLE = Sorter Leerpuffer 1-10 +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + Sorter_MB3305 : "MSepSorterRein"; + Sync_BG3306 : "MStartSync"; + Weiche_LP1 : "MWeiche_Sorter"; + Weiche_LP2 : "MWeiche_Sorter"; + Weiche_LP3 : "MWeiche_Sorter"; + Weiche_LP4 : "MWeiche_Sorter"; + Weiche_LP5 : "MWeiche_Sorter"; + Weiche_LP6 : "MWeiche_Sorter"; + Weiche_LP7 : "MWeiche_Sorter"; + Weiche_LP8 : "MWeiche_Sorter"; + Weiche_LP9 : "MWeiche_Sorter"; + Weiche_LP10 : "MWeiche_Sorter"; + Impuls_BG3374 : "MImpulsGeber"; + Pseudo_IDX { S7_SetPoint := 'True'} : DInt; // Pseudo-Trolley-Nr. da kein Leser vor Sorter + Ohne_PC_fahren { S7_SetPoint := 'True'} : Bool; + END_VAR + + VAR_TEMP + ErrQuit : Bool; + ErrAnz : Bool; + Antrieb : Bool; + Stau : Bool; + Start_Ok : Bool; + SorterReset : Bool; + Error_aktiv : Bool; + Leer : Bool; + Err_DW : DInt; + Err_Bits : Int; + END_VAR + + +BEGIN +NETWORK +TITLE = Systemzeug + U "DOutbound_Bereich".A01_UH07.AnlageEin; + = #Sorter_MB3305.Dyn.Sk.Auto_akt; + + UN "DOutbound_Bereich".A01_UH07.BereichErr; + = #Sorter_MB3305.Dyn.Sk.Bereich_ok; + +//Bereichshalt: + CLR;//nicht verbaut + R #Sorter_MB3305.Dyn.Sk.Bereich_ok; + +//Sonderbetriebsarten Weichen: + CLR; + = #Weiche_LP1.Dyn.Status.Weichentest_aktiv; + = #Weiche_LP2.Dyn.Status.Weichentest_aktiv; + = #Weiche_LP3.Dyn.Status.Weichentest_aktiv; + = #Weiche_LP4.Dyn.Status.Weichentest_aktiv; + = #Weiche_LP5.Dyn.Status.Weichentest_aktiv; + = #Weiche_LP6.Dyn.Status.Weichentest_aktiv; + = #Weiche_LP7.Dyn.Status.Weichentest_aktiv; + = #Weiche_LP8.Dyn.Status.Weichentest_aktiv; + = #Weiche_LP9.Dyn.Status.Weichentest_aktiv; + = #Weiche_LP10.Dyn.Status.Weichentest_aktiv; + + U #Sync_BG3306.Dyn.Status.TeachModus_Aktiv; + = #Weiche_LP1.Dyn.Status.TeachModus_aktiv; + = #Weiche_LP2.Dyn.Status.TeachModus_aktiv; + = #Weiche_LP3.Dyn.Status.TeachModus_aktiv; + = #Weiche_LP4.Dyn.Status.TeachModus_aktiv; + = #Weiche_LP5.Dyn.Status.TeachModus_aktiv; + = #Weiche_LP6.Dyn.Status.TeachModus_aktiv; + = #Weiche_LP7.Dyn.Status.TeachModus_aktiv; + = #Weiche_LP8.Dyn.Status.TeachModus_aktiv; + = #Weiche_LP9.Dyn.Status.TeachModus_aktiv; + = #Weiche_LP10.Dyn.Status.TeachModus_aktiv; + + CLR; + = #Sorter_MB3305.Dyn.Error.Korrektur_Modus_aktiv; + + L 5474 ;//DLSeps + T "MW174"; + L 5478 ;//DLWeichen + T "MW178"; + +//Nach neuen Daten suchen: + U "1s-Impuls"; + = "Weiche_NewData"; + +NETWORK +TITLE = Linien mit PLC_Ziel anfahren + U #Ohne_PC_fahren; + SPBN En03; + + U "MB3121"; + O "MB3123"; + ZV "Z102"; + + L "Z102"; + L 1; + I;//Ja ! + ); + SPB En03; + + SET; + R "Z102"; + + L #Sorter_MB3305.Separator.Default_Ziel; + L 0 ;//unbekannt ? + ==I; + L 5030 ;//Beginn mit Ausfahrziel 1.Puffer + SPB X399; + +//Nächste Weiche suchen: + L #Sorter_MB3305.Separator.Default_Ziel; + T "MW200"; + + CALL "DatenOut" + ( SSDB := "MW178" , + SSDW := 0 , + PARA := WORD#16#0E00 , //Nach angegeben Datenbyte suchen (Abzweig-Ziel) + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M200.0 , + Position := "MW196" + ); + + UN "M199.7" ;//Datensatz ist nicht vorhanden + O "M208.0" ;//Letzte Weiche + L 0;//Neubeginn + SPB X400; + +X398: CALL "DatenOut" + ( SSDB := "MW178" , + SSDW := 0 , + PARA := WORD#16#FF00 , //Nächsten Datensatz lesen + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M200.0 , + Position := "MW196" + ); + + L "MW206";//Weichentyp + L 178;//Sorterweiche ? + <>I;//Nein! + O "M199.2" ;//Ende erreicht + L 0; + SPB X400; + + U "M208.5" ;//Weiche für PLC-Ziel disabled ! + SPB X398; + + L "MW226"; + T #Sorter_MB3305.Separator.Default_Ziel; + + SPA En03; + +//1.Weiche checken: +X399: T "MW200"; + + CALL "DatenOut" + ( SSDB := "MW178" , + SSDW := 0 , + PARA := WORD#16#0E00 , //Nach angegeben Datenbyte suchen (Abzweig-Ziel) + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M200.0 , + Position := "MW196" + ); + + UN "M199.7" ;//Datensatz ist nicht vorhanden + SPB En03; + + U "M208.5" ;//Weiche für PLC-Ziel disabled ! + SPB X398; + + L "MW226"; +X400: T #Sorter_MB3305.Separator.Default_Ziel; + +En03: NOP 0; + +NETWORK +TITLE = Störung vorhanden ? + CALL "Err_vorhanden" //Störungsanzeige + ( Check_DB := 708 , + Anfangs_DW := DINT#100 , + Ende_DW := DINT#122 , + Stoerung := #Error_aktiv , + ErrDW := #Err_DW , + ErrBits := #Err_Bits + ); + U #Error_aktiv ;//s.o. + = #Error_aktiv ;//Sorter Lager Weichen-Störung (Sorter-Antrieb gestoppt!) + + U "BG3306" ;//Verlassen-Sensor + L S5T#250MS; + SA "T540"; + +NETWORK +TITLE = Störung quittieren UH07 + U "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Sorter-GesamtReset + +//Sorter-Reset starten: + U "DLP_OmniFahren".Schleuse_3305.Dyn.Status.Reset_aktiv;//Bei Schleusen-Reset -> Sorter mit resetten! + UN "DLP_Sorter".Sorter_MB3305.Dyn.GesamtSorterReset_aktiv; + S "DLP_Sorter".Sorter_MB3305.Dyn.GesamtSorterReset; + +NETWORK +TITLE = Separator 3305 vor Sorter + L %DB708.DBW102 ;//Err beim Synchronisieren + L 0;//Störung vorhanden ? + ==I;//Nein ! + UN #Sync_BG3306.Dyn.Stop;//Rein-Separator stoppen + UN #Error_aktiv;//Sorter Batch Weichen-Störung (Sorter-Antrieb gestoppt!) + UN #Sorter_MB3305.Dyn.GesamtSorterReset_aktiv; + = #Start_Ok; + + SET ;//Da Leiste im Sep und Zusatz-Zylinder im Separator -> BT steht sofort sauber im Sep + S #Sorter_MB3305.Dyn.BT_beruhigt;//1. einfahrender BügelTräger ist im Sep + + U "T540"; + = #Sorter_MB3305.B_AusSep;//Entprellung Verlassen-Sensor + +//Triggern / Scanner-Auswertung über HW>VP_Omnifahren (FC128/27) +//Ziel über Default-Ziel (HW>VP_Ziel_FC, FC181) + + CALL #Sorter_MB3305 + ( Separator_Nr := 3305 , + ErrQuit := #ErrQuit , + B_ImSep := "BG3305" , + B_Pinsensor := "BG3374" , + Start_Ok := #Start_Ok , + Antrieb_aktiv := "MA0064" , + Antrieb_plus_aktiv := "MA0064" , + Y_Sep_Auf := "DLP_Zylinder".Sorter_3305.Stat.Ast , + Sorter_Reset := #SorterReset , + Error := %DB708.DBW100 , + Antrieb_start := "DEPtoLP_Antriebe".MA0064.Stat.A_start , + Antrieb_plus_start := "DEPtoLP_Antriebe".MA0064.Stat.A_vor , + Antrieb_stoppen := "DEPtoLP_Antriebe".MA0064.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +//Default-Ziel jeden Zyklus neu!: + L 0; + T #Sorter_MB3305.Separator.Default_Ziel; + +NETWORK +TITLE = Reset ist aktiv + U #Sorter_MB3305.Dyn.GesamtSorterReset_aktiv; + = "7_HMI_Err_UH07_OB".Sorter_MB3305.Reset_aktiv; + + U #Sorter_MB3305.Dyn.GesamtSorterReset_aktiv; + = #Weiche_LP1.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_LP2.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_LP3.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_LP4.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_LP5.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_LP6.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_LP7.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_LP8.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_LP9.Dyn.Ohne_VerklemmKontrolle; + = #Weiche_LP10.Dyn.Ohne_VerklemmKontrolle; + +//Diesen Sorterbereich zurücksetzen: + U #SorterReset;//Ein Zyklus + S #Sync_BG3306.Dyn.Reset; + S #Weiche_LP1.Dyn.Status.Reset; + S #Weiche_LP2.Dyn.Status.Reset; + S #Weiche_LP3.Dyn.Status.Reset; + S #Weiche_LP4.Dyn.Status.Reset; + S #Weiche_LP5.Dyn.Status.Reset; + S #Weiche_LP6.Dyn.Status.Reset; + S #Weiche_LP7.Dyn.Status.Reset; + S #Weiche_LP8.Dyn.Status.Reset; + S #Weiche_LP9.Dyn.Status.Reset; + S #Weiche_LP10.Dyn.Status.Reset; + +NETWORK +TITLE = Inkremente über Zahnrad-Sensor + CALL #Impuls_BG3374 + ( Ink_DB := 5483 , + B_Zaehlen := "BG3374" , + Antrieb_aktiv := "MA0064" , + Quit := #ErrQuit , + Err_Kein_Signal := "7_HMI_Err_UH07_OB".Impulsgeber_3374.Kein_Signal , + Err_Signal_zu_lang := "7_HMI_Err_UH07_OB".Impulsgeber_3374.Signal_zu_lang + ); + + U(; + O "7_HMI_Err_UH07_OB".Impulsgeber_3374.Kein_Signal; + O "7_HMI_Err_UH07_OB".Impulsgeber_3374.Signal_zu_lang; + ); + UN #ErrQuit; + S "DEPtoLP_Antriebe".MA0064.Stat.Stop_vor; + + U(; + O "7_HMI_Err_UH07_OB".Impulsgeber_3374.Kein_Signal; + O "7_HMI_Err_UH07_OB".Impulsgeber_3374.Signal_zu_lang; + ); + S #ErrAnz; + +NETWORK +TITLE = Trolley synchronisieren BG3306 + +//Teachen: Ref-Sensor ueber Sync-Sensor + U "BG3306"; + UN #Sync_BG3306.Dyn.Refpunkt_ok;//Nur eimalige Auswertung + = #Sync_BG3306.B_RefPunkt;//uebergabe fuer unten + + U "MA0064"; + L S5T#500ms; + SA "T543"; + U "T543"; + UN #Sync_BG3306.Dyn.Status.TeachModus_Aktiv;//sonst Probleme bei Doppelimpuls + O; + U "MA0064"; + U #Sync_BG3306.Dyn.Status.TeachModus_Aktiv;//sonst Probleme bei Doppelimpuls + = #Antrieb; + +//Keine Hauptstrangdaten vorhanden ? (Fuer Sync-Pkt): + L "LP_HS_oF".Datensortkopf.AnzahlEintraege; + L "LP_HS_mF".Datensortkopf.AnzahlEintraege; + +I; + L 0;//Daten vorhanden ? + ==I;//Nein ! + = "Hauptstrang_leer";//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + + U "BG3306"; + L s5t#500ms;//Da trotz Entprellung Doppel-Impulse + SA "T544"; + U "T544"; + = #Sync_BG3306.B_BT_da; + + CALL #Sync_BG3306 + ( Sync_Nr := 3306 , + ErrQuit := #ErrQuit , + B_TeachPunk := , //Teach-Sensor + Antrieb_aktiv := #Antrieb , + Error := %DB708.DBW102 , + Antrieb_start := "DEPtoLP_Antriebe".MA0064.Stat.A_start , + hStOk := #ErrAnz + ); + + U #Sync_BG3306.Dyn.Error.Inkrementalgeber; + S "DEPtoLP_Antriebe".MA0064.Stat.Stop_vor; + +//Keine Hauptstrangdaten vorhanden ?: + L "LP_HS_oF".Datensortkopf.AnzahlEintraege; + L "LP_HS_mF".Datensortkopf.AnzahlEintraege; + +I; + L 0;//Daten vorhanden ? + ==I;//Nein ! + = "Hauptstrang_leer" ;//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + +//Spezial, da Sorter-Antrieb über SorterRein-Sep geht!: (Sonst Antriebs-Stop wegen PS) + UN "Hauptstrang_leer" ;//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + O "MB3305" ;//Neuer Sort-Trolley kommt + O "BG3306"; + L s5t#20s; + SA "T541"; + + U "T541" ;//Alle Sort-Trolleys sind ins Puffer ausgefahren + S "DEPtoLP_Antriebe".MA0064.Stat.A_vor; + +NETWORK +TITLE = Weiche 3320 / Leerpuffer LP1 + CALL #Weiche_LP1 + ( Weichen_Nr := 1 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DLP_Sensoren".Stau_LP1.Stat.B_Akt , + B_Ausfahrt := "BG3320" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DLP_Zylinder".Weiche_LP1.Stat.Ast , + Error := %DB708.DBW104 , + Antrieb_start := "DEPtoLP_Antriebe".MA0064.Stat.A_start , + Antrieb_stoppen := "DEPtoLP_Antriebe".MA0064.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3317 / Leerpuffer LP2 + CALL #Weiche_LP2 + ( Weichen_Nr := 2 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DLP_Sensoren".Stau_LP2.Stat.B_Akt , + B_Ausfahrt := "BG3317" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DLP_Zylinder".Weiche_LP2.Stat.Ast , + Error := %DB708.DBW106 , + Antrieb_start := "DEPtoLP_Antriebe".MA0064.Stat.A_start , + Antrieb_stoppen := "DEPtoLP_Antriebe".MA0064.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3316 / Leerpuffer LP3 + CALL #Weiche_LP3 + ( Weichen_Nr := 3 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DLP_Sensoren".Stau_LP3.Stat.B_Akt , + B_Ausfahrt := "BG3316" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DLP_Zylinder".Weiche_LP3.Stat.Ast , + Error := %DB708.DBW108 , + Antrieb_start := "DEPtoLP_Antriebe".MA0064.Stat.A_start , + Antrieb_stoppen := "DEPtoLP_Antriebe".MA0064.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3315 / Leerpuffer LP4 + CALL #Weiche_LP4 + ( Weichen_Nr := 4 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DLP_Sensoren".Stau_LP4.Stat.B_Akt , + B_Ausfahrt := "BG3315" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DLP_Zylinder".Weiche_LP4.Stat.Ast , + Error := %DB708.DBW110 , + Antrieb_start := "DEPtoLP_Antriebe".MA0064.Stat.A_start , + Antrieb_stoppen := "DEPtoLP_Antriebe".MA0064.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3314 / Leerpuffer LP5 + CALL #Weiche_LP5 + ( Weichen_Nr := 5 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DLP_Sensoren".Stau_LP5.Stat.B_Akt , + B_Ausfahrt := "BG3314" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DLP_Zylinder".Weiche_LP5.Stat.Ast , + Error := %DB708.DBW112 , + Antrieb_start := "DEPtoLP_Antriebe".MA0064.Stat.A_start , + Antrieb_stoppen := "DEPtoLP_Antriebe".MA0064.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3313 / Leerpuffer LP6 + CALL #Weiche_LP6 + ( Weichen_Nr := 6 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DLP_Sensoren".Stau_LP6.Stat.B_Akt , + B_Ausfahrt := "BG3313" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DLP_Zylinder".Weiche_LP6.Stat.Ast , + Error := %DB708.DBW114 , + Antrieb_start := "DEPtoLP_Antriebe".MA0064.Stat.A_start , + Antrieb_stoppen := "DEPtoLP_Antriebe".MA0064.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3312 / Leerpuffer LP7 + CALL #Weiche_LP7 + ( Weichen_Nr := 7 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DLP_Sensoren".Stau_LP7.Stat.B_Akt , + B_Ausfahrt := "BG3312" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DLP_Zylinder".Weiche_LP7.Stat.Ast , + Error := %DB708.DBW116 , + Antrieb_start := "DEPtoLP_Antriebe".MA0064.Stat.A_start , + Antrieb_stoppen := "DEPtoLP_Antriebe".MA0064.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3311 / Leerpuffer LP8 + CALL #Weiche_LP8 + ( Weichen_Nr := 8 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DLP_Sensoren".Stau_LP8.Stat.B_Akt , + B_Ausfahrt := "BG3311" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DLP_Zylinder".Weiche_LP8.Stat.Ast , + Error := %DB708.DBW118 , + Antrieb_start := "DEPtoLP_Antriebe".MA0064.Stat.A_start , + Antrieb_stoppen := "DEPtoLP_Antriebe".MA0064.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Weiche 3310 / Leerpuffer LP9 + CALL #Weiche_LP9 + ( Weichen_Nr := 9 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DLP_Sensoren".Stau_LP9.Stat.B_Akt , + B_Ausfahrt := "BG3310" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DLP_Zylinder".Weiche_LP9.Stat.Ast , + Error := %DB708.DBW120 , + Antrieb_start := "DEPtoLP_Antriebe".MA0064.Stat.A_start , + Antrieb_stoppen := "DEPtoLP_Antriebe".MA0064.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Pseudo-Weiche / Leerpuffer LP10 + CALL #Weiche_LP10 + ( Weichen_Nr := 10 , + ErrQuit := #ErrQuit , + Stau_Ausfahrtbereich := "DLP_Sensoren".Stau_LP10.Stat.B_Akt , + B_Ausfahrt := "BG3307" , + Antrieb_aktiv := #Antrieb , + Y_Weiche_abzweigen := "DLP_Zylinder".Weiche_LP10.Stat.Ast , + Error := %DB708.DBW122 , + Antrieb_start := "DEPtoLP_Antriebe".MA0064.Stat.A_start , + Antrieb_stoppen := "DEPtoLP_Antriebe".MA0064.Stat.Stop_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Störungen anzeigen UH07 + U #ErrAnz; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Basics/LPtoHW_Antriebe.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Basics/LPtoHW_Antriebe.awl index 93821ae..3e9e6c1 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Basics/LPtoHW_Antriebe.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Basics/LPtoHW_Antriebe.awl @@ -1,146 +1,244 @@ -=== FB 6199: LPtoHW_Antriebe [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - MA0065 : "MAntrieb_PowerSave" - MA0066 : "MAntrieb_PowerSave" - MA0264 : "MAntrieb_PowerSave" - MA0265 : "MAntrieb_PowerSave" - MA0266 : "MAntrieb_PowerSave" - MA0267 : "MAntrieb_PowerSave" - MA0270 : "MAntrieb_PowerSave" - MA0202 : "MAntrieb_PowerSave" - MA0203 : "MAntrieb_PowerSave" - Temp: - Auto : Bool // Automatik Linie ist aktiv - Hand : Bool // Hand Linie ist aktiv - BereichErr : Bool // Bereichsstörung -> Antrieb stoppen - QKontroll : Bool // Frequenzumrichter schon 3s Netz EIN - FuKontroll : Bool // Frequenzumrichter schon 3s Netz EIN - Quit : Bool // Motorschutz-Störung quittieren - Qok : Bool // Motorschutz ok - Jog1 : Bool // Geschwindigkeit 1 - Jog2 : Bool // Geschwindigkeit 2 - Betrieb : Bool // Betriebsart aktiv - FC105_RET : Word // Returnwert von FC105 - Antrieb1 : Bool // Antrieb dazuschalten - Antrieb2 : Bool // Antrieb dazuschalten - F1 : Bool // Geschwindigkeit 1 aktiviert - F2 : Bool // Geschwindigkeit 2 aktiviert - F3 : Bool // Geschwindigkeit 3 aktiviert - Constant: +FUNCTION_BLOCK "LPtoHW_Antriebe" +TITLE = Antriebe UH07 +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + MA0065 : "MAntrieb_PowerSave"; + MA0066 : "MAntrieb_PowerSave"; + MA0264 : "MAntrieb_PowerSave"; + MA0265 : "MAntrieb_PowerSave"; + MA0266 : "MAntrieb_PowerSave"; + MA0267 : "MAntrieb_PowerSave"; + MA0270 : "MAntrieb_PowerSave"; + MA0202 : "MAntrieb_PowerSave"; + MA0203 : "MAntrieb_PowerSave"; + END_VAR ---- NW 1: Übergabe des Bereichstatus System UH07/A01 --- - A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto - - CLR - = Hand - - A "DOutbound_Bereich".A01_UH07.BereichErr - AN "SGes".Simulation_ohne_HW_aktiv - = BereichErr - - A "T197" - = QKontroll - = FuKontroll - - A "DOutbound_Bereich".A01_UH07.StOk_aktiv - = Quit + VAR_TEMP + Auto : Bool; // Automatik Linie ist aktiv + Hand : Bool; // Hand Linie ist aktiv + BereichErr : Bool; // Bereichsstörung -> Antrieb stoppen + QKontroll : Bool; // Frequenzumrichter schon 3s Netz EIN + FuKontroll : Bool; // Frequenzumrichter schon 3s Netz EIN + Quit : Bool; // Motorschutz-Störung quittieren + Qok : Bool; // Motorschutz ok + Jog1 : Bool; // Geschwindigkeit 1 + Jog2 : Bool; // Geschwindigkeit 2 + Betrieb : Bool; // Betriebsart aktiv + FC105_RET : Word; // Returnwert von FC105 + Antrieb1 : Bool; // Antrieb dazuschalten + Antrieb2 : Bool; // Antrieb dazuschalten + F1 : Bool; // Geschwindigkeit 1 aktiviert + F2 : Bool; // Geschwindigkeit 2 aktiviert + F3 : Bool; // Geschwindigkeit 3 aktiviert + END_VAR ---- NW 2: MA0065 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0065", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0065", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0065, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +BEGIN +NETWORK +TITLE = Übergabe des Bereichstatus System UH07/A01 + U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; + + CLR; + = #Hand; + + U "DOutbound_Bereich".A01_UH07.BereichErr; + UN "SGes".Simulation_ohne_HW_aktiv; + = #BereichErr; + + U "T197"; + = #QKontroll; + = #FuKontroll; + + U "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #Quit; + +NETWORK +TITLE = MA0065 + CALL #MA0065 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0065" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0065" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0065 + ); - ---- NW 3: MA0066 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0066", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0066", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0066, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0066 + CALL #MA0066 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0066" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0066" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0066 + ); +NETWORK +TITLE = Übergabe des Bereichstatus System UC073/A01 + U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; ---- NW 4: Übergabe des Bereichstatus System UC073/A01 --- - A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto + CLR; + = #Hand; - CLR - = Hand + U "DOutbound_Bereich".A01_UC073.BereichErr; + UN "SGes".Simulation_ohne_HW_aktiv; + = #BereichErr; - A "DOutbound_Bereich".A01_UC073.BereichErr - AN "SGes".Simulation_ohne_HW_aktiv - = BereichErr + U "T193"; + = #QKontroll; + = #FuKontroll; - A "T193" - = QKontroll - = FuKontroll + U "DOutbound_Bereich".A01_UC073.StOk_aktiv; + = #Quit; - A "DOutbound_Bereich".A01_UC073.StOk_aktiv - = Quit +NETWORK +TITLE = MA0264 + CALL #MA0264 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0264" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0264" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0264 + ); ---- NW 5: MA0264 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0264", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0264", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0264, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0265 + CALL #MA0265 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0265" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + T_Nachlauf := 90 , + Antriebvor := "MA0265" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0265 + ); - ---- NW 6: MA0265 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0265", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=90, Antriebrueck:=?, Antriebvor:="MA0265", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0265, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0266 + CALL #MA0266 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0266" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0266" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0266 + ); - ---- NW 7: MA0266 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0266", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0266", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0266, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0267 + CALL #MA0267 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0267" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0267" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0267 + ); - ---- NW 8: MA0267 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0267", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0267", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0267, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = MA0270 + CALL #MA0270 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0270" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0270" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0270 + ); +NETWORK +TITLE = Übergabe des Bereichstatus System UC072/A01 + U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; ---- NW 9: MA0270 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0270", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0270", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0270, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) + CLR; + = #Hand; + + U(; + O "DOutbound_Bereich".A01_UC072.BereichErr; + O "DOutbound_Bereich".A01_UZ7201.Area_Stop; + O "DOutbound_Bereich".A01_UZ7202.Area_Stop; + ); + UN "SGes".Simulation_ohne_HW_aktiv; + = #BereichErr; + + U "T192"; + = #QKontroll; + = #FuKontroll; + + U "DOutbound_Bereich".A01_UC072.StOk_aktiv; + = #Quit; + +NETWORK +TITLE = MA0202 + CALL #MA0202 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0202" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0202" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0202 + ); - ---- NW 10: Übergabe des Bereichstatus System UC072/A01 --- - A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto - - CLR - = Hand - - A( - O "DOutbound_Bereich".A01_UC072.BereichErr - O "DOutbound_Bereich".A01_UZ7201.Area_Stop - O "DOutbound_Bereich".A01_UZ7202.Area_Stop - ) - AN "SGes".Simulation_ohne_HW_aktiv - = BereichErr - - A "T192" - = QKontroll - = FuKontroll - - A "DOutbound_Bereich".A01_UC072.StOk_aktiv - = Quit +NETWORK +TITLE = MA0203 + CALL #MA0203 + ( Automatik := #Auto , + Handbetrieb := #Hand , + BereichErr := #BereichErr , + Q := "FC0203" , + Ptc := TRUE , + QKontroll := #QKontroll , + ErrQuit := #Quit , + Antriebvor := "MA0203" , + QErr := "7_HMI_Err_UH07_OB".QErr.MA0203 + ); ---- NW 11: MA0202 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0202", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0202", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0202, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) +NETWORK +TITLE = Ende + BE; - - ---- NW 12: MA0203 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=Hand, BereichErr:=BereichErr, Q:="FC0203", Ptc:=TRUE, Fu:=?, QKontroll:=QKontroll, FuKontroll:=?, ErrQuit:=Quit, Kontroll_B:=?, T_Nachlauf:=?, Antriebrueck:=?, Antriebvor:="MA0203", Jog1:=?, Jog2:=?, Analog:=?, QErr:="7_HMI_Err_UH07_OB".QErr.MA0203, PtcErr:=?, FuErr:=?, Err_Antrieb_verklemmt:=?) - - - ---- NW 13: Ende --- - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Basics/LPtoHW_Sensoren.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Basics/LPtoHW_Sensoren.awl index 50de7af..c476e72 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Basics/LPtoHW_Sensoren.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Basics/LPtoHW_Sensoren.awl @@ -1,145 +1,278 @@ -=== FB 6190: LPtoHW_Sensoren [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - An_BG3323 : "MSensoren" // Trolley am Sensor BG3323 - Sack_BG3324 : "MSensoren" // Sack erkannt - Stau_BG3343 : "MSensoren" // Stau am Sensor Einfahrt MA0065 - An_BG3343 : "MSensoren" // Stau am Sensor Einfahrt MA0065 - Stau_BG3344 : "MSensoren" // Stau am Sensor Einfahrt MA0065 - An_BG3344 : "MSensoren" // Stau am Sensor Einfahrt MA0065 - Stau_BG3326 : "MSensoren" // Stau am Sensor Einfahrt MA0066 - Stau_BG4220 : "MSensoren" // Stau am Sensor Einfahrt MA0264 - Sack_BG4222 : "MSensoren" // Sack erkannt - Stau_BG4224 : "MSensoren" // Stau am Sensor Einfahrt MA0265 - Stau_BG4226 : "MSensoren" // Stau am Sensor Einfahrt MA0266 - Stau_BG4231 : "MSensoren" // Stau am Sensor Einfahrt MA0267 - Stau_BG4233 : "MSensoren" // Stau am Sensor Einfahrt MA0270 - Stau_BG4234 : "MSensoren" // Stau am Sensor Mitte MA0270 - Stau_BG3720 : "MSensoren" // Stau am Sensor hinter BST2 - Stau_BG3721 : "MSensoren" // Stau am Sensor Einfahrt MA0203 - Stau_BG3723 : "MSensoren" // Stau am Sensor Ausfahrt MB3722 - Fährt_zu_UH06 : "MSensoren" - Temp: - T_Ein : Int // Vorgabe Einschaltverzögerung - T_Aus : Int // Zwischenspeicher Ausschaltverzögerung - F1 : Bool // Geschwindigkeit 1 aktiviert - F2 : Bool // Geschwindigkeit 2 aktiviert - F3 : Bool // Geschwindigkeit 3 aktiviert - ESensor : Bool // Sensoren - Antrieb : Bool - VReal : Real // GeschwindigkeitinReal - Zeit : Int // Zeit für Ausschaltverzögerung LT1100 - Aktiv : Bool // Zeit aktivieren - Constant: +FUNCTION_BLOCK "LPtoHW_Sensoren" +TITLE = Sensoren Outbound: LP > HW +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + An_BG3323 : "MSensoren"; // Trolley am Sensor BG3323 + Sack_BG3324 : "MSensoren"; // Sack erkannt + Stau_BG3343 : "MSensoren"; // Stau am Sensor Einfahrt MA0065 + An_BG3343 : "MSensoren"; // Stau am Sensor Einfahrt MA0065 + Stau_BG3344 : "MSensoren"; // Stau am Sensor Einfahrt MA0065 + An_BG3344 : "MSensoren"; // Stau am Sensor Einfahrt MA0065 + Stau_BG3326 : "MSensoren"; // Stau am Sensor Einfahrt MA0066 + Stau_BG4220 : "MSensoren"; // Stau am Sensor Einfahrt MA0264 + Sack_BG4222 : "MSensoren"; // Sack erkannt + Stau_BG4224 : "MSensoren"; // Stau am Sensor Einfahrt MA0265 + Stau_BG4226 : "MSensoren"; // Stau am Sensor Einfahrt MA0266 + Stau_BG4231 : "MSensoren"; // Stau am Sensor Einfahrt MA0267 + Stau_BG4233 : "MSensoren"; // Stau am Sensor Einfahrt MA0270 + Stau_BG4234 : "MSensoren"; // Stau am Sensor Mitte MA0270 + Stau_BG3720 : "MSensoren"; // Stau am Sensor hinter BST2 + Stau_BG3721 : "MSensoren"; // Stau am Sensor Einfahrt MA0203 + Stau_BG3723 : "MSensoren"; // Stau am Sensor Ausfahrt MB3722 + Fährt_zu_UH06 : "MSensoren"; + END_VAR ---- NW 1: Sensoren entprellen --- - A "BG3323" - AN "MB3323" - = ESensor - -CALL FB "None" , (ESensor:=ESensor, T_Ein:=1, T_Aus:=300, tein_aktiv:=1, taus_aktiv:=1) // Falls Trolley entnommen wurde - - A "MB3323" // Beim Öffnen löschen - A "MA0065" - R "DLPtoHW_Sensoren".An_BG3323.Stat.B_Akt + VAR_TEMP + T_Ein : Int; // Vorgabe Einschaltverzögerung + T_Aus : Int; // Zwischenspeicher Ausschaltverzögerung + F1 : Bool; // Geschwindigkeit 1 aktiviert + F2 : Bool; // Geschwindigkeit 2 aktiviert + F3 : Bool; // Geschwindigkeit 3 aktiviert + ESensor : Bool; // Sensoren + Antrieb : Bool; + VReal : Real; // GeschwindigkeitinReal + Zeit : Int; // Zeit für Ausschaltverzögerung LT1100 + Aktiv : Bool; // Zeit aktivieren + END_VAR ---- NW 2: Sensoren entprellen --- - AN "MB3323" // Alt-Trolley noch beim Ausfahren - A( - O "MA0065" - O "BG3323" - ) - = Aktiv +BEGIN +NETWORK +TITLE = Trolley in Schleuse 3323 erkannt (Beladung) +//Sensoren entprellen + U "BG3323"; + UN "MB3323"; + = #ESensor; -CALL FB "None" , (ESensor:="BG3324", T_Ein:=10, T_Aus:=0, tein_aktiv:=Aktiv, taus_aktiv:=1) + CALL #An_BG3323 + ( ESensor := #ESensor , + T_Ein := 1 , + T_Aus := 300 , //Falls Trolley entnommen wurde + tein_aktiv := 1 , + taus_aktiv := 1 + ); + U "MB3323";//Beim Öffnen löschen + U "MA0065"; + R "DLPtoHW_Sensoren".An_BG3323.Stat.B_Akt; ---- NW 3: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3343", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Sack in Schleuse 3323 erkannt (Beladung) +//Sensoren entprellen + UN "MB3323" ;//Alt-Trolley noch beim Ausfahren + U(; + O "MA0065"; + O "BG3323"; + ); + = #Aktiv; + CALL #Sack_BG3324 + ( ESensor := "BG3324" , + T_Ein := 10 , + T_Aus := 0 , + tein_aktiv := #Aktiv , + taus_aktiv := 1 + ); ---- NW 4: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3343", T_Ein:=1, T_Aus:=200, tein_aktiv:=TRUE, taus_aktiv:="MA0065") +NETWORK +TITLE = Stau am Sensor nach Beladung +//Sensoren entprellen + CALL #Stau_BG3343 + ( ESensor := "BG3343" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Trolley am Sensor nach Beladung +//Sensoren entprellen + CALL #An_BG3343 + ( ESensor := "BG3343" , + T_Ein := 1 , + T_Aus := 200 , + tein_aktiv := TRUE , + taus_aktiv := "MA0065" + ); ---- NW 5: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3344", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor nach Beladung +//Sensoren entprellen + CALL #Stau_BG3344 + ( ESensor := "BG3344" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Trolley am Sensor nach Beladung +//Sensoren entprellen + CALL #An_BG3344 + ( ESensor := "BG3344" , + T_Ein := 1 , + T_Aus := 200 , + tein_aktiv := TRUE , + taus_aktiv := "MA0065" + ); ---- NW 6: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3344", T_Ein:=1, T_Aus:=200, tein_aktiv:=TRUE, taus_aktiv:="MA0065") +NETWORK +TITLE = Stau am Sensor Einfahrt MA0066 +//Sensoren entprellen + CALL #Stau_BG3326 + ( ESensor := "BG3326" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Einfahrt MA0264 +//Sensoren entprellen + UN "BG4221"; + = #Aktiv; ---- NW 7: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3326", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) + CALL #Stau_BG4220 + ( ESensor := "BG4220" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := #Aktiv //Trolley wieder aus Schleuse 4221 + ); +NETWORK +TITLE = Sack in Schleuse 4221 erkannt (Vor ByPass zu VP) +//Sensoren entprellen + UN "MB4221";//Alt-Trolley noch beim Ausfahren + U(; + O "MA0264"; + O "BG4221"; + ); + = #Aktiv; ---- NW 8: Sensoren entprellen --- - AN "BG4221" - = Aktiv + CALL #Sack_BG4222 + ( ESensor := "BG4222" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := #Aktiv , + taus_aktiv := "MB4221" + ); -CALL FB "None" , (ESensor:="BG4220", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=Aktiv) // Trolley wieder aus Schleuse 4221 +NETWORK +TITLE = Stau am Sensor Einfahrt MA0265 +//Sensoren entprellen + CALL #Stau_BG4224 + ( ESensor := "BG4224" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Einfahrt MA0266 +//Sensoren entprellen + CALL #Stau_BG4226 + ( ESensor := "BG4226" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 9: Sensoren entprellen --- - AN "MB4221" // Alt-Trolley noch beim Ausfahren - A( - O "MA0264" - O "BG4221" - ) - = Aktiv +NETWORK +TITLE = Stau am Sensor Einfahrt MA0267 +//Sensoren entprellen + CALL #Stau_BG4231 + ( ESensor := "BG4231" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); -CALL FB "None" , (ESensor:="BG4222", T_Ein:=1, T_Aus:=11, tein_aktiv:=Aktiv, taus_aktiv:="MB4221") +NETWORK +TITLE = Stau am Sensor Einfahrt MA021 +//Sensoren entprellen + CALL #Stau_BG4233 + ( ESensor := "BG4233" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Mitte MA021 +//Sensoren entprellen + CALL #Stau_BG4234 + ( ESensor := "BG4234" , + T_Ein := 1 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 10: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4224", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor hinter BST2 +//Sensoren entprellen + CALL #Stau_BG3720 + ( ESensor := "BG3720" , + T_Ein := 1 , + T_Aus := 30 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Stau am Sensor Einfahrt MA0203 +//Sensoren entprellen + CALL #Stau_BG3721 + ( ESensor := "BG3721" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); ---- NW 11: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4226", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Stau am Sensor Ausfahrt MB3722 +//Sensoren entprellen + CALL #Stau_BG3723 + ( ESensor := "BG3723" , + T_Ein := 80 , + T_Aus := 11 , + tein_aktiv := TRUE , + taus_aktiv := TRUE + ); +NETWORK +TITLE = Fährt zu UH06 +//Sensoren entprellen + U "MB3722"; + O "BG3723"; + = #ESensor; ---- NW 12: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4231", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) + U "MA0203"; + U "DSchnittstelle_zu_AMR".From_UH06.MA0203_aktiv; + = #Aktiv; + CALL #Fährt_zu_UH06 + ( ESensor := #ESensor , + T_Ein := 1 , + T_Aus := 300 , //30s Nachlauf + tein_aktiv := TRUE , + taus_aktiv := #Aktiv + ); ---- NW 13: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4233", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) +NETWORK +TITLE = Ende + BE; - ---- NW 14: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG4234", T_Ein:=1, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 15: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3720", T_Ein:=1, T_Aus:=30, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 16: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3721", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 17: Sensoren entprellen --- -CALL FB "None" , (ESensor:="BG3723", T_Ein:=80, T_Aus:=11, tein_aktiv:=TRUE, taus_aktiv:=TRUE) - - ---- NW 18: Sensoren entprellen --- - A "MB3722" - O "BG3723" - = ESensor - - A "MA0203" - A "DSchnittstelle_zu_AMR".From_UH06.MA0203_aktiv - = Aktiv - -CALL FB "None" , (ESensor:=ESensor, T_Ein:=1, T_Aus:=300, tein_aktiv:=TRUE, taus_aktiv:=Aktiv) // 30s Nachlauf - - ---- NW 19: Ende --- - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Basics/LPtoHW_Zylinder.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Basics/LPtoHW_Zylinder.awl index b45a20d..0e65aaa 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Basics/LPtoHW_Zylinder.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Basics/LPtoHW_Zylinder.awl @@ -1,102 +1,169 @@ -=== FB 6192: LPtoHW_Zylinder [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Schleuse_3342 : "MZylinder" // - Schleuse_3323 : "MZylinder" // - Schleuse_3345 : "MZylinder" // - Schleuse_3325 : "MZylinder" // - Schleuse_4221 : "MZylinder" - Weiche_4223 : "MZylinder" // - Schleuse_4227 : "MZylinder" // - Schleuse_4235 : "MZylinder" // - Schleuse_3722 : "MZylinder" // - Stopper_3324 : "MZylinder" // - Temp: - Auto : Bool // Automatik ist aktiv - Hand : Bool // Hand ist aktiv - ZylAst : Bool // Zylinder ansteuern - Constant: +FUNCTION_BLOCK "LPtoHW_Zylinder" +TITLE = Zylinder Outbound Leerpuffer > Highway +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 + VAR + Schleuse_3342 : "MZylinder"; // + Schleuse_3323 : "MZylinder"; // + Schleuse_3345 : "MZylinder"; // + Schleuse_3325 : "MZylinder"; // + Schleuse_4221 : "MZylinder"; + Weiche_4223 : "MZylinder"; // + Schleuse_4227 : "MZylinder"; // + Schleuse_4235 : "MZylinder"; // + Schleuse_3722 : "MZylinder"; // + Stopper_3324 : "MZylinder"; // + END_VAR ---- NW 1: Übergabe des Bereichstatus System UH07/A01 --- - A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto - - A "DOutbound_Bereich".A01_UH07.BereichErr - AN "SGes".Simulation_ohne_HW_aktiv - JC Next // Zylinder-Stellung nicht mehr ändern + VAR_TEMP + Auto : Bool; // Automatik ist aktiv + Hand : Bool; // Hand ist aktiv + ZylAst : Bool; // Zylinder ansteuern + END_VAR ---- NW 2: Schleuse_3342 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3342", ZylGst:=?) +BEGIN +NETWORK +TITLE = Übergabe des Bereichstatus System UH07/A01 + U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; + U "DOutbound_Bereich".A01_UH07.BereichErr; + UN "SGes".Simulation_ohne_HW_aktiv; + SPB Next ;//Zylinder-Stellung nicht mehr ändern ---- NW 3: Schleuse_3323 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3323", ZylGst:=?) +NETWORK +TITLE = Schleuse_3342 + CALL #Schleuse_3342 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3342" + ); +NETWORK +TITLE = Schleuse_3323 + CALL #Schleuse_3323 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3323" + ); ---- NW 4: Schleuse_3345 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3345", ZylGst:=?) +NETWORK +TITLE = Schleuse_3345 + CALL #Schleuse_3345 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3345" + ); +NETWORK +TITLE = Schleuse_3325 + CALL #Schleuse_3325 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3325" + ); ---- NW 5: Schleuse_3325 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3325", ZylGst:=?) +NETWORK +TITLE = Stopper 3324 + CALL #Stopper_3324 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3324" + ); +NETWORK +TITLE = Übergabe des Bereichstatus System UC073/A01 +Next: U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; ---- NW 6: Stopper 3324 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3324", ZylGst:=?) + U "DOutbound_Bereich".A01_UC073.BereichErr; + UN "SGes".Simulation_ohne_HW_aktiv; + SPB Next1 ;//Zylinder-Stellung nicht mehr ändern +NETWORK +TITLE = Schleuse_4221 + CALL #Schleuse_4221 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4221" + ); ---- NW 7: Übergabe des Bereichstatus System UC073/A01 --- -Next: A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto +NETWORK +TITLE = Weiche_4223 + CALL #Weiche_4223 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4223" + ); - A "DOutbound_Bereich".A01_UC073.BereichErr - AN "SGes".Simulation_ohne_HW_aktiv - JC Next1 // Zylinder-Stellung nicht mehr ändern + U "MB4223"; + = "MB4210"; +NETWORK +TITLE = Schleuse_4227 + CALL #Schleuse_4227 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4227" + ); ---- NW 8: Schleuse_4221 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4221", ZylGst:=?) +NETWORK +TITLE = Schleuse_4235 + CALL #Schleuse_4235 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB4235" + ); +NETWORK +TITLE = Übergabe des Bereichstatus System UC072/A01 +Next1: U "DOutbound_Bereich".A01_UH07.Automatik; + UN "DOutbound_Bereich".A01_UH07.Handbetrieb; + = #Auto; ---- NW 9: Weiche_4223 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4223", ZylGst:=?) + U(; + O "DOutbound_Bereich".A01_UC072.BereichErr; + O "DOutbound_Bereich".A01_UZ7201.Area_Stop; + O "DOutbound_Bereich".A01_UZ7202.Area_Stop; + ); + UN "SGes".Simulation_ohne_HW_aktiv; + SPB Next2 ;//Zylinder-Stellung nicht mehr ändern - A "MB4223" - = "MB4210" +NETWORK +TITLE = Schleuse_3722 + CALL #Schleuse_3722 + ( Automatik := #Auto , + Handbetrieb := FALSE , + T_Ast := 0 , + T_Gst := 5 , + ZylAst := "MB3722" + ); +NETWORK +TITLE = Ende +Next2: BE; ---- NW 10: Schleuse_4227 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4227", ZylGst:=?) - - ---- NW 11: Schleuse_4235 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB4235", ZylGst:=?) - - ---- NW 12: Übergabe des Bereichstatus System UC072/A01 --- -Next1: A "DOutbound_Bereich".A01_UH07.Automatik - AN "DOutbound_Bereich".A01_UH07.Handbetrieb - = Auto - - A( - O "DOutbound_Bereich".A01_UC072.BereichErr - O "DOutbound_Bereich".A01_UZ7201.Area_Stop - O "DOutbound_Bereich".A01_UZ7202.Area_Stop - ) - AN "SGes".Simulation_ohne_HW_aktiv - JC Next2 // Zylinder-Stellung nicht mehr ändern - - ---- NW 13: Schleuse_3722 --- -CALL FB "None" , (Automatik:=Auto, Handbetrieb:=FALSE, T_Ast:=0, T_Gst:=5, ZylAst:="MB3722", ZylGst:=?) - - ---- NW 14: Ende --- -Next2: BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/LPtoHW_Bereich.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/LPtoHW_Bereich.awl index cdd6055..5ccac4b 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/LPtoHW_Bereich.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/LPtoHW_Bereich.awl @@ -1,24 +1,23 @@ -=== FC 6100: LPtoHW_Bereich [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Constant: - Return: - Ret_Val : Void +FUNCTION "LPtoHW_Bereich" : Void +TITLE = Bereich Outbound: LP > HW +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 ---- NW 1: Baustein-Aufrufe --- -CALL FB "LPtoHW_Sensoren" , +BEGIN +NETWORK +TITLE = Baustein-Aufrufe + CALL "LPtoHW_Sensoren", "DLPtoHW_Sensoren"; -CALL FB "LPtoHW_OmniFahren" , + CALL "LPtoHW_OmniFahren", "DLPtoHW_OmniFahren"; -CALL FB "LPtoHW_Zylinder" , + CALL "LPtoHW_Zylinder", "DLPtoHW_Zylinder"; -CALL FB "LPtoHW_Antriebe" , + CALL "LPtoHW_Antriebe", "DLPtoHW_Antriebe"; +NETWORK +TITLE = Ende + BE; ---- NW 2: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Omnifahren_LPtoHW/LPtoHW_Draussen_FC.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Omnifahren_LPtoHW/LPtoHW_Draussen_FC.awl index a5fefe7..8bad75e 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Omnifahren_LPtoHW/LPtoHW_Draussen_FC.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Omnifahren_LPtoHW/LPtoHW_Draussen_FC.awl @@ -1,96 +1,121 @@ -=== FC 6182: LPtoHW_Draussen_FC [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Constant: - Return: - Ret_Val : Void +FUNCTION "LPtoHW_Draussen_FC" : Void +TITLE = Draussen-FC: LP>HW +{ S7_Optimized_Access := 'FALSE' ; S7_Pass_Registers := 'TRUE' } +AUTHOR : AE +VERSION : 0.1 ---- NW 1: Rückmeldung --- - SET // Rückmeldungen erst mal resetten - R "M180.6" // Weiterfahrt von Ziel-FC erlaubt +BEGIN +NETWORK +TITLE = Rückmeldung + SET;//Rückmeldungen erst mal resetten + R "M180.6";//Weiterfahrt von Ziel-FC erlaubt +NETWORK +TITLE = Schleuse 3323 (Trolley-Beladung): Ausgefahren ? + L "MW190"; + L 3323 ;//Aufruf von Schleuse 3323 ? + <>I;//Nein! + SPB X3323E; ---- NW 2: Schleuse 3323 (Trolley-Beladung): Ausgefahren ? --- - L "MW190" - L 3323 // Aufruf von Schleuse 3323 ? - <>I // Nein! - JC X3323E +//Evtl. erkannten Sack löschen: + SET; + R "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt; -// Evtl. erkannten Sack löschen: - SET - R "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt +//Trolleydaten ändern: + UN "DLeerPufferStrecken".DurchfahrModus.Aktiv; + SPB SackTrolley ;//Sack-Trolleydaten erzeugen -// Trolleydaten ändern: - AN "DLeerPufferStrecken".DurchfahrModus.Aktiv - JC SackTrolley // Sack-Trolleydaten erzeugen +//Leer-Trolley für VP-Daten: + CALL "Trolleydaten_neu_anlegen" + ( Gesamt_Trolley_DL := 1000 , + TrolleyID := "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse , + Endziel := 16#B000 , //Vollpuffer + ShopGroup := DINT#-1 //ShopGroup = -1 bei Leertrolly für Vollpuffer! + ); -// Leer-Trolley für VP-Daten: -CALL FC "Trolleydaten_neu_anlegen" (Gesamt_Trolley_DL:=1000, TrolleyID:="DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse, Endziel:=16#B000, ShopGroup:=DINT#-1) // Vollpuffer | ShopGroup = -1 bei Leertrolly für Vollpuffer! +//Standort übermitteln: + CALL "Trolley_DL_Neue_Pos" + ( Gesamt_Trolley_DL := 1000 , + TrolleyID := "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse , + Position := 16#7108 , //Leser 7108 + ShopGroup := Dint#0 , + Err := "M199.0" + ); -// Standort übermitteln: -CALL FC "Trolley_DL_Neue_Pos" (Gesamt_Trolley_DL:=1000, TrolleyID:="DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse, Position:=16#7108, ShopGroup:=Dint#0, Err:="M199.0") // Leser 7108 + L "DLeerPufferStrecken".DurchfahrModus.RestTrolleys; + + -1; + T "DLeerPufferStrecken".DurchfahrModus.RestTrolleys; - L "DLeerPufferStrecken".DurchfahrModus.RestTrolleys - + -1 - T "DLeerPufferStrecken".DurchfahrModus.RestTrolleys + L 0;//Noch Rest-Trolleys vorhanden ? + >I;//Ja! + BEB; - L 0 // Noch Rest-Trolleys vorhanden ? - >I // Ja! - BEC + SET; + R "DLeerPufferStrecken".DurchfahrModus.Aktiv;//Erst mal beenden - SET - R "DLeerPufferStrecken".DurchfahrModus.Aktiv // Erst mal beenden + BEA; - BEU +SackTrolley: CALL "Trolleydaten_neu_anlegen" + ( Gesamt_Trolley_DL := 1000 , + TrolleyID := "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse , + Endziel := 16#AAAA , //AMR-Bereich + ShopGroup := DINT#0 + ); -SackTrolley: CALL FC "Trolleydaten_neu_anlegen" (Gesamt_Trolley_DL:=1000, TrolleyID:="DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse, Endziel:=16#AAAA, ShopGroup:=DINT#0) // AMR-Bereich +//Standort übermitteln: + CALL "Trolley_DL_Neue_Pos" + ( Gesamt_Trolley_DL := 1000 , + TrolleyID := "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse , + Position := 16#7108 , //Leser 7108 + ShopGroup := Dint#0 , + Err := "M199.0" + ); -// Standort übermitteln: -CALL FC "Trolley_DL_Neue_Pos" (Gesamt_Trolley_DL:=1000, TrolleyID:="DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse, Position:=16#7108, ShopGroup:=Dint#0, Err:="M199.0") // Leser 7108 +//Umschalten auf Durchfahr-Modus: + U "DLeerPufferStrecken".DurchfahrModus.Anmelden; + R "DLeerPufferStrecken".DurchfahrModus.Anmelden; + S "DLeerPufferStrecken".DurchfahrModus.Aktiv; -// Umschalten auf Durchfahr-Modus: - A "DLeerPufferStrecken".DurchfahrModus.Anmelden - R "DLeerPufferStrecken".DurchfahrModus.Anmelden - S "DLeerPufferStrecken".DurchfahrModus.Aktiv + BEA; - BEU +X3323E: NOP 0; -X3323E: NOP 0 +NETWORK +TITLE = Schleuse 4221 (Vor ByPass zum VP): Ausgefahren ? + L "MW190"; + L 4221 ;//Aufruf von Schleuse 4221? + <>I;//Nein! + SPB X4221E; +//Evtl. erkannten Sack löschen: + SET; + R "DLPtoHW_Sensoren".Sack_BG4222.Stat.B_Akt; ---- NW 3: Schleuse 4221 (Vor ByPass zum VP): Ausgefahren ? --- - L "MW190" - L 4221 // Aufruf von Schleuse 4221? - <>I // Nein! - JC X4221E + L "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.Weichen_Ziel; + L 16#4224 ;//Gerade ? Also zum AMR-Bereich? + ==I ;//Ja ! + SPBN X4221;//Negierter Sprung -// Evtl. erkannten Sack löschen: - SET - R "DLPtoHW_Sensoren".Sack_BG4222.Stat.B_Akt +//Trolley fährt zum AMR: +//Trolleydaten in DB1000 löschen, da zum AMR fährt und danach kein Leser mehr! + CALL "Trolleydaten_löschen" + ( Gesamt_Trolley_DL := 1000 , + TrolleyID := "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.TrolleyID_Schleuse + ); - L "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.Weichen_Ziel - L 16#4224 // Gerade ? Also zum AMR-Bereich? - ==I // Ja ! - JCN X4221 // Negierter Sprung + BEA; -// Trolley fährt zum AMR: -// Trolleydaten in DB1000 löschen, da zum AMR fährt und danach kein Leser mehr! -CALL FC "Trolleydaten_löschen" (Gesamt_Trolley_DL:=1000, TrolleyID:="DLPtoHW_OmniFahren".Schleuse_4221.Dyn.TrolleyID_Schleuse) +X4221: NOP 0; +//Trolley fährt zu VP: +//Bei Partner (Schleuse 4207) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf) + L 0; + T "DHWtoVP_OmniFahren".Schleuse_4207.Dyn.Sk.Akt_Schritt; - BEU +X4221E: NOP 0; -X4221: NOP 0 -// Trolley fährt zu VP: -// Bei Partner (Schleuse 4207) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf) - L 0 - T "DHWtoVP_OmniFahren".Schleuse_4207.Dyn.Sk.Akt_Schritt +NETWORK +TITLE = Ende + BE; -X4221E: NOP 0 - - ---- NW 4: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Omnifahren_LPtoHW/LPtoHW_Leser_FC.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Omnifahren_LPtoHW/LPtoHW_Leser_FC.awl index 96a57cb..1272c10 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Omnifahren_LPtoHW/LPtoHW_Leser_FC.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Omnifahren_LPtoHW/LPtoHW_Leser_FC.awl @@ -1,74 +1,88 @@ -=== FC 6180: LPtoHW_Leser_FC [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Zielebene : Word - Constant: - Return: - Ret_Val : Void - ---- NW 1: Rückmeldung --- -// Keine - L 0 // Evtl. Zwischenziel (MW196) - T "MW196" +FUNCTION "LPtoHW_Leser_FC" : Void +TITLE = Leser-FC: LP > HW +{ S7_Optimized_Access := 'FALSE' ; S7_Pass_Registers := 'TRUE' } +AUTHOR : AE +VERSION : 0.1 + VAR_TEMP + Zielebene : Word; + END_VAR ---- NW 2: Schleuse 3323: (Trolley-Beladung) --- - L "MW190" // Schleusen-Nr. - L 3323 // Aufruf von Schleuse ? - <>I // Nein! - JC X3323E +BEGIN +NETWORK +TITLE = Rückmeldung - AN "M180.0" // Lesefehler - JC Y3323 + //Keine + L 0;//Evtl. Zwischenziel (MW196) + T "MW196"; - BEU +NETWORK +TITLE = Schleuse 3323: (Trolley-Beladung) + L "MW190" ;//Schleusen-Nr. + L 3323 ;//Aufruf von Schleuse ? + <>I;//Nein! + SPB X3323E; -Y3323: AN "M180.1" // unbekannt in TrolleysDL - BEC + UN "M180.0";//Lesefehler + SPB Y3323; -// Daten in Datenbank erzeugen: - L "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse - L DINT#0 // ID bekannt? - ==D // Nein - BEC + BEA; -CALL FC "Trolleydaten_neu_anlegen" (Gesamt_Trolley_DL:="DLPtoHW_OmniFahren".Schleuse_3323.Schleuse.Gesamt_Trolley_DL, TrolleyID:="DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse, Endziel:=16#A000, ShopGroup:=DINT#0) // Leerpuffer-Bereich +Y3323: UN "M180.1" ;//unbekannt in TrolleysDL + BEB; - BEU +//Daten in Datenbank erzeugen: + L "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse; + L DINT#0 ;//ID bekannt? + ==D;//Nein + BEB; -X3323E: NOP 0 + CALL "Trolleydaten_neu_anlegen" + ( Gesamt_Trolley_DL := "DLPtoHW_OmniFahren".Schleuse_3323.Schleuse.Gesamt_Trolley_DL , + TrolleyID := "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse , + Endziel := 16#A000 , //Leerpuffer-Bereich + ShopGroup := DINT#0 + ); + BEA; ---- NW 3: Schleuse 4221: (Vor ByPass zurück zum VP) --- - L "MW190" // Schleusen-Nr. - L 4221 // Aufruf von Schleuse ? - <>I // Nein! - JC X4221E +X3323E: NOP 0; - AN "M180.0" // Lesefehler - JC Y4221 +NETWORK +TITLE = Schleuse 4221: (Vor ByPass zurück zum VP) + L "MW190" ;//Schleusen-Nr. + L 4221 ;//Aufruf von Schleuse ? + <>I;//Nein! + SPB X4221E; - BEU + UN "M180.0";//Lesefehler + SPB Y4221; -Y4221: AN "M180.1" // unbekannt in TrolleysDL - BEC + BEA; -// Daten in Datenbank erzeugen: - L "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.TrolleyID_Schleuse - L DINT#0 // ID bekannt? - ==D // Nein - BEC +Y4221: UN "M180.1" ;//unbekannt in TrolleysDL + BEB; -CALL FC "Trolleydaten_neu_anlegen" (Gesamt_Trolley_DL:="DLPtoHW_OmniFahren".Schleuse_4221.Schleuse.Gesamt_Trolley_DL, TrolleyID:="DLPtoHW_OmniFahren".Schleuse_4221.Dyn.TrolleyID_Schleuse, Endziel:=16#AAAA, ShopGroup:=DINT#0) // AMR-Bereich-Bereich +//Daten in Datenbank erzeugen: + L "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.TrolleyID_Schleuse; + L DINT#0 ;//ID bekannt? + ==D;//Nein + BEB; - BEU + CALL "Trolleydaten_neu_anlegen" + ( Gesamt_Trolley_DL := "DLPtoHW_OmniFahren".Schleuse_4221.Schleuse.Gesamt_Trolley_DL , + TrolleyID := "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.TrolleyID_Schleuse , + Endziel := 16#AAAA , //AMR-Bereich-Bereich + ShopGroup := DINT#0 + ); -X4221E: NOP 0 + BEA; +X4221E: NOP 0; ---- NW 4: Ende --- - BE +NETWORK +TITLE = Ende + BE; + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Omnifahren_LPtoHW/LPtoHW_OmniFahren.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Omnifahren_LPtoHW/LPtoHW_OmniFahren.awl index e045627..572f53b 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Omnifahren_LPtoHW/LPtoHW_OmniFahren.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Omnifahren_LPtoHW/LPtoHW_OmniFahren.awl @@ -1,353 +1,600 @@ -=== FB 6128: LPtoHW_OmniFahren [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Schleuse_3342 : "MHMOmniSchleuse" - Schleuse_3323 : "MHMOmniSchleuse" - Schleuse_3325 : "MHMOmniSchleuse_Plus" - Bereich_4236 : "MHMOmniBereich_Plus" - Schleuse_4221 : "MHMOmniSchleuse_Plus" - Weiche_4223 : "MHMOmniWeiche_Plus" - Schleuse_4227 : "MHMOmniSchleuse" - Bereich_4232 : "MHMOmniBereich_Plus" - Schleuse_4235 : "MHMOmniSchleuse" - Bereich_3732 : "MHMOmniBereich_Plus" - Schleuse_3722 : "MHMOmniSchleuse_Plus" - Schleuse_3345 : "MHMOmniSchleuse" - Übergang_4225 : "MHMÜbergang_ohne_Schleuse" - Trolleys_starten : Struct - Flanke : Bool - Wartezeit_aktiv : Bool - Timer_Wartenzeit : Int - Temp: - ErrQuit : Bool - ErrAnz : Bool - Stau_raus : Bool - Start_ok : Bool - B_aktiv : Bool - B_vor_Schleuse : Bool - B_nach_Schleuse : Bool - Antrieb_aktiv : Bool - Antrieb_vor : Bool - Antrieb_stop : Bool - Fahren_Ok : Bool - Antrieb_nicht_stoppen : Bool - Constant: - ---- NW 1: Systemzeug --- -// Verschiedene Bereiche: - A "DOutbound_Bereich".A01_UH07.AnlageEin - = Schleuse_3342.Dyn.Sk.Auto_akt - = Schleuse_3323.Dyn.Sk.Auto_akt - = Schleuse_3345.Dyn.Sk.Auto_akt - = Schleuse_3325.Dyn.Sk.Auto_akt - = Bereich_4236.Dyn.Sk.Auto_akt - = Schleuse_4221.Dyn.Sk.Auto_akt - = Weiche_4223.Dyn.Status.Auto_akt - = Schleuse_4227.Dyn.Sk.Auto_akt - = Bereich_4232.Dyn.Sk.Auto_akt - = Schleuse_4235.Dyn.Sk.Auto_akt - = Bereich_3732.Dyn.Sk.Auto_akt - = Schleuse_3722.Dyn.Sk.Auto_akt - - AN "DOutbound_Bereich".A01_UH07.BereichErr - = Schleuse_3342.Dyn.Sk.Bereich_ok - = Schleuse_3323.Dyn.Sk.Bereich_ok - = Schleuse_3345.Dyn.Sk.Bereich_ok - = Schleuse_3325.Dyn.Sk.Bereich_ok - = Bereich_4236.Dyn.Sk.Bereich_ok - AN "DOutbound_Bereich".A01_UC073.BereichErr - = Schleuse_4221.Dyn.Sk.Bereich_ok - = Weiche_4223.Dyn.Status.Bereich_ok - = Schleuse_4227.Dyn.Sk.Bereich_ok - = Bereich_4232.Dyn.Sk.Bereich_ok - = Schleuse_4235.Dyn.Sk.Bereich_ok - AN "DOutbound_Bereich".A01_UC072.BereichErr - = Bereich_3732.Dyn.Sk.Bereich_ok - = Schleuse_3722.Dyn.Sk.Bereich_ok - - ---- NW 2: Störungen quittieren UZ0703 --- - A "DOutbound_Bereich".A01_UZ0703.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 3: Schleuse 3342 (Vor BeladePlatz) --- - A "DLPtoHW_Sensoren".An_BG3323.Stat.B_Akt - = Stau_raus - = B_nach_Schleuse - -CALL FB "None" , (Schleusen_Nr:=3342, ErrQuit:=ErrQuit, B_VorSchleuse:="BG3322", B_InSchleuse:="BG3342", B_AusSchleuse:=B_nach_Schleuse, B_Stau_raus:=Stau_raus, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0065", Antrieb_plus_aktiv:="MA0065", Schleuse_geöffnet:="MB3342", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DLPtoHW_Zylinder".Schleuse_3342.Stat.Ast, Error:=DB708.DBW572, Antrieb_Schleuse_vor:="DLPtoHW_Antriebe".MA0065.Stat.A_vor, Antrieb_Schleuse_start:="DLPtoHW_Antriebe".MA0065.Stat.A_start, Antrieb_Schleuse_stop:="DLPtoHW_Antriebe".MA0065.Stat.Stop_vor, Antrieb_Schleuse_PS:="DLPtoHW_Antriebe".MA0065.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) // Identisch - - ---- NW 4: Schleuse 3323 (BeladePlatz) --- -// Beladen erlaubt: - A "DOutbound_Bereich".A01_UH07.AnlageEin - A( - A "DLeerPufferStrecken".DurchfahrModus.Aktiv - A "Clock_5Hz" // Bei Durchfahrmodus blinken - ON "DLeerPufferStrecken".DurchfahrModus.Aktiv - ) - = "PF0046" // Beladung bereit bei Dauerlicht - -// Untere Anzeigen werden im Ziel-FC gesetzt: - L Schleuse_3323.Dyn.Sk.Akt_Schritt - L 12 - <>I - R "PF0033" // Signalsäule blau - R "PF0044" // Trolley starten ok - -CALL FB "None" , (Schleusen_Nr:=3323, ErrQuit:=ErrQuit, B_VorSchleuse:="MB3342", B_InSchleuse:="BG3323", B_AusSchleuse:="BG3343", B_Stau_raus:="DLPtoHW_Sensoren".Stau_BG3343.Stat.B_Akt, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0065", Antrieb_plus_aktiv:=?, Schleuse_geöffnet:="MB3323", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DLPtoHW_Zylinder".Schleuse_3323.Stat.Ast, Error:=DB708.DBW526, Antrieb_Schleuse_vor:="DLPtoHW_Antriebe".MA0065.Stat.A_vor, Antrieb_Schleuse_start:="DLPtoHW_Antriebe".MA0065.Stat.A_start, Antrieb_Schleuse_stop:="DLPtoHW_Antriebe".MA0065.Stat.Stop_vor, Antrieb_Schleuse_PS:="DLPtoHW_Antriebe".MA0065.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) - - ---- NW 5: Schleuse 3345 (Hinter BeladePlatz) --- -CALL FB "None" , (Schleusen_Nr:=3345, ErrQuit:=ErrQuit, B_VorSchleuse:="BG3343", B_InSchleuse:="BG3345", B_AusSchleuse:="BG3344", B_Stau_raus:="DLPtoHW_Sensoren".Stau_BG3344.Stat.B_Akt, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0065", Antrieb_plus_aktiv:=?, Schleuse_geöffnet:="MB3345", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DLPtoHW_Zylinder".Schleuse_3345.Stat.Ast, Error:=DB708.DBW586, Antrieb_Schleuse_vor:="DLPtoHW_Antriebe".MA0065.Stat.A_vor, Antrieb_Schleuse_start:="DLPtoHW_Antriebe".MA0065.Stat.A_start, Antrieb_Schleuse_stop:="DLPtoHW_Antriebe".MA0065.Stat.Stop_vor, Antrieb_Schleuse_PS:="DLPtoHW_Antriebe".MA0065.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) - - ---- NW 6: Wartezeit bis erneuter Trolleystart sinnvoll (wegen Staubildung) --- - A "MB3325" - Rise Trolleys_starten.Flanke - S Trolleys_starten.Wartezeit_aktiv - JCN Warten // Negierter Sprung - - L 15 // Wartezeit in Sekunden - T Trolleys_starten.Timer_Wartenzeit - -Warten: AN Trolleys_starten.Wartezeit_aktiv - O - A "MB3325" // Schleuse offen - AN "MA0065" // Aber Trolley fährt nicht - ON "1s-Impuls" - JC Wait - - L Trolleys_starten.Timer_Wartenzeit - + -1 - T Trolleys_starten.Timer_Wartenzeit - L 0 - >I - JC Wait - - SET - R Trolleys_starten.Wartezeit_aktiv - -Wait: NOP 0 - - ---- NW 7: Schleuse 3325 --- - AN Trolleys_starten.Wartezeit_aktiv - = Fahren_Ok - - A "BG3343" - O "BG3344" - = B_vor_Schleuse - -CALL FB "None" , (Schleusen_Nr:=3325, ErrQuit:=ErrQuit, B_VorSchleuse:=B_vor_Schleuse, B_InSchleuse:="BG3325", B_Zähl:="BG3326", B_Stau_raus:="DLPtoHW_Sensoren".Stau_BG3326.Stat.B_Akt, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0065", Antrieb_plus_aktiv:="MA0066", Schleuse_geöffnet:="MB3325", RestZeit_Bereich_plus:=Bereich_4236.Dyn.Restzeit, Y_Schleuse_Auf:="DLPtoHW_Zylinder".Schleuse_3325.Stat.Ast, Error:=DB708.DBW574, Antrieb_Schleuse_vor:="DLPtoHW_Antriebe".MA0065.Stat.A_vor, Antrieb_Schleuse_start:="DLPtoHW_Antriebe".MA0065.Stat.A_start, Antrieb_Schleuse_stop:="DLPtoHW_Antriebe".MA0065.Stat.Stop_vor, Antrieb_Schleuse_PS:="DLPtoHW_Antriebe".MA0065.Stat.A_PS, Antrieb_plus_vor:=Bereich_4236.Dyn.Status.Trolley_kommt_in_Bereich, Antrieb_plus_start:=?, hStOk:=ErrAnz) - - ---- NW 8: Störungen anzeigen UZ0703 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ0703.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 9: Störungen quittieren UZ0703/7303 --- - A "DOutbound_Bereich".A01_UZ0703.StOk_aktiv - O "DOutbound_Bereich".A01_UZ7303.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 10: Bereich 4236 --- - A "BG3326" - A "MB3325" - = B_vor_Schleuse - - A Schleuse_4221.Dyn.Sk.Bereich_ok - AN "BG4221" // Da kein Platz für 2.Trolley wegen Kurve - = Fahren_Ok - -CALL FB "None" , (Bereichs_Nr:=4236, ErrQuit:=ErrQuit, B_BereichsAnfang:=B_vor_Schleuse, B_BereichsEnde:="BG4236", B_Zähl:="BG4220", B_Stau_raus:="DLPtoHW_Sensoren".Stau_BG4220.Stat.B_Akt, Start_Ok:=Schleuse_4221.Dyn.Sk.Bereich_ok, Antrieb_Bereich_aktiv:="MA0066", Antrieb_plus_aktiv:="MA0264", RestZeit_Bereich_plus:=?, Antrieb_Bereich_vor:="DLPtoHW_Antriebe".MA0066.Stat.A_vor, Antrieb_Bereich_stop:="DLPtoHW_Antriebe".MA0066.Stat.Stop_vor, Error:=DB708.DBW472, Antrieb_Bereich_start:="DLPtoHW_Antriebe".MA0066.Stat.A_start, Antrieb_plus_vor:="DLPtoHW_Antriebe".MA0264.Stat.A_vor, Antrieb_plus_start:="DLPtoHW_Antriebe".MA0264.Stat.A_start, Antrieb_minus_vor:="DLPtoHW_Antriebe".MA0065.Stat.A_vor, hStOk:=ErrAnz) - - ---- NW 11: Störungen anzeigen UZ0703/7303 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ0703.StOk_blinken - S "DOutbound_Bereich".A01_UZ7303.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 12: Störungen quittieren UZ7303 --- - A "DOutbound_Bereich".A01_UZ7303.StOk_aktiv - O "DOutbound_Bereich".A01_UC073.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 13: Schleuse 4221 (vor ByPass) --- -CALL FB "None" , (Schleusen_Nr:=4221, ErrQuit:=ErrQuit, B_VorSchleuse:="BG4220", B_InSchleuse:="BG4221", B_Zähl:=?, B_Stau_raus:=?, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0264", Antrieb_plus_aktiv:=1, Schleuse_geöffnet:="MB4221", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DLPtoHW_Zylinder".Schleuse_4221.Stat.Ast, Error:=DB708.DBW550, Antrieb_Schleuse_vor:="DLPtoHW_Antriebe".MA0264.Stat.A_vor, Antrieb_Schleuse_start:="DLPtoHW_Antriebe".MA0264.Stat.A_start, Antrieb_Schleuse_stop:="DLPtoHW_Antriebe".MA0264.Stat.Stop_vor, Antrieb_Schleuse_PS:="DLPtoHW_Antriebe".MA0264.Stat.A_PS, Antrieb_plus_vor:=?, Antrieb_plus_start:=?, hStOk:=ErrAnz) // über Weiche | über Weiche | über Weiche | über Weiche - - - ---- NW 14: Weiche 4223 (ByPass zu VP) --- - SET - R Antrieb_vor - R Antrieb_stop - - A "MA0264" - A "MA0265" - = Antrieb_aktiv - -CALL FB "None" , (Weichen_Nr:=4223, ErrQuit:=ErrQuit, Fahren_Ok:=1, B_Ziel_gerade:="BG4224", B_Ziel_abzweig:="BG4211", Antrieb_Weiche_aktiv:=Antrieb_aktiv, Antrieb_Gerade_aktiv:="MA0265", Antrieb_Abzweig_aktiv:="MA0263", Weiche_ist_AST:="MB4223", Y_Weiche_gerade:=?, Y_Weiche_abzweig:="DLPtoHW_Zylinder".Weiche_4223.Stat.Ast, Error:=DB708.DBW546, Antrieb_Weiche_vor:=Antrieb_vor, Antrieb_Weiche_stop:=Antrieb_stop, Antrieb_Weiche_gerade_vor:=?, Antrieb_Weiche_gerade_stop:=?, Antrieb_Weiche_abzweig_vor:="DHWtoVP_Antriebe".MA0263.Stat.A_vor, Antrieb_Weiche_abzweig_stop:="DHWtoVP_Antriebe".MA0263.Stat.Stop_vor, hStOk:=ErrAnz) // schon gesetzt | schon gesetzt - - A Antrieb_vor - S "DLPtoHW_Antriebe".MA0264.Stat.A_vor - S "DLPtoHW_Antriebe".MA0265.Stat.A_vor - A Antrieb_stop - S "DLPtoHW_Antriebe".MA0264.Stat.Stop_vor - S "DLPtoHW_Antriebe".MA0265.Stat.Stop_vor - -// Damit Partner fahren kann: - A Weiche_4223.Dyn.Status.Weiche_frei - R "DLPtoHW_Zylinder".Weiche_4223.Stat.Ast - - ---- NW 15: Störungen anzeigen UZ7303 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7303.StOk_blinken - S "DOutbound_Bereich".A01_UC073.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 16: Störungen quittieren UZ7303/7302 --- - A "DOutbound_Bereich".A01_UZ7303.StOk_aktiv - O "DOutbound_Bereich".A01_UZ7302.StOk_aktiv - O "DOutbound_Bereich".A01_UC073.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 17: MA0265 / Übergang 4225 --- -CALL FB "None" , (ErrQuit:=ErrQuit, B_Anfang:="BG4224", B_Am_Übergang:="BG4225", B_Stau_Antrieb_plus:="BG4226", Antrieb_aktiv:="MA0265", Antrieb_plus_aktiv:="MA0266", Antrieb_vor:="DLPtoHW_Antriebe".MA0265.Stat.A_vor, Antrieb_start:="DLPtoHW_Antriebe".MA0265.Stat.A_start, Antrieb_stop:="DLPtoHW_Antriebe".MA0265.Stat.A_PS, Antrieb_plus_vor:="DLPtoHW_Antriebe".MA0266.Stat.A_vor, Antrieb_plus_start:="DLPtoHW_Antriebe".MA0266.Stat.A_start) - - ---- NW 18: Schleuse 4227 --- -CALL FB "None" , (Schleusen_Nr:=4227, ErrQuit:=ErrQuit, B_VorSchleuse:="BG4225", B_InSchleuse:="BG4227", B_AusSchleuse:="BG4231", B_Stau_raus:="DLPtoHW_Sensoren".Stau_BG4231.Stat.B_Akt, Start_Ok:=1, Antrieb_Schleuse_aktiv:="MA0266", Antrieb_plus_aktiv:="MA0267", Schleuse_geöffnet:="MB4227", RestZeit_Bereich_plus:=Bereich_4232.Dyn.Restzeit, Y_Schleuse_Auf:="DLPtoHW_Zylinder".Schleuse_4227.Stat.Ast, Error:=DB708.DBW548, Antrieb_Schleuse_vor:="DLPtoHW_Antriebe".MA0266.Stat.A_vor, Antrieb_Schleuse_start:="DLPtoHW_Antriebe".MA0266.Stat.A_start, Antrieb_Schleuse_stop:="DLPtoHW_Antriebe".MA0266.Stat.Stop_vor, Antrieb_Schleuse_PS:="DLPtoHW_Antriebe".MA0266.Stat.A_PS, Antrieb_plus_vor:=Bereich_4232.Dyn.Status.Trolley_kommt_in_Bereich, Antrieb_plus_start:=?, hStOk:=ErrAnz) - - ---- NW 19: Störungen anzeigen UZ7303/7302 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7303.StOk_blinken - S "DOutbound_Bereich".A01_UZ7302.StOk_blinken - S "DOutbound_Bereich".A01_UC073.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 20: Störungen quittieren UZ7302 --- - A "DOutbound_Bereich".A01_UZ7302.StOk_aktiv - O "DOutbound_Bereich".A01_UC073.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 21: Bereich 4232 --- - A "BG4231" - A "MB4227" - = B_vor_Schleuse - - A "DLPtoHW_Sensoren".Stau_BG4233.Stat.B_Akt - O "DLPtoHW_Sensoren".Stau_BG4234.Stat.B_Akt - = Stau_raus - -CALL FB "None" , (Bereichs_Nr:=4232, ErrQuit:=ErrQuit, B_BereichsAnfang:=B_vor_Schleuse, B_BereichsEnde:="BG4232", B_Zähl:="BG4233", B_Stau_raus:=Stau_raus, Start_Ok:=1, Antrieb_Bereich_aktiv:="MA0267", Antrieb_plus_aktiv:="MA0270", RestZeit_Bereich_plus:=?, Antrieb_Bereich_vor:="DLPtoHW_Antriebe".MA0267.Stat.A_vor, Antrieb_Bereich_stop:="DLPtoHW_Antriebe".MA0267.Stat.Stop_vor, Error:=DB708.DBW470, Antrieb_Bereich_start:="DLPtoHW_Antriebe".MA0267.Stat.A_start, Antrieb_plus_vor:="DLPtoHW_Antriebe".MA0270.Stat.A_vor, Antrieb_plus_start:="DLPtoHW_Antriebe".MA0270.Stat.A_start, Antrieb_minus_vor:="DLPtoHW_Antriebe".MA0266.Stat.A_vor, hStOk:=ErrAnz) - - ---- NW 22: Schleuse 4235 (vor BST 2) --- - AN "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3 - AN "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4 - AN "7_HMI_Err_UH07_OB".System.BST2_Feueralarm - AN "7_HMI_Err_UH07_OB".System.BST2_Geschlossen - AN "7_HMI_Err_UH07_OB".System."BST2_Störung" - A Bereich_3732.Dyn.Sk.Bereich_ok - = Fahren_Ok - -CALL FB "None" , (Schleusen_Nr:=4235, ErrQuit:=ErrQuit, B_VorSchleuse:="BG4233", B_InSchleuse:="BG4235", B_AusSchleuse:="BG3720", B_Stau_raus:="DLPtoHW_Sensoren".Stau_BG3720.Stat.B_Akt, Start_Ok:=Fahren_Ok, Antrieb_Schleuse_aktiv:="MA0270", Antrieb_plus_aktiv:="MA0202", Schleuse_geöffnet:="MB4235", RestZeit_Bereich_plus:=Bereich_3732.Dyn.Restzeit, Y_Schleuse_Auf:="DLPtoHW_Zylinder".Schleuse_4235.Stat.Ast, Error:=DB708.DBW552, Antrieb_Schleuse_vor:="DLPtoHW_Antriebe".MA0270.Stat.A_vor, Antrieb_Schleuse_start:="DLPtoHW_Antriebe".MA0270.Stat.A_start, Antrieb_Schleuse_stop:="DLPtoHW_Antriebe".MA0270.Stat.Stop_vor, Antrieb_Schleuse_PS:="DLPtoHW_Antriebe".MA0270.Stat.A_PS, Antrieb_plus_vor:=Bereich_3732.Dyn.Status.Trolley_kommt_in_Bereich, Antrieb_plus_start:=?, hStOk:=ErrAnz) - - ---- NW 23: Störungen anzeigen UZ7302 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7302.StOk_blinken - S "DOutbound_Bereich".A01_UC073.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 24: Störungen quittieren UZ7202 --- - A "DOutbound_Bereich".A01_UZ7202.StOk_aktiv - O "DOutbound_Bereich".A01_UC072.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 25: Bereich 3732 (hinter BST 2) --- - A "BG3720" - A "MB4235" - = B_vor_Schleuse - -CALL FB "None" , (Bereichs_Nr:=3732, ErrQuit:=ErrQuit, B_BereichsAnfang:=B_vor_Schleuse, B_BereichsEnde:="BG3732", B_Zähl:="BG3721", B_Stau_raus:="DLPtoHW_Sensoren".Stau_BG3721.Stat.B_Akt, Start_Ok:=1, Antrieb_Bereich_aktiv:="MA0202", Antrieb_plus_aktiv:="MA0203", RestZeit_Bereich_plus:=?, Antrieb_Bereich_vor:="DLPtoHW_Antriebe".MA0202.Stat.A_vor, Antrieb_Bereich_stop:="DLPtoHW_Antriebe".MA0202.Stat.Stop_vor, Error:=DB708.DBW460, Antrieb_Bereich_start:="DLPtoHW_Antriebe".MA0202.Stat.A_start, Antrieb_plus_vor:="DLPtoHW_Antriebe".MA0203.Stat.A_vor, Antrieb_plus_start:="DLPtoHW_Antriebe".MA0203.Stat.A_start, Antrieb_minus_vor:=?, hStOk:=ErrAnz) - - ---- NW 26: Störungen anzeigen UZ7202 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7202.StOk_blinken - S "DOutbound_Bereich".A01_UC072.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 27: Störungen quittieren UZ7202/7201 --- - A "DOutbound_Bereich".A01_UZ7202.StOk_aktiv - O "DOutbound_Bereich".A01_UZ7201.StOk_aktiv - O "DOutbound_Bereich".A01_UC072.StOk_aktiv - O "DOutbound_Bereich".A01_UH07.StOk_aktiv - = ErrQuit - - ---- NW 28: Schleuse 3722 (Übergabe an AMR / UH06) --- -// Schnittstelle von Outbound: (Verarbeitung s.u.) - A "DSchnittstelle_zu_AMR".From_UH06.MA0203_aktiv - - A "DSchnittstelle_zu_AMR".From_UH06.MA0203_kein_Stau - -// Pro Zyklus neu erzeugen: - SET - R "DSchnittstelle_zu_AMR".To_UH06.MA0203_A_vor - R "DSchnittstelle_zu_AMR".To_UH06.MA0203_A_start - -CALL FB "None" , (Schleusen_Nr:=3722, ErrQuit:=ErrQuit, B_VorSchleuse:="BG3721", B_InSchleuse:="BG3722", B_Zähl:="BG3723", B_Stau_raus:="DLPtoHW_Sensoren".Stau_BG3723.Stat.B_Akt, Start_Ok:="DSchnittstelle_zu_AMR".From_UH06.MA0203_kein_Stau, Antrieb_Schleuse_aktiv:="MA0203", Antrieb_plus_aktiv:="DSchnittstelle_zu_AMR".From_UH06.MA0203_aktiv, Schleuse_geöffnet:="MB3722", RestZeit_Bereich_plus:=?, Y_Schleuse_Auf:="DLPtoHW_Zylinder".Schleuse_3722.Stat.Ast, Error:=DB708.DBW534, Antrieb_Schleuse_vor:="DLPtoHW_Antriebe".MA0203.Stat.A_vor, Antrieb_Schleuse_start:="DLPtoHW_Antriebe".MA0203.Stat.A_start, Antrieb_Schleuse_stop:="DLPtoHW_Antriebe".MA0203.Stat.Stop_vor, Antrieb_Schleuse_PS:="DLPtoHW_Antriebe".MA0203.Stat.A_PS, Antrieb_plus_vor:="DSchnittstelle_zu_AMR".To_UH06.MA0203_A_vor, Antrieb_plus_start:="DSchnittstelle_zu_AMR".To_UH06.MA0203_A_start, hStOk:=ErrAnz) - -// Schnittstelle zu Outbound: (Verarbeitung s.o.) - A "DLPtoHW_Sensoren"."Fährt_zu_UH06".Stat.B_Akt - S "DSchnittstelle_zu_AMR".To_UH06.MA0203_A_vor - S "DSchnittstelle_zu_AMR".To_UH06.MA0203_A_start - S "DLPtoHW_Antriebe".MA0203.Stat.A_vor - - ---- NW 29: Störungen anzeigen UZ7202/7201 --- - A ErrAnz - R ErrAnz - S "DOutbound_Bereich".A01_UZ7202.StOk_blinken - S "DOutbound_Bereich".A01_UZ7201.StOk_blinken - S "DOutbound_Bereich".A01_UC072.StOk_blinken - S "DOutbound_Bereich".A01_UH07.StOk_blinken - - ---- NW 30: Ende --- - BE +FUNCTION_BLOCK "LPtoHW_OmniFahren" +TITLE = Omnifahren Outbound Leerpuffer > Highway +{ S7_Optimized_Access := 'FALSE' } +VERSION : 0.1 + VAR + Schleuse_3342 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Schleuse_3323 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Schleuse_3325 { S7_SetPoint := 'False'} : "MHMOmniSchleuse_Plus"; + Bereich_4236 : "MHMOmniBereich_Plus"; + Schleuse_4221 { S7_SetPoint := 'False'} : "MHMOmniSchleuse_Plus"; + Weiche_4223 : "MHMOmniWeiche_Plus"; + Schleuse_4227 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Bereich_4232 : "MHMOmniBereich_Plus"; + Schleuse_4235 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Bereich_3732 : "MHMOmniBereich_Plus"; + Schleuse_3722 { S7_SetPoint := 'False'} : "MHMOmniSchleuse_Plus"; + Schleuse_3345 { S7_SetPoint := 'False'} : "MHMOmniSchleuse"; + Übergang_4225 { S7_SetPoint := 'False'} : "MHMÜbergang_ohne_Schleuse"; + Trolleys_starten : Struct + Flanke : Bool; + Wartezeit_aktiv : Bool; + Timer_Wartenzeit { S7_SetPoint := 'True'} : Int; + END_STRUCT; + END_VAR + + VAR_TEMP + ErrQuit : Bool; + ErrAnz : Bool; + Stau_raus : Bool; + Start_ok : Bool; + B_aktiv : Bool; + B_vor_Schleuse : Bool; + B_nach_Schleuse : Bool; + Antrieb_aktiv : Bool; + Antrieb_vor : Bool; + Antrieb_stop : Bool; + Fahren_Ok : Bool; + Antrieb_nicht_stoppen : Bool; + END_VAR + + +BEGIN +NETWORK +TITLE = Systemzeug + +//Verschiedene Bereiche: + U "DOutbound_Bereich".A01_UH07.AnlageEin; + = #Schleuse_3342.Dyn.Sk.Auto_akt; + = #Schleuse_3323.Dyn.Sk.Auto_akt; + = #Schleuse_3345.Dyn.Sk.Auto_akt; + = #Schleuse_3325.Dyn.Sk.Auto_akt; + = #Bereich_4236.Dyn.Sk.Auto_akt; + = #Schleuse_4221.Dyn.Sk.Auto_akt; + = #Weiche_4223.Dyn.Status.Auto_akt; + = #Schleuse_4227.Dyn.Sk.Auto_akt; + = #Bereich_4232.Dyn.Sk.Auto_akt; + = #Schleuse_4235.Dyn.Sk.Auto_akt; + = #Bereich_3732.Dyn.Sk.Auto_akt; + = #Schleuse_3722.Dyn.Sk.Auto_akt; + + UN "DOutbound_Bereich".A01_UH07.BereichErr; + = #Schleuse_3342.Dyn.Sk.Bereich_ok; + = #Schleuse_3323.Dyn.Sk.Bereich_ok; + = #Schleuse_3345.Dyn.Sk.Bereich_ok; + = #Schleuse_3325.Dyn.Sk.Bereich_ok; + = #Bereich_4236.Dyn.Sk.Bereich_ok; + UN "DOutbound_Bereich".A01_UC073.BereichErr; + = #Schleuse_4221.Dyn.Sk.Bereich_ok; + = #Weiche_4223.Dyn.Status.Bereich_ok; + = #Schleuse_4227.Dyn.Sk.Bereich_ok; + = #Bereich_4232.Dyn.Sk.Bereich_ok; + = #Schleuse_4235.Dyn.Sk.Bereich_ok; + UN "DOutbound_Bereich".A01_UC072.BereichErr; + = #Bereich_3732.Dyn.Sk.Bereich_ok; + = #Schleuse_3722.Dyn.Sk.Bereich_ok; + +NETWORK +TITLE = Störungen quittieren UZ0703 + U "DOutbound_Bereich".A01_UZ0703.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Schleuse 3342 (Vor BeladePlatz) + U "DLPtoHW_Sensoren".An_BG3323.Stat.B_Akt; + = #Stau_raus; + = #B_nach_Schleuse; + + CALL #Schleuse_3342 + ( Schleusen_Nr := 3342 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG3322" , + B_InSchleuse := "BG3342" , + B_AusSchleuse := #B_nach_Schleuse , + B_Stau_raus := #Stau_raus , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0065" , + Antrieb_plus_aktiv := "MA0065" , + Schleuse_geöffnet := "MB3342" , + Y_Schleuse_Auf := "DLPtoHW_Zylinder".Schleuse_3342.Stat.Ast , + Error := %DB708.DBW572 , + Antrieb_Schleuse_vor := "DLPtoHW_Antriebe".MA0065.Stat.A_vor , + Antrieb_Schleuse_start := "DLPtoHW_Antriebe".MA0065.Stat.A_start , + Antrieb_Schleuse_stop := "DLPtoHW_Antriebe".MA0065.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DLPtoHW_Antriebe".MA0065.Stat.A_PS , + Antrieb_plus_vor := , //Identisch + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Schleuse 3323 (BeladePlatz) + +//Beladen erlaubt: + U "DOutbound_Bereich".A01_UH07.AnlageEin; + U(; + U "DLeerPufferStrecken".DurchfahrModus.Aktiv; + U "Clock_5Hz";//Bei Durchfahrmodus blinken + ON "DLeerPufferStrecken".DurchfahrModus.Aktiv; + ); + = "PF0046" ;//Beladung bereit bei Dauerlicht + +//Untere Anzeigen werden im Ziel-FC gesetzt: + L #Schleuse_3323.Dyn.Sk.Akt_Schritt; + L 12; + <>I; + R "PF0033" ;//Signalsäule blau + R "PF0044";//Trolley starten ok + + CALL #Schleuse_3323 + ( Schleusen_Nr := 3323 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "MB3342" , + B_InSchleuse := "BG3323" , + B_AusSchleuse := "BG3343" , + B_Stau_raus := "DLPtoHW_Sensoren".Stau_BG3343.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0065" , + Schleuse_geöffnet := "MB3323" , + Y_Schleuse_Auf := "DLPtoHW_Zylinder".Schleuse_3323.Stat.Ast , + Error := %DB708.DBW526 , + Antrieb_Schleuse_vor := "DLPtoHW_Antriebe".MA0065.Stat.A_vor , + Antrieb_Schleuse_start := "DLPtoHW_Antriebe".MA0065.Stat.A_start , + Antrieb_Schleuse_stop := "DLPtoHW_Antriebe".MA0065.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DLPtoHW_Antriebe".MA0065.Stat.A_PS , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Schleuse 3345 (Hinter BeladePlatz) + CALL #Schleuse_3345 + ( Schleusen_Nr := 3345 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG3343" , + B_InSchleuse := "BG3345" , + B_AusSchleuse := "BG3344" , + B_Stau_raus := "DLPtoHW_Sensoren".Stau_BG3344.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0065" , + Schleuse_geöffnet := "MB3345" , + Y_Schleuse_Auf := "DLPtoHW_Zylinder".Schleuse_3345.Stat.Ast , + Error := %DB708.DBW586 , + Antrieb_Schleuse_vor := "DLPtoHW_Antriebe".MA0065.Stat.A_vor , + Antrieb_Schleuse_start := "DLPtoHW_Antriebe".MA0065.Stat.A_start , + Antrieb_Schleuse_stop := "DLPtoHW_Antriebe".MA0065.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DLPtoHW_Antriebe".MA0065.Stat.A_PS , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Wartezeit bis erneuter Trolleystart sinnvoll (wegen Staubildung) + U "MB3325"; + FP #Trolleys_starten.Flanke; + S #Trolleys_starten.Wartezeit_aktiv; + SPBN Warten ;//Negierter Sprung + + L 15 ;//Wartezeit in Sekunden + T #Trolleys_starten.Timer_Wartenzeit; + +Warten: UN #Trolleys_starten.Wartezeit_aktiv; + O; + U "MB3325" ;//Schleuse offen + UN "MA0065" ;//Aber Trolley fährt nicht + ON "1s-Impuls"; + SPB Wait; + + L #Trolleys_starten.Timer_Wartenzeit; + + -1; + T #Trolleys_starten.Timer_Wartenzeit; + L 0; + >I; + SPB Wait; + + SET; + R #Trolleys_starten.Wartezeit_aktiv; + +Wait: NOP 0; + +NETWORK +TITLE = Schleuse 3325 + UN #Trolleys_starten.Wartezeit_aktiv; + = #Fahren_Ok; + + U "BG3343"; + O "BG3344"; + = #B_vor_Schleuse; + + CALL #Schleuse_3325 + ( Schleusen_Nr := 3325 , + ErrQuit := #ErrQuit , + B_VorSchleuse := #B_vor_Schleuse , + B_InSchleuse := "BG3325" , + B_Zähl := "BG3326" , + B_Stau_raus := "DLPtoHW_Sensoren".Stau_BG3326.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0065" , + Antrieb_plus_aktiv := "MA0066" , + Schleuse_geöffnet := "MB3325" , + RestZeit_Bereich_plus := #Bereich_4236.Dyn.Restzeit , + Y_Schleuse_Auf := "DLPtoHW_Zylinder".Schleuse_3325.Stat.Ast , + Error := %DB708.DBW574 , + Antrieb_Schleuse_vor := "DLPtoHW_Antriebe".MA0065.Stat.A_vor , + Antrieb_Schleuse_start := "DLPtoHW_Antriebe".MA0065.Stat.A_start , + Antrieb_Schleuse_stop := "DLPtoHW_Antriebe".MA0065.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DLPtoHW_Antriebe".MA0065.Stat.A_PS , + Antrieb_plus_vor := #Bereich_4236.Dyn.Status.Trolley_kommt_in_Bereich , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Störungen anzeigen UZ0703 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ0703.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Störungen quittieren UZ0703/7303 + U "DOutbound_Bereich".A01_UZ0703.StOk_aktiv; + O "DOutbound_Bereich".A01_UZ7303.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Bereich 4236 + U "BG3326"; + U "MB3325"; + = #B_vor_Schleuse; + + U #Schleuse_4221.Dyn.Sk.Bereich_ok; + UN "BG4221";//Da kein Platz für 2.Trolley wegen Kurve + = #Fahren_Ok; + + CALL #Bereich_4236 + ( Bereichs_Nr := 4236 , + ErrQuit := #ErrQuit , + B_BereichsAnfang := #B_vor_Schleuse , + B_BereichsEnde := "BG4236" , + B_Zähl := "BG4220" , + B_Stau_raus := "DLPtoHW_Sensoren".Stau_BG4220.Stat.B_Akt , + Start_Ok := #Schleuse_4221.Dyn.Sk.Bereich_ok , + Antrieb_Bereich_aktiv := "MA0066" , + Antrieb_plus_aktiv := "MA0264" , + Antrieb_Bereich_vor := "DLPtoHW_Antriebe".MA0066.Stat.A_vor , + Antrieb_Bereich_stop := "DLPtoHW_Antriebe".MA0066.Stat.Stop_vor , + Error := %DB708.DBW472 , + Antrieb_Bereich_start := "DLPtoHW_Antriebe".MA0066.Stat.A_start , + Antrieb_plus_vor := "DLPtoHW_Antriebe".MA0264.Stat.A_vor , + Antrieb_plus_start := "DLPtoHW_Antriebe".MA0264.Stat.A_start , + Antrieb_minus_vor := "DLPtoHW_Antriebe".MA0065.Stat.A_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Störungen anzeigen UZ0703/7303 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ0703.StOk_blinken; + S "DOutbound_Bereich".A01_UZ7303.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Störungen quittieren UZ7303 + U "DOutbound_Bereich".A01_UZ7303.StOk_aktiv; + O "DOutbound_Bereich".A01_UC073.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Schleuse 4221 (vor ByPass) + CALL #Schleuse_4221 + ( Schleusen_Nr := 4221 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG4220" , + B_InSchleuse := "BG4221" , + B_Zähl := , //über Weiche + B_Stau_raus := , //über Weiche + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0264" , + Antrieb_plus_aktiv := 1 , + Schleuse_geöffnet := "MB4221" , + Y_Schleuse_Auf := "DLPtoHW_Zylinder".Schleuse_4221.Stat.Ast , + Error := %DB708.DBW550 , + Antrieb_Schleuse_vor := "DLPtoHW_Antriebe".MA0264.Stat.A_vor , + Antrieb_Schleuse_start := "DLPtoHW_Antriebe".MA0264.Stat.A_start , + Antrieb_Schleuse_stop := "DLPtoHW_Antriebe".MA0264.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DLPtoHW_Antriebe".MA0264.Stat.A_PS , + Antrieb_plus_vor := , //über Weiche + Antrieb_plus_start := , //über Weiche + hStOk := #ErrAnz + ); + + +NETWORK +TITLE = Weiche 4223 (ByPass zu VP) + SET; + R #Antrieb_vor; + R #Antrieb_stop; + + U "MA0264"; + U "MA0265"; + = #Antrieb_aktiv; + + CALL #Weiche_4223 + ( Weichen_Nr := 4223 , + ErrQuit := #ErrQuit , + Fahren_Ok := 1 , + B_Ziel_gerade := "BG4224" , + B_Ziel_abzweig := "BG4211" , + Antrieb_Weiche_aktiv := #Antrieb_aktiv , + Antrieb_Gerade_aktiv := "MA0265" , + Antrieb_Abzweig_aktiv := "MA0263" , + Weiche_ist_AST := "MB4223" , + Y_Weiche_abzweig := "DLPtoHW_Zylinder".Weiche_4223.Stat.Ast , + Error := %DB708.DBW546 , + Antrieb_Weiche_vor := #Antrieb_vor , + Antrieb_Weiche_stop := #Antrieb_stop , + Antrieb_Weiche_gerade_vor := , //schon gesetzt + Antrieb_Weiche_gerade_stop := , //schon gesetzt + Antrieb_Weiche_abzweig_vor := "DHWtoVP_Antriebe".MA0263.Stat.A_vor , + Antrieb_Weiche_abzweig_stop := "DHWtoVP_Antriebe".MA0263.Stat.Stop_vor , + hStOk := #ErrAnz + ); + + U #Antrieb_vor; + S "DLPtoHW_Antriebe".MA0264.Stat.A_vor; + S "DLPtoHW_Antriebe".MA0265.Stat.A_vor; + U #Antrieb_stop; + S "DLPtoHW_Antriebe".MA0264.Stat.Stop_vor; + S "DLPtoHW_Antriebe".MA0265.Stat.Stop_vor; + +//Damit Partner fahren kann: + U #Weiche_4223.Dyn.Status.Weiche_frei; + R "DLPtoHW_Zylinder".Weiche_4223.Stat.Ast; + +NETWORK +TITLE = Störungen anzeigen UZ7303 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7303.StOk_blinken; + S "DOutbound_Bereich".A01_UC073.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Störungen quittieren UZ7303/7302 + U "DOutbound_Bereich".A01_UZ7303.StOk_aktiv; + O "DOutbound_Bereich".A01_UZ7302.StOk_aktiv; + O "DOutbound_Bereich".A01_UC073.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = MA0265 / Übergang 4225 + CALL #Übergang_4225 + ( ErrQuit := #ErrQuit , + B_Anfang := "BG4224" , + B_Am_Übergang := "BG4225" , + B_Stau_Antrieb_plus := "BG4226" , + Antrieb_aktiv := "MA0265" , + Antrieb_plus_aktiv := "MA0266" , + Antrieb_vor := "DLPtoHW_Antriebe".MA0265.Stat.A_vor , + Antrieb_start := "DLPtoHW_Antriebe".MA0265.Stat.A_start , + Antrieb_stop := "DLPtoHW_Antriebe".MA0265.Stat.A_PS , + Antrieb_plus_vor := "DLPtoHW_Antriebe".MA0266.Stat.A_vor , + Antrieb_plus_start := "DLPtoHW_Antriebe".MA0266.Stat.A_start + ); + +NETWORK +TITLE = Schleuse 4227 + CALL #Schleuse_4227 + ( Schleusen_Nr := 4227 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG4225" , + B_InSchleuse := "BG4227" , + B_AusSchleuse := "BG4231" , + B_Stau_raus := "DLPtoHW_Sensoren".Stau_BG4231.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Schleuse_aktiv := "MA0266" , + Antrieb_plus_aktiv := "MA0267" , + Schleuse_geöffnet := "MB4227" , + RestZeit_Bereich_plus := #Bereich_4232.Dyn.Restzeit , + Y_Schleuse_Auf := "DLPtoHW_Zylinder".Schleuse_4227.Stat.Ast , + Error := %DB708.DBW548 , + Antrieb_Schleuse_vor := "DLPtoHW_Antriebe".MA0266.Stat.A_vor , + Antrieb_Schleuse_start := "DLPtoHW_Antriebe".MA0266.Stat.A_start , + Antrieb_Schleuse_stop := "DLPtoHW_Antriebe".MA0266.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DLPtoHW_Antriebe".MA0266.Stat.A_PS , + Antrieb_plus_vor := #Bereich_4232.Dyn.Status.Trolley_kommt_in_Bereich , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Störungen anzeigen UZ7303/7302 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7303.StOk_blinken; + S "DOutbound_Bereich".A01_UZ7302.StOk_blinken; + S "DOutbound_Bereich".A01_UC073.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Störungen quittieren UZ7302 + U "DOutbound_Bereich".A01_UZ7302.StOk_aktiv; + O "DOutbound_Bereich".A01_UC073.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Bereich 4232 + U "BG4231"; + U "MB4227"; + = #B_vor_Schleuse; + + U "DLPtoHW_Sensoren".Stau_BG4233.Stat.B_Akt; + O "DLPtoHW_Sensoren".Stau_BG4234.Stat.B_Akt; + = #Stau_raus; + + CALL #Bereich_4232 + ( Bereichs_Nr := 4232 , + ErrQuit := #ErrQuit , + B_BereichsAnfang := #B_vor_Schleuse , + B_BereichsEnde := "BG4232" , + B_Zähl := "BG4233" , + B_Stau_raus := #Stau_raus , + Start_Ok := 1 , + Antrieb_Bereich_aktiv := "MA0267" , + Antrieb_plus_aktiv := "MA0270" , + Antrieb_Bereich_vor := "DLPtoHW_Antriebe".MA0267.Stat.A_vor , + Antrieb_Bereich_stop := "DLPtoHW_Antriebe".MA0267.Stat.Stop_vor , + Error := %DB708.DBW470 , + Antrieb_Bereich_start := "DLPtoHW_Antriebe".MA0267.Stat.A_start , + Antrieb_plus_vor := "DLPtoHW_Antriebe".MA0270.Stat.A_vor , + Antrieb_plus_start := "DLPtoHW_Antriebe".MA0270.Stat.A_start , + Antrieb_minus_vor := "DLPtoHW_Antriebe".MA0266.Stat.A_vor , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Schleuse 4235 (vor BST 2) + UN "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3; + UN "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4; + UN "7_HMI_Err_UH07_OB".System.BST2_Feueralarm; + UN "7_HMI_Err_UH07_OB".System.BST2_Geschlossen; + UN "7_HMI_Err_UH07_OB".System.BST2_Störung; + U #Bereich_3732.Dyn.Sk.Bereich_ok; + = #Fahren_Ok; + + CALL #Schleuse_4235 + ( Schleusen_Nr := 4235 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG4233" , + B_InSchleuse := "BG4235" , + B_AusSchleuse := "BG3720" , + B_Stau_raus := "DLPtoHW_Sensoren".Stau_BG3720.Stat.B_Akt , + Start_Ok := #Fahren_Ok , + Antrieb_Schleuse_aktiv := "MA0270" , + Antrieb_plus_aktiv := "MA0202" , + Schleuse_geöffnet := "MB4235" , + RestZeit_Bereich_plus := #Bereich_3732.Dyn.Restzeit , + Y_Schleuse_Auf := "DLPtoHW_Zylinder".Schleuse_4235.Stat.Ast , + Error := %DB708.DBW552 , + Antrieb_Schleuse_vor := "DLPtoHW_Antriebe".MA0270.Stat.A_vor , + Antrieb_Schleuse_start := "DLPtoHW_Antriebe".MA0270.Stat.A_start , + Antrieb_Schleuse_stop := "DLPtoHW_Antriebe".MA0270.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DLPtoHW_Antriebe".MA0270.Stat.A_PS , + Antrieb_plus_vor := #Bereich_3732.Dyn.Status.Trolley_kommt_in_Bereich , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Störungen anzeigen UZ7302 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7302.StOk_blinken; + S "DOutbound_Bereich".A01_UC073.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Störungen quittieren UZ7202 + U "DOutbound_Bereich".A01_UZ7202.StOk_aktiv; + O "DOutbound_Bereich".A01_UC072.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Bereich 3732 (hinter BST 2) + U "BG3720"; + U "MB4235"; + = #B_vor_Schleuse; + + CALL #Bereich_3732 + ( Bereichs_Nr := 3732 , + ErrQuit := #ErrQuit , + B_BereichsAnfang := #B_vor_Schleuse , + B_BereichsEnde := "BG3732" , + B_Zähl := "BG3721" , + B_Stau_raus := "DLPtoHW_Sensoren".Stau_BG3721.Stat.B_Akt , + Start_Ok := 1 , + Antrieb_Bereich_aktiv := "MA0202" , + Antrieb_plus_aktiv := "MA0203" , + Antrieb_Bereich_vor := "DLPtoHW_Antriebe".MA0202.Stat.A_vor , + Antrieb_Bereich_stop := "DLPtoHW_Antriebe".MA0202.Stat.Stop_vor , + Error := %DB708.DBW460 , + Antrieb_Bereich_start := "DLPtoHW_Antriebe".MA0202.Stat.A_start , + Antrieb_plus_vor := "DLPtoHW_Antriebe".MA0203.Stat.A_vor , + Antrieb_plus_start := "DLPtoHW_Antriebe".MA0203.Stat.A_start , + hStOk := #ErrAnz + ); + +NETWORK +TITLE = Störungen anzeigen UZ7202 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7202.StOk_blinken; + S "DOutbound_Bereich".A01_UC072.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Störungen quittieren UZ7202/7201 + U "DOutbound_Bereich".A01_UZ7202.StOk_aktiv; + O "DOutbound_Bereich".A01_UZ7201.StOk_aktiv; + O "DOutbound_Bereich".A01_UC072.StOk_aktiv; + O "DOutbound_Bereich".A01_UH07.StOk_aktiv; + = #ErrQuit; + +NETWORK +TITLE = Schleuse 3722 (Übergabe an AMR / UH06) + +//Schnittstelle von Outbound: (Verarbeitung s.u.) + U "DSchnittstelle_zu_AMR".From_UH06.MA0203_aktiv; + + U "DSchnittstelle_zu_AMR".From_UH06.MA0203_kein_Stau; + +//Pro Zyklus neu erzeugen: + SET; + R "DSchnittstelle_zu_AMR".To_UH06.MA0203_A_vor; + R "DSchnittstelle_zu_AMR".To_UH06.MA0203_A_start; + + CALL #Schleuse_3722 + ( Schleusen_Nr := 3722 , + ErrQuit := #ErrQuit , + B_VorSchleuse := "BG3721" , + B_InSchleuse := "BG3722" , + B_Zähl := "BG3723" , + B_Stau_raus := "DLPtoHW_Sensoren".Stau_BG3723.Stat.B_Akt , + Start_Ok := "DSchnittstelle_zu_AMR".From_UH06.MA0203_kein_Stau , + Antrieb_Schleuse_aktiv := "MA0203" , + Antrieb_plus_aktiv := "DSchnittstelle_zu_AMR".From_UH06.MA0203_aktiv , + Schleuse_geöffnet := "MB3722" , + Y_Schleuse_Auf := "DLPtoHW_Zylinder".Schleuse_3722.Stat.Ast , + Error := %DB708.DBW534 , + Antrieb_Schleuse_vor := "DLPtoHW_Antriebe".MA0203.Stat.A_vor , + Antrieb_Schleuse_start := "DLPtoHW_Antriebe".MA0203.Stat.A_start , + Antrieb_Schleuse_stop := "DLPtoHW_Antriebe".MA0203.Stat.Stop_vor , + Antrieb_Schleuse_PS := "DLPtoHW_Antriebe".MA0203.Stat.A_PS , + Antrieb_plus_vor := "DSchnittstelle_zu_AMR".To_UH06.MA0203_A_vor , + Antrieb_plus_start := "DSchnittstelle_zu_AMR".To_UH06.MA0203_A_start , + hStOk := #ErrAnz + ); + +//Schnittstelle zu Outbound: (Verarbeitung s.o.) + U "DLPtoHW_Sensoren".Fährt_zu_UH06.Stat.B_Akt; + S "DSchnittstelle_zu_AMR".To_UH06.MA0203_A_vor; + S "DSchnittstelle_zu_AMR".To_UH06.MA0203_A_start; + S "DLPtoHW_Antriebe".MA0203.Stat.A_vor; + +NETWORK +TITLE = Störungen anzeigen UZ7202/7201 + U #ErrAnz; + R #ErrAnz; + S "DOutbound_Bereich".A01_UZ7202.StOk_blinken; + S "DOutbound_Bereich".A01_UZ7201.StOk_blinken; + S "DOutbound_Bereich".A01_UC072.StOk_blinken; + S "DOutbound_Bereich".A01_UH07.StOk_blinken; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Omnifahren_LPtoHW/LPtoHW_Ziel_FC.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Omnifahren_LPtoHW/LPtoHW_Ziel_FC.awl index 4b63040..3b03c70 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Omnifahren_LPtoHW/LPtoHW_Ziel_FC.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/6_LPtoHW/Omnifahren_LPtoHW/LPtoHW_Ziel_FC.awl @@ -1,173 +1,176 @@ -=== FC 6181: LPtoHW_Ziel_FC [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Ziel_hex : Word - Ziel_int : Int - Zielebene : Word - Error : Byte - Position : Int - Lager_DB : Int - Lager_DW : Int - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - SSDW : Int - EndZiel : Word - Variante : Int - AbrufID : DInt - Fahrlisten_TrolleyID : DInt - Fahrlisten_AbrufID : DInt - Fahrlisten_Lager : Int - Trolley_unbekannt : Bool // Trolley ist nicht in DL - Express_Abruf : Bool - Constant: - Return: - Ret_Val : Void - ---- NW 1: Rückmeldung --- - SET // Rückmeldungen erst mal resetten - R "M180.6" // Weiterfahrt von Ziel-FC erlaubt +FUNCTION "LPtoHW_Ziel_FC" : Void +TITLE = Ziel-FC: LP>HW +{ S7_Optimized_Access := 'FALSE' ; S7_Pass_Registers := 'TRUE' } +AUTHOR : AE +VERSION : 0.1 + VAR_TEMP + Ziel_hex : Word; + Ziel_int : Int; + Zielebene : Word; + Error : Byte; + Position : Int; + Lager_DB : Int; + Lager_DW : Int; + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + SSDW : Int; + EndZiel : Word; + Variante : Int; + AbrufID : DInt; + Fahrlisten_TrolleyID : DInt; + Fahrlisten_AbrufID : DInt; + Fahrlisten_Lager : Int; + Trolley_unbekannt : Bool; // Trolley ist nicht in DL + Express_Abruf : Bool; + END_VAR ---- NW 2: Schleuse 3342: Weiterfahren erlaubt ? (Vor Trolley-Beladung) --- - L "MW190" - L 3342 // Aufruf von Schleuse 3342 ? - <>I // Nein! - JC X3342E +BEGIN +NETWORK +TITLE = Rückmeldung + SET;//Rückmeldungen erst mal resetten + R "M180.6";//Weiterfahrt von Ziel-FC erlaubt - SET - S "M180.6" // Weiterfahrt ist erlaubt +NETWORK +TITLE = Schleuse 3342: Weiterfahren erlaubt ? (Vor Trolley-Beladung) + L "MW190"; + L 3342 ;//Aufruf von Schleuse 3342 ? + <>I;//Nein! + SPB X3342E; - BEU + SET; + S "M180.6" ;//Weiterfahrt ist erlaubt -X3342E: NOP 0 + BEA; +X3342E: NOP 0; ---- NW 3: Schleuse 3323: Weiterfahren erlaubt ? (Trolley-Beladung) --- - L "MW190" - L 3323 // Aufruf von Schleuse 3323 ? - <>I // Nein! - JC X3323E +NETWORK +TITLE = Schleuse 3323: Weiterfahren erlaubt ? (Trolley-Beladung) + L "MW190"; + L 3323 ;//Aufruf von Schleuse 3323 ? + <>I;//Nein! + SPB X3323E; -// Umschalten auf Durchfahr-Modus: - A "DLeerPufferStrecken".DurchfahrModus.Anmelden - AN "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt // Noch kein Sack behängt - R "DLeerPufferStrecken".DurchfahrModus.Anmelden - S "DLeerPufferStrecken".DurchfahrModus.Aktiv +//Umschalten auf Durchfahr-Modus: + U "DLeerPufferStrecken".DurchfahrModus.Anmelden; + UN "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt ;//Noch kein Sack behängt + R "DLeerPufferStrecken".DurchfahrModus.Anmelden; + S "DLeerPufferStrecken".DurchfahrModus.Aktiv; -// Trolley-Err-Anzeige (blau): - A "BG3323" // Trolley ist in Schleuse - A( - A "DLeerPufferStrecken".DurchfahrModus.Aktiv - A "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt // Aber Sack behängt - O - AN "DLeerPufferStrecken".DurchfahrModus.Aktiv - AN "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt // Noch kein Sack behängt - ) - = "PF0033" +//Trolley-Err-Anzeige (blau): + U "BG3323";//Trolley ist in Schleuse + U(; + U "DLeerPufferStrecken".DurchfahrModus.Aktiv; + U "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt;//Aber Sack behängt + O; + UN "DLeerPufferStrecken".DurchfahrModus.Aktiv; + UN "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt;//Noch kein Sack behängt + ); + = "PF0033"; -// Trolley kann gestartet werden: - A "BG3323" // Trolley ist in Schleuse - AN "DLeerPufferStrecken".DurchfahrModus.Aktiv - A "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt // Sack behängt - A "Clock_2Hz" - = "PF0044" +//Trolley kann gestartet werden: + U "BG3323";//Trolley ist in Schleuse + UN "DLeerPufferStrecken".DurchfahrModus.Aktiv; + U "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt;//Sack behängt + U "Clock_2Hz"; + = "PF0044"; -// Bestätigung durch Bediener: - A "BG3323" // Trolley ist in Schleuse - A( - A "SF0044" // Bestätigung mit Taster - AN "DLeerPufferStrecken".DurchfahrModus.Aktiv - A "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt // Sack behängt - O -// Durchfahr-Modus aktiv: - A "DLeerPufferStrecken".DurchfahrModus.Aktiv - AN "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt // Aber Sack behängt - ) - S "M180.6" // Weiterfahrt ist erlaubt +//Bestätigung durch Bediener: + U "BG3323";//Trolley ist in Schleuse + U(; + U "SF0044" ;//Bestätigung mit Taster + UN "DLeerPufferStrecken".DurchfahrModus.Aktiv; + U "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt;//Sack behängt + O; +//Durchfahr-Modus aktiv: + U "DLeerPufferStrecken".DurchfahrModus.Aktiv; + UN "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt;//Aber Sack behängt + ); + S "M180.6" ;//Weiterfahrt ist erlaubt - BEU + BEA; -X3323E: NOP 0 +X3323E: NOP 0; +NETWORK +TITLE = Schleuse 4221: (Vor ByPass zum VP) + L "MW190"; + L 4221 ;//Aufruf von Schleuse XXXX? + <>I;//Nein! + SPB PS5E; ---- NW 4: Schleuse 4221: (Vor ByPass zum VP) --- - L "MW190" - L 4221 // Aufruf von Schleuse XXXX? - <>I // Nein! - JC PS5E +//Ziel-Check: + L "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.Trolley_EndZiel; + L 16#B000 ;//Vollpuffer ? + ==I;//Ja ! + UN "DLPtoHW_Sensoren".Sack_BG4222.Stat.B_Akt;//Kein Sack erkannt + SPB A4221 ;//Abzweig fahren -// Ziel-Check: - L "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.Trolley_EndZiel - L 16#B000 // Vollpuffer ? - ==I // Ja ! - AN "DLPtoHW_Sensoren".Sack_BG4222.Stat.B_Akt // Kein Sack erkannt - JC A4221 // Abzweig fahren + SPB G4221; - JC G4221 + SPA G4221 ;//Rest Gerade fahren - JU G4221 // Rest Gerade fahren +//Abzweig fahren: +A4221: L 16#4211; + T "MW198" ;//Weichenziel -// Abzweig fahren: -A4221: L 16#4211 - T "MW198" // Weichenziel +//Quell-Steuerung: + L "DHWtoVP_OmniFahren".Schleuse_4207.Dyn.Raus_Trolleys; + L 0 ;//Sind Trolleys zur Weiche MB4210 unterwegs? + >I;//Ja! + O "DHWtoVP_OmniFahren".Schleuse_4207.Dyn.Status.Reset_aktiv; + O "MB4207" ;//Andere Quelle aktiv + BEB; -// Quell-Steuerung: - L "DHWtoVP_OmniFahren".Schleuse_4207.Dyn.Raus_Trolleys - L 0 // Sind Trolleys zur Weiche MB4210 unterwegs? - >I // Ja! - O "DHWtoVP_OmniFahren".Schleuse_4207.Dyn.Status.Reset_aktiv - O "MB4207" // Andere Quelle aktiv - BEC + UN "DHWtoVP_Sensoren".Stau_BG4210.Stat.B_Akt; + UN "DHWtoVP_Sensoren".Stau_BG4211.Stat.B_Akt; + S "M180.6" ;//Weiterfahrt ist erlaubt - AN "DHWtoVP_Sensoren".Stau_BG4210.Stat.B_Akt - AN "DHWtoVP_Sensoren".Stau_BG4211.Stat.B_Akt - S "M180.6" // Weiterfahrt ist erlaubt + BEA; - BEU +//Gerade fahren: +G4221: L 16#4224; + T "MW198" ;//Weichenziel -// Gerade fahren: -G4221: L 16#4224 - T "MW198" // Weichenziel + UN "DLPtoHW_Sensoren".Stau_BG4224.Stat.B_Akt; + S "M180.6" ;//Weiterfahrt ist erlaubt - AN "DLPtoHW_Sensoren".Stau_BG4224.Stat.B_Akt - S "M180.6" // Weiterfahrt ist erlaubt + BEA; - BEU +PS5E: NOP 0; -PS5E: NOP 0 +NETWORK +TITLE = Schleuse 4235: (BST 2) + L "MW190"; + L 4235 ;//Aufruf von Schleuse XXXX? + <>I;//Nein! + SPB X4235E; + SET; + S "M180.6" ;//Weiterfahrt ist erlaubt ---- NW 5: Schleuse 4235: (BST 2) --- - L "MW190" - L 4235 // Aufruf von Schleuse XXXX? - <>I // Nein! - JC X4235E + BEA; - SET - S "M180.6" // Weiterfahrt ist erlaubt +X4235E: NOP 0; - BEU +NETWORK +TITLE = Schleuse 3722: Übergabe an UH06/AMR + L "MW190"; + L 3722 ;//Aufruf von Schleuse 3722 ? + <>I;//Nein! + SPB X3722E; -X4235E: NOP 0 + SET; + S "M180.6" ;//Weiterfahrt ist erlaubt + BEA; ---- NW 6: Schleuse 3722: Übergabe an UH06/AMR --- - L "MW190" - L 3722 // Aufruf von Schleuse 3722 ? - <>I // Nein! - JC X3722E +X3722E: NOP 0; - SET - S "M180.6" // Weiterfahrt ist erlaubt +NETWORK +TITLE = Ende + BE; - BEU - -X3722E: NOP 0 - - ---- NW 7: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Anlage/OutBound_Bereich.awl b/=A01+UH07-KF00/Programmbausteine/Anlage/OutBound_Bereich.awl index 69800cf..16eeb9a 100644 --- a/=A01+UH07-KF00/Programmbausteine/Anlage/OutBound_Bereich.awl +++ b/=A01+UH07-KF00/Programmbausteine/Anlage/OutBound_Bereich.awl @@ -1,2274 +1,2336 @@ -=== FB 1001: OutBound_Bereich [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - A01_UH07 : Struct // Outbound: Hauptschrank - Anlauf : Bool // Anlauf, Wartezeit wegen Bussystem - AnlageEin : Bool // Anlage ist Ein***************************************************************** - Not_Aus : Struct // Not-Aus-Störungen - ausgeloest : Bool // Not-Aus hat ausgelöst - UH07 : Bool // Outbound: Not-Aus am Schaltschrank UH07 betätigt - UC071 : Bool // Outbound: Not-Aus am Schaltschrank UC071 betätigt - UC073 : Bool // Outbound: Not-Aus am Schaltschrank UC073 betätigt - UZ0701 : Bool // Outbound: Not-Aus BST 1 betätigt - UZ0702 : Bool // Outbound: Not-Aus vor Leer-Puffer betätigt - UZ0703 : Bool // Outbound: Not-Aus nach Leer-Puffer betätigt - UZ7101 : Bool // Outbound: Not-Aus am Kontrollplatz betätigt - UZ7102 : Bool // Outbound: Not-Aus an Voll-Puffer-Einfahrt betätigt - UZ7103 : Bool // Outbound: Not-Aus Mitte Voll-Puffer-Einfahrt betätigt - UZ7104 : Bool // Outbound: Not-Aus Mitte Voll-Puffer-Ausfahrt betätigt - UZ7105 : Bool // Outbound: Not-Aus an Voll-Puffer-Ausfahrt betätigt - UZ7106 : Bool // Outbound: Not-Aus Ende Voll-Puffer-Einfahrt betätigt - UZ7107 : Bool // Outbound: Not-Aus Ende Voll-Puffer-Ausfahrt betätigt - UZ7301 : Bool // Outbound: Not-Aus an Highway BST 2/OB betätigt - UZ7302 : Bool // Outbound: Not-Aus an Highway BST 2/Bypass betätigt - UZ7303 : Bool // Outbound: Not-Aus an Bypass LP>VP betätigt - NotErr : Bool // Not-Aus ist betätigt (Kreis) - PnErr : Bool // Pneumatik-Versorgung fehlt - SiErr : Bool // Sicherungsfall - MotErr : Bool // Motorschutz hat ausgelöst - Phasen : Bool // Phasenwächter - K10Err : Bool // Hauptschütz unklar - Brandfall : Bool // Brandmeldung - Automatik : Bool // Automatik - Handbetrieb : Bool // Handbetrieb aktiv - BereichErr : Bool // Bereich hat eine Systemstörung -> Antriebe stoppen - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - BereichErr_old : Bool // Bereich hatte eine Systemstörung -> Anfahrwarnung - StOk_aktiv : Bool // Impuls - Anfahrwarnung : Bool // Anfahrwarnung in Signal-Tower - A01_UC071 : Struct // Outbound: Unterverteiler UC071 - PnErr : Bool // Pneumatik-Versorgung fehlt - SiErr : Bool // Sicherungsfall - MotErr : Bool // Motorschutz hat ausgelöst - K10Err : Bool // Hauptschütz unklar - BereichErr : Bool // Bereich hat eine Systemstörung -> Antriebe stoppen - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - BereichErr_old : Bool // Bereich hatte eine Systemstörung -> Anfahrwarnung - Anfahrwarnung : Bool // Anfahrwarnung in Signal-Tower - A01_UC072 : Struct // Outbound: Unterverteiler UC072 - Not_Aus : Struct // Not-Aus-Störungen - ausgeloest : Bool // Not-Aus hat ausgelöst - UC072 : Bool // Outbound: Not-Aus am Schaltschrank UC072 betätigt - UZ7201 : Bool // Outbound: Not-Aus an Highway Nähe AMR betätigt - UZ7202 : Bool // Outbound: Not-Aus an Highway BST 2/AMR betätigt - NotErr : Bool // Not-Aus ist betätigt (Kreis) - PnErr : Bool // Pneumatik-Versorgung fehlt - SiErr : Bool // Sicherungsfall - MotErr : Bool // Motorschutz hat ausgelöst - K10Err : Bool // Hauptschütz unklar - BereichErr : Bool // Bereich hat eine Systemstörung -> Antriebe stoppen - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - BereichErr_old : Bool // Bereich hatte eine Systemstörung -> Anfahrwarnung - Anfahrwarnung : Bool // Anfahrwarnung in Signal-Tower - A01_UC073 : Struct // Outbound: Unterverteiler UC073 - PnErr : Bool // Pneumatik-Versorgung fehlt - SiErr : Bool // Sicherungsfall - MotErr : Bool // Motorschutz hat ausgelöst - K10Err : Bool // Hauptschütz unklar - BereichErr : Bool // Bereich hat eine Systemstörung -> Antriebe stoppen - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - BereichErr_old : Bool // Bereich hatte eine Systemstörung -> Anfahrwarnung - Anfahrwarnung : Bool // Anfahrwarnung in Signal-Tower - A01_UC074 : Struct // Outbound: Unterverteiler UC074 - Not_Aus : Struct // Not-Aus-Störungen - ausgeloest : Bool // Not-Aus hat ausgelöst - UC074 : Bool // Outbound: Not-Aus am Schaltschrank UC074 betätigt - UZ7401 : Bool // Outbound: Not-Aus an Bypass VP>LP betätigt - UZ7402 : Bool // Outbound: Not-Aus an Entnahme-Puffer betätigt - UZ7403 : Bool // Outbound: Not-Aus an Entnahme-Puffer betätigt - NotErr : Bool // Not-Aus ist betätigt (Kreis) - PnErr : Bool // Pneumatik-Versorgung fehlt - SiErr : Bool // Sicherungsfall - MotErr : Bool // Motorschutz hat ausgelöst - K10Err : Bool // Hauptschütz unklar - BereichErr : Bool // Bereich hat eine Systemstörung -> Antriebe stoppen - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - BereichErr_old : Bool // Bereich hatte eine Systemstörung -> Anfahrwarnung - Anfahrwarnung : Bool // Anfahrwarnung in Signal-Tower - A01_UZ0701 : Struct // Outbound: UZ0701 - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - A01_UZ0702 : Struct // Outbound: UZ0702 - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - A01_UZ0703 : Struct // Outbound: UZ0703 - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - A01_UZ7101 : Struct // Outbound: UZ7101 - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - A01_UZ7102 : Struct // Outbound: UZ7102 - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - Area_Stop : Bool - A01_UZ7103 : Struct // Outbound: UZ7103 - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - A01_UZ7104 : Struct // Outbound: UZ7104 - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - Area_Stop : Bool - A01_UZ7105 : Struct // Outbound: UZ7105 - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - A01_UZ7106 : Struct // Outbound: UZ7106 - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - A01_UZ7107 : Struct // Outbound: UZ7107 - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - A01_UZ7201 : Struct // Outbound: UZ7201 - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - Area_Stop : Bool - A01_UZ7202 : Struct // Outbound: UZ7202 - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - Area_Stop : Bool - A01_UZ7301 : Struct // Outbound: UZ7301 - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - A01_UZ7302 : Struct // Outbound: UZ7302 - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - A01_UZ7303 : Struct // Outbound: UZ7303 - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - A01_UZ7401 : Struct // Outbound: UZ7401 - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - A01_UZ7402 : Struct // Outbound: UZ7402 - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - A01_UZ7403 : Struct // Outbound: UZ7403 - StOk_blinken : Bool // Start n. Störung-Anzeige blinken lassen - StOk_Flanke : Bool // Flankenmerker - StOk_aktiv : Bool // Impuls - ErrDD : DInt - ErrBits : Int - Fast-Sensors : Struct - B1123 : Bool - B1203 : Bool - B1291 : Bool - B1132 : Bool - B0381 : Bool - B0792 : Bool - Temp: - Quit_aktiv : Bool - Not_Err : Bool // Ein Not-Aus-Taster noch betätigt - Not_Akt : Bool // Ein Not-Aus-Störung noch nicht quittiert - Stoerung : Bool - Meldung : Bool - ProfibusError : Bool - Störung_vorhanden : Bool - Constant: - ---- NW 1: Anlage ein/aus, Anzeigen --- - A "SF0001" - A "SF0000" - AN A01_UH07.AnlageEin - AN "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3 - S A01_UH07.AnlageEin - S A01_UH07.Anfahrwarnung - - AN "SF0000" - O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3 - O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4 - O "7_HMI_Err_UH07_OB".Kommunikation.SendFIFO_Port1 - O "7_HMI_Err_UH07_OB".Kommunikation.SendFIFO_Port2 - R A01_UH07.AnlageEin - - A A01_UH07.AnlageEin - = "PF0001" - = A01_UH07.Automatik - - AN A01_UH07.Automatik - = "7_HMI_Err_UH07_OB".System.Anlage_aus - - ---- NW 2: Störungen quittieren --- - A "SF0002" - Rise A01_UH07.StOk_Flanke - = A01_UH07.StOk_aktiv // Impuls Störungen quittieren - - A "SF0117" - Rise A01_UC071.StOk_Flanke - = A01_UC071.StOk_aktiv // Impuls Störungen quittieren - - A "SF0177" - Rise A01_UC072.StOk_Flanke - = A01_UC072.StOk_aktiv // Impuls Störungen quittieren - - A "SF0237" - Rise A01_UC073.StOk_Flanke - = A01_UC073.StOk_aktiv // Impuls Störungen quittieren - - A "SF0297" - Rise A01_UC074.StOk_Flanke - = A01_UC074.StOk_aktiv // Impuls Störungen quittieren - - A "SF0041" - Rise A01_UZ0701.StOk_Flanke - = A01_UZ0701.StOk_aktiv // Impuls Störungen quittieren - - A "SF0043" - Rise A01_UZ0702.StOk_Flanke - = A01_UZ0702.StOk_aktiv // Impuls Störungen quittieren - - A "SF0045" - Rise A01_UZ0703.StOk_Flanke - = A01_UZ0703.StOk_aktiv // Impuls Störungen quittieren - - A "SF0121" - Rise A01_UZ7101.StOk_Flanke - = A01_UZ7101.StOk_aktiv // Impuls Störungen quittieren - - A "SF0123" - Rise A01_UZ7102.StOk_Flanke - = A01_UZ7102.StOk_aktiv // Impuls Störungen quittieren - - A "SF0125" - Rise A01_UZ7103.StOk_Flanke - = A01_UZ7103.StOk_aktiv // Impuls Störungen quittieren - - A "SF0127" - Rise A01_UZ7104.StOk_Flanke - = A01_UZ7104.StOk_aktiv // Impuls Störungen quittieren - - A "SF0131" - Rise A01_UZ7105.StOk_Flanke - = A01_UZ7105.StOk_aktiv // Impuls Störungen quittieren - - A "SF0133" - Rise A01_UZ7106.StOk_Flanke - = A01_UZ7106.StOk_aktiv // Impuls Störungen quittieren - - A "SF0135" - Rise A01_UZ7107.StOk_Flanke - = A01_UZ7107.StOk_aktiv // Impuls Störungen quittieren - - A "SF0181" - Rise A01_UZ7201.StOk_Flanke - = A01_UZ7201.StOk_aktiv // Impuls Störungen quittieren - - A "SF0183" - Rise A01_UZ7202.StOk_Flanke - = A01_UZ7202.StOk_aktiv // Impuls Störungen quittieren - - A "SF0241" - Rise A01_UZ7301.StOk_Flanke - = A01_UZ7301.StOk_aktiv // Impuls Störungen quittieren - - A "SF0243" - Rise A01_UZ7302.StOk_Flanke - = A01_UZ7302.StOk_aktiv // Impuls Störungen quittieren - - A "SF0245" - Rise A01_UZ7303.StOk_Flanke - = A01_UZ7303.StOk_aktiv // Impuls Störungen quittieren - - A "SF0301" - Rise A01_UZ7401.StOk_Flanke - = A01_UZ7401.StOk_aktiv // Impuls Störungen quittieren - - A "SF0303" - Rise A01_UZ7402.StOk_Flanke - = A01_UZ7402.StOk_aktiv // Impuls Störungen quittieren - - A "SF0305" - Rise A01_UZ7403.StOk_Flanke - = A01_UZ7403.StOk_aktiv // Impuls Störungen quittieren - - ---- NW 3: UH07: Pneumatik-Störung --- - A "BP0004" - L S5T#10S // Damit Druck aufgebaut werden kann ! - OnDelay "T200" - -// Störung kann quittiert werden: - A "T200" - A "7_HMI_Err_UH07_OB".VErr.Pn_UH07 - S A01_UH07.StOk_blinken - -// Störung quittieren: - A A01_UH07.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "T200" - R "7_HMI_Err_UH07_OB".VErr.Pn_UH07 - -// Störung aktiv: - AN "T200" - S "7_HMI_Err_UH07_OB".VErr.Pn_UH07 - - A "7_HMI_Err_UH07_OB".VErr.Pn_UH07 - = A01_UH07.PnErr - -// Anzeige: - A "7_HMI_Err_UH07_OB".VErr.Pn_UH07 - = "PF0003" - - ---- NW 4: UC071: Pneumatik-Störung --- - A "BP0107" - L S5T#10S // Damit Druck aufgebaut werden kann ! - OnDelay "T201" - -// Störung kann quittiert werden: - A "T201" - A "7_HMI_Err_UH07_OB".VErr.Pn_UC071 - S A01_UC071.StOk_blinken - -// Störung quittieren: - A A01_UC071.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "T201" - R "7_HMI_Err_UH07_OB".VErr.Pn_UC071 - -// Störung aktiv: - AN "T201" - S "7_HMI_Err_UH07_OB".VErr.Pn_UC071 - -// Anzeige: - A "7_HMI_Err_UH07_OB".VErr.Pn_UC071 - = "PF0100" - -// Pneumatik-Störung: - A "7_HMI_Err_UH07_OB".VErr.Pn_UC071 - = A01_UC071.PnErr - - ---- NW 5: UC072: Pneumatik-Störung --- - A "BP0167" - L S5T#10S // Damit Druck aufgebaut werden kann ! - OnDelay "T202" - -// Störung kann quittiert werden: - A "T202" - A "7_HMI_Err_UH07_OB".VErr.Pn_UC072 - S A01_UC072.StOk_blinken - -// Störung quittieren: - A A01_UC072.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "T202" - R "7_HMI_Err_UH07_OB".VErr.Pn_UC072 - -// Störung aktiv: - AN "T202" - S "7_HMI_Err_UH07_OB".VErr.Pn_UC072 - -// Anzeige: - A "7_HMI_Err_UH07_OB".VErr.Pn_UC072 - = "PF0160" - -// Pneumatik-Störung: - A "7_HMI_Err_UH07_OB".VErr.Pn_UC072 - = A01_UC072.PnErr - - ---- NW 6: UC073: Pneumatik-Störung --- - A "BP0227" - L S5T#10S // Damit Druck aufgebaut werden kann ! - OnDelay "T203" - -// Störung kann quittiert werden: - A "T203" - A "7_HMI_Err_UH07_OB".VErr.Pn_UC073 - S A01_UC073.StOk_blinken - -// Störung quittieren: - A A01_UC073.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "T203" - R "7_HMI_Err_UH07_OB".VErr.Pn_UC073 - -// Störung aktiv: - AN "T203" - S "7_HMI_Err_UH07_OB".VErr.Pn_UC073 - -// Anzeige: - A "7_HMI_Err_UH07_OB".VErr.Pn_UC073 - = "PF0220" - -// Pneumatik-Störung: - A "7_HMI_Err_UH07_OB".VErr.Pn_UC073 - = A01_UC073.PnErr - - ---- NW 7: UC074: Pneumatik-Störung --- - A "BP0287" - L S5T#10S // Damit Druck aufgebaut werden kann ! - OnDelay "T204" - -// Störung kann quittiert werden: - A "T204" - A "7_HMI_Err_UH07_OB".VErr.Pn_UC074 - S A01_UC074.StOk_blinken - -// Störung quittieren: - A A01_UC074.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "T204" - R "7_HMI_Err_UH07_OB".VErr.Pn_UC074 - -// Störung aktiv: - AN "T204" - S "7_HMI_Err_UH07_OB".VErr.Pn_UC074 - -// Anzeige: - A "7_HMI_Err_UH07_OB".VErr.Pn_UC074 - = "PF0280" - -// Pneumatik-Störung: - A "7_HMI_Err_UH07_OB".VErr.Pn_UC074 - = A01_UC074.PnErr - - ---- NW 8: UH07: Phasenausfall --- -// Störung kann quittiert werden: - A "7_HMI_Err_UH07_OB".VErr.Phasen - A "DI0005" - S A01_UH07.StOk_blinken - -// Impuls Störungen quittieren - A A01_UH07.StOk_aktiv - A "DI0005" - R "7_HMI_Err_UH07_OB".VErr.Phasen - -// Störung aktiv: - AN "DI0005" - S "7_HMI_Err_UH07_OB".VErr.Phasen - - ---- NW 9: UH07: Sicherungsfall --- -// Störung kann quittiert werden: - A "DI0006" - A "7_HMI_Err_UH07_OB".VErr.FC0006 - O - A "DI0007" - A "7_HMI_Err_UH07_OB".VErr.FC0007 - O - A "DI0010" - A "7_HMI_Err_UH07_OB".VErr.FC0010 - O - A "DI0011" - A "7_HMI_Err_UH07_OB".VErr.FC0011 - O - A "DI0021" - A "7_HMI_Err_UH07_OB".VErr.FC0021 - O - A "DI0022" - A "7_HMI_Err_UH07_OB".VErr.FC0022 - O - A "DI0023" - A "7_HMI_Err_UH07_OB".VErr.FC0023 - S A01_UH07.StOk_blinken - -// Störung quittieren: - A A01_UH07.StOk_aktiv // Impuls Störungen quittieren - R "7_HMI_Err_UH07_OB".VErr.FC0006 - R "7_HMI_Err_UH07_OB".VErr.FC0007 - R "7_HMI_Err_UH07_OB".VErr.FC0010 - R "7_HMI_Err_UH07_OB".VErr.FC0011 - R "7_HMI_Err_UH07_OB".VErr.FC0012 - R "7_HMI_Err_UH07_OB".VErr.FC0021 - R "7_HMI_Err_UH07_OB".VErr.FC0022 - R "7_HMI_Err_UH07_OB".VErr.FC0023 - -// Störung aktiv: - AN "DI0006" - S "7_HMI_Err_UH07_OB".VErr.FC0006 - - AN "DI0007" - S "7_HMI_Err_UH07_OB".VErr.FC0007 - - AN "DI0010" - S "7_HMI_Err_UH07_OB".VErr.FC0010 - - AN "DI0011" - S "7_HMI_Err_UH07_OB".VErr.FC0011 - - AN "DI0021" - S "7_HMI_Err_UH07_OB".VErr.FC0021 - - AN "DI0022" - S "7_HMI_Err_UH07_OB".VErr.FC0022 - - AN "DI0023" - S "7_HMI_Err_UH07_OB".VErr.FC0023 - -// Sicherungs-Störung gesamt: - A "7_HMI_Err_UH07_OB".VErr.FC0006 - O "7_HMI_Err_UH07_OB".VErr.FC0007 - O "7_HMI_Err_UH07_OB".VErr.FC0010 - O "7_HMI_Err_UH07_OB".VErr.FC0011 - O "7_HMI_Err_UH07_OB".VErr.FC0012 - O "7_HMI_Err_UH07_OB".VErr.FC0021 - O "7_HMI_Err_UH07_OB".VErr.FC0022 - O "7_HMI_Err_UH07_OB".VErr.FC0023 - O "7_HMI_Err_UH07_OB".VErr.Frei131 - O "7_HMI_Err_UH07_OB".VErr.Frei132 - O "7_HMI_Err_UH07_OB".VErr.Frei133 - = A01_UH07.SiErr - -// Anzeige: - A "7_HMI_Err_UH07_OB".VErr.Phasen - A "Clock_1Hz" - O A01_UH07.SiErr - = "PF0005" - - ---- NW 10: UC071: Sicherungsfall --- -// Störung kann quittiert werden: - A "DI0100" - A "7_HMI_Err_UH07_OB".VErr.FC0100 - O - A "DI0101" - A "7_HMI_Err_UH07_OB".VErr.FC0101 - O - A "DI0102" - A "7_HMI_Err_UH07_OB".VErr.FC0102 - O - A "DI0103" - A "7_HMI_Err_UH07_OB".VErr.FC0103 - S A01_UC071.StOk_blinken - -// Störung quittieren: - A A01_UC071.StOk_aktiv // Impuls Störungen quittieren - R "7_HMI_Err_UH07_OB".VErr.FC0100 - R "7_HMI_Err_UH07_OB".VErr.FC0101 - R "7_HMI_Err_UH07_OB".VErr.FC0102 - R "7_HMI_Err_UH07_OB".VErr.FC0103 - -// Störung aktiv: - AN "DI0100" - S "7_HMI_Err_UH07_OB".VErr.FC0100 - - AN "DI0101" - S "7_HMI_Err_UH07_OB".VErr.FC0101 - - AN "DI0102" - S "7_HMI_Err_UH07_OB".VErr.FC0102 - - AN "DI0103" - S "7_HMI_Err_UH07_OB".VErr.FC0103 - -// Sicherungs-Störung gesamt: - A "7_HMI_Err_UH07_OB".VErr.FC0100 - O "7_HMI_Err_UH07_OB".VErr.FC0101 - O "7_HMI_Err_UH07_OB".VErr.FC0102 - O "7_HMI_Err_UH07_OB".VErr.FC0103 - = A01_UC071.SiErr - -// Anzeige: - A A01_UC071.SiErr - = "PF0102" - - ---- NW 11: UC072: Sicherungsfall --- -// Störung kann quittiert werden: - A "DI0160" - A "7_HMI_Err_UH07_OB".VErr.FC0160 - O - A "DI0161" - A "7_HMI_Err_UH07_OB".VErr.FC0161 - O - A "DI0162" - A "7_HMI_Err_UH07_OB".VErr.FC0162 - S A01_UC072.StOk_blinken - -// Störung quittieren: - A A01_UC072.StOk_aktiv // Impuls Störungen quittieren - R "7_HMI_Err_UH07_OB".VErr.FC0160 - R "7_HMI_Err_UH07_OB".VErr.FC0161 - R "7_HMI_Err_UH07_OB".VErr.FC0162 - -// Störung aktiv: - AN "DI0160" - S "7_HMI_Err_UH07_OB".VErr.FC0160 - - AN "DI0161" - S "7_HMI_Err_UH07_OB".VErr.FC0161 - - AN "DI0162" - S "7_HMI_Err_UH07_OB".VErr.FC0162 - -// Sicherungs-Störung gesamt: - A "7_HMI_Err_UH07_OB".VErr.FC0160 - O "7_HMI_Err_UH07_OB".VErr.FC0161 - O "7_HMI_Err_UH07_OB".VErr.FC0162 - = A01_UC072.SiErr - -// Anzeige: - A A01_UC072.SiErr - = "PF0162" - - ---- NW 12: UC073: Sicherungsfall --- -// Störung kann quittiert werden: - A "DI0220" - A "7_HMI_Err_UH07_OB".VErr.FC0220 - O - A "DI0221" - A "7_HMI_Err_UH07_OB".VErr.FC0221 - O - A "DI0222" - A "7_HMI_Err_UH07_OB".VErr.FC0222 - O - A "DI0223" - A "7_HMI_Err_UH07_OB".VErr.FC0223 - S A01_UC073.StOk_blinken - -// Störung quittieren: - A A01_UC073.StOk_aktiv // Impuls Störungen quittieren - R "7_HMI_Err_UH07_OB".VErr.FC0220 - R "7_HMI_Err_UH07_OB".VErr.FC0221 - R "7_HMI_Err_UH07_OB".VErr.FC0222 - R "7_HMI_Err_UH07_OB".VErr.FC0223 - -// Störung aktiv: - AN "DI0220" - S "7_HMI_Err_UH07_OB".VErr.FC0220 - - AN "DI0221" - S "7_HMI_Err_UH07_OB".VErr.FC0221 - - AN "DI0222" - S "7_HMI_Err_UH07_OB".VErr.FC0222 - - AN "DI0223" - S "7_HMI_Err_UH07_OB".VErr.FC0223 - -// Sicherungs-Störung gesamt: - A "7_HMI_Err_UH07_OB".VErr.FC0220 - O "7_HMI_Err_UH07_OB".VErr.FC0221 - O "7_HMI_Err_UH07_OB".VErr.FC0222 - O "7_HMI_Err_UH07_OB".VErr.FC0223 - = A01_UC073.SiErr - -// Anzeige: - A A01_UC073.SiErr - = "PF0222" - - ---- NW 13: UC074: Sicherungsfall --- -// Störung kann quittiert werden: - A "DI0280" - A "7_HMI_Err_UH07_OB".VErr.FC0280 - O - A "DI0281" - A "7_HMI_Err_UH07_OB".VErr.FC0281 - O - A "DI0282" - A "7_HMI_Err_UH07_OB".VErr.FC0282 - O - A "DI0283" - A "7_HMI_Err_UH07_OB".VErr.FC0283 - S A01_UC074.StOk_blinken - -// Störung quittieren: - A A01_UC074.StOk_aktiv // Impuls Störungen quittieren - R "7_HMI_Err_UH07_OB".VErr.FC0280 - R "7_HMI_Err_UH07_OB".VErr.FC0281 - R "7_HMI_Err_UH07_OB".VErr.FC0282 - R "7_HMI_Err_UH07_OB".VErr.FC0283 - -// Störung aktiv: - AN "DI0280" - S "7_HMI_Err_UH07_OB".VErr.FC0280 - - AN "DI0281" - S "7_HMI_Err_UH07_OB".VErr.FC0281 - - AN "DI0282" - S "7_HMI_Err_UH07_OB".VErr.FC0282 - - AN "DI0283" - S "7_HMI_Err_UH07_OB".VErr.FC0283 - -// Sicherungs-Störung gesamt: - A "7_HMI_Err_UH07_OB".VErr.FC0280 - O "7_HMI_Err_UH07_OB".VErr.FC0281 - O "7_HMI_Err_UH07_OB".VErr.FC0282 - O "7_HMI_Err_UH07_OB".VErr.FC0283 - = A01_UC074.SiErr - -// Anzeige: - A A01_UC074.SiErr - = "PF0282" - - ---- NW 14: UH07: Motorschutz-Störung ist aktiv --- -// Störung kann quittiert werden: - A "7_HMI_Err_UH07_OB".QErr.MA0060 - A "FC0060" - O - A "7_HMI_Err_UH07_OB".QErr.MA0061 - A "FC0061" - O - A "7_HMI_Err_UH07_OB".QErr.MA0062 - A "FC0062" - O - A "7_HMI_Err_UH07_OB".QErr.MA0063 - A "FC0063" - O - A "7_HMI_Err_UH07_OB".QErr.MA0064 - A "FC0064" - O - A "7_HMI_Err_UH07_OB".QErr.MA0065 - A "FC0065" - O - A "7_HMI_Err_UH07_OB".QErr.MA0066 - A "FC0066" - S A01_UH07.StOk_blinken - -// Störung quittieren: -// wird im Lastbaustein gemacht - -// Störung aktiv: -// wird im Lastbaustein gemacht - -// Motorschutz-Störung gesamt: - A "7_HMI_Err_UH07_OB".QErr.MA0060 - O "7_HMI_Err_UH07_OB".QErr.MA0061 - O "7_HMI_Err_UH07_OB".QErr.MA0062 - O "7_HMI_Err_UH07_OB".QErr.MA0063 - O "7_HMI_Err_UH07_OB".QErr.MA0064 - O "7_HMI_Err_UH07_OB".QErr.MA0065 - O "7_HMI_Err_UH07_OB".QErr.MA0066 - = A01_UH07.MotErr - -// Anzeige: - A A01_UH07.MotErr - = "PF0004" - - ---- NW 15: UC071: Motorschutz-Störung ist aktiv --- -// Störung kann quittiert werden: - A "7_HMI_Err_UH07_OB".QErr.MA0140 - A "FC0140" - O - A "7_HMI_Err_UH07_OB".QErr.MA0141 - A "FC0141" - O - A "7_HMI_Err_UH07_OB".QErr.MA0142 - A "FC0142" - O - A "7_HMI_Err_UH07_OB".QErr.MA0143 - A "FC0143" - O - A "7_HMI_Err_UH07_OB".QErr.MA0144 - A "FC0144" - O - A "7_HMI_Err_UH07_OB".QErr.MA0145 - A "FC0145" - O - A "7_HMI_Err_UH07_OB".QErr.MA0146 - A "FC0146" - O - A "7_HMI_Err_UH07_OB".QErr.MA0147 - A "FC0147" - O - A "7_HMI_Err_UH07_OB".QErr.MA0150 - A "FC0150" - O - A "7_HMI_Err_UH07_OB".QErr.MA0151 - A "FC0151" - O - A "7_HMI_Err_UH07_OB".QErr.MA0152 - A "FC0152" - S A01_UC071.StOk_blinken - -// Störung quittieren: -// wird im Lastbaustein gemacht - -// Störung aktiv: -// wird im Lastbaustein gemacht - -// Motorschutz-Störung gesamt: - A "7_HMI_Err_UH07_OB".QErr.MA0140 - O "7_HMI_Err_UH07_OB".QErr.MA0141 - O "7_HMI_Err_UH07_OB".QErr.MA0142 - O "7_HMI_Err_UH07_OB".QErr.MA0143 - O "7_HMI_Err_UH07_OB".QErr.MA0144 - O "7_HMI_Err_UH07_OB".QErr.MA0145 - O "7_HMI_Err_UH07_OB".QErr.MA0146 - O "7_HMI_Err_UH07_OB".QErr.MA0147 - O "7_HMI_Err_UH07_OB".QErr.MA0150 - O "7_HMI_Err_UH07_OB".QErr.MA0151 - O "7_HMI_Err_UH07_OB".QErr.MA0152 - = A01_UC071.MotErr - -// Anzeige: - A A01_UC071.MotErr - = "PF0101" - - ---- NW 16: UC072: Motorschutz-Störung ist aktiv --- -// Störung kann quittiert werden: - A "7_HMI_Err_UH07_OB".QErr.MA0200 - A "FC0200" - O - A "7_HMI_Err_UH07_OB".QErr.MA0201 - A "FC0201" - O - A "7_HMI_Err_UH07_OB".QErr.MA0202 - A "FC0202" - O - A "7_HMI_Err_UH07_OB".QErr.MA0203 - A "FC0203" - S A01_UC072.StOk_blinken - -// Störung quittieren: -// wird im Lastbaustein gemacht - -// Störung aktiv: -// wird im Lastbaustein gemacht - -// Motorschutz-Störung gesamt: - A "7_HMI_Err_UH07_OB".QErr.MA0200 - O "7_HMI_Err_UH07_OB".QErr.MA0201 - O "7_HMI_Err_UH07_OB".QErr.MA0202 - O "7_HMI_Err_UH07_OB".QErr.MA0203 - = A01_UC072.MotErr - -// Anzeige: - A A01_UC072.MotErr - = "PF0161" - - ---- NW 17: UC073: Motorschutz-Störung ist aktiv --- -// Störung kann quittiert werden: - A "7_HMI_Err_UH07_OB".QErr.MA0260 - A "FC0260" - O - A "7_HMI_Err_UH07_OB".QErr.MA0261 - A "FC0261" - O - A "7_HMI_Err_UH07_OB".QErr.MA0262 - A "FC0262" - O - A "7_HMI_Err_UH07_OB".QErr.MA0263 - A "FC0263" - O - A "7_HMI_Err_UH07_OB".QErr.MA0264 - A "FC0264" - O - A "7_HMI_Err_UH07_OB".QErr.MA0265 - A "FC0265" - O - A "7_HMI_Err_UH07_OB".QErr.MA0266 - A "FC0266" - O - A "7_HMI_Err_UH07_OB".QErr.MA0267 - A "FC0267" - O - A "7_HMI_Err_UH07_OB".QErr.MA0270 - A "FC0270" - S A01_UC073.StOk_blinken - -// Störung quittieren: -// wird im Lastbaustein gemacht - -// Störung aktiv: -// wird im Lastbaustein gemacht - -// Motorschutz-Störung gesamt: - A "7_HMI_Err_UH07_OB".QErr.MA0260 - O "7_HMI_Err_UH07_OB".QErr.MA0261 - O "7_HMI_Err_UH07_OB".QErr.MA0262 - O "7_HMI_Err_UH07_OB".QErr.MA0263 - O "7_HMI_Err_UH07_OB".QErr.MA0264 - O "7_HMI_Err_UH07_OB".QErr.MA0265 - O "7_HMI_Err_UH07_OB".QErr.MA0266 - O "7_HMI_Err_UH07_OB".QErr.MA0267 - O "7_HMI_Err_UH07_OB".QErr.MA0270 - = A01_UC073.MotErr - -// Anzeige: - A A01_UC073.MotErr - = "PF0221" - - ---- NW 18: UC074: Motorschutz-Störung ist aktiv --- -// Störung kann quittiert werden: - A "7_HMI_Err_UH07_OB".QErr.MA0320 - A "FC0320" - O - A "7_HMI_Err_UH07_OB".QErr.MA0321 - A "FC0321" - O - A "7_HMI_Err_UH07_OB".QErr.MA0322 - A "FC0322" - O - A "7_HMI_Err_UH07_OB".QErr.MA0323 - A "FC0323" - O - A "7_HMI_Err_UH07_OB".QErr.MA0324 - A "FC0324" - O - A "7_HMI_Err_UH07_OB".QErr.MA0325 - A "FC0325" - O - A "7_HMI_Err_UH07_OB".QErr.MA0326 - A "FC0326" - O - A "7_HMI_Err_UH07_OB".QErr.MA0327 - A "FC0327" - O - A "7_HMI_Err_UH07_OB".QErr.MA0330 - A "FC0330" - O - A "7_HMI_Err_UH07_OB".QErr.MA0331 - A "FC0331" - O - A "7_HMI_Err_UH07_OB".QErr.MA0332 - A "FC0332" - O - A "7_HMI_Err_UH07_OB".QErr.MA0333 - A "FC0333" - S A01_UC074.StOk_blinken - -// Störung quittieren: -// wird im Lastbaustein gemacht - -// Störung aktiv: -// wird im Lastbaustein gemacht - -// Motorschutz-Störung gesamt: - A "7_HMI_Err_UH07_OB".QErr.MA0320 - O "7_HMI_Err_UH07_OB".QErr.MA0321 - O "7_HMI_Err_UH07_OB".QErr.MA0322 - O "7_HMI_Err_UH07_OB".QErr.MA0323 - O "7_HMI_Err_UH07_OB".QErr.MA0324 - O "7_HMI_Err_UH07_OB".QErr.MA0325 - O "7_HMI_Err_UH07_OB".QErr.MA0326 - O "7_HMI_Err_UH07_OB".QErr.MA0327 - O "7_HMI_Err_UH07_OB".QErr.MA0330 - O "7_HMI_Err_UH07_OB".QErr.MA0331 - O "7_HMI_Err_UH07_OB".QErr.MA0332 - O "7_HMI_Err_UH07_OB".QErr.MA0333 - = A01_UC074.MotErr - -// Anzeige: - A A01_UC074.MotErr - = "PF0281" - - ---- NW 19: UH07: Feueralarm --- -// Störung kann quittiert werden: - A "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3 - A "DI0034" - O - A "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4 - A "DI0033" - O - A "7_HMI_Err_UH07_OB".System.BST1_Feueralarm - A "DI0035" - O - A "7_HMI_Err_UH07_OB".System."BST1_Störung" - A "DI0036" - O - A "7_HMI_Err_UH07_OB".System.BST1_Geschlossen - A "DI0037" - O - A "7_HMI_Err_UH07_OB".System.BST2_Feueralarm - A "DI0170" - O - A "7_HMI_Err_UH07_OB".System."BST2_Störung" - A "DI0171" - O - A "7_HMI_Err_UH07_OB".System.BST2_Geschlossen - A "DI0172" - S A01_UH07.StOk_blinken - -// Impuls Störungen quittieren - A A01_UH07.StOk_aktiv - R "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3 - R "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4 - R "7_HMI_Err_UH07_OB".System.BST1_Feueralarm - R "7_HMI_Err_UH07_OB".System."BST1_Störung" - R "7_HMI_Err_UH07_OB".System.BST1_Geschlossen - R "7_HMI_Err_UH07_OB".System.BST2_Feueralarm - R "7_HMI_Err_UH07_OB".System."BST2_Störung" - R "7_HMI_Err_UH07_OB".System.BST2_Geschlossen - -// Störung aktiv: - AN "DI0033" - S "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3 - AN "DI0034" - S "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4 - - AN "DI0035" - S "7_HMI_Err_UH07_OB".System.BST1_Feueralarm - - AN "DI0036" - S "7_HMI_Err_UH07_OB".System."BST1_Störung" - - AN "DI0037" - S "7_HMI_Err_UH07_OB".System.BST1_Geschlossen - - AN "DI0170" - S "7_HMI_Err_UH07_OB".System.BST2_Feueralarm - - AN "DI0171" - S "7_HMI_Err_UH07_OB".System."BST2_Störung" - - AN "DI0172" - S "7_HMI_Err_UH07_OB".System.BST2_Geschlossen - -// Brandschutztür gesamt: - A "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3 - O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4 - O "7_HMI_Err_UH07_OB".System.BST1_Feueralarm - O "7_HMI_Err_UH07_OB".System."BST1_Störung" - O "7_HMI_Err_UH07_OB".System.BST1_Geschlossen - O "7_HMI_Err_UH07_OB".System.BST2_Feueralarm - O "7_HMI_Err_UH07_OB".System."BST2_Störung" - O "7_HMI_Err_UH07_OB".System.BST2_Geschlossen - = A01_UH07.Brandfall - -// Anzeige: - A A01_UH07.Brandfall - = "PF0006" - - ---- NW 20: UH07: Not-Aus-Störung erzeugen / quittierbar / quittieren (+UC071 +UC073) --- -// Quittierung wurd abgearbeitet: - A "DSchnittstelle_zu_Safety".FromSafety.ACK_A01_UH07_fertig - R "DSchnittstelle_zu_Safety".FromSafety.ACK_A01_UH07_fertig - R "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07 - - A "DSchnittstelle_zu_Safety".FromSafety.ACK_A01_UC071_fertig - R "DSchnittstelle_zu_Safety".FromSafety.ACK_A01_UC071_fertig - R "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC071 - - A "DSchnittstelle_zu_Safety".FromSafety.ACK_A01_UC073_fertig - R "DSchnittstelle_zu_Safety".FromSafety.ACK_A01_UC073_fertig - R "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC073 - -// Not-Aus nach Haupschalter ein quittieren: - A A01_UH07.StOk_aktiv // Impuls Störungen quittieren - A A01_UH07.Not_Aus.ausgeloest - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07 // Not-Aus quittieren - -// Not-Aus an UH07: - A "SF0400" - A A01_UH07.Not_Aus.UH07 - S A01_UH07.StOk_blinken // Störung quittierbar - - A A01_UH07.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF0400" - A A01_UH07.Not_Aus.UH07 - R A01_UH07.Not_Aus.UH07 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07 // Not-Aus quittieren - - AN "SF0400" - S A01_UH07.Not_Aus.UH07 // Störung vorhanden - - A A01_UH07.Not_Aus.UH07 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UH07 // Störung an OP übergeben - -// Not-Aus an UC071: - A "SF0710" - A A01_UH07.Not_Aus.UC071 - S A01_UC071.StOk_blinken // Störung quittierbar - - A A01_UC071.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF0710" - A A01_UH07.Not_Aus.UC071 - R A01_UH07.Not_Aus.UC071 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC071 // Not-Aus quittieren - - AN "SF0710" - S A01_UH07.Not_Aus.UC071 // Störung vorhanden - - A A01_UH07.Not_Aus.UC071 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UC071 // Störung an OP übergeben - -// Not-Aus an UC073: - A "SF1330" - A A01_UH07.Not_Aus.UC073 - S A01_UC073.StOk_blinken // Störung quittierbar - - A A01_UC073.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF1330" - A A01_UH07.Not_Aus.UC073 - R A01_UH07.Not_Aus.UC073 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC073 // Not-Aus quittieren - - AN "SF1330" - S A01_UH07.Not_Aus.UC073 // Störung vorhanden - - A A01_UH07.Not_Aus.UC073 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UC073 // Störung an OP übergeben - -// Not-Aus an UZ0701: - A "SF0401" - A A01_UH07.Not_Aus.UZ0701 - S A01_UZ0701.StOk_blinken // Störung quittierbar - - A A01_UZ0701.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF0401" - A A01_UH07.Not_Aus.UZ0701 - R A01_UH07.Not_Aus.UZ0701 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07 // Not-Aus quittieren - - AN "SF0401" - S A01_UH07.Not_Aus.UZ0701 // Störung vorhanden - - A A01_UH07.Not_Aus.UZ0701 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UZ0701 // Störung an OP übergeben - -// Not-Aus an UZ0702: - A "SF0402" - A A01_UH07.Not_Aus.UZ0702 - S A01_UZ0702.StOk_blinken // Störung quittierbar - - A A01_UZ0702.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF0402" - A A01_UH07.Not_Aus.UZ0702 - R A01_UH07.Not_Aus.UZ0702 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07 // Not-Aus quittieren - - AN "SF0402" - S A01_UH07.Not_Aus.UZ0702 // Störung vorhanden - - A A01_UH07.Not_Aus.UZ0702 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UZ0702 // Störung an OP übergeben - -// Not-Aus an UZ0703: - A "SF0403" - A A01_UH07.Not_Aus.UZ0703 - S A01_UZ0703.StOk_blinken // Störung quittierbar - - A A01_UZ0703.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF0403" - A A01_UH07.Not_Aus.UZ0703 - R A01_UH07.Not_Aus.UZ0703 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07 // Not-Aus quittieren - - AN "SF0403" - S A01_UH07.Not_Aus.UZ0703 // Störung vorhanden - - A A01_UH07.Not_Aus.UZ0703 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UZ0703 // Störung an OP übergeben - -// Not-Aus an UZ7101: - A "SF0711" - A A01_UH07.Not_Aus.UZ7101 - S A01_UZ7101.StOk_blinken // Störung quittierbar - - A A01_UZ7101.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF0711" - A A01_UH07.Not_Aus.UZ7101 - R A01_UH07.Not_Aus.UZ7101 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07 // Not-Aus quittieren - - AN "SF0711" - S A01_UH07.Not_Aus.UZ7101 // Störung vorhanden - - A A01_UH07.Not_Aus.UZ7101 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UZ7101 // Störung an OP übergeben - -// Not-Aus an UZ7102: - A "SF0712" - A A01_UH07.Not_Aus.UZ7102 - S A01_UZ7102.StOk_blinken // Störung quittierbar - - A A01_UZ7102.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF0712" - A A01_UH07.Not_Aus.UZ7102 - R A01_UH07.Not_Aus.UZ7102 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07 // Not-Aus quittieren - - AN "SF0712" - S A01_UH07.Not_Aus.UZ7102 // Störung vorhanden - - A A01_UH07.Not_Aus.UZ7102 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UZ7102 // Störung an OP übergeben - -// Not-Aus an UZ7103: - A "SF0713" - A A01_UH07.Not_Aus.UZ7103 - S A01_UZ7103.StOk_blinken // Störung quittierbar - - A A01_UZ7103.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF0713" - A A01_UH07.Not_Aus.UZ7103 - R A01_UH07.Not_Aus.UZ7103 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07 // Not-Aus quittieren - - AN "SF0713" - S A01_UH07.Not_Aus.UZ7103 // Störung vorhanden - - A A01_UH07.Not_Aus.UZ7103 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UZ7103 // Störung an OP übergeben - -// Not-Aus an UZ7104: - A "SF0780" - A A01_UH07.Not_Aus.UZ7104 - S A01_UZ7104.StOk_blinken // Störung quittierbar - - A A01_UZ7104.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF0780" - A A01_UH07.Not_Aus.UZ7104 - R A01_UH07.Not_Aus.UZ7104 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07 // Not-Aus quittieren - - AN "SF0780" - S A01_UH07.Not_Aus.UZ7104 // Störung vorhanden - - A A01_UH07.Not_Aus.UZ7104 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UZ7104 // Störung an OP übergeben - -// Not-Aus an UZ7105: - A "SF0782" - A A01_UH07.Not_Aus.UZ7105 - S A01_UZ7105.StOk_blinken // Störung quittierbar - - A A01_UZ7105.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF0782" - A A01_UH07.Not_Aus.UZ7105 - R A01_UH07.Not_Aus.UZ7105 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07 // Not-Aus quittieren - - AN "SF0782" - S A01_UH07.Not_Aus.UZ7105 // Störung vorhanden - - A A01_UH07.Not_Aus.UZ7105 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UZ7105 // Störung an OP übergeben - -// Not-Aus an UZ7106: - A "SF0783" - A A01_UH07.Not_Aus.UZ7106 - S A01_UZ7106.StOk_blinken // Störung quittierbar - - A A01_UZ7106.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF0783" - A A01_UH07.Not_Aus.UZ7106 - R A01_UH07.Not_Aus.UZ7106 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07 // Not-Aus quittieren - - AN "SF0783" - S A01_UH07.Not_Aus.UZ7106 // Störung vorhanden - - A A01_UH07.Not_Aus.UZ7106 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UZ7106 // Störung an OP übergeben - -// Not-Aus an UZ7107: - A "SF0850" - A A01_UH07.Not_Aus.UZ7107 - S A01_UZ7107.StOk_blinken // Störung quittierbar - - A A01_UZ7107.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF0850" - A A01_UH07.Not_Aus.UZ7107 - R A01_UH07.Not_Aus.UZ7107 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07 // Not-Aus quittieren - - AN "SF0850" - S A01_UH07.Not_Aus.UZ7107 // Störung vorhanden - - A A01_UH07.Not_Aus.UZ7107 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UZ7107 // Störung an OP übergeben - -// Not-Aus an UZ7301: - A "SF1331" - A A01_UH07.Not_Aus.UZ7301 - S A01_UZ7301.StOk_blinken // Störung quittierbar - - A A01_UZ7301.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF1331" - A A01_UH07.Not_Aus.UZ7301 - R A01_UH07.Not_Aus.UZ7301 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07 // Not-Aus quittieren - - AN "SF1331" - S A01_UH07.Not_Aus.UZ7301 // Störung vorhanden - - A A01_UH07.Not_Aus.UZ7301 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UZ7301 // Störung an OP übergeben - -// Not-Aus an UZ7302: - A "SF1332" - A A01_UH07.Not_Aus.UZ7302 - S A01_UZ7302.StOk_blinken // Störung quittierbar - - A A01_UZ7302.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF1332" - A A01_UH07.Not_Aus.UZ7302 - R A01_UH07.Not_Aus.UZ7302 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07 // Not-Aus quittieren - - AN "SF1332" - S A01_UH07.Not_Aus.UZ7302 // Störung vorhanden - - A A01_UH07.Not_Aus.UZ7302 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UZ7302 // Störung an OP übergeben - -// Not-Aus an UZ7303: - A "SF1333" - A A01_UH07.Not_Aus.UZ7303 - S A01_UZ7303.StOk_blinken // Störung quittierbar - - A A01_UZ7303.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF1333" - A A01_UH07.Not_Aus.UZ7303 - R A01_UH07.Not_Aus.UZ7303 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07 // Not-Aus quittieren - - AN "SF1333" - S A01_UH07.Not_Aus.UZ7303 // Störung vorhanden - - A A01_UH07.Not_Aus.UZ7303 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UZ7303 // Störung an OP übergeben - -// Not-Aus ILS (UH05): - AN "DI0541" // von UH05 ILS - AN "DSchnittstelle_zu_Safety".ToSafety.Ohne_Partner - = "7_HMI_Err_UH07_OB".Not.von_UH05 - - ---- NW 21: UH07: Not-Aus-Störungen / Anzeigen --- - AN "SF0400" // Taster noch betätigt - ON "SF0710" - ON "SF1330" - ON "SF0401" - ON "SF0402" - ON "SF0403" - ON "SF0711" - ON "SF0712" - ON "SF0713" - ON "SF0780" - ON "SF0782" - ON "SF0783" - ON "SF0850" - ON "SF1331" - ON "SF1332" - ON "SF1333" - = Not_Err // Ein Not-Aus-Taster noch betätigt - - A A01_UH07.Not_Aus.UH07 // Störung noch aktiv - O A01_UH07.Not_Aus.UC071 - O A01_UH07.Not_Aus.UC073 - O A01_UH07.Not_Aus.UZ0701 - O A01_UH07.Not_Aus.UZ0702 - O A01_UH07.Not_Aus.UZ0703 - O A01_UH07.Not_Aus.UZ7101 - O A01_UH07.Not_Aus.UZ7102 - O A01_UH07.Not_Aus.UZ7103 - O A01_UH07.Not_Aus.UZ7104 - O A01_UH07.Not_Aus.UZ7105 - O A01_UH07.Not_Aus.UZ7106 - O A01_UH07.Not_Aus.UZ7107 - O A01_UH07.Not_Aus.UZ7301 - O A01_UH07.Not_Aus.UZ7302 - O A01_UH07.Not_Aus.UZ7303 - = Not_Akt // Ein Not-Aus-Störung noch nicht quittiert - - A "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UH07_QA0610_QA0611 // Not-Aus-Kreis geschlossen - AN Not_Err - AN Not_Akt - R A01_UH07.NotErr - -// Not-Aus hat ausgelöst: - AN Not_Akt // Ein Not-Aus-Störung noch nicht quittiert - AN Not_Err // Ein Not-Aus-Taster noch betätigt - AN "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UH07_QA0610_QA0611 // Not-Aus-Kreis geschlossen - = A01_UH07.Not_Aus.ausgeloest - - A A01_UH07.Not_Aus.ausgeloest - = "7_HMI_Err_UH07_OB".Not.ausgeloest_UH07_UC71_UC73 // Störung an OP übergeben - S A01_UH07.StOk_blinken // Störung quittierbar - - A "SF0002" - A "7_HMI_Err_UH07_OB".Not.ausgeloest_UH07_UC71_UC73 // Störung an OP übergeben - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07 // Not-Aus quittieren - -// Störung aktiv: - AN "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UH07_QA0610_QA0611 // Not-Aus-Kreis geschlossen - O Not_Err // Ein Not-Aus-Taster noch betätigt - O Not_Akt // Ein Not-Aus-Störung noch nicht quittiert - O - AN "DI0541" // von UH05 ILS - AN "DSchnittstelle_zu_Safety".ToSafety.Ohne_Partner - S A01_UH07.NotErr - -// Not-Aus quittieren nicht erlaubt: - A Not_Err // Ein Not-Aus-Taster noch betätigt - O Not_Akt // Ein Not-Aus-Störung noch nicht quittiert - R "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07 // Not-Aus quittieren - -// UC071 und UC72 mit Quittieren: - A "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07 // Not-Aus quittieren - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC071 // Not-Aus quittieren - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC073 // Not-Aus quittieren - -// Anzeige: - A A01_UH07.NotErr - CLR // Keine verbaut -// / = "PF1004" - - ---- NW 22: UH07: Bereichs-Störung --- - AN A01_UH07.AnlageEin - O A01_UH07.NotErr -// /Da einzeln überwacht! O #A01_UH07.MotErr - O A01_UH07.PnErr - O A01_UH07.SiErr - O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3 - O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4 - = A01_UH07.BereichErr - - A A01_UH07.BereichErr - A A01_UH07.AnlageEin - A "Clock_1Hz" - = "PF0000" - - ---- NW 23: UH07: Anfahrwarnung --- -// Anfahrwarnung erzeugen: - AN A01_UH07.BereichErr - A A01_UH07.BereichErr_old // Letzter Zyklus war noch System-Err - S A01_UH07.Anfahrwarnung - - A A01_UH07.BereichErr - = A01_UH07.BereichErr_old // Aktuellen Status sepichern - R A01_UH07.Anfahrwarnung - -// Anfahrwarnung: - A "T1" - R A01_UH07.Anfahrwarnung - A( - O A01_UH07.Anfahrwarnung - O A01_UC071.Anfahrwarnung - O A01_UC072.Anfahrwarnung - O A01_UC073.Anfahrwarnung - O A01_UC074.Anfahrwarnung - ) - A "Clock_1Hz" - = "PF0034" // Anfahr-Warnung - A A01_UH07.Anfahrwarnung - L s5t#5s - OnDelay "T1" - - A A01_UH07.Anfahrwarnung - S A01_UH07.BereichErr - - ---- NW 24: UH07: Haupschütz nicht aktiv --- - A "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UH07_QA0610_QA0611 // Not-Aus-Kreis geschlossen - L s5t#3s - OnDelay "T110" - - A "T110" - A( - O "DI0013" - O "DI0014" - ) - O - AN A01_UH07.BereichErr - AN "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UH07_QA0610_QA0611 // Not-Aus-Kreis geschlossen - = A01_UH07.K10Err - - A A01_UH07.K10Err - O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UH07_1 - O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UH07_2 - S A01_UH07.StOk_blinken // Störung quittierbar - - A A01_UH07.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A( - O A01_UH07.K10Err - O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UH07_1 - O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UH07_2 - ) - S "DSchnittstelle_zu_Safety".ToSafety.StOk_HSS - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07 // Not-Aus quittieren - - A A01_UH07.K10Err - = "7_HMI_Err_UH07_OB".Schutz."Hauptschütz UH07" - - ---- NW 25: UC071: Bereichs-Störung --- - AN A01_UH07.AnlageEin // UH07 ist Master - O A01_UH07.NotErr - O "7_HMI_Err_UH07_OB".VErr.Pn_UC071 -// /Da einzeln überwacht! O #A01_UC071.MotErr - O A01_UC071.SiErr - O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3 - O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4 - = A01_UC071.BereichErr - -// Keine Anzeige verbaut - - ---- NW 26: UC071: Anfahrwarnung --- -// Anfahrwarnung erzeugen: - AN A01_UC071.BereichErr - A A01_UC071.BereichErr_old // Letzter Zyklus war noch System-Err - S A01_UC071.Anfahrwarnung - - A A01_UC071.BereichErr - = A01_UC071.BereichErr_old // Aktuellen Status sepichern - R A01_UC071.Anfahrwarnung - -// Anfahrwarnung: - A "T12" - R A01_UC071.Anfahrwarnung - A A01_UC071.Anfahrwarnung - A "Clock_1Hz" -// = "PF0034" //Anfahr-Warnung (nur an UH07/Nw23) - CLR - A A01_UC071.Anfahrwarnung - L s5t#5s - OnDelay "T12" - - A A01_UC071.Anfahrwarnung - S A01_UC071.BereichErr - - ---- NW 27: UC071: Haupschütz nicht aktiv --- - A "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC071_QA0920_QA0921 // Not-Aus-Kreis geschlossen - L s5t#3s - OnDelay "T211" - - A "T211" - A "DI0106" - O - AN A01_UC071.BereichErr - AN "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC071_QA0920_QA0921 // Not-Aus-Kreis geschlossen - = A01_UC071.K10Err - - A A01_UC071.K10Err - O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC071_1 - O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC071_2 - S A01_UC071.StOk_blinken // Störung quittierbar - - A A01_UC071.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A( - O A01_UC071.K10Err - O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC071_1 - O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC071_2 - ) - S "DSchnittstelle_zu_Safety".ToSafety.StOk_HSS - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC071 // Not-Aus quittieren - - A A01_UC071.K10Err - = "7_HMI_Err_UH07_OB".Schutz."Hauptschütz UC071" - - ---- NW 28: UC072: Not-Aus-Störung erzeugen / quittierbar / quittieren --- -// Quittierung wurd abgearbeitet: - A "DSchnittstelle_zu_Safety".FromSafety.ACK_A01_UC072_fertig - R "DSchnittstelle_zu_Safety".FromSafety.ACK_A01_UC072_fertig - R "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC072 - -// Not-Aus nach Haupschalter ein quittieren: - A A01_UC072.StOk_aktiv // Impuls Störungen quittieren - A A01_UC072.Not_Aus.ausgeloest - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC072 // Not-Aus quittieren - -// Not-Aus an UC072: - A "SF1020" - A A01_UC072.Not_Aus.UC072 - S A01_UC072.StOk_blinken // Störung quittierbar - - A A01_UC072.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF1020" - A A01_UC072.Not_Aus.UC072 - R A01_UC072.Not_Aus.UC072 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC072 // Not-Aus quittieren - - AN "SF1020" - S A01_UC072.Not_Aus.UC072 // Störung vorhanden - - A A01_UC072.Not_Aus.UC072 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UC072 // Störung an OP übergeben - -// Not-Aus an UZ7201: - A "SF1021" - A A01_UC072.Not_Aus.UZ7201 - S A01_UZ7201.StOk_blinken // Störung quittierbar - - A A01_UZ7201.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF1021" - A A01_UC072.Not_Aus.UZ7201 - R A01_UC072.Not_Aus.UZ7201 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC072 // Not-Aus quittieren - - AN "SF1021" - S A01_UC072.Not_Aus.UZ7201 // Störung vorhanden - - A A01_UC072.Not_Aus.UZ7201 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UZ7201 // Störung an OP übergeben - -// Not-Aus an UZ7202: - A "SF1022" - A A01_UC072.Not_Aus.UZ7202 - S A01_UZ7202.StOk_blinken // Störung quittierbar - - A A01_UZ7202.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF1022" - A A01_UC072.Not_Aus.UZ7202 - R A01_UC072.Not_Aus.UZ7202 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC072 // Not-Aus quittieren - - AN "SF1022" - S A01_UC072.Not_Aus.UZ7202 // Störung vorhanden - - A A01_UC072.Not_Aus.UZ7202 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UZ7202 // Störung an OP übergeben - -// Not-Aus ILS (UH03): - AN "DI1091" // von UH03 ILS - AN "DSchnittstelle_zu_Safety".ToSafety.Ohne_Partner - = "7_HMI_Err_UH07_OB".Not.von_UH03 - -// Not-Aus UH07 (UC072): - AN "DI1092" // von UC061 Outbound - AN "DSchnittstelle_zu_Safety".ToSafety.Ohne_Partner - = "7_HMI_Err_UH07_OB".Not.von_UC061 - - ---- NW 29: UC072: Not-Aus-Störungen / Anzeigen --- - AN "SF1020" // Taster noch betätigt - ON "SF1021" - ON "SF1022" - = Not_Err // Ein Not-Aus-Taster noch betätigt - - A A01_UC072.Not_Aus.UC072 // Störung noch aktiv - O A01_UC072.Not_Aus.UZ7201 - O A01_UC072.Not_Aus.UZ7202 - = Not_Akt // Ein Not-Aus-Störung noch nicht quittiert - - A "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC072_QA1230_QA1231 // Not-Aus-Kreis geschlossen - AN Not_Err - AN Not_Akt - R A01_UC072.NotErr - -// Not-Aus hat ausgelöst: - AN Not_Akt // Ein Not-Aus-Störung noch nicht quittiert - AN Not_Err // Ein Not-Aus-Taster noch betätigt - AN "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC072_QA1230_QA1231 // Not-Aus-Kreis geschlossen - = A01_UC072.Not_Aus.ausgeloest - - A A01_UC072.Not_Aus.ausgeloest - = "7_HMI_Err_UH07_OB".Not.ausgeloest_UC072 // Störung an OP übergeben - S A01_UC072.StOk_blinken // Störung quittierbar - - A "SF0177" - A "7_HMI_Err_UH07_OB".Not.ausgeloest_UC072 // Störung an OP übergeben - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC072 // Not-Aus quittieren - -// Störung aktiv: - AN "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC072_QA1230_QA1231 // Not-Aus-Kreis geschlossen - O Not_Err // Ein Not-Aus-Taster noch betätigt - O Not_Akt // Ein Not-Aus-Störung noch nicht quittiert - O - AN "DI1091" // von UH03 ILS - AN "DSchnittstelle_zu_Safety".ToSafety.Ohne_Partner - O - AN "DI1092" // von UC61 AMR - AN "DSchnittstelle_zu_Safety".ToSafety.Ohne_Partner - S A01_UC072.NotErr - -// Not-Aus quittieren nicht erlaubt: - A Not_Err // Ein Not-Aus-Taster noch betätigt - O Not_Akt // Ein Not-Aus-Störung noch nicht quittiert - R "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC072 // Not-Aus quittieren - -// Anzeige: - A A01_UC072.NotErr - CLR // Keine verbaut -// / = "PF1004" - - ---- NW 30: UC072: Bereichs-Störung --- - AN A01_UH07.AnlageEin // UH07 ist Master - O A01_UC072.NotErr - O "7_HMI_Err_UH07_OB".VErr.Pn_UC072 -// /Da einzeln überwacht! O #A01_UC072.MotErr - O A01_UC072.SiErr - O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3 - O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4 - = A01_UC072.BereichErr - -// Keine Anzeige verbaut - - ---- NW 31: UC072: Anfahrwarnung --- -// Anfahrwarnung erzeugen: - AN A01_UC072.BereichErr - A A01_UC072.BereichErr_old // Letzter Zyklus war noch System-Err - S A01_UC072.Anfahrwarnung - - A A01_UC072.BereichErr - = A01_UC072.BereichErr_old // Aktuellen Status sepichern - R A01_UC072.Anfahrwarnung - -// Anfahrwarnung: - A "T13" - R A01_UC072.Anfahrwarnung - A A01_UC072.Anfahrwarnung - A "Clock_1Hz" -// = "PF0034" //Anfahr-Warnung (nur an UH07/Nw23) - CLR - A A01_UC072.Anfahrwarnung - L s5t#5s - OnDelay "T13" - - A A01_UC072.Anfahrwarnung - S A01_UC072.BereichErr - - ---- NW 32: UC072: Haupschütz nicht aktiv --- - A "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC072_QA1230_QA1231 // Not-Aus-Kreis geschlossen - L s5t#3s - OnDelay "T212" - - A "T212" - A "DI0166" - O - AN A01_UC072.BereichErr - AN "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC072_QA1230_QA1231 // Not-Aus-Kreis geschlossen - = A01_UC072.K10Err - - A A01_UC072.K10Err - O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC072_1 - O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC072_2 - S A01_UC072.StOk_blinken // Störung quittierbar - - A A01_UC072.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A( - O A01_UC072.K10Err - O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC072_1 - O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC072_2 - ) - S "DSchnittstelle_zu_Safety".ToSafety.StOk_HSS - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC072 // Not-Aus quittieren - - A A01_UC072.K10Err - = "7_HMI_Err_UH07_OB".Schutz."Hauptschütz UC072" - - ---- NW 33: UC073: Bereichs-Störung --- - AN A01_UH07.AnlageEin // UH07 ist Master - O A01_UH07.NotErr - O "7_HMI_Err_UH07_OB".VErr.Pn_UC073 -// /Da einzeln überwacht! O #A01_UC073.MotErr - O A01_UC073.SiErr - O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3 - O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4 - = A01_UC073.BereichErr - -// Keine Anzeige verbaut - - ---- NW 34: UC073: Anfahrwarnung --- -// Anfahrwarnung erzeugen: - AN A01_UC073.BereichErr - A A01_UC073.BereichErr_old // Letzter Zyklus war noch System-Err - S A01_UC073.Anfahrwarnung - - A A01_UC073.BereichErr - = A01_UC073.BereichErr_old // Aktuellen Status sepichern - R A01_UC073.Anfahrwarnung - -// Anfahrwarnung: - A "T14" - R A01_UC073.Anfahrwarnung - A A01_UC073.Anfahrwarnung - A "Clock_1Hz" -// = "PF0034" //Anfahr-Warnung (nur an UH07/Nw23) - CLR - A A01_UC073.Anfahrwarnung - L s5t#5s - OnDelay "T14" - - A A01_UC073.Anfahrwarnung - S A01_UC073.BereichErr - - ---- NW 35: UC073: Haupschütz nicht aktiv --- - A "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC073_QA1540_QA1541 // Not-Aus-Kreis geschlossen - L s5t#3s - OnDelay "T213" - - A "T213" - A "DI0226" - O - AN A01_UC073.BereichErr - AN "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC073_QA1540_QA1541 // Not-Aus-Kreis geschlossen - = A01_UC073.K10Err - - A A01_UC073.K10Err - O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC073_1 - O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC073_2 - S A01_UC073.StOk_blinken // Störung quittierbar - - A A01_UC073.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A( - O A01_UC073.K10Err - O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC073_1 - O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC073_2 - ) - S "DSchnittstelle_zu_Safety".ToSafety.StOk_HSS - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC073 // Not-Aus quittieren - - A A01_UC073.K10Err - = "7_HMI_Err_UH07_OB".Schutz."Hauptschütz UC073" - - ---- NW 36: UC074: Not-Aus-Störung erzeugen / quittierbar / quittieren --- -// Quittierung wurd abgearbeitet: - A "DSchnittstelle_zu_Safety".FromSafety.ACK_A01_UC074_fertig - R "DSchnittstelle_zu_Safety".FromSafety.ACK_A01_UC074_fertig - R "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC074 - -// Not-Aus nach Haupschalter ein quittieren: - A A01_UC074.StOk_aktiv // Impuls Störungen quittieren - A A01_UC074.Not_Aus.ausgeloest - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC074 // Not-Aus quittieren - -// Not-Aus an UC074: - A "SF1640" - A A01_UC074.Not_Aus.UC074 - S A01_UC074.StOk_blinken // Störung quittierbar - - A A01_UC074.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF1640" - A A01_UC074.Not_Aus.UC074 - R A01_UC074.Not_Aus.UC074 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC074 // Not-Aus quittieren - - AN "SF1640" - S A01_UC074.Not_Aus.UC074 // Störung vorhanden - - A A01_UC074.Not_Aus.UC074 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UC074 // Störung an OP übergeben - -// Not-Aus an UZ7401: - A "SF1641" - A A01_UC074.Not_Aus.UZ7401 - S A01_UZ7401.StOk_blinken // Störung quittierbar - - A A01_UZ7401.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF1641" - A A01_UC074.Not_Aus.UZ7401 - R A01_UC074.Not_Aus.UZ7401 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC074 // Not-Aus quittieren - - AN "SF1641" - S A01_UC074.Not_Aus.UZ7401 // Störung vorhanden - - A A01_UC074.Not_Aus.UZ7401 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UZ7401 // Störung an OP übergeben - -// Not-Aus an UZ7402: - A "SF1642" - A A01_UC074.Not_Aus.UZ7402 - S A01_UZ7402.StOk_blinken // Störung quittierbar - - A A01_UZ7402.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF1642" - A A01_UC074.Not_Aus.UZ7402 - R A01_UC074.Not_Aus.UZ7402 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC074 // Not-Aus quittieren - - AN "SF1642" - S A01_UC074.Not_Aus.UZ7402 // Störung vorhanden - - A A01_UC074.Not_Aus.UZ7402 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UZ7402 // Störung an OP übergeben - -// Not-Aus an UZ7403: - A "SF1643" - A A01_UC074.Not_Aus.UZ7403 - S A01_UZ7403.StOk_blinken // Störung quittierbar - - A A01_UZ7403.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A "SF1643" - A A01_UC074.Not_Aus.UZ7403 - R A01_UC074.Not_Aus.UZ7403 - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC074 // Not-Aus quittieren - - AN "SF1643" - S A01_UC074.Not_Aus.UZ7403 // Störung vorhanden - - A A01_UC074.Not_Aus.UZ7403 // Störung vorhanden - = "7_HMI_Err_UH07_OB".Not.UZ7403 // Störung an OP übergeben - - ---- NW 37: UC074: Not-Aus-Störungen / Anzeigen --- - AN "SF1640" // Taster noch betätigt - ON "SF1641" - ON "SF1642" - ON "SF1643" - = Not_Err // Ein Not-Aus-Taster noch betätigt - - A A01_UC074.Not_Aus.UC074 // Störung noch aktiv - O A01_UC074.Not_Aus.UZ7401 - O A01_UC074.Not_Aus.UZ7402 - O A01_UC074.Not_Aus.UZ7403 - = Not_Akt // Ein Not-Aus-Störung noch nicht quittiert - - A "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC074_QA1850_QA1851 // Not-Aus-Kreis geschlossen - A "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC074_QA1900_QA1901 - AN Not_Err - AN Not_Akt - R A01_UC074.NotErr - -// Not-Aus hat ausgelöst: - AN Not_Akt // Ein Not-Aus-Störung noch nicht quittiert - AN Not_Err // Ein Not-Aus-Taster noch betätigt - A( - ON "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC074_QA1850_QA1851 // Not-Aus-Kreis geschlossen - ON "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC074_QA1900_QA1901 - ) - = A01_UC074.Not_Aus.ausgeloest - - A A01_UC074.Not_Aus.ausgeloest - = "7_HMI_Err_UH07_OB".Not.ausgeloest_UC074 // Störung an OP übergeben - S A01_UC074.StOk_blinken // Störung quittierbar - - A "SF0297" - A "7_HMI_Err_UH07_OB".Not.ausgeloest_UC074 // Störung an OP übergeben - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC074 // Not-Aus quittieren - -// Störung aktiv: - AN "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC074_QA1850_QA1851 // Not-Aus-Kreis geschlossen - ON "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC074_QA1900_QA1901 - O Not_Err // Ein Not-Aus-Taster noch betätigt - O Not_Akt // Ein Not-Aus-Störung noch nicht quittiert - S A01_UC074.NotErr - -// Not-Aus quittieren nicht erlaubt: - A Not_Err // Ein Not-Aus-Taster noch betätigt - O Not_Akt // Ein Not-Aus-Störung noch nicht quittiert - R "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC074 // Not-Aus quittieren - -// Anzeige: - A A01_UC074.NotErr - CLR // Keine verbaut -// / = "PF1004" - - ---- NW 38: UC074: Bereichs-Störung --- - AN A01_UH07.AnlageEin // UH07 ist Master - O A01_UC074.NotErr - O "7_HMI_Err_UH07_OB".VErr.Pn_UC074 - O A01_UH07.PnErr -// /Da einzeln überwacht! O #A01_UC074.MotErr - O A01_UC074.SiErr - O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3 - O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4 - = A01_UC074.BereichErr - -// Keine Anzeige verbaut - - ---- NW 39: UC074: Anfahrwarnung --- -// Anfahrwarnung erzeugen: - AN A01_UC074.BereichErr - A A01_UC074.BereichErr_old // Letzter Zyklus war noch System-Err - S A01_UC074.Anfahrwarnung - - A A01_UC074.BereichErr - = A01_UC074.BereichErr_old // Aktuellen Status sepichern - R A01_UC074.Anfahrwarnung - -// Anfahrwarnung: - A "T15" - R A01_UC074.Anfahrwarnung - A A01_UC074.Anfahrwarnung - A "Clock_1Hz" -// = "PF0034" //Anfahr-Warnung (nur an UH07/Nw23) - CLR - A A01_UC074.Anfahrwarnung - L s5t#5s - OnDelay "T15" - - A A01_UC074.Anfahrwarnung - S A01_UC074.BereichErr - - ---- NW 40: UC074: Haupschütz nicht aktiv --- - A "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC074_QA1850_QA1851 // Not-Aus-Kreis geschlossen - A "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC074_QA1900_QA1901 // Not-Aus-Kreis geschlossen - L s5t#3s - OnDelay "T214" - - A "T214" - A "DI0286" - O - AN A01_UC074.BereichErr - A( - ON "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC074_QA1850_QA1851 // Not-Aus-Kreis geschlossen - ON "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC074_QA1900_QA1901 // Not-Aus-Kreis geschlossen - ) - = A01_UC074.K10Err - - A A01_UC074.K10Err - O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC074_1 - O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC074_2 - S A01_UC074.StOk_blinken // Störung quittierbar - - A A01_UC074.StOk_aktiv // Impuls Störungen quittieren //Störungen quittieren - A( - O A01_UC074.K10Err - O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC074_1 - O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC074_2 - ) - S "DSchnittstelle_zu_Safety".ToSafety.StOk_HSS - S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC074 // Not-Aus quittieren - - A A01_UC074.K10Err - = "7_HMI_Err_UH07_OB".Schutz."Hauptschütz UC074" - - ---- NW 41: Bereichshalte --- - AN "SF0122" - = A01_UZ7102.Area_Stop - = "7_HMI_Err_UH07_OB".Halt.UZ7102 - - AN "SF0126" - = A01_UZ7104.Area_Stop - = "7_HMI_Err_UH07_OB".Halt.UZ7104 - - AN "SF0180" - = A01_UZ7201.Area_Stop - = "7_HMI_Err_UH07_OB".Halt.UZ7201 - - AN "SF0182" - = A01_UZ7202.Area_Stop - = "7_HMI_Err_UH07_OB".Halt.UZ7202 - - ---- NW 42: Anzeigen zum Quittieren --- -// Start nach Störung blinken lassen: - A A01_UH07.StOk_blinken - A "Clock_1Hz" - ON "SF0400" - = "PF0002" - - A A01_UC071.StOk_blinken - A "Clock_1Hz" - ON "SF0710" - = "PF0117" - - A A01_UC072.StOk_blinken - A "Clock_1Hz" - ON "SF1020" - = "PF0177" - - A A01_UC073.StOk_blinken - A "Clock_1Hz" - ON "SF1330" - = "PF0237" - - A A01_UC074.StOk_blinken - A "Clock_1Hz" - ON "SF1640" - = "PF0297" - - A A01_UZ0701.StOk_blinken - A "Clock_1Hz" - ON "SF0401" - = "PF0041" - - A A01_UZ0702.StOk_blinken - A "Clock_1Hz" - ON "SF0402" - = "PF0043" - - A A01_UZ0703.StOk_blinken - A "Clock_1Hz" - ON "SF0403" - = "PF0045" - - A A01_UZ7101.StOk_blinken - A "Clock_1Hz" - ON "SF0711" - = "PF0121" - - A A01_UZ7102.StOk_blinken - A "Clock_1Hz" - ON "SF0712" - = "PF0123" - - A A01_UZ7103.StOk_blinken - A "Clock_1Hz" - ON "SF0713" - = "PF0125" - - A A01_UZ7104.StOk_blinken - A "Clock_1Hz" - ON "SF0780" - = "PF0127" - - A A01_UZ7105.StOk_blinken - A "Clock_1Hz" - ON "SF0782" - = "PF0131" - - A A01_UZ7106.StOk_blinken - A "Clock_1Hz" - ON "SF0783" - = "PF0133" - - A A01_UZ7107.StOk_blinken - A "Clock_1Hz" - ON "SF0850" - = "PF0135" - - A A01_UZ7201.StOk_blinken - A "Clock_1Hz" - ON "SF1021" - = "PF0181" - - A A01_UZ7202.StOk_blinken - A "Clock_1Hz" - ON "SF1022" - = "PF0183" - - A A01_UZ7301.StOk_blinken - A "Clock_1Hz" - ON "SF1331" - = "PF0241" - - A A01_UZ7302.StOk_blinken - A "Clock_1Hz" - ON "SF1332" - = "PF0243" - - A A01_UZ7303.StOk_blinken - A "Clock_1Hz" - ON "SF1333" - = "PF0245" - - A A01_UZ7401.StOk_blinken - A "Clock_1Hz" - ON "SF1641" - = "PF0301" - - A A01_UZ7402.StOk_blinken - A "Clock_1Hz" - ON "SF1642" - = "PF0303" - - A A01_UZ7403.StOk_blinken - A "Clock_1Hz" - ON "SF1643" - = "PF0305" - - SET - R A01_UH07.StOk_blinken - R A01_UC071.StOk_blinken - R A01_UC072.StOk_blinken - R A01_UC073.StOk_blinken - R A01_UC074.StOk_blinken - R A01_UZ0701.StOk_blinken - R A01_UZ0702.StOk_blinken - R A01_UZ0703.StOk_blinken - R A01_UZ7101.StOk_blinken - R A01_UZ7102.StOk_blinken - R A01_UZ7103.StOk_blinken - R A01_UZ7104.StOk_blinken - R A01_UZ7105.StOk_blinken - R A01_UZ7106.StOk_blinken - R A01_UZ7107.StOk_blinken - R A01_UZ7201.StOk_blinken - R A01_UZ7202.StOk_blinken - R A01_UZ7301.StOk_blinken - R A01_UZ7302.StOk_blinken - R A01_UZ7303.StOk_blinken - R A01_UZ7401.StOk_blinken - R A01_UZ7402.StOk_blinken - R A01_UZ7403.StOk_blinken - - ---- NW 43: Betriebsbereit-Anzeigen --- - A A01_UH07.AnlageEin - = "PF0040" - = "PF0042" - = "PF0120" - = "PF0122" - = "PF0124" - = "PF0126" - = "PF0130" - = "PF0132" - = "PF0134" - = "PF0180" - = "PF0182" - = "PF0240" - = "PF0242" - = "PF0244" - = "PF0300" - = "PF0302" - = "PF0304" - - ---- NW 44: Störungen vorhanden? / Anzeige: --- -CALL FC "Err_vorhanden" (Check_DB:=708, Anfangs_DW:=DINT#0, Ende_DW:=DINT#746, Stoerung:=Stoerung, ErrDW:=ErrDD, ErrBits:=ErrBits) // Störungsanzeige - - A( - O Stoerung - O "PF0000" // Da schon oben gesetzt - ) - A "Clock_1Hz" - = "PF0000" - - L ErrDD - T "MD9100" - L ErrBits - T "MW9200" - - L "MD9100" - L DINT#0 // Störung vorhanden - >D // Ja! - = "Störung_vorhanden" - - ---- NW 45: Signal-Tower UH07 --- -// Anfahrwarnung siehe Nw23 - - A "DOutbound_Bereich".A01_UH07.AnlageEin - = "PF0032" // System ready - - A "Störung_vorhanden" - = "PF0031" // Fault - - A A01_UH07.NotErr - O A01_UC072.NotErr - O A01_UC074.NotErr - = "PF0030" // Not-Aus - - ---- NW 46: Ende --- - BE +FUNCTION_BLOCK "OutBound_Bereich" +TITLE = Outbound-Bereich(UH07/UC071/UC072/UC073/UC074) +{ S7_Optimized_Access := 'FALSE' } +VERSION : 0.1 + VAR + A01_UH07 : Struct // Outbound: Hauptschrank + Anlauf : Bool; // Anlauf, Wartezeit wegen Bussystem + AnlageEin : Bool; // Anlage ist Ein***************************************************************** + Not_Aus : Struct // Not-Aus-Störungen + ausgeloest : Bool; // Not-Aus hat ausgelöst + UH07 : Bool; // Outbound: Not-Aus am Schaltschrank UH07 betätigt + UC071 : Bool; // Outbound: Not-Aus am Schaltschrank UC071 betätigt + UC073 : Bool; // Outbound: Not-Aus am Schaltschrank UC073 betätigt + UZ0701 : Bool; // Outbound: Not-Aus BST 1 betätigt + UZ0702 : Bool; // Outbound: Not-Aus vor Leer-Puffer betätigt + UZ0703 : Bool; // Outbound: Not-Aus nach Leer-Puffer betätigt + UZ7101 : Bool; // Outbound: Not-Aus am Kontrollplatz betätigt + UZ7102 : Bool; // Outbound: Not-Aus an Voll-Puffer-Einfahrt betätigt + UZ7103 : Bool; // Outbound: Not-Aus Mitte Voll-Puffer-Einfahrt betätigt + UZ7104 : Bool; // Outbound: Not-Aus Mitte Voll-Puffer-Ausfahrt betätigt + UZ7105 : Bool; // Outbound: Not-Aus an Voll-Puffer-Ausfahrt betätigt + UZ7106 : Bool; // Outbound: Not-Aus Ende Voll-Puffer-Einfahrt betätigt + UZ7107 : Bool; // Outbound: Not-Aus Ende Voll-Puffer-Ausfahrt betätigt + UZ7301 : Bool; // Outbound: Not-Aus an Highway BST 2/OB betätigt + UZ7302 : Bool; // Outbound: Not-Aus an Highway BST 2/Bypass betätigt + UZ7303 : Bool; // Outbound: Not-Aus an Bypass LP>VP betätigt + END_STRUCT; + NotErr : Bool; // Not-Aus ist betätigt (Kreis) + PnErr : Bool; // Pneumatik-Versorgung fehlt + SiErr : Bool; // Sicherungsfall + MotErr : Bool; // Motorschutz hat ausgelöst + Phasen : Bool; // Phasenwächter + K10Err : Bool; // Hauptschütz unklar + Brandfall : Bool; // Brandmeldung + Automatik : Bool; // Automatik + Handbetrieb : Bool; // Handbetrieb aktiv + BereichErr : Bool; // Bereich hat eine Systemstörung -> Antriebe stoppen + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + BereichErr_old : Bool; // Bereich hatte eine Systemstörung -> Anfahrwarnung + StOk_aktiv : Bool; // Impuls + Anfahrwarnung : Bool; // Anfahrwarnung in Signal-Tower + END_STRUCT; + A01_UC071 : Struct // Outbound: Unterverteiler UC071 + PnErr : Bool; // Pneumatik-Versorgung fehlt + SiErr : Bool; // Sicherungsfall + MotErr : Bool; // Motorschutz hat ausgelöst + K10Err : Bool; // Hauptschütz unklar + BereichErr : Bool; // Bereich hat eine Systemstörung -> Antriebe stoppen + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + BereichErr_old : Bool; // Bereich hatte eine Systemstörung -> Anfahrwarnung + Anfahrwarnung : Bool; // Anfahrwarnung in Signal-Tower + END_STRUCT; + A01_UC072 : Struct // Outbound: Unterverteiler UC072 + Not_Aus : Struct // Not-Aus-Störungen + ausgeloest : Bool; // Not-Aus hat ausgelöst + UC072 : Bool; // Outbound: Not-Aus am Schaltschrank UC072 betätigt + UZ7201 : Bool; // Outbound: Not-Aus an Highway Nähe AMR betätigt + UZ7202 : Bool; // Outbound: Not-Aus an Highway BST 2/AMR betätigt + END_STRUCT; + NotErr : Bool; // Not-Aus ist betätigt (Kreis) + PnErr : Bool; // Pneumatik-Versorgung fehlt + SiErr : Bool; // Sicherungsfall + MotErr : Bool; // Motorschutz hat ausgelöst + K10Err : Bool; // Hauptschütz unklar + BereichErr : Bool; // Bereich hat eine Systemstörung -> Antriebe stoppen + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + BereichErr_old : Bool; // Bereich hatte eine Systemstörung -> Anfahrwarnung + Anfahrwarnung : Bool; // Anfahrwarnung in Signal-Tower + END_STRUCT; + A01_UC073 : Struct // Outbound: Unterverteiler UC073 + PnErr : Bool; // Pneumatik-Versorgung fehlt + SiErr : Bool; // Sicherungsfall + MotErr : Bool; // Motorschutz hat ausgelöst + K10Err : Bool; // Hauptschütz unklar + BereichErr : Bool; // Bereich hat eine Systemstörung -> Antriebe stoppen + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + BereichErr_old : Bool; // Bereich hatte eine Systemstörung -> Anfahrwarnung + Anfahrwarnung : Bool; // Anfahrwarnung in Signal-Tower + END_STRUCT; + A01_UC074 : Struct // Outbound: Unterverteiler UC074 + Not_Aus : Struct // Not-Aus-Störungen + ausgeloest : Bool; // Not-Aus hat ausgelöst + UC074 : Bool; // Outbound: Not-Aus am Schaltschrank UC074 betätigt + UZ7401 : Bool; // Outbound: Not-Aus an Bypass VP>LP betätigt + UZ7402 : Bool; // Outbound: Not-Aus an Entnahme-Puffer betätigt + UZ7403 : Bool; // Outbound: Not-Aus an Entnahme-Puffer betätigt + END_STRUCT; + NotErr : Bool; // Not-Aus ist betätigt (Kreis) + PnErr : Bool; // Pneumatik-Versorgung fehlt + SiErr : Bool; // Sicherungsfall + MotErr : Bool; // Motorschutz hat ausgelöst + K10Err : Bool; // Hauptschütz unklar + BereichErr : Bool; // Bereich hat eine Systemstörung -> Antriebe stoppen + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + BereichErr_old : Bool; // Bereich hatte eine Systemstörung -> Anfahrwarnung + Anfahrwarnung : Bool; // Anfahrwarnung in Signal-Tower + END_STRUCT; + A01_UZ0701 : Struct // Outbound: UZ0701 + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + END_STRUCT; + A01_UZ0702 : Struct // Outbound: UZ0702 + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + END_STRUCT; + A01_UZ0703 : Struct // Outbound: UZ0703 + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + END_STRUCT; + A01_UZ7101 : Struct // Outbound: UZ7101 + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + END_STRUCT; + A01_UZ7102 : Struct // Outbound: UZ7102 + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + Area_Stop : Bool; + END_STRUCT; + A01_UZ7103 : Struct // Outbound: UZ7103 + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + END_STRUCT; + A01_UZ7104 : Struct // Outbound: UZ7104 + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + Area_Stop : Bool; + END_STRUCT; + A01_UZ7105 : Struct // Outbound: UZ7105 + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + END_STRUCT; + A01_UZ7106 : Struct // Outbound: UZ7106 + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + END_STRUCT; + A01_UZ7107 : Struct // Outbound: UZ7107 + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + END_STRUCT; + A01_UZ7201 : Struct // Outbound: UZ7201 + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + Area_Stop : Bool; + END_STRUCT; + A01_UZ7202 : Struct // Outbound: UZ7202 + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + Area_Stop : Bool; + END_STRUCT; + A01_UZ7301 : Struct // Outbound: UZ7301 + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + END_STRUCT; + A01_UZ7302 : Struct // Outbound: UZ7302 + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + END_STRUCT; + A01_UZ7303 : Struct // Outbound: UZ7303 + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + END_STRUCT; + A01_UZ7401 : Struct // Outbound: UZ7401 + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + END_STRUCT; + A01_UZ7402 : Struct // Outbound: UZ7402 + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + END_STRUCT; + A01_UZ7403 : Struct // Outbound: UZ7403 + StOk_blinken : Bool; // Start n. Störung-Anzeige blinken lassen + StOk_Flanke : Bool; // Flankenmerker + StOk_aktiv : Bool; // Impuls + END_STRUCT; + ErrDD { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; + ErrBits { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; + "Fast-Sensors" : Struct + B1123 : Bool; + B1203 : Bool; + B1291 : Bool; + B1132 : Bool; + B0381 : Bool; + B0792 : Bool; + END_STRUCT; + END_VAR + + VAR_TEMP + Quit_aktiv : Bool; + Not_Err : Bool; // Ein Not-Aus-Taster noch betätigt + Not_Akt : Bool; // Ein Not-Aus-Störung noch nicht quittiert + Stoerung : Bool; + Meldung : Bool; + ProfibusError : Bool; + Störung_vorhanden : Bool; + END_VAR + + +BEGIN +NETWORK +TITLE = Anlage ein/aus, Anzeigen + U "SF0001"; + U "SF0000"; + UN #A01_UH07.AnlageEin; + UN "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3; + S #A01_UH07.AnlageEin; + S #A01_UH07.Anfahrwarnung; + + UN "SF0000"; + O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3; + O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4; + O "7_HMI_Err_UH07_OB".Kommunikation.SendFIFO_Port1; + O "7_HMI_Err_UH07_OB".Kommunikation.SendFIFO_Port2; + R #A01_UH07.AnlageEin; + + U #A01_UH07.AnlageEin; + = "PF0001"; + = #A01_UH07.Automatik; + + UN #A01_UH07.Automatik; + = "7_HMI_Err_UH07_OB".System.Anlage_aus; + +NETWORK +TITLE = Störungen quittieren + U "SF0002"; + FP #A01_UH07.StOk_Flanke; + = #A01_UH07.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0117"; + FP #A01_UC071.StOk_Flanke; + = #A01_UC071.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0177"; + FP #A01_UC072.StOk_Flanke; + = #A01_UC072.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0237"; + FP #A01_UC073.StOk_Flanke; + = #A01_UC073.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0297"; + FP #A01_UC074.StOk_Flanke; + = #A01_UC074.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0041"; + FP #A01_UZ0701.StOk_Flanke; + = #A01_UZ0701.StOk_aktiv ;//Impuls Störungen quittieren + + U "SF0043"; + FP #A01_UZ0702.StOk_Flanke; + = #A01_UZ0702.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0045"; + FP #A01_UZ0703.StOk_Flanke; + = #A01_UZ0703.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0121"; + FP #A01_UZ7101.StOk_Flanke; + = #A01_UZ7101.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0123"; + FP #A01_UZ7102.StOk_Flanke; + = #A01_UZ7102.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0125"; + FP #A01_UZ7103.StOk_Flanke; + = #A01_UZ7103.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0127"; + FP #A01_UZ7104.StOk_Flanke; + = #A01_UZ7104.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0131"; + FP #A01_UZ7105.StOk_Flanke; + = #A01_UZ7105.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0133"; + FP #A01_UZ7106.StOk_Flanke; + = #A01_UZ7106.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0135"; + FP #A01_UZ7107.StOk_Flanke; + = #A01_UZ7107.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0181"; + FP #A01_UZ7201.StOk_Flanke; + = #A01_UZ7201.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0183"; + FP #A01_UZ7202.StOk_Flanke; + = #A01_UZ7202.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0241"; + FP #A01_UZ7301.StOk_Flanke; + = #A01_UZ7301.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0243"; + FP #A01_UZ7302.StOk_Flanke; + = #A01_UZ7302.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0245"; + FP #A01_UZ7303.StOk_Flanke; + = #A01_UZ7303.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0301"; + FP #A01_UZ7401.StOk_Flanke; + = #A01_UZ7401.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0303"; + FP #A01_UZ7402.StOk_Flanke; + = #A01_UZ7402.StOk_aktiv;//Impuls Störungen quittieren + + U "SF0305"; + FP #A01_UZ7403.StOk_Flanke; + = #A01_UZ7403.StOk_aktiv;//Impuls Störungen quittieren + +NETWORK +TITLE = UH07: Pneumatik-Störung + U "BP0004"; + L S5T#10S;//Damit Druck aufgebaut werden kann ! + SE "T200"; + +//Störung kann quittiert werden: + U "T200"; + U "7_HMI_Err_UH07_OB".VErr.Pn_UH07; + S #A01_UH07.StOk_blinken; + +//Störung quittieren: + U #A01_UH07.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "T200"; + R "7_HMI_Err_UH07_OB".VErr.Pn_UH07; + +//Störung aktiv: + UN "T200"; + S "7_HMI_Err_UH07_OB".VErr.Pn_UH07; + + U "7_HMI_Err_UH07_OB".VErr.Pn_UH07; + = #A01_UH07.PnErr; + +//Anzeige: + U "7_HMI_Err_UH07_OB".VErr.Pn_UH07; + = "PF0003"; + +NETWORK +TITLE = UC071: Pneumatik-Störung + U "BP0107"; + L S5T#10S;//Damit Druck aufgebaut werden kann ! + SE "T201"; + +//Störung kann quittiert werden: + U "T201"; + U "7_HMI_Err_UH07_OB".VErr.Pn_UC071; + S #A01_UC071.StOk_blinken; + +//Störung quittieren: + U #A01_UC071.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "T201"; + R "7_HMI_Err_UH07_OB".VErr.Pn_UC071; + +//Störung aktiv: + UN "T201"; + S "7_HMI_Err_UH07_OB".VErr.Pn_UC071; + +//Anzeige: + U "7_HMI_Err_UH07_OB".VErr.Pn_UC071; + = "PF0100"; + +//Pneumatik-Störung: + U "7_HMI_Err_UH07_OB".VErr.Pn_UC071; + = #A01_UC071.PnErr; + +NETWORK +TITLE = UC072: Pneumatik-Störung + U "BP0167"; + L S5T#10S;//Damit Druck aufgebaut werden kann ! + SE "T202"; + +//Störung kann quittiert werden: + U "T202"; + U "7_HMI_Err_UH07_OB".VErr.Pn_UC072; + S #A01_UC072.StOk_blinken; + +//Störung quittieren: + U #A01_UC072.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "T202"; + R "7_HMI_Err_UH07_OB".VErr.Pn_UC072; + +//Störung aktiv: + UN "T202"; + S "7_HMI_Err_UH07_OB".VErr.Pn_UC072; + +//Anzeige: + U "7_HMI_Err_UH07_OB".VErr.Pn_UC072; + = "PF0160"; + +//Pneumatik-Störung: + U "7_HMI_Err_UH07_OB".VErr.Pn_UC072; + = #A01_UC072.PnErr; + +NETWORK +TITLE = UC073: Pneumatik-Störung + U "BP0227"; + L S5T#10S;//Damit Druck aufgebaut werden kann ! + SE "T203"; + +//Störung kann quittiert werden: + U "T203"; + U "7_HMI_Err_UH07_OB".VErr.Pn_UC073; + S #A01_UC073.StOk_blinken; + +//Störung quittieren: + U #A01_UC073.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "T203"; + R "7_HMI_Err_UH07_OB".VErr.Pn_UC073; + +//Störung aktiv: + UN "T203"; + S "7_HMI_Err_UH07_OB".VErr.Pn_UC073; + +//Anzeige: + U "7_HMI_Err_UH07_OB".VErr.Pn_UC073; + = "PF0220"; + +//Pneumatik-Störung: + U "7_HMI_Err_UH07_OB".VErr.Pn_UC073; + = #A01_UC073.PnErr; + +NETWORK +TITLE = UC074: Pneumatik-Störung + U "BP0287"; + L S5T#10S;//Damit Druck aufgebaut werden kann ! + SE "T204"; + +//Störung kann quittiert werden: + U "T204"; + U "7_HMI_Err_UH07_OB".VErr.Pn_UC074; + S #A01_UC074.StOk_blinken; + +//Störung quittieren: + U #A01_UC074.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "T204"; + R "7_HMI_Err_UH07_OB".VErr.Pn_UC074; + +//Störung aktiv: + UN "T204"; + S "7_HMI_Err_UH07_OB".VErr.Pn_UC074; + +//Anzeige: + U "7_HMI_Err_UH07_OB".VErr.Pn_UC074; + = "PF0280"; + +//Pneumatik-Störung: + U "7_HMI_Err_UH07_OB".VErr.Pn_UC074; + = #A01_UC074.PnErr; + +NETWORK +TITLE = UH07: Phasenausfall + +//Störung kann quittiert werden: + U "7_HMI_Err_UH07_OB".VErr.Phasen; + U "DI0005"; + S #A01_UH07.StOk_blinken; + +//Impuls Störungen quittieren + U #A01_UH07.StOk_aktiv; + U "DI0005"; + R "7_HMI_Err_UH07_OB".VErr.Phasen; + +//Störung aktiv: + UN "DI0005"; + S "7_HMI_Err_UH07_OB".VErr.Phasen; + +NETWORK +TITLE = UH07: Sicherungsfall + +//Störung kann quittiert werden: + U "DI0006"; + U "7_HMI_Err_UH07_OB".VErr.FC0006; + O; + U "DI0007"; + U "7_HMI_Err_UH07_OB".VErr.FC0007; + O; + U "DI0010"; + U "7_HMI_Err_UH07_OB".VErr.FC0010; + O; + U "DI0011"; + U "7_HMI_Err_UH07_OB".VErr.FC0011; + O; + U "DI0021"; + U "7_HMI_Err_UH07_OB".VErr.FC0021; + O; + U "DI0022"; + U "7_HMI_Err_UH07_OB".VErr.FC0022; + O; + U "DI0023"; + U "7_HMI_Err_UH07_OB".VErr.FC0023; + S #A01_UH07.StOk_blinken; + +//Störung quittieren: + U #A01_UH07.StOk_aktiv;//Impuls Störungen quittieren + R "7_HMI_Err_UH07_OB".VErr.FC0006; + R "7_HMI_Err_UH07_OB".VErr.FC0007; + R "7_HMI_Err_UH07_OB".VErr.FC0010; + R "7_HMI_Err_UH07_OB".VErr.FC0011; + R "7_HMI_Err_UH07_OB".VErr.FC0012; + R "7_HMI_Err_UH07_OB".VErr.FC0021; + R "7_HMI_Err_UH07_OB".VErr.FC0022; + R "7_HMI_Err_UH07_OB".VErr.FC0023; + +//Störung aktiv: + UN "DI0006"; + S "7_HMI_Err_UH07_OB".VErr.FC0006; + + UN "DI0007"; + S "7_HMI_Err_UH07_OB".VErr.FC0007; + + UN "DI0010"; + S "7_HMI_Err_UH07_OB".VErr.FC0010; + + UN "DI0011"; + S "7_HMI_Err_UH07_OB".VErr.FC0011; + + UN "DI0021"; + S "7_HMI_Err_UH07_OB".VErr.FC0021; + + UN "DI0022"; + S "7_HMI_Err_UH07_OB".VErr.FC0022; + + UN "DI0023"; + S "7_HMI_Err_UH07_OB".VErr.FC0023; + +//Sicherungs-Störung gesamt: + U "7_HMI_Err_UH07_OB".VErr.FC0006; + O "7_HMI_Err_UH07_OB".VErr.FC0007; + O "7_HMI_Err_UH07_OB".VErr.FC0010; + O "7_HMI_Err_UH07_OB".VErr.FC0011; + O "7_HMI_Err_UH07_OB".VErr.FC0012; + O "7_HMI_Err_UH07_OB".VErr.FC0021; + O "7_HMI_Err_UH07_OB".VErr.FC0022; + O "7_HMI_Err_UH07_OB".VErr.FC0023; + O "7_HMI_Err_UH07_OB".VErr.Frei131; + O "7_HMI_Err_UH07_OB".VErr.Frei132; + O "7_HMI_Err_UH07_OB".VErr.Frei133; + = #A01_UH07.SiErr; + +//Anzeige: + U "7_HMI_Err_UH07_OB".VErr.Phasen; + U "Clock_1Hz"; + O #A01_UH07.SiErr; + = "PF0005"; + +NETWORK +TITLE = UC071: Sicherungsfall + +//Störung kann quittiert werden: + U "DI0100"; + U "7_HMI_Err_UH07_OB".VErr.FC0100; + O; + U "DI0101"; + U "7_HMI_Err_UH07_OB".VErr.FC0101; + O; + U "DI0102"; + U "7_HMI_Err_UH07_OB".VErr.FC0102; + O; + U "DI0103"; + U "7_HMI_Err_UH07_OB".VErr.FC0103; + S #A01_UC071.StOk_blinken; + +//Störung quittieren: + U #A01_UC071.StOk_aktiv;//Impuls Störungen quittieren + R "7_HMI_Err_UH07_OB".VErr.FC0100; + R "7_HMI_Err_UH07_OB".VErr.FC0101; + R "7_HMI_Err_UH07_OB".VErr.FC0102; + R "7_HMI_Err_UH07_OB".VErr.FC0103; + +//Störung aktiv: + UN "DI0100"; + S "7_HMI_Err_UH07_OB".VErr.FC0100; + + UN "DI0101"; + S "7_HMI_Err_UH07_OB".VErr.FC0101; + + UN "DI0102"; + S "7_HMI_Err_UH07_OB".VErr.FC0102; + + UN "DI0103"; + S "7_HMI_Err_UH07_OB".VErr.FC0103; + +//Sicherungs-Störung gesamt: + U "7_HMI_Err_UH07_OB".VErr.FC0100; + O "7_HMI_Err_UH07_OB".VErr.FC0101; + O "7_HMI_Err_UH07_OB".VErr.FC0102; + O "7_HMI_Err_UH07_OB".VErr.FC0103; + = #A01_UC071.SiErr; + +//Anzeige: + U #A01_UC071.SiErr; + = "PF0102"; + +NETWORK +TITLE = UC072: Sicherungsfall + +//Störung kann quittiert werden: + U "DI0160"; + U "7_HMI_Err_UH07_OB".VErr.FC0160; + O; + U "DI0161"; + U "7_HMI_Err_UH07_OB".VErr.FC0161; + O; + U "DI0162"; + U "7_HMI_Err_UH07_OB".VErr.FC0162; + S #A01_UC072.StOk_blinken; + +//Störung quittieren: + U #A01_UC072.StOk_aktiv;//Impuls Störungen quittieren + R "7_HMI_Err_UH07_OB".VErr.FC0160; + R "7_HMI_Err_UH07_OB".VErr.FC0161; + R "7_HMI_Err_UH07_OB".VErr.FC0162; + +//Störung aktiv: + UN "DI0160"; + S "7_HMI_Err_UH07_OB".VErr.FC0160; + + UN "DI0161"; + S "7_HMI_Err_UH07_OB".VErr.FC0161; + + UN "DI0162"; + S "7_HMI_Err_UH07_OB".VErr.FC0162; + +//Sicherungs-Störung gesamt: + U "7_HMI_Err_UH07_OB".VErr.FC0160; + O "7_HMI_Err_UH07_OB".VErr.FC0161; + O "7_HMI_Err_UH07_OB".VErr.FC0162; + = #A01_UC072.SiErr; + +//Anzeige: + U #A01_UC072.SiErr; + = "PF0162"; + +NETWORK +TITLE = UC073: Sicherungsfall + +//Störung kann quittiert werden: + U "DI0220"; + U "7_HMI_Err_UH07_OB".VErr.FC0220; + O; + U "DI0221"; + U "7_HMI_Err_UH07_OB".VErr.FC0221; + O; + U "DI0222"; + U "7_HMI_Err_UH07_OB".VErr.FC0222; + O; + U "DI0223"; + U "7_HMI_Err_UH07_OB".VErr.FC0223; + S #A01_UC073.StOk_blinken; + +//Störung quittieren: + U #A01_UC073.StOk_aktiv;//Impuls Störungen quittieren + R "7_HMI_Err_UH07_OB".VErr.FC0220; + R "7_HMI_Err_UH07_OB".VErr.FC0221; + R "7_HMI_Err_UH07_OB".VErr.FC0222; + R "7_HMI_Err_UH07_OB".VErr.FC0223; + +//Störung aktiv: + UN "DI0220"; + S "7_HMI_Err_UH07_OB".VErr.FC0220; + + UN "DI0221"; + S "7_HMI_Err_UH07_OB".VErr.FC0221; + + UN "DI0222"; + S "7_HMI_Err_UH07_OB".VErr.FC0222; + + UN "DI0223"; + S "7_HMI_Err_UH07_OB".VErr.FC0223; + +//Sicherungs-Störung gesamt: + U "7_HMI_Err_UH07_OB".VErr.FC0220; + O "7_HMI_Err_UH07_OB".VErr.FC0221; + O "7_HMI_Err_UH07_OB".VErr.FC0222; + O "7_HMI_Err_UH07_OB".VErr.FC0223; + = #A01_UC073.SiErr; + +//Anzeige: + U #A01_UC073.SiErr; + = "PF0222"; + +NETWORK +TITLE = UC074: Sicherungsfall + +//Störung kann quittiert werden: + U "DI0280"; + U "7_HMI_Err_UH07_OB".VErr.FC0280; + O; + U "DI0281"; + U "7_HMI_Err_UH07_OB".VErr.FC0281; + O; + U "DI0282"; + U "7_HMI_Err_UH07_OB".VErr.FC0282; + O; + U "DI0283"; + U "7_HMI_Err_UH07_OB".VErr.FC0283; + S #A01_UC074.StOk_blinken; + +//Störung quittieren: + U #A01_UC074.StOk_aktiv;//Impuls Störungen quittieren + R "7_HMI_Err_UH07_OB".VErr.FC0280; + R "7_HMI_Err_UH07_OB".VErr.FC0281; + R "7_HMI_Err_UH07_OB".VErr.FC0282; + R "7_HMI_Err_UH07_OB".VErr.FC0283; + +//Störung aktiv: + UN "DI0280"; + S "7_HMI_Err_UH07_OB".VErr.FC0280; + + UN "DI0281"; + S "7_HMI_Err_UH07_OB".VErr.FC0281; + + UN "DI0282"; + S "7_HMI_Err_UH07_OB".VErr.FC0282; + + UN "DI0283"; + S "7_HMI_Err_UH07_OB".VErr.FC0283; + +//Sicherungs-Störung gesamt: + U "7_HMI_Err_UH07_OB".VErr.FC0280; + O "7_HMI_Err_UH07_OB".VErr.FC0281; + O "7_HMI_Err_UH07_OB".VErr.FC0282; + O "7_HMI_Err_UH07_OB".VErr.FC0283; + = #A01_UC074.SiErr; + +//Anzeige: + U #A01_UC074.SiErr; + = "PF0282"; + +NETWORK +TITLE = UH07: Motorschutz-Störung ist aktiv + +//Störung kann quittiert werden: + U "7_HMI_Err_UH07_OB".QErr.MA0060; + U "FC0060"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0061; + U "FC0061"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0062; + U "FC0062"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0063; + U "FC0063"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0064; + U "FC0064"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0065; + U "FC0065"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0066; + U "FC0066"; + S #A01_UH07.StOk_blinken; + +//Störung quittieren: +//wird im Lastbaustein gemacht + +//Störung aktiv: +//wird im Lastbaustein gemacht + +//Motorschutz-Störung gesamt: + U "7_HMI_Err_UH07_OB".QErr.MA0060; + O "7_HMI_Err_UH07_OB".QErr.MA0061; + O "7_HMI_Err_UH07_OB".QErr.MA0062; + O "7_HMI_Err_UH07_OB".QErr.MA0063; + O "7_HMI_Err_UH07_OB".QErr.MA0064; + O "7_HMI_Err_UH07_OB".QErr.MA0065; + O "7_HMI_Err_UH07_OB".QErr.MA0066; + = #A01_UH07.MotErr; + +//Anzeige: + U #A01_UH07.MotErr; + = "PF0004"; + +NETWORK +TITLE = UC071: Motorschutz-Störung ist aktiv + +//Störung kann quittiert werden: + U "7_HMI_Err_UH07_OB".QErr.MA0140; + U "FC0140"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0141; + U "FC0141"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0142; + U "FC0142"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0143; + U "FC0143"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0144; + U "FC0144"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0145; + U "FC0145"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0146; + U "FC0146"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0147; + U "FC0147"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0150; + U "FC0150"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0151; + U "FC0151"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0152; + U "FC0152"; + S #A01_UC071.StOk_blinken; + +//Störung quittieren: +//wird im Lastbaustein gemacht + +//Störung aktiv: +//wird im Lastbaustein gemacht + +//Motorschutz-Störung gesamt: + U "7_HMI_Err_UH07_OB".QErr.MA0140; + O "7_HMI_Err_UH07_OB".QErr.MA0141; + O "7_HMI_Err_UH07_OB".QErr.MA0142; + O "7_HMI_Err_UH07_OB".QErr.MA0143; + O "7_HMI_Err_UH07_OB".QErr.MA0144; + O "7_HMI_Err_UH07_OB".QErr.MA0145; + O "7_HMI_Err_UH07_OB".QErr.MA0146; + O "7_HMI_Err_UH07_OB".QErr.MA0147; + O "7_HMI_Err_UH07_OB".QErr.MA0150; + O "7_HMI_Err_UH07_OB".QErr.MA0151; + O "7_HMI_Err_UH07_OB".QErr.MA0152; + = #A01_UC071.MotErr; + +//Anzeige: + U #A01_UC071.MotErr; + = "PF0101"; + +NETWORK +TITLE = UC072: Motorschutz-Störung ist aktiv + +//Störung kann quittiert werden: + U "7_HMI_Err_UH07_OB".QErr.MA0200; + U "FC0200"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0201; + U "FC0201"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0202; + U "FC0202"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0203; + U "FC0203"; + S #A01_UC072.StOk_blinken; + +//Störung quittieren: +//wird im Lastbaustein gemacht + +//Störung aktiv: +//wird im Lastbaustein gemacht + +//Motorschutz-Störung gesamt: + U "7_HMI_Err_UH07_OB".QErr.MA0200; + O "7_HMI_Err_UH07_OB".QErr.MA0201; + O "7_HMI_Err_UH07_OB".QErr.MA0202; + O "7_HMI_Err_UH07_OB".QErr.MA0203; + = #A01_UC072.MotErr; + +//Anzeige: + U #A01_UC072.MotErr; + = "PF0161"; + +NETWORK +TITLE = UC073: Motorschutz-Störung ist aktiv + +//Störung kann quittiert werden: + U "7_HMI_Err_UH07_OB".QErr.MA0260; + U "FC0260"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0261; + U "FC0261"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0262; + U "FC0262"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0263; + U "FC0263"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0264; + U "FC0264"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0265; + U "FC0265"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0266; + U "FC0266"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0267; + U "FC0267"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0270; + U "FC0270"; + S #A01_UC073.StOk_blinken; + +//Störung quittieren: +//wird im Lastbaustein gemacht + +//Störung aktiv: +//wird im Lastbaustein gemacht + +//Motorschutz-Störung gesamt: + U "7_HMI_Err_UH07_OB".QErr.MA0260; + O "7_HMI_Err_UH07_OB".QErr.MA0261; + O "7_HMI_Err_UH07_OB".QErr.MA0262; + O "7_HMI_Err_UH07_OB".QErr.MA0263; + O "7_HMI_Err_UH07_OB".QErr.MA0264; + O "7_HMI_Err_UH07_OB".QErr.MA0265; + O "7_HMI_Err_UH07_OB".QErr.MA0266; + O "7_HMI_Err_UH07_OB".QErr.MA0267; + O "7_HMI_Err_UH07_OB".QErr.MA0270; + = #A01_UC073.MotErr; + +//Anzeige: + U #A01_UC073.MotErr; + = "PF0221"; + +NETWORK +TITLE = UC074: Motorschutz-Störung ist aktiv + +//Störung kann quittiert werden: + U "7_HMI_Err_UH07_OB".QErr.MA0320; + U "FC0320"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0321; + U "FC0321"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0322; + U "FC0322"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0323; + U "FC0323"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0324; + U "FC0324"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0325; + U "FC0325"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0326; + U "FC0326"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0327; + U "FC0327"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0330; + U "FC0330"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0331; + U "FC0331"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0332; + U "FC0332"; + O; + U "7_HMI_Err_UH07_OB".QErr.MA0333; + U "FC0333"; + S #A01_UC074.StOk_blinken; + +//Störung quittieren: +//wird im Lastbaustein gemacht + +//Störung aktiv: +//wird im Lastbaustein gemacht + +//Motorschutz-Störung gesamt: + U "7_HMI_Err_UH07_OB".QErr.MA0320; + O "7_HMI_Err_UH07_OB".QErr.MA0321; + O "7_HMI_Err_UH07_OB".QErr.MA0322; + O "7_HMI_Err_UH07_OB".QErr.MA0323; + O "7_HMI_Err_UH07_OB".QErr.MA0324; + O "7_HMI_Err_UH07_OB".QErr.MA0325; + O "7_HMI_Err_UH07_OB".QErr.MA0326; + O "7_HMI_Err_UH07_OB".QErr.MA0327; + O "7_HMI_Err_UH07_OB".QErr.MA0330; + O "7_HMI_Err_UH07_OB".QErr.MA0331; + O "7_HMI_Err_UH07_OB".QErr.MA0332; + O "7_HMI_Err_UH07_OB".QErr.MA0333; + = #A01_UC074.MotErr; + +//Anzeige: + U #A01_UC074.MotErr; + = "PF0281"; + +NETWORK +TITLE = UH07: Feueralarm + +//Störung kann quittiert werden: + U "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3; + U "DI0034"; + O; + U "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4; + U "DI0033"; + O; + U "7_HMI_Err_UH07_OB".System.BST1_Feueralarm; + U "DI0035"; + O; + U "7_HMI_Err_UH07_OB".System.BST1_Störung; + U "DI0036"; + O; + U "7_HMI_Err_UH07_OB".System.BST1_Geschlossen; + U "DI0037"; + O; + U "7_HMI_Err_UH07_OB".System.BST2_Feueralarm; + U "DI0170"; + O; + U "7_HMI_Err_UH07_OB".System.BST2_Störung; + U "DI0171"; + O; + U "7_HMI_Err_UH07_OB".System.BST2_Geschlossen; + U "DI0172"; + S #A01_UH07.StOk_blinken; + +//Impuls Störungen quittieren + U #A01_UH07.StOk_aktiv; + R "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3; + R "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4; + R "7_HMI_Err_UH07_OB".System.BST1_Feueralarm; + R "7_HMI_Err_UH07_OB".System.BST1_Störung; + R "7_HMI_Err_UH07_OB".System.BST1_Geschlossen; + R "7_HMI_Err_UH07_OB".System.BST2_Feueralarm; + R "7_HMI_Err_UH07_OB".System.BST2_Störung; + R "7_HMI_Err_UH07_OB".System.BST2_Geschlossen; + +//Störung aktiv: + UN "DI0033"; + S "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3; + UN "DI0034"; + S "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4; + + UN "DI0035"; + S "7_HMI_Err_UH07_OB".System.BST1_Feueralarm; + + UN "DI0036"; + S "7_HMI_Err_UH07_OB".System.BST1_Störung; + + UN "DI0037"; + S "7_HMI_Err_UH07_OB".System.BST1_Geschlossen; + + UN "DI0170"; + S "7_HMI_Err_UH07_OB".System.BST2_Feueralarm; + + UN "DI0171"; + S "7_HMI_Err_UH07_OB".System.BST2_Störung; + + UN "DI0172"; + S "7_HMI_Err_UH07_OB".System.BST2_Geschlossen; + +//Brandschutztür gesamt: + U "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3; + O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4; + O "7_HMI_Err_UH07_OB".System.BST1_Feueralarm; + O "7_HMI_Err_UH07_OB".System.BST1_Störung; + O "7_HMI_Err_UH07_OB".System.BST1_Geschlossen; + O "7_HMI_Err_UH07_OB".System.BST2_Feueralarm; + O "7_HMI_Err_UH07_OB".System.BST2_Störung; + O "7_HMI_Err_UH07_OB".System.BST2_Geschlossen; + = #A01_UH07.Brandfall; + +//Anzeige: + U #A01_UH07.Brandfall; + = "PF0006"; + +NETWORK +TITLE = UH07: Not-Aus-Störung erzeugen / quittierbar / quittieren (+UC071 +UC073) + +//Quittierung wurd abgearbeitet: + U "DSchnittstelle_zu_Safety".FromSafety.ACK_A01_UH07_fertig; + R "DSchnittstelle_zu_Safety".FromSafety.ACK_A01_UH07_fertig; + R "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07; + + U "DSchnittstelle_zu_Safety".FromSafety.ACK_A01_UC071_fertig; + R "DSchnittstelle_zu_Safety".FromSafety.ACK_A01_UC071_fertig; + R "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC071; + + U "DSchnittstelle_zu_Safety".FromSafety.ACK_A01_UC073_fertig; + R "DSchnittstelle_zu_Safety".FromSafety.ACK_A01_UC073_fertig; + R "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC073; + +//Not-Aus nach Haupschalter ein quittieren: + U #A01_UH07.StOk_aktiv ;//Impuls Störungen quittieren + U #A01_UH07.Not_Aus.ausgeloest; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07;//Not-Aus quittieren + +//Not-Aus an UH07: + U "SF0400"; + U #A01_UH07.Not_Aus.UH07; + S #A01_UH07.StOk_blinken;//Störung quittierbar + + U #A01_UH07.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF0400"; + U #A01_UH07.Not_Aus.UH07; + R #A01_UH07.Not_Aus.UH07; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07;//Not-Aus quittieren + + UN "SF0400"; + S #A01_UH07.Not_Aus.UH07;//Störung vorhanden + + U #A01_UH07.Not_Aus.UH07 ;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UH07;//Störung an OP übergeben + +//Not-Aus an UC071: + U "SF0710"; + U #A01_UH07.Not_Aus.UC071; + S #A01_UC071.StOk_blinken;//Störung quittierbar + + U #A01_UC071.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF0710"; + U #A01_UH07.Not_Aus.UC071; + R #A01_UH07.Not_Aus.UC071; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC071;//Not-Aus quittieren + + UN "SF0710"; + S #A01_UH07.Not_Aus.UC071;//Störung vorhanden + + U #A01_UH07.Not_Aus.UC071;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UC071;//Störung an OP übergeben + +//Not-Aus an UC073: + U "SF1330"; + U #A01_UH07.Not_Aus.UC073; + S #A01_UC073.StOk_blinken;//Störung quittierbar + + U #A01_UC073.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF1330"; + U #A01_UH07.Not_Aus.UC073; + R #A01_UH07.Not_Aus.UC073; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC073;//Not-Aus quittieren + + UN "SF1330"; + S #A01_UH07.Not_Aus.UC073;//Störung vorhanden + + U #A01_UH07.Not_Aus.UC073;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UC073;//Störung an OP übergeben + +//Not-Aus an UZ0701: + U "SF0401"; + U #A01_UH07.Not_Aus.UZ0701; + S #A01_UZ0701.StOk_blinken;//Störung quittierbar + + U #A01_UZ0701.StOk_aktiv ;//Impuls Störungen quittieren //Störungen quittieren + U "SF0401"; + U #A01_UH07.Not_Aus.UZ0701; + R #A01_UH07.Not_Aus.UZ0701; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07;//Not-Aus quittieren + + UN "SF0401"; + S #A01_UH07.Not_Aus.UZ0701;//Störung vorhanden + + U #A01_UH07.Not_Aus.UZ0701;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UZ0701;//Störung an OP übergeben + +//Not-Aus an UZ0702: + U "SF0402"; + U #A01_UH07.Not_Aus.UZ0702; + S #A01_UZ0702.StOk_blinken;//Störung quittierbar + + U #A01_UZ0702.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF0402"; + U #A01_UH07.Not_Aus.UZ0702; + R #A01_UH07.Not_Aus.UZ0702; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07;//Not-Aus quittieren + + UN "SF0402"; + S #A01_UH07.Not_Aus.UZ0702;//Störung vorhanden + + U #A01_UH07.Not_Aus.UZ0702;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UZ0702;//Störung an OP übergeben + +//Not-Aus an UZ0703: + U "SF0403"; + U #A01_UH07.Not_Aus.UZ0703; + S #A01_UZ0703.StOk_blinken;//Störung quittierbar + + U #A01_UZ0703.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF0403"; + U #A01_UH07.Not_Aus.UZ0703; + R #A01_UH07.Not_Aus.UZ0703; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07;//Not-Aus quittieren + + UN "SF0403"; + S #A01_UH07.Not_Aus.UZ0703;//Störung vorhanden + + U #A01_UH07.Not_Aus.UZ0703;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UZ0703;//Störung an OP übergeben + +//Not-Aus an UZ7101: + U "SF0711"; + U #A01_UH07.Not_Aus.UZ7101; + S #A01_UZ7101.StOk_blinken;//Störung quittierbar + + U #A01_UZ7101.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF0711"; + U #A01_UH07.Not_Aus.UZ7101; + R #A01_UH07.Not_Aus.UZ7101; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07;//Not-Aus quittieren + + UN "SF0711"; + S #A01_UH07.Not_Aus.UZ7101;//Störung vorhanden + + U #A01_UH07.Not_Aus.UZ7101;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UZ7101;//Störung an OP übergeben + +//Not-Aus an UZ7102: + U "SF0712"; + U #A01_UH07.Not_Aus.UZ7102; + S #A01_UZ7102.StOk_blinken;//Störung quittierbar + + U #A01_UZ7102.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF0712"; + U #A01_UH07.Not_Aus.UZ7102; + R #A01_UH07.Not_Aus.UZ7102; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07;//Not-Aus quittieren + + UN "SF0712"; + S #A01_UH07.Not_Aus.UZ7102;//Störung vorhanden + + U #A01_UH07.Not_Aus.UZ7102;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UZ7102;//Störung an OP übergeben + +//Not-Aus an UZ7103: + U "SF0713"; + U #A01_UH07.Not_Aus.UZ7103; + S #A01_UZ7103.StOk_blinken;//Störung quittierbar + + U #A01_UZ7103.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF0713"; + U #A01_UH07.Not_Aus.UZ7103; + R #A01_UH07.Not_Aus.UZ7103; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07;//Not-Aus quittieren + + UN "SF0713"; + S #A01_UH07.Not_Aus.UZ7103;//Störung vorhanden + + U #A01_UH07.Not_Aus.UZ7103;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UZ7103;//Störung an OP übergeben + +//Not-Aus an UZ7104: + U "SF0780"; + U #A01_UH07.Not_Aus.UZ7104; + S #A01_UZ7104.StOk_blinken;//Störung quittierbar + + U #A01_UZ7104.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF0780"; + U #A01_UH07.Not_Aus.UZ7104; + R #A01_UH07.Not_Aus.UZ7104; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07;//Not-Aus quittieren + + UN "SF0780"; + S #A01_UH07.Not_Aus.UZ7104;//Störung vorhanden + + U #A01_UH07.Not_Aus.UZ7104;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UZ7104;//Störung an OP übergeben + +//Not-Aus an UZ7105: + U "SF0782"; + U #A01_UH07.Not_Aus.UZ7105; + S #A01_UZ7105.StOk_blinken;//Störung quittierbar + + U #A01_UZ7105.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF0782"; + U #A01_UH07.Not_Aus.UZ7105; + R #A01_UH07.Not_Aus.UZ7105; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07;//Not-Aus quittieren + + UN "SF0782"; + S #A01_UH07.Not_Aus.UZ7105;//Störung vorhanden + + U #A01_UH07.Not_Aus.UZ7105;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UZ7105;//Störung an OP übergeben + +//Not-Aus an UZ7106: + U "SF0783"; + U #A01_UH07.Not_Aus.UZ7106; + S #A01_UZ7106.StOk_blinken;//Störung quittierbar + + U #A01_UZ7106.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF0783"; + U #A01_UH07.Not_Aus.UZ7106; + R #A01_UH07.Not_Aus.UZ7106; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07;//Not-Aus quittieren + + UN "SF0783"; + S #A01_UH07.Not_Aus.UZ7106;//Störung vorhanden + + U #A01_UH07.Not_Aus.UZ7106;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UZ7106;//Störung an OP übergeben + +//Not-Aus an UZ7107: + U "SF0850"; + U #A01_UH07.Not_Aus.UZ7107; + S #A01_UZ7107.StOk_blinken;//Störung quittierbar + + U #A01_UZ7107.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF0850"; + U #A01_UH07.Not_Aus.UZ7107; + R #A01_UH07.Not_Aus.UZ7107; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07;//Not-Aus quittieren + + UN "SF0850"; + S #A01_UH07.Not_Aus.UZ7107;//Störung vorhanden + + U #A01_UH07.Not_Aus.UZ7107;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UZ7107;//Störung an OP übergeben + +//Not-Aus an UZ7301: + U "SF1331"; + U #A01_UH07.Not_Aus.UZ7301; + S #A01_UZ7301.StOk_blinken;//Störung quittierbar + + U #A01_UZ7301.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF1331"; + U #A01_UH07.Not_Aus.UZ7301; + R #A01_UH07.Not_Aus.UZ7301; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07;//Not-Aus quittieren + + UN "SF1331"; + S #A01_UH07.Not_Aus.UZ7301;//Störung vorhanden + + U #A01_UH07.Not_Aus.UZ7301;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UZ7301;//Störung an OP übergeben + +//Not-Aus an UZ7302: + U "SF1332"; + U #A01_UH07.Not_Aus.UZ7302; + S #A01_UZ7302.StOk_blinken;//Störung quittierbar + + U #A01_UZ7302.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF1332"; + U #A01_UH07.Not_Aus.UZ7302; + R #A01_UH07.Not_Aus.UZ7302; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07;//Not-Aus quittieren + + UN "SF1332"; + S #A01_UH07.Not_Aus.UZ7302;//Störung vorhanden + + U #A01_UH07.Not_Aus.UZ7302;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UZ7302;//Störung an OP übergeben + +//Not-Aus an UZ7303: + U "SF1333"; + U #A01_UH07.Not_Aus.UZ7303; + S #A01_UZ7303.StOk_blinken;//Störung quittierbar + + U #A01_UZ7303.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF1333"; + U #A01_UH07.Not_Aus.UZ7303; + R #A01_UH07.Not_Aus.UZ7303; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07;//Not-Aus quittieren + + UN "SF1333"; + S #A01_UH07.Not_Aus.UZ7303;//Störung vorhanden + + U #A01_UH07.Not_Aus.UZ7303;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UZ7303;//Störung an OP übergeben + +//Not-Aus ILS (UH05): + UN "DI0541" ;//von UH05 ILS + UN "DSchnittstelle_zu_Safety".ToSafety.Ohne_Partner; + = "7_HMI_Err_UH07_OB".Not.von_UH05; + +NETWORK +TITLE = UH07: Not-Aus-Störungen / Anzeigen + UN "SF0400" ;//Taster noch betätigt + ON "SF0710"; + ON "SF1330"; + ON "SF0401"; + ON "SF0402"; + ON "SF0403"; + ON "SF0711"; + ON "SF0712"; + ON "SF0713"; + ON "SF0780"; + ON "SF0782"; + ON "SF0783"; + ON "SF0850"; + ON "SF1331"; + ON "SF1332"; + ON "SF1333"; + = #Not_Err ;//Ein Not-Aus-Taster noch betätigt + + U #A01_UH07.Not_Aus.UH07;//Störung noch aktiv + O #A01_UH07.Not_Aus.UC071; + O #A01_UH07.Not_Aus.UC073; + O #A01_UH07.Not_Aus.UZ0701; + O #A01_UH07.Not_Aus.UZ0702; + O #A01_UH07.Not_Aus.UZ0703; + O #A01_UH07.Not_Aus.UZ7101; + O #A01_UH07.Not_Aus.UZ7102; + O #A01_UH07.Not_Aus.UZ7103; + O #A01_UH07.Not_Aus.UZ7104; + O #A01_UH07.Not_Aus.UZ7105; + O #A01_UH07.Not_Aus.UZ7106; + O #A01_UH07.Not_Aus.UZ7107; + O #A01_UH07.Not_Aus.UZ7301; + O #A01_UH07.Not_Aus.UZ7302; + O #A01_UH07.Not_Aus.UZ7303; + = #Not_Akt ;//Ein Not-Aus-Störung noch nicht quittiert + + U "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UH07_QA0610_QA0611;//Not-Aus-Kreis geschlossen + UN #Not_Err; + UN #Not_Akt; + R #A01_UH07.NotErr; + +//Not-Aus hat ausgelöst: + UN #Not_Akt;//Ein Not-Aus-Störung noch nicht quittiert + UN #Not_Err ;//Ein Not-Aus-Taster noch betätigt + UN "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UH07_QA0610_QA0611;//Not-Aus-Kreis geschlossen + = #A01_UH07.Not_Aus.ausgeloest; + + U #A01_UH07.Not_Aus.ausgeloest; + = "7_HMI_Err_UH07_OB".Not.ausgeloest_UH07_UC71_UC73;//Störung an OP übergeben + S #A01_UH07.StOk_blinken;//Störung quittierbar + + U "SF0002"; + U "7_HMI_Err_UH07_OB".Not.ausgeloest_UH07_UC71_UC73;//Störung an OP übergeben + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07;//Not-Aus quittieren + +//Störung aktiv: + UN "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UH07_QA0610_QA0611;//Not-Aus-Kreis geschlossen + O #Not_Err ;//Ein Not-Aus-Taster noch betätigt + O #Not_Akt;//Ein Not-Aus-Störung noch nicht quittiert + O; + UN "DI0541" ;//von UH05 ILS + UN "DSchnittstelle_zu_Safety".ToSafety.Ohne_Partner; + S #A01_UH07.NotErr; + +//Not-Aus quittieren nicht erlaubt: + U #Not_Err ;//Ein Not-Aus-Taster noch betätigt + O #Not_Akt;//Ein Not-Aus-Störung noch nicht quittiert + R "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07;//Not-Aus quittieren + +//UC071 und UC72 mit Quittieren: + U "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07;//Not-Aus quittieren + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC071;//Not-Aus quittieren + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC073;//Not-Aus quittieren + +//Anzeige: + U #A01_UH07.NotErr; + CLR;//Keine verbaut +/// = "PF1004" + +NETWORK +TITLE = UH07: Bereichs-Störung + UN #A01_UH07.AnlageEin; + O #A01_UH07.NotErr; +///Da einzeln überwacht! O #A01_UH07.MotErr + O #A01_UH07.PnErr; + O #A01_UH07.SiErr; + O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3; + O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4; + = #A01_UH07.BereichErr; + + U #A01_UH07.BereichErr; + U #A01_UH07.AnlageEin; + U "Clock_1Hz"; + = "PF0000"; + +NETWORK +TITLE = UH07: Anfahrwarnung + +//Anfahrwarnung erzeugen: + UN #A01_UH07.BereichErr; + U #A01_UH07.BereichErr_old;//Letzter Zyklus war noch System-Err + S #A01_UH07.Anfahrwarnung; + + U #A01_UH07.BereichErr; + = #A01_UH07.BereichErr_old;//Aktuellen Status sepichern + R #A01_UH07.Anfahrwarnung; + +//Anfahrwarnung: + U "T1"; + R #A01_UH07.Anfahrwarnung; + U(; + O #A01_UH07.Anfahrwarnung; + O #A01_UC071.Anfahrwarnung; + O #A01_UC072.Anfahrwarnung; + O #A01_UC073.Anfahrwarnung; + O #A01_UC074.Anfahrwarnung; + ); + U "Clock_1Hz"; + = "PF0034" ;//Anfahr-Warnung + U #A01_UH07.Anfahrwarnung; + L s5t#5s; + SE "T1"; + + U #A01_UH07.Anfahrwarnung; + S #A01_UH07.BereichErr; + +NETWORK +TITLE = UH07: Haupschütz nicht aktiv + U "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UH07_QA0610_QA0611;//Not-Aus-Kreis geschlossen + L s5t#3s; + SE "T110"; + + U "T110"; + U(; + O "DI0013"; + O "DI0014"; + ); + O; + UN #A01_UH07.BereichErr; + UN "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UH07_QA0610_QA0611;//Not-Aus-Kreis geschlossen + = #A01_UH07.K10Err; + + U #A01_UH07.K10Err; + O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UH07_1; + O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UH07_2; + S #A01_UH07.StOk_blinken ;//Störung quittierbar + + U #A01_UH07.StOk_aktiv ;//Impuls Störungen quittieren //Störungen quittieren + U(; + O #A01_UH07.K10Err; + O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UH07_1; + O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UH07_2; + ); + S "DSchnittstelle_zu_Safety".ToSafety.StOk_HSS; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UH07;//Not-Aus quittieren + + U #A01_UH07.K10Err; + = "7_HMI_Err_UH07_OB".Schutz."Hauptschütz UH07"; + +NETWORK +TITLE = UC071: Bereichs-Störung + UN #A01_UH07.AnlageEin;//UH07 ist Master + O #A01_UH07.NotErr; + O "7_HMI_Err_UH07_OB".VErr.Pn_UC071; +///Da einzeln überwacht! O #A01_UC071.MotErr + O #A01_UC071.SiErr; + O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3; + O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4; + = #A01_UC071.BereichErr; + +//Keine Anzeige verbaut + +NETWORK +TITLE = UC071: Anfahrwarnung + +//Anfahrwarnung erzeugen: + UN #A01_UC071.BereichErr; + U #A01_UC071.BereichErr_old;//Letzter Zyklus war noch System-Err + S #A01_UC071.Anfahrwarnung; + + U #A01_UC071.BereichErr; + = #A01_UC071.BereichErr_old;//Aktuellen Status sepichern + R #A01_UC071.Anfahrwarnung; + +//Anfahrwarnung: + U "T12"; + R #A01_UC071.Anfahrwarnung; + U #A01_UC071.Anfahrwarnung; + U "Clock_1Hz"; +// = "PF0034" //Anfahr-Warnung (nur an UH07/Nw23) + CLR; + U #A01_UC071.Anfahrwarnung; + L s5t#5s; + SE "T12"; + + U #A01_UC071.Anfahrwarnung; + S #A01_UC071.BereichErr; + +NETWORK +TITLE = UC071: Haupschütz nicht aktiv + U "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC071_QA0920_QA0921;//Not-Aus-Kreis geschlossen + L s5t#3s; + SE "T211"; + + U "T211"; + U "DI0106"; + O; + UN #A01_UC071.BereichErr; + UN "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC071_QA0920_QA0921;//Not-Aus-Kreis geschlossen + = #A01_UC071.K10Err; + + U #A01_UC071.K10Err; + O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC071_1; + O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC071_2; + S #A01_UC071.StOk_blinken;//Störung quittierbar + + U #A01_UC071.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U(; + O #A01_UC071.K10Err; + O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC071_1; + O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC071_2; + ); + S "DSchnittstelle_zu_Safety".ToSafety.StOk_HSS; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC071;//Not-Aus quittieren + + U #A01_UC071.K10Err; + = "7_HMI_Err_UH07_OB".Schutz."Hauptschütz UC071"; + +NETWORK +TITLE = UC072: Not-Aus-Störung erzeugen / quittierbar / quittieren + +//Quittierung wurd abgearbeitet: + U "DSchnittstelle_zu_Safety".FromSafety.ACK_A01_UC072_fertig; + R "DSchnittstelle_zu_Safety".FromSafety.ACK_A01_UC072_fertig; + R "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC072; + +//Not-Aus nach Haupschalter ein quittieren: + U #A01_UC072.StOk_aktiv;//Impuls Störungen quittieren + U #A01_UC072.Not_Aus.ausgeloest; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC072;//Not-Aus quittieren + +//Not-Aus an UC072: + U "SF1020"; + U #A01_UC072.Not_Aus.UC072; + S #A01_UC072.StOk_blinken;//Störung quittierbar + + U #A01_UC072.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF1020"; + U #A01_UC072.Not_Aus.UC072; + R #A01_UC072.Not_Aus.UC072; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC072;//Not-Aus quittieren + + UN "SF1020"; + S #A01_UC072.Not_Aus.UC072;//Störung vorhanden + + U #A01_UC072.Not_Aus.UC072;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UC072;//Störung an OP übergeben + +//Not-Aus an UZ7201: + U "SF1021"; + U #A01_UC072.Not_Aus.UZ7201; + S #A01_UZ7201.StOk_blinken;//Störung quittierbar + + U #A01_UZ7201.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF1021"; + U #A01_UC072.Not_Aus.UZ7201; + R #A01_UC072.Not_Aus.UZ7201; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC072;//Not-Aus quittieren + + UN "SF1021"; + S #A01_UC072.Not_Aus.UZ7201;//Störung vorhanden + + U #A01_UC072.Not_Aus.UZ7201;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UZ7201;//Störung an OP übergeben + +//Not-Aus an UZ7202: + U "SF1022"; + U #A01_UC072.Not_Aus.UZ7202; + S #A01_UZ7202.StOk_blinken;//Störung quittierbar + + U #A01_UZ7202.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF1022"; + U #A01_UC072.Not_Aus.UZ7202; + R #A01_UC072.Not_Aus.UZ7202; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC072;//Not-Aus quittieren + + UN "SF1022"; + S #A01_UC072.Not_Aus.UZ7202;//Störung vorhanden + + U #A01_UC072.Not_Aus.UZ7202;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UZ7202;//Störung an OP übergeben + +//Not-Aus ILS (UH03): + UN "DI1091" ;//von UH03 ILS + UN "DSchnittstelle_zu_Safety".ToSafety.Ohne_Partner; + = "7_HMI_Err_UH07_OB".Not.von_UH03; + +//Not-Aus UH07 (UC072): + UN "DI1092" ;//von UC061 Outbound + UN "DSchnittstelle_zu_Safety".ToSafety.Ohne_Partner; + = "7_HMI_Err_UH07_OB".Not.von_UC061; + +NETWORK +TITLE = UC072: Not-Aus-Störungen / Anzeigen + UN "SF1020" ;//Taster noch betätigt + ON "SF1021"; + ON "SF1022"; + = #Not_Err ;//Ein Not-Aus-Taster noch betätigt + + U #A01_UC072.Not_Aus.UC072;//Störung noch aktiv + O #A01_UC072.Not_Aus.UZ7201; + O #A01_UC072.Not_Aus.UZ7202; + = #Not_Akt ;//Ein Not-Aus-Störung noch nicht quittiert + + U "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC072_QA1230_QA1231;//Not-Aus-Kreis geschlossen + UN #Not_Err; + UN #Not_Akt; + R #A01_UC072.NotErr; + +//Not-Aus hat ausgelöst: + UN #Not_Akt;//Ein Not-Aus-Störung noch nicht quittiert + UN #Not_Err ;//Ein Not-Aus-Taster noch betätigt + UN "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC072_QA1230_QA1231;//Not-Aus-Kreis geschlossen + = #A01_UC072.Not_Aus.ausgeloest; + + U #A01_UC072.Not_Aus.ausgeloest; + = "7_HMI_Err_UH07_OB".Not.ausgeloest_UC072;//Störung an OP übergeben + S #A01_UC072.StOk_blinken;//Störung quittierbar + + U "SF0177"; + U "7_HMI_Err_UH07_OB".Not.ausgeloest_UC072;//Störung an OP übergeben + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC072;//Not-Aus quittieren + +//Störung aktiv: + UN "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC072_QA1230_QA1231;//Not-Aus-Kreis geschlossen + O #Not_Err ;//Ein Not-Aus-Taster noch betätigt + O #Not_Akt;//Ein Not-Aus-Störung noch nicht quittiert + O; + UN "DI1091" ;//von UH03 ILS + UN "DSchnittstelle_zu_Safety".ToSafety.Ohne_Partner; + O; + UN "DI1092" ;//von UC61 AMR + UN "DSchnittstelle_zu_Safety".ToSafety.Ohne_Partner; + S #A01_UC072.NotErr; + +//Not-Aus quittieren nicht erlaubt: + U #Not_Err ;//Ein Not-Aus-Taster noch betätigt + O #Not_Akt;//Ein Not-Aus-Störung noch nicht quittiert + R "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC072;//Not-Aus quittieren + +//Anzeige: + U #A01_UC072.NotErr; + CLR;//Keine verbaut +/// = "PF1004" + +NETWORK +TITLE = UC072: Bereichs-Störung + UN #A01_UH07.AnlageEin;//UH07 ist Master + O #A01_UC072.NotErr; + O "7_HMI_Err_UH07_OB".VErr.Pn_UC072; + ///Da einzeln überwacht! O #A01_UC072.MotErr + O #A01_UC072.SiErr; + O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3; + O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4; + = #A01_UC072.BereichErr; + +//Keine Anzeige verbaut + +NETWORK +TITLE = UC072: Anfahrwarnung + +//Anfahrwarnung erzeugen: + UN #A01_UC072.BereichErr; + U #A01_UC072.BereichErr_old;//Letzter Zyklus war noch System-Err + S #A01_UC072.Anfahrwarnung; + + U #A01_UC072.BereichErr; + = #A01_UC072.BereichErr_old;//Aktuellen Status sepichern + R #A01_UC072.Anfahrwarnung; + +//Anfahrwarnung: + U "T13"; + R #A01_UC072.Anfahrwarnung; + U #A01_UC072.Anfahrwarnung; + U "Clock_1Hz"; +// = "PF0034" //Anfahr-Warnung (nur an UH07/Nw23) + CLR; + U #A01_UC072.Anfahrwarnung; + L s5t#5s; + SE "T13"; + + U #A01_UC072.Anfahrwarnung; + S #A01_UC072.BereichErr; + +NETWORK +TITLE = UC072: Haupschütz nicht aktiv + U "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC072_QA1230_QA1231;//Not-Aus-Kreis geschlossen + L s5t#3s; + SE "T212"; + + U "T212"; + U "DI0166"; + O; + UN #A01_UC072.BereichErr; + UN "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC072_QA1230_QA1231;//Not-Aus-Kreis geschlossen + = #A01_UC072.K10Err; + + U #A01_UC072.K10Err; + O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC072_1; + O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC072_2; + S #A01_UC072.StOk_blinken;//Störung quittierbar + + U #A01_UC072.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U(; + O #A01_UC072.K10Err; + O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC072_1; + O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC072_2; + ); + S "DSchnittstelle_zu_Safety".ToSafety.StOk_HSS; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC072;//Not-Aus quittieren + + U #A01_UC072.K10Err; + = "7_HMI_Err_UH07_OB".Schutz."Hauptschütz UC072"; + +NETWORK +TITLE = UC073: Bereichs-Störung + UN #A01_UH07.AnlageEin;//UH07 ist Master + O #A01_UH07.NotErr; + O "7_HMI_Err_UH07_OB".VErr.Pn_UC073; + ///Da einzeln überwacht! O #A01_UC073.MotErr + O #A01_UC073.SiErr; + O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3; + O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4; + = #A01_UC073.BereichErr; + +//Keine Anzeige verbaut + +NETWORK +TITLE = UC073: Anfahrwarnung + +//Anfahrwarnung erzeugen: + UN #A01_UC073.BereichErr; + U #A01_UC073.BereichErr_old;//Letzter Zyklus war noch System-Err + S #A01_UC073.Anfahrwarnung; + + U #A01_UC073.BereichErr; + = #A01_UC073.BereichErr_old;//Aktuellen Status sepichern + R #A01_UC073.Anfahrwarnung; + +//Anfahrwarnung: + U "T14"; + R #A01_UC073.Anfahrwarnung; + U #A01_UC073.Anfahrwarnung; + U "Clock_1Hz"; +// = "PF0034" //Anfahr-Warnung (nur an UH07/Nw23) + CLR; + U #A01_UC073.Anfahrwarnung; + L s5t#5s; + SE "T14"; + + U #A01_UC073.Anfahrwarnung; + S #A01_UC073.BereichErr; + +NETWORK +TITLE = UC073: Haupschütz nicht aktiv + U "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC073_QA1540_QA1541;//Not-Aus-Kreis geschlossen + L s5t#3s; + SE "T213"; + + U "T213"; + U "DI0226"; + O; + UN #A01_UC073.BereichErr; + UN "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC073_QA1540_QA1541;//Not-Aus-Kreis geschlossen + = #A01_UC073.K10Err; + + U #A01_UC073.K10Err; + O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC073_1; + O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC073_2; + S #A01_UC073.StOk_blinken;//Störung quittierbar + + U #A01_UC073.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U(; + O #A01_UC073.K10Err; + O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC073_1; + O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC073_2; + ); + S "DSchnittstelle_zu_Safety".ToSafety.StOk_HSS; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC073;//Not-Aus quittieren + + U #A01_UC073.K10Err; + = "7_HMI_Err_UH07_OB".Schutz."Hauptschütz UC073"; + +NETWORK +TITLE = UC074: Not-Aus-Störung erzeugen / quittierbar / quittieren + +//Quittierung wurd abgearbeitet: + U "DSchnittstelle_zu_Safety".FromSafety.ACK_A01_UC074_fertig; + R "DSchnittstelle_zu_Safety".FromSafety.ACK_A01_UC074_fertig; + R "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC074; + +//Not-Aus nach Haupschalter ein quittieren: + U #A01_UC074.StOk_aktiv;//Impuls Störungen quittieren + U #A01_UC074.Not_Aus.ausgeloest; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC074;//Not-Aus quittieren + +//Not-Aus an UC074: + U "SF1640"; + U #A01_UC074.Not_Aus.UC074; + S #A01_UC074.StOk_blinken;//Störung quittierbar + + U #A01_UC074.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF1640"; + U #A01_UC074.Not_Aus.UC074; + R #A01_UC074.Not_Aus.UC074; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC074;//Not-Aus quittieren + + UN "SF1640"; + S #A01_UC074.Not_Aus.UC074;//Störung vorhanden + + U #A01_UC074.Not_Aus.UC074;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UC074;//Störung an OP übergeben + +//Not-Aus an UZ7401: + U "SF1641"; + U #A01_UC074.Not_Aus.UZ7401; + S #A01_UZ7401.StOk_blinken;//Störung quittierbar + + U #A01_UZ7401.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF1641"; + U #A01_UC074.Not_Aus.UZ7401; + R #A01_UC074.Not_Aus.UZ7401; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC074;//Not-Aus quittieren + + UN "SF1641"; + S #A01_UC074.Not_Aus.UZ7401;//Störung vorhanden + + U #A01_UC074.Not_Aus.UZ7401;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UZ7401;//Störung an OP übergeben + +//Not-Aus an UZ7402: + U "SF1642"; + U #A01_UC074.Not_Aus.UZ7402; + S #A01_UZ7402.StOk_blinken;//Störung quittierbar + + U #A01_UZ7402.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF1642"; + U #A01_UC074.Not_Aus.UZ7402; + R #A01_UC074.Not_Aus.UZ7402; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC074;//Not-Aus quittieren + + UN "SF1642"; + S #A01_UC074.Not_Aus.UZ7402;//Störung vorhanden + + U #A01_UC074.Not_Aus.UZ7402;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UZ7402;//Störung an OP übergeben + +//Not-Aus an UZ7403: + U "SF1643"; + U #A01_UC074.Not_Aus.UZ7403; + S #A01_UZ7403.StOk_blinken;//Störung quittierbar + + U #A01_UZ7403.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U "SF1643"; + U #A01_UC074.Not_Aus.UZ7403; + R #A01_UC074.Not_Aus.UZ7403; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC074;//Not-Aus quittieren + + UN "SF1643"; + S #A01_UC074.Not_Aus.UZ7403;//Störung vorhanden + + U #A01_UC074.Not_Aus.UZ7403;//Störung vorhanden + = "7_HMI_Err_UH07_OB".Not.UZ7403;//Störung an OP übergeben + +NETWORK +TITLE = UC074: Not-Aus-Störungen / Anzeigen + UN "SF1640" ;//Taster noch betätigt + ON "SF1641"; + ON "SF1642"; + ON "SF1643"; + = #Not_Err ;//Ein Not-Aus-Taster noch betätigt + + U #A01_UC074.Not_Aus.UC074;//Störung noch aktiv + O #A01_UC074.Not_Aus.UZ7401; + O #A01_UC074.Not_Aus.UZ7402; + O #A01_UC074.Not_Aus.UZ7403; + = #Not_Akt ;//Ein Not-Aus-Störung noch nicht quittiert + + U "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC074_QA1850_QA1851;//Not-Aus-Kreis geschlossen + U "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC074_QA1900_QA1901; + UN #Not_Err; + UN #Not_Akt; + R #A01_UC074.NotErr; + +//Not-Aus hat ausgelöst: + UN #Not_Akt;//Ein Not-Aus-Störung noch nicht quittiert + UN #Not_Err ;//Ein Not-Aus-Taster noch betätigt + U(; + ON "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC074_QA1850_QA1851;//Not-Aus-Kreis geschlossen + ON "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC074_QA1900_QA1901; + ); + = #A01_UC074.Not_Aus.ausgeloest; + + U #A01_UC074.Not_Aus.ausgeloest; + = "7_HMI_Err_UH07_OB".Not.ausgeloest_UC074;//Störung an OP übergeben + S #A01_UC074.StOk_blinken;//Störung quittierbar + + U "SF0297"; + U "7_HMI_Err_UH07_OB".Not.ausgeloest_UC074;//Störung an OP übergeben + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC074;//Not-Aus quittieren + +//Störung aktiv: + UN "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC074_QA1850_QA1851;//Not-Aus-Kreis geschlossen + ON "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC074_QA1900_QA1901; + O #Not_Err ;//Ein Not-Aus-Taster noch betätigt + O #Not_Akt;//Ein Not-Aus-Störung noch nicht quittiert + S #A01_UC074.NotErr; + +//Not-Aus quittieren nicht erlaubt: + U #Not_Err ;//Ein Not-Aus-Taster noch betätigt + O #Not_Akt;//Ein Not-Aus-Störung noch nicht quittiert + R "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC074;//Not-Aus quittieren + +//Anzeige: + U #A01_UC074.NotErr; + CLR;//Keine verbaut +/// = "PF1004" + +NETWORK +TITLE = UC074: Bereichs-Störung + UN #A01_UH07.AnlageEin;//UH07 ist Master + O #A01_UC074.NotErr; + O "7_HMI_Err_UH07_OB".VErr.Pn_UC074; + O #A01_UH07.PnErr; + ///Da einzeln überwacht! O #A01_UC074.MotErr + O #A01_UC074.SiErr; + O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3; + O "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle4; + = #A01_UC074.BereichErr; + +//Keine Anzeige verbaut + +NETWORK +TITLE = UC074: Anfahrwarnung + +//Anfahrwarnung erzeugen: + UN #A01_UC074.BereichErr; + U #A01_UC074.BereichErr_old;//Letzter Zyklus war noch System-Err + S #A01_UC074.Anfahrwarnung; + + U #A01_UC074.BereichErr; + = #A01_UC074.BereichErr_old;//Aktuellen Status sepichern + R #A01_UC074.Anfahrwarnung; + +//Anfahrwarnung: + U "T15"; + R #A01_UC074.Anfahrwarnung; + U #A01_UC074.Anfahrwarnung; + U "Clock_1Hz"; +// = "PF0034" //Anfahr-Warnung (nur an UH07/Nw23) + CLR; + U #A01_UC074.Anfahrwarnung; + L s5t#5s; + SE "T15"; + + U #A01_UC074.Anfahrwarnung; + S #A01_UC074.BereichErr; + +NETWORK +TITLE = UC074: Haupschütz nicht aktiv + U "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC074_QA1850_QA1851;//Not-Aus-Kreis geschlossen + U "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC074_QA1900_QA1901;//Not-Aus-Kreis geschlossen + L s5t#3s; + SE "T214"; + + U "T214"; + U "DI0286"; + O; + UN #A01_UC074.BereichErr; + U(; + ON "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC074_QA1850_QA1851;//Not-Aus-Kreis geschlossen + ON "DSchnittstelle_zu_Safety".FromSafety.Feedback.FDBACK_UC074_QA1900_QA1901;//Not-Aus-Kreis geschlossen + ); + = #A01_UC074.K10Err; + + U #A01_UC074.K10Err; + O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC074_1; + O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC074_2; + S #A01_UC074.StOk_blinken;//Störung quittierbar + + U #A01_UC074.StOk_aktiv;//Impuls Störungen quittieren //Störungen quittieren + U(; + O #A01_UC074.K10Err; + O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC074_1; + O "DSchnittstelle_zu_Safety".FromSafety.ACK_REQ_A01_UC074_2; + ); + S "DSchnittstelle_zu_Safety".ToSafety.StOk_HSS; + S "DSchnittstelle_zu_Safety".ToSafety.ACK_A01_UC074;//Not-Aus quittieren + + U #A01_UC074.K10Err; + = "7_HMI_Err_UH07_OB".Schutz."Hauptschütz UC074"; + +NETWORK +TITLE = Bereichshalte + UN "SF0122"; + = #A01_UZ7102.Area_Stop; + = "7_HMI_Err_UH07_OB".Halt.UZ7102; + + UN "SF0126"; + = #A01_UZ7104.Area_Stop; + = "7_HMI_Err_UH07_OB".Halt.UZ7104; + + UN "SF0180"; + = #A01_UZ7201.Area_Stop; + = "7_HMI_Err_UH07_OB".Halt.UZ7201; + + UN "SF0182"; + = #A01_UZ7202.Area_Stop; + = "7_HMI_Err_UH07_OB".Halt.UZ7202; + +NETWORK +TITLE = Anzeigen zum Quittieren + +//Start nach Störung blinken lassen: + U #A01_UH07.StOk_blinken; + U "Clock_1Hz"; + ON "SF0400"; + = "PF0002"; + + U #A01_UC071.StOk_blinken; + U "Clock_1Hz"; + ON "SF0710"; + = "PF0117"; + + U #A01_UC072.StOk_blinken; + U "Clock_1Hz"; + ON "SF1020"; + = "PF0177"; + + U #A01_UC073.StOk_blinken; + U "Clock_1Hz"; + ON "SF1330"; + = "PF0237"; + + U #A01_UC074.StOk_blinken; + U "Clock_1Hz"; + ON "SF1640"; + = "PF0297"; + + U #A01_UZ0701.StOk_blinken; + U "Clock_1Hz"; + ON "SF0401"; + = "PF0041"; + + U #A01_UZ0702.StOk_blinken; + U "Clock_1Hz"; + ON "SF0402"; + = "PF0043"; + + U #A01_UZ0703.StOk_blinken; + U "Clock_1Hz"; + ON "SF0403"; + = "PF0045"; + + U #A01_UZ7101.StOk_blinken; + U "Clock_1Hz"; + ON "SF0711"; + = "PF0121"; + + U #A01_UZ7102.StOk_blinken; + U "Clock_1Hz"; + ON "SF0712"; + = "PF0123"; + + U #A01_UZ7103.StOk_blinken; + U "Clock_1Hz"; + ON "SF0713"; + = "PF0125"; + + U #A01_UZ7104.StOk_blinken; + U "Clock_1Hz"; + ON "SF0780"; + = "PF0127"; + + U #A01_UZ7105.StOk_blinken; + U "Clock_1Hz"; + ON "SF0782"; + = "PF0131"; + + U #A01_UZ7106.StOk_blinken; + U "Clock_1Hz"; + ON "SF0783"; + = "PF0133"; + + U #A01_UZ7107.StOk_blinken; + U "Clock_1Hz"; + ON "SF0850"; + = "PF0135"; + + U #A01_UZ7201.StOk_blinken; + U "Clock_1Hz"; + ON "SF1021"; + = "PF0181"; + + U #A01_UZ7202.StOk_blinken; + U "Clock_1Hz"; + ON "SF1022"; + = "PF0183"; + + U #A01_UZ7301.StOk_blinken; + U "Clock_1Hz"; + ON "SF1331"; + = "PF0241"; + + U #A01_UZ7302.StOk_blinken; + U "Clock_1Hz"; + ON "SF1332"; + = "PF0243"; + + U #A01_UZ7303.StOk_blinken; + U "Clock_1Hz"; + ON "SF1333"; + = "PF0245"; + + U #A01_UZ7401.StOk_blinken; + U "Clock_1Hz"; + ON "SF1641"; + = "PF0301"; + + U #A01_UZ7402.StOk_blinken; + U "Clock_1Hz"; + ON "SF1642"; + = "PF0303"; + + U #A01_UZ7403.StOk_blinken; + U "Clock_1Hz"; + ON "SF1643"; + = "PF0305"; + + SET; + R #A01_UH07.StOk_blinken; + R #A01_UC071.StOk_blinken; + R #A01_UC072.StOk_blinken; + R #A01_UC073.StOk_blinken; + R #A01_UC074.StOk_blinken; + R #A01_UZ0701.StOk_blinken; + R #A01_UZ0702.StOk_blinken; + R #A01_UZ0703.StOk_blinken; + R #A01_UZ7101.StOk_blinken; + R #A01_UZ7102.StOk_blinken; + R #A01_UZ7103.StOk_blinken; + R #A01_UZ7104.StOk_blinken; + R #A01_UZ7105.StOk_blinken; + R #A01_UZ7106.StOk_blinken; + R #A01_UZ7107.StOk_blinken; + R #A01_UZ7201.StOk_blinken; + R #A01_UZ7202.StOk_blinken; + R #A01_UZ7301.StOk_blinken; + R #A01_UZ7302.StOk_blinken; + R #A01_UZ7303.StOk_blinken; + R #A01_UZ7401.StOk_blinken; + R #A01_UZ7402.StOk_blinken; + R #A01_UZ7403.StOk_blinken; + +NETWORK +TITLE = Betriebsbereit-Anzeigen + U #A01_UH07.AnlageEin; + = "PF0040"; + = "PF0042"; + = "PF0120"; + = "PF0122"; + = "PF0124"; + = "PF0126"; + = "PF0130"; + = "PF0132"; + = "PF0134"; + = "PF0180"; + = "PF0182"; + = "PF0240"; + = "PF0242"; + = "PF0244"; + = "PF0300"; + = "PF0302"; + = "PF0304"; + +NETWORK +TITLE = Störungen vorhanden? / Anzeige: + CALL "Err_vorhanden" //Störungsanzeige + ( Check_DB := 708 , + Anfangs_DW := DINT#0 , + Ende_DW := DINT#746 , + Stoerung := #Stoerung , + ErrDW := #ErrDD , + ErrBits := #ErrBits + ); + + U(; + O #Stoerung; + O "PF0000" ;//Da schon oben gesetzt + ); + U "Clock_1Hz"; + = "PF0000"; + + L #ErrDD; + T "MD9100"; + L #ErrBits; + T "MW9200"; + + L "MD9100"; + L DINT#0;//Störung vorhanden + >D;//Ja! + = #Störung_vorhanden; + +NETWORK +TITLE = Signal-Tower UH07 + +//Anfahrwarnung siehe Nw23 + + U "DOutbound_Bereich".A01_UH07.AnlageEin; + = "PF0032";//System ready + + U #Störung_vorhanden; + = "PF0031";//Fault + + U #A01_UH07.NotErr; + O #A01_UC072.NotErr; + O #A01_UC074.NotErr; + = "PF0030" ;//Not-Aus + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Logistik/PufferZeiger_ermitteln.awl b/=A01+UH07-KF00/Programmbausteine/Logistik/PufferZeiger_ermitteln.awl index 2c43a3e..228666f 100644 --- a/=A01+UH07-KF00/Programmbausteine/Logistik/PufferZeiger_ermitteln.awl +++ b/=A01+UH07-KF00/Programmbausteine/Logistik/PufferZeiger_ermitteln.awl @@ -1,44 +1,60 @@ -=== FC 9: PufferZeiger_ermitteln [STL] === -INTERFACE: - Input: - Puffer_X : Int // Puffer zum Auslagern - Output: - Puffer_DB : Int - Puffer_DW : Int - Error : Bool - InOut: - Temp: - Position : Int - Constant: - Return: - Ret_Val : Void +FUNCTION "PufferZeiger_ermitteln" : Void +TITLE = PufferZeiger ermitteln +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 + VAR_INPUT + Puffer_X : Int; // Puffer zum Auslagern + END_VAR ---- NW 1: Zeiger für Puffer_X ermitteln --- - L Puffer_X - T "MW200" - L 0 // sinnvolle Angabe? - ==I // Nein! - = Error - BEC + VAR_OUTPUT + Puffer_DB : Int; + Puffer_DW : Int; + Error : Bool; + END_VAR -// Einsprung Puffer ermitteln: -CALL FC "DatenOut" (SSDB:=275, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:=Position) // Eintrag lesen - - L "MB199" - L 2#1111111 // Bit 7 ausblenden - AW - L 0 // Fehler vorhanden? - <>I // Ja - = "7_HMI_Err_UH07_OB".Logistik.DB275_Err - = Error - BEC - - L "MW224" - T Puffer_DB - L "MW226" - T Puffer_DW + VAR_TEMP + Position : Int; + END_VAR ---- NW 2: Ende --- - BE +BEGIN +NETWORK +TITLE = Zeiger für Puffer_X ermitteln + L #Puffer_X; + T "MW200"; + L 0;//sinnvolle Angabe? + ==I;//Nein! + = #Error; + BEB; + +//Einsprung Puffer ermitteln: + CALL "DatenOut" + ( SSDB := 275 , + SSDW := 0 , + PARA := 16#0000 , //Eintrag lesen + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := #Position + ); + + L "MB199"; + L 2#1111111 ;//Bit 7 ausblenden + UW; + L 0;//Fehler vorhanden? + <>I;//Ja + = "7_HMI_Err_UH07_OB".Logistik.DB275_Err; + = #Error; + BEB; + + L "MW224"; + T #Puffer_DB; + L "MW226"; + T #Puffer_DW; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Logistik/Reservierung_in_Puffer_eintragen.awl b/=A01+UH07-KF00/Programmbausteine/Logistik/Reservierung_in_Puffer_eintragen.awl index eec7cc8..ba1d50e 100644 --- a/=A01+UH07-KF00/Programmbausteine/Logistik/Reservierung_in_Puffer_eintragen.awl +++ b/=A01+UH07-KF00/Programmbausteine/Logistik/Reservierung_in_Puffer_eintragen.awl @@ -1,130 +1,153 @@ -=== FC 5: Reservierung_in_Puffer_eintragen [STL] === -INTERFACE: - Input: - TrolleyID : DInt - Ziel : Int - ShopGroup : DInt - Gesamt_Trolley_DL : Int - Output: - InOut: - Temp: - Lager_DB : Int - Lager_DW : Int - SSDW : Int - Position : Int - LeerPuffer : Bool - VollPuffer : Bool - Constant: - Return: - Ret_Val : Void +FUNCTION "Reservierung_in_Puffer_eintragen" : Void +TITLE = Reservierung an Puffer senden / Trolley-Daten in Gesamt-Trolley-Liste sichern / +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 + VAR_INPUT + TrolleyID : DInt; + Ziel : Int; + ShopGroup : DInt; + Gesamt_Trolley_DL : Int; + END_VAR ---- NW 1: TrolleyID + Ziel bekannt -> Reservierung im Puffer --- - L TrolleyID - L 0 - ==I - BEC - - L Ziel - L 0 - ==I - BEC - -// Ziel checken: - L 1 - >=I - A( - CAC - L 10 - <=I - ) - = LeerPuffer - - CAC - L 101 - >=I - A( - CAC - L 151 - <=I - ) - = VollPuffer - -// Puffer checken: - L Ziel - T "MW220" - -CALL FC "DatenOut" (SSDB:=275, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=P#M220.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:=Position) // Eintrag lesen - - L "MB199" - L 2#1111111 // Bit 7 ausblenden - AW - L 0 // Fehler vorhanden? - <>I // Ja - BEC - - L "MW224" - T Lager_DB - L "MW226" - T Lager_DW - -// Eintrag in Trolley-Reservierungsliste - L TrolleyID - T "MD220" - L ShopGroup - T "MD224" - - L Lager_DW - L 200 - +I - T SSDW - -CALL FC "DatenIn" (SSDB:=Lager_DB, SSDW:=SSDW, INDATEN:=P#M220.0, RE_VAL:="MB198") + VAR_TEMP + Lager_DB : Int; + Lager_DW : Int; + SSDW : Int; + Position : Int; + LeerPuffer : Bool; + VollPuffer : Bool; + END_VAR ---- NW 2: BC in Trolley-DL eintragen --- - L Gesamt_Trolley_DL - L 0 // Liste angegeben? - ==I // Nein! - BEC +BEGIN +NETWORK +TITLE = TrolleyID + Ziel bekannt -> Reservierung im Puffer + L #TrolleyID; + L 0; + ==I; + BEB; - L TrolleyID - T "TrolleyDL_INDaten".INDaten.TrolleyID - L Ziel - T "TrolleyDL_INDaten".INDaten.EndZiel - L ShopGroup - T "TrolleyDL_INDaten".INDaten.ShopGroup + L #Ziel; + L 0; + ==I; + BEB; -// Standort: - L 16#A000 - A LeerPuffer - JC Standort +//Ziel checken: + L 1; + >=I; + U(; + TAK; + L 10; + <=I; + ); + = #LeerPuffer; - L 16#B000 - A VollPuffer - JC Standort + TAK; + L 101; + >=I; + U(; + TAK; + L 151; + <=I; + ); + = #VollPuffer; - L 16#0 +//Puffer checken: + L #Ziel; + T "MW220"; -Standort: T "TrolleyDL_INDaten".INDaten.Standort + CALL "DatenOut" + ( SSDB := 275 , + SSDW := 0 , + PARA := 16#0000 , //Eintrag lesen + SEARCHDATEN := P#M220.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := #Position + ); -// Startzeit: - L "SGes".DATE_TIME.Jahr - T "TrolleyDL_INDaten".INDaten.LastTime.Jahr - L "SGes".DATE_TIME.Monat - T "TrolleyDL_INDaten".INDaten.LastTime.Monat - L "SGes".DATE_TIME.Tag - T "TrolleyDL_INDaten".INDaten.LastTime.Tag - L "SGes".DATE_TIME.Stunde - T "TrolleyDL_INDaten".INDaten.LastTime.Stunde - L "SGes".DATE_TIME.Minute - T "TrolleyDL_INDaten".INDaten.LastTime.Minute - L "SGes".DATE_TIME.Sekunde - T "TrolleyDL_INDaten".INDaten.LastTime.Sekunde + L "MB199"; + L 2#1111111 ;//Bit 7 ausblenden + UW; + L 0;//Fehler vorhanden? + <>I;//Ja + BEB; -// Daten in Datenbank schreiben: -CALL FC "DatenIn" (SSDB:=Gesamt_Trolley_DL, SSDW:=0, INDATEN:=DB1010.DBX0.0, RE_VAL:="MB198") + L "MW224"; + T #Lager_DB; + L "MW226"; + T #Lager_DW; +//Eintrag in Trolley-Reservierungsliste + L #TrolleyID; + T "MD220"; + L #ShopGroup; + T "MD224"; ---- NW 3: Ende --- - BE + L #Lager_DW; + L 200; + +I; + T #SSDW; + + CALL "DatenIn" + ( SSDB := #Lager_DB , + SSDW := #SSDW , + INDATEN := P#M220.0 , + RE_VAL := "MB198" + ); + +NETWORK +TITLE = BC in Trolley-DL eintragen + L #Gesamt_Trolley_DL; + L 0;//Liste angegeben? + ==I;//Nein! + BEB; + + L #TrolleyID; + T "TrolleyDL_INDaten".INDaten.TrolleyID; + L #Ziel; + T "TrolleyDL_INDaten".INDaten.EndZiel; + L #ShopGroup; + T "TrolleyDL_INDaten".INDaten.ShopGroup; + + //Standort: + L 16#A000; + U #LeerPuffer; + SPB Standort; + + L 16#B000; + U #VollPuffer; + SPB Standort; + + L 16#0; + +Standort: T "TrolleyDL_INDaten".INDaten.Standort; + +//Startzeit: + L "SGes".DATE_TIME.Jahr; + T "TrolleyDL_INDaten".INDaten.LastTime.Jahr; + L "SGes".DATE_TIME.Monat; + T "TrolleyDL_INDaten".INDaten.LastTime.Monat; + L "SGes".DATE_TIME.Tag; + T "TrolleyDL_INDaten".INDaten.LastTime.Tag; + L "SGes".DATE_TIME.Stunde; + T "TrolleyDL_INDaten".INDaten.LastTime.Stunde; + L "SGes".DATE_TIME.Minute; + T "TrolleyDL_INDaten".INDaten.LastTime.Minute; + L "SGes".DATE_TIME.Sekunde; + T "TrolleyDL_INDaten".INDaten.LastTime.Sekunde; + +//Daten in Datenbank schreiben: + CALL "DatenIn" + ( SSDB := #Gesamt_Trolley_DL , + SSDW := 0 , + INDATEN := %DB1010.DBX0.0 , + RE_VAL := "MB198" + ); + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Logistik/SchleusenZeiger_ermitteln.awl b/=A01+UH07-KF00/Programmbausteine/Logistik/SchleusenZeiger_ermitteln.awl index 4d14fa8..46d2288 100644 --- a/=A01+UH07-KF00/Programmbausteine/Logistik/SchleusenZeiger_ermitteln.awl +++ b/=A01+UH07-KF00/Programmbausteine/Logistik/SchleusenZeiger_ermitteln.awl @@ -1,39 +1,55 @@ -=== FC 20: SchleusenZeiger_ermitteln [STL] === -INTERFACE: - Input: - Schleuse_X : Int // Schleuse zum Beeinflussen - Output: - Schleusen_DB : Int - Schleusen_DW : Int - Error : Bool - InOut: - Temp: - Position : Int - Constant: - Return: - Ret_Val : Void +FUNCTION "SchleusenZeiger_ermitteln" : Void +TITLE = AMRZeiger ermitteln +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 + VAR_INPUT + Schleuse_X : Int; // Schleuse zum Beeinflussen + END_VAR ---- NW 1: Zeiger für Schleuse_X ermitteln --- - L Schleuse_X - T "MW200" + VAR_OUTPUT + Schleusen_DB : Int; + Schleusen_DW : Int; + Error : Bool; + END_VAR -// Einsprung Schleuse ermitteln: -CALL FC "DatenOut" (SSDB:=274, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:=Position) // Eintrag lesen - - L "MB199" - L 2#1111111 // Bit 7 ausblenden - AW - L 0 // Fehler vorhanden? - <>I // Ja - = Error - BEC - - L "MW224" - T Schleusen_DB - L "MW226" - T Schleusen_DW + VAR_TEMP + Position : Int; + END_VAR ---- NW 2: Ende --- - BE +BEGIN +NETWORK +TITLE = Zeiger für Schleuse_X ermitteln + L #Schleuse_X; + T "MW200"; + +//Einsprung Schleuse ermitteln: + CALL "DatenOut" + ( SSDB := 274 , + SSDW := 0 , + PARA := 16#0000 , //Eintrag lesen + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := #Position + ); + + L "MB199"; + L 2#1111111 ;//Bit 7 ausblenden + UW; + L 0;//Fehler vorhanden? + <>I;//Ja + = #Error; + BEB; + + L "MW224"; + T #Schleusen_DB; + L "MW226"; + T #Schleusen_DW; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Logistik/Simulation_Aus_VP_Trolley_starten.awl b/=A01+UH07-KF00/Programmbausteine/Logistik/Simulation_Aus_VP_Trolley_starten.awl index dd22d5a..27b7fde 100644 --- a/=A01+UH07-KF00/Programmbausteine/Logistik/Simulation_Aus_VP_Trolley_starten.awl +++ b/=A01+UH07-KF00/Programmbausteine/Logistik/Simulation_Aus_VP_Trolley_starten.awl @@ -1,212 +1,227 @@ -=== FC 29: Simulation_Aus_VP_Trolley_starten [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - VollPuffer : Int - VP_DB : Int - VP_DW : Int - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - PARA : Word - Position : Int - Schleife1 : Word // Loopzähler 1 - Constant: - Return: - Ret_Val : Void - ---- NW 1: Ausfahrt schon aktiv ? --- - A "DVollPufferStreckenA".VollPuffer_01.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_02.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_03.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_04.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_05.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_06.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_07.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_08.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_09.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_10.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_11.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_12.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_13.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_14.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_15.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_16.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_17.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_18.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_19.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_20.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_21.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_22.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_23.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_24.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenA".VollPuffer_25.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_26.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_27.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_28.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_29.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_30.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_31.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_32.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_33.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_34.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_35.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_36.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_37.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_38.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_39.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_40.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_41.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_42.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_43.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_44.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_45.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_46.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_47.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_48.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_49.Status2.Alles_ausfahren_OUT - O "DVollPufferStreckenB".VollPuffer_50.Status2.Alles_ausfahren_OUT - = "DVPAuslagern".Simulation_Auslagern.Auslagern_aktiv - BEC - - L 0 - T "DVPAuslagern".Simulation_Auslagern.Vollpuffer_Aktiv +FUNCTION "Simulation_Aus_VP_Trolley_starten" : Void +TITLE = Simulation zum Starten von Trolleys aus AMRs +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 + VAR_TEMP + VollPuffer : Int; + VP_DB : Int; + VP_DW : Int; + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + PARA : Word; + Position : Int; + Schleife1 : Word; // Loopzähler 1 + END_VAR ---- NW 2: Puffer aus Ausfahrliste holen --- - L "DVPAuslagern".Simulation_Auslagern.Vollpuffer_Check - T VollPuffer - L 0 - <>I - JC Check +BEGIN +NETWORK +TITLE = Ausfahrt schon aktiv ? + U "DVollPufferStrecken_A".VollPuffer_01.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_02.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_03.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_04.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_05.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_06.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_07.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_08.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_09.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_10.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_11.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_12.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_13.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_14.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_15.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_16.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_17.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_18.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_19.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_20.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_21.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_22.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_23.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_24.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_A".VollPuffer_25.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_26.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_27.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_28.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_29.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_30.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_31.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_32.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_33.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_34.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_35.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_36.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_37.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_38.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_39.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_40.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_41.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_42.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_43.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_44.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_45.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_46.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_47.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_48.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_49.Status2.Alles_ausfahren_OUT; + O "DVollPufferStrecken_B".VollPuffer_50.Status2.Alles_ausfahren_OUT; + = "DVP_Auslagern".Simulation_Auslagern.Auslagern_aktiv; + BEB; - L 16#F100 // 1.Eintrag lesen !!! (da noch 2.Suche erforderlich!) - T PARA + L 0; + T "DVP_Auslagern".Simulation_Auslagern.Vollpuffer_Aktiv; - L "DLVollPuffer_ShopGroup_abrufen".Datenlistenkopf.AnzahlEintraege - L 0 - ==I - BEC +NETWORK +TITLE = Puffer aus Ausfahrliste holen + L "DVP_Auslagern".Simulation_Auslagern.Vollpuffer_Check; + T #VollPuffer; + L 0; + <>I; + SPB Check; - CAC -L100: T Schleife1 + L 16#F100;//1.Eintrag lesen !!! (da noch 2.Suche erforderlich!) + T #PARA; -// Einträge lesen: -CALL FC "DatenOut" (SSDB:=102, SSDW:=0, PARA:=PARA, SEARCHDATEN:=P#M200.0, RE_VAL:="MB219", OUTDATEN:=P#M220.0, Position:="DVPAuslagern".Simulation_Auslagern.Position) // Reihenfolge abrufen + L "DLVollPuffer_ShopGroup_abrufen".Datenlistenkopf.AnzahlEintraege; + L 0; + ==I; + BEB; - L 16#FF00 // Nächsten Eintrag lesen !!! (Vergleich ausserhalb s.u.) - T PARA + TAK; +L100: T #Schleife1; - JBI OkVP +//Einträge lesen: + CALL "DatenOut" + ( SSDB := 102 , //Reihenfolge abrufen + SSDW := 0 , + PARA := #PARA , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB219" , + OUTDATEN := P#M220.0 , + Position := "DVP_Auslagern".Simulation_Auslagern.Position + ); - BEU + L 16#FF00 ;//Nächsten Eintrag lesen !!! (Vergleich ausserhalb s.u.) + T #PARA; -OkVP: L "MW220" - T VollPuffer - T "DVPAuslagern".Simulation_Auslagern.Last_Check + SPBI OkVP; + BEA; ---- NW 3: VP mit 0815-ShopGroup, 5 Daten und Sensor in Schleuse ? --- -Check: CALL FC "PufferZeiger_ermitteln" (Puffer_X:=VollPuffer, Puffer_DB:=VP_DB, Puffer_DW:=VP_DW, Error:="M199.0") +OkVP: L "MW220"; + T #VollPuffer; + T "DVP_Auslagern".Simulation_Auslagern.Last_Check; - A "M199.0" - BEC +NETWORK +TITLE = VP mit 0815-ShopGroup, 5 Daten und Sensor in Schleuse ? +Check: CALL "PufferZeiger_ermitteln" + ( Puffer_X := #VollPuffer , + Puffer_DB := #VP_DB , + Puffer_DW := #VP_DW , + Error := "M199.0" + ); -// Ziel-Pointer erzeugen: (PLC-Daten) - L VP_DW - ITD - T AR1Start // Startwert mit Offset 0 + U "M199.0"; + BEB; -// Hat Lager Shopgroup 815 ?: - L AR1Start // Startwert mit Offset 0 - + DINT#88 // Offset für ShopGroup_Out - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - OPN DB[VP_DB] // AMR-DB öffnen +//Ziel-Pointer erzeugen: (PLC-Daten) + L #VP_DW; + ITD; + T #AR1Start;//Startwert mit Offset 0 - L DBD [AR1Zeiger] - L DINT#815 - <>D - JC next +//Hat Lager Shopgroup 815 ?: + L #AR1Start;//Startwert mit Offset 0 + + DINT#88 ;//Offset für ShopGroup_Out + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + AUF DB[ #VP_DB] ;//AMR-DB öffnen -// Hat Lager unten 5 Trolleys ?: - L AR1Start // Startwert mit Offset 0 - + DINT#516 // Offset für Anzahl OUT-DL - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - OPN DB[VP_DB] // AMR-DB öffnen + L DBD[ #AR1Zeiger]; + L DINT#815; + <>D; + SPB next; - L DBW [AR1Zeiger] - L 0 - ==I - JC next +//Hat Lager unten 5 Trolleys ?: + L #AR1Start ;//Startwert mit Offset 0 + + DINT#516 ;//Offset für Anzahl OUT-DL + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + AUF DB[ #VP_DB] ;//AMR-DB öffnen -// Sensor BSchleuse_Out: - L AR1Start // Startwert mit Offset 0 - + DINT#2 // Offset für B-Schleuse out - SLD 3 - L 3 // Damit DBX_Bit 3 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - OPN DB[VP_DB] // AMR-DB öffnen - AN DBX [AR1Zeiger] // Trolley in Schleuse - JC next + L DBW[ #AR1Zeiger]; + L 0; + ==I; + SPB next; -// Sensor BVollpuffer-Einfahrt: - L AR1Start // Startwert mit Offset 0 - + DINT#2 // BVollpuffer-Einfahrt - SLD 3 - L 1 // Damit DBX_Bit 1 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - OPN DB[VP_DB] // AMR-DB öffnen - AN DBX [AR1Zeiger] // Stau simuliert - JC next +//Sensor BSchleuse_Out: + L #AR1Start;//Startwert mit Offset 0 + + DINT#2 ;//Offset für B-Schleuse out + SLD 3; + L 3 ;//Damit DBX_Bit 3 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + AUF DB[ #VP_DB] ;//AMR-DB öffnen + UN DBX[ #AR1Zeiger] ;//Trolley in Schleuse + SPB next; - L VollPuffer - T "DVPAuslagern".Simulation_Auslagern.Vollpuffer_Check +//Sensor BVollpuffer-Einfahrt: + L #AR1Start;//Startwert mit Offset 0 + + DINT#2 ;//BVollpuffer-Einfahrt + SLD 3; + L 1 ;//Damit DBX_Bit 1 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + AUF DB[ #VP_DB] ;//AMR-DB öffnen + UN DBX[ #AR1Zeiger] ;//Stau simuliert + SPB next; - AN "100ms-Impuls" - BEC + L #VollPuffer; + T "DVP_Auslagern".Simulation_Auslagern.Vollpuffer_Check; - L "DVPAuslagern".Simulation_Auslagern.Wartezeit - + +1 - T "DVPAuslagern".Simulation_Auslagern.Wartezeit + UN "100ms-Impuls"; + BEB; - L 30 // 3s rum - I // Ja - = Err - BEC + CALL "DatenOut" + ( SSDB := #Gesamt_Trolley_DL , + SSDW := 0 , + PARA := 16#0000 , //Eintrag lesen + SEARCHDATEN := P#M220.0 , + RE_VAL := "MB199" , + OUTDATEN := %DB1011.DBX0.0 , + Position := "MW196" + ); + L "MB199"; + L 2#1111111 ;//Bit 7 ausblenden + UW; + L 0;//Fehler vorhanden? + <>I;//Ja + = #Err; + BEB; ---- NW 3: Relevante Daten übergeben --- - L "TrolleyDL_OutDaten".OUTDaten.EndZiel - T Check_EndZiel +NETWORK +TITLE = Relevante Daten übergeben + L "TrolleyDL_OutDaten".OUTDaten.EndZiel; + T #Check_EndZiel; - L "TrolleyDL_OutDaten".OUTDaten.ZwischenZiel - T Check_ZwischenZiel + L "TrolleyDL_OutDaten".OUTDaten.ZwischenZiel; + T #Check_ZwischenZiel; - L "TrolleyDL_OutDaten".OUTDaten.ShopGroup - T Check_ShopGroup + L "TrolleyDL_OutDaten".OUTDaten.ShopGroup; + T #Check_ShopGroup; - L "TrolleyDL_OutDaten".OUTDaten.Standort - T Check_Standort + L "TrolleyDL_OutDaten".OUTDaten.Standort; + T #Check_Standort; +NETWORK +TITLE = Ende + BE; ---- NW 4: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Logistik/Trolley_DL_Neue_Pos.awl b/=A01+UH07-KF00/Programmbausteine/Logistik/Trolley_DL_Neue_Pos.awl index b585a77..48caf0f 100644 --- a/=A01+UH07-KF00/Programmbausteine/Logistik/Trolley_DL_Neue_Pos.awl +++ b/=A01+UH07-KF00/Programmbausteine/Logistik/Trolley_DL_Neue_Pos.awl @@ -1,86 +1,104 @@ -=== FC 1002: Trolley_DL_Neue_Pos [STL] === -INTERFACE: - Input: - Gesamt_Trolley_DL : Int - TrolleyID : DInt - Position : Word - ShopGroup : DInt - Output: - Err : Bool - InOut: - Temp: - Constant: - Return: - Ret_Val : Void +FUNCTION "Trolley_DL_Neue_Pos" : Void +TITLE = Neue Position an Gesamt-Trolley-DL melden +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 + VAR_INPUT + Gesamt_Trolley_DL : Int; + TrolleyID : DInt; + Position : Word; + ShopGroup : DInt; + END_VAR ---- NW 1: GesamtTrolly-DL angegeben? --- - L Gesamt_Trolley_DL - L 0 // sinnvolle Angabe? - <=I // Nein! - BEC // Abbruch + VAR_OUTPUT + Err : Bool; + END_VAR ---- NW 2: Trolley auslesen --- - L TrolleyID - T "MD220" +BEGIN +NETWORK +TITLE = GesamtTrolly-DL angegeben? + L #Gesamt_Trolley_DL; + L 0;//sinnvolle Angabe? + <=I;//Nein! + BEB;//Abbruch -CALL FC "DatenOut" (SSDB:=Gesamt_Trolley_DL, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=P#M220.0, RE_VAL:="MB199", OUTDATEN:=DB1011.DBX0.0, Position:="MW196") // Eintrag lesen +NETWORK +TITLE = Trolley auslesen + L #TrolleyID; + T "MD220"; - L "MB199" - L 2#1111111 // Bit 7 ausblenden - AW - L 0 // Fehler vorhanden? - <>I // Ja - = Err - BEC + CALL "DatenOut" + ( SSDB := #Gesamt_Trolley_DL , + SSDW := 0 , + PARA := 16#0000 , //Eintrag lesen + SEARCHDATEN := P#M220.0 , + RE_VAL := "MB199" , + OUTDATEN := %DB1011.DBX0.0 , + Position := "MW196" + ); + + L "MB199"; + L 2#1111111 ;//Bit 7 ausblenden + UW; + L 0;//Fehler vorhanden? + <>I;//Ja + = #Err; + BEB; + +NETWORK +TITLE = Zeit übegeben + L #TrolleyID; + T "TrolleyDL_OutDaten".OUTDaten.TrolleyID; + L "SGes".DATE_TIME.Jahr; + T "TrolleyDL_OutDaten".OUTDaten.LastTime.Jahr; + L "SGes".DATE_TIME.Monat; + T "TrolleyDL_OutDaten".OUTDaten.LastTime.Monat; + L "SGes".DATE_TIME.Tag; + T "TrolleyDL_OutDaten".OUTDaten.LastTime.Tag; + L "SGes".DATE_TIME.Stunde; + T "TrolleyDL_OutDaten".OUTDaten.LastTime.Stunde; + L "SGes".DATE_TIME.Minute; + T "TrolleyDL_OutDaten".OUTDaten.LastTime.Minute; + L "SGes".DATE_TIME.Sekunde; + T "TrolleyDL_OutDaten".OUTDaten.LastTime.Sekunde; + +NETWORK +TITLE = Neue Position übergeben + L #Position; + L 0; + ==I; + SPB NoNewPos; + + TAK; + T "TrolleyDL_OutDaten".OUTDaten.Standort; + +NoNewPos: NOP 0; + +NETWORK +TITLE = ShopGroup übergeben ? (bei 0 nichts ändern!) + L #ShopGroup; + L DINT#0; + ==D; + SPB NoShopGroup; + + TAK; + T "TrolleyDL_OutDaten".OUTDaten.ShopGroup; + +NoShopGroup: NOP 0; + +NETWORK +TITLE = Daten schreiben + CALL "DatenIn" + ( SSDB := #Gesamt_Trolley_DL , + SSDW := 0 , + INDATEN := %DB1011.DBX0.0 , + RE_VAL := "MB199" + ); ---- NW 3: Zeit übegeben --- - L TrolleyID - T "TrolleyDL_OutDaten".OUTDaten.TrolleyID - L "SGes".DATE_TIME.Jahr - T "TrolleyDL_OutDaten".OUTDaten.LastTime.Jahr - L "SGes".DATE_TIME.Monat - T "TrolleyDL_OutDaten".OUTDaten.LastTime.Monat - L "SGes".DATE_TIME.Tag - T "TrolleyDL_OutDaten".OUTDaten.LastTime.Tag - L "SGes".DATE_TIME.Stunde - T "TrolleyDL_OutDaten".OUTDaten.LastTime.Stunde - L "SGes".DATE_TIME.Minute - T "TrolleyDL_OutDaten".OUTDaten.LastTime.Minute - L "SGes".DATE_TIME.Sekunde - T "TrolleyDL_OutDaten".OUTDaten.LastTime.Sekunde +NETWORK +TITLE = Ende + BE; - ---- NW 4: Neue Position übergeben --- - L Position - L 0 - ==I - JC NoNewPos - - CAC - T "TrolleyDL_OutDaten".OUTDaten.Standort - -NoNewPos: NOP 0 - - ---- NW 5: ShopGroup übergeben ? (bei 0 nichts ändern!) --- - L ShopGroup - L DINT#0 - ==D - JC NoShopGroup - - CAC - T "TrolleyDL_OutDaten".OUTDaten.ShopGroup - -NoShopGroup: NOP 0 - - ---- NW 6: Daten schreiben --- -CALL FC "DatenIn" (SSDB:=Gesamt_Trolley_DL, SSDW:=0, INDATEN:=DB1011.DBX0.0, RE_VAL:="MB199") - - - ---- NW 7: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Logistik/Trolleydaten_löschen.awl b/=A01+UH07-KF00/Programmbausteine/Logistik/Trolleydaten_löschen.awl index 86635d2..5c20766 100644 --- a/=A01+UH07-KF00/Programmbausteine/Logistik/Trolleydaten_löschen.awl +++ b/=A01+UH07-KF00/Programmbausteine/Logistik/Trolleydaten_löschen.awl @@ -1,34 +1,45 @@ -=== FC 1: Trolleydaten_löschen [STL] === -INTERFACE: - Input: - Gesamt_Trolley_DL : Int - TrolleyID : DInt - Output: - InOut: - Temp: - Constant: - Return: - Ret_Val : Void - ---- NW 1: GesamtTrolly-DL angegeben? --- - L Gesamt_Trolley_DL - L 0 // sinnvolle Angabe? - <=I // Nein! - BEC // Abbruch +FUNCTION "Trolleydaten_löschen" : Void +TITLE = Trolleydaten manipulieren (nur für Inbetriebnahme / zum Testen) +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 + VAR_INPUT + Gesamt_Trolley_DL : Int; + TrolleyID : DInt; + END_VAR ---- NW 2: Trolleydaten auslesen und verändern --- -// Trolleydaten manipulieren: - L TrolleyID - T "TrolleyDL_SearchDaten".SEARCHDaten.TrolleyID +BEGIN +NETWORK +TITLE = GesamtTrolly-DL angegeben? + L #Gesamt_Trolley_DL; + L 0;//sinnvolle Angabe? + <=I;//Nein! + BEB;//Abbruch -CALL FC "DatenOut" (SSDB:=Gesamt_Trolley_DL, SSDW:=0, PARA:=16#E100, SEARCHDATEN:=DB1012.DBX0.0, RE_VAL:="MB198", OUTDATEN:=DB1011.DBX0.0, Position:="MW200") // Eintrag lesen + austragen +NETWORK +TITLE = Trolleydaten auslesen und verändern - L "MB198" +//Trolleydaten manipulieren: + L #TrolleyID; + T "TrolleyDL_SearchDaten".SEARCHDaten.TrolleyID; - BEU + CALL "DatenOut" + ( SSDB := #Gesamt_Trolley_DL , + SSDW := 0 , + PARA := 16#E100 , //Eintrag lesen + austragen + SEARCHDATEN := %DB1012.DBX0.0 , + RE_VAL := "MB198" , + OUTDATEN := %DB1011.DBX0.0 , + Position := "MW200" + ); + L "MB198"; ---- NW 3: Ende --- - BE + BEA; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Logistik/Trolleydaten_neu_anlegen.awl b/=A01+UH07-KF00/Programmbausteine/Logistik/Trolleydaten_neu_anlegen.awl index 1372318..2d81324 100644 --- a/=A01+UH07-KF00/Programmbausteine/Logistik/Trolleydaten_neu_anlegen.awl +++ b/=A01+UH07-KF00/Programmbausteine/Logistik/Trolleydaten_neu_anlegen.awl @@ -1,53 +1,67 @@ -=== FC 3: Trolleydaten_neu_anlegen [STL] === -INTERFACE: - Input: - Gesamt_Trolley_DL : Int - TrolleyID : DInt - Endziel : Word - ShopGroup : DInt - Output: - InOut: - Temp: - Lager_DB : Int - Lager_DW : Int - SSDW : Int - Position : Int - Constant: - Return: - Ret_Val : Void +FUNCTION "Trolleydaten_neu_anlegen" : Void +TITLE = Trolleydaten neu anlegen (nur für Inbetriebnahme / zum Testen) +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 + VAR_INPUT + Gesamt_Trolley_DL : Int; + TrolleyID : DInt; + Endziel : Word; + ShopGroup : DInt; + END_VAR ---- NW 1: GesamtTrolly-DL angegeben? --- - L Gesamt_Trolley_DL - L 0 // sinnvolle Angabe? - <=I // Nein! - BEC // Abbruch + VAR_TEMP + Lager_DB : Int; + Lager_DW : Int; + SSDW : Int; + Position : Int; + END_VAR ---- NW 2: Erst mal alte Daten löschen --- -CALL FC "Trolleydaten_löschen" (Gesamt_Trolley_DL:=Gesamt_Trolley_DL, TrolleyID:=TrolleyID) +BEGIN +NETWORK +TITLE = GesamtTrolly-DL angegeben? + L #Gesamt_Trolley_DL; + L 0;//sinnvolle Angabe? + <=I;//Nein! + BEB;//Abbruch +NETWORK +TITLE = Erst mal alte Daten löschen + CALL "Trolleydaten_löschen" + ( Gesamt_Trolley_DL := #Gesamt_Trolley_DL , + TrolleyID := #TrolleyID + ); ---- NW 3: Trolleydaten speichern --- -// Trolleydaten manipulieren: - L TrolleyID - T "TrolleyDL_INDaten".INDaten.TrolleyID +NETWORK +TITLE = Trolleydaten speichern - L Endziel // Eingabe über Beobachtungstabelle (Tests) - T "TrolleyDL_INDaten".INDaten.EndZiel - L ShopGroup - T "TrolleyDL_INDaten".INDaten.ShopGroup +//Trolleydaten manipulieren: + L #TrolleyID; + T "TrolleyDL_INDaten".INDaten.TrolleyID; -// Rest nullen - L 0 - T "TrolleyDL_INDaten".INDaten.ZwischenZiel - T "TrolleyDL_INDaten".INDaten.Standort + L #Endziel ;//Eingabe über Beobachtungstabelle (Tests) + T "TrolleyDL_INDaten".INDaten.EndZiel; + L #ShopGroup; + T "TrolleyDL_INDaten".INDaten.ShopGroup; -// Daten in Datenbank schreiben: -CALL FC "DatenIn" (SSDB:=Gesamt_Trolley_DL, SSDW:=0, INDATEN:=DB1010.DBX0.0, RE_VAL:="MB198") +//Rest nullen + L 0; + T "TrolleyDL_INDaten".INDaten.ZwischenZiel; + T "TrolleyDL_INDaten".INDaten.Standort; - L "TrolleyDL_INDaten".INDaten.TrolleyID +//Daten in Datenbank schreiben: + CALL "DatenIn" + ( SSDB := #Gesamt_Trolley_DL , + SSDW := 0 , + INDATEN := %DB1010.DBX0.0 , + RE_VAL := "MB198" + ); + L "TrolleyDL_INDaten".INDaten.TrolleyID; ---- NW 4: Ende --- - BE +NETWORK +TITLE = Ende + BE; + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Logistik/Trolleydaten_ändern.awl b/=A01+UH07-KF00/Programmbausteine/Logistik/Trolleydaten_ändern.awl index 01d1e05..2cb73a9 100644 --- a/=A01+UH07-KF00/Programmbausteine/Logistik/Trolleydaten_ändern.awl +++ b/=A01+UH07-KF00/Programmbausteine/Logistik/Trolleydaten_ändern.awl @@ -1,59 +1,75 @@ -=== FC 2: Trolleydaten_ändern [STL] === -INTERFACE: - Input: - Gesamt_Trolley_DL : Int - TrolleyID : DInt - Endziel : Word - ShopGroup : DInt - Output: - InOut: - Temp: - Constant: - Return: - Ret_Val : Void - ---- NW 1: GesamtTrolly-DL angegeben? --- - L Gesamt_Trolley_DL - L 0 // sinnvolle Angabe? - <=I // Nein! - BEC // Abbruch +FUNCTION "Trolleydaten_ändern" : Void +TITLE = Trolleydaten manipulieren (nur für Inbetriebnahme / zum Testen) +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 + VAR_INPUT + Gesamt_Trolley_DL : Int; + TrolleyID : DInt; + Endziel : Word; + ShopGroup : DInt; + END_VAR ---- NW 2: Trolleydaten auslesen und verändern --- -// Trolleydaten manipulieren: - L TrolleyID - T "TrolleyDL_SearchDaten".SEARCHDaten.TrolleyID +BEGIN +NETWORK +TITLE = GesamtTrolly-DL angegeben? + L #Gesamt_Trolley_DL; + L 0;//sinnvolle Angabe? + <=I;//Nein! + BEB;//Abbruch -CALL FC "DatenOut" (SSDB:=Gesamt_Trolley_DL, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=DB1012.DBX0.0, RE_VAL:="MB198", OUTDATEN:=DB1011.DBX0.0, Position:="MW200") // Eintrag lesen +NETWORK +TITLE = Trolleydaten auslesen und verändern - L "MB198" - L 2#10000000 // Datensatz vorhanden? - <>I // Nein! - BEC +//Trolleydaten manipulieren: + L #TrolleyID; + T "TrolleyDL_SearchDaten".SEARCHDaten.TrolleyID; - L "TrolleyDL_OutDaten".OUTDaten.TrolleyID // Zum Beobachten + CALL "DatenOut" + ( SSDB := #Gesamt_Trolley_DL , + SSDW := 0 , + PARA := 16#0000 , //Eintrag lesen + SEARCHDATEN := %DB1012.DBX0.0 , + RE_VAL := "MB198" , + OUTDATEN := %DB1011.DBX0.0 , + Position := "MW200" + ); - L Endziel - L -1 // Keine Änderung ? - ==I // Ja ! - JC Variante // Nichts überschreiben + L "MB198"; + L 2#10000000 ;//Datensatz vorhanden? + <>I;//Nein! + BEB; - CAC - T "TrolleyDL_OutDaten".OUTDaten.EndZiel + L "TrolleyDL_OutDaten".OUTDaten.TrolleyID;//Zum Beobachten -Variante: L ShopGroup - L DINT#-1 // Keine Änderung ? - ==D // Ja ! - JC Save // Nichts überschreiben + L #Endziel; + L -1 ;//Keine Änderung ? + ==I ;//Ja ! + SPB Variante ;//Nichts überschreiben - CAC - T "TrolleyDL_OutDaten".OUTDaten.ShopGroup + TAK; + T "TrolleyDL_OutDaten".OUTDaten.EndZiel; -Save: CALL FC "DatenIn" (SSDB:=Gesamt_Trolley_DL, SSDW:=0, INDATEN:=DB1011.DBX0.0, RE_VAL:="MB198") +Variante: L #ShopGroup; + L DINT#-1 ;//Keine Änderung ? + ==D ;//Ja ! + SPB Save ;//Nichts überschreiben - BEU + TAK; + T "TrolleyDL_OutDaten".OUTDaten.ShopGroup; +Save: CALL "DatenIn" + ( SSDB := #Gesamt_Trolley_DL , + SSDW := 0 , + INDATEN := %DB1011.DBX0.0 , + RE_VAL := "MB198" + ); ---- NW 3: Ende --- - BE + BEA; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Logistik/Wandel_FC_für_DB1000.awl b/=A01+UH07-KF00/Programmbausteine/Logistik/Wandel_FC_für_DB1000.awl index 5f0f258..b0f5f4f 100644 --- a/=A01+UH07-KF00/Programmbausteine/Logistik/Wandel_FC_für_DB1000.awl +++ b/=A01+UH07-KF00/Programmbausteine/Logistik/Wandel_FC_für_DB1000.awl @@ -1,19 +1,18 @@ -=== FC 1000: Wandel_FC_für_DB1000 [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Constant: - Return: - Ret_Val : Void +FUNCTION "Wandel_FC_für_DB1000" : Void +TITLE = Wandel-FC für indizierte Speicherung der DB1000-Daten +{ S7_Optimized_Access := 'FALSE' ; S7_Pass_Registers := 'TRUE' } +VERSION : 0.1 ---- NW 1: Wandeln der Daten --- - L "MD94" - + DINT#-6040000 // Funktioniert bis max: 6072767 (Wert + 32767) - T "MW92" // Funktioniert bis max: 32767, danach negativ +BEGIN +NETWORK +TITLE = Wandeln der Daten + L "MD94"; + + DINT#-6040000 ;//Funktioniert bis max: 6072767 (Wert + 32767) + T "MW92" ;//Funktioniert bis max: 32767, danach negativ +NETWORK +TITLE = Ende + BE; ---- NW 2: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Module/BCD (4stellig)_to_INT.awl b/=A01+UH07-KF00/Programmbausteine/Module/BCD (4stellig)_to_INT.awl index 2eab780..869f336 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/BCD (4stellig)_to_INT.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/BCD (4stellig)_to_INT.awl @@ -1,87 +1,97 @@ -=== FC 78: BCD (4stellig)_to_INT [STL] === -INTERFACE: - Input: - BCD_Wert : Word - Output: - Int_Wert : Int - InOut: - Temp: - BCD_Vergleich : Word - Multiplikator : Int - Constant: - Return: - Ret_Val : Void +FUNCTION "BCD (4stellig)_to_INT" : Void +TITLE = BCD-Wert (2-Stellig) in INT-Wert wandeln (Max 00FF) +{ S7_Optimized_Access := 'FALSE' } +VERSION : 0.1 +// +// + VAR_INPUT + BCD_Wert : Word; + END_VAR ---- NW 1: Rückmeldung --- - L 0 // erst mal köschen - T Int_Wert + VAR_OUTPUT + Int_Wert : Int; + END_VAR - L 1 - T Multiplikator - ---- NW 2: BCD-Wert wandeln --- - L BCD_Wert - T BCD_Vergleich - L 16#000F - AW - L Multiplikator - *I - L Int_Wert - +I - T Int_Wert - - L Multiplikator - L 16 - *I - T Multiplikator - - L BCD_Vergleich - SRW 4 - T BCD_Vergleich - - L 16#000F - AW - L Multiplikator - *I - L Int_Wert - +I - T Int_Wert - - L Multiplikator - L 16 - *I - T Multiplikator - - L BCD_Vergleich - SRW 4 - T BCD_Vergleich - - L 16#000F - AW - L Multiplikator - *I - L Int_Wert - +I - T Int_Wert - - L Multiplikator - L 16 - *I - T Multiplikator - - L BCD_Vergleich - SRW 4 - T BCD_Vergleich - - L 16#000F - AW - L Multiplikator - *I - L Int_Wert - +I - T Int_Wert + VAR_TEMP + BCD_Vergleich : Word; + Multiplikator : Int; + END_VAR ---- NW 3: Ende --- - BE +BEGIN +NETWORK +TITLE = Rückmeldung + L 0;//erst mal köschen + T #Int_Wert; + + L 1; + T #Multiplikator; +NETWORK +TITLE = BCD-Wert wandeln + L #BCD_Wert; + T #BCD_Vergleich; + L 16#000F; + UW; + L #Multiplikator; + *I; + L #Int_Wert; + +I; + T #Int_Wert; + + L #Multiplikator; + L 16; + *I; + T #Multiplikator; + + L #BCD_Vergleich; + SRW 4; + T #BCD_Vergleich; + + L 16#000F; + UW; + L #Multiplikator; + *I; + L #Int_Wert; + +I; + T #Int_Wert; + + L #Multiplikator; + L 16; + *I; + T #Multiplikator; + + L #BCD_Vergleich; + SRW 4; + T #BCD_Vergleich; + + L 16#000F; + UW; + L #Multiplikator; + *I; + L #Int_Wert; + +I; + T #Int_Wert; + + L #Multiplikator; + L 16; + *I; + T #Multiplikator; + + L #BCD_Vergleich; + SRW 4; + T #BCD_Vergleich; + + L 16#000F; + UW; + L #Multiplikator; + *I; + L #Int_Wert; + +I; + T #Int_Wert; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Module/DBMOV.awl b/=A01+UH07-KF00/Programmbausteine/Module/DBMOV.awl index 9376ec2..437b0bd 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/DBMOV.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/DBMOV.awl @@ -1,50 +1,72 @@ -=== FC 99: DBMOV [STL] === -INTERFACE: - Input: - QuellDB : Int // Quell-DB - QuellDW : Int // Quell-1.DW - ZielDB : Int // Ziel-DB - ZielDW : Int // Ziel-1.DW - Anzahl_DW : Int // Anzahl der zu kopierenden DWs - Output: - RE_VAL : Int // Rückmeldung - InOut: - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Constant: - Return: - Ret_Val : Void +FUNCTION "DBMOV" : Void +TITLE = DB-Bereiche kopieren +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +FAMILY : FIFO +NAME : FifoIn +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-1254 +//Version: H&M / 06.12.2025 +// + VAR_INPUT + QuellDB : Int; // Quell-DB + QuellDW : Int; // Quell-1.DW + ZielDB : Int; // Ziel-DB + ZielDW : Int; // Ziel-1.DW + Anzahl_DW : Int; // Anzahl der zu kopierenden DWs + END_VAR ---- NW 1: --- -// Kennung + Datenbytes - L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L Anzahl_DW // Datenwords speichern - T LW2 - T LW12 // Wiederholungen + VAR_OUTPUT + RE_VAL : Int; // Rückmeldung + END_VAR -// Quelle-Pointer erzeugen: - L QuellDB - T LW4 // DB_Nummer - L QuellDW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: - L ZielDB - T LW14 // DB_Nummer - L ZielDW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RE_VAL, DSTBLK:=Ziel) // Datenliste-Daten speichern + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + END_VAR ---- NW 2: Ende --- - BE +BEGIN +NETWORK +TITLE = + +//Kennung + Datenbytes + L 16#1004 ;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L #Anzahl_DW ;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//Quelle-Pointer erzeugen: + L #QuellDB; + T %LW4;//DB_Nummer + L #QuellDW ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: + L #ZielDB; + T %LW14;//DB_Nummer + L #ZielDW ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RE_VAL , + DSTBLK := #Ziel + ); + +NETWORK +TITLE = Ende + BE; +END_FUNCTION + diff --git a/=A01+UH07-KF00/Programmbausteine/Module/DL_Einsprung.awl b/=A01+UH07-KF00/Programmbausteine/Module/DL_Einsprung.awl index 371618c..1390c14 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/DL_Einsprung.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/DL_Einsprung.awl @@ -1,55 +1,68 @@ -=== FC 1004: DL_Einsprung [STL] === -INTERFACE: - Input: - Bereich_DL : Int // Nur für Stammdaten =1! - ID : Int - Output: - Dyn.DB : Int - AR_Start : DInt - Error : Bool - InOut: - Temp: - Constant: - Return: - Ret_Val : Void +FUNCTION "DL_Einsprung" : Void +TITLE = Bereich-DL: Einsprungs-DW ermitteln +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 + VAR_INPUT + Bereich_DL : Int; // Nur für Stammdaten =1! + ID : Int; + END_VAR ---- NW 1: Inittialisierung --- - L 0 - T "Dyn.DB" - L DINT#0 - T AR_Start - SET - S Error + VAR_OUTPUT + "Dyn.DB" : Int; + AR_Start : DInt; + Error : Bool; + END_VAR ---- NW 2: ID suchen --- - L ID - T "MW200" +BEGIN +NETWORK +TITLE = Inittialisierung + L 0; + T #"Dyn.DB"; + L DINT#0; + T #AR_Start; + SET; + S #Error; -CALL FC "DatenOut" (SSDB:=Bereich_DL, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196") // Eintrag lesen +NETWORK +TITLE = ID suchen + L #ID; + T "MW200"; - L "MB199" - L 2#1111111 // Bit 7 ausblenden - AW - L 0 // Fehler vorhanden? - <>I // Ja - = Error - BEC + CALL "DatenOut" + ( SSDB := #Bereich_DL , + SSDW := 0 , + PARA := 16#0000 , //Eintrag lesen + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := "MW196" + ); + L "MB199"; + L 2#1111111 ;//Bit 7 ausblenden + UW; + L 0;//Fehler vorhanden? + <>I;//Ja + = #Error; + BEB; ---- NW 3: Daten übergeben --- - L "MW224" - T "Dyn.DB" // Dyn.DB - L 0 // sinnvoller Wert ? - <=I // Nein ! - S Error - BEC +NETWORK +TITLE = Daten übergeben + L "MW224"; + T #"Dyn.DB" ;//Dyn.DB + L 0;//sinnvoller Wert ? + <=I;//Nein ! + S #Error; + BEB; - L "MW226" - ITD - T AR_Start + L "MW226"; + ITD; + T #AR_Start; +NETWORK +TITLE = Ende + BE; ---- NW 4: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Module/DatenFindOffsetSort.awl b/=A01+UH07-KF00/Programmbausteine/Module/DatenFindOffsetSort.awl index 7e51039..3f7edb1 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/DatenFindOffsetSort.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/DatenFindOffsetSort.awl @@ -1,627 +1,694 @@ -=== FC 91: DatenFindOffsetSort [STL] === -INTERFACE: - Input: - SSDB : Int // Datenlisten-DB - SSDW : Int // Datenlisten-1.DW - PARA : Word // Aufrufparameter (Auftrag / Anzahl Zusatzdaten) - SEARCHDATEN : Pointer // Such-Daten-Schnittstelle - Output: - RE_VAL : Byte // Rückmeldung - OUTDATEN : Pointer // OutDaten-Schnittstelle - Position : Int // Daten stehen an angegebener Position in Datenbank - InOut: - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Kopf : Byte // Datenliste-Kennnung (DA) - Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128 - Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze) - Stammdaten : Int // Stammdatenlänge in Word (1 - 9) - Belegt06 : Int // reserviert von Datenliste - Belegt08 : Int // reserviert von Datenliste - Belegt10 : Int // reserviert von Datenliste - Belegt12 : Int // reserviert von Datenliste - AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze - Reserve16 : Int // Reserve - Reserve18 : Int // Reserve - Para1 : Byte // 1.Aufrufparameter - Para2 : Byte // 2.Aufrufparameter - Suchzeiger : Int // Suchzeiger - DBDatenliste : Word // Datenlisten-DB - OffsetDaten_1 : Int // Stammdaten beginnen ab hier - SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf - SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf - Datenlisten_Ende : Word // Ende der Datenliste - AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern - Schleife : Word // Loopzähler - DBSuchDaten : Word // Such-Daten-DB, falls angegeben - SuchDaten_Pointer : DWord // Such-Daten-Pointer: Kennung, Adresse - SuchDaten_Startpunkt : Word // Such-Daten-Startpunkt: Adresse - DBOutDaten : Word // Out-Daten-DB, falls angegeben - OutDaten_Pointer : DWord // Out-Daten-Pointer: Kennung, Adresse - OutDaten_Startpunkt : Word // Out-Daten-Startpunkt: Adresse - IndPointer : DWord // Zeiger für IndDB - Daten_1 : Word // 1.Datenwort der Indaten - Datenblock_inBytes : Word // Datenblocklänge in Bytes - Suchstelle : Word // Bei angegebenen Datensatz suchen - SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf - Weitersuchen : Bool // Weitersuchen ist aktiv - Offsetsuchen : Bool // Offsetsuchen ist aktiv - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - tRE_VAL : Byte // Rückmeldung - Constant: - Return: - Ret_Val : Void - ---- NW 1: Schnittstellen-DB sinnvoll ? --- - TAR2 - T AR2_Speicher // AR2 zwischenspeichern - - L SSDB - T DBDatenliste - -// CALL TEST_DB -// DB_NUMBER :=#DBDatenliste -// RET_VAL :=#SFC_RET_VAL -// DB_LENGTH :=#SFC_DB_LENGTH -// WRITE_PROT :=#SFC_WRITE_PROT - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - O SFC_WRITE_PROT // schreibgeschützt - JC Err0 // kein Datenlisten-Bereich - - ---- NW 2: Quelle-Pointer erzeugen: --- - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 16#000A // 10 Dw´s holen - T LW2 // Wiederholungen - L SSDB - T LW4 // DB_Nummer - L SSDW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 - - ---- NW 3: Zeigerüberprüfung --- - L Kopf // Datenliste-Kopf - L 16#DB // = Sort-Datenlistekennung ? - <>I // Nein ! - JC Err0 // kein Datenlistebereich - - L 1 - L Datensatzlaenge // Datenblocklänge - >I - JC Err0 // kein Datenlistebereich - - L 128 - >I - JC Err0 // kein Datenlistebereich - - L 1 - L Listenlaenge // Max.Anzahl von Datenblöcken - >I - JC Err0 // kein Datenlistebereich - - L 1 - L Stammdaten // Anzahl der Stammdaten - >I - JC Err0 // kein Datenlistebereich - - L 9 - >I - JC Err0 // kein Datenlistebereich - - L Stammdaten // Anzahl der Stammdaten - L Datensatzlaenge // Datenblocklänge - >I - JC Err0 // kein Datenlistebereich - - L Listenlaenge // Länge der Datenliste - L Datensatzlaenge // Datenblocklänge - *I - L 2 // DB byteorientiert - *I - + 20 // Speichern ab 10.DW - L SSDW - +I - T Datenlisten_Ende - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[DBDatenliste] - - L Datenlisten_Ende - L SFC_DB_LENGTH - >I // Datenlisten-DB ist zu kurz! - JC Err0 // kein Datenlisten-Bereich - - L DBW [AR1Zeiger] - L 16#DAEE // Datenliste-Endekennung ? - <>I // Nein ! - A( - CAC - L 16#DBEE // Sort-Datenliste-Endekennung ? - <>I // Nein ! - ) - JC Err0 // kein Datenlisten-Bereich - - L Datensatzlaenge // Datenblocklänge - L 2 - *I - T Datenblock_inBytes // Datenblocklänge in Bytes - - ---- NW 4: Auftrag kontrollieren --- - SET - R Weitersuchen // Weitersuchen ist aktiv - R Offsetsuchen // Offsetsuchen ist aktiv - L 0 // Vorerst kein Offset - T OffsetDaten_1 - - L PARA - T LW40 // Aufrufparameter zwischenspeichern - - L 16#00 // XX = 00 ? - L Para1 - ==I // Ja! - JC W401 - - L 16#E1 // XX = E1 ? - ==I // Ja! - JC Err3 // Falscher Aufrufparameter - - L 16#F1 // XX = F1 ? - L Para1 - <>I // Nein ! - JC W400 - - L Para2 - L 16#00 - <>I - JC Err3 // Falscher Aufrufparameter - - SET - S Weitersuchen - - L SSDW - + 20 - T Suchzeiger - - JU Nw08 // OutDaten ok ? - -W400: L 16#FF // XX = FF ? - <>I // Nein ! - JC W403 - - L Para2 - L 16#00 - <>I - JC Err3 // Falscher Aufrufparameter - - SET - S Weitersuchen - - L Suchzeiger // Alter Suchzeiger - L Datenblock_inBytes // Datenblocklänge in bytes - +I // Nächsten Datensatz suchen - T Suchzeiger // Neuer Suchzeiger - - L Datenblock_inBytes // Datenblocklänge in bytes - L Listenlaenge // Alle möglichen Einträge - *I // Gesamtlänge - L SSDW // Startpunkt - +I - + 20 // Offset 1.Daten - L Suchzeiger // Schreibzeiger - >I // Noch nicht am Ende ! - JC Nw08 // OutDaten ok ? - - JU Err2 // Listenende erreicht - -W403: L 16#02 // XX < 02 ? - L Para1 - >I // Ja! - JC Err3 // Falscher Aufrufparameter - - L 16#80 // XX > 80 ? - >I // Ja! - JC Err3 // Falscher Aufrufparameter - - CAC - L Datensatzlaenge // XX > Datensatzlänge - >I // Ja! - JC Err3 // Falscher Aufrufparameter - - CAC - + -1 // Angegebener Offset -1 - L 2 // DB byteorientiert - *I - T OffsetDaten_1 // Richtiger Offset der 1.Stammdaten - - L 0 - T Suchzeiger // Suche ab Anfang - - SET - S Offsetsuchen - -W401: L 16#00 // =0 ? - L Para2 // 2.Aufrufparameter - ==I // Ja ! - JC W402 - - T Stammdaten // Anzahl der Stammdaten - L Datensatzlaenge // Datenblocklänge - >I - JC Err3 // Falscher Aufrufparameter - - L 1 - L Stammdaten // Anzahl der Stammdaten - >I - JC Err3 // Falscher Aufrufparameter - - L 9 - >I - JC Err3 // Falscher Aufrufparameter - -W402: AN Offsetsuchen - JC Nw05 - - L Para1 // Offset - + -1 - L Stammdaten - +I // Letzte Stammdaten zu groß ? - L Datensatzlaenge - >I // Ja! - JC Err3 // Falscher Aufrufparameter - - ---- NW 5: Such-DATEN-Pointer übernehmen: --- -Nw05: L AnzahlEintraege // Anzahl der eingetragenen Datensätze - L 0 // Eintrag vorhanden ? - ==I // Nein ! - JC Err6 // Datensatz ist nicht vorhanden - - L 0 - T Suchzeiger // Suchzeiger - - L P# - LAR2 - - L NoneW [AR2,] - T DBSuchDaten // Suchdaten-DB - L NoneD [AR2,] // Kennung, Adresse - T SuchDaten_Pointer - - L DBSuchDaten // Suchdaten-DB - L 0 // Angegeben ? - ==I // Nein - JC W501 - -// CALL TEST_DB -// DB_NUMBER :=#DBSuchDaten -// RET_VAL :=#SFC_RET_VAL -// DB_LENGTH :=#SFC_DB_LENGTH -// WRITE_PROT :=#SFC_WRITE_PROT - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBSuchDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 // Fehler vorhanden ? - <>I // Ja ! - JC Err4 // Undefinierte Stammdaten - - L NoneD [AR2,] // Kennung, Adresse - L 16#00FF_FFFF // Ohne Kennung - AW - SRW 3 // Ohne Bit - T SuchDaten_Startpunkt - - L Datensatzlaenge // Datenblocklänge - L 2 // DB byteorientiert - *I - L SuchDaten_Startpunkt - +I - L SFC_DB_LENGTH - >I // Suchdaten-DB ist zu kurz - JC Err4 // Undefinierte Stammdaten - -W501: L SuchDaten_Pointer - LAR2 - - L DBSuchDaten // Suchdaten-DB - L 0 // Angegeben ? - ==I // Nein - JC W502 - - OPN DB[DBSuchDaten] - -W502: L NoneW [AR2,] // Suchdaten überprüfen - T Daten_1 // 1.Suchdaten speichern - - L Stammdaten -L500: T Schleife - - L DBSuchDaten // Suchdaten-DB - L 0 // Angegeben ? - ==I // Nein - JC W503 - - OPN DB[DBSuchDaten] - -W503: L NoneW [AR2,] // Suchdaten überprüfen - L 0 // Etwas angegeben ? - <>I // Ja ! - JC Nw07 // Weiter - - ADDAR2 P#2.0 - - L Schleife - LOOP L500 - - JU Err4 // Undefinierte Stammdaten - - ---- NW 6: Kontrolle auf gleiche Stammdaten --- -Nw07: L Suchzeiger // Suchzeiger - L 0 // Angegeben ? - ==I // Nein ! - JC W700 // Suche bei 1.Datensatz beginnen - - L Suchzeiger // Suchzeiger - + -20 // Zeiger 1.Daten - L Datenblock_inBytes // Datenblocklänge in Bytes - /I // Ermittlung der wievielten Daten -1 - SRD 16 // Rest ermitteln - L 0 // = 0 ? - <>I // Suchzeiger nicht im Raster ! - JC W700 // Suche bei 1.Datensatz beginnen - - L 0 // Bei angegebener Stelle suchen - T Suchstelle // Such bei X-ten Datensatz - - JU W701 - -W700: L 1 // Suche bei 1.Datensatz beginnen - T Suchstelle // Such bei X-ten Datensatz - L SSDW - + 20 // Offset für 1.Daten - T Suchzeiger // Suchzeiger - -W701: L Suchzeiger // Suchzeiger - L OffsetDaten_1 // Richtiger Offset der 1.Stammdaten - +I - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - L SuchDaten_Pointer - LAR2 - - L Stammdaten // Anzahl der Stammdaten -L700: T Schleife - - L DBSuchDaten // Suchdaten-DB - L 0 // Angegeben ? - ==I // Nein - JC W702 - - OPN DB[DBSuchDaten] - -W702: L NoneW [AR2,] // Suchdaten überprüfen mit - OPN DB[DBDatenliste] - L DBW [AR1Zeiger] // Datenliste-Daten lesen - <>I // nicht identisch ! - JC W703 - - L AR1Zeiger - SRD 3 - L 2 - +D - SLD 3 - T AR1Zeiger - - ADDAR2 P#2.0 - - L Schleife - LOOP L700 - - L 2#0000_0000_1000_0000 // Daten sind vorhanden - T tRE_VAL // Ok-Status - - JU Nw08 // Datensatz ist in Liste enthalten - -W703: L 0 // Suche bei 1.Datensatz begonnen - L Suchstelle // Such bei X-ten Datensatz - ==I // Nein ! - JC W700 - - L Suchstelle // Such bei X-ten Datensatz - + 1 - T Suchstelle // Such bei X-ten Datensatz - L AnzahlEintraege // Anzahl der eingetragenen Datensätze - <=I // Alle Datensätze sind durchsucht - JC W705 // Nein ! - - JU Err6 // Datensatz ist nicht vorhanden - -W705: L Datenblock_inBytes // Datenblocklänge in bytes - L Suchzeiger // Suchzeiger - +I - T Suchzeiger // Suchzeiger - JU W701 - - ---- NW 7: Out-DATEN-Pointer übernehmen: --- -Nw08: L P# - LAR2 - - L NoneW [AR2,] - T DBOutDaten // Outdaten-DB - L NoneD [AR2,] // Kennung, Adresse - T OutDaten_Pointer - - L DBOutDaten // Outdaten-DB - L 0 // Angegeben ? - ==I // Nein - JC Nw09 - -// CALL TEST_DB -// DB_NUMBER :=#DBOutDaten -// RET_VAL :=#SFC_RET_VAL -// DB_LENGTH :=#SFC_DB_LENGTH -// WRITE_PROT :=#SFC_WRITE_PROT - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBOutDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 // Fehler vorhanden ? - <>I // Ja ! - JC Err5 // Undefinierte Outdaten - - L NoneD [AR2,] // Kennung, Adresse - L 16#00FF_FFFF // Ohne Kennung - AW - SRW 3 // Ohne Bit - T OutDaten_Startpunkt - - L OutDaten_Startpunkt - L SFC_DB_LENGTH - >I // Outdaten-DB ist zu kurz - JC Err5 // Undefinierte Outdaten - - ---- NW 8: Quelle-Pointer erzeugen: --- -Nw09: L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L Datensatzlaenge // Datenwords speichern - T LW2 - T LW12 // Wiederholungen - -// DATEN-Pointer übernehmen: - L SSDB - T LW4 // DB_Nummer - L Suchzeiger // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: -// Kennung + Datenbytes s.o. - - L DBOutDaten - T LW14 // DB_Nummer - L OutDaten_Pointer - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 - - L SSDW - + 12 // im 12.DW speichern - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - L Suchzeiger // Suchzeiger - OPN DB[DBDatenliste] - T DBW [AR1Zeiger] // Speicherung letzter Zugriff - - L Suchzeiger // Suchzeiger - + -20 // Offeset 1.DS - L Datenblock_inBytes // Datenblocklänge in Bytes - /I - + 1 // Position errechnen - T Position // Daten stehen an angegebener Position in Datenbank - - ---- NW 9: Weitersuchen aktiv ? Datensatz vorhanden oder 0 ? --- - AN Weitersuchen - JC Ende - - L OutDaten_Pointer - LAR2 - - L Datensatzlaenge -L110: T Schleife - - L DBOutDaten // Outdaten-DB - L 0 // Angegeben ? - ==I // Nein - JC W111 - - OPN DB[DBOutDaten] - -W111: L NoneW [AR2,] // Outdaten überprüfen - L 0 // Etwas angegeben ? - <>I // Ja ! - JC W112 // Ok - - ADDAR2 P#2.0 - - L Schleife - LOOP L110 - - L 2#0000_0000_0100_0000 // Daten sind nicht vorhanden - T tRE_VAL // Ok-Status - JU Ende - -W112: L 2#0000_0000_1000_0000 // Daten sind vorhanden - T tRE_VAL // Ok-Status - JU Ende - - ---- NW 10: Fehlerausgabe / RET_VAL --- -Ende: SET // VKE = 1 ohne Fehler !!! - L tRE_VAL // Ok-Status - JU Ok -Err0: L 2#0000_0000_0000_0001 // Kein Datenlistebereich - JU Err -Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler - JU Err -Err2: L 2#0000_0000_0000_0100 // Listenende ist erreicht - JU Err -Err3: L 2#0000_0000_0000_1000 // Falscher Parameter bei Aufruf - JU Err -Err4: L 2#0000_0000_0001_0000 // Undefinierte Suchdaten - JU Err -Err5: L 2#0000_0000_0010_0000 // Undefinierte OUTDaten - JU Err -Err6: L 2#0000_0000_0100_0000 // Datensatz nicht vorhanden - -Err: CLR // VKE = 0 bei Fehler !!! - -Ok: T tRE_VAL - SAVE // VKE in BIE-Bit speichern - - L AR2_Speicher // AR2 zurückspeichern - LAR2 - - ---- NW 11: --- - L tRE_VAL - T RE_VAL - +FUNCTION "DatenFindOffsetSort" : Void +TITLE = Datensort-Modul +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +FAMILY : DLISTE +NAME : DatenIn +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-1254 +//Version: ILS2100 / 06.11.2009 +// +//Offsetdaten in sortierter Datenliste suchen +//SSDB: Datenlisten-DB +//SSDW: Datenlisten-1.DW +//SEARCHDATEN: Pointer, wo einzutragende Daten stehen (P#DB1.DBX0.0, P#M220.0) +//AUFTRAG: XXYY +// XX: 00 = angegebenen Datensatz suchen +// 02 - 80 = Stammdaten beginnen ab angegebenen Datenwort +// F1 = 1.Datensatz lesen +// FF = nächsten vorhandenen Eintrag lesen (ab letzten Zugriff) +// YY: 01 - 09 = Anzahl der Stammdaten (falls abweichend vom Datenlistenkopf!) +//OUTDATEN: Pointer, wohin ausgelesene Daten übergeben werden (P#DB1.DBX0.0, +// P#M220.0) +//RE_VAL: Rückmeldungen: +// Bit0: Kein Datenlistenbereich / falscher Kopfinhalt / Endekennung +// Bit1: SFC20-Aufruf mit Fehler +// Bit2: Listenende ist erreicht +// Bit3: Falscher Parameter bei Aufruf +// Bit4: Undefinierte Stammdaten +// Bit5: Undefinierte OUT-Daten +// Bit6: Datensatz ist nicht vorhanden +// Bit7: Datensatz ist vorhanden +// + VAR_INPUT + SSDB : Int; // Datenlisten-DB + SSDW : Int; // Datenlisten-1.DW + PARA : Word; // Aufrufparameter (Auftrag / Anzahl Zusatzdaten) + SEARCHDATEN : Pointer; // Such-Daten-Schnittstelle + END_VAR + + VAR_OUTPUT + RE_VAL : Byte; // Rückmeldung + OUTDATEN : Pointer; // OutDaten-Schnittstelle + Position : Int; // Daten stehen an angegebener Position in Datenbank + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Kopf : Byte; // Datenliste-Kennnung (DA) + Datensatzlaenge : Byte; // Datensatzlänge in Word (01 - F0) F0=128 + Listenlaenge : Int; // Länge der Datenliste (maximale Anzahl der Datensätze) + Stammdaten : Int; // Stammdatenlänge in Word (1 - 9) + Belegt06 : Int; // reserviert von Datenliste + Belegt08 : Int; // reserviert von Datenliste + Belegt10 : Int; // reserviert von Datenliste + Belegt12 : Int; // reserviert von Datenliste + AnzahlEintraege : Int; // Anzahl der eingetragenen Datensätze + Reserve16 : Int; // Reserve + Reserve18 : Int; // Reserve + Para1 : Byte; // 1.Aufrufparameter + Para2 : Byte; // 2.Aufrufparameter + Suchzeiger : Int; // Suchzeiger + DBDatenliste : Word; // Datenlisten-DB + OffsetDaten_1 : Int; // Stammdaten beginnen ab hier + SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf + SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf + Datenlisten_Ende : Word; // Ende der Datenliste + AR2_Speicher : DWord; // Adress-Register 2 zwischenspeichern + Schleife : Word; // Loopzähler + DBSuchDaten : Word; // Such-Daten-DB, falls angegeben + SuchDaten_Pointer : DWord; // Such-Daten-Pointer: Kennung, Adresse + SuchDaten_Startpunkt : Word; // Such-Daten-Startpunkt: Adresse + DBOutDaten : Word; // Out-Daten-DB, falls angegeben + OutDaten_Pointer : DWord; // Out-Daten-Pointer: Kennung, Adresse + OutDaten_Startpunkt : Word; // Out-Daten-Startpunkt: Adresse + IndPointer : DWord; // Zeiger für IndDB + Daten_1 : Word; // 1.Datenwort der Indaten + Datenblock_inBytes : Word; // Datenblocklänge in Bytes + Suchstelle : Word; // Bei angegebenen Datensatz suchen + SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf + Weitersuchen : Bool; // Weitersuchen ist aktiv + Offsetsuchen : Bool; // Offsetsuchen ist aktiv + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + tRE_VAL : Byte; // Rückmeldung + END_VAR + + +BEGIN +NETWORK +TITLE = Schnittstellen-DB sinnvoll ? + TAR2; + T #AR2_Speicher;//AR2 zwischenspeichern + + L #SSDB; + T #DBDatenliste; + +// CALL TEST_DB +// DB_NUMBER :=#DBDatenliste +// RET_VAL :=#SFC_RET_VAL +// DB_LENGTH :=#SFC_DB_LENGTH +// WRITE_PROT :=#SFC_WRITE_PROT + + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #DBDatenliste , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + O #SFC_WRITE_PROT;//schreibgeschützt + SPB Err0;//kein Datenlisten-Bereich + +NETWORK +TITLE = Datenlistekopf holen +//Quelle-Pointer erzeugen: + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 16#000A;//10 Dw´s holen + T %LW2;//Wiederholungen + L #SSDB; + T %LW4;//DB_Nummer + L #SSDW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//1.-10.DW Datenliste holen + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := P#L20.0 WORD 10 + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + +NETWORK +TITLE = Zeigerüberprüfung + L #Kopf;//Datenliste-Kopf + L 16#DB;//= Sort-Datenlistekennung ? + <>I;//Nein ! + SPB Err0;//kein Datenlistebereich + + L 1; + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err0;//kein Datenlistebereich + + L 128; + >I; + SPB Err0;//kein Datenlistebereich + + L 1; + L #Listenlaenge;//Max.Anzahl von Datenblöcken + >I; + SPB Err0;//kein Datenlistebereich + + L 1; + L #Stammdaten;//Anzahl der Stammdaten + >I; + SPB Err0;//kein Datenlistebereich + + L 9; + >I; + SPB Err0;//kein Datenlistebereich + + L #Stammdaten;//Anzahl der Stammdaten + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err0;//kein Datenlistebereich + + L #Listenlaenge;//Länge der Datenliste + L #Datensatzlaenge;//Datenblocklänge + *I; + L 2;//DB byteorientiert + *I; + + 20;//Speichern ab 10.DW + L #SSDW; + +I; + T #Datenlisten_Ende; + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #DBDatenliste]; + + L #Datenlisten_Ende; + L #SFC_DB_LENGTH; + >I;//Datenlisten-DB ist zu kurz! + SPB Err0;//kein Datenlisten-Bereich + + L DBW[ #AR1Zeiger]; + L 16#DAEE;//Datenliste-Endekennung ? + <>I;//Nein ! + U(; + TAK; + L 16#DBEE;//Sort-Datenliste-Endekennung ? + <>I;//Nein ! + ); + SPB Err0;//kein Datenlisten-Bereich + + L #Datensatzlaenge;//Datenblocklänge + L 2; + *I; + T #Datenblock_inBytes;//Datenblocklänge in Bytes + +NETWORK +TITLE = Auftrag kontrollieren + SET; + R #Weitersuchen;//Weitersuchen ist aktiv + R #Offsetsuchen;//Offsetsuchen ist aktiv + L 0;//Vorerst kein Offset + T #OffsetDaten_1; + + L #PARA; + T %LW40 ;//Aufrufparameter zwischenspeichern + + L 16#00;//XX = 00 ? + L #Para1; + ==I;//Ja! + SPB W401; + + L 16#E1;//XX = E1 ? + ==I;//Ja! + SPB Err3;//Falscher Aufrufparameter + + L 16#F1;//XX = F1 ? + L #Para1; + <>I;//Nein ! + SPB W400; + + L #Para2; + L 16#00; + <>I; + SPB Err3;//Falscher Aufrufparameter + + SET; + S #Weitersuchen; + + L #SSDW; + + 20; + T #Suchzeiger; + + SPA Nw08;//OutDaten ok ? + +W400: L 16#FF;//XX = FF ? + <>I;//Nein ! + SPB W403; + + L #Para2; + L 16#00; + <>I; + SPB Err3;//Falscher Aufrufparameter + + SET; + S #Weitersuchen; + + L #Suchzeiger;//Alter Suchzeiger + L #Datenblock_inBytes;//Datenblocklänge in bytes + +I;//Nächsten Datensatz suchen + T #Suchzeiger;//Neuer Suchzeiger + + L #Datenblock_inBytes;//Datenblocklänge in bytes + L #Listenlaenge;//Alle möglichen Einträge + *I;//Gesamtlänge + L #SSDW;//Startpunkt + +I; + + 20;//Offset 1.Daten + L #Suchzeiger;//Schreibzeiger + >I;//Noch nicht am Ende ! + SPB Nw08;//OutDaten ok ? + + SPA Err2;//Listenende erreicht + +W403: L 16#02;//XX < 02 ? + L #Para1; + >I;//Ja! + SPB Err3;//Falscher Aufrufparameter + + L 16#80;//XX > 80 ? + >I;//Ja! + SPB Err3;//Falscher Aufrufparameter + + TAK; + L #Datensatzlaenge;//XX > Datensatzlänge + >I;//Ja! + SPB Err3;//Falscher Aufrufparameter + + TAK; + + -1;//Angegebener Offset -1 + L 2;//DB byteorientiert + *I; + T #OffsetDaten_1;//Richtiger Offset der 1.Stammdaten + + L 0; + T #Suchzeiger;//Suche ab Anfang + + SET; + S #Offsetsuchen; + +W401: L 16#00;//=0 ? + L #Para2;//2.Aufrufparameter + ==I;//Ja ! + SPB W402; + + T #Stammdaten;//Anzahl der Stammdaten + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err3;//Falscher Aufrufparameter + + L 1; + L #Stammdaten;//Anzahl der Stammdaten + >I; + SPB Err3;//Falscher Aufrufparameter + + L 9; + >I; + SPB Err3;//Falscher Aufrufparameter + +W402: UN #Offsetsuchen; + SPB Nw05; + + L #Para1;//Offset + + -1; + L #Stammdaten; + +I;//Letzte Stammdaten zu groß ? + L #Datensatzlaenge; + >I;//Ja! + SPB Err3;//Falscher Aufrufparameter + +NETWORK +TITLE = Suchdaten definiert ? +//Such-DATEN-Pointer übernehmen: +Nw05: L #AnzahlEintraege;//Anzahl der eingetragenen Datensätze + L 0;//Eintrag vorhanden ? + ==I;//Nein ! + SPB Err6;//Datensatz ist nicht vorhanden + + L 0; + T #Suchzeiger;//Suchzeiger + + L P##SEARCHDATEN; + LAR2; + + L W[ AR2, P#0.0]; + T #DBSuchDaten;//Suchdaten-DB + L D[ AR2, P#2.0];//Kennung, Adresse + T #SuchDaten_Pointer; + + L #DBSuchDaten;//Suchdaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB W501; + +// CALL TEST_DB +// DB_NUMBER :=#DBSuchDaten +// RET_VAL :=#SFC_RET_VAL +// DB_LENGTH :=#SFC_DB_LENGTH +// WRITE_PROT :=#SFC_WRITE_PROT + + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #DBSuchDaten , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000;//Fehler vorhanden ? + <>I;//Ja ! + SPB Err4;//Undefinierte Stammdaten + + L D[ AR2, P#2.0];//Kennung, Adresse + L 16#00FF_FFFF;//Ohne Kennung + UW; + SRW 3;//Ohne Bit + T #SuchDaten_Startpunkt; + + L #Datensatzlaenge;//Datenblocklänge + L 2;//DB byteorientiert + *I; + L #SuchDaten_Startpunkt; + +I; + L #SFC_DB_LENGTH; + >I;//Suchdaten-DB ist zu kurz + SPB Err4;//Undefinierte Stammdaten + +W501: L #SuchDaten_Pointer; + LAR2; + + L #DBSuchDaten;//Suchdaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB W502; + + AUF DB[ #DBSuchDaten]; + +W502: L W[ AR2, P#0.0];//Suchdaten überprüfen + T #Daten_1;//1.Suchdaten speichern + + L #Stammdaten; +L500: T #Schleife; + + L #DBSuchDaten;//Suchdaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB W503; + + AUF DB[ #DBSuchDaten]; + +W503: L W[ AR2, P#0.0];//Suchdaten überprüfen + L 0;//Etwas angegeben ? + <>I;//Ja ! + SPB Nw07;//Weiter + + +AR2 P#2.0; + + L #Schleife; + LOOP L500; + + SPA Err4;//Undefinierte Stammdaten + +NETWORK +TITLE = Kontrolle auf gleiche Stammdaten +Nw07: L #Suchzeiger;//Suchzeiger + L 0;//Angegeben ? + ==I;//Nein ! + SPB W700;//Suche bei 1.Datensatz beginnen + + L #Suchzeiger;//Suchzeiger + + -20;//Zeiger 1.Daten + L #Datenblock_inBytes;//Datenblocklänge in Bytes + /I;//Ermittlung der wievielten Daten -1 + SRD 16;//Rest ermitteln + L 0;//= 0 ? + <>I;//Suchzeiger nicht im Raster ! + SPB W700;//Suche bei 1.Datensatz beginnen + + L 0;//Bei angegebener Stelle suchen + T #Suchstelle;//Such bei X-ten Datensatz + + SPA W701; + +W700: L 1;//Suche bei 1.Datensatz beginnen + T #Suchstelle;//Such bei X-ten Datensatz + L #SSDW; + + 20;//Offset für 1.Daten + T #Suchzeiger;//Suchzeiger + +W701: L #Suchzeiger;//Suchzeiger + L #OffsetDaten_1;//Richtiger Offset der 1.Stammdaten + +I; + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + L #SuchDaten_Pointer; + LAR2; + + L #Stammdaten;//Anzahl der Stammdaten +L700: T #Schleife; + + L #DBSuchDaten;//Suchdaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB W702; + + AUF DB[ #DBSuchDaten]; + +W702: L W[ AR2, P#0.0];//Suchdaten überprüfen mit + AUF DB[ #DBDatenliste]; + L DBW[ #AR1Zeiger];//Datenliste-Daten lesen + <>I;//nicht identisch ! + SPB W703; + + L #AR1Zeiger; + SRD 3; + L 2; + +D; + SLD 3; + T #AR1Zeiger; + + +AR2 P#2.0; + + L #Schleife; + LOOP L700; + + L 2#0000_0000_1000_0000;//Daten sind vorhanden + T #tRE_VAL;//Ok-Status + + SPA Nw08;//Datensatz ist in Liste enthalten + +W703: L 0;//Suche bei 1.Datensatz begonnen + L #Suchstelle;//Such bei X-ten Datensatz + ==I;//Nein ! + SPB W700; + + L #Suchstelle;//Such bei X-ten Datensatz + + 1; + T #Suchstelle;//Such bei X-ten Datensatz + L #AnzahlEintraege;//Anzahl der eingetragenen Datensätze + <=I;//Alle Datensätze sind durchsucht + SPB W705;//Nein ! + + SPA Err6;//Datensatz ist nicht vorhanden + +W705: L #Datenblock_inBytes;//Datenblocklänge in bytes + L #Suchzeiger;//Suchzeiger + +I; + T #Suchzeiger;//Suchzeiger + SPA W701; + +NETWORK +TITLE = Outdaten ok ? +//Out-DATEN-Pointer übernehmen: +Nw08: L P##OUTDATEN; + LAR2; + + L W[ AR2, P#0.0]; + T #DBOutDaten;//Outdaten-DB + L D[ AR2, P#2.0];//Kennung, Adresse + T #OutDaten_Pointer; + + L #DBOutDaten;//Outdaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB Nw09; + +// CALL TEST_DB +// DB_NUMBER :=#DBOutDaten +// RET_VAL :=#SFC_RET_VAL +// DB_LENGTH :=#SFC_DB_LENGTH +// WRITE_PROT :=#SFC_WRITE_PROT + + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #DBOutDaten , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000;//Fehler vorhanden ? + <>I;//Ja ! + SPB Err5;//Undefinierte Outdaten + + L D[ AR2, P#2.0];//Kennung, Adresse + L 16#00FF_FFFF;//Ohne Kennung + UW; + SRW 3;//Ohne Bit + T #OutDaten_Startpunkt; + + L #OutDaten_Startpunkt; + L #SFC_DB_LENGTH; + >I;//Outdaten-DB ist zu kurz + SPB Err5;//Undefinierte Outdaten + +NETWORK +TITLE = Daten aus Datenliste lesen (in OUTDaten übergeben) +//Quelle-Pointer erzeugen: +Nw09: L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L #Datensatzlaenge;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//DATEN-Pointer übernehmen: + L #SSDB; + T %LW4;//DB_Nummer + L #Suchzeiger;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: +//Kennung + Datenbytes s.o. + + L #DBOutDaten; + T %LW14;//DB_Nummer + L #OutDaten_Pointer; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := #Ziel + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + + L #SSDW; + + 12;//im 12.DW speichern + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + L #Suchzeiger;//Suchzeiger + AUF DB[ #DBDatenliste]; + T DBW[ #AR1Zeiger];//Speicherung letzter Zugriff + + L #Suchzeiger;//Suchzeiger + + -20;//Offeset 1.DS + L #Datenblock_inBytes;//Datenblocklänge in Bytes + /I; + + 1;//Position errechnen + T #Position;//Daten stehen an angegebener Position in Datenbank + +NETWORK +TITLE = Weitersuchen aktiv ? Datensatz vorhanden oder 0 ? + UN #Weitersuchen; + SPB Ende; + + L #OutDaten_Pointer; + LAR2; + + L #Datensatzlaenge; +L110: T #Schleife; + + L #DBOutDaten;//Outdaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB W111; + + AUF DB[ #DBOutDaten]; + +W111: L W[ AR2, P#0.0];//Outdaten überprüfen + L 0;//Etwas angegeben ? + <>I;//Ja ! + SPB W112;//Ok + + +AR2 P#2.0; + + L #Schleife; + LOOP L110; + + L 2#0000_0000_0100_0000;//Daten sind nicht vorhanden + T #tRE_VAL;//Ok-Status + SPA Ende; + +W112: L 2#0000_0000_1000_0000;//Daten sind vorhanden + T #tRE_VAL;//Ok-Status + SPA Ende; + +NETWORK +TITLE = Fehlerausgabe / RET_VAL +Ende: SET;//VKE = 1 ohne Fehler !!! + L #tRE_VAL;//Ok-Status + SPA Ok; +Err0: L 2#0000_0000_0000_0001;//Kein Datenlistebereich + SPA Err; +Err1: L 2#0000_0000_0000_0010;//SFC20-Aufruf mit Fehler + SPA Err; +Err2: L 2#0000_0000_0000_0100;//Listenende ist erreicht + SPA Err; +Err3: L 2#0000_0000_0000_1000;//Falscher Parameter bei Aufruf + SPA Err; +Err4: L 2#0000_0000_0001_0000;//Undefinierte Suchdaten + SPA Err; +Err5: L 2#0000_0000_0010_0000;//Undefinierte OUTDaten + SPA Err; +Err6: L 2#0000_0000_0100_0000;//Datensatz nicht vorhanden + +Err: CLR;//VKE = 0 bei Fehler !!! + +Ok: T #tRE_VAL; + SAVE;//VKE in BIE-Bit speichern + + L #AR2_Speicher;//AR2 zurückspeichern + LAR2; + +NETWORK +TITLE = + L #tRE_VAL; + T #RE_VAL; + + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Module/DatenIn.awl b/=A01+UH07-KF00/Programmbausteine/Module/DatenIn.awl index e1268c1..86a5096 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/DatenIn.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/DatenIn.awl @@ -1,552 +1,620 @@ -=== FC 85: DatenIn [STL] === -INTERFACE: - Input: - SSDB : Int // Datenlisten-DB - SSDW : Int // Datenlisten-1.DW - INDATEN : Pointer // InDaten-Schnittstelle - Output: - RE_VAL : Byte - InOut: - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Kopf : Byte // Datenliste-Kennnung (DA) - Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128 - Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze) - Stammdaten : Int // Stammdatenlänge in Word (1 - 9) - IndDB : Word // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) - IndDB_Laenge : Int // Länge des indizierten DB in Einträge (nur bei Stammdaten = 1 erlaubt !!!) - IndDaten_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) - Schreibzeiger : Int // Speicherung des letzten Zugriffs / Schreibzeiger - Belegt14 : Int // reserviert von Sort-Datenliste - AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!) - Reserve18 : Int // Reserve - DBDatenliste : Word // Datenlisten-DB - SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf - SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf - Datenlisten_Ende : Word // Ende der Datenliste - AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern - Schleife : Word // Loopzähler - DBInDaten : Word // Indaten-DB, falls angegeben - InDaten_Pointer : DWord // In-Daten-Pointer: Kennung, Adresse - InDaten_Startpunkt : Word // In-Daten-Startpunkt: Adresse - IndPointer : DWord // Zeiger für IndDB - Daten_1 : Word // 1.Datenwort der Indaten - Daten_2 : DWord // 1+2.Datenwort der Indaten (falls ind.Suchen mit Stammdaten 2) - LeerZeiger : Word // Zeiger für Leerzelle - Datenblock_inBytes : Word // Datenblocklänge in Bytes - Suchstelle : Word // Bei angegebenen Datensatz suchen - SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf - Indok : Bool // Indizierung möglich - IndZeiger_ok : Bool // Indizier-Zeiger angegeben - Sortliste : Bool // Sortliste wird durchsucht - tRE_VAL : Byte // Rückmeldung - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - DB_Länge : Int - Wandel_FC : Word // Wandel-FC - Constant: - Return: - Ret_Val : Void - ---- NW 1: Schnittstellen-DB sinnvoll ? --- - TAR2 - T AR2_Speicher // AR2 zwischenspeichern - - L SSDB - T DBDatenliste - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - -CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge") - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - O SFC_WRITE_PROT - JC Err0 // kein Datenlisten-Bereich - - ---- NW 2: Quelle-Pointer erzeugen: --- - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 16#000A // 10 Dw´s holen - T LW2 // Wiederholungen - L SSDB - T LW4 // DB_Nummer - L SSDW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 - - ---- NW 3: Zeigerüberprüfung --- - L Kopf // Datenliste-Kopf - L 16#DB // = Sort-Datenlistekennung ? - ==I // Ja ! - = Sortliste // Sortliste wird durchsucht - JC w030 - - CAC - L 16#DA // = Datenlistekennung ? - <>I // Nein ! - JC Err0 // kein Datenlistebereich - -w030: L 1 - L Datensatzlaenge // Datenblocklänge - >I - JC Err0 // kein Datenlistebereich - - L 128 - >I - JC Err0 // kein Datenlistebereich - - L 1 - L Listenlaenge // Max.Anzahl von Datenblöcken - >I - JC Err0 // kein Datenlistebereich - - L 1 - L Stammdaten // Anzahl der Stammdaten - >I - JC Err0 // kein Datenlistebereich - - L 9 - >I - JC Err0 // kein Datenlistebereich - - L Stammdaten // Anzahl der Stammdaten - L Datensatzlaenge // Datenblocklänge - >I - JC Err0 // kein Datenlistebereich - - L Listenlaenge // Länge der Datenliste - L Datensatzlaenge // Datenblocklänge - *I - L 2 // DB byteorientiert - *I - + 20 // Speichern ab 10.DW - L SSDW - +I - T Datenlisten_Ende - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[DBDatenliste] - - L Datenlisten_Ende - L "DB_Länge" - >I // Datenlisten-DB ist zu kurz! - JC Err0 // kein Datenlisten-Bereich - - L DBW [AR1Zeiger] - L 16#DAEE // Datenliste-Endekennung ? - <>I // Nein ! - A( - CAC - L 16#DBEE // Sort-Datenliste-Endekennung ? - <>I // Nein ! - ) - JC Err0 // kein Datenlisten-Bereich - - L Datensatzlaenge // Datenblocklänge - L 2 - *I - T Datenblock_inBytes // Datenblocklänge in Bytes - - ---- NW 4: In-DATEN-Pointer übernehmen: --- - L P# - LAR2 - - L NoneW [AR2,] - T DBInDaten // Indaten-DB - - L DBInDaten // Indaten-DB - L 0 // Angegeben ? - ==I // Nein - JC W401 - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBInDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - -CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge") - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 // Fehler vorhanden ? - <>I // Ja ! - JC Err4 // Undefinierte Indaten - - L NoneD [AR2,] // Kennung, Adresse - L 16#00FF_FFFF // Ohne Kennung - AW - SRW 3 // Ohne Bit - T InDaten_Startpunkt - - L Datensatzlaenge // Datenblocklänge - L 2 // DB byteorientiert - *I - L InDaten_Startpunkt - +I - L "DB_Länge" - >I // Indaten-DB ist zu kurz - JC Err4 // Undefinierte Indaten - -W401: L NoneD [AR2,] // Kennung, Adresse - T InDaten_Pointer - LAR2 - - L DBInDaten // Indaten-DB - L 0 // Angegeben ? - ==I // Nein - JC W402 - - OPN DB[DBInDaten] - -W402: L NoneW [AR2,] // Indaten überprüfen - T Daten_1 // 1.Indaten speichern - L NoneD [AR2,] // Suchdaten überprüfen - T Daten_2 // 1.Suchdaten speichern - - L Stammdaten -L400: T Schleife - - L DBInDaten // Indaten-DB - L 0 // Angegeben ? - ==I // Nein - JC W403 - - OPN DB[DBInDaten] - -W403: L NoneW [AR2,] // Indaten überprüfen - L 0 // Etwas angegeben ? - <>I // Ja ! - JC Nw05 // Weiter - - ADDAR2 P#2.0 - - L Schleife - LOOP L400 - - JU Err4 // Undefinierte Indaten - - ---- NW 5: Indiziert speichern ? --- -Nw05: SET - R Indok // Indizierung möglich - R IndZeiger_ok // Indizier-Zeiger angegeben - - L IndDB // Indizierter DB - L 0 // Angegeben ? - ==I // Nein ! - O Sortliste // Sortliste wird durchsucht - JC Nw06 - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=IndDB, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - -CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge") - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - O SFC_WRITE_PROT - JC Nw06 // kein Indizier-DB vorhanden - - - L IndDB_Laenge // Länge des Indizierten DB überschritten ? - L 2 // DB byteorientiert - *I - L "DB_Länge" - >I // Indizier-DB ist zu kurz - JC Nw06 // Zeiger ausserhalb Ind.DB - - L Stammdaten // Stammdaten - L 3 // zu viele Stammdaten ? - >=I // Ja ! - JC Nw06 // ohne Indizierung weiter - - L IndDaten_FC // Offset zum Abziehen - T Wandel_FC - L 0 // Parameter vorhanden ? - <=I // Nein - JC NoFC // Bei diesem Schritt weiter - - L Daten_1 // Stammdaten (1.DW) - T "MW90" // übergeben - L Daten_2 // Stammdaten (2.DW) - T "MD94" // übergeben - - UC DB[Wandel_FC] // Beeinflussung der Weiterfahrt - - L "MW92" // Rückwert von FC - - JU Ret - -NoFC: L Daten_1 // Stammdaten -Ret: T IndPointer // Stelle, wo Zeiger hinterlegt ist - L 0 - I // Schreibzeiger nicht im Raster ! - JC W600 // Suche bei 1.Datensatz beginnen - - L 0 // Bei angegebener Stelle suchen - T Suchstelle // Such bei X-ten Datensatz - - JU W601 - -W600: L 1 // Suche bei 1.Datensatz beginnen - T Suchstelle // Such bei X-ten Datensatz - SET - R IndZeiger_ok // Indizier-Zeiger angegeben - L SSDW - + 20 // Offset für 1.Daten - T Schreibzeiger // Schreibzeiger - -W601: L Schreibzeiger // Schreibzeiger - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - L InDaten_Pointer - LAR2 - - L Stammdaten // Anzahl der Stammdaten -L600: T Schleife - - L DBInDaten // Indaten-DB - L 0 // Angegeben ? - ==I // Nein - JC W602 - - OPN DB[DBInDaten] - -W602: L NoneW [AR2,] // Indaten überprüfen mit - OPN DB[DBDatenliste] - L DBW [AR1Zeiger] // Datenliste-Daten lesen - <>I // nicht identisch ! - JC W603 - - L AR1Zeiger - SRD 3 - L DINT#2 - +D - SLD 3 - T AR1Zeiger - - ADDAR2 P#2.0 - - L Schleife - LOOP L600 - - L 2#0000_0000_1100_0000 // Daten werden gespeichert + überschrieben - T tRE_VAL // Ok-Status - - JU Nw07 // Datensatz ist in Liste enthalten - -W603: L 0 // Suche bei 1.Datensatz begonnen - L Suchstelle // Such bei X-ten Datensatz - ==I // Nein ! - JC W600 - - L LeerZeiger // Zeiger Leerzelle - L 0 // Gespeichert ? - <>I // Ja ! - JC W604 - - L Schreibzeiger // Schreibzeiger - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - L Datensatzlaenge -L601: T Schleife - L DBW [AR1Zeiger] // Daten lesen - L 0 // Leerzelle ? - <>I // Nein ! - JC W604 - - L AR1Zeiger - SRD 3 - L DINT#2 - +D - SLD 3 - T AR1Zeiger - - L Schleife - LOOP L601 - - L Schreibzeiger // Schreibzeiger - T LeerZeiger // Zeiger Leerzelle - -W604: L Suchstelle // Such bei X-ten Datensatz - + 1 - T Suchstelle // Such bei X-ten Datensatz - L Listenlaenge // Anzahl aller Daten in Datenliste - <=I // Alle Datensätze sind durchsucht - JC W605 // Nein ! - - L 0 // Gefunden ? - L LeerZeiger // Zeiger Leerzelle - ==I // Nein ! - JC Err2 // Datenliste ist voll - - T Schreibzeiger // Schreibzeiger - L 2#0000_0000_1000_0000 // Daten werden gespeichert - T tRE_VAL // Ok-Status - - JU Nw07 - -W605: L Datenblock_inBytes // Datenblocklänge in bytes - L Schreibzeiger // Schreibzeiger - +I - T Schreibzeiger // Schreibzeiger - JU W601 - - ---- NW 7: Quelle-Pointer erzeugen: --- -Nw07: L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L Datensatzlaenge // Datenwords speichern - T LW2 - T LW12 // Wiederholungen - -// DATEN-Pointer übernehmen: - L DBInDaten - T LW4 // DB_Nummer - L InDaten_Pointer - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: -// Kennung + Datenbytes s.o. - - L SSDB - T LW14 // DB_Nummer - L Schreibzeiger // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 - - A Sortliste // Sortliste wird durchsucht - JC Nw8 - - L SSDW - + 12 - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - L Schreibzeiger // Schreibzeiger - OPN DB[DBDatenliste] - T DBW [AR1Zeiger] // Speicherung letzter Zugriff - - L tRE_VAL // Ok-Status - L 2#0000_0000_1100_0000 // Daten werden gespeichert + überschrieben ? - ==I // Ja ! - O Indok // Indizierung möglich ((Dann nicht!) - JC Nw8 // Kein Neueintrag ! - - L SSDW - + 16 // Offset Anzahl Einträge - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[DBDatenliste] - L DBW [AR1Zeiger] // Anzahl der Einträge - + 1 // Einträge +1 - T DBW [AR1Zeiger] // Anzahl der Einträge - - ---- NW 8: Indizierung ok ? --- -Nw8: AN Indok // Indizierung möglich - O IndZeiger_ok // Indizier-Zeiger angegeben - JC Ende - - OPN DB[IndDB] // Indizierter DB - - L Schreibzeiger // Schreibzeiger - T DBW [IndPointer] - - OPN DB[DBDatenliste] // Datenliste DB - - ---- NW 9: Fehlerausgabe / RET_VAL --- -Ende: SET // VKE = 1 ohne Fehler !!! - L tRE_VAL // Ok-Status - JU Ok -Err0: L 2#0000_0000_0000_0001 // Kein Datenlistebereich - JU Err -Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler - JU Err -Err2: L 2#0000_0000_0000_0100 // Datenliste ist voll - JU Err -Err4: L 2#0000_0000_0001_0000 // Undefinierte Indaten - -Err: CLR // VKE = 0 bei Fehler !!! - -Ok: T tRE_VAL - SAVE // VKE in BIE-Bit speichern - - L AR2_Speicher // AR2 zurückspeichern - LAR2 - - ---- NW 10: Ausgangsvariablen schreiben --- - L tRE_VAL - T RE_VAL - +FUNCTION "DatenIn" : Void +TITLE = Datenlisten-Modul +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +FAMILY : DLISTE +NAME : DatenIn +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-1254 +//Version: P&O / 10.2024 +//Version: ILS2100 / 06.11.2009 +// +//Datenblock in Datenliste eintragen +//SSDB: Datenlisten-DB +//SSDW: Datenlisten-1.DW +//INDATEN: Pointer, wo einzutragende Daten stehen (P#DB1.DBX0.0, P#M220.0) +//RE_VAL: Rückmeldungen: +// Bit0: Kein Datenlistenbereich / falscher Kopfinhalt / Endekennung +// Bit1: SFC20-Aufruf mit Fehler +// Bit2: Liste ist voll +// Bit3: Frei +// Bit4: Undefinierte Indaten +// Bit5: Frei +// Bit6: Daten wurden überschrieben +// Bit7: Eintrag ist richtig erfolgt +// + VAR_INPUT + SSDB : Int; // Datenlisten-DB + SSDW : Int; // Datenlisten-1.DW + INDATEN : Pointer; // InDaten-Schnittstelle + END_VAR + + VAR_OUTPUT + RE_VAL : Byte; + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Kopf : Byte; // Datenliste-Kennnung (DA) + Datensatzlaenge : Byte; // Datensatzlänge in Word (01 - F0) F0=128 + Listenlaenge : Int; // Länge der Datenliste (maximale Anzahl der Datensätze) + Stammdaten : Int; // Stammdatenlänge in Word (1 - 9) + IndDB : Word; // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) + IndDB_Laenge : Int; // Länge des indizierten DB in Einträge (nur bei Stammdaten = 1 erlaubt !!!) + IndDaten_FC : Int; // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) + Schreibzeiger : Int; // Speicherung des letzten Zugriffs / Schreibzeiger + Belegt14 : Int; // reserviert von Sort-Datenliste + AnzahlEintraege : Int; // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!) + Reserve18 : Int; // Reserve + DBDatenliste : Word; // Datenlisten-DB + SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf + SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf + Datenlisten_Ende : Word; // Ende der Datenliste + AR2_Speicher : DWord; // Adress-Register 2 zwischenspeichern + Schleife : Word; // Loopzähler + DBInDaten : Word; // Indaten-DB, falls angegeben + InDaten_Pointer : DWord; // In-Daten-Pointer: Kennung, Adresse + InDaten_Startpunkt : Word; // In-Daten-Startpunkt: Adresse + IndPointer : DWord; // Zeiger für IndDB + Daten_1 : Word; // 1.Datenwort der Indaten + Daten_2 : DWord; // 1+2.Datenwort der Indaten (falls ind.Suchen mit Stammdaten 2) + LeerZeiger : Word; // Zeiger für Leerzelle + Datenblock_inBytes : Word; // Datenblocklänge in Bytes + Suchstelle : Word; // Bei angegebenen Datensatz suchen + SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf + Indok : Bool; // Indizierung möglich + IndZeiger_ok : Bool; // Indizier-Zeiger angegeben + Sortliste : Bool; // Sortliste wird durchsucht + tRE_VAL : Byte; // Rückmeldung + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + DB_Länge : Int; + Wandel_FC : Word; // Wandel-FC + END_VAR + + +BEGIN +NETWORK +TITLE = Schnittstellen-DB sinnvoll ? + TAR2; + T #AR2_Speicher;//AR2 zwischenspeichern + + L #SSDB; + T #DBDatenliste; + + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #DBDatenliste , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + + CALL "BCD (4stellig)_to_INT" + ( BCD_Wert := #SFC_DB_LENGTH , + Int_Wert := #DB_Länge + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + O #SFC_WRITE_PROT; + SPB Err0;//kein Datenlisten-Bereich + +NETWORK +TITLE = Datenlistekopf holen +//Quelle-Pointer erzeugen: + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 16#000A;//10 Dw´s holen + T %LW2;//Wiederholungen + L #SSDB; + T %LW4;//DB_Nummer + L #SSDW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//1.-10.DW Datenliste holen + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := P#L20.0 WORD 10 + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + +NETWORK +TITLE = Zeigerüberprüfung + L #Kopf;//Datenliste-Kopf + L 16#DB;//= Sort-Datenlistekennung ? + ==I;//Ja ! + = #Sortliste;//Sortliste wird durchsucht + SPB w030; + + TAK; + L 16#DA;//= Datenlistekennung ? + <>I;//Nein ! + SPB Err0;//kein Datenlistebereich + +w030: L 1; + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err0;//kein Datenlistebereich + + L 128; + >I; + SPB Err0;//kein Datenlistebereich + + L 1; + L #Listenlaenge;//Max.Anzahl von Datenblöcken + >I; + SPB Err0;//kein Datenlistebereich + + L 1; + L #Stammdaten;//Anzahl der Stammdaten + >I; + SPB Err0;//kein Datenlistebereich + + L 9; + >I; + SPB Err0;//kein Datenlistebereich + + L #Stammdaten;//Anzahl der Stammdaten + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err0;//kein Datenlistebereich + + L #Listenlaenge;//Länge der Datenliste + L #Datensatzlaenge;//Datenblocklänge + *I; + L 2;//DB byteorientiert + *I; + + 20;//Speichern ab 10.DW + L #SSDW; + +I; + T #Datenlisten_Ende; + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #DBDatenliste]; + + L #Datenlisten_Ende; + L #DB_Länge; + >I ;//Datenlisten-DB ist zu kurz! + SPB Err0;//kein Datenlisten-Bereich + + L DBW[ #AR1Zeiger]; + L 16#DAEE ;//Datenliste-Endekennung ? + <>I;//Nein ! + U(; + TAK; + L 16#DBEE;//Sort-Datenliste-Endekennung ? + <>I;//Nein ! + ); + SPB Err0;//kein Datenlisten-Bereich + + L #Datensatzlaenge;//Datenblocklänge + L 2; + *I; + T #Datenblock_inBytes;//Datenblocklänge in Bytes + +NETWORK +TITLE = Indaten definiert ? +//In-DATEN-Pointer übernehmen: + L P##INDATEN; + LAR2; + + L W[ AR2, P#0.0]; + T #DBInDaten;//Indaten-DB + + L #DBInDaten;//Indaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB W401; + + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #DBInDaten , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + + CALL "BCD (4stellig)_to_INT" + ( BCD_Wert := #SFC_DB_LENGTH , + Int_Wert := #DB_Länge + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000;//Fehler vorhanden ? + <>I;//Ja ! + SPB Err4;//Undefinierte Indaten + + L D[ AR2, P#2.0];//Kennung, Adresse + L 16#00FF_FFFF;//Ohne Kennung + UW; + SRW 3;//Ohne Bit + T #InDaten_Startpunkt; + + L #Datensatzlaenge;//Datenblocklänge + L 2;//DB byteorientiert + *I; + L #InDaten_Startpunkt; + +I; + L #DB_Länge; + >I;//Indaten-DB ist zu kurz + SPB Err4;//Undefinierte Indaten + +W401: L D[ AR2, P#2.0];//Kennung, Adresse + T #InDaten_Pointer; + LAR2; + + L #DBInDaten;//Indaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB W402; + + AUF DB[ #DBInDaten]; + +W402: L W[ AR2, P#0.0];//Indaten überprüfen + T #Daten_1;//1.Indaten speichern + L D[ AR2, P#0.0] ;//Suchdaten überprüfen + T #Daten_2 ;//1.Suchdaten speichern + + L #Stammdaten; +L400: T #Schleife; + + L #DBInDaten;//Indaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB W403; + + AUF DB[ #DBInDaten]; + +W403: L W[ AR2, P#0.0];//Indaten überprüfen + L 0;//Etwas angegeben ? + <>I;//Ja ! + SPB Nw05;//Weiter + + +AR2 P#2.0; + + L #Schleife; + LOOP L400; + + SPA Err4;//Undefinierte Indaten + +NETWORK +TITLE = Indiziert speichern ? +Nw05: SET; + R #Indok;//Indizierung möglich + R #IndZeiger_ok;//Indizier-Zeiger angegeben + + L #IndDB;//Indizierter DB + L 0;//Angegeben ? + ==I;//Nein ! + O #Sortliste;//Sortliste wird durchsucht + SPB Nw06; + + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #IndDB , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + + CALL "BCD (4stellig)_to_INT" + ( BCD_Wert := #SFC_DB_LENGTH , + Int_Wert := #DB_Länge + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + O #SFC_WRITE_PROT; + SPB Nw06;//kein Indizier-DB vorhanden + + + L #IndDB_Laenge;//Länge des Indizierten DB überschritten ? + L 2;//DB byteorientiert + *I; + L #DB_Länge; + >I ;//Indizier-DB ist zu kurz + SPB Nw06;//Zeiger ausserhalb Ind.DB + + L #Stammdaten;//Stammdaten + L 3 ;//zu viele Stammdaten ? + >=I ;//Ja ! + SPB Nw06 ;//ohne Indizierung weiter + + L #IndDaten_FC;//Offset zum Abziehen + T #Wandel_FC; + L 0;//Parameter vorhanden ? + <=I;//Nein + SPB NoFC;//Bei diesem Schritt weiter + + L #Daten_1 ;//Stammdaten (1.DW) + T "MW90";//übergeben + L #Daten_2 ;//Stammdaten (2.DW) + T "MD94" ;//übergeben + + UC FC[ #Wandel_FC];//Beeinflussung der Weiterfahrt + + L "MW92";//Rückwert von FC + + SPA Ret; + +NoFC: L #Daten_1;//Stammdaten +Ret: T #IndPointer;//Stelle, wo Zeiger hinterlegt ist + L 0; + I;//Schreibzeiger nicht im Raster ! + SPB W600;//Suche bei 1.Datensatz beginnen + + L 0;//Bei angegebener Stelle suchen + T #Suchstelle;//Such bei X-ten Datensatz + + SPA W601; + +W600: L 1;//Suche bei 1.Datensatz beginnen + T #Suchstelle;//Such bei X-ten Datensatz + SET; + R #IndZeiger_ok;//Indizier-Zeiger angegeben + L #SSDW; + + 20;//Offset für 1.Daten + T #Schreibzeiger;//Schreibzeiger + +W601: L #Schreibzeiger;//Schreibzeiger + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + L #InDaten_Pointer; + LAR2; + + L #Stammdaten;//Anzahl der Stammdaten +L600: T #Schleife; + + L #DBInDaten;//Indaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB W602; + + AUF DB[ #DBInDaten]; + +W602: L W[ AR2, P#0.0];//Indaten überprüfen mit + AUF DB[ #DBDatenliste]; + L DBW[ #AR1Zeiger] ;//Datenliste-Daten lesen + <>I ;//nicht identisch ! + SPB W603; + + L #AR1Zeiger; + SRD 3; + L DINT#2; + +D; + SLD 3; + T #AR1Zeiger; + + +AR2 P#2.0; + + L #Schleife; + LOOP L600; + + L 2#0000_0000_1100_0000;//Daten werden gespeichert + überschrieben + T #tRE_VAL;//Ok-Status + + SPA Nw07;//Datensatz ist in Liste enthalten + +W603: L 0;//Suche bei 1.Datensatz begonnen + L #Suchstelle;//Such bei X-ten Datensatz + ==I;//Nein ! + SPB W600; + + L #LeerZeiger;//Zeiger Leerzelle + L 0;//Gespeichert ? + <>I;//Ja ! + SPB W604; + + L #Schreibzeiger;//Schreibzeiger + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + L #Datensatzlaenge; +L601: T #Schleife; + L DBW[ #AR1Zeiger] ;//Daten lesen + L 0;//Leerzelle ? + <>I;//Nein ! + SPB W604; + + L #AR1Zeiger; + SRD 3; + L DINT#2; + +D; + SLD 3; + T #AR1Zeiger; + + L #Schleife; + LOOP L601; + + L #Schreibzeiger;//Schreibzeiger + T #LeerZeiger;//Zeiger Leerzelle + +W604: L #Suchstelle;//Such bei X-ten Datensatz + + 1; + T #Suchstelle;//Such bei X-ten Datensatz + L #Listenlaenge;//Anzahl aller Daten in Datenliste + <=I;//Alle Datensätze sind durchsucht + SPB W605;//Nein ! + + L 0;//Gefunden ? + L #LeerZeiger;//Zeiger Leerzelle + ==I;//Nein ! + SPB Err2;//Datenliste ist voll + + T #Schreibzeiger;//Schreibzeiger + L 2#0000_0000_1000_0000;//Daten werden gespeichert + T #tRE_VAL;//Ok-Status + + SPA Nw07; + +W605: L #Datenblock_inBytes;//Datenblocklänge in bytes + L #Schreibzeiger;//Schreibzeiger + +I; + T #Schreibzeiger;//Schreibzeiger + SPA W601; + +NETWORK +TITLE = Daten in Datenliste schreiben +//Quelle-Pointer erzeugen: +Nw07: L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L #Datensatzlaenge;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//DATEN-Pointer übernehmen: + L #DBInDaten; + T %LW4;//DB_Nummer + L #InDaten_Pointer; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: +//Kennung + Datenbytes s.o. + + L #SSDB; + T %LW14;//DB_Nummer + L #Schreibzeiger;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := #Ziel + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + + U #Sortliste;//Sortliste wird durchsucht + SPB Nw8; + + L #SSDW; + + 12; + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + L #Schreibzeiger;//Schreibzeiger + AUF DB[ #DBDatenliste]; + T DBW[ #AR1Zeiger] ;//Speicherung letzter Zugriff + + L #tRE_VAL ;//Ok-Status + L 2#0000_0000_1100_0000;//Daten werden gespeichert + überschrieben ? + ==I;//Ja ! + O #Indok ;//Indizierung möglich ((Dann nicht!) + SPB Nw8 ;//Kein Neueintrag ! + + L #SSDW; + + 16 ;//Offset Anzahl Einträge + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #DBDatenliste]; + L DBW[ #AR1Zeiger];//Anzahl der Einträge + + 1;//Einträge +1 + T DBW[ #AR1Zeiger];//Anzahl der Einträge + +NETWORK +TITLE = Indizierung ok ? +Nw8: UN #Indok;//Indizierung möglich + O #IndZeiger_ok;//Indizier-Zeiger angegeben + SPB Ende; + + AUF DB[ #IndDB];//Indizierter DB + + L #Schreibzeiger;//Schreibzeiger + T DBW[ #IndPointer]; + + AUF DB[ #DBDatenliste];//Datenliste DB + +NETWORK +TITLE = Fehlerausgabe / RET_VAL +Ende: SET;//VKE = 1 ohne Fehler !!! + L #tRE_VAL;//Ok-Status + SPA Ok; +Err0: L 2#0000_0000_0000_0001;//Kein Datenlistebereich + SPA Err; +Err1: L 2#0000_0000_0000_0010;//SFC20-Aufruf mit Fehler + SPA Err; +Err2: L 2#0000_0000_0000_0100;//Datenliste ist voll + SPA Err; +Err4: L 2#0000_0000_0001_0000;//Undefinierte Indaten + +Err: CLR;//VKE = 0 bei Fehler !!! + +Ok: T #tRE_VAL; + SAVE;//VKE in BIE-Bit speichern + + L #AR2_Speicher;//AR2 zurückspeichern + LAR2; + +NETWORK +TITLE = Ausgangsvariablen schreiben + L #tRE_VAL; + T #RE_VAL; + + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Module/DatenInSort.awl b/=A01+UH07-KF00/Programmbausteine/Module/DatenInSort.awl index 8943c60..8f09d89 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/DatenInSort.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/DatenInSort.awl @@ -1,488 +1,540 @@ -=== FC 88: DatenInSort [STL] === -INTERFACE: - Input: - SSDB : Int // Datenlisten-DB - SSDW : Int // Datenlisten-1.DW - INDATEN : Pointer // InDaten-Schnittstelle - Output: - RE_VAL : Byte // Rückmeldung - InOut: - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Kopf : Byte // Datenliste-Kennnung (DA) - Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128 - Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze) - Stammdaten : Int // Stammdatenlänge in Word (1 - 9) - Belegt06 : Int // reserviert von Datenliste - Belegt08 : Int // reserviert von Datenliste - Belegt10 : Int // reserviert von Datenliste - Belegt12 : Int // reserviert von Datenliste - AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze - Reserve16 : Int // Reserve - Reserve18 : Int // Reserve - DBDatenliste : Word // Datenlisten-DB - SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf - SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf - Datenlisten_Ende : Word // Ende der Datenliste - AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern - Schleife : Word // Loopzähler - DBInDaten : Word // Indaten-DB, falls angegeben - InDaten_Pointer : DWord // In-Daten-Pointer: Kennung, Adresse - InDaten_Startpunkt : Word // In-Daten-Startpunkt: Adresse - Sort_Daten : DInt // Einzusortierende Daten (DWord) - Datenblock_inBytes : Word // Datenblocklänge in Bytes - SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf - Lesestelle : Int // An dieser Stelle Datensatz lesen - Min_Lesestelle : Int // Minimal sinnvolle Lesestelle - Max_Lesestelle : Int // Maximal sinnvolle Lesestelle - Savestelle : Int // An dieser Stelle wird In-Datensatz gespeichert - Lese_Daten : DInt // In Tabelle gelesenen Daten - Holstelle : Int // Freiraum schaffen: Stelle zum Daten holen - Bringstelle : Int // Freiraum schaffen: Stelle zum Daten schreiben - Holzeiger : DWord // Freiraum schaffen: Zeiger zum Daten holen - Bringzeiger : DWord // Freiraum schaffen: Zeiger zum Daten schreiben - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - Constant: - Return: - Ret_Val : Void - ---- NW 1: Schnittstellen-DB sinnvoll ? --- - TAR2 - T AR2_Speicher // AR2 zwischenspeichern - - L SSDB - T DBDatenliste - -// CALL TEST_DB -// DB_NUMBER :=#DBDatenliste -// RET_VAL :=#SFC_RET_VAL -// DB_LENGTH :=#SFC_DB_LENGTH -// WRITE_PROT :=#SFC_WRITE_PROT - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - O SFC_WRITE_PROT - JC Err0 // kein Datenlisten-Bereich - - ---- NW 2: Quelle-Pointer erzeugen: --- - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 16#000A // 10 Dw´s holen - T LW2 // Wiederholungen - L SSDB - T LW4 // DB_Nummer - L SSDW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 - - ---- NW 3: Zeigerüberprüfung --- - L Kopf // Datenliste-Kopf - L 16#DB // = Datenlistekennung ? - <>I // Nein ! - JC Err0 // kein Datenlistebereich - - L 1 - L Datensatzlaenge // Datenblocklänge - >I - JC Err0 // kein Datenlistebereich - - L 128 - >I - JC Err0 // kein Datenlistebereich - - L 1 - L Listenlaenge // Max.Anzahl von Datenblöcken - >I - JC Err0 // kein Datenlistebereich - - L 1 - L Stammdaten // Anzahl der Stammdaten - >I - JC Err0 // kein Datenlistebereich - - L 9 - >I - JC Err0 // kein Datenlistebereich - - L Stammdaten // Anzahl der Stammdaten - L Datensatzlaenge // Datenblocklänge - >I - JC Err0 // kein Datenlistebereich - - L Listenlaenge // Länge der Datenliste - L Datensatzlaenge // Datenblocklänge - *I - L 2 // DB byteorientiert - *I - + 20 // Speichern ab 10.DW - L SSDW - +I - T Datenlisten_Ende - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[DBDatenliste] - - L Datenlisten_Ende - L SFC_DB_LENGTH - >I // Datenlisten-DB ist zu kurz! - JC Err0 // kein Datenlisten-Bereich - - L DBW [AR1Zeiger] - L 16#DBEE // Datenliste-Endekennung ? - <>I // Nein ! - JC Err0 // kein Datenlisten-Bereich - - L Datensatzlaenge // Datenblocklänge - L 2 - *I - T Datenblock_inBytes // Datenblocklänge in Bytes - - L AnzahlEintraege // Anzahl der eingetragenen Datensätze - L Listenlaenge // Max.Anzahl von Datenblöcken - >=I // Nein ! - JC Err2 // Datenliste ist voll - - ---- NW 4: Indaten definiert ? --- - -// In-DATEN-Pointer übernehmen: - L P# - LAR2 - - L NoneW [AR2,] - T DBInDaten // Indaten-DB - - L DBInDaten // Indaten-DB - L 0 // Angegeben ? - ==I // Nein - JC W401 - -// CALL TEST_DB -// DB_NUMBER :=#DBInDaten -// RET_VAL :=#SFC_RET_VAL -// DB_LENGTH :=#SFC_DB_LENGTH -// WRITE_PROT :=#SFC_WRITE_PROT - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBInDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 // Fehler vorhanden ? - <>I // Ja ! - JC Err4 // Undefinierte Indaten - - L NoneD [AR2,] // Kennung, Adresse - L 16#00FF_FFFF // Ohne Kennung - AW - SRW 3 // Ohne Bit - T InDaten_Startpunkt - - L Datensatzlaenge // Datenblocklänge - L 2 // DB byteorientiert - *I - L InDaten_Startpunkt - +I - L SFC_DB_LENGTH - >I // Indaten-DB ist zu kurz - JC Err4 // Undefinierte Indaten - -W401: L NoneD [AR2,] // Kennung, Adresse - T InDaten_Pointer - LAR2 - - L DBInDaten // Indaten-DB - L 0 // Angegeben ? - ==I // Nein - JC W402 - - OPN DB[DBInDaten] - -W402: L NoneD [AR2,] // Indaten überprüfen - T Sort_Daten // 1.Indaten speichern - - L Stammdaten -L400: T Schleife - - L DBInDaten // Indaten-DB - L 0 // Angegeben ? - ==I // Nein - JC W403 - - OPN DB[DBInDaten] - -W403: L NoneW [AR2,] // Indaten überprüfen - L 0 // Etwas angegeben ? - <>I // Ja ! - JC Nw05 // Weiter - - ADDAR2 P#2.0 - - L Schleife - LOOP L400 - - JU Err4 // Undefinierte Indaten - -Nw05: NOP 0 - - ---- NW 5: Minimale + maximale Lesestelle am Anfang --- - L 1 - T Min_Lesestelle // Minimal sinnvolle Lesestelle - - L AnzahlEintraege // Anzahl der eingetragenen Datensätze - T Max_Lesestelle // Maximal sinnvolle Lesestelle - -// Sonderfall: noch kein Eintrag: - L 0 // Eintrag schon vorhanden ? - >I // Ja ! - JC en05 - - L 1 // An 1.Stelle speichern - T Savestelle // Adresse - - JU Save - -en05: NOP 0 - - ---- NW 6: Aktuelle Lesestelle errechnen --- -New: L Max_Lesestelle // Maximal sinnvolle Lesestelle - + 1 - L Min_Lesestelle // Minimal sinnvolle Lesestelle - -I - L 2 - /I - L Min_Lesestelle // Minimal sinnvolle Lesestelle - +I - T Lesestelle // An dieser Stelle Datensatz lesen - - ---- NW 7: Daten an Lesestelle auslesen --- - L Lesestelle // An dieser Stelle Datensatz lesen - + -1 - L Datenblock_inBytes // Datenblocklänge in Bytes - *I - L SSDW - +I - + 20 // Offset für 1.Daten - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[DBDatenliste] - L DBD [AR1Zeiger] // Datenliste-Daten lesen - T Lese_Daten // In Tabelle gelesenen Daten - L 0 // Nichts gespeicher oder negativ ? - <=D // Ja ! - JC Err5 - - ---- NW 8: Suche fertig ? --- - L Max_Lesestelle // Maximal sinnvolle Lesestelle - L Min_Lesestelle // Minimal sinnvolle Lesestelle - -I - L 0 // Suche fertig ? - D // Sort > Tabelle - JC MinP - - L Sort_Daten // Einzusortierende Daten - >D // Tabelle > Sort - JC MaxM - - L Lesestelle // An dieser Stelle Datensatz lesen - T Savestelle // An dieser Stelle wird In-Datensatz gespeichert - - JC Frei // Freiplatz schaffen - -MinP: L Lesestelle // An dieser Stelle Datensatz lesen - + 1 - T Min_Lesestelle // Minimal sinnvolle Lesestelle - - L Max_Lesestelle // Maximal sinnvolle Lesestelle - >I // Suche ist fertig - JC ok - - JU New - -MaxM: L Lesestelle // An dieser Stelle Datensatz lesen - + -1 - T Max_Lesestelle // Maximal sinnvolle Lesestelle - - L Min_Lesestelle // Minimal sinnvolle Lesestelle - D // Sort > Tabelle - JC Plus - - L Lesestelle // An dieser Stelle Datensatz lesen - T Savestelle // An dieser Stelle wird In-Datensatz gespeichert - - JU Frei // Freiplatz schaffen - -Plus: L Lesestelle // An dieser Stelle Datensatz lesen - + 1 - T Savestelle // An dieser Stelle wird In-Datensatz gespeichert - - ---- NW 11: Freiraum für Speicherung schaffen --- -Frei: L Savestelle // An dieser Stelle wird In-Datensatz gespeichert - T "MW240" - L AnzahlEintraege // Anzahl der eingetragenen Datensätze - >I // Eintrag ans Ende ! - JC Save - - L AnzahlEintraege // Anzahl der eingetragenen Datensätze - L Datenblock_inBytes // Datenblocklänge in Bytes - *I - L SSDW - +I - + 20 // Offset für 1.Daten - + -2 // Letzte Daten letzter Eintrag - T Holstelle // Freiraum schaffen: Stelle zum Daten holen - - L Holstelle // Freiraum schaffen: Stelle zum Daten holen - L Datenblock_inBytes // Datenblocklänge in Bytes - +I - T Bringstelle // Freiraum schaffen: Zeiger zum Daten schreiben - - L AnzahlEintraege // Anzahl der eingetragenen Datensätze - L Savestelle // An dieser Stelle wird In-Datensatz gespeichert - -I - + 1 - L Datenblock_inBytes // Datenblocklänge in Bytes - *I - L 2 // da DW-Zugriff (2Byte) - /I -L110: T Schleife - - L Holstelle // Freiraum schaffen: Stelle zum Daten holen - ITD - SLD 3 - T Holzeiger // Freiraum schaffen: Zeiger zum Daten holen - L Bringstelle // Freiraum schaffen: Zeiger zum Daten schreiben - ITD - SLD 3 - T Bringzeiger // Freiraum schaffen: Zeiger zum Daten schreiben - - OPN DB[DBDatenliste] - - L DBW [Holzeiger] // Datenliste-Daten lesen - T DBW [Bringzeiger] // Datenliste-Daten verschieben - - L Holstelle - + -2 // 2 Byte wegen DW-Zugriff - T Holstelle // Freiraum schaffen: Stelle zum Daten holen - - L Bringstelle - + -2 // 2 Byte wegen DW-Zugriff - T Bringstelle // Freiraum schaffen: Zeiger zum Daten schreiben - - L Schleife - LOOP L110 - - ---- NW 12: Daten in Datenliste schreiben --- -// Quelle-Pointer erzeugen: - -Save: L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L Datensatzlaenge // Datenwords speichern - T LW2 - T LW12 // Wiederholungen - -// DATEN-Pointer übernehmen: - L DBInDaten - T LW4 // DB_Nummer - L InDaten_Pointer - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: -// Kennung + Datenbytes s.o. - - L SSDB - T LW14 // DB_Nummer - L Savestelle // Adresse - + -1 - L Datenblock_inBytes // Datenblocklänge in Bytes - *I - L SSDW - +I - + 20 // Offset für 1.Daten - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 - - L SSDW - + 14 // Anzahl der Einträge - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[DBDatenliste] - L DBW [AR1Zeiger] // Anzahl der Einträge - + 1 // Einträge +1 - T DBW [AR1Zeiger] // Anzahl der Einträge - - ---- NW 13: Fehlerausgabe / RET_VAL --- - SET // VKE = 1 ohne Fehler !!! - L 2#0000_0000_1000_0000 // Daten wurden gespeichert - JU Ok_Mig -Err0: L 2#0000_0000_0000_0001 // Kein Datenlistebereich - JU Err -Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler - JU Err -Err2: L 2#0000_0000_0000_0100 // Datenliste ist voll - JU Err -Err4: L 2#0000_0000_0001_0000 // Undefinierte Indaten - JU Err -Err5: L 2#0000_0000_0010_0000 // Gespeicherte Daten <= 0 (Inhalt ungültig) - -Err: CLR // VKE = 0 bei Fehler !!! - -Ok_Mig: T RE_VAL - SAVE // VKE in BIE-Bit speichern - - L AR2_Speicher // AR2 zurückspeichern - LAR2 +FUNCTION "DatenInSort" : Void +TITLE = Datensort-Modul +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +FAMILY : DLISTE +NAME : DatenIn +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-1254 +//Version: ILS2100 / 06.11.2009 +// +//Datenblock in Datenliste einsortieren (aufsteigend) +//SSDB: Datenlisten-DB +//SSDW: Datenlisten-1.DW +//INDATEN: Pointer, wo einzutragende Daten stehen (P#DB1.DBX0.0, P#M220.0) +//RE_VAL: Rückmeldungen: +// Bit0: Kein Datenlistenbereich / falscher Kopfinhalt / Endekennung +// Bit1: SFC20-Aufruf mit Fehler +// Bit2: Liste ist voll +// Bit3: Frei +// Bit4: Undefinierte Indaten +// Bit5: Gespeicherte Daten <= 0 (Inhalt ungültig) +// Bit6: Frei +// Bit7: Eintrag ist richtig erfolgt +// + VAR_INPUT + SSDB : Int; // Datenlisten-DB + SSDW : Int; // Datenlisten-1.DW + INDATEN : Pointer; // InDaten-Schnittstelle + END_VAR + + VAR_OUTPUT + RE_VAL : Byte; // Rückmeldung + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Kopf : Byte; // Datenliste-Kennnung (DA) + Datensatzlaenge : Byte; // Datensatzlänge in Word (01 - F0) F0=128 + Listenlaenge : Int; // Länge der Datenliste (maximale Anzahl der Datensätze) + Stammdaten : Int; // Stammdatenlänge in Word (1 - 9) + Belegt06 : Int; // reserviert von Datenliste + Belegt08 : Int; // reserviert von Datenliste + Belegt10 : Int; // reserviert von Datenliste + Belegt12 : Int; // reserviert von Datenliste + AnzahlEintraege : Int; // Anzahl der eingetragenen Datensätze + Reserve16 : Int; // Reserve + Reserve18 : Int; // Reserve + DBDatenliste : Word; // Datenlisten-DB + SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf + SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf + Datenlisten_Ende : Word; // Ende der Datenliste + AR2_Speicher : DWord; // Adress-Register 2 zwischenspeichern + Schleife : Word; // Loopzähler + DBInDaten : Word; // Indaten-DB, falls angegeben + InDaten_Pointer : DWord; // In-Daten-Pointer: Kennung, Adresse + InDaten_Startpunkt : Word; // In-Daten-Startpunkt: Adresse + Sort_Daten : DInt; // Einzusortierende Daten (DWord) + Datenblock_inBytes : Word; // Datenblocklänge in Bytes + SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf + Lesestelle : Int; // An dieser Stelle Datensatz lesen + Min_Lesestelle : Int; // Minimal sinnvolle Lesestelle + Max_Lesestelle : Int; // Maximal sinnvolle Lesestelle + Savestelle : Int; // An dieser Stelle wird In-Datensatz gespeichert + Lese_Daten : DInt; // In Tabelle gelesenen Daten + Holstelle : Int; // Freiraum schaffen: Stelle zum Daten holen + Bringstelle : Int; // Freiraum schaffen: Stelle zum Daten schreiben + Holzeiger : DWord; // Freiraum schaffen: Zeiger zum Daten holen + Bringzeiger : DWord; // Freiraum schaffen: Zeiger zum Daten schreiben + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + END_VAR + + +BEGIN +NETWORK +TITLE = Schnittstellen-DB sinnvoll ? + TAR2; + T #AR2_Speicher;//AR2 zwischenspeichern + + L #SSDB; + T #DBDatenliste; + +// CALL TEST_DB +// DB_NUMBER :=#DBDatenliste +// RET_VAL :=#SFC_RET_VAL +// DB_LENGTH :=#SFC_DB_LENGTH +// WRITE_PROT :=#SFC_WRITE_PROT + + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #DBDatenliste , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + O #SFC_WRITE_PROT; + SPB Err0;//kein Datenlisten-Bereich + +NETWORK +TITLE = Datenlistekopf holen +//Quelle-Pointer erzeugen: + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 16#000A;//10 Dw´s holen + T %LW2;//Wiederholungen + L #SSDB; + T %LW4;//DB_Nummer + L #SSDW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//1.-10.DW Datenliste holen + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := P#L20.0 WORD 10 + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + +NETWORK +TITLE = Zeigerüberprüfung + L #Kopf;//Datenliste-Kopf + L 16#DB;//= Datenlistekennung ? + <>I;//Nein ! + SPB Err0;//kein Datenlistebereich + + L 1; + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err0;//kein Datenlistebereich + + L 128; + >I; + SPB Err0;//kein Datenlistebereich + + L 1; + L #Listenlaenge;//Max.Anzahl von Datenblöcken + >I; + SPB Err0;//kein Datenlistebereich + + L 1; + L #Stammdaten;//Anzahl der Stammdaten + >I; + SPB Err0;//kein Datenlistebereich + + L 9; + >I; + SPB Err0;//kein Datenlistebereich + + L #Stammdaten;//Anzahl der Stammdaten + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err0;//kein Datenlistebereich + + L #Listenlaenge;//Länge der Datenliste + L #Datensatzlaenge;//Datenblocklänge + *I; + L 2;//DB byteorientiert + *I; + + 20;//Speichern ab 10.DW + L #SSDW; + +I; + T #Datenlisten_Ende; + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #DBDatenliste]; + + L #Datenlisten_Ende; + L #SFC_DB_LENGTH; + >I;//Datenlisten-DB ist zu kurz! + SPB Err0;//kein Datenlisten-Bereich + + L DBW[ #AR1Zeiger]; + L 16#DBEE;//Datenliste-Endekennung ? + <>I;//Nein ! + SPB Err0;//kein Datenlisten-Bereich + + L #Datensatzlaenge;//Datenblocklänge + L 2; + *I; + T #Datenblock_inBytes;//Datenblocklänge in Bytes + + L #AnzahlEintraege;//Anzahl der eingetragenen Datensätze + L #Listenlaenge;//Max.Anzahl von Datenblöcken + >=I;//Nein ! + SPB Err2;//Datenliste ist voll + +NETWORK +TITLE = Indaten definiert ? + +//In-DATEN-Pointer übernehmen: + L P##INDATEN; + LAR2; + + L W[ AR2, P#0.0]; + T #DBInDaten;//Indaten-DB + + L #DBInDaten;//Indaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB W401; + +// CALL TEST_DB +// DB_NUMBER :=#DBInDaten +// RET_VAL :=#SFC_RET_VAL +// DB_LENGTH :=#SFC_DB_LENGTH +// WRITE_PROT :=#SFC_WRITE_PROT + + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #DBInDaten , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000;//Fehler vorhanden ? + <>I;//Ja ! + SPB Err4;//Undefinierte Indaten + + L D[ AR2, P#2.0];//Kennung, Adresse + L 16#00FF_FFFF;//Ohne Kennung + UW; + SRW 3;//Ohne Bit + T #InDaten_Startpunkt; + + L #Datensatzlaenge;//Datenblocklänge + L 2;//DB byteorientiert + *I; + L #InDaten_Startpunkt; + +I; + L #SFC_DB_LENGTH; + >I;//Indaten-DB ist zu kurz + SPB Err4;//Undefinierte Indaten + +W401: L D[ AR2, P#2.0];//Kennung, Adresse + T #InDaten_Pointer; + LAR2; + + L #DBInDaten;//Indaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB W402; + + AUF DB[ #DBInDaten]; + +W402: L D[ AR2, P#0.0];//Indaten überprüfen + T #Sort_Daten;//1.Indaten speichern + + L #Stammdaten; +L400: T #Schleife; + + L #DBInDaten;//Indaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB W403; + + AUF DB[ #DBInDaten]; + +W403: L W[ AR2, P#0.0];//Indaten überprüfen + L 0;//Etwas angegeben ? + <>I;//Ja ! + SPB Nw05;//Weiter + + +AR2 P#2.0; + + L #Schleife; + LOOP L400; + + SPA Err4;//Undefinierte Indaten + +Nw05: NOP 0; + +NETWORK +TITLE = Minimale + maximale Lesestelle am Anfang + L 1; + T #Min_Lesestelle;//Minimal sinnvolle Lesestelle + + L #AnzahlEintraege;//Anzahl der eingetragenen Datensätze + T #Max_Lesestelle;//Maximal sinnvolle Lesestelle + +//Sonderfall: noch kein Eintrag: + L 0;//Eintrag schon vorhanden ? + >I;//Ja ! + SPB en05; + + L 1;//An 1.Stelle speichern + T #Savestelle;//Adresse + + SPA Save; + +en05: NOP 0; + +NETWORK +TITLE = Aktuelle Lesestelle errechnen +New: L #Max_Lesestelle;//Maximal sinnvolle Lesestelle + + 1; + L #Min_Lesestelle;//Minimal sinnvolle Lesestelle + -I; + L 2; + /I; + L #Min_Lesestelle;//Minimal sinnvolle Lesestelle + +I; + T #Lesestelle;//An dieser Stelle Datensatz lesen + +NETWORK +TITLE = Daten an Lesestelle auslesen + L #Lesestelle;//An dieser Stelle Datensatz lesen + + -1; + L #Datenblock_inBytes;//Datenblocklänge in Bytes + *I; + L #SSDW; + +I; + + 20;//Offset für 1.Daten + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #DBDatenliste]; + L DBD[ #AR1Zeiger];//Datenliste-Daten lesen + T #Lese_Daten;//In Tabelle gelesenen Daten + L 0;//Nichts gespeicher oder negativ ? + <=D;//Ja ! + SPB Err5; + +NETWORK +TITLE = Suche fertig ? + L #Max_Lesestelle;//Maximal sinnvolle Lesestelle + L #Min_Lesestelle;//Minimal sinnvolle Lesestelle + -I; + L 0;//Suche fertig ? + D;//Sort > Tabelle + SPB MinP; + + L #Sort_Daten;//Einzusortierende Daten + >D;//Tabelle > Sort + SPB MaxM; + + L #Lesestelle;//An dieser Stelle Datensatz lesen + T #Savestelle;//An dieser Stelle wird In-Datensatz gespeichert + + SPB Frei;//Freiplatz schaffen + +MinP: L #Lesestelle;//An dieser Stelle Datensatz lesen + + 1; + T #Min_Lesestelle;//Minimal sinnvolle Lesestelle + + L #Max_Lesestelle;//Maximal sinnvolle Lesestelle + >I;//Suche ist fertig + SPB ok; + + SPA New; + +MaxM: L #Lesestelle;//An dieser Stelle Datensatz lesen + + -1; + T #Max_Lesestelle;//Maximal sinnvolle Lesestelle + + L #Min_Lesestelle;//Minimal sinnvolle Lesestelle + D;//Sort > Tabelle + SPB Plus; + + L #Lesestelle;//An dieser Stelle Datensatz lesen + T #Savestelle;//An dieser Stelle wird In-Datensatz gespeichert + + SPA Frei;//Freiplatz schaffen + +Plus: L #Lesestelle;//An dieser Stelle Datensatz lesen + + 1; + T #Savestelle;//An dieser Stelle wird In-Datensatz gespeichert + +NETWORK +TITLE = Freiraum für Speicherung schaffen +Frei: L #Savestelle;//An dieser Stelle wird In-Datensatz gespeichert + T "MW240"; + L #AnzahlEintraege;//Anzahl der eingetragenen Datensätze + >I;//Eintrag ans Ende ! + SPB Save; + + L #AnzahlEintraege;//Anzahl der eingetragenen Datensätze + L #Datenblock_inBytes;//Datenblocklänge in Bytes + *I; + L #SSDW; + +I; + + 20;//Offset für 1.Daten + + -2;//Letzte Daten letzter Eintrag + T #Holstelle;//Freiraum schaffen: Stelle zum Daten holen + + L #Holstelle;//Freiraum schaffen: Stelle zum Daten holen + L #Datenblock_inBytes;//Datenblocklänge in Bytes + +I; + T #Bringstelle;//Freiraum schaffen: Zeiger zum Daten schreiben + + L #AnzahlEintraege;//Anzahl der eingetragenen Datensätze + L #Savestelle;//An dieser Stelle wird In-Datensatz gespeichert + -I; + + 1; + L #Datenblock_inBytes;//Datenblocklänge in Bytes + *I; + L 2;//da DW-Zugriff (2Byte) + /I; +L110: T #Schleife; + + L #Holstelle;//Freiraum schaffen: Stelle zum Daten holen + ITD; + SLD 3; + T #Holzeiger;//Freiraum schaffen: Zeiger zum Daten holen + L #Bringstelle;//Freiraum schaffen: Zeiger zum Daten schreiben + ITD; + SLD 3; + T #Bringzeiger;//Freiraum schaffen: Zeiger zum Daten schreiben + + AUF DB[ #DBDatenliste]; + + L DBW[ #Holzeiger];//Datenliste-Daten lesen + T DBW[ #Bringzeiger];//Datenliste-Daten verschieben + + L #Holstelle; + + -2;//2 Byte wegen DW-Zugriff + T #Holstelle;//Freiraum schaffen: Stelle zum Daten holen + + L #Bringstelle; + + -2;//2 Byte wegen DW-Zugriff + T #Bringstelle;//Freiraum schaffen: Zeiger zum Daten schreiben + + L #Schleife; + LOOP L110; + +NETWORK +TITLE = Daten in Datenliste schreiben + +//Quelle-Pointer erzeugen: + +Save: L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L #Datensatzlaenge;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//DATEN-Pointer übernehmen: + L #DBInDaten; + T %LW4;//DB_Nummer + L #InDaten_Pointer; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: +//Kennung + Datenbytes s.o. + + L #SSDB; + T %LW14;//DB_Nummer + L #Savestelle;//Adresse + + -1; + L #Datenblock_inBytes;//Datenblocklänge in Bytes + *I; + L #SSDW; + +I; + + 20;//Offset für 1.Daten + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := #Ziel + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + + L #SSDW; + + 14;//Anzahl der Einträge + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #DBDatenliste]; + L DBW[ #AR1Zeiger];//Anzahl der Einträge + + 1;//Einträge +1 + T DBW[ #AR1Zeiger];//Anzahl der Einträge + +NETWORK +TITLE = Fehlerausgabe / RET_VAL + SET;//VKE = 1 ohne Fehler !!! + L 2#0000_0000_1000_0000;//Daten wurden gespeichert + SPA Ok_Mig; +Err0: L 2#0000_0000_0000_0001;//Kein Datenlistebereich + SPA Err; +Err1: L 2#0000_0000_0000_0010;//SFC20-Aufruf mit Fehler + SPA Err; +Err2: L 2#0000_0000_0000_0100;//Datenliste ist voll + SPA Err; +Err4: L 2#0000_0000_0001_0000;//Undefinierte Indaten + SPA Err; +Err5: L 2#0000_0000_0010_0000;//Gespeicherte Daten <= 0 (Inhalt ungültig) + +Err: CLR;//VKE = 0 bei Fehler !!! + +Ok_Mig: T #RE_VAL; + SAVE;//VKE in BIE-Bit speichern + + L #AR2_Speicher;//AR2 zurückspeichern + LAR2; + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Module/DatenOut.awl b/=A01+UH07-KF00/Programmbausteine/Module/DatenOut.awl index e9bf550..d43df7b 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/DatenOut.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/DatenOut.awl @@ -1,894 +1,987 @@ -=== FC 86: DatenOut [STL] === -INTERFACE: - Input: - SSDB : Int // Datenlisten-DB - SSDW : Int // Datenlisten-1.DW - PARA : Word // Aufrufparameter (Auftrag / Anzahl Zusatzdaten) - SEARCHDATEN : Pointer // Such-Daten-Schnittstelle - Output: - RE_VAL : Byte // Rückmeldung - OUTDATEN : Pointer // OutDaten-Schnittstelle - Position : Int // Daten stehen an angegebener Position in Datenbank - InOut: - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Kopf : Byte // Datenliste-Kennnung (DA) - Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128 - Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze) - Stammdaten : Int // Stammdatenlänge in Word (1 - 9) - IndDB : Word // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) - IndDB_Laenge : Int // Länge des indizierten DB in Einträge (nur bei Stammdaten = 1 erlaubt !!!) - IndDaten_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) - Suchzeiger : Int // Speicherung des letzten Zugriffs / Suchzeiger - Belegt14 : Int // reserviert von Sort-Datenliste - AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!) - Reserve18 : Int // Reserve - Para1 : Byte // 1.Aufrufparameter - Para2 : Byte // 2.Aufrufparameter - DBDatenliste : Word // Datenlisten-DB - OffsetDaten_1 : Int // Stammdaten beginnen ab hier - SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf - SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf - Datenlisten_Ende : Int // Ende der Datenliste - AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern - Schleife : Word // Loopzähler - DBSuchDaten : Word // Such-Daten-DB, falls angegeben - SuchDaten_Pointer : DWord // Such-Daten-Pointer: Kennung, Adresse - SuchDaten_Startpunkt : Word // Such-Daten-Startpunkt: Adresse - DBOutDaten : Word // Out-Daten-DB, falls angegeben - OutDaten_Pointer : DWord // Out-Daten-Pointer: Kennung, Adresse - OutDaten_Startpunkt : Word // Out-Daten-Startpunkt: Adresse - IndPointer : DWord // Zeiger für IndDB - Daten_1 : Word // 1.Datenwort der Indaten - Daten_2 : DWord // 1+2.Datenwort der Indaten (falls ind.Suchen mit Stammdaten 2) - Datenblock_inBytes : Word // Datenblocklänge in Bytes - Suchstelle : Word // Bei angegebenen Datensatz suchen - SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf - Indok : Bool // Indizierung möglich - IndZeiger_ok : Bool // Indizier-Zeiger angegeben - Weitersuchen : Bool // Weitersuchen ist aktiv - Offsetsuchen : Bool // Offsetsuchen ist aktiv - Sortliste : Bool // Sortliste wird durchsucht - WandelFC : Bool // Wnadel-FC für ind.Suchen vorhanden - tRE_VAL : Byte // Rückmeldung - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - DB_Länge : Int - NichtCopy : Int // Datenmenge, die nicht vorschoben wird - LoeschPos : Word // Lösch-Position - Wandel_FC : Word // Wandel-FC - Constant: - Return: - Ret_Val : Void - ---- NW 1: Schnittstellen-DB sinnvoll ? --- - TAR2 - T AR2_Speicher // AR2 zwischenspeichern - - L SSDB - T DBDatenliste - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - -CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge") - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - O SFC_WRITE_PROT // schreibgeschützt - JC Err0 // kein Datenlisten-Bereich - - ---- NW 2: Quelle-Pointer erzeugen: --- - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 16#000A // 10 Dw´s holen - T LW2 // Wiederholungen - L SSDB - T LW4 // DB_Nummer - L SSDW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 - - ---- NW 3: Zeigerüberprüfung --- - L Kopf // Datenliste-Kopf - L 16#DB // = Sort-Datenlistekennung ? - ==I // Ja ! - = Sortliste // Sortliste wird durchsucht - JC w030 - - CAC - L 16#DA // = Datenlistekennung ? - <>I // Nein ! - JC Err0 // kein Datenlistebereich - -w030: L 1 - L Datensatzlaenge // Datenblocklänge - >I - JC Err0 // kein Datenlistebereich - - L 128 - >I - JC Err0 // kein Datenlistebereich - - L 1 - L Listenlaenge // Max.Anzahl von Datenblöcken - >I - JC Err0 // kein Datenlistebereich - - L 1 - L Stammdaten // Anzahl der Stammdaten - >I - JC Err0 // kein Datenlistebereich - - L 9 - >I - JC Err0 // kein Datenlistebereich - - L Stammdaten // Anzahl der Stammdaten - L Datensatzlaenge // Datenblocklänge - >I - JC Err0 // kein Datenlistebereich - - L Listenlaenge // Länge der Datenliste - L Datensatzlaenge // Datenblocklänge - *I - L 2 // DB byteorientiert - *I - + 20 // Speichern ab 10.DW - L SSDW - +I - T Datenlisten_Ende - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[DBDatenliste] - - L Datenlisten_Ende - L "DB_Länge" - >I // Datenlisten-DB ist zu kurz! - JC Err0 // kein Datenlisten-Bereich - - L DBW [AR1Zeiger] - L 16#DAEE // Datenliste-Endekennung ? - <>I // Nein ! - A( - CAC - L 16#DBEE // Sort-Datenliste-Endekennung ? - <>I // Nein ! - ) - JC Err0 // kein Datenlisten-Bereich - - L Datensatzlaenge // Datenblocklänge - L 2 - *I - T Datenblock_inBytes // Datenblocklänge in Bytes - - ---- NW 4: Auftrag kontrollieren --- - SET - R Indok // Indizierung möglich - R IndZeiger_ok // Indizier-Zeiger angegeben - R Weitersuchen // Weitersuchen ist aktiv - R Offsetsuchen // Offsetsuchen ist aktiv - L 0 // Vorerst kein Offset - T OffsetDaten_1 - - L PARA - T LW40 // Aufrufparameter zwischenspeichern - - L 16#00 // XX = 00 ? - L Para1 - ==I // Ja! - JC W401 - - L 16#E1 // XX = E1 ? - ==I // Ja! - A Sortliste // Sortliste wird durchsucht - JC Err3 // Falscher Aufrufparameter (austragen nicht erlaubt !) - - CAC - L 16#E1 // XX = E1 ? - ==I // Ja! - JC W401 - - L 16#F1 // XX = F1 ? - L Para1 - <>I // Nein ! - JC W400 - - L Para2 - L 16#00 - <>I - O Sortliste // Sortliste wird durchsucht - JC Err3 // Falscher Aufrufparameter - - SET - S Weitersuchen - - L SSDW - + 20 - T Suchzeiger - - JU Nw08 // OutDaten ok ? - -W400: L 16#FF // XX = FF ? - <>I // Nein ! - JC W403 - - L Para2 - L 16#00 - <>I - O Sortliste // Sortliste wird durchsucht - JC Err3 // Falscher Aufrufparameter - - SET - S Weitersuchen - - L Suchzeiger // Alter Suchzeiger - L Datenblock_inBytes // Datenblocklänge in bytes - +I // Nächsten Datensatz suchen - T Suchzeiger // Neuer Suchzeiger - - L Datenblock_inBytes // Datenblocklänge in bytes - L Listenlaenge // Alle möglichen Einträge - *I // Gesamtlänge - L SSDW // Startpunkt - +I - + 20 // Offset 1.Daten - L Suchzeiger // Schreibzeiger - >I // Noch nicht am Ende ! - JC Nw08 // OutDaten ok ? - - JU Err2 // Listenende erreicht - -W403: L 16#02 // XX < 02 ? - L Para1 - >I // Ja! - JC Err3 // Falscher Aufrufparameter - - L 16#80 // XX > 80 ? - >I // Ja! - JC Err3 // Falscher Aufrufparameter - - CAC - L Datensatzlaenge // XX > Datensatzlänge - >I // Ja! - JC Err3 // Falscher Aufrufparameter - - CAC - + -1 // Angegebener Offset -1 - L 2 // DB byteorientiert - *I - T OffsetDaten_1 // Richtiger Offset der 1.Stammdaten - - L 0 - T Suchzeiger // Suche ab Anfang - - SET - S Offsetsuchen - -W401: L 16#00 // =0 ? - L Para2 // 2.Aufrufparameter - ==I // Ja ! - JC W402 - - T Stammdaten // Anzahl der Stammdaten - L Datensatzlaenge // Datenblocklänge - >I - JC Err3 // Falscher Aufrufparameter - - L 1 - L Stammdaten // Anzahl der Stammdaten - >I - JC Err3 // Falscher Aufrufparameter - - L 9 - >I - JC Err3 // Falscher Aufrufparameter - -W402: AN Offsetsuchen - JC Nw05 - - L Para1 // Offset - + -1 - L Stammdaten - +I // Letzte Stammdaten zu groß ? - L Datensatzlaenge - >I // Ja! - JC Err3 // Falscher Aufrufparameter - - ---- NW 5: Such-DATEN-Pointer übernehmen: --- -Nw05: L 0 - T Suchzeiger // Suchzeiger - - L P# - LAR2 - - L NoneW [AR2,] - T DBSuchDaten // Suchdaten-DB - L NoneD [AR2,] // Kennung, Adresse - T SuchDaten_Pointer - - L DBSuchDaten // Suchdaten-DB - L 0 // Angegeben ? - ==I // Nein - JC W501 - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBSuchDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - -CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge") - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 // Fehler vorhanden ? - <>I // Ja ! - JC Err4 // Undefinierte Stammdaten - - L NoneD [AR2,] // Kennung, Adresse - L 16#00FF_FFFF // Ohne Kennung - AW - SRW 3 // Ohne Bit - T SuchDaten_Startpunkt - - L Datensatzlaenge // Datenblocklänge - L 2 // DB byteorientiert - *I - L SuchDaten_Startpunkt - +I - L "DB_Länge" - >I // Suchdaten-DB ist zu kurz - JC Err4 // Undefinierte Stammdaten - -W501: L SuchDaten_Pointer - LAR2 - - L DBSuchDaten // Suchdaten-DB - L 0 // Angegeben ? - ==I // Nein - JC W502 - - OPN DB[DBSuchDaten] - -W502: L NoneW [AR2,] // Suchdaten überprüfen - T Daten_1 // 1.Suchdaten speichern - L NoneD [AR2,] // Suchdaten überprüfen - T Daten_2 // 1.Suchdaten speichern +FUNCTION "DatenOut" : Void +TITLE = Datenlisten-Modul +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +FAMILY : DLISTE +NAME : DatenIn +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-1254 +//Version: P&O / 10.2024 +//Version: ILS2100 / 06.11.2009 +// +//Datenblock in Datenliste suchen / löschen +//SSDB: Datenlisten-DB +//SSDW: Datenlisten-1.DW +//SEARCHDATEN: Pointer, wo einzutragende Daten stehen (P#DB1.DBX0.0, P#M220.0) +//AUFTRAG: XXYY +// XX: 00 = angegebenen Datensatz suchen +// 02 - 80 = Stammdaten beginnen ab angegebenen Datenwort +// E1 = angegebenen Datensatz suchen + austragen! +// F1 = 1.Datensatz lesen +// FF = nächsten vorhandenen Eintrag lesen (ab letzten Zugriff) +// YY: 01 - 09 = Anzahl der Stammdaten (falls abweichend vom Datenlistenkopf!) +//(Achtung, nur mit P#M220.0 oder speziellen DB suchen!) +// +//OUTDATEN: Pointer, wohin ausgelesene Daten übergeben werden (P#DB1.DBX0.0, +// P#M220.0) +//RE_VAL: Rückmeldungen: +// Bit0: Kein Datenlistenbereich / falscher Kopfinhalt / Endekennung +// Bit1: SFC20-Aufruf mit Fehler +// Bit2: Listenende ist erreicht +// Bit3: Falscher Parameter bei Aufruf +// Bit4: Undefinierte Stammdaten zum Suchen +// Bit5: Undefinierte OUT-Daten +// Bit6: Datensatz ist nicht vorhanden +// Bit7: Datensatz ist vorhanden +// + VAR_INPUT + SSDB : Int; // Datenlisten-DB + SSDW : Int; // Datenlisten-1.DW + PARA : Word; // Aufrufparameter (Auftrag / Anzahl Zusatzdaten) + SEARCHDATEN : Pointer; // Such-Daten-Schnittstelle + END_VAR + + VAR_OUTPUT + RE_VAL : Byte; // Rückmeldung + OUTDATEN : Pointer; // OutDaten-Schnittstelle + Position : Int; // Daten stehen an angegebener Position in Datenbank + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Kopf : Byte; // Datenliste-Kennnung (DA) + Datensatzlaenge : Byte; // Datensatzlänge in Word (01 - F0) F0=128 + Listenlaenge : Int; // Länge der Datenliste (maximale Anzahl der Datensätze) + Stammdaten : Int; // Stammdatenlänge in Word (1 - 9) + IndDB : Word; // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) + IndDB_Laenge : Int; // Länge des indizierten DB in Einträge (nur bei Stammdaten = 1 erlaubt !!!) + IndDaten_FC : Int; // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) + Suchzeiger : Int; // Speicherung des letzten Zugriffs / Suchzeiger + Belegt14 : Int; // reserviert von Sort-Datenliste + AnzahlEintraege : Int; // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!) + Reserve18 : Int; // Reserve + Para1 : Byte; // 1.Aufrufparameter + Para2 : Byte; // 2.Aufrufparameter + DBDatenliste : Word; // Datenlisten-DB + OffsetDaten_1 : Int; // Stammdaten beginnen ab hier + SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf + SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf + Datenlisten_Ende : Int; // Ende der Datenliste + AR2_Speicher : DWord; // Adress-Register 2 zwischenspeichern + Schleife : Word; // Loopzähler + DBSuchDaten : Word; // Such-Daten-DB, falls angegeben + SuchDaten_Pointer : DWord; // Such-Daten-Pointer: Kennung, Adresse + SuchDaten_Startpunkt : Word; // Such-Daten-Startpunkt: Adresse + DBOutDaten : Word; // Out-Daten-DB, falls angegeben + OutDaten_Pointer : DWord; // Out-Daten-Pointer: Kennung, Adresse + OutDaten_Startpunkt : Word; // Out-Daten-Startpunkt: Adresse + IndPointer : DWord; // Zeiger für IndDB + Daten_1 : Word; // 1.Datenwort der Indaten + Daten_2 : DWord; // 1+2.Datenwort der Indaten (falls ind.Suchen mit Stammdaten 2) + Datenblock_inBytes : Word; // Datenblocklänge in Bytes + Suchstelle : Word; // Bei angegebenen Datensatz suchen + SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf + Indok : Bool; // Indizierung möglich + IndZeiger_ok : Bool; // Indizier-Zeiger angegeben + Weitersuchen : Bool; // Weitersuchen ist aktiv + Offsetsuchen : Bool; // Offsetsuchen ist aktiv + Sortliste : Bool; // Sortliste wird durchsucht + WandelFC : Bool; // Wnadel-FC für ind.Suchen vorhanden + tRE_VAL : Byte; // Rückmeldung + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + DB_Länge : Int; + NichtCopy : Int; // Datenmenge, die nicht vorschoben wird + LoeschPos : Word; // Lösch-Position + Wandel_FC : Word; // Wandel-FC + END_VAR + + +BEGIN +NETWORK +TITLE = Schnittstellen-DB sinnvoll ? + TAR2; + T #AR2_Speicher;//AR2 zwischenspeichern + + L #SSDB; + T #DBDatenliste; + + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #DBDatenliste , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + + CALL "BCD (4stellig)_to_INT" + ( BCD_Wert := #SFC_DB_LENGTH , + Int_Wert := #DB_Länge + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + O #SFC_WRITE_PROT;//schreibgeschützt + SPB Err0;//kein Datenlisten-Bereich + +NETWORK +TITLE = Datenlistekopf holen +//Quelle-Pointer erzeugen: + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 16#000A;//10 Dw´s holen + T %LW2;//Wiederholungen + L #SSDB; + T %LW4;//DB_Nummer + L #SSDW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//1.-10.DW Datenliste holen + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := P#L20.0 WORD 10 + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + +NETWORK +TITLE = Zeigerüberprüfung + L #Kopf;//Datenliste-Kopf + L 16#DB;//= Sort-Datenlistekennung ? + ==I;//Ja ! + = #Sortliste;//Sortliste wird durchsucht + SPB w030; + + TAK; + L 16#DA;//= Datenlistekennung ? + <>I;//Nein ! + SPB Err0;//kein Datenlistebereich + +w030: L 1; + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err0;//kein Datenlistebereich + + L 128; + >I; + SPB Err0;//kein Datenlistebereich + + L 1; + L #Listenlaenge;//Max.Anzahl von Datenblöcken + >I; + SPB Err0;//kein Datenlistebereich + + L 1; + L #Stammdaten;//Anzahl der Stammdaten + >I; + SPB Err0;//kein Datenlistebereich + + L 9; + >I; + SPB Err0;//kein Datenlistebereich + + L #Stammdaten;//Anzahl der Stammdaten + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err0;//kein Datenlistebereich + + L #Listenlaenge;//Länge der Datenliste + L #Datensatzlaenge;//Datenblocklänge + *I; + L 2 ;//DB byteorientiert + *I; + + 20 ;//Speichern ab 10.DW + L #SSDW; + +I; + T #Datenlisten_Ende; + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #DBDatenliste]; + + L #Datenlisten_Ende; + L #DB_Länge; + >I ;//Datenlisten-DB ist zu kurz! + SPB Err0;//kein Datenlisten-Bereich + + L DBW[ #AR1Zeiger]; + L 16#DAEE ;//Datenliste-Endekennung ? + <>I;//Nein ! + U(; + TAK; + L 16#DBEE;//Sort-Datenliste-Endekennung ? + <>I;//Nein ! + ); + SPB Err0;//kein Datenlisten-Bereich + + L #Datensatzlaenge;//Datenblocklänge + L 2; + *I; + T #Datenblock_inBytes;//Datenblocklänge in Bytes + +NETWORK +TITLE = Auftrag kontrollieren + SET; + R #Indok;//Indizierung möglich + R #IndZeiger_ok;//Indizier-Zeiger angegeben + R #Weitersuchen;//Weitersuchen ist aktiv + R #Offsetsuchen;//Offsetsuchen ist aktiv + L 0;//Vorerst kein Offset + T #OffsetDaten_1; + + L #PARA; + T %LW40 ;//Aufrufparameter zwischenspeichern + + L 16#00;//XX = 00 ? + L #Para1; + ==I;//Ja! + SPB W401; + + L 16#E1;//XX = E1 ? + ==I;//Ja! + U #Sortliste;//Sortliste wird durchsucht + SPB Err3;//Falscher Aufrufparameter (austragen nicht erlaubt !) + + TAK; + L 16#E1;//XX = E1 ? + ==I;//Ja! + SPB W401; + + L 16#F1;//XX = F1 ? + L #Para1; + <>I;//Nein ! + SPB W400; + + L #Para2; + L 16#00; + <>I; + O #Sortliste;//Sortliste wird durchsucht + SPB Err3;//Falscher Aufrufparameter + + SET; + S #Weitersuchen; + + L #SSDW; + + 20; + T #Suchzeiger; + + SPA Nw08;//OutDaten ok ? + +W400: L 16#FF;//XX = FF ? + <>I;//Nein ! + SPB W403; + + L #Para2; + L 16#00; + <>I; + O #Sortliste;//Sortliste wird durchsucht + SPB Err3;//Falscher Aufrufparameter + + SET; + S #Weitersuchen; + + L #Suchzeiger;//Alter Suchzeiger + L #Datenblock_inBytes;//Datenblocklänge in bytes + +I;//Nächsten Datensatz suchen + T #Suchzeiger;//Neuer Suchzeiger + + L #Datenblock_inBytes;//Datenblocklänge in bytes + L #Listenlaenge;//Alle möglichen Einträge + *I;//Gesamtlänge + L #SSDW;//Startpunkt + +I; + + 20;//Offset 1.Daten + L #Suchzeiger;//Schreibzeiger + >I ;//Noch nicht am Ende ! + SPB Nw08;//OutDaten ok ? + + SPA Err2;//Listenende erreicht + +W403: L 16#02;//XX < 02 ? + L #Para1; + >I;//Ja! + SPB Err3;//Falscher Aufrufparameter + + L 16#80;//XX > 80 ? + >I;//Ja! + SPB Err3;//Falscher Aufrufparameter + + TAK; + L #Datensatzlaenge;//XX > Datensatzlänge + >I;//Ja! + SPB Err3;//Falscher Aufrufparameter + + TAK; + + -1;//Angegebener Offset -1 + L 2;//DB byteorientiert + *I; + T #OffsetDaten_1;//Richtiger Offset der 1.Stammdaten + + L 0; + T #Suchzeiger;//Suche ab Anfang + + SET; + S #Offsetsuchen; + +W401: L 16#00;//=0 ? + L #Para2;//2.Aufrufparameter + ==I;//Ja ! + SPB W402; + + T #Stammdaten;//Anzahl der Stammdaten + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err3;//Falscher Aufrufparameter + + L 1; + L #Stammdaten;//Anzahl der Stammdaten + >I; + SPB Err3;//Falscher Aufrufparameter + + L 9; + >I; + SPB Err3;//Falscher Aufrufparameter + +W402: UN #Offsetsuchen; + SPB Nw05; + + L #Para1;//Offset + + -1; + L #Stammdaten; + +I;//Letzte Stammdaten zu groß ? + L #Datensatzlaenge; + >I;//Ja! + SPB Err3;//Falscher Aufrufparameter + +NETWORK +TITLE = Suchdaten definiert ? +//Such-DATEN-Pointer übernehmen: +Nw05: L 0; + T #Suchzeiger;//Suchzeiger + + L P##SEARCHDATEN; + LAR2; + + L W[ AR2, P#0.0]; + T #DBSuchDaten;//Suchdaten-DB + L D[ AR2, P#2.0];//Kennung, Adresse + T #SuchDaten_Pointer; + + L #DBSuchDaten;//Suchdaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB W501; + + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #DBSuchDaten , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + + CALL "BCD (4stellig)_to_INT" + ( BCD_Wert := #SFC_DB_LENGTH , + Int_Wert := #DB_Länge + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000;//Fehler vorhanden ? + <>I;//Ja ! + SPB Err4;//Undefinierte Stammdaten + + L D[ AR2, P#2.0];//Kennung, Adresse + L 16#00FF_FFFF;//Ohne Kennung + UW; + SRW 3;//Ohne Bit + T #SuchDaten_Startpunkt; + + L #Datensatzlaenge;//Datenblocklänge + L 2;//DB byteorientiert + *I; + L #SuchDaten_Startpunkt; + +I; + L #DB_Länge; + >I;//Suchdaten-DB ist zu kurz + SPB Err4;//Undefinierte Stammdaten + +W501: L #SuchDaten_Pointer; + LAR2; + + L #DBSuchDaten;//Suchdaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB W502; + + AUF DB[ #DBSuchDaten]; + +W502: L W[ AR2, P#0.0];//Suchdaten überprüfen + T #Daten_1;//1.Suchdaten speichern + L D[ AR2, P#0.0] ;//Suchdaten überprüfen + T #Daten_2 ;//1.Suchdaten speichern + + L #Stammdaten; +L500: T #Schleife; + + L #DBSuchDaten;//Suchdaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB W503; + + AUF DB[ #DBSuchDaten]; + +W503: L W[ AR2, P#0.0];//Suchdaten überprüfen + L 0;//Etwas angegeben ? + <>I;//Ja ! + SPB Nw06;//Weiter + + +AR2 P#2.0; + + L #Schleife; + LOOP L500; + + SPA Err4;//Undefinierte Stammdaten + +NETWORK +TITLE = Indiziert suchen ? +Nw06: L #IndDB;//Indizierter DB + L 0;//=0 ? + ==I;//Kein indizierter DB ! + O #Offsetsuchen; + O #Sortliste;//Sortliste wird durchsucht + SPB Nw07; + + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #IndDB , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + + CALL "BCD (4stellig)_to_INT" + ( BCD_Wert := #SFC_DB_LENGTH , + Int_Wert := #DB_Länge + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + O #SFC_WRITE_PROT; + SPB Nw07;//kein Indizier-DB vorhanden + + L #IndDB_Laenge;//Länge des Indizierten DB überschritten ? + L DINT#2 ;//DB byteorientiert + *D; + L #DB_Länge; + >I;//Indizier-DB ist zu kurz + SPB Nw07;//Zeiger ausserhalb Ind.DB + + L #Stammdaten;//Stammdaten + L 3 ;//zu viele Stammdaten ? + >=I ;//Ja ! + SPB Nw07;//ohne Indizierung weiter + + L #IndDaten_FC;//Offset zum Abziehen + T #Wandel_FC; + L 0;//Parameter vorhanden ? + <=I;//Nein + SPB NoFC;//Bei diesem Schritt weiter + + L #Daten_1 ;//Stammdaten (1.DW) + T "MW90";//übergeben + L #Daten_2 ;//Stammdaten (2.DW) + T "MD94" ;//übergeben + + UC FC[ #Wandel_FC];//Beeinflussung der Weiterfahrt + + L "MW92";//Rückwert von FC + + SPA Ret; + +NoFC: L #Daten_1;//Stammdaten +Ret: T #IndPointer;//Stelle, wo Zeiger hinterlegt ist + L 0; + I;//Suchzeiger nicht im Raster ! + SPB W700;//Suche bei 1.Datensatz beginnen + + L 0;//Bei angegebener Stelle suchen + T #Suchstelle;//Such bei X-ten Datensatz + + SPA W701; + +W700: L 1;//Suche bei 1.Datensatz beginnen + T #Suchstelle;//Such bei X-ten Datensatz + SET; + R #IndZeiger_ok;//Indizier-Zeiger angegeben + L #SSDW; + + 20;//Offset für 1.Daten + T #Suchzeiger;//Suchzeiger + +W701: L #Suchzeiger;//Suchzeiger + L #OffsetDaten_1;//Richtiger Offset der 1.Stammdaten + +I; + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + L #SuchDaten_Pointer; + LAR2; + + L #Stammdaten;//Anzahl der Stammdaten +L700: T #Schleife; + + L #DBSuchDaten;//Suchdaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB W702; + + AUF DB[ #DBSuchDaten]; + +W702: L W[ AR2, P#0.0] ;//Suchdaten überprüfen mit + AUF DB[ #DBDatenliste]; + L DBW[ #AR1Zeiger] ;//Datenliste-Daten lesen + <>I ;//nicht identisch ! + SPB W703; + + L #AR1Zeiger; + SRD 3; + L DINT#2; + +D; + SLD 3; + T #AR1Zeiger; + + +AR2 P#2.0; + + L #Schleife; + LOOP L700; + + L 2#0000_0000_1000_0000;//Daten sind vorhanden + T #tRE_VAL;//Ok-Status + + SPA Nw08;//Datensatz ist in Liste enthalten + +W703: L 0;//Suche bei 1.Datensatz begonnen + L #Suchstelle;//Such bei X-ten Datensatz + ==I;//Nein ! + SPB W700; + + L #Suchstelle;//Such bei X-ten Datensatz + + 1; + T #Suchstelle;//Such bei X-ten Datensatz + L #Listenlaenge;//Anzahl aller Daten in Datenliste + <=I;//Alle Datensätze sind durchsucht + SPB W705;//Nein ! + + SPA Err6;//Datensatz ist nicht vorhanden + +W705: L #Datenblock_inBytes;//Datenblocklänge in bytes + L #Suchzeiger;//Suchzeiger + +I; + T #Suchzeiger;//Suchzeiger + SPA W701; + +NETWORK +TITLE = Outdaten ok ? +//Out-DATEN-Pointer übernehmen: +Nw08: L P##OUTDATEN; + LAR2; + + L W[ AR2, P#0.0]; + T #DBOutDaten;//Outdaten-DB + L D[ AR2, P#2.0];//Kennung, Adresse + T #OutDaten_Pointer; + + L #DBOutDaten;//Outdaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB Nw09; + + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #DBOutDaten , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + + CALL "BCD (4stellig)_to_INT" + ( BCD_Wert := #SFC_DB_LENGTH , + Int_Wert := #DB_Länge + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000;//Fehler vorhanden ? + <>I;//Ja ! + SPB Err5;//Undefinierte Outdaten + + L D[ AR2, P#2.0];//Kennung, Adresse + L 16#00FF_FFFF;//Ohne Kennung + UW; + SRW 3;//Ohne Bit + T #OutDaten_Startpunkt; + + L #OutDaten_Startpunkt; + L #DB_Länge; + >I;//Outdaten-DB ist zu kurz + SPB Err5;//Undefinierte Outdaten + +NETWORK +TITLE = Daten aus Datenliste lesen (in OUTDaten übergeben) +//Quelle-Pointer erzeugen: +Nw09: L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L #Datensatzlaenge;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//DATEN-Pointer übernehmen: + L #SSDB; + T %LW4;//DB_Nummer + L #Suchzeiger;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: +//Kennung + Datenbytes s.o. + + L #DBOutDaten; + T %LW14;//DB_Nummer + L #OutDaten_Pointer; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := #Ziel + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + + U #SFC_WRITE_PROT;//Datenliste kann nicht beschrieben werden + SPB Nw10; + + L #SSDW; + + 12;//Offset letzter Zugriff + ITD; + SLD 3;//Pointer erzeugen + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + L #Suchzeiger;//Suchzeiger + AUF DB[ #DBDatenliste]; + T DBW[ #AR1Zeiger];//Speicherung letzter Zugriff + + L #Suchstelle;//Such bei X-ten Datensatz + T #Position ;//Übergabe nach außen + +NETWORK +TITLE = Daten aus Datenliste löschen ? (nicht indiziert!) +Nw10: L 16#E1;//Daten löschen ? + L #Para1;//1.Aufrufparameter + <>I;//Nein ! + O #SFC_WRITE_PROT;//Datenliste kann nicht beschrieben werden + SPB Nw11; + + U #Indok ;//Indizierung möglich + SPB X010;//Bei ind.Zugriff nur löschen, nicht verschieben, keine Anzahl! + +//Gemeinsame Daten für Pointer erzeugen: + L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + + L #Suchzeiger;//Stelle, wo gelöscht werden soll + + -20; + L #SSDW; + -I; + L #Datenblock_inBytes;//Datenblocklänge in bytes + /I; + + 1;//Stelle, die gelöscht werden soll + T #LoeschPos;//Lösch-Position + L #Listenlaenge;//Länge der Datenliste (Letzter Eintrag zum Löschen ?) + ==I;//Ja ! + SPB Last;//Ohne Verschieben letzten Eintrag löschen + + L #LoeschPos;//Lösch-Position + L #Datensatzlaenge;//Datenblocklänge + *I;//Gesamtdatenlänge in Words + T #NichtCopy;//Datenmenge, die nicht vorschoben wird + + L #Listenlaenge;//Länge der Datenliste + L #Datensatzlaenge;//Datenblocklänge + *I;//Gesamtdatenlänge in Words + L #NichtCopy;//Datenmenge, die nicht vorschoben wird + -I;//abziehen + T %LW2; + T %LW12;//Wiederholungen + + L #SSDB; + T %LW4; + T %LW14;//DB_Nummer + +//Quelle-Pointer erzeugen: + L #Suchzeiger;//Stelle, wo gelöscht werden soll + L #Datenblock_inBytes;//Datenblocklänge in Bytes + +I; + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: + L #Suchzeiger;//Stelle, wo gelöscht werden soll + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + +//Daten verschieben: + CALL BLKMOV//DatenSortliste-Daten verschieben + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := #Ziel + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + +//Letzte Daten löschen: +Last: L #Datenlisten_Ende;//Ende des Datenbereichs + L #Datenblock_inBytes;//Datenblocklänge in Bytes + -I;//Ab hier löschen ! + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + L #Datensatzlaenge;//Datensatzlänge +L080: T #Schleife; + + AUF DB[ #DBDatenliste]; + + L 0;//Daten löschen + T DBW[ #AR1Zeiger]; + + L #AR1Zeiger; + SRD 3; + L 2;//nächstes DW + +D; + SLD 3; + T #AR1Zeiger; + + L #Schleife; + LOOP L080; + +//Speicherung letzter Zugriff: + L #SSDW; + + 12;//Offset letzter Zugriff + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #DBDatenliste]; + L 0;//löschen + T DBW[ #AR1Zeiger];//Speicherung letzter Zugriff + T #Suchzeiger;//Suchzeiger + + SET; + R #IndZeiger_ok;//Indizier-Zeiger angegeben + +//Anzahl Einträge: + L #SSDW; + + 16 ;//Offset Anzahl Einträge + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #DBDatenliste]; + L DBW[ #AR1Zeiger];//Anzahl der Einträge + + -1;//-1 + T DBW[ #AR1Zeiger];//Anzahl der Einträge + + L 0; + >=I; + SPB w080; + + T DBW[ #AR1Zeiger];//Minimum übergeben + +w080: SPA Nw11; + +NETWORK +TITLE = Daten aus Datenliste löschen ? (indiziert) +X010: L 16#E1 ;//Daten löschen ? + L #Para1;//1.Aufrufparameter + <>I;//Nein ! + SPB Nw11; + + L #Suchzeiger;//Suchzeiger + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #DBDatenliste]; + + L #Datensatzlaenge; +LA00: T #Schleife; + + L 0; + T DBW[ #AR1Zeiger]; + + L #AR1Zeiger; + SRD 3; + L DINT#2; + +D; + SLD 3; + T #AR1Zeiger; + + L #Schleife; + LOOP LA00; + + L #SSDW; + + 12; + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + L 0;//Löschen + T #Suchzeiger;//Suchzeiger + T DBW[ #AR1Zeiger]; + + SET; + R #IndZeiger_ok;//Indizier-Zeiger angegeben + +NETWORK +TITLE = Weitersuchen aktiv ? Datensatz vorhanden oder 0 ? +Nw11: UN #Weitersuchen; + SPB Nw12; + + L #OutDaten_Pointer; + LAR2; + + L #Datensatzlaenge; +L110: T #Schleife; + + L #DBOutDaten;//Outdaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB W111; + + AUF DB[ #DBOutDaten]; + +W111: L W[ AR2, P#0.0];//Outdaten überprüfen + L 0;//Etwas angegeben ? + <>I;//Ja ! + SPB W112;//Ok + + +AR2 P#2.0; + + L #Schleife; + LOOP L110; + + L 2#0000_0000_0100_0000;//Daten sind nicht vorhanden + T #tRE_VAL;//Ok-Status + SPA Ende; + +W112: L 2#0000_0000_1000_0000;//Daten sind vorhanden + T #tRE_VAL;//Ok-Status + SPA Ende; + +NETWORK +TITLE = Indizierung ok ? +Nw12: UN #Indok;//Indizierung möglich + O #IndZeiger_ok;//Indizier-Zeiger angegeben + SPB Ende; + + AUF DB[ #IndDB];//Indizierter DB - L Stammdaten -L500: T Schleife - - L DBSuchDaten // Suchdaten-DB - L 0 // Angegeben ? - ==I // Nein - JC W503 - - OPN DB[DBSuchDaten] - -W503: L NoneW [AR2,] // Suchdaten überprüfen - L 0 // Etwas angegeben ? - <>I // Ja ! - JC Nw06 // Weiter - - ADDAR2 P#2.0 - - L Schleife - LOOP L500 - - JU Err4 // Undefinierte Stammdaten - - ---- NW 6: Indiziert suchen ? --- -Nw06: L IndDB // Indizierter DB - L 0 // =0 ? - ==I // Kein indizierter DB ! - O Offsetsuchen - O Sortliste // Sortliste wird durchsucht - JC Nw07 - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=IndDB, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - -CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge") - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - O SFC_WRITE_PROT - JC Nw07 // kein Indizier-DB vorhanden - - L IndDB_Laenge // Länge des Indizierten DB überschritten ? - L DINT#2 // DB byteorientiert - *D - L "DB_Länge" - >I // Indizier-DB ist zu kurz - JC Nw07 // Zeiger ausserhalb Ind.DB - - L Stammdaten // Stammdaten - L 3 // zu viele Stammdaten ? - >=I // Ja ! - JC Nw07 // ohne Indizierung weiter - - L IndDaten_FC // Offset zum Abziehen - T Wandel_FC - L 0 // Parameter vorhanden ? - <=I // Nein - JC NoFC // Bei diesem Schritt weiter - - L Daten_1 // Stammdaten (1.DW) - T "MW90" // übergeben - L Daten_2 // Stammdaten (2.DW) - T "MD94" // übergeben - - UC DB[Wandel_FC] // Beeinflussung der Weiterfahrt - - L "MW92" // Rückwert von FC - - JU Ret - -NoFC: L Daten_1 // Stammdaten -Ret: T IndPointer // Stelle, wo Zeiger hinterlegt ist - L 0 - I // Suchzeiger nicht im Raster ! - JC W700 // Suche bei 1.Datensatz beginnen +Err: CLR;//VKE = 0 bei Fehler !!! + +Ok: T #tRE_VAL; + SAVE;//VKE in BIE-Bit speichern + + L #AR2_Speicher;//AR2 zurückspeichern + LAR2; + +NETWORK +TITLE = Ende + L #tRE_VAL; + T #RE_VAL; +END_FUNCTION - L 0 // Bei angegebener Stelle suchen - T Suchstelle // Such bei X-ten Datensatz - - JU W701 - -W700: L 1 // Suche bei 1.Datensatz beginnen - T Suchstelle // Such bei X-ten Datensatz - SET - R IndZeiger_ok // Indizier-Zeiger angegeben - L SSDW - + 20 // Offset für 1.Daten - T Suchzeiger // Suchzeiger - -W701: L Suchzeiger // Suchzeiger - L OffsetDaten_1 // Richtiger Offset der 1.Stammdaten - +I - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - L SuchDaten_Pointer - LAR2 - - L Stammdaten // Anzahl der Stammdaten -L700: T Schleife - - L DBSuchDaten // Suchdaten-DB - L 0 // Angegeben ? - ==I // Nein - JC W702 - - OPN DB[DBSuchDaten] - -W702: L NoneW [AR2,] // Suchdaten überprüfen mit - OPN DB[DBDatenliste] - L DBW [AR1Zeiger] // Datenliste-Daten lesen - <>I // nicht identisch ! - JC W703 - - L AR1Zeiger - SRD 3 - L DINT#2 - +D - SLD 3 - T AR1Zeiger - - ADDAR2 P#2.0 - - L Schleife - LOOP L700 - - L 2#0000_0000_1000_0000 // Daten sind vorhanden - T tRE_VAL // Ok-Status - - JU Nw08 // Datensatz ist in Liste enthalten - -W703: L 0 // Suche bei 1.Datensatz begonnen - L Suchstelle // Such bei X-ten Datensatz - ==I // Nein ! - JC W700 - - L Suchstelle // Such bei X-ten Datensatz - + 1 - T Suchstelle // Such bei X-ten Datensatz - L Listenlaenge // Anzahl aller Daten in Datenliste - <=I // Alle Datensätze sind durchsucht - JC W705 // Nein ! - - JU Err6 // Datensatz ist nicht vorhanden - -W705: L Datenblock_inBytes // Datenblocklänge in bytes - L Suchzeiger // Suchzeiger - +I - T Suchzeiger // Suchzeiger - JU W701 - - ---- NW 8: Out-DATEN-Pointer übernehmen: --- -Nw08: L P# - LAR2 - - L NoneW [AR2,] - T DBOutDaten // Outdaten-DB - L NoneD [AR2,] // Kennung, Adresse - T OutDaten_Pointer - - L DBOutDaten // Outdaten-DB - L 0 // Angegeben ? - ==I // Nein - JC Nw09 - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBOutDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - -CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge") - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 // Fehler vorhanden ? - <>I // Ja ! - JC Err5 // Undefinierte Outdaten - - L NoneD [AR2,] // Kennung, Adresse - L 16#00FF_FFFF // Ohne Kennung - AW - SRW 3 // Ohne Bit - T OutDaten_Startpunkt - - L OutDaten_Startpunkt - L "DB_Länge" - >I // Outdaten-DB ist zu kurz - JC Err5 // Undefinierte Outdaten - - ---- NW 9: Quelle-Pointer erzeugen: --- -Nw09: L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L Datensatzlaenge // Datenwords speichern - T LW2 - T LW12 // Wiederholungen - -// DATEN-Pointer übernehmen: - L SSDB - T LW4 // DB_Nummer - L Suchzeiger // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: -// Kennung + Datenbytes s.o. - - L DBOutDaten - T LW14 // DB_Nummer - L OutDaten_Pointer - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 - - A SFC_WRITE_PROT // Datenliste kann nicht beschrieben werden - JC Nw10 - - L SSDW - + 12 // Offset letzter Zugriff - ITD - SLD 3 // Pointer erzeugen - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - L Suchzeiger // Suchzeiger - OPN DB[DBDatenliste] - T DBW [AR1Zeiger] // Speicherung letzter Zugriff - - L Suchstelle // Such bei X-ten Datensatz - T Position // Übergabe nach außen - - ---- NW 10: Daten aus Datenliste löschen ? (nicht indiziert!) --- -Nw10: L 16#E1 // Daten löschen ? - L Para1 // 1.Aufrufparameter - <>I // Nein ! - O SFC_WRITE_PROT // Datenliste kann nicht beschrieben werden - JC Nw11 - - A Indok // Indizierung möglich - JC X010 // Bei ind.Zugriff nur löschen, nicht verschieben, keine Anzahl! - -// Gemeinsame Daten für Pointer erzeugen: - L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - - L Suchzeiger // Stelle, wo gelöscht werden soll - + -20 - L SSDW - -I - L Datenblock_inBytes // Datenblocklänge in bytes - /I - + 1 // Stelle, die gelöscht werden soll - T LoeschPos // Lösch-Position - L Listenlaenge // Länge der Datenliste (Letzter Eintrag zum Löschen ?) - ==I // Ja ! - JC Last // Ohne Verschieben letzten Eintrag löschen - - L LoeschPos // Lösch-Position - L Datensatzlaenge // Datenblocklänge - *I // Gesamtdatenlänge in Words - T NichtCopy // Datenmenge, die nicht vorschoben wird - - L Listenlaenge // Länge der Datenliste - L Datensatzlaenge // Datenblocklänge - *I // Gesamtdatenlänge in Words - L NichtCopy // Datenmenge, die nicht vorschoben wird - -I // abziehen - T LW2 - T LW12 // Wiederholungen - - L SSDB - T LW4 - T LW14 // DB_Nummer - -// Quelle-Pointer erzeugen: - L Suchzeiger // Stelle, wo gelöscht werden soll - L Datenblock_inBytes // Datenblocklänge in Bytes - +I - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: - L Suchzeiger // Stelle, wo gelöscht werden soll - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -// Daten verschieben: -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // DatenSortliste-Daten verschieben - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 - -// Letzte Daten löschen: -Last: L Datenlisten_Ende // Ende des Datenbereichs - L Datenblock_inBytes // Datenblocklänge in Bytes - -I // Ab hier löschen ! - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - L Datensatzlaenge // Datensatzlänge -L080: T Schleife - - OPN DB[DBDatenliste] - - L 0 // Daten löschen - T DBW [AR1Zeiger] - - L AR1Zeiger - SRD 3 - L 2 // nächstes DW - +D - SLD 3 - T AR1Zeiger - - L Schleife - LOOP L080 - -// Speicherung letzter Zugriff: - L SSDW - + 12 // Offset letzter Zugriff - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[DBDatenliste] - L 0 // löschen - T DBW [AR1Zeiger] // Speicherung letzter Zugriff - T Suchzeiger // Suchzeiger - - SET - R IndZeiger_ok // Indizier-Zeiger angegeben - -// Anzahl Einträge: - L SSDW - + 16 // Offset Anzahl Einträge - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[DBDatenliste] - L DBW [AR1Zeiger] // Anzahl der Einträge - + -1 // -1 - T DBW [AR1Zeiger] // Anzahl der Einträge - - L 0 - >=I - JC w080 - - T DBW [AR1Zeiger] // Minimum übergeben - -w080: JU Nw11 - - ---- NW 11: Daten aus Datenliste löschen ? (indiziert) --- -X010: L 16#E1 // Daten löschen ? - L Para1 // 1.Aufrufparameter - <>I // Nein ! - JC Nw11 - - L Suchzeiger // Suchzeiger - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[DBDatenliste] - - L Datensatzlaenge -LA00: T Schleife - - L 0 - T DBW [AR1Zeiger] - - L AR1Zeiger - SRD 3 - L DINT#2 - +D - SLD 3 - T AR1Zeiger - - L Schleife - LOOP LA00 - - L SSDW - + 12 - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - L 0 // Löschen - T Suchzeiger // Suchzeiger - T DBW [AR1Zeiger] - - SET - R IndZeiger_ok // Indizier-Zeiger angegeben - - ---- NW 12: Weitersuchen aktiv ? Datensatz vorhanden oder 0 ? --- -Nw11: AN Weitersuchen - JC Nw12 - - L OutDaten_Pointer - LAR2 - - L Datensatzlaenge -L110: T Schleife - - L DBOutDaten // Outdaten-DB - L 0 // Angegeben ? - ==I // Nein - JC W111 - - OPN DB[DBOutDaten] - -W111: L NoneW [AR2,] // Outdaten überprüfen - L 0 // Etwas angegeben ? - <>I // Ja ! - JC W112 // Ok - - ADDAR2 P#2.0 - - L Schleife - LOOP L110 - - L 2#0000_0000_0100_0000 // Daten sind nicht vorhanden - T tRE_VAL // Ok-Status - JU Ende - -W112: L 2#0000_0000_1000_0000 // Daten sind vorhanden - T tRE_VAL // Ok-Status - JU Ende - - ---- NW 13: Indizierung ok ? --- -Nw12: AN Indok // Indizierung möglich - O IndZeiger_ok // Indizier-Zeiger angegeben - JC Ende - - OPN DB[IndDB] // Indizierter DB - - L Suchzeiger // Suchzeiger - T DBW [IndPointer] - - OPN DB[DBDatenliste] // Datenliste DB - - ---- NW 14: Fehlerausgabe / RET_VAL --- -Ende: SET // VKE = 1 ohne Fehler !!! - L tRE_VAL // Ok-Status - JU Ok -Err0: L 2#0000_0000_0000_0001 // Kein Datenlistebereich - JU Err -Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler - JU Err -Err2: L 2#0000_0000_0000_0100 // Listenende ist erreicht - JU Err -Err3: L 2#0000_0000_0000_1000 // Falscher Parameter bei Aufruf - JU Err -Err4: L 2#0000_0000_0001_0000 // Undefinierte Suchdaten - JU Err -Err5: L 2#0000_0000_0010_0000 // Undefinierte OUTDaten - JU Err -Err6: L 2#0000_0000_0100_0000 // Datensatz nicht vorhanden - -Err: CLR // VKE = 0 bei Fehler !!! - -Ok: T tRE_VAL - SAVE // VKE in BIE-Bit speichern - - L AR2_Speicher // AR2 zurückspeichern - LAR2 - - ---- NW 15: Ende --- - L tRE_VAL - T RE_VAL diff --git a/=A01+UH07-KF00/Programmbausteine/Module/DatenOutSort.awl b/=A01+UH07-KF00/Programmbausteine/Module/DatenOutSort.awl index 76d164d..f3809fe 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/DatenOutSort.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/DatenOutSort.awl @@ -1,532 +1,604 @@ -=== FC 89: DatenOutSort [STL] === -INTERFACE: - Input: - SSDB : Int // Datenlisten-DB - SSDW : Int // Datenlisten-1.DW - PARA : Word // Aufrufparameter (Auftrag , Offset/Anzahl Daten) - Output: - OUTDATEN : Pointer // OutDaten-Schnittstelle - RE_VAL : Byte // Rückmeldung - InOut: - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Kopf : Byte // Datenliste-Kennnung (DA) - Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128 - Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze) - Stammdaten : Int // Stammdatenlänge in Word (1 - 9) - Belegt06 : Int // reserviert von Datenliste - Belegt08 : Int // reserviert von Datenliste - Belegt10 : Int // reserviert von Datenliste - Belegt12 : Int // reserviert von Datenliste - AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze - Reserve16 : Int // Reserve - Reserve18 : Int // Reserve - Para1 : Byte // 1.Aufrufparameter - Para2 : Byte // 2.Aufrufparameter - SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf - SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf - LeseStelle : Int // Stelle, wo gelesen werden soll - EraseStelle : Int // Stelle, wo gelöscht werden soll - FirstStelle : Int // Stelle, wo 1. zu bleibende Daten sind - DBDatenliste : Word // Datenlisten-DB - Datenlisten_Ende : Word // Ende der Datenliste - AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern - DBOutDaten : Word // Out-Daten-DB, falls angegeben - OutDaten_Pointer : DWord // Out-Daten-Pointer: Kennung, Adresse - OutDaten_Startpunkt : Word // Out-Daten-Startpunkt: Adresse - Datenblock_inBytes : Word // Datenblocklänge in Bytes - Suchstelle : Word // Bei angegebenen Datensatz suchen - SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf - NichtCopy : Int // Datenmenge, die nicht vorschoben wird - Schleife : Word // Loopzähler - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - Constant: - Return: - Ret_Val : Void - ---- NW 1: Schnittstellen-DB sinnvoll ? --- - TAR2 - T AR2_Speicher // AR2 zwischenspeichern - - L SSDB - T DBDatenliste - -// CALL TEST_DB -// DB_NUMBER :=#DBDatenliste -// RET_VAL :=#SFC_RET_VAL -// DB_LENGTH :=#SFC_DB_LENGTH -// WRITE_PROT :=#SFC_WRITE_PROT - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - O SFC_WRITE_PROT // schreibgeschützt - JC Err0 // kein Datenlisten-Bereich - - ---- NW 2: Quelle-Pointer erzeugen: --- - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 16#000A // 10 Dw´s holen - T LW2 // Wiederholungen - L SSDB - T LW4 // DB_Nummer - L SSDW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 - - ---- NW 3: Zeigerüberprüfung --- - L Kopf // Datenliste-Kopf - L 16#DB // = Datenlistekennung ? - <>I // Nein ! - JC Err0 // kein Datenlistebereich - - L 1 - L Datensatzlaenge // Datenblocklänge - >I - JC Err0 // kein Datenlistebereich - - L 128 - >I - JC Err0 // kein Datenlistebereich - - L 1 - L Listenlaenge // Max.Anzahl von Datenblöcken - >I - JC Err0 // kein Datenlistebereich - - L 1 - L Stammdaten // Anzahl der Stammdaten - >I - JC Err0 // kein Datenlistebereich - - L 9 - >I - JC Err0 // kein Datenlistebereich - - L Stammdaten // Anzahl der Stammdaten - L Datensatzlaenge // Datenblocklänge - >I - JC Err0 // kein Datenlistebereich - - L Listenlaenge // Länge der Datenliste - L Datensatzlaenge // Datenblocklänge - *I - L 2 // DB byteorientiert - *I - + 20 // Speichern ab 10.DW - L SSDW - +I - T Datenlisten_Ende - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[DBDatenliste] - - L Datenlisten_Ende - L SFC_DB_LENGTH - >I // Datenlisten-DB ist zu kurz! - JC Err0 // kein Datenlisten-Bereich - - L DBW [AR1Zeiger] - L 16#DBEE // Datenliste-Endekennung ? - <>I // Nein ! - JC Err0 // kein Datenlisten-Bereich - - L Datensatzlaenge // Datenblocklänge - L 2 - *I - T Datenblock_inBytes // Datenblocklänge in Bytes - - ---- NW 4: Auftrag kontrollieren --- - L PARA - T LW40 // Aufrufparameter zwischenspeichern - - L Para2 - L 16#00 - <=I - JC Err3 // Falscher Aufrufparameter - - CAC - L Listenlaenge // Länge der Datenliste (maximale Anzahl der Datensätze) - >I - JC Err3 // Falscher Aufrufparameter - - L 16#0A // XX = 0A ? (Datensatz YY lesen) - L Para1 - <>I // Nein ! - JC W400 - -// Eintrag lesen: - L Para2 // Datensatz YY - + -1 // 1.Datensatz ohne Offset - L Datenblock_inBytes // Datenblocklänge in bytes - *I - + 20 - L SSDW - +I - T LeseStelle // Stelle, wo gelesen werden soll - - JU Nw06 // OutDaten ok ? - -W400: L 16#0E // XX = 0E ? (Datensatz YY löschen) - <>I // Nein ! - JC W401 - -// Datensatz löschen: - L AnzahlEintraege - L 0 - ==I - JC Err2 // Liste ist leer - - L Para2 // Datensatz YY - L AnzahlEintraege // zu löschender Datensatz ist grösser als Einträge ? - >I // Ja ! - JC Ende // Keine Aktion - - L Para2 // Datensatz YY - + -1 // 1.Datensatz ohne Offset - L Datenblock_inBytes // Datenblocklänge in bytes - *I - + 20 - L SSDW - +I - T EraseStelle // Stelle, wo gelöscht werden soll - - JU Nw08 // Daten löschen - -W401: L 16#0D // XX = 0D ? (Datensätze YY löschen, ab 1.DS) - L Para1 - <>I // Nein ! - JC W402 - -// Datenblock löschen: - L AnzahlEintraege - L 0 - ==I - JC Err2 // Liste ist leer - - L Para2 // Anzahl Datensätze YY - L Datenblock_inBytes // Datenblocklänge in bytes - *I - + 20 - L SSDW - +I - T FirstStelle // Stelle, wo 1. zu bleibende Daten sind - - JU Nw09 - - BEU - -W402: JU Err3 // Falscher Aufrufparameter - - ---- NW 5: Outdaten ok ? --- - -// Out-DATEN-Pointer übernehmen: -Nw06: L P# - LAR2 - - L NoneW [AR2,] - T DBOutDaten // Outdaten-DB - L NoneD [AR2,] // Kennung, Adresse - T OutDaten_Pointer - - L DBOutDaten // Outdaten-DB - L 0 // Angegeben ? - ==I // Nein - JC Nw07 - -// CALL TEST_DB -// DB_NUMBER :=#DBOutDaten -// RET_VAL :=#SFC_RET_VAL -// DB_LENGTH :=#SFC_DB_LENGTH -// WRITE_PROT :=#SFC_WRITE_PROT - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBOutDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 // Fehler vorhanden ? - <>I // Ja ! - JC Err5 // Undefinierte Outdaten - - L NoneD [AR2,] // Kennung, Adresse - L 16#00FF_FFFF // Ohne Kennung - AW - SRW 3 // Ohne Bit - T OutDaten_Startpunkt - - L OutDaten_Startpunkt - L SFC_DB_LENGTH - >I // Outdaten-DB ist zu kurz - JC Err5 // Undefinierte Outdaten - - ---- NW 6: Daten aus Datenliste lesen (in OUTDaten übergeben) --- -// Quelle-Pointer erzeugen: -Nw07: L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L Datensatzlaenge // Datenwords speichern - T LW2 - T LW12 // Wiederholungen - -// DATEN-Pointer übernehmen: - L SSDB - T LW4 // DB_Nummer - L LeseStelle // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: -// Kennung + Datenbytes s.o. - - L DBOutDaten - T LW14 // DB_Nummer - L OutDaten_Pointer - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // DatenSortliste-Daten speichern - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 - - JU Ende - - ---- NW 7: Daten aus Datenliste löschen ? --- -// Gemeinsame Daten für Pointer erzeugen: -Nw08: L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - - L Datensatzlaenge // Datensatzlänge - L Para2 // Datensatz YY - *I - T NichtCopy // Datenmenge, die nicht vorschoben wird - - L Listenlaenge // Länge der Datenliste - L Datensatzlaenge // Datenblocklänge - *I // Gesamtdatenlänge in Words - L NichtCopy // Datenmenge, die nicht vorschoben wird - -I // abziehen - T LW2 - T LW12 // Wiederholungen - - L SSDB - T LW4 - T LW14 // DB_Nummer - -// Quelle-Pointer erzeugen: - L EraseStelle // Stelle, wo gelöscht werden soll - L Datenblock_inBytes // Datenblocklänge in Bytes - +I - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: - L EraseStelle // Stelle, wo gelöscht werden soll - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -// Daten verschieben: -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // DatenSortliste-Daten verschieben - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 - -// Letzte Daten löschen: - L Datenlisten_Ende // Ende des Datenbereichs - L Datenblock_inBytes // Datenblocklänge in Bytes - -I // Ab hier löschen ! - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - L Datensatzlaenge // Datensatzlänge -L080: T Schleife - - OPN DB[DBDatenliste] - - L 0 // Daten löschen - T DBW [AR1Zeiger] - - L AR1Zeiger - SRD 3 - L 2 - +D - SLD 3 - T AR1Zeiger - - L Schleife - LOOP L080 - - L AnzahlEintraege // Anzahl der eingetragenen Datensätze - + -1 - T AnzahlEintraege - - L 0 - >=I - JC w080 - - T AnzahlEintraege // Minimum übergeben - -w080: L SSDW - + 14 // Anzahl der Einträge - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[DBDatenliste] - L AnzahlEintraege // Anzahl der eingetragenen Datensätze - T DBW [AR1Zeiger] // Anzahl der Einträge - - JU Ende - - ---- NW 8: Datensätze aus Datenliste löschen ? --- -// Gemeinsame Daten für Pointer erzeugen: -Nw09: L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - - L Datensatzlaenge // Datensatzlänge - L Para2 // Anzahl Datensätze YY - *I - T NichtCopy // Datenmenge, die nicht vorschoben wird - - L Listenlaenge // Länge der Datenliste - L Datensatzlaenge // Datenblocklänge - *I // Gesamtdatenlänge in Words - L NichtCopy // Datenmenge, die nicht vorschoben wird - -I // abziehen - T LW2 - T LW12 // Wiederholungen - - L SSDB - T LW4 - T LW14 // DB_Nummer - -// Quelle-Pointer erzeugen: - L FirstStelle // Stelle, wo 1. zu bleibende Daten sind - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: - L SSDW - + 20 // 1.DS - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -// Daten verschieben: -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // DatenSortliste-Daten verschieben - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 - -// Letzte Daten löschen: - L Datenlisten_Ende // Ende des Datenbereichs - L NichtCopy // Datenmenge, die nicht vorschoben wird - -I - L NichtCopy // 2 mal, da Angabe in Word (Angabe in Byte benötigt!) - -I // Ab hier löschen ! - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - L NichtCopy // Datenmenge, die nicht vorschoben wird -L090: T Schleife - - OPN DB[DBDatenliste] - - L 0 // Daten löschen - T DBW [AR1Zeiger] - - L AR1Zeiger - SRD 3 - L 2 - +D - SLD 3 - T AR1Zeiger - - L Schleife - LOOP L090 - - L AnzahlEintraege // Anzahl der eingetragenen Datensätze - L Para2 // Anzahl Datensätze YY - -I - T AnzahlEintraege - - L 0 - >=I - JC w090 - - T AnzahlEintraege // Minimum übergeben - -w090: L SSDW - + 14 // Anzahl der Einträge - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[DBDatenliste] - L AnzahlEintraege // Anzahl der eingetragenen Datensätze - T DBW [AR1Zeiger] // Anzahl der Einträge - - JU Ende - - ---- NW 9: Fehlerausgabe / RET_VAL --- -Ende: SET // VKE = 1 ohne Fehler !!! - L 2#0000_0000_0000_0000 // Ok-Status - JU Ok -Err0: L 2#0000_0000_0000_0001 // Kein Datenlistebereich - JU Err -Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler - JU Err -Err2: L 2#0000_0000_0000_0100 // Sortliste ist leer - JU Err -Err3: L 2#0000_0000_0000_1000 // Falscher Parameter bei Aufruf - JU Err -Err5: L 2#0000_0000_0010_0000 // Undefinierte OUTDaten - -Err: CLR // VKE = 0 bei Fehler !!! - -Ok: T RE_VAL - SAVE // VKE in BIE-Bit speichern - - L AR2_Speicher // AR2 zurückspeichern - LAR2 +FUNCTION "DatenOutSort" : Void +TITLE = Datensort-Modul +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +FAMILY : DLISTE +NAME : DatenIn +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-1254 +//Version: ILS2100 / 06.11.2009 +// +//Datenblock in Datenliste suchen / löschen +//SSDB: Datenlisten-DB +//SSDW: Datenlisten-1.DW +//SEARCHDATEN: Pointer, wo einzutragende Daten stehen (P#DB1.DBX0.0, P#M220.0) +//AUFTRAG: XXYY +// XX: 0A = Datensatz YY lesen +// 0D = Datensätze löschen (ab DS1, Anzahl = YY) +// 0E = Datensatz YY löschen +// +// YY: 01 - Anzahl Einträge = Angabe welcher Datensatz / Anzahl zum Löschen +//OUTDATEN: Pointer, wohin ausgelesene Daten übergeben werden (P#DB1.DBX0.0, +// P#M220.0) +//RE_VAL: Rückmeldungen: +// Bit0: Kein Datenlistenbereich / falscher Kopfinhalt / Endekennung +// Bit1: SFC20-Aufruf mit Fehler +// Bit2: Sortliste ist leer +// Bit3: Falscher Parameter bei Aufruf +// Bit4: Frei +// Bit5: Undefinierte OUT-Daten +// Bit6: Frei +// Bit7: Frei +// + VAR_INPUT + SSDB : Int; // Datenlisten-DB + SSDW : Int; // Datenlisten-1.DW + PARA : Word; // Aufrufparameter (Auftrag , Offset/Anzahl Daten) + END_VAR + + VAR_OUTPUT + OUTDATEN : Pointer; // OutDaten-Schnittstelle + RE_VAL : Byte; // Rückmeldung + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Kopf : Byte; // Datenliste-Kennnung (DA) + Datensatzlaenge : Byte; // Datensatzlänge in Word (01 - F0) F0=128 + Listenlaenge : Int; // Länge der Datenliste (maximale Anzahl der Datensätze) + Stammdaten : Int; // Stammdatenlänge in Word (1 - 9) + Belegt06 : Int; // reserviert von Datenliste + Belegt08 : Int; // reserviert von Datenliste + Belegt10 : Int; // reserviert von Datenliste + Belegt12 : Int; // reserviert von Datenliste + AnzahlEintraege : Int; // Anzahl der eingetragenen Datensätze + Reserve16 : Int; // Reserve + Reserve18 : Int; // Reserve + Para1 : Byte; // 1.Aufrufparameter + Para2 : Byte; // 2.Aufrufparameter + SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf + SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf + LeseStelle : Int; // Stelle, wo gelesen werden soll + EraseStelle : Int; // Stelle, wo gelöscht werden soll + FirstStelle : Int; // Stelle, wo 1. zu bleibende Daten sind + DBDatenliste : Word; // Datenlisten-DB + Datenlisten_Ende : Word; // Ende der Datenliste + AR2_Speicher : DWord; // Adress-Register 2 zwischenspeichern + DBOutDaten : Word; // Out-Daten-DB, falls angegeben + OutDaten_Pointer : DWord; // Out-Daten-Pointer: Kennung, Adresse + OutDaten_Startpunkt : Word; // Out-Daten-Startpunkt: Adresse + Datenblock_inBytes : Word; // Datenblocklänge in Bytes + Suchstelle : Word; // Bei angegebenen Datensatz suchen + SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf + NichtCopy : Int; // Datenmenge, die nicht vorschoben wird + Schleife : Word; // Loopzähler + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + END_VAR + + +BEGIN +NETWORK +TITLE = Schnittstellen-DB sinnvoll ? + TAR2; + T #AR2_Speicher;//AR2 zwischenspeichern + + L #SSDB; + T #DBDatenliste; + +// CALL TEST_DB +// DB_NUMBER :=#DBDatenliste +// RET_VAL :=#SFC_RET_VAL +// DB_LENGTH :=#SFC_DB_LENGTH +// WRITE_PROT :=#SFC_WRITE_PROT + + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #DBDatenliste , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + O #SFC_WRITE_PROT;//schreibgeschützt + SPB Err0;//kein Datenlisten-Bereich + +NETWORK +TITLE = Datenlistekopf holen +//Quelle-Pointer erzeugen: + L 16#1004;//Kennung 10 + Word=04 + T %LW0 ;//Any-Kennung, Datentyp + L 16#000A;//10 Dw´s holen + T %LW2 ;//Wiederholungen + L #SSDB; + T %LW4 ;//DB_Nummer + L #SSDW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6 ;//Kennung, Adresse + + CALL BLKMOV//1.-10.DW Datenliste holen + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := P#L20.0 WORD 10 + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + +NETWORK +TITLE = Zeigerüberprüfung + L #Kopf;//Datenliste-Kopf + L 16#DB;//= Datenlistekennung ? + <>I;//Nein ! + SPB Err0;//kein Datenlistebereich + + L 1; + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err0;//kein Datenlistebereich + + L 128; + >I; + SPB Err0;//kein Datenlistebereich + + L 1; + L #Listenlaenge;//Max.Anzahl von Datenblöcken + >I; + SPB Err0;//kein Datenlistebereich + + L 1; + L #Stammdaten;//Anzahl der Stammdaten + >I; + SPB Err0;//kein Datenlistebereich + + L 9; + >I; + SPB Err0;//kein Datenlistebereich + + L #Stammdaten;//Anzahl der Stammdaten + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err0;//kein Datenlistebereich + + L #Listenlaenge;//Länge der Datenliste + L #Datensatzlaenge;//Datenblocklänge + *I; + L 2;//DB byteorientiert + *I; + + 20;//Speichern ab 10.DW + L #SSDW; + +I; + T #Datenlisten_Ende; + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #DBDatenliste]; + + L #Datenlisten_Ende; + L #SFC_DB_LENGTH; + >I;//Datenlisten-DB ist zu kurz! + SPB Err0;//kein Datenlisten-Bereich + + L DBW[ #AR1Zeiger]; + L 16#DBEE;//Datenliste-Endekennung ? + <>I;//Nein ! + SPB Err0;//kein Datenlisten-Bereich + + L #Datensatzlaenge;//Datenblocklänge + L 2; + *I; + T #Datenblock_inBytes;//Datenblocklänge in Bytes + +NETWORK +TITLE = Auftrag kontrollieren + L #PARA; + T %LW40;//Aufrufparameter zwischenspeichern + + L #Para2; + L 16#00; + <=I; + SPB Err3;//Falscher Aufrufparameter + + TAK; + L #Listenlaenge;//Länge der Datenliste (maximale Anzahl der Datensätze) + >I; + SPB Err3;//Falscher Aufrufparameter + + L 16#0A;//XX = 0A ? (Datensatz YY lesen) + L #Para1; + <>I;//Nein ! + SPB W400; + +//Eintrag lesen: + L #Para2;//Datensatz YY + + -1;//1.Datensatz ohne Offset + L #Datenblock_inBytes;//Datenblocklänge in bytes + *I; + + 20; + L #SSDW; + +I; + T #LeseStelle;//Stelle, wo gelesen werden soll + + SPA Nw06;//OutDaten ok ? + +W400: L 16#0E;//XX = 0E ? (Datensatz YY löschen) + <>I;//Nein ! + SPB W401; + +//Datensatz löschen: + L #AnzahlEintraege; + L 0; + ==I; + SPB Err2;//Liste ist leer + + L #Para2;//Datensatz YY + L #AnzahlEintraege;//zu löschender Datensatz ist grösser als Einträge ? + >I;//Ja ! + SPB Ende;//Keine Aktion + + L #Para2;//Datensatz YY + + -1;//1.Datensatz ohne Offset + L #Datenblock_inBytes;//Datenblocklänge in bytes + *I; + + 20; + L #SSDW; + +I; + T #EraseStelle;//Stelle, wo gelöscht werden soll + + SPA Nw08;//Daten löschen + +W401: L 16#0D;//XX = 0D ? (Datensätze YY löschen, ab 1.DS) + L #Para1; + <>I;//Nein ! + SPB W402; + +//Datenblock löschen: + L #AnzahlEintraege; + L 0; + ==I; + SPB Err2;//Liste ist leer + + L #Para2;//Anzahl Datensätze YY + L #Datenblock_inBytes;//Datenblocklänge in bytes + *I; + + 20; + L #SSDW; + +I; + T #FirstStelle;//Stelle, wo 1. zu bleibende Daten sind + + SPA Nw09; + + BEA; + +W402: SPA Err3;//Falscher Aufrufparameter + +NETWORK +TITLE = Outdaten ok ? + +//Out-DATEN-Pointer übernehmen: +Nw06: L P##OUTDATEN; + LAR2; + + L W[ AR2, P#0.0]; + T #DBOutDaten;//Outdaten-DB + L D[ AR2, P#2.0];//Kennung, Adresse + T #OutDaten_Pointer; + + L #DBOutDaten;//Outdaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB Nw07; + +// CALL TEST_DB +// DB_NUMBER :=#DBOutDaten +// RET_VAL :=#SFC_RET_VAL +// DB_LENGTH :=#SFC_DB_LENGTH +// WRITE_PROT :=#SFC_WRITE_PROT + + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #DBOutDaten , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000;//Fehler vorhanden ? + <>I;//Ja ! + SPB Err5;//Undefinierte Outdaten + + L D[ AR2, P#2.0];//Kennung, Adresse + L 16#00FF_FFFF;//Ohne Kennung + UW; + SRW 3;//Ohne Bit + T #OutDaten_Startpunkt; + + L #OutDaten_Startpunkt; + L #SFC_DB_LENGTH; + >I;//Outdaten-DB ist zu kurz + SPB Err5;//Undefinierte Outdaten + +NETWORK +TITLE = Daten aus Datenliste lesen (in OUTDaten übergeben) + +//Quelle-Pointer erzeugen: +Nw07: L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L #Datensatzlaenge;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//DATEN-Pointer übernehmen: + L #SSDB; + T %LW4;//DB_Nummer + L #LeseStelle;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: +//Kennung + Datenbytes s.o. + + L #DBOutDaten; + T %LW14;//DB_Nummer + L #OutDaten_Pointer; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//DatenSortliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := #Ziel + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + + SPA Ende; + +NETWORK +TITLE = Daten aus Datenliste löschen ? + +//Gemeinsame Daten für Pointer erzeugen: +Nw08: L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + + L #Datensatzlaenge;//Datensatzlänge + L #Para2;//Datensatz YY + *I; + T #NichtCopy;//Datenmenge, die nicht vorschoben wird + + L #Listenlaenge;//Länge der Datenliste + L #Datensatzlaenge;//Datenblocklänge + *I;//Gesamtdatenlänge in Words + L #NichtCopy;//Datenmenge, die nicht vorschoben wird + -I;//abziehen + T %LW2; + T %LW12;//Wiederholungen + + L #SSDB; + T %LW4; + T %LW14;//DB_Nummer + +//Quelle-Pointer erzeugen: + L #EraseStelle;//Stelle, wo gelöscht werden soll + L #Datenblock_inBytes;//Datenblocklänge in Bytes + +I; + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: + L #EraseStelle;//Stelle, wo gelöscht werden soll + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + +//Daten verschieben: + CALL BLKMOV//DatenSortliste-Daten verschieben + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := #Ziel + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + +//Letzte Daten löschen: + L #Datenlisten_Ende;//Ende des Datenbereichs + L #Datenblock_inBytes;//Datenblocklänge in Bytes + -I;//Ab hier löschen ! + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + L #Datensatzlaenge;//Datensatzlänge +L080: T #Schleife; + + AUF DB[ #DBDatenliste]; + + L 0;//Daten löschen + T DBW[ #AR1Zeiger]; + + L #AR1Zeiger; + SRD 3; + L 2; + +D; + SLD 3; + T #AR1Zeiger; + + L #Schleife; + LOOP L080; + + L #AnzahlEintraege;//Anzahl der eingetragenen Datensätze + + -1; + T #AnzahlEintraege; + + L 0; + >=I; + SPB w080; + + T #AnzahlEintraege;//Minimum übergeben + +w080: L #SSDW; + + 14;//Anzahl der Einträge + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #DBDatenliste]; + L #AnzahlEintraege;//Anzahl der eingetragenen Datensätze + T DBW[ #AR1Zeiger];//Anzahl der Einträge + + SPA Ende; + +NETWORK +TITLE = Datensätze aus Datenliste löschen ? + +//Gemeinsame Daten für Pointer erzeugen: +Nw09: L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + + L #Datensatzlaenge;//Datensatzlänge + L #Para2;//Anzahl Datensätze YY + *I; + T #NichtCopy;//Datenmenge, die nicht vorschoben wird + + L #Listenlaenge;//Länge der Datenliste + L #Datensatzlaenge;//Datenblocklänge + *I;//Gesamtdatenlänge in Words + L #NichtCopy;//Datenmenge, die nicht vorschoben wird + -I;//abziehen + T %LW2; + T %LW12;//Wiederholungen + + L #SSDB; + T %LW4; + T %LW14;//DB_Nummer + +//Quelle-Pointer erzeugen: + L #FirstStelle;//Stelle, wo 1. zu bleibende Daten sind + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: + L #SSDW; + + 20;//1.DS + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + +//Daten verschieben: + CALL BLKMOV//DatenSortliste-Daten verschieben + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := #Ziel + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + +//Letzte Daten löschen: + L #Datenlisten_Ende;//Ende des Datenbereichs + L #NichtCopy;//Datenmenge, die nicht vorschoben wird + -I; + L #NichtCopy;//2 mal, da Angabe in Word (Angabe in Byte benötigt!) + -I;//Ab hier löschen ! + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + L #NichtCopy;//Datenmenge, die nicht vorschoben wird +L090: T #Schleife; + + AUF DB[ #DBDatenliste]; + + L 0;//Daten löschen + T DBW[ #AR1Zeiger]; + + L #AR1Zeiger; + SRD 3; + L 2; + +D; + SLD 3; + T #AR1Zeiger; + + L #Schleife; + LOOP L090; + + L #AnzahlEintraege;//Anzahl der eingetragenen Datensätze + L #Para2;//Anzahl Datensätze YY + -I; + T #AnzahlEintraege; + + L 0; + >=I; + SPB w090; + + T #AnzahlEintraege;//Minimum übergeben + +w090: L #SSDW; + + 14;//Anzahl der Einträge + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #DBDatenliste]; + L #AnzahlEintraege;//Anzahl der eingetragenen Datensätze + T DBW[ #AR1Zeiger];//Anzahl der Einträge + + SPA Ende; + +NETWORK +TITLE = Fehlerausgabe / RET_VAL +Ende: SET;//VKE = 1 ohne Fehler !!! + L 2#0000_0000_0000_0000;//Ok-Status + SPA Ok; +Err0: L 2#0000_0000_0000_0001;//Kein Datenlistebereich + SPA Err; +Err1: L 2#0000_0000_0000_0010;//SFC20-Aufruf mit Fehler + SPA Err; +Err2: L 2#0000_0000_0000_0100;//Sortliste ist leer + SPA Err; +Err3: L 2#0000_0000_0000_1000;//Falscher Parameter bei Aufruf + SPA Err; +Err5: L 2#0000_0000_0010_0000;//Undefinierte OUTDaten + +Err: CLR;//VKE = 0 bei Fehler !!! + +Ok: T #RE_VAL; + SAVE;//VKE in BIE-Bit speichern + + L #AR2_Speicher;//AR2 zurückspeichern + LAR2; + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Module/DatenReset.awl b/=A01+UH07-KF00/Programmbausteine/Module/DatenReset.awl index 9f935f4..6504bd7 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/DatenReset.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/DatenReset.awl @@ -1,234 +1,286 @@ -=== FC 87: DatenReset [STL] === -INTERFACE: - Input: - SSDB : Int // Datenlisten-DB - SSDW : Int // Datenlisten-1.DW - Output: - RE_VAL : Byte // Rückmeldung - InOut: - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Kopf : Byte // Datenliste-Kennnung (DA) - Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128 - Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze) - Stammdaten : Int // Stammdatenlänge in Word (1 - 9) - IndDB : Word // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) - IndDB_Laenge : Int // Länge des indizierten DB in Einträge (nur bei Stammdaten = 1 erlaubt !!!) - IndDaten_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) - Suchzeiger : Int // Speicherung des letzten Zugriffs / Suchzeiger - Belegt14 : Int // reserviert von Sort-Datenliste - Reserve16 : Int // Reserve - Reserve18 : Int // Reserve - DBDatenliste : Word // Datenlisten-DB - SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf - SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf - Datenlisten_Ende : Word // Ende der Datenliste - Schleife : Word // Loopzähler - SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - DB_Länge : Int - Constant: - Return: - Ret_Val : Void +FUNCTION "DatenReset" : Void +TITLE = Datenlisten-Modul +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +FAMILY : DLISTE +NAME : DatenIn +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-1254 +//Version: P&O / 10.2024 +//Version: ILS2100 / 06.11.2009 +// +//Datenblock in Datenliste resetten +//SSDB: Datenlisten-DB +//SSDW: Datenlisten-1.DW +//RE_VAL: Rückmeldungen: +// Bit0: Kein Datenlistenbereich / falscher Kopfinhalt / Endekennung +// Bit1: SFC20-Aufruf mit Fehler +// Bit2: Frei +// Bit3: Frei +// Bit4: Frei +// Bit5: Frei +// Bit6: Frei +// Bit7: Frei +// + VAR_INPUT + SSDB : Int; // Datenlisten-DB + SSDW : Int; // Datenlisten-1.DW + END_VAR ---- NW 1: Schnittstellen-DB sinnvoll ? --- - L SSDB - T DBDatenliste + VAR_OUTPUT + RE_VAL : Byte; // Rückmeldung + END_VAR -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - -CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge") - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - O SFC_WRITE_PROT - JC Err0 // kein Datenlisten-Bereich + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Kopf : Byte; // Datenliste-Kennnung (DA) + Datensatzlaenge : Byte; // Datensatzlänge in Word (01 - F0) F0=128 + Listenlaenge : Int; // Länge der Datenliste (maximale Anzahl der Datensätze) + Stammdaten : Int; // Stammdatenlänge in Word (1 - 9) + IndDB : Word; // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) + IndDB_Laenge : Int; // Länge des indizierten DB in Einträge (nur bei Stammdaten = 1 erlaubt !!!) + IndDaten_FC : Int; // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) + Suchzeiger : Int; // Speicherung des letzten Zugriffs / Suchzeiger + Belegt14 : Int; // reserviert von Sort-Datenliste + Reserve16 : Int; // Reserve + Reserve18 : Int; // Reserve + DBDatenliste : Word; // Datenlisten-DB + SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf + SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf + Datenlisten_Ende : Word; // Ende der Datenliste + Schleife : Word; // Loopzähler + SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + DB_Länge : Int; + END_VAR ---- NW 2: Quelle-Pointer erzeugen: --- - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 16#000A // 10 Dw´s holen - T LW2 // Wiederholungen - L SSDB - T LW4 // DB_Nummer - L SSDW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse +BEGIN +NETWORK +TITLE = Schnittstellen-DB sinnvoll ? + L #SSDB; + T #DBDatenliste; -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #DBDatenliste , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 + CALL "BCD (4stellig)_to_INT" + ( BCD_Wert := #SFC_DB_LENGTH , + Int_Wert := #DB_Länge + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + O #SFC_WRITE_PROT; + SPB Err0;//kein Datenlisten-Bereich + +NETWORK +TITLE = Datenlistekopf holen +//Quelle-Pointer erzeugen: + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 16#000A;//10 Dw´s holen + T %LW2;//Wiederholungen + L #SSDB; + T %LW4;//DB_Nummer + L #SSDW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//1.-10.DW Datenliste holen + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := P#L20.0 WORD 10 + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + +NETWORK +TITLE = Zeigerüberprüfung + L #Kopf;//Datenliste-Kopf + L 16#DA;//= Datenlistekennung ? + <>I;//Nein ! + SPB Err0;//kein Datenlistebereich + + L 1; + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err0;//kein Datenlistebereich + + L 128; + >I; + SPB Err0;//kein Datenlistebereich + + L 1; + L #Listenlaenge;//Max.Anzahl von Datenblöcken + >I; + SPB Err0;//kein Datenlistebereich + + L 1; + L #Stammdaten;//Anzahl der Stammdaten + >I; + SPB Err0;//kein Datenlistebereich + + L 9; + >I; + SPB Err0;//kein Datenlistebereich + + L #Stammdaten;//Anzahl der Stammdaten + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err0;//kein Datenlistebereich + + L #Listenlaenge;//Länge der Datenliste + L #Datensatzlaenge;//Datenblocklänge + *I; + L 2;//DB byteorientiert + *I; + + 20;//Speichern ab 10.DW + L #SSDW; + +I; + T #Datenlisten_Ende; + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #DBDatenliste]; + + L #Datenlisten_Ende; + L #DB_Länge; + >I ;//Datenlisten-DB ist zu kurz! + SPB Err0;//kein Datenlisten-Bereich + + L DBW[ #AR1Zeiger]; + L 16#DAEE;//Datenliste-Endekennung ? + <>I;//Nein ! + SPB Err0;//kein Datenlisten-Bereich + +NETWORK +TITLE = Indizierung löschen ? + L #IndDB;//Indizierter DB + L 0;//=0 ? + ==I;//Kein indizierter DB ! + SPB Nw05; + + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #IndDB , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + + CALL "BCD (4stellig)_to_INT" + ( BCD_Wert := #SFC_DB_LENGTH , + Int_Wert := #DB_Länge + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + O #SFC_WRITE_PROT; + SPB Nw05;//kein Indizier-DB vorhanden + + L 0; + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #IndDB]; + + L #DB_Länge ;//In Bytes angegeben +L400: T #Schleife; + + L 0; + T DBB[ #AR1Zeiger] ;//Inhalte löschen + + L #AR1Zeiger; + SRD 3; + L DINT#1; + +D; + SLD 3; + T #AR1Zeiger; + + L #Schleife; + LOOP L400; ---- NW 3: Zeigerüberprüfung --- - L Kopf // Datenliste-Kopf - L 16#DA // = Datenlistekennung ? - <>I // Nein ! - JC Err0 // kein Datenlistebereich +NETWORK +TITLE = Datenliste löschen +Nw05: L #SSDW; + + 12 ;//12.Dw + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - L 1 - L Datensatzlaenge // Datenblocklänge - >I - JC Err0 // kein Datenlistebereich + AUF DB[ #DBDatenliste]; - L 128 - >I - JC Err0 // kein Datenlistebereich + L 0; + T DBW[ #AR1Zeiger] ;//Letzte Speicherung löschen - L 1 - L Listenlaenge // Max.Anzahl von Datenblöcken - >I - JC Err0 // kein Datenlistebereich + L #SSDW; + + 16 ;//16.Dw + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - L 1 - L Stammdaten // Anzahl der Stammdaten - >I - JC Err0 // kein Datenlistebereich + AUF DB[ #DBDatenliste]; - L 9 - >I - JC Err0 // kein Datenlistebereich + L 0; + T DBW[ #AR1Zeiger] ;//Anzahl Einträge löschen - L Stammdaten // Anzahl der Stammdaten - L Datensatzlaenge // Datenblocklänge - >I - JC Err0 // kein Datenlistebereich + L #SSDW; + + 20 ;//Daten ab 20.Dw + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - L Listenlaenge // Länge der Datenliste - L Datensatzlaenge // Datenblocklänge - *I - L 2 // DB byteorientiert - *I - + 20 // Speichern ab 10.DW - L SSDW - +I - T Datenlisten_Ende - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + L #Datensatzlaenge; + L #Listenlaenge; + *I; +L500: T #Schleife; - OPN DB[DBDatenliste] + AUF DB[ #DBDatenliste]; - L Datenlisten_Ende - L "DB_Länge" - >I // Datenlisten-DB ist zu kurz! - JC Err0 // kein Datenlisten-Bereich + L 0; + T DBW[ #AR1Zeiger] ;//Inhalte löschen - L DBW [AR1Zeiger] - L 16#DAEE // Datenliste-Endekennung ? - <>I // Nein ! - JC Err0 // kein Datenlisten-Bereich + L #AR1Zeiger; + SRD 3; + L DINT#2; + +D; + SLD 3; + T #AR1Zeiger; + + L #Schleife; + LOOP L500; ---- NW 4: Indizierung löschen ? --- - L IndDB // Indizierter DB - L 0 // =0 ? - ==I // Kein indizierter DB ! - JC Nw05 +NETWORK +TITLE = Fehlerausgabe / RET_VAL + SET;//VKE = 1 ohne Fehler !!! + SPA Ok; +Err0: L 2#0000_0000_0000_0001;//Kein Fifobereich + SPA Err; +Err1: L 2#0000_0000_0000_0010;//SFC20-Aufruf mit Fehler -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=IndDB, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) +Err: CLR;//VKE = 0 bei Fehler !!! +Ok: T #RE_VAL; -CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge") + SAVE;//VKE in BIE-Bit speichern - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - O SFC_WRITE_PROT - JC Nw05 // kein Indizier-DB vorhanden - - L 0 - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[IndDB] - - L "DB_Länge" // In Bytes angegeben -L400: T Schleife - - L 0 - T DBB [AR1Zeiger] // Inhalte löschen - - L AR1Zeiger - SRD 3 - L DINT#1 - +D - SLD 3 - T AR1Zeiger - - L Schleife - LOOP L400 - - - ---- NW 5: Datenliste löschen --- -Nw05: L SSDW - + 12 // 12.Dw - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[DBDatenliste] - - L 0 - T DBW [AR1Zeiger] // Letzte Speicherung löschen - - L SSDW - + 16 // 16.Dw - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[DBDatenliste] - - L 0 - T DBW [AR1Zeiger] // Anzahl Einträge löschen - - L SSDW - + 20 // Daten ab 20.Dw - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - - L Datensatzlaenge - L Listenlaenge - *I -L500: T Schleife - - OPN DB[DBDatenliste] - - L 0 - T DBW [AR1Zeiger] // Inhalte löschen - - L AR1Zeiger - SRD 3 - L DINT#2 - +D - SLD 3 - T AR1Zeiger - - L Schleife - LOOP L500 - - - ---- NW 6: Fehlerausgabe / RET_VAL --- - SET // VKE = 1 ohne Fehler !!! - JU Ok -Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich - JU Err -Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler - -Err: CLR // VKE = 0 bei Fehler !!! -Ok: T RE_VAL - - SAVE // VKE in BIE-Bit speichern +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Module/DatenResetSort.awl b/=A01+UH07-KF00/Programmbausteine/Module/DatenResetSort.awl index d894185..e778685 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/DatenResetSort.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/DatenResetSort.awl @@ -1,183 +1,223 @@ -=== FC 90: DatenResetSort [STL] === -INTERFACE: - Input: - SSDB : Int // Datenlisten-DB - SSDW : Int // Datenlisten-1.DW - Output: - RE_VAL : Byte // Rückmeldung - InOut: - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Kopf : Byte // Datenliste-Kennnung (DA) - Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128 - Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze) - Stammdaten : Int // Stammdatenlänge in Word (1 - 9) - Belegt06 : Int // reserviert von Datenliste - Belegt08 : Int // reserviert von Datenliste - Belegt10 : Int // reserviert von Datenliste - Belegt12 : Int // reserviert von Datenliste - AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze - Reserve16 : Int // Reserve - Reserve18 : Int // Reserve - Suchzeiger : Int // Speicherung des letzten Zugriffs / Suchzeiger - DBDatenliste : Word // Datenlisten-DB - SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf - SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf - Datenlisten_Ende : Word // Ende der Datenliste - Schleife : Word // Loopzähler - SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - Constant: - Return: - Ret_Val : Void +FUNCTION "DatenResetSort" : Void +TITLE = Datenlisten-Modul +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +FAMILY : DLISTE +NAME : DatenIn +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-1254 +//Version: ILS2100 / 06.11.2009 +// +//Datenblock in Datenliste resetten +//SSDB: Datenlisten-DB +//SSDW: Datenlisten-1.DW +//RE_VAL: Rückmeldungen: +// Bit0: Kein Datenlistenbereich / falscher Kopfinhalt / Endekennung +// Bit1: SFC20-Aufruf mit Fehler +// Bit2: Frei +// Bit3: Frei +// Bit4: Frei +// Bit5: Frei +// Bit6: Frei +// Bit7: Frei +// + VAR_INPUT + SSDB : Int; // Datenlisten-DB + SSDW : Int; // Datenlisten-1.DW + END_VAR ---- NW 1: Schnittstellen-DB sinnvoll ? --- - L SSDB - T DBDatenliste + VAR_OUTPUT + RE_VAL : Byte; // Rückmeldung + END_VAR -// CALL TEST_DB -// DB_NUMBER :=#DBDatenliste -// RET_VAL :=#SFC_RET_VAL -// DB_LENGTH :=#SFC_DB_LENGTH -// WRITE_PROT :=#SFC_WRITE_PROT - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - O SFC_WRITE_PROT - JC Err0 // kein Datenlisten-Bereich + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Kopf : Byte; // Datenliste-Kennnung (DA) + Datensatzlaenge : Byte; // Datensatzlänge in Word (01 - F0) F0=128 + Listenlaenge : Int; // Länge der Datenliste (maximale Anzahl der Datensätze) + Stammdaten : Int; // Stammdatenlänge in Word (1 - 9) + Belegt06 : Int; // reserviert von Datenliste + Belegt08 : Int; // reserviert von Datenliste + Belegt10 : Int; // reserviert von Datenliste + Belegt12 : Int; // reserviert von Datenliste + AnzahlEintraege : Int; // Anzahl der eingetragenen Datensätze + Reserve16 : Int; // Reserve + Reserve18 : Int; // Reserve + Suchzeiger : Int; // Speicherung des letzten Zugriffs / Suchzeiger + DBDatenliste : Word; // Datenlisten-DB + SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf + SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf + Datenlisten_Ende : Word; // Ende der Datenliste + Schleife : Word; // Loopzähler + SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + END_VAR ---- NW 2: Quelle-Pointer erzeugen: --- - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 16#000A // 10 Dw´s holen - T LW2 // Wiederholungen - L SSDB - T LW4 // DB_Nummer - L SSDW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse +BEGIN +NETWORK +TITLE = Schnittstellen-DB sinnvoll ? + L #SSDB; + T #DBDatenliste; -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen +// CALL TEST_DB +// DB_NUMBER :=#DBDatenliste +// RET_VAL :=#SFC_RET_VAL +// DB_LENGTH :=#SFC_DB_LENGTH +// WRITE_PROT :=#SFC_WRITE_PROT - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #DBDatenliste , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + O #SFC_WRITE_PROT; + SPB Err0;//kein Datenlisten-Bereich ---- NW 3: Zeigerüberprüfung --- - L Kopf // Datenliste-Kopf - L 16#DB // = DatenSortlistekennung ? - <>I // Nein ! - JC Err0 // kein Datenlistebereich +NETWORK +TITLE = Datenlistekopf holen +//Quelle-Pointer erzeugen: + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 16#000A;//10 Dw´s holen + T %LW2;//Wiederholungen + L #SSDB; + T %LW4;//DB_Nummer + L #SSDW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse - L 1 - L Datensatzlaenge // Datenblocklänge - >I - JC Err0 // kein Datenlistebereich + CALL BLKMOV//1.-10.DW Datenliste holen + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := P#L20.0 WORD 10 + ); - L 128 - >I - JC Err0 // kein Datenlistebereich + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; - L 1 - L Listenlaenge // Max.Anzahl von Datenblöcken - >I - JC Err0 // kein Datenlistebereich +NETWORK +TITLE = Zeigerüberprüfung + L #Kopf;//Datenliste-Kopf + L 16#DB;//= DatenSortlistekennung ? + <>I;//Nein ! + SPB Err0;//kein Datenlistebereich - L 1 - L Stammdaten // Anzahl der Stammdaten - >I - JC Err0 // kein Datenlistebereich + L 1; + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err0;//kein Datenlistebereich - L 9 - >I - JC Err0 // kein Datenlistebereich + L 128; + >I; + SPB Err0;//kein Datenlistebereich - L Stammdaten // Anzahl der Stammdaten - L Datensatzlaenge // Datenblocklänge - >I - JC Err0 // kein Datenlistebereich + L 1; + L #Listenlaenge;//Max.Anzahl von Datenblöcken + >I; + SPB Err0;//kein Datenlistebereich - L Listenlaenge // Länge der Datenliste - L Datensatzlaenge // Datenblocklänge - *I - L 2 // DB byteorientiert - *I - + 20 // Speichern ab 10.DW - L SSDW - +I - T Datenlisten_Ende - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + L 1; + L #Stammdaten;//Anzahl der Stammdaten + >I; + SPB Err0;//kein Datenlistebereich - OPN DB[DBDatenliste] + L 9; + >I; + SPB Err0;//kein Datenlistebereich - L Datenlisten_Ende - L SFC_DB_LENGTH - >I // Datenlisten-DB ist zu kurz! - JC Err0 // kein Datenlisten-Bereich + L #Stammdaten;//Anzahl der Stammdaten + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err0;//kein Datenlistebereich - L DBW [AR1Zeiger] - L 16#DBEE // DatenSortliste-Endekennung ? - <>I // Nein ! - JC Err0 // kein Datenlisten-Bereich + L #Listenlaenge;//Länge der Datenliste + L #Datensatzlaenge;//Datenblocklänge + *I; + L 2;//DB byteorientiert + *I; + + 20;//Speichern ab 10.DW + L #SSDW; + +I; + T #Datenlisten_Ende; + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AUF DB[ #DBDatenliste]; ---- NW 4: Datenliste löschen --- - L SSDW - + 14 // 14.Dw - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + L #Datenlisten_Ende; + L #SFC_DB_LENGTH; + >I;//Datenlisten-DB ist zu kurz! + SPB Err0;//kein Datenlisten-Bereich - OPN DB[DBDatenliste] + L DBW[ #AR1Zeiger]; + L 16#DBEE;//DatenSortliste-Endekennung ? + <>I;//Nein ! + SPB Err0;//kein Datenlisten-Bereich - L 0 - T DBW [AR1Zeiger] // Anzahl Einträge löschen +NETWORK +TITLE = Datenliste löschen + L #SSDW; + + 14;//14.Dw + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - L SSDW - + 20 // 20.Dw - ITD - SLD 3 - T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AUF DB[ #DBDatenliste]; - L Datensatzlaenge - L Listenlaenge - *I -L500: T Schleife + L 0; + T DBW[ #AR1Zeiger];//Anzahl Einträge löschen - L 0 // Daten löschen - T DBW [AR1Zeiger] + L #SSDW; + + 20;//20.Dw + ITD; + SLD 3; + T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - L AR1Zeiger - SRD 3 - L 2 - +D - SLD 3 - T AR1Zeiger + L #Datensatzlaenge; + L #Listenlaenge; + *I; +L500: T #Schleife; - L Schleife - LOOP L500 + L 0;//Daten löschen + T DBW[ #AR1Zeiger]; + L #AR1Zeiger; + SRD 3; + L 2; + +D; + SLD 3; + T #AR1Zeiger; ---- NW 5: Fehlerausgabe / RET_VAL --- - SET // VKE = 1 ohne Fehler !!! - JU Ok -Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich - JU Err -Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler + L #Schleife; + LOOP L500; -Err: CLR // VKE = 0 bei Fehler !!! -Ok: T RE_VAL +NETWORK +TITLE = Fehlerausgabe / RET_VAL + SET;//VKE = 1 ohne Fehler !!! + SPA Ok; +Err0: L 2#0000_0000_0000_0001;//Kein Fifobereich + SPA Err; +Err1: L 2#0000_0000_0000_0010;//SFC20-Aufruf mit Fehler - SAVE // VKE in BIE-Bit speichern +Err: CLR;//VKE = 0 bei Fehler !!! +Ok: T #RE_VAL; + + SAVE;//VKE in BIE-Bit speichern + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Module/Err_vorhanden.awl b/=A01+UH07-KF00/Programmbausteine/Module/Err_vorhanden.awl index 0414324..24591af 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/Err_vorhanden.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/Err_vorhanden.awl @@ -1,65 +1,73 @@ -=== FC 125: Err_vorhanden [STL] === -INTERFACE: - Input: - Check_DB : Int - Anfangs_DW : DInt - Ende_DW : DInt - Output: - Stoerung : Bool // Störung vorhanden - ErrDW : DInt - ErrBits : Int - InOut: - Temp: - Anzeige_DB : Int - Zeiger : DInt // Startwert mit Offset 0 - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - Constant: - Return: - Ret_Val : Void +FUNCTION "Err_vorhanden" : Void +TITLE = Störung aktiv +{ S7_Optimized_Access := 'FALSE' } +VERSION : 0.1 + VAR_INPUT + Check_DB : Int; + Anfangs_DW : DInt; + Ende_DW : DInt; + END_VAR ---- NW 1: Check-DB von "Abfangs_DW" bis "Ende_DW" checken --- - SET // GST - R Stoerung - L DINT#-1 // Sonst Störung in DBD0 nicht erkennbar - T ErrDW - L 0 - T ErrBits + VAR_OUTPUT + Stoerung : Bool; // Störung vorhanden + ErrDW : DInt; + ErrBits : Int; + END_VAR - L Check_DB - T Anzeige_DB - - L Anfangs_DW // Mit diesem DW beginnen - T Zeiger // Zeiger - -Loop: L Zeiger // Zeiger - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[Anzeige_DB] - - L DBW [AR1Zeiger] // Störungsbits - T ErrBits - L 0 // aktiv ? - <>I // Ja ! - JC Err - - L Zeiger // Startwert mit Offset 0 - L 2 - +D - T Zeiger // Zeiger - L Ende_DW // Letztes DW überschritten? - <=D // Nein ! - JC Loop - - BEU - -Err: SET - S Stoerung - - L Zeiger // Zeiger - T ErrDW + VAR_TEMP + Anzeige_DB : Int; + Zeiger : DInt; // Startwert mit Offset 0 + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + END_VAR ---- NW 2: Ende --- - BE +BEGIN +NETWORK +TITLE = Check-DB von "Abfangs_DW" bis "Ende_DW" checken + SET;//GST + R #Stoerung; + L DINT#-1;//Sonst Störung in DBD0 nicht erkennbar + T #ErrDW; + L 0; + T #ErrBits; + + L #Check_DB; + T #Anzeige_DB; + + L #Anfangs_DW;//Mit diesem DW beginnen + T #Zeiger;//Zeiger + +Loop: L #Zeiger;//Zeiger + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #Anzeige_DB]; + + L DBW[ #AR1Zeiger];//Störungsbits + T #ErrBits; + L 0;//aktiv ? + <>I;//Ja ! + SPB Err; + + L #Zeiger;//Startwert mit Offset 0 + L 2; + +D; + T #Zeiger;//Zeiger + L #Ende_DW;//Letztes DW überschritten? + <=D;//Nein ! + SPB Loop; + + BEA; + +Err: SET; + S #Stoerung; + + L #Zeiger;//Zeiger + T #ErrDW; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Module/FIFOChange.awl b/=A01+UH07-KF00/Programmbausteine/Module/FIFOChange.awl index 54cf02d..a1a7862 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/FIFOChange.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/FIFOChange.awl @@ -1,327 +1,375 @@ -=== FC 84: FIFOChange [STL] === -INTERFACE: - Input: - SSDB : Int // Schnittstellen-DB - SSDW : Int // Schnittstellen-1.DW - CH_POS : Int // Position des Eintrags, der zu ändernden Daten - CHANGEDATEN : Pointer // Wechsel-Daten-Schnittstelle - Output: - RE_VAL : Byte // Rückmeldung - InOut: - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Kopf : Byte // Fifo-Kennung (FF) - Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128) - FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze) - Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird - Holzeiger : Int // Zeiger, woher nächste Daten geholt werden - Anzahl : Int // Anzahl der Datensätze (eingetragene) - Status : Word // Status des Fifo - Err : Byte // Fehlerbits - MinHolzeiger : Int // Minimum Holzeiger - MaxHolzeiger : Int // Maximum Holzeiger - DBFifo : Word // FIFO-DB - SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf - SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf - Fifo_Ende : Word // Ende des Fifo - AlleDaten : Word // Anzahl der bytes für alle Daten - Offset : Word // Offset zu überschreibender Datensatz - NixSave : Bool // Status nicht speichern - SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - Constant: - Return: - Ret_Val : Void +FUNCTION "FIFOChange" : Void +TITLE = Fifo-Modul +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +FAMILY : FIFO +NAME : FifoIn +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-960629 +//Version: KyungBang00 / 14.04.2009 +// +//Datenblock in Fifo überschreiben +//SSDB: FIFO-DB +//SSDW: FIFO-1.DW +//CH_POS: angegebene Position überschreiben +//CHANGEDATEN: Pointer, wo zu ändernde Daten stehen (P#DB1.DBX0.0, P#M220.0) +//RE_VAL: Rückmeldungen: +// Bit0: Kein Fifobereich / falscher Kopfinhalt / Endekennung +// Bit1: SFC20-Aufruf mit Fehler +// Bit2: Fifo ist leer +// Bit3: Falscher Parameter bei Aufruf +// Bit4: Position nicht belegt +// Bit5: Bringzeiger ist ausserhalb +// Bit6: Holzeiger ist ausserhalb +// Bit7: Versatz Bring-/Holzeiger +// + VAR_INPUT + SSDB : Int; // Schnittstellen-DB + SSDW : Int; // Schnittstellen-1.DW + CH_POS : Int; // Position des Eintrags, der zu ändernden Daten + CHANGEDATEN : Pointer; // Wechsel-Daten-Schnittstelle + END_VAR ---- NW 1: Schnittstellen-DB sinnvoll ? --- - L SSDB - T DBFifo + VAR_OUTPUT + RE_VAL : Byte; // Rückmeldung + END_VAR -// CALL TEST_DB -// DB_NUMBER :=#DBFifo -// RET_VAL :=#SFC_RET_VAL -// DB_LENGTH :=#SFC_DB_LENGTH -// WRITE_PROT :=#SFC_WRITE_PROT - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Kopf : Byte; // Fifo-Kennung (FF) + Datensatzlaenge : Byte; // Datensatzlänge in Word (1 - 128) + FifoLaenge : Int; // Länge des Fifo (maximale Anzahl der Datensätze) + Bringzeiger : Int; // Zeiger, wohin nächster Eintrag gespeichert wird + Holzeiger : Int; // Zeiger, woher nächste Daten geholt werden + Anzahl : Int; // Anzahl der Datensätze (eingetragene) + Status : Word; // Status des Fifo + Err : Byte; // Fehlerbits + MinHolzeiger : Int; // Minimum Holzeiger + MaxHolzeiger : Int; // Maximum Holzeiger + DBFifo : Word; // FIFO-DB + SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf + SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf + Fifo_Ende : Word; // Ende des Fifo + AlleDaten : Word; // Anzahl der bytes für alle Daten + Offset : Word; // Offset zu überschreibender Datensatz + NixSave : Bool; // Status nicht speichern + SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + END_VAR - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - O SFC_WRITE_PROT - = NixSave // Status nicht speichern - JC Err0 // kein Fifobereich +BEGIN +NETWORK +TITLE = Schnittstellen-DB sinnvoll ? + L #SSDB; + T #DBFifo; + +// CALL TEST_DB +// DB_NUMBER :=#DBFifo +// RET_VAL :=#SFC_RET_VAL +// DB_LENGTH :=#SFC_DB_LENGTH +// WRITE_PROT :=#SFC_WRITE_PROT + + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #DBFifo , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); ---- NW 2: Quelle-Pointer erzeugen: --- - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 16#0006 // 6 Dw´s holen - T LW2 // Wiederholungen - L SSDB - T LW4 // DB_Nummer - L SSDW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + O #SFC_WRITE_PROT; + = #NixSave;//Status nicht speichern + SPB Err0;//kein Fifobereich -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 6) // 1.-6.DW FIFO holen +NETWORK +TITLE = Fifokopfdaten holen +//Quelle-Pointer erzeugen: + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 16#0006;//6 Dw´s holen + T %LW2;//Wiederholungen + L #SSDB; + T %LW4;//DB_Nummer + L #SSDW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse - L Status - L 2#0000_0000_1110_0000 - AW - T Err - JP Err // Kapitalfehler vorhanden + CALL BLKMOV//1.-6.DW FIFO holen + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := P#L20.0 WORD 6 + ); - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 + L #Status; + L 2#0000_0000_1110_0000; + UW; + T #Err; + SPP Err;//Kapitalfehler vorhanden + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + +NETWORK +TITLE = Zeigerüberprüfung + L #Kopf;//Fifo-Kopf + L 16#FF;//= Fifokennung ? + <>I;//Nein ! + = #NixSave;//Status nicht speichern + SPB Err0;//kein Fifobereich + + L 1; + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err0;//kein Fifobereich + + L 128; + >I; + SPB Err0;//kein Fifobereich + + L 1; + L #FifoLaenge;//Max.Anzahl von Datenblöcken + >I; + SPB Err0;//kein Fifobereich + + L #SSDW; + + 40;//Speichern ab 20.DW + T #MinHolzeiger;//Minimum Bringzeiger + + L #FifoLaenge;//Länge FIFO (in Word) + + -1; + L #Datensatzlaenge;//Datenblocklänge + *I; + L 2;//DB byteorientiert + *I; + + 40;//Speichern ab 20.DW + L #SSDW; + +I; + T #MaxHolzeiger;//Maximum Bringzeiger + + L #Datensatzlaenge;//Datenblocklänge + L 2;//DB byteorientiert + *I; + L #MaxHolzeiger;//Maximum Holzeiger + +I;//Zeiger Endekennung + T #Fifo_Ende; + ITD; + T #AR1Start;//Startwert mit Offset 0 + SLD 3; + T #AR1Zeiger;///Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #DBFifo]; + + L #Fifo_Ende; + L #SFC_DB_LENGTH; + >I;//Fifo-DB ist zu kurz! + SPB Err0;//kein Fifo-Bereich + + L DBW[ #AR1Zeiger]; + L 16#FFEE;//Fifo-Endekennung ? + <>I;//Nein ! + SPB Err0;//kein Fifobereich + + L #MinHolzeiger;//Minimum Holzeiger + L #Holzeiger;//Holzeiger + <=I;//Ok ? + SPB W300;//Ja! + + L 0;//Grundstellung ? + <>I;//Nein ! + SPB Err6;//Holzeiger ist ausserhalb + + L #Holzeiger;//Holzeiger Grundstellung ? + <>I;//Nein ! + SPB Err6;//Holzeiger ist ausserhalb + + L #Anzahl;//Anzahl Datensätze + L 0;//Grundstellung ? + <>I;//Nein ! + SPB Err6;//Holzeiger ist ausserhalb + + L #MinHolzeiger;//Minimum Holzeiger + T #Bringzeiger;//Bringzeiger + T #Holzeiger;//Holzeiger + +W300: L #MaxHolzeiger;//Maximum Holzeiger + <=I;//Ok ? + SPB W301;//Ja! + SPA Err6;//Holzeiger ist ausserhalb ---- NW 3: Zeigerüberprüfung --- - L Kopf // Fifo-Kopf - L 16#FF // = Fifokennung ? - <>I // Nein ! - = NixSave // Status nicht speichern - JC Err0 // kein Fifobereich +W301: L #Bringzeiger;//Bringzeiger + L #Holzeiger;//Holzeiger + ==I;//Identisch ! + U(; + L #FifoLaenge; + L #Anzahl;//Anzahl der gespeicherten Datensätze + <>I;//Fifo noch nicht voll ! + ); + U(; + L 0; + <>I;//Datensätze aber noch vorhanden ! + ); + SPB Err7;//Versatz Bring-/Holzeiger - L 1 - L Datensatzlaenge // Datenblocklänge - >I - JC Err0 // kein Fifobereich + L #Bringzeiger;//Bringzeiger + L #Holzeiger;//Holzeiger + <>I;//Ungleich ! + U(; + L #FifoLaenge; + L #Anzahl;//Anzahl der gespeicherten Datensätze + ==I;//Aber Fifo ist voll ! + O(; + L 0; + ==I;//Aber keine Datensätze vorhanden ! + ); + ); + SPB Err7;//Versatz Bring-/Holzeiger - L 128 - >I - JC Err0 // kein Fifobereich + L #Anzahl;//Anzahl der gespeicherten Datensätze + L 0; + ==I;//Keine Datensätze vorhanden ! + SPB Err2;//Fifo ist leer - L 1 - L FifoLaenge // Max.Anzahl von Datenblöcken - >I - JC Err0 // kein Fifobereich +NETWORK +TITLE = Offset bilden + L 0; + L #CH_POS; + >=I; + SPB Err3;//falscher Parameter bei Aufruf - L SSDW - + 40 // Speichern ab 20.DW - T MinHolzeiger // Minimum Bringzeiger + L #FifoLaenge;//Max.Anzahl von Datenblöcken + >I; + SPB Err3;//falscher Parameter bei Aufruf - L FifoLaenge // Länge FIFO (in Word) - + -1 - L Datensatzlaenge // Datenblocklänge - *I - L 2 // DB byteorientiert - *I - + 40 // Speichern ab 20.DW - L SSDW - +I - T MaxHolzeiger // Maximum Bringzeiger + L #Anzahl;//Anzahl der Datensätze + L #CH_POS; + I // Fifo-DB ist zu kurz! - JC Err0 // kein Fifo-Bereich + L #Offset;//Schreibzeiger + L #AlleDaten; + -I; + SPA W400; - L DBW [AR1Zeiger] - L 16#FFEE // Fifo-Endekennung ? - <>I // Nein ! - JC Err0 // kein Fifobereich +NETWORK +TITLE = Fifodaten überschreiben +//Quelle-Pointer erzeugen: +Nw05: L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L #Datensatzlaenge;//Datenbytes speichern + T %LW2; + T %LW12;//Wiederholungen - L MinHolzeiger // Minimum Holzeiger - L Holzeiger // Holzeiger - <=I // Ok ? - JC W300 // Ja! +//DATEN-Pointer übernehmen: + L P##CHANGEDATEN; + LAR1; - L 0 // Grundstellung ? - <>I // Nein ! - JC Err6 // Holzeiger ist ausserhalb + L W[ AR1, P#0.0]; + T %LW4;//DB_Nummer + L D[ AR1, P#2.0]; + T %LD6;//Kennung, Adresse - L Holzeiger // Holzeiger Grundstellung ? - <>I // Nein ! - JC Err6 // Holzeiger ist ausserhalb +//Ziel-Pointer erzeugen: +//Kennung + Datenbytes s.o. - L Anzahl // Anzahl Datensätze - L 0 // Grundstellung ? - <>I // Nein ! - JC Err6 // Holzeiger ist ausserhalb + L #SSDB; + T %LW14;//DB_Nummer + L #Offset;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse - L MinHolzeiger // Minimum Holzeiger - T Bringzeiger // Bringzeiger - T Holzeiger // Holzeiger + CALL BLKMOV//FIFO-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := #Ziel + ); -W300: L MaxHolzeiger // Maximum Holzeiger - <=I // Ok ? - JC W301 // Ja! - JU Err6 // Holzeiger ist ausserhalb + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; +NETWORK +TITLE = Fehlerausgabe / RET_VAL + SET;//VKE = 1 ohne Fehler !!! + SPA Ok; +Err0: L 2#0000_0000_0000_0001;//Kein Fifobereich + T #Err; + SPA Err; +Err1: S %L32.1;//SFC20-Aufruf mit Fehler + SPA Err; +Err2: S %L32.2;//Fifo ist voll + SPA Err; +Err3: S %L32.3;//Falscher Parameter + SPA Err; +Err4: S %L32.4;//Position nicht belegt + SPA Err; +Err6: S %L32.6;//Holzeiger außerhalb + SPA Err; +Err7: S %L32.7;//Versatz Bring-/Holzeiger -W301: L Bringzeiger // Bringzeiger - L Holzeiger // Holzeiger - ==I // Identisch ! - A( - L FifoLaenge - L Anzahl // Anzahl der gespeicherten Datensätze - <>I // Fifo noch nicht voll ! - ) - A( - L 0 - <>I // Datensätze aber noch vorhanden ! - ) - JC Err7 // Versatz Bring-/Holzeiger +Err: CLR;//VKE = 0 bei Fehler !!! +Ok: L #Err; + T #RE_VAL; + L #Status; + OW; + T #Status; - L Bringzeiger // Bringzeiger - L Holzeiger // Holzeiger - <>I // Ungleich ! - A( - L FifoLaenge - L Anzahl // Anzahl der gespeicherten Datensätze - ==I // Aber Fifo ist voll ! - O( - L 0 - ==I // Aber keine Datensätze vorhanden ! - ) - ) - JC Err7 // Versatz Bring-/Holzeiger + SAVE;//VKE in BIE-Bit speichern - L Anzahl // Anzahl der gespeicherten Datensätze - L 0 - ==I // Keine Datensätze vorhanden ! - JC Err2 // Fifo ist leer +NETWORK +TITLE = Fifokopfdaten speichern + U %L32.0;//Falscher Parameter + U #NixSave;//Status nicht speichern + BEB; + L #SSDW; + + 10;//Status + ITD; + T #AR1Start;//Startwert mit Offset 0 + SLD 3; + T #AR1Zeiger;///Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) ---- NW 4: Offset bilden --- - L 0 - L CH_POS - >=I - JC Err3 // falscher Parameter bei Aufruf + AUF DB[ #DBFifo]; - L FifoLaenge // Max.Anzahl von Datenblöcken - >I - JC Err3 // falscher Parameter bei Aufruf + L #Err; + T DBW[ #AR1Zeiger]; - L Anzahl // Anzahl der Datensätze - L CH_POS - I - JC Err1 - - ---- NW 6: Fehlerausgabe / RET_VAL --- - SET // VKE = 1 ohne Fehler !!! - JU Ok -Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich - T Err - JU Err -Err1: S L32.1 // SFC20-Aufruf mit Fehler - JU Err -Err2: S L32.2 // Fifo ist voll - JU Err -Err3: S L32.3 // Falscher Parameter - JU Err -Err4: S L32.4 // Position nicht belegt - JU Err -Err6: S L32.6 // Holzeiger außerhalb - JU Err -Err7: S L32.7 // Versatz Bring-/Holzeiger - -Err: CLR // VKE = 0 bei Fehler !!! -Ok: L Err - T RE_VAL - L Status - OW - T Status - - SAVE // VKE in BIE-Bit speichern - - ---- NW 7: Fifokopfdaten speichern --- - A L32.0 // Falscher Parameter - A NixSave // Status nicht speichern - BEC - - L SSDW - + 10 // Status - ITD - T AR1Start // Startwert mit Offset 0 - SLD 3 - T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[DBFifo] - - L Err - T DBW [AR1Zeiger] +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Module/FIFOSearch.awl b/=A01+UH07-KF00/Programmbausteine/Module/FIFOSearch.awl index fda4b1f..29c2e4a 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/FIFOSearch.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/FIFOSearch.awl @@ -1,376 +1,423 @@ -=== FC 83: FIFOSearch [STL] === -INTERFACE: - Input: - SSDB : Int // Schnittstellen-DB - SSDW : Int // Schnittstellen-1.DW - SEARCHDATEN : Pointer // SuchDaten-Schnittstelle - Laenge : Int // Anzahl der DWs zum Vergleichen im Datensatz - Output: - RE_POS : Int // Position des Eintrags, der gesuchten Daten - RE_VAL : Byte // Rückmeldungen - InOut: - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Kopf : Byte // Fifo-Kennung (FF) - Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128) - FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze) - Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird - Holzeiger : Int // Zeiger, woher nächste Daten geholt werden - Anzahl : Int // Anzahl der Datensätze (eingetragene) - Status : Word // Status des Fifo - Err : Byte // Fehlerbits - MinHolzeiger : Int // Minimum Holzeiger - MaxHolzeiger : Int // Maximum Holzeiger - DBFifo : Word // FIFO-DB - SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf - SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf - Fifo_Ende : Word // Ende des Fifo - AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern - DBSuchdaten : Word // Solldaten-DB, falls angegeben - SuchDaten_Startpunkt : Word // SuchDaten-Startpunkt: Adresse - SuchZeiger : Word // Suchzeiger - Schleife : Word // Loopzähler - NixSave : Bool // Status nicht speichern - SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - sRE_POS : Int // Position des Eintrags, der gesuchten Daten - Constant: - Return: - Ret_Val : Void - ---- NW 1: Schnittstellen-DB sinnvoll ? --- - TAR2 - T AR2_Speicher // AR2 zwischenspeichern - - L SSDB - T DBFifo - -// CALL TEST_DB -// DB_NUMBER :=#DBFifo -// RET_VAL :=#SFC_RET_VAL -// DB_LENGTH :=#SFC_DB_LENGTH -// WRITE_PROT :=#SFC_WRITE_PROT - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - = NixSave // Status nicht speichern - O SFC_WRITE_PROT - JC Err0 // kein Fifobereich - - ---- NW 2: Quelle-Pointer erzeugen: --- - L 16#1004 // Kennung 10 + Word=04 - T sRE_POS // Any-Kennung, Datentyp - L 16#0006 // 6 Dw´s holen - T LW2 // Wiederholungen - L SSDB - T LW4 // DB_Nummer - L SSDW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 6) // 1.-6.DW FIFO holen - - L Status - L 2#0000_0000_1110_0000 - AW - T Err - JP Err // Kapitalfehler vorhanden - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 - - ---- NW 3: Zeigerüberprüfung --- - L Kopf // Fifo-Kopf - L 16#FF // = Fifokennung ? - <>I // Nein ! - = NixSave // Status nicht speichern - JC Err0 // kein Fifobereich - - L 1 - L Datensatzlaenge // Datenblocklänge - >I - JC Err0 // kein Fifobereich - - L 128 - >I - JC Err0 // kein Fifobereich - - L 1 - L FifoLaenge // Max.Anzahl von Datenblöcken - >I - JC Err0 // kein Fifobereich - - L SSDW - + 40 // Speichern ab 20.DW - T MinHolzeiger // Minimum Holzeiger - - L FifoLaenge // Länge FIFO (in Word) - + -1 - L Datensatzlaenge // Datenblocklänge - *I - L 2 // DB byteorientiert - *I - + 40 // Speichern ab 20.DW - L SSDW - +I - T MaxHolzeiger // Maximum Holzeiger - - L Datensatzlaenge // Datenblocklänge - L 2 // DB byteorientiert - *I - L MaxHolzeiger // Maximum Holzeiger - +I // Zeiger Endekennung - T Fifo_Ende - ITD - T AR1Start // Startwert mit Offset 0 - SLD 3 - T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[DBFifo] - - L Fifo_Ende - L SFC_DB_LENGTH - >I // Fifo-DB ist zu kurz! - JC Err0 // kein Fifo-Bereich - - L DBW [AR1Zeiger] - L 16#FFEE // Fifo-Endekennung ? - <>I // Nein ! - JC Err0 // kein Fifobereich - - L MinHolzeiger // Minimum Holzeiger - L Holzeiger // Holzeiger - <=I // Ok ? - JC W300 // Ja! - - L 0 // Grundstellung ? - <>I // Nein ! - JC Err6 // Holzeiger ist ausserhalb - - L Bringzeiger // Bringzeiger Grundstellung ? - <>I // Nein ! - JC Err6 // Holzeiger ist ausserhalb - - L Anzahl // Anzahl Datensätze - L 0 // Grundstellung ? - <>I // Nein ! - JC Err6 // Holzeiger ist ausserhalb - - L MinHolzeiger // Minimum Holzeiger - T Bringzeiger // Bringzeiger - T Holzeiger // Holzeiger - - JU Err2 // Fifo ist leer - -W300: L MaxHolzeiger // Maximum Holzeiger - <=I // Ok ? - JC W301 // Ja! - JU Err6 // Holzeiger ist ausserhalb - - -W301: L Bringzeiger // Bringzeiger - L Holzeiger // Holzeiger - ==I // Identisch ! - A( - L FifoLaenge - L Anzahl // Anzahl der gespeicherten Datensätze - <>I // Fifo noch nicht voll ! - ) - A( - L 0 - <>I // Datensätze aber noch vorhanden ! - ) - JC Err7 // Versatz Bring-/Holzeiger - - L Bringzeiger // Bringzeiger - L Holzeiger // Holzeiger - <>I // Ungleich ! - A( - L FifoLaenge - L Anzahl // Anzahl der gespeicherten Datensätze - ==I // Aber Fifo ist voll ! - O( - L 0 - ==I // Aber keine Datensätze vorhanden ! - ) - ) - JC Err7 // Versatz Bring-/Holzeiger - - L Anzahl // Anzahl der gespeicherten Datensätze - L 0 - ==I // Keine Datensätze vorhanden ! - JC Err2 // Fifo ist leer - - ---- NW 4: Fifodaten suchen --- - L 1 - T sRE_POS // RET-POS - - L Holzeiger // Holzeiger - T SuchZeiger // Suchzeiger -W400: ITD - T AR1Start // Startwert mit Offset 0 - SLD 3 - T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - -// DATEN-Pointer übernehmen: - L P# - LAR2 - - L NoneW [AR2,] - T DBSuchdaten // Solldaten-DB - - L DBSuchdaten // Solldaten-DB - L 0 // Angegeben ? - ==I // Nein - JC W401 - -// CALL TEST_DB -// DB_NUMBER :=#DBSuchdaten -// RET_VAL :=#SFC_RET_VAL -// DB_LENGTH :=#SFC_DB_LENGTH -// WRITE_PROT :=#SFC_WRITE_PROT - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBSuchdaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 // Fehler vorhanden ? - <>I // Ja ! - JC Err1 // SFC20-Aufruf mit Fehler - - L NoneD [AR2,] // Kennung, Adresse - L 16#00FF_FFFF // Ohne Kennung - AW - SRW 3 // Ohne Bit - T SuchDaten_Startpunkt - - L Datensatzlaenge // Datenblocklänge - L 2 // DB byteorientiert - *I - L SuchDaten_Startpunkt - +I - L SFC_DB_LENGTH - >I // Indaten-DB ist zu kurz - JC Err1 // SFC20-Aufruf mit Fehler - -W401: L NoneD [AR2,] // Kennung, Adresse - LAR2 - - L Laenge // Anzahl der DWs zum Vergleichen im Datensatz -L400: T Schleife - - L DBSuchdaten // Solldaten-DB - L 0 // Angegeben ? - ==I // Nein - JC W402 - - OPN DB[DBSuchdaten] - -W402: L NoneW [AR2,] // Mit Solldaten überprüfen - OPN DB[DBFifo] - L DBW [AR1Zeiger] // Fifo-Daten lesen - <>I // nicht identisch ! - JC W403 - - L AR1Start // Startwert mit Offset 0 - + DINT#2 - T AR1Start // Startwert mit nächstem Offset - SLD 3 - T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - ADDAR2 P#2.0 - - L Schleife - LOOP L400 - - JU Ende // Datensatz ist in Fifo enthalten - -W403: L sRE_POS // RET-POS - + 1 - T sRE_POS // RET-POS - L Anzahl // Anzahl der Daten im Fifo - >I // Alle Datensätze sind durchsucht - JC Err2 - - L Datensatzlaenge // Datenblocklänge - L 2 // DB byteorientiert - *I - L SuchZeiger // Suchzeiger - +I - T SuchZeiger // Suchzeiger - L MaxHolzeiger // Maximum Holzeiger - <=I // Ende erreicht? Nein! - JC W404 - - L MinHolzeiger // Minimum Holzeiger - T SuchZeiger - -W404: L SuchZeiger // Suchzeiger - JU W400 - - ---- NW 5: Fehlerausgabe / RET_VAL --- -Ende: SET // VKE = 1 ohne Fehler !!! - JU Ok -Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich - T Err - JU Err -Err1: S L32.1 // SFC20-Aufruf mit Fehler - JU Err -Err2: S L32.2 // Fifo ist leer - JU Err -Err6: S L32.6 // Holzeiger außerhalb - JU Err -Err7: S L32.7 // Versatz Bring-/Holzeiger - -Err: L 0 - T sRE_POS // RET-POS = 0 - - CLR // VKE = 0 bei Fehler !!! - -Ok: L Err - T RE_VAL - L Status - OW - T Status - - SAVE // VKE in BIE-Bit speichern - - ---- NW 6: Fifokopfdaten speichern --- - L AR2_Speicher // AR2 zurückspeichern - LAR2 - - A L32.0 // Falscher Parameter - A NixSave // Status nicht speichern - BEC - - L SSDW - + 10 // Status - ITD - T AR1Start // Startwert mit Offset 0 - SLD 3 - T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) +FUNCTION "FIFOSearch" : Void +TITLE = Fifo-Modul +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +FAMILY : FIFO +NAME : FifoIn +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-960629 +//Version: KyungBang00 / 14.04.2009 +// +//Datenblock in Fifo suchen +//SSDB: FIFO-DB +//SSDW: FIFO-1.DW +//SEARCHDATEN: Pointer, wo zu suchende Daten stehen (P#DB1.DBX0.0, P#M220.0) +//RE_POS: Position an welcher sich Datensatz befindet +//RE_VAL: Rückmeldungen: +// Bit0: Kein Fifobereich / falscher Kopfinhalt / Endekennung +// Bit1: SFC20-Aufruf mit Fehler +// Bit2: Fifo ist leer +// Bit3: Frei +// Bit4: Frei +// Bit5: Bringzeiger ist ausserhalb +// Bit6: Holzeiger ist ausserhalb +// Bit7: Versatz Bring-/Holzeiger +// + VAR_INPUT + SSDB : Int; // Schnittstellen-DB + SSDW : Int; // Schnittstellen-1.DW + SEARCHDATEN : Pointer; // SuchDaten-Schnittstelle + Laenge : Int; // Anzahl der DWs zum Vergleichen im Datensatz + END_VAR + + VAR_OUTPUT + RE_POS : Int; // Position des Eintrags, der gesuchten Daten + RE_VAL : Byte; // Rückmeldungen + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Kopf : Byte; // Fifo-Kennung (FF) + Datensatzlaenge : Byte; // Datensatzlänge in Word (1 - 128) + FifoLaenge : Int; // Länge des Fifo (maximale Anzahl der Datensätze) + Bringzeiger : Int; // Zeiger, wohin nächster Eintrag gespeichert wird + Holzeiger : Int; // Zeiger, woher nächste Daten geholt werden + Anzahl : Int; // Anzahl der Datensätze (eingetragene) + Status : Word; // Status des Fifo + Err : Byte; // Fehlerbits + MinHolzeiger : Int; // Minimum Holzeiger + MaxHolzeiger : Int; // Maximum Holzeiger + DBFifo : Word; // FIFO-DB + SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf + SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf + Fifo_Ende : Word; // Ende des Fifo + AR2_Speicher : DWord; // Adress-Register 2 zwischenspeichern + DBSuchdaten : Word; // Solldaten-DB, falls angegeben + SuchDaten_Startpunkt : Word; // SuchDaten-Startpunkt: Adresse + SuchZeiger : Word; // Suchzeiger + Schleife : Word; // Loopzähler + NixSave : Bool; // Status nicht speichern + SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + sRE_POS : Int; // Position des Eintrags, der gesuchten Daten + END_VAR + + +BEGIN +NETWORK +TITLE = Schnittstellen-DB sinnvoll ? + TAR2; + T #AR2_Speicher;//AR2 zwischenspeichern + + L #SSDB; + T #DBFifo; + +// CALL TEST_DB +// DB_NUMBER :=#DBFifo +// RET_VAL :=#SFC_RET_VAL +// DB_LENGTH :=#SFC_DB_LENGTH +// WRITE_PROT :=#SFC_WRITE_PROT + + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #DBFifo , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + = #NixSave;//Status nicht speichern + O #SFC_WRITE_PROT; + SPB Err0;//kein Fifobereich + +NETWORK +TITLE = Fifokopfdaten holen +//Quelle-Pointer erzeugen: + L 16#1004;//Kennung 10 + Word=04 + T #sRE_POS;//Any-Kennung, Datentyp + L 16#0006;//6 Dw´s holen + T %LW2;//Wiederholungen + L #SSDB; + T %LW4;//DB_Nummer + L #SSDW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//1.-6.DW FIFO holen + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := P#L20.0 WORD 6 + ); + + L #Status; + L 2#0000_0000_1110_0000; + UW; + T #Err; + SPP Err;//Kapitalfehler vorhanden + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + +NETWORK +TITLE = Zeigerüberprüfung + L #Kopf;//Fifo-Kopf + L 16#FF;//= Fifokennung ? + <>I;//Nein ! + = #NixSave;//Status nicht speichern + SPB Err0;//kein Fifobereich + + L 1; + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err0;//kein Fifobereich + + L 128; + >I; + SPB Err0;//kein Fifobereich + + L 1; + L #FifoLaenge;//Max.Anzahl von Datenblöcken + >I; + SPB Err0;//kein Fifobereich + + L #SSDW; + + 40;//Speichern ab 20.DW + T #MinHolzeiger;//Minimum Holzeiger + + L #FifoLaenge;//Länge FIFO (in Word) + + -1; + L #Datensatzlaenge;//Datenblocklänge + *I; + L 2;//DB byteorientiert + *I; + + 40;//Speichern ab 20.DW + L #SSDW; + +I; + T #MaxHolzeiger;//Maximum Holzeiger + + L #Datensatzlaenge;//Datenblocklänge + L 2;//DB byteorientiert + *I; + L #MaxHolzeiger;//Maximum Holzeiger + +I;//Zeiger Endekennung + T #Fifo_Ende; + ITD; + T #AR1Start;//Startwert mit Offset 0 + SLD 3; + T #AR1Zeiger;///Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #DBFifo]; + + L #Fifo_Ende; + L #SFC_DB_LENGTH; + >I;//Fifo-DB ist zu kurz! + SPB Err0;//kein Fifo-Bereich + + L DBW[ #AR1Zeiger]; + L 16#FFEE;//Fifo-Endekennung ? + <>I;//Nein ! + SPB Err0;//kein Fifobereich + + L #MinHolzeiger;//Minimum Holzeiger + L #Holzeiger;//Holzeiger + <=I;//Ok ? + SPB W300;//Ja! + + L 0;//Grundstellung ? + <>I;//Nein ! + SPB Err6;//Holzeiger ist ausserhalb + + L #Bringzeiger;//Bringzeiger Grundstellung ? + <>I;//Nein ! + SPB Err6;//Holzeiger ist ausserhalb + + L #Anzahl;//Anzahl Datensätze + L 0;//Grundstellung ? + <>I;//Nein ! + SPB Err6;//Holzeiger ist ausserhalb + + L #MinHolzeiger;//Minimum Holzeiger + T #Bringzeiger;//Bringzeiger + T #Holzeiger;//Holzeiger + + SPA Err2;//Fifo ist leer + +W300: L #MaxHolzeiger;//Maximum Holzeiger + <=I;//Ok ? + SPB W301;//Ja! + SPA Err6;//Holzeiger ist ausserhalb + + +W301: L #Bringzeiger;//Bringzeiger + L #Holzeiger;//Holzeiger + ==I;//Identisch ! + U(; + L #FifoLaenge; + L #Anzahl;//Anzahl der gespeicherten Datensätze + <>I;//Fifo noch nicht voll ! + ); + U(; + L 0; + <>I;//Datensätze aber noch vorhanden ! + ); + SPB Err7;//Versatz Bring-/Holzeiger + + L #Bringzeiger;//Bringzeiger + L #Holzeiger;//Holzeiger + <>I;//Ungleich ! + U(; + L #FifoLaenge; + L #Anzahl;//Anzahl der gespeicherten Datensätze + ==I;//Aber Fifo ist voll ! + O(; + L 0; + ==I;//Aber keine Datensätze vorhanden ! + ); + ); + SPB Err7;//Versatz Bring-/Holzeiger + + L #Anzahl;//Anzahl der gespeicherten Datensätze + L 0; + ==I;//Keine Datensätze vorhanden ! + SPB Err2;//Fifo ist leer + +NETWORK +TITLE = Fifodaten suchen + L 1; + T #sRE_POS;//RET-POS + + L #Holzeiger;//Holzeiger + T #SuchZeiger;//Suchzeiger +W400: ITD; + T #AR1Start;//Startwert mit Offset 0 + SLD 3; + T #AR1Zeiger;///Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + +//DATEN-Pointer übernehmen: + L P##SEARCHDATEN; + LAR2; + + L W[ AR2, P#0.0]; + T #DBSuchdaten;//Solldaten-DB + + L #DBSuchdaten;//Solldaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB W401; + +// CALL TEST_DB +// DB_NUMBER :=#DBSuchdaten +// RET_VAL :=#SFC_RET_VAL +// DB_LENGTH :=#SFC_DB_LENGTH +// WRITE_PROT :=#SFC_WRITE_PROT + + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #DBSuchdaten , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000;//Fehler vorhanden ? + <>I;//Ja ! + SPB Err1;//SFC20-Aufruf mit Fehler + + L D[ AR2, P#2.0];//Kennung, Adresse + L 16#00FF_FFFF;//Ohne Kennung + UW; + SRW 3;//Ohne Bit + T #SuchDaten_Startpunkt; + + L #Datensatzlaenge;//Datenblocklänge + L 2;//DB byteorientiert + *I; + L #SuchDaten_Startpunkt; + +I; + L #SFC_DB_LENGTH; + >I;//Indaten-DB ist zu kurz + SPB Err1;//SFC20-Aufruf mit Fehler + +W401: L D[ AR2, P#2.0];//Kennung, Adresse + LAR2; + + L #Laenge;//Anzahl der DWs zum Vergleichen im Datensatz +L400: T #Schleife; + + L #DBSuchdaten;//Solldaten-DB + L 0;//Angegeben ? + ==I;//Nein + SPB W402; + + AUF DB[ #DBSuchdaten]; + +W402: L W[ AR2, P#0.0];//Mit Solldaten überprüfen + AUF DB[ #DBFifo]; + L DBW[ #AR1Zeiger];//Fifo-Daten lesen + <>I;//nicht identisch ! + SPB W403; + + L #AR1Start;//Startwert mit Offset 0 + + DINT#2; + T #AR1Start;//Startwert mit nächstem Offset + SLD 3; + T #AR1Zeiger;///Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + +AR2 P#2.0; + + L #Schleife; + LOOP L400; + + SPA Ende;//Datensatz ist in Fifo enthalten + +W403: L #sRE_POS;//RET-POS + + 1; + T #sRE_POS;//RET-POS + L #Anzahl;//Anzahl der Daten im Fifo + >I;//Alle Datensätze sind durchsucht + SPB Err2; + + L #Datensatzlaenge;//Datenblocklänge + L 2;//DB byteorientiert + *I; + L #SuchZeiger;//Suchzeiger + +I; + T #SuchZeiger;//Suchzeiger + L #MaxHolzeiger;//Maximum Holzeiger + <=I;//Ende erreicht? Nein! + SPB W404; + + L #MinHolzeiger;//Minimum Holzeiger + T #SuchZeiger; + +W404: L #SuchZeiger;//Suchzeiger + SPA W400; + +NETWORK +TITLE = Fehlerausgabe / RET_VAL +Ende: SET;//VKE = 1 ohne Fehler !!! + SPA Ok; +Err0: L 2#0000_0000_0000_0001;//Kein Fifobereich + T #Err; + SPA Err; +Err1: S %L32.1;//SFC20-Aufruf mit Fehler + SPA Err; +Err2: S %L32.2;//Fifo ist leer + SPA Err; +Err6: S %L32.6;//Holzeiger außerhalb + SPA Err; +Err7: S %L32.7;//Versatz Bring-/Holzeiger + +Err: L 0; + T #sRE_POS;//RET-POS = 0 + + CLR;//VKE = 0 bei Fehler !!! + +Ok: L #Err; + T #RE_VAL; + L #Status; + OW; + T #Status; + + SAVE;//VKE in BIE-Bit speichern + +NETWORK +TITLE = Fifokopfdaten speichern + L #AR2_Speicher;//AR2 zurückspeichern + LAR2; + + U %L32.0;//Falscher Parameter + U #NixSave;//Status nicht speichern + BEB; + + L #SSDW; + + 10;//Status + ITD; + T #AR1Start;//Startwert mit Offset 0 + SLD 3; + T #AR1Zeiger;///Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #DBFifo]; + + L #Err; + T DBW[ #AR1Zeiger]; + +NETWORK +TITLE = + L #sRE_POS; + T #RE_POS; +END_FUNCTION - OPN DB[DBFifo] - - L Err - T DBW [AR1Zeiger] - - ---- NW 7: --- - L sRE_POS - T RE_POS diff --git a/=A01+UH07-KF00/Programmbausteine/Module/FifoIn.awl b/=A01+UH07-KF00/Programmbausteine/Module/FifoIn.awl index daddada..862c74e 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/FifoIn.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/FifoIn.awl @@ -1,500 +1,572 @@ -=== FC 80: FifoIn [STL] === -INTERFACE: - Input: - SSDB : Int // Schnittstellen-DB - SSDW : Int // Schnittstellen-1.DW - PARA : Word // Aufrufparameter (Auftrag / Anzahl Zusatzdaten) - INDATEN : Pointer // InDaten-Schnittstelle - Output: - RE_VAL : Byte // Rückmeldung - InOut: - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Kopf : Byte // Fifo-Kennung (FF) - Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128) - FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze) - Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird - Holzeiger : Int // Zeiger, woher nächste Daten geholt werden - Anzahl : Int // Anzahl der Datensätze (eingetragene) - Status : Word // Status des Fifo - Err : Byte // Fehlerbits - Para1 : Byte // 1.Aufrufparameter - Para2 : Byte // 2.Aufrufparameter - Para21 : Byte // 2.Aufrufparameter 1.Stelle - Para22 : Byte // 2.Aufrufparameter 2.Stelle - MinBringzeiger : Int // Minimum Bringzeiger - MaxBringzeiger : Int // Maximum Bringzeiger - DBFifo : Word // FIFO-DB - SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf - SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf - Fifo_Ende : Word // Ende des Fifo - Schleife : Word // Loopzähler - Offset : Byte // Offset 1. zu speicherndes Zusatzwort - SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf - NixSave : Bool // Status nicht speichern - BieSpeicher : Bool // Bie-Bit zwischenspeichern - Constant: - Return: - Ret_Val : Void - ---- NW 1: Schnittstellen-DB sinnvoll ? --- - L SSDB - T DBFifo - -// CALL TEST_DB -// DB_NUMBER :=#DBFifo -// RET_VAL :=#SFC_RET_VAL -// DB_LENGTH :=#SFC_DB_LENGTH -// WRITE_PROT :=#SFC_WRITE_PROT - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - O SFC_WRITE_PROT - = NixSave // Status nicht speichern - JC Err0 // kein Fifobereich - - ---- NW 2: Quelle-Pointer erzeugen: --- - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 16#0006 // 6 Dw´s holen - T LW2 // Wiederholungen - L SSDB - T LW4 // DB_Nummer - L SSDW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 6) // 1.-6.DW FIFO holen - - L Status - L 2#0000_0000_1110_0000 - AW - T Err - JP Err // Kapitalfehler vorhanden - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 - - ---- NW 3: Zeigerüberprüfung --- - L Kopf // Fifo-Kopf - L 16#FF // = Fifokennung ? - <>I // Nein ! - = NixSave // Status nicht speichern - JC Err0 // kein Fifobereich - - L 1 - L Datensatzlaenge // Datenblocklänge - >I - JC Err0 // kein Fifobereich - - L 128 - >I - JC Err0 // kein Fifobereich - - L 1 - L FifoLaenge // Max.Anzahl von Datenblöcken - >I - JC Err0 // kein Fifobereich - - L SSDW - + 40 // Speichern ab 20.DW - T MinBringzeiger // Minimum Bringzeiger - - L FifoLaenge // Länge FIFO (in Word) - + -1 - L Datensatzlaenge // Datenblocklänge - *I - L 2 // DB byteorientiert - *I - + 40 // Speichern ab 20.DW - L SSDW - +I - T MaxBringzeiger // Maximum Bringzeiger - - L Datensatzlaenge // Datenblocklänge - L 2 // DB byteorientiert - *I - L MaxBringzeiger // Maximum Bringzeiger - +I // Zeiger Endekennung - T Fifo_Ende - SLW 3 // Pointer erzeugen - LAR1 - - OPN DB[DBFifo] - - L Fifo_Ende - L SFC_DB_LENGTH - >I // Fifo-DB ist zu kurz! - JC Err0 // kein Fifo-Bereich - - L DBW [AR1,] - L 16#FFEE // Fifo-Endekennung ? - <>I // Nein ! - JC Err0 // kein Fifobereich - - L MinBringzeiger // Minimum Bringzeiger - L Bringzeiger // Bringzeiger - <=I // Ok ? - JC W300 // Ja! - - L 0 // Grundstellung ? - <>I // Nein ! - JC Err5 // Bringzeiger ist ausserhalb - - L Holzeiger // Holzeiger Grundstellung ? - <>I // Nein ! - JC Err5 // Bringzeiger ist ausserhalb - - L Anzahl // Anzahl Datensätze - L 0 // Grundstellung ? - <>I // Nein ! - JC Err5 // Bringzeiger ist ausserhalb - - L MinBringzeiger // Minimum Bringzeiger - T Bringzeiger // Bringzeiger - T Holzeiger // Holzeiger - -W300: L MaxBringzeiger // Maximum Bringzeiger - <=I // Ok ? - JC W301 // Ja! - JU Err5 // Bringzeiger ist ausserhalb - - -W301: L Bringzeiger // Bringzeiger - L Holzeiger // Holzeiger - ==I // Identisch ! - A( - L FifoLaenge - L Anzahl // Anzahl der gespeicherten Datensätze - <>I // Fifo noch nicht voll ! - ) - A( - L 0 - <>I // Datensätze aber noch vorhanden ! - ) - JC Err7 // Versatz Bring-/Holzeiger - - L Bringzeiger // Bringzeiger - L Holzeiger // Holzeiger - <>I // Ungleich ! - A( - L FifoLaenge - L Anzahl // Anzahl der gespeicherten Datensätze - ==I // Aber Fifo ist voll ! - O( - L 0 - ==I // Aber keine Datensätze vorhanden ! - ) - ) - JC Err7 // Versatz Bring-/Holzeiger - - ---- NW 4: Nur Zusatzdaten / als 1.Datensatz speichern ? --- - L PARA - T LW33 // Aufrufparameter zwischenspeichern - - L 16#02 // Nur Zusatzdaten speichern ? - L Para1 // 1.Aufrufparameter - <>I // Nein ! - JC W400 - - L Para2 // 2.Aufrufparameter - L 16#00 // =0 ? - ==I // Ja ! - JC Err3 // Falscher Aufrufparameter - - JU Nw06 // Zusatzdaten speichern - -W400: L 16#01 // Als 1.Datensatz speichern ? - <>I // Nein ! - JC Nw05 - - L MinBringzeiger // Minimum Bringzeiger - T Bringzeiger // Bringzeiger - T Holzeiger // Holzeiger - L 0 - T Anzahl // Anzahl Datensätze - - JU Nw06 // Zusatz-Daten speichern? - - ---- NW 5: Hat Fifo Platz / Datenbereich leer ? --- -Nw05: L Anzahl // Anzahl der gespeicherten Datensätze - L FifoLaenge // Max. Anzahl von Datenblöcken - I - JC Err4 // Speicherzelle ist belegt - - ADDAR1 P#2.0 - - L Schleife - LOOP L500 - - ---- NW 6: Zusatzdaten schreiben --- -Nw06: L 16#00 // =0 ? - L Para2 // 2.Aufrufparameter - ==I // Ja ! - JC Nw07 - - L 16#00F0 - AW - SRW 4 - T Para21 // 1.Stelle isolieren - - L Para2 // 2.Aufrufparameter - L 16#000F - AW - T Para22 // 2.Stelle isolieren - - L Para21 - L Para22 - >I // 1.Stelle > 2.Stelle ! - JC Err3 // Falscher Aufrufparameter - - L 16#04 - >I // 2.Stelle > 4 ! - JC Err3 // Falscher Aufrufparameter - - L Para21 - L 16#00 - ==I // 1.Stelle = 0 ! - JC Err3 // Falscher Aufrufparameter - -// Quelle-Pointer erzeugen: - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - T LW10 // Any-Kennung, Datentyp - L Para22 // bis - L Para21 // von - -I - + 1 - T LW2 // Wiederholungen - T LW12 // Wiederholungen - L 0 - T LW4 // DB_Nummer - - L Para21 // Beginn ab X.Zusatzwort - + -1 - L 2 // byteorientiert - *I - T Offset // Offset 1. zu speicherndes Zusatzwort - - L 16#00F0 // Adresse (ab MW240) - L Offset // falls nicht ab 1.Zusatzwort - +I - SLD 3 - L 16#8300_0000 // Kennung: Merker - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: -// Kennung + Datenbytes s.o. - L SSDB - T LW14 // DB_Nummer - L SSDW - + 12 // ab 6.Dw speichern - L Offset // falls nicht ab 1.Zusatzwort - +I - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Zusatz-Daten speichern - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 - - ---- NW 7: Fifodaten schreiben --- -Nw07: L 16#FF // Testsendung ? - L Para1 // 1.Aufrufparameter - ==I // Ja ! - JC Nw08 // Zeiger testweise verändern - - L 16#02 // Nur Zusatzdaten speichern ? - ==I // Ja ! - JC Ende // Fertig ! - -// Quelle-Pointer erzeugen: - - L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L Datensatzlaenge // Datenbytes speichern - T LW2 - T LW12 // Wiederholungen - -// DATEN-Pointer übernehmen: - L P# - LAR1 - - L NoneW [AR1,] - T LW4 // DB_Nummer - L NoneD [AR1,] - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: -// Kennung + Datenbytes s.o. - - L SSDB - T LW14 // DB_Nummer - L Bringzeiger // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // FIFO-Daten speichern - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 - - ---- NW 8: Bringzeiger, Anzahl erhöhen --- -Nw08: L Datensatzlaenge // Datenblocklänge - L 2 // 1 word = 2 bytes - *I - L Bringzeiger // Bringzeiger - +I - T Bringzeiger // Bringzeiger - L MaxBringzeiger // Maximum Bringzeiger - <=I // Erreicht ? - JC W800 // Nein ! - - L MinBringzeiger // Minimum Bringzeiger - T Bringzeiger // Bringzeiger - -W800: L Anzahl // Anzahl der gespeicherten Datensätze - + 1 - T Anzahl // Anzahl der gespeicherten Datensätze - - ---- NW 9: Versatz Bring-/Holzeiger --- - L Bringzeiger // Bringzeiger - L Holzeiger // Holzeiger - ==I // Identisch ! - A( - L FifoLaenge - L Anzahl // Anzahl der gespeicherten Datensätze - <>I // Fifo noch nicht voll ! - ) - JC Err7 // Versatz Bring-/Holzeiger - - L Bringzeiger // Bringzeiger - L Holzeiger // Holzeiger - <>I // Ungleich ! - A( - L FifoLaenge - L Anzahl // Anzahl der gespeicherten Datensätze - ==I // Aber Fifo ist voll ! - ) - JC Err7 // Versatz Bring-/Holzeiger - - ---- NW 10: Fehlerausgabe / RET_VAL --- -Ende: SET // VKE = 1 ohne Fehler !!! - JU Ok -Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich - T Err - JU Err -Err1: S L32.1 // SFC20-Aufruf mit Fehler - JU Err -Err2: S L32.2 // Fifo ist voll - JU Err -Err3: S L32.3 // Falscher Parameter - JU Err -Err4: S L32.4 // Speicherzelle ist belegt - JU Err -Err5: S L32.5 // Bringzeiger außerhalb - JU Err -Err7: S L32.7 // Versatz Bring-/Holzeiger - -Err: CLR // VKE = 0 bei Fehler !!! -Ok: L Err - T RE_VAL - L Status - OW - T Status - - SAVE // VKE in BIE-Bit speichern - A ?SW? - = BieSpeicher - ---- NW 11: Fifokopfdaten speichern --- - A L32.0 // Falscher Parameter - A NixSave // Status nicht speichern - BEC - - L Anzahl // Anzahl der Datensätze (eingetragene) - + -1 // da vorher zum Test erhöht wurde - T "MW254" // Übergabe an FC+1 (für FIFO-FÖBE) - - L 16#FF // Testsendung ? - L Para1 // 1.Aufrufparameter - ==I // Ja ! - BEC // Weil Zeiger testweise geändert! - -// Ziel-Pointer erzeugen: - - L 16#1004 // Kennung 10 + Word=04 - T LW10 // Any-Kennung, Datentyp - L 16#0004 // 4Dw´s speichern - T LW12 // Wiederholungen - L SSDB - T LW14 // DB_Nummer - L SSDW // Adresse - L 4 - +I - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=P#L24.0 WORD 4, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Ab Bringzeiger sichern! - - A BieSpeicher - SAVE // VKE in BIE-Bit speichern - - L FifoLaenge // Länge des Fifo (maximale Anzahl der Datensätze) - T "MW248" // Übergabe an FC+1 (für Durchlaufspeicher) - L Bringzeiger // Zeiger, wohin nächster Eintrag gespeichert wird - T "MW250" // Übergabe an FC+1 (für Durchlaufspeicher) - L Holzeiger // Zeiger, woher nächste Daten geholt werden - T "MW252" // Übergabe an FC+1 (für Durchlaufspeicher) - L Anzahl // Anzahl der Datensätze (eingetragene) - T "MW254" // Übergabe an FC+1 (für Durchlaufspeicher) +FUNCTION "FifoIn" : Void +TITLE = Fifo-Modul +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +FAMILY : FIFO +NAME : FifoIn +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-1254 +//Version: ILS2100 / 06.11.2009 +// +//Datenblock in Fifo eintragen +//SSDB: FIFO-DB +//SSDW: FIFO-1.DW +//PARA: Aufrufparameter XXYZ: +// XX: 00 = Als nächsten Eintrag speichern +// 01 = Als 1.Eintrag speichern +// 02 = Nur Zusatzdaten speichern +// FF = Testsendung (nur RE_VAL!) +// YZ: 00 = Keine Zusatzdaten zum Speichern +// Y: 1 - 4 = Beginn, ab welchem Zusatzwort speichern +// Z: 1 - 4 = Ende, bis zu welchem Zusatzwort speichern +//INDATEN: Pointer, wo einzutragende Daten stehen (P#DB1.DBX0.0, P#M220.0) +//RE_VAL: Rückmeldungen: +// Bit0: Kein Fifobereich / falscher Kopfinhalt / Endekennung +// Bit1: SFC20-Aufruf mit Fehler +// Bit2: Fifo ist voll +// Bit3: Falscher Parameter bei Aufruf +// Bit4: Speicherzelle ist belegt +// Bit5: Bringzeiger ist ausserhalb +// Bit6: Holzeiger ist ausserhalb +// Bit7: Versatz Bring-/Holzeiger +// +// 1. - 4.Zusatzdaten: Mw240-246 +// +//Weitere Übergaben an FC+1: +// MW248: Länge des Fifo +// MW250: Bring-Zeiger +// MW252: Hol-Zeiger +// MW254: Anzahl der Datensätze (eingetragene) +// + VAR_INPUT + SSDB : Int; // Schnittstellen-DB + SSDW : Int; // Schnittstellen-1.DW + PARA : Word; // Aufrufparameter (Auftrag / Anzahl Zusatzdaten) + INDATEN : Pointer; // InDaten-Schnittstelle + END_VAR + + VAR_OUTPUT + RE_VAL : Byte; // Rückmeldung + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Kopf : Byte; // Fifo-Kennung (FF) + Datensatzlaenge : Byte; // Datensatzlänge in Word (1 - 128) + FifoLaenge : Int; // Länge des Fifo (maximale Anzahl der Datensätze) + Bringzeiger : Int; // Zeiger, wohin nächster Eintrag gespeichert wird + Holzeiger : Int; // Zeiger, woher nächste Daten geholt werden + Anzahl : Int; // Anzahl der Datensätze (eingetragene) + Status : Word; // Status des Fifo + Err : Byte; // Fehlerbits + Para1 : Byte; // 1.Aufrufparameter + Para2 : Byte; // 2.Aufrufparameter + Para21 : Byte; // 2.Aufrufparameter 1.Stelle + Para22 : Byte; // 2.Aufrufparameter 2.Stelle + MinBringzeiger : Int; // Minimum Bringzeiger + MaxBringzeiger : Int; // Maximum Bringzeiger + DBFifo : Word; // FIFO-DB + SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf + SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf + Fifo_Ende : Word; // Ende des Fifo + Schleife : Word; // Loopzähler + Offset : Byte; // Offset 1. zu speicherndes Zusatzwort + SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf + NixSave : Bool; // Status nicht speichern + BieSpeicher : Bool; // Bie-Bit zwischenspeichern + END_VAR + + +BEGIN +NETWORK +TITLE = Schnittstellen-DB sinnvoll ? + L #SSDB; + T #DBFifo; + +// CALL TEST_DB +// DB_NUMBER :=#DBFifo +// RET_VAL :=#SFC_RET_VAL +// DB_LENGTH :=#SFC_DB_LENGTH +// WRITE_PROT :=#SFC_WRITE_PROT + + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #DBFifo , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + O #SFC_WRITE_PROT; + = #NixSave;//Status nicht speichern + SPB Err0;//kein Fifobereich + +NETWORK +TITLE = Fifokopfdaten holen +//Quelle-Pointer erzeugen: + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 16#0006;//6 Dw´s holen + T %LW2;//Wiederholungen + L #SSDB; + T %LW4;//DB_Nummer + L #SSDW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//1.-6.DW FIFO holen + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := P#L20.0 WORD 6 + ); + + L #Status; + L 2#0000_0000_1110_0000; + UW; + T #Err; + SPP Err;//Kapitalfehler vorhanden + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + +NETWORK +TITLE = Zeigerüberprüfung + L #Kopf;//Fifo-Kopf + L 16#FF;//= Fifokennung ? + <>I;//Nein ! + = #NixSave;//Status nicht speichern + SPB Err0;//kein Fifobereich + + L 1; + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err0;//kein Fifobereich + + L 128; + >I; + SPB Err0;//kein Fifobereich + + L 1; + L #FifoLaenge;//Max.Anzahl von Datenblöcken + >I; + SPB Err0;//kein Fifobereich + + L #SSDW; + + 40;//Speichern ab 20.DW + T #MinBringzeiger;//Minimum Bringzeiger + + L #FifoLaenge;//Länge FIFO (in Word) + + -1; + L #Datensatzlaenge;//Datenblocklänge + *I; + L 2;//DB byteorientiert + *I; + + 40;//Speichern ab 20.DW + L #SSDW; + +I; + T #MaxBringzeiger;//Maximum Bringzeiger + + L #Datensatzlaenge;//Datenblocklänge + L 2;//DB byteorientiert + *I; + L #MaxBringzeiger;//Maximum Bringzeiger + +I;//Zeiger Endekennung + T #Fifo_Ende; + SLW 3;//Pointer erzeugen + LAR1; + + AUF DB[ #DBFifo]; + + L #Fifo_Ende; + L #SFC_DB_LENGTH; + >I;//Fifo-DB ist zu kurz! + SPB Err0;//kein Fifo-Bereich + + L DBW[ AR1, P#0.0]; + L 16#FFEE;//Fifo-Endekennung ? + <>I;//Nein ! + SPB Err0;//kein Fifobereich + + L #MinBringzeiger;//Minimum Bringzeiger + L #Bringzeiger;//Bringzeiger + <=I;//Ok ? + SPB W300;//Ja! + + L 0;//Grundstellung ? + <>I;//Nein ! + SPB Err5;//Bringzeiger ist ausserhalb + + L #Holzeiger;//Holzeiger Grundstellung ? + <>I;//Nein ! + SPB Err5;//Bringzeiger ist ausserhalb + + L #Anzahl;//Anzahl Datensätze + L 0;//Grundstellung ? + <>I;//Nein ! + SPB Err5;//Bringzeiger ist ausserhalb + + L #MinBringzeiger;//Minimum Bringzeiger + T #Bringzeiger;//Bringzeiger + T #Holzeiger;//Holzeiger + +W300: L #MaxBringzeiger;//Maximum Bringzeiger + <=I;//Ok ? + SPB W301;//Ja! + SPA Err5;//Bringzeiger ist ausserhalb + + +W301: L #Bringzeiger;//Bringzeiger + L #Holzeiger;//Holzeiger + ==I;//Identisch ! + U(; + L #FifoLaenge; + L #Anzahl;//Anzahl der gespeicherten Datensätze + <>I;//Fifo noch nicht voll ! + ); + U(; + L 0; + <>I;//Datensätze aber noch vorhanden ! + ); + SPB Err7;//Versatz Bring-/Holzeiger + + L #Bringzeiger;//Bringzeiger + L #Holzeiger;//Holzeiger + <>I;//Ungleich ! + U(; + L #FifoLaenge; + L #Anzahl;//Anzahl der gespeicherten Datensätze + ==I;//Aber Fifo ist voll ! + O(; + L 0; + ==I;//Aber keine Datensätze vorhanden ! + ); + ); + SPB Err7;//Versatz Bring-/Holzeiger + +NETWORK +TITLE = Nur Zusatzdaten / als 1.Datensatz speichern ? + L #PARA; + T %LW33;//Aufrufparameter zwischenspeichern + + L 16#02;//Nur Zusatzdaten speichern ? + L #Para1;//1.Aufrufparameter + <>I;//Nein ! + SPB W400; + + L #Para2;//2.Aufrufparameter + L 16#00;//=0 ? + ==I;//Ja ! + SPB Err3;//Falscher Aufrufparameter + + SPA Nw06;//Zusatzdaten speichern + +W400: L 16#01;//Als 1.Datensatz speichern ? + <>I;//Nein ! + SPB Nw05; + + L #MinBringzeiger;//Minimum Bringzeiger + T #Bringzeiger;//Bringzeiger + T #Holzeiger;//Holzeiger + L 0; + T #Anzahl;//Anzahl Datensätze + + SPA Nw06;//Zusatz-Daten speichern? + +NETWORK +TITLE = Hat Fifo Platz / Datenbereich leer ? +Nw05: L #Anzahl;//Anzahl der gespeicherten Datensätze + L #FifoLaenge;//Max. Anzahl von Datenblöcken + I; + SPB Err4;//Speicherzelle ist belegt + + +AR1 P#2.0; + + L #Schleife; + LOOP L500; + +NETWORK +TITLE = Zusatzdaten schreiben +Nw06: L 16#00;//=0 ? + L #Para2;//2.Aufrufparameter + ==I;//Ja ! + SPB Nw07; + + L 16#00F0; + UW; + SRW 4; + T #Para21;//1.Stelle isolieren + + L #Para2;//2.Aufrufparameter + L 16#000F; + UW; + T #Para22;//2.Stelle isolieren + + L #Para21; + L #Para22; + >I;//1.Stelle > 2.Stelle ! + SPB Err3;//Falscher Aufrufparameter + + L 16#04; + >I;//2.Stelle > 4 ! + SPB Err3;//Falscher Aufrufparameter + + L #Para21; + L 16#00; + ==I;//1.Stelle = 0 ! + SPB Err3;//Falscher Aufrufparameter + +//Quelle-Pointer erzeugen: + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + T %LW10;//Any-Kennung, Datentyp + L #Para22;//bis + L #Para21;//von + -I; + + 1; + T %LW2;//Wiederholungen + T %LW12;//Wiederholungen + L 0; + T %LW4;//DB_Nummer + + L #Para21;//Beginn ab X.Zusatzwort + + -1; + L 2;//byteorientiert + *I; + T #Offset;//Offset 1. zu speicherndes Zusatzwort + + L 16#00F0;//Adresse (ab MW240) + L #Offset;//falls nicht ab 1.Zusatzwort + +I; + SLD 3; + L 16#8300_0000;//Kennung: Merker + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: +//Kennung + Datenbytes s.o. + L #SSDB; + T %LW14;//DB_Nummer + L #SSDW; + + 12;//ab 6.Dw speichern + L #Offset;//falls nicht ab 1.Zusatzwort + +I; + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Zusatz-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := #Ziel + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + +NETWORK +TITLE = Fifodaten schreiben +Nw07: L 16#FF;//Testsendung ? + L #Para1;//1.Aufrufparameter + ==I;//Ja ! + SPB Nw08;//Zeiger testweise verändern + + L 16#02;//Nur Zusatzdaten speichern ? + ==I;//Ja ! + SPB Ende;//Fertig ! + +//Quelle-Pointer erzeugen: + + L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L #Datensatzlaenge;//Datenbytes speichern + T %LW2; + T %LW12;//Wiederholungen + +//DATEN-Pointer übernehmen: + L P##INDATEN; + LAR1; + + L W[ AR1, P#0.0]; + T %LW4;//DB_Nummer + L D[ AR1, P#2.0]; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: +//Kennung + Datenbytes s.o. + + L #SSDB; + T %LW14;//DB_Nummer + L #Bringzeiger;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//FIFO-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := #Ziel + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + +NETWORK +TITLE = Bringzeiger, Anzahl erhöhen +Nw08: L #Datensatzlaenge;//Datenblocklänge + L 2;//1 word = 2 bytes + *I; + L #Bringzeiger;//Bringzeiger + +I; + T #Bringzeiger;//Bringzeiger + L #MaxBringzeiger;//Maximum Bringzeiger + <=I;//Erreicht ? + SPB W800;//Nein ! + + L #MinBringzeiger;//Minimum Bringzeiger + T #Bringzeiger;//Bringzeiger + +W800: L #Anzahl;//Anzahl der gespeicherten Datensätze + + 1; + T #Anzahl;//Anzahl der gespeicherten Datensätze + +NETWORK +TITLE = Versatz Bring-/Holzeiger + L #Bringzeiger;//Bringzeiger + L #Holzeiger;//Holzeiger + ==I;//Identisch ! + U(; + L #FifoLaenge; + L #Anzahl;//Anzahl der gespeicherten Datensätze + <>I;//Fifo noch nicht voll ! + ); + SPB Err7;//Versatz Bring-/Holzeiger + + L #Bringzeiger;//Bringzeiger + L #Holzeiger;//Holzeiger + <>I;//Ungleich ! + U(; + L #FifoLaenge; + L #Anzahl;//Anzahl der gespeicherten Datensätze + ==I;//Aber Fifo ist voll ! + ); + SPB Err7;//Versatz Bring-/Holzeiger + +NETWORK +TITLE = Fehlerausgabe / RET_VAL +Ende: SET;//VKE = 1 ohne Fehler !!! + SPA Ok; +Err0: L 2#0000_0000_0000_0001;//Kein Fifobereich + T #Err; + SPA Err; +Err1: S %L32.1;//SFC20-Aufruf mit Fehler + SPA Err; +Err2: S %L32.2;//Fifo ist voll + SPA Err; +Err3: S %L32.3;//Falscher Parameter + SPA Err; +Err4: S %L32.4;//Speicherzelle ist belegt + SPA Err; +Err5: S %L32.5;//Bringzeiger außerhalb + SPA Err; +Err7: S %L32.7;//Versatz Bring-/Holzeiger + +Err: CLR;//VKE = 0 bei Fehler !!! +Ok: L #Err; + T #RE_VAL; + L #Status; + OW; + T #Status; + + SAVE;//VKE in BIE-Bit speichern + U BIE; + = #BieSpeicher; +NETWORK +TITLE = Fifokopfdaten speichern + U %L32.0;//Falscher Parameter + U #NixSave;//Status nicht speichern + BEB; + + L #Anzahl;//Anzahl der Datensätze (eingetragene) + + -1;//da vorher zum Test erhöht wurde + T "MW254";//Übergabe an FC+1 (für FIFO-FÖBE) + + L 16#FF;//Testsendung ? + L #Para1;//1.Aufrufparameter + ==I;//Ja ! + BEB;//Weil Zeiger testweise geändert! + +//Ziel-Pointer erzeugen: + + L 16#1004;//Kennung 10 + Word=04 + T %LW10;//Any-Kennung, Datentyp + L 16#0004;//4Dw´s speichern + T %LW12;//Wiederholungen + L #SSDB; + T %LW14;//DB_Nummer + L #SSDW;//Adresse + L 4; + +I; + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Ab Bringzeiger sichern! + {blk_type := 'Variant'} + ( SRCBLK := P#L24.0 WORD 4 , + RET_VAL := #SFC_RET_VAL , + DSTBLK := #Ziel + ); + + U #BieSpeicher; + SAVE;//VKE in BIE-Bit speichern + + L #FifoLaenge;//Länge des Fifo (maximale Anzahl der Datensätze) + T "MW248";//Übergabe an FC+1 (für Durchlaufspeicher) + L #Bringzeiger;//Zeiger, wohin nächster Eintrag gespeichert wird + T "MW250";//Übergabe an FC+1 (für Durchlaufspeicher) + L #Holzeiger;//Zeiger, woher nächste Daten geholt werden + T "MW252";//Übergabe an FC+1 (für Durchlaufspeicher) + L #Anzahl;//Anzahl der Datensätze (eingetragene) + T "MW254";//Übergabe an FC+1 (für Durchlaufspeicher) + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Module/FifoOut.awl b/=A01+UH07-KF00/Programmbausteine/Module/FifoOut.awl index e72d629..ede89dc 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/FifoOut.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/FifoOut.awl @@ -1,502 +1,567 @@ -=== FC 81: FifoOut [STL] === -INTERFACE: - Input: - SSDB : Int // Schnittstellen-DB - SSDW : Int // Schnittstellen-1.DW - PARA : Word // Aufrufparameter (Auftrag / Anzahl Zusatzdaten) - Output: - OUTDATEN : Pointer // OutDaten-Schnittstelle - RE_VAL : Byte // Rückmeldung - InOut: - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Kopf : Byte // Fifo-Kennung (FF) - Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128) - FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze) - Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird - Holzeiger : Int // Zeiger, woher nächste Daten geholt werden - Anzahl : Int // Anzahl der Datensätze (eingetragene) - Status : Word // Status des Fifo - Err : Byte // Fehlerbits - Para1 : Byte // 1.Aufrufparameter - Para2 : Byte // 2.Aufrufparameter - Para21 : Byte // 2.Aufrufparameter 1.Stelle - Para22 : Byte // 2.Aufrufparameter 2.Stelle - MinHolzeiger : Int // Minimum Holzeiger - MaxHolzeiger : Int // Maximum Holzeiger - DBFifo : Word // FIFO-DB - SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf - SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf - Fifo_Ende : Word // Ende des Fifo - Schleife : Word // Loopzähler - Offset : Byte // Offset 1. zu lesendes Zusatzwort - SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf - NixSave : Bool // Status nicht speichern - BieSpeicher : Bool // Bie-Bit zwischenspeichern - Lesezeiger : Int // Lesezeiger - Diff : Int // Differenz - Constant: - Return: - Ret_Val : Void - ---- NW 1: Schnittstellen-DB sinnvoll ? --- - L SSDB - T DBFifo - -// CALL TEST_DB -// DB_NUMBER :=#DBFifo -// RET_VAL :=#SFC_RET_VAL -// DB_LENGTH :=#SFC_DB_LENGTH -// WRITE_PROT :=#SFC_WRITE_PROT - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - O SFC_WRITE_PROT - = NixSave // Status nicht speichern - JC Err0 // kein Fifobereich - - ---- NW 2: Quelle-Pointer erzeugen: --- - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 16#0006 // 6 Dw´s holen - T LW2 // Wiederholungen - L SSDB - T LW4 // DB_Nummer - L SSDW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 6) // 1.-6.DW FIFO holen - - L Status - L 2#0000_0000_1110_0000 - AW - T Err - JP Err // Kapitalfehler vorhanden - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 - - ---- NW 3: Zeigerüberprüfung --- - L Kopf // Fifo-Kopf - L 16#FF // = Fifokennung ? - <>I // Nein ! - = NixSave // Status nicht speichern - JC Err0 // kein Fifobereich - - L 1 - L Datensatzlaenge // Datenblocklänge - >I - JC Err0 // kein Fifobereich - - L 128 - >I - JC Err0 // kein Fifobereich - - L 1 - L FifoLaenge // Max.Anzahl von Datenblöcken - >I - JC Err0 // kein Fifobereich - - L SSDW - + 40 // Speichern ab 20.DW - T MinHolzeiger // Minimum Holzeiger - - L FifoLaenge // Länge FIFO (in Word) - + -1 - L Datensatzlaenge // Datenblocklänge - *I - L 2 // DB byteorientiert - *I - + 40 // Speichern ab 20.DW - L SSDW - +I - T MaxHolzeiger // Maximum Holzeiger - - L Datensatzlaenge // Datenblocklänge - L 2 // DB byteorientiert - *I - L MaxHolzeiger // Maximum Holzeiger - +I // Zeiger Endekennung - T Fifo_Ende - SLW 3 // Pointer erzeugen - LAR1 - - OPN DB[DBFifo] - - L Fifo_Ende - L SFC_DB_LENGTH - >I // Fifo-DB ist zu kurz! - JC Err0 // kein Fifo-Bereich - - L DBW [AR1,] - L 16#FFEE // Fifo-Endekennung ? - <>I // Nein ! - JC Err0 // kein Fifobereich - - L MinHolzeiger // Minimum Holzeiger - L Holzeiger // Holzeiger - <=I // Ok ? - JC W300 // Ja! - - L 0 // Grundstellung ? - <>I // Nein ! - JC Err6 // Holzeiger ist ausserhalb - - L Bringzeiger // Bringzeiger Grundstellung ? - <>I // Nein ! - JC Err6 // Holzeiger ist ausserhalb - - L Anzahl // Anzahl Datensätze - L 0 // Grundstellung ? - <>I // Nein ! - JC Err6 // Holzeiger ist ausserhalb - - L MinHolzeiger // Minimum Holzeiger - T Bringzeiger // Bringzeiger - T Holzeiger // Holzeiger - - JU Zus // Zusatzdaten lesen ? - -W300: L MaxHolzeiger // Maximum Holzeiger - <=I // Ok ? - JC W301 // Ja! - JU Err6 // Holzeiger ist ausserhalb - - -W301: L Bringzeiger // Bringzeiger - L Holzeiger // Holzeiger - ==I // Identisch ! - A( - L FifoLaenge - L Anzahl // Anzahl der gespeicherten Datensätze - <>I // Fifo noch nicht voll ! - ) - A( - L 0 - <>I // Datensätze aber noch vorhanden ! - ) - JC Err7 // Versatz Bring-/Holzeiger - - L Bringzeiger // Bringzeiger - L Holzeiger // Holzeiger - <>I // Ungleich ! - A( - L FifoLaenge - L Anzahl // Anzahl der gespeicherten Datensätze - ==I // Aber Fifo ist voll ! - O( - L 0 - ==I // Aber keine Datensätze vorhanden ! - ) - ) - JC Err7 // Versatz Bring-/Holzeiger - - ---- NW 4: Zusatzdaten lesen ? --- -Zus: L PARA - T LW33 // Aufrufparameter zwischenspeichern - - L 16#E2 // Nur Zusatzdaten lesen ? - L Para1 // 1.Aufrufparameter - ==I // Ja ! - A( - L Para2 // 2.Aufrufparameter - L 16#00 // =0 ? - ==I // Ja ! - ) - JC Err3 // Falscher Aufrufparameter - - L 16#00 // =0 ? - L Para2 // 2.Aufrufparameter - ==I // Ja ! - JC Nw05 // Keine Zusatzdaten lesen - - L 16#00F0 - AW - SRW 4 - T Para21 // 1.Stelle isolieren - - L Para2 // 2.Aufrufparameter - L 16#000F - AW - T Para22 // 2.Stelle isolieren - - L Para21 - L Para22 - >I // 1.Stelle > 2.Stelle ! - JC Err3 // Falscher Aufrufparameter - - L 16#04 - >I // 2.Stelle > 4 ! - JC Err3 // Falscher Aufrufparameter - - L Para21 - L 16#00 - ==I // 1.Stelle = 0 ! - JC Err3 // Falscher Aufrufparameter - -// Quelle-Pointer erzeugen: - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - T LW10 // Any-Kennung, Datentyp - L Para22 // bis - L Para21 // von - -I - + 1 - T LW2 // Wiederholungen - T LW12 // Wiederholungen - - L Para21 // Beginn ab X.Zusatzwort - + -1 - L 2 // byteorientiert - *I - T Offset // Offset 1. zu speicherndes Zusatzwort - - L SSDB - T LW4 // DB_Nummer - L SSDW - + 12 // ab 6.Dw lesen - L Offset // falls nicht ab 1.Zusatzwort - +I - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: -// Kennung + Datenbytes s.o. - - L 0 - T LW14 // DB_Nummer - - L 16#00F0 // Adresse (MW240) - L Offset // falls nicht ab 1.Zusatzwort - +I - SLD 3 - L 16#8300_0000 // Kennung: Merker - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Zusatz-Daten speichern - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 - - ---- NW 5: Fifodaten lesen --- -Nw05: L Para1 // 1.Aufrufparameter - L 16#E2 // Nur Zusatzdaten lesen ? - ==I // Ja ! - JC Ende // Fertig ! - - L Anzahl // Anzahl der gespeicherten Datensätze - L 0 - ==I // Keine Datensätze vorhanden ! - JC Err2 // Fifo ist leer - -// Quelle-Pointer erzeugen: - - L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L Datensatzlaenge // Datenbytes speichern - T LW2 - T LW12 // Wiederholungen - - L SSDB - T LW4 // DB_Nummer - - L Holzeiger // Adresse (erstmal !, falls Para 2=0) - T Lesezeiger // Lesezeiger - L Para1 // 1.Aufrufparameter - L 16#00 // =0 ? - ==I - O( - CAC - L 16#E1 // Datensatz löschen ? - ==I // Ja ! - ) - JC w050 - - CAC // X-te Stelle lesen - + -1 // -1, da 1.ohne Offeset - L Datensatzlaenge // Datenblocklänge - *I - L 2 // DB byteorientiert - *I - L Holzeiger // Adresse - +I - T Lesezeiger // Lesezeiger - L MaxHolzeiger // Maximum Holzeiger - <=I // Ist nicht über Maximum ! - JC w050 - - L FifoLaenge // Länge FIFO (in Word) - L Datensatzlaenge // Datenblocklänge - *I - L 2 // DB byteorientiert - *I - T Diff - - L Lesezeiger // Differenz subtrahieren: - L Diff - -I - T Lesezeiger // Lesezeiger - -w050: L Lesezeiger // Lesezeiger - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: -// Kennung + Datenbytes s.o. - -// DATEN-Pointer übernehmen: - L P# - LAR1 - - L NoneW [AR1,] - T LW14 // DB_Nummer - L NoneD [AR1,] - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // FIFO-Daten speichern - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 - - ---- NW 6: Daten aus Fifo austragen ? --- - L 16#E1 // Daten löschen ? - L Para1 // 1.Aufrufparameter - <>I // Nein ! - JC Ende // Fertig ! - - L Holzeiger // Holzeiger - SLW 3 // Pointer erzeugen - LAR1 - - OPN DB[DBFifo] - - L Datensatzlaenge -L600: T Schleife - - L 0 - T DBW [AR1,] - - ADDAR1 P#2.0 - - L Schleife - LOOP L600 - - ---- NW 7: Holzeiger, Anzahl erniedrigen --- - L Datensatzlaenge // Datenblocklänge - L 2 // 1 word = 2 bytes - *I - L Holzeiger // Holzeiger - +I - T Holzeiger // Holzeiger - L MaxHolzeiger // Maximum Holzeiger - <=I // Erreicht ? - JC W700 // Nein ! - - L MinHolzeiger // Minimum Holzeiger - T Holzeiger // Holzeiger - -W700: L Anzahl // Anzahl der gespeicherten Datensätze - + -1 - T Anzahl // Anzahl der gespeicherten Datensätze - - ---- NW 8: Versatz Bring-/Holzeiger --- - L Bringzeiger // Bringzeiger - L Holzeiger // Holzeiger - ==I // Identisch ! - A( - L Anzahl // Anzahl der gespeicherten Datensätze - L 0 - <>I // Datensätze aber noch vorhanden ! - ) - JC Err7 // Versatz Bring-/Holzeiger - - L Bringzeiger // Bringzeiger - L Holzeiger // Holzeiger - <>I // Ungleich ! - A( - L Anzahl // Anzahl der gespeicherten Datensätze - L 0 - ==I // Aber keine Datensätze vorhanden ! - ) - JC Err7 // Versatz Bring-/Holzeiger - - ---- NW 9: Fehlerausgabe / RET_VAL --- -Ende: SET // VKE = 1 ohne Fehler !!! - JU Ok -Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich - T Err - JU Err -Err1: S L32.1 // SFC20-Aufruf mit Fehler - JU Err -Err2: S L32.2 // Fifo ist leer - JU Err -Err3: S L32.3 // Falscher Parameter - JU Err -Err6: S L32.6 // Holzeiger außerhalb - JU Err -Err7: S L32.7 // Versatz Bring-/Holzeiger - -Err: CLR // VKE = 0 bei Fehler !!! -Ok: L Err - T RE_VAL - L Status - OW - T Status - - SAVE // VKE in BIE-Bit speichern - A ?SW? - = BieSpeicher - ---- NW 10: Fifokopfdaten speichern --- - A L32.0 // Falscher Parameter - A NixSave // Status nicht speichern - BEC - -// Ziel-Pointer erzeugen: - - L 16#1004 // Kennung 10 + Word=04 - T LW10 // Any-Kennung, Datentyp - L 16#0004 // 4Dw´s speichern - T LW12 // Wiederholungen - L SSDB - T LW14 // DB_Nummer - L SSDW // Adresse - L 4 - +I - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=P#L24.0 WORD 4, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Ab Bringzeiger sichern! - - A BieSpeicher - SAVE // VKE in BIE-Bit speichern +FUNCTION "FifoOut" : Void +TITLE = Fifo-Modul +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +FAMILY : FIFO +NAME : FifoIn +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-1254 +//Version: ILS2100 / 06.11.2009 +// +//Datenblock in Fifo lesen, aus Fifo austragen +//SSDB: FIFO-DB +//SSDW: FIFO-1.DW +//PARA: Aufrufparameter XXYZ: +// XX: 00 = nächsten Eintrag lesen +// 01,02...,224 = Eintrag 1,2,...,224 lesen +// E1 = nächsten Eintrag lesen + austragen! +// E2 = Nur Zusatzdaten lesen +// YZ: 00 = Keine Zusatzdaten zum lesen +// Y: 1 - 4 = Beginn, ab welchem Zusatzwort lesen +// Z: 1 - 4 = Ende, bis zu welchem Zusatzwort lesen +//OUTDATEN: Pointer, wohin ausgelesene Daten übergeben werden (P#DB1.DBX0.0, +// P#M220.0) +//RE_VAL: Rückmeldungen: +// Bit0: Kein Fifobereich / falscher Kopfinhalt / Endekennung +// Bit1: SFC20-Aufruf mit Fehler +// Bit2: Fifo ist leer +// Bit3: Falscher Parameter bei Aufruf +// Bit4: Frei +// Bit5: Bringzeiger ist ausserhalb +// Bit6: Holzeiger ist ausserhalb +// Bit7: Versatz Bring-/Holzeiger +// + VAR_INPUT + SSDB : Int; // Schnittstellen-DB + SSDW : Int; // Schnittstellen-1.DW + PARA : Word; // Aufrufparameter (Auftrag / Anzahl Zusatzdaten) + END_VAR + + VAR_OUTPUT + OUTDATEN : Pointer; // OutDaten-Schnittstelle + RE_VAL : Byte; // Rückmeldung + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Kopf : Byte; // Fifo-Kennung (FF) + Datensatzlaenge : Byte; // Datensatzlänge in Word (1 - 128) + FifoLaenge : Int; // Länge des Fifo (maximale Anzahl der Datensätze) + Bringzeiger : Int; // Zeiger, wohin nächster Eintrag gespeichert wird + Holzeiger : Int; // Zeiger, woher nächste Daten geholt werden + Anzahl : Int; // Anzahl der Datensätze (eingetragene) + Status : Word; // Status des Fifo + Err : Byte; // Fehlerbits + Para1 : Byte; // 1.Aufrufparameter + Para2 : Byte; // 2.Aufrufparameter + Para21 : Byte; // 2.Aufrufparameter 1.Stelle + Para22 : Byte; // 2.Aufrufparameter 2.Stelle + MinHolzeiger : Int; // Minimum Holzeiger + MaxHolzeiger : Int; // Maximum Holzeiger + DBFifo : Word; // FIFO-DB + SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf + SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf + Fifo_Ende : Word; // Ende des Fifo + Schleife : Word; // Loopzähler + Offset : Byte; // Offset 1. zu lesendes Zusatzwort + SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf + NixSave : Bool; // Status nicht speichern + BieSpeicher : Bool; // Bie-Bit zwischenspeichern + Lesezeiger : Int; // Lesezeiger + Diff : Int; // Differenz + END_VAR + + +BEGIN +NETWORK +TITLE = Schnittstellen-DB sinnvoll ? + L #SSDB; + T #DBFifo; + +// CALL TEST_DB +// DB_NUMBER :=#DBFifo +// RET_VAL :=#SFC_RET_VAL +// DB_LENGTH :=#SFC_DB_LENGTH +// WRITE_PROT :=#SFC_WRITE_PROT + + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #DBFifo , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + O #SFC_WRITE_PROT; + = #NixSave;//Status nicht speichern + SPB Err0;//kein Fifobereich + +NETWORK +TITLE = Fifokopfdaten holen +//Quelle-Pointer erzeugen: + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 16#0006;//6 Dw´s holen + T %LW2;//Wiederholungen + L #SSDB; + T %LW4;//DB_Nummer + L #SSDW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//1.-6.DW FIFO holen + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := P#L20.0 WORD 6 + ); + + L #Status; + L 2#0000_0000_1110_0000; + UW; + T #Err; + SPP Err;//Kapitalfehler vorhanden + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + +NETWORK +TITLE = Zeigerüberprüfung + L #Kopf;//Fifo-Kopf + L 16#FF;//= Fifokennung ? + <>I;//Nein ! + = #NixSave;//Status nicht speichern + SPB Err0;//kein Fifobereich + + L 1; + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err0;//kein Fifobereich + + L 128; + >I; + SPB Err0;//kein Fifobereich + + L 1; + L #FifoLaenge;//Max.Anzahl von Datenblöcken + >I; + SPB Err0;//kein Fifobereich + + L #SSDW; + + 40;//Speichern ab 20.DW + T #MinHolzeiger;//Minimum Holzeiger + + L #FifoLaenge;//Länge FIFO (in Word) + + -1; + L #Datensatzlaenge;//Datenblocklänge + *I; + L 2;//DB byteorientiert + *I; + + 40;//Speichern ab 20.DW + L #SSDW; + +I; + T #MaxHolzeiger;//Maximum Holzeiger + + L #Datensatzlaenge;//Datenblocklänge + L 2;//DB byteorientiert + *I; + L #MaxHolzeiger;//Maximum Holzeiger + +I;//Zeiger Endekennung + T #Fifo_Ende; + SLW 3;//Pointer erzeugen + LAR1; + + AUF DB[ #DBFifo]; + + L #Fifo_Ende; + L #SFC_DB_LENGTH; + >I;//Fifo-DB ist zu kurz! + SPB Err0;//kein Fifo-Bereich + + L DBW[ AR1, P#0.0]; + L 16#FFEE;//Fifo-Endekennung ? + <>I;//Nein ! + SPB Err0;//kein Fifobereich + + L #MinHolzeiger;//Minimum Holzeiger + L #Holzeiger;//Holzeiger + <=I;//Ok ? + SPB W300;//Ja! + + L 0;//Grundstellung ? + <>I;//Nein ! + SPB Err6;//Holzeiger ist ausserhalb + + L #Bringzeiger;//Bringzeiger Grundstellung ? + <>I;//Nein ! + SPB Err6;//Holzeiger ist ausserhalb + + L #Anzahl;//Anzahl Datensätze + L 0;//Grundstellung ? + <>I;//Nein ! + SPB Err6;//Holzeiger ist ausserhalb + + L #MinHolzeiger;//Minimum Holzeiger + T #Bringzeiger;//Bringzeiger + T #Holzeiger;//Holzeiger + + SPA Zus;//Zusatzdaten lesen ? + +W300: L #MaxHolzeiger;//Maximum Holzeiger + <=I;//Ok ? + SPB W301;//Ja! + SPA Err6;//Holzeiger ist ausserhalb + + +W301: L #Bringzeiger;//Bringzeiger + L #Holzeiger;//Holzeiger + ==I;//Identisch ! + U(; + L #FifoLaenge; + L #Anzahl;//Anzahl der gespeicherten Datensätze + <>I;//Fifo noch nicht voll ! + ); + U(; + L 0; + <>I;//Datensätze aber noch vorhanden ! + ); + SPB Err7;//Versatz Bring-/Holzeiger + + L #Bringzeiger;//Bringzeiger + L #Holzeiger;//Holzeiger + <>I;//Ungleich ! + U(; + L #FifoLaenge; + L #Anzahl;//Anzahl der gespeicherten Datensätze + ==I;//Aber Fifo ist voll ! + O(; + L 0; + ==I;//Aber keine Datensätze vorhanden ! + ); + ); + SPB Err7;//Versatz Bring-/Holzeiger + +NETWORK +TITLE = Zusatzdaten lesen ? +Zus: L #PARA; + T %LW33;//Aufrufparameter zwischenspeichern + + L 16#E2;//Nur Zusatzdaten lesen ? + L #Para1;//1.Aufrufparameter + ==I;//Ja ! + U(; + L #Para2;//2.Aufrufparameter + L 16#00;//=0 ? + ==I;//Ja ! + ); + SPB Err3;//Falscher Aufrufparameter + + L 16#00;//=0 ? + L #Para2;//2.Aufrufparameter + ==I;//Ja ! + SPB Nw05;//Keine Zusatzdaten lesen + + L 16#00F0; + UW; + SRW 4; + T #Para21;//1.Stelle isolieren + + L #Para2;//2.Aufrufparameter + L 16#000F; + UW; + T #Para22;//2.Stelle isolieren + + L #Para21; + L #Para22; + >I;//1.Stelle > 2.Stelle ! + SPB Err3;//Falscher Aufrufparameter + + L 16#04; + >I;//2.Stelle > 4 ! + SPB Err3;//Falscher Aufrufparameter + + L #Para21; + L 16#00; + ==I;//1.Stelle = 0 ! + SPB Err3;//Falscher Aufrufparameter + +//Quelle-Pointer erzeugen: + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + T %LW10;//Any-Kennung, Datentyp + L #Para22;//bis + L #Para21;//von + -I; + + 1; + T %LW2;//Wiederholungen + T %LW12;//Wiederholungen + + L #Para21;//Beginn ab X.Zusatzwort + + -1; + L 2;//byteorientiert + *I; + T #Offset;//Offset 1. zu speicherndes Zusatzwort + + L #SSDB; + T %LW4;//DB_Nummer + L #SSDW; + + 12;//ab 6.Dw lesen + L #Offset;//falls nicht ab 1.Zusatzwort + +I; + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: +//Kennung + Datenbytes s.o. + + L 0; + T %LW14;//DB_Nummer + + L 16#00F0;//Adresse (MW240) + L #Offset;//falls nicht ab 1.Zusatzwort + +I; + SLD 3; + L 16#8300_0000;//Kennung: Merker + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Zusatz-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := #Ziel + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + +NETWORK +TITLE = Fifodaten lesen +Nw05: L #Para1;//1.Aufrufparameter + L 16#E2;//Nur Zusatzdaten lesen ? + ==I;//Ja ! + SPB Ende;//Fertig ! + + L #Anzahl;//Anzahl der gespeicherten Datensätze + L 0; + ==I;//Keine Datensätze vorhanden ! + SPB Err2;//Fifo ist leer + +//Quelle-Pointer erzeugen: + + L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L #Datensatzlaenge;//Datenbytes speichern + T %LW2; + T %LW12;//Wiederholungen + + L #SSDB; + T %LW4;//DB_Nummer + + L #Holzeiger;//Adresse (erstmal !, falls Para 2=0) + T #Lesezeiger;//Lesezeiger + L #Para1;//1.Aufrufparameter + L 16#00;//=0 ? + ==I; + O(; + TAK; + L 16#E1;//Datensatz löschen ? + ==I;//Ja ! + ); + SPB w050; + + TAK;//X-te Stelle lesen + + -1;//-1, da 1.ohne Offeset + L #Datensatzlaenge;//Datenblocklänge + *I; + L 2;//DB byteorientiert + *I; + L #Holzeiger;//Adresse + +I; + T #Lesezeiger;//Lesezeiger + L #MaxHolzeiger;//Maximum Holzeiger + <=I;//Ist nicht über Maximum ! + SPB w050; + + L #FifoLaenge;//Länge FIFO (in Word) + L #Datensatzlaenge;//Datenblocklänge + *I; + L 2;//DB byteorientiert + *I; + T #Diff; + + L #Lesezeiger;//Differenz subtrahieren: + L #Diff; + -I; + T #Lesezeiger;//Lesezeiger + +w050: L #Lesezeiger;//Lesezeiger + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: +//Kennung + Datenbytes s.o. + +//DATEN-Pointer übernehmen: + L P##OUTDATEN; + LAR1; + + L W[ AR1, P#0.0]; + T %LW14;//DB_Nummer + L D[ AR1, P#2.0]; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//FIFO-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := #Ziel + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + +NETWORK +TITLE = Daten aus Fifo austragen ? + L 16#E1;//Daten löschen ? + L #Para1;//1.Aufrufparameter + <>I;//Nein ! + SPB Ende;//Fertig ! + + L #Holzeiger;//Holzeiger + SLW 3;//Pointer erzeugen + LAR1; + + AUF DB[ #DBFifo]; + + L #Datensatzlaenge; +L600: T #Schleife; + + L 0; + T DBW[ AR1, P#0.0]; + + +AR1 P#2.0; + + L #Schleife; + LOOP L600; + +NETWORK +TITLE = Holzeiger, Anzahl erniedrigen + L #Datensatzlaenge;//Datenblocklänge + L 2;//1 word = 2 bytes + *I; + L #Holzeiger;//Holzeiger + +I; + T #Holzeiger;//Holzeiger + L #MaxHolzeiger;//Maximum Holzeiger + <=I;//Erreicht ? + SPB W700;//Nein ! + + L #MinHolzeiger;//Minimum Holzeiger + T #Holzeiger;//Holzeiger + +W700: L #Anzahl;//Anzahl der gespeicherten Datensätze + + -1; + T #Anzahl;//Anzahl der gespeicherten Datensätze + +NETWORK +TITLE = Versatz Bring-/Holzeiger + L #Bringzeiger;//Bringzeiger + L #Holzeiger;//Holzeiger + ==I;//Identisch ! + U(; + L #Anzahl;//Anzahl der gespeicherten Datensätze + L 0; + <>I;//Datensätze aber noch vorhanden ! + ); + SPB Err7;//Versatz Bring-/Holzeiger + + L #Bringzeiger;//Bringzeiger + L #Holzeiger;//Holzeiger + <>I;//Ungleich ! + U(; + L #Anzahl;//Anzahl der gespeicherten Datensätze + L 0; + ==I;//Aber keine Datensätze vorhanden ! + ); + SPB Err7;//Versatz Bring-/Holzeiger + +NETWORK +TITLE = Fehlerausgabe / RET_VAL +Ende: SET;//VKE = 1 ohne Fehler !!! + SPA Ok; +Err0: L 2#0000_0000_0000_0001;//Kein Fifobereich + T #Err; + SPA Err; +Err1: S %L32.1;//SFC20-Aufruf mit Fehler + SPA Err; +Err2: S %L32.2;//Fifo ist leer + SPA Err; +Err3: S %L32.3;//Falscher Parameter + SPA Err; +Err6: S %L32.6;//Holzeiger außerhalb + SPA Err; +Err7: S %L32.7;//Versatz Bring-/Holzeiger + +Err: CLR;//VKE = 0 bei Fehler !!! +Ok: L #Err; + T #RE_VAL; + L #Status; + OW; + T #Status; + + SAVE;//VKE in BIE-Bit speichern + U BIE; + = #BieSpeicher; +NETWORK +TITLE = Fifokopfdaten speichern + U %L32.0;//Falscher Parameter + U #NixSave;//Status nicht speichern + BEB; + +//Ziel-Pointer erzeugen: + + L 16#1004;//Kennung 10 + Word=04 + T %LW10;//Any-Kennung, Datentyp + L 16#0004;//4Dw´s speichern + T %LW12;//Wiederholungen + L #SSDB; + T %LW14;//DB_Nummer + L #SSDW;//Adresse + L 4; + +I; + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Ab Bringzeiger sichern! + {blk_type := 'Variant'} + ( SRCBLK := P#L24.0 WORD 4 , + RET_VAL := #SFC_RET_VAL , + DSTBLK := #Ziel + ); + + U #BieSpeicher; + SAVE;//VKE in BIE-Bit speichern + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Module/FifoReset.awl b/=A01+UH07-KF00/Programmbausteine/Module/FifoReset.awl index 2468496..621777b 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/FifoReset.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/FifoReset.awl @@ -1,204 +1,248 @@ -=== FC 82: FifoReset [STL] === -INTERFACE: - Input: - SSDB : Int // Schnittstellen-DB - SSDW : Int // Schnittstellen-1.DW - PARA : Word // Aufrufparameter (Durchlaufspeicher?) - Output: - RE_VAL : Byte // Rückmeldung - InOut: - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Kopf : Byte // Fifo-Kennung (FF) - Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128) - FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze) - Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird - Holzeiger : Int // Zeiger, woher nächste Daten geholt werden - Anzahl : Int // Anzahl der Datensätze (eingetragene) - Status : Word // Status des Fifo - DBFifo : Word // FIFO-DB - SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf - SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf - Fifo_Ende : Word // Ende des Fifo - Schleife : Word // Loopzähler - SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf - Constant: - Return: - Ret_Val : Void +FUNCTION "FifoReset" : Void +TITLE = Fifo-Modul +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +FAMILY : FIFO +NAME : FifoIn +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-1254 +//Version: ILS2100 / 06.11.2009 +// +//Fifo resetten +//SSDB: FIFO-DB +//SSDW: FIFO-1.DW +//PARA: Aufrufparameter 00XX: +// XX: 00 = Normaler FIFO (alles löschen) +// D0 = Durchlaufspeicher (alles mit Nullen füllen) +// D1 = Durchlaufspeicher (alles mit FFFF füllen) +// Rückmeldungen: +// Bit0: Kein Fifobereich / falscher Kopfinhalt / Endekennung +// Bit1: SFC20-Aufruf mit Fehler +// Bit2: Frei +// Bit3: Frei +// Bit4: Frei +// Bit5: Frei +// Bit6: Frei +// Bit7: Frei +// + VAR_INPUT + SSDB : Int; // Schnittstellen-DB + SSDW : Int; // Schnittstellen-1.DW + PARA : Word; // Aufrufparameter (Durchlaufspeicher?) + END_VAR ---- NW 1: Schnittstellen-DB sinnvoll ? --- - L SSDB - T DBFifo + VAR_OUTPUT + RE_VAL : Byte; // Rückmeldung + END_VAR -// CALL TEST_DB -// DB_NUMBER :=#DBFifo -// RET_VAL :=#SFC_RET_VAL -// DB_LENGTH :=#SFC_DB_LENGTH -// WRITE_PROT :=#SFC_WRITE_PROT - -CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT) - - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - O SFC_WRITE_PROT - JC Err0 // kein Fifobereich + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Kopf : Byte; // Fifo-Kennung (FF) + Datensatzlaenge : Byte; // Datensatzlänge in Word (1 - 128) + FifoLaenge : Int; // Länge des Fifo (maximale Anzahl der Datensätze) + Bringzeiger : Int; // Zeiger, wohin nächster Eintrag gespeichert wird + Holzeiger : Int; // Zeiger, woher nächste Daten geholt werden + Anzahl : Int; // Anzahl der Datensätze (eingetragene) + Status : Word; // Status des Fifo + DBFifo : Word; // FIFO-DB + SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf + SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf + Fifo_Ende : Word; // Ende des Fifo + Schleife : Word; // Loopzähler + SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf + END_VAR ---- NW 2: Quelle-Pointer erzeugen: --- - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 16#0006 // 6 Dw´s holen - T LW2 // Wiederholungen - L SSDB - T LW4 // DB_Nummer - L SSDW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse +BEGIN +NETWORK +TITLE = Schnittstellen-DB sinnvoll ? + L #SSDB; + T #DBFifo; -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L10.0 WORD 6) // 1.-6.DW FIFO holen +// CALL TEST_DB +// DB_NUMBER :=#DBFifo +// RET_VAL :=#SFC_RET_VAL +// DB_LENGTH :=#SFC_DB_LENGTH +// WRITE_PROT :=#SFC_WRITE_PROT - L SFC_RET_VAL - L 2#0000_0000_0000_0000 - <>I - JC Err1 + CALL "TEST_DB_TO_ATTR_DB" + ( DB_Number := #DBFifo , + RetVal := #SFC_RET_VAL , + DB_Length := #SFC_DB_LENGTH , + Write_Prot := #SFC_WRITE_PROT + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + O #SFC_WRITE_PROT; + SPB Err0;//kein Fifobereich + +NETWORK +TITLE = Fifokopfdaten holen +//Quelle-Pointer erzeugen: + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 16#0006;//6 Dw´s holen + T %LW2;//Wiederholungen + L #SSDB; + T %LW4;//DB_Nummer + L #SSDW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//1.-6.DW FIFO holen + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #SFC_RET_VAL , + DSTBLK := P#L10.0 WORD 6 + ); + + L #SFC_RET_VAL; + L 2#0000_0000_0000_0000; + <>I; + SPB Err1; + +NETWORK +TITLE = Zeigerüberprüfung + L #Kopf;//Fifo-Kopf + L 16#FF;//= Fifokennung ? + <>I;//Nein ! + SPB Err0;//kein Fifobereich + + L 1; + L #Datensatzlaenge;//Datenblocklänge + >I; + SPB Err0;//kein Fifobereich + + L 128; + >I; + SPB Err0;//kein Fifobereich + + L 1; + L #FifoLaenge;//Max.Anzahl von Datenblöcken + >I; + SPB Err0;//kein Fifobereich + + L #FifoLaenge;//Länge FIFO (in Word) + L #Datensatzlaenge;//Datenblocklänge + *I; + L 2;//DB byteorientiert + *I; + + 40;//Speichern ab 20.DW + L #SSDW; + +I; + T #Fifo_Ende; + SLW 3;//Pointer erzeugen + LAR1; + + AUF DB[ #DBFifo]; + + L #Fifo_Ende; + L #SFC_DB_LENGTH; + >I;//Fifo-DB ist zu kurz! + SPB Err0;//kein Fifo-Bereich + + L DBW[ AR1, P#0.0]; + L 16#FFEE;//Fifo-Endekennung ? + <>I;//Nein ! + SPB Err0;//kein Fifobereich + +NETWORK +TITLE = Fifo-Daten löschen + L #SSDW; + + 4;//Ab 2.Dw + SLW 3;//Pointer erzeugen + LAR1; + + AUF DB[ #DBFifo]; + + L #Datensatzlaenge; + L #FifoLaenge; + *I; + + 18;//18 Datenwörter (wortorientiert) +L400: T #Schleife; + + L 0; + T DBW[ AR1, P#0.0]; + + +AR1 P#2.0; + + L #Schleife; + LOOP L400; ---- NW 3: Zeigerüberprüfung --- - L Kopf // Fifo-Kopf - L 16#FF // = Fifokennung ? - <>I // Nein ! - JC Err0 // kein Fifobereich +NETWORK +TITLE = Durchlaufspeicher ? + L #PARA;//Aufrufparameter + SRW 4; + L 16#000D;//Durchlaufspeicher ? + <>I;//Nein ! + SPB N006; - L 1 - L Datensatzlaenge // Datenblocklänge - >I - JC Err0 // kein Fifobereich + L #SSDW; + + 4;//Speichern ab 4.DW + SLW 3;//Pointer erzeugen + LAR1; - L 128 - >I - JC Err0 // kein Fifobereich + AUF DB[ #DBFifo]; - L 1 - L FifoLaenge // Max.Anzahl von Datenblöcken - >I - JC Err0 // kein Fifobereich + L #SSDW; + + 40;//1.Speicherzelle + T DBW[ AR1, P#0.0];//Bringzeiger + T DBW[ AR1, P#2.0];//Holzeiger - L FifoLaenge // Länge FIFO (in Word) - L Datensatzlaenge // Datenblocklänge - *I - L 2 // DB byteorientiert - *I - + 40 // Speichern ab 20.DW - L SSDW - +I - T Fifo_Ende - SLW 3 // Pointer erzeugen - LAR1 + L #FifoLaenge;//Fifo ist voll + T DBW[ AR1, P#4.0];//Anzahl - OPN DB[DBFifo] + L #PARA;//Aufrufparameter + L 16#00D1;//Durchlaufspeicher mit FFFF füllen + <>I;//Nein ! + SPB N006; - L Fifo_Ende - L SFC_DB_LENGTH - >I // Fifo-DB ist zu kurz! - JC Err0 // kein Fifo-Bereich + L #FifoLaenge;//Fifo ist voll + T DBW[ AR1, P#8.0];//1.Zusatz-Dw (Anzahl der Daten) - L DBW [AR1,] - L 16#FFEE // Fifo-Endekennung ? - <>I // Nein ! - JC Err0 // kein Fifobereich + L 2#0000_0000_0000_0011;//Daten vorhanden/kommen raus + T DBW[ AR1, P#14.0];//4.Zusatz-Dw (Status) + L #SSDW; + + 40;//Ab 20.Dw + SLW 3;//Pointer erzeugen + LAR1; ---- NW 4: Fifo-Daten löschen --- - L SSDW - + 4 // Ab 2.Dw - SLW 3 // Pointer erzeugen - LAR1 + AUF DB[ #DBFifo]; - OPN DB[DBFifo] + L #Datensatzlaenge; + L #FifoLaenge; + *I; +L500: T #Schleife; - L Datensatzlaenge - L FifoLaenge - *I - + 18 // 18 Datenwörter (wortorientiert) -L400: T Schleife + L 16#FFFF; + T DBW[ AR1, P#0.0]; - L 0 - T DBW [AR1,] + +AR1 P#2.0; - ADDAR1 P#2.0 + L #Schleife; + LOOP L500; - L Schleife - LOOP L400 +NETWORK +TITLE = Fehlerausgabe / RET_VAL +N006: SET;//VKE = 1 ohne Fehler !!! + L 2#0000_0000_0000_0000; + SPA Ok; +Err0: L 2#0000_0000_0000_0001;//Kein Fifobereich + SPA Err; +Err1: L 2#0000_0000_0000_0010;//SFC20-Aufruf mit Fehler +Err: CLR;//VKE = 0 bei Fehler !!! +Ok: T #RE_VAL; + SAVE;//VKE in BIE-Bit speichern ---- NW 5: Durchlaufspeicher ? --- - L PARA // Aufrufparameter - SRW 4 - L 16#000D // Durchlaufspeicher ? - <>I // Nein ! - JC N006 - - L SSDW - + 4 // Speichern ab 4.DW - SLW 3 // Pointer erzeugen - LAR1 - - OPN DB[DBFifo] - - L SSDW - + 40 // 1.Speicherzelle - T DBW [AR1,] // Bringzeiger - T DBW [AR1,] // Holzeiger - - L FifoLaenge // Fifo ist voll - T DBW [AR1,] // Anzahl - - L PARA // Aufrufparameter - L 16#00D1 // Durchlaufspeicher mit FFFF füllen - <>I // Nein ! - JC N006 - - L FifoLaenge // Fifo ist voll - T DBW [AR1,] // 1.Zusatz-Dw (Anzahl der Daten) - - L 2#0000_0000_0000_0011 // Daten vorhanden/kommen raus - T DBW [AR1,] // 4.Zusatz-Dw (Status) - - L SSDW - + 40 // Ab 20.Dw - SLW 3 // Pointer erzeugen - LAR1 - - OPN DB[DBFifo] - - L Datensatzlaenge - L FifoLaenge - *I -L500: T Schleife - - L 16#FFFF - T DBW [AR1,] - - ADDAR1 P#2.0 - - L Schleife - LOOP L500 - - ---- NW 6: Fehlerausgabe / RET_VAL --- -N006: SET // VKE = 1 ohne Fehler !!! - L 2#0000_0000_0000_0000 - JU Ok -Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich - JU Err -Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler - -Err: CLR // VKE = 0 bei Fehler !!! -Ok: T RE_VAL - - SAVE // VKE in BIE-Bit speichern +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Module/INT_to_BCD (4stellig).awl b/=A01+UH07-KF00/Programmbausteine/Module/INT_to_BCD (4stellig).awl index fa20b46..5fbf57b 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/INT_to_BCD (4stellig).awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/INT_to_BCD (4stellig).awl @@ -1,52 +1,62 @@ -=== FC 79: INT_to_BCD (4stellig) [STL] === -INTERFACE: - Input: - Int_Wert : Int - Output: - BCD_Wert : Word - InOut: - Temp: - Rest : Int - Ergebnis : Int - Constant: - Return: - Ret_Val : Void +FUNCTION "INT_to_BCD (4stellig)" : Void +TITLE = INT-Wert (bis 9999) in BCD-Wert (4-Stellig) wandeln +{ S7_Optimized_Access := 'FALSE' } +VERSION : 0.1 +// +// + VAR_INPUT + Int_Wert : Int; + END_VAR ---- NW 1: Rückmeldung --- - L 0 // erst mal köschen - T BCD_Wert + VAR_OUTPUT + BCD_Wert : Word; + END_VAR + + VAR_TEMP + Rest : Int; + Ergebnis : Int; + END_VAR ---- NW 2: Int-Wert ok ? --- - L Int_Wert - L 0 - I - BEC +NETWORK +TITLE = Int-Wert ok ? + L #Int_Wert; + L 0; + I; + BEB; ---- NW 3: INT-Wert wandeln --- - L Int_Wert - L 10 // Damit die linken 3 Stellen - /I - T LD0 // temporär speichen (s.o.) +NETWORK +TITLE = INT-Wert wandeln + L #Int_Wert; + L 10;//Damit die linken 3 Stellen + /I; + T %LD0;//temporär speichen (s.o.) - L Ergebnis // linken 3 Stellen - ITB // wandeln - SLW 4 // Wieder nach links schieben - T BCD_Wert // zwischen speichern + L #Ergebnis;//linken 3 Stellen + ITB;//wandeln + SLW 4;//Wieder nach links schieben + T #BCD_Wert;//zwischen speichern - L Rest // rechte Stelle - ITB // wandeln - L BCD_Wert // Zwischenergebis - OW // rechte Stelle dazu - T BCD_Wert // BDC-Ergebnis + L #Rest;//rechte Stelle + ITB;//wandeln + L #BCD_Wert;//Zwischenergebis + OW;//rechte Stelle dazu + T #BCD_Wert;//BDC-Ergebnis +NETWORK +TITLE = Ende + BE; ---- NW 4: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Module/MAntrieb_PowerSave.awl b/=A01+UH07-KF00/Programmbausteine/Module/MAntrieb_PowerSave.awl index 6845456..a7526bc 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/MAntrieb_PowerSave.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/MAntrieb_PowerSave.awl @@ -1,496 +1,519 @@ -=== FB 95: MAntrieb_PowerSave [STL] === -INTERFACE: - Input: - Automatik : Bool // Automatikbetrieb ist aktiv - Handbetrieb : Bool // Handbetrieb ist aktiv - BereichErr : Bool := 1 // Bereichsstörung -> Antrieb stoppen - Q : Bool // Eingang Motorschutz ok - Ptc : Bool // Eingang Motortemperatur ok - Fu : Bool // Eingang Frequenzumrichter ok - QKontroll : Bool // Jetzt Q-Ok-Meldung von Frequenzumrichter (nach Netz EIN) kontrollieren - FuKontroll : Bool // Jetzt Fu-Ok-Meldung von Frequenzumrichter (nach Netz EIN) kontrollieren - ErrQuit : Bool // Motorschutzstörung quittieren - Kontroll_B : Bool // Kontroll-Sensor für Bewegung - T_Nachlauf : Int := 60 // Nachlaufzeit (*1s) - Output: - Antriebrueck : Bool // Rückwärts-Ausgang des Antriebs - Antriebvor : Bool // Vorwärts-Ausgang des Antriebs - Jog1 : Bool // Frequenz 1/3 aktivieren - Jog2 : Bool // Frequenz 2/3 aktivieren - Analog : Int // Ausgangswort für Analogwandler - InOut: - QErr : Bool // Motorschutzstörung - PtcErr : Bool // Temperaturstörung - FuErr : Bool // Frequenzumrichter ist gestört - Err_Antrieb_verklemmt : Bool // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) - Static: - sJog1 : Bool // Frequenz 1/3 aktivieren - sJog2 : Bool // Frequenz 2/3 aktivieren - sAntriebrueck : Bool // Rückwärts-Ausgang des Antriebs - sAntriebvor : Bool // Vorwärts-Ausgang des Antriebs - Stat : "UAntrieb_PowerSave" // Status des Antriebs - Temp: - Antriebaktiv : Bool // Antrieb ist aktiv - Neustart : Bool // Antrieb wurde erneut gestartet - Frequenz : Real // Frequenz für FC106 - Constant: - ---- NW 1: Zeitwert laden --- - AN Automatik - ON Stat.A_start - JC Nw02 - - L T_Nachlauf // Zeitwert laden - T Stat.T_Zelle - - ---- NW 2: Zeitwert löschen --- -Nw02: AN Automatik - O Stat.A_vor - O Stat.A_rueck - O BereichErr - O QErr - O FuErr - JCN Nw03 - - L 0 // Zeitwert löschen -// // T #Stat.T_Zelle - - ---- NW 3: Motorschutzstörung / Temperaturüberwachung --- -Nw03: A ErrQuit - R QErr - AN Q - A QKontroll - S QErr - - A ErrQuit - R PtcErr - AN Ptc - S PtcErr - - ---- NW 4: Frequenzumrichterstörung --- - AN Stat.Frequenz - AN Stat.Analog - JC en05 - - A ErrQuit - ON FuKontroll - R FuErr - AN Fu - A FuKontroll - S FuErr - -en05: NOP 0 - ---- NW 5: Undefinierte Zustände / Befehle (alle Antriebe) --- - A Automatik // Automatik + Hand aktiv - A Handbetrieb - O - AN Automatik // keine Betriebsart - AN Handbetrieb - O - A Stat.A_vor // Vorwärts + Rückwärts aktiv - A Stat.A_rueck - O - A Stat.H_vor - A Stat.H_rueck - O - A BereichErr // Bereichsstörung - A Automatik // Automatik aktiv - O - AN Stat.Normal // Antrieb nicht eindeutig - AN Stat.Frequenz - AN Stat.Analog - O - A Stat.Normal - A( - O Stat.Frequenz - O Stat.Analog - ) - O - A Stat.Frequenz - A Stat.Analog - O QErr // Motorschutzstörung - O - A Automatik // Automatik aktiv - A PtcErr // Temperaturstörung - JCN en06 - -Stop: SET - R sAntriebvor - R sAntriebrueck - R Stat.T_Ausfertig - R sJog1 - R sJog2 - - L 0.0 // Zeitwert/Frequenz löschen -// // T #Stat.T_Zelle - T Frequenz // Frequenz für FC106 - - JU RET - -en06: NOP 0 - ---- NW 6: Undefinierte Zustände / Befehle (Fu-Zusatz) --- - A Stat.Frequenz - A( - AN Stat.F1 // Keine Frequenz angegeben - AN Stat.F2 - AN Stat.F3 - O - A Stat.F1 // Mehrere Frequenzen angegeben - A( - O Stat.F2 - O Stat.F3 - ) - O - A Stat.F2 // Mehrere Frequenzen angegeben - A Stat.F3 - O FuErr // Frequenzumrichterstörung - ON FuKontroll // Frequenzumrichter ist eingeschaltet - ) - JC Stop - ---- NW 7: Undefinierte Zustände / Befehle (Analog-Zusatz) --- - A Stat.Analog - A( - L Stat.F // Keine Frequenz angegeben - L 0.0 - ==R - AN Stat.F1 // Keine Frequenz angegeben - AN Stat.F2 - AN Stat.F3 - O FuErr // Frequenzumrichterstörung - ON FuKontroll // Frequenzumrichter ist eingeschaltet - ) - JC Stop - - ---- NW 8: Antrieb vorwärts starten --- - A( - A Automatik // Automatik ist aktiv - AN Stat.A_rueck - A( - L Stat.T_Zelle - L 0 // Nachlaufzeit vorhanden ? - <>I // Ja ! - AN Stat.A_PS // PowerSave-Mode: Bei Ausschaltverzögerung anhalten - O Stat.A_vor // Einschalten - ) - O - A Handbetrieb // Handbetrieb aktiv - A Stat.H_vor // Handtaste vorwärts - ) - AN Stat.Stop_vor // Stoppen - A Q // Motorschutz ok - AN QErr // Motorschutzstörung noch aktiv - = sAntriebvor - R Stat.T_Ausfertig - ---- NW 9: Antrieb rückwärts starten --- - A( - A Automatik // Automatik ist aktiv - A Stat.A_rueck // Einschalten - O - A Handbetrieb // Handbetrieb aktiv - A Stat.H_rueck // Handtaste rückwärts - ) - AN Stat.Stop_rueck // Stoppen - A Q // Motorschutz ok - AN QErr // Motorschutzstörung noch aktiv - AN sAntriebvor - = sAntriebrueck - R Stat.T_Ausfertig - ---- NW 10: Frequenz übergeben (Fu-Zusatz) --- - AN Stat.Frequenz - AN Stat.Analog - JC en11 - - A sAntriebvor - AN sAntriebrueck - O - AN sAntriebvor - A sAntriebrueck - = Antriebaktiv - - A Antriebaktiv - A( - O Stat.F1 - O Stat.F3 - ) - = sJog1 - - A Antriebaktiv - A( - O Stat.F2 - O Stat.F3 - ) - = sJog2 - - AN sJog1 // Keine Geschwindigtkeit aktiv - AN sJog2 - AN Stat.Analog // falls analoge Übergabe erfolgt - R sAntriebvor - R sAntriebrueck - -en11: NOP 0 - ---- NW 11: Frequenz übergeben (Analog-Zusatz) --- - AN Stat.Analog - JC en12 - - A sAntriebvor - AN sAntriebrueck - O - AN sAntriebvor - A sAntriebrueck - = Antriebaktiv - - L 0.0 // Falls Stop erwünscht - - AN Antriebaktiv - JC w090 - - L Stat.F -w090: T Frequenz // Frequenz für FC106 - - L 3000.0 // Maximal 3000 U/min ? - <=R // Ja ! - JC w091 - - T Frequenz // Frequenz für FC106 - -w091: L Frequenz - L 0.0 // Keine Geschwindigtkeit aktiv ? - ==R // Ja ! - AN sJog1 // Aber schon Jog-Geschwindigtkeit aktiv - AN sJog2 - R sAntriebvor - R sAntriebrueck - -en12: NOP 0 - ---- NW 12: Steuersignale zurücksetzen --- -RET: A Stat.A_vor // Übergabe an OP - = Stat.OP_A_vor - - A Stat.A_start - = Stat.OP_A_start - - A Stat.A_PS - = Stat.OP_A_PS - - A Stat.Stop_vor - = Stat.OP_Stop_vor - - A Stat.Stop_rueck - = Stat.OP_Stop_rueck - - L Stat.F - T Stat.OP_F - - A Stat.F1 - = Stat.OP_F1 - - A Stat.F2 - = Stat.OP_F2 - - A Stat.F3 - = Stat.OP_F3 - - L 0.0 - T Stat.F - - SET - R Stat.F1 - R Stat.F2 - R Stat.F3 - R Stat.Stop_vor - R Stat.Stop_rueck - R Stat.Stop_intern - R Stat.A_vor - R Stat.A_rueck - R Stat.A_start - R Stat.A_PS - R Stat.H_vor - R Stat.H_rueck - - ---- NW 13: Nachlaufzeit läuft --- - AN "1s-Impuls" // 1s-Impuls - ON sAntriebvor // Antrieb steht - JC Nw14 - - L Stat.T_Zelle - L 0 // Zeit steht ? - ==I // Ja ! - JC Nw14 - - L Stat.T_Zelle - + -1 - T Stat.T_Zelle - - L 0 // Zeit gerade abgelaufen ? - <=I // Ja ! - S Stat.T_Ausfertig - JCN Nw14 - - T Stat.T_Zelle - - ---- NW 14: Analog-Signal wandeln --- -Nw14: AN Stat.Analog - JC en14 - -CALL SYS "UNSCALE" (IN:=Frequenz, HI_LIM:=200.0, LO_LIM:=0.0, BIPOLAR:=FALSE, RET_VAL:=Stat.RET_VAL_FC106, OUT:=Analog) - - L Stat.RET_VAL_FC106 - L 0 // Fehler vorhanden ? - <>I // Ja ! - R sAntriebvor // Antrieb stoppen - R sAntriebrueck - -en14: NOP 0 - - ---- NW 15: Ausgänge an OP übergeben --- - A sAntriebvor - AN Stat.OP_Out_Mvor // beim letzten Zyklus war Motor nicht eingeschaltet - O - A sAntriebrueck - AN Stat.OP_Out_Mrueck // beim letzten Zyklus war Motor nicht eingeschaltet - = Neustart // Antrieb wurde erneut gestartet - - A sAntriebvor - = Stat.OP_Out_Mvor - - A sAntriebrueck - = Stat.OP_Out_Mrueck - - ---- NW 16: Verklemm-Kontrolle --- - AN Stat.Kontroll_B_verbaut // Parameter 4: Kontroll-Sensor für Bewegung ist eingebaut - R Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) - JC en16 - - A ErrQuit - A Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) - JC w161 - - - A Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) - R sAntriebvor // Antrieb anhalten - R sAntriebrueck - JC en16 - - AN Kontroll_B // Sensor ist nicht aktiv - JC w160 - -// Also Sensor aktiv: - L 0 // Inaktiv-Zeit nullen - T Stat.Raster_B_inaktiv - - AN sAntriebvor // Antrieb steht - AN sAntriebrueck - ON "100ms-Impuls" // 0,1s-Impuls - JC en16 - - L Stat.Raster_B_aktiv - L "MW2" // Anzahl der 100ms-Takte - +I - T Stat.Raster_B_aktiv - L 20 // 2s erreicht ? - >=I // Ja ! - S Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) - - JU en16 - -// Sensor inaktiv: -w160: L 0 // Aktiv-Zeit nullen - T Stat.Raster_B_aktiv - - AN sAntriebvor // Antrieb steht - AN sAntriebrueck - ON "100ms-Impuls" // 0,1s-Impuls - JC en16 - - L Stat.Raster_B_inaktiv - L "MW2" // Anzahl der 100ms-Takte - +I - T Stat.Raster_B_inaktiv - L 20 // 2s erreicht ? - >=I // Ja ! - S Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) - - JU en16 - -w161: L 0 - T Stat.Raster_B_aktiv // Aktiv-Zeit nullen - T Stat.Raster_B_inaktiv // Inaktiv-Zeit nullen - - SET - R Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) - -en16: NOP 0 - - ---- NW 17: Anzahl der Einschaltungen speichern --- - AN Neustart // Antrieb wurde erneut gestartet - JC en17 - - L Stat.Statistik.Einschaltungen - + DINT#1 // Anzahl der Einschaltungen +1 - T Stat.Statistik.Einschaltungen - -en17: NOP 0 - - ---- NW 18: Ausgangsvariablen schreiben --- - A sAntriebvor - = Antriebvor - - A sAntriebrueck - = Antriebrueck - - A sJog1 - = Jog1 - - A sJog2 - = Jog2 - - ---- NW 19: Gesamt-Laufzeit aufaddieren --- - AN sAntriebvor // Antrieb steht - AN sAntriebrueck - ON "1s-Impuls" // 1s-Impuls - BEC - - L Stat.Statistik.Laufzeit_s - + 1 // Laufzeit des Antriebs in Sekunden+1 - T Stat.Statistik.Laufzeit_s - L 60 // Eine Minte erreicht ? - Antrieb stoppen + Q { ExternalWritable := 'False'} : Bool; // Eingang Motorschutz ok + Ptc { ExternalWritable := 'False'} : Bool; // Eingang Motortemperatur ok + Fu { ExternalWritable := 'False'} : Bool; // Eingang Frequenzumrichter ok + QKontroll { ExternalWritable := 'False'} : Bool; // Jetzt Q-Ok-Meldung von Frequenzumrichter (nach Netz EIN) kontrollieren + FuKontroll { ExternalWritable := 'False'} : Bool; // Jetzt Fu-Ok-Meldung von Frequenzumrichter (nach Netz EIN) kontrollieren + ErrQuit { ExternalWritable := 'False'} : Bool; // Motorschutzstörung quittieren + Kontroll_B { ExternalWritable := 'False'} : Bool; // Kontroll-Sensor für Bewegung + T_Nachlauf { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 60; // Nachlaufzeit (*1s) + END_VAR + + VAR_OUTPUT + Antriebrueck { ExternalWritable := 'False'} : Bool; // Rückwärts-Ausgang des Antriebs + Antriebvor { ExternalWritable := 'False'} : Bool; // Vorwärts-Ausgang des Antriebs + Jog1 { ExternalWritable := 'False'} : Bool; // Frequenz 1/3 aktivieren + Jog2 { ExternalWritable := 'False'} : Bool; // Frequenz 2/3 aktivieren + Analog { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Ausgangswort für Analogwandler + END_VAR + + VAR_IN_OUT + QErr { ExternalWritable := 'False'} : Bool; // Motorschutzstörung + PtcErr { ExternalWritable := 'False'} : Bool; // Temperaturstörung + FuErr { ExternalWritable := 'False'} : Bool; // Frequenzumrichter ist gestört + Err_Antrieb_verklemmt { ExternalWritable := 'False'} : Bool; // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) + END_VAR + + VAR + sJog1 { ExternalWritable := 'False'} : Bool; // Frequenz 1/3 aktivieren + sJog2 { ExternalWritable := 'False'} : Bool; // Frequenz 2/3 aktivieren + sAntriebrueck { ExternalWritable := 'False'} : Bool; // Rückwärts-Ausgang des Antriebs + sAntriebvor { ExternalWritable := 'False'} : Bool; // Vorwärts-Ausgang des Antriebs + Stat { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : "UAntrieb_PowerSave"; // Status des Antriebs + END_VAR + + VAR_TEMP + Antriebaktiv : Bool; // Antrieb ist aktiv + Neustart : Bool; // Antrieb wurde erneut gestartet + Frequenz : Real; // Frequenz für FC106 + END_VAR + + +BEGIN +NETWORK +TITLE = Zeitwert laden + UN #Automatik; + ON #Stat.A_start; + SPB Nw02; + + L #T_Nachlauf ;//Zeitwert laden + T #Stat.T_Zelle; + +NETWORK +TITLE = Zeitwert löschen +Nw02: UN #Automatik; + O #Stat.A_vor; + O #Stat.A_rueck; + O #BereichErr; + O #QErr; + O #FuErr; + SPBN Nw03; + + L 0;//Zeitwert löschen +//// T #Stat.T_Zelle + +NETWORK +TITLE = Motorschutzstörung / Temperaturüberwachung +Nw03: U #ErrQuit; + R #QErr; + UN #Q; + U #QKontroll; + S #QErr; + + U #ErrQuit; + R #PtcErr; + UN #Ptc; + S #PtcErr; + +NETWORK +TITLE = Frequenzumrichterstörung + UN #Stat.Frequenz; + UN #Stat.Analog; + SPB en05; + + U #ErrQuit; + ON #FuKontroll; + R #FuErr; + UN #Fu; + U #FuKontroll; + S #FuErr; + +en05: NOP 0; +NETWORK +TITLE = Undefinierte Zustände / Befehle (alle Antriebe) + U #Automatik;//Automatik + Hand aktiv + U #Handbetrieb; + O; + UN #Automatik;//keine Betriebsart + UN #Handbetrieb; + O; + U #Stat.A_vor;//Vorwärts + Rückwärts aktiv + U #Stat.A_rueck; + O; + U #Stat.H_vor; + U #Stat.H_rueck; + O; + U #BereichErr;//Bereichsstörung + U #Automatik;//Automatik aktiv + O; + UN #Stat.Normal;//Antrieb nicht eindeutig + UN #Stat.Frequenz; + UN #Stat.Analog; + O; + U #Stat.Normal; + U(; + O #Stat.Frequenz; + O #Stat.Analog; + ); + O; + U #Stat.Frequenz; + U #Stat.Analog; + O #QErr;//Motorschutzstörung + O; + U #Automatik;//Automatik aktiv + U #PtcErr;//Temperaturstörung + SPBN en06; + +Stop: SET; + R #sAntriebvor; + R #sAntriebrueck; + R #Stat.T_Ausfertig; + R #sJog1; + R #sJog2; + + L 0.0;//Zeitwert/Frequenz löschen +//// T #Stat.T_Zelle + T #Frequenz;//Frequenz für FC106 + + SPA RET; + +en06: NOP 0; +NETWORK +TITLE = Undefinierte Zustände / Befehle (Fu-Zusatz) + U #Stat.Frequenz; + U(; + UN #Stat.F1;//Keine Frequenz angegeben + UN #Stat.F2; + UN #Stat.F3; + O; + U #Stat.F1;//Mehrere Frequenzen angegeben + U(; + O #Stat.F2; + O #Stat.F3; + ); + O; + U #Stat.F2;//Mehrere Frequenzen angegeben + U #Stat.F3; + O #FuErr;//Frequenzumrichterstörung + ON #FuKontroll;//Frequenzumrichter ist eingeschaltet + ); + SPB Stop; +NETWORK +TITLE = Undefinierte Zustände / Befehle (Analog-Zusatz) + U #Stat.Analog; + U(; + L #Stat.F;//Keine Frequenz angegeben + L 0.0; + ==R; + UN #Stat.F1;//Keine Frequenz angegeben + UN #Stat.F2; + UN #Stat.F3; + O #FuErr;//Frequenzumrichterstörung + ON #FuKontroll;//Frequenzumrichter ist eingeschaltet + ); + SPB Stop; + +NETWORK +TITLE = Antrieb vorwärts starten + U(; + U #Automatik;//Automatik ist aktiv + UN #Stat.A_rueck; + U(; + L #Stat.T_Zelle; + L 0 ;//Nachlaufzeit vorhanden ? + <>I ;//Ja ! + UN #Stat.A_PS ;//PowerSave-Mode: Bei Ausschaltverzögerung anhalten + O #Stat.A_vor ;//Einschalten + ); + O; + U #Handbetrieb;//Handbetrieb aktiv + U #Stat.H_vor;//Handtaste vorwärts + ); + UN #Stat.Stop_vor;//Stoppen + U #Q;//Motorschutz ok + UN #QErr;//Motorschutzstörung noch aktiv + = #sAntriebvor; + R #Stat.T_Ausfertig; +NETWORK +TITLE = Antrieb rückwärts starten + U(; + U #Automatik;//Automatik ist aktiv + U #Stat.A_rueck;//Einschalten + O; + U #Handbetrieb;//Handbetrieb aktiv + U #Stat.H_rueck;//Handtaste rückwärts + ); + UN #Stat.Stop_rueck;//Stoppen + U #Q;//Motorschutz ok + UN #QErr;//Motorschutzstörung noch aktiv + UN #sAntriebvor; + = #sAntriebrueck; + R #Stat.T_Ausfertig; +NETWORK +TITLE = Frequenz übergeben (Fu-Zusatz) + UN #Stat.Frequenz; + UN #Stat.Analog; + SPB en11; + + U #sAntriebvor; + UN #sAntriebrueck; + O; + UN #sAntriebvor; + U #sAntriebrueck; + = #Antriebaktiv; + + U #Antriebaktiv; + U(; + O #Stat.F1; + O #Stat.F3; + ); + = #sJog1; + + U #Antriebaktiv; + U(; + O #Stat.F2; + O #Stat.F3; + ); + = #sJog2; + + UN #sJog1;//Keine Geschwindigtkeit aktiv + UN #sJog2; + UN #Stat.Analog;//falls analoge Übergabe erfolgt + R #sAntriebvor; + R #sAntriebrueck; + +en11: NOP 0; +NETWORK +TITLE = Frequenz übergeben (Analog-Zusatz) + UN #Stat.Analog; + SPB en12; + + U #sAntriebvor; + UN #sAntriebrueck; + O; + UN #sAntriebvor; + U #sAntriebrueck; + = #Antriebaktiv; + + L 0.0;//Falls Stop erwünscht + + UN #Antriebaktiv; + SPB w090; + + L #Stat.F; +w090: T #Frequenz;//Frequenz für FC106 + + L 3000.0;//Maximal 3000 U/min ? + <=R;//Ja ! + SPB w091; + + T #Frequenz;//Frequenz für FC106 + +w091: L #Frequenz; + L 0.0;//Keine Geschwindigtkeit aktiv ? + ==R;//Ja ! + UN #sJog1;//Aber schon Jog-Geschwindigtkeit aktiv + UN #sJog2; + R #sAntriebvor; + R #sAntriebrueck; + +en12: NOP 0; +NETWORK +TITLE = Steuersignale zurücksetzen +RET: U #Stat.A_vor ;//Übergabe an OP + = #Stat.OP_A_vor; + + U #Stat.A_start; + = #Stat.OP_A_start; + + U #Stat.A_PS; + = #Stat.OP_A_PS; + + U #Stat.Stop_vor; + = #Stat.OP_Stop_vor; + + U #Stat.Stop_rueck; + = #Stat.OP_Stop_rueck; + + L #Stat.F; + T #Stat.OP_F; + + U #Stat.F1; + = #Stat.OP_F1; + + U #Stat.F2; + = #Stat.OP_F2; + + U #Stat.F3; + = #Stat.OP_F3; + + L 0.0; + T #Stat.F; + + SET; + R #Stat.F1; + R #Stat.F2; + R #Stat.F3; + R #Stat.Stop_vor; + R #Stat.Stop_rueck; + R #Stat.Stop_intern; + R #Stat.A_vor; + R #Stat.A_rueck; + R #Stat.A_start; + R #Stat.A_PS; + R #Stat.H_vor; + R #Stat.H_rueck; + +NETWORK +TITLE = Nachlaufzeit läuft + UN "1s-Impuls" ;//1s-Impuls + ON #sAntriebvor;//Antrieb steht + SPB Nw14; + + L #Stat.T_Zelle; + L 0;//Zeit steht ? + ==I;//Ja ! + SPB Nw14; + + L #Stat.T_Zelle; + + -1; + T #Stat.T_Zelle; + + L 0 ;//Zeit gerade abgelaufen ? + <=I;//Ja ! + S #Stat.T_Ausfertig; + SPBN Nw14; + + T #Stat.T_Zelle; + +NETWORK +TITLE = Analog-Signal wandeln +Nw14: UN #Stat.Analog; + SPB en14; + + CALL UNSCALE + ( IN := #Frequenz , + HI_LIM := 200.0 , + LO_LIM := 0.0 , + BIPOLAR := FALSE , + RET_VAL := #Stat.RET_VAL_FC106 , + OUT := #Analog + ); + + L #Stat.RET_VAL_FC106; + L 0;//Fehler vorhanden ? + <>I;//Ja ! + R #sAntriebvor;//Antrieb stoppen + R #sAntriebrueck; + +en14: NOP 0; + +NETWORK +TITLE = Ausgänge an OP übergeben + U #sAntriebvor; + UN #Stat.OP_Out_Mvor;//beim letzten Zyklus war Motor nicht eingeschaltet + O; + U #sAntriebrueck; + UN #Stat.OP_Out_Mrueck;//beim letzten Zyklus war Motor nicht eingeschaltet + = #Neustart;//Antrieb wurde erneut gestartet + + U #sAntriebvor; + = #Stat.OP_Out_Mvor; + + U #sAntriebrueck; + = #Stat.OP_Out_Mrueck; + +NETWORK +TITLE = Verklemm-Kontrolle + UN #Stat.Kontroll_B_verbaut;//Parameter 4: Kontroll-Sensor für Bewegung ist eingebaut + R #Err_Antrieb_verklemmt;//Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) + SPB en16; + + U #ErrQuit; + U #Err_Antrieb_verklemmt;//Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) + SPB w161; + + + U #Err_Antrieb_verklemmt;//Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) + R #sAntriebvor;//Antrieb anhalten + R #sAntriebrueck; + SPB en16; + + UN #Kontroll_B;//Sensor ist nicht aktiv + SPB w160; + +//Also Sensor aktiv: + L 0;//Inaktiv-Zeit nullen + T #Stat.Raster_B_inaktiv; + + UN #sAntriebvor;//Antrieb steht + UN #sAntriebrueck; + ON "100ms-Impuls";//0,1s-Impuls + SPB en16; + + L #Stat.Raster_B_aktiv; + L "MW2";//Anzahl der 100ms-Takte + +I; + T #Stat.Raster_B_aktiv; + L 20;//2s erreicht ? + >=I;//Ja ! + S #Err_Antrieb_verklemmt;//Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) + + SPA en16; + +//Sensor inaktiv: +w160: L 0;//Aktiv-Zeit nullen + T #Stat.Raster_B_aktiv; + + UN #sAntriebvor;//Antrieb steht + UN #sAntriebrueck; + ON "100ms-Impuls";//0,1s-Impuls + SPB en16; + + L #Stat.Raster_B_inaktiv; + L "MW2";//Anzahl der 100ms-Takte + +I; + T #Stat.Raster_B_inaktiv; + L 20;//2s erreicht ? + >=I;//Ja ! + S #Err_Antrieb_verklemmt;//Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) + + SPA en16; + +w161: L 0; + T #Stat.Raster_B_aktiv;//Aktiv-Zeit nullen + T #Stat.Raster_B_inaktiv;//Inaktiv-Zeit nullen + + SET; + R #Err_Antrieb_verklemmt;//Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) + +en16: NOP 0; + +NETWORK +TITLE = Anzahl der Einschaltungen speichern + UN #Neustart;//Antrieb wurde erneut gestartet + SPB en17; + + L #Stat.Statistik.Einschaltungen; + + DINT#1;//Anzahl der Einschaltungen +1 + T #Stat.Statistik.Einschaltungen; + +en17: NOP 0; + +NETWORK +TITLE = Ausgangsvariablen schreiben + U #sAntriebvor; + = #Antriebvor; + + U #sAntriebrueck; + = #Antriebrueck; + + U #sJog1; + = #Jog1; + + U #sJog2; + = #Jog2; + +NETWORK +TITLE = Gesamt-Laufzeit aufaddieren + UN #sAntriebvor;//Antrieb steht + UN #sAntriebrueck; + ON "1s-Impuls";//1s-Impuls + BEB; + + L #Stat.Statistik.Laufzeit_s; + + 1;//Laufzeit des Antriebs in Sekunden+1 + T #Stat.Statistik.Laufzeit_s; + L 60;//Eine Minte erreicht ? + Antrieb stoppen - Q : Bool // Eingang Motorschutz ok - Ptc : Bool // Eingang Motortemperatur ok - Fu : Bool // Eingang Frequenzumrichter ok - QKontroll : Bool // Jetzt Q-Ok-Meldung von Frequenzumrichter (nach Netz EIN) kontrollieren - FuKontroll : Bool // Jetzt Fu-Ok-Meldung von Frequenzumrichter (nach Netz EIN) kontrollieren - ErrQuit : Bool // Motorschutzstörung quittieren - Kontroll_B : Bool // Kontroll-Sensor für Bewegung - Output: - Antriebrueck : Bool // Rückwärts-Ausgang des Antriebs - Antriebvor : Bool // Vorwärts-Ausgang des Antriebs - Jog1 : Bool // Frequenz 1/3 aktivieren - Jog2 : Bool // Frequenz 2/3 aktivieren - Analog : Int // Ausgangswort für Analogwandler - InOut: - QErr : Bool // Motorschutzstörung - PtcErr : Bool // Temperaturstörung - FuErr : Bool // Frequenzumrichter ist gestört - Err_Antrieb_verklemmt : Bool // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) - hStOk : Bool // Anzeige Start n. Störung aktivieren - Static: - sJog1 : Bool // Frequenz 1/3 aktivieren - sJog2 : Bool // Frequenz 2/3 aktivieren - sAntriebrueck : Bool // Rückwärts-Ausgang des Antriebs - sAntriebvor : Bool // Vorwärts-Ausgang des Antriebs - Stat : "UAntrieb_all" // Status des Antriebs - Temp: - Antriebaktiv : Bool // Antrieb ist aktiv - Neustart : Bool // Antrieb wurde erneut gestartet - Frequenz : Real // Frequenz für FC106 - Constant: - ---- NW 1: Zeitwert laden --- - AN Automatik - ON Stat.A_start - JC Nw02 - - L Stat.T_Nachlauf // Zeitwert laden - T Stat.T_Zelle - - ---- NW 2: Zeitwert löschen --- -Nw02: AN Automatik - O Stat.A_vor - O Stat.A_rueck - O BereichErr - O QErr - O FuErr - JCN Nw03 - - L 0 // Zeitwert löschen -// // T #Stat.T_Zelle - - ---- NW 3: Motorschutzstörung / Temperaturüberwachung --- -Nw03: A ErrQuit - R QErr - AN Q - A QKontroll - S QErr - - A ErrQuit - R PtcErr - AN Ptc - S PtcErr - -// Störung ist quittierbar: - A Q - A QErr - O - A Ptc - A PtcErr - S hStOk - - ---- NW 4: Frequenzumrichterstörung --- - AN Stat.Frequenz - AN Stat.Analog - JC en05 - - A ErrQuit - ON FuKontroll - R FuErr - AN Fu - A FuKontroll - S FuErr - -en05: NOP 0 - ---- NW 5: Undefinierte Zustände / Befehle (alle Antriebe) --- - A Automatik // Automatik + Hand aktiv - A Handbetrieb - O - AN Automatik // keine Betriebsart - AN Handbetrieb - O - A Stat.A_vor // Vorwärts + Rückwärts aktiv - A Stat.A_rueck - O - A Stat.H_vor - A Stat.H_rueck - O - A BereichErr // Bereichsstörung - A Automatik // Automatik aktiv - O - AN Stat.Normal // Antrieb nicht eindeutig - AN Stat.Frequenz - AN Stat.Analog - O - A Stat.Normal - A( - O Stat.Frequenz - O Stat.Analog - ) - O - A Stat.Frequenz - A Stat.Analog - O QErr // Motorschutzstörung - O - A Automatik // Automatik aktiv - A PtcErr // Temperaturstörung - JCN en06 - -Stop: SET - R sAntriebvor - R sAntriebrueck - R Stat.T_Ausfertig - R sJog1 - R sJog2 - - L 0.0 // Zeitwert/Frequenz löschen -// // T #Stat.T_Zelle - T Frequenz // Frequenz für FC106 - - JU RET - -en06: NOP 0 - ---- NW 6: Undefinierte Zustände / Befehle (Fu-Zusatz) --- - A Stat.Frequenz - A( - AN Stat.F1 // Keine Frequenz angegeben - AN Stat.F2 - AN Stat.F3 - O - A Stat.F1 // Mehrere Frequenzen angegeben - A( - O Stat.F2 - O Stat.F3 - ) - O - A Stat.F2 // Mehrere Frequenzen angegeben - A Stat.F3 - O FuErr // Frequenzumrichterstörung - ON FuKontroll // Frequenzumrichter ist eingeschaltet - ) - JC Stop - ---- NW 7: Undefinierte Zustände / Befehle (Analog-Zusatz) --- - A Stat.Analog - A( - L Stat.F // Keine Frequenz angegeben - L 0.0 - ==R - AN Stat.F1 // Keine Frequenz angegeben - AN Stat.F2 - AN Stat.F3 - O FuErr // Frequenzumrichterstörung - ON FuKontroll // Frequenzumrichter ist eingeschaltet - ) - JC Stop - - ---- NW 8: Antrieb vorwärts starten --- - A( - A Automatik // Automatik ist aktiv - AN Stat.A_rueck - A( - L Stat.T_Zelle - L 0 // Nachlaufzeit vorhanden ? - <>I // Ja ! - O Stat.A_start - O Stat.A_vor // Einschalten - ) - O - A Handbetrieb // Handbetrieb aktiv - A Stat.H_vor // Handtaste vorwärts - ) - AN Stat.Stop_vor // Stoppen - A Q // Motorschutz ok - AN QErr // Motorschutzstörung noch aktiv - = sAntriebvor - R Stat.T_Ausfertig - ---- NW 9: Antrieb rückwärts starten --- - A( - A Automatik // Automatik ist aktiv - A Stat.A_rueck // Einschalten - O - A Handbetrieb // Handbetrieb aktiv - A Stat.H_rueck // Handtaste rückwärts - ) - AN Stat.Stop_rueck // Stoppen - A Q // Motorschutz ok - AN QErr // Motorschutzstörung noch aktiv - AN sAntriebvor - = sAntriebrueck - R Stat.T_Ausfertig - ---- NW 10: Frequenz übergeben (Fu-Zusatz) --- - AN Stat.Frequenz - AN Stat.Analog - JC en11 - - A sAntriebvor - AN sAntriebrueck - O - AN sAntriebvor - A sAntriebrueck - = Antriebaktiv - - A Antriebaktiv - A( - O Stat.F1 - O Stat.F3 - ) - = sJog1 - - A Antriebaktiv - A( - O Stat.F2 - O Stat.F3 - ) - = sJog2 - - AN sJog1 // Keine Geschwindigtkeit aktiv - AN sJog2 - AN Stat.Analog // falls analoge Übergabe erfolgt - R sAntriebvor - R sAntriebrueck - -en11: NOP 0 - ---- NW 11: Frequenz übergeben (Analog-Zusatz) --- - AN Stat.Analog - JC en12 - - A sAntriebvor - AN sAntriebrueck - O - AN sAntriebvor - A sAntriebrueck - = Antriebaktiv - - L 0.0 // Falls Stop erwünscht - - AN Antriebaktiv - JC w090 - - L Stat.F -w090: T Frequenz // Frequenz für FC106 - - L 3000.0 // Maximal 3000 U/min ? - <=R // Ja ! - JC w091 - - T Frequenz // Frequenz für FC106 - -w091: L Frequenz - L 0.0 // Keine Geschwindigtkeit aktiv ? - ==R // Ja ! - AN sJog1 // Aber schon Jog-Geschwindigtkeit aktiv - AN sJog2 - R sAntriebvor - R sAntriebrueck - -en12: NOP 0 - ---- NW 12: Steuersignale zurücksetzen --- -RET: A Stat.Stop_vor // Übergabe an OP - = Stat.OP_Stop_vor - - A Stat.Stop_rueck - = Stat.OP_Stop_rueck - - L Stat.F - T Stat.OP_F - - A Stat.F1 - = Stat.OP_F1 - - A Stat.F2 - = Stat.OP_F2 - - A Stat.F3 - = Stat.OP_F3 - - - L 0.0 - T Stat.F - - SET - R Stat.F1 - R Stat.F2 - R Stat.F3 - R Stat.Stop_vor - R Stat.Stop_rueck - R Stat.Stop_intern - R Stat.A_vor - R Stat.A_rueck - R Stat.A_start - R Stat.H_vor - R Stat.H_rueck - - ---- NW 13: Nachlaufzeit läuft --- - AN "100ms-Impuls" // 0,1s-Impuls - ON sAntriebvor // Antrieb steht - JC Nw14 - - L Stat.T_Zelle - L 0 // Zeit steht ? - ==I // Ja ! - JC Nw14 - - L Stat.T_Zelle - L "MW2" // minus 0,1-Takte - -I - T Stat.T_Zelle - - L 0.0 // Zeit gerade abgelaufen ? - <=I // Ja ! - S Stat.T_Ausfertig - JCN Nw14 - - T Stat.T_Zelle - - ---- NW 14: Analog-Signal wandeln --- -Nw14: AN Stat.Analog - JC en14 - -CALL SYS "UNSCALE" (IN:=Frequenz, HI_LIM:=200.0, LO_LIM:=0.0, BIPOLAR:=FALSE, RET_VAL:=Stat.RET_VAL_FC106, OUT:=Analog) - - L Stat.RET_VAL_FC106 - L 0 // Fehler vorhanden ? - <>I // Ja ! - R sAntriebvor // Antrieb stoppen - R sAntriebrueck - -en14: NOP 0 - - ---- NW 15: Ausgänge an OP übergeben --- - A sAntriebvor - AN Stat.OP_Out_Mvor // beim letzten Zyklus war Motor nicht eingeschaltet - O - A sAntriebrueck - AN Stat.OP_Out_Mrueck // beim letzten Zyklus war Motor nicht eingeschaltet - = Neustart // Antrieb wurde erneut gestartet - - A sAntriebvor - = Stat.OP_Out_Mvor - - A sAntriebrueck - = Stat.OP_Out_Mrueck - - ---- NW 16: Verklemm-Kontrolle --- - AN Stat.Kontroll_B_verbaut // Parameter 4: Kontroll-Sensor für Bewegung ist eingebaut - R Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) - JC en16 - - A ErrQuit - A Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) - JC w161 - - - A Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) - R sAntriebvor // Antrieb anhalten - R sAntriebrueck - JC en16 - - AN Kontroll_B // Sensor ist nicht aktiv - JC w160 - -// Also Sensor aktiv: - L 0 // Inaktiv-Zeit nullen - T Stat.Raster_B_inaktiv - - AN sAntriebvor // Antrieb steht - AN sAntriebrueck - ON "100ms-Impuls" // 0,1s-Impuls - JC en16 - - L Stat.Raster_B_aktiv - L "MW2" // Anzahl der 100ms-Takte - +I - T Stat.Raster_B_aktiv - L 20 // 2s erreicht ? - >=I // Ja ! - S Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) - - JU en16 - -// Sensor inaktiv: -w160: L 0 // Aktiv-Zeit nullen - T Stat.Raster_B_aktiv - - AN sAntriebvor // Antrieb steht - AN sAntriebrueck - ON "100ms-Impuls" // 0,1s-Impuls - JC en16 - - L Stat.Raster_B_inaktiv - L "MW2" // Anzahl der 100ms-Takte - +I - T Stat.Raster_B_inaktiv - L 20 // 2s erreicht ? - >=I // Ja ! - S Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) - - JU en16 - -w161: L 0 - T Stat.Raster_B_aktiv // Aktiv-Zeit nullen - T Stat.Raster_B_inaktiv // Inaktiv-Zeit nullen - - SET - R Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) - -en16: NOP 0 - - ---- NW 17: Anzahl der Einschaltungen speichern --- - AN Neustart // Antrieb wurde erneut gestartet - JC en17 - - L Stat.Statistik.Einschaltungen - + DINT#1 // Anzahl der Einschaltungen +1 - T Stat.Statistik.Einschaltungen - -en17: NOP 0 - - ---- NW 18: Ausgangsvariablen schreiben --- - A sAntriebvor - = Antriebvor - - A sAntriebrueck - = Antriebrueck - - A sJog1 - = Jog1 - - A sJog2 - = Jog2 - - ---- NW 19: Gesamt-Laufzeit aufaddieren --- - AN sAntriebvor // Antrieb steht - AN sAntriebrueck - ON "1s-Impuls" // 1s-Impuls - BEC - - L Stat.Statistik.Laufzeit_s - + 1 // Laufzeit des Antriebs in Sekunden+1 - T Stat.Statistik.Laufzeit_s - L 60 // Eine Minte erreicht ? - Antrieb stoppen + Q { ExternalWritable := 'False'} : Bool; // Eingang Motorschutz ok + Ptc { ExternalWritable := 'False'} : Bool; // Eingang Motortemperatur ok + Fu { ExternalWritable := 'False'} : Bool; // Eingang Frequenzumrichter ok + QKontroll { ExternalWritable := 'False'} : Bool; // Jetzt Q-Ok-Meldung von Frequenzumrichter (nach Netz EIN) kontrollieren + FuKontroll { ExternalWritable := 'False'} : Bool; // Jetzt Fu-Ok-Meldung von Frequenzumrichter (nach Netz EIN) kontrollieren + ErrQuit { ExternalWritable := 'False'} : Bool; // Motorschutzstörung quittieren + Kontroll_B { ExternalWritable := 'False'} : Bool; // Kontroll-Sensor für Bewegung + END_VAR + + VAR_OUTPUT + Antriebrueck { ExternalWritable := 'False'} : Bool; // Rückwärts-Ausgang des Antriebs + Antriebvor { ExternalWritable := 'False'} : Bool; // Vorwärts-Ausgang des Antriebs + Jog1 { ExternalWritable := 'False'} : Bool; // Frequenz 1/3 aktivieren + Jog2 { ExternalWritable := 'False'} : Bool; // Frequenz 2/3 aktivieren + Analog { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Ausgangswort für Analogwandler + END_VAR + + VAR_IN_OUT + QErr { ExternalWritable := 'False'} : Bool; // Motorschutzstörung + PtcErr { ExternalWritable := 'False'} : Bool; // Temperaturstörung + FuErr { ExternalWritable := 'False'} : Bool; // Frequenzumrichter ist gestört + Err_Antrieb_verklemmt { ExternalWritable := 'False'} : Bool; // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) + hStOk : Bool; // Anzeige Start n. Störung aktivieren + END_VAR + + VAR + sJog1 { ExternalWritable := 'False'} : Bool; // Frequenz 1/3 aktivieren + sJog2 { ExternalWritable := 'False'} : Bool; // Frequenz 2/3 aktivieren + sAntriebrueck { ExternalWritable := 'False'} : Bool; // Rückwärts-Ausgang des Antriebs + sAntriebvor { ExternalWritable := 'False'} : Bool; // Vorwärts-Ausgang des Antriebs + Stat { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : "UAntrieb_all"; // Status des Antriebs + END_VAR + + VAR_TEMP + Antriebaktiv : Bool; // Antrieb ist aktiv + Neustart : Bool; // Antrieb wurde erneut gestartet + Frequenz : Real; // Frequenz für FC106 + END_VAR + + +BEGIN +NETWORK +TITLE = Zeitwert laden + UN #Automatik; + ON #Stat.A_start; + SPB Nw02; + + L #Stat.T_Nachlauf;//Zeitwert laden + T #Stat.T_Zelle; + +NETWORK +TITLE = Zeitwert löschen +Nw02: UN #Automatik; + O #Stat.A_vor; + O #Stat.A_rueck; + O #BereichErr; + O #QErr; + O #FuErr; + SPBN Nw03; + + L 0;//Zeitwert löschen +//// T #Stat.T_Zelle + +NETWORK +TITLE = Motorschutzstörung / Temperaturüberwachung +Nw03: U #ErrQuit; + R #QErr; + UN #Q; + U #QKontroll; + S #QErr; + + U #ErrQuit; + R #PtcErr; + UN #Ptc; + S #PtcErr; + +//Störung ist quittierbar: + U #Q; + U #QErr; + O; + U #Ptc; + U #PtcErr; + S #hStOk; + +NETWORK +TITLE = Frequenzumrichterstörung + UN #Stat.Frequenz; + UN #Stat.Analog; + SPB en05; + + U #ErrQuit; + ON #FuKontroll; + R #FuErr; + UN #Fu; + U #FuKontroll; + S #FuErr; + +en05: NOP 0; +NETWORK +TITLE = Undefinierte Zustände / Befehle (alle Antriebe) + U #Automatik;//Automatik + Hand aktiv + U #Handbetrieb; + O; + UN #Automatik;//keine Betriebsart + UN #Handbetrieb; + O; + U #Stat.A_vor;//Vorwärts + Rückwärts aktiv + U #Stat.A_rueck; + O; + U #Stat.H_vor; + U #Stat.H_rueck; + O; + U #BereichErr;//Bereichsstörung + U #Automatik;//Automatik aktiv + O; + UN #Stat.Normal;//Antrieb nicht eindeutig + UN #Stat.Frequenz; + UN #Stat.Analog; + O; + U #Stat.Normal; + U(; + O #Stat.Frequenz; + O #Stat.Analog; + ); + O; + U #Stat.Frequenz; + U #Stat.Analog; + O #QErr;//Motorschutzstörung + O; + U #Automatik;//Automatik aktiv + U #PtcErr;//Temperaturstörung + SPBN en06; + +Stop: SET; + R #sAntriebvor; + R #sAntriebrueck; + R #Stat.T_Ausfertig; + R #sJog1; + R #sJog2; + + L 0.0;//Zeitwert/Frequenz löschen +//// T #Stat.T_Zelle + T #Frequenz;//Frequenz für FC106 + + SPA RET; + +en06: NOP 0; +NETWORK +TITLE = Undefinierte Zustände / Befehle (Fu-Zusatz) + U #Stat.Frequenz; + U(; + UN #Stat.F1;//Keine Frequenz angegeben + UN #Stat.F2; + UN #Stat.F3; + O; + U #Stat.F1;//Mehrere Frequenzen angegeben + U(; + O #Stat.F2; + O #Stat.F3; + ); + O; + U #Stat.F2;//Mehrere Frequenzen angegeben + U #Stat.F3; + O #FuErr;//Frequenzumrichterstörung + ON #FuKontroll;//Frequenzumrichter ist eingeschaltet + ); + SPB Stop; +NETWORK +TITLE = Undefinierte Zustände / Befehle (Analog-Zusatz) + U #Stat.Analog; + U(; + L #Stat.F;//Keine Frequenz angegeben + L 0.0; + ==R; + UN #Stat.F1;//Keine Frequenz angegeben + UN #Stat.F2; + UN #Stat.F3; + O #FuErr;//Frequenzumrichterstörung + ON #FuKontroll;//Frequenzumrichter ist eingeschaltet + ); + SPB Stop; + +NETWORK +TITLE = Antrieb vorwärts starten + U(; + U #Automatik;//Automatik ist aktiv + UN #Stat.A_rueck; + U(; + L #Stat.T_Zelle; + L 0 ;//Nachlaufzeit vorhanden ? + <>I ;//Ja ! + O #Stat.A_start; + O #Stat.A_vor;//Einschalten + ); + O; + U #Handbetrieb;//Handbetrieb aktiv + U #Stat.H_vor;//Handtaste vorwärts + ); + UN #Stat.Stop_vor;//Stoppen + U #Q;//Motorschutz ok + UN #QErr;//Motorschutzstörung noch aktiv + = #sAntriebvor; + R #Stat.T_Ausfertig; +NETWORK +TITLE = Antrieb rückwärts starten + U(; + U #Automatik;//Automatik ist aktiv + U #Stat.A_rueck;//Einschalten + O; + U #Handbetrieb;//Handbetrieb aktiv + U #Stat.H_rueck;//Handtaste rückwärts + ); + UN #Stat.Stop_rueck;//Stoppen + U #Q;//Motorschutz ok + UN #QErr;//Motorschutzstörung noch aktiv + UN #sAntriebvor; + = #sAntriebrueck; + R #Stat.T_Ausfertig; +NETWORK +TITLE = Frequenz übergeben (Fu-Zusatz) + UN #Stat.Frequenz; + UN #Stat.Analog; + SPB en11; + + U #sAntriebvor; + UN #sAntriebrueck; + O; + UN #sAntriebvor; + U #sAntriebrueck; + = #Antriebaktiv; + + U #Antriebaktiv; + U(; + O #Stat.F1; + O #Stat.F3; + ); + = #sJog1; + + U #Antriebaktiv; + U(; + O #Stat.F2; + O #Stat.F3; + ); + = #sJog2; + + UN #sJog1;//Keine Geschwindigtkeit aktiv + UN #sJog2; + UN #Stat.Analog;//falls analoge Übergabe erfolgt + R #sAntriebvor; + R #sAntriebrueck; + +en11: NOP 0; +NETWORK +TITLE = Frequenz übergeben (Analog-Zusatz) + UN #Stat.Analog; + SPB en12; + + U #sAntriebvor; + UN #sAntriebrueck; + O; + UN #sAntriebvor; + U #sAntriebrueck; + = #Antriebaktiv; + + L 0.0;//Falls Stop erwünscht + + UN #Antriebaktiv; + SPB w090; + + L #Stat.F; +w090: T #Frequenz;//Frequenz für FC106 + + L 3000.0;//Maximal 3000 U/min ? + <=R;//Ja ! + SPB w091; + + T #Frequenz;//Frequenz für FC106 + +w091: L #Frequenz; + L 0.0;//Keine Geschwindigtkeit aktiv ? + ==R;//Ja ! + UN #sJog1;//Aber schon Jog-Geschwindigtkeit aktiv + UN #sJog2; + R #sAntriebvor; + R #sAntriebrueck; + +en12: NOP 0; +NETWORK +TITLE = Steuersignale zurücksetzen +RET: U #Stat.Stop_vor;//Übergabe an OP + = #Stat.OP_Stop_vor; + + U #Stat.Stop_rueck; + = #Stat.OP_Stop_rueck; + + L #Stat.F; + T #Stat.OP_F; + + U #Stat.F1; + = #Stat.OP_F1; + + U #Stat.F2; + = #Stat.OP_F2; + + U #Stat.F3; + = #Stat.OP_F3; + + + L 0.0; + T #Stat.F; + + SET; + R #Stat.F1; + R #Stat.F2; + R #Stat.F3; + R #Stat.Stop_vor; + R #Stat.Stop_rueck; + R #Stat.Stop_intern; + R #Stat.A_vor; + R #Stat.A_rueck; + R #Stat.A_start; + R #Stat.H_vor; + R #Stat.H_rueck; + +NETWORK +TITLE = Nachlaufzeit läuft + UN "100ms-Impuls";//0,1s-Impuls + ON #sAntriebvor;//Antrieb steht + SPB Nw14; + + L #Stat.T_Zelle; + L 0;//Zeit steht ? + ==I;//Ja ! + SPB Nw14; + + L #Stat.T_Zelle; + L "MW2";//minus 0,1-Takte + -I; + T #Stat.T_Zelle; + + L 0.0;//Zeit gerade abgelaufen ? + <=I;//Ja ! + S #Stat.T_Ausfertig; + SPBN Nw14; + + T #Stat.T_Zelle; + +NETWORK +TITLE = Analog-Signal wandeln +Nw14: UN #Stat.Analog; + SPB en14; + + CALL UNSCALE + ( IN := #Frequenz , + HI_LIM := 200.0 , + LO_LIM := 0.0 , + BIPOLAR := FALSE , + RET_VAL := #Stat.RET_VAL_FC106 , + OUT := #Analog + ); + + L #Stat.RET_VAL_FC106; + L 0;//Fehler vorhanden ? + <>I;//Ja ! + R #sAntriebvor;//Antrieb stoppen + R #sAntriebrueck; + +en14: NOP 0; + +NETWORK +TITLE = Ausgänge an OP übergeben + U #sAntriebvor; + UN #Stat.OP_Out_Mvor;//beim letzten Zyklus war Motor nicht eingeschaltet + O; + U #sAntriebrueck; + UN #Stat.OP_Out_Mrueck;//beim letzten Zyklus war Motor nicht eingeschaltet + = #Neustart;//Antrieb wurde erneut gestartet + + U #sAntriebvor; + = #Stat.OP_Out_Mvor; + + U #sAntriebrueck; + = #Stat.OP_Out_Mrueck; + +NETWORK +TITLE = Verklemm-Kontrolle + UN #Stat.Kontroll_B_verbaut;//Parameter 4: Kontroll-Sensor für Bewegung ist eingebaut + R #Err_Antrieb_verklemmt;//Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) + SPB en16; + + U #ErrQuit; + U #Err_Antrieb_verklemmt;//Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) + SPB w161; + + + U #Err_Antrieb_verklemmt;//Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) + R #sAntriebvor;//Antrieb anhalten + R #sAntriebrueck; + SPB en16; + + UN #Kontroll_B;//Sensor ist nicht aktiv + SPB w160; + +//Also Sensor aktiv: + L 0;//Inaktiv-Zeit nullen + T #Stat.Raster_B_inaktiv; + + UN #sAntriebvor;//Antrieb steht + UN #sAntriebrueck; + ON "100ms-Impuls";//0,1s-Impuls + SPB en16; + + L #Stat.Raster_B_aktiv; + L "MW2";//Anzahl der 100ms-Takte + +I; + T #Stat.Raster_B_aktiv; + L 20;//2s erreicht ? + >=I;//Ja ! + S #Err_Antrieb_verklemmt;//Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) + + SPA en16; + +//Sensor inaktiv: +w160: L 0;//Aktiv-Zeit nullen + T #Stat.Raster_B_aktiv; + + UN #sAntriebvor;//Antrieb steht + UN #sAntriebrueck; + ON "100ms-Impuls";//0,1s-Impuls + SPB en16; + + L #Stat.Raster_B_inaktiv; + L "MW2";//Anzahl der 100ms-Takte + +I; + T #Stat.Raster_B_inaktiv; + L 20;//2s erreicht ? + >=I;//Ja ! + S #Err_Antrieb_verklemmt;//Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) + + SPA en16; + +w161: L 0; + T #Stat.Raster_B_aktiv;//Aktiv-Zeit nullen + T #Stat.Raster_B_inaktiv;//Inaktiv-Zeit nullen + + SET; + R #Err_Antrieb_verklemmt;//Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv) + +en16: NOP 0; + +NETWORK +TITLE = Anzahl der Einschaltungen speichern + UN #Neustart;//Antrieb wurde erneut gestartet + SPB en17; + + L #Stat.Statistik.Einschaltungen; + + DINT#1;//Anzahl der Einschaltungen +1 + T #Stat.Statistik.Einschaltungen; + +en17: NOP 0; + +NETWORK +TITLE = Ausgangsvariablen schreiben + U #sAntriebvor; + = #Antriebvor; + + U #sAntriebrueck; + = #Antriebrueck; + + U #sJog1; + = #Jog1; + + U #sJog2; + = #Jog2; + +NETWORK +TITLE = Gesamt-Laufzeit aufaddieren + UN #sAntriebvor;//Antrieb steht + UN #sAntriebrueck; + ON "1s-Impuls";//1s-Impuls + BEB; + + L #Stat.Statistik.Laufzeit_s; + + 1;//Laufzeit des Antriebs in Sekunden+1 + T #Stat.Statistik.Laufzeit_s; + L 60;//Eine Minte erreicht ? + Aktivzeit speichern --- - L 25 - A Kommt_25 - JC Save - L 24 - A Kommt_24 - JC Save - L 23 - A Kommt_23 - JC Save - L 22 - A Kommt_22 - JC Save - L 21 - A Kommt_21 - JC Save - L 20 - A Kommt_20 - JC Save - L 19 - A Kommt_19 - JC Save - L 18 - A Kommt_18 - JC Save - L 17 - A Kommt_17 - JC Save - L 16 - A Kommt_16 - JC Save - L 15 - A Kommt_15 - JC Save - L 14 - A Kommt_14 - JC Save - L 13 - A Kommt_13 - JC Save - L 12 - A Kommt_12 - JC Save - L 11 - A Kommt_11 - JC Save - L 10 - A Kommt_10 - JC Save - L 9 - A Kommt_9 - JC Save - L 8 - A Kommt_8 - JC Save - L 7 - A Kommt_7 - JC Save - L 6 - A Kommt_6 - JC Save - L 5 - A Kommt_5 - JC Save - L 4 - A Kommt_4 - JC Save - L 3 - A Kommt_3 - JC Save - L 2 - A Kommt_2 - JC Save - L 1 - A Kommt_1 - JC Save +NETWORK +TITLE = Aus-/vorbeifahrendes BM -> Aktivzeit speichern + L 25; + U #Kommt_25; + SPB Save; + L 24; + U #Kommt_24; + SPB Save; + L 23; + U #Kommt_23; + SPB Save; + L 22; + U #Kommt_22; + SPB Save; + L 21; + U #Kommt_21; + SPB Save; + L 20; + U #Kommt_20; + SPB Save; + L 19; + U #Kommt_19; + SPB Save; + L 18; + U #Kommt_18; + SPB Save; + L 17; + U #Kommt_17; + SPB Save; + L 16; + U #Kommt_16; + SPB Save; + L 15; + U #Kommt_15; + SPB Save; + L 14; + U #Kommt_14; + SPB Save; + L 13; + U #Kommt_13; + SPB Save; + L 12; + U #Kommt_12; + SPB Save; + L 11; + U #Kommt_11; + SPB Save; + L 10; + U #Kommt_10; + SPB Save; + L 9; + U #Kommt_9; + SPB Save; + L 8; + U #Kommt_8; + SPB Save; + L 7; + U #Kommt_7; + SPB Save; + L 6; + U #Kommt_6; + SPB Save; + L 5; + U #Kommt_5; + SPB Save; + L 4; + U #Kommt_4; + SPB Save; + L 3; + U #Kommt_3; + SPB Save; + L 2; + U #Kommt_2; + SPB Save; + L 1; + U #Kommt_1; + SPB Save; - JU Zeit + SPA Zeit; -Save: T Dyn.Aktiv_Line // Aktive Linie speichern +Save: T #Dyn.Aktiv_Line;//Aktive Linie speichern - L Para.Abstand_Lines - *I - L Para.Sicherheit - +I // RestZeit ermitteln - L Dyn.RestZeit // Neuer Wert größer? - >=I // Ja ! - JC Ok + L #Para.Abstand_Lines; + *I; + L #Para.Sicherheit; + +I;//RestZeit ermitteln + L #Dyn.RestZeit;//Neuer Wert größer? + >=I;//Ja ! + SPB Ok; -// Ausgefahrene Stelle ist kleiner: - L 0 // Löschen - T Dyn.Aktiv_Line // Aktive Linie - T Dyn.Nachtrigger_Freigabe // Nachtriggern der Freigabe der ausfahrenden Linie +//Ausgefahrene Stelle ist kleiner: + L 0;//Löschen + T #Dyn.Aktiv_Line;//Aktive Linie + T #Dyn.Nachtrigger_Freigabe;//Nachtriggern der Freigabe der ausfahrenden Linie - BEU + BEA; -Ok: CAC // Neuen Wert übernehmen - T Dyn.RestZeit // Wert speichern +Ok: TAK;//Neuen Wert übernehmen + T #Dyn.RestZeit;//Wert speichern -// Freigabe aus aktiver Linie verlängern aktivieren: - L Para.Sicherheit - L Para.Abstand_Lines - +I - L 10 - /I - L 2 // /Nach 2 Sekunden - T Dyn.Nachtrigger_Freigabe // Nachtriggern der Freigabe der ausfahrenden Linie +//Freigabe aus aktiver Linie verlängern aktivieren: + L #Para.Sicherheit; + L #Para.Abstand_Lines; + +I; + L 10; + /I; + L 2;///Nach 2 Sekunden + T #Dyn.Nachtrigger_Freigabe;//Nachtriggern der Freigabe der ausfahrenden Linie +NETWORK +TITLE = Aktiv-/Nachtrigger-Zeit verändern +Zeit: UN #Antrieb_aktiv ;//Antrieb aktiv + ON "1s-Impuls";//1s-Impuls + SPB Chk; ---- NW 4: Aktiv-/Nachtrigger-Zeit verändern --- -Zeit: AN Antrieb_aktiv // Antrieb aktiv - ON "1s-Impuls" // 1s-Impuls - JC Chk +//BM ist unterwegs: + L #Dyn.RestZeit; + + -10;//10*100ms = 1s + T #Dyn.RestZeit; -// BM ist unterwegs: - L Dyn.RestZeit - + -10 // 10*100ms = 1s - T Dyn.RestZeit + L 0;//Minimum erreicht? + >I;//Nein ! + SPB Trig; - L 0 // Minimum erreicht? - >I // Nein ! - JC Trig + T #Dyn.RestZeit;//Minimum übergeben - T Dyn.RestZeit // Minimum übergeben +//Freigabe nachtriggern: +Trig: L #Dyn.Nachtrigger_Freigabe;//Nachtriggern der Freigabe der ausfahrenden Linie + + -1; + T #Dyn.Nachtrigger_Freigabe;//Nachtriggern der Freigabe der ausfahrenden Linie -// Freigabe nachtriggern: -Trig: L Dyn.Nachtrigger_Freigabe // Nachtriggern der Freigabe der ausfahrenden Linie - + -1 - T Dyn.Nachtrigger_Freigabe // Nachtriggern der Freigabe der ausfahrenden Linie + L 0;//Minimum erreicht? + >I;//Nein ! + SPB Chk; - L 0 // Minimum erreicht? - >I // Nein ! - JC Chk + T #Dyn.Nachtrigger_Freigabe;//Minimum übergeben + T #Dyn.Aktiv_Line; + T #Dyn.Last_Line; - T Dyn.Nachtrigger_Freigabe // Minimum übergeben - T Dyn.Aktiv_Line - T Dyn.Last_Line +NETWORK +TITLE = Nachtriggern der Freigabe der ausfahrenden Linie +Chk: L #Dyn.Aktiv_Line ;//Aktive Linie + L #Dyn.Last_Line; + <>I;//Unterschiedlich ! + SPB More; + TAK; + SPL ENDE_Mig; + SPA ENDE_Mig;//Bei 0 + SPA Li01;//Linie 1 war aktiv + SPA Li02; + SPA Li03; + SPA Li04; + SPA Li05; + SPA Li06; + SPA Li07; + SPA Li08; + SPA Li09; + SPA Li10; + SPA Li11; + SPA Li12; + SPA Li13; + SPA Li14; + SPA Li15; + SPA Li16; + SPA Li17; + SPA Li18; + SPA Li19; + SPA Li20; + SPA Li21; + SPA Li22; + SPA Li23; + SPA Li24; + SPA Li25;//Linie 25 war aktiv +ENDE_Mig: SPA More; ---- NW 5: Nachtriggern der Freigabe der ausfahrenden Linie --- -Chk: L Dyn.Aktiv_Line // Aktive Linie - L Dyn.Last_Line - <>I // Unterschiedlich ! - JC More +Li01: SET; + S #Out.Line_1_Ok; + BEA; +Li02: SET; + S #Out.Line_2_Ok; + BEA; +Li03: SET; + S #Out.Line_3_Ok; + BEA; +Li04: SET; + S #Out.Line_4_Ok; + BEA; +Li05: SET; + S #Out.Line_5_Ok; + BEA; +Li06: SET; + S #Out.Line_6_Ok; + BEA; +Li07: SET; + S #Out.Line_7_Ok; + BEA; +Li08: SET; + S #Out.Line_8_Ok; + BEA; +Li09: SET; + S #Out.Line_9_Ok; + BEA; +Li10: SET; + S #Out.Line_10_Ok; + BEA; +Li11: SET; + S #Out.Line_11_Ok; + BEA; +Li12: SET; + S #Out.Line_12_Ok; + BEA; +Li13: SET; + S #Out.Line_13_Ok; + BEA; +Li14: SET; + S #Out.Line_14_Ok; + BEA; +Li15: SET; + S #Out.Line_15_Ok; + BEA; +Li16: SET; + S #Out.Line_16_Ok; + BEA; +Li17: SET; + S #Out.Line_17_Ok; + BEA; +Li18: SET; + S #Out.Line_18_Ok; + BEA; +Li19: SET; + S #Out.Line_19_Ok; + BEA; +Li20: SET; + S #Out.Line_20_Ok; + BEA; +Li21: SET; + S #Out.Line_21_Ok; + BEA; +Li22: SET; + S #Out.Line_22_Ok; + BEA; +Li23: SET; + S #Out.Line_23_Ok; + BEA; +Li24: SET; + S #Out.Line_24_Ok; + BEA; +Li25: SET; + S #Out.Line_25_Ok; + BEA; - CAC - JL ENDE_Mig - JU ENDE_Mig // Bei 0 - JU Li01 // Linie 1 war aktiv - JU Li02 - JU Li03 - JU Li04 - JU Li05 - JU Li06 - JU Li07 - JU Li08 - JU Li09 - JU Li10 - JU Li11 - JU Li12 - JU Li13 - JU Li14 - JU Li15 - JU Li16 - JU Li17 - JU Li18 - JU Li19 - JU Li20 - JU Li21 - JU Li22 - JU Li23 - JU Li24 - JU Li25 // Linie 25 war aktiv -ENDE_Mig: JU More +More: NOP 0; -Li01: SET - S Out.Line_1_Ok - BEU -Li02: SET - S Out.Line_2_Ok - BEU -Li03: SET - S Out.Line_3_Ok - BEU -Li04: SET - S Out.Line_4_Ok - BEU -Li05: SET - S Out.Line_5_Ok - BEU -Li06: SET - S Out.Line_6_Ok - BEU -Li07: SET - S Out.Line_7_Ok - BEU -Li08: SET - S Out.Line_8_Ok - BEU -Li09: SET - S Out.Line_9_Ok - BEU -Li10: SET - S Out.Line_10_Ok - BEU -Li11: SET - S Out.Line_11_Ok - BEU -Li12: SET - S Out.Line_12_Ok - BEU -Li13: SET - S Out.Line_13_Ok - BEU -Li14: SET - S Out.Line_14_Ok - BEU -Li15: SET - S Out.Line_15_Ok - BEU -Li16: SET - S Out.Line_16_Ok - BEU -Li17: SET - S Out.Line_17_Ok - BEU -Li18: SET - S Out.Line_18_Ok - BEU -Li19: SET - S Out.Line_19_Ok - BEU -Li20: SET - S Out.Line_20_Ok - BEU -Li21: SET - S Out.Line_21_Ok - BEU -Li22: SET - S Out.Line_22_Ok - BEU -Li23: SET - S Out.Line_23_Ok - BEU -Li24: SET - S Out.Line_24_Ok - BEU -Li25: SET - S Out.Line_25_Ok - BEU +NETWORK +TITLE = Freigaben an Pufferstrecken aufgrund der fahrenden BM + L #Dyn.RestZeit; + L 10; + /I; + SPL Ende; + SPA Ok01;//Restzeit in 0 Sekunden + SPA Ok01;//Restzeit in 1 Sekunden + SPA Ok02;//Restzeit in 2 Sekunden + SPA Ok02;//Restzeit in 3 Sekunden + SPA Ok03;//Restzeit in 4 Sekunden + SPA Ok03;//Restzeit in 5 Sekunden + SPA Ok04;//Restzeit in 6 Sekunden + SPA Ok04;//Restzeit in 7 Sekunden + SPA Ok05;//Restzeit in 8 Sekunden + SPA Ok05;//Restzeit in 9 Sekunden + SPA Ok06;//Restzeit in 10 Sekunden + SPA Ok06;//Restzeit in 11 Sekunden + SPA Ok07;//Restzeit in 12 Sekunden + SPA Ok07;//Restzeit in 13 Sekunden + SPA Ok08;//Restzeit in 14 Sekunden + SPA Ok08;//Restzeit in 15 Sekunden + SPA Ok09;//Restzeit in 16 Sekunden + SPA Ok09;//Restzeit in 17 Sekunden + SPA Ok10;//Restzeit in 18 Sekunden + SPA Ok10;//Restzeit in 19 Sekunden + SPA Ok11;//Restzeit in 20 Sekunden + SPA Ok11;//Restzeit in 21 Sekunden + SPA Ok12;//Restzeit in 22 Sekunden + SPA Ok12;//Restzeit in 23 Sekunden + SPA Ok13;//Restzeit in 24 Sekunden + SPA Ok13;//Restzeit in 25 Sekunden + SPA Ok14;//Restzeit in 26 Sekunden + SPA Ok14;//Restzeit in 27 Sekunden + SPA Ok15;//Restzeit in 28 Sekunden + SPA Ok15;//Restzeit in 29 Sekunden + SPA Ok16;//Restzeit in 30 Sekunden + SPA Ok16;//Restzeit in 31 Sekunden + SPA Ok17;//Restzeit in 32 Sekunden + SPA Ok17;//Restzeit in 33 Sekunden + SPA Ok18;//Restzeit in 34 Sekunden + SPA Ok18;//Restzeit in 35 Sekunden + SPA Ok19;//Restzeit in 36 Sekunden + SPA Ok19;//Restzeit in 33 Sekunden + SPA Ok20;//Restzeit in 38 Sekunden + SPA Ok20;//Restzeit in 39 Sekunden + SPA Ok21;//Restzeit in 40 Sekunden + SPA Ok21;//Restzeit in 41 Sekunden + SPA Ok22;//Restzeit in 42 Sekunden + SPA Ok22;//Restzeit in 43 Sekunden + SPA Ok23;//Restzeit in 44 Sekunden + SPA Ok23;//Restzeit in 45 Sekunden + SPA Ok24;//Restzeit in 46 Sekunden + SPA Ok24;//Restzeit in 43 Sekunden + SPA Ok25;//Restzeit in 48 Sekunden + SPA Ok25;//Restzeit in 49 Sekunden +Ende: SPA En04; -More: NOP 0 +Ok01: SET; + S #Out.Line_1_Ok; +Ok02: SET; + S #Out.Line_2_Ok; +Ok03: SET; + S #Out.Line_3_Ok; +Ok04: SET; + S #Out.Line_4_Ok; +Ok05: SET; + S #Out.Line_5_Ok; +Ok06: SET; + S #Out.Line_6_Ok; +Ok07: SET; + S #Out.Line_7_Ok; +Ok08: SET; + S #Out.Line_8_Ok; +Ok09: SET; + S #Out.Line_9_Ok; +Ok10: SET; + S #Out.Line_10_Ok; +Ok11: SET; + S #Out.Line_11_Ok; +Ok12: SET; + S #Out.Line_12_Ok; +Ok13: SET; + S #Out.Line_13_Ok; +Ok14: SET; + S #Out.Line_14_Ok; +Ok15: SET; + S #Out.Line_15_Ok; +Ok16: SET; + S #Out.Line_16_Ok; +Ok17: SET; + S #Out.Line_17_Ok; +Ok18: SET; + S #Out.Line_18_Ok; +Ok19: SET; + S #Out.Line_19_Ok; +Ok20: SET; + S #Out.Line_20_Ok; +Ok21: SET; + S #Out.Line_21_Ok; +Ok22: SET; + S #Out.Line_22_Ok; +Ok23: SET; + S #Out.Line_23_Ok; +Ok24: SET; + S #Out.Line_24_Ok; +Ok25: SET; + S #Out.Line_25_Ok; +En04: NOP 0; ---- NW 6: Freigaben an Pufferstrecken aufgrund der fahrenden BM --- - L Dyn.RestZeit - L 10 - /I - JL Ende - JU Ok01 // Restzeit in 0 Sekunden - JU Ok01 // Restzeit in 1 Sekunden - JU Ok02 // Restzeit in 2 Sekunden - JU Ok02 // Restzeit in 3 Sekunden - JU Ok03 // Restzeit in 4 Sekunden - JU Ok03 // Restzeit in 5 Sekunden - JU Ok04 // Restzeit in 6 Sekunden - JU Ok04 // Restzeit in 7 Sekunden - JU Ok05 // Restzeit in 8 Sekunden - JU Ok05 // Restzeit in 9 Sekunden - JU Ok06 // Restzeit in 10 Sekunden - JU Ok06 // Restzeit in 11 Sekunden - JU Ok07 // Restzeit in 12 Sekunden - JU Ok07 // Restzeit in 13 Sekunden - JU Ok08 // Restzeit in 14 Sekunden - JU Ok08 // Restzeit in 15 Sekunden - JU Ok09 // Restzeit in 16 Sekunden - JU Ok09 // Restzeit in 17 Sekunden - JU Ok10 // Restzeit in 18 Sekunden - JU Ok10 // Restzeit in 19 Sekunden - JU Ok11 // Restzeit in 20 Sekunden - JU Ok11 // Restzeit in 21 Sekunden - JU Ok12 // Restzeit in 22 Sekunden - JU Ok12 // Restzeit in 23 Sekunden - JU Ok13 // Restzeit in 24 Sekunden - JU Ok13 // Restzeit in 25 Sekunden - JU Ok14 // Restzeit in 26 Sekunden - JU Ok14 // Restzeit in 27 Sekunden - JU Ok15 // Restzeit in 28 Sekunden - JU Ok15 // Restzeit in 29 Sekunden - JU Ok16 // Restzeit in 30 Sekunden - JU Ok16 // Restzeit in 31 Sekunden - JU Ok17 // Restzeit in 32 Sekunden - JU Ok17 // Restzeit in 33 Sekunden - JU Ok18 // Restzeit in 34 Sekunden - JU Ok18 // Restzeit in 35 Sekunden - JU Ok19 // Restzeit in 36 Sekunden - JU Ok19 // Restzeit in 33 Sekunden - JU Ok20 // Restzeit in 38 Sekunden - JU Ok20 // Restzeit in 39 Sekunden - JU Ok21 // Restzeit in 40 Sekunden - JU Ok21 // Restzeit in 41 Sekunden - JU Ok22 // Restzeit in 42 Sekunden - JU Ok22 // Restzeit in 43 Sekunden - JU Ok23 // Restzeit in 44 Sekunden - JU Ok23 // Restzeit in 45 Sekunden - JU Ok24 // Restzeit in 46 Sekunden - JU Ok24 // Restzeit in 43 Sekunden - JU Ok25 // Restzeit in 48 Sekunden - JU Ok25 // Restzeit in 49 Sekunden -Ende: JU En04 +NETWORK +TITLE = Letzten aktiven Puffer speichern + L #Dyn.Aktiv_Line ;//Aktive Linie + T #Dyn.Last_Line;//speichern -Ok01: SET - S Out.Line_1_Ok -Ok02: SET - S Out.Line_2_Ok -Ok03: SET - S Out.Line_3_Ok -Ok04: SET - S Out.Line_4_Ok -Ok05: SET - S Out.Line_5_Ok -Ok06: SET - S Out.Line_6_Ok -Ok07: SET - S Out.Line_7_Ok -Ok08: SET - S Out.Line_8_Ok -Ok09: SET - S Out.Line_9_Ok -Ok10: SET - S Out.Line_10_Ok -Ok11: SET - S Out.Line_11_Ok -Ok12: SET - S Out.Line_12_Ok -Ok13: SET - S Out.Line_13_Ok -Ok14: SET - S Out.Line_14_Ok -Ok15: SET - S Out.Line_15_Ok -Ok16: SET - S Out.Line_16_Ok -Ok17: SET - S Out.Line_17_Ok -Ok18: SET - S Out.Line_18_Ok -Ok19: SET - S Out.Line_19_Ok -Ok20: SET - S Out.Line_20_Ok -Ok21: SET - S Out.Line_21_Ok -Ok22: SET - S Out.Line_22_Ok -Ok23: SET - S Out.Line_23_Ok -Ok24: SET - S Out.Line_24_Ok -Ok25: SET - S Out.Line_25_Ok +NETWORK +TITLE = Ende + BE; -En04: NOP 0 - - ---- NW 7: Letzten aktiven Puffer speichern --- - L Dyn.Aktiv_Line // Aktive Linie - T Dyn.Last_Line // speichern - - ---- NW 8: Ende --- - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Module/MAusfahrFreigabe_neu.awl b/=A01+UH07-KF00/Programmbausteine/Module/MAusfahrFreigabe_neu.awl index 32f722f..39dd3a7 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/MAusfahrFreigabe_neu.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/MAusfahrFreigabe_neu.awl @@ -1,82 +1,95 @@ -=== FB 182: MAusfahrFreigabe_neu [STL] === -INTERFACE: - Input: - Impuls : Bool // Zähl-Impuls - Vorbei_1 : Bool // BM ist an Sensor vorbeigefahren - Vorbei_2 : Bool // BM ist an Sensor vorbeigefahren - Vorbei_3 : Bool // BM ist an Sensor vorbeigefahren - Vorbei_4 : Bool // BM ist an Sensor vorbeigefahren - Vorbei_5 : Bool // BM ist an Sensor vorbeigefahren - Inks_Vorbei_1 : Int // Rest-Inks für diese Position - Inks_Vorbei_2 : Int // Rest-Inks für diese Position - Inks_Vorbei_3 : Int // Rest-Inks für diese Position - Inks_Vorbei_4 : Int // Rest-Inks für diese Position - Inks_Vorbei_5 : Int // Rest-Inks für diese Position - Output: - InOut: - Antrieb_ein : Bool // Antrieb einschalten - Static: - Dyn : Struct - Rest_Inks : Int := 1 // BM noch unterwegs [Inks] - Temp: - tAktiv : Int - Constant: +FUNCTION_BLOCK "MAusfahrFreigabe_neu" +TITLE = Ausfahrfreigabe für Pufferstrecken +{ S7_Optimized_Access := 'FALSE' } +VERSION : 0.1 + VAR_INPUT + Impuls : Bool; // Zähl-Impuls + Vorbei_1 { ExternalWritable := 'False'} : Bool; // BM ist an Sensor vorbeigefahren + Vorbei_2 { ExternalWritable := 'False'} : Bool; // BM ist an Sensor vorbeigefahren + Vorbei_3 { ExternalWritable := 'False'} : Bool; // BM ist an Sensor vorbeigefahren + Vorbei_4 { ExternalWritable := 'False'} : Bool; // BM ist an Sensor vorbeigefahren + Vorbei_5 { ExternalWritable := 'False'} : Bool; // BM ist an Sensor vorbeigefahren + Inks_Vorbei_1 : Int; // Rest-Inks für diese Position + Inks_Vorbei_2 : Int; // Rest-Inks für diese Position + Inks_Vorbei_3 : Int; // Rest-Inks für diese Position + Inks_Vorbei_4 : Int; // Rest-Inks für diese Position + Inks_Vorbei_5 : Int; // Rest-Inks für diese Position + END_VAR ---- NW 1: Vorbei-Sensoren auswerten --- - L Inks_Vorbei_5 - A Vorbei_5 - JC Chek - L Inks_Vorbei_4 - A Vorbei_4 - JC Chek - L Inks_Vorbei_3 - A Vorbei_3 - JC Chek - L Inks_Vorbei_2 - A Vorbei_2 - JC Chek - L Inks_Vorbei_1 - A Vorbei_1 - JC Chek + VAR_IN_OUT + Antrieb_ein : Bool; // Antrieb einschalten + END_VAR - JU En02 + VAR + Dyn : Struct + Rest_Inks : Int := 1; // BM noch unterwegs [Inks] + END_STRUCT; + END_VAR -Chek: L Dyn.Rest_Inks // Neuer Wert kleiner? - I // Nein ! - JC En04 +Chek: L #Dyn.Rest_Inks ;//Neuer Wert kleiner? + I // Ja ! - S Antrieb_ein +//BT ist unterwegs: + L #Dyn.Rest_Inks; + + -1; + T #Dyn.Rest_Inks; + L 0;//Minimum erreicht? + >I;//Nein ! + SPB En04; ---- NW 4: Ende --- - BE + L 1; + T #Dyn.Rest_Inks;//Minimum übergeben + +En04: NOP 0; + +NETWORK +TITLE = Antrieb einschalten + L #Dyn.Rest_Inks; + L 1 ;//vorhanden ? + >I;//Ja ! + S #Antrieb_ein; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Module/MBlinken.awl b/=A01+UH07-KF00/Programmbausteine/Module/MBlinken.awl index 5aee705..064e734 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/MBlinken.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/MBlinken.awl @@ -1,153 +1,163 @@ -=== FB 94: MBlinken [STL] === -INTERFACE: - Input: - Impulsdauer : Bool // Impulsdauer - Error_1 : Bool - Error_2 : Bool - Error_3 : Bool - Error_4 : Bool - Error_5 : Bool - Error_6 : Bool - Error_7 : Bool - Error_8 : Bool - Error_9 : Bool - Error_10 : Bool - Output: - hAnzeige : Bool // Anzeige - InOut: - Static: - Flanke_Ausschalttakt : Bool - Kein_Blinken : Bool - Ausschalttakte : Int // Betriebsbereit ist ausgeschaltet - Temp: - Constant: +FUNCTION_BLOCK "MBlinken" +TITLE = Anzeige blinken lassen +{ S7_Optimized_Access := 'FALSE' } +VERSION : 0.1 + VAR_INPUT + Impulsdauer : Bool; // Impulsdauer + Error_1 : Bool; + Error_2 : Bool; + Error_3 : Bool; + Error_4 : Bool; + Error_5 : Bool; + Error_6 : Bool; + Error_7 : Bool; + Error_8 : Bool; + Error_9 : Bool; + Error_10 : Bool; + END_VAR ---- NW 1: Anzeige bei Error 1-10 1-10 mal blinken lassen --- -// Anzeige ausschalten: - AN Error_1 - AN Error_2 - AN Error_3 - AN Error_4 - AN Error_5 - AN Error_6 - AN Error_7 - AN Error_8 - AN Error_9 - AN Error_10 - R hAnzeige - R Flanke_Ausschalttakt - R Kein_Blinken - JC NoAn + VAR_OUTPUT + hAnzeige : Bool; // Anzeige + END_VAR -// Anzeige aktivieren - A Impulsdauer - AN Kein_Blinken - = hAnzeige - - A Impulsdauer - Fall Flanke_Ausschalttakt - JCN mHu - - L Ausschalttakte - + 1 - T Ausschalttakte + VAR + Flanke_Ausschalttakt : Bool; + Kein_Blinken : Bool; + Ausschalttakte : Int; // Betriebsbereit ist ausgeschaltet + END_VAR -mHu: L Ausschalttakte - L 2 - >=I - A Kein_Blinken - R Kein_Blinken - JC NoAn +BEGIN +NETWORK +TITLE = Anzeige bei Error 1-10 1-10 mal blinken lassen - A Kein_Blinken - JC En01 +//Anzeige ausschalten: + UN #Error_1; + UN #Error_2; + UN #Error_3; + UN #Error_4; + UN #Error_5; + UN #Error_6; + UN #Error_7; + UN #Error_8; + UN #Error_9; + UN #Error_10; + R #hAnzeige; + R #Flanke_Ausschalttakt; + R #Kein_Blinken; + SPB NoAn; - CAC - L 1 - >=I - A Error_1 - S Kein_Blinken - JC NoAn +//Anzeige aktivieren + U #Impulsdauer; + UN #Kein_Blinken; + = #hAnzeige; - CAC - L 2 - >=I - A Error_2 - S Kein_Blinken - JC NoAn + U #Impulsdauer; + FN #Flanke_Ausschalttakt; + SPBN mHu; - CAC - L 3 - >=I - A Error_3 - S Kein_Blinken - JC NoAn - - CAC - L 4 - >=I - A Error_4 - S Kein_Blinken - JC NoAn - - CAC - L 5 - >=I - A Error_5 - S Kein_Blinken - JC NoAn - - CAC - L 6 - >=I - A Error_6 - S Kein_Blinken - JC NoAn - - CAC - L 7 - >=I - A Error_7 - S Kein_Blinken - JC NoAn - - CAC - L 8 - >=I - A Error_8 - S Kein_Blinken - JC NoAn - - CAC - L 9 - >=I - A Error_9 - S Kein_Blinken - JC NoAn - - CAC - L 10 - >=I - A Error_10 - S Kein_Blinken - JC NoAn - - CAC - L 10 - >I - S Kein_Blinken - JC NoAn - - JU En01 - -NoAn: L 0 - T Ausschalttakte - -En01: NOP 0 + L #Ausschalttakte; + + 1; + T #Ausschalttakte; ---- NW 2: Ende --- - BE +mHu: L #Ausschalttakte; + L 2; + >=I; + U #Kein_Blinken; + R #Kein_Blinken; + SPB NoAn; + + U #Kein_Blinken; + SPB En01; + + TAK; + L 1; + >=I; + U #Error_1; + S #Kein_Blinken; + SPB NoAn; + + TAK; + L 2; + >=I; + U #Error_2; + S #Kein_Blinken; + SPB NoAn; + + TAK; + L 3; + >=I; + U #Error_3; + S #Kein_Blinken; + SPB NoAn; + + TAK; + L 4; + >=I; + U #Error_4; + S #Kein_Blinken; + SPB NoAn; + + TAK; + L 5; + >=I; + U #Error_5; + S #Kein_Blinken; + SPB NoAn; + + TAK; + L 6; + >=I; + U #Error_6; + S #Kein_Blinken; + SPB NoAn; + + TAK; + L 7; + >=I; + U #Error_7; + S #Kein_Blinken; + SPB NoAn; + + TAK; + L 8; + >=I; + U #Error_8; + S #Kein_Blinken; + SPB NoAn; + + TAK; + L 9; + >=I; + U #Error_9; + S #Kein_Blinken; + SPB NoAn; + + TAK; + L 10; + >=I; + U #Error_10; + S #Kein_Blinken; + SPB NoAn; + + TAK; + L 10; + >I; + S #Kein_Blinken; + SPB NoAn; + + SPA En01; + +NoAn: L 0; + T #Ausschalttakte; + +En01: NOP 0; + +NETWORK +TITLE = Ende + BE; +END_FUNCTION_BLOCK + diff --git a/=A01+UH07-KF00/Programmbausteine/Module/MHMEntnahmepuffer.awl b/=A01+UH07-KF00/Programmbausteine/Module/MHMEntnahmepuffer.awl index e4f05b8..15905eb 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/MHMEntnahmepuffer.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/MHMEntnahmepuffer.awl @@ -1,208 +1,278 @@ -=== FB 1278: MHMEntnahmepuffer [STL] === -INTERFACE: - Input: - EntnahmePuffer_Nr : Int // Aufruf für Leer-Puffer - B_LeerpufferEinfahrt : Bool // Sensor Trolley fährt in Leerpuffer - Output: - Error : Word // Störungen übergeben - InOut: - hStOk : Bool // Anzeige Start n. Störung aktivieren - Static: - Res16 : Array[1..4] of Int // Reserve - SAVE : Struct - Weichen_DB : Int // Weichen-FIFO-DB - Weichen_DW : Int // Weichen-FIFO-DW - Para : Struct // Parameter - Entnahmepuffer_DL_DB : Int // Einsprung Leerpuffer-Datenliste-DB - Entnahmepuffer_DL_DW : Int // Einsprung Leerpuffer-Datenliste-DW - Res1 : Array[1..2] of Int // Reserve - Status2 : Struct - Abruf_ist_möglich : Bool // Abruf ist möglich - Kein_Stop_mehr : Bool - Eintrag_DL_Leerliste_erfolgt : Bool // Eintrag in DLLPPuffer_leer (DB500) erfolgt - Eintrag_DL_Reinliste_erfolgt : Bool // Eintrag in DLLPPuffer_Einfahren (DB501) erfolgt - Eintrag_Abrufliste_erfolgt : Bool // Eintrag in DLLPPuffer_Ausfahren (DB502) erfolgt - Puffer : "UDLHMEntnahmePuffer" // Statische Leerpufferdaten (aus DL) - Dyn : Struct // Dynamische Daten - Status : Struct - Puffer_OUT_leer : Bool // Puffer ist leer - Puffer_OUT_hat Platz : Bool // Puffer hat noch Kapazität - Undef.Trolley_in_Schleuse_OUT : Bool // Undefinierter Trolley in Schleuse unten erkannt - Trolley_fährt_in_Schleuse_OUT : Bool // Trolley fährt in Schleuse (unten) - Trolley_wartet_Auftrag : Bool // Trolley wartet auf Auftrag (unten) - Trolley_wartet_Bereich+1 : Bool // Trolley wartet auf Bereich +1 (unten) - Trolley_fährt_aus_OUT : Bool // Trolley fährt aus (unten) - MindestZeit_ok_OUT : Bool // Schleuse ist MindestZeit geöffnet - Trolley_draussen_Out : Bool // Trolley ist ausgefahren - Trolley_OUT_nicht_in_Schleuse : Bool // Trolley fährt nicht in Schleuse - Leer_Check_OUT : Bool // Leerpuffer wird auf leer gecheckt - Alles_ausfahren : Bool // Alle Trolleys ausfahren - Leerpuffer_initialisieren : Bool // Leerpuffer initialisieren - Error_aktiv : Bool // Störung vorhanden - Reset_aktiv_OUT : Bool // Reset aktiv - TrolleyID_Einfahrt : DInt // Trolley-Nr ist eingefahren - Rueckmld : Struct - RET_VAL_BLKMOV_EntnahmePuffer : Int // Rückmeldung nach BLKMOV-Aufruf - RET_VAL_DL_EntnahmePuffer : Byte // Rückmeldung nach DatenOut-Aufruf - RET_VAL_DL_Res_OUT : Byte // Rückmeldung nach DatenOut-Aufruf - RET_VAL_DL_EntnahmePufferTrolley_IN : Byte // Rückmeldung nach DatenIN-Aufruf - RET_VAL_DL_EntnahmePufferTrolley_OUT : Byte // Rückmeldung nach DatenOut-Aufruf - Error : "UErrHMEntnahmePuffer" - Stau_Zeit : Int // Sensor B_Einfahrt ist belegt [1s] - Stop_Ursache : Word // Stop-Stelle: Nw + Position - Res500 : Array[1..206] of Int - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Ueb_akt : Bool // Überwachungszeit aktivieren - Weiter : Bool // Weiterschaltbedingung ist erfüllt - Warte_neu : Bool // Wartezeit neu triggern - Warte_stop : Bool // Wartezeit stoppen - Inks_Ok : Bool // Starten aufgrund der Inks erlaubt - Puffer_ist_leer : Bool // Leerpuffer zeitlang ohne Sensor - Abruf_Trolley_vorne : Bool // Abruf-Trolley ist in Schleuse - Oberen_Puffer_Freigeben : Bool - GesamtAnzahl : Int - SSDW : Int - Schleife : Word // Loopzähler - Trolley : Int - Position : Int - Constant: +FUNCTION_BLOCK "MHMEntnahmepuffer" +TITLE = Omni H&M-EntnahmePuffer-Modul +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-960629 +// +//Version: H&M Leerpuffer / 10.2025 +// +//Version: Omniflow 2100 / 10.2024 +// +//Schritt 0: Warten auf Trolley +//Schritt 1: Betriebsart ok/angegeben? +//Schritt 5: Mit Scanner fahren: Defaultziel ? +//Schritt 6: Scanner triggern +//Schritt 7: "DREQ" an PC senden +//Schritt 8: Warten auf PC-Antwort +//Schritt 9: PC-Antwort auswerten +//Schritt 10: Fahrtrichtung ermitteln +//Schritt 11: Ausfahren ok ? +//Schritt 12: Warten auf Pin-Signal +//Schritt 13: Weichenbereich raus bereit ? +//Schritt 14: Daten an Rausweiche übergeben +//Schritt 15: Schleuse Mindestzeit öffnen +//Schritt 16: Trolley ausgefahren ? +//Schritt 17: Trolley ist draussen +//Schritt 18: BM wurde vereinzelt +//Schritt 19: Beladezustand checken +//Schritt 20: Schleuse resetten +//Schritt 21: Reset ist zu Ende +// + VAR_INPUT + EntnahmePuffer_Nr { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Aufruf für Leer-Puffer + B_LeerpufferEinfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley fährt in Leerpuffer + END_VAR ---- NW 1: Parameter-Übergabe --- - L EntnahmePuffer_Nr + VAR_OUTPUT + Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Störungen übergeben + END_VAR - L 275 // Einsprung Puffer-DL - T Para.Entnahmepuffer_DL_DB // vor Aufruf übergeben! - L 0 - T Para.Entnahmepuffer_DL_DW + VAR_IN_OUT + hStOk : Bool; // Anzeige Start n. Störung aktivieren + END_VAR + + VAR + Res16 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..4] of Int; // Reserve + SAVE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Weichen_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Weichen-FIFO-DB + Weichen_DW { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Weichen-FIFO-DW + END_STRUCT; + Para { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // Parameter + Entnahmepuffer_DL_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung Leerpuffer-Datenliste-DB + Entnahmepuffer_DL_DW { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung Leerpuffer-Datenliste-DW + Res1 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..2] of Int; // Reserve + END_STRUCT; + Status2 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Abruf_ist_möglich { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Abruf ist möglich + Kein_Stop_mehr { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + Eintrag_DL_Leerliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLLPPuffer_leer (DB500) erfolgt + Eintrag_DL_Reinliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLLPPuffer_Einfahren (DB501) erfolgt + Eintrag_Abrufliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLLPPuffer_Ausfahren (DB502) erfolgt + END_STRUCT; + Puffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "UDLHMEntnahmePuffer"; // Statische Leerpufferdaten (aus DL) + Dyn : Struct // Dynamische Daten + Status { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Puffer_OUT_leer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer ist leer + "Puffer_OUT_hat Platz" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer hat noch Kapazität + "Undef.Trolley_in_Schleuse_OUT" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Undefinierter Trolley in Schleuse unten erkannt + Trolley_fährt_in_Schleuse_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt in Schleuse (unten) + Trolley_wartet_Auftrag { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley wartet auf Auftrag (unten) + "Trolley_wartet_Bereich+1" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley wartet auf Bereich +1 (unten) + Trolley_fährt_aus_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt aus (unten) + MindestZeit_ok_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse ist MindestZeit geöffnet + Trolley_draussen_Out { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley ist ausgefahren + Trolley_OUT_nicht_in_Schleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt nicht in Schleuse + Leer_Check_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Leerpuffer wird auf leer gecheckt + Alles_ausfahren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Alle Trolleys ausfahren + Leerpuffer_initialisieren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Leerpuffer initialisieren + Error_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Störung vorhanden + Reset_aktiv_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Reset aktiv + END_STRUCT; + TrolleyID_Einfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-Nr ist eingefahren + Rueckmld { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + RET_VAL_BLKMOV_EntnahmePuffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Rückmeldung nach BLKMOV-Aufruf + RET_VAL_DL_EntnahmePuffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf + RET_VAL_DL_Res_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf + RET_VAL_DL_EntnahmePufferTrolley_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenIN-Aufruf + RET_VAL_DL_EntnahmePufferTrolley_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf + END_STRUCT; + Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "UErrHMEntnahmePuffer"; + Stau_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Sensor B_Einfahrt ist belegt [1s] + Stop_Ursache { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Stop-Stelle: Nw + Position + Res500 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..206] of Int; + END_STRUCT; + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Ueb_akt : Bool; // Überwachungszeit aktivieren + Weiter : Bool; // Weiterschaltbedingung ist erfüllt + Warte_neu : Bool; // Wartezeit neu triggern + Warte_stop : Bool; // Wartezeit stoppen + Inks_Ok : Bool; // Starten aufgrund der Inks erlaubt + Puffer_ist_leer : Bool; // Leerpuffer zeitlang ohne Sensor + Abruf_Trolley_vorne : Bool; // Abruf-Trolley ist in Schleuse + Oberen_Puffer_Freigeben : Bool; + GesamtAnzahl : Int; + SSDW : Int; + Schleife : Word; // Loopzähler + Trolley : Int; + Position : Int; + END_VAR ---- NW 2: Statische Entnahmepuffer-Parameter holen --- - L Puffer.EntnahmePuffer_Nr // Nummer des EntnahmePuffers - L EntnahmePuffer_Nr // Aufruf-Parameter - ==I // Identisch ? - R Dyn.Error.Entnahmepuffer_DL // EntnahmePufferdatenbank fehlerhaft - R Dyn.Error.Undef_Entnahmepuffer // undefiniertes EntnahmePuffer - JC en06 // Ja ! +BEGIN +NETWORK +TITLE = Parameter-Übergabe + L #EntnahmePuffer_Nr; - T "MW200" // Search-Daten + L 275 ;//Einsprung Puffer-DL + T #Para.Entnahmepuffer_DL_DB;//vor Aufruf übergeben! + L 0; + T #Para.Entnahmepuffer_DL_DW; -CALL FC "DatenOut" (SSDB:=Para.Entnahmepuffer_DL_DB, SSDW:=Para.Entnahmepuffer_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:=Dyn.Rueckmld.RET_VAL_DL_EntnahmePuffer, OUTDATEN:=P#M220.0, Position:="MW196") +NETWORK +TITLE = Statische Entnahmepuffer-Parameter holen + L #Puffer.EntnahmePuffer_Nr;//Nummer des EntnahmePuffers + L #EntnahmePuffer_Nr ;//Aufruf-Parameter + ==I;//Identisch ? + R #Dyn.Error.Entnahmepuffer_DL;//EntnahmePufferdatenbank fehlerhaft + R #Dyn.Error.Undef_Entnahmepuffer;//undefiniertes EntnahmePuffer + SPB en06;//Ja ! - JBI G_Ok + T "MW200";//Search-Daten - A "M199.0" - JCN w060 + CALL "DatenOut" + ( SSDB := #Para.Entnahmepuffer_DL_DB , + SSDW := #Para.Entnahmepuffer_DL_DW , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := #Dyn.Rueckmld.RET_VAL_DL_EntnahmePuffer , + OUTDATEN := P#M220.0 , + Position := "MW196" + ); - SET - = Dyn.Error.Entnahmepuffer_DL // EntnahmePufferdatenbank fehlerhaft + SPBI G_Ok; - L 16#A061 - T Dyn.Stop_Ursache + U "M199.0"; + SPBN w060; - BEU + SET; + = #Dyn.Error.Entnahmepuffer_DL;//EntnahmePufferdatenbank fehlerhaft -w060: SET - S Dyn.Error.Undef_Entnahmepuffer // undefinierter EntnahmePuffer + L 16#A061; + T #Dyn.Stop_Ursache; - L 16#0062 - T Dyn.Stop_Ursache + BEA; - BEU +w060: SET; + S #Dyn.Error.Undef_Entnahmepuffer;//undefinierter EntnahmePuffer -// Kennung + Datenbytes -G_Ok: SET - R Dyn.Error.Entnahmepuffer_DL // Gefälledatenbank fehlerhaft - R Dyn.Error.Undef_Entnahmepuffer // undefinierte Gefällestrecke + L 16#0062; + T #Dyn.Stop_Ursache; - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 20 // Datenwords speichern - T LW2 // Wiederholungen + BEA; -// Quelle-Pointer erzeugen: - L 0 // Bei Merker = 0 ! - T LW4 // DB_Nummer - L 220 // Adresse - SLD 3 - L 16#8300_0000 // Kennung: Merker - OD - T LD6 // Kennung, Adresse +//Kennung + Datenbytes +G_Ok: SET; + R #Dyn.Error.Entnahmepuffer_DL;//Gefälledatenbank fehlerhaft + R #Dyn.Error.Undef_Entnahmepuffer;//undefinierte Gefällestrecke -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_EntnahmePuffer, DSTBLK:=Puffer) // Datenliste-Daten speichern | #Ziel + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 20;//Datenwords speichern + T %LW2;//Wiederholungen - L 16#0063 - T Dyn.Stop_Ursache +//Quelle-Pointer erzeugen: + L 0;//Bei Merker = 0 ! + T %LW4;//DB_Nummer + L 220;//Adresse + SLD 3; + L 16#8300_0000;//Kennung: Merker + OD; + T %LD6;//Kennung, Adresse - L Dyn.Rueckmld.RET_VAL_BLKMOV_EntnahmePuffer // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Dyn.Error.Err_BLKMov // Error bei Block kopieren - BEC + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #Dyn.Rueckmld.RET_VAL_BLKMOV_EntnahmePuffer , + DSTBLK := #Puffer //#Ziel + ); - L Puffer.Puffer_Typ // Puffertyp = 1278 (EntnahmePuffer) - L 1278 // Dieser Aufruf-FB ? - ==I // Ja ! - JC w061 + L 16#0063; + T #Dyn.Stop_Ursache; - SET - S Dyn.Error.Undef_Entnahmepuffer // undefinierter EntnahmePuffer + L #Dyn.Rueckmld.RET_VAL_BLKMOV_EntnahmePuffer;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Dyn.Error.Err_BLKMov ;//Error bei Block kopieren + BEB; - L 0 // EntnahmePuffer ungültig ! - T Puffer.EntnahmePuffer_Nr // Nummer des EntnahmePuffers + L #Puffer.Puffer_Typ ;//Puffertyp = 1278 (EntnahmePuffer) + L 1278 ;//Dieser Aufruf-FB ? + ==I;//Ja ! + SPB w061; - L 16#0064 - T Dyn.Stop_Ursache + SET; + S #Dyn.Error.Undef_Entnahmepuffer;//undefinierter EntnahmePuffer - BEU + L 0 ;//EntnahmePuffer ungültig ! + T #Puffer.EntnahmePuffer_Nr;//Nummer des EntnahmePuffers -// Defaultwerte übergeben: -w061: NOP 0 + L 16#0064; + T #Dyn.Stop_Ursache; - BEU + BEA; -en06: NOP 0 +//Defaultwerte übergeben: +w061: NOP 0; + BEA; ---- NW 3: Einfahrenden Trolley verarbeiten --- - L Dyn.TrolleyID_Einfahrt - T "MD220" - L DINT#0 - ==I - JC NoNewT +en06: NOP 0; -// Neue Position an Gesamt-Trolley-DL übergeben: -CALL FC "Trolley_DL_Neue_Pos" (Gesamt_Trolley_DL:=Puffer.Gesamt_Trolley_DL, TrolleyID:=Dyn.TrolleyID_Einfahrt, Position:=Puffer.Puffer_Position, ShopGroup:=Dint#0, Err:="M199.0") +NETWORK +TITLE = Einfahrenden Trolley verarbeiten + L #Dyn.TrolleyID_Einfahrt; + T "MD220"; + L DINT#0; + ==I; + SPB NoNewT; -NoNewT: NOP 0 +//Neue Position an Gesamt-Trolley-DL übergeben: + CALL "Trolley_DL_Neue_Pos" + ( Gesamt_Trolley_DL := #Puffer.Gesamt_Trolley_DL , + TrolleyID := #Dyn.TrolleyID_Einfahrt , + Position := #Puffer.Puffer_Position , + ShopGroup := Dint#0 , + Err := "M199.0" + ); +NoNewT: NOP 0; ---- NW 4: Error: Stau Bereich-Eingang --- -// Sensor bei Bereichs-Einfahrt bleibt belegt?: - AN B_LeerpufferEinfahrt // Sensor Trolley fährt in Bereich (kein Stau !) - R Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt - JC X090 // StauZeit neu aufziehen +NETWORK +TITLE = Error: Stau Bereich-Eingang - AN "1s-Impuls" - O Dyn.Error.Err_Stau_Einfahrt // Zeit bereits abgelaufen - JC Xn09 +//Sensor bei Bereichs-Einfahrt bleibt belegt?: + UN #B_LeerpufferEinfahrt ;//Sensor Trolley fährt in Bereich (kein Stau !) + R #Dyn.Error.Err_Stau_Einfahrt;//Stau bei Einfahrt + SPB X090 ;//StauZeit neu aufziehen - L Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - + +1 - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] + UN "1s-Impuls"; + O #Dyn.Error.Err_Stau_Einfahrt;//Zeit bereits abgelaufen + SPB Xn09; - L 25 // Stau-Zeit erreicht ? - >=I // Ja ! - S Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb - JCN Xn09 + L #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + + +1; + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] -X090: L 0 // Zeiten löschen - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] + L 25 ;//Stau-Zeit erreicht ? + >=I;//Ja ! + S #Dyn.Error.Err_Stau_Einfahrt;//Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb + SPBN Xn09; -Xn09: NOP 0 +X090: L 0 ;//Zeiten löschen + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] +Xn09: NOP 0; ---- NW 5: Ende --- - BE +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Module/MHMLeerpuffer.awl b/=A01+UH07-KF00/Programmbausteine/Module/MHMLeerpuffer.awl index 472c144..588201e 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/MHMLeerpuffer.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/MHMLeerpuffer.awl @@ -1,1420 +1,1534 @@ -=== FB 1277: MHMLeerpuffer [STL] === -INTERFACE: - Input: - LeerPuffer_Nr : Int // Aufruf für Leer-Puffer - ErrQuit : Bool // Ablaufstörung quittieren - B_LeerpufferEinfahrt : Bool // Sensor Trolley fährt in Leerpuffer - B_InSchleuse : Bool // Sensor Trolley ist in Schleuse unten - B_AusSchleuse : Bool // Sensor Trolley hat Schleuse unten verlassen - B_Stau_raus_Out : Bool // Sensor Stau im Bereich unten rausfahren - B_QuerTrolley_Out : Bool // Crash-Trolley auf Crashkurs erkannt - Antrieb_plus_aktiv : Bool // Kreisel-Antrieb plus aktiv - Schleuse_geöffnet : Bool // Schleuse unten hat geöffnet - Output: - Y_Schleuse_Auf : Bool // Schleuse unten öffnen - Error : Word // Störungen übergeben - InOut: - Start_Ok : Bool // Starten von ausserhalb ist erlaubt - Antrieb_plus_vor : Bool // Antrieb plus vorfahren - Antrieb_plus_stoppen : Bool // Antrieb plus stoppen - hStOk : Bool // Anzeige Start n. Störung aktivieren - Ausfahr_Inks : Int // Rest-Inks, wo sich Trolley befindet - Static: - Res16 : Array[1..2] of Int // Reserve - SAVE : Struct - Weichen_DB : Int // Weichen-FIFO-DB - Weichen_DW : Int // Weichen-FIFO-DW - Para : Struct // Parameter - Leerpuffer_DL_DB : Int // Einsprung Leerpuffer-Datenliste-DB - Leerpuffer_DL_DW : Int // Einsprung Leerpuffer-Datenliste-DW - Res1 : Array[1..2] of Int // Reserve - Status2 : Struct - Einlagern_ist_aktiv : Bool // Puffer mit Einlagern aktiv - Auslagern_ist_aktiv : Bool // Puffer mit Auslagern aktiv - Eintrag_DL_Leerliste_erfolgt : Bool // Eintrag in DLLPPuffer_leer (DB500) erfolgt - Eintrag_DL_Reinliste_erfolgt : Bool // Eintrag in DLLPPuffer_Einfahren (DB501) erfolgt - Eintrag_Abrufliste_erfolgt : Bool // Eintrag in DLLPPuffer_Ausfahren (DB502) erfolgt - Puffer : "UDLHMLeerPuffer" // Statische Leerpufferdaten (aus DL) - Dyn : Struct // Dynamische Daten - Status : Struct - Puffer_leer : Bool // Puffer ist leer - Puffer_hat Platz : Bool // Puffer hat noch Kapazität - Kein_neuer_Trolley_kommt : Bool // Leerpuffer zeitlang ohne neuen Trolley - Leer_Check_aktiv : Bool // Leerpuffer wird auf leer gecheckt - Reset_aktiv : Bool // Reset aktiv - Trolley_nicht_in_Schleuse : Bool // Trolley fährt nicht in Schleuse > Inilauf gestartet - Puffer_nicht_leer : Bool // Puffer nicht leer > Inilauf gestartet - Leerpuffer_initialisieren : Bool // Leerpuffer initialisieren - MindestZeit_ok : Bool // Schleuse ist MindestZeit geöffnet - Res711 : Bool - Res712 : Bool - Trolley_wartet_Bereich+1 : Bool // Auslagerstrecke noch belegt - Einen_LeerTrolley_ausfahren : Bool // Einen Leer-Trolley ausfahren - Trolley_fährt_aus : Bool // Trolley fährt aus Puffer - Trolley_draussen : Bool // Trolley ist ausgefahren (1 Zyklus) - Error_aktiv : Bool // Störung vorhanden - TrolleyID_Einfahrt : DInt // Trolley-Nr ist eingefahren - HMI : Struct - Trolleys_LeerPuffer : Int // Anzahl Trolleys unten (IN:PLC, OUT:PLC) - Res_Trolleys_LeerPuffer : Int // Anzahl reservierte Trolleys oben (IN:PLC, OUT:PLC) - Frei_Plätze_LeerPuffer : Int // Freiplätze für Trolleys (IN:PLC, OUT:PLC) - Schleuse_resetten_Leerpuffer : Bool // Schleuse resetten unten (IN:HMI, Out:PLC) - LeerPuffer_initialisieren : Bool := 1 // Leerpuffer initialisieren (IN:HMI, Out:PLC) - Einlagern_gesperrt : Bool // Einlagern gesperrt (IN:HMI, OUT:HMI) - AusLagern_gesperrt : Bool // AusLagern gesperrt (IN:HMI, OUT:HMI) - Sk : "USk_Omni" // Status der Schrittkette Schleuse OUT (unten) - Rueckmld : Struct - RET_VAL_BLKMOV_Leerpuffer : Int // Rückmeldung nach BLKMOV-Aufruf - RET_VAL_DL_Leerpuffer : Byte // Rückmeldung nach DatenOut-Aufruf - RET_VAL_DL_Res : Byte // Rückmeldung nach DatenOut-Aufruf - RET_VAL_DL_LeerpufferTrolley_IN : Byte // Rückmeldung nach DatenIN-Aufruf - RET_VAL_DL_LeerpufferTrolley : Byte // Rückmeldung nach DatenOut-Aufruf - Error : "UErrHMLeerPuffer" - Stau_Zeit : Int // Sensor B_Einfahrt ist belegt [1s] - Mindest_Zeit : Int // Sensor B_in_Schleuse unten ist frei [1s] - Leer_Zeit : Int // Puffer unten ist frei [1s] - Stop_Ursache : Word // Stop-Stelle: Nw + Position - Vereinzelungstakte : DInt // Anzahl der getätigten Vereinzelungstakte - TrolleyID_ausgefahren : DInt // TrolleyID des ausgefahrenen Trolleys - Res200 : Array[1..38] of Int - Reservierungs_DL : Struct // AB DW200: Liste der resevierter Trolleys - Datenlistenkopf : Struct - KOPF : Word := WORD#16#DA02 // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128) - LAENGE : Int := 24 // Länge der Datenliste (maximale Anzahl der Datensätze) - STAMMDATEN : Int := 2 // Stammdatenlänge in Word (1 - 9) - INDDB : Int // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) - LAENGEINDDB : Int // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!) - INDDATEN_WANDEL_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) - LETZTERZUGRIFF : Int // Speicherung des letzten Zugriffs - Belegt14 : Int // reserviert von Sort-Datenliste - AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!) - Reserve18 : Int // Reserve - Res_Trolley : Array[1..24] of Struct // Reservierter Trolley für Leerpuffer - Trolley_ID : DInt // Trolley_ID - Endekennung : Word := WORD#16#DAEE // Datensort-Ende-Kennung (DBEE) - Res350 : Array[1..16] of Int - Anzahl_LeerTrolleys : Int // AB DW350: Liste der Trolleys im Leerpuffer - Res500 : Array[1..74] of Int - None: - Reset : Bool := 1 - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Ueb_akt : Bool // Überwachungszeit aktivieren - Weiter : Bool // Weiterschaltbedingung ist erfüllt - Warte_neu : Bool // Wartezeit neu triggern - Warte_stop : Bool // Wartezeit stoppen - Neu_Trolley_in_Puffer : Bool // Neuer Trolley in Puffer eingefahren - Inks_Ok : Bool // Starten aufgrund der Inks erlaubt - GesamtAnzahl : Int - SSDW : Int - Constant: - ---- NW 1: Parameter-Übergabe --- - L LeerPuffer_Nr - - L 275 // Einsprung Puffer-DL - T Para.Leerpuffer_DL_DB // vor Aufruf übergeben! - L 0 - T Para.Leerpuffer_DL_DW - - ---- NW 2: Anzeige OP --- - L 252 // Bereichsstop aktiv - AN Dyn.Sk.Bereich_ok // Also: Bereichsstop / Not-Aus - JC w010 - - L 253 - AN Dyn.Sk.Auto_akt // Keine Betriebsart - AN Dyn.Sk.Hand_akt - JC w010 - - L 255 // Handbetrieb aktiv - A Dyn.Sk.Hand_akt - JC w010 - - L Dyn.Sk.Akt_Schritt // Aktiver Schritt - T Dyn.Sk.OP_Schritt - - JU OP_Ok - -w010: T Dyn.Sk.OP_Schritt - -OP_Ok: NOP 0 - - ---- NW 3: Out-Bits zum Zurücksetzen / Antrieb plus starten --- - SET // Jeden Zyklus neu - R Y_Schleuse_Auf - R Neu_Trolley_in_Puffer - R Dyn.Status."Trolley_wartet_Bereich+1" - R Dyn.Status."Trolley_fährt_aus" - R Dyn.Status.Trolley_draussen - - A Dyn.Sk.Reset - O Dyn.Sk.Reset_Akt - = Dyn.Status.Reset_aktiv - - SET - R Inks_Ok - -// Antrieb zusätlich starten: - A ErrQuit // Überwachungszeit abgelaufen quittieren - S Antrieb_plus_vor // Kreisel-Antrieb plus starten - - ---- NW 4: HMI-Zeug --- -// Von HMI: - A Dyn.HMI.Schleuse_resetten_Leerpuffer - R Dyn.HMI.Schleuse_resetten_Leerpuffer - S Dyn.Sk.Reset // SK zurücksetzen - - A Dyn.HMI.LeerPuffer_initialisieren - S Dyn.Status.Leerpuffer_initialisieren - R Dyn.HMI.LeerPuffer_initialisieren - - A Dyn.HMI.Einlagern_gesperrt // Wird unten direkt verarbeitet - - A Dyn.HMI.AusLagern_gesperrt // Wird unten direkt verarbeitet - - CLR - -// An HMI: - - L Dyn.Anzahl_LeerTrolleys - T Dyn.HMI.Trolleys_LeerPuffer - - L Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege - T Dyn.HMI.Res_Trolleys_LeerPuffer - - L Puffer.MaxAnzahl_LeerPuffer - L Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege - -I - L Dyn.Anzahl_LeerTrolleys - -I - T Dyn.HMI."Frei_Plätze_LeerPuffer" - - ---- NW 5: Schrittkette OUT zurücksetzen --- - AN Dyn.Sk.Reset // SK zurücksetzen - JC en04 - -// Schrittkette zurücksetzen: - L 0 // Schritt 0: Warten - T Dyn.Sk.Akt_Schritt - - L 0 // Zeitwert löschen - T Dyn.Sk.Terr_Zelle - T Dyn.Sk.Tok_Zelle - T Dyn.Leer_Zeit // Zeit für LeerCheck [1s] - - SET - R Dyn.Status.Einen_LeerTrolley_ausfahren - R Dyn.Error.Err_BLKMov // Error bei Block kopieren - R Dyn.Sk.Reset // SK zurücksetzen - R Dyn.Sk.Err_Schritt // Undefinierter Schritt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - S Dyn.Sk.Reset_Akt // Reset ist aktiv - - SET - R Dyn.Error.Leerpuffer_DL // Leerpuffer-Datenliste fehlerhaft - R Dyn.Error.Undef_Leerpuffer // undefiniertes Leerpuffer - R Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen - R Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert - R Dyn.Error.Err_Stau_Einfahrt // Stau am Leerpuffer-Eingang - R Dyn.Error.Err_BLKMov - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - - L 0 - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - T Dyn.Mindest_Zeit // Sensor B_VorSep ist frei [1s] - T SAVE.Weichen_DB - T SAVE.Weichen_DW - -// Defaultwerte übergeben: - L 0 // Damit statische Werte neu aus Datenbank geholt werden ! - T Puffer.LeerPuffer_Nr // Nummer des Leerpuffers - - BEU - -en04: NOP 0 - - ---- NW 6: Störungen nach Außen übergeben --- - L 0 - T "MW200" - - A Dyn.Error.Leerpuffer_DL // Leerpuffer-Datenliste fehlerhaft - = "M200.0" - A Dyn.Error.Undef_Leerpuffer // undefinierter Leerpuffer - = "M200.1" - A Dyn.Error.Err_Trolley_nicht_in_Schleuse // Trolley fährt nicht in Schleuse - AN Dyn.Status.Leerpuffer_initialisieren - = "M200.2" - A Dyn.Sk.Err_Uebzeit - AN Dyn.Error.Err_Trolley_nicht_in_Schleuse // Trolley fährt nicht in Schleuse - AN Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - = Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen - = "M200.3" - NEG - R Dyn.Sk.Err_Uebzeit_AnzOk - A Dyn.Sk.Err_Schritt - = Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert - = "M200.4" - A Dyn.Error.Err_Stau_Einfahrt // Stau am Leerpuffer-Eingang - = "M200.5" - A Dyn.Error.Err_BLKMov // Error bei Block kopieren - = "M200.6" - A Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - = "M200.7" - A Dyn.Error.Err_Leerpuffer_nicht_leer - AN Dyn.Status.Leerpuffer_initialisieren - = "M201.0" - CLR - = "M201.1" - = "M201.2" - = "M201.3" - = "M201.4" - A Dyn.Error.Err_Raus_Sensor - = "M201.5" - CLR - = "M201.6" - A Dyn.Sk.Reset_Akt // Reset ist aktiv - = Dyn.Error.Reset_aktiv - = "M201.7" - -// Andere Meldung als Überwachungszeit aktiv ?: - L "MW200" - L 2#1111_0111_1111_1111 - AW - L 2#0000_0000_0000_0000 // Andere Meldung als Üb.zeit aktiv ? - <>I // Ja ! - ON Dyn.Sk.Err_Uebzeit_AnzOk // Störung anzeigen ok, da 2.Zyklus aktiv ! - R "M200.3" // Üb.Zeit-Meldung nicht an PC senden - - A Dyn.Sk.Err_Uebzeit - S Dyn.Sk.Err_Uebzeit_AnzOk // Störung anzeigen ok, da 2.Zyklus aktiv ! - - L "MW200" - T Error // Schnittstelle nach Außen - -// Störung vorhanden: - L 0 - <>I // Ja ! - = Dyn.Status.Error_aktiv - CLR // Es gibt keine Quittier-Störung! - A Dyn.Sk.Err_Uebzeit - S hStOk - -// Störungen pro Zyklus neu erzeugen: - SET - R Dyn.Error.Leerpuffer_DL // Leerpuffer-Datenliste fehlerhaft - R Dyn.Error.Undef_Leerpuffer // undefiniertes Leerpuffer -// / R #Dyn.Error.Err_Trolley_nicht_in_Schleuse//Trolley fährt nicht in Schleuse -// / R #Dyn.Error.Err_Uebzeit //Überwachungzeit ist abgelaufen - R Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert -// / R #Dyn.Error.Err_Stau_Einfahrt//Stau am Leerpuffer-Eingang - R Dyn.Error.Err_BLKMov -// / R #Dyn.Error.Err_Trolley_raus//Trolley fährt nicht aus -// / R #Dyn.Error.Err_Leerpuffer_nicht_leer//Trolley ohne Daten vorhanden - R Dyn.Error.Err_Raus_Sensor - - AN Dyn.Sk.Err_Uebzeit - R Dyn.Error.Err_Trolley_nicht_in_Schleuse // Trolley fährt nicht in Schleuse - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - - ---- NW 7: Statische Leerpuffer-Parameter holen --- - L Puffer.LeerPuffer_Nr // Nummer des Leerpuffers - L LeerPuffer_Nr // Aufruf-Parameter - ==I // Identisch ? - R Dyn.Error.Leerpuffer_DL // Leerpufferdatenbank fehlerhaft - R Dyn.Error.Undef_Leerpuffer // undefiniertes Leerpuffer - JC en06 // Ja ! - - T "MW200" // Search-Daten - -CALL FC "DatenOut" (SSDB:=Para.Leerpuffer_DL_DB, SSDW:=Para.Leerpuffer_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:=Dyn.Rueckmld.RET_VAL_DL_Leerpuffer, OUTDATEN:=P#M220.0, Position:="MW196") - - JBI G_Ok - - A "M199.0" - JCN w060 - - SET - = Dyn.Error.Leerpuffer_DL // Leerpufferdatenbank fehlerhaft - - L 16#A071 - T Dyn.Stop_Ursache - - BEU - -w060: SET - S Dyn.Error.Undef_Leerpuffer // undefinierter Leerpuffer - - L 16#0072 - T Dyn.Stop_Ursache - - BEU - -// Kennung + Datenbytes -G_Ok: SET - R Dyn.Error.Leerpuffer_DL // Gefälledatenbank fehlerhaft - R Dyn.Error.Undef_Leerpuffer // undefinierte Gefällestrecke - - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 20 // Datenwords speichern - T LW2 // Wiederholungen - -// Quelle-Pointer erzeugen: - L 0 // Bei Merker = 0 ! - T LW4 // DB_Nummer - L 220 // Adresse - SLD 3 - L 16#8300_0000 // Kennung: Merker - OD - T LD6 // Kennung, Adresse +FUNCTION_BLOCK "MHMLeerpuffer" +TITLE = Omni H&M-Leerpuffer-Modul +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-960629 +// +//Version: H&M Leerpuffer / 10.2025 +// +//Version: Omniflow 2100 / 10.2024 +// +//Schritt 0: Warten auf Trolley +//Schritt 1: Trolley ist in Schleuse / Warten auf Bit "Einen Trolley ausfahren" +//Schritt 2: Ausfahren ok ? +//Schritt 5: Trolley fährt aus/ausgefahren ? Schritt 6: Schleuse Mindestzeit geöffnet ? Schritt 7: Trolleydaten ändern +//Schritt 20: Schleuse resetten +//Schritt 21: Reset ist zu Ende +// + VAR_INPUT + LeerPuffer_Nr { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Aufruf für Leer-Puffer + ErrQuit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Ablaufstörung quittieren + B_LeerpufferEinfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley fährt in Leerpuffer + B_InSchleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley ist in Schleuse unten + B_AusSchleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley hat Schleuse unten verlassen + B_Stau_raus_Out { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Stau im Bereich unten rausfahren + B_QuerTrolley_Out : Bool; // Crash-Trolley auf Crashkurs erkannt + Antrieb_plus_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Kreisel-Antrieb plus aktiv + Schleuse_geöffnet : Bool; // Schleuse unten hat geöffnet + END_VAR + + VAR_OUTPUT + Y_Schleuse_Auf { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse unten öffnen + Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Störungen übergeben + END_VAR + + VAR_IN_OUT + Start_Ok : Bool; // Starten von ausserhalb ist erlaubt + Antrieb_plus_vor { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Antrieb plus vorfahren + Antrieb_plus_stoppen : Bool; // Antrieb plus stoppen + hStOk : Bool; // Anzeige Start n. Störung aktivieren + Ausfahr_Inks : Int; // Rest-Inks, wo sich Trolley befindet + END_VAR + + VAR + Res16 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..2] of Int; // Reserve + SAVE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Weichen_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Weichen-FIFO-DB + Weichen_DW { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Weichen-FIFO-DW + END_STRUCT; + Para { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // Parameter + Leerpuffer_DL_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung Leerpuffer-Datenliste-DB + Leerpuffer_DL_DW { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung Leerpuffer-Datenliste-DW + Res1 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..2] of Int; // Reserve + END_STRUCT; + Status2 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Einlagern_ist_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer mit Einlagern aktiv + Auslagern_ist_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer mit Auslagern aktiv + Eintrag_DL_Leerliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLLPPuffer_leer (DB500) erfolgt + Eintrag_DL_Reinliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLLPPuffer_Einfahren (DB501) erfolgt + Eintrag_Abrufliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLLPPuffer_Ausfahren (DB502) erfolgt + END_STRUCT; + Puffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "UDLHMLeerPuffer"; // Statische Leerpufferdaten (aus DL) + Dyn : Struct // Dynamische Daten + Status { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Puffer_leer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer ist leer + "Puffer_hat Platz" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer hat noch Kapazität + Kein_neuer_Trolley_kommt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Leerpuffer zeitlang ohne neuen Trolley + Leer_Check_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Leerpuffer wird auf leer gecheckt + Reset_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Reset aktiv + Trolley_nicht_in_Schleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt nicht in Schleuse > Inilauf gestartet + Puffer_nicht_leer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer nicht leer > Inilauf gestartet + Leerpuffer_initialisieren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Leerpuffer initialisieren + MindestZeit_ok { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse ist MindestZeit geöffnet + Res711 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + Res712 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + "Trolley_wartet_Bereich+1" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Auslagerstrecke noch belegt + Einen_LeerTrolley_ausfahren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Einen Leer-Trolley ausfahren + Trolley_fährt_aus { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt aus Puffer + Trolley_draussen { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley ist ausgefahren (1 Zyklus) + Error_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Störung vorhanden + END_STRUCT; + TrolleyID_Einfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-Nr ist eingefahren + HMI : Struct + Trolleys_LeerPuffer { ExternalWritable := 'False'} : Int; // Anzahl Trolleys unten (IN:PLC, OUT:PLC) + Res_Trolleys_LeerPuffer { ExternalWritable := 'False'} : Int; // Anzahl reservierte Trolleys oben (IN:PLC, OUT:PLC) + Frei_Plätze_LeerPuffer { ExternalWritable := 'False'} : Int; // Freiplätze für Trolleys (IN:PLC, OUT:PLC) + Schleuse_resetten_Leerpuffer : Bool; // Schleuse resetten unten (IN:HMI, Out:PLC) + LeerPuffer_initialisieren : Bool := 1; // Leerpuffer initialisieren (IN:HMI, Out:PLC) + Einlagern_gesperrt : Bool; // Einlagern gesperrt (IN:HMI, OUT:HMI) + AusLagern_gesperrt : Bool; // AusLagern gesperrt (IN:HMI, OUT:HMI) + END_STRUCT; + Sk { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "USk_Omni" := ((), (), (), (), (), (), (), (), (), (), 1, (), (), (), (), (), ()); // Status der Schrittkette Schleuse OUT (unten) + Rueckmld { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + RET_VAL_BLKMOV_Leerpuffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Rückmeldung nach BLKMOV-Aufruf + RET_VAL_DL_Leerpuffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf + RET_VAL_DL_Res { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf + RET_VAL_DL_LeerpufferTrolley_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenIN-Aufruf + RET_VAL_DL_LeerpufferTrolley { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf + END_STRUCT; + Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : "UErrHMLeerPuffer"; + Stau_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Sensor B_Einfahrt ist belegt [1s] + Mindest_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Sensor B_in_Schleuse unten ist frei [1s] + Leer_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Puffer unten ist frei [1s] + Stop_Ursache { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Stop-Stelle: Nw + Position + Vereinzelungstakte { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Anzahl der getätigten Vereinzelungstakte + TrolleyID_ausgefahren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // TrolleyID des ausgefahrenen Trolleys + Res200 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..38] of Int; + Reservierungs_DL { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // AB DW200: Liste der resevierter Trolleys + Datenlistenkopf { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + KOPF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DA02; // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128) + LAENGE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 24; // Länge der Datenliste (maximale Anzahl der Datensätze) + STAMMDATEN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 2; // Stammdatenlänge in Word (1 - 9) + INDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) + LAENGEINDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!) + INDDATEN_WANDEL_FC { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) + LETZTERZUGRIFF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Speicherung des letzten Zugriffs + Belegt14 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // reserviert von Sort-Datenliste + AnzahlEintraege { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!) + Reserve18 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Reserve + END_STRUCT; + Res_Trolley { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..24] of Struct // Reservierter Trolley für Leerpuffer + Trolley_ID { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley_ID + END_STRUCT; + Endekennung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DAEE; // Datensort-Ende-Kennung (DBEE) + END_STRUCT; + Res350 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..16] of Int; + Anzahl_LeerTrolleys { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // AB DW350: Liste der Trolleys im Leerpuffer + Res500 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..74] of Int; + END_STRUCT; + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Ueb_akt : Bool; // Überwachungszeit aktivieren + Weiter : Bool; // Weiterschaltbedingung ist erfüllt + Warte_neu : Bool; // Wartezeit neu triggern + Warte_stop : Bool; // Wartezeit stoppen + Neu_Trolley_in_Puffer : Bool; // Neuer Trolley in Puffer eingefahren + Inks_Ok : Bool; // Starten aufgrund der Inks erlaubt + GesamtAnzahl : Int; + SSDW : Int; + END_VAR + + +BEGIN +NETWORK +TITLE = Parameter-Übergabe + L #LeerPuffer_Nr; + + L 275 ;//Einsprung Puffer-DL + T #Para.Leerpuffer_DL_DB;//vor Aufruf übergeben! + L 0; + T #Para.Leerpuffer_DL_DW; + +NETWORK +TITLE = Anzeige OP + L 252;//Bereichsstop aktiv + UN #Dyn.Sk.Bereich_ok;//Also: Bereichsstop / Not-Aus + SPB w010; + + L 253; + UN #Dyn.Sk.Auto_akt;//Keine Betriebsart + UN #Dyn.Sk.Hand_akt; + SPB w010; + + L 255;//Handbetrieb aktiv + U #Dyn.Sk.Hand_akt; + SPB w010; + + L #Dyn.Sk.Akt_Schritt;//Aktiver Schritt + T #Dyn.Sk.OP_Schritt; + + SPA OP_Ok; + +w010: T #Dyn.Sk.OP_Schritt; + +OP_Ok: NOP 0; + +NETWORK +TITLE = Out-Bits zum Zurücksetzen / Antrieb plus starten + SET ;//Jeden Zyklus neu + R #Y_Schleuse_Auf; + R #Neu_Trolley_in_Puffer; + R #Dyn.Status."Trolley_wartet_Bereich+1"; + R #Dyn.Status.Trolley_fährt_aus; + R #Dyn.Status.Trolley_draussen; + + U #Dyn.Sk.Reset; + O #Dyn.Sk.Reset_Akt; + = #Dyn.Status.Reset_aktiv; + + SET; + R #Inks_Ok; + +//Antrieb zusätlich starten: + U #ErrQuit ;//Überwachungszeit abgelaufen quittieren + S #Antrieb_plus_vor;//Kreisel-Antrieb plus starten + +NETWORK +TITLE = HMI-Zeug + +//Von HMI: + U #Dyn.HMI.Schleuse_resetten_Leerpuffer; + R #Dyn.HMI.Schleuse_resetten_Leerpuffer; + S #Dyn.Sk.Reset ;//SK zurücksetzen + + U #Dyn.HMI.LeerPuffer_initialisieren; + S #Dyn.Status.Leerpuffer_initialisieren; + R #Dyn.HMI.LeerPuffer_initialisieren; + + U #Dyn.HMI.Einlagern_gesperrt;//Wird unten direkt verarbeitet + + U #Dyn.HMI.AusLagern_gesperrt;//Wird unten direkt verarbeitet + + CLR; + +//An HMI: + + L #Dyn.Anzahl_LeerTrolleys; + T #Dyn.HMI.Trolleys_LeerPuffer; + + L #Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege; + T #Dyn.HMI.Res_Trolleys_LeerPuffer; + + L #Puffer.MaxAnzahl_LeerPuffer; + L #Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege; + -I; + L #Dyn.Anzahl_LeerTrolleys; + -I; + T #Dyn.HMI.Frei_Plätze_LeerPuffer; + +NETWORK +TITLE = Schrittkette OUT zurücksetzen + UN #Dyn.Sk.Reset;//SK zurücksetzen + SPB en04; + +//Schrittkette zurücksetzen: + L 0;//Schritt 0: Warten + T #Dyn.Sk.Akt_Schritt; + + L 0;//Zeitwert löschen + T #Dyn.Sk.Terr_Zelle; + T #Dyn.Sk.Tok_Zelle; + T #Dyn.Leer_Zeit ;//Zeit für LeerCheck [1s] + + SET; + R #Dyn.Status.Einen_LeerTrolley_ausfahren; + R #Dyn.Error.Err_BLKMov;//Error bei Block kopieren + R #Dyn.Sk.Reset;//SK zurücksetzen + R #Dyn.Sk.Err_Schritt;//Undefinierter Schritt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + S #Dyn.Sk.Reset_Akt;//Reset ist aktiv + + SET; + R #Dyn.Error.Leerpuffer_DL;//Leerpuffer-Datenliste fehlerhaft + R #Dyn.Error.Undef_Leerpuffer;//undefiniertes Leerpuffer + R #Dyn.Error.Err_Uebzeit;//Überwachungzeit ist abgelaufen + R #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert + R #Dyn.Error.Err_Stau_Einfahrt;//Stau am Leerpuffer-Eingang + R #Dyn.Error.Err_BLKMov; + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + + L 0; + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + T #Dyn.Mindest_Zeit ;//Sensor B_VorSep ist frei [1s] + T #SAVE.Weichen_DB; + T #SAVE.Weichen_DW; + +//Defaultwerte übergeben: + L 0 ;//Damit statische Werte neu aus Datenbank geholt werden ! + T #Puffer.LeerPuffer_Nr;//Nummer des Leerpuffers + + BEA; + +en04: NOP 0; + +NETWORK +TITLE = Störungen nach Außen übergeben + L 0; + T "MW200"; + + U #Dyn.Error.Leerpuffer_DL;//Leerpuffer-Datenliste fehlerhaft + = "M200.0"; + U #Dyn.Error.Undef_Leerpuffer;//undefinierter Leerpuffer + = "M200.1"; + U #Dyn.Error.Err_Trolley_nicht_in_Schleuse;//Trolley fährt nicht in Schleuse + UN #Dyn.Status.Leerpuffer_initialisieren; + = "M200.2"; + U #Dyn.Sk.Err_Uebzeit; + UN #Dyn.Error.Err_Trolley_nicht_in_Schleuse;//Trolley fährt nicht in Schleuse + UN #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + = #Dyn.Error.Err_Uebzeit;//Überwachungzeit ist abgelaufen + = "M200.3"; + NOT; + R #Dyn.Sk.Err_Uebzeit_AnzOk; + U #Dyn.Sk.Err_Schritt; + = #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert + = "M200.4"; + U #Dyn.Error.Err_Stau_Einfahrt;//Stau am Leerpuffer-Eingang + = "M200.5"; + U #Dyn.Error.Err_BLKMov;//Error bei Block kopieren + = "M200.6"; + U #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + = "M200.7"; + U #Dyn.Error.Err_Leerpuffer_nicht_leer; + UN #Dyn.Status.Leerpuffer_initialisieren; + = "M201.0"; + CLR; + = "M201.1"; + = "M201.2"; + = "M201.3"; + = "M201.4"; + U #Dyn.Error.Err_Raus_Sensor; + = "M201.5"; + CLR; + = "M201.6"; + U #Dyn.Sk.Reset_Akt;//Reset ist aktiv + = #Dyn.Error.Reset_aktiv; + = "M201.7"; + +//Andere Meldung als Überwachungszeit aktiv ?: + L "MW200"; + L 2#1111_0111_1111_1111; + UW; + L 2#0000_0000_0000_0000;//Andere Meldung als Üb.zeit aktiv ? + <>I;//Ja ! + ON #Dyn.Sk.Err_Uebzeit_AnzOk;//Störung anzeigen ok, da 2.Zyklus aktiv ! + R "M200.3";//Üb.Zeit-Meldung nicht an PC senden + + U #Dyn.Sk.Err_Uebzeit; + S #Dyn.Sk.Err_Uebzeit_AnzOk;//Störung anzeigen ok, da 2.Zyklus aktiv ! + + L "MW200"; + T #Error;//Schnittstelle nach Außen + +//Störung vorhanden: + L 0; + <>I;//Ja ! + = #Dyn.Status.Error_aktiv; + CLR;//Es gibt keine Quittier-Störung! + U #Dyn.Sk.Err_Uebzeit; + S #hStOk; + +//Störungen pro Zyklus neu erzeugen: + SET; + R #Dyn.Error.Leerpuffer_DL;//Leerpuffer-Datenliste fehlerhaft + R #Dyn.Error.Undef_Leerpuffer;//undefiniertes Leerpuffer +/// R #Dyn.Error.Err_Trolley_nicht_in_Schleuse//Trolley fährt nicht in Schleuse +/// R #Dyn.Error.Err_Uebzeit //Überwachungzeit ist abgelaufen + R #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert +/// R #Dyn.Error.Err_Stau_Einfahrt//Stau am Leerpuffer-Eingang + R #Dyn.Error.Err_BLKMov; +/// R #Dyn.Error.Err_Trolley_raus//Trolley fährt nicht aus +/// R #Dyn.Error.Err_Leerpuffer_nicht_leer//Trolley ohne Daten vorhanden + R #Dyn.Error.Err_Raus_Sensor; + + UN #Dyn.Sk.Err_Uebzeit; + R #Dyn.Error.Err_Trolley_nicht_in_Schleuse;//Trolley fährt nicht in Schleuse + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + +NETWORK +TITLE = Statische Leerpuffer-Parameter holen + L #Puffer.LeerPuffer_Nr;//Nummer des Leerpuffers + L #LeerPuffer_Nr;//Aufruf-Parameter + ==I;//Identisch ? + R #Dyn.Error.Leerpuffer_DL;//Leerpufferdatenbank fehlerhaft + R #Dyn.Error.Undef_Leerpuffer;//undefiniertes Leerpuffer + SPB en06;//Ja ! + + T "MW200";//Search-Daten + + CALL "DatenOut" + ( SSDB := #Para.Leerpuffer_DL_DB , + SSDW := #Para.Leerpuffer_DL_DW , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := #Dyn.Rueckmld.RET_VAL_DL_Leerpuffer , + OUTDATEN := P#M220.0 , + Position := "MW196" + ); + + SPBI G_Ok; + + U "M199.0"; + SPBN w060; + + SET; + = #Dyn.Error.Leerpuffer_DL;//Leerpufferdatenbank fehlerhaft + + L 16#A071; + T #Dyn.Stop_Ursache; + + BEA; + +w060: SET; + S #Dyn.Error.Undef_Leerpuffer;//undefinierter Leerpuffer + + L 16#0072; + T #Dyn.Stop_Ursache; + + BEA; + +//Kennung + Datenbytes +G_Ok: SET; + R #Dyn.Error.Leerpuffer_DL;//Gefälledatenbank fehlerhaft + R #Dyn.Error.Undef_Leerpuffer;//undefinierte Gefällestrecke + + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 20;//Datenwords speichern + T %LW2;//Wiederholungen + +//Quelle-Pointer erzeugen: + L 0;//Bei Merker = 0 ! + T %LW4;//DB_Nummer + L 220;//Adresse + SLD 3; + L 16#8300_0000;//Kennung: Merker + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #Dyn.Rueckmld.RET_VAL_BLKMOV_Leerpuffer , + DSTBLK := #Puffer //#Ziel + ); + + L 16#0073; + T #Dyn.Stop_Ursache; + + L #Dyn.Rueckmld.RET_VAL_BLKMOV_Leerpuffer;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Dyn.Error.Err_BLKMov ;//Error bei Block kopieren + BEB; + + L #Puffer.Puffer_Typ ;//Puffertyp = 1277 (Leerpuffer) + L 1277 ;//Dieser Aufruf-FB ? + ==I;//Ja ! + SPB w061; + + SET; + S #Dyn.Error.Undef_Leerpuffer;//undefinierter Leerpuffer + + L 0 ;//Leerpuffer ungültig ! + T #Puffer.LeerPuffer_Nr;//Nummer des Leerpuffers + + L 16#0074; + T #Dyn.Stop_Ursache; + + BEA; + +//Defaultwerte übergeben: +w061: NOP 0; + + BEA; + +en06: NOP 0; + +NETWORK +TITLE = Störungen quittieren + U #ErrQuit ;//Überwachungszeit abgelaufen quittieren + R #Dyn.Sk.Err_Uebzeit; + +NETWORK +TITLE = Einfahrenden Trolley in Puffer eintragen + L #Dyn.TrolleyID_Einfahrt; + T "MD220"; + L DINT#0; + ==I; + SPB NoNewT; + + SET; + S #Neu_Trolley_in_Puffer; + +//Neue Position an Gesamt-Trolley-DL übergeben: + CALL "Trolley_DL_Neue_Pos" + ( Gesamt_Trolley_DL := #Puffer.Gesamt_Trolley_DL , + TrolleyID := #Dyn.TrolleyID_Einfahrt , + Position := #Puffer.Puffer_Position , + ShopGroup := Dint#0 , + Err := "M199.0" + ); + +//Daten Puffer eintragen checken: + L #Dyn.Anzahl_LeerTrolleys; + + 1; + T #Dyn.Anzahl_LeerTrolleys; + +//Austrag aus Trolley-Reservierungsliste + L #Dyn.TrolleyID_Einfahrt;//Eintrag ist erfolgt + T "MD220"; + +ResOut: L #Puffer.Puffer_Dyn_DW; + L #Puffer.PufferReservierungsliste_DW; + +I; + T #SSDW; + + CALL "DatenOut" + ( SSDB := #Puffer.Puffer_Dyn_DB , + SSDW := #SSDW , + PARA := 16#E100 , //Eintrag löschen + SEARCHDATEN := P#M220.0 , + RE_VAL := #Dyn.Rueckmld.RET_VAL_DL_Res , + OUTDATEN := P#M220.0 , //Nicht relevant + Position := "MW196" + ); + + L DINT#0; + T #Dyn.TrolleyID_Einfahrt; + +NoNewT: NOP 0; + +NETWORK +TITLE = Error: Stau Bereich-Eingang + +//Sensor bei Bereichs-Einfahrt bleibt belegt?: + UN #B_LeerpufferEinfahrt ;//Sensor Trolley fährt in Bereich (kein Stau !) + R #Dyn.Error.Err_Stau_Einfahrt;//Stau bei Einfahrt + SPB X090 ;//StauZeit neu aufziehen + + UN "1s-Impuls"; + O #Dyn.Error.Err_Stau_Einfahrt;//Zeit bereits abgelaufen + SPB Xn09; + + L #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + + +1; + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + + L 25 ;//Stau-Zeit erreicht ? + >=I;//Ja ! + S #Dyn.Error.Err_Stau_Einfahrt;//Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb + SPBN Xn09; + +X090: L 0 ;//Zeiten löschen + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + +Xn09: NOP 0; + +NETWORK +TITLE = Schleuse: Mindestzeit geöffnet/frei, Position-Inks übergeben + L #Dyn.Sk.Akt_Schritt; + L 6 ;//Mindestzeit ok? + <>I;//Nein! + O #B_InSchleuse ;//Sensor Trolley in Schleuse vorhanden + ON #Schleuse_geöffnet;//Schleuse hat geöffnet + R #Dyn.Status.MindestZeit_ok; + SPB X100 ;//FreiZeit neu aufziehen + + UN "1s-Impuls"; + O; + U #Puffer.Parameter_allg.Antrieb_Plus_vorhanden; + UN #Antrieb_plus_aktiv; + O #Dyn.Status.MindestZeit_ok;//Zeit bereits abgelaufen + SPB Xn10; + + L #Dyn.Mindest_Zeit ;//Sensor B_im_Sep ist frei [1s] + + +1; + T #Dyn.Mindest_Zeit ;//Sensor B_im_Sep ist frei [1s] + + L #Puffer.Mindeszeit_Schleuse_geoeffnet ;//Mindest-Zeit erreicht ? + >=I;//Ja ! + S #Dyn.Status.MindestZeit_ok; + SPBN Xn10; + +X100: L 0 ;//Zeiten löschen + T #Dyn.Mindest_Zeit ;//Sensor B_im_Sep ist frei [1s] + +//Schleuse geöffnet: (Position-Inks übergeben) +Xn10: UN #Schleuse_geöffnet ;//Schleuse hat geöffnet + SPB X10E; + + L #Ausfahr_Inks; + L #Puffer.Puffer_Position_Inks; + >I;//Rest-Inks-Wert ist größer! + SPB X10E; + + L #Puffer.Puffer_Position_Inks; + T #Ausfahr_Inks; + +X10E: NOP 0; + +NETWORK +TITLE = Keine neue Trolley-Einfahrt ? + +//Neu-Trolley ist im Puffer: + U #Neu_Trolley_in_Puffer;//s.o. + O #B_LeerpufferEinfahrt;//Stauklappe + SPB X110; + + UN "1s-Impuls"; + O #Dyn.Status.Kein_neuer_Trolley_kommt; + SPB Xn11; + + L #Dyn.Leer_Zeit ;//Zeit für LeerCheck [1s] + + +1; + T #Dyn.Leer_Zeit ;//Zeit für LeerCheck [1s] + + L #Puffer.Wartezeit_bis_Puffer_leer;//Leer-Zeit erreicht ? + >=I;//Ja ! + SPBN Xn11; + + T #Dyn.Leer_Zeit ;//Zeit für LeerCheck einfrieren + + SET; + S #Dyn.Status.Kein_neuer_Trolley_kommt; + + SPA Xn11; + +X110: L 0 ;//Zeiten löschen + T #Dyn.Leer_Zeit; + + SET; + R #Dyn.Status.Kein_neuer_Trolley_kommt; + +Xn11: NOP 0; + +NETWORK +TITLE = Reservierungs-Check + L #Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege; + L 0; + ==I; + O "MB3305";//Trolley wird gerade vereinzelt + O "BG3306";//Synchron-Sensor aktiv + SPB NoResCheck ;//Später -> Hauptstrangdaten checken! + +//Trolleys noch unterwegs ? + L "LP_TravelFIFO".Travel_FIFO_BG3306.FIFO.ANZAHL; + L "LP_HS_oF".Datensortkopf.AnzahlEintraege; + +I; + L "LP_HS_mF".Datensortkopf.AnzahlEintraege; + +I; + L 0;//Es sind noch Trolleys unterwegs + <>I; + SPB NoResCheck; + + L #Dyn.Reservierungs_DL.Res_Trolley[1].Trolley_ID; + T "MD220"; + + SPA ResOut; + +NoResCheck: NOP 0; + +NETWORK +TITLE = Leer-Check aktiv + +//Falls Inilauf aktiv: + U #Dyn.Status.Leerpuffer_initialisieren; + UN #Dyn.Status.Leer_Check_aktiv; + S #Dyn.Status.Leer_Check_aktiv; + SPBN Check;//Negierter Sprung + + L 0 ;//Zeiten neu aufziehen + T #Dyn.Leer_Zeit; + + SET; + R #Dyn.Status.Kein_neuer_Trolley_kommt; + +Check: NOP 0; +//Inilauf, kein Daten aber Trolley ist in Schleuse: + U #Dyn.Status.Leerpuffer_initialisieren; + U #B_InSchleuse; + U(; + L #Dyn.Anzahl_LeerTrolleys; + L 0; + ==I; + ); + UN #Dyn.Status.Einen_LeerTrolley_ausfahren; + S #Dyn.Status.Einen_LeerTrolley_ausfahren ;//Trolley zwingend ausfahren + +//Abbruch, da Trolley ist doch noch in Schleuse gefahren: + U #Dyn.Status.Leerpuffer_initialisieren; + U #B_InSchleuse; + U(; + L #Dyn.Anzahl_LeerTrolleys;//Anzahl wurde eingetragen + L 0; + >I; + O #Dyn.Status.Trolley_nicht_in_Schleuse; + ); + R #Dyn.Status.Leerpuffer_initialisieren; + R #Dyn.Status.Trolley_nicht_in_Schleuse; + R #Dyn.Status.Leer_Check_aktiv; + + UN #Dyn.Status.Leer_Check_aktiv; + SPB Xn12; + +//Trolley während Check erkannt: + UN #Dyn.Status.Kein_neuer_Trolley_kommt;//nichts mehr eingefahren, + SPB Xn12; + +//Aber: + U #Schleuse_geöffnet ;//aber Schleuse noch geöffnet + O #B_InSchleuse;//aber Trolley noch in Schleuse + SPBN Fertig ;//Negierter Sprung + + L 0 ;//Zeit neu aufziehen + T #Dyn.Leer_Zeit; + + SET; + R #Dyn.Status.Kein_neuer_Trolley_kommt; + + SPA Xn12; + +Fertig: SET; + R #Dyn.Status.Leer_Check_aktiv; + R #Dyn.Status.Trolley_nicht_in_Schleuse; + + U #Dyn.Status.Leerpuffer_initialisieren; + R #Dyn.Status.Leerpuffer_initialisieren; + SPBN Reset ;//Negierter Sprung + + L 0; + T #Dyn.Anzahl_LeerTrolleys;//Minimum übergeben + + SPA Xn12 ;//Nicht mehr wegen Gefahr der Überfüllung, besser Reservierungen checken + +//Reservierungs-Liste löschen: + L #Puffer.Puffer_Dyn_DW; + L #Puffer.PufferReservierungsliste_DW; + +I; + T #SSDW; + + CALL "DatenReset" + ( SSDB := #Puffer.Puffer_Dyn_DB , + SSDW := #SSDW , + RE_VAL := "MB198" + ); + + SPA Reset; + +Xn12: NOP 0; + +NETWORK +TITLE = Reset aktiv + SPA En14; + +Reset: SET; + R #Dyn.HMI.LeerPuffer_initialisieren;//Button-Anzeige wieder normal + R #Dyn.Status.Trolley_nicht_in_Schleuse; + R #Dyn.Status.Puffer_nicht_leer; + R #Status2.Eintrag_DL_Leerliste_erfolgt; + R #Status2.Eintrag_DL_Reinliste_erfolgt; + R #Status2.Eintrag_Abrufliste_erfolgt; + R #Dyn.Error.Err_Raus_Sensor; + + L 0; + T #Dyn.Leer_Zeit; + T #Puffer.LeerPuffer_Nr;//Nummer des Leerpuffers (damit Leerpufferdaten neu geholt werden!) + +En14: NOP 0; + +NETWORK +TITLE = Puffer hat Platz / ist frei / Einlagern aktiv + +//Puffer hat Platz: + L #Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege; + L #Dyn.Anzahl_LeerTrolleys; + +I; + T #GesamtAnzahl; + L #Puffer.MaxAnzahl_LeerPuffer; + I; + U #Dyn.Status."Puffer_hat Platz"; + UN #Status2.Auslagern_ist_aktiv; + S #Status2.Einlagern_ist_aktiv; + + U #Status2.Auslagern_ist_aktiv;//Wegen FIFO + O #Dyn.HMI.Einlagern_gesperrt; + R #Status2.Einlagern_ist_aktiv; + +NETWORK +TITLE = Starten aus Leerpuffer aufgrund von Ausfahrsituation ok + L #Puffer.Puffer_Position_Inks; + L 0;//Undefiniert ? + ==I;//Ja! + SPB X14E; + + L #Ausfahr_Inks ;//Trolles auf Förderer vorbei? + L 0;//Undefiniert ? + ==I;//Ja! + SPB X14E; + + L #Puffer.Puffer_Position_Inks; + L 20;//damit vorbeifahrender Trolley größeren Abstand bekommt + -I; + L #Ausfahr_Inks ;//Trolleys auf Förderer vorbei? + >I;//Ja! + O(; + L 1;//Minimalwert ? + ==I;//Ja ! + ); + = #Inks_Ok; + +X14E: NOP 0; + +NETWORK +TITLE = DLPuffer_leer: Ein-/Austrag + UN #Dyn.Status.Puffer_leer;//Kann mit neuen Leertrolleys bestückt werden! + O #Dyn.HMI.Einlagern_gesperrt; + O #Dyn.Status.Leerpuffer_initialisieren; + SPB Austrag_Leerliste; + +//Eintrag aus Leerliste: + L #LeerPuffer_Nr; + T "MW220" ;//Puffer, der leer ist + + CALL "DatenIn"//Anforderung in Datenliste eintragen + ( SSDB := 500 , + SSDW := 0 , + INDATEN := P#M220.0 , + RE_VAL := "MB219" + ); + + UN "M219.6";//Daten wurden überschrieben + UN "M219.7";//Eintrag ist richtig erfolgt + SPB NoChange_Leerliste; + + SET; + S #Status2.Eintrag_DL_Leerliste_erfolgt; + + SPA NoChange_Leerliste; + +Austrag_Leerliste: NOP 0; +//Austrag aus Leerliste: + L #LeerPuffer_Nr; + T "MW220" ;//Puffer, der leer ist + + CALL "DatenOut"//Anforderung aus Datenliste löschen + ( SSDB := 500 , + SSDW := 0 , + PARA := WORD#16#E100 , + SEARCHDATEN := P#M220.0 , + RE_VAL := "MB219" , + OUTDATEN := P#M230.0 , + Position := "MW196" + ); + + SET; + R #Status2.Eintrag_DL_Leerliste_erfolgt; + +NoChange_Leerliste: NOP 0; + +NETWORK +TITLE = DLPuffer_einfahren: Ein-/Austrag + UN #Dyn.Status."Puffer_hat Platz";//Puffer hat kein Platz mehr + ON #Status2.Einlagern_ist_aktiv; + O #Dyn.HMI.Einlagern_gesperrt; + O #Dyn.Status.Leerpuffer_initialisieren; + R #Status2.Einlagern_ist_aktiv; + SPB Austrag_Reinliste; + +//Eintrag in Reinliste: + U(; + L #Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege; + L 0;//Reservierung schon erfolgt ? + >I;//Ja! + O #Status2.Einlagern_ist_aktiv; + ); + SPBN NoChange_Reinliste ;//Negierter Sprung + + L #LeerPuffer_Nr ;//angefahrener Puffer + T "MW220"; + + CALL "DatenIn"//Anforderung in Datenliste eintragen + ( SSDB := 501 , + SSDW := 0 , + INDATEN := P#M220.0 , + RE_VAL := "MB219" + ); + + UN "M219.6";//Daten wurden überschrieben + UN "M219.7";//Eintrag ist richtig erfolgt + SPB NoChange_Reinliste; + + SET; + S #Status2.Eintrag_DL_Reinliste_erfolgt; + + SPA NoChange_Reinliste; + +Austrag_Reinliste: NOP 0; +//Austrag aus Reinliste: + L #LeerPuffer_Nr; + T "MW220"; + + CALL "DatenOut"//Anforderung aus Datenliste löschen + ( SSDB := 501 , + SSDW := 0 , + PARA := WORD#16#E100 , + SEARCHDATEN := P#M220.0 , + RE_VAL := "MB219" , + OUTDATEN := P#M230.0 , + Position := "MW196" + ); + + SET; + R #Status2.Eintrag_DL_Reinliste_erfolgt; + +NoChange_Reinliste: NOP 0; + +NETWORK +TITLE = DLPuffer_ausfahren: Ein-/Austrag + U #Dyn.Status.Puffer_leer;//Kann mit neuen Leertrolleys bestückt werden! + UN #Dyn.Error.Err_Leerpuffer_nicht_leer;//Damit Trolley ausgefahren werden kann! + O #Dyn.HMI.AusLagern_gesperrt; + R #Dyn.Status.Einen_LeerTrolley_ausfahren; + SPB Austrag_Abrufliste; + +//Eintrag aus Abrufliste: + U #B_InSchleuse ;//Sobald Trolley in Ausfahrschleuse + SPBN NoChange_Abrufliste;//Negierter Sprung + + L #LeerPuffer_Nr ;//angefahrener Puffer + T "MW220"; + + CALL "DatenIn"//Anforderung in Datenliste eintragen + ( SSDB := 502 , + SSDW := 0 , + INDATEN := P#M220.0 , + RE_VAL := "MB219" + ); + + UN "M219.6";//Daten wurden überschrieben + UN "M219.7";//Eintrag ist richtig erfolgt + SPB NoChange_Abrufliste; + + SET; + S #Status2.Eintrag_Abrufliste_erfolgt; + + SPA NoChange_Abrufliste; + +Austrag_Abrufliste: NOP 0; +//Austrag aus Abrufliste: +Austrag: L #LeerPuffer_Nr ;//angefahrener Puffer + T "MW220"; + + CALL "DatenOut"//Anforderung aus Datenliste löschen + ( SSDB := 502 , + SSDW := 0 , + PARA := WORD#16#E100 , + SEARCHDATEN := P#M220.0 , + RE_VAL := "MB219" , + OUTDATEN := P#M230.0 , + Position := "MW196" + ); + + SET; + R #Status2.Eintrag_Abrufliste_erfolgt; + +NoChange_Abrufliste: NOP 0; + +NETWORK +TITLE = Schrittkette anhalten + U #Dyn.Sk.Auto_akt;//Automatik ist aktiv + U #Dyn.Sk.Bereich_ok; + SPA en08_Mig;//Schrittkette nicht anhalten ! + + SET;//Störungen löschen + R #Dyn.Sk.Err_Uebzeit; + R #Dyn.Sk.Err_Schritt; + + L 0;//Zeitwerte löschen + T #Dyn.Sk.Terr_Zelle; + T #Dyn.Sk.Tok_Zelle; + + BEA; + +en08_Mig: NOP 0; + +NETWORK +TITLE = Sprungverteiler +OUT_Sk: L #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + L -1;//angegeben ? + ==I;//Nein ! + SPB NEU; + + TAK;//Neuen Schritt übergeben + T #Dyn.Sk.Akt_Schritt; + + L -1;//Urzustand + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + +NEU: SET; + R #Ueb_akt ;//Überwachungszeit aktivieren + R #Warte_neu;//Wartezeit neutriggern + R #Warte_stop;//Wartezeit stoppen + + L #Dyn.Sk.Akt_Schritt; + SPL Ende; + SPA s000;//Schritt 0 + SPA s001;//Schritt 1 + SPA s002;//Schritt 2 + SPA s003;//Schritt 3 + SPA s004;//Schritt 4 + SPA s005;//Schritt 5 + SPA s006;//Schritt 6 + SPA s007;//Schritt 7 + SPA s008;//Schritt 8 + SPA s009;//Schritt 9 + SPA s010;//Schritt 10 + SPA s011;//Schritt 11 + SPA s012;//Schritt 12 + SPA s013;//Schritt 13 + SPA s014;//Schritt 14 + SPA s015;//Schritt 15 + SPA s016;//Schritt 16 + SPA s017;//Schritt 17 + SPA s018;//Schritt 18 + SPA s019;//Schritt 19 + SPA s020;//Schritt 20 + SPA s021;//Schritt 21 + SPA s022;//Schritt 22 + SPA s023;//Schritt 23 + SPA s024;//Schritt 24 + SPA s025;//Schritt 25 + SPA s026;//Schritt 26 + SPA s027;//Schritt 27 + SPA s028;//Schritt 28 + SPA s029;//Schritt 29 + SPA s030;//Schritt 30 +Ende: S #Dyn.Sk.Err_Schritt;//Undefinierter Schritt + + L 16#A231; + T #Dyn.Stop_Ursache; + + BEA; + +Neu_Mig: U #Dyn.Sk.Err_Uebzeit; + SPBN Sk; + + L 16#A232; + T #Dyn.Stop_Ursache; + + BEA; + +Sk: T #Dyn.Sk.Akt_Schritt; + + L 0;//Zeitwerte löschen + T #Dyn.Sk.Terr_Zelle; + T #Dyn.Sk.Tok_Zelle; + + SPA NEU; + +//Nicht programmierte Schritte: +//s000: SPA Ende +//s001: SPA Ende +//s002: SPA Ende +s003: SPA Ende; +s004: SPA Ende; +//s005: SPA Ende +//s006: SPA Ende +//s007: SPA Ende +s008: SPA Ende; +s009: SPA Ende; +s010: SPA Ende; +s011: SPA Ende; +s012: SPA Ende; +s013: SPA Ende; +s014: SPA Ende; +s015: SPA Ende; +s016: SPA Ende; +s017: SPA Ende; +s018: SPA Ende; +s019: SPA Ende; +//s020: SPA Ende +//s021: SPA Ende +s022: SPA Ende; +s023: SPA Ende; +s024: SPA Ende; +s025: SPA Ende; +s026: SPA Ende; +s027: SPA Ende; +s028: SPA Ende; +s029: SPA Ende; +s030: SPA Ende; + +NETWORK +TITLE = Schritt X: Reserve + SET;//Weiterschaltbedingung + = #Weiter; + +//Schrittaktionen: + SET; + + L 16#B001; + T #Dyn.Stop_Ursache; + + U #Dyn.Sk.Reset_Akt;//Reset ist aktiv + L 20;//Weiter mit Schritt 20 + SPB Neu_Mig;//Bei diesem Schritt weiter + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + L 0 ;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + L 1;//Weiter mit Schritt 1 + SPB Neu_Mig;//Bei diesem Schritt weiter + + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + SET; + U #Dyn.Sk.Auto_akt;//Automatik ist aktiv + U #Dyn.Sk.Bereich_ok; + = #Ueb_akt;//Überwachungszeit aktivieren + L 50 ;//Angabe der Überwachungszeit (*1s) + SPA tueb;//Überwachungszeit + + BEA; + +NETWORK +TITLE = Schritt 0: Warten auf Trolley +s000: SET;//Weiterschaltbedingung + U #B_InSchleuse ;//Trolley im Schleuse erkannt + U #Dyn.Sk.Auto_akt ;//Automatik ist aktiv + U #Dyn.Sk.Bereich_ok; + = #Weiter; + +//Schrittaktionen: + SET; + R #Dyn.Error.Err_Leerpuffer_nicht_leer; + + U #Dyn.Sk.Reset_Akt;//Reset ist aktiv + L 20;//Weiter mit Schritt 20 + SPB Neu_Mig;//Bei diesem Schritt weiter + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + L 100 ;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + L 16#B001; + T #Dyn.Stop_Ursache; + +//Trolley soll gestartet werden: + U #Dyn.Status.Einen_LeerTrolley_ausfahren;//Von FB5429/2 + U(; + U #Dyn.Sk.Err_Uebzeit; + UN #B_InSchleuse ;//Trolley im Schleuse erkannt + O #Dyn.Status.Leerpuffer_initialisieren;//Damit Einfahren blockiert wird + ); + R #Dyn.Status.Einen_LeerTrolley_ausfahren;//Von FB5429/2 + SPBN ÜbStart; + + L "DLP_Auslagern".Auslagern.Auslager_Puffer; + L #LeerPuffer_Nr; + <>I; + SPB ENDE_Mig; + + L 0; + T "DLP_Auslagern".Auslagern.Auslager_Puffer; + + SPA Austrag;//Puffer aus Ausfahr-Liste löschen + +//Überwachungszeit starten: +ÜbStart: UN #B_InSchleuse ;//Trolley im Schleuse erkannt + U #Dyn.Status.Einen_LeerTrolley_ausfahren;//Von FB5429/2 + = #Ueb_akt ;//Überwachungszeit aktivieren + +//Trolley kommt nicht!: + L #Dyn.Anzahl_LeerTrolleys; + L 0;//Trolleydaten vorhanden ? + >I ;//Ja ! + U #Dyn.Sk.Err_Uebzeit; + UN #B_InSchleuse ;//Trolley im Schleuse erkannt + UN #Dyn.Status.Trolley_nicht_in_Schleuse; + S #Dyn.Status.Trolley_nicht_in_Schleuse; + S #Dyn.Status.Leerpuffer_initialisieren;//Damit Einfahren blockiert wird + + L 15 ;//15s + U #Dyn.Status.Einen_LeerTrolley_ausfahren;//Bei Ausfahrwunsch -> Kurze Zeit + SPB tueb ;//Überwachungszeit + + L #Puffer.Übzeit_in_Schleuse; -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_Leerpuffer, DSTBLK:=Puffer) // Datenliste-Daten speichern | #Ziel + SPA tueb;//Überwachungszeit - L 16#0073 - T Dyn.Stop_Ursache +NETWORK +TITLE = Schritt 1: Trolley ist in Schleuse / Warten auf Bit "Einen Trolley ausfahren" +s001: NOP 0; - L Dyn.Rueckmld.RET_VAL_BLKMOV_Leerpuffer // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Dyn.Error.Err_BLKMov // Error bei Block kopieren - BEC +//Schrittaktionen: + UN #B_InSchleuse ;//Trolley im Schleuse erkannt + L 0 ;//Weiter mit Schritt 0 + SPB Neu_Mig;//Bei diesem Schritt weiter + + SET; + R #Dyn.Error.Err_Trolley_nicht_in_Schleuse; + +//Puffer leer ?: + U #Dyn.Status.Puffer_leer; + UN #Dyn.Status.Puffer_nicht_leer; + S #Dyn.Status.Puffer_nicht_leer; + S #Dyn.Status.Leerpuffer_initialisieren;//Damit Einfahren blockiert wird + +//Spezial-Betriebsarten: + U #Dyn.Status.Einen_LeerTrolley_ausfahren; + L 2 ;//Weiter mit Schritt 2 + SPB Neu_Mig ;//Bei diesem Schritt weiter + + L 16#B011; + T #Dyn.Stop_Ursache; + + BEA; + +NETWORK +TITLE = Schritt 2: Ausfahren ok ? +s002: NOP 0; + +//Schrittaktionen: + UN #B_InSchleuse ;//Trolley im Schleuse erkannt + L 0 ;//Weiter mit Schritt 0 + SPB Neu_Mig;//Bei diesem Schritt weiter + + SET; + S #Dyn.Status."Trolley_wartet_Bereich+1"; + +//Anlage aus oder Störung: + L 16#B020; + T #Dyn.Stop_Ursache; + + UN #Dyn.Sk.Auto_akt ;//Automatik ist aktiv + ON #Dyn.Sk.Bereich_ok;//Bereich ist gestört + SPB X002; + +//Trolley starten erlaubt ?: + L 16#B021; + T #Dyn.Stop_Ursache; + + UN #Start_Ok ;//Starten ist erlaubt + SPB X002; + +//Stau im Bereich +1: + L 16#B022; + T #Dyn.Stop_Ursache; + + U #B_Stau_raus_Out; + SPB X002 ;//Stau + +//B_Aus_Schleuse aktiv: + L 16#B023; + T #Dyn.Stop_Ursache; + + U #Puffer.Parameter_allg.B_AusSep_vorhanden; + U #B_AusSchleuse; + = #Dyn.Error.Err_Raus_Sensor;//Raus-Sensor wird nicht erreicht (oder dauernd aktiv)! + SPB X002; + +//Inks ok ?: + L 16#B024; + T #Dyn.Stop_Ursache; + + SET; + S #Antrieb_plus_vor; + + UN #Inks_Ok ;//Starten ist erlaubt + SPB X002; + +//Antriebe aktivieren / aktiv ?: + U #Puffer.Parameter_allg.Antrieb_Plus_vorhanden;//Schleuse an weiterem Antrieb (Weiche) + S #Antrieb_plus_vor;//Kreisel-Antrieb plus starten + + L 16#B025; + T #Dyn.Stop_Ursache; + + UN #Antrieb_plus_aktiv;//Kreisel-Antrieb plus aktiv + U #Puffer.Parameter_allg.Antrieb_Plus_vorhanden;//Schleuse an weiterem Antrieb (Weiche) + BEB; + + L 5 ;//Nur 1 langes Signal! + SPA Neu_Mig ;//Bei diesem Schritt weiter + +X002: L 1 ;//Auftrag checken + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + BEA; + +NETWORK +TITLE = Schritt 5: Trolley fährt aus/ausgefahren ? +s005: SET ;//Weiterschaltbedingung + UN #B_InSchleuse ;//Sensor Trolley ist in Schleuse + U #Schleuse_geöffnet; + U #Antrieb_plus_aktiv; + = #Weiter; + +//Schrittaktionen: + SET; + S #Y_Schleuse_Auf ;//Schleuse öffnen + R #Start_Ok;//Damit kein weiterer Puffer ausfährt + S #Dyn.Status.Trolley_fährt_aus; + S #Antrieb_plus_vor;//Kreisel-Antrieb plus starten + S #Status2.Auslagern_ist_aktiv; + +//Trolley ist draussen: + U(; + O #B_AusSchleuse ;//Sensor Trolley aus Schleuse gefahren + ON #Puffer.Parameter_allg.B_AusSep_vorhanden; + ); + UN #B_InSchleuse ;//Sensor Trolley ist in Schleuse + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + L 0; + SPB Plus ;//Nächsten Schritt starten + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + L 50;//Falls nur mit Sensor gefahren wird, dann Wartezeit! + SPB Plus ;//Nächsten Schritt starten + +//Trolley fährt nicht raus!: + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + L 0; + SPB Plus ;//Nächsten Schritt starten + + U #Dyn.Sk.Err_Uebzeit; + O #B_QuerTrolley_Out;//QuerTrolley auf Crashkurs + S #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + + L 16#B051; + T #Dyn.Stop_Ursache; + + UN #B_AusSchleuse ;//Sensor Trolley aus Schleuse gefahren + SPB x052; + + L 16#B052; + T #Dyn.Stop_Ursache; + +x052: U #Antrieb_plus_aktiv; + = #Ueb_akt;//Überwachungszeit aktivieren + L #Puffer.Übzeit_aus_Schleuse;//Angabe der Überwachungszeit (*1s) + SPA tueb ;//Überwachungszeit + +NETWORK +TITLE = Schritt 6: Schleuse Mindestzeit geöffnet ? +s006: SET ;//Weiterschaltbedingung + U #Dyn.Status.MindestZeit_ok; + O; + U #Puffer.Parameter_allg.B_AusSep_vorhanden; + U #B_AusSchleuse ;//Sensor Trolley aus Schleuse gefahren + = #Weiter; + +//Schrittaktionen: + U #B_QuerTrolley_Out ;//QuerTrolley auf Crashkurs + S #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + + SET; + R #Start_Ok;//Damit kein weiterer Puffer ausfährt + S #Y_Schleuse_Auf ;//Schleuse öffnen + S #Antrieb_plus_vor;//Kreisel-Antrieb plus starten + S #Dyn.Status.Trolley_fährt_aus; + + U #B_InSchleuse;//Trolley wieder erkannt + L 5 ;//Weiter mit Schritt 5 + SPB Neu_Mig;//Bei diesem Schritt weiter + + U #Weiter; + L 0; + SPB Plus ;//Nächsten Schritt starten + + L 16#B061; + T #Dyn.Stop_Ursache; + + BEA; +NETWORK +TITLE = Schritt 7: Trolleydaten ändern +s007: SET ;//Weiterschaltbedingung + = #Weiter; + +//Schrittaktionen: + SET; + S #Dyn.Status.Trolley_draussen;//1 Zyklus + R #Dyn.Status.Einen_LeerTrolley_ausfahren; + + L #Dyn.Vereinzelungstakte; + + DINT#1;//Vereinzelungen +1 + T #Dyn.Vereinzelungstakte; + + L #Dyn.Anzahl_LeerTrolleys; + + -1; + T #Dyn.Anzahl_LeerTrolleys; + + L 0;//sinnvoller Wert? + >I;//Ja! + SPB ENDE_Mig; + + T #Dyn.Anzahl_LeerTrolleys;//Minimum übergeben + + SPA ENDE_Mig; + +NETWORK +TITLE = Schritt 20: Schleuse resetten +s020: SET;//Weiterschaltbedingung + = #Weiter;//Weiterschaltbedingung ist erfüllt + +//Schrittaktionen: + U #Schleuse_geöffnet; + R #Start_Ok;//Damit kein weiterer Puffer ausfährt + + L 16#B201; + T #Dyn.Stop_Ursache; + + U #Weiter;//Weiterschaltbedingung ist erfüllt + L 300;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + SET; + = #Ueb_akt;//Überwachungszeit aktivieren + L 30;//Angabe der Überwachungszeit (*100ms) + SPA tueb;//Überwachungszeit - L Puffer.Puffer_Typ // Puffertyp = 1277 (Leerpuffer) - L 1277 // Dieser Aufruf-FB ? - ==I // Ja ! - JC w061 +NETWORK +TITLE = Schritt 21: Reset ist zu Ende +s021: SET; + R #Dyn.Sk.Reset_Akt;//Reset ist aktiv + R #Dyn.HMI.Schleuse_resetten_Leerpuffer; + R #Dyn.Status.Einen_LeerTrolley_ausfahren; - SET - S Dyn.Error.Undef_Leerpuffer // undefinierter Leerpuffer + SPA ENDE_Mig;//Neubeginn - L 0 // Leerpuffer ungültig ! - T Puffer.LeerPuffer_Nr // Nummer des Leerpuffers +NETWORK +TITLE = Schrittkette beenden +ENDE_Mig: L 0;//Schritt 0: Warten + T #Dyn.Sk.Akt_Schritt; - L 16#0074 - T Dyn.Stop_Ursache + L 0;//Zeitwert löschen + T #Dyn.Sk.Terr_Zelle; + T #Dyn.Sk.Tok_Zelle; + + SET; + R #Dyn.Sk.Err_Uebzeit; - BEU + BEA; + +NETWORK +TITLE = Nächsten Schritt aktivieren +Plus: T #Dyn.Sk.T_ok;//Wartezeit übergeben -// Defaultwerte übergeben: -w061: NOP 0 + U #Dyn.Sk.Err_Uebzeit ;//Störung noch nicht quittiert + BEB; - BEU + L 0;//keine Wartezeit ? + ==I;//Ja ! -> sofort weiter + SPB w220; -en06: NOP 0 + UN #Warte_neu;//Wartezeit neutriggern + SPB W220_Mig; + L 0; + T #Dyn.Sk.Tok_Zelle;//Wartezeit ---- NW 8: Störungen quittieren --- - A ErrQuit // Überwachungszeit abgelaufen quittieren - R Dyn.Sk.Err_Uebzeit +W220_Mig: U #Warte_stop;//Wartezeit stoppen + BEB; + L #Dyn.Sk.Tok_Zelle; + L "MW4";//Wartezeit +10ms + +I; + T #Dyn.Sk.Tok_Zelle;//Wartezeit + L #Dyn.Sk.T_ok;//abgelaufen ? + I;//abgelaufen ? + UN #Dyn.Sk.Err_Uebzeit; + SPB en24;//Nein ! -ResOut: L Puffer.Puffer_Dyn_DW - L Puffer.PufferReservierungsliste_DW - +I - T SSDW + U #Ueb_akt;//Überwachungszeit aktivieren + S #Dyn.Sk.Err_Uebzeit; -CALL FC "DatenOut" (SSDB:=Puffer.Puffer_Dyn_DB, SSDW:=SSDW, PARA:=16#E100, SEARCHDATEN:=P#M220.0, RE_VAL:=Dyn.Rueckmld.RET_VAL_DL_Res, OUTDATEN:=P#M220.0, Position:="MW196") // Eintrag löschen | Nicht relevant + L 0;//Zeitwert löschen + T #Dyn.Sk.Terr_Zelle; - L DINT#0 - T Dyn.TrolleyID_Einfahrt + BEA; -NoNewT: NOP 0 +en24: NOP 0; +NETWORK +TITLE = Überwachungszeit +1 + UN #Dyn.Sk.Ueb_akt;//Schrittaktion ist aktiv + ON "1s-Impuls"; + BEB; + L #Dyn.Sk.Terr_Zelle; + + 1 ;//Üb.zeit +1s + T #Dyn.Sk.Terr_Zelle; ---- NW 10: Error: Stau Bereich-Eingang --- -// Sensor bei Bereichs-Einfahrt bleibt belegt?: - AN B_LeerpufferEinfahrt // Sensor Trolley fährt in Bereich (kein Stau !) - R Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt - JC X090 // StauZeit neu aufziehen + BEA; - AN "1s-Impuls" - O Dyn.Error.Err_Stau_Einfahrt // Zeit bereits abgelaufen - JC Xn09 +NETWORK +TITLE = Ende + BE; - L Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - + +1 - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - - L 25 // Stau-Zeit erreicht ? - >=I // Ja ! - S Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb - JCN Xn09 - -X090: L 0 // Zeiten löschen - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - -Xn09: NOP 0 - - ---- NW 11: Schleuse: Mindestzeit geöffnet/frei, Position-Inks übergeben --- - L Dyn.Sk.Akt_Schritt - L 6 // Mindestzeit ok? - <>I // Nein! - O B_InSchleuse // Sensor Trolley in Schleuse vorhanden - ON "Schleuse_geöffnet" // Schleuse hat geöffnet - R Dyn.Status.MindestZeit_ok - JC X100 // FreiZeit neu aufziehen - - AN "1s-Impuls" - O - A Puffer.Parameter_allg.Antrieb_Plus_vorhanden - AN Antrieb_plus_aktiv - O Dyn.Status.MindestZeit_ok // Zeit bereits abgelaufen - JC Xn10 - - L Dyn.Mindest_Zeit // Sensor B_im_Sep ist frei [1s] - + +1 - T Dyn.Mindest_Zeit // Sensor B_im_Sep ist frei [1s] - - L Puffer.Mindeszeit_Schleuse_geoeffnet // Mindest-Zeit erreicht ? - >=I // Ja ! - S Dyn.Status.MindestZeit_ok - JCN Xn10 - -X100: L 0 // Zeiten löschen - T Dyn.Mindest_Zeit // Sensor B_im_Sep ist frei [1s] - -// Schleuse geöffnet: (Position-Inks übergeben) -Xn10: AN "Schleuse_geöffnet" // Schleuse hat geöffnet - JC X10E - - L Ausfahr_Inks - L Puffer.Puffer_Position_Inks - >I // Rest-Inks-Wert ist größer! - JC X10E - - L Puffer.Puffer_Position_Inks - T Ausfahr_Inks - -X10E: NOP 0 - - ---- NW 12: Keine neue Trolley-Einfahrt ? --- -// Neu-Trolley ist im Puffer: - A Neu_Trolley_in_Puffer // s.o. - O B_LeerpufferEinfahrt // Stauklappe - JC X110 - - AN "1s-Impuls" - O Dyn.Status.Kein_neuer_Trolley_kommt - JC Xn11 - - L Dyn.Leer_Zeit // Zeit für LeerCheck [1s] - + +1 - T Dyn.Leer_Zeit // Zeit für LeerCheck [1s] - - L Puffer.Wartezeit_bis_Puffer_leer // Leer-Zeit erreicht ? - >=I // Ja ! - JCN Xn11 - - T Dyn.Leer_Zeit // Zeit für LeerCheck einfrieren - - SET - S Dyn.Status.Kein_neuer_Trolley_kommt - - JU Xn11 - -X110: L 0 // Zeiten löschen - T Dyn.Leer_Zeit - - SET - R Dyn.Status.Kein_neuer_Trolley_kommt - -Xn11: NOP 0 - - ---- NW 13: Reservierungs-Check --- - L Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege - L 0 - ==I - O "MB3305" // Trolley wird gerade vereinzelt - O "BG3306" // Synchron-Sensor aktiv - JC NoResCheck // Später -> Hauptstrangdaten checken! - -// Trolleys noch unterwegs ? - L "LP_TravelFIFO".Travel_FIFO_BG3306.FIFO.ANZAHL - L "LP_HS_oF".Datensortkopf.AnzahlEintraege - +I - L "LP_HS_mF".Datensortkopf.AnzahlEintraege - +I - L 0 // Es sind noch Trolleys unterwegs - <>I - JC NoResCheck - - L Dyn.Reservierungs_DL.Res_Trolley[1].Trolley_ID - T "MD220" - - JU ResOut - -NoResCheck: NOP 0 - - ---- NW 14: Leer-Check aktiv --- -// Falls Inilauf aktiv: - A Dyn.Status.Leerpuffer_initialisieren - AN Dyn.Status.Leer_Check_aktiv - S Dyn.Status.Leer_Check_aktiv - JCN Check // Negierter Sprung - - L 0 // Zeiten neu aufziehen - T Dyn.Leer_Zeit - - SET - R Dyn.Status.Kein_neuer_Trolley_kommt - -Check: NOP 0 -// Inilauf, kein Daten aber Trolley ist in Schleuse: - A Dyn.Status.Leerpuffer_initialisieren - A B_InSchleuse - A( - L Dyn.Anzahl_LeerTrolleys - L 0 - ==I - ) - AN Dyn.Status.Einen_LeerTrolley_ausfahren - S Dyn.Status.Einen_LeerTrolley_ausfahren // Trolley zwingend ausfahren - -// Abbruch, da Trolley ist doch noch in Schleuse gefahren: - A Dyn.Status.Leerpuffer_initialisieren - A B_InSchleuse - A( - L Dyn.Anzahl_LeerTrolleys // Anzahl wurde eingetragen - L 0 - >I - O Dyn.Status.Trolley_nicht_in_Schleuse - ) - R Dyn.Status.Leerpuffer_initialisieren - R Dyn.Status.Trolley_nicht_in_Schleuse - R Dyn.Status.Leer_Check_aktiv - - AN Dyn.Status.Leer_Check_aktiv - JC Xn12 - -// Trolley während Check erkannt: - AN Dyn.Status.Kein_neuer_Trolley_kommt // nichts mehr eingefahren, - JC Xn12 - -// Aber: - A "Schleuse_geöffnet" // aber Schleuse noch geöffnet - O B_InSchleuse // aber Trolley noch in Schleuse - JCN Fertig // Negierter Sprung - - L 0 // Zeit neu aufziehen - T Dyn.Leer_Zeit - - SET - R Dyn.Status.Kein_neuer_Trolley_kommt - - JU Xn12 - -Fertig: SET - R Dyn.Status.Leer_Check_aktiv - R Dyn.Status.Trolley_nicht_in_Schleuse - - A Dyn.Status.Leerpuffer_initialisieren - R Dyn.Status.Leerpuffer_initialisieren - JCN Reset // Negierter Sprung - - L 0 - T Dyn.Anzahl_LeerTrolleys // Minimum übergeben - - JU Xn12 // Nicht mehr wegen Gefahr der Überfüllung, besser Reservierungen checken - -// Reservierungs-Liste löschen: - L Puffer.Puffer_Dyn_DW - L Puffer.PufferReservierungsliste_DW - +I - T SSDW - -CALL FC "DatenReset" (SSDB:=Puffer.Puffer_Dyn_DB, SSDW:=SSDW, RE_VAL:="MB198") - - JU Reset - -Xn12: NOP 0 - - ---- NW 15: Reset aktiv --- - JU En14 - -Reset: SET - R Dyn.HMI.LeerPuffer_initialisieren // Button-Anzeige wieder normal - R Dyn.Status.Trolley_nicht_in_Schleuse - R Dyn.Status.Puffer_nicht_leer - R Status2.Eintrag_DL_Leerliste_erfolgt - R Status2.Eintrag_DL_Reinliste_erfolgt - R Status2.Eintrag_Abrufliste_erfolgt - R Dyn.Error.Err_Raus_Sensor - - L 0 - T Dyn.Leer_Zeit - T Puffer.LeerPuffer_Nr // Nummer des Leerpuffers (damit Leerpufferdaten neu geholt werden!) - -En14: NOP 0 - - ---- NW 16: Puffer hat Platz / ist frei / Einlagern aktiv --- -// Puffer hat Platz: - L Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege - L Dyn.Anzahl_LeerTrolleys - +I - T GesamtAnzahl - L Puffer.MaxAnzahl_LeerPuffer - I - A Dyn.Status."Puffer_hat Platz" - AN Status2.Auslagern_ist_aktiv - S Status2.Einlagern_ist_aktiv - - A Status2.Auslagern_ist_aktiv // Wegen FIFO - O Dyn.HMI.Einlagern_gesperrt - R Status2.Einlagern_ist_aktiv - - ---- NW 17: Starten aus Leerpuffer aufgrund von Ausfahrsituation ok --- - L Puffer.Puffer_Position_Inks - L 0 // Undefiniert ? - ==I // Ja! - JC X14E - - L Ausfahr_Inks // Trolles auf Förderer vorbei? - L 0 // Undefiniert ? - ==I // Ja! - JC X14E - - L Puffer.Puffer_Position_Inks - L 20 // damit vorbeifahrender Trolley größeren Abstand bekommt - -I - L Ausfahr_Inks // Trolleys auf Förderer vorbei? - >I // Ja! - O( - L 1 // Minimalwert ? - ==I // Ja ! - ) - = Inks_Ok - -X14E: NOP 0 - - ---- NW 18: DLPuffer_leer: Ein-/Austrag --- - AN Dyn.Status.Puffer_leer // Kann mit neuen Leertrolleys bestückt werden! - O Dyn.HMI.Einlagern_gesperrt - O Dyn.Status.Leerpuffer_initialisieren - JC Austrag_Leerliste - -// Eintrag aus Leerliste: - L LeerPuffer_Nr - T "MW220" // Puffer, der leer ist - -CALL FC "DatenIn" (SSDB:=500, SSDW:=0, INDATEN:=P#M220.0, RE_VAL:="MB219") // Anforderung in Datenliste eintragen - - AN "M219.6" // Daten wurden überschrieben - AN "M219.7" // Eintrag ist richtig erfolgt - JC NoChange_Leerliste - - SET - S Status2.Eintrag_DL_Leerliste_erfolgt - - JU NoChange_Leerliste - -Austrag_Leerliste: NOP 0 -// Austrag aus Leerliste: - L LeerPuffer_Nr - T "MW220" // Puffer, der leer ist - -CALL FC "DatenOut" (SSDB:=500, SSDW:=0, PARA:=WORD#16#E100, SEARCHDATEN:=P#M220.0, RE_VAL:="MB219", OUTDATEN:=P#M230.0, Position:="MW196") // Anforderung aus Datenliste löschen - - SET - R Status2.Eintrag_DL_Leerliste_erfolgt - -NoChange_Leerliste: NOP 0 - - ---- NW 19: DLPuffer_einfahren: Ein-/Austrag --- - AN Dyn.Status."Puffer_hat Platz" // Puffer hat kein Platz mehr - ON Status2.Einlagern_ist_aktiv - O Dyn.HMI.Einlagern_gesperrt - O Dyn.Status.Leerpuffer_initialisieren - R Status2.Einlagern_ist_aktiv - JC Austrag_Reinliste - -// Eintrag in Reinliste: - A( - L Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege - L 0 // Reservierung schon erfolgt ? - >I // Ja! - O Status2.Einlagern_ist_aktiv - ) - JCN NoChange_Reinliste // Negierter Sprung - - L LeerPuffer_Nr // angefahrener Puffer - T "MW220" - -CALL FC "DatenIn" (SSDB:=501, SSDW:=0, INDATEN:=P#M220.0, RE_VAL:="MB219") // Anforderung in Datenliste eintragen - - AN "M219.6" // Daten wurden überschrieben - AN "M219.7" // Eintrag ist richtig erfolgt - JC NoChange_Reinliste - - SET - S Status2.Eintrag_DL_Reinliste_erfolgt - - JU NoChange_Reinliste - -Austrag_Reinliste: NOP 0 -// Austrag aus Reinliste: - L LeerPuffer_Nr - T "MW220" - -CALL FC "DatenOut" (SSDB:=501, SSDW:=0, PARA:=WORD#16#E100, SEARCHDATEN:=P#M220.0, RE_VAL:="MB219", OUTDATEN:=P#M230.0, Position:="MW196") // Anforderung aus Datenliste löschen - - SET - R Status2.Eintrag_DL_Reinliste_erfolgt - -NoChange_Reinliste: NOP 0 - - ---- NW 20: DLPuffer_ausfahren: Ein-/Austrag --- - A Dyn.Status.Puffer_leer // Kann mit neuen Leertrolleys bestückt werden! - AN Dyn.Error.Err_Leerpuffer_nicht_leer // Damit Trolley ausgefahren werden kann! - O Dyn.HMI.AusLagern_gesperrt - R Dyn.Status.Einen_LeerTrolley_ausfahren - JC Austrag_Abrufliste - -// Eintrag aus Abrufliste: - A B_InSchleuse // Sobald Trolley in Ausfahrschleuse - JCN NoChange_Abrufliste // Negierter Sprung - - L LeerPuffer_Nr // angefahrener Puffer - T "MW220" - -CALL FC "DatenIn" (SSDB:=502, SSDW:=0, INDATEN:=P#M220.0, RE_VAL:="MB219") // Anforderung in Datenliste eintragen - - AN "M219.6" // Daten wurden überschrieben - AN "M219.7" // Eintrag ist richtig erfolgt - JC NoChange_Abrufliste - - SET - S Status2.Eintrag_Abrufliste_erfolgt - - JU NoChange_Abrufliste - -Austrag_Abrufliste: NOP 0 -// Austrag aus Abrufliste: -Austrag: L LeerPuffer_Nr // angefahrener Puffer - T "MW220" - -CALL FC "DatenOut" (SSDB:=502, SSDW:=0, PARA:=WORD#16#E100, SEARCHDATEN:=P#M220.0, RE_VAL:="MB219", OUTDATEN:=P#M230.0, Position:="MW196") // Anforderung aus Datenliste löschen - - SET - R Status2.Eintrag_Abrufliste_erfolgt - -NoChange_Abrufliste: NOP 0 - - ---- NW 21: Schrittkette anhalten --- - A Dyn.Sk.Auto_akt // Automatik ist aktiv - A Dyn.Sk.Bereich_ok - JU en08_Mig // Schrittkette nicht anhalten ! - - SET // Störungen löschen - R Dyn.Sk.Err_Uebzeit - R Dyn.Sk.Err_Schritt - - L 0 // Zeitwerte löschen - T Dyn.Sk.Terr_Zelle - T Dyn.Sk.Tok_Zelle - - BEU - -en08_Mig: NOP 0 - - ---- NW 22: Sprungverteiler --- -OUT_Sk: L Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - L -1 // angegeben ? - ==I // Nein ! - JC NEU - - CAC // Neuen Schritt übergeben - T Dyn.Sk.Akt_Schritt - - L -1 // Urzustand - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - -NEU: SET - R Ueb_akt // Überwachungszeit aktivieren - R Warte_neu // Wartezeit neutriggern - R Warte_stop // Wartezeit stoppen - - L Dyn.Sk.Akt_Schritt - JL Ende - JU s000 // Schritt 0 - JU s001 // Schritt 1 - JU s002 // Schritt 2 - JU s003 // Schritt 3 - JU s004 // Schritt 4 - JU s005 // Schritt 5 - JU s006 // Schritt 6 - JU s007 // Schritt 7 - JU s008 // Schritt 8 - JU s009 // Schritt 9 - JU s010 // Schritt 10 - JU s011 // Schritt 11 - JU s012 // Schritt 12 - JU s013 // Schritt 13 - JU s014 // Schritt 14 - JU s015 // Schritt 15 - JU s016 // Schritt 16 - JU s017 // Schritt 17 - JU s018 // Schritt 18 - JU s019 // Schritt 19 - JU s020 // Schritt 20 - JU s021 // Schritt 21 - JU s022 // Schritt 22 - JU s023 // Schritt 23 - JU s024 // Schritt 24 - JU s025 // Schritt 25 - JU s026 // Schritt 26 - JU s027 // Schritt 27 - JU s028 // Schritt 28 - JU s029 // Schritt 29 - JU s030 // Schritt 30 -Ende: S Dyn.Sk.Err_Schritt // Undefinierter Schritt - - L 16#A231 - T Dyn.Stop_Ursache - - BEU - -Neu_Mig: A Dyn.Sk.Err_Uebzeit - JCN Sk - - L 16#A232 - T Dyn.Stop_Ursache - - BEU - -Sk: T Dyn.Sk.Akt_Schritt - - L 0 // Zeitwerte löschen - T Dyn.Sk.Terr_Zelle - T Dyn.Sk.Tok_Zelle - - JU NEU - -// Nicht programmierte Schritte: -// s000: SPA Ende -// s001: SPA Ende -// s002: SPA Ende -s003: JU Ende -s004: JU Ende -// s005: SPA Ende -// s006: SPA Ende -// s007: SPA Ende -s008: JU Ende -s009: JU Ende -s010: JU Ende -s011: JU Ende -s012: JU Ende -s013: JU Ende -s014: JU Ende -s015: JU Ende -s016: JU Ende -s017: JU Ende -s018: JU Ende -s019: JU Ende -// s020: SPA Ende -// s021: SPA Ende -s022: JU Ende -s023: JU Ende -s024: JU Ende -s025: JU Ende -s026: JU Ende -s027: JU Ende -s028: JU Ende -s029: JU Ende -s030: JU Ende - - ---- NW 23: Schritt X: Reserve --- - SET // Weiterschaltbedingung - = Weiter - -// Schrittaktionen: - SET - - L 16#B001 - T Dyn.Stop_Ursache - - A Dyn.Sk.Reset_Akt // Reset ist aktiv - L 20 // Weiter mit Schritt 20 - JC Neu_Mig // Bei diesem Schritt weiter - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - L 0 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - L 1 // Weiter mit Schritt 1 - JC Neu_Mig // Bei diesem Schritt weiter - - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - SET - A Dyn.Sk.Auto_akt // Automatik ist aktiv - A Dyn.Sk.Bereich_ok - = Ueb_akt // Überwachungszeit aktivieren - L 50 // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - - BEU - - ---- NW 24: Schritt 0: Warten auf Trolley --- -s000: SET // Weiterschaltbedingung - A B_InSchleuse // Trolley im Schleuse erkannt - A Dyn.Sk.Auto_akt // Automatik ist aktiv - A Dyn.Sk.Bereich_ok - = Weiter - -// Schrittaktionen: - SET - R Dyn.Error.Err_Leerpuffer_nicht_leer - - A Dyn.Sk.Reset_Akt // Reset ist aktiv - L 20 // Weiter mit Schritt 20 - JC Neu_Mig // Bei diesem Schritt weiter - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - L 100 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - L 16#B001 - T Dyn.Stop_Ursache - -// Trolley soll gestartet werden: - A Dyn.Status.Einen_LeerTrolley_ausfahren // Von FB5429/2 - A( - A Dyn.Sk.Err_Uebzeit - AN B_InSchleuse // Trolley im Schleuse erkannt - O Dyn.Status.Leerpuffer_initialisieren // Damit Einfahren blockiert wird - ) - R Dyn.Status.Einen_LeerTrolley_ausfahren // Von FB5429/2 - JCN ÜbStart - - L "DLP_Auslagern".Auslagern.Auslager_Puffer - L LeerPuffer_Nr - <>I - JC ENDE_Mig - - L 0 - T "DLP_Auslagern".Auslagern.Auslager_Puffer - - JU Austrag // Puffer aus Ausfahr-Liste löschen - -// Überwachungszeit starten: -ÜbStart: AN B_InSchleuse // Trolley im Schleuse erkannt - A Dyn.Status.Einen_LeerTrolley_ausfahren // Von FB5429/2 - = Ueb_akt // Überwachungszeit aktivieren - -// Trolley kommt nicht!: - L Dyn.Anzahl_LeerTrolleys - L 0 // Trolleydaten vorhanden ? - >I // Ja ! - A Dyn.Sk.Err_Uebzeit - AN B_InSchleuse // Trolley im Schleuse erkannt - AN Dyn.Status.Trolley_nicht_in_Schleuse - S Dyn.Status.Trolley_nicht_in_Schleuse - S Dyn.Status.Leerpuffer_initialisieren // Damit Einfahren blockiert wird - - L 15 // 15s - A Dyn.Status.Einen_LeerTrolley_ausfahren // Bei Ausfahrwunsch -> Kurze Zeit - JC tueb // Überwachungszeit - - L Puffer."Übzeit_in_Schleuse" - - JU tueb // Überwachungszeit - - ---- NW 25: Schritt 1: Trolley ist in Schleuse / Warten auf Bit "Einen Trolley ausfahren" --- -s001: NOP 0 - -// Schrittaktionen: - AN B_InSchleuse // Trolley im Schleuse erkannt - L 0 // Weiter mit Schritt 0 - JC Neu_Mig // Bei diesem Schritt weiter - - SET - R Dyn.Error.Err_Trolley_nicht_in_Schleuse - -// Puffer leer ?: - A Dyn.Status.Puffer_leer - AN Dyn.Status.Puffer_nicht_leer - S Dyn.Status.Puffer_nicht_leer - S Dyn.Status.Leerpuffer_initialisieren // Damit Einfahren blockiert wird - -// Spezial-Betriebsarten: - A Dyn.Status.Einen_LeerTrolley_ausfahren - L 2 // Weiter mit Schritt 2 - JC Neu_Mig // Bei diesem Schritt weiter - - L 16#B011 - T Dyn.Stop_Ursache - - BEU - - ---- NW 26: Schritt 2: Ausfahren ok ? --- -s002: NOP 0 - -// Schrittaktionen: - AN B_InSchleuse // Trolley im Schleuse erkannt - L 0 // Weiter mit Schritt 0 - JC Neu_Mig // Bei diesem Schritt weiter - - SET - S Dyn.Status."Trolley_wartet_Bereich+1" - -// Anlage aus oder Störung: - L 16#B020 - T Dyn.Stop_Ursache - - AN Dyn.Sk.Auto_akt // Automatik ist aktiv - ON Dyn.Sk.Bereich_ok // Bereich ist gestört - JC X002 - -// Trolley starten erlaubt ?: - L 16#B021 - T Dyn.Stop_Ursache - - AN Start_Ok // Starten ist erlaubt - JC X002 - -// Stau im Bereich +1: - L 16#B022 - T Dyn.Stop_Ursache - - A B_Stau_raus_Out - JC X002 // Stau - -// B_Aus_Schleuse aktiv: - L 16#B023 - T Dyn.Stop_Ursache - - A Puffer.Parameter_allg.B_AusSep_vorhanden - A B_AusSchleuse - = Dyn.Error.Err_Raus_Sensor // Raus-Sensor wird nicht erreicht (oder dauernd aktiv)! - JC X002 - -// Inks ok ?: - L 16#B024 - T Dyn.Stop_Ursache - - SET - S Antrieb_plus_vor - - AN Inks_Ok // Starten ist erlaubt - JC X002 - -// Antriebe aktivieren / aktiv ?: - A Puffer.Parameter_allg.Antrieb_Plus_vorhanden // Schleuse an weiterem Antrieb (Weiche) - S Antrieb_plus_vor // Kreisel-Antrieb plus starten - - L 16#B025 - T Dyn.Stop_Ursache - - AN Antrieb_plus_aktiv // Kreisel-Antrieb plus aktiv - A Puffer.Parameter_allg.Antrieb_Plus_vorhanden // Schleuse an weiterem Antrieb (Weiche) - BEC - - L 5 // Nur 1 langes Signal! - JU Neu_Mig // Bei diesem Schritt weiter - -X002: L 1 // Auftrag checken - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - BEU - - ---- NW 27: Schritt 5: Trolley fährt aus/ausgefahren ? --- -s005: SET // Weiterschaltbedingung - AN B_InSchleuse // Sensor Trolley ist in Schleuse - A "Schleuse_geöffnet" - A Antrieb_plus_aktiv - = Weiter - -// Schrittaktionen: - SET - S Y_Schleuse_Auf // Schleuse öffnen - R Start_Ok // Damit kein weiterer Puffer ausfährt - S Dyn.Status."Trolley_fährt_aus" - S Antrieb_plus_vor // Kreisel-Antrieb plus starten - S Status2.Auslagern_ist_aktiv - -// Trolley ist draussen: - A( - O B_AusSchleuse // Sensor Trolley aus Schleuse gefahren - ON Puffer.Parameter_allg.B_AusSep_vorhanden - ) - AN B_InSchleuse // Sensor Trolley ist in Schleuse - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - L 0 - JC Plus // Nächsten Schritt starten - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - L 50 // Falls nur mit Sensor gefahren wird, dann Wartezeit! - JC Plus // Nächsten Schritt starten - -// Trolley fährt nicht raus!: - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - L 0 - JC Plus // Nächsten Schritt starten - - A Dyn.Sk.Err_Uebzeit - O B_QuerTrolley_Out // QuerTrolley auf Crashkurs - S Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - - L 16#B051 - T Dyn.Stop_Ursache - - AN B_AusSchleuse // Sensor Trolley aus Schleuse gefahren - JC x052 - - L 16#B052 - T Dyn.Stop_Ursache - -x052: A Antrieb_plus_aktiv - = Ueb_akt // Überwachungszeit aktivieren - L Puffer."Übzeit_aus_Schleuse" // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - - ---- NW 28: Schritt 6: Schleuse Mindestzeit geöffnet ? --- -s006: SET // Weiterschaltbedingung - A Dyn.Status.MindestZeit_ok - O - A Puffer.Parameter_allg.B_AusSep_vorhanden - A B_AusSchleuse // Sensor Trolley aus Schleuse gefahren - = Weiter - -// Schrittaktionen: - A B_QuerTrolley_Out // QuerTrolley auf Crashkurs - S Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - - SET - R Start_Ok // Damit kein weiterer Puffer ausfährt - S Y_Schleuse_Auf // Schleuse öffnen - S Antrieb_plus_vor // Kreisel-Antrieb plus starten - S Dyn.Status."Trolley_fährt_aus" - - A B_InSchleuse // Trolley wieder erkannt - L 5 // Weiter mit Schritt 5 - JC Neu_Mig // Bei diesem Schritt weiter - - A Weiter - L 0 - JC Plus // Nächsten Schritt starten - - L 16#B061 - T Dyn.Stop_Ursache - - BEU - ---- NW 29: Schritt 7: Trolleydaten ändern --- -s007: SET // Weiterschaltbedingung - = Weiter - -// Schrittaktionen: - SET - S Dyn.Status.Trolley_draussen // 1 Zyklus - R Dyn.Status.Einen_LeerTrolley_ausfahren - - L Dyn.Vereinzelungstakte - + DINT#1 // Vereinzelungen +1 - T Dyn.Vereinzelungstakte - - L Dyn.Anzahl_LeerTrolleys - + -1 - T Dyn.Anzahl_LeerTrolleys - - L 0 // sinnvoller Wert? - >I // Ja! - JC ENDE_Mig - - T Dyn.Anzahl_LeerTrolleys // Minimum übergeben - - JU ENDE_Mig - - ---- NW 30: Schritt 20: Schleuse resetten --- -s020: SET // Weiterschaltbedingung - = Weiter // Weiterschaltbedingung ist erfüllt - -// Schrittaktionen: - A "Schleuse_geöffnet" - R Start_Ok // Damit kein weiterer Puffer ausfährt - - L 16#B201 - T Dyn.Stop_Ursache - - A Weiter // Weiterschaltbedingung ist erfüllt - L 300 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - SET - = Ueb_akt // Überwachungszeit aktivieren - L 30 // Angabe der Überwachungszeit (*100ms) - JU tueb // Überwachungszeit - - ---- NW 31: Schritt 21: Reset ist zu Ende --- -s021: SET - R Dyn.Sk.Reset_Akt // Reset ist aktiv - R Dyn.HMI.Schleuse_resetten_Leerpuffer - R Dyn.Status.Einen_LeerTrolley_ausfahren - - JU ENDE_Mig // Neubeginn - - ---- NW 32: Schrittkette beenden --- -ENDE_Mig: L 0 // Schritt 0: Warten - T Dyn.Sk.Akt_Schritt - - L 0 // Zeitwert löschen - T Dyn.Sk.Terr_Zelle - T Dyn.Sk.Tok_Zelle - - SET - R Dyn.Sk.Err_Uebzeit - - BEU - - ---- NW 33: Nächsten Schritt aktivieren --- -Plus: T Dyn.Sk.T_ok // Wartezeit übergeben - - A Dyn.Sk.Err_Uebzeit // Störung noch nicht quittiert - BEC - - L 0 // keine Wartezeit ? - ==I // Ja ! -> sofort weiter - JC w220 - - AN Warte_neu // Wartezeit neutriggern - JC W220_Mig - - L 0 - T Dyn.Sk.Tok_Zelle // Wartezeit - -W220_Mig: A Warte_stop // Wartezeit stoppen - BEC - - L Dyn.Sk.Tok_Zelle - L "MW4" // Wartezeit +10ms - +I - T Dyn.Sk.Tok_Zelle // Wartezeit - L Dyn.Sk.T_ok // abgelaufen ? - I // abgelaufen ? - AN Dyn.Sk.Err_Uebzeit - JC en24 // Nein ! - - A Ueb_akt // Überwachungszeit aktivieren - S Dyn.Sk.Err_Uebzeit - - L 0 // Zeitwert löschen - T Dyn.Sk.Terr_Zelle - - BEU - -en24: NOP 0 - ---- NW 35: Überwachungszeit +1 --- - AN Dyn.Sk.Ueb_akt // Schrittaktion ist aktiv - ON "1s-Impuls" - BEC - - L Dyn.Sk.Terr_Zelle - + 1 // Üb.zeit +1s - T Dyn.Sk.Terr_Zelle - - BEU - - ---- NW 36: Ende --- - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Module/MHMOmniBereich_Plus.awl b/=A01+UH07-KF00/Programmbausteine/Module/MHMOmniBereich_Plus.awl index f841c4a..ee812d2 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/MHMOmniBereich_Plus.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/MHMOmniBereich_Plus.awl @@ -1,1317 +1,1427 @@ -=== FB 2275: MHMOmniBereich_Plus [STL] === -INTERFACE: - Input: - Bereichs_Nr : Int // Aufruf für Bereich - ErrQuit : Bool // Ablaufstörung quittieren - B_BereichsAnfang : Bool // Sensor Trolley fährt in Bereich - B_BereichsEnde : Bool // Sensor Trolley istam BereichsEnde - B_Zähl : Bool // Sensor Trolley hat Bereich verlassen - B_Stau_raus : Bool // Sensor Stau im Bereich rausfahren - Start_Ok : Bool // Starten ist erlauTrolley - Antrieb_Bereich_aktiv : Bool // Bereichs-Antrieb aktiv - Antrieb_plus_aktiv : Bool // Antrieb plus aktiv - RestZeit_Bereich_plus : Int := 999 // Bereich +1: Restzeit bis AFS stoppt (s) - Output: - Antrieb_Bereich_vor : Bool // Bereichs-Antrieb einschalten - Antrieb_Bereich_stop : Bool // Bereichs-Antrieb stoppen - Error : Word // Störungen übergeben - InOut: - Antrieb_Bereich_start : Bool // Bereichs-Antrieb mit Zeit starten - Antrieb_plus_vor : Bool // Antrieb plus einschalten - Antrieb_plus_start : Bool // Antrieb plus mit Zeit starten - Antrieb_minus_vor : Bool // Antrieb minus einschalten - hStOk : Bool // Anzeige Start n. Störung aktivieren - Static: - Res20 : Array[1..4] of Int // Reserve - Para : Struct // Parameter - Bereich_DL_DB : Int // Einsprung Bereich-Datenliste-DB - Frei22 : Int - Frei24 : Int - Res30 : Array[1..2] of Int // Reserve - Bereich : "UDLHMOmniBereich_Plus" // Statische Bereichdaten (aus DL) - Dyn : Struct // Dynamische Daten - Status : Struct - Trolley_kommt_in_Bereich : Bool // Trolley kommt in Bereich (Signal von Bereich-1) - Trolley_ist_im_Bereich : Bool // Trolley fährt in Bereich - Trolley_am_BereichsEnde : Bool // Trolley ist am BereichsEnde - Trolley_wartet_auf_Ziel-FC : Bool - Trolley_wartet_Bereich+1 : Bool // Trolley wartet auf Bereich +1 - Trolley_fährt_aus : Bool // Trolley fährt aus - Trolley_draussen : Bool // Trolley ist ausgefahren - Error_aktiv : Bool // Störung vorhanden - Reset_aktiv : Bool := TRUE // Reset aktiv - Anfangs-Sensor_ausgewertet : Bool - Ende-Sensor_ausgewertet : Bool - Inilauf_aktiv : Bool - Trolley an Raus-Sensor : Bool // Trolley ist am Raus-Sensor - Stau_an_Raus-Sensor : Bool // Stau an Raus-Sensor (kein Zählen mehr) - HMI : Struct - Bereich_resetten : Bool // Bereich resetten (IN:HMI, Out:PLC) - Sk : "USk_ILS" // Status der Schrittkette - Rueckmld : Struct - RET_VAL_BLKMOV_Bereich : Int // Rückmeldung nach BLKMOV-Aufruf - RET_VAL_DL_Bereich : Byte - Error : "UErrHMOmniBereich" - Stau_Zeit : Int // Sensor B_VorSep ist belegt [100ms] - Leer_Zeit : Int - Stop_Ursache : Word // Stop-Stelle: Nw + Position - Gefahrene_Trolleys : DInt // Anzahl der getätigten Vereinzelungstakte - Laufzähler : Int // Laufzähler - Wartezeit : Int // Wartezeit (kein EInfahren erlaubt) [s] - Trolley_DL : Struct // AB DW350: Liste der Trolleys im Lager - Datenlistenkopf : Struct - KOPF : Word := WORD#16#DA01 // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128) - LAENGE : Int := 10 // Länge der Datenliste (maximale Anzahl der Datensätze) - STAMMDATEN : Int := 1 // Stammdatenlänge in Word (1 - 9) - INDDB : Int // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) - LAENGEINDDB : Int // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!) - INDDATEN_WANDEL_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) - LETZTERZUGRIFF : Int // Speicherung des letzten Zugriffs - Belegt14 : Int // reserviert von Sort-Datenliste - AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!) - Reserve18 : Int // Reserve - Trolley : Array[1..10] of Int // TrolleyZeit bis Ende (s) - Endekennung : Word := WORD#16#DAEE // Datensort-Ende-Kennung (DBEE) - Restzeit : Int // Diese Zeit hat Trolley noch zum Fahren (s) - Timer_Rein : TON_TIME - Timer_Raus : TON_TIME - Zeit_Ohne_B_In_Schleuse : Int // Trolley nicht an B_In_Schleuse - Zeit_Ohne_B_Zähl : Int // Trolley nicht an B_Zähl - Zeit_Ausfahren_Ohne_B_Zähl : Int // Trolley fährt nicht zu B_Zähl - Raus_Trolleys : Int // Anzahl der Trolleys zwischen Schleuse und Raus-Sensor - Stau_Zeit_RausSensor : Int // Sensor B_AusSep ist belegt [1s] - Res200 : Array[1..2] of Int // Reserve - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Ueb_akt : Bool // Überwachungszeit aktivieren - Weiter : Bool // Weiterschaltbedingung ist erfüllt - Warte_neu : Bool // Wartezeit neu triggern - Warte_stop : Bool // Wartezeit stoppen - ZielFC_vorhanden : Bool - DraussenFC_vorhanden : Bool - Trolley_draussen : Bool // Signal: Trolley ist draussen - Antriebe_starten : Bool - ZielFC : Word // Ziel-FC - DraussenFC : Word // Draussen-FC - AR1Start : DInt // Startwert mit Offset 0 - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - SSDW : Int - SSDB : Int - Restzeit_errechnet : Int - Constant: - ---- NW 1: Parameter-Übergabe --- - L Bereichs_Nr - - L 274 // Einsprung Bereich-DL - T Para.Bereich_DL_DB // vor Aufruf übergeben! - - ---- NW 2: Anzeige OP --- - L 252 // Bereichsstop aktiv - AN Dyn.Sk.Bereich_ok // Also: Bereichsstop / Not-Aus - JC w010 - - L 253 - AN Dyn.Sk.Auto_akt // Keine Betriebsart - AN Dyn.Sk.Hand_akt - JC w010 - - L 255 // Handbetrieb aktiv - A Dyn.Sk.Hand_akt - JC w010 - - L Dyn.Sk.Akt_Schritt // Aktiver Schritt -w010: T Dyn.Sk.OP_Schritt - - ---- NW 3: Out-Bits zum Zurücksetzen --- - SET // Jeden Zyklus neu - R Dyn.Status."Trolley_wartet_auf_Ziel-FC" - R Dyn.Status."Trolley_wartet_Bereich+1" - R Dyn.Status.Trolley_draussen - R Antrieb_Bereich_vor - R Antrieb_Bereich_stop - - L 0 - T Restzeit_errechnet - - ---- NW 4: HMI-Zeug --- -// Von HMI: - A Dyn.HMI.Bereich_resetten - R Dyn.HMI.Bereich_resetten // von HMI - S Dyn.Sk.Reset // SK zurücksetzen - - ---- NW 5: Sensoren entprellen --- -// Rein-Sensor entprellen: - AN B_BereichsAnfang - A Dyn.Status."Anfangs-Sensor_ausgewertet" - A Antrieb_Bereich_aktiv - = "M200.0" - -CALL SYS "TON" (IN:="M200.0", PT:=t#7s, Q:=?, ET:=?) - - A Dyn.Timer_Rein.Q - R Dyn.Status."Anfangs-Sensor_ausgewertet" - -// Ende-Sensor entprellen: - AN B_BereichsEnde - A Dyn.Status."Ende-Sensor_ausgewertet" - A Antrieb_Bereich_aktiv - A Antrieb_plus_aktiv - = "M200.0" - -CALL SYS "TON" (IN:="M200.0", PT:=t#6s, Q:=?, ET:=?) - - A Dyn.Timer_Raus.Q - R Dyn.Status."Ende-Sensor_ausgewertet" - - ---- NW 6: Schrittkette zurücksetzen --- - A ErrQuit // Überwachungszeit abgelaufen quittieren - R Dyn.Sk.Err_Uebzeit - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - R Dyn.Error.Err_Raus_Sensor // Raus-Sensor wird nicht erreicht (oder dauernd aktiv)! - -// Reset oder Trolley kommt am Ende nicht an: - A ErrQuit // Überwachungszeit abgelaufen quittieren - A( - A Dyn.Status.Trolley_am_BereichsEnde - AN B_BereichsEnde // Aber kein Trolley mehr am Sensor - O Dyn.Error.Err_Trolley_nicht_am_Ende // Trolley fährt nicht in Bereich - ) - O Dyn.Sk.Reset // SK zurücksetzen - JCN en04 // Negierter Sprung! - -// Schrittkette zurücksetzen: - L 0 // Schritt 0: Warten - T Dyn.Sk.Akt_Schritt - T Dyn.Raus_Trolleys - - L 0 // Zeitwert löschen - T Dyn.Sk.Terr_Zelle - T Dyn.Sk.Tok_Zelle - - SET - R Dyn.Error.Err_BLKMov // Error bei Block kopieren - R Dyn.Sk.Reset // SK zurücksetzen - R Dyn.Sk.Err_Schritt // Undefinierter Schritt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - R Dyn.Sk.Reset_Akt // Reset ist aktiv - R Dyn.Status.Trolley_am_BereichsEnde - R Dyn.Status."Trolley_wartet_auf_Ziel-FC" - R Dyn.Status."Trolley_wartet_Bereich+1" - R Dyn.Status."Trolley_fährt_aus" - R Dyn.Status.Inilauf_aktiv - S Dyn.Status.Reset_aktiv - - SET - R Dyn.Error.Bereich_DL // Bereich-Datenliste fehlerhaft - R Dyn.Error.Undef_Bereich // undefinierter Bereich - R Dyn.Error.Err_Trolley_nicht_am_Ende // Trolley fährt nicht in Bereich - R Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen - R Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert - R Dyn.Error.Err_Stau_Eingang - R Dyn.Error.Err_BLKMov - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - R Dyn.Error.Err_Raus_Sensor // Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! - R Dyn.Error.Err11 // kein Ziel angegeben - R Dyn.Error.Err12 // Weichen-Datenliste fehlerhaft - R Dyn.Error.Err13 // undefinierte Weiche - R Dyn.Error.Err14 // Weiche bleibt belegt - R Dyn.Error.Err15 - R Dyn.Error.Err16 - - L 0 - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [10ms] - -// Defaultwerte übergeben: - L 0 // Damit statische Werte neu aus Datenbank geholt werden ! - T Bereich.Bereichs_Nr // Nummer des Bereichs - - JU RET - -en04: NOP 0 - - ---- NW 7: Störungen nach Außen übergeben --- - L 0 - T "MW200" - - A Dyn.Error.Bereich_DL // Bereich-Datenliste fehlerhaft - = "M200.0" - A Dyn.Error.Undef_Bereich // undefinierter Bereich - = "M200.1" - A Dyn.Error.Err_Trolley_nicht_am_Ende // Trolley fährt nicht in Bereich - = "M200.2" - A Dyn.Sk.Err_Uebzeit - = Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen - = "M200.3" - NEG - R Dyn.Sk.Err_Uebzeit_AnzOk - A Dyn.Sk.Err_Schritt - = Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert - = "M200.4" - A Dyn.Error.Err_Stau_Eingang - = "M200.5" - A Dyn.Error.Err_BLKMov // Error bei Block kopieren - = "M200.6" - A Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - = "M200.7" - A Dyn.Error.Err_Raus_Sensor // Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! - = "M201.0" - A Dyn.Error.Err11 // Trolley-Ziel nicht bekannt - = "M201.1" - A Dyn.Error.Err12 // Weichen-Datenliste fehlerhaft - = "M201.2" - A Dyn.Error.Err13 // undefinierte Weiche - = "M201.3" - A Dyn.Error.Err14 // Weiche bleibt belegt - = "M201.4" - A Dyn.Error.Err15 - = "M201.5" - A Dyn.Error.Err16 - = "M201.6" - A Dyn.Error.Err17 - = "M201.7" - -// Andere Meldung als Überwachungszeit aktiv ?: - L "MW200" - L 2#1111_0111_1111_1111 - AW - L 2#0000_0000_0000_0000 // Andere Meldung als Üb.zeit aktiv ? - <>I // Ja ! - ON Dyn.Sk.Err_Uebzeit_AnzOk // Störung anzeigen ok, da 2.Zyklus aktiv ! - R "M200.3" // Üb.Zeit-Meldung nicht an PC senden - - A Dyn.Sk.Err_Uebzeit - S Dyn.Sk.Err_Uebzeit_AnzOk // Störung anzeigen ok, da 2.Zyklus aktiv ! - - L "MW200" - T Error // Schnittstelle nach Außen - -// Störung vorhanden: - L 0 - <>I // Ja ! - = Dyn.Status.Error_aktiv - S hStOk - -// Antrieb stoppen: - A( - ON Dyn.Sk.Auto_akt // SystemVoraussetzungen fehlen - O Dyn.Sk.Hand_akt - ON Dyn.Sk.Bereich_ok - ) - S Antrieb_Bereich_stop // Antrieb stoppen - -// Störungen pro Zyklus neu erzeugen: - SET - R Dyn.Error.Bereich_DL // Bereich-Datenliste fehlerhaft - R Dyn.Error.Undef_Bereich // undefinierter Bereich -// / R #Dyn.Error.Err_Trolley_nicht_in_Bereich//Trolley fährt nicht in Bereich -// / R #Dyn.Error.Err_Uebzeit //Überwachungzeit ist abgelaufen - R Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert -// / R #Dyn.Error.Err_Stau_Einfahrt//Betriebsart ist nicht möglich - R Dyn.Error.Err_BLKMov -// / R #Dyn.Error.Err_Trolley_raus//Trolley fährt nicht aus -// / R #Dyn.Error.Err_Raus_Sensor//Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! - R Dyn.Error.Err11 // Trolley-Ziel nicht bekannt - R Dyn.Error.Err12 // Weichen-Datenliste fehlerhaft - R Dyn.Error.Err13 // undefinierte Weiche - R Dyn.Error.Err14 // Weiche bleibt belegt - R Dyn.Error.Err15 // undefinierte Weiche - R Dyn.Error.Err16 // Weiche bleibt belegt - R Dyn.Error.Err17 - - ---- NW 8: Statische Bereich-Parameter holen --- - L Bereich.Bereichs_Nr // Nummer des Bereichs - L Bereichs_Nr // Aufruf-Parameter - ==I // Identisch ? - R Dyn.Error.Bereich_DL // Bereichdatenbank fehlerhaft - R Dyn.Error.Undef_Bereich // undefinierter Bereich - JC en06 // Ja ! - - T "MW200" // Search-Daten - -CALL FC "DatenOut" (SSDB:=Para.Bereich_DL_DB, SSDW:=0, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196") - - L "MB199" - T Dyn.Rueckmld.RET_VAL_DL_Bereich // Rückmeldung bei Datenbank-Zugriff (Gefälle-DL) - - JBI G_Ok - - A "M199.0" - JCN w060 - - SET - = Dyn.Error.Bereich_DL // Bereichdatenbank fehlerhaft - - L 16#A061 - T Dyn.Stop_Ursache - - JU RET - -w060: SET - S Dyn.Error.Undef_Bereich // undefinierter Bereich - - L 16#A062 - T Dyn.Stop_Ursache - - JU RET - -// Kennung + Datenbytes -G_Ok: SET - R Dyn.Error.Bereich_DL // Gefälledatenbank fehlerhaft - R Dyn.Error.Undef_Bereich // undefinierte Gefällestrecke - - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 20 // Datenwords speichern - T LW2 // Wiederholungen - -// Quelle-Pointer erzeugen: - L 0 // Bei Merker = 0 ! - T LW4 // DB_Nummer - L 220 // Adresse - SLD 3 - L 16#8300_0000 // Kennung: Merker - OD - T LD6 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_Bereich, DSTBLK:=Bereich) // Datenliste-Daten speichern | #Ziel - - L 16#A063 - T Dyn.Stop_Ursache - - L Dyn.Rueckmld.RET_VAL_BLKMOV_Bereich // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Dyn.Error.Err_BLKMov // Error bei Block kopieren - JC RET - - L Bereich.Bereichs_Typ // Bereichtyp = 174 (Normal) - L 2275 // Dieser Aufruf-FB ? - ==I // Ja ! - JC w061 - - SET - S Dyn.Error.Undef_Bereich // undefinierter Bereich - - L 0 // Bereich ungültig ! - T Bereich.Bereichs_Nr // Nummer des Bereichs - - L 16#A064 - T Dyn.Stop_Ursache - - JU RET - -// Defaultwerte übergeben: -w061: NOP 0 - - JU RET - -en06: NOP 0 - - ---- NW 9: Trolleydaten auf Förderer vorhanden --- - L Dyn.Trolley_DL.Datenlistenkopf.AnzahlEintraege - L 0 // Trolleys im Bereich? - >I // Ja! - O Dyn.Status.Inilauf_aktiv - O Dyn.Status.Reset_aktiv // Reset ist aktiv - = Dyn.Status.Trolley_ist_im_Bereich - - ---- NW 10: Antrieb zusätzlich starten / stoppen --- -// Antrieb -1: - A( - O Dyn.Error.Err_Stau_Eingang // Stau bei Einfahrt - O Dyn.Status."Anfangs-Sensor_ausgewertet" - ) - A Antrieb_Bereich_aktiv - S Antrieb_minus_vor - -// Bereichs-Antrieb starten: - A ErrQuit // Überwachungszeit abgelaufen quittieren - O - A B_BereichsAnfang - AN Dyn.Error.Err_Stau_Eingang // Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb - O Dyn.Status.Trolley_kommt_in_Bereich // Signal von Bereich-1 - O Dyn.Status.Trolley_ist_im_Bereich - O Dyn.Status."Trolley_fährt_aus" - O Dyn.Status."Anfangs-Sensor_ausgewertet" - O Dyn.Status."Ende-Sensor_ausgewertet" - O Dyn.Status.Inilauf_aktiv - O Dyn.Status.Reset_aktiv - S Antrieb_Bereich_start // Antrieb starten - -// Bereichsantrieb vor: - A Dyn.Status.Trolley_kommt_in_Bereich // Signal von Bereich-1 - O B_BereichsAnfang - O Dyn.Status."Trolley_fährt_aus" - S Antrieb_Bereich_vor - R Dyn.Status.Trolley_kommt_in_Bereich // Signal von Bereich-1 (Zyklus) - -// Bereichs-Antrieb stoppen: - A Dyn.Error.Err_Trolley_nicht_am_Ende - O - A Dyn.Status.Trolley_am_BereichsEnde - AN Dyn.Status."Trolley_fährt_aus" - O - A Dyn.Status."Trolley_fährt_aus" - A Bereich.Parameter_allg.Antrieb_Plus_vorhanden // Bereich an weiterem Antrieb (Weiche) - AN Antrieb_plus_aktiv // //Antrieb plus aktiv - S Antrieb_Bereich_stop // Antrieb stoppen - -// Antrieb +1: - L Dyn.Raus_Trolleys - L 0 // Trolles unterwegs? - >I // Ja! - AN Dyn.Status."Stau_an_Raus-Sensor" // Stau an Raus-Sensor - O Dyn.Status."Trolley_fährt_aus" - S Antrieb_plus_start // Antrieb plus starten - S Antrieb_plus_vor // Antrieb plus einschalten - - ---- NW 11: Plus: Trolley ist an Zähl-/Stau-Sensor --- - A "B_Zähl" - = Trolley_draussen - - A Trolley_draussen - JC B_Raus - - AN Dyn.Status."Trolley an Raus-Sensor" - AN Dyn.Status."Stau_an_Raus-Sensor" - ON "100ms-Impuls" - ON Dyn.Sk.Bereich_ok - JC En10 - - L Dyn."Zeit_Ohne_B_Zähl" - + 1 // Zeit ohne Sensor +100ms - T Dyn."Zeit_Ohne_B_Zähl" - -// B-Raus lange genug frei?: - L 10 // Nach ca. 1s - >=I - AN Dyn.Status."Stau_an_Raus-Sensor" - JC RDel - - CAC - L 200 // Nach ca. 20s - >=I - JC RDel - - JU En10 - -RDel: SET - R Dyn.Status."Trolley an Raus-Sensor" - L 0 - T Dyn."Zeit_Ohne_B_Zähl" - T Dyn.Stau_Zeit_RausSensor - -// War Stau?: - A Dyn.Status."Stau_an_Raus-Sensor" - R Dyn.Status."Stau_an_Raus-Sensor" - JCN En10 - - L 0 // Bisher gefahrene Trolleys löschen - T Dyn.Raus_Trolleys - T Dyn."Zeit_Ohne_B_Zähl" - T Dyn.Stau_Zeit_RausSensor - - JU En10 - -B_Raus: L 0 - T Dyn."Zeit_Ohne_B_Zähl" - T Dyn."Zeit_Ausfahren_Ohne_B_Zähl" - -// Einmalig: - AN Dyn.Status."Trolley an Raus-Sensor" - S Dyn.Status."Trolley an Raus-Sensor" // Raus-Sensor ausgewertet - JCN Xn10 // Negierter Sprung - - L Dyn.Raus_Trolleys - + -1 // Ausgefahrene Trolleys -1 - T Dyn.Raus_Trolleys - - L 0 - >=I - JC Xn10 - - T Dyn.Raus_Trolleys // Minimum übergeben - -// Stau an B_Raus: -Xn10: AN "100ms-Impuls" - O Dyn.Status."Stau_an_Raus-Sensor" - JC En10 +FUNCTION_BLOCK "MHMOmniBereich_Plus" +TITLE = HM-OmniBereich-Modul Plus +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-960629 +// +//Version: HM-Omniflow 2100 / 09.2025 +// +//Version: Omniflow 2100 / 10.2024 +// +//Schritt 0: Warten auf Trolley +//Schritt 1: Betriebsart ok/angegeben? +//Schritt 5: Mit Scanner fahren: Defaultziel ? +//Schritt 6: Scanner triggern +//Schritt 7: "DREQ" an PC senden +//Schritt 8: Warten auf PC-Antwort +//Schritt 9: PC-Antwort auswerten +//Schritt 10: Fahrtrichtung ermitteln +//Schritt 11: Ausfahren ok ? +//Schritt 12: Warten auf Pin-Signal +//Schritt 13: Weichenbereich raus bereit ? +//Schritt 14: Daten an Rausweiche übergeben +//Schritt 15: Bereich Mindestzeit öffnen +//Schritt 16: Trolley ausgefahren ? +//Schritt 17: Trolley ist draussen +//Schritt 18: BM wurde vereinzelt +//Schritt 19: Beladezustand checken +//Schritt 20: Bereich resetten +//Schritt 21: Reset ist zu Ende +// + VAR_INPUT + Bereichs_Nr { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Aufruf für Bereich + ErrQuit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Ablaufstörung quittieren + B_BereichsAnfang { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley fährt in Bereich + B_BereichsEnde { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley istam BereichsEnde + B_Zähl { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley hat Bereich verlassen + B_Stau_raus { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Stau im Bereich rausfahren + Start_Ok { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Starten ist erlauTrolley + Antrieb_Bereich_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Bereichs-Antrieb aktiv + Antrieb_plus_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Antrieb plus aktiv + RestZeit_Bereich_plus : Int := 999; // Bereich +1: Restzeit bis AFS stoppt (s) + END_VAR + + VAR_OUTPUT + Antrieb_Bereich_vor { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Bereichs-Antrieb einschalten + Antrieb_Bereich_stop : Bool; // Bereichs-Antrieb stoppen + Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Störungen übergeben + END_VAR + + VAR_IN_OUT + Antrieb_Bereich_start { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Bereichs-Antrieb mit Zeit starten + Antrieb_plus_vor { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Antrieb plus einschalten + Antrieb_plus_start { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Antrieb plus mit Zeit starten + Antrieb_minus_vor : Bool; // Antrieb minus einschalten + hStOk : Bool; // Anzeige Start n. Störung aktivieren + END_VAR + + VAR + Res20 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..4] of Int; // Reserve + Para { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // Parameter + Bereich_DL_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung Bereich-Datenliste-DB + Frei22 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; + Frei24 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; + END_STRUCT; + Res30 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..2] of Int; // Reserve + Bereich { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : "UDLHMOmniBereich_Plus"; // Statische Bereichdaten (aus DL) + Dyn : Struct // Dynamische Daten + Status { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Trolley_kommt_in_Bereich { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley kommt in Bereich (Signal von Bereich-1) + Trolley_ist_im_Bereich { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt in Bereich + Trolley_am_BereichsEnde { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley ist am BereichsEnde + "Trolley_wartet_auf_Ziel-FC" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + "Trolley_wartet_Bereich+1" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley wartet auf Bereich +1 + Trolley_fährt_aus { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt aus + Trolley_draussen { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley ist ausgefahren + Error_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Störung vorhanden + Reset_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool := TRUE; // Reset aktiv + "Anfangs-Sensor_ausgewertet" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + "Ende-Sensor_ausgewertet" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + Inilauf_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + "Trolley an Raus-Sensor" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley ist am Raus-Sensor + "Stau_an_Raus-Sensor" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Stau an Raus-Sensor (kein Zählen mehr) + END_STRUCT; + HMI : Struct + Bereich_resetten : Bool; // Bereich resetten (IN:HMI, Out:PLC) + END_STRUCT; + Sk { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "USk_ILS"; // Status der Schrittkette + Rueckmld { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + RET_VAL_BLKMOV_Bereich { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Rückmeldung nach BLKMOV-Aufruf + RET_VAL_DL_Bereich { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; + END_STRUCT; + Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : "UErrHMOmniBereich"; + Stau_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Sensor B_VorSep ist belegt [100ms] + Leer_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; + Stop_Ursache { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Stop-Stelle: Nw + Position + Gefahrene_Trolleys { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Anzahl der getätigten Vereinzelungstakte + Laufzähler : Int; // Laufzähler + Wartezeit : Int; // Wartezeit (kein EInfahren erlaubt) [s] + Trolley_DL { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // AB DW350: Liste der Trolleys im Lager + Datenlistenkopf { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + KOPF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DA01; // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128) + LAENGE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 10; // Länge der Datenliste (maximale Anzahl der Datensätze) + STAMMDATEN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 1; // Stammdatenlänge in Word (1 - 9) + INDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) + LAENGEINDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!) + INDDATEN_WANDEL_FC { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) + LETZTERZUGRIFF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Speicherung des letzten Zugriffs + Belegt14 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // reserviert von Sort-Datenliste + AnzahlEintraege { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!) + Reserve18 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Reserve + END_STRUCT; + Trolley { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..10] of Int; // TrolleyZeit bis Ende (s) + Endekennung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DAEE; // Datensort-Ende-Kennung (DBEE) + END_STRUCT; + Restzeit : Int; // Diese Zeit hat Trolley noch zum Fahren (s) + Timer_Rein {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; + Timer_Raus {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; + Zeit_Ohne_B_In_Schleuse : Int; // Trolley nicht an B_In_Schleuse + Zeit_Ohne_B_Zähl : Int; // Trolley nicht an B_Zähl + Zeit_Ausfahren_Ohne_B_Zähl : Int; // Trolley fährt nicht zu B_Zähl + Raus_Trolleys : Int; // Anzahl der Trolleys zwischen Schleuse und Raus-Sensor + Stau_Zeit_RausSensor : Int; // Sensor B_AusSep ist belegt [1s] + Res200 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..2] of Int; // Reserve + END_STRUCT; + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Ueb_akt : Bool; // Überwachungszeit aktivieren + Weiter : Bool; // Weiterschaltbedingung ist erfüllt + Warte_neu : Bool; // Wartezeit neu triggern + Warte_stop : Bool; // Wartezeit stoppen + ZielFC_vorhanden : Bool; + DraussenFC_vorhanden : Bool; + Trolley_draussen : Bool; // Signal: Trolley ist draussen + Antriebe_starten : Bool; + ZielFC : Word; // Ziel-FC + DraussenFC : Word; // Draussen-FC + AR1Start : DInt; // Startwert mit Offset 0 + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + SSDW : Int; + SSDB : Int; + Restzeit_errechnet : Int; + END_VAR + + +BEGIN +NETWORK +TITLE = Parameter-Übergabe + L #Bereichs_Nr; + + L 274 ;//Einsprung Bereich-DL + T #Para.Bereich_DL_DB;//vor Aufruf übergeben! + +NETWORK +TITLE = Anzeige OP + L 252;//Bereichsstop aktiv + UN #Dyn.Sk.Bereich_ok;//Also: Bereichsstop / Not-Aus + SPB w010; + + L 253; + UN #Dyn.Sk.Auto_akt;//Keine Betriebsart + UN #Dyn.Sk.Hand_akt; + SPB w010; + + L 255;//Handbetrieb aktiv + U #Dyn.Sk.Hand_akt; + SPB w010; + + L #Dyn.Sk.Akt_Schritt;//Aktiver Schritt +w010: T #Dyn.Sk.OP_Schritt; + +NETWORK +TITLE = Out-Bits zum Zurücksetzen + SET ;//Jeden Zyklus neu + R #Dyn.Status."Trolley_wartet_auf_Ziel-FC"; + R #Dyn.Status."Trolley_wartet_Bereich+1"; + R #Dyn.Status.Trolley_draussen; + R #Antrieb_Bereich_vor; + R #Antrieb_Bereich_stop; + + L 0; + T #Restzeit_errechnet; + +NETWORK +TITLE = HMI-Zeug + +//Von HMI: + U #Dyn.HMI.Bereich_resetten; + R #Dyn.HMI.Bereich_resetten;//von HMI + S #Dyn.Sk.Reset ;//SK zurücksetzen + +NETWORK +TITLE = Sensoren entprellen + +//Rein-Sensor entprellen: + UN #B_BereichsAnfang; + U #Dyn.Status."Anfangs-Sensor_ausgewertet"; + U #Antrieb_Bereich_aktiv; + = "M200.0"; + + CALL #Dyn.Timer_Rein + {time_type := 'Time'} + ( IN := "M200.0" , + PT := t#7s + ); + + U #Dyn.Timer_Rein.Q; + R #Dyn.Status."Anfangs-Sensor_ausgewertet"; + +//Ende-Sensor entprellen: + UN #B_BereichsEnde; + U #Dyn.Status."Ende-Sensor_ausgewertet"; + U #Antrieb_Bereich_aktiv; + U #Antrieb_plus_aktiv; + = "M200.0"; + + CALL #Dyn.Timer_Raus + {time_type := 'Time'} + ( IN := "M200.0" , + PT := t#6s + ); + + U #Dyn.Timer_Raus.Q; + R #Dyn.Status."Ende-Sensor_ausgewertet"; + +NETWORK +TITLE = Schrittkette zurücksetzen + U #ErrQuit ;//Überwachungszeit abgelaufen quittieren + R #Dyn.Sk.Err_Uebzeit; + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + R #Dyn.Error.Err_Raus_Sensor;//Raus-Sensor wird nicht erreicht (oder dauernd aktiv)! + +//Reset oder Trolley kommt am Ende nicht an: + U #ErrQuit ;//Überwachungszeit abgelaufen quittieren + U(; + U #Dyn.Status.Trolley_am_BereichsEnde; + UN #B_BereichsEnde;//Aber kein Trolley mehr am Sensor + O #Dyn.Error.Err_Trolley_nicht_am_Ende;//Trolley fährt nicht in Bereich + ); + O #Dyn.Sk.Reset ;//SK zurücksetzen + SPBN en04;//Negierter Sprung! + +//Schrittkette zurücksetzen: + L 0;//Schritt 0: Warten + T #Dyn.Sk.Akt_Schritt; + T #Dyn.Raus_Trolleys; + + L 0;//Zeitwert löschen + T #Dyn.Sk.Terr_Zelle; + T #Dyn.Sk.Tok_Zelle; + + SET; + R #Dyn.Error.Err_BLKMov;//Error bei Block kopieren + R #Dyn.Sk.Reset;//SK zurücksetzen + R #Dyn.Sk.Err_Schritt;//Undefinierter Schritt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + R #Dyn.Sk.Reset_Akt ;//Reset ist aktiv + R #Dyn.Status.Trolley_am_BereichsEnde; + R #Dyn.Status."Trolley_wartet_auf_Ziel-FC"; + R #Dyn.Status."Trolley_wartet_Bereich+1"; + R #Dyn.Status.Trolley_fährt_aus; + R #Dyn.Status.Inilauf_aktiv; + S #Dyn.Status.Reset_aktiv; + + SET; + R #Dyn.Error.Bereich_DL;//Bereich-Datenliste fehlerhaft + R #Dyn.Error.Undef_Bereich;//undefinierter Bereich + R #Dyn.Error.Err_Trolley_nicht_am_Ende;//Trolley fährt nicht in Bereich + R #Dyn.Error.Err_Uebzeit;//Überwachungzeit ist abgelaufen + R #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert + R #Dyn.Error.Err_Stau_Eingang; + R #Dyn.Error.Err_BLKMov; + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + R #Dyn.Error.Err_Raus_Sensor;//Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! + R #Dyn.Error.Err11;//kein Ziel angegeben + R #Dyn.Error.Err12;//Weichen-Datenliste fehlerhaft + R #Dyn.Error.Err13;//undefinierte Weiche + R #Dyn.Error.Err14;//Weiche bleibt belegt + R #Dyn.Error.Err15; + R #Dyn.Error.Err16; + + L 0; + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [10ms] + +//Defaultwerte übergeben: + L 0 ;//Damit statische Werte neu aus Datenbank geholt werden ! + T #Bereich.Bereichs_Nr;//Nummer des Bereichs + + SPA RET; + +en04: NOP 0; + +NETWORK +TITLE = Störungen nach Außen übergeben + L 0; + T "MW200"; + + U #Dyn.Error.Bereich_DL;//Bereich-Datenliste fehlerhaft + = "M200.0"; + U #Dyn.Error.Undef_Bereich;//undefinierter Bereich + = "M200.1"; + U #Dyn.Error.Err_Trolley_nicht_am_Ende;//Trolley fährt nicht in Bereich + = "M200.2"; + U #Dyn.Sk.Err_Uebzeit; + = #Dyn.Error.Err_Uebzeit;//Überwachungzeit ist abgelaufen + = "M200.3"; + NOT; + R #Dyn.Sk.Err_Uebzeit_AnzOk; + U #Dyn.Sk.Err_Schritt; + = #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert + = "M200.4"; + U #Dyn.Error.Err_Stau_Eingang; + = "M200.5"; + U #Dyn.Error.Err_BLKMov;//Error bei Block kopieren + = "M200.6"; + U #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + = "M200.7"; + U #Dyn.Error.Err_Raus_Sensor;//Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! + = "M201.0"; + U #Dyn.Error.Err11;//Trolley-Ziel nicht bekannt + = "M201.1"; + U #Dyn.Error.Err12;//Weichen-Datenliste fehlerhaft + = "M201.2"; + U #Dyn.Error.Err13;//undefinierte Weiche + = "M201.3"; + U #Dyn.Error.Err14;//Weiche bleibt belegt + = "M201.4"; + U #Dyn.Error.Err15; + = "M201.5"; + U #Dyn.Error.Err16; + = "M201.6"; + U #Dyn.Error.Err17; + = "M201.7"; + +//Andere Meldung als Überwachungszeit aktiv ?: + L "MW200"; + L 2#1111_0111_1111_1111; + UW; + L 2#0000_0000_0000_0000;//Andere Meldung als Üb.zeit aktiv ? + <>I;//Ja ! + ON #Dyn.Sk.Err_Uebzeit_AnzOk;//Störung anzeigen ok, da 2.Zyklus aktiv ! + R "M200.3";//Üb.Zeit-Meldung nicht an PC senden + + U #Dyn.Sk.Err_Uebzeit; + S #Dyn.Sk.Err_Uebzeit_AnzOk;//Störung anzeigen ok, da 2.Zyklus aktiv ! + + L "MW200"; + T #Error;//Schnittstelle nach Außen + +//Störung vorhanden: + L 0; + <>I;//Ja ! + = #Dyn.Status.Error_aktiv; + S #hStOk; + +//Antrieb stoppen: + U(; + ON #Dyn.Sk.Auto_akt ;//SystemVoraussetzungen fehlen + O #Dyn.Sk.Hand_akt; + ON #Dyn.Sk.Bereich_ok; + ); + S #Antrieb_Bereich_stop;//Antrieb stoppen + +//Störungen pro Zyklus neu erzeugen: + SET; + R #Dyn.Error.Bereich_DL;//Bereich-Datenliste fehlerhaft + R #Dyn.Error.Undef_Bereich;//undefinierter Bereich +/// R #Dyn.Error.Err_Trolley_nicht_in_Bereich//Trolley fährt nicht in Bereich +/// R #Dyn.Error.Err_Uebzeit //Überwachungzeit ist abgelaufen + R #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert +/// R #Dyn.Error.Err_Stau_Einfahrt//Betriebsart ist nicht möglich + R #Dyn.Error.Err_BLKMov; +/// R #Dyn.Error.Err_Trolley_raus//Trolley fährt nicht aus +/// R #Dyn.Error.Err_Raus_Sensor//Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! + R #Dyn.Error.Err11;//Trolley-Ziel nicht bekannt + R #Dyn.Error.Err12;//Weichen-Datenliste fehlerhaft + R #Dyn.Error.Err13;//undefinierte Weiche + R #Dyn.Error.Err14;//Weiche bleibt belegt + R #Dyn.Error.Err15 ;//undefinierte Weiche + R #Dyn.Error.Err16 ;//Weiche bleibt belegt + R #Dyn.Error.Err17; + +NETWORK +TITLE = Statische Bereich-Parameter holen + L #Bereich.Bereichs_Nr;//Nummer des Bereichs + L #Bereichs_Nr;//Aufruf-Parameter + ==I;//Identisch ? + R #Dyn.Error.Bereich_DL;//Bereichdatenbank fehlerhaft + R #Dyn.Error.Undef_Bereich;//undefinierter Bereich + SPB en06;//Ja ! + + T "MW200";//Search-Daten + + CALL "DatenOut" + ( SSDB := #Para.Bereich_DL_DB , + SSDW := 0 , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := "MW196" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_DL_Bereich;//Rückmeldung bei Datenbank-Zugriff (Gefälle-DL) + + SPBI G_Ok; + + U "M199.0"; + SPBN w060; + + SET; + = #Dyn.Error.Bereich_DL;//Bereichdatenbank fehlerhaft + + L 16#A061; + T #Dyn.Stop_Ursache; + + SPA RET; + +w060: SET; + S #Dyn.Error.Undef_Bereich;//undefinierter Bereich + + L 16#A062; + T #Dyn.Stop_Ursache; + + SPA RET; + +//Kennung + Datenbytes +G_Ok: SET; + R #Dyn.Error.Bereich_DL;//Gefälledatenbank fehlerhaft + R #Dyn.Error.Undef_Bereich;//undefinierte Gefällestrecke + + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 20;//Datenwords speichern + T %LW2;//Wiederholungen + +//Quelle-Pointer erzeugen: + L 0;//Bei Merker = 0 ! + T %LW4;//DB_Nummer + L 220;//Adresse + SLD 3; + L 16#8300_0000;//Kennung: Merker + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #Dyn.Rueckmld.RET_VAL_BLKMOV_Bereich , + DSTBLK := #Bereich //#Ziel + ); + + L 16#A063; + T #Dyn.Stop_Ursache; + + L #Dyn.Rueckmld.RET_VAL_BLKMOV_Bereich;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Dyn.Error.Err_BLKMov ;//Error bei Block kopieren + SPB RET; + + L #Bereich.Bereichs_Typ;//Bereichtyp = 174 (Normal) + L 2275 ;//Dieser Aufruf-FB ? + ==I;//Ja ! + SPB w061; + + SET; + S #Dyn.Error.Undef_Bereich;//undefinierter Bereich + + L 0 ;//Bereich ungültig ! + T #Bereich.Bereichs_Nr;//Nummer des Bereichs + + L 16#A064; + T #Dyn.Stop_Ursache; + + SPA RET; + +//Defaultwerte übergeben: +w061: NOP 0; + + SPA RET; + +en06: NOP 0; + +NETWORK +TITLE = Trolleydaten auf Förderer vorhanden + L #Dyn.Trolley_DL.Datenlistenkopf.AnzahlEintraege; + L 0 ;//Trolleys im Bereich? + >I ;//Ja! + O #Dyn.Status.Inilauf_aktiv; + O #Dyn.Status.Reset_aktiv ;//Reset ist aktiv + = #Dyn.Status.Trolley_ist_im_Bereich; + +NETWORK +TITLE = Antrieb zusätzlich starten / stoppen + +//Antrieb -1: + U(; + O #Dyn.Error.Err_Stau_Eingang;//Stau bei Einfahrt + O #Dyn.Status."Anfangs-Sensor_ausgewertet"; + ); + U #Antrieb_Bereich_aktiv; + S #Antrieb_minus_vor; + +//Bereichs-Antrieb starten: + U #ErrQuit ;//Überwachungszeit abgelaufen quittieren + O; + U #B_BereichsAnfang; + UN #Dyn.Error.Err_Stau_Eingang;//Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb + O #Dyn.Status.Trolley_kommt_in_Bereich;//Signal von Bereich-1 + O #Dyn.Status.Trolley_ist_im_Bereich; + O #Dyn.Status.Trolley_fährt_aus; + O #Dyn.Status."Anfangs-Sensor_ausgewertet"; + O #Dyn.Status."Ende-Sensor_ausgewertet"; + O #Dyn.Status.Inilauf_aktiv; + O #Dyn.Status.Reset_aktiv; + S #Antrieb_Bereich_start;//Antrieb starten + +//Bereichsantrieb vor: + U #Dyn.Status.Trolley_kommt_in_Bereich;//Signal von Bereich-1 + O #B_BereichsAnfang; + O #Dyn.Status.Trolley_fährt_aus; + S #Antrieb_Bereich_vor; + R #Dyn.Status.Trolley_kommt_in_Bereich;//Signal von Bereich-1 (Zyklus) + +//Bereichs-Antrieb stoppen: + U #Dyn.Error.Err_Trolley_nicht_am_Ende; + O; + U #Dyn.Status.Trolley_am_BereichsEnde; + UN #Dyn.Status.Trolley_fährt_aus; + O; + U #Dyn.Status.Trolley_fährt_aus; + U #Bereich.Parameter_allg.Antrieb_Plus_vorhanden;//Bereich an weiterem Antrieb (Weiche) + UN #Antrieb_plus_aktiv;////Antrieb plus aktiv + S #Antrieb_Bereich_stop;//Antrieb stoppen + +//Antrieb +1: + L #Dyn.Raus_Trolleys; + L 0 ;//Trolles unterwegs? + >I ;//Ja! + UN #Dyn.Status."Stau_an_Raus-Sensor";//Stau an Raus-Sensor + O #Dyn.Status.Trolley_fährt_aus; + S #Antrieb_plus_start;//Antrieb plus starten + S #Antrieb_plus_vor ;//Antrieb plus einschalten + +NETWORK +TITLE = Plus: Trolley ist an Zähl-/Stau-Sensor + U #B_Zähl; + = #Trolley_draussen; + + U #Trolley_draussen; + SPB B_Raus; + + UN #Dyn.Status."Trolley an Raus-Sensor"; + UN #Dyn.Status."Stau_an_Raus-Sensor"; + ON "100ms-Impuls"; + ON #Dyn.Sk.Bereich_ok; + SPB En10; + + L #Dyn.Zeit_Ohne_B_Zähl; + + 1 ;//Zeit ohne Sensor +100ms + T #Dyn.Zeit_Ohne_B_Zähl; + +//B-Raus lange genug frei?: + L 10 ;//Nach ca. 1s + >=I; + UN #Dyn.Status."Stau_an_Raus-Sensor"; + SPB RDel; + + TAK; + L 200 ;//Nach ca. 20s + >=I; + SPB RDel; + + SPA En10; + +RDel: SET; + R #Dyn.Status."Trolley an Raus-Sensor"; + L 0; + T #Dyn.Zeit_Ohne_B_Zähl; + T #Dyn.Stau_Zeit_RausSensor; + +//War Stau?: + U #Dyn.Status."Stau_an_Raus-Sensor"; + R #Dyn.Status."Stau_an_Raus-Sensor"; + SPBN En10; + + L 0;//Bisher gefahrene Trolleys löschen + T #Dyn.Raus_Trolleys; + T #Dyn.Zeit_Ohne_B_Zähl; + T #Dyn.Stau_Zeit_RausSensor; + + SPA En10; + +B_Raus: L 0; + T #Dyn.Zeit_Ohne_B_Zähl; + T #Dyn.Zeit_Ausfahren_Ohne_B_Zähl; + +//Einmalig: + UN #Dyn.Status."Trolley an Raus-Sensor"; + S #Dyn.Status."Trolley an Raus-Sensor";//Raus-Sensor ausgewertet + SPBN Xn10 ;//Negierter Sprung + + L #Dyn.Raus_Trolleys; + + -1;//Ausgefahrene Trolleys -1 + T #Dyn.Raus_Trolleys; + + L 0; + >=I; + SPB Xn10; + + T #Dyn.Raus_Trolleys;//Minimum übergeben + +//Stau an B_Raus: +Xn10: UN "100ms-Impuls"; + O #Dyn.Status."Stau_an_Raus-Sensor"; + SPB En10; + + L #Dyn.Stau_Zeit_RausSensor; + + 1 ;//StauZeit +1 + T #Dyn.Stau_Zeit_RausSensor; + + L 90 ;//Nach ca. 9s + >=I; + SPBN En10;//Negierter Sprung + + L 0 ;//Zeit löschen + T #Dyn.Stau_Zeit_RausSensor; + + SET; + S #Dyn.Status."Stau_an_Raus-Sensor"; + +En10: NOP 0; + +NETWORK +TITLE = Plus: Trolley fährt nicht bis Zähl-Sensor + L #Dyn.Raus_Trolleys; + L 0 ;//Trolles unterwegs? + ==I;//Nein! + O #Trolley_draussen ;//Sensor wurde erreicht + O #Dyn.Status.Reset_aktiv; + SPB RTTD; + + UN #Antrieb_plus_aktiv; + U #Bereich.Parameter_allg.Antrieb_Plus_vorhanden; + ON "1s-Impuls"; + O #Dyn.Error.Err_Raus_Sensor;//Trolley fährt nicht aus + SPB En12; + + L #Dyn.Zeit_Ausfahren_Ohne_B_Zähl; + + 1; + T #Dyn.Zeit_Ausfahren_Ohne_B_Zähl; + +//Trolley fährt nicht bis Zähl-Sensor!: + L #Bereich.Übzeit_aus_Bereich; + >=I; + S #Dyn.Error.Err_Raus_Sensor;//Trolley fährt nicht aus + SPBN En12;//Negierter Sprung! + + L #Dyn.Raus_Trolleys; + + -1; + T #Dyn.Raus_Trolleys; + + SPA En12; + +RTTD: L 0; + T #Dyn.Zeit_Ausfahren_Ohne_B_Zähl; + + SET; + R #Dyn.Error.Err_Raus_Sensor;//Trolley fährt nicht aus + +En12: NOP 0; + +NETWORK +TITLE = Laufzähler + UN #Antrieb_Bereich_aktiv; + ON "1s-Impuls"; + SPB X900; + + L #Dyn.Laufzähler; + + +1; + T #Dyn.Laufzähler; + +//Laufzähler rücksetzen?: + U #Dyn.Status.Trolley_ist_im_Bereich; + SPB Warte; + + L 1;//Rücksetzen + T #Dyn.Laufzähler; + +Warte: L #Dyn.Wartezeit; + + -1; + T #Dyn.Wartezeit; + + L 0;//Minimum unterschritten? + >=I;//Nein! + SPB X900; + + T #Dyn.Wartezeit;//Minimum übergeben + +X900: NOP 0; + +NETWORK +TITLE = Anfangs-Sensor auswerten + L #Bereich.Bereich_Dyn_DB; + T #SSDB; + + L #Bereich.Bereich_Dyn_DW; + L 110; + +I; + T #SSDW; + + U #B_BereichsAnfang; + U #Antrieb_Bereich_aktiv; + UN #Dyn.Status."Anfangs-Sensor_ausgewertet"; + S #Dyn.Status."Anfangs-Sensor_ausgewertet"; + SPBN ReinEn;//Negierter Sprung + +//Abstand schon gespeichert?: + L #Bereich.Fahrzeit; + L 1 ;//Sinnvoller Wert? + <=I;//Nein ! + L 999;//Bei Inilauf + T "MW220"; + S #Dyn.Status.Inilauf_aktiv; + SPB Save; + + L #Bereich.Fahrzeit; + L #Dyn.Laufzähler; + +I;//Abstand dazu addieren + T "MW220"; + +//Eintrag in Trolley-Bereichsliste +Save: CALL "DatenIn" + ( SSDB := #SSDB , + SSDW := #SSDW , + INDATEN := P#M220.0 , + RE_VAL := "MB199" + ); + +//Wartezeit (Einlagern blöckieren) speichern: + L 6 ;//6s wegen nach 5s draussen + T #Dyn.Wartezeit ;//Damit genügend Abstand zwischen 2 Trolleys + +ReinEn: NOP 0; + +NETWORK +TITLE = Ende-Sensor auswerten + U #ErrQuit ;//Überwachungszeit abgelaufen quittieren + U #Dyn.Error.Err_Trolley_nicht_am_Ende;//Trolley fährt nicht in Bereich + R #Dyn.Error.Err_Trolley_nicht_am_Ende;//Trolley fährt nicht in Bereich + S #Antrieb_Bereich_start; + SPB Delete; + + U #B_BereichsEnde; + U(; + O #Antrieb_Bereich_aktiv; + O #Dyn.Error.Err_Trolley_nicht_am_Ende; + ); + UN #Dyn.Status."Ende-Sensor_ausgewertet"; + S #Dyn.Status."Ende-Sensor_ausgewertet"; + SPBN EndeEn;//Negierter Sprung + + U #Dyn.Status.Inilauf_aktiv; + R #Dyn.Status.Inilauf_aktiv; + SPBN Delete;//Negierter Sprung + + L #Dyn.Laufzähler; + + -3 ;//damit mehr Sicherheit! + T #Bereich.Fahrzeit;//Abstand speichern + +///Austrag aus Trolley-Bereichsliste +Delete: CALL "DatenOut" + ( SSDB := #SSDB , + SSDW := #SSDW , + PARA := 16#F100 , //1.Datensatz lesen + SEARCHDATEN := "MW220" , + RE_VAL := "MB199" , + OUTDATEN := "MW220" , + Position := "MW196" + ); + + CALL "DatenOut" + ( SSDB := #SSDB , + SSDW := #SSDW , + PARA := 16#E100 , //Angegebenen Datensatz austragen + SEARCHDATEN := "MW220" , + RE_VAL := "MB199" , + OUTDATEN := "MW220" , + Position := "MW196" + ); + +EndeEn: NOP 0; + +NETWORK +TITLE = Restzeit ermitteln + +//Keine Daten gespeichert?: + UN #Dyn.Status.Trolley_ist_im_Bereich; + L 999 ;//Einfahren erlaubt + SPA Rest;//Aktuell ohne Berechnung + +//Auswertung des nächsten Trolleys: + CALL "DatenOut" + ( SSDB := #SSDB , + SSDW := #SSDW , + PARA := 16#F100 , //1.Datensatz lesen + SEARCHDATEN := "MW220" , + RE_VAL := "MB199" , + OUTDATEN := "MW220" , + Position := "MW196" + ); + + L "MW220";//Bei dieser Zeit wird Trolley am B_BereichsEnde erwartet + L #Dyn.Laufzähler; + -I; + T #Restzeit_errechnet; +Rest: T #Dyn.Restzeit; + +//Restzeit nullen?: +//Laufzähler-Überlauf oder sonst Einfahrt blockieren: + L #Dyn.Laufzähler; + L 32000;//wird zu groß? + >I;//Ja ! + O #Dyn.Status.Inilauf_aktiv; + O #Dyn.Status.Reset_aktiv; + O #Dyn.Status.Error_aktiv; + O #Dyn.Status."Anfangs-Sensor_ausgewertet"; + O(; + L #Dyn.Sk.Akt_Schritt; + L 0;//Warten auf Trolley? + <>I ;////Nein, also am Ende, fährt aus,...! + ); + O(; + L #Dyn.Wartezeit ;//Damit genügend Abstand zwischen 2 Trolleys + L 0 ;//Einfahren noch blockieren ? + >I ;//Ja! + ); + SPB KeinEinfahren ;//Einfahren nicht erlaubt + + L #Dyn.Restzeit; + L 0 ;//sinnvoller Wert? + >=I;//Ja! + U(; + L #Dyn.Trolley_DL.Datenlistenkopf.AnzahlEintraege; + L #Dyn.Trolley_DL.Datenlistenkopf.LAENGE; + I ;//Ja! + = #ZielFC_vorhanden; + + L #Bereich.Draussen_FC; + T #DraussenFC; + L 0;//Parameter vorhanden ? + >I ;//Ja! + = #DraussenFC_vorhanden; + +NETWORK +TITLE = Error: Stau Bereich-Eingang + +//Sensor bei Bereichs-Einfahrt bleibt belegt?: + UN #B_BereichsAnfang;//Sensor Trolley fährt in Bereich (kein Stau !) + O #ErrQuit; + R #Dyn.Error.Err_Stau_Eingang;//Stau bei Einfahrt + SPB X090 ;//StauZeit neu aufziehen + + UN "1s-Impuls"; + ON #Antrieb_Bereich_aktiv; + O #Dyn.Error.Err_Stau_Eingang;//Zeit bereits abgelaufen + SPB Xn09; + + L #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + + +1; + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + + L 10 ;//Stau-Zeit erreicht ? + >=I;//Ja ! + S #Dyn.Error.Err_Stau_Eingang;//Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb + SPBN Xn09; + +X090: L 0 ;//Zeiten löschen + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + +Xn09: NOP 0; + +NETWORK +TITLE = Schrittkette anhalten + U #Dyn.Sk.Auto_akt;//Automatik ist aktiv + U #Dyn.Sk.Bereich_ok; + CLR; + + SPA en08_Mig;//Schrittkette nicht anhalten ! + + SET; + R #Dyn.Sk.Err_Uebzeit;//Störungen löschen + R #Dyn.Sk.Err_Schritt; + + L 0;//Zeitwerte löschen + T #Dyn.Sk.Terr_Zelle; + T #Dyn.Sk.Tok_Zelle; + + SPA RET; + +en08_Mig: NOP 0; + +NETWORK +TITLE = Sprungverteiler + L #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + L -1;//angegeben ? + ==I;//Nein ! + SPB NEU; + + TAK;//Neuen Schritt übergeben + T #Dyn.Sk.Akt_Schritt; + + L -1;//Urzustand + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + +NEU: SET; + R #Warte_neu;//Wartezeit neutriggern + R #Warte_stop;//Wartezeit stoppen + + L #Dyn.Sk.Akt_Schritt; + SPL Ende; + SPA s000;//Schritt 0 + SPA s001;//Schritt 1 + SPA s002;//Schritt 2 + SPA s003;//Schritt 3 + SPA s004;//Schritt 4 + SPA s005;//Schritt 5 + SPA s006;//Schritt 6 + SPA s007;//Schritt 7 + SPA s008;//Schritt 8 + SPA s009;//Schritt 9 + SPA s010;//Schritt 10 + SPA s011;//Schritt 11 + SPA s012;//Schritt 12 + SPA s013;//Schritt 13 + SPA s014;//Schritt 14 + SPA s015;//Schritt 15 + SPA s016;//Schritt 16 + SPA s017;//Schritt 17 + SPA s018;//Schritt 18 + SPA s019;//Schritt 19 + SPA s020;//Schritt 20 + SPA s021;//Schritt 21 + SPA s022;//Schritt 22 + SPA s023;//Schritt 23 + SPA s024;//Schritt 24 + SPA s025;//Schritt 25 + SPA s026;//Schritt 26 + SPA s027;//Schritt 27 + SPA s028;//Schritt 28 + SPA s029;//Schritt 29 + SPA s030;//Schritt 30 +Ende: S #Dyn.Sk.Err_Schritt;//Undefinierter Schritt + + L 16#A131; + T #Dyn.Stop_Ursache; + + SPA RET; + +Neu_Mig: U #Dyn.Sk.Err_Uebzeit; + SPBN Sk; + + L 16#A132; + T #Dyn.Stop_Ursache; + + SPA RET; + +Sk: T #Dyn.Sk.Akt_Schritt; + + L 0;//Zeitwerte löschen + T #Dyn.Sk.Terr_Zelle; + T #Dyn.Sk.Tok_Zelle; + + SPA NEU; + +//Nicht programmierte Schritte: +//s000: SPA Ende +//s001: SPA Ende +//s002: SPA Ende +//s003: SPA Ende +//s004: SPA Ende +//s005: SPA Ende +s006: SPA Ende; +s007: SPA Ende; +s008: SPA Ende; +s009: SPA Ende; +s010: SPA Ende; +s011: SPA Ende; +s012: SPA Ende; +s013: SPA Ende; +s014: SPA Ende; +s015: SPA Ende; +s016: SPA Ende; +s017: SPA Ende; +s018: SPA Ende; +s019: SPA Ende; +s020: SPA Ende; +s021: SPA Ende; +s022: SPA Ende; +s023: SPA Ende; +s024: SPA Ende; +s025: SPA Ende; +s026: SPA Ende; +s027: SPA Ende; +s028: SPA Ende; +s029: SPA Ende; +s030: SPA Ende; + +NETWORK +TITLE = Schritt X: Reserve + SET;//Weiterschaltbedingung + = #Weiter; + +//Schrittaktionen: + SET; + + L 16#B001; + T #Dyn.Stop_Ursache; + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + L 0 ;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + L 1;//Weiter mit Schritt 1 + SPB Neu_Mig;//Bei diesem Schritt weiter + + SET; + U #Dyn.Sk.Auto_akt;//Automatik ist aktiv + U #Dyn.Sk.Bereich_ok; + = #Ueb_akt;//Überwachungszeit aktivieren + L 50 ;//Angabe der Überwachungszeit (*1s) + SPA tueb;//Überwachungszeit + + SPA RET; + +NETWORK +TITLE = Schritt 0: Warten auf Trolley am Bereichs-Ende +s000: SET;//Weiterschaltbedingung + U #B_BereichsEnde ;//Trolley im Bereich erkannt + U(; + O #Antrieb_Bereich_aktiv; + O #Dyn.Error.Err_Trolley_nicht_am_Ende; + ); + = #Weiter; + +//Schrittaktionen: + SET; + R #Dyn.Error.Err_Trolley_raus; + +//Antriebe: +//siehe Nw10 + + U #Weiter ;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + L 0 ;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + L 16#B001; + T #Dyn.Stop_Ursache; + +//Überwachungszeit starten: + U #Dyn.Status.Trolley_ist_im_Bereich; + U #Antrieb_Bereich_aktiv; + = #Ueb_akt ;//Überwachungszeit aktivieren + +//Reset aktiv? + U #Dyn.Status.Reset_aktiv; + U #Dyn.Sk.Err_Uebzeit; + R #Dyn.Sk.Err_Uebzeit; + SPB Reset_fertig; + + L #Restzeit_errechnet; + L -20 ;//Trolley schon 20s überfällig + Kein Trolley drin! + U #Dyn.Sk.Err_Uebzeit; + SPBN X000;//Negierter Sprung + + SET; + R #Dyn.Sk.Err_Uebzeit; + R #Dyn.Error.Err_Trolley_nicht_am_Ende; + + SPA Delete;//Trolley aus Liste löschen + +X000: L #Bereich.Übzeit_in_Bereich; + SPA tueb;//Überwachungszeit + +Reset_fertig: SET; + R #Dyn.Status.Reset_aktiv; + R #Dyn.Status.Inilauf_aktiv; + + L 0; + T #Dyn.Raus_Trolleys; + +//Trolleydaen löschen: + CALL "DatenReset" + ( SSDB := #SSDB , + SSDW := #SSDW , + RE_VAL := "MB199" + ); + + SPA ENDE_Mig; + +NETWORK +TITLE = Schritt 1: Trolley ist am Bereichsende +s001: NOP 0; +//Schrittaktionen: + SET; + = #Weiter; + R #Dyn.Error.Err_Trolley_nicht_am_Ende; + + UN #Weiter; + SPB RET; + + L 2 ;//Weiter mit Schritt 2 (Ziel-FC?) + SPA Neu_Mig;//Bei diesem Schritt weiter + +NETWORK +TITLE = Schritt 2: Ziel-FC +s002: NOP 0; + +//Schrittaktionen: + SET; + S #Dyn.Status.Trolley_am_BereichsEnde; + S #Dyn.Status."Trolley_wartet_auf_Ziel-FC"; + + UN #ZielFC_vorhanden; + R #Dyn.Status."Trolley_wartet_auf_Ziel-FC"; + L 3 ;//Weiter mit Schritt 3 (Ausfahren ok?) + SPB Neu_Mig ;//Bei diesem Schritt weiter + + SET;//Rückmeldungen erst mal resetten + R "M180.6";//Weiterfahrt von Ziel-FC erlaubt + L #Bereichs_Nr ;//Bereich-Nr. + T "MW190";//übergeben + L 0 ;//Erst mal nullen + T "MW194" ;//übergeben + T "MW196" ;//übergeben + T "MW198" ;//Weichenziel + + UC FC[ #ZielFC] ;//Beeinflussung der Weiterfahrt + + L 16#B102; + T #Dyn.Stop_Ursache; + + UN "M180.6" ;//Weiterfahrt von Ziel-FC erlaubt + SPB RET; + + L 3 ;//Weiter mit Schritt 3 (Ausfahren ok?) + SPA Neu_Mig;//Bei diesem Schritt weiter + +NETWORK +TITLE = Schritt 3: Start ok ? +s003: NOP 0; + +//Schrittaktionen: + +//Anlage aus oder Störung: + L 16#B031; + T #Dyn.Stop_Ursache; + + UN #Dyn.Sk.Auto_akt ;//Automatik ist aktiv + ON #Dyn.Sk.Bereich_ok ;//Bereich ist gestört + SPB X003; + +//Starten erlaut Trolley ?: + L 16#B032; + T #Dyn.Stop_Ursache; + + UN #Start_Ok ;//Starten ist erlaubt + SPB X003; + +//Stau im Bereich +1: + L 16#B033; + T #Dyn.Stop_Ursache; + + SET; + S #Dyn.Status."Trolley_wartet_Bereich+1"; + + U #B_Stau_raus ;//Sensor Stau im Bereich rausfahren + SPB X003; + +//B_Aus_Bereich aktiv: + L 16#B034; + T #Dyn.Stop_Ursache; + + L #Dyn.Raus_Trolleys; + L 0;//Trolleys schon unterwegs? + <>I;//Ja! + U #Dyn.Status."Trolley an Raus-Sensor"; + O #Dyn.Status."Stau_an_Raus-Sensor"; + = #Dyn.Error.Err_Raus_Sensor;//Raus-Sensor wird nicht erreicht (oder dauernd aktiv)! + SPB X003; + +//Zu viele Raus-Trolleys unterwegs: + L 16#B027; + T #Dyn.Stop_Ursache; + + L #Dyn.Raus_Trolleys;//Gestartete Trolleys + L #Bereich.MaxRausTrolleys;//Erlaubte Anzahl gestarteter Trolleys + >=I; + SPB X003; + +//Antriebe aktivieren / aktiv ?: + U #Bereich.Parameter_allg.Antrieb_Plus_vorhanden;//Bereich an weiterem Antrieb (Weiche) + S #Antrieb_plus_vor;//Antrieb plus einschalten + + U(; + O #Antrieb_plus_aktiv;//Antrieb plus aktiv + ON #Bereich.Parameter_allg.Antrieb_Plus_vorhanden;//Bereich an weiterem Antrieb (Weiche) + ); + S #Antrieb_Bereich_vor;//Antrieb einschalten + + L 16#B036; + T #Dyn.Stop_Ursache; + + UN #Antrieb_plus_aktiv;//Antrieb plus aktiv + U #Bereich.Parameter_allg.Antrieb_Plus_vorhanden;//Bereich an weiterem Antrieb (Weiche) + SPB X003; + + SET; + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + + L #Dyn.Raus_Trolleys; + + 1;//Gestartete Trolleys + 1 + T #Dyn.Raus_Trolleys; + + L 4 ;//Weiter mit Schritt 4 (Trolley fährt aus) + SPA Neu_Mig ;//Bei diesem Schritt weiter + +X003: L 2 ;//Beginn mit Schritt 2 (Ziel-FC?) + T #Dyn.Sk.Neu_Schritt; + SPA RET; - L Dyn.Stau_Zeit_RausSensor - + 1 // StauZeit +1 - T Dyn.Stau_Zeit_RausSensor - - L 90 // Nach ca. 9s - >=I - JCN En10 // Negierter Sprung - - L 0 // Zeit löschen - T Dyn.Stau_Zeit_RausSensor - - SET - S Dyn.Status."Stau_an_Raus-Sensor" +NETWORK +TITLE = Schritt 4: Trolley fährt aus ? +s004: SET ;//Weiterschaltbedingung + UN #B_BereichsEnde ;//Sensor Trolley ist in Bereich + U #Antrieb_Bereich_aktiv; + U(; + O #Antrieb_plus_aktiv;//Antrieb plus aktiv + ON #Bereich.Parameter_allg.Antrieb_Plus_vorhanden;//Bereich an weiterem Antrieb (Weiche) + ); + = #Weiter; -En10: NOP 0 +//Schrittaktionen: + SET; + S #Dyn.Status.Trolley_fährt_aus; + +//Antriebe: +//siehe Nw10 + +//5 s ohne Trolley-Signal: + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + L 500 ;//Angabe der Wartezeit (*10ms) + SPB Plus ;//Nächsten Schritt starten + +//Trolley fährt nicht aus: + U #Dyn.Sk.Err_Uebzeit; + S #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + +//Automatisches löschen, falls Sensor spinnt: + UN #B_BereichsEnde ;//Sensor Trolley ist in Bereich + U #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + U #Dyn.Sk.Err_Uebzeit; + R #Dyn.Sk.Err_Uebzeit; + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + + L 16#B041; + T #Dyn.Stop_Ursache; + + U #Antrieb_plus_aktiv; + = #Ueb_akt ;//Überwachungszeit aktivieren + L 20 ;//Angabe der Überwachungszeit (*1s) + SPA tueb ;//Überwachungszeit + +NETWORK +TITLE = Schritt 5: Trolley ist draussen +s005: NOP 0; + +//Trolley hat Bereich verlassen: + SET; + S #Dyn.Status.Trolley_draussen;//1 Zyklus + R #Dyn.Status.Trolley_am_BereichsEnde; + R #Dyn.Status.Trolley_fährt_aus; + + L #Dyn.Gefahrene_Trolleys; + + DINT#1 ;//Gefahrene Trolleys +1 + T #Dyn.Gefahrene_Trolleys; + +//Draussen-FC ?: + UN #DraussenFC_vorhanden; + SPB NoFC ;//Bei diesem Schritt weiter + + L #Bereichs_Nr ;//Bereich-Nr. + T "MW190"; + + L 0; + T "MW198"; + UC FC[ #DraussenFC] ;//z.Bsp. Daten anpassen + +NoFC: SPA ENDE_Mig; ---- NW 12: Plus: Trolley fährt nicht bis Zähl-Sensor --- - L Dyn.Raus_Trolleys - L 0 // Trolles unterwegs? - ==I // Nein! - O Trolley_draussen // Sensor wurde erreicht - O Dyn.Status.Reset_aktiv - JC RTTD +NETWORK +TITLE = Schrittkette beenden +ENDE_Mig: L 0;//Schritt 0: Warten + T #Dyn.Sk.Akt_Schritt; - AN Antrieb_plus_aktiv - A Bereich.Parameter_allg.Antrieb_Plus_vorhanden - ON "1s-Impuls" - O Dyn.Error.Err_Raus_Sensor // Trolley fährt nicht aus - JC En12 + L 0;//Zeitwert löschen + T #Dyn.Sk.Terr_Zelle; + T #Dyn.Sk.Tok_Zelle; - L Dyn."Zeit_Ausfahren_Ohne_B_Zähl" - + 1 - T Dyn."Zeit_Ausfahren_Ohne_B_Zähl" + SET; + R #Dyn.Sk.Err_Uebzeit; -// Trolley fährt nicht bis Zähl-Sensor!: - L Bereich."Übzeit_aus_Bereich" - >=I - S Dyn.Error.Err_Raus_Sensor // Trolley fährt nicht aus - JCN En12 // Negierter Sprung! + SPA RET; - L Dyn.Raus_Trolleys - + -1 - T Dyn.Raus_Trolleys +NETWORK +TITLE = Nächsten Schritt aktivieren +Plus: T #Dyn.Sk.T_ok;//Wartezeit übergeben + + U #Dyn.Sk.Err_Uebzeit;//Störung noch nicht quittiert + SPB RET; - JU En12 + L 0;//keine Wartezeit ? + ==I;//Ja ! -> sofort weiter + SPB w220; + + UN #Warte_neu;//Wartezeit neutriggern + SPB W220_Mig; -RTTD: L 0 - T Dyn."Zeit_Ausfahren_Ohne_B_Zähl" + L 0; + T #Dyn.Sk.Tok_Zelle;//Wartezeit - SET - R Dyn.Error.Err_Raus_Sensor // Trolley fährt nicht aus +W220_Mig: U #Warte_stop;//Wartezeit stoppen + SPB RET; -En12: NOP 0 + L #Dyn.Sk.Tok_Zelle; + L "MW4";//Wartezeit +10ms + +I; + T #Dyn.Sk.Tok_Zelle;//Wartezeit + L #Dyn.Sk.T_ok;//abgelaufen ? + I;//abgelaufen ? + UN #Dyn.Sk.Err_Uebzeit; + SPB en24;//Nein ! -Warte: L Dyn.Wartezeit - + -1 - T Dyn.Wartezeit + U #Ueb_akt;//Überwachungszeit aktivieren + S #Dyn.Sk.Err_Uebzeit; - L 0 // Minimum unterschritten? - >=I // Nein! - JC X900 + L 0;//Zeitwert löschen + T #Dyn.Sk.Terr_Zelle; - T Dyn.Wartezeit // Minimum übergeben + SPA RET; -X900: NOP 0 +en24: NOP 0; +NETWORK +TITLE = Überwachungszeit +1 + UN #Dyn.Sk.Ueb_akt;//Schrittaktion ist aktiv + ON "1s-Impuls"; + SPB RET; + L #Dyn.Sk.Terr_Zelle; + + 1 ;//Üb.zeit +1s + T #Dyn.Sk.Terr_Zelle; ---- NW 14: Anfangs-Sensor auswerten --- - L Bereich.Bereich_Dyn_DB - T SSDB - - L Bereich.Bereich_Dyn_DW - L 110 - +I - T SSDW - - A B_BereichsAnfang - A Antrieb_Bereich_aktiv - AN Dyn.Status."Anfangs-Sensor_ausgewertet" - S Dyn.Status."Anfangs-Sensor_ausgewertet" - JCN ReinEn // Negierter Sprung - -// Abstand schon gespeichert?: - L Bereich.Fahrzeit - L 1 // Sinnvoller Wert? - <=I // Nein ! - L 999 // Bei Inilauf - T "MW220" - S Dyn.Status.Inilauf_aktiv - JC Save - - L Bereich.Fahrzeit - L Dyn."Laufzähler" - +I // Abstand dazu addieren - T "MW220" - -// Eintrag in Trolley-Bereichsliste -Save: CALL FC "DatenIn" (SSDB:=SSDB, SSDW:=SSDW, INDATEN:=P#M220.0, RE_VAL:="MB199") - -// Wartezeit (Einlagern blöckieren) speichern: - L 6 // 6s wegen nach 5s draussen - T Dyn.Wartezeit // Damit genügend Abstand zwischen 2 Trolleys - -ReinEn: NOP 0 - - ---- NW 15: Ende-Sensor auswerten --- - A ErrQuit // Überwachungszeit abgelaufen quittieren - A Dyn.Error.Err_Trolley_nicht_am_Ende // Trolley fährt nicht in Bereich - R Dyn.Error.Err_Trolley_nicht_am_Ende // Trolley fährt nicht in Bereich - S Antrieb_Bereich_start - JC Delete - - A B_BereichsEnde - A( - O Antrieb_Bereich_aktiv - O Dyn.Error.Err_Trolley_nicht_am_Ende - ) - AN Dyn.Status."Ende-Sensor_ausgewertet" - S Dyn.Status."Ende-Sensor_ausgewertet" - JCN EndeEn // Negierter Sprung - - A Dyn.Status.Inilauf_aktiv - R Dyn.Status.Inilauf_aktiv - JCN Delete // Negierter Sprung - - L Dyn."Laufzähler" - + -3 // damit mehr Sicherheit! - T Bereich.Fahrzeit // Abstand speichern - -// /Austrag aus Trolley-Bereichsliste -Delete: CALL FC "DatenOut" (SSDB:=SSDB, SSDW:=SSDW, PARA:=16#F100, SEARCHDATEN:="MW220", RE_VAL:="MB199", OUTDATEN:="MW220", Position:="MW196") // 1.Datensatz lesen - -CALL FC "DatenOut" (SSDB:=SSDB, SSDW:=SSDW, PARA:=16#E100, SEARCHDATEN:="MW220", RE_VAL:="MB199", OUTDATEN:="MW220", Position:="MW196") // Angegebenen Datensatz austragen - -EndeEn: NOP 0 - - ---- NW 16: Restzeit ermitteln --- -// Keine Daten gespeichert?: - AN Dyn.Status.Trolley_ist_im_Bereich - L 999 // Einfahren erlaubt - JU Rest // Aktuell ohne Berechnung - -// Auswertung des nächsten Trolleys: -CALL FC "DatenOut" (SSDB:=SSDB, SSDW:=SSDW, PARA:=16#F100, SEARCHDATEN:="MW220", RE_VAL:="MB199", OUTDATEN:="MW220", Position:="MW196") // 1.Datensatz lesen - - L "MW220" // Bei dieser Zeit wird Trolley am B_BereichsEnde erwartet - L Dyn."Laufzähler" - -I - T Restzeit_errechnet -Rest: T Dyn.Restzeit - -// Restzeit nullen?: -// Laufzähler-Überlauf oder sonst Einfahrt blockieren: - L Dyn."Laufzähler" - L 32000 // wird zu groß? - >I // Ja ! - O Dyn.Status.Inilauf_aktiv - O Dyn.Status.Reset_aktiv - O Dyn.Status.Error_aktiv - O Dyn.Status."Anfangs-Sensor_ausgewertet" - O( - L Dyn.Sk.Akt_Schritt - L 0 // Warten auf Trolley? - <>I // //Nein, also am Ende, fährt aus,...! - ) - O( - L Dyn.Wartezeit // Damit genügend Abstand zwischen 2 Trolleys - L 0 // Einfahren noch blockieren ? - >I // Ja! - ) - JC KeinEinfahren // Einfahren nicht erlaubt - - L Dyn.Restzeit - L 0 // sinnvoller Wert? - >=I // Ja! - A( - L Dyn.Trolley_DL.Datenlistenkopf.AnzahlEintraege - L Dyn.Trolley_DL.Datenlistenkopf.LAENGE - I // Ja! - = ZielFC_vorhanden - - L Bereich.Draussen_FC - T DraussenFC - L 0 // Parameter vorhanden ? - >I // Ja! - = DraussenFC_vorhanden - - ---- NW 18: Error: Stau Bereich-Eingang --- -// Sensor bei Bereichs-Einfahrt bleibt belegt?: - AN B_BereichsAnfang // Sensor Trolley fährt in Bereich (kein Stau !) - O ErrQuit - R Dyn.Error.Err_Stau_Eingang // Stau bei Einfahrt - JC X090 // StauZeit neu aufziehen - - AN "1s-Impuls" - ON Antrieb_Bereich_aktiv - O Dyn.Error.Err_Stau_Eingang // Zeit bereits abgelaufen - JC Xn09 - - L Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - + +1 - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - - L 10 // Stau-Zeit erreicht ? - >=I // Ja ! - S Dyn.Error.Err_Stau_Eingang // Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb - JCN Xn09 - -X090: L 0 // Zeiten löschen - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - -Xn09: NOP 0 - - ---- NW 19: Schrittkette anhalten --- - A Dyn.Sk.Auto_akt // Automatik ist aktiv - A Dyn.Sk.Bereich_ok - CLR - - JU en08_Mig // Schrittkette nicht anhalten ! - - SET - R Dyn.Sk.Err_Uebzeit // Störungen löschen - R Dyn.Sk.Err_Schritt - - L 0 // Zeitwerte löschen - T Dyn.Sk.Terr_Zelle - T Dyn.Sk.Tok_Zelle - - JU RET - -en08_Mig: NOP 0 - - ---- NW 20: Sprungverteiler --- - L Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - L -1 // angegeben ? - ==I // Nein ! - JC NEU - - CAC // Neuen Schritt übergeben - T Dyn.Sk.Akt_Schritt - - L -1 // Urzustand - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - -NEU: SET - R Warte_neu // Wartezeit neutriggern - R Warte_stop // Wartezeit stoppen - - L Dyn.Sk.Akt_Schritt - JL Ende - JU s000 // Schritt 0 - JU s001 // Schritt 1 - JU s002 // Schritt 2 - JU s003 // Schritt 3 - JU s004 // Schritt 4 - JU s005 // Schritt 5 - JU s006 // Schritt 6 - JU s007 // Schritt 7 - JU s008 // Schritt 8 - JU s009 // Schritt 9 - JU s010 // Schritt 10 - JU s011 // Schritt 11 - JU s012 // Schritt 12 - JU s013 // Schritt 13 - JU s014 // Schritt 14 - JU s015 // Schritt 15 - JU s016 // Schritt 16 - JU s017 // Schritt 17 - JU s018 // Schritt 18 - JU s019 // Schritt 19 - JU s020 // Schritt 20 - JU s021 // Schritt 21 - JU s022 // Schritt 22 - JU s023 // Schritt 23 - JU s024 // Schritt 24 - JU s025 // Schritt 25 - JU s026 // Schritt 26 - JU s027 // Schritt 27 - JU s028 // Schritt 28 - JU s029 // Schritt 29 - JU s030 // Schritt 30 -Ende: S Dyn.Sk.Err_Schritt // Undefinierter Schritt - - L 16#A131 - T Dyn.Stop_Ursache - - JU RET - -Neu_Mig: A Dyn.Sk.Err_Uebzeit - JCN Sk - - L 16#A132 - T Dyn.Stop_Ursache - - JU RET - -Sk: T Dyn.Sk.Akt_Schritt - - L 0 // Zeitwerte löschen - T Dyn.Sk.Terr_Zelle - T Dyn.Sk.Tok_Zelle - - JU NEU - -// Nicht programmierte Schritte: -// s000: SPA Ende -// s001: SPA Ende -// s002: SPA Ende -// s003: SPA Ende -// s004: SPA Ende -// s005: SPA Ende -s006: JU Ende -s007: JU Ende -s008: JU Ende -s009: JU Ende -s010: JU Ende -s011: JU Ende -s012: JU Ende -s013: JU Ende -s014: JU Ende -s015: JU Ende -s016: JU Ende -s017: JU Ende -s018: JU Ende -s019: JU Ende -s020: JU Ende -s021: JU Ende -s022: JU Ende -s023: JU Ende -s024: JU Ende -s025: JU Ende -s026: JU Ende -s027: JU Ende -s028: JU Ende -s029: JU Ende -s030: JU Ende - - ---- NW 21: Schritt X: Reserve --- - SET // Weiterschaltbedingung - = Weiter - -// Schrittaktionen: - SET - - L 16#B001 - T Dyn.Stop_Ursache - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - L 0 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - L 1 // Weiter mit Schritt 1 - JC Neu_Mig // Bei diesem Schritt weiter - - SET - A Dyn.Sk.Auto_akt // Automatik ist aktiv - A Dyn.Sk.Bereich_ok - = Ueb_akt // Überwachungszeit aktivieren - L 50 // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - - JU RET - - ---- NW 22: Schritt 0: Warten auf Trolley am Bereichs-Ende --- -s000: SET // Weiterschaltbedingung - A B_BereichsEnde // Trolley im Bereich erkannt - A( - O Antrieb_Bereich_aktiv - O Dyn.Error.Err_Trolley_nicht_am_Ende - ) - = Weiter - -// Schrittaktionen: - SET - R Dyn.Error.Err_Trolley_raus - -// Antriebe: -// siehe Nw10 - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - L 0 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - L 16#B001 - T Dyn.Stop_Ursache - -// Überwachungszeit starten: - A Dyn.Status.Trolley_ist_im_Bereich - A Antrieb_Bereich_aktiv - = Ueb_akt // Überwachungszeit aktivieren - -// Reset aktiv? - A Dyn.Status.Reset_aktiv - A Dyn.Sk.Err_Uebzeit - R Dyn.Sk.Err_Uebzeit - JC Reset_fertig - - L Restzeit_errechnet - L -20 // Trolley schon 20s überfällig - Kein Trolley drin! - A Dyn.Sk.Err_Uebzeit - JCN X000 // Negierter Sprung - - SET - R Dyn.Sk.Err_Uebzeit - R Dyn.Error.Err_Trolley_nicht_am_Ende + SPA RET; - JU Delete // Trolley aus Liste löschen +NETWORK +TITLE = Return +RET: NOP 0; -X000: L Bereich."Übzeit_in_Bereich" - JU tueb // Überwachungszeit +NETWORK +TITLE = Ende + BE; -Reset_fertig: SET - R Dyn.Status.Reset_aktiv - R Dyn.Status.Inilauf_aktiv - - L 0 - T Dyn.Raus_Trolleys - -// Trolleydaen löschen: -CALL FC "DatenReset" (SSDB:=SSDB, SSDW:=SSDW, RE_VAL:="MB199") - - JU ENDE_Mig - - ---- NW 23: Schritt 1: Trolley ist am Bereichsende --- -s001: NOP 0 -// Schrittaktionen: - SET - = Weiter - R Dyn.Error.Err_Trolley_nicht_am_Ende - - AN Weiter - JC RET - - L 2 // Weiter mit Schritt 2 (Ziel-FC?) - JU Neu_Mig // Bei diesem Schritt weiter - - ---- NW 24: Schritt 2: Ziel-FC --- -s002: NOP 0 - -// Schrittaktionen: - SET - S Dyn.Status.Trolley_am_BereichsEnde - S Dyn.Status."Trolley_wartet_auf_Ziel-FC" - - AN ZielFC_vorhanden - R Dyn.Status."Trolley_wartet_auf_Ziel-FC" - L 3 // Weiter mit Schritt 3 (Ausfahren ok?) - JC Neu_Mig // Bei diesem Schritt weiter - - SET // Rückmeldungen erst mal resetten - R "M180.6" // Weiterfahrt von Ziel-FC erlaubt - L Bereichs_Nr // Bereich-Nr. - T "MW190" // übergeben - L 0 // Erst mal nullen - T "MW194" // übergeben - T "MW196" // übergeben - T "MW198" // Weichenziel - - UC DB[ZielFC] // Beeinflussung der Weiterfahrt - - L 16#B102 - T Dyn.Stop_Ursache - - AN "M180.6" // Weiterfahrt von Ziel-FC erlaubt - JC RET - - L 3 // Weiter mit Schritt 3 (Ausfahren ok?) - JU Neu_Mig // Bei diesem Schritt weiter - - ---- NW 25: Schritt 3: Start ok ? --- -s003: NOP 0 - -// Schrittaktionen: - -// Anlage aus oder Störung: - L 16#B031 - T Dyn.Stop_Ursache - - AN Dyn.Sk.Auto_akt // Automatik ist aktiv - ON Dyn.Sk.Bereich_ok // Bereich ist gestört - JC X003 - -// Starten erlaut Trolley ?: - L 16#B032 - T Dyn.Stop_Ursache - - AN Start_Ok // Starten ist erlaubt - JC X003 - -// Stau im Bereich +1: - L 16#B033 - T Dyn.Stop_Ursache - - SET - S Dyn.Status."Trolley_wartet_Bereich+1" - - A B_Stau_raus // Sensor Stau im Bereich rausfahren - JC X003 - -// B_Aus_Bereich aktiv: - L 16#B034 - T Dyn.Stop_Ursache - - L Dyn.Raus_Trolleys - L 0 // Trolleys schon unterwegs? - <>I // Ja! - A Dyn.Status."Trolley an Raus-Sensor" - O Dyn.Status."Stau_an_Raus-Sensor" - = Dyn.Error.Err_Raus_Sensor // Raus-Sensor wird nicht erreicht (oder dauernd aktiv)! - JC X003 - -// Zu viele Raus-Trolleys unterwegs: - L 16#B027 - T Dyn.Stop_Ursache - - L Dyn.Raus_Trolleys // Gestartete Trolleys - L Bereich.MaxRausTrolleys // Erlaubte Anzahl gestarteter Trolleys - >=I - JC X003 - -// Antriebe aktivieren / aktiv ?: - A Bereich.Parameter_allg.Antrieb_Plus_vorhanden // Bereich an weiterem Antrieb (Weiche) - S Antrieb_plus_vor // Antrieb plus einschalten - - A( - O Antrieb_plus_aktiv // Antrieb plus aktiv - ON Bereich.Parameter_allg.Antrieb_Plus_vorhanden // Bereich an weiterem Antrieb (Weiche) - ) - S Antrieb_Bereich_vor // Antrieb einschalten - - L 16#B036 - T Dyn.Stop_Ursache - - AN Antrieb_plus_aktiv // Antrieb plus aktiv - A Bereich.Parameter_allg.Antrieb_Plus_vorhanden // Bereich an weiterem Antrieb (Weiche) - JC X003 - - SET - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - - L Dyn.Raus_Trolleys - + 1 // Gestartete Trolleys + 1 - T Dyn.Raus_Trolleys - - L 4 // Weiter mit Schritt 4 (Trolley fährt aus) - JU Neu_Mig // Bei diesem Schritt weiter - -X003: L 2 // Beginn mit Schritt 2 (Ziel-FC?) - T Dyn.Sk.Neu_Schritt - JU RET - - ---- NW 26: Schritt 4: Trolley fährt aus ? --- -s004: SET // Weiterschaltbedingung - AN B_BereichsEnde // Sensor Trolley ist in Bereich - A Antrieb_Bereich_aktiv - A( - O Antrieb_plus_aktiv // Antrieb plus aktiv - ON Bereich.Parameter_allg.Antrieb_Plus_vorhanden // Bereich an weiterem Antrieb (Weiche) - ) - = Weiter - -// Schrittaktionen: - SET - S Dyn.Status."Trolley_fährt_aus" - -// Antriebe: -// siehe Nw10 - -// 5 s ohne Trolley-Signal: - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - L 500 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - -// Trolley fährt nicht aus: - A Dyn.Sk.Err_Uebzeit - S Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - -// Automatisches löschen, falls Sensor spinnt: - AN B_BereichsEnde // Sensor Trolley ist in Bereich - A Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - A Dyn.Sk.Err_Uebzeit - R Dyn.Sk.Err_Uebzeit - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - - L 16#B041 - T Dyn.Stop_Ursache - - A Antrieb_plus_aktiv - = Ueb_akt // Überwachungszeit aktivieren - L 20 // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - - ---- NW 27: Schritt 5: Trolley ist draussen --- -s005: NOP 0 - -// Trolley hat Bereich verlassen: - SET - S Dyn.Status.Trolley_draussen // 1 Zyklus - R Dyn.Status.Trolley_am_BereichsEnde - R Dyn.Status."Trolley_fährt_aus" - - L Dyn.Gefahrene_Trolleys - + DINT#1 // Gefahrene Trolleys +1 - T Dyn.Gefahrene_Trolleys - -// Draussen-FC ?: - AN DraussenFC_vorhanden - JC NoFC // Bei diesem Schritt weiter - - L Bereichs_Nr // Bereich-Nr. - T "MW190" - - L 0 - T "MW198" - - UC DB[DraussenFC] // z.Bsp. Daten anpassen - -NoFC: JU ENDE_Mig - - ---- NW 28: Schrittkette beenden --- -ENDE_Mig: L 0 // Schritt 0: Warten - T Dyn.Sk.Akt_Schritt - - L 0 // Zeitwert löschen - T Dyn.Sk.Terr_Zelle - T Dyn.Sk.Tok_Zelle - - SET - R Dyn.Sk.Err_Uebzeit - - JU RET - - ---- NW 29: Nächsten Schritt aktivieren --- -Plus: T Dyn.Sk.T_ok // Wartezeit übergeben - - A Dyn.Sk.Err_Uebzeit // Störung noch nicht quittiert - JC RET - - L 0 // keine Wartezeit ? - ==I // Ja ! -> sofort weiter - JC w220 - - AN Warte_neu // Wartezeit neutriggern - JC W220_Mig - - L 0 - T Dyn.Sk.Tok_Zelle // Wartezeit - -W220_Mig: A Warte_stop // Wartezeit stoppen - JC RET - - L Dyn.Sk.Tok_Zelle - L "MW4" // Wartezeit +10ms - +I - T Dyn.Sk.Tok_Zelle // Wartezeit - L Dyn.Sk.T_ok // abgelaufen ? - I // abgelaufen ? - AN Dyn.Sk.Err_Uebzeit - JC en24 // Nein ! - - A Ueb_akt // Überwachungszeit aktivieren - S Dyn.Sk.Err_Uebzeit - - L 0 // Zeitwert löschen - T Dyn.Sk.Terr_Zelle - - JU RET - -en24: NOP 0 - ---- NW 31: Überwachungszeit +1 --- - AN Dyn.Sk.Ueb_akt // Schrittaktion ist aktiv - ON "1s-Impuls" - JC RET - - L Dyn.Sk.Terr_Zelle - + 1 // Üb.zeit +1s - T Dyn.Sk.Terr_Zelle - - JU RET - - ---- NW 32: Return --- -RET: NOP 0 - - ---- NW 33: Ende --- - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Module/MHMOmniSchleuse.awl b/=A01+UH07-KF00/Programmbausteine/Module/MHMOmniSchleuse.awl index a52514a..1821103 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/MHMOmniSchleuse.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/MHMOmniSchleuse.awl @@ -1,2402 +1,2509 @@ -=== FB 1274: MHMOmniSchleuse [STL] === -INTERFACE: - Input: - Schleusen_Nr : Int // Aufruf für Schleuse - ErrQuit : Bool // Ablaufstörung quittieren - B_VorSchleuse : Bool // Sensor Trolley fährt in Bereich - B_InSchleuse : Bool // Sensor Trolley ist in Schleuse - B_AusSchleuse : Bool // Sensor Trolley hat Schleuse verlassen - B_Stau_raus : Bool // Sensor Stau im Bereich rausfahren - Start_Ok : Bool // Starten ist erlauTrolley - Antrieb_Schleuse_aktiv : Bool // Kreisel-Antrieb aktiv - Antrieb_plus_aktiv : Bool // Kreisel-Antrieb plus aktiv - Schleuse_geöffnet : Bool // Schleuse hat geöffnet - RestZeit_Bereich_plus : Int := 999 // Bereich +1: Restzeit bis AFS stoppt (s) - Output: - Y_Schleuse_Auf : Bool // Schleuse öffnen - Error : Word // Störungen übergeben - InOut: - Antrieb_Schleuse_vor : Bool // Schleusen-Antrieb einschalten - Antrieb_Schleuse_start : Bool // Schleusen-Antrieb mit Zeit starten - Antrieb_Schleuse_stop : Bool // Schleusen-Antrieb stoppen - Antrieb_Schleuse_PS : Bool // Schleusen-Antrieb Energie sparen - Antrieb_plus_vor : Bool // Antrieb plus einschalten - Antrieb_plus_start : Bool // Antrieb plus mit Zeit starten - hStOk : Bool // Anzeige Start n. Störung aktivieren - Static: - SAVE : Struct - Weichen_DB : Int // Weichen-FIFO-DB - Weichen_DW : Int // Weichen-FIFO-DW - Weiche+1 : Int // Weiche +1, wo reserviert wurde - Frei18 : Int - Frei20 : Int - Para : Struct // Parameter - Schleusen_DL_DB : Int // Einsprung Schleuse-Datenliste-DB - Weichen_DL_DB : Int // Einsprung Weichen-Datenliste-DB - Leser_DL_DB : Int // Einsprung Weichen-Datenliste-DB - Status2 : Struct - Trolley_an_Schleuse : Bool // Trolley ist an Schleuse - Warten_3.V : Bool // Warten auf 3.V - 2.Lesung_aktiv : Bool // 2.Lesung erfolgt - 3.Lesung_aktiv : Bool // 3.Lesung erfolgt - TrolleyPos_übergeben : Bool // Trolley-Pos. übergeben - Warten_4.V : Bool // Warten auf 4.V - Ausfahrzeit_lernen : Bool // Ausfahrzeit lernen - Weichen-Schritt : Bool // Schritt 13-17 aktiv (Weiche evtl. belegen) - Trolley_ist_draussen : Bool // Rückmeldung von Sensor / Weiche - Einfahrzeit_lernen : Bool // Ausfahrzeit lernen - Telegramm_gesendet : Bool // Telegramm wurde in Send-FIFO eingetragen - Schleuse : "UDLHMOmniSchleuse" // Statische Schleusendaten (aus DL) - Dyn : Struct // Dynamische Daten - Status : Struct - Trolley_fährt_in_Schleuse : Bool // Trolley fährt in Schleuse - Trolley_wartet_Lesung : Bool // Trolley wartet auf Auftrag - Trolley_wartet_auf_Ziel-FC : Bool - Trolley_wartet_auf_Weiche+1 : Bool - Trolley_wartet_Bereich+1 : Bool // Trolley wartet auf Bereich +1 - Trolley_fährt_aus : Bool // Trolley fährt aus - MindestZeit_ok : Bool // Schleuse ist MindestZeit geöffnet - Trolley_draussen : Bool // Trolley ist ausgefahren - Leser_triggern : Bool - SF_angefordert : Bool - Kein_Stop_mehr : Bool // Kein Stop mehr, Antrieb soll starten - Trolley_fährt_rückwärts : Bool // Trolley in Schleuse rückwärts erkannt - Weiche_geschaltet : Bool - Trolley ausserhalb Weiche : Bool // Trolley hat Weiche verlassen (von Weiche) - Error_aktiv : Bool // Störung vorhanden - Reset_aktiv : Bool := TRUE // Reset aktiv - TrolleyID_Schleuse : DInt // Trolley-Nr in der Schleuse - Trolley_EndZiel : Word // Trolley-EndZiel - Trolley_ZwischenZiel : Word // Trolley-ZwischenZiel - Trolley_ShopGroup : DInt // Trolley-ShopGroup - Weichen_Ziel : Word // Weichen-Ziel (Für WeichenModul von Ziel-FC) - TrolleyID_Eingefahren : DInt // Trolley-Nr von Bereich -1 gemeldet - TrolleyID_ausgefahren : DInt // TrolleyID des ausgefahrenen Trolleys - HMI : Struct - TrolleyID_in_Schleuse : DInt // Trolley-Nr in Schleuse (IN:PLC, OUT:PLC) - TrolleyID_Input : DInt // Trolley-Nr Input (IN:HMI, OUT:PLC) - Schleuse_resetten : Bool // Schleuse resetten (IN:HMI, Out:PLC) - Sk : "USk_ILS" // Status der Schrittkette - Leser : Struct - IN : Struct - xOutReadyForNewScan : Bool // DBX10.1: Reader ist bereit für Leseanforderung - xOutReadingDone : Bool // DBX10.0: Lesevorgang abgeschlossen / Handshake raus - xOutCodeGood : Bool // DBX278.0: Gute Lesung - xOutCodeBad : Bool // DBX278.1: Schlechte Lesung - nOutBarcode : DInt // DBD12: Trolley ID - OUT : Struct - xInStartReading : Bool // DBX4.1: Starte Lesevorgang - xInHandshakeDone : Bool // DBX4.2: Handshake Daten abgeholt - xInErrQuit : Bool // DBX4.4: Fehler rücksetzen - xInReset : Bool // DBX4.5: Allgemeines Rücksetzen des Bausteins - TrolleyID_unbekannt_Schleuse : DInt // TrolleyID unbekannt (Trolley in Schleuse) - Rueckmld : Struct - RET_VAL_BLKMOV_Schleuse : Int // Rückmeldung nach BLKMOV-Aufruf - RET_VAL_DL_Schleuse : Byte - RET_VAL_DL_Weiche : Byte // Rückmeldung nach DatenOut-Aufruf - RET_VAL_DL_Leser : Byte // Rückmeldung nach DatenOut-Aufruf - Error : "UErrHMOmniSchleuse" - Stau_Zeit : Int // Sensor B_VorSep ist belegt [100ms] - Mindest_Zeit : Int // Sensor B_VorSep ist frei [100ms] - Leer_Zeit : Int - Stop_Ursache : Word // Stop-Stelle: Nw + Position - Vereinzelungstakte : DInt // Anzahl der getätigten Vereinzelungstakte - ZwischenZiel_eingefahren : Word // Trolley-ZwischenZiel von Bereich -1 - Ohne_B : Int - SAVE2 : Struct - Leser_DB : Int // Weichen-FIFO-DB - Leser_DD : DInt // Weichen-FIFO-DD - WarteZeit_PS : Int - Restzeit_bis_Schleuse : Int - Res200 : Array[1..16] of Int // Reserve - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ueb_akt : Bool // Überwachungszeit aktivieren - Weiter : Bool // Weiterschaltbedingung ist erfüllt - Warte_neu : Bool // Wartezeit neu triggern - Warte_stop : Bool // Wartezeit stoppen - Kein_Weichenbereich +1 : Bool - Reservierung_Weiche+1_aktiv : Bool - Leser_Zugriff : Bool // Leser-Zugriff vorhanden - LeserFC_vorhanden : Bool - ZielFC_vorhanden : Bool - DraussenFC_vorhanden : Bool - TrolleyID_Bereich-1 : Bool // Trolley--ID von Bereich -1 gemeldet - Einfahrzeit_nicht_bekannt : Bool - LeserFC : Word // Ziel-FC - ZielFC : Word // Ziel-FC - DraussenFC : Word // Draussen-FC - AR1Start : DInt // Startwert mit Offset 0 - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - Constant: - ---- NW 1: Parameter-Übergabe --- - L Schleusen_Nr - - L 274 // Einsprung Schleuse-DL - T Para.Schleusen_DL_DB // vor Aufruf übergeben! - - L 279 // Einsprung Weichen-DL - T Para.Weichen_DL_DB // vor Aufruf übergeben! - - L 273 - T Para.Leser_DL_DB - - ---- NW 2: Anzeige OP --- - A ErrQuit // Überwachungszeit abgelaufen quittieren - R Dyn.Sk.Err_Uebzeit - - L 252 // Bereichsstop aktiv - AN Dyn.Sk.Bereich_ok // Also: Bereichsstop / Not-Aus - JC w010 - - L 253 - AN Dyn.Sk.Auto_akt // Keine Betriebsart - AN Dyn.Sk.Hand_akt - JC w010 - - L 255 // Handbetrieb aktiv - A Dyn.Sk.Hand_akt - JC w010 - - L Dyn.Sk.Akt_Schritt // Aktiver Schritt -w010: T Dyn.Sk.OP_Schritt - - ---- NW 3: Out-Bits zum Zurücksetzen --- - SET - R Y_Schleuse_Auf - - SET // Jeden Zyklus neu - R Dyn.Status.Trolley_wartet_Lesung - R Dyn.Status."Trolley_wartet_auf_Ziel-FC" - R Dyn.Status."Trolley_wartet_auf_Weiche+1" - R Dyn.Status."Trolley_wartet_Bereich+1" - R Dyn.Status."Trolley_fährt_aus" - R Dyn.Status.Trolley_draussen - R Leser_Zugriff - R Status2."Weichen-Schritt" - - A Dyn.Sk.Reset_Akt - = Dyn.Status.Reset_aktiv - - ---- NW 4: HMI-Zeug --- -// Von HMI: - A Dyn.HMI.Schleuse_resetten - R Dyn.HMI.Schleuse_resetten // von HMI - S Dyn.Sk.Reset // SK zurücksetzen - - L Dyn.HMI.TrolleyID_Input // Wird direkt im Programm verwertet (s.u.) - -// An HMI: -ToHMI: L Dyn.TrolleyID_Schleuse - T Dyn.HMI.TrolleyID_in_Schleuse - - ---- NW 5: Schrittkette zurücksetzen --- - A ErrQuit // Überwachungszeit abgelaufen quittieren - R Dyn.Sk.Err_Uebzeit - - AN Dyn.Sk.Reset // SK zurücksetzen - JC en04 - -// Schrittkette zurücksetzen: - L 0 // Schritt 0: Warten - T Dyn.Sk.Akt_Schritt - - L 0 // Zeitwert löschen - T Dyn.Sk.Terr_Zelle - T Dyn.Sk.Tok_Zelle - - SET - R Dyn.Error.Err_BLKMov // Error bei Block kopieren - R Dyn.Sk.Reset // SK zurücksetzen - R Dyn.Sk.Err_Schritt // Undefinierter Schritt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - R Status2.Telegramm_gesendet - S Dyn.Sk.Reset_Akt // Reset ist aktiv - - SET - R Dyn.Error.Schleuse_DL // Schleuse-Datenliste fehlerhaft - R Dyn.Error.Undef_Schleuse // undefinierter Schleuse - R Dyn.Error.Err_Trolley_nicht_in_Schleuse // Trolley fährt nicht in Schleuse - R Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen - R Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert - R Dyn.Error.Err_Stau_Einfahrt - R Dyn.Error.Err_BLKMov - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - R Dyn.Error.Err_Raus_Sensor // Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! - R Dyn.Error.Err_Ziel // kein Ziel angegeben - R Dyn.Error.Err_Weichen_DL // Weichen-Datenliste fehlerhaft - R Dyn.Error.Err_Undef_Weiche // undefinierte Weiche - R Dyn.Error.Err_Weiche_belegt // Weiche bleibt belegt - R Dyn.Error.Err_Kein_LeseErgebnis - R Dyn.Error.Err_Leser_nicht_bereit - - L DINT#0 - T Dyn.Leser.IN.nOutBarcode - - L 0 - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [10ms] - T Dyn.Mindest_Zeit // Sensor B_VorSep ist frei [10ms] - T SAVE."Weiche+1" - T SAVE.Weichen_DB - T SAVE.Weichen_DW - T Dyn.SAVE2.Leser_DB - L DINT#0 - T Dyn.SAVE2.Leser_DD - -// Defaultwerte übergeben: - L 0 // Damit statische Werte neu aus Datenbank geholt werden ! - T Schleuse.Schleusen_Nr // Nummer des Schleuses - - JU RET - -en04: NOP 0 - - ---- NW 6: Störungen nach Außen übergeben --- - L 0 - T "MW200" - - A Dyn.Error.Schleuse_DL // Schleuse-Datenliste fehlerhaft - = "M200.0" - A Dyn.Error.Undef_Schleuse // undefinierter Schleuse - = "M200.1" - A Dyn.Error.Err_Trolley_nicht_in_Schleuse // Trolley fährt nicht in Schleuse - = "M200.2" - A Dyn.Sk.Err_Uebzeit - = Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen - = "M200.3" - NEG - R Dyn.Sk.Err_Uebzeit_AnzOk - A Dyn.Sk.Err_Schritt - = Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert - = "M200.4" - A Dyn.Error.Err_Stau_Einfahrt - AN B_InSchleuse - AN Y_Schleuse_Auf - = "M200.5" - A Dyn.Error.Err_BLKMov // Error bei Block kopieren - = "M200.6" - A Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - = "M200.7" - A Dyn.Error.Err_Raus_Sensor // Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! - = "M201.0" - A Dyn.Error.Err_Ziel // Trolley-Ziel nicht bekannt - = "M201.1" - A Dyn.Error.Err_Weichen_DL // Weichen-Datenliste fehlerhaft - = "M201.2" - A Dyn.Error.Err_Undef_Weiche // undefinierte Weiche - = "M201.3" - A Dyn.Error.Err_Weiche_belegt // Weiche bleibt belegt - = "M201.4" - A Dyn.Error.Err_Kein_LeseErgebnis - = "M201.5" - A Dyn.Error.Err_Leser_nicht_bereit - = "M201.6" - A Dyn.Error.Barcode_nicht_bekannt - = "M201.7" - -// Andere Meldung als Überwachungszeit aktiv ?: - L "MW200" - L 2#1111_0111_1111_1111 - AW - L 2#0000_0000_0000_0000 // Andere Meldung als Üb.zeit aktiv ? - <>I // Ja ! - ON Dyn.Sk.Err_Uebzeit_AnzOk // Störung anzeigen ok, da 2.Zyklus aktiv ! - R "M200.3" // Üb.Zeit-Meldung nicht an PC senden - - A Dyn.Sk.Err_Uebzeit - S Dyn.Sk.Err_Uebzeit_AnzOk // Störung anzeigen ok, da 2.Zyklus aktiv ! - - L "MW200" - T Error // Schnittstelle nach Außen - -// Störung vorhanden: - L 0 - <>I // Ja ! - = Dyn.Status.Error_aktiv - S hStOk - -// Antrieb stoppen: - A( - ON Dyn.Sk.Auto_akt // SystemVoraussetzungen fehlen - O Dyn.Sk.Hand_akt - ON Dyn.Sk.Bereich_ok - ) - S Antrieb_Schleuse_stop // Antrieb stoppen - -// Störungen pro Zyklus neu erzeugen: - SET - R Dyn.Error.Schleuse_DL // Schleuse-Datenliste fehlerhaft - R Dyn.Error.Undef_Schleuse // undefinierter Schleuse -// / R #Dyn.Error.Err_Trolley_nicht_in_Schleuse//Trolley fährt nicht in Schleuse -// / R #Dyn.Error.Err_Uebzeit //Überwachungzeit ist abgelaufen - R Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert -// / R #Dyn.Error.Err_Stau_Einfahrt//Betriebsart ist nicht möglich - R Dyn.Error.Err_BLKMov -// / R #Dyn.Error.Err_Trolley_raus//Trolley fährt nicht aus - R Dyn.Error.Err_Raus_Sensor // Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! - R Dyn.Error.Err_Ziel // Trolley-Ziel nicht bekannt - R Dyn.Error.Err_Weichen_DL // Weichen-Datenliste fehlerhaft - R Dyn.Error.Err_Undef_Weiche // undefinierte Weiche - R Dyn.Error.Err_Weiche_belegt // Weiche bleibt belegt -// / R #Dyn.Error.Err_Kein_LeseErgebnis -// / R #Dyn.Error.Err_Leser_nicht_bereit - R Dyn.Error.Barcode_nicht_bekannt - - AN Dyn.Sk.Err_Uebzeit - R Dyn.Error.Err_Trolley_nicht_in_Schleuse // Trolley fährt nicht in Schleuse - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - R Dyn.Error.Err_Raus_Sensor // Raus-Sensor wird nicht erreicht (oder dauernd aktiv)! - - ---- NW 7: Statische Schleuse-Parameter holen --- - L Schleuse.Schleusen_Nr // Nummer des Schleuses - L Schleusen_Nr // Aufruf-Parameter - ==I // Identisch ? - R Dyn.Error.Schleuse_DL // Schleusedatenbank fehlerhaft - R Dyn.Error.Undef_Schleuse // undefinierter Schleuse - JC en06 // Ja ! - - T "MW200" // Search-Daten - -CALL FC "DatenOut" (SSDB:=Para.Schleusen_DL_DB, SSDW:=0, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196") - - L "MB199" - T Dyn.Rueckmld.RET_VAL_DL_Schleuse // Rückmeldung bei Datenbank-Zugriff (Gefälle-DL) - - JBI G_Ok - - A "M199.0" - JCN w060 - - SET - = Dyn.Error.Schleuse_DL // Schleusedatenbank fehlerhaft - - L 16#A061 - T Dyn.Stop_Ursache - - JU RET - -w060: SET - S Dyn.Error.Undef_Schleuse // undefinierter Schleuse - - L 16#A062 - T Dyn.Stop_Ursache - - JU RET - -// Kennung + Datenbytes -G_Ok: SET - R Dyn.Error.Schleuse_DL // Gefälledatenbank fehlerhaft - R Dyn.Error.Undef_Schleuse // undefinierte Gefällestrecke - - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 20 // Datenwords speichern - T LW2 // Wiederholungen +FUNCTION_BLOCK "MHMOmniSchleuse" +TITLE = OmniSchleusen-Modul +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-960629 +// +//Version: HM-Omniflow 2100 / 07.2025 +// +//Version: Omniflow 2100 / 10.2024 +// +//Schritt 0: Warten auf Trolley +//Schritt 1: Betriebsart ok/angegeben? +//Schritt 5: Mit Scanner fahren: Defaultziel ? +//Schritt 6: Scanner triggern +//Schritt 7: "DREQ" an PC senden +//Schritt 8: Warten auf PC-Antwort +//Schritt 9: PC-Antwort auswerten +//Schritt 10: Fahrtrichtung ermitteln +//Schritt 11: Ausfahren ok ? +//Schritt 12: Warten auf Pin-Signal +//Schritt 13: Weichenbereich raus bereit ? +//Schritt 14: Daten an Rausweiche übergeben +//Schritt 15: Schleuse Mindestzeit öffnen +//Schritt 16: Trolley ausgefahren ? +//Schritt 17: Trolley ist draussen +//Schritt 18: BM wurde vereinzelt +//Schritt 19: Beladezustand checken +//Schritt 20: Schleuse resetten +//Schritt 21: Reset ist zu Ende +// + VAR_INPUT + Schleusen_Nr { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Aufruf für Schleuse + ErrQuit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Ablaufstörung quittieren + B_VorSchleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley fährt in Bereich + B_InSchleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley ist in Schleuse + B_AusSchleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley hat Schleuse verlassen + B_Stau_raus { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Stau im Bereich rausfahren + Start_Ok { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Starten ist erlauTrolley + Antrieb_Schleuse_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Kreisel-Antrieb aktiv + Antrieb_plus_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Kreisel-Antrieb plus aktiv + Schleuse_geöffnet : Bool; // Schleuse hat geöffnet + RestZeit_Bereich_plus : Int := 999; // Bereich +1: Restzeit bis AFS stoppt (s) + END_VAR + + VAR_OUTPUT + Y_Schleuse_Auf { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse öffnen + Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Störungen übergeben + END_VAR + + VAR_IN_OUT + Antrieb_Schleuse_vor { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleusen-Antrieb einschalten + Antrieb_Schleuse_start { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleusen-Antrieb mit Zeit starten + Antrieb_Schleuse_stop : Bool; // Schleusen-Antrieb stoppen + Antrieb_Schleuse_PS : Bool; // Schleusen-Antrieb Energie sparen + Antrieb_plus_vor { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Antrieb plus einschalten + Antrieb_plus_start { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Antrieb plus mit Zeit starten + hStOk : Bool; // Anzeige Start n. Störung aktivieren + END_VAR + + VAR + SAVE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Weichen_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Weichen-FIFO-DB + Weichen_DW { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Weichen-FIFO-DW + "Weiche+1" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Weiche +1, wo reserviert wurde + Frei18 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; + Frei20 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; + END_STRUCT; + Para { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // Parameter + Schleusen_DL_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung Schleuse-Datenliste-DB + Weichen_DL_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung Weichen-Datenliste-DB + Leser_DL_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung Weichen-Datenliste-DB + END_STRUCT; + Status2 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Trolley_an_Schleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley ist an Schleuse + "Warten_3.V" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Warten auf 3.V + "2.Lesung_aktiv" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // 2.Lesung erfolgt + "3.Lesung_aktiv" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // 3.Lesung erfolgt + TrolleyPos_übergeben { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley-Pos. übergeben + "Warten_4.V" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Warten auf 4.V + Ausfahrzeit_lernen { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Ausfahrzeit lernen + "Weichen-Schritt" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schritt 13-17 aktiv (Weiche evtl. belegen) + Trolley_ist_draussen { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Rückmeldung von Sensor / Weiche + Einfahrzeit_lernen { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Ausfahrzeit lernen + Telegramm_gesendet { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Telegramm wurde in Send-FIFO eingetragen + END_STRUCT; + Schleuse { S7_SetPoint := 'False'} : "UDLHMOmniSchleuse"; // Statische Schleusendaten (aus DL) + Dyn : Struct // Dynamische Daten + Status { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Trolley_fährt_in_Schleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt in Schleuse + Trolley_wartet_Lesung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley wartet auf Auftrag + "Trolley_wartet_auf_Ziel-FC" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + "Trolley_wartet_auf_Weiche+1" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + "Trolley_wartet_Bereich+1" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley wartet auf Bereich +1 + Trolley_fährt_aus { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt aus + MindestZeit_ok { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse ist MindestZeit geöffnet + Trolley_draussen { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley ist ausgefahren + Leser_triggern { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + SF_angefordert { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + Kein_Stop_mehr { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Kein Stop mehr, Antrieb soll starten + Trolley_fährt_rückwärts { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley in Schleuse rückwärts erkannt + Weiche_geschaltet { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + "Trolley ausserhalb Weiche" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley hat Weiche verlassen (von Weiche) + Error_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Störung vorhanden + Reset_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool := TRUE; // Reset aktiv + END_STRUCT; + TrolleyID_Schleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-Nr in der Schleuse + Trolley_EndZiel { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Trolley-EndZiel + Trolley_ZwischenZiel { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Trolley-ZwischenZiel + Trolley_ShopGroup { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-ShopGroup + Weichen_Ziel { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Weichen-Ziel (Für WeichenModul von Ziel-FC) + TrolleyID_Eingefahren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-Nr von Bereich -1 gemeldet + TrolleyID_ausgefahren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // TrolleyID des ausgefahrenen Trolleys + HMI : Struct + TrolleyID_in_Schleuse { ExternalWritable := 'False'} : DInt; // Trolley-Nr in Schleuse (IN:PLC, OUT:PLC) + TrolleyID_Input : DInt; // Trolley-Nr Input (IN:HMI, OUT:PLC) + Schleuse_resetten : Bool; // Schleuse resetten (IN:HMI, Out:PLC) + END_STRUCT; + Sk { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "USk_ILS"; // Status der Schrittkette + Leser { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + xOutReadyForNewScan { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // DBX10.1: Reader ist bereit für Leseanforderung + xOutReadingDone { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // DBX10.0: Lesevorgang abgeschlossen / Handshake raus + xOutCodeGood { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // DBX278.0: Gute Lesung + xOutCodeBad { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // DBX278.1: Schlechte Lesung + nOutBarcode { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // DBD12: Trolley ID + END_STRUCT; + OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + xInStartReading { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // DBX4.1: Starte Lesevorgang + xInHandshakeDone { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // DBX4.2: Handshake Daten abgeholt + xInErrQuit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // DBX4.4: Fehler rücksetzen + xInReset { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // DBX4.5: Allgemeines Rücksetzen des Bausteins + END_STRUCT; + END_STRUCT; + TrolleyID_unbekannt_Schleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'True'} : DInt; // TrolleyID unbekannt (Trolley in Schleuse) + Rueckmld { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + RET_VAL_BLKMOV_Schleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Rückmeldung nach BLKMOV-Aufruf + RET_VAL_DL_Schleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; + RET_VAL_DL_Weiche { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf + RET_VAL_DL_Leser { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf + END_STRUCT; + Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "UErrHMOmniSchleuse"; + Stau_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Sensor B_VorSep ist belegt [100ms] + Mindest_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Sensor B_VorSep ist frei [100ms] + Leer_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; + Stop_Ursache { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Stop-Stelle: Nw + Position + Vereinzelungstakte { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Anzahl der getätigten Vereinzelungstakte + ZwischenZiel_eingefahren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Trolley-ZwischenZiel von Bereich -1 + Ohne_B : Int; + SAVE2 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Leser_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Weichen-FIFO-DB + Leser_DD { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Weichen-FIFO-DD + END_STRUCT; + WarteZeit_PS : Int; + Restzeit_bis_Schleuse : Int; + Res200 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..16] of Int; // Reserve + END_STRUCT; + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ueb_akt : Bool; // Überwachungszeit aktivieren + Weiter : Bool; // Weiterschaltbedingung ist erfüllt + Warte_neu : Bool; // Wartezeit neu triggern + Warte_stop : Bool; // Wartezeit stoppen + "Kein_Weichenbereich +1" : Bool; + "Reservierung_Weiche+1_aktiv" : Bool; + Leser_Zugriff : Bool; // Leser-Zugriff vorhanden + LeserFC_vorhanden : Bool; + ZielFC_vorhanden : Bool; + DraussenFC_vorhanden : Bool; + "TrolleyID_Bereich-1" : Bool; // Trolley--ID von Bereich -1 gemeldet + Einfahrzeit_nicht_bekannt : Bool; + LeserFC : Word; // Ziel-FC + ZielFC : Word; // Ziel-FC + DraussenFC : Word; // Draussen-FC + AR1Start : DInt; // Startwert mit Offset 0 + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + END_VAR + + +BEGIN +NETWORK +TITLE = Parameter-Übergabe + L #Schleusen_Nr; + + L 274 ;//Einsprung Schleuse-DL + T #Para.Schleusen_DL_DB;//vor Aufruf übergeben! + + L 279 ;//Einsprung Weichen-DL + T #Para.Weichen_DL_DB;//vor Aufruf übergeben! + + L 273; + T #Para.Leser_DL_DB; + +NETWORK +TITLE = Anzeige OP + U #ErrQuit ;//Überwachungszeit abgelaufen quittieren + R #Dyn.Sk.Err_Uebzeit; + + L 252;//Bereichsstop aktiv + UN #Dyn.Sk.Bereich_ok;//Also: Bereichsstop / Not-Aus + SPB w010; + + L 253; + UN #Dyn.Sk.Auto_akt;//Keine Betriebsart + UN #Dyn.Sk.Hand_akt; + SPB w010; + + L 255;//Handbetrieb aktiv + U #Dyn.Sk.Hand_akt; + SPB w010; + + L #Dyn.Sk.Akt_Schritt;//Aktiver Schritt +w010: T #Dyn.Sk.OP_Schritt; + +NETWORK +TITLE = Out-Bits zum Zurücksetzen + SET; + R #Y_Schleuse_Auf; + + SET ;//Jeden Zyklus neu + R #Dyn.Status.Trolley_wartet_Lesung; + R #Dyn.Status."Trolley_wartet_auf_Ziel-FC"; + R #Dyn.Status."Trolley_wartet_auf_Weiche+1"; + R #Dyn.Status."Trolley_wartet_Bereich+1"; + R #Dyn.Status.Trolley_fährt_aus; + R #Dyn.Status.Trolley_draussen; + R #Leser_Zugriff; + R #Status2."Weichen-Schritt"; + + U #Dyn.Sk.Reset_Akt; + = #Dyn.Status.Reset_aktiv; + +NETWORK +TITLE = HMI-Zeug + +//Von HMI: + U #Dyn.HMI.Schleuse_resetten; + R #Dyn.HMI.Schleuse_resetten;//von HMI + S #Dyn.Sk.Reset ;//SK zurücksetzen + + L #Dyn.HMI.TrolleyID_Input;//Wird direkt im Programm verwertet (s.u.) + +//An HMI: +ToHMI: L #Dyn.TrolleyID_Schleuse; + T #Dyn.HMI.TrolleyID_in_Schleuse; + +NETWORK +TITLE = Schrittkette zurücksetzen + U #ErrQuit ;//Überwachungszeit abgelaufen quittieren + R #Dyn.Sk.Err_Uebzeit; + + UN #Dyn.Sk.Reset ;//SK zurücksetzen + SPB en04; + +//Schrittkette zurücksetzen: + L 0;//Schritt 0: Warten + T #Dyn.Sk.Akt_Schritt; + + L 0;//Zeitwert löschen + T #Dyn.Sk.Terr_Zelle; + T #Dyn.Sk.Tok_Zelle; + + SET; + R #Dyn.Error.Err_BLKMov;//Error bei Block kopieren + R #Dyn.Sk.Reset;//SK zurücksetzen + R #Dyn.Sk.Err_Schritt;//Undefinierter Schritt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + R #Status2.Telegramm_gesendet; + S #Dyn.Sk.Reset_Akt;//Reset ist aktiv + + SET; + R #Dyn.Error.Schleuse_DL;//Schleuse-Datenliste fehlerhaft + R #Dyn.Error.Undef_Schleuse;//undefinierter Schleuse + R #Dyn.Error.Err_Trolley_nicht_in_Schleuse;//Trolley fährt nicht in Schleuse + R #Dyn.Error.Err_Uebzeit;//Überwachungzeit ist abgelaufen + R #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert + R #Dyn.Error.Err_Stau_Einfahrt; + R #Dyn.Error.Err_BLKMov; + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + R #Dyn.Error.Err_Raus_Sensor;//Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! + R #Dyn.Error.Err_Ziel;//kein Ziel angegeben + R #Dyn.Error.Err_Weichen_DL;//Weichen-Datenliste fehlerhaft + R #Dyn.Error.Err_Undef_Weiche;//undefinierte Weiche + R #Dyn.Error.Err_Weiche_belegt;//Weiche bleibt belegt + R #Dyn.Error.Err_Kein_LeseErgebnis; + R #Dyn.Error.Err_Leser_nicht_bereit; + + L DINT#0; + T #Dyn.Leser.IN.nOutBarcode; + + L 0; + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [10ms] + T #Dyn.Mindest_Zeit;//Sensor B_VorSep ist frei [10ms] + T #SAVE."Weiche+1"; + T #SAVE.Weichen_DB; + T #SAVE.Weichen_DW; + T #Dyn.SAVE2.Leser_DB; + L DINT#0; + T #Dyn.SAVE2.Leser_DD; + +//Defaultwerte übergeben: + L 0 ;//Damit statische Werte neu aus Datenbank geholt werden ! + T #Schleuse.Schleusen_Nr;//Nummer des Schleuses + + SPA RET; + +en04: NOP 0; + +NETWORK +TITLE = Störungen nach Außen übergeben + L 0; + T "MW200"; + + U #Dyn.Error.Schleuse_DL;//Schleuse-Datenliste fehlerhaft + = "M200.0"; + U #Dyn.Error.Undef_Schleuse;//undefinierter Schleuse + = "M200.1"; + U #Dyn.Error.Err_Trolley_nicht_in_Schleuse;//Trolley fährt nicht in Schleuse + = "M200.2"; + U #Dyn.Sk.Err_Uebzeit; + = #Dyn.Error.Err_Uebzeit;//Überwachungzeit ist abgelaufen + = "M200.3"; + NOT; + R #Dyn.Sk.Err_Uebzeit_AnzOk; + U #Dyn.Sk.Err_Schritt; + = #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert + = "M200.4"; + U #Dyn.Error.Err_Stau_Einfahrt; + UN #B_InSchleuse; + UN #Y_Schleuse_Auf; + = "M200.5"; + U #Dyn.Error.Err_BLKMov;//Error bei Block kopieren + = "M200.6"; + U #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + = "M200.7"; + U #Dyn.Error.Err_Raus_Sensor;//Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! + = "M201.0"; + U #Dyn.Error.Err_Ziel;//Trolley-Ziel nicht bekannt + = "M201.1"; + U #Dyn.Error.Err_Weichen_DL;//Weichen-Datenliste fehlerhaft + = "M201.2"; + U #Dyn.Error.Err_Undef_Weiche;//undefinierte Weiche + = "M201.3"; + U #Dyn.Error.Err_Weiche_belegt;//Weiche bleibt belegt + = "M201.4"; + U #Dyn.Error.Err_Kein_LeseErgebnis; + = "M201.5"; + U #Dyn.Error.Err_Leser_nicht_bereit; + = "M201.6"; + U #Dyn.Error.Barcode_nicht_bekannt; + = "M201.7"; + +//Andere Meldung als Überwachungszeit aktiv ?: + L "MW200"; + L 2#1111_0111_1111_1111; + UW; + L 2#0000_0000_0000_0000;//Andere Meldung als Üb.zeit aktiv ? + <>I;//Ja ! + ON #Dyn.Sk.Err_Uebzeit_AnzOk;//Störung anzeigen ok, da 2.Zyklus aktiv ! + R "M200.3";//Üb.Zeit-Meldung nicht an PC senden + + U #Dyn.Sk.Err_Uebzeit; + S #Dyn.Sk.Err_Uebzeit_AnzOk;//Störung anzeigen ok, da 2.Zyklus aktiv ! + + L "MW200"; + T #Error;//Schnittstelle nach Außen + +//Störung vorhanden: + L 0; + <>I;//Ja ! + = #Dyn.Status.Error_aktiv; + S #hStOk; + +//Antrieb stoppen: + U(; + ON #Dyn.Sk.Auto_akt;//SystemVoraussetzungen fehlen + O #Dyn.Sk.Hand_akt; + ON #Dyn.Sk.Bereich_ok; + ); + S #Antrieb_Schleuse_stop;//Antrieb stoppen + +//Störungen pro Zyklus neu erzeugen: + SET; + R #Dyn.Error.Schleuse_DL;//Schleuse-Datenliste fehlerhaft + R #Dyn.Error.Undef_Schleuse;//undefinierter Schleuse +/// R #Dyn.Error.Err_Trolley_nicht_in_Schleuse//Trolley fährt nicht in Schleuse +/// R #Dyn.Error.Err_Uebzeit //Überwachungzeit ist abgelaufen + R #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert +/// R #Dyn.Error.Err_Stau_Einfahrt//Betriebsart ist nicht möglich + R #Dyn.Error.Err_BLKMov; +/// R #Dyn.Error.Err_Trolley_raus//Trolley fährt nicht aus + R #Dyn.Error.Err_Raus_Sensor;//Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! + R #Dyn.Error.Err_Ziel;//Trolley-Ziel nicht bekannt + R #Dyn.Error.Err_Weichen_DL;//Weichen-Datenliste fehlerhaft + R #Dyn.Error.Err_Undef_Weiche;//undefinierte Weiche + R #Dyn.Error.Err_Weiche_belegt;//Weiche bleibt belegt +/// R #Dyn.Error.Err_Kein_LeseErgebnis +/// R #Dyn.Error.Err_Leser_nicht_bereit + R #Dyn.Error.Barcode_nicht_bekannt; + + UN #Dyn.Sk.Err_Uebzeit; + R #Dyn.Error.Err_Trolley_nicht_in_Schleuse;//Trolley fährt nicht in Schleuse + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + R #Dyn.Error.Err_Raus_Sensor;//Raus-Sensor wird nicht erreicht (oder dauernd aktiv)! + +NETWORK +TITLE = Statische Schleuse-Parameter holen + L #Schleuse.Schleusen_Nr;//Nummer des Schleuses + L #Schleusen_Nr;//Aufruf-Parameter + ==I;//Identisch ? + R #Dyn.Error.Schleuse_DL;//Schleusedatenbank fehlerhaft + R #Dyn.Error.Undef_Schleuse;//undefinierter Schleuse + SPB en06;//Ja ! + + T "MW200";//Search-Daten + + CALL "DatenOut" + ( SSDB := #Para.Schleusen_DL_DB , + SSDW := 0 , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := "MW196" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_DL_Schleuse;//Rückmeldung bei Datenbank-Zugriff (Gefälle-DL) + + SPBI G_Ok; + + U "M199.0"; + SPBN w060; + + SET; + = #Dyn.Error.Schleuse_DL;//Schleusedatenbank fehlerhaft + + L 16#A061; + T #Dyn.Stop_Ursache; + + SPA RET; + +w060: SET; + S #Dyn.Error.Undef_Schleuse;//undefinierter Schleuse + + L 16#A062; + T #Dyn.Stop_Ursache; + + SPA RET; + +//Kennung + Datenbytes +G_Ok: SET; + R #Dyn.Error.Schleuse_DL;//Gefälledatenbank fehlerhaft + R #Dyn.Error.Undef_Schleuse;//undefinierte Gefällestrecke + + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 20;//Datenwords speichern + T %LW2;//Wiederholungen + +//Quelle-Pointer erzeugen: + L 0;//Bei Merker = 0 ! + T %LW4;//DB_Nummer + L 220;//Adresse + SLD 3; + L 16#8300_0000;//Kennung: Merker + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #Dyn.Rueckmld.RET_VAL_BLKMOV_Schleuse , + DSTBLK := #Schleuse //#Ziel + ); + + L 16#A063; + T #Dyn.Stop_Ursache; + + L #Dyn.Rueckmld.RET_VAL_BLKMOV_Schleuse;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Dyn.Error.Err_BLKMov ;//Error bei Block kopieren + SPB RET; + + L #Schleuse.Schleusen_Typ;//Schleusetyp = 1274 (HM-Schleuse) + L 1274 ;//Dieser Aufruf-FB ? + ==I;//Ja ! + SPB w061; + + SET; + S #Dyn.Error.Undef_Schleuse;//undefinierter Schleuse + + L 0 ;//Schleuse ungültig ! + T #Schleuse.Schleusen_Nr;//Nummer des Schleuses + + L 16#A064; + T #Dyn.Stop_Ursache; + + SPA RET; + +//Defaultwerte übergeben: +w061: NOP 0; + + SPA RET; + +en06: NOP 0; + +NETWORK +TITLE = Einsprung Weiche plus ermitteln + L #SAVE.Weichen_DB;//Weichen-FIFO-DB + L 0;//Einsprung-Zeiger bekannt ? + >I;//Ja ! + R #"Kein_Weichenbereich +1"; + SPB En08; + + L #Schleuse.RausWeichen_Nr;//Nr. der vorhandenen Weiche + T "MW200";//Search-Daten + L 0;//angegeben ? + ==I;//Nein ! + = #"Kein_Weichenbereich +1"; + R #Dyn.Error.Err_Undef_Weiche;//undefinierte Weiche + SPB En08; + + CALL "DatenOut" + ( SSDB := #Para.Weichen_DL_DB , + SSDW := 0 , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := "MW196" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_DL_Weiche;//Rückmeldung bei Datenbank-Zugriff (Weiche-DL) + + SPBI W_Ok; + + U "M199.0"; + = #Dyn.Error.Err_Weichen_DL;//Weichen-Datenliste fehlerhaft + SPB En08; + + SET; + S #Dyn.Error.Err_Undef_Weiche;//undefinierte Weiche + + SPA En08; + +W_Ok: L "MW224"; + T #SAVE.Weichen_DB ;//Weichen-FIFO-DB + L 0;//sinnvoller Wert ? + <=I;//Nein ! + S #Dyn.Error.Err_Undef_Weiche;//undefinierte Weiche + SPB En08; + + L "MW226"; + T #SAVE.Weichen_DW;//Weichen-FIFO-DW + +En08: NOP 0; + +NETWORK +TITLE = Trolley in Schleuse entprellen + U #B_InSchleuse; + SPB B_ok; + + UN #Status2.Trolley_an_Schleuse; + ON "1s-Impuls"; + SPB Xn08; + + L #Dyn.Ohne_B; + + 1 ;//Zeit ohne Sensor +1s + T #Dyn.Ohne_B; + + L 3;//Nach ca. 3s + I; + SPB X014; + + T #Dyn.Restzeit_bis_Schleuse;//Minimum übergeben + +//Trolley fährt noch ein: +X014: L #Dyn.Restzeit_bis_Schleuse; + L 0;//Restzeit vorhanden? + >I;//Ja ! + UN #B_InSchleuse; + UN #Schleuse_geöffnet; + S #Antrieb_Schleuse_vor;//Antrieb einschalten (dadurch wird PS-Modus deaktiviert) + +En14: NOP 0; + +NETWORK +TITLE = Ausfahrzeit lernen + UN #Status2.Ausfahrzeit_lernen; + ON #Antrieb_Schleuse_aktiv; + ON "1s-Impuls"; + SPB NoAFZ; + + L #Schleuse.AusfahrZeit; + + 1; + T #Schleuse.AusfahrZeit; + +NoAFZ: NOP 0; + +NETWORK +TITLE = Spezial-FCs vorhanden? + L #Schleuse.Leser_FC; + T #LeserFC; + L 0;//Parameter vorhanden ? + >I ;//Ja! + = #LeserFC_vorhanden; + + L #Schleuse.Ziel_FC; + T #ZielFC; + L 0;//Parameter vorhanden ? + >I ;//Ja! + = #ZielFC_vorhanden; + + L #Schleuse.Draussen_FC; + T #DraussenFC; + L 0;//Parameter vorhanden ? + >I ;//Ja! + = #DraussenFC_vorhanden; + +NETWORK +TITLE = Error: Stau Bereich-Eingang + +//TrolleyID zum Einfahren gemeldet / Trolley fährt in Bereich: + L #Dyn.TrolleyID_Eingefahren;//Eintrag von Weiche -1 + L DINT#0;//angegeben ? + <>D;//Ja ! + = #"TrolleyID_Bereich-1"; + U #"TrolleyID_Bereich-1"; + O #B_VorSchleuse; + S #Dyn.Status.Trolley_fährt_in_Schleuse; + +//Antrieb einschalten: + U #B_VorSchleuse; + UN #B_InSchleuse; + UN #Schleuse_geöffnet; + S #Antrieb_Schleuse_vor; + + U #B_VorSchleuse; + S #Antrieb_Schleuse_start; + +//Sensor bei Bereichs-Einfahrt bleibt belegt?: + UN #B_VorSchleuse ;//Sensor Trolley fährt in Bereich (kein Stau !) + O #Schleuse_geöffnet; + R #Dyn.Error.Err_Stau_Einfahrt;//Stau bei Einfahrt + SPB X090 ;//StauZeit neu aufziehen + + UN "1s-Impuls"; + O; + U #Schleuse.Parameter_allg.Antrieb_vorhanden; + UN #Antrieb_Schleuse_aktiv; + O #Dyn.Error.Err_Stau_Einfahrt;//Zeit bereits abgelaufen + SPB Xn09; + + L #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + + +1; + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + + L 20 ;//Stau-Zeit erreicht ? + >=I;//Ja ! + S #Dyn.Error.Err_Stau_Einfahrt;//Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb + SPBN Xn09; + +X090: L 0 ;//Zeiten löschen + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + +Xn09: NOP 0; + +NETWORK +TITLE = Schleuse: Mindestzeit geöffnet/frei + L #Dyn.Sk.Akt_Schritt; + L 3 ;//AusSchleusen aktiv? + I ;//Nein! + ); +/// O #B_InSchleuse //Sensor Trolley in Schleuse vorhanden + ON #Schleuse_geöffnet; + R #Dyn.Status.MindestZeit_ok; + SPB X100 ;//FreiZeit neu aufziehen + + U #Schleuse.Parameter_allg.Antrieb_vorhanden; + UN #Antrieb_Schleuse_aktiv; + O; + U #Schleuse.Parameter_allg.Antrieb_Plus_vorhanden; + UN #Antrieb_plus_aktiv; + O #Dyn.Status.MindestZeit_ok;//Zeit bereits abgelaufen + ON "1s-Impuls"; + SPB Xn10; + + L #Dyn.Mindest_Zeit ;//Sensor B_im_Sep ist frei [1s] + + +1; + T #Dyn.Mindest_Zeit ;//Sensor B_im_Sep ist frei [1s] + + L #Schleuse.Mindeszeit_Schleuse_geoeffnet;//Mindest-Zeit erreicht ? + >=I;//Ja ! + S #Dyn.Status.MindestZeit_ok; + SPBN Xn10; + +X100: L 0 ;//Zeiten löschen + T #Dyn.Mindest_Zeit ;//Sensor B_im_Sep ist frei [1s] + +Xn10: NOP 0; + +NETWORK +TITLE = Schleuse: Trolley ist draussen (Sensor/Weiche) + L #Dyn.Sk.Akt_Schritt; + L 5 ;//Trolley fährt aus ? + I ;//Nein! + ); + ON #Schleuse_geöffnet; + R #Status2.Trolley_ist_draussen; + R #Status2.Ausfahrzeit_lernen; + SPB En15 ;//FreiZeit neu aufziehen + +//Trolley ist draussen sofort (Rückmeldung von Sensor/Weiche): + U #B_AusSchleuse ;//Sensor Trolley aus Schleuse gefahren + U #Schleuse.Parameter_allg.B_AusSep_vorhanden; + O; + U #Dyn.Status."Trolley ausserhalb Weiche";//Rückmeldung von Weiche +1 + UN #"Kein_Weichenbereich +1";//Also Weiche +1 + S #Status2.Trolley_ist_draussen; + +En15: NOP 0; + +NETWORK +TITLE = Einsprung Leser ermitteln + L #Dyn.SAVE2.Leser_DB ;//Leser-FIFO-DB + L 0;//Einsprung-Zeiger bekannt ? + >I;//Ja ! + S #Leser_Zugriff;//Leser-Zugriff vorhanden + SPB En08L; + + L #Schleuse.Leser_ID;//Nr. des vorhandenen Lesers + T "MW200";//Search-Daten + L 0;//angegeben ? + ==I;//Nein ! + SPB En08L; + + CALL "DatenOut" + ( SSDB := #Para.Leser_DL_DB , + SSDW := 0 , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := "MW196" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_DL_Leser;//Rückmeldung bei Datenbank-Zugriff (Leser-DL) + + SPBI W_OkL; + + SET; + S #Dyn.Error.Err_Leser_nicht_bereit;//Leser-Datenliste fehlerhaft + + SPA En08L; + +W_OkL: L "MW222" ;//Rein-FIFO-DB + T #Dyn.SAVE2.Leser_DB ;//Leser-FIFO-DB + L 0;//sinnvoller Wert ? + <=I;//Nein ! + S #Dyn.Error.Err_Leser_nicht_bereit;//undefinierter Leser + SPB En08L; + + L "MD224"; + T #Dyn.SAVE2.Leser_DD;//Leser-FIFO-DD + + SET; + R #Dyn.Error.Err_Leser_nicht_bereit;//undefinierter Leser + S #Leser_Zugriff;//Leser-Zugriff vorhanden + +En08L: NOP 0; + +NETWORK +TITLE = Reservierung bei Weiche plus noch aktiv? + U #"Kein_Weichenbereich +1"; + R #"Reservierung_Weiche+1_aktiv"; + SPB Y11E; + + AUF DB[ #SAVE.Weichen_DB];//FABE+ -DB öffnen + + L #SAVE.Weichen_DW; + ITD; + T #AR1Start;//Startwert mit Offset 0 + + L #AR1Start ;//Startwert mit Offset 0 + + DINT#78; + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + L DBW[ #AR1Zeiger] ;//Schleuse -1 (DBW 78) + L #Schleusen_Nr;//Diese Schleuse ? + ==I;//Ja ! +/// SET /// + = #"Reservierung_Weiche+1_aktiv"; + +//Mindestzeit nachtriggern: + UN #Schleuse_geöffnet; + ON #B_InSchleuse; + SPB Y11E; + + L #AR1Start ;//Startwert mit Offset 0 + + DINT#71; + SLD 3; + L 3 ;//Damit DBX_Bit 3 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + SET; + = DBX[ #AR1Zeiger] ;//Mindestzeit nachtriggern (71.3) + +Y11E: NOP 0; + +NETWORK +TITLE = Leser-Einheit managen (Inputs holen) + UN #Leser_Zugriff; + ON #Schleuse.Parameter_allg.Leser_eingebaut; + R #Dyn.Status.Leser_triggern;//für Status-Anzeige + SPB NoLeser; + +//Leserdaten holen: + AUF DB[ #Dyn.SAVE2.Leser_DB] ;//Leser -DB öffnen + + L #Dyn.SAVE2.Leser_DD; + T #AR1Start ;//Startwert mit Offset 0 + +//Offset 10: + L #AR1Start ;//Startwert mit Offset 0 + + DINT#10; + SLD 3; + T #AR1Zeiger ;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + L DBB[ #AR1Zeiger]; + T "MB200"; + U "M200.0"; + = #Dyn.Leser.IN.xOutReadingDone; + U "M200.1"; + = #Dyn.Leser.IN.xOutReadyForNewScan; + +//Offset 274: + L #AR1Start ;//Startwert mit Offset 0 + + DINT#274; + SLD 3; + T #AR1Zeiger ;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + L DBB[ #AR1Zeiger]; + T "MB200"; + U "M200.0"; + = #Dyn.Leser.IN.xOutCodeGood; + U "M200.1"; + = #Dyn.Leser.IN.xOutCodeBad; + +//Offset 12: + L #AR1Start ;//Startwert mit Offset 0 + + DINT#12; + SLD 3; + T #AR1Zeiger ;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + L DBD[ #AR1Zeiger]; + T #Dyn.Leser.IN.nOutBarcode; + +NoLeser: NOP 0; + +NETWORK +TITLE = Schrittkette anhalten + U #Dyn.Sk.Auto_akt;//Automatik ist aktiv + U #Dyn.Sk.Bereich_ok; + CLR; + + SPA en08_Mig;//Schrittkette nicht anhalten ! + + SET; + R #Dyn.Sk.Err_Uebzeit;//Störungen löschen + R #Dyn.Sk.Err_Schritt; + + L 0;//Zeitwerte löschen + T #Dyn.Sk.Terr_Zelle; + T #Dyn.Sk.Tok_Zelle; + + SPA RET; + +en08_Mig: NOP 0; + +NETWORK +TITLE = Trolley wurde zurück gezogen + L #Dyn.Sk.Akt_Schritt; + L 10 ;//Trolley schon unterwegs ? + I ;//Ja ! + ); + O #Status2.Trolley_an_Schleuse ;//Trolley ist noch in Schleuse + O #Schleuse_geöffnet; + SPB TrolleyOk; + + SET; + S #Antrieb_Schleuse_start; + S #Dyn.Leser.OUT.xInReset; + + L 0;//Neubeginn + T #Dyn.Sk.Akt_Schritt; + + UN #Schleuse.Parameter_allg.Leser_eingebaut;//Falls kein Leser verbaut Daten behalten (falls von Bereich-1 gemeldet) + SPB TrolleyOk; + + T #Dyn.Trolley_ZwischenZiel; + + L DINT#0; + T #Dyn.TrolleyID_Schleuse; + +TrolleyOk: NOP 0; + +NETWORK +TITLE = Sprungverteiler + L #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + L -1;//angegeben ? + ==I;//Nein ! + SPB NEU; + + TAK;//Neuen Schritt übergeben + T #Dyn.Sk.Akt_Schritt; + + L -1;//Urzustand + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + +NEU: SET; + R #Warte_neu;//Wartezeit neutriggern + R #Warte_stop;//Wartezeit stoppen + + L #Dyn.Sk.Akt_Schritt; + SPL Ende; + SPA s000;//Schritt 0 + SPA s001;//Schritt 1 + SPA s002;//Schritt 2 + SPA s003;//Schritt 3 + SPA s004;//Schritt 4 + SPA s005;//Schritt 5 + SPA s006;//Schritt 6 + SPA s007;//Schritt 7 + SPA s008;//Schritt 8 + SPA s009;//Schritt 9 + SPA s010;//Schritt 10 + SPA s011;//Schritt 11 + SPA s012;//Schritt 12 + SPA s013;//Schritt 13 + SPA s014;//Schritt 14 + SPA s015;//Schritt 15 + SPA s016;//Schritt 16 + SPA s017;//Schritt 17 + SPA s018;//Schritt 18 + SPA s019;//Schritt 19 + SPA s020;//Schritt 20 + SPA s021;//Schritt 21 + SPA s022;//Schritt 22 + SPA s023;//Schritt 23 + SPA s024;//Schritt 24 + SPA s025;//Schritt 25 + SPA s026;//Schritt 26 + SPA s027;//Schritt 27 + SPA s028;//Schritt 28 + SPA s029;//Schritt 29 + SPA s030;//Schritt 30 +Ende: S #Dyn.Sk.Err_Schritt;//Undefinierter Schritt + + L 16#A131; + T #Dyn.Stop_Ursache; + + SPA RET; + +Neu_Mig: U #Dyn.Sk.Err_Uebzeit; + SPBN Sk; + + L 16#A132; + T #Dyn.Stop_Ursache; + + SPA RET; + +Sk: T #Dyn.Sk.Akt_Schritt; + + L 0;//Zeitwerte löschen + T #Dyn.Sk.Terr_Zelle; + T #Dyn.Sk.Tok_Zelle; + + SPA NEU; + +//Nicht programmierte Schritte: +//s000: SPA Ende +//s001: SPA Ende +//s002: SPA Ende +//s003: SPA Ende +//s004: SPA Ende +//s005: SPA Ende +//s006: SPA Ende +//s007: SPA Ende +//s008: SPA Ende +//s009: SPA Ende +//s010: SPA Ende +//s011: SPA Ende +//s012: SPA Ende +//s013: SPA Ende +//s014: SPA Ende +//s015: SPA Ende +//s016: SPA Ende +//s017: SPA Ende +s018: SPA Ende; +s019: SPA Ende; +//s020: SPA Ende +//s021: SPA Ende +s022: SPA Ende; +s023: SPA Ende; +s024: SPA Ende; +s025: SPA Ende; +s026: SPA Ende; +s027: SPA Ende; +s028: SPA Ende; +s029: SPA Ende; +s030: SPA Ende; + +NETWORK +TITLE = Schritt X: Reserve + SET;//Weiterschaltbedingung + = #Weiter; + +//Schrittaktionen: + SET; + + L 16#B001; + T #Dyn.Stop_Ursache; + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + L 0 ;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + L 1;//Weiter mit Schritt 1 + SPB Neu_Mig;//Bei diesem Schritt weiter + + L 2; + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + SET; + U #Dyn.Sk.Auto_akt;//Automatik ist aktiv + U #Dyn.Sk.Bereich_ok; + = #Ueb_akt;//Überwachungszeit aktivieren + L 50 ;//Angabe der Überwachungszeit (*1s) + SPA tueb;//Überwachungszeit + + SPA RET; + +NETWORK +TITLE = Schritt 0: Warten auf Trolley +s000: SET;//Weiterschaltbedingung + U #B_InSchleuse;//Trolley im Schleuse erkannt + U #Dyn.Sk.Auto_akt ;//Automatik ist aktiv + U #Dyn.Sk.Bereich_ok; + = #Weiter; + +//Trolley-Schleusendaten löschen: + L DINT#0; + T #Dyn.TrolleyID_Schleuse; + T #Dyn.Trolley_ShopGroup; + + L 0; + T #Dyn.Trolley_EndZiel; + T #Dyn.Weichen_Ziel; + +//HMI-Zeug: + L DINT#0; + T #Dyn.HMI.TrolleyID_Input; + + U #Dyn.Sk.Reset_Akt ;//Reset ist aktiv + L 20 ;//Weiter mit Schritt 20 + SPB Neu_Mig;//Bei diesem Schritt weiter + +//Schrittaktionen: + SET; + R #Dyn.Error.Err_Leser_nicht_bereit; + R #Dyn.Error.Err_Kein_LeseErgebnis; + R #Dyn.Status.SF_angefordert; + R #Status2.TrolleyPos_übergeben; + R #Status2.Telegramm_gesendet; + + U #Weiter ;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + L 50 ;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + L 16#B001; + T #Dyn.Stop_Ursache; + + U #Dyn.Status.Trolley_fährt_in_Schleuse; + UN #B_InSchleuse; + S #Antrieb_Schleuse_vor;//Antrieb einschalten + SPB S000A; + + SET; + R #Dyn.Sk.Err_Uebzeit; + + L 16#B000; + T #Dyn.Stop_Ursache; + + SPA RET; + +//Überwachungszeit starten: +S000A: U #Dyn.Status.Trolley_fährt_in_Schleuse; + UN #B_InSchleuse;//Trolley im Schleuse erkannt + U(; + O #Antrieb_Schleuse_aktiv; + ON #Schleuse.Parameter_allg.Antrieb_vorhanden; + ); + = #Ueb_akt ;//Überwachungszeit aktivieren + + U #Dyn.Sk.Err_Uebzeit; + R #Dyn.Sk.Err_Uebzeit; + S #Dyn.Error.Err_Trolley_nicht_in_Schleuse; + R #Dyn.Status.Trolley_fährt_in_Schleuse; + + L #Schleuse.Übzeit_in_Schleuse; + + SPA tueb;//Überwachungszeit + +NETWORK +TITLE = Schritt 1: Trolley ist in Schleuse / Leser ? / Daten vorhanden ? +s001: NOP 0; +//Schrittaktionen: + U #B_InSchleuse; + S #Status2.Trolley_an_Schleuse; + + UN #Status2.Trolley_an_Schleuse ;//Trolley im Schleuse erkannt + U #Schleuse.Parameter_allg.Leser_eingebaut; + L 0 ;//Weiter mit Schritt 0 + SPB Neu_Mig;//Bei diesem Schritt weiter + +//Zwischen-Ziel von Bereich -1 vorhanden?: + L #Dyn.ZwischenZiel_eingefahren; + L 0;//Zwischenziel von Bereich -1 vorhanden! + ==I;//Nein ! + O #Schleuse.Parameter_allg.Leser_eingebaut;//Dann werden Daten neu ermittelt! + SPB X001; + +//Daten von Bereich -1 übergeben: + L #Dyn.ZwischenZiel_eingefahren; + T #Dyn.Trolley_ZwischenZiel; + L 0; + T #Dyn.ZwischenZiel_eingefahren; + + L #Dyn.TrolleyID_Eingefahren; + T #Dyn.TrolleyID_Schleuse; + L DINT#0; + T #Dyn.TrolleyID_Eingefahren; + + L 12 ;//Weiter mit Schritt 12 + SPA Neu_Mig ;//Bei diesem Schritt weiter + +X001: L 0; + T #Dyn.Trolley_ZwischenZiel; + +//Leser vorhanden: + U #Schleuse.Parameter_allg.Leser_eingebaut; + R #Dyn.Error.Err_Kein_LeseErgebnis; + L 9 ;//Weiter mit Schritt 9 (Leser bereit) + SPB Neu_Mig ;//Bei diesem Schritt weiter + +//Trolleydaten vorhanden ?: (Übergabe von Bereich -1) + L #Dyn.TrolleyID_Eingefahren; + T #Dyn.TrolleyID_Schleuse; + L DINT#0 ;//Daten vorhanden ? + <>D;//Ja ! + L 11 ;//Weiter mit Schritt 11 (Trolleydaten lesen) + SPB Neu_Mig ;//Bei diesem Schritt weiter + +//Ziel-FC vorhanden ?: + U #ZielFC_vorhanden; + L 12 ;//Weiter mit Schritt 12 (Ziel-FC) + SPB Neu_Mig ;//Bei diesem Schritt weiter + + L 14 ;//Weiter mit Schritt 14 (Weichenbereich +1 vorhanden) + SPA Neu_Mig ;//Bei diesem Schritt weiter + +NETWORK +TITLE = Schritt 2: Ausfahren ok ? +s002: NOP 0; + +//Schrittaktionen: + UN #Status2.Trolley_an_Schleuse ;//Trolley im Schleuse erkannt + U #Schleuse.Parameter_allg.Leser_eingebaut; + L 0 ;//Weiter mit Schritt 0 + SPB Neu_Mig;//Bei diesem Schritt weiter + +//Anlage aus oder Störung: + L 16#B021; + T #Dyn.Stop_Ursache; + + UN #Dyn.Sk.Auto_akt ;//Automatik ist aktiv + ON #Dyn.Sk.Bereich_ok;//Bereich ist gestört + SPB RET; + +//Starten erlaut Trolley ?: + L 16#B022; + T #Dyn.Stop_Ursache; + + UN #Start_Ok ;//Starten ist erlaubt + SPB RET; + +//Stau im Bereich +1: + L 16#B023; + T #Dyn.Stop_Ursache; + + SET; + S #Dyn.Status."Trolley_wartet_Bereich+1"; + + U #B_Stau_raus ;//Sensor Stau im Bereich rausfahren + SPB RET; + +//B_Aus_Schleuse aktiv: + L 16#B024; + T #Dyn.Stop_Ursache; + + U #Schleuse.Parameter_allg.B_AusSep_vorhanden; + U #B_AusSchleuse ;//Sensor Trolley aus Schleuse gefahren + = #Dyn.Error.Err_Raus_Sensor;//Raus-Sensor wird nicht erreicht (oder dauernd aktiv)! + SPB RET; + +//Restzeit zum Ausfahren ausreichend?: + L 16#B025; + T #Dyn.Stop_Ursache; + + U(; + L #RestZeit_Bereich_plus; + L #Schleuse.AusfahrZeit; + I;//Nicht Maximalzeit, also nicht leer + ); + BEB ;//Nein ! + +//Antriebe aktivieren / aktiv ?: + U #Schleuse.Parameter_allg.Antrieb_Plus_vorhanden;//Schleuse an weiterem Antrieb (Weiche) + S #Antrieb_plus_vor ;//Antrieb plus einschalten + + U(; + O #Antrieb_plus_aktiv;//Kreisel-Antrieb plus aktiv + ON #Schleuse.Parameter_allg.Antrieb_Plus_vorhanden;//Schleuse an weiterem Antrieb (Weiche) + ); + S #Antrieb_Schleuse_vor;//Antrieb einschalten + + L 16#B026; + T #Dyn.Stop_Ursache; + + UN #Antrieb_plus_aktiv;//Kreisel-Antrieb plus aktiv + U #Schleuse.Parameter_allg.Antrieb_Plus_vorhanden;//Schleuse an weiterem Antrieb (Weiche) + SPB RET; + + UN #Antrieb_Schleuse_aktiv;//Kreisel-Antrieb aktiv + U #Schleuse.Parameter_allg.Antrieb_vorhanden;//Schleuse an angetriebener Strecke + = #Dyn.Status.Kein_Stop_mehr; + SPB RET; + + SET; + R #Status2."Warten_3.V"; + + L 5 ;//Nur 1 langes Signal! + UN #Schleuse.Parameter_allg."2.V_bei_Ausfahrt_checken"; + SPB Neu_Mig ;//Bei diesem Schritt weiter + + L 3 ;//2.V bei Ausfahrt checken + SPA Neu_Mig ;//Bei diesem Schritt weiter + +NETWORK +TITLE = Schritt 3: Trolley fährt aus / 1.V ausgefahren ? +s003: SET ;//Weiterschaltbedingung + UN #B_InSchleuse;//Sensor Trolley ist in Schleuse + = #Weiter; + +//Schrittaktionen: + SET; + S #Y_Schleuse_Auf ;//Schleuse öffnen + S #Dyn.Status.Trolley_fährt_aus; + +//Antriebe: +//siehe Nw9 + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + L 30 ;//Angabe der Wartezeit (*10ms) + SPB Plus ;//Nächsten Schritt starten + + UN #"Kein_Weichenbereich +1";//Also Weiche vorhanden + UN #"Reservierung_Weiche+1_aktiv";//Weiche nicht mehr angemeldet + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + L 0 ;//Weiter mit Schritt 0 + SPB Neu_Mig;//Bei diesem Schritt weiter + + U #Dyn.Sk.Err_Uebzeit; + S #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + + L 16#B031; + T #Dyn.Stop_Ursache; + + U #Antrieb_Schleuse_aktiv; + ON #Schleuse.Parameter_allg.Antrieb_vorhanden;//Schleuse an angetriebener Strecke + = #Ueb_akt;//Überwachungszeit aktivieren + L #Schleuse.Übzeit_aus_Schleuse;//Angabe der Überwachungszeit (*1s) + SPA tueb ;//Überwachungszeit + +NETWORK +TITLE = Schritt 4: Trolley fährt aus / Warten auf 2.V +s004: SET ;//Weiterschaltbedingung + U #B_InSchleuse;//Sensor Trolley ist in Schleuse + O #Dyn.Status."Trolley ausserhalb Weiche";//Rückmeldung von Weiche +1 + = #Weiter; + +//Bei Raus-Sensor nicht zählen: + U #Schleuse.Parameter_allg.B_AusSep_vorhanden; + U #B_AusSchleuse ;//Sensor Trolley aus Schleuse gefahren + L 5 ;//Zählen überspringen + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + SPB Neu_Mig ;//Bei diesem Schritt weiter + +//Schrittaktionen: + SET; + S #Y_Schleuse_Auf ;//Schleuse öffnen + S #Dyn.Status.Trolley_fährt_aus; + +//Antriebe: +//siehe Nw9 + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + L 0 ;//Angabe der Wartezeit (*10ms) + SPB Plus ;//Nächsten Schritt starten + + UN #"Kein_Weichenbereich +1";//Also Weiche vorhanden + UN #"Reservierung_Weiche+1_aktiv";//Weiche nicht mehr angemeldet + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + L 0 ;//Weiter mit Schritt 0 + SPB Neu_Mig;//Bei diesem Schritt weiter + + U #Dyn.Sk.Err_Uebzeit; + S #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + + L 16#B041; + T #Dyn.Stop_Ursache; + + U #Antrieb_Schleuse_aktiv; + ON #Schleuse.Parameter_allg.Antrieb_vorhanden;//Schleuse an angetriebener Strecke + = #Ueb_akt;//Überwachungszeit aktivieren + L #Schleuse.Übzeit_aus_Schleuse;//Angabe der Überwachungszeit (*1s) + SPA tueb ;//Überwachungszeit + +NETWORK +TITLE = Schritt 5: Trolley fährt aus ? +s005: SET ;//Weiterschaltbedingung + UN #B_InSchleuse ;//Sensor Trolley ist in Schleuse + U(; + O #Antrieb_Schleuse_aktiv ;//Kreisel-Antrieb aktiv + ON #Schleuse.Parameter_allg.Antrieb_vorhanden;//Schleuse an angetriebener Strecke + ); + U(; + O #Antrieb_plus_aktiv; + ON #Schleuse.Parameter_allg.Antrieb_Plus_vorhanden; + ); + = #Weiter; + +//Ausfahrzeit lernen: + U #Schleuse.Parameter_allg.B_AusSep_vorhanden; + SPB X004; + +//Ohne Sensor -> Üb.Zeit übergeben: + L #Schleuse.Übzeit_aus_Schleuse; + T #Schleuse.AusfahrZeit; + +X004: L #Schleuse.AusfahrZeit; + L 0;//Ausfahrzeit bekannt ? + ==I;//Nein ! + U #Schleuse.Parameter_allg.B_AusSep_vorhanden; + S #Status2.Ausfahrzeit_lernen; + +//Schrittaktionen: + SET; + S #Y_Schleuse_Auf ;//Schleuse öffnen + S #Dyn.Status.Trolley_fährt_aus; + +//Antriebe: +//siehe Nw10 + +//B in Schleuse aktiv: + U #B_InSchleuse ;//Sensor Trolley ist in Schleuse + SPBN X050;//Negierter Sprung + + L 0; + T #Dyn.Sk.Tok_Zelle; + +//Trolley ist draussen mit 5s-Verzögerung: +X050: U #Weiter ;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + L 300; + SPB Plus ;//Nächsten Schritt starten + +//Trolley fährt nicht raus!: + U #Dyn.Sk.Err_Uebzeit; + S #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + + L 16#B051; + T #Dyn.Stop_Ursache; + + U #Antrieb_Schleuse_aktiv; + ON #Schleuse.Parameter_allg.Antrieb_vorhanden;//Schleuse an angetriebener Strecke + = #Ueb_akt;//Überwachungszeit aktivieren + L #Schleuse.Übzeit_aus_Schleuse;//Angabe der Überwachungszeit (*1s) + SPA tueb ;//Überwachungszeit + +NETWORK +TITLE = Schritt 6: Schleuse Mindestzeit geöffnet / Trolley draussen ? +s006: SET ;//Weiterschaltbedingung + U #Dyn.Status.MindestZeit_ok; + UN #B_InSchleuse ;//Sensor Trolley in Schleuse vorhanden + U(; + UN #Schleuse.Parameter_allg.B_AusSep_vorhanden; + U #"Kein_Weichenbereich +1"; + O #Status2.Trolley_ist_draussen; + ); + = #Weiter; + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + +//Schrittaktionen: + SET; + S #Y_Schleuse_Auf ;//Schleuse öffnen + S #Dyn.Status.Trolley_fährt_aus; + +//Erneutes Signal von B in Schleuse ?: + U #B_InSchleuse ;//Sensor Trolley in Schleuse vorhanden + SPBN X060 ;//Negierter Sprung + + L 5; + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + L 0;//Mindest-Zeit neu starten + T #Dyn.Mindest_Zeit ;//Sensor B_im_Sep ist frei [1s] + SET; + R #Dyn.Status.MindestZeit_ok;//Zeit bereits abgelaufen + + SPA RET; + +//Antriebe: +//siehe Nw10 + +X060: U #Weiter; + SPB X006 ;//Nächsten Schritt starten + + L 16#B061; + T #Dyn.Stop_Ursache; + +//Trolley fährt nicht raus!: + U #Dyn.Sk.Err_Uebzeit; + S #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + + U #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + UN #Status2.Trolley_ist_draussen; + U #Schleuse.Parameter_allg.B_AusSep_vorhanden; + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + S #Dyn.Error.Err_Raus_Sensor;//Raus-Sensor wird nicht erreicht (oder dauernd aktiv)! + + U #Antrieb_Schleuse_aktiv; + ON #Schleuse.Parameter_allg.Antrieb_vorhanden;//Schleuse an angetriebener Strecke + = #Ueb_akt;//Überwachungszeit aktivieren + L #Schleuse.Übzeit_aus_Schleuse;//Angabe der Überwachungszeit (*1s) + SPA tueb ;//Überwachungszeit + +//Trolley hat Schleuse verlassen: +X006: SET; + S #Dyn.Status.Trolley_draussen;//1 Zyklus + R #Dyn.Status.Trolley_fährt_in_Schleuse; + R #Status2.Telegramm_gesendet; + + L #Dyn.Vereinzelungstakte; + + DINT#1;//Vereinzelungen +1 + T #Dyn.Vereinzelungstakte; + +//Draussen-FC ?: + UN #DraussenFC_vorhanden; + SPB NoFC ;//Bei diesem Schritt weiter + + L #Schleusen_Nr;//Schleusen-Nr. + T "MW190"; + L #Dyn.Trolley_ShopGroup;//Shop-Gruppe + T "MD182" ;//übergeben + + L #Dyn.Weichen_Ziel; + T "MW198" ;//Weichenziel + + UC FC[ #DraussenFC] ;//z.Bsp. Daten anpassen + +NoFC: L 7 ;//Weiter mit Schritt 7 + SPA Neu_Mig ;//Bei diesem Schritt weiter + +NETWORK +TITLE = Schritt 7: Trolley ausserhalb der Weiche +s007: SET ;//Weiterschaltbedingung + UN #"Kein_Weichenbereich +1";//Also Weiche vorhanden + UN #"Reservierung_Weiche+1_aktiv";//Weiche nicht mehr angemeldet (Evtl. Reset im Weichenbereich) + O #Dyn.Status."Trolley ausserhalb Weiche";//Rückmeldung von Weiche +1 + O #"Kein_Weichenbereich +1"; + = #Weiter; + +//Schrittaktionen: + SET; + S #Y_Schleuse_Auf ;//Schleuse öffnen + S #Dyn.Status.Trolley_fährt_aus; + U(; + O #Dyn.Status.Weiche_geschaltet;//Weiche ist aktiv + O #"Kein_Weichenbereich +1"; + ); + S #Antrieb_Schleuse_vor;//Antrieb einschalten + S #Antrieb_plus_vor ;//Antrieb plus einschalten + + U #Weiter;//Weiterschaltbedingung ist erfüllt + SPB X007; + + L 16#B071; + T #Dyn.Stop_Ursache; + + SPA RET; + +//Trolley ist ausserhalb der Weiche?: +X007: U #"Kein_Weichenbereich +1"; + SPB ENDE_Mig; + +//Weichen-Rückmeldungen löschen: + SET; + R #Dyn.Status.Weiche_geschaltet; + R #Dyn.Status."Trolley ausserhalb Weiche"; + +//Weichen-Reservierung löschen: + AUF DB[ #SAVE.Weichen_DB];//FABE+ -DB öffnen + + L #SAVE.Weichen_DW; + ITD; + T #AR1Start;//Startwert mit Offset 0 + + L #AR1Start ;//Startwert mit Offset 0 + + DINT#78; + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + L DBW[ #AR1Zeiger] ;//Schleuse -1 (DBW 78) + L #Schleusen_Nr; + <>I;//Nicht diese Schleuse! + SPB ENDE_Mig; + + L 0; + T DBW[ #AR1Zeiger] ;//Schleuse -1 (DBW 78) + T #SAVE."Weiche+1" ;//Hier wurde reserviert + + L 0; + SPA Plus ;//Nächsten Schritt starten + +NETWORK +TITLE = Schritt 8: Weichen-Rückmeldungen = 0? +s008: SET ;//Weiterschaltbedingung + +//Schrittaktionen: + UN #Dyn.Status.Weiche_geschaltet; + UN #Dyn.Status."Trolley ausserhalb Weiche"; + SPB ENDE_Mig; + + L 16#B080; + T #Dyn.Stop_Ursache; + + SPA RET; + +NETWORK +TITLE = Schritt 9: Lese-Einheit bereit? +s009: SET ;//Weiterschaltbedingung + L #Dyn.Leser.IN.nOutBarcode; + L DINT#0; + ==D; + U #Dyn.Leser.IN.xOutReadyForNewScan; + UN #Dyn.Leser.IN.xOutReadingDone; + UN #Dyn.Leser.IN.xOutCodeGood; + UN #Dyn.Leser.IN.xOutCodeBad; + = #Weiter; + R #Dyn.Error.Err_Leser_nicht_bereit; + +//Schrittaktionen: + UN #Status2.Trolley_an_Schleuse ;//Trolley im Schleuse erkannt + U #Schleuse.Parameter_allg.Leser_eingebaut; + R #Dyn.Error.Err_Leser_nicht_bereit; + L 0 ;//Weiter mit Schritt 0 + SPB Neu_Mig ;//Bei diesem Schritt weiter + + U #Weiter; + = #Dyn.Leser.OUT.xInStartReading;//Leser triggern + L 0 ;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + +//Leser nicht bereit: + U #Dyn.Leser.IN.xOutReadingDone;//Falls altes Handshake noch gewollt + O #Dyn.Leser.IN.xOutCodeGood; + O #Dyn.Leser.IN.xOutCodeBad; + S #Dyn.Leser.OUT.xInHandshakeDone; + + U #Dyn.Sk.Err_Uebzeit; + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + S #Dyn.Error.Err_Leser_nicht_bereit; + S #Dyn.Leser.OUT.xInErrQuit;//Vielleicht hilft es + + U #Dyn.Error.Err_Leser_nicht_bereit; + U #ErrQuit;//Mit Quittierung dann zusätzlich reset! + S #Dyn.Leser.OUT.xInReset; + +//HMI-TrolleyID bei Leser nicht bereit: + L #Dyn.HMI.TrolleyID_Input; + L DINT#0; + <>D ;//Ja! + U #Dyn.Error.Err_Leser_nicht_bereit; + L 0 ;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + SET; + = #Ueb_akt;//Überwachungszeit aktivieren + L 5 ;//Angabe der Überwachungszeit (*1s) + SPA tueb;//Überwachungszeit + +NETWORK +TITLE = Schritt 10: Warten auf Leseeinheit +s010: SET ;//Weiterschaltbedingung + U #Dyn.Leser.IN.xOutReadingDone; + U #Dyn.Leser.IN.xOutCodeGood; + UN #Dyn.Leser.IN.xOutCodeBad; + = #Weiter; + R #Dyn.Error.Err_Kein_LeseErgebnis; + +//Schrittaktionen: + UN #Status2.Trolley_an_Schleuse ;//Trolley im Schleuse erkannt + U #Schleuse.Parameter_allg.Leser_eingebaut; + L 0 ;//Weiter mit Schritt 0 + R #Dyn.Error.Err_Kein_LeseErgebnis; + SPB Neu_Mig;//Bei diesem Schritt weiter + + SET; + R #Dyn.Leser.OUT.xInStartReading;//Leseeinheit triggern + + U #Weiter; + S #Dyn.Leser.OUT.xInHandshakeDone; + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + SPB X010; + + SET; + S #Dyn.Status.Trolley_wartet_Lesung; + + U #Dyn.Error.Err_Leser_nicht_bereit;//von Schritt 9 + SPB LX; + + U #Dyn.Sk.Err_Uebzeit; + O #Dyn.Leser.IN.xOutCodeBad; + S #Dyn.Leser.OUT.xInHandshakeDone; + SPB L2 ;//Erst bei 3.Fehllesung Error! + + L 16#B101; + T #Dyn.Stop_Ursache; + + SET; + = #Ueb_akt;//Überwachungszeit aktivieren + + L 10 ;//Angabe der Überwachungszeit (*1s) + SPA tueb;//Überwachungszeit + +L2: U #Status2."2.Lesung_aktiv";//Erst bei 3.Fehllesung Error! + SPB L3; + + SET; + S #Status2."2.Lesung_aktiv"; + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + + L 9; + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + SPA RET; + +L3: U #Status2."3.Lesung_aktiv";////Erst bei 3.Fehllesung Error! + SPB LX; + + SET; + S #Status2."3.Lesung_aktiv"; + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + + L 9; + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + SPA RET; + +//Nach 3.Fehl-Lesung erst Leserfehler! +LX: SET; + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + S #Dyn.Error.Err_Kein_LeseErgebnis; + SPA NoLesung; + +//Leserdaten übergeben: +X010: L #Dyn.Leser.IN.nOutBarcode; + T #Dyn.TrolleyID_Schleuse; + + L DINT#0 ;//Unbekannt ? + ==D ;//Ja ! + O(; + TAK; + L DINT#-1 ;//Fehl-Lesung? + ==D ;//Ja ! + ); + S #Dyn.Error.Err_Kein_LeseErgebnis; + L 9 ;//Weiter mit Schritt 9 (Leser bereit) + SPB Neu_Mig ;//Bei diesem Schritt weiter + + L 11 ;//Weiter mit Schritt 11 + SPA Neu_Mig ;//Bei diesem Schritt weiter + +//Lesefehler: +NoLesung: NOP 0; +//HMI-Eingabe?: +//HMI-TrolleyID: + L #Dyn.HMI.TrolleyID_Input; + T #Dyn.TrolleyID_Schleuse; + <>D ;//Ja! + L 0 ;//Angabe der Wartezeit (*10ms) + R #Dyn.Error.Err_Kein_LeseErgebnis; + R #Dyn.Error.Err_Leser_nicht_bereit;//von Schritt 9 + SPB Plus ;//Nächsten Schritt starten + +//Leser-FC aufrufen: +No_HMIa: UN #LeserFC_vorhanden; + SPB NoLFC; + + L #Schleusen_Nr;//Schleusen-Nr. + T "MW190";//übergeben + L #Dyn.Trolley_ZwischenZiel;//Übergabe von Leser-Aufruf + T "MW196"; + + U #Dyn.Error.Err_Kein_LeseErgebnis; + = "M180.0"; + SET; + R "M180.1"; + + UC FC[ #LeserFC] ;//Beeinflussung der Fehllesung + + L 16#B102; + T #Dyn.Stop_Ursache; + + L "MW196" ;//Zwischenziel übergeben + T #Dyn.Trolley_ZwischenZiel;//Übergabe von Leser-Aufruf + L 0 ;//Übergeben ? + <>I;//Ja! + L 12 ;//Weiter mit Schritt 12 + R #Dyn.Error.Err_Kein_LeseErgebnis; + SPB Neu_Mig ;//Bei diesem Schritt weiter + +NoLFC: L 9; + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + SPA RET; + +NETWORK +TITLE = Schritt 11: Trolleydaten aus DL lesen +s011: L DINT#0; + T #Dyn.TrolleyID_Eingefahren;//Eintrag von Weiche -1 + + L #Dyn.Trolley_ZwischenZiel;/// + + L #Dyn.TrolleyID_Schleuse; + T "MD220"; + + CALL "DatenOut" + ( SSDB := #Schleuse.Gesamt_Trolley_DL , + SSDW := 0 , + PARA := 16#0000 , //Eintrag lesen + SEARCHDATEN := P#M220.0 , + RE_VAL := "MB199" , + OUTDATEN := %DB1011.DBX0.0 , + Position := "MW196" + ); + + L 16#B111; + T #Dyn.Stop_Ursache; + + UN "M199.7"; + = #Dyn.Error.Barcode_nicht_bekannt; + SPB UnbekanntBC; + +//Relevanten Trolleydaten auslesen: + L "TrolleyDL_OutDaten".OUTDaten.EndZiel; + T #Dyn.Trolley_EndZiel; + +//ZwischenZiel nicht überschreiben: + L #Dyn.Trolley_ZwischenZiel; + L 0;//Schon bekannt ? + <>I;//Ja ! + SPB NixZZ; + + L "TrolleyDL_OutDaten".OUTDaten.ZwischenZiel; + T #Dyn.Trolley_ZwischenZiel; + +NixZZ: L "TrolleyDL_OutDaten".OUTDaten.ShopGroup; + T #Dyn.Trolley_ShopGroup; + + L 0;//Angabe der Wartezeit (*10ms) + SPA Plus ;//Nächsten Schritt starten + +//Unbekannter Trolley: +UnbekanntBC: NOP 0; +//HMI-Eingabe?: + +//Leser-FC aufrufen: +Nix_HMI: UN #LeserFC_vorhanden; + SPB Nix_LFC; + + L #Schleusen_Nr ;//Schleusen-Nr. + T "MW190";//übergeben + L #Dyn.TrolleyID_Schleuse; + T "MD192"; + L #Dyn.Trolley_ZwischenZiel; + T "MW196"; + + U #Dyn.Error.Barcode_nicht_bekannt; + = "M180.1"; + SET; + R "M180.0"; + + UC FC[ #LeserFC] ;//Beeinflussung der Weiterfahrt bei nicht bekanntem Trolley + + L "MW196" ;//ZwischenZiel übergeben + T #Dyn.Trolley_ZwischenZiel;//Übergabe von Leser-Aufruf + L 0 ;//Übergeben ? + <>I;//Ja! + L 12 ;//Weiter mit Schritt 12 + R #Dyn.Error.Err_Kein_LeseErgebnis; + SPB Neu_Mig ;//Bei diesem Schritt weiter + +Nix_LFC: SPA RET; + +NETWORK +TITLE = Schritt 12: Ziel-FC +s012: NOP 0; + +//Schrittaktionen: + UN #Status2.Trolley_an_Schleuse ;//Trolley im Schleuse erkannt + U #Schleuse.Parameter_allg.Leser_eingebaut; + UN #Schleuse_geöffnet; + L 0 ;//Weiter mit Schritt 0 + SPB Neu_Mig;//Bei diesem Schritt weiter + + SET; + S #Dyn.Status."Trolley_wartet_auf_Ziel-FC"; + + UN #ZielFC_vorhanden; + R #Dyn.Status."Trolley_wartet_auf_Ziel-FC"; + L 13 ;//Weiter mit Schritt 13 + SPB Neu_Mig ;//Bei diesem Schritt weiter + + SET;//Rückmeldungen erst mal resetten + R "M180.6";//Weiterfahrt von Ziel-FC erlaubt + L #Schleusen_Nr ;//Schleusen-Nr. + T "MW190";//übergeben + L #Dyn.Trolley_ShopGroup;//Shop-Gruppe + T "MD182" ;//übergeben + L #Dyn.Trolley_EndZiel;//End-Ziel + T "MW194" ;//übergeben + L #Dyn.Trolley_ZwischenZiel; + T "MW196" ;//übergeben + L 0;//Erst mal nullen + T "MW198" ;//Weichenziel + + UC FC[ #ZielFC] ;//Beeinflussung der Weiterfahrt + + L 16#B122; + T #Dyn.Stop_Ursache; + +//Spezial-Fall bei Übergabe an Sorter / Turm (M180.6 wird nie im Ziel-FC gesetzt!) +//aber anderer Partner hat Schleuse extern geöffnet: + U #Schleuse_geöffnet; + UN "M180.6" ;//Weiterfahrt von Ziel-FC erlaubt + UN #Status2.TrolleyPos_übergeben;//Nur einmalig + S #Status2.TrolleyPos_übergeben; + SPBN Normal;//Negierter Sprung + + L #Dyn.Vereinzelungstakte; + + DINT#1;//Vereinzelungen +1 + T #Dyn.Vereinzelungstakte; + + CALL "Trolley_DL_Neue_Pos" + ( Gesamt_Trolley_DL := #Schleuse.Gesamt_Trolley_DL , + TrolleyID := #Dyn.TrolleyID_Schleuse , + Position := #Schleuse.Leser_ID , + ShopGroup := Dint#0 , + Err := "M199.0" + ); + +//Draussen-FC ?: + UN #DraussenFC_vorhanden; + SPB RET ;//Bei diesem Schritt weiter + + L #Schleusen_Nr;//Schleusen-Nr. + T "MW190"; + + UC FC[ #DraussenFC] ;//z.Bsp. Daten anpassen + + SPA RET; + +Normal: U "M180.6" ;//Weiterfahrt von Ziel-FC erlaubt + SPB X012; + + UN #Schleuse.Parameter_allg.Leser_eingebaut; + SPB RET; + + L 11; + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + SPA RET; + +X012: L "MW196" ;//zurückschreiben, falls verändert + T #Dyn.Trolley_ZwischenZiel; + + L "MW198" ;//Weichenziel übergeben + T #Dyn.Weichen_Ziel; + + L 13 ;//Weiter mit Schritt 13 + SPA Neu_Mig ;//Bei diesem Schritt weiter -// Quelle-Pointer erzeugen: - L 0 // Bei Merker = 0 ! - T LW4 // DB_Nummer - L 220 // Adresse - SLD 3 - L 16#8300_0000 // Kennung: Merker - OD - T LD6 // Kennung, Adresse +NETWORK +TITLE = Schritt 13: Schleusen-Position zurückschreiben +s013: NOP 0; + +//Schrittaktionen: + SET; + S #Status2."Weichen-Schritt"; + +//Neue Position an Gesamt-Trolley-DL übergeben: + CALL "Trolley_DL_Neue_Pos" + ( Gesamt_Trolley_DL := #Schleuse.Gesamt_Trolley_DL , + TrolleyID := #Dyn.TrolleyID_Schleuse , + Position := #Schleuse.Leser_ID , + ShopGroup := DINT#0 , //für nichts verändern + Err := "M199.0" + ); + + L 0;//Angabe der Wartezeit (*10ms) + SPA Plus ;//Nächsten Schritt starten -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_Schleuse, DSTBLK:=Schleuse) // Datenliste-Daten speichern | #Ziel +NETWORK +TITLE = Schritt 14: Weichenbereich +1 vorhanden +s014: NOP 0; - L 16#A063 - T Dyn.Stop_Ursache +//Schrittaktionen: + //Weichenbereich +1 vorhanden?: + U #"Kein_Weichenbereich +1"; + L 2 ;//Weiter mit Schritt 2 (Ausfahren ok?) + SPB Neu_Mig ;//Bei diesem Schritt weiter - L Dyn.Rueckmld.RET_VAL_BLKMOV_Schleuse // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Dyn.Error.Err_BLKMov // Error bei Block kopieren - JC RET + SET; + S #Status2."Weichen-Schritt"; + R #Dyn.Status.Weiche_geschaltet; + R #Dyn.Status."Trolley ausserhalb Weiche"; - L Schleuse.Schleusen_Typ // Schleusetyp = 1274 (HM-Schleuse) - L 1274 // Dieser Aufruf-FB ? - ==I // Ja ! - JC w061 + L 0;//Angabe der Wartezeit (*10ms) + SPA Plus ;//Nächsten Schritt starten - SET - S Dyn.Error.Undef_Schleuse // undefinierter Schleuse +NETWORK +TITLE = Schritt 15: Weichenbereich raus bereit ? +s015: NOP 0; - L 0 // Schleuse ungültig ! - T Schleuse.Schleusen_Nr // Nummer des Schleuses +//Schrittaktionen: + SET; + S #Status2."Weichen-Schritt"; - L 16#A064 - T Dyn.Stop_Ursache + L #Dyn.Weichen_Ziel; + L 0;//Bekannt ? + <>I;//Ja ! + SPB X15A; - JU RET + L 12;//Ziel-FC ? + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll -// Defaultwerte übergeben: -w061: NOP 0 + L 16#B154; + T #Dyn.Stop_Ursache; - JU RET + SPA RET; -en06: NOP 0 +X15A: SET; + S #Dyn.Status."Trolley_wartet_auf_Weiche+1"; + L 16#B155; + T #Dyn.Stop_Ursache; ---- NW 8: Einsprung Weiche plus ermitteln --- - L SAVE.Weichen_DB // Weichen-FIFO-DB - L 0 // Einsprung-Zeiger bekannt ? - >I // Ja ! - R "Kein_Weichenbereich +1" - JC En08 + L #SAVE.Weichen_DB ;//Weichen-DB + L 0;//Einsprung-Zeiger bekannt ? + >I;//Ja ! + SPB S015A; - L Schleuse.RausWeichen_Nr // Nr. der vorhandenen Weiche - T "MW200" // Search-Daten - L 0 // angegeben ? - ==I // Nein ! - = "Kein_Weichenbereich +1" - R Dyn.Error.Err_Undef_Weiche // undefinierte Weiche - JC En08 + L 16#B150; + T #Dyn.Stop_Ursache; -CALL FC "DatenOut" (SSDB:=Para.Weichen_DL_DB, SSDW:=0, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196") + SPA RET; - L "MB199" - T Dyn.Rueckmld.RET_VAL_DL_Weiche // Rückmeldung bei Datenbank-Zugriff (Weiche-DL) +//Weichendaten auslesen: +S015A: L #SAVE.Weichen_DW; + ITD; + T #AR1Start;//Startwert mit Offset 0 - JBI W_Ok + L #AR1Start ;//Startwert mit Offset 0 + + DINT#70; + SLD 3; + L 0 ;//Damit DBX70.0 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A "M199.0" - = Dyn.Error.Err_Weichen_DL // Weichen-Datenliste fehlerhaft - JC En08 + L 16#B152; + T #Dyn.Stop_Ursache; - SET - S Dyn.Error.Err_Undef_Weiche // undefinierte Weiche + AUF DB[ #SAVE.Weichen_DB];//FABE+ -DB öffnen - JU En08 + UN DBX[ #AR1Zeiger] ;//Weichenbereich frei ? (DBX70.0) + O #Dyn.Status.Weiche_geschaltet ;//Rückmeldungen noch aktiv! + O #Dyn.Status."Trolley ausserhalb Weiche"; + SPB S015B; -W_Ok: L "MW224" - T SAVE.Weichen_DB // Weichen-FIFO-DB - L 0 // sinnvoller Wert ? - <=I // Nein ! - S Dyn.Error.Err_Undef_Weiche // undefinierte Weiche - JC En08 + L 16 ;//Weiter mit Schritt 16 (Daten an Weiche übergeben) + SPA Neu_Mig ;//Bei diesem Schritt weiter - L "MW226" - T SAVE.Weichen_DW // Weichen-FIFO-DW +//Reservierung schon erfolgt ?: +S015B: SET; + R #Dyn.Status.Weiche_geschaltet; + R #Dyn.Status."Trolley ausserhalb Weiche"; -En08: NOP 0 + L #AR1Start ;//Startwert mit Offset 0 + + DINT#78; + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + AUF DB[ #SAVE.Weichen_DB];//FABE+ -DB öffnen ---- NW 9: Trolley in Schleuse entprellen --- - A B_InSchleuse - JC B_ok + L DBW[ #AR1Zeiger] ;//Schleuse -1 (DBW 78) + L #Schleusen_Nr ;//Diese Schleuse ? + <>I ;//Nein ! -> Ok + SPB RET; - AN Status2.Trolley_an_Schleuse - ON "1s-Impuls" - JC Xn08 - - L Dyn.Ohne_B - + 1 // Zeit ohne Sensor +1s - T Dyn.Ohne_B +//Reservierung löschen: + AUF DB[ #SAVE.Weichen_DB];//FABE+ -DB öffnen - L 3 // Nach ca. 3s - D; + SPB X16A; - A "Schleuse_geöffnet" -// / UN #Dyn.Error.Err_Trolley_raus//Trolley fährt nicht aus - A( - O Dyn.Status.Weiche_geschaltet // Weiche ist aktiv - O "Kein_Weichenbereich +1" - ) - A Schleuse.Parameter_allg.Antrieb_Plus_vorhanden - S Antrieb_plus_vor // Antrieb plus einschalten + L 0 ;//Damit sichtbar + T DBD[ #AR1Zeiger] ;//Trolley-ID (DBD 72) - A "Schleuse_geöffnet" -// / UN #Dyn.Error.Err_Trolley_raus//Trolley fährt nicht aus - A( - O Dyn.Status.Weiche_geschaltet // Weiche ist aktiv - O "Kein_Weichenbereich +1" - ) - A( - O Antrieb_plus_aktiv - ON Schleuse.Parameter_allg.Antrieb_Plus_vorhanden - ) - S Antrieb_Schleuse_vor // Antrieb einschalten +X16A: L #AR1Start ;//Startwert mit Offset 0 + + DINT#76; + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) -// Trolley ist in Schleuse und wartet - A Status2.Trolley_an_Schleuse // Trolley im Schleuse erkannt - AN "Schleuse_geöffnet" // Trolley soll ausfahren - A( - ON B_VorSchleuse - O Dyn.Error.Err_Stau_Einfahrt - ) - AN Dyn.Status.Kein_Stop_mehr // Wird in Schritt 2 gesetzt - O - A "Schleuse_geöffnet" // Trolley soll ausfahren - A Schleuse.Parameter_allg.Antrieb_Plus_vorhanden - AN Antrieb_plus_aktiv - JC Warten + L #Dyn.Weichen_Ziel; + T DBW[ #AR1Zeiger] ;//Weichenziel (DBW 76) - L 0 - T Dyn.WarteZeit_PS + L #AR1Start ;//Startwert mit Offset 0 + + DINT#80; + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - JU NwE10 + L #Dyn.Trolley_ZwischenZiel; + T DBW[ #AR1Zeiger] ;//Zwischenziel (DBW 80) + + L #AR1Start ;//Startwert mit Offset 0 + + DINT#78; + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + L #Schleusen_Nr; + T DBW[ #AR1Zeiger] ;//Schleuse -1 (DBW 78) + + SET; + S #"Reservierung_Weiche+1_aktiv";//Weiche nicht mehr angemeldet (da erst im nächsten Zyklus) + + L #Schleuse.RausWeichen_Nr;//Nr. der vorhandenen Weiche + T #SAVE."Weiche+1" ;//Hier wurde reserviert + + L 17 ;//Weiter mit Schritt 17 (Hat Weiche geschaltet ?) + SPA Neu_Mig ;//Bei diesem Schritt weiter + +NETWORK +TITLE = Schritt 17: Hat Rausweiche geschaltet ? +s017: NOP 0; + +//Schrittaktionen: + SET; + S #Status2."Weichen-Schritt"; + +//Weiche +1 noch mit dieser Schleuse aktiv ?: + UN #"Reservierung_Weiche+1_aktiv";//Weiche nicht mehr angemeldet + L 14 ;//Weiter mit Schritt 14 + SPB Neu_Mig;//Bei diesem Schritt weiter + + SET; + S #Dyn.Status."Trolley_wartet_auf_Weiche+1"; + + L 16#B170; + T #Dyn.Stop_Ursache; + + U #Dyn.Status."Trolley ausserhalb Weiche";//Rückmeldung von Weiche +1 + SPB RET; + + U #Dyn.Status.Weiche_geschaltet;//Rückmeldung von Weiche +1 + L 2 ;//Weiter mit Schritt 2 (Ausfahren ok?) + SPB Neu_Mig ;//Bei diesem Schritt weiter + + L 16#B171; + T #Dyn.Stop_Ursache; + + SPA RET; + +NETWORK +TITLE = Schritt 20: Schleuse resetten (Wartezeit) +s020: U #B_InSchleuse ;//Weiterschaltbedingung + = #Weiter ;//Weiterschaltbedingung ist erfüllt + +//Schrittaktionen: + SET;//ELS in Grundstellung fahren + S #Antrieb_Schleuse_vor;//Antrieb einschalten + S #Antrieb_Schleuse_start;//Antrieb starten + + U #Weiter; + O #Dyn.Sk.Err_Uebzeit; + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + L 21 ;//Weiter mit Schritt 21 + SPB Neu_Mig;//Bei diesem Schritt weiter + + L 16#B201; + T #Dyn.Stop_Ursache; + + SET; + = #Ueb_akt ;//Überwachungszeit aktivieren + L #Schleuse.Wartezeit_bis_leer;//Angabe der Überwachungszeit (*1s) + L 60; + SPA tueb;//Überwachungszeit + +NETWORK +TITLE = Schritt 21: Reset ist zu Ende +s021: SET; + R #Dyn.Sk.Reset_Akt;//Reset ist aktiv + R #Status2."Warten_3.V"; + R #Status2.TrolleyPos_übergeben; + R #Dyn.Error.Err_Trolley_nicht_in_Schleuse;//Trolley fährt nicht in Schleuse + R #Dyn.Error.Err_Uebzeit ;//Überwachungzeit ist abgelaufen + R #Dyn.Error.Err_Stau_Einfahrt;//Betriebsart ist nicht möglich + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + R #Dyn.Status.Trolley_fährt_in_Schleuse; + + L 0; + T #SAVE.Weichen_DB; + T #SAVE.Weichen_DW; + T #SAVE."Weiche+1";//Dadurch wird in Weiche Reservierung gelöscht + T #Schleuse.Schleusen_Nr;//Damit stat. Daten neu geholt werden! + + SET; + S #Dyn.Status.Trolley_draussen; + + SPA ENDE_Mig;//Neubeginn + +NETWORK +TITLE = Schrittkette beenden +ENDE_Mig: L 0;//Schritt 0: Warten + T #Dyn.Sk.Akt_Schritt; + + L 0;//Zeitwert löschen + T #Dyn.Sk.Terr_Zelle; + T #Dyn.Sk.Tok_Zelle; + T #Dyn.ZwischenZiel_eingefahren; + + L DINT#0; + T #Dyn.TrolleyID_Eingefahren;//Eintrag von Weiche -1 + T #Dyn.TrolleyID_Schleuse;//Daten übergeben + T #Dyn.Trolley_ZwischenZiel; + T #Dyn.Trolley_EndZiel; + T #Dyn.Weichen_Ziel; + + SET; + R #Dyn.Sk.Err_Uebzeit; + R #Dyn.Status.Weiche_geschaltet; + R #Dyn.Status."Trolley ausserhalb Weiche"; + R #Dyn.Status.Trolley_fährt_rückwärts; + R #Status2."Warten_3.V"; + R #Dyn.Error.Err_Kein_LeseErgebnis; + R #Status2."2.Lesung_aktiv"; + R #Status2."3.Lesung_aktiv"; + R #Status2.TrolleyPos_übergeben; + R #Status2.Telegramm_gesendet; + +//HMI-Zeug: + L DINT#0; + T #Dyn.HMI.TrolleyID_Input; + + SPA RET; + +NETWORK +TITLE = Nächsten Schritt aktivieren +Plus: T #Dyn.Sk.T_ok;//Wartezeit übergeben + + U #Dyn.Sk.Err_Uebzeit;//Störung noch nicht quittiert + SPB RET; + + L 0;//keine Wartezeit ? + ==I;//Ja ! -> sofort weiter + SPB w220; + + UN #Warte_neu;//Wartezeit neutriggern + SPB W220_Mig; + + L 0; + T #Dyn.Sk.Tok_Zelle;//Wartezeit + +W220_Mig: U #Warte_stop;//Wartezeit stoppen + SPB RET; + + L #Dyn.Sk.Tok_Zelle; + L "MW4";//Wartezeit +10ms + +I; + T #Dyn.Sk.Tok_Zelle;//Wartezeit + L #Dyn.Sk.T_ok;//abgelaufen ? + I;//abgelaufen ? + UN #Dyn.Sk.Err_Uebzeit; + SPB en24;//Nein ! + + U #Ueb_akt;//Überwachungszeit aktivieren + S #Dyn.Sk.Err_Uebzeit; + + L 0;//Zeitwert löschen + T #Dyn.Sk.Terr_Zelle; + + SPA RET; + +en24: NOP 0; +NETWORK +TITLE = Überwachungszeit +1 + UN #Dyn.Sk.Ueb_akt;//Schrittaktion ist aktiv + ON "1s-Impuls"; + SPB RET; + + L #Dyn.Sk.Terr_Zelle; + + 1 ;//Üb.zeit +1s + T #Dyn.Sk.Terr_Zelle; + + SPA RET; + +NETWORK +TITLE = Return +RET: NOP 0; + +NETWORK +TITLE = Leser-Einheit managen (Outputs schreiben) + UN #Leser_Zugriff; + ON #Schleuse.Parameter_allg.Leser_eingebaut; + SPB NixLeser; + +//Leserdaten schreiben: + AUF DB[ #Dyn.SAVE2.Leser_DB] ;//Leser -DB öffnen + + L #Dyn.SAVE2.Leser_DD; + T #AR1Start ;//Startwert mit Offset 0 + +//Offset 4: + L #AR1Start ;//Startwert mit Offset 0 + + DINT#4; + SLD 3; + T #AR1Zeiger ;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) -Warten: L Dyn.WarteZeit_PS - L 3 // ca. 3s rum ? - I - JC X014 - - T Dyn.Restzeit_bis_Schleuse // Minimum übergeben - -// Trolley fährt noch ein: -X014: L Dyn.Restzeit_bis_Schleuse - L 0 // Restzeit vorhanden? - >I // Ja ! - AN B_InSchleuse - AN "Schleuse_geöffnet" - S Antrieb_Schleuse_vor // Antrieb einschalten (dadurch wird PS-Modus deaktiviert) - -En14: NOP 0 - - ---- NW 13: Ausfahrzeit lernen --- - AN Status2.Ausfahrzeit_lernen - ON Antrieb_Schleuse_aktiv - ON "1s-Impuls" - JC NoAFZ - - L Schleuse.AusfahrZeit - + 1 - T Schleuse.AusfahrZeit - -NoAFZ: NOP 0 - - ---- NW 14: Spezial-FCs vorhanden? --- - L Schleuse.Leser_FC - T LeserFC - L 0 // Parameter vorhanden ? - >I // Ja! - = LeserFC_vorhanden - - L Schleuse.Ziel_FC - T ZielFC - L 0 // Parameter vorhanden ? - >I // Ja! - = ZielFC_vorhanden - - L Schleuse.Draussen_FC - T DraussenFC - L 0 // Parameter vorhanden ? - >I // Ja! - = DraussenFC_vorhanden - - ---- NW 15: Error: Stau Bereich-Eingang --- -// TrolleyID zum Einfahren gemeldet / Trolley fährt in Bereich: - L Dyn.TrolleyID_Eingefahren // Eintrag von Weiche -1 - L DINT#0 // angegeben ? - <>D // Ja ! - = "TrolleyID_Bereich-1" - A "TrolleyID_Bereich-1" - O B_VorSchleuse - S Dyn.Status."Trolley_fährt_in_Schleuse" - -// Antrieb einschalten: - A B_VorSchleuse - AN B_InSchleuse - AN "Schleuse_geöffnet" - S Antrieb_Schleuse_vor - - A B_VorSchleuse - S Antrieb_Schleuse_start - -// Sensor bei Bereichs-Einfahrt bleibt belegt?: - AN B_VorSchleuse // Sensor Trolley fährt in Bereich (kein Stau !) - O "Schleuse_geöffnet" - R Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt - JC X090 // StauZeit neu aufziehen - - AN "1s-Impuls" - O - A Schleuse.Parameter_allg.Antrieb_vorhanden - AN Antrieb_Schleuse_aktiv - O Dyn.Error.Err_Stau_Einfahrt // Zeit bereits abgelaufen - JC Xn09 - - L Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - + +1 - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - - L 20 // Stau-Zeit erreicht ? - >=I // Ja ! - S Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb - JCN Xn09 - -X090: L 0 // Zeiten löschen - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - -Xn09: NOP 0 - - ---- NW 16: Schleuse: Mindestzeit geöffnet/frei --- - L Dyn.Sk.Akt_Schritt - L 3 // AusSchleusen aktiv? - I // Nein! - ) -// / O #B_InSchleuse //Sensor Trolley in Schleuse vorhanden - ON "Schleuse_geöffnet" - R Dyn.Status.MindestZeit_ok - JC X100 // FreiZeit neu aufziehen - - A Schleuse.Parameter_allg.Antrieb_vorhanden - AN Antrieb_Schleuse_aktiv - O - A Schleuse.Parameter_allg.Antrieb_Plus_vorhanden - AN Antrieb_plus_aktiv - O Dyn.Status.MindestZeit_ok // Zeit bereits abgelaufen - ON "1s-Impuls" - JC Xn10 - - L Dyn.Mindest_Zeit // Sensor B_im_Sep ist frei [1s] - + +1 - T Dyn.Mindest_Zeit // Sensor B_im_Sep ist frei [1s] - - L Schleuse.Mindeszeit_Schleuse_geoeffnet // Mindest-Zeit erreicht ? - >=I // Ja ! - S Dyn.Status.MindestZeit_ok - JCN Xn10 - -X100: L 0 // Zeiten löschen - T Dyn.Mindest_Zeit // Sensor B_im_Sep ist frei [1s] - -Xn10: NOP 0 - - ---- NW 17: Schleuse: Trolley ist draussen (Sensor/Weiche) --- - L Dyn.Sk.Akt_Schritt - L 5 // Trolley fährt aus ? - I // Nein! - ) - ON "Schleuse_geöffnet" - R Status2.Trolley_ist_draussen - R Status2.Ausfahrzeit_lernen - JC En15 // FreiZeit neu aufziehen - -// Trolley ist draussen sofort (Rückmeldung von Sensor/Weiche): - A B_AusSchleuse // Sensor Trolley aus Schleuse gefahren - A Schleuse.Parameter_allg.B_AusSep_vorhanden - O - A Dyn.Status."Trolley ausserhalb Weiche" // Rückmeldung von Weiche +1 - AN "Kein_Weichenbereich +1" // Also Weiche +1 - S Status2.Trolley_ist_draussen - -En15: NOP 0 - - ---- NW 18: Einsprung Leser ermitteln --- - L Dyn.SAVE2.Leser_DB // Leser-FIFO-DB - L 0 // Einsprung-Zeiger bekannt ? - >I // Ja ! - S Leser_Zugriff // Leser-Zugriff vorhanden - JC En08L - - L Schleuse.Leser_ID // Nr. des vorhandenen Lesers - T "MW200" // Search-Daten - L 0 // angegeben ? - ==I // Nein ! - JC En08L - -CALL FC "DatenOut" (SSDB:=Para.Leser_DL_DB, SSDW:=0, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196") - - L "MB199" - T Dyn.Rueckmld.RET_VAL_DL_Leser // Rückmeldung bei Datenbank-Zugriff (Leser-DL) - - JBI W_OkL - - SET - S Dyn.Error.Err_Leser_nicht_bereit // Leser-Datenliste fehlerhaft - - JU En08L - -W_OkL: L "MW222" // Rein-FIFO-DB - T Dyn.SAVE2.Leser_DB // Leser-FIFO-DB - L 0 // sinnvoller Wert ? - <=I // Nein ! - S Dyn.Error.Err_Leser_nicht_bereit // undefinierter Leser - JC En08L - - L "MD224" - T Dyn.SAVE2.Leser_DD // Leser-FIFO-DD - - SET - R Dyn.Error.Err_Leser_nicht_bereit // undefinierter Leser - S Leser_Zugriff // Leser-Zugriff vorhanden - -En08L: NOP 0 - - ---- NW 19: Reservierung bei Weiche plus noch aktiv? --- - A "Kein_Weichenbereich +1" - R "Reservierung_Weiche+1_aktiv" - JC Y11E - - OPN DB[SAVE.Weichen_DB] // FABE+ -DB öffnen - - L SAVE.Weichen_DW - ITD - T AR1Start // Startwert mit Offset 0 - - L AR1Start // Startwert mit Offset 0 - + DINT#78 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L DBW [AR1Zeiger] // Schleuse -1 (DBW 78) - L Schleusen_Nr // Diese Schleuse ? - ==I // Ja ! -// / SET /// - = "Reservierung_Weiche+1_aktiv" - -// Mindestzeit nachtriggern: - AN "Schleuse_geöffnet" - ON B_InSchleuse - JC Y11E - - L AR1Start // Startwert mit Offset 0 - + DINT#71 - SLD 3 - L 3 // Damit DBX_Bit 3 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - SET - = DBX [AR1Zeiger] // Mindestzeit nachtriggern (71.3) - -Y11E: NOP 0 - - ---- NW 20: Leser-Einheit managen (Inputs holen) --- - AN Leser_Zugriff - ON Schleuse.Parameter_allg.Leser_eingebaut - R Dyn.Status.Leser_triggern // für Status-Anzeige - JC NoLeser - -// Leserdaten holen: - OPN DB[Dyn.SAVE2.Leser_DB] // Leser -DB öffnen - - L Dyn.SAVE2.Leser_DD - T AR1Start // Startwert mit Offset 0 - -// Offset 10: - L AR1Start // Startwert mit Offset 0 - + DINT#10 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L DBB [AR1Zeiger] - T "MB200" - A "M200.0" - = Dyn.Leser.IN.xOutReadingDone - A "M200.1" - = Dyn.Leser.IN.xOutReadyForNewScan - -// Offset 274: - L AR1Start // Startwert mit Offset 0 - + DINT#274 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L DBB [AR1Zeiger] - T "MB200" - A "M200.0" - = Dyn.Leser.IN.xOutCodeGood - A "M200.1" - = Dyn.Leser.IN.xOutCodeBad - -// Offset 12: - L AR1Start // Startwert mit Offset 0 - + DINT#12 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L DBD [AR1Zeiger] - T Dyn.Leser.IN.nOutBarcode - -NoLeser: NOP 0 - - ---- NW 21: Schrittkette anhalten --- - A Dyn.Sk.Auto_akt // Automatik ist aktiv - A Dyn.Sk.Bereich_ok - CLR - - JU en08_Mig // Schrittkette nicht anhalten ! - - SET - R Dyn.Sk.Err_Uebzeit // Störungen löschen - R Dyn.Sk.Err_Schritt - - L 0 // Zeitwerte löschen - T Dyn.Sk.Terr_Zelle - T Dyn.Sk.Tok_Zelle - - JU RET - -en08_Mig: NOP 0 - - ---- NW 22: Trolley wurde zurück gezogen --- - L Dyn.Sk.Akt_Schritt - L 10 // Trolley schon unterwegs ? - I // Ja ! - ) - O Status2.Trolley_an_Schleuse // Trolley ist noch in Schleuse - O "Schleuse_geöffnet" - JC TrolleyOk - - SET - S Antrieb_Schleuse_start - S Dyn.Leser.OUT.xInReset - - L 0 // Neubeginn - T Dyn.Sk.Akt_Schritt - - AN Schleuse.Parameter_allg.Leser_eingebaut // Falls kein Leser verbaut Daten behalten (falls von Bereich-1 gemeldet) - JC TrolleyOk - - T Dyn.Trolley_ZwischenZiel - - L DINT#0 - T Dyn.TrolleyID_Schleuse - -TrolleyOk: NOP 0 - - ---- NW 23: Sprungverteiler --- - L Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - L -1 // angegeben ? - ==I // Nein ! - JC NEU - - CAC // Neuen Schritt übergeben - T Dyn.Sk.Akt_Schritt - - L -1 // Urzustand - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - -NEU: SET - R Warte_neu // Wartezeit neutriggern - R Warte_stop // Wartezeit stoppen - - L Dyn.Sk.Akt_Schritt - JL Ende - JU s000 // Schritt 0 - JU s001 // Schritt 1 - JU s002 // Schritt 2 - JU s003 // Schritt 3 - JU s004 // Schritt 4 - JU s005 // Schritt 5 - JU s006 // Schritt 6 - JU s007 // Schritt 7 - JU s008 // Schritt 8 - JU s009 // Schritt 9 - JU s010 // Schritt 10 - JU s011 // Schritt 11 - JU s012 // Schritt 12 - JU s013 // Schritt 13 - JU s014 // Schritt 14 - JU s015 // Schritt 15 - JU s016 // Schritt 16 - JU s017 // Schritt 17 - JU s018 // Schritt 18 - JU s019 // Schritt 19 - JU s020 // Schritt 20 - JU s021 // Schritt 21 - JU s022 // Schritt 22 - JU s023 // Schritt 23 - JU s024 // Schritt 24 - JU s025 // Schritt 25 - JU s026 // Schritt 26 - JU s027 // Schritt 27 - JU s028 // Schritt 28 - JU s029 // Schritt 29 - JU s030 // Schritt 30 -Ende: S Dyn.Sk.Err_Schritt // Undefinierter Schritt - - L 16#A131 - T Dyn.Stop_Ursache - - JU RET - -Neu_Mig: A Dyn.Sk.Err_Uebzeit - JCN Sk - - L 16#A132 - T Dyn.Stop_Ursache - - JU RET - -Sk: T Dyn.Sk.Akt_Schritt - - L 0 // Zeitwerte löschen - T Dyn.Sk.Terr_Zelle - T Dyn.Sk.Tok_Zelle - - JU NEU - -// Nicht programmierte Schritte: -// s000: SPA Ende -// s001: SPA Ende -// s002: SPA Ende -// s003: SPA Ende -// s004: SPA Ende -// s005: SPA Ende -// s006: SPA Ende -// s007: SPA Ende -// s008: SPA Ende -// s009: SPA Ende -// s010: SPA Ende -// s011: SPA Ende -// s012: SPA Ende -// s013: SPA Ende -// s014: SPA Ende -// s015: SPA Ende -// s016: SPA Ende -// s017: SPA Ende -s018: JU Ende -s019: JU Ende -// s020: SPA Ende -// s021: SPA Ende -s022: JU Ende -s023: JU Ende -s024: JU Ende -s025: JU Ende -s026: JU Ende -s027: JU Ende -s028: JU Ende -s029: JU Ende -s030: JU Ende - - ---- NW 24: Schritt X: Reserve --- - SET // Weiterschaltbedingung - = Weiter - -// Schrittaktionen: - SET - - L 16#B001 - T Dyn.Stop_Ursache - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - L 0 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - L 1 // Weiter mit Schritt 1 - JC Neu_Mig // Bei diesem Schritt weiter - - L 2 - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - SET - A Dyn.Sk.Auto_akt // Automatik ist aktiv - A Dyn.Sk.Bereich_ok - = Ueb_akt // Überwachungszeit aktivieren - L 50 // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - - JU RET - - ---- NW 25: Schritt 0: Warten auf Trolley --- -s000: SET // Weiterschaltbedingung - A B_InSchleuse // Trolley im Schleuse erkannt - A Dyn.Sk.Auto_akt // Automatik ist aktiv - A Dyn.Sk.Bereich_ok - = Weiter - -// Trolley-Schleusendaten löschen: - L DINT#0 - T Dyn.TrolleyID_Schleuse - T Dyn.Trolley_ShopGroup - - L 0 - T Dyn.Trolley_EndZiel - T Dyn.Weichen_Ziel - -// HMI-Zeug: - L DINT#0 - T Dyn.HMI.TrolleyID_Input - - A Dyn.Sk.Reset_Akt // Reset ist aktiv - L 20 // Weiter mit Schritt 20 - JC Neu_Mig // Bei diesem Schritt weiter - -// Schrittaktionen: - SET - R Dyn.Error.Err_Leser_nicht_bereit - R Dyn.Error.Err_Kein_LeseErgebnis - R Dyn.Status.SF_angefordert - R Status2."TrolleyPos_übergeben" - R Status2.Telegramm_gesendet - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - L 50 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - L 16#B001 - T Dyn.Stop_Ursache - - A Dyn.Status."Trolley_fährt_in_Schleuse" - AN B_InSchleuse - S Antrieb_Schleuse_vor // Antrieb einschalten - JC S000A - - SET - R Dyn.Sk.Err_Uebzeit - - L 16#B000 - T Dyn.Stop_Ursache - - JU RET - -// Überwachungszeit starten: -S000A: A Dyn.Status."Trolley_fährt_in_Schleuse" - AN B_InSchleuse // Trolley im Schleuse erkannt - A( - O Antrieb_Schleuse_aktiv - ON Schleuse.Parameter_allg.Antrieb_vorhanden - ) - = Ueb_akt // Überwachungszeit aktivieren - - A Dyn.Sk.Err_Uebzeit - R Dyn.Sk.Err_Uebzeit - S Dyn.Error.Err_Trolley_nicht_in_Schleuse - R Dyn.Status."Trolley_fährt_in_Schleuse" - - L Schleuse."Übzeit_in_Schleuse" - - JU tueb // Überwachungszeit - - ---- NW 26: Schritt 1: Trolley ist in Schleuse / Leser ? / Daten vorhanden ? --- -s001: NOP 0 -// Schrittaktionen: - A B_InSchleuse - S Status2.Trolley_an_Schleuse - - AN Status2.Trolley_an_Schleuse // Trolley im Schleuse erkannt - A Schleuse.Parameter_allg.Leser_eingebaut - L 0 // Weiter mit Schritt 0 - JC Neu_Mig // Bei diesem Schritt weiter - -// Zwischen-Ziel von Bereich -1 vorhanden?: - L Dyn.ZwischenZiel_eingefahren - L 0 // Zwischenziel von Bereich -1 vorhanden! - ==I // Nein ! - O Schleuse.Parameter_allg.Leser_eingebaut // Dann werden Daten neu ermittelt! - JC X001 - -// Daten von Bereich -1 übergeben: - L Dyn.ZwischenZiel_eingefahren - T Dyn.Trolley_ZwischenZiel - L 0 - T Dyn.ZwischenZiel_eingefahren - - L Dyn.TrolleyID_Eingefahren - T Dyn.TrolleyID_Schleuse - L DINT#0 - T Dyn.TrolleyID_Eingefahren - - L 12 // Weiter mit Schritt 12 - JU Neu_Mig // Bei diesem Schritt weiter - -X001: L 0 - T Dyn.Trolley_ZwischenZiel - -// Leser vorhanden: - A Schleuse.Parameter_allg.Leser_eingebaut - R Dyn.Error.Err_Kein_LeseErgebnis - L 9 // Weiter mit Schritt 9 (Leser bereit) - JC Neu_Mig // Bei diesem Schritt weiter - -// Trolleydaten vorhanden ?: (Übergabe von Bereich -1) - L Dyn.TrolleyID_Eingefahren - T Dyn.TrolleyID_Schleuse - L DINT#0 // Daten vorhanden ? - <>D // Ja ! - L 11 // Weiter mit Schritt 11 (Trolleydaten lesen) - JC Neu_Mig // Bei diesem Schritt weiter - -// Ziel-FC vorhanden ?: - A ZielFC_vorhanden - L 12 // Weiter mit Schritt 12 (Ziel-FC) - JC Neu_Mig // Bei diesem Schritt weiter - - L 14 // Weiter mit Schritt 14 (Weichenbereich +1 vorhanden) - JU Neu_Mig // Bei diesem Schritt weiter - - ---- NW 27: Schritt 2: Ausfahren ok ? --- -s002: NOP 0 - -// Schrittaktionen: - AN Status2.Trolley_an_Schleuse // Trolley im Schleuse erkannt - A Schleuse.Parameter_allg.Leser_eingebaut - L 0 // Weiter mit Schritt 0 - JC Neu_Mig // Bei diesem Schritt weiter - -// Anlage aus oder Störung: - L 16#B021 - T Dyn.Stop_Ursache - - AN Dyn.Sk.Auto_akt // Automatik ist aktiv - ON Dyn.Sk.Bereich_ok // Bereich ist gestört - JC RET - -// Starten erlaut Trolley ?: - L 16#B022 - T Dyn.Stop_Ursache - - AN Start_Ok // Starten ist erlaubt - JC RET - -// Stau im Bereich +1: - L 16#B023 - T Dyn.Stop_Ursache - - SET - S Dyn.Status."Trolley_wartet_Bereich+1" - - A B_Stau_raus // Sensor Stau im Bereich rausfahren - JC RET - -// B_Aus_Schleuse aktiv: - L 16#B024 - T Dyn.Stop_Ursache - - A Schleuse.Parameter_allg.B_AusSep_vorhanden - A B_AusSchleuse // Sensor Trolley aus Schleuse gefahren - = Dyn.Error.Err_Raus_Sensor // Raus-Sensor wird nicht erreicht (oder dauernd aktiv)! - JC RET - -// Restzeit zum Ausfahren ausreichend?: - L 16#B025 - T Dyn.Stop_Ursache - - A( - L RestZeit_Bereich_plus - L Schleuse.AusfahrZeit - I // Nicht Maximalzeit, also nicht leer - ) - BEC // Nein ! - -// Antriebe aktivieren / aktiv ?: - A Schleuse.Parameter_allg.Antrieb_Plus_vorhanden // Schleuse an weiterem Antrieb (Weiche) - S Antrieb_plus_vor // Antrieb plus einschalten - - A( - O Antrieb_plus_aktiv // Kreisel-Antrieb plus aktiv - ON Schleuse.Parameter_allg.Antrieb_Plus_vorhanden // Schleuse an weiterem Antrieb (Weiche) - ) - S Antrieb_Schleuse_vor // Antrieb einschalten - - L 16#B026 - T Dyn.Stop_Ursache - - AN Antrieb_plus_aktiv // Kreisel-Antrieb plus aktiv - A Schleuse.Parameter_allg.Antrieb_Plus_vorhanden // Schleuse an weiterem Antrieb (Weiche) - JC RET - - AN Antrieb_Schleuse_aktiv // Kreisel-Antrieb aktiv - A Schleuse.Parameter_allg.Antrieb_vorhanden // Schleuse an angetriebener Strecke - = Dyn.Status.Kein_Stop_mehr - JC RET - - SET - R Status2."Warten_3.V" - - L 5 // Nur 1 langes Signal! - AN Schleuse.Parameter_allg."2.V_bei_Ausfahrt_checken" - JC Neu_Mig // Bei diesem Schritt weiter - - L 3 // 2.V bei Ausfahrt checken - JU Neu_Mig // Bei diesem Schritt weiter - - ---- NW 28: Schritt 3: Trolley fährt aus / 1.V ausgefahren ? --- -s003: SET // Weiterschaltbedingung - AN B_InSchleuse // Sensor Trolley ist in Schleuse - = Weiter - -// Schrittaktionen: - SET - S Y_Schleuse_Auf // Schleuse öffnen - S Dyn.Status."Trolley_fährt_aus" - -// Antriebe: -// siehe Nw9 - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - L 30 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - AN "Kein_Weichenbereich +1" // Also Weiche vorhanden - AN "Reservierung_Weiche+1_aktiv" // Weiche nicht mehr angemeldet - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - L 0 // Weiter mit Schritt 0 - JC Neu_Mig // Bei diesem Schritt weiter - - A Dyn.Sk.Err_Uebzeit - S Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - - L 16#B031 - T Dyn.Stop_Ursache - - A Antrieb_Schleuse_aktiv - ON Schleuse.Parameter_allg.Antrieb_vorhanden // Schleuse an angetriebener Strecke - = Ueb_akt // Überwachungszeit aktivieren - L Schleuse."Übzeit_aus_Schleuse" // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - - ---- NW 29: Schritt 4: Trolley fährt aus / Warten auf 2.V --- -s004: SET // Weiterschaltbedingung - A B_InSchleuse // Sensor Trolley ist in Schleuse - O Dyn.Status."Trolley ausserhalb Weiche" // Rückmeldung von Weiche +1 - = Weiter - -// Bei Raus-Sensor nicht zählen: - A Schleuse.Parameter_allg.B_AusSep_vorhanden - A B_AusSchleuse // Sensor Trolley aus Schleuse gefahren - L 5 // Zählen überspringen - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - JC Neu_Mig // Bei diesem Schritt weiter - -// Schrittaktionen: - SET - S Y_Schleuse_Auf // Schleuse öffnen - S Dyn.Status."Trolley_fährt_aus" - -// Antriebe: -// siehe Nw9 - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - L 0 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - AN "Kein_Weichenbereich +1" // Also Weiche vorhanden - AN "Reservierung_Weiche+1_aktiv" // Weiche nicht mehr angemeldet - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - L 0 // Weiter mit Schritt 0 - JC Neu_Mig // Bei diesem Schritt weiter - - A Dyn.Sk.Err_Uebzeit - S Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - - L 16#B041 - T Dyn.Stop_Ursache - - A Antrieb_Schleuse_aktiv - ON Schleuse.Parameter_allg.Antrieb_vorhanden // Schleuse an angetriebener Strecke - = Ueb_akt // Überwachungszeit aktivieren - L Schleuse."Übzeit_aus_Schleuse" // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - - ---- NW 30: Schritt 5: Trolley fährt aus ? --- -s005: SET // Weiterschaltbedingung - AN B_InSchleuse // Sensor Trolley ist in Schleuse - A( - O Antrieb_Schleuse_aktiv // Kreisel-Antrieb aktiv - ON Schleuse.Parameter_allg.Antrieb_vorhanden // Schleuse an angetriebener Strecke - ) - A( - O Antrieb_plus_aktiv - ON Schleuse.Parameter_allg.Antrieb_Plus_vorhanden - ) - = Weiter - -// Ausfahrzeit lernen: - A Schleuse.Parameter_allg.B_AusSep_vorhanden - JC X004 - -// Ohne Sensor -> Üb.Zeit übergeben: - L Schleuse."Übzeit_aus_Schleuse" - T Schleuse.AusfahrZeit - -X004: L Schleuse.AusfahrZeit - L 0 // Ausfahrzeit bekannt ? - ==I // Nein ! - A Schleuse.Parameter_allg.B_AusSep_vorhanden - S Status2.Ausfahrzeit_lernen - -// Schrittaktionen: - SET - S Y_Schleuse_Auf // Schleuse öffnen - S Dyn.Status."Trolley_fährt_aus" - -// Antriebe: -// siehe Nw10 - -// B in Schleuse aktiv: - A B_InSchleuse // Sensor Trolley ist in Schleuse - JCN X050 // Negierter Sprung - - L 0 - T Dyn.Sk.Tok_Zelle - -// Trolley ist draussen mit 5s-Verzögerung: -X050: A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - L 300 - JC Plus // Nächsten Schritt starten - -// Trolley fährt nicht raus!: - A Dyn.Sk.Err_Uebzeit - S Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - - L 16#B051 - T Dyn.Stop_Ursache - - A Antrieb_Schleuse_aktiv - ON Schleuse.Parameter_allg.Antrieb_vorhanden // Schleuse an angetriebener Strecke - = Ueb_akt // Überwachungszeit aktivieren - L Schleuse."Übzeit_aus_Schleuse" // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - - ---- NW 31: Schritt 6: Schleuse Mindestzeit geöffnet / Trolley draussen ? --- -s006: SET // Weiterschaltbedingung - A Dyn.Status.MindestZeit_ok - AN B_InSchleuse // Sensor Trolley in Schleuse vorhanden - A( - AN Schleuse.Parameter_allg.B_AusSep_vorhanden - A "Kein_Weichenbereich +1" - O Status2.Trolley_ist_draussen - ) - = Weiter - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - -// Schrittaktionen: - SET - S Y_Schleuse_Auf // Schleuse öffnen - S Dyn.Status."Trolley_fährt_aus" - -// Erneutes Signal von B in Schleuse ?: - A B_InSchleuse // Sensor Trolley in Schleuse vorhanden - JCN X060 // Negierter Sprung - - L 5 - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - L 0 // Mindest-Zeit neu starten - T Dyn.Mindest_Zeit // Sensor B_im_Sep ist frei [1s] - SET - R Dyn.Status.MindestZeit_ok // Zeit bereits abgelaufen - - JU RET - -// Antriebe: -// siehe Nw10 - -X060: A Weiter - JC X006 // Nächsten Schritt starten - - L 16#B061 - T Dyn.Stop_Ursache - -// Trolley fährt nicht raus!: - A Dyn.Sk.Err_Uebzeit - S Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - - A Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - AN Status2.Trolley_ist_draussen - A Schleuse.Parameter_allg.B_AusSep_vorhanden - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - S Dyn.Error.Err_Raus_Sensor // Raus-Sensor wird nicht erreicht (oder dauernd aktiv)! - - A Antrieb_Schleuse_aktiv - ON Schleuse.Parameter_allg.Antrieb_vorhanden // Schleuse an angetriebener Strecke - = Ueb_akt // Überwachungszeit aktivieren - L Schleuse."Übzeit_aus_Schleuse" // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - -// Trolley hat Schleuse verlassen: -X006: SET - S Dyn.Status.Trolley_draussen // 1 Zyklus - R Dyn.Status."Trolley_fährt_in_Schleuse" - R Status2.Telegramm_gesendet - - L Dyn.Vereinzelungstakte - + DINT#1 // Vereinzelungen +1 - T Dyn.Vereinzelungstakte - -// Draussen-FC ?: - AN DraussenFC_vorhanden - JC NoFC // Bei diesem Schritt weiter - - L Schleusen_Nr // Schleusen-Nr. - T "MW190" - L Dyn.Trolley_ShopGroup // Shop-Gruppe - T "MD182" // übergeben - - L Dyn.Weichen_Ziel - T "MW198" // Weichenziel - - UC DB[DraussenFC] // z.Bsp. Daten anpassen - -NoFC: L 7 // Weiter mit Schritt 7 - JU Neu_Mig // Bei diesem Schritt weiter - - ---- NW 32: Schritt 7: Trolley ausserhalb der Weiche --- -s007: SET // Weiterschaltbedingung - AN "Kein_Weichenbereich +1" // Also Weiche vorhanden - AN "Reservierung_Weiche+1_aktiv" // Weiche nicht mehr angemeldet (Evtl. Reset im Weichenbereich) - O Dyn.Status."Trolley ausserhalb Weiche" // Rückmeldung von Weiche +1 - O "Kein_Weichenbereich +1" - = Weiter - -// Schrittaktionen: - SET - S Y_Schleuse_Auf // Schleuse öffnen - S Dyn.Status."Trolley_fährt_aus" - A( - O Dyn.Status.Weiche_geschaltet // Weiche ist aktiv - O "Kein_Weichenbereich +1" - ) - S Antrieb_Schleuse_vor // Antrieb einschalten - S Antrieb_plus_vor // Antrieb plus einschalten - - A Weiter // Weiterschaltbedingung ist erfüllt - JC X007 - - L 16#B071 - T Dyn.Stop_Ursache - - JU RET - -// Trolley ist ausserhalb der Weiche?: -X007: A "Kein_Weichenbereich +1" - JC ENDE_Mig - -// Weichen-Rückmeldungen löschen: - SET - R Dyn.Status.Weiche_geschaltet - R Dyn.Status."Trolley ausserhalb Weiche" - -// Weichen-Reservierung löschen: - OPN DB[SAVE.Weichen_DB] // FABE+ -DB öffnen - - L SAVE.Weichen_DW - ITD - T AR1Start // Startwert mit Offset 0 - - L AR1Start // Startwert mit Offset 0 - + DINT#78 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L DBW [AR1Zeiger] // Schleuse -1 (DBW 78) - L Schleusen_Nr - <>I // Nicht diese Schleuse! - JC ENDE_Mig - - L 0 - T DBW [AR1Zeiger] // Schleuse -1 (DBW 78) - T SAVE."Weiche+1" // Hier wurde reserviert - - L 0 - JU Plus // Nächsten Schritt starten - - ---- NW 33: Schritt 8: Weichen-Rückmeldungen = 0? --- -s008: SET // Weiterschaltbedingung - -// Schrittaktionen: - AN Dyn.Status.Weiche_geschaltet - AN Dyn.Status."Trolley ausserhalb Weiche" - JC ENDE_Mig - - L 16#B080 - T Dyn.Stop_Ursache - - JU RET - - ---- NW 34: Schritt 9: Lese-Einheit bereit? --- -s009: SET // Weiterschaltbedingung - L Dyn.Leser.IN.nOutBarcode - L DINT#0 - ==D - A Dyn.Leser.IN.xOutReadyForNewScan - AN Dyn.Leser.IN.xOutReadingDone - AN Dyn.Leser.IN.xOutCodeGood - AN Dyn.Leser.IN.xOutCodeBad - = Weiter - R Dyn.Error.Err_Leser_nicht_bereit - -// Schrittaktionen: - AN Status2.Trolley_an_Schleuse // Trolley im Schleuse erkannt - A Schleuse.Parameter_allg.Leser_eingebaut - R Dyn.Error.Err_Leser_nicht_bereit - L 0 // Weiter mit Schritt 0 - JC Neu_Mig // Bei diesem Schritt weiter - - A Weiter - = Dyn.Leser.OUT.xInStartReading // Leser triggern - L 0 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - -// Leser nicht bereit: - A Dyn.Leser.IN.xOutReadingDone // Falls altes Handshake noch gewollt - O Dyn.Leser.IN.xOutCodeGood - O Dyn.Leser.IN.xOutCodeBad - S Dyn.Leser.OUT.xInHandshakeDone - - A Dyn.Sk.Err_Uebzeit - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - S Dyn.Error.Err_Leser_nicht_bereit - S Dyn.Leser.OUT.xInErrQuit // Vielleicht hilft es - - A Dyn.Error.Err_Leser_nicht_bereit - A ErrQuit // Mit Quittierung dann zusätzlich reset! - S Dyn.Leser.OUT.xInReset - -// HMI-TrolleyID bei Leser nicht bereit: - L Dyn.HMI.TrolleyID_Input - L DINT#0 - <>D // Ja! - A Dyn.Error.Err_Leser_nicht_bereit - L 0 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - SET - = Ueb_akt // Überwachungszeit aktivieren - L 5 // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - - ---- NW 35: Schritt 10: Warten auf Leseeinheit --- -s010: SET // Weiterschaltbedingung - A Dyn.Leser.IN.xOutReadingDone - A Dyn.Leser.IN.xOutCodeGood - AN Dyn.Leser.IN.xOutCodeBad - = Weiter - R Dyn.Error.Err_Kein_LeseErgebnis - -// Schrittaktionen: - AN Status2.Trolley_an_Schleuse // Trolley im Schleuse erkannt - A Schleuse.Parameter_allg.Leser_eingebaut - L 0 // Weiter mit Schritt 0 - R Dyn.Error.Err_Kein_LeseErgebnis - JC Neu_Mig // Bei diesem Schritt weiter - - SET - R Dyn.Leser.OUT.xInStartReading // Leseeinheit triggern - - A Weiter - S Dyn.Leser.OUT.xInHandshakeDone - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - JC X010 - - SET - S Dyn.Status.Trolley_wartet_Lesung - - A Dyn.Error.Err_Leser_nicht_bereit // von Schritt 9 - JC LX - - A Dyn.Sk.Err_Uebzeit - O Dyn.Leser.IN.xOutCodeBad - S Dyn.Leser.OUT.xInHandshakeDone - JC L2 // Erst bei 3.Fehllesung Error! - - L 16#B101 - T Dyn.Stop_Ursache - - SET - = Ueb_akt // Überwachungszeit aktivieren - - L 10 // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - -L2: A Status2."2.Lesung_aktiv" // Erst bei 3.Fehllesung Error! - JC L3 - - SET - S Status2."2.Lesung_aktiv" - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - - L 9 - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - JU RET - -L3: A Status2."3.Lesung_aktiv" // //Erst bei 3.Fehllesung Error! - JC LX - - SET - S Status2."3.Lesung_aktiv" - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - - L 9 - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - JU RET - -// Nach 3.Fehl-Lesung erst Leserfehler! -LX: SET - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - S Dyn.Error.Err_Kein_LeseErgebnis - JU NoLesung - -// Leserdaten übergeben: -X010: L Dyn.Leser.IN.nOutBarcode - T Dyn.TrolleyID_Schleuse - - L DINT#0 // Unbekannt ? - ==D // Ja ! - O( - CAC - L DINT#-1 // Fehl-Lesung? - ==D // Ja ! - ) - S Dyn.Error.Err_Kein_LeseErgebnis - L 9 // Weiter mit Schritt 9 (Leser bereit) - JC Neu_Mig // Bei diesem Schritt weiter - - L 11 // Weiter mit Schritt 11 - JU Neu_Mig // Bei diesem Schritt weiter - -// Lesefehler: -NoLesung: NOP 0 -// HMI-Eingabe?: -// HMI-TrolleyID: - L Dyn.HMI.TrolleyID_Input - T Dyn.TrolleyID_Schleuse - <>D // Ja! - L 0 // Angabe der Wartezeit (*10ms) - R Dyn.Error.Err_Kein_LeseErgebnis - R Dyn.Error.Err_Leser_nicht_bereit // von Schritt 9 - JC Plus // Nächsten Schritt starten - -// Leser-FC aufrufen: -No_HMIa: AN LeserFC_vorhanden - JC NoLFC - - L Schleusen_Nr // Schleusen-Nr. - T "MW190" // übergeben - L Dyn.Trolley_ZwischenZiel // Übergabe von Leser-Aufruf - T "MW196" - - A Dyn.Error.Err_Kein_LeseErgebnis - = "M180.0" - SET - R "M180.1" - - UC DB[LeserFC] // Beeinflussung der Fehllesung - - L 16#B102 - T Dyn.Stop_Ursache - - L "MW196" // Zwischenziel übergeben - T Dyn.Trolley_ZwischenZiel // Übergabe von Leser-Aufruf - L 0 // Übergeben ? - <>I // Ja! - L 12 // Weiter mit Schritt 12 - R Dyn.Error.Err_Kein_LeseErgebnis - JC Neu_Mig // Bei diesem Schritt weiter - -NoLFC: L 9 - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - JU RET - - ---- NW 36: Schritt 11: Trolleydaten aus DL lesen --- -s011: L DINT#0 - T Dyn.TrolleyID_Eingefahren // Eintrag von Weiche -1 - - L Dyn.Trolley_ZwischenZiel // / - - L Dyn.TrolleyID_Schleuse - T "MD220" - -CALL FC "DatenOut" (SSDB:=Schleuse.Gesamt_Trolley_DL, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=P#M220.0, RE_VAL:="MB199", OUTDATEN:=DB1011.DBX0.0, Position:="MW196") // Eintrag lesen - - L 16#B111 - T Dyn.Stop_Ursache - - AN "M199.7" - = Dyn.Error.Barcode_nicht_bekannt - JC UnbekanntBC - -// Relevanten Trolleydaten auslesen: - L "TrolleyDL_OutDaten".OUTDaten.EndZiel - T Dyn.Trolley_EndZiel - -// ZwischenZiel nicht überschreiben: - L Dyn.Trolley_ZwischenZiel - L 0 // Schon bekannt ? - <>I // Ja ! - JC NixZZ - - L "TrolleyDL_OutDaten".OUTDaten.ZwischenZiel - T Dyn.Trolley_ZwischenZiel - -NixZZ: L "TrolleyDL_OutDaten".OUTDaten.ShopGroup - T Dyn.Trolley_ShopGroup - - L 0 // Angabe der Wartezeit (*10ms) - JU Plus // Nächsten Schritt starten - -// Unbekannter Trolley: -UnbekanntBC: NOP 0 -// HMI-Eingabe?: - -// Leser-FC aufrufen: -Nix_HMI: AN LeserFC_vorhanden - JC Nix_LFC - - L Schleusen_Nr // Schleusen-Nr. - T "MW190" // übergeben - L Dyn.TrolleyID_Schleuse - T "MD192" - L Dyn.Trolley_ZwischenZiel - T "MW196" - - A Dyn.Error.Barcode_nicht_bekannt - = "M180.1" - SET - R "M180.0" - - UC DB[LeserFC] // Beeinflussung der Weiterfahrt bei nicht bekanntem Trolley - - L "MW196" // ZwischenZiel übergeben - T Dyn.Trolley_ZwischenZiel // Übergabe von Leser-Aufruf - L 0 // Übergeben ? - <>I // Ja! - L 12 // Weiter mit Schritt 12 - R Dyn.Error.Err_Kein_LeseErgebnis - JC Neu_Mig // Bei diesem Schritt weiter - -Nix_LFC: JU RET - - ---- NW 37: Schritt 12: Ziel-FC --- -s012: NOP 0 - -// Schrittaktionen: - AN Status2.Trolley_an_Schleuse // Trolley im Schleuse erkannt - A Schleuse.Parameter_allg.Leser_eingebaut - AN "Schleuse_geöffnet" - L 0 // Weiter mit Schritt 0 - JC Neu_Mig // Bei diesem Schritt weiter - - SET - S Dyn.Status."Trolley_wartet_auf_Ziel-FC" - - AN ZielFC_vorhanden - R Dyn.Status."Trolley_wartet_auf_Ziel-FC" - L 13 // Weiter mit Schritt 13 - JC Neu_Mig // Bei diesem Schritt weiter - - SET // Rückmeldungen erst mal resetten - R "M180.6" // Weiterfahrt von Ziel-FC erlaubt - L Schleusen_Nr // Schleusen-Nr. - T "MW190" // übergeben - L Dyn.Trolley_ShopGroup // Shop-Gruppe - T "MD182" // übergeben - L Dyn.Trolley_EndZiel // End-Ziel - T "MW194" // übergeben - L Dyn.Trolley_ZwischenZiel - T "MW196" // übergeben - L 0 // Erst mal nullen - T "MW198" // Weichenziel - - UC DB[ZielFC] // Beeinflussung der Weiterfahrt - - L 16#B122 - T Dyn.Stop_Ursache - -// Spezial-Fall bei Übergabe an Sorter / Turm (M180.6 wird nie im Ziel-FC gesetzt!) -// aber anderer Partner hat Schleuse extern geöffnet: - A "Schleuse_geöffnet" - AN "M180.6" // Weiterfahrt von Ziel-FC erlaubt - AN Status2."TrolleyPos_übergeben" // Nur einmalig - S Status2."TrolleyPos_übergeben" - JCN Normal // Negierter Sprung - - L Dyn.Vereinzelungstakte - + DINT#1 // Vereinzelungen +1 - T Dyn.Vereinzelungstakte - -CALL FC "Trolley_DL_Neue_Pos" (Gesamt_Trolley_DL:=Schleuse.Gesamt_Trolley_DL, TrolleyID:=Dyn.TrolleyID_Schleuse, Position:=Schleuse.Leser_ID, ShopGroup:=Dint#0, Err:="M199.0") - -// Draussen-FC ?: - AN DraussenFC_vorhanden - JC RET // Bei diesem Schritt weiter - - L Schleusen_Nr // Schleusen-Nr. - T "MW190" - - UC DB[DraussenFC] // z.Bsp. Daten anpassen - - JU RET - -Normal: A "M180.6" // Weiterfahrt von Ziel-FC erlaubt - JC X012 - - AN Schleuse.Parameter_allg.Leser_eingebaut - JC RET - - L 11 - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - JU RET - -X012: L "MW196" // zurückschreiben, falls verändert - T Dyn.Trolley_ZwischenZiel - - L "MW198" // Weichenziel übergeben - T Dyn.Weichen_Ziel - - L 13 // Weiter mit Schritt 13 - JU Neu_Mig // Bei diesem Schritt weiter - - ---- NW 38: Schritt 13: Schleusen-Position zurückschreiben --- -s013: NOP 0 - -// Schrittaktionen: - SET - S Status2."Weichen-Schritt" - -// Neue Position an Gesamt-Trolley-DL übergeben: -CALL FC "Trolley_DL_Neue_Pos" (Gesamt_Trolley_DL:=Schleuse.Gesamt_Trolley_DL, TrolleyID:=Dyn.TrolleyID_Schleuse, Position:=Schleuse.Leser_ID, ShopGroup:=DINT#0, Err:="M199.0") // für nichts verändern - - L 0 // Angabe der Wartezeit (*10ms) - JU Plus // Nächsten Schritt starten - - ---- NW 39: Schritt 14: Weichenbereich +1 vorhanden --- -s014: NOP 0 - -// Schrittaktionen: -// Weichenbereich +1 vorhanden?: - A "Kein_Weichenbereich +1" - L 2 // Weiter mit Schritt 2 (Ausfahren ok?) - JC Neu_Mig // Bei diesem Schritt weiter - - SET - S Status2."Weichen-Schritt" - R Dyn.Status.Weiche_geschaltet - R Dyn.Status."Trolley ausserhalb Weiche" - - L 0 // Angabe der Wartezeit (*10ms) - JU Plus // Nächsten Schritt starten - - ---- NW 40: Schritt 15: Weichenbereich raus bereit ? --- -s015: NOP 0 - -// Schrittaktionen: - SET - S Status2."Weichen-Schritt" - - L Dyn.Weichen_Ziel - L 0 // Bekannt ? - <>I // Ja ! - JC X15A - - L 12 // Ziel-FC ? - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - L 16#B154 - T Dyn.Stop_Ursache - - JU RET - -X15A: SET - S Dyn.Status."Trolley_wartet_auf_Weiche+1" - - L 16#B155 - T Dyn.Stop_Ursache - - L SAVE.Weichen_DB // Weichen-DB - L 0 // Einsprung-Zeiger bekannt ? - >I // Ja ! - JC S015A - - L 16#B150 - T Dyn.Stop_Ursache - - JU RET - -// Weichendaten auslesen: -S015A: L SAVE.Weichen_DW - ITD - T AR1Start // Startwert mit Offset 0 - - L AR1Start // Startwert mit Offset 0 - + DINT#70 - SLD 3 - L 0 // Damit DBX70.0 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L 16#B152 - T Dyn.Stop_Ursache - - OPN DB[SAVE.Weichen_DB] // FABE+ -DB öffnen - - AN DBX [AR1Zeiger] // Weichenbereich frei ? (DBX70.0) - O Dyn.Status.Weiche_geschaltet // Rückmeldungen noch aktiv! - O Dyn.Status."Trolley ausserhalb Weiche" - JC S015B - - L 16 // Weiter mit Schritt 16 (Daten an Weiche übergeben) - JU Neu_Mig // Bei diesem Schritt weiter - -// Reservierung schon erfolgt ?: -S015B: SET - R Dyn.Status.Weiche_geschaltet - R Dyn.Status."Trolley ausserhalb Weiche" - - L AR1Start // Startwert mit Offset 0 - + DINT#78 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[SAVE.Weichen_DB] // FABE+ -DB öffnen - - L DBW [AR1Zeiger] // Schleuse -1 (DBW 78) - L Schleusen_Nr // Diese Schleuse ? - <>I // Nein ! -> Ok - JC RET - -// Reservierung löschen: - OPN DB[SAVE.Weichen_DB] // FABE+ -DB öffnen - - L 0 - T DBW [AR1Zeiger] // Schleuse -1 (DBW 78) - - JU RET - - ---- NW 41: Schritt 16: Daten an Rausweiche übergeben --- -s016: NOP 0 - -// Schrittaktionen: - SET - S Status2."Weichen-Schritt" - -// Daten für Eintrag vorbereiten: - OPN DB[SAVE.Weichen_DB] // FABE+ -DB öffnen - - L AR1Start // Startwert mit Offset 0 - + DINT#72 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L Dyn.TrolleyID_Schleuse - T DBD [AR1Zeiger] // Trolley-ID (DBD 72) - L DINT#0 - <>D - JC X16A - - L 0 // Damit sichtbar - T DBD [AR1Zeiger] // Trolley-ID (DBD 72) - -X16A: L AR1Start // Startwert mit Offset 0 - + DINT#76 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L Dyn.Weichen_Ziel - T DBW [AR1Zeiger] // Weichenziel (DBW 76) - - L AR1Start // Startwert mit Offset 0 - + DINT#80 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L Dyn.Trolley_ZwischenZiel - T DBW [AR1Zeiger] // Zwischenziel (DBW 80) - - L AR1Start // Startwert mit Offset 0 - + DINT#78 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L Schleusen_Nr - T DBW [AR1Zeiger] // Schleuse -1 (DBW 78) - - SET - S "Reservierung_Weiche+1_aktiv" // Weiche nicht mehr angemeldet (da erst im nächsten Zyklus) - - L Schleuse.RausWeichen_Nr // Nr. der vorhandenen Weiche - T SAVE."Weiche+1" // Hier wurde reserviert - - L 17 // Weiter mit Schritt 17 (Hat Weiche geschaltet ?) - JU Neu_Mig // Bei diesem Schritt weiter - - ---- NW 42: Schritt 17: Hat Rausweiche geschaltet ? --- -s017: NOP 0 - -// Schrittaktionen: - SET - S Status2."Weichen-Schritt" - -// Weiche +1 noch mit dieser Schleuse aktiv ?: - AN "Reservierung_Weiche+1_aktiv" // Weiche nicht mehr angemeldet - L 14 // Weiter mit Schritt 14 - JC Neu_Mig // Bei diesem Schritt weiter - - SET - S Dyn.Status."Trolley_wartet_auf_Weiche+1" - - L 16#B170 - T Dyn.Stop_Ursache - - A Dyn.Status."Trolley ausserhalb Weiche" // Rückmeldung von Weiche +1 - JC RET - - A Dyn.Status.Weiche_geschaltet // Rückmeldung von Weiche +1 - L 2 // Weiter mit Schritt 2 (Ausfahren ok?) - JC Neu_Mig // Bei diesem Schritt weiter - - L 16#B171 - T Dyn.Stop_Ursache - - JU RET - - ---- NW 43: Schritt 20: Schleuse resetten (Wartezeit) --- -s020: A B_InSchleuse // Weiterschaltbedingung - = Weiter // Weiterschaltbedingung ist erfüllt - -// Schrittaktionen: - SET // ELS in Grundstellung fahren - S Antrieb_Schleuse_vor // Antrieb einschalten - S Antrieb_Schleuse_start // Antrieb starten - - A Weiter - O Dyn.Sk.Err_Uebzeit - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - L 21 // Weiter mit Schritt 21 - JC Neu_Mig // Bei diesem Schritt weiter - - L 16#B201 - T Dyn.Stop_Ursache - - SET - = Ueb_akt // Überwachungszeit aktivieren - L Schleuse.Wartezeit_bis_leer // Angabe der Überwachungszeit (*1s) - L 60 - JU tueb // Überwachungszeit - - ---- NW 44: Schritt 21: Reset ist zu Ende --- -s021: SET - R Dyn.Sk.Reset_Akt // Reset ist aktiv - R Status2."Warten_3.V" - R Status2."TrolleyPos_übergeben" - R Dyn.Error.Err_Trolley_nicht_in_Schleuse // Trolley fährt nicht in Schleuse - R Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen - R Dyn.Error.Err_Stau_Einfahrt // Betriebsart ist nicht möglich - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - R Dyn.Status."Trolley_fährt_in_Schleuse" - - L 0 - T SAVE.Weichen_DB - T SAVE.Weichen_DW - T SAVE."Weiche+1" // Dadurch wird in Weiche Reservierung gelöscht - T Schleuse.Schleusen_Nr // Damit stat. Daten neu geholt werden! - - SET - S Dyn.Status.Trolley_draussen - - JU ENDE_Mig // Neubeginn - - ---- NW 45: Schrittkette beenden --- -ENDE_Mig: L 0 // Schritt 0: Warten - T Dyn.Sk.Akt_Schritt - - L 0 // Zeitwert löschen - T Dyn.Sk.Terr_Zelle - T Dyn.Sk.Tok_Zelle - T Dyn.ZwischenZiel_eingefahren - - L DINT#0 - T Dyn.TrolleyID_Eingefahren // Eintrag von Weiche -1 - T Dyn.TrolleyID_Schleuse // Daten übergeben - T Dyn.Trolley_ZwischenZiel - T Dyn.Trolley_EndZiel - T Dyn.Weichen_Ziel - - SET - R Dyn.Sk.Err_Uebzeit - R Dyn.Status.Weiche_geschaltet - R Dyn.Status."Trolley ausserhalb Weiche" - R Dyn.Status."Trolley_fährt_rückwärts" - R Status2."Warten_3.V" - R Dyn.Error.Err_Kein_LeseErgebnis - R Status2."2.Lesung_aktiv" - R Status2."3.Lesung_aktiv" - R Status2."TrolleyPos_übergeben" - R Status2.Telegramm_gesendet - -// HMI-Zeug: - L DINT#0 - T Dyn.HMI.TrolleyID_Input - - JU RET - - ---- NW 46: Nächsten Schritt aktivieren --- -Plus: T Dyn.Sk.T_ok // Wartezeit übergeben - - A Dyn.Sk.Err_Uebzeit // Störung noch nicht quittiert - JC RET - - L 0 // keine Wartezeit ? - ==I // Ja ! -> sofort weiter - JC w220 - - AN Warte_neu // Wartezeit neutriggern - JC W220_Mig - - L 0 - T Dyn.Sk.Tok_Zelle // Wartezeit - -W220_Mig: A Warte_stop // Wartezeit stoppen - JC RET - - L Dyn.Sk.Tok_Zelle - L "MW4" // Wartezeit +10ms - +I - T Dyn.Sk.Tok_Zelle // Wartezeit - L Dyn.Sk.T_ok // abgelaufen ? - I // abgelaufen ? - AN Dyn.Sk.Err_Uebzeit - JC en24 // Nein ! - - A Ueb_akt // Überwachungszeit aktivieren - S Dyn.Sk.Err_Uebzeit - - L 0 // Zeitwert löschen - T Dyn.Sk.Terr_Zelle - - JU RET - -en24: NOP 0 - ---- NW 48: Überwachungszeit +1 --- - AN Dyn.Sk.Ueb_akt // Schrittaktion ist aktiv - ON "1s-Impuls" - JC RET - - L Dyn.Sk.Terr_Zelle - + 1 // Üb.zeit +1s - T Dyn.Sk.Terr_Zelle - - JU RET - - ---- NW 49: Return --- -RET: NOP 0 - - ---- NW 50: Leser-Einheit managen (Outputs schreiben) --- - AN Leser_Zugriff - ON Schleuse.Parameter_allg.Leser_eingebaut - JC NixLeser - -// Leserdaten schreiben: - OPN DB[Dyn.SAVE2.Leser_DB] // Leser -DB öffnen - - L Dyn.SAVE2.Leser_DD - T AR1Start // Startwert mit Offset 0 - -// Offset 4: - L AR1Start // Startwert mit Offset 0 - + DINT#4 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L DBB [AR1Zeiger] // Aktuelle Werte holen - T "MB200" - - A Dyn.Leser.OUT.xInStartReading - = "M200.1" - A Dyn.Leser.OUT.xInHandshakeDone - R Dyn.Leser.OUT.xInHandshakeDone - = "M200.2" - A Dyn.Leser.OUT.xInErrQuit - R Dyn.Leser.OUT.xInErrQuit - = "M200.4" - A Dyn.Leser.OUT.xInReset - R Dyn.Leser.OUT.xInReset - = "M200.5" - - L "MB200" - T DBB [AR1Zeiger] // Veränderte Werte zurück schreiben - -NixLeser: NOP 0 - - ---- NW 51: Ende --- - BE + L "MB200"; + T DBB[ #AR1Zeiger] ;//Veränderte Werte zurück schreiben + +NixLeser: NOP 0; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Module/MHMOmniSchleuse_Plus.awl b/=A01+UH07-KF00/Programmbausteine/Module/MHMOmniSchleuse_Plus.awl index 091fe02..4b9cd59 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/MHMOmniSchleuse_Plus.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/MHMOmniSchleuse_Plus.awl @@ -1,2338 +1,2448 @@ -=== FB 1275: MHMOmniSchleuse_Plus [STL] === -INTERFACE: - Input: - Schleusen_Nr : Int // Aufruf für Schleuse - ErrQuit : Bool // Ablaufstörung quittieren - B_VorSchleuse : Bool // Sensor Trolley fährt in Bereich - B_InSchleuse : Bool // Sensor Trolley ist in Schleuse - B_Zähl : Bool // Sensor Trolley ist imnächsten Bereich - B_Stau_raus : Bool // Sensor Stau im Bereich rausfahren - Start_Ok : Bool // Starten ist erlauTrolley - Antrieb_Schleuse_aktiv : Bool // Kreisel-Antrieb aktiv - Antrieb_plus_aktiv : Bool // Kreisel-Antrieb plus aktiv - Schleuse_geöffnet : Bool // Schleuse hat geöffnet - RestZeit_Bereich_plus : Int := 999 // Bereich +1: Restzeit bis AFS stoppt (s) - Output: - Y_Schleuse_Auf : Bool // Schleuse öffnen - Error : Word // Störungen übergeben - InOut: - Antrieb_Schleuse_vor : Bool // Schleusen-Antrieb einschalten - Antrieb_Schleuse_start : Bool // Schleusen-Antrieb mit Zeit starten - Antrieb_Schleuse_stop : Bool // Schleusen-Antrieb stoppen - Antrieb_Schleuse_PS : Bool // Schleusen-Antrieb Energie sparen - Antrieb_plus_vor : Bool // Antrieb plus einschalten - Antrieb_plus_start : Bool // Antrieb plus mit Zeit starten - hStOk : Bool // Anzeige Start n. Störung aktivieren - Static: - SAVE : Struct - Weichen_DB : Int // Weichen-FIFO-DB - Weichen_DW : Int // Weichen-FIFO-DW - Weiche+1 : Int // Weiche +1, wo reserviert wurde - Frei18 : Int - Frei20 : Int - Para : Struct // Parameter - Schleusen_DL_DB : Int // Einsprung Schleuse-Datenliste-DB - Weichen_DL_DB : Int // Einsprung Weichen-Datenliste-DB - Leser_DL_DB : Int // Einsprung Weichen-Datenliste-DB - Status2 : Struct - Trolley_an_Schleuse : Bool // Trolley ist an Schleuse - 2.Lesung_aktiv : Bool // 2.Lesung erfolgt - 3.Lesung_aktiv : Bool // 3.Lesung erfolgt - TrolleyPos_übergeben : Bool // Trolley-Pos. übergeben - Warten_4.V : Bool // Warten auf 4.V - Weichen-Schritt : Bool // Schritt 13-17 aktiv (Weiche evtl. belegen) - Trolley an Raus-Sensor : Bool // Trolley ist am Raus-Sensor - Stau_an_Raus-Sensor : Bool // Stau an Raus-Sensor (kein Zählen mehr) - Einfahrzeit_lernen : Bool // Ausfahrzeit lernen - Telegramm_gesendet : Bool // Telegramm wurde in Send-FIFO eingetragen - Schleuse : "UDLHMOmniSchleuse_Plus" // Statische Schleusendaten (aus DL) - Dyn : Struct // Dynamische Daten - Status : Struct - Trolley_fährt_in_Schleuse : Bool // Trolley fährt in Schleuse - Trolley_wartet_Lesung : Bool // Trolley wartet auf Auftrag - Trolley_wartet_auf_Ziel-FC : Bool - Trolley_wartet_auf_Weiche+1 : Bool - Trolley_wartet_Bereich+1 : Bool // Trolley wartet auf Bereich +1 - Trolley_fährt_aus : Bool // Trolley fährt aus - MindestZeit_ok : Bool // Schleuse ist MindestZeit geöffnet - Trolley_draussen : Bool // Trolley ist ausgefahren - Leser_triggern : Bool - SF_angefordert : Bool - Kein_Stop_mehr : Bool // Kein Stop mehr, Antrieb soll starten - Trolley_fährt_rückwärts : Bool // Trolley in Schleuse rückwärts erkannt - Weiche_geschaltet : Bool - Trolley ausserhalb Weiche : Bool // Trolley hat Weiche verlassen (von Weiche) - Error_aktiv : Bool // Störung vorhanden - Reset_aktiv : Bool := TRUE // Reset aktiv - TrolleyID_Schleuse : DInt // Trolley-Nr in der Schleuse - Trolley_EndZiel : Word // Trolley-EndZiel - Trolley_ZwischenZiel : Word // Trolley-ZwischenZiel - Trolley_ShopGroup : DInt // Trolley-ShopGroup - Weichen_Ziel : Word // Weichen-Ziel (Für WeichenModul von Ziel-FC) - TrolleyID_Eingefahren : DInt // Trolley-Nr von Bereich -1 gemeldet - TrolleyID_ausgefahren : DInt // TrolleyID des ausgefahrenen Trolleys - HMI : Struct - TrolleyID_in_Schleuse : DInt // Trolley-Nr in Schleuse (IN:PLC, OUT:PLC) - TrolleyID_Input : DInt // Trolley-Nr Input (IN:HMI, OUT:PLC) - Schleuse_resetten : Bool // Schleuse resetten (IN:HMI, Out:PLC) - Sk : "USk_ILS" // Status der Schrittkette - Leser : Struct - IN : Struct - xOutReadyForNewScan : Bool // DBX10.1: Reader ist bereit für Leseanforderung - xOutReadingDone : Bool // DBX10.0: Lesevorgang abgeschlossen / Handshake raus - xOutCodeGood : Bool // DBX278.0: Gute Lesung - xOutCodeBad : Bool // DBX278.1: Schlechte Lesung - nOutBarcode : DInt // DBD12: Trolley ID - OUT : Struct - xInStartReading : Bool // DBX4.1: Starte Lesevorgang - xInHandshakeDone : Bool // DBX4.2: Handshake Daten abgeholt - xInErrQuit : Bool // DBX4.4: Fehler rücksetzen - xInReset : Bool // DBX4.5: Allgemeines Rücksetzen des Bausteins - TrolleyID_unbekannt_Schleuse : DInt // TrolleyID unbekannt (Trolley in Schleuse) - Rueckmld : Struct - RET_VAL_BLKMOV_Schleuse : Int // Rückmeldung nach BLKMOV-Aufruf - RET_VAL_DL_Schleuse : Byte - RET_VAL_DL_Weiche : Byte // Rückmeldung nach DatenOut-Aufruf - RET_VAL_DL_Leser : Byte // Rückmeldung nach DatenOut-Aufruf - Error : "UErrHMOmniSchleuse" - Stau_Zeit : Int // Sensor B_VorSep ist belegt [1s] - Mindest_Zeit : Int // Sensor B_VorSep ist frei [1s] - Leer_Zeit : Int - Stop_Ursache : Word // Stop-Stelle: Nw + Position - Vereinzelungstakte : DInt // Anzahl der getätigten Vereinzelungstakte - ZwischenZiel_eingefahren : Word // Trolley-ZwischenZiel von Bereich -1 - Zeit_Ohne_B_In_Schleuse : Int // Trolley nicht an B_In_Schleuse - Zeit_Ohne_B_Zähl : Int // Trolley nicht an B_Zähl - Zeit_Ausfahren_Ohne_B_Zähl : Int // Trolley fährt nicht zu B_Zähl - Raus_Trolleys : Int // Anzahl der Trolleys zwischen Schleuse und Raus-Sensor - Stau_Zeit_RausSensor : Int // Sensor B_AusSep ist belegt [1s] - Zurück_gemeldetes_Weichen_Ziel : Word // Von Weiche zurück gemeldetes Weichen-Ziel - SAVE2 : Struct - Leser_DB : Int // Weichen-FIFO-DB - Leser_DD : DInt // Weichen-FIFO-DD - WarteZeit_PS : Int - Restzeit_bis_Schleuse : Int - Res200 : Array[1..11] of Int // Reserve - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ueb_akt : Bool // Überwachungszeit aktivieren - Weiter : Bool // Weiterschaltbedingung ist erfüllt - Warte_neu : Bool // Wartezeit neu triggern - Warte_stop : Bool // Wartezeit stoppen - Kein_Weichenbereich +1 : Bool - Reservierung_Weiche+1_aktiv : Bool - Leser_Zugriff : Bool // Leser-Zugriff vorhanden - LeserFC_vorhanden : Bool - ZielFC_vorhanden : Bool - DraussenFC_vorhanden : Bool - TrolleyID_Bereich-1 : Bool // Trolley--ID von Bereich -1 gemeldet - Trolley_draussen : Bool // Signal: Trolley ist draussen - Antriebe_starten : Bool - Einfahrzeit_nicht_bekannt : Bool - LeserFC : Word // Ziel-FC - ZielFC : Word // Ziel-FC - DraussenFC : Word // Draussen-FC - AR1Start : DInt // Startwert mit Offset 0 - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - Constant: - ---- NW 1: Parameter-Übergabe --- - L Schleusen_Nr - - L 274 // Einsprung Schleuse-DL - T Para.Schleusen_DL_DB // vor Aufruf übergeben! - - L 279 // Einsprung Weichen-DL - T Para.Weichen_DL_DB // vor Aufruf übergeben! - - L 273 - T Para.Leser_DL_DB - - ---- NW 2: Anzeige OP --- - A ErrQuit // Überwachungszeit abgelaufen quittieren - R Dyn.Sk.Err_Uebzeit - - L 252 // Bereichsstop aktiv - AN Dyn.Sk.Bereich_ok // Also: Bereichsstop / Not-Aus - JC w010 - - L 253 - AN Dyn.Sk.Auto_akt // Keine Betriebsart - AN Dyn.Sk.Hand_akt - JC w010 - - L 255 // Handbetrieb aktiv - A Dyn.Sk.Hand_akt - JC w010 - - L Dyn.Sk.Akt_Schritt // Aktiver Schritt -w010: T Dyn.Sk.OP_Schritt - - ---- NW 3: Out-Bits zum Zurücksetzen --- - SET - R Y_Schleuse_Auf - - SET // Jeden Zyklus neu - R Dyn.Status.Trolley_wartet_Lesung - R Dyn.Status."Trolley_wartet_auf_Ziel-FC" - R Dyn.Status."Trolley_wartet_auf_Weiche+1" - R Dyn.Status."Trolley_wartet_Bereich+1" - R Dyn.Status."Trolley_fährt_aus" - R Dyn.Status.Trolley_draussen - R Leser_Zugriff - R Status2."Weichen-Schritt" - - A Dyn.Sk.Reset_Akt - = Dyn.Status.Reset_aktiv - - ---- NW 4: HMI-Zeug --- -// Von HMI: - A Dyn.HMI.Schleuse_resetten - R Dyn.HMI.Schleuse_resetten // von HMI - S Dyn.Sk.Reset // SK zurücksetzen - - L Dyn.HMI.TrolleyID_Input // Wird direkt im Programm verwertet (s.u.) - -// An HMI: -ToHMI: L Dyn.TrolleyID_Schleuse - T Dyn.HMI.TrolleyID_in_Schleuse - - ---- NW 5: Schrittkette zurücksetzen --- - A ErrQuit // Überwachungszeit abgelaufen quittieren - R Dyn.Sk.Err_Uebzeit - - AN Dyn.Sk.Reset // SK zurücksetzen - JC en04 - -// Schrittkette zurücksetzen: - L 0 // Schritt 0: Warten - T Dyn.Sk.Akt_Schritt - T Dyn.Raus_Trolleys - - L 0 // Zeitwert löschen - T Dyn.Sk.Terr_Zelle - T Dyn.Sk.Tok_Zelle - - SET - R Dyn.Error.Err_BLKMov // Error bei Block kopieren - R Dyn.Sk.Reset // SK zurücksetzen - R Dyn.Sk.Err_Schritt // Undefinierter Schritt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - R Status2.Telegramm_gesendet - S Dyn.Sk.Reset_Akt // Reset ist aktiv - - SET - R Dyn.Error.Schleuse_DL // Schleuse-Datenliste fehlerhaft - R Dyn.Error.Undef_Schleuse // undefinierter Schleuse - R Dyn.Error.Err_Trolley_nicht_in_Schleuse // Trolley fährt nicht in Schleuse - R Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen - R Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert - R Dyn.Error.Err_Stau_Einfahrt - R Dyn.Error.Err_BLKMov - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - R Dyn.Error.Err_Raus_Sensor // Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! - R Dyn.Error.Err_Ziel // kein Ziel angegeben - R Dyn.Error.Err_Weichen_DL // Weichen-Datenliste fehlerhaft - R Dyn.Error.Err_Undef_Weiche // undefinierte Weiche - R Dyn.Error.Err_Weiche_belegt // Weiche bleibt belegt - R Dyn.Error.Err_Kein_LeseErgebnis - R Dyn.Error.Err_Leser_nicht_bereit - - L 0 - T Dyn.SAVE2.Leser_DB - L DINT#0 - T Dyn.SAVE2.Leser_DD - T Dyn.Leser.IN.nOutBarcode - -// Defaultwerte übergeben: - L 0 // Damit statische Werte neu aus Datenbank geholt werden ! - T Schleuse.Schleusen_Nr // Nummer des Schleuses - - JU RET - -en04: NOP 0 - - ---- NW 6: Störungen nach Außen übergeben --- - L 0 - T "MW200" - - A Dyn.Error.Schleuse_DL // Schleuse-Datenliste fehlerhaft - = "M200.0" - A Dyn.Error.Undef_Schleuse // undefinierter Schleuse - = "M200.1" - A Dyn.Error.Err_Trolley_nicht_in_Schleuse // Trolley fährt nicht in Schleuse - = "M200.2" - A Dyn.Sk.Err_Uebzeit - = Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen - = "M200.3" - NEG - R Dyn.Sk.Err_Uebzeit_AnzOk - A Dyn.Sk.Err_Schritt - = Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert - = "M200.4" - A Dyn.Error.Err_Stau_Einfahrt - AN B_InSchleuse - AN Y_Schleuse_Auf - = "M200.5" - A Dyn.Error.Err_BLKMov // Error bei Block kopieren - = "M200.6" - A Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - = "M200.7" - A Dyn.Error.Err_Raus_Sensor // Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! - = "M201.0" - A Dyn.Error.Err_Ziel // Trolley-Ziel nicht bekannt - = "M201.1" - A Dyn.Error.Err_Weichen_DL // Weichen-Datenliste fehlerhaft - = "M201.2" - A Dyn.Error.Err_Undef_Weiche // undefinierte Weiche - = "M201.3" - A Dyn.Error.Err_Weiche_belegt // Weiche bleibt belegt - = "M201.4" - A Dyn.Error.Err_Kein_LeseErgebnis - = "M201.5" - A Dyn.Error.Err_Leser_nicht_bereit - = "M201.6" - A Dyn.Error.Barcode_nicht_bekannt - = "M201.7" - -// Andere Meldung als Überwachungszeit aktiv ?: - L "MW200" - L 2#1111_0111_1111_1111 - AW - L 2#0000_0000_0000_0000 // Andere Meldung als Üb.zeit aktiv ? - <>I // Ja ! - ON Dyn.Sk.Err_Uebzeit_AnzOk // Störung anzeigen ok, da 2.Zyklus aktiv ! - R "M200.3" // Üb.Zeit-Meldung nicht an PC senden - - A Dyn.Sk.Err_Uebzeit - S Dyn.Sk.Err_Uebzeit_AnzOk // Störung anzeigen ok, da 2.Zyklus aktiv ! - - L "MW200" - T Error // Schnittstelle nach Außen - -// Störung vorhanden: - L 0 - <>I // Ja ! - = Dyn.Status.Error_aktiv - S hStOk - -// Antrieb stoppen: - A( - ON Dyn.Sk.Auto_akt // SystemVoraussetzungen fehlen - O Dyn.Sk.Hand_akt - ON Dyn.Sk.Bereich_ok - ) - S Antrieb_Schleuse_stop // Antrieb stoppen - -// Störungen pro Zyklus neu erzeugen: - SET - R Dyn.Error.Schleuse_DL // Schleuse-Datenliste fehlerhaft - R Dyn.Error.Undef_Schleuse // undefinierter Schleuse -// / R #Dyn.Error.Err_Trolley_nicht_in_Schleuse//Trolley fährt nicht in Schleuse -// / R #Dyn.Error.Err_Uebzeit //Überwachungzeit ist abgelaufen - R Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert -// / R #Dyn.Error.Err_Stau_Einfahrt//Betriebsart ist nicht möglich - R Dyn.Error.Err_BLKMov -// / R #Dyn.Error.Err_Trolley_raus//Trolley fährt nicht aus -// / R #Dyn.Error.Err_Raus_Sensor//Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! - R Dyn.Error.Err_Ziel // Trolley-Ziel nicht bekannt - R Dyn.Error.Err_Weichen_DL // Weichen-Datenliste fehlerhaft - R Dyn.Error.Err_Undef_Weiche // undefinierte Weiche - R Dyn.Error.Err_Weiche_belegt // Weiche bleibt belegt -// / R #Dyn.Error.Err_Kein_LeseErgebnis -// / R #Dyn.Error.Err_Leser_nicht_bereit - R Dyn.Error.Barcode_nicht_bekannt - - AN Dyn.Sk.Err_Uebzeit - R Dyn.Error.Err_Trolley_nicht_in_Schleuse // Trolley fährt nicht in Schleuse - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - - ---- NW 7: Statische Schleuse-Parameter holen --- - L Schleuse.Schleusen_Nr // Nummer des Schleuses - L Schleusen_Nr // Aufruf-Parameter - ==I // Identisch ? - R Dyn.Error.Schleuse_DL // Schleusedatenbank fehlerhaft - R Dyn.Error.Undef_Schleuse // undefinierter Schleuse - JC en06 // Ja ! - - T "MW200" // Search-Daten - -CALL FC "DatenOut" (SSDB:=Para.Schleusen_DL_DB, SSDW:=0, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196") - - L "MB199" - T Dyn.Rueckmld.RET_VAL_DL_Schleuse // Rückmeldung bei Datenbank-Zugriff (Gefälle-DL) - - JBI G_Ok - - A "M199.0" - JCN w060 - - SET - = Dyn.Error.Schleuse_DL // Schleusedatenbank fehlerhaft - - L 16#A061 - T Dyn.Stop_Ursache - - JU RET - -w060: SET - S Dyn.Error.Undef_Schleuse // undefinierter Schleuse - - L 16#A062 - T Dyn.Stop_Ursache - - JU RET - -// Kennung + Datenbytes -G_Ok: SET - R Dyn.Error.Schleuse_DL // Gefälledatenbank fehlerhaft - R Dyn.Error.Undef_Schleuse // undefinierte Gefällestrecke - - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 20 // Datenwords speichern - T LW2 // Wiederholungen +FUNCTION_BLOCK "MHMOmniSchleuse_Plus" +TITLE = HM-OmniSchleusen-Modul Plus +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-960629 +// +//Version Plus: HM-Omniflow 2100 / 12.2025 +//-es dürfen X-Trolleys zw. Schleuse und Raus-Sensor sich befinden +// +//Version: HM-Omniflow 2100 / 07.2025 +// +//Version: Omniflow 2100 / 10.2024 +// +//Schritt 0: Warten auf Trolley +//Schritt 1: Betriebsart ok/angegeben? +//Schritt 5: Mit Scanner fahren: Defaultziel ? +//Schritt 6: Scanner triggern +//Schritt 7: "DREQ" an PC senden +//Schritt 8: Warten auf PC-Antwort +//Schritt 9: PC-Antwort auswerten +//Schritt 10: Fahrtrichtung ermitteln +//Schritt 11: Ausfahren ok ? +//Schritt 12: Warten auf Pin-Signal +//Schritt 13: Weichenbereich raus bereit ? +//Schritt 14: Daten an Rausweiche übergeben +//Schritt 15: Schleuse Mindestzeit öffnen +//Schritt 16: Trolley ausgefahren ? +//Schritt 17: Trolley ist draussen +//Schritt 18: BM wurde vereinzelt +//Schritt 19: Beladezustand checken +//Schritt 20: Schleuse resetten +//Schritt 21: Reset ist zu Ende +// + VAR_INPUT + Schleusen_Nr { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Aufruf für Schleuse + ErrQuit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Ablaufstörung quittieren + B_VorSchleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley fährt in Bereich + B_InSchleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley ist in Schleuse + B_Zähl { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley ist imnächsten Bereich + B_Stau_raus { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Stau im Bereich rausfahren + Start_Ok { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Starten ist erlauTrolley + Antrieb_Schleuse_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Kreisel-Antrieb aktiv + Antrieb_plus_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Kreisel-Antrieb plus aktiv + Schleuse_geöffnet : Bool; // Schleuse hat geöffnet + RestZeit_Bereich_plus : Int := 999; // Bereich +1: Restzeit bis AFS stoppt (s) + END_VAR + + VAR_OUTPUT + Y_Schleuse_Auf { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse öffnen + Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Störungen übergeben + END_VAR + + VAR_IN_OUT + Antrieb_Schleuse_vor { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleusen-Antrieb einschalten + Antrieb_Schleuse_start { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleusen-Antrieb mit Zeit starten + Antrieb_Schleuse_stop : Bool; // Schleusen-Antrieb stoppen + Antrieb_Schleuse_PS : Bool; // Schleusen-Antrieb Energie sparen + Antrieb_plus_vor { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Antrieb plus einschalten + Antrieb_plus_start { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Antrieb plus mit Zeit starten + hStOk : Bool; // Anzeige Start n. Störung aktivieren + END_VAR + + VAR + SAVE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Weichen_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Weichen-FIFO-DB + Weichen_DW { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Weichen-FIFO-DW + "Weiche+1" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Weiche +1, wo reserviert wurde + Frei18 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; + Frei20 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; + END_STRUCT; + Para { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // Parameter + Schleusen_DL_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung Schleuse-Datenliste-DB + Weichen_DL_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung Weichen-Datenliste-DB + Leser_DL_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung Weichen-Datenliste-DB + END_STRUCT; + Status2 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Trolley_an_Schleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley ist an Schleuse + "2.Lesung_aktiv" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // 2.Lesung erfolgt + "3.Lesung_aktiv" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // 3.Lesung erfolgt + TrolleyPos_übergeben { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley-Pos. übergeben + "Warten_4.V" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Warten auf 4.V + "Weichen-Schritt" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schritt 13-17 aktiv (Weiche evtl. belegen) + "Trolley an Raus-Sensor" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley ist am Raus-Sensor + "Stau_an_Raus-Sensor" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Stau an Raus-Sensor (kein Zählen mehr) + Einfahrzeit_lernen { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Ausfahrzeit lernen + Telegramm_gesendet { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Telegramm wurde in Send-FIFO eingetragen + END_STRUCT; + Schleuse { S7_SetPoint := 'False'} : "UDLHMOmniSchleuse_Plus"; // Statische Schleusendaten (aus DL) + Dyn : Struct // Dynamische Daten + Status { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Trolley_fährt_in_Schleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt in Schleuse + Trolley_wartet_Lesung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley wartet auf Auftrag + "Trolley_wartet_auf_Ziel-FC" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + "Trolley_wartet_auf_Weiche+1" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + "Trolley_wartet_Bereich+1" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley wartet auf Bereich +1 + Trolley_fährt_aus { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt aus + MindestZeit_ok { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse ist MindestZeit geöffnet + Trolley_draussen { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley ist ausgefahren + Leser_triggern { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + SF_angefordert { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + Kein_Stop_mehr { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Kein Stop mehr, Antrieb soll starten + Trolley_fährt_rückwärts { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley in Schleuse rückwärts erkannt + Weiche_geschaltet { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + "Trolley ausserhalb Weiche" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley hat Weiche verlassen (von Weiche) + Error_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Störung vorhanden + Reset_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool := TRUE; // Reset aktiv + END_STRUCT; + TrolleyID_Schleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-Nr in der Schleuse + Trolley_EndZiel { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Trolley-EndZiel + Trolley_ZwischenZiel { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Trolley-ZwischenZiel + Trolley_ShopGroup { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-ShopGroup + Weichen_Ziel { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Weichen-Ziel (Für WeichenModul von Ziel-FC) + TrolleyID_Eingefahren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-Nr von Bereich -1 gemeldet + TrolleyID_ausgefahren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // TrolleyID des ausgefahrenen Trolleys + HMI : Struct + TrolleyID_in_Schleuse { ExternalWritable := 'False'} : DInt; // Trolley-Nr in Schleuse (IN:PLC, OUT:PLC) + TrolleyID_Input : DInt; // Trolley-Nr Input (IN:HMI, OUT:PLC) + Schleuse_resetten : Bool; // Schleuse resetten (IN:HMI, Out:PLC) + END_STRUCT; + Sk { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "USk_ILS"; // Status der Schrittkette + Leser { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + xOutReadyForNewScan { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // DBX10.1: Reader ist bereit für Leseanforderung + xOutReadingDone { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // DBX10.0: Lesevorgang abgeschlossen / Handshake raus + xOutCodeGood { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // DBX278.0: Gute Lesung + xOutCodeBad { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // DBX278.1: Schlechte Lesung + nOutBarcode { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // DBD12: Trolley ID + END_STRUCT; + OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + xInStartReading { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // DBX4.1: Starte Lesevorgang + xInHandshakeDone { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // DBX4.2: Handshake Daten abgeholt + xInErrQuit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // DBX4.4: Fehler rücksetzen + xInReset { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // DBX4.5: Allgemeines Rücksetzen des Bausteins + END_STRUCT; + END_STRUCT; + TrolleyID_unbekannt_Schleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'True'} : DInt; // TrolleyID unbekannt (Trolley in Schleuse) + Rueckmld { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + RET_VAL_BLKMOV_Schleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Rückmeldung nach BLKMOV-Aufruf + RET_VAL_DL_Schleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; + RET_VAL_DL_Weiche { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf + RET_VAL_DL_Leser { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf + END_STRUCT; + Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "UErrHMOmniSchleuse"; + Stau_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Sensor B_VorSep ist belegt [1s] + Mindest_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Sensor B_VorSep ist frei [1s] + Leer_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; + Stop_Ursache { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Stop-Stelle: Nw + Position + Vereinzelungstakte { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Anzahl der getätigten Vereinzelungstakte + ZwischenZiel_eingefahren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Trolley-ZwischenZiel von Bereich -1 + Zeit_Ohne_B_In_Schleuse : Int; // Trolley nicht an B_In_Schleuse + Zeit_Ohne_B_Zähl : Int; // Trolley nicht an B_Zähl + Zeit_Ausfahren_Ohne_B_Zähl : Int; // Trolley fährt nicht zu B_Zähl + Raus_Trolleys : Int; // Anzahl der Trolleys zwischen Schleuse und Raus-Sensor + Stau_Zeit_RausSensor : Int; // Sensor B_AusSep ist belegt [1s] + Zurück_gemeldetes_Weichen_Ziel { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Von Weiche zurück gemeldetes Weichen-Ziel + SAVE2 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Leser_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Weichen-FIFO-DB + Leser_DD { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Weichen-FIFO-DD + END_STRUCT; + WarteZeit_PS : Int; + Restzeit_bis_Schleuse : Int; + Res200 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..11] of Int; // Reserve + END_STRUCT; + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ueb_akt : Bool; // Überwachungszeit aktivieren + Weiter : Bool; // Weiterschaltbedingung ist erfüllt + Warte_neu : Bool; // Wartezeit neu triggern + Warte_stop : Bool; // Wartezeit stoppen + "Kein_Weichenbereich +1" : Bool; + "Reservierung_Weiche+1_aktiv" : Bool; + Leser_Zugriff : Bool; // Leser-Zugriff vorhanden + LeserFC_vorhanden : Bool; + ZielFC_vorhanden : Bool; + DraussenFC_vorhanden : Bool; + "TrolleyID_Bereich-1" : Bool; // Trolley--ID von Bereich -1 gemeldet + Trolley_draussen : Bool; // Signal: Trolley ist draussen + Antriebe_starten : Bool; + Einfahrzeit_nicht_bekannt : Bool; + LeserFC : Word; // Ziel-FC + ZielFC : Word; // Ziel-FC + DraussenFC : Word; // Draussen-FC + AR1Start : DInt; // Startwert mit Offset 0 + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + END_VAR + + +BEGIN +NETWORK +TITLE = Parameter-Übergabe + L #Schleusen_Nr; + + L 274 ;//Einsprung Schleuse-DL + T #Para.Schleusen_DL_DB;//vor Aufruf übergeben! + + L 279 ;//Einsprung Weichen-DL + T #Para.Weichen_DL_DB;//vor Aufruf übergeben! + + L 273; + T #Para.Leser_DL_DB; + +NETWORK +TITLE = Anzeige OP + U #ErrQuit ;//Überwachungszeit abgelaufen quittieren + R #Dyn.Sk.Err_Uebzeit; + + L 252;//Bereichsstop aktiv + UN #Dyn.Sk.Bereich_ok;//Also: Bereichsstop / Not-Aus + SPB w010; + + L 253; + UN #Dyn.Sk.Auto_akt;//Keine Betriebsart + UN #Dyn.Sk.Hand_akt; + SPB w010; + + L 255;//Handbetrieb aktiv + U #Dyn.Sk.Hand_akt; + SPB w010; + + L #Dyn.Sk.Akt_Schritt;//Aktiver Schritt +w010: T #Dyn.Sk.OP_Schritt; + +NETWORK +TITLE = Out-Bits zum Zurücksetzen + SET; + R #Y_Schleuse_Auf; + + SET ;//Jeden Zyklus neu + R #Dyn.Status.Trolley_wartet_Lesung; + R #Dyn.Status."Trolley_wartet_auf_Ziel-FC"; + R #Dyn.Status."Trolley_wartet_auf_Weiche+1"; + R #Dyn.Status."Trolley_wartet_Bereich+1"; + R #Dyn.Status.Trolley_fährt_aus; + R #Dyn.Status.Trolley_draussen; + R #Leser_Zugriff; + R #Status2."Weichen-Schritt"; + + U #Dyn.Sk.Reset_Akt; + = #Dyn.Status.Reset_aktiv; + +NETWORK +TITLE = HMI-Zeug + +//Von HMI: + U #Dyn.HMI.Schleuse_resetten; + R #Dyn.HMI.Schleuse_resetten;//von HMI + S #Dyn.Sk.Reset ;//SK zurücksetzen + + L #Dyn.HMI.TrolleyID_Input;//Wird direkt im Programm verwertet (s.u.) + +//An HMI: +ToHMI: L #Dyn.TrolleyID_Schleuse; + T #Dyn.HMI.TrolleyID_in_Schleuse; + +NETWORK +TITLE = Schrittkette zurücksetzen + U #ErrQuit ;//Überwachungszeit abgelaufen quittieren + R #Dyn.Sk.Err_Uebzeit; + + UN #Dyn.Sk.Reset ;//SK zurücksetzen + SPB en04; + +//Schrittkette zurücksetzen: + L 0;//Schritt 0: Warten + T #Dyn.Sk.Akt_Schritt; + T #Dyn.Raus_Trolleys; + + L 0;//Zeitwert löschen + T #Dyn.Sk.Terr_Zelle; + T #Dyn.Sk.Tok_Zelle; + + SET; + R #Dyn.Error.Err_BLKMov;//Error bei Block kopieren + R #Dyn.Sk.Reset;//SK zurücksetzen + R #Dyn.Sk.Err_Schritt;//Undefinierter Schritt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + R #Status2.Telegramm_gesendet; + S #Dyn.Sk.Reset_Akt;//Reset ist aktiv + + SET; + R #Dyn.Error.Schleuse_DL;//Schleuse-Datenliste fehlerhaft + R #Dyn.Error.Undef_Schleuse;//undefinierter Schleuse + R #Dyn.Error.Err_Trolley_nicht_in_Schleuse;//Trolley fährt nicht in Schleuse + R #Dyn.Error.Err_Uebzeit;//Überwachungzeit ist abgelaufen + R #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert + R #Dyn.Error.Err_Stau_Einfahrt; + R #Dyn.Error.Err_BLKMov; + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + R #Dyn.Error.Err_Raus_Sensor;//Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! + R #Dyn.Error.Err_Ziel;//kein Ziel angegeben + R #Dyn.Error.Err_Weichen_DL;//Weichen-Datenliste fehlerhaft + R #Dyn.Error.Err_Undef_Weiche;//undefinierte Weiche + R #Dyn.Error.Err_Weiche_belegt;//Weiche bleibt belegt + R #Dyn.Error.Err_Kein_LeseErgebnis; + R #Dyn.Error.Err_Leser_nicht_bereit; + + L 0; + T #Dyn.SAVE2.Leser_DB; + L DINT#0; + T #Dyn.SAVE2.Leser_DD; + T #Dyn.Leser.IN.nOutBarcode; + +//Defaultwerte übergeben: + L 0 ;//Damit statische Werte neu aus Datenbank geholt werden ! + T #Schleuse.Schleusen_Nr;//Nummer des Schleuses + + SPA RET; + +en04: NOP 0; + +NETWORK +TITLE = Störungen nach Außen übergeben + L 0; + T "MW200"; + + U #Dyn.Error.Schleuse_DL;//Schleuse-Datenliste fehlerhaft + = "M200.0"; + U #Dyn.Error.Undef_Schleuse;//undefinierter Schleuse + = "M200.1"; + U #Dyn.Error.Err_Trolley_nicht_in_Schleuse;//Trolley fährt nicht in Schleuse + = "M200.2"; + U #Dyn.Sk.Err_Uebzeit; + = #Dyn.Error.Err_Uebzeit;//Überwachungzeit ist abgelaufen + = "M200.3"; + NOT; + R #Dyn.Sk.Err_Uebzeit_AnzOk; + U #Dyn.Sk.Err_Schritt; + = #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert + = "M200.4"; + U #Dyn.Error.Err_Stau_Einfahrt; + UN #B_InSchleuse; + UN #Y_Schleuse_Auf; + = "M200.5"; + U #Dyn.Error.Err_BLKMov;//Error bei Block kopieren + = "M200.6"; + U #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + = "M200.7"; + U #Dyn.Error.Err_Raus_Sensor;//Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! + = "M201.0"; + U #Dyn.Error.Err_Ziel;//Trolley-Ziel nicht bekannt + = "M201.1"; + U #Dyn.Error.Err_Weichen_DL;//Weichen-Datenliste fehlerhaft + = "M201.2"; + U #Dyn.Error.Err_Undef_Weiche;//undefinierte Weiche + = "M201.3"; + U #Dyn.Error.Err_Weiche_belegt;//Weiche bleibt belegt + = "M201.4"; + U #Dyn.Error.Err_Kein_LeseErgebnis; + = "M201.5"; + U #Dyn.Error.Err_Leser_nicht_bereit; + = "M201.6"; + U #Dyn.Error.Barcode_nicht_bekannt; + = "M201.7"; + +//Andere Meldung als Überwachungszeit aktiv ?: + L "MW200"; + L 2#1111_0111_1111_1111; + UW; + L 2#0000_0000_0000_0000;//Andere Meldung als Üb.zeit aktiv ? + <>I;//Ja ! + ON #Dyn.Sk.Err_Uebzeit_AnzOk;//Störung anzeigen ok, da 2.Zyklus aktiv ! + R "M200.3";//Üb.Zeit-Meldung nicht an PC senden + + U #Dyn.Sk.Err_Uebzeit; + S #Dyn.Sk.Err_Uebzeit_AnzOk;//Störung anzeigen ok, da 2.Zyklus aktiv ! + + L "MW200"; + T #Error;//Schnittstelle nach Außen + +//Störung vorhanden: + L 0; + <>I;//Ja ! + = #Dyn.Status.Error_aktiv; + S #hStOk; + +//Antrieb stoppen: + U(; + ON #Dyn.Sk.Auto_akt;//SystemVoraussetzungen fehlen + O #Dyn.Sk.Hand_akt; + ON #Dyn.Sk.Bereich_ok; + ); + S #Antrieb_Schleuse_stop;//Antrieb stoppen + +//Störungen pro Zyklus neu erzeugen: + SET; + R #Dyn.Error.Schleuse_DL;//Schleuse-Datenliste fehlerhaft + R #Dyn.Error.Undef_Schleuse;//undefinierter Schleuse +/// R #Dyn.Error.Err_Trolley_nicht_in_Schleuse//Trolley fährt nicht in Schleuse +/// R #Dyn.Error.Err_Uebzeit //Überwachungzeit ist abgelaufen + R #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert +/// R #Dyn.Error.Err_Stau_Einfahrt//Betriebsart ist nicht möglich + R #Dyn.Error.Err_BLKMov; +/// R #Dyn.Error.Err_Trolley_raus//Trolley fährt nicht aus +/// R #Dyn.Error.Err_Raus_Sensor//Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! + R #Dyn.Error.Err_Ziel;//Trolley-Ziel nicht bekannt + R #Dyn.Error.Err_Weichen_DL;//Weichen-Datenliste fehlerhaft + R #Dyn.Error.Err_Undef_Weiche;//undefinierte Weiche + R #Dyn.Error.Err_Weiche_belegt;//Weiche bleibt belegt +/// R #Dyn.Error.Err_Kein_LeseErgebnis +/// R #Dyn.Error.Err_Leser_nicht_bereit + R #Dyn.Error.Barcode_nicht_bekannt; + + UN #Dyn.Sk.Err_Uebzeit; + R #Dyn.Error.Err_Trolley_nicht_in_Schleuse;//Trolley fährt nicht in Schleuse + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + +NETWORK +TITLE = Statische Schleuse-Parameter holen + L #Schleuse.Schleusen_Nr;//Nummer des Schleuses + L #Schleusen_Nr;//Aufruf-Parameter + ==I;//Identisch ? + R #Dyn.Error.Schleuse_DL;//Schleusedatenbank fehlerhaft + R #Dyn.Error.Undef_Schleuse;//undefinierter Schleuse + SPB en06;//Ja ! + + T "MW200";//Search-Daten + + CALL "DatenOut" + ( SSDB := #Para.Schleusen_DL_DB , + SSDW := 0 , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := "MW196" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_DL_Schleuse;//Rückmeldung bei Datenbank-Zugriff (Gefälle-DL) + + SPBI G_Ok; + + U "M199.0"; + SPBN w060; + + SET; + = #Dyn.Error.Schleuse_DL;//Schleusedatenbank fehlerhaft + + L 16#A061; + T #Dyn.Stop_Ursache; + + SPA RET; + +w060: SET; + S #Dyn.Error.Undef_Schleuse;//undefinierter Schleuse + + L 16#A062; + T #Dyn.Stop_Ursache; + + SPA RET; + +//Kennung + Datenbytes +G_Ok: SET; + R #Dyn.Error.Schleuse_DL;//Gefälledatenbank fehlerhaft + R #Dyn.Error.Undef_Schleuse;//undefinierte Gefällestrecke + + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 20;//Datenwords speichern + T %LW2;//Wiederholungen + +//Quelle-Pointer erzeugen: + L 0;//Bei Merker = 0 ! + T %LW4;//DB_Nummer + L 220;//Adresse + SLD 3; + L 16#8300_0000;//Kennung: Merker + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #Dyn.Rueckmld.RET_VAL_BLKMOV_Schleuse , + DSTBLK := #Schleuse //#Ziel + ); + + L 16#A063; + T #Dyn.Stop_Ursache; + + L #Dyn.Rueckmld.RET_VAL_BLKMOV_Schleuse;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Dyn.Error.Err_BLKMov ;//Error bei Block kopieren + SPB RET; + + L #Schleuse.Schleusen_Typ;//Schleusetyp = 1275 (HM-Schleuse Plus) + L 1275 ;//Dieser Aufruf-FB ? + ==I;//Ja ! + SPB w061; + + SET; + S #Dyn.Error.Undef_Schleuse;//undefinierter Schleuse + + L 0 ;//Schleuse ungültig ! + T #Schleuse.Schleusen_Nr;//Nummer des Schleuses + + L 16#A064; + T #Dyn.Stop_Ursache; + + SPA RET; + +//Defaultwerte übergeben: +w061: NOP 0; + + SPA RET; + +en06: NOP 0; + +NETWORK +TITLE = Einsprung Weiche plus ermitteln + L #SAVE.Weichen_DB;//Weichen-FIFO-DB + L 0;//Einsprung-Zeiger bekannt ? + >I;//Ja ! + R #"Kein_Weichenbereich +1"; + SPB En08; + + L #Schleuse.RausWeichen_Nr;//Nr. der vorhandenen Weiche + T "MW200";//Search-Daten + L 0;//angegeben ? + ==I;//Nein ! + = #"Kein_Weichenbereich +1"; + R #Dyn.Error.Err_Undef_Weiche;//undefinierte Weiche + SPB En08; + + CALL "DatenOut" + ( SSDB := #Para.Weichen_DL_DB , + SSDW := 0 , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := "MW196" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_DL_Weiche;//Rückmeldung bei Datenbank-Zugriff (Weiche-DL) + + SPBI W_Ok; + + U "M199.0"; + = #Dyn.Error.Err_Weichen_DL;//Weichen-Datenliste fehlerhaft + SPB En08; + + SET; + S #Dyn.Error.Err_Undef_Weiche;//undefinierte Weiche + + SPA En08; + +W_Ok: L "MW224"; + T #SAVE.Weichen_DB ;//Weichen-FIFO-DB + L 0;//sinnvoller Wert ? + <=I;//Nein ! + S #Dyn.Error.Err_Undef_Weiche;//undefinierte Weiche + SPB En08; + + L "MW226"; + T #SAVE.Weichen_DW;//Weichen-FIFO-DW + +En08: NOP 0; + +NETWORK +TITLE = Trolley in Schleuse entprellen + U #B_InSchleuse; + SPB B_ok; + + UN #Status2.Trolley_an_Schleuse; + ON "1s-Impuls"; + SPB Xn08; + + L #Dyn.Zeit_Ohne_B_In_Schleuse; + + 1 ;//Zeit ohne Sensor +1s + T #Dyn.Zeit_Ohne_B_In_Schleuse; + + L 3;//Nach ca. 3s + I ;//Ja! + UN #Status2."Stau_an_Raus-Sensor";//Stau an Raus-Sensor + O; + U #B_VorSchleuse;//// + UN #Dyn.Error.Err_Stau_Einfahrt;//// + O #Schleuse_geöffnet; + = #Antriebe_starten; + + U #Antriebe_starten; +/// UN #Dyn.Error.Err_Trolley_raus//Trolley fährt nicht aus + U(; + O #Dyn.Status.Weiche_geschaltet;//Weiche ist aktiv + O #"Kein_Weichenbereich +1"; + ); + U #Schleuse.Parameter_allg.Antrieb_Plus_vorhanden; + S #Antrieb_plus_vor ;//Antrieb plus einschalten + + U #Antriebe_starten; +/// UN #Dyn.Error.Err_Trolley_raus//Trolley fährt nicht aus + U(; + O #Dyn.Status.Weiche_geschaltet;//Weiche ist aktiv + O #"Kein_Weichenbereich +1"; + ); + U(; + O #Antrieb_plus_aktiv; + ON #Schleuse.Parameter_allg.Antrieb_Plus_vorhanden; + ); + S #Antrieb_Schleuse_vor;//Antrieb einschalten + +//Trolley ist in Schleuse und wartet + U #Status2.Trolley_an_Schleuse ;//Trolley im Schleuse erkannt + UN #Schleuse_geöffnet;//Trolley soll ausfahren + U(; + ON #B_VorSchleuse; + O #Dyn.Error.Err_Stau_Einfahrt; + ); + UN #Dyn.Status.Kein_Stop_mehr;//Wird in Schritt 2 gesetzt + O; + U #Schleuse_geöffnet ;//Trolley soll ausfahren + U #Schleuse.Parameter_allg.Antrieb_Plus_vorhanden; + UN #Antrieb_plus_aktiv; + SPB Warten; + + L 0; + T #Dyn.WarteZeit_PS; + + SPA NwE10; + +Warten: L #Dyn.WarteZeit_PS; + L 3 ;//ca. 3s rum ? + =I; + UN #Status2."Stau_an_Raus-Sensor"; + SPB RDel; + + TAK; + L 200 ;//Nach ca. 20s + >=I; + SPB RDel; + + SPA En10; + +RDel: SET; + R #Status2."Trolley an Raus-Sensor"; + L 0; + T #Dyn.Zeit_Ohne_B_Zähl; + T #Dyn.Stau_Zeit_RausSensor; + +//War Stau?: + U #Status2."Stau_an_Raus-Sensor"; + R #Status2."Stau_an_Raus-Sensor"; + SPBN DelRT; + + L 0;//Bisher gefahrene Trolleys löschen + T #Dyn.Raus_Trolleys; + T #Dyn.Zeit_Ohne_B_Zähl; + T #Dyn.Stau_Zeit_RausSensor; + +//Im Weichenbereich noch Trolleys unterwegs?: +DelRT: L #Dyn.Raus_Trolleys; + L 0; + >I; + O #"Kein_Weichenbereich +1"; + SPB En10; + +//Weiche+1 löschen: + L 0; + T #SAVE."Weiche+1" ;//Hier wurde reserviert (Im Weichenmodul wird dann Reservierung gelöscht!) + + SPA En10; + +B_Raus: L 0; + T #Dyn.Zeit_Ohne_B_Zähl; + T #Dyn.Zeit_Ausfahren_Ohne_B_Zähl; + + //Einmalig: + UN #Status2."Trolley an Raus-Sensor"; + S #Status2."Trolley an Raus-Sensor";//Raus-Sensor ausgewertet + SPBN Xn10 ;//Negierter Sprung + + L #Dyn.Raus_Trolleys; + + -1;//Ausgefahrene Trolleys -1 + T #Dyn.Raus_Trolleys; + + L 0; + >=I; + SPB Xn10; + + T #Dyn.Raus_Trolleys;//Minimum übergeben + +//Stau an B_Raus: +Xn10: UN "100ms-Impuls"; + O #Status2."Stau_an_Raus-Sensor"; + SPB En10; + + L #Dyn.Stau_Zeit_RausSensor; + + 1 ;//StauZeit +1 + T #Dyn.Stau_Zeit_RausSensor; + + L 90 ;//Nach ca. 9s + >=I; + SPBN En10;//Negierter Sprung + + L 0 ;//Zeit löschen + T #Dyn.Stau_Zeit_RausSensor; + + SET; + S #Status2."Stau_an_Raus-Sensor"; + +En10: NOP 0; + +NETWORK +TITLE = Plus: Trolley fährt nicht bis Zähl-Sensor + L #Dyn.Raus_Trolleys; + L 0 ;//Trolles unterwegs? + ==I;//Nein! + O #Trolley_draussen ;//Sensor wurde erreicht + O #Schleuse_geöffnet;//Dann Üb.zeit von Sk + O #Dyn.Status.Reset_aktiv; + SPB RTTD; + + UN #Antrieb_Schleuse_aktiv; + O; + UN #Antrieb_plus_aktiv; + U #Schleuse.Parameter_allg.Antrieb_Plus_vorhanden; + ON "1s-Impuls"; + O #Dyn.Error.Err_Raus_Sensor;//Trolley fährt nicht aus + SPB En12; + + L #Dyn.Zeit_Ausfahren_Ohne_B_Zähl; + + 1; + T #Dyn.Zeit_Ausfahren_Ohne_B_Zähl; + +//Trolley fährt nicht bis Zähl-Sensor!: + L #Schleuse.Übzeit_aus_Schleuse; + >=I; + S #Dyn.Error.Err_Raus_Sensor;//Trolley fährt nicht aus + SPBN En12;//Negierter Sprung! + + L #Dyn.Raus_Trolleys; + + -1; + T #Dyn.Raus_Trolleys; + + SPA En12; + +RTTD: L 0; + T #Dyn.Zeit_Ausfahren_Ohne_B_Zähl; + + SET; + R #Dyn.Error.Err_Raus_Sensor;//Trolley fährt nicht aus + +En12: NOP 0; + +NETWORK +TITLE = Einfahrzeit lernen + L #Schleuse.EinfahrZeit; + L 0;//Ausfahrzeit bekannt ? + ==I;//Nein ! + O #Status2.Einfahrzeit_lernen; + = #Einfahrzeit_nicht_bekannt; + U #Einfahrzeit_nicht_bekannt; + U #B_VorSchleuse ;//Stauklappe bei Einfahrt + U #Antrieb_Schleuse_aktiv; + UN #B_InSchleuse; + UN #Schleuse_geöffnet; + S #Status2.Einfahrzeit_lernen; + + U #B_InSchleuse; + UN #Schleuse_geöffnet; + R #Status2.Einfahrzeit_lernen; + + U #Status2.Einfahrzeit_lernen; + S #Antrieb_Schleuse_vor;//Antrieb einschalten + + UN #Status2.Einfahrzeit_lernen; + ON #Antrieb_Schleuse_aktiv; + ON "1s-Impuls"; + SPB NoEFZ; + + L #Schleuse.EinfahrZeit; + + 1; + T #Schleuse.EinfahrZeit; + +NoEFZ: NOP 0; + +NETWORK +TITLE = PS deaktivieren, da Trolley einfährt + U #Einfahrzeit_nicht_bekannt;//Also bekannt + SPB En14; + +//Neuer Trolley fährt ein: + U #B_VorSchleuse; + SPBN Wait;//Negierter Sprung + + L #Schleuse.EinfahrZeit; + T #Dyn.Restzeit_bis_Schleuse; + +//Restzeit zurück zählen: +Wait: UN #Antrieb_Schleuse_aktiv; + O #Schleuse_geöffnet; + ON "1s-Impuls"; + SPB X014; + + L #Dyn.Restzeit_bis_Schleuse; + + -1; + T #Dyn.Restzeit_bis_Schleuse; + + L 0; + >I; + SPB X014; + + T #Dyn.Restzeit_bis_Schleuse;//Minimum übergeben + +//Trolley fährt noch ein: +X014: L #Dyn.Restzeit_bis_Schleuse; + L 0;//Restzeit vorhanden? + >I;//Ja ! + UN #B_InSchleuse; + UN #Schleuse_geöffnet; + S #Antrieb_Schleuse_vor;//Antrieb einschalten (dadurch wird PS-Modus deaktiviert) + +En14: NOP 0; + +NETWORK +TITLE = Spezial-FCs vorhanden? + L #Schleuse.Leser_FC; + T #LeserFC; + L 0;//Parameter vorhanden ? + >I ;//Ja! + = #LeserFC_vorhanden; + + L #Schleuse.Ziel_FC; + T #ZielFC; + L 0;//Parameter vorhanden ? + >I ;//Ja! + = #ZielFC_vorhanden; + + L #Schleuse.Draussen_FC; + T #DraussenFC; + L 0;//Parameter vorhanden ? + >I ;//Ja! + = #DraussenFC_vorhanden; + +NETWORK +TITLE = Error: Stau Bereich-Eingang + +//TrolleyID zum Einfahren gemeldet / Trolley fährt in Bereich: + L #Dyn.TrolleyID_Eingefahren;//Eintrag von Weiche -1 + L DINT#0;//angegeben ? + <>D;//Ja ! + = #"TrolleyID_Bereich-1"; + U #"TrolleyID_Bereich-1"; + O #B_VorSchleuse; + S #Dyn.Status.Trolley_fährt_in_Schleuse; + +//Antrieb einschalten: + U #B_VorSchleuse; + UN #B_InSchleuse; + UN #Schleuse_geöffnet; + S #Antrieb_Schleuse_vor; + + U #B_VorSchleuse; + S #Antrieb_Schleuse_start; + +//Sensor bei Bereichs-Einfahrt bleibt belegt?: + UN #B_VorSchleuse ;//Sensor Trolley fährt in Bereich (kein Stau !) + O #Schleuse_geöffnet; + R #Dyn.Error.Err_Stau_Einfahrt;//Stau bei Einfahrt + SPB X120 ;//StauZeit neu aufziehen + + UN "1s-Impuls"; + O; + U #Schleuse.Parameter_allg.Antrieb_vorhanden; + UN #Antrieb_Schleuse_aktiv; + O #Dyn.Error.Err_Stau_Einfahrt;//Zeit bereits abgelaufen + SPB Xn12; + + L #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + + +1; + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + + L 20 ;//Stau-Zeit erreicht ? + >=I;//Ja ! + S #Dyn.Error.Err_Stau_Einfahrt;//Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb + SPBN Xn12; + +X120: L 0 ;//Zeiten löschen + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + +Xn12: NOP 0; + +NETWORK +TITLE = Schleuse: Mindestzeit geöffnet/frei + L #Dyn.Sk.Akt_Schritt; + L 3 ;//AusSchleusen aktiv? + I ;//Nein! + ); +/// O #B_InSchleuse //Sensor Trolley in Schleuse vorhanden + ON #Schleuse_geöffnet; + R #Dyn.Status.MindestZeit_ok; + SPB X130 ;//FreiZeit neu aufziehen + + U #Schleuse.Parameter_allg.Antrieb_vorhanden; + UN #Antrieb_Schleuse_aktiv; + O; + U #Schleuse.Parameter_allg.Antrieb_Plus_vorhanden; + UN #Antrieb_plus_aktiv; + O #Dyn.Status.MindestZeit_ok;//Zeit bereits abgelaufen + ON "1s-Impuls"; + SPB Xn13; + + L #Dyn.Mindest_Zeit ;//Sensor B_im_Sep ist frei [1s] + + +1; + T #Dyn.Mindest_Zeit ;//Sensor B_im_Sep ist frei [1s] + + L #Schleuse.Mindeszeit_Schleuse_geoeffnet;//Mindest-Zeit erreicht ? + >=I;//Ja ! + S #Dyn.Status.MindestZeit_ok; + SPBN Xn13; + +X130: L 0 ;//Zeiten löschen + T #Dyn.Mindest_Zeit ;//Sensor B_im_Sep ist frei [1s] + +Xn13: NOP 0; + +NETWORK +TITLE = Einsprung Leser ermitteln + L #Dyn.SAVE2.Leser_DB ;//Leser-FIFO-DB + L 0;//Einsprung-Zeiger bekannt ? + >I;//Ja ! + S #Leser_Zugriff;//Leser-Zugriff vorhanden + SPB En08L; + + L #Schleuse.Leser_ID;//Nr. des vorhandenen Lesers + T "MW200";//Search-Daten + L 0;//angegeben ? + ==I;//Nein ! + SPB En08L; + + CALL "DatenOut" + ( SSDB := #Para.Leser_DL_DB , + SSDW := 0 , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := "MW196" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_DL_Leser;//Rückmeldung bei Datenbank-Zugriff (Leser-DL) + + SPBI W_OkL; + + SET; + S #Dyn.Error.Err_Leser_nicht_bereit;//Leser-Datenliste fehlerhaft + + SPA En08L; + +W_OkL: L "MW222" ;//Rein-FIFO-DB + T #Dyn.SAVE2.Leser_DB ;//Leser-FIFO-DB + L 0;//sinnvoller Wert ? + <=I;//Nein ! + S #Dyn.Error.Err_Leser_nicht_bereit;//undefinierter Leser + SPB En08L; + + L "MD224"; + T #Dyn.SAVE2.Leser_DD;//Leser-FIFO-DD + + SET; + R #Dyn.Error.Err_Leser_nicht_bereit;//undefinierter Leser + S #Leser_Zugriff;//Leser-Zugriff vorhanden + +En08L: NOP 0; + +NETWORK +TITLE = Reservierung bei Weiche plus noch aktiv? Nachtriggern + U #"Kein_Weichenbereich +1"; + R #"Reservierung_Weiche+1_aktiv"; + SPB Y11E; + + AUF DB[ #SAVE.Weichen_DB];//FABE+ -DB öffnen + + L #SAVE.Weichen_DW; + ITD; + T #AR1Start;//Startwert mit Offset 0 + + L #AR1Start ;//Startwert mit Offset 0 + + DINT#78; + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + L DBW[ #AR1Zeiger] ;//Schleuse -1 (DBW 78) + L #Schleusen_Nr;//Diese Schleuse ? + ==I;//Ja ! + = #"Reservierung_Weiche+1_aktiv"; + +//Mindestzeit nachtriggern: (nach Weiche +1) + UN #Schleuse_geöffnet; + SPB Y11E; + + L #AR1Start ;//Startwert mit Offset 0 + + DINT#71; + SLD 3; + L 3 ;//Damit DBX_Bit 3 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + SET; + = DBX[ #AR1Zeiger] ;//Mindestzeit nachtriggern (71.2) + +Y11E: NOP 0; + +NETWORK +TITLE = Leser-Einheit managen (Inputs holen) + UN #Leser_Zugriff; + ON #Schleuse.Parameter_allg.Leser_eingebaut; + R #Dyn.Status.Leser_triggern;//für Status-Anzeige + SPB NoLeser; + +//Leserdaten holen: + AUF DB[ #Dyn.SAVE2.Leser_DB] ;//Leser -DB öffnen + + L #Dyn.SAVE2.Leser_DD; + T #AR1Start ;//Startwert mit Offset 0 + +//Offset 10: + L #AR1Start ;//Startwert mit Offset 0 + + DINT#10; + SLD 3; + T #AR1Zeiger ;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + L DBB[ #AR1Zeiger]; + T "MB200"; + U "M200.0"; + = #Dyn.Leser.IN.xOutReadingDone; + U "M200.1"; + = #Dyn.Leser.IN.xOutReadyForNewScan; + +//Offset 274: + L #AR1Start ;//Startwert mit Offset 0 + + DINT#274; + SLD 3; + T #AR1Zeiger ;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + L DBB[ #AR1Zeiger]; + T "MB200"; + U "M200.0"; + = #Dyn.Leser.IN.xOutCodeGood; + U "M200.1"; + = #Dyn.Leser.IN.xOutCodeBad; + +//Offset 12: + L #AR1Start ;//Startwert mit Offset 0 + + DINT#12; + SLD 3; + T #AR1Zeiger ;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + L DBD[ #AR1Zeiger]; + T #Dyn.Leser.IN.nOutBarcode; + +NoLeser: NOP 0; + +NETWORK +TITLE = Schrittkette anhalten + U #Dyn.Sk.Auto_akt;//Automatik ist aktiv + U #Dyn.Sk.Bereich_ok; + CLR; + + SPA en08_Mig;//Schrittkette nicht anhalten ! + + SET; + R #Dyn.Sk.Err_Uebzeit;//Störungen löschen + R #Dyn.Sk.Err_Schritt; + + L 0;//Zeitwerte löschen + T #Dyn.Sk.Terr_Zelle; + T #Dyn.Sk.Tok_Zelle; + + SPA RET; + +en08_Mig: NOP 0; + +NETWORK +TITLE = Trolley wurde zurück gezogen + L #Dyn.Sk.Akt_Schritt; + L 10 ;//Trolley schon unterwegs ? + I ;//Ja ! + ); + O #Status2.Trolley_an_Schleuse ;//Trolley ist noch in Schleuse + O #Schleuse_geöffnet; + SPB TrolleyOk; + + SET; + S #Antrieb_Schleuse_start; + S #Dyn.Leser.OUT.xInReset; + + L 0;//Neubeginn + T #Dyn.Sk.Akt_Schritt; + + UN #Schleuse.Parameter_allg.Leser_eingebaut;//Falls kein Leser verbaut Daten behalten (falls von Bereich-1 gemeldet) + SPB TrolleyOk; + + T #Dyn.Trolley_ZwischenZiel; + + L DINT#0; + T #Dyn.TrolleyID_Schleuse; + +TrolleyOk: NOP 0; + +NETWORK +TITLE = Sprungverteiler + L #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + L -1;//angegeben ? + ==I;//Nein ! + SPB NEU; + + TAK;//Neuen Schritt übergeben + T #Dyn.Sk.Akt_Schritt; + + L -1;//Urzustand + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + +NEU: SET; + R #Warte_neu;//Wartezeit neutriggern + R #Warte_stop;//Wartezeit stoppen + + L #Dyn.Sk.Akt_Schritt; + SPL Ende; + SPA s000;//Schritt 0 + SPA s001;//Schritt 1 + SPA s002;//Schritt 2 + SPA s003;//Schritt 3 + SPA s004;//Schritt 4 + SPA s005;//Schritt 5 + SPA s006;//Schritt 6 + SPA s007;//Schritt 7 + SPA s008;//Schritt 8 + SPA s009;//Schritt 9 + SPA s010;//Schritt 10 + SPA s011;//Schritt 11 + SPA s012;//Schritt 12 + SPA s013;//Schritt 13 + SPA s014;//Schritt 14 + SPA s015;//Schritt 15 + SPA s016;//Schritt 16 + SPA s017;//Schritt 17 + SPA s018;//Schritt 18 + SPA s019;//Schritt 19 + SPA s020;//Schritt 20 + SPA s021;//Schritt 21 + SPA s022;//Schritt 22 + SPA s023;//Schritt 23 + SPA s024;//Schritt 24 + SPA s025;//Schritt 25 + SPA s026;//Schritt 26 + SPA s027;//Schritt 27 + SPA s028;//Schritt 28 + SPA s029;//Schritt 29 + SPA s030;//Schritt 30 +Ende: S #Dyn.Sk.Err_Schritt;//Undefinierter Schritt + + L 16#A131; + T #Dyn.Stop_Ursache; + + SPA RET; + +Neu_Mig: U #Dyn.Sk.Err_Uebzeit; + SPBN Sk; + + L 16#A132; + T #Dyn.Stop_Ursache; + + SPA RET; + +Sk: T #Dyn.Sk.Akt_Schritt; + + L 0;//Zeitwerte löschen + T #Dyn.Sk.Terr_Zelle; + T #Dyn.Sk.Tok_Zelle; + + SPA NEU; + +//Nicht programmierte Schritte: +//s000: SPA Ende +//s001: SPA Ende +//s002: SPA Ende +s003: SPA Ende; +s004: SPA Ende; +//s005: SPA Ende +//s006: SPA Ende +//s007: SPA Ende +s008: SPA Ende; +//s009: SPA Ende +//s010: SPA Ende +//s011: SPA Ende +//s012: SPA Ende +//s013: SPA Ende +//s014: SPA Ende +//s015: SPA Ende +//s016: SPA Ende +//s017: SPA Ende +s018: SPA Ende; +s019: SPA Ende; +//s020: SPA Ende +//s021: SPA Ende +s022: SPA Ende; +s023: SPA Ende; +s024: SPA Ende; +s025: SPA Ende; +s026: SPA Ende; +s027: SPA Ende; +s028: SPA Ende; +s029: SPA Ende; +s030: SPA Ende; + +NETWORK +TITLE = Schritt X: Reserve + SET;//Weiterschaltbedingung + = #Weiter; + +//Schrittaktionen: + SET; + + L 16#B001; + T #Dyn.Stop_Ursache; + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + L 0 ;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + L 1;//Weiter mit Schritt 1 + SPB Neu_Mig;//Bei diesem Schritt weiter + + SET; + U #Dyn.Sk.Auto_akt;//Automatik ist aktiv + U #Dyn.Sk.Bereich_ok; + = #Ueb_akt;//Überwachungszeit aktivieren + L 50 ;//Angabe der Überwachungszeit (*1s) + SPA tueb;//Überwachungszeit + + SPA RET; + +NETWORK +TITLE = Schritt 0: Warten auf Trolley +s000: SET;//Weiterschaltbedingung + U #B_InSchleuse;//Trolley im Schleuse erkannt + U #Dyn.Sk.Auto_akt ;//Automatik ist aktiv + U #Dyn.Sk.Bereich_ok; + = #Weiter; + +//Trolley-Schleusendaten löschen: + L DINT#0; + T #Dyn.TrolleyID_Schleuse; + T #Dyn.Trolley_ShopGroup; + + L 0; + T #Dyn.Trolley_EndZiel; + T #Dyn.Weichen_Ziel; + +//HMI-Zeug: + L DINT#0; + T #Dyn.HMI.TrolleyID_Input; + + U #Dyn.Sk.Reset_Akt ;//Reset ist aktiv + L 20 ;//Weiter mit Schritt 20 + SPB Neu_Mig;//Bei diesem Schritt weiter + +//Schrittaktionen: + SET; + R #Dyn.Error.Err_Leser_nicht_bereit; + R #Dyn.Error.Err_Kein_LeseErgebnis; + R #Dyn.Status.SF_angefordert; + R #Status2.TrolleyPos_übergeben; + R #Status2.Telegramm_gesendet; + + U #Weiter ;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + L 50 ;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + L 16#B001; + T #Dyn.Stop_Ursache; + + U #Dyn.Status.Trolley_fährt_in_Schleuse; + UN #B_InSchleuse; + S #Antrieb_Schleuse_vor;//Antrieb einschalten + SPB S000A; + + SET; + R #Dyn.Sk.Err_Uebzeit; + + L 16#B000; + T #Dyn.Stop_Ursache; + + SPA RET; + +//Überwachungszeit starten: +S000A: U #Dyn.Status.Trolley_fährt_in_Schleuse; + UN #B_InSchleuse;//Trolley im Schleuse erkannt + U(; + O #Antrieb_Schleuse_aktiv; + ON #Schleuse.Parameter_allg.Antrieb_vorhanden; + ); + = #Ueb_akt ;//Überwachungszeit aktivieren + + U #Dyn.Sk.Err_Uebzeit; + R #Dyn.Sk.Err_Uebzeit; + S #Dyn.Error.Err_Trolley_nicht_in_Schleuse; + R #Dyn.Status.Trolley_fährt_in_Schleuse; + + L #Schleuse.Übzeit_in_Schleuse; + + SPA tueb;//Überwachungszeit + +NETWORK +TITLE = Schritt 1: Trolley ist in Schleuse / Leser ? / Daten vorhanden ? +s001: NOP 0; +//Schrittaktionen: + U #B_InSchleuse; + S #Status2.Trolley_an_Schleuse; + + UN #Status2.Trolley_an_Schleuse ;//Trolley im Schleuse erkannt + U #Schleuse.Parameter_allg.Leser_eingebaut; + L 0 ;//Weiter mit Schritt 0 + SPB Neu_Mig;//Bei diesem Schritt weiter + +//Zwischen-Ziel von Bereich -1 vorhanden?: + L #Dyn.ZwischenZiel_eingefahren; + L 0;//Zwischenziel von Bereich -1 vorhanden! + ==I;//Nein ! + O #Schleuse.Parameter_allg.Leser_eingebaut;//Dann werden Daten neu ermittelt! + SPB X001; + +//Daten von Bereich -1 übergeben: + L #Dyn.ZwischenZiel_eingefahren; + T #Dyn.Trolley_ZwischenZiel; + L 0; + T #Dyn.ZwischenZiel_eingefahren; + + L #Dyn.TrolleyID_Eingefahren; + T #Dyn.TrolleyID_Schleuse; + L DINT#0; + T #Dyn.TrolleyID_Eingefahren; + + L 12 ;//Weiter mit Schritt 12 + SPA Neu_Mig ;//Bei diesem Schritt weiter + +X001: L 0; + T #Dyn.Trolley_ZwischenZiel; + +//Leser vorhanden: + U #Schleuse.Parameter_allg.Leser_eingebaut; + R #Dyn.Error.Err_Kein_LeseErgebnis; + L 9 ;//Weiter mit Schritt 9 (Leser bereit) + SPB Neu_Mig ;//Bei diesem Schritt weiter + +//Trolleydaten vorhanden ?: (Übergabe von Bereich -1) + L #Dyn.TrolleyID_Eingefahren; + T #Dyn.TrolleyID_Schleuse; + L DINT#0 ;//Daten vorhanden ? + <>D;//Ja ! + L 11 ;//Weiter mit Schritt 11 (Trolleydaten lesen) + SPB Neu_Mig ;//Bei diesem Schritt weiter + +//Ziel-FC vorhanden ?: + U #ZielFC_vorhanden; + L 12 ;//Weiter mit Schritt 12 (Ziel-FC) + SPB Neu_Mig ;//Bei diesem Schritt weiter + + L 14 ;//Weiter mit Schritt 14 (Weichenbereich +1 vorhanden) + SPA Neu_Mig ;//Bei diesem Schritt weiter + +NETWORK +TITLE = Schritt 2: Ausfahren ok ? +s002: NOP 0; + +//Schrittaktionen: + UN #Status2.Trolley_an_Schleuse ;//Trolley im Schleuse erkannt + L 0 ;//Weiter mit Schritt 0 + SPB Neu_Mig;//Bei diesem Schritt weiter + +//Anlage aus oder Störung: + L 16#B021; + T #Dyn.Stop_Ursache; + + UN #Dyn.Sk.Auto_akt ;//Automatik ist aktiv + ON #Dyn.Sk.Bereich_ok;//Bereich ist gestört + SPB RET; + +//Starten erlaubt Trolley ?: + L 16#B022; + T #Dyn.Stop_Ursache; + + UN #Start_Ok ;//Starten ist erlaubt + SPB RET; + +//Stau im Bereich +1: + L 16#B023; + T #Dyn.Stop_Ursache; + + SET; + S #Dyn.Status."Trolley_wartet_Bereich+1"; + + U #B_Stau_raus ;//Sensor Stau im Bereich rausfahren + SPB RET; + +//B_Aus_Schleuse aktiv: + L 16#B024; + T #Dyn.Stop_Ursache; + + U(; + L #Dyn.Raus_Trolleys; + L 0;//Trolleys schon unterwegs? + <>I;//Ja! + O(; + L #Schleuse.MaxRausTrolleys; + L 1;//Nur einer darf ausfahren ? + ==I;//Ja ! + ); + ); + U #Status2."Trolley an Raus-Sensor"; + O #Status2."Stau_an_Raus-Sensor"; + SPB RET; + +//Raus-Weiche bereit?: + L 16#B028; + T #Dyn.Stop_Ursache; + + U(; + L #Dyn.Weichen_Ziel; + L #Dyn.Zurück_gemeldetes_Weichen_Ziel; + <>I;//Nicht identisch ! + ON #Dyn.Status.Weiche_geschaltet;//Rückmeldung von Weiche +1 + ); + UN #"Kein_Weichenbereich +1";//Also Weiche +1 + L 15; + SPB Neu_Mig;//Bei diesem Schritt weiter + +//Zu viele Raus-Trolleys unterwegs: + L 16#B027; + T #Dyn.Stop_Ursache; + + L #Dyn.Raus_Trolleys;//Gestartete Trolleys + L #Schleuse.MaxRausTrolleys;//Erlaubte Anzahl gestarteter Trolleys + >=I; + SPB RET; + +//Antriebe aktivieren / aktiv ?: + U #Schleuse.Parameter_allg.Antrieb_Plus_vorhanden;//Schleuse an weiterem Antrieb (Weiche) + S #Antrieb_plus_vor ;//Antrieb plus einschalten + + U(; + O #Antrieb_plus_aktiv;//Kreisel-Antrieb plus aktiv + ON #Schleuse.Parameter_allg.Antrieb_Plus_vorhanden;//Schleuse an weiterem Antrieb (Weiche) + ); + S #Antrieb_Schleuse_vor;//Antrieb einschalten + + L 16#B026; + T #Dyn.Stop_Ursache; + + UN #Antrieb_plus_aktiv;//Kreisel-Antrieb plus aktiv + U #Schleuse.Parameter_allg.Antrieb_Plus_vorhanden;//Schleuse an weiterem Antrieb (Weiche) + SPB RET; + + UN #Antrieb_Schleuse_aktiv;//Kreisel-Antrieb aktiv + U #Schleuse.Parameter_allg.Antrieb_vorhanden;//Schleuse an angetriebener Strecke + = #Dyn.Status.Kein_Stop_mehr; + SPB RET; + + L #Dyn.Raus_Trolleys; + + 1;//Gestartete Trolleys + 1 + T #Dyn.Raus_Trolleys; + + L 5 ;//Nur 1 langes Signal! + SPB Neu_Mig ;//Bei diesem Schritt weiter + +NETWORK +TITLE = Schritt 5: Trolley fährt aus ? +s005: SET ;//Weiterschaltbedingung + UN #B_InSchleuse ;//Sensor Trolley ist in Schleuse + U(; + O #Antrieb_Schleuse_aktiv ;//Kreisel-Antrieb aktiv + ON #Schleuse.Parameter_allg.Antrieb_vorhanden;//Schleuse an angetriebener Strecke + ); + U(; + O #Antrieb_plus_aktiv; + ON #Schleuse.Parameter_allg.Antrieb_Plus_vorhanden; + ); + = #Weiter; + +//Schrittaktionen: + SET; + S #Y_Schleuse_Auf ;//Schleuse öffnen + S #Dyn.Status.Trolley_fährt_aus; + +//Antriebe: +//siehe Nw10 + +//B in Schleuse aktiv: + U #B_InSchleuse ;//Sensor Trolley ist in Schleuse + SPBN X050;//Negierter Sprung + + L 0; + T #Dyn.Sk.Tok_Zelle; + +//Trolley ist draussen mit 5s-Verzögerung: +X050: U #Weiter ;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + L 300; + SPB Plus ;//Nächsten Schritt starten + +//Trolley fährt nicht raus!: + U #Dyn.Sk.Err_Uebzeit; + S #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + + L 16#B051; + T #Dyn.Stop_Ursache; + + U #Antrieb_Schleuse_aktiv; + ON #Schleuse.Parameter_allg.Antrieb_vorhanden;//Schleuse an angetriebener Strecke + = #Ueb_akt;//Überwachungszeit aktivieren + L #Schleuse.Übzeit_aus_Schleuse;//Angabe der Überwachungszeit (*1s) + SPA tueb ;//Überwachungszeit + +NETWORK +TITLE = Schritt 6: Schleuse Mindestzeit geöffnet ? +s006: SET ;//Weiterschaltbedingung + U #Dyn.Status.MindestZeit_ok; + UN #B_InSchleuse;//Sensor Trolley in Schleuse vorhanden + = #Weiter; + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + +//Schrittaktionen: +//Gezählt wird in NW11 + + SET; + S #Y_Schleuse_Auf ;//Schleuse öffnen + S #Dyn.Status.Trolley_fährt_aus; + +//Erneutes Signal von B in Schleuse ?: + U #B_InSchleuse ;//Sensor Trolley in Schleuse vorhanden + SPBN X060 ;//Negierter Sprung + + L 5; + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + L 0;//Mindest-Zeit neu starten + T #Dyn.Mindest_Zeit ;//Sensor B_im_Sep ist frei [1s] + SET; + R #Dyn.Status.MindestZeit_ok;//Zeit bereits abgelaufen + + SPA RET; + +//Antriebe: +//siehe Nw10 +X060: U #Weiter; + L 0; + SPB X006 ;//Nächsten Schritt starten + + L 16#B061; + T #Dyn.Stop_Ursache; + +//Trolley fährt nicht raus!: + U #Dyn.Sk.Err_Uebzeit; + S #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + + U #Antrieb_Schleuse_aktiv; + ON #Schleuse.Parameter_allg.Antrieb_vorhanden;//Schleuse an angetriebener Strecke + = #Ueb_akt;//Überwachungszeit aktivieren + L #Schleuse.Übzeit_aus_Schleuse;//Angabe der Überwachungszeit (*1s) + SPA tueb ;//Überwachungszeit + +//Trolley hat Schleuse verlassen: +X006: SET; + S #Dyn.Status.Trolley_draussen;//1 Zyklus + R #Dyn.Status.Trolley_fährt_in_Schleuse; + R #Status2.Telegramm_gesendet; + + L #Dyn.Vereinzelungstakte; + + DINT#1;//Vereinzelungen +1 + T #Dyn.Vereinzelungstakte; + +//Draussen-FC ?: + UN #DraussenFC_vorhanden; + SPB NoFC ;//Bei diesem Schritt weiter + + L #Schleusen_Nr;//Schleusen-Nr. + T "MW190"; + L #Dyn.Trolley_ShopGroup;//Shop-Gruppe + T "MD182" ;//übergeben + + L #Dyn.Weichen_Ziel; + T "MW198" ;//Weichenziel + + UC FC[ #DraussenFC] ;//z.Bsp. Daten anpassen + +NoFC: L 7 ;//Weiter mit Schritt 7 + SPA Neu_Mig ;//Bei diesem Schritt weiter + +NETWORK +TITLE = Schritt 7: Fertig +s007: SET ;//Weiterschaltbedingung + +//Schrittaktionen: + SPA ENDE_Mig; + +NETWORK +TITLE = Schritt 9: Lese-Einheit bereit? +s009: SET ;//Weiterschaltbedingung + L #Dyn.Leser.IN.nOutBarcode; + L DINT#0; + ==D; + U #Dyn.Leser.IN.xOutReadyForNewScan; + UN #Dyn.Leser.IN.xOutReadingDone; + UN #Dyn.Leser.IN.xOutCodeGood; + UN #Dyn.Leser.IN.xOutCodeBad; + = #Weiter; + R #Dyn.Error.Err_Leser_nicht_bereit; + +//Schrittaktionen: + UN #Status2.Trolley_an_Schleuse ;//Trolley im Schleuse erkannt + U #Schleuse.Parameter_allg.Leser_eingebaut; + R #Dyn.Error.Err_Leser_nicht_bereit; + L 0 ;//Weiter mit Schritt 0 + SPB Neu_Mig ;//Bei diesem Schritt weiter + + U #Weiter; + = #Dyn.Leser.OUT.xInStartReading;//Leser triggern + L 0 ;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + +//Leser nicht bereit: + U #Dyn.Leser.IN.xOutReadingDone;//Falls altes Handshake noch gewollt + O #Dyn.Leser.IN.xOutCodeGood; + O #Dyn.Leser.IN.xOutCodeBad; + S #Dyn.Leser.OUT.xInHandshakeDone; + + U #Dyn.Sk.Err_Uebzeit; + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + S #Dyn.Error.Err_Leser_nicht_bereit; + S #Dyn.Leser.OUT.xInErrQuit;//Vielleicht hilft es + + U #Dyn.Error.Err_Leser_nicht_bereit; + U #ErrQuit;//Mit Quittierung dann zusätzlich reset! + S #Dyn.Leser.OUT.xInReset; + +//HMI-TrolleyID bei Leser nicht bereit: + L #Dyn.HMI.TrolleyID_Input; + L DINT#0; + <>D ;//Ja! + U #Dyn.Error.Err_Leser_nicht_bereit; + L 0 ;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + SET; + = #Ueb_akt;//Überwachungszeit aktivieren + L 5 ;//Angabe der Überwachungszeit (*1s) + SPA tueb;//Überwachungszeit + +NETWORK +TITLE = Schritt 10: Warten auf Leseeinheit +s010: SET ;//Weiterschaltbedingung + U #Dyn.Leser.IN.xOutReadingDone; + U #Dyn.Leser.IN.xOutCodeGood; + UN #Dyn.Leser.IN.xOutCodeBad; + = #Weiter; + R #Dyn.Error.Err_Kein_LeseErgebnis; + +//Schrittaktionen: + UN #Status2.Trolley_an_Schleuse ;//Trolley im Schleuse erkannt + U #Schleuse.Parameter_allg.Leser_eingebaut; + L 0 ;//Weiter mit Schritt 0 + R #Dyn.Error.Err_Kein_LeseErgebnis; + SPB Neu_Mig;//Bei diesem Schritt weiter + + SET; + R #Dyn.Leser.OUT.xInStartReading;//Leseeinheit triggern + + U #Weiter; + S #Dyn.Leser.OUT.xInHandshakeDone; + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + SPB X010; + + SET; + S #Dyn.Status.Trolley_wartet_Lesung; + + U #Dyn.Error.Err_Leser_nicht_bereit;//von Schritt 9 + SPB LX; + + U #Dyn.Sk.Err_Uebzeit; + O #Dyn.Leser.IN.xOutCodeBad; + S #Dyn.Leser.OUT.xInHandshakeDone; + SPB L2 ;//Erst bei 3.Fehllesung Error! + + L 16#B101; + T #Dyn.Stop_Ursache; + + SET; + = #Ueb_akt;//Überwachungszeit aktivieren + + L 10 ;//Angabe der Überwachungszeit (*1s) + SPA tueb;//Überwachungszeit + +L2: U #Status2."2.Lesung_aktiv";//Erst bei 3.Fehllesung Error! + SPB L3; + + SET; + S #Status2."2.Lesung_aktiv"; + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + + L 9; + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + SPA RET; + +L3: U #Status2."3.Lesung_aktiv";////Erst bei 3.Fehllesung Error! + SPB LX; + + SET; + S #Status2."3.Lesung_aktiv"; + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + + L 9; + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + SPA RET; + +//Nach 3.Fehl-Lesung erst Leserfehler! +LX: SET; + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + S #Dyn.Error.Err_Kein_LeseErgebnis; + SPA NoLesung; + +//Leserdaten übergeben: +X010: L #Dyn.Leser.IN.nOutBarcode; + T #Dyn.TrolleyID_Schleuse; + + L DINT#0 ;//Unbekannt ? + ==D ;//Ja ! + O(; + TAK; + L DINT#-1 ;//Fehl-Lesung? + ==D ;//Ja ! + ); + S #Dyn.Error.Err_Kein_LeseErgebnis; + L 9 ;//Weiter mit Schritt 9 (Leser bereit) + SPB Neu_Mig ;//Bei diesem Schritt weiter + + L 11 ;//Weiter mit Schritt 11 + SPA Neu_Mig ;//Bei diesem Schritt weiter + +//Lesefehler: +NoLesung: NOP 0; +//HMI-Eingabe?: +//HMI-TrolleyID: + L #Dyn.HMI.TrolleyID_Input; + T #Dyn.TrolleyID_Schleuse; + <>D ;//Ja! + L 0 ;//Angabe der Wartezeit (*10ms) + R #Dyn.Error.Err_Kein_LeseErgebnis; + R #Dyn.Error.Err_Leser_nicht_bereit;//von Schritt 9 + SPB Plus ;//Nächsten Schritt starten + +//Leser-FC aufrufen: +No_HMIa: UN #LeserFC_vorhanden; + SPB NoLFC; + + L #Schleusen_Nr;//Schleusen-Nr. + T "MW190";//übergeben + L #Dyn.Trolley_ZwischenZiel;//Übergabe von Leser-Aufruf + T "MW196"; + + U #Dyn.Error.Err_Kein_LeseErgebnis; + = "M180.0"; + SET; + R "M180.1"; + + UC FC[ #LeserFC] ;//Beeinflussung der Fehllesung + + L 16#B102; + T #Dyn.Stop_Ursache; + + L "MW196" ;//Zwischenziel übergeben + T #Dyn.Trolley_ZwischenZiel;//Übergabe von Leser-Aufruf + L 0 ;//Übergeben ? + <>I;//Ja! + L 12 ;//Weiter mit Schritt 12 + R #Dyn.Error.Err_Kein_LeseErgebnis; + SPB Neu_Mig ;//Bei diesem Schritt weiter + +NoLFC: L 9; + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + SPA RET; + +NETWORK +TITLE = Schritt 11: Trolleydaten aus DL lesen +s011: L DINT#0; + T #Dyn.TrolleyID_Eingefahren;//Eintrag von Weiche -1 + + L #Dyn.Trolley_ZwischenZiel;/// + + L #Dyn.TrolleyID_Schleuse; + T "MD220"; + + CALL "DatenOut" + ( SSDB := #Schleuse.Gesamt_Trolley_DL , + SSDW := 0 , + PARA := 16#0000 , //Eintrag lesen + SEARCHDATEN := P#M220.0 , + RE_VAL := "MB199" , + OUTDATEN := %DB1011.DBX0.0 , + Position := "MW196" + ); + + L 16#B111; + T #Dyn.Stop_Ursache; + + UN "M199.7"; + = #Dyn.Error.Barcode_nicht_bekannt; + SPB UnbekanntBC; + +//Relevanten Trolleydaten auslesen: + L "TrolleyDL_OutDaten".OUTDaten.EndZiel; + T #Dyn.Trolley_EndZiel; + +//ZwischenZiel nicht überschreiben: + L #Dyn.Trolley_ZwischenZiel; + L 0;//Schon bekannt ? + <>I;//Ja ! + SPB NixZZ; + + L "TrolleyDL_OutDaten".OUTDaten.ZwischenZiel; + T #Dyn.Trolley_ZwischenZiel; + +NixZZ: L "TrolleyDL_OutDaten".OUTDaten.ShopGroup; + T #Dyn.Trolley_ShopGroup; + + L 0;//Angabe der Wartezeit (*10ms) + SPA Plus ;//Nächsten Schritt starten + +//Unbekannter Trolley: +UnbekanntBC: NOP 0; +//HMI-Eingabe?: + +//Leser-FC aufrufen: +Nix_HMI: UN #LeserFC_vorhanden; + SPB Nix_LFC; + + L #Schleusen_Nr ;//Schleusen-Nr. + T "MW190";//übergeben + L #Dyn.TrolleyID_Schleuse; + T "MD192"; + L #Dyn.Trolley_ZwischenZiel; + T "MW196"; + + U #Dyn.Error.Barcode_nicht_bekannt; + = "M180.1"; + SET; + R "M180.0"; + + UC FC[ #LeserFC] ;//Beeinflussung der Weiterfahrt bei nicht bekanntem Trolley + + L "MW196" ;//ZwischenZiel übergeben + T #Dyn.Trolley_ZwischenZiel;//Übergabe von Leser-Aufruf + L 0 ;//Übergeben ? + <>I;//Ja! + L 12 ;//Weiter mit Schritt 12 + R #Dyn.Error.Err_Kein_LeseErgebnis; + SPB Neu_Mig ;//Bei diesem Schritt weiter + +Nix_LFC: SPA RET; + +NETWORK +TITLE = Schritt 12: Ziel-FC +s012: NOP 0; + +//Schrittaktionen: + UN #Status2.Trolley_an_Schleuse ;//Trolley im Schleuse erkannt + U #Schleuse.Parameter_allg.Leser_eingebaut; + UN #Schleuse_geöffnet; + L 0 ;//Weiter mit Schritt 0 + SPB Neu_Mig;//Bei diesem Schritt weiter + + SET; + S #Dyn.Status."Trolley_wartet_auf_Ziel-FC"; + + UN #ZielFC_vorhanden; + R #Dyn.Status."Trolley_wartet_auf_Ziel-FC"; + L 13 ;//Weiter mit Schritt 13 + SPB Neu_Mig ;//Bei diesem Schritt weiter + + SET;//Rückmeldungen erst mal resetten + R "M180.6";//Weiterfahrt von Ziel-FC erlaubt + L #Schleusen_Nr ;//Schleusen-Nr. + T "MW190";//übergeben + L #Dyn.Trolley_ShopGroup;//Shop-Gruppe + T "MD182" ;//übergeben + L #Dyn.Trolley_EndZiel;//End-Ziel + T "MW194" ;//übergeben + L #Dyn.Trolley_ZwischenZiel; + T "MW196" ;//übergeben + L 0;//Erst mal nullen + T "MW198" ;//Weichenziel + + UC FC[ #ZielFC] ;//Beeinflussung der Weiterfahrt + + L 16#B122; + T #Dyn.Stop_Ursache; + +//Spezial-Fall bei Übergabe an Sorter / Turm (M180.6 wird nie im Ziel-FC gesetzt!) +//aber anderer Partner hat Schleuse extern geöffnet: + U #Schleuse_geöffnet; + UN "M180.6" ;//Weiterfahrt von Ziel-FC erlaubt + UN #Status2.TrolleyPos_übergeben;//Nur einmalig + S #Status2.TrolleyPos_übergeben; + SPBN Normal;//Negierter Sprung + + L #Dyn.Vereinzelungstakte; + + DINT#1;//Vereinzelungen +1 + T #Dyn.Vereinzelungstakte; + + CALL "Trolley_DL_Neue_Pos" + ( Gesamt_Trolley_DL := #Schleuse.Gesamt_Trolley_DL , + TrolleyID := #Dyn.TrolleyID_Schleuse , + Position := #Schleuse.Leser_ID , + ShopGroup := Dint#0 , + Err := "M199.0" + ); + +//Draussen-FC ?: + UN #DraussenFC_vorhanden; + SPB RET ;//Bei diesem Schritt weiter + + L #Schleusen_Nr;//Schleusen-Nr. + T "MW190"; + + UC FC[ #DraussenFC] ;//z.Bsp. Daten anpassen + + SPA RET; + +Normal: U "M180.6" ;//Weiterfahrt von Ziel-FC erlaubt + SPB X012; + + UN #Schleuse.Parameter_allg.Leser_eingebaut; + SPB RET; + + L 11; + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + SPA RET; + +X012: L "MW196" ;//zurückschreiben, falls verändert + T #Dyn.Trolley_ZwischenZiel; -// Quelle-Pointer erzeugen: - L 0 // Bei Merker = 0 ! - T LW4 // DB_Nummer - L 220 // Adresse - SLD 3 - L 16#8300_0000 // Kennung: Merker - OD - T LD6 // Kennung, Adresse + L "MW198" ;//Weichenziel übergeben + T #Dyn.Weichen_Ziel; -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_Schleuse, DSTBLK:=Schleuse) // Datenliste-Daten speichern | #Ziel + L 13 ;//Weiter mit Schritt 13 + SPA Neu_Mig ;//Bei diesem Schritt weiter - L 16#A063 - T Dyn.Stop_Ursache +NETWORK +TITLE = Schritt 13: Schleusen-Position zurückschreiben +s013: NOP 0; + +//Schrittaktionen: + SET; + S #Status2."Weichen-Schritt"; - L Dyn.Rueckmld.RET_VAL_BLKMOV_Schleuse // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Dyn.Error.Err_BLKMov // Error bei Block kopieren - JC RET +//Neue Position an Gesamt-Trolley-DL übergeben: + CALL "Trolley_DL_Neue_Pos" + ( Gesamt_Trolley_DL := #Schleuse.Gesamt_Trolley_DL , + TrolleyID := #Dyn.TrolleyID_Schleuse , + Position := #Schleuse.Leser_ID , + ShopGroup := DInt#0 , //für nichts verändern + Err := "M199.0" + ); + + L 0;//Angabe der Wartezeit (*10ms) + SPA Plus ;//Nächsten Schritt starten - L Schleuse.Schleusen_Typ // Schleusetyp = 1275 (HM-Schleuse Plus) - L 1275 // Dieser Aufruf-FB ? - ==I // Ja ! - JC w061 +NETWORK +TITLE = Schritt 14: Weichenbereich +1 vorhanden +s014: NOP 0; - SET - S Dyn.Error.Undef_Schleuse // undefinierter Schleuse +//Schrittaktionen: + //Weichenbereich +1 vorhanden?: + U #"Kein_Weichenbereich +1"; + L 2 ;//Weiter mit Schritt 2 (Ausfahren ok?) + SPB Neu_Mig ;//Bei diesem Schritt weiter - L 0 // Schleuse ungültig ! - T Schleuse.Schleusen_Nr // Nummer des Schleuses + SET; + S #Status2."Weichen-Schritt"; - L 16#A064 - T Dyn.Stop_Ursache + L 0;//Angabe der Wartezeit (*10ms) + SPA Plus ;//Nächsten Schritt starten - JU RET +NETWORK +TITLE = Schritt 15: Weichenbereich raus bereit ? +s015: NOP 0; -// Defaultwerte übergeben: -w061: NOP 0 +//Schrittaktionen: + UN #Status2.Trolley_an_Schleuse ;//Trolley im Schleuse erkannt + L 0 ;//Weiter mit Schritt 0 + SPB Neu_Mig;//Bei diesem Schritt weiter - JU RET + SET; + S #Status2."Weichen-Schritt"; -en06: NOP 0 + L #Dyn.Weichen_Ziel; + L 0;//Bekannt ? + <>I;//Ja ! + SPB X15A; + L 12;//Ziel-FC ? + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll ---- NW 8: Einsprung Weiche plus ermitteln --- - L SAVE.Weichen_DB // Weichen-FIFO-DB - L 0 // Einsprung-Zeiger bekannt ? - >I // Ja ! - R "Kein_Weichenbereich +1" - JC En08 + L 16#B154; + T #Dyn.Stop_Ursache; - L Schleuse.RausWeichen_Nr // Nr. der vorhandenen Weiche - T "MW200" // Search-Daten - L 0 // angegeben ? - ==I // Nein ! - = "Kein_Weichenbereich +1" - R Dyn.Error.Err_Undef_Weiche // undefinierte Weiche - JC En08 + SPA RET; -CALL FC "DatenOut" (SSDB:=Para.Weichen_DL_DB, SSDW:=0, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196") +X15A: SET; + S #Dyn.Status."Trolley_wartet_auf_Weiche+1"; - L "MB199" - T Dyn.Rueckmld.RET_VAL_DL_Weiche // Rückmeldung bei Datenbank-Zugriff (Weiche-DL) + L 16#B155; + T #Dyn.Stop_Ursache; - JBI W_Ok + L #SAVE.Weichen_DB ;//Weichen-DB + L 0;//Einsprung-Zeiger bekannt ? + >I;//Ja ! + SPB S015A; - A "M199.0" - = Dyn.Error.Err_Weichen_DL // Weichen-Datenliste fehlerhaft - JC En08 - - SET - S Dyn.Error.Err_Undef_Weiche // undefinierte Weiche + L 16#B150; + T #Dyn.Stop_Ursache; - JU En08 - -W_Ok: L "MW224" - T SAVE.Weichen_DB // Weichen-FIFO-DB - L 0 // sinnvoller Wert ? - <=I // Nein ! - S Dyn.Error.Err_Undef_Weiche // undefinierte Weiche - JC En08 - - L "MW226" - T SAVE.Weichen_DW // Weichen-FIFO-DW - -En08: NOP 0 + SPA RET; +//Weichendaten auslesen: +S015A: L #SAVE.Weichen_DW; + ITD; + T #AR1Start;//Startwert mit Offset 0 ---- NW 9: Trolley in Schleuse entprellen --- - A B_InSchleuse - JC B_ok - - AN Status2.Trolley_an_Schleuse - ON "1s-Impuls" - JC Xn08 + L #AR1Start ;//Startwert mit Offset 0 + + DINT#70; + SLD 3; + L 0 ;//Damit DBX70.0 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - L Dyn.Zeit_Ohne_B_In_Schleuse - + 1 // Zeit ohne Sensor +1s - T Dyn.Zeit_Ohne_B_In_Schleuse + L 16#B152; + T #Dyn.Stop_Ursache; - L 3 // Nach ca. 3s - I ;//Nein ! + SPB RET;//Warten ! - A "Schleuse_geöffnet" - R Dyn.Status."Trolley_fährt_in_Schleuse" +//Dasselbe Weichen-Ziel ?: + L #Dyn.Weichen_Ziel;//Gewolltes Ziel + L #Dyn.Zurück_gemeldetes_Weichen_Ziel;//Aktuell im Weichenbereich aktives Ziel + <>I ;//Sind nicht identisch ! + SPB RET;//Warten ! - L Dyn.Raus_Trolleys - L 0 // Trolles unterwegs? - >I // Ja! - AN Status2."Stau_an_Raus-Sensor" // Stau an Raus-Sensor - O - A B_VorSchleuse // // - AN Dyn.Error.Err_Stau_Einfahrt // // - O "Schleuse_geöffnet" - = Antriebe_starten + L 16 ;//Weiter mit Schritt 16 (Daten an Weiche übergeben) + SPA Neu_Mig ;//Bei diesem Schritt weiter - A Antriebe_starten -// / UN #Dyn.Error.Err_Trolley_raus//Trolley fährt nicht aus - A( - O Dyn.Status.Weiche_geschaltet // Weiche ist aktiv - O "Kein_Weichenbereich +1" - ) - A Schleuse.Parameter_allg.Antrieb_Plus_vorhanden - S Antrieb_plus_vor // Antrieb plus einschalten - - A Antriebe_starten -// / UN #Dyn.Error.Err_Trolley_raus//Trolley fährt nicht aus - A( - O Dyn.Status.Weiche_geschaltet // Weiche ist aktiv - O "Kein_Weichenbereich +1" - ) - A( - O Antrieb_plus_aktiv - ON Schleuse.Parameter_allg.Antrieb_Plus_vorhanden - ) - S Antrieb_Schleuse_vor // Antrieb einschalten - -// Trolley ist in Schleuse und wartet - A Status2.Trolley_an_Schleuse // Trolley im Schleuse erkannt - AN "Schleuse_geöffnet" // Trolley soll ausfahren - A( - ON B_VorSchleuse - O Dyn.Error.Err_Stau_Einfahrt - ) - AN Dyn.Status.Kein_Stop_mehr // Wird in Schritt 2 gesetzt - O - A "Schleuse_geöffnet" // Trolley soll ausfahren - A Schleuse.Parameter_allg.Antrieb_Plus_vorhanden - AN Antrieb_plus_aktiv - JC Warten - - L 0 - T Dyn.WarteZeit_PS - - JU NwE10 - -Warten: L Dyn.WarteZeit_PS - L 3 // ca. 3s rum ? - =I - AN Status2."Stau_an_Raus-Sensor" - JC RDel - - CAC - L 200 // Nach ca. 20s - >=I - JC RDel - - JU En10 - -RDel: SET - R Status2."Trolley an Raus-Sensor" - L 0 - T Dyn."Zeit_Ohne_B_Zähl" - T Dyn.Stau_Zeit_RausSensor - -// War Stau?: - A Status2."Stau_an_Raus-Sensor" - R Status2."Stau_an_Raus-Sensor" - JCN DelRT - - L 0 // Bisher gefahrene Trolleys löschen - T Dyn.Raus_Trolleys - T Dyn."Zeit_Ohne_B_Zähl" - T Dyn.Stau_Zeit_RausSensor - -// Im Weichenbereich noch Trolleys unterwegs?: -DelRT: L Dyn.Raus_Trolleys - L 0 - >I - O "Kein_Weichenbereich +1" - JC En10 - -// Weiche+1 löschen: - L 0 - T SAVE."Weiche+1" // Hier wurde reserviert (Im Weichenmodul wird dann Reservierung gelöscht!) - - JU En10 - -B_Raus: L 0 - T Dyn."Zeit_Ohne_B_Zähl" - T Dyn."Zeit_Ausfahren_Ohne_B_Zähl" - -// Einmalig: - AN Status2."Trolley an Raus-Sensor" - S Status2."Trolley an Raus-Sensor" // Raus-Sensor ausgewertet - JCN Xn10 // Negierter Sprung +NETWORK +TITLE = Schritt 16: Daten an Rausweiche übergeben +s016: NOP 0; - L Dyn.Raus_Trolleys - + -1 // Ausgefahrene Trolleys -1 - T Dyn.Raus_Trolleys +//Schrittaktionen: + SET; + S #Status2."Weichen-Schritt"; - L 0 - >=I - JC Xn10 +//Daten für Eintrag vorbereiten: + AUF DB[ #SAVE.Weichen_DB];//FABE+ -DB öffnen - T Dyn.Raus_Trolleys // Minimum übergeben + L #AR1Start ;//Startwert mit Offset 0 + + DINT#72; + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) -// Stau an B_Raus: -Xn10: AN "100ms-Impuls" - O Status2."Stau_an_Raus-Sensor" - JC En10 + L #Dyn.TrolleyID_Schleuse; + T DBD[ #AR1Zeiger] ;//Trolley-ID (DBD 72) - L Dyn.Stau_Zeit_RausSensor - + 1 // StauZeit +1 - T Dyn.Stau_Zeit_RausSensor + L #AR1Start ;//Startwert mit Offset 0 + + DINT#76; + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + L #Dyn.Weichen_Ziel; + T DBW[ #AR1Zeiger] ;//Weichenziel (DBW 76) + + L #AR1Start ;//Startwert mit Offset 0 + + DINT#80; + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - L 90 // Nach ca. 9s - >=I - JCN En10 // Negierter Sprung - - L 0 // Zeit löschen - T Dyn.Stau_Zeit_RausSensor - - SET - S Status2."Stau_an_Raus-Sensor" - -En10: NOP 0 - - ---- NW 12: Plus: Trolley fährt nicht bis Zähl-Sensor --- - L Dyn.Raus_Trolleys - L 0 // Trolles unterwegs? - ==I // Nein! - O Trolley_draussen // Sensor wurde erreicht - O "Schleuse_geöffnet" // Dann Üb.zeit von Sk - O Dyn.Status.Reset_aktiv - JC RTTD - - AN Antrieb_Schleuse_aktiv - O - AN Antrieb_plus_aktiv - A Schleuse.Parameter_allg.Antrieb_Plus_vorhanden - ON "1s-Impuls" - O Dyn.Error.Err_Raus_Sensor // Trolley fährt nicht aus - JC En12 - - L Dyn."Zeit_Ausfahren_Ohne_B_Zähl" - + 1 - T Dyn."Zeit_Ausfahren_Ohne_B_Zähl" - -// Trolley fährt nicht bis Zähl-Sensor!: - L Schleuse."Übzeit_aus_Schleuse" - >=I - S Dyn.Error.Err_Raus_Sensor // Trolley fährt nicht aus - JCN En12 // Negierter Sprung! - - L Dyn.Raus_Trolleys - + -1 - T Dyn.Raus_Trolleys - - JU En12 - -RTTD: L 0 - T Dyn."Zeit_Ausfahren_Ohne_B_Zähl" - - SET - R Dyn.Error.Err_Raus_Sensor // Trolley fährt nicht aus - -En12: NOP 0 - - ---- NW 13: Einfahrzeit lernen --- - L Schleuse.EinfahrZeit - L 0 // Ausfahrzeit bekannt ? - ==I // Nein ! - O Status2.Einfahrzeit_lernen - = Einfahrzeit_nicht_bekannt - A Einfahrzeit_nicht_bekannt - A B_VorSchleuse // Stauklappe bei Einfahrt - A Antrieb_Schleuse_aktiv - AN B_InSchleuse - AN "Schleuse_geöffnet" - S Status2.Einfahrzeit_lernen - - A B_InSchleuse - AN "Schleuse_geöffnet" - R Status2.Einfahrzeit_lernen - - A Status2.Einfahrzeit_lernen - S Antrieb_Schleuse_vor // Antrieb einschalten - - AN Status2.Einfahrzeit_lernen - ON Antrieb_Schleuse_aktiv - ON "1s-Impuls" - JC NoEFZ - - L Schleuse.EinfahrZeit - + 1 - T Schleuse.EinfahrZeit - -NoEFZ: NOP 0 - - ---- NW 14: PS deaktivieren, da Trolley einfährt --- - A Einfahrzeit_nicht_bekannt // Also bekannt - JC En14 - -// Neuer Trolley fährt ein: - A B_VorSchleuse - JCN Wait // Negierter Sprung - - L Schleuse.EinfahrZeit - T Dyn.Restzeit_bis_Schleuse - -// Restzeit zurück zählen: -Wait: AN Antrieb_Schleuse_aktiv - O "Schleuse_geöffnet" - ON "1s-Impuls" - JC X014 - - L Dyn.Restzeit_bis_Schleuse - + -1 - T Dyn.Restzeit_bis_Schleuse - - L 0 - >I - JC X014 - - T Dyn.Restzeit_bis_Schleuse // Minimum übergeben - -// Trolley fährt noch ein: -X014: L Dyn.Restzeit_bis_Schleuse - L 0 // Restzeit vorhanden? - >I // Ja ! - AN B_InSchleuse - AN "Schleuse_geöffnet" - S Antrieb_Schleuse_vor // Antrieb einschalten (dadurch wird PS-Modus deaktiviert) - -En14: NOP 0 - - ---- NW 15: Spezial-FCs vorhanden? --- - L Schleuse.Leser_FC - T LeserFC - L 0 // Parameter vorhanden ? - >I // Ja! - = LeserFC_vorhanden - - L Schleuse.Ziel_FC - T ZielFC - L 0 // Parameter vorhanden ? - >I // Ja! - = ZielFC_vorhanden - - L Schleuse.Draussen_FC - T DraussenFC - L 0 // Parameter vorhanden ? - >I // Ja! - = DraussenFC_vorhanden - - ---- NW 16: Error: Stau Bereich-Eingang --- -// TrolleyID zum Einfahren gemeldet / Trolley fährt in Bereich: - L Dyn.TrolleyID_Eingefahren // Eintrag von Weiche -1 - L DINT#0 // angegeben ? - <>D // Ja ! - = "TrolleyID_Bereich-1" - A "TrolleyID_Bereich-1" - O B_VorSchleuse - S Dyn.Status."Trolley_fährt_in_Schleuse" - -// Antrieb einschalten: - A B_VorSchleuse - AN B_InSchleuse - AN "Schleuse_geöffnet" - S Antrieb_Schleuse_vor - - A B_VorSchleuse - S Antrieb_Schleuse_start - -// Sensor bei Bereichs-Einfahrt bleibt belegt?: - AN B_VorSchleuse // Sensor Trolley fährt in Bereich (kein Stau !) - O "Schleuse_geöffnet" - R Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt - JC X120 // StauZeit neu aufziehen - - AN "1s-Impuls" - O - A Schleuse.Parameter_allg.Antrieb_vorhanden - AN Antrieb_Schleuse_aktiv - O Dyn.Error.Err_Stau_Einfahrt // Zeit bereits abgelaufen - JC Xn12 - - L Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - + +1 - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - - L 20 // Stau-Zeit erreicht ? - >=I // Ja ! - S Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb - JCN Xn12 - -X120: L 0 // Zeiten löschen - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - -Xn12: NOP 0 - - ---- NW 17: Schleuse: Mindestzeit geöffnet/frei --- - L Dyn.Sk.Akt_Schritt - L 3 // AusSchleusen aktiv? - I // Nein! - ) -// / O #B_InSchleuse //Sensor Trolley in Schleuse vorhanden - ON "Schleuse_geöffnet" - R Dyn.Status.MindestZeit_ok - JC X130 // FreiZeit neu aufziehen - - A Schleuse.Parameter_allg.Antrieb_vorhanden - AN Antrieb_Schleuse_aktiv - O - A Schleuse.Parameter_allg.Antrieb_Plus_vorhanden - AN Antrieb_plus_aktiv - O Dyn.Status.MindestZeit_ok // Zeit bereits abgelaufen - ON "1s-Impuls" - JC Xn13 - - L Dyn.Mindest_Zeit // Sensor B_im_Sep ist frei [1s] - + +1 - T Dyn.Mindest_Zeit // Sensor B_im_Sep ist frei [1s] - - L Schleuse.Mindeszeit_Schleuse_geoeffnet // Mindest-Zeit erreicht ? - >=I // Ja ! - S Dyn.Status.MindestZeit_ok - JCN Xn13 - -X130: L 0 // Zeiten löschen - T Dyn.Mindest_Zeit // Sensor B_im_Sep ist frei [1s] - -Xn13: NOP 0 - - ---- NW 18: Einsprung Leser ermitteln --- - L Dyn.SAVE2.Leser_DB // Leser-FIFO-DB - L 0 // Einsprung-Zeiger bekannt ? - >I // Ja ! - S Leser_Zugriff // Leser-Zugriff vorhanden - JC En08L - - L Schleuse.Leser_ID // Nr. des vorhandenen Lesers - T "MW200" // Search-Daten - L 0 // angegeben ? - ==I // Nein ! - JC En08L - -CALL FC "DatenOut" (SSDB:=Para.Leser_DL_DB, SSDW:=0, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196") - - L "MB199" - T Dyn.Rueckmld.RET_VAL_DL_Leser // Rückmeldung bei Datenbank-Zugriff (Leser-DL) - - JBI W_OkL - - SET - S Dyn.Error.Err_Leser_nicht_bereit // Leser-Datenliste fehlerhaft - - JU En08L - -W_OkL: L "MW222" // Rein-FIFO-DB - T Dyn.SAVE2.Leser_DB // Leser-FIFO-DB - L 0 // sinnvoller Wert ? - <=I // Nein ! - S Dyn.Error.Err_Leser_nicht_bereit // undefinierter Leser - JC En08L - - L "MD224" - T Dyn.SAVE2.Leser_DD // Leser-FIFO-DD - - SET - R Dyn.Error.Err_Leser_nicht_bereit // undefinierter Leser - S Leser_Zugriff // Leser-Zugriff vorhanden - -En08L: NOP 0 - - ---- NW 19: Reservierung bei Weiche plus noch aktiv? Nachtriggern --- - A "Kein_Weichenbereich +1" - R "Reservierung_Weiche+1_aktiv" - JC Y11E - - OPN DB[SAVE.Weichen_DB] // FABE+ -DB öffnen - - L SAVE.Weichen_DW - ITD - T AR1Start // Startwert mit Offset 0 - - L AR1Start // Startwert mit Offset 0 - + DINT#78 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L DBW [AR1Zeiger] // Schleuse -1 (DBW 78) - L Schleusen_Nr // Diese Schleuse ? - ==I // Ja ! - = "Reservierung_Weiche+1_aktiv" - -// Mindestzeit nachtriggern: (nach Weiche +1) - AN "Schleuse_geöffnet" - JC Y11E - - L AR1Start // Startwert mit Offset 0 - + DINT#71 - SLD 3 - L 3 // Damit DBX_Bit 3 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - SET - = DBX [AR1Zeiger] // Mindestzeit nachtriggern (71.2) - -Y11E: NOP 0 - - ---- NW 20: Leser-Einheit managen (Inputs holen) --- - AN Leser_Zugriff - ON Schleuse.Parameter_allg.Leser_eingebaut - R Dyn.Status.Leser_triggern // für Status-Anzeige - JC NoLeser - -// Leserdaten holen: - OPN DB[Dyn.SAVE2.Leser_DB] // Leser -DB öffnen - - L Dyn.SAVE2.Leser_DD - T AR1Start // Startwert mit Offset 0 - -// Offset 10: - L AR1Start // Startwert mit Offset 0 - + DINT#10 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L DBB [AR1Zeiger] - T "MB200" - A "M200.0" - = Dyn.Leser.IN.xOutReadingDone - A "M200.1" - = Dyn.Leser.IN.xOutReadyForNewScan - -// Offset 274: - L AR1Start // Startwert mit Offset 0 - + DINT#274 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L DBB [AR1Zeiger] - T "MB200" - A "M200.0" - = Dyn.Leser.IN.xOutCodeGood - A "M200.1" - = Dyn.Leser.IN.xOutCodeBad - -// Offset 12: - L AR1Start // Startwert mit Offset 0 - + DINT#12 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L DBD [AR1Zeiger] - T Dyn.Leser.IN.nOutBarcode - -NoLeser: NOP 0 - - ---- NW 21: Schrittkette anhalten --- - A Dyn.Sk.Auto_akt // Automatik ist aktiv - A Dyn.Sk.Bereich_ok - CLR - - JU en08_Mig // Schrittkette nicht anhalten ! - - SET - R Dyn.Sk.Err_Uebzeit // Störungen löschen - R Dyn.Sk.Err_Schritt - - L 0 // Zeitwerte löschen - T Dyn.Sk.Terr_Zelle - T Dyn.Sk.Tok_Zelle - - JU RET - -en08_Mig: NOP 0 - - ---- NW 22: Trolley wurde zurück gezogen --- - L Dyn.Sk.Akt_Schritt - L 10 // Trolley schon unterwegs ? - I // Ja ! - ) - O Status2.Trolley_an_Schleuse // Trolley ist noch in Schleuse - O "Schleuse_geöffnet" - JC TrolleyOk - - SET - S Antrieb_Schleuse_start - S Dyn.Leser.OUT.xInReset - - L 0 // Neubeginn - T Dyn.Sk.Akt_Schritt - - AN Schleuse.Parameter_allg.Leser_eingebaut // Falls kein Leser verbaut Daten behalten (falls von Bereich-1 gemeldet) - JC TrolleyOk - - T Dyn.Trolley_ZwischenZiel - - L DINT#0 - T Dyn.TrolleyID_Schleuse - -TrolleyOk: NOP 0 - - ---- NW 23: Sprungverteiler --- - L Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - L -1 // angegeben ? - ==I // Nein ! - JC NEU - - CAC // Neuen Schritt übergeben - T Dyn.Sk.Akt_Schritt - - L -1 // Urzustand - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - -NEU: SET - R Warte_neu // Wartezeit neutriggern - R Warte_stop // Wartezeit stoppen - - L Dyn.Sk.Akt_Schritt - JL Ende - JU s000 // Schritt 0 - JU s001 // Schritt 1 - JU s002 // Schritt 2 - JU s003 // Schritt 3 - JU s004 // Schritt 4 - JU s005 // Schritt 5 - JU s006 // Schritt 6 - JU s007 // Schritt 7 - JU s008 // Schritt 8 - JU s009 // Schritt 9 - JU s010 // Schritt 10 - JU s011 // Schritt 11 - JU s012 // Schritt 12 - JU s013 // Schritt 13 - JU s014 // Schritt 14 - JU s015 // Schritt 15 - JU s016 // Schritt 16 - JU s017 // Schritt 17 - JU s018 // Schritt 18 - JU s019 // Schritt 19 - JU s020 // Schritt 20 - JU s021 // Schritt 21 - JU s022 // Schritt 22 - JU s023 // Schritt 23 - JU s024 // Schritt 24 - JU s025 // Schritt 25 - JU s026 // Schritt 26 - JU s027 // Schritt 27 - JU s028 // Schritt 28 - JU s029 // Schritt 29 - JU s030 // Schritt 30 -Ende: S Dyn.Sk.Err_Schritt // Undefinierter Schritt - - L 16#A131 - T Dyn.Stop_Ursache - - JU RET - -Neu_Mig: A Dyn.Sk.Err_Uebzeit - JCN Sk - - L 16#A132 - T Dyn.Stop_Ursache - - JU RET - -Sk: T Dyn.Sk.Akt_Schritt - - L 0 // Zeitwerte löschen - T Dyn.Sk.Terr_Zelle - T Dyn.Sk.Tok_Zelle - - JU NEU - -// Nicht programmierte Schritte: -// s000: SPA Ende -// s001: SPA Ende -// s002: SPA Ende -s003: JU Ende -s004: JU Ende -// s005: SPA Ende -// s006: SPA Ende -// s007: SPA Ende -s008: JU Ende -// s009: SPA Ende -// s010: SPA Ende -// s011: SPA Ende -// s012: SPA Ende -// s013: SPA Ende -// s014: SPA Ende -// s015: SPA Ende -// s016: SPA Ende -// s017: SPA Ende -s018: JU Ende -s019: JU Ende -// s020: SPA Ende -// s021: SPA Ende -s022: JU Ende -s023: JU Ende -s024: JU Ende -s025: JU Ende -s026: JU Ende -s027: JU Ende -s028: JU Ende -s029: JU Ende -s030: JU Ende - - ---- NW 24: Schritt X: Reserve --- - SET // Weiterschaltbedingung - = Weiter - -// Schrittaktionen: - SET - - L 16#B001 - T Dyn.Stop_Ursache - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - L 0 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - L 1 // Weiter mit Schritt 1 - JC Neu_Mig // Bei diesem Schritt weiter - - SET - A Dyn.Sk.Auto_akt // Automatik ist aktiv - A Dyn.Sk.Bereich_ok - = Ueb_akt // Überwachungszeit aktivieren - L 50 // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - - JU RET - - ---- NW 25: Schritt 0: Warten auf Trolley --- -s000: SET // Weiterschaltbedingung - A B_InSchleuse // Trolley im Schleuse erkannt - A Dyn.Sk.Auto_akt // Automatik ist aktiv - A Dyn.Sk.Bereich_ok - = Weiter - -// Trolley-Schleusendaten löschen: - L DINT#0 - T Dyn.TrolleyID_Schleuse - T Dyn.Trolley_ShopGroup - - L 0 - T Dyn.Trolley_EndZiel - T Dyn.Weichen_Ziel - -// HMI-Zeug: - L DINT#0 - T Dyn.HMI.TrolleyID_Input - - A Dyn.Sk.Reset_Akt // Reset ist aktiv - L 20 // Weiter mit Schritt 20 - JC Neu_Mig // Bei diesem Schritt weiter - -// Schrittaktionen: - SET - R Dyn.Error.Err_Leser_nicht_bereit - R Dyn.Error.Err_Kein_LeseErgebnis - R Dyn.Status.SF_angefordert - R Status2."TrolleyPos_übergeben" - R Status2.Telegramm_gesendet - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - L 50 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - L 16#B001 - T Dyn.Stop_Ursache - - A Dyn.Status."Trolley_fährt_in_Schleuse" - AN B_InSchleuse - S Antrieb_Schleuse_vor // Antrieb einschalten - JC S000A - - SET - R Dyn.Sk.Err_Uebzeit - - L 16#B000 - T Dyn.Stop_Ursache - - JU RET - -// Überwachungszeit starten: -S000A: A Dyn.Status."Trolley_fährt_in_Schleuse" - AN B_InSchleuse // Trolley im Schleuse erkannt - A( - O Antrieb_Schleuse_aktiv - ON Schleuse.Parameter_allg.Antrieb_vorhanden - ) - = Ueb_akt // Überwachungszeit aktivieren - - A Dyn.Sk.Err_Uebzeit - R Dyn.Sk.Err_Uebzeit - S Dyn.Error.Err_Trolley_nicht_in_Schleuse - R Dyn.Status."Trolley_fährt_in_Schleuse" - - L Schleuse."Übzeit_in_Schleuse" - - JU tueb // Überwachungszeit - - ---- NW 26: Schritt 1: Trolley ist in Schleuse / Leser ? / Daten vorhanden ? --- -s001: NOP 0 -// Schrittaktionen: - A B_InSchleuse - S Status2.Trolley_an_Schleuse - - AN Status2.Trolley_an_Schleuse // Trolley im Schleuse erkannt - A Schleuse.Parameter_allg.Leser_eingebaut - L 0 // Weiter mit Schritt 0 - JC Neu_Mig // Bei diesem Schritt weiter - -// Zwischen-Ziel von Bereich -1 vorhanden?: - L Dyn.ZwischenZiel_eingefahren - L 0 // Zwischenziel von Bereich -1 vorhanden! - ==I // Nein ! - O Schleuse.Parameter_allg.Leser_eingebaut // Dann werden Daten neu ermittelt! - JC X001 - -// Daten von Bereich -1 übergeben: - L Dyn.ZwischenZiel_eingefahren - T Dyn.Trolley_ZwischenZiel - L 0 - T Dyn.ZwischenZiel_eingefahren - - L Dyn.TrolleyID_Eingefahren - T Dyn.TrolleyID_Schleuse - L DINT#0 - T Dyn.TrolleyID_Eingefahren - - L 12 // Weiter mit Schritt 12 - JU Neu_Mig // Bei diesem Schritt weiter - -X001: L 0 - T Dyn.Trolley_ZwischenZiel - -// Leser vorhanden: - A Schleuse.Parameter_allg.Leser_eingebaut - R Dyn.Error.Err_Kein_LeseErgebnis - L 9 // Weiter mit Schritt 9 (Leser bereit) - JC Neu_Mig // Bei diesem Schritt weiter - -// Trolleydaten vorhanden ?: (Übergabe von Bereich -1) - L Dyn.TrolleyID_Eingefahren - T Dyn.TrolleyID_Schleuse - L DINT#0 // Daten vorhanden ? - <>D // Ja ! - L 11 // Weiter mit Schritt 11 (Trolleydaten lesen) - JC Neu_Mig // Bei diesem Schritt weiter - -// Ziel-FC vorhanden ?: - A ZielFC_vorhanden - L 12 // Weiter mit Schritt 12 (Ziel-FC) - JC Neu_Mig // Bei diesem Schritt weiter - - L 14 // Weiter mit Schritt 14 (Weichenbereich +1 vorhanden) - JU Neu_Mig // Bei diesem Schritt weiter - - ---- NW 27: Schritt 2: Ausfahren ok ? --- -s002: NOP 0 - -// Schrittaktionen: - AN Status2.Trolley_an_Schleuse // Trolley im Schleuse erkannt - L 0 // Weiter mit Schritt 0 - JC Neu_Mig // Bei diesem Schritt weiter - -// Anlage aus oder Störung: - L 16#B021 - T Dyn.Stop_Ursache - - AN Dyn.Sk.Auto_akt // Automatik ist aktiv - ON Dyn.Sk.Bereich_ok // Bereich ist gestört - JC RET - -// Starten erlaubt Trolley ?: - L 16#B022 - T Dyn.Stop_Ursache - - AN Start_Ok // Starten ist erlaubt - JC RET - -// Stau im Bereich +1: - L 16#B023 - T Dyn.Stop_Ursache - - SET - S Dyn.Status."Trolley_wartet_Bereich+1" - - A B_Stau_raus // Sensor Stau im Bereich rausfahren - JC RET - -// B_Aus_Schleuse aktiv: - L 16#B024 - T Dyn.Stop_Ursache - - A( - L Dyn.Raus_Trolleys - L 0 // Trolleys schon unterwegs? - <>I // Ja! - O( - L Schleuse.MaxRausTrolleys - L 1 // Nur einer darf ausfahren ? - ==I // Ja ! - ) - ) - A Status2."Trolley an Raus-Sensor" - O Status2."Stau_an_Raus-Sensor" - JC RET - -// Raus-Weiche bereit?: - L 16#B028 - T Dyn.Stop_Ursache - - A( - L Dyn.Weichen_Ziel - L Dyn."Zurück_gemeldetes_Weichen_Ziel" - <>I // Nicht identisch ! - ON Dyn.Status.Weiche_geschaltet // Rückmeldung von Weiche +1 - ) - AN "Kein_Weichenbereich +1" // Also Weiche +1 - L 15 - JC Neu_Mig // Bei diesem Schritt weiter - -// Zu viele Raus-Trolleys unterwegs: - L 16#B027 - T Dyn.Stop_Ursache - - L Dyn.Raus_Trolleys // Gestartete Trolleys - L Schleuse.MaxRausTrolleys // Erlaubte Anzahl gestarteter Trolleys - >=I - JC RET - -// Antriebe aktivieren / aktiv ?: - A Schleuse.Parameter_allg.Antrieb_Plus_vorhanden // Schleuse an weiterem Antrieb (Weiche) - S Antrieb_plus_vor // Antrieb plus einschalten - - A( - O Antrieb_plus_aktiv // Kreisel-Antrieb plus aktiv - ON Schleuse.Parameter_allg.Antrieb_Plus_vorhanden // Schleuse an weiterem Antrieb (Weiche) - ) - S Antrieb_Schleuse_vor // Antrieb einschalten - - L 16#B026 - T Dyn.Stop_Ursache - - AN Antrieb_plus_aktiv // Kreisel-Antrieb plus aktiv - A Schleuse.Parameter_allg.Antrieb_Plus_vorhanden // Schleuse an weiterem Antrieb (Weiche) - JC RET - - AN Antrieb_Schleuse_aktiv // Kreisel-Antrieb aktiv - A Schleuse.Parameter_allg.Antrieb_vorhanden // Schleuse an angetriebener Strecke - = Dyn.Status.Kein_Stop_mehr - JC RET - - L Dyn.Raus_Trolleys - + 1 // Gestartete Trolleys + 1 - T Dyn.Raus_Trolleys - - L 5 // Nur 1 langes Signal! - JC Neu_Mig // Bei diesem Schritt weiter - - ---- NW 28: Schritt 5: Trolley fährt aus ? --- -s005: SET // Weiterschaltbedingung - AN B_InSchleuse // Sensor Trolley ist in Schleuse - A( - O Antrieb_Schleuse_aktiv // Kreisel-Antrieb aktiv - ON Schleuse.Parameter_allg.Antrieb_vorhanden // Schleuse an angetriebener Strecke - ) - A( - O Antrieb_plus_aktiv - ON Schleuse.Parameter_allg.Antrieb_Plus_vorhanden - ) - = Weiter - -// Schrittaktionen: - SET - S Y_Schleuse_Auf // Schleuse öffnen - S Dyn.Status."Trolley_fährt_aus" - -// Antriebe: -// siehe Nw10 - -// B in Schleuse aktiv: - A B_InSchleuse // Sensor Trolley ist in Schleuse - JCN X050 // Negierter Sprung - - L 0 - T Dyn.Sk.Tok_Zelle - -// Trolley ist draussen mit 5s-Verzögerung: -X050: A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - L 300 - JC Plus // Nächsten Schritt starten - -// Trolley fährt nicht raus!: - A Dyn.Sk.Err_Uebzeit - S Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - - L 16#B051 - T Dyn.Stop_Ursache - - A Antrieb_Schleuse_aktiv - ON Schleuse.Parameter_allg.Antrieb_vorhanden // Schleuse an angetriebener Strecke - = Ueb_akt // Überwachungszeit aktivieren - L Schleuse."Übzeit_aus_Schleuse" // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - - ---- NW 29: Schritt 6: Schleuse Mindestzeit geöffnet ? --- -s006: SET // Weiterschaltbedingung - A Dyn.Status.MindestZeit_ok - AN B_InSchleuse // Sensor Trolley in Schleuse vorhanden - = Weiter - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - -// Schrittaktionen: -// Gezählt wird in NW11 - - SET - S Y_Schleuse_Auf // Schleuse öffnen - S Dyn.Status."Trolley_fährt_aus" - -// Erneutes Signal von B in Schleuse ?: - A B_InSchleuse // Sensor Trolley in Schleuse vorhanden - JCN X060 // Negierter Sprung - - L 5 - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - L 0 // Mindest-Zeit neu starten - T Dyn.Mindest_Zeit // Sensor B_im_Sep ist frei [1s] - SET - R Dyn.Status.MindestZeit_ok // Zeit bereits abgelaufen - - JU RET - -// Antriebe: -// siehe Nw10 -X060: A Weiter - L 0 - JC X006 // Nächsten Schritt starten - - L 16#B061 - T Dyn.Stop_Ursache - -// Trolley fährt nicht raus!: - A Dyn.Sk.Err_Uebzeit - S Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - - A Antrieb_Schleuse_aktiv - ON Schleuse.Parameter_allg.Antrieb_vorhanden // Schleuse an angetriebener Strecke - = Ueb_akt // Überwachungszeit aktivieren - L Schleuse."Übzeit_aus_Schleuse" // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - -// Trolley hat Schleuse verlassen: -X006: SET - S Dyn.Status.Trolley_draussen // 1 Zyklus - R Dyn.Status."Trolley_fährt_in_Schleuse" - R Status2.Telegramm_gesendet - - L Dyn.Vereinzelungstakte - + DINT#1 // Vereinzelungen +1 - T Dyn.Vereinzelungstakte - -// Draussen-FC ?: - AN DraussenFC_vorhanden - JC NoFC // Bei diesem Schritt weiter - - L Schleusen_Nr // Schleusen-Nr. - T "MW190" - L Dyn.Trolley_ShopGroup // Shop-Gruppe - T "MD182" // übergeben - - L Dyn.Weichen_Ziel - T "MW198" // Weichenziel - - UC DB[DraussenFC] // z.Bsp. Daten anpassen - -NoFC: L 7 // Weiter mit Schritt 7 - JU Neu_Mig // Bei diesem Schritt weiter - - ---- NW 30: Schritt 7: Fertig --- -s007: SET // Weiterschaltbedingung - -// Schrittaktionen: - JU ENDE_Mig - - ---- NW 31: Schritt 9: Lese-Einheit bereit? --- -s009: SET // Weiterschaltbedingung - L Dyn.Leser.IN.nOutBarcode - L DINT#0 - ==D - A Dyn.Leser.IN.xOutReadyForNewScan - AN Dyn.Leser.IN.xOutReadingDone - AN Dyn.Leser.IN.xOutCodeGood - AN Dyn.Leser.IN.xOutCodeBad - = Weiter - R Dyn.Error.Err_Leser_nicht_bereit - -// Schrittaktionen: - AN Status2.Trolley_an_Schleuse // Trolley im Schleuse erkannt - A Schleuse.Parameter_allg.Leser_eingebaut - R Dyn.Error.Err_Leser_nicht_bereit - L 0 // Weiter mit Schritt 0 - JC Neu_Mig // Bei diesem Schritt weiter - - A Weiter - = Dyn.Leser.OUT.xInStartReading // Leser triggern - L 0 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - -// Leser nicht bereit: - A Dyn.Leser.IN.xOutReadingDone // Falls altes Handshake noch gewollt - O Dyn.Leser.IN.xOutCodeGood - O Dyn.Leser.IN.xOutCodeBad - S Dyn.Leser.OUT.xInHandshakeDone - - A Dyn.Sk.Err_Uebzeit - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - S Dyn.Error.Err_Leser_nicht_bereit - S Dyn.Leser.OUT.xInErrQuit // Vielleicht hilft es - - A Dyn.Error.Err_Leser_nicht_bereit - A ErrQuit // Mit Quittierung dann zusätzlich reset! - S Dyn.Leser.OUT.xInReset - -// HMI-TrolleyID bei Leser nicht bereit: - L Dyn.HMI.TrolleyID_Input - L DINT#0 - <>D // Ja! - A Dyn.Error.Err_Leser_nicht_bereit - L 0 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - SET - = Ueb_akt // Überwachungszeit aktivieren - L 5 // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - - ---- NW 32: Schritt 10: Warten auf Leseeinheit --- -s010: SET // Weiterschaltbedingung - A Dyn.Leser.IN.xOutReadingDone - A Dyn.Leser.IN.xOutCodeGood - AN Dyn.Leser.IN.xOutCodeBad - = Weiter - R Dyn.Error.Err_Kein_LeseErgebnis - -// Schrittaktionen: - AN Status2.Trolley_an_Schleuse // Trolley im Schleuse erkannt - A Schleuse.Parameter_allg.Leser_eingebaut - L 0 // Weiter mit Schritt 0 - R Dyn.Error.Err_Kein_LeseErgebnis - JC Neu_Mig // Bei diesem Schritt weiter - - SET - R Dyn.Leser.OUT.xInStartReading // Leseeinheit triggern - - A Weiter - S Dyn.Leser.OUT.xInHandshakeDone - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - JC X010 - - SET - S Dyn.Status.Trolley_wartet_Lesung - - A Dyn.Error.Err_Leser_nicht_bereit // von Schritt 9 - JC LX - - A Dyn.Sk.Err_Uebzeit - O Dyn.Leser.IN.xOutCodeBad - S Dyn.Leser.OUT.xInHandshakeDone - JC L2 // Erst bei 3.Fehllesung Error! - - L 16#B101 - T Dyn.Stop_Ursache - - SET - = Ueb_akt // Überwachungszeit aktivieren - - L 10 // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - -L2: A Status2."2.Lesung_aktiv" // Erst bei 3.Fehllesung Error! - JC L3 - - SET - S Status2."2.Lesung_aktiv" - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - - L 9 - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - JU RET - -L3: A Status2."3.Lesung_aktiv" // //Erst bei 3.Fehllesung Error! - JC LX - - SET - S Status2."3.Lesung_aktiv" - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - - L 9 - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - JU RET - -// Nach 3.Fehl-Lesung erst Leserfehler! -LX: SET - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - S Dyn.Error.Err_Kein_LeseErgebnis - JU NoLesung - -// Leserdaten übergeben: -X010: L Dyn.Leser.IN.nOutBarcode - T Dyn.TrolleyID_Schleuse - - L DINT#0 // Unbekannt ? - ==D // Ja ! - O( - CAC - L DINT#-1 // Fehl-Lesung? - ==D // Ja ! - ) - S Dyn.Error.Err_Kein_LeseErgebnis - L 9 // Weiter mit Schritt 9 (Leser bereit) - JC Neu_Mig // Bei diesem Schritt weiter - - L 11 // Weiter mit Schritt 11 - JU Neu_Mig // Bei diesem Schritt weiter - -// Lesefehler: -NoLesung: NOP 0 -// HMI-Eingabe?: -// HMI-TrolleyID: - L Dyn.HMI.TrolleyID_Input - T Dyn.TrolleyID_Schleuse - <>D // Ja! - L 0 // Angabe der Wartezeit (*10ms) - R Dyn.Error.Err_Kein_LeseErgebnis - R Dyn.Error.Err_Leser_nicht_bereit // von Schritt 9 - JC Plus // Nächsten Schritt starten - -// Leser-FC aufrufen: -No_HMIa: AN LeserFC_vorhanden - JC NoLFC - - L Schleusen_Nr // Schleusen-Nr. - T "MW190" // übergeben - L Dyn.Trolley_ZwischenZiel // Übergabe von Leser-Aufruf - T "MW196" - - A Dyn.Error.Err_Kein_LeseErgebnis - = "M180.0" - SET - R "M180.1" - - UC DB[LeserFC] // Beeinflussung der Fehllesung - - L 16#B102 - T Dyn.Stop_Ursache - - L "MW196" // Zwischenziel übergeben - T Dyn.Trolley_ZwischenZiel // Übergabe von Leser-Aufruf - L 0 // Übergeben ? - <>I // Ja! - L 12 // Weiter mit Schritt 12 - R Dyn.Error.Err_Kein_LeseErgebnis - JC Neu_Mig // Bei diesem Schritt weiter - -NoLFC: L 9 - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - JU RET - - ---- NW 33: Schritt 11: Trolleydaten aus DL lesen --- -s011: L DINT#0 - T Dyn.TrolleyID_Eingefahren // Eintrag von Weiche -1 - - L Dyn.Trolley_ZwischenZiel // / - - L Dyn.TrolleyID_Schleuse - T "MD220" - -CALL FC "DatenOut" (SSDB:=Schleuse.Gesamt_Trolley_DL, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=P#M220.0, RE_VAL:="MB199", OUTDATEN:=DB1011.DBX0.0, Position:="MW196") // Eintrag lesen - - L 16#B111 - T Dyn.Stop_Ursache - - AN "M199.7" - = Dyn.Error.Barcode_nicht_bekannt - JC UnbekanntBC - -// Relevanten Trolleydaten auslesen: - L "TrolleyDL_OutDaten".OUTDaten.EndZiel - T Dyn.Trolley_EndZiel - -// ZwischenZiel nicht überschreiben: - L Dyn.Trolley_ZwischenZiel - L 0 // Schon bekannt ? - <>I // Ja ! - JC NixZZ - - L "TrolleyDL_OutDaten".OUTDaten.ZwischenZiel - T Dyn.Trolley_ZwischenZiel - -NixZZ: L "TrolleyDL_OutDaten".OUTDaten.ShopGroup - T Dyn.Trolley_ShopGroup - - L 0 // Angabe der Wartezeit (*10ms) - JU Plus // Nächsten Schritt starten - -// Unbekannter Trolley: -UnbekanntBC: NOP 0 -// HMI-Eingabe?: - -// Leser-FC aufrufen: -Nix_HMI: AN LeserFC_vorhanden - JC Nix_LFC - - L Schleusen_Nr // Schleusen-Nr. - T "MW190" // übergeben - L Dyn.TrolleyID_Schleuse - T "MD192" - L Dyn.Trolley_ZwischenZiel - T "MW196" - - A Dyn.Error.Barcode_nicht_bekannt - = "M180.1" - SET - R "M180.0" - - UC DB[LeserFC] // Beeinflussung der Weiterfahrt bei nicht bekanntem Trolley - - L "MW196" // ZwischenZiel übergeben - T Dyn.Trolley_ZwischenZiel // Übergabe von Leser-Aufruf - L 0 // Übergeben ? - <>I // Ja! - L 12 // Weiter mit Schritt 12 - R Dyn.Error.Err_Kein_LeseErgebnis - JC Neu_Mig // Bei diesem Schritt weiter - -Nix_LFC: JU RET - - ---- NW 34: Schritt 12: Ziel-FC --- -s012: NOP 0 - -// Schrittaktionen: - AN Status2.Trolley_an_Schleuse // Trolley im Schleuse erkannt - A Schleuse.Parameter_allg.Leser_eingebaut - AN "Schleuse_geöffnet" - L 0 // Weiter mit Schritt 0 - JC Neu_Mig // Bei diesem Schritt weiter - - SET - S Dyn.Status."Trolley_wartet_auf_Ziel-FC" - - AN ZielFC_vorhanden - R Dyn.Status."Trolley_wartet_auf_Ziel-FC" - L 13 // Weiter mit Schritt 13 - JC Neu_Mig // Bei diesem Schritt weiter - - SET // Rückmeldungen erst mal resetten - R "M180.6" // Weiterfahrt von Ziel-FC erlaubt - L Schleusen_Nr // Schleusen-Nr. - T "MW190" // übergeben - L Dyn.Trolley_ShopGroup // Shop-Gruppe - T "MD182" // übergeben - L Dyn.Trolley_EndZiel // End-Ziel - T "MW194" // übergeben - L Dyn.Trolley_ZwischenZiel - T "MW196" // übergeben - L 0 // Erst mal nullen - T "MW198" // Weichenziel - - UC DB[ZielFC] // Beeinflussung der Weiterfahrt - - L 16#B122 - T Dyn.Stop_Ursache - -// Spezial-Fall bei Übergabe an Sorter / Turm (M180.6 wird nie im Ziel-FC gesetzt!) -// aber anderer Partner hat Schleuse extern geöffnet: - A "Schleuse_geöffnet" - AN "M180.6" // Weiterfahrt von Ziel-FC erlaubt - AN Status2."TrolleyPos_übergeben" // Nur einmalig - S Status2."TrolleyPos_übergeben" - JCN Normal // Negierter Sprung - - L Dyn.Vereinzelungstakte - + DINT#1 // Vereinzelungen +1 - T Dyn.Vereinzelungstakte - -CALL FC "Trolley_DL_Neue_Pos" (Gesamt_Trolley_DL:=Schleuse.Gesamt_Trolley_DL, TrolleyID:=Dyn.TrolleyID_Schleuse, Position:=Schleuse.Leser_ID, ShopGroup:=Dint#0, Err:="M199.0") - -// Draussen-FC ?: - AN DraussenFC_vorhanden - JC RET // Bei diesem Schritt weiter - - L Schleusen_Nr // Schleusen-Nr. - T "MW190" - - UC DB[DraussenFC] // z.Bsp. Daten anpassen - - JU RET - -Normal: A "M180.6" // Weiterfahrt von Ziel-FC erlaubt - JC X012 - - AN Schleuse.Parameter_allg.Leser_eingebaut - JC RET - - L 11 - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - JU RET - -X012: L "MW196" // zurückschreiben, falls verändert - T Dyn.Trolley_ZwischenZiel - - L "MW198" // Weichenziel übergeben - T Dyn.Weichen_Ziel - - L 13 // Weiter mit Schritt 13 - JU Neu_Mig // Bei diesem Schritt weiter - - ---- NW 35: Schritt 13: Schleusen-Position zurückschreiben --- -s013: NOP 0 - -// Schrittaktionen: - SET - S Status2."Weichen-Schritt" - -// Neue Position an Gesamt-Trolley-DL übergeben: -CALL FC "Trolley_DL_Neue_Pos" (Gesamt_Trolley_DL:=Schleuse.Gesamt_Trolley_DL, TrolleyID:=Dyn.TrolleyID_Schleuse, Position:=Schleuse.Leser_ID, ShopGroup:=DInt#0, Err:="M199.0") // für nichts verändern - - L 0 // Angabe der Wartezeit (*10ms) - JU Plus // Nächsten Schritt starten - - ---- NW 36: Schritt 14: Weichenbereich +1 vorhanden --- -s014: NOP 0 - -// Schrittaktionen: -// Weichenbereich +1 vorhanden?: - A "Kein_Weichenbereich +1" - L 2 // Weiter mit Schritt 2 (Ausfahren ok?) - JC Neu_Mig // Bei diesem Schritt weiter - - SET - S Status2."Weichen-Schritt" - - L 0 // Angabe der Wartezeit (*10ms) - JU Plus // Nächsten Schritt starten - - ---- NW 37: Schritt 15: Weichenbereich raus bereit ? --- -s015: NOP 0 - -// Schrittaktionen: - AN Status2.Trolley_an_Schleuse // Trolley im Schleuse erkannt - L 0 // Weiter mit Schritt 0 - JC Neu_Mig // Bei diesem Schritt weiter - - SET - S Status2."Weichen-Schritt" - - L Dyn.Weichen_Ziel - L 0 // Bekannt ? - <>I // Ja ! - JC X15A - - L 12 // Ziel-FC ? - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - L 16#B154 - T Dyn.Stop_Ursache - - JU RET - -X15A: SET - S Dyn.Status."Trolley_wartet_auf_Weiche+1" - - L 16#B155 - T Dyn.Stop_Ursache - - L SAVE.Weichen_DB // Weichen-DB - L 0 // Einsprung-Zeiger bekannt ? - >I // Ja ! - JC S015A - - L 16#B150 - T Dyn.Stop_Ursache - - JU RET - -// Weichendaten auslesen: -S015A: L SAVE.Weichen_DW - ITD - T AR1Start // Startwert mit Offset 0 - - L AR1Start // Startwert mit Offset 0 - + DINT#70 - SLD 3 - L 0 // Damit DBX70.0 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L 16#B152 - T Dyn.Stop_Ursache - - OPN DB[SAVE.Weichen_DB] // FABE+ -DB öffnen - - AN DBX [AR1Zeiger] // Weichenbereich frei ? (DBX70.0) - JC S015B - - L 16 // Weiter mit Schritt 16 (Daten an Weiche übergeben) - JU Neu_Mig // Bei diesem Schritt weiter - -// Reservierung noch diese Schleuse ?: -S015B: L AR1Start // Startwert mit Offset 0 - + DINT#78 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[SAVE.Weichen_DB] // FABE+ -DB öffnen - - L DBW [AR1Zeiger] // Schleuse -1 (DBW 78) - L Schleusen_Nr // Diese Schleuse ? - <>I // Nein ! - JC RET // Warten ! - -// Dasselbe Weichen-Ziel ?: - L Dyn.Weichen_Ziel // Gewolltes Ziel - L Dyn."Zurück_gemeldetes_Weichen_Ziel" // Aktuell im Weichenbereich aktives Ziel - <>I // Sind nicht identisch ! - JC RET // Warten ! - - L 16 // Weiter mit Schritt 16 (Daten an Weiche übergeben) - JU Neu_Mig // Bei diesem Schritt weiter - - ---- NW 38: Schritt 16: Daten an Rausweiche übergeben --- -s016: NOP 0 - -// Schrittaktionen: - SET - S Status2."Weichen-Schritt" - -// Daten für Eintrag vorbereiten: - OPN DB[SAVE.Weichen_DB] // FABE+ -DB öffnen - - L AR1Start // Startwert mit Offset 0 - + DINT#72 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L Dyn.TrolleyID_Schleuse - T DBD [AR1Zeiger] // Trolley-ID (DBD 72) - - L AR1Start // Startwert mit Offset 0 - + DINT#76 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L Dyn.Weichen_Ziel - T DBW [AR1Zeiger] // Weichenziel (DBW 76) - - L AR1Start // Startwert mit Offset 0 - + DINT#80 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L Dyn.Trolley_ZwischenZiel - T DBW [AR1Zeiger] // Zwischenziel (DBW 80) - - L AR1Start // Startwert mit Offset 0 - + DINT#78 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L Schleusen_Nr - T DBW [AR1Zeiger] // Schleuse -1 (DBW 78) - - SET - S "Reservierung_Weiche+1_aktiv" // Weiche nicht mehr angemeldet (da erst im nächsten Zyklus) - - L Schleuse.RausWeichen_Nr // Nr. der vorhandenen Weiche - T SAVE."Weiche+1" // Hier wurde reserviert - - L 17 // Weiter mit Schritt 17 (Hat Weiche geschaltet ?) - JU Neu_Mig // Bei diesem Schritt weiter - - ---- NW 39: Schritt 17: Hat Rausweiche geschaltet ? --- -s017: NOP 0 - -// Schrittaktionen: - SET - S Status2."Weichen-Schritt" - -// Weiche +1 noch mit dieser Schleuse aktiv ?: - AN "Reservierung_Weiche+1_aktiv" // Weiche nicht mehr angemeldet - L 14 // Weiter mit Schritt 14 - JC Neu_Mig // Bei diesem Schritt weiter - - SET - S Dyn.Status."Trolley_wartet_auf_Weiche+1" - - L 16#B170 - T Dyn.Stop_Ursache - - L Dyn.Weichen_Ziel // Gewolltes Ziel - L Dyn."Zurück_gemeldetes_Weichen_Ziel" // Aktuell im Weichenbereich aktives Ziel - ==I // Sind identisch ! - A Dyn.Status.Weiche_geschaltet // Rückmeldung von Weiche +1 - L 2 // Weiter mit Schritt 2 (Ausfahren ok?) - JC Neu_Mig // Bei diesem Schritt weiter - - L 16#B171 - T Dyn.Stop_Ursache - - JU RET - - ---- NW 40: Schritt 20: Schleuse resetten (Wartezeit) --- -s020: A B_InSchleuse // Weiterschaltbedingung - = Weiter // Weiterschaltbedingung ist erfüllt - -// Schrittaktionen: - SET // ELS in Grundstellung fahren - S Antrieb_Schleuse_vor // Antrieb einschalten - S Antrieb_Schleuse_start // Antrieb starten - - A Weiter - O Dyn.Sk.Err_Uebzeit - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - L 21 // Weiter mit Schritt 21 - JC Neu_Mig // Bei diesem Schritt weiter - - L 16#B201 - T Dyn.Stop_Ursache - - SET - = Ueb_akt // Überwachungszeit aktivieren - L Schleuse.Wartezeit_bis_leer // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - - ---- NW 41: Schritt 21: Reset ist zu Ende --- -s021: SET - R Dyn.Sk.Reset_Akt // Reset ist aktiv - R Status2."TrolleyPos_übergeben" - R Dyn.Error.Err_Trolley_nicht_in_Schleuse // Trolley fährt nicht in Schleuse - R Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen - R Dyn.Error.Err_Stau_Einfahrt // Betriebsart ist nicht möglich - R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus - R Dyn.Status."Trolley_fährt_in_Schleuse" - - L 0 - T SAVE.Weichen_DB - T SAVE.Weichen_DW - T SAVE."Weiche+1" // Dadurch wird in Weiche Reservierung gelöscht - T Dyn.Raus_Trolleys - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - T Dyn.Mindest_Zeit // Sensor B_VorSep ist frei [1s] - - SET - S Dyn.Status.Trolley_draussen - - JU ENDE_Mig // Neubeginn - - ---- NW 42: Schrittkette beenden --- -ENDE_Mig: L 0 // Schritt 0: Warten - T Dyn.Sk.Akt_Schritt - - L 0 // Zeitwert löschen - T Dyn.Sk.Terr_Zelle - T Dyn.Sk.Tok_Zelle - T Dyn.ZwischenZiel_eingefahren - - L DINT#0 - T Dyn.TrolleyID_Eingefahren // Eintrag von Weiche -1 - T Dyn.TrolleyID_Schleuse // Daten übergeben - T Dyn.Trolley_ZwischenZiel - T Dyn.Trolley_EndZiel - T Dyn.Weichen_Ziel - - SET - R Dyn.Sk.Err_Uebzeit - R Dyn.Status."Trolley_fährt_rückwärts" - R Dyn.Error.Err_Kein_LeseErgebnis - R Status2."2.Lesung_aktiv" - R Status2."3.Lesung_aktiv" - R Status2."TrolleyPos_übergeben" - R Status2.Telegramm_gesendet - -// HMI-Zeug: - L DINT#0 - T Dyn.HMI.TrolleyID_Input - - JU RET - - ---- NW 43: Nächsten Schritt aktivieren --- -Plus: T Dyn.Sk.T_ok // Wartezeit übergeben - - A Dyn.Sk.Err_Uebzeit // Störung noch nicht quittiert - JC RET - - L 0 // keine Wartezeit ? - ==I // Ja ! -> sofort weiter - JC w220 - - AN Warte_neu // Wartezeit neutriggern - JC W220_Mig - - L 0 - T Dyn.Sk.Tok_Zelle // Wartezeit - -W220_Mig: A Warte_stop // Wartezeit stoppen - JC RET - - L Dyn.Sk.Tok_Zelle - L "MW4" // Wartezeit +10ms - +I - T Dyn.Sk.Tok_Zelle // Wartezeit - L Dyn.Sk.T_ok // abgelaufen ? - I // abgelaufen ? - AN Dyn.Sk.Err_Uebzeit - JC en24 // Nein ! - - A Ueb_akt // Überwachungszeit aktivieren - S Dyn.Sk.Err_Uebzeit - - L 0 // Zeitwert löschen - T Dyn.Sk.Terr_Zelle - - JU RET - -en24: NOP 0 - ---- NW 45: Überwachungszeit +1 --- - AN Dyn.Sk.Ueb_akt // Schrittaktion ist aktiv - ON "1s-Impuls" - JC RET - - L Dyn.Sk.Terr_Zelle - + 1 // Üb.zeit +1s - T Dyn.Sk.Terr_Zelle - - JU RET - - ---- NW 46: Return --- -RET: NOP 0 -// Weichen -R ückmeldung löschen: - SET - R Dyn.Status.Weiche_geschaltet - R Dyn.Status."Trolley ausserhalb Weiche" - - L 0 - T Dyn."Zurück_gemeldetes_Weichen_Ziel" - - ---- NW 47: Leser-Einheit managen (Outputs schreiben) --- - AN Leser_Zugriff - ON Schleuse.Parameter_allg.Leser_eingebaut - JC NixLeser - -// Leserdaten schreiben: - OPN DB[Dyn.SAVE2.Leser_DB] // Leser -DB öffnen - - L Dyn.SAVE2.Leser_DD - T AR1Start // Startwert mit Offset 0 - -// Offset 4: - L AR1Start // Startwert mit Offset 0 - + DINT#4 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L DBB [AR1Zeiger] // Aktuelle Werte holen - T "MB200" - - A Dyn.Leser.OUT.xInStartReading - = "M200.1" - A Dyn.Leser.OUT.xInHandshakeDone - R Dyn.Leser.OUT.xInHandshakeDone - = "M200.2" - A Dyn.Leser.OUT.xInErrQuit - R Dyn.Leser.OUT.xInErrQuit - = "M200.4" - A Dyn.Leser.OUT.xInReset - R Dyn.Leser.OUT.xInReset - = "M200.5" - - L "MB200" - T DBB [AR1Zeiger] // Veränderte Werte zurück schreiben - -NixLeser: NOP 0 - - ---- NW 48: Ende --- - BE + L #Dyn.Trolley_ZwischenZiel; + T DBW[ #AR1Zeiger] ;//Zwischenziel (DBW 80) + + L #AR1Start ;//Startwert mit Offset 0 + + DINT#78; + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + L #Schleusen_Nr; + T DBW[ #AR1Zeiger] ;//Schleuse -1 (DBW 78) + + SET; + S #"Reservierung_Weiche+1_aktiv";//Weiche nicht mehr angemeldet (da erst im nächsten Zyklus) + + L #Schleuse.RausWeichen_Nr;//Nr. der vorhandenen Weiche + T #SAVE."Weiche+1" ;//Hier wurde reserviert + + L 17 ;//Weiter mit Schritt 17 (Hat Weiche geschaltet ?) + SPA Neu_Mig ;//Bei diesem Schritt weiter + +NETWORK +TITLE = Schritt 17: Hat Rausweiche geschaltet ? +s017: NOP 0; + +//Schrittaktionen: + SET; + S #Status2."Weichen-Schritt"; + +//Weiche +1 noch mit dieser Schleuse aktiv ?: + UN #"Reservierung_Weiche+1_aktiv";//Weiche nicht mehr angemeldet + L 14 ;//Weiter mit Schritt 14 + SPB Neu_Mig;//Bei diesem Schritt weiter + + SET; + S #Dyn.Status."Trolley_wartet_auf_Weiche+1"; + + L 16#B170; + T #Dyn.Stop_Ursache; + + L #Dyn.Weichen_Ziel ;//Gewolltes Ziel + L #Dyn.Zurück_gemeldetes_Weichen_Ziel;//Aktuell im Weichenbereich aktives Ziel + ==I ;//Sind identisch ! + U #Dyn.Status.Weiche_geschaltet;//Rückmeldung von Weiche +1 + L 2 ;//Weiter mit Schritt 2 (Ausfahren ok?) + SPB Neu_Mig ;//Bei diesem Schritt weiter + + L 16#B171; + T #Dyn.Stop_Ursache; + + SPA RET; + +NETWORK +TITLE = Schritt 20: Schleuse resetten (Wartezeit) +s020: U #B_InSchleuse ;//Weiterschaltbedingung + = #Weiter ;//Weiterschaltbedingung ist erfüllt + +//Schrittaktionen: + SET;//ELS in Grundstellung fahren + S #Antrieb_Schleuse_vor;//Antrieb einschalten + S #Antrieb_Schleuse_start;//Antrieb starten + + U #Weiter; + O #Dyn.Sk.Err_Uebzeit; + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + L 21 ;//Weiter mit Schritt 21 + SPB Neu_Mig;//Bei diesem Schritt weiter + + L 16#B201; + T #Dyn.Stop_Ursache; + + SET; + = #Ueb_akt ;//Überwachungszeit aktivieren + L #Schleuse.Wartezeit_bis_leer;//Angabe der Überwachungszeit (*1s) + SPA tueb ;//Überwachungszeit + +NETWORK +TITLE = Schritt 21: Reset ist zu Ende +s021: SET; + R #Dyn.Sk.Reset_Akt;//Reset ist aktiv + R #Status2.TrolleyPos_übergeben; + R #Dyn.Error.Err_Trolley_nicht_in_Schleuse;//Trolley fährt nicht in Schleuse + R #Dyn.Error.Err_Uebzeit ;//Überwachungzeit ist abgelaufen + R #Dyn.Error.Err_Stau_Einfahrt;//Betriebsart ist nicht möglich + R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus + R #Dyn.Status.Trolley_fährt_in_Schleuse; + + L 0; + T #SAVE.Weichen_DB; + T #SAVE.Weichen_DW; + T #SAVE."Weiche+1";//Dadurch wird in Weiche Reservierung gelöscht + T #Dyn.Raus_Trolleys; + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + T #Dyn.Mindest_Zeit ;//Sensor B_VorSep ist frei [1s] + + SET; + S #Dyn.Status.Trolley_draussen; + + SPA ENDE_Mig;//Neubeginn + +NETWORK +TITLE = Schrittkette beenden +ENDE_Mig: L 0;//Schritt 0: Warten + T #Dyn.Sk.Akt_Schritt; + + L 0;//Zeitwert löschen + T #Dyn.Sk.Terr_Zelle; + T #Dyn.Sk.Tok_Zelle; + T #Dyn.ZwischenZiel_eingefahren; + + L DINT#0; + T #Dyn.TrolleyID_Eingefahren;//Eintrag von Weiche -1 + T #Dyn.TrolleyID_Schleuse;//Daten übergeben + T #Dyn.Trolley_ZwischenZiel; + T #Dyn.Trolley_EndZiel; + T #Dyn.Weichen_Ziel; + + SET; + R #Dyn.Sk.Err_Uebzeit; + R #Dyn.Status.Trolley_fährt_rückwärts; + R #Dyn.Error.Err_Kein_LeseErgebnis; + R #Status2."2.Lesung_aktiv"; + R #Status2."3.Lesung_aktiv"; + R #Status2.TrolleyPos_übergeben; + R #Status2.Telegramm_gesendet; + +//HMI-Zeug: + L DINT#0; + T #Dyn.HMI.TrolleyID_Input; + + SPA RET; + +NETWORK +TITLE = Nächsten Schritt aktivieren +Plus: T #Dyn.Sk.T_ok;//Wartezeit übergeben + + U #Dyn.Sk.Err_Uebzeit;//Störung noch nicht quittiert + SPB RET; + + L 0;//keine Wartezeit ? + ==I;//Ja ! -> sofort weiter + SPB w220; + + UN #Warte_neu;//Wartezeit neutriggern + SPB W220_Mig; + + L 0; + T #Dyn.Sk.Tok_Zelle;//Wartezeit + +W220_Mig: U #Warte_stop;//Wartezeit stoppen + SPB RET; + + L #Dyn.Sk.Tok_Zelle; + L "MW4";//Wartezeit +10ms + +I; + T #Dyn.Sk.Tok_Zelle;//Wartezeit + L #Dyn.Sk.T_ok;//abgelaufen ? + I;//abgelaufen ? + UN #Dyn.Sk.Err_Uebzeit; + SPB en24;//Nein ! + + U #Ueb_akt;//Überwachungszeit aktivieren + S #Dyn.Sk.Err_Uebzeit; + + L 0;//Zeitwert löschen + T #Dyn.Sk.Terr_Zelle; + + SPA RET; + +en24: NOP 0; +NETWORK +TITLE = Überwachungszeit +1 + UN #Dyn.Sk.Ueb_akt;//Schrittaktion ist aktiv + ON "1s-Impuls"; + SPB RET; + + L #Dyn.Sk.Terr_Zelle; + + 1 ;//Üb.zeit +1s + T #Dyn.Sk.Terr_Zelle; + + SPA RET; + +NETWORK +TITLE = Return +RET: NOP 0; +//Weichen -R ückmeldung löschen: + SET; + R #Dyn.Status.Weiche_geschaltet; + R #Dyn.Status."Trolley ausserhalb Weiche"; + + L 0; + T #Dyn.Zurück_gemeldetes_Weichen_Ziel; + +NETWORK +TITLE = Leser-Einheit managen (Outputs schreiben) + UN #Leser_Zugriff; + ON #Schleuse.Parameter_allg.Leser_eingebaut; + SPB NixLeser; + +//Leserdaten schreiben: + AUF DB[ #Dyn.SAVE2.Leser_DB] ;//Leser -DB öffnen + + L #Dyn.SAVE2.Leser_DD; + T #AR1Start ;//Startwert mit Offset 0 + +//Offset 4: + L #AR1Start ;//Startwert mit Offset 0 + + DINT#4; + SLD 3; + T #AR1Zeiger ;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + L DBB[ #AR1Zeiger];//Aktuelle Werte holen + T "MB200"; + + U #Dyn.Leser.OUT.xInStartReading; + = "M200.1"; + U #Dyn.Leser.OUT.xInHandshakeDone; + R #Dyn.Leser.OUT.xInHandshakeDone; + = "M200.2"; + U #Dyn.Leser.OUT.xInErrQuit; + R #Dyn.Leser.OUT.xInErrQuit; + = "M200.4"; + U #Dyn.Leser.OUT.xInReset; + R #Dyn.Leser.OUT.xInReset; + = "M200.5"; + + L "MB200"; + T DBB[ #AR1Zeiger] ;//Veränderte Werte zurück schreiben + +NixLeser: NOP 0; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Module/MHMOmniWeiche_Plus.awl b/=A01+UH07-KF00/Programmbausteine/Module/MHMOmniWeiche_Plus.awl index 95f2224..ccb56fe 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/MHMOmniWeiche_Plus.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/MHMOmniWeiche_Plus.awl @@ -1,873 +1,934 @@ -=== FB 1280: MHMOmniWeiche_Plus [STL] === -INTERFACE: - Input: - Weichen_Nr : Int // Aufruf für Weiche - ErrQuit : Bool // Ablaufstörung quittieren - Fahren_Ok : Bool // Fahren Ok - B_Ziel_gerade : Bool // Ziel-Sensor gerade - B_Ziel_abzweig : Bool // Ziel-Sensor abzweig - Antrieb_Weiche_aktiv : Bool // Weichen-Antrieb aktiv - Antrieb_Gerade_aktiv : Bool // Gerade-Antrieb aktiv - Antrieb_Abzweig_aktiv : Bool // Abzweig-Antrieb aktiv - Weiche_ist_AST : Bool // Weiche ist auf Arbeitsstellung - Output: - Y_Weiche_gerade : Bool // Weiche auf Gerade schalten - Y_Weiche_abzweig : Bool // Weiche auf Abzweig schalten - Error : Word // Störungen übergeben - InOut: - Antrieb_Weiche_vor : Bool // Weichenantrieb einschalten - Antrieb_Weiche_stop : Bool // Weichenantrieb stoppen - Antrieb_Weiche_gerade_vor : Bool // Weichenantrieb gerade einschalten - Antrieb_Weiche_gerade_stop : Bool // Weichenantrieb gerade stoppen - Antrieb_Weiche_abzweig_vor : Bool // Weichenantrieb abzweig einschalten - Antrieb_Weiche_abzweig_stop : Bool // Weichenantrieb abzweig stoppen - hStOk : Bool // Anzeige Start n. Störung aktivieren - Static: - SAVE : Struct - Schleusen_DB : Int // Schleuse-1-DB - Schleuse-1_DW : Int // Schleuse-1-DW - Res : Array[1..3] of Int // Reserve - Para : Struct // Parameter - Weichen_DL_DB : Int // Einsprung Weichen-Datenliste-DB - Weichen_DL_DW : Int // Einsprung Weichen-Datenliste-DW - Schleusen_DL_DB : Int // Einsprung Schleuse-Datenliste-DB - Schleusen_DL_DW : Int // Einsprung Schleuse-Datenliste-DW - Res1 : Array[1..1] of Int // Reserve - Weiche : "UDLHMOmniWeiche_2fach_Plus" // Fahrbereichs Daten - Dyn : Struct // Dynamische Daten fürs Einfahren - Status : Struct // Status - Weiche_frei : Bool // Rückmeldung: Weiche ist wieder frei - Kein_StartOk : Bool // Input StartOk <>1 - Weiche_abzweigen : Bool // Weiche auf Abzweig schalten - Weiche_geradeaus : Bool // Weiche auf Gerade schalten - MindestZeit_ok : Bool // Mindestzeit für Weichendurchfahrt erreicht? - Ziel_erreicht : Bool // Ziel erreicht - Frei06 : Bool - Weiche_aktiv : Bool // Weiche ist aktiv - Auto_akt : Bool - Hand_akt : Bool - Bereich_ok : Bool - MindestZeit_nachtriggern : Bool // Mindestzeit nachtriggern (von Schleuse -1) - Warten_auf_Mindestzeit : Bool // Mindestzeit noch nicht abgelaufen - Res15 : Bool - Error_aktiv : Bool // Störung vorhanden - Reset_aktiv : Bool := TRUE // Reset aktiv - TrolleyID : DInt // Trolley-Nr (Eintrag Schleuse, Austrag Weiche) - Weichen_Ziel : Word // Weichen-Ziel (Eintrag Schleuse, Austrag Weiche) - Schleuse -1 : Int // Schleuse, woher Ziel kam - Zwischen_Ziel : Word // Zwischen-Ziel - HMI : Struct - TrolleyID_Weiche : DInt // Trolley-Nr im Weichenbereich (IN:PLC, OUT:PLC) - WeichenZiel : DInt // Ziel im Weichenbereich (IN:PLC, OUT:PLC) - Weiche_resetten : Bool // Weiche resetten (IN:HMI, Out:PLC) - Rueckmld : Struct - RET_VAL_BLKMOV_Weiche : Int // Rückmeldung nach BLKMOV-Aufruf - RET_VAL_DL_Weichen : Byte // Rückmeldung nach DatenOut-Aufruf - RET_VAL_DL_Schleusen : Byte // Rückmeldung nach DatenOut-Aufruf - Error : "UErrOmniWeiche_2fach" - FahrKontrolle : Struct - Para_Mindestzeit : Int // BM erst nach dieser Zeit im Ziel - Para_Überwachungszeit : Int // BM nach dieser Zeit in Weiche verklemmt - Akt_Mindestzeitzeit : Int // BM erst nach dieser Zeit im Ziel - Akt_Überwachungszeit : Int // BM nach dieser Zeit in Weiche verklemmt - Leer_Zeit : Int // Lager ist frei [1s] - Schalttakte : DInt // Anzahl der getätigten Umschaltungen - Frei200 : Array[1..44] of Int - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Parameter : Word // Parameter - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - Bereich+1ID : Int - Bereich+1_DB : Int - Keine_Einfahrt : Bool // Keine Einfahrt angemeldet - Err_Bereich+1 : Bool - Weichen_Trolleys : Bool // Weichen-Trolleys vorhanden - ZielSensor_aktiv : Bool - Abzweig_Ziel : Bool - Gerade_Ziel : Bool - Antriebe_ein : Bool - Constant: - ---- NW 1: Parameter-Übergabe --- - L Weichen_Nr // Aufruf-Parameter (für Baustein beobachten) - - L 279 // Einsprung Weichen-DL - T Para.Weichen_DL_DB // vor Aufruf übergeben! - L 0 - T Para.Weichen_DL_DW - - L 274 // Einsprung Schleuse-DL - T Para.Schleusen_DL_DB // vor Aufruf übergeben! - L 0 - T Para.Schleusen_DL_DW - - SET - R ZielSensor_aktiv // Temp - R Weichen_Trolleys - R Antriebe_ein - R Abzweig_Ziel - R Gerade_Ziel - - ---- NW 2: Gesamt: Out-Bits zum Zurücksetzen --- - L Weichen_Nr - - SET -// R #Y_Weiche_gerade //Wegen Reset -// R #Y_Weiche_abzweig //Wegen Reset - - SET // Erst mal - R Dyn.Status.Weiche_frei - S Dyn.Status.Weiche_aktiv - - ---- NW 3: HMI-Zeug --- -// Von HMI: - A Dyn.HMI.Weiche_resetten - R Dyn.HMI.Weiche_resetten // von HMI - S Dyn.Status.Reset_aktiv - JCN HMI1 - - L 0 - T Dyn.Leer_Zeit // da kein Sk - T Dyn.FahrKontrolle.Akt_Mindestzeitzeit - T Dyn.FahrKontrolle."Akt_Überwachungszeit" - - SET - R Dyn.Error."Übzeit_Gerade" - R Dyn.Error."Übzeit_Abzweig" - -// An HMI: -HMI1: L Dyn.TrolleyID - T Dyn.HMI.TrolleyID_Weiche - - L Dyn.Weichen_Ziel - T Dyn.HMI.WeichenZiel - - ---- NW 4: Störungen nach Außen übergeben --- - L 0 - T "MB200" - - A Dyn.Error.Weichen_DL // Weichen-Datenliste fehlerhaft - = "M200.0" - A Dyn.Error.Undef_Weiche // undefinierte Weiche - = "M200.1" - A Dyn.Error.BLKMov // Fehler bei Block kopieren - = "M200.2" - A Dyn.Error."Undef_Bereich+1" - = "M200.3" - A Dyn.Error.Frei04 - = "M200.4" - A Dyn.Error.Frei05 - = "M200.5" - A Dyn.Error.Ziel_undefiniert - = "M200.6" - A Dyn.Error.Err_Schleusen_DL - = "M200.7" - A Dyn.Error."Err_Undef_Schleuse-1" - = "M201.0" - A Dyn.Error."Übzeit_Gerade" // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) - = "M201.1" - A Dyn.Error."Übzeit_Abzweig" // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen) - = "M201.2" - A Dyn.Error.Gerade_Sensor_aktiv - = "M201.3" - A Dyn.Error.Abzweig_Sensor_aktiv - = "M201.4" - A Dyn.Error.Gerade_Bereich_belegt - = "M201.5" - A Dyn.Error.Abzweig_Bereich_belegt - = "M201.6" - A Dyn.Status.Reset_aktiv - = Dyn.Error.Reset_aktiv - = "M201.7" - - L "MW200" - T Error // Schnittstelle nach Außen - -// Störung vorhanden: - L 0 - <>I // Ja ! - = Dyn.Status.Error_aktiv - -// Anzeige Start n. Störung aktivieren: - A Dyn.Error."Übzeit_Gerade" // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) - O Dyn.Error."Übzeit_Abzweig" // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen) - S hStOk - - ---- NW 5: Statische Weichen-Parameter holen --- - L Weiche.Weichen_Nr // Nummer der Weiche - L Weichen_Nr // Aufruf-Parameter - ==I // Identisch ? - R Dyn.Error.Weichen_DL // Weichendatenbank fehlerhaft - R Dyn.Error.Undef_Weiche // undefinierte Weiche - JC en06_Mig // Ja ! - - T "MW200" // Search-Daten - -CALL FC "DatenOut" (SSDB:=Para.Weichen_DL_DB, SSDW:=Para.Weichen_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196") - - L "MB199" - T Dyn.Rueckmld.RET_VAL_DL_Weichen // Rückmeldung bei Datenbank-Zugriff (Gefälle-DL) - - JBI G_Ok - - A "M199.0" - = Dyn.Error.Weichen_DL // Weichendatenbank fehlerhaft - BEC - - SET - S Dyn.Error.Undef_Weiche // undefinierte Weiche - - BEU - -// Kennung + Datenbytes -G_Ok: SET - R Dyn.Error.Weichen_DL // Weichendatenbank fehlerhaft - R Dyn.Error.Undef_Weiche // undefinierte Weiche - - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 40 // Datenwords speichern - T LW2 // Wiederholungen - -// Quelle-Pointer erzeugen: - L 0 // Bei Merker = 0 ! - T LW4 // DB_Nummer - L 220 // Adresse - SLD 3 - L 16#8300_0000 // Kennung: Merker - OD - T LD6 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche, DSTBLK:=Weiche) // Datenliste-Daten speichern | #Ziel - - L Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Dyn.Error.BLKMov // Error bei Block kopieren - BEC - - L Weiche.Weichen_Typ // Weichentyp = 1280 (HM-Weiche 2fach_Plus) - L 1280 // Dieser Aufruf-FB ? - ==I // Ja ! - JC en06_Mig - - SET - S Dyn.Error.Undef_Weiche // undefinierte Weiche - - L 0 // Weiche ungültig ! - T Weiche.Weichen_Nr // Nummer der Weiche - - BEU - -en06_Mig: NOP 0 - - ---- NW 6: - --- - AN Dyn.Status.Reset_aktiv - JC En06 - - SET - S Antrieb_Weiche_vor - S Antrieb_Weiche_gerade_vor // Antrieb gerade einschalten - S Antrieb_Weiche_abzweig_vor // Antrieb abzweig einschalten - - AN Antrieb_Weiche_aktiv - ON "1s-Impuls" - JC En06 - - L Dyn.Leer_Zeit // Zeit für LeerCheck [1s] - + +1 - T Dyn.Leer_Zeit // Zeit für LeerCheck [1s] - - L Weiche.Wartezeit_bis_Weiche_leer // Leer-Zeit erreicht ? - I // Ja ! - R Dyn.Error.Err_Schleusen_DL // Schleusen-Datenliste fehlerhaft - R Dyn.Error."Err_Undef_Schleuse-1" // undefinierte Schleuse-1 - JC En08 - -CALL FC "DatenOut" (SSDB:=Para.Schleusen_DL_DB, SSDW:=Para.Schleusen_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196") - - L "MB199" - T Dyn.Rueckmld.RET_VAL_DL_Schleusen // Rückmeldung bei Datenbank-Zugriff (Weichen-DL) - - JBI W_Ok - - A "M199.0" - = Dyn.Error.Err_Schleusen_DL // Schleusen-Datenliste fehlerhaft - BEC - - SET - S Dyn.Error."Err_Undef_Schleuse-1" // undefinierte Schleuse-1 - - BEU - -W_Ok: L "MW224" // Rein-FIFO-DB - T SAVE.Schleusen_DB // Weichen-FIFO-DB - L 0 // sinnvoller Wert ? - <=I // Nein ! - S Dyn.Error."Err_Undef_Schleuse-1" // undefinierte Schleuse-1 - BEC - - L "MW226" // Schleuse -1 - T SAVE."Schleuse-1_DW" - -En08: NOP 0 - - ---- NW 8: - --- -// Antrieb zusätzlich starten: - A ErrQuit // Überwachungszeit abgelaufen quittieren - S Antrieb_Weiche_vor // Weichenantrieb starten - S Antrieb_Weiche_gerade_vor // Antrieb gerade einschalten - S Antrieb_Weiche_abzweig_vor // Antrieb abzweig einschalten - - AN ErrQuit - AN Keine_Einfahrt - JC En08_Mig - -// Störungen löschen: - SET - R Dyn.Error.Ziel_undefiniert - R Dyn.Error.Err_Schleusen_DL - R Dyn.Error."Err_Undef_Schleuse-1" - R Dyn.Error."Übzeit_Gerade" - R Dyn.Error."Übzeit_Abzweig" - R Dyn.Error.Gerade_Sensor_aktiv - R Dyn.Error.Abzweig_Sensor_aktiv - R Dyn.Error.Gerade_Bereich_belegt - R Dyn.Error.Abzweig_Bereich_belegt - -// Kann nur über Reset zurückgesetzt werden: -// / R #Dyn.Error.Weichen_DL -// / R #Dyn.Error.Undef_Weiche -// / R #Dyn.Error.BLKMov -// / R #Dyn.Error."Undef_Bereich+1" -// / R #Dyn.Error.Frei04 -// / R #Dyn.Error.Frei05 -// / R #Dyn.Error.Reset_aktiv//Reset ist aktiv - -En08_Mig: NOP 0 - - ---- NW 9: Einfahrt angemeldet/reserviert ? --- - A Keine_Einfahrt // Also keine Schleuse -1 aktiv - AN Dyn.Status.Warten_auf_Mindestzeit - O Dyn.Error.Err_Schleusen_DL // Schleusen-Datenliste fehlerhaft - O Dyn.Error."Err_Undef_Schleuse-1" // undefinierte Schleuse-1 - JCN Schalt // Negierter Sprung! - -// Einsprung löschen: - L 0 - T SAVE.Schleusen_DB - T SAVE."Schleuse-1_DW" - -// Weichendaten löschen: - L DINT#0 - T Dyn.TrolleyID - L 0 - T Dyn.Weichen_Ziel - T Dyn.Zwischen_Ziel - T Dyn.FahrKontrolle.Akt_Mindestzeitzeit - T Dyn.FahrKontrolle."Akt_Überwachungszeit" - - SET - R Dyn.Status.Kein_StartOk - R Dyn.Status.MindestZeit_ok - R Dyn.Status.Ziel_erreicht - R Dyn.Status.Weiche_geradeaus - R Dyn.Status.Weiche_abzweigen - - JU Ret // Weichen-Checkerei überspringen - - ---- NW 10: Weiche aufgrund vom Weichen-Ziel checken --- -// Ziel-Check für Kontrolle: -Schalt: L Dyn.Weichen_Ziel - L Weiche.Abzweig.Ziel // Abzweig-Ziel? - ==I // Ja! - = Abzweig_Ziel - - CAC - L Weiche.Gerade.Ziel // Gerade-Ziel? - ==I // Ja! - = Gerade_Ziel - -// Sind noch Teile im Weichenbereich?: - L SAVE."Schleuse-1_DW" - ITD - T AR1Start // Startwert mit Offset 0 - - L AR1Start // Startwert mit Offset 0 - + DINT#162 - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[SAVE.Schleusen_DB] // FABE+ -DB öffnen - - L DBW [AR1Zeiger] // Raus-Trolleys von Schleuse-1 (DBW162) - L 0 // Teile vorhanden? - >I // JA ! - = Weichen_Trolleys - -// Evtl. Weiche umschalten: - A Weichen_Trolleys // Trolleys im Weichenbereich! - A( - O Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten - O Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten - ) - JC en10 - - A Dyn.Status.MindestZeit_ok - R Dyn.Status.Warten_auf_Mindestzeit - - A Dyn.Status.Warten_auf_Mindestzeit - JC en10 - - A Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten - O Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten - O Dyn.Status.Warten_auf_Mindestzeit - R Dyn.Error.Ziel_undefiniert - R Dyn.Error.Gerade_Sensor_aktiv - R Dyn.Error.Abzweig_Sensor_aktiv - R Dyn.Error.Gerade_Bereich_belegt - R Dyn.Error.Abzweig_Bereich_belegt - JC en10 - - AN Fahren_Ok - = Dyn.Status.Kein_StartOk - JC Ret - -// Ziel-Check zum Schalten: - L Dyn.Weichen_Ziel - L 0 - ==I - S Dyn.Error.Ziel_undefiniert - JC New - - CAC - L Weiche.Abzweig.Ziel // Abzweig-Ziel? - ==I // Ja! - JC Abzweigen - - CAC - L Weiche.Gerade.Ziel // Gerade-Ziel? - ==I // Ja! - JC Gerade - - SET - S Dyn.Error.Ziel_undefiniert - - JU New - -Gerade: NOP 0 -// Gerade-Fahrt gewünscht************************************************** -// Ziel-Sensor-Check: - A B_Ziel_gerade - = Dyn.Error.Gerade_Sensor_aktiv - A Dyn.Error.Gerade_Sensor_aktiv // Muss erst quittiert werden! - JC New - -// Trolley geradeaus fahren: - SET - S Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten - R Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten - S Dyn.Status.Warten_auf_Mindestzeit - -// Zeiten speichern: - L Weiche.Gerade.Mindestzeit // Nach dieser Zeit kann Trolley erst aus Weiche sein - T Dyn.FahrKontrolle.Para_Mindestzeit - L Weiche.Gerade."Überwachungszeit" // Nach dieser Zeit muss Trolley Zielbereich erreicht haben - T Dyn.FahrKontrolle."Para_Überwachungszeit" - - JU en10 - -Abzweigen: NOP 0 -// Abzweig-Fahrt gewünscht************************************************** -// Ziel-Sensor-Check: - A B_Ziel_abzweig - = Dyn.Error.Abzweig_Sensor_aktiv - A Dyn.Error.Abzweig_Sensor_aktiv // Muss erst quittiert werden! - JC New - -// Trolly abzweigen fahren: - SET - S Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten - R Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten - S Dyn.Status.Warten_auf_Mindestzeit - -// Zeiten speichern: - L Weiche.Abzweig.Mindestzeit // Nach dieser Zeit kann Trolley erst aus Weiche sein - T Dyn.FahrKontrolle.Para_Mindestzeit - L Weiche.Abzweig."Überwachungszeit" // Nach dieser Zeit muss Trolley Zielbereich erreicht haben - T Dyn.FahrKontrolle."Para_Überwachungszeit" - - JU en10 - -New: AN ErrQuit - JC en10 - - L 0 // Reservierung löschen - T Dyn."Schleuse -1" - -en10: NOP 0 - - ---- NW 11: Mindestzeit / Überwachungszeit --- - A Gerade_Ziel - A( - ON Y_Weiche_gerade - ON Antrieb_Gerade_aktiv - ) - O - A Abzweig_Ziel - A( - ON Y_Weiche_abzweig - ON Antrieb_Abzweig_aktiv - ) - JC W011 - -// Mindestzeit neu triggern: (von Schleuse -1) - A Dyn.Status.MindestZeit_nachtriggern - R Dyn.Status.MindestZeit_nachtriggern - S Dyn.Status.Warten_auf_Mindestzeit - JCN X011 // Negierter Sprung - -W011: L 0 - T Dyn.FahrKontrolle.Akt_Mindestzeitzeit - - JU y011 - -// Zeiten aufaddieren: -X011: AN "1s-Impuls" // 1s-Impuls - ON Antrieb_Weiche_aktiv - JC X08E - - L Dyn.FahrKontrolle.Akt_Mindestzeitzeit - + 1 - T Dyn.FahrKontrolle.Akt_Mindestzeitzeit - -y011: L Dyn.FahrKontrolle.Akt_Mindestzeitzeit - L Dyn.FahrKontrolle.Para_Mindestzeit - >=I - = Dyn.Status.MindestZeit_ok - JCN X080 - - T Dyn.FahrKontrolle.Akt_Mindestzeitzeit - -X080: A Dyn.Error."Übzeit_Gerade" - O Dyn.Error."Übzeit_Abzweig" - ON "1s-Impuls" // 1s-Impuls - ON Antrieb_Weiche_aktiv - JC X08E - - L Dyn.FahrKontrolle."Akt_Überwachungszeit" - + 1 - T Dyn.FahrKontrolle."Akt_Überwachungszeit" - - L Dyn.FahrKontrolle."Para_Überwachungszeit" - 1 + Weiche_abzweigen { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Weiche auf Abzweig schalten + Weiche_geradeaus { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Weiche auf Gerade schalten + MindestZeit_ok { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Mindestzeit für Weichendurchfahrt erreicht? + Ziel_erreicht { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Ziel erreicht + Frei06 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + Weiche_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Weiche ist aktiv + Auto_akt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + Hand_akt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + Bereich_ok { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + MindestZeit_nachtriggern { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Mindestzeit nachtriggern (von Schleuse -1) + Warten_auf_Mindestzeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Mindestzeit noch nicht abgelaufen + Res15 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + Error_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Störung vorhanden + Reset_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool := TRUE; // Reset aktiv + END_STRUCT; + TrolleyID { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-Nr (Eintrag Schleuse, Austrag Weiche) + Weichen_Ziel { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Weichen-Ziel (Eintrag Schleuse, Austrag Weiche) + "Schleuse -1" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Schleuse, woher Ziel kam + Zwischen_Ziel : Word; // Zwischen-Ziel + HMI : Struct + TrolleyID_Weiche { ExternalWritable := 'False'} : DInt; // Trolley-Nr im Weichenbereich (IN:PLC, OUT:PLC) + WeichenZiel { ExternalWritable := 'False'} : DInt; // Ziel im Weichenbereich (IN:PLC, OUT:PLC) + Weiche_resetten : Bool; // Weiche resetten (IN:HMI, Out:PLC) + END_STRUCT; + Rueckmld { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + RET_VAL_BLKMOV_Weiche { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Rückmeldung nach BLKMOV-Aufruf + RET_VAL_DL_Weichen { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf + RET_VAL_DL_Schleusen { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf + END_STRUCT; + Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "UErrOmniWeiche_2fach"; + FahrKontrolle { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Para_Mindestzeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // BM erst nach dieser Zeit im Ziel + Para_Überwachungszeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // BM nach dieser Zeit in Weiche verklemmt + Akt_Mindestzeitzeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // BM erst nach dieser Zeit im Ziel + Akt_Überwachungszeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // BM nach dieser Zeit in Weiche verklemmt + END_STRUCT; + Leer_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Lager ist frei [1s] + Schalttakte { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Anzahl der getätigten Umschaltungen + Frei200 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..44] of Int; + END_STRUCT; + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Parameter : Word; // Parameter + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + "Bereich+1ID" : Int; + "Bereich+1_DB" : Int; + Keine_Einfahrt : Bool; // Keine Einfahrt angemeldet + "Err_Bereich+1" : Bool; + Weichen_Trolleys : Bool; // Weichen-Trolleys vorhanden + ZielSensor_aktiv : Bool; + Abzweig_Ziel : Bool; + Gerade_Ziel : Bool; + Antriebe_ein : Bool; + END_VAR + + +BEGIN +NETWORK +TITLE = Parameter-Übergabe + L #Weichen_Nr ;//Aufruf-Parameter (für Baustein beobachten) + + L 279 ;//Einsprung Weichen-DL + T #Para.Weichen_DL_DB;//vor Aufruf übergeben! + L 0; + T #Para.Weichen_DL_DW; + + L 274 ;//Einsprung Schleuse-DL + T #Para.Schleusen_DL_DB;//vor Aufruf übergeben! + L 0; + T #Para.Schleusen_DL_DW; + + SET; + R #ZielSensor_aktiv ;//Temp + R #Weichen_Trolleys; + R #Antriebe_ein; + R #Abzweig_Ziel; + R #Gerade_Ziel; + +NETWORK +TITLE = Gesamt: Out-Bits zum Zurücksetzen + L #Weichen_Nr; + + SET; +// R #Y_Weiche_gerade //Wegen Reset +// R #Y_Weiche_abzweig //Wegen Reset + + SET;//Erst mal + R #Dyn.Status.Weiche_frei; + S #Dyn.Status.Weiche_aktiv; + +NETWORK +TITLE = HMI-Zeug + +//Von HMI: + U #Dyn.HMI.Weiche_resetten; + R #Dyn.HMI.Weiche_resetten;//von HMI + S #Dyn.Status.Reset_aktiv; + SPBN HMI1; + + L 0; + T #Dyn.Leer_Zeit;//da kein Sk + T #Dyn.FahrKontrolle.Akt_Mindestzeitzeit; + T #Dyn.FahrKontrolle.Akt_Überwachungszeit; + + SET; + R #Dyn.Error.Übzeit_Gerade; + R #Dyn.Error.Übzeit_Abzweig; + +//An HMI: +HMI1: L #Dyn.TrolleyID; + T #Dyn.HMI.TrolleyID_Weiche; + + L #Dyn.Weichen_Ziel; + T #Dyn.HMI.WeichenZiel; + +NETWORK +TITLE = Störungen nach Außen übergeben + L 0; + T "MB200"; + + U #Dyn.Error.Weichen_DL;//Weichen-Datenliste fehlerhaft + = "M200.0"; + U #Dyn.Error.Undef_Weiche;//undefinierte Weiche + = "M200.1"; + U #Dyn.Error.BLKMov;//Fehler bei Block kopieren + = "M200.2"; + U #Dyn.Error."Undef_Bereich+1"; + = "M200.3"; + U #Dyn.Error.Frei04; + = "M200.4"; + U #Dyn.Error.Frei05; + = "M200.5"; + U #Dyn.Error.Ziel_undefiniert; + = "M200.6"; + U #Dyn.Error.Err_Schleusen_DL; + = "M200.7"; + U #Dyn.Error."Err_Undef_Schleuse-1"; + = "M201.0"; + U #Dyn.Error.Übzeit_Gerade;//BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) + = "M201.1"; + U #Dyn.Error.Übzeit_Abzweig;//BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen) + = "M201.2"; + U #Dyn.Error.Gerade_Sensor_aktiv; + = "M201.3"; + U #Dyn.Error.Abzweig_Sensor_aktiv; + = "M201.4"; + U #Dyn.Error.Gerade_Bereich_belegt; + = "M201.5"; + U #Dyn.Error.Abzweig_Bereich_belegt; + = "M201.6"; + U #Dyn.Status.Reset_aktiv; + = #Dyn.Error.Reset_aktiv; + = "M201.7"; + + L "MW200"; + T #Error;//Schnittstelle nach Außen + +//Störung vorhanden: + L 0; + <>I;//Ja ! + = #Dyn.Status.Error_aktiv; + +//Anzeige Start n. Störung aktivieren: + U #Dyn.Error.Übzeit_Gerade;//BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) + O #Dyn.Error.Übzeit_Abzweig;//BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen) + S #hStOk; + +NETWORK +TITLE = Statische Weichen-Parameter holen + L #Weiche.Weichen_Nr;//Nummer der Weiche + L #Weichen_Nr;//Aufruf-Parameter + ==I;//Identisch ? + R #Dyn.Error.Weichen_DL;//Weichendatenbank fehlerhaft + R #Dyn.Error.Undef_Weiche;//undefinierte Weiche + SPB en06_Mig;//Ja ! + + T "MW200";//Search-Daten + + CALL "DatenOut" + ( SSDB := #Para.Weichen_DL_DB , + SSDW := #Para.Weichen_DL_DW , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := "MW196" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_DL_Weichen;//Rückmeldung bei Datenbank-Zugriff (Gefälle-DL) + + SPBI G_Ok; + + U "M199.0"; + = #Dyn.Error.Weichen_DL;//Weichendatenbank fehlerhaft + BEB; + + SET; + S #Dyn.Error.Undef_Weiche;//undefinierte Weiche + + BEA; + +//Kennung + Datenbytes +G_Ok: SET; + R #Dyn.Error.Weichen_DL;//Weichendatenbank fehlerhaft + R #Dyn.Error.Undef_Weiche;//undefinierte Weiche + + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 40;//Datenwords speichern + T %LW2;//Wiederholungen + +//Quelle-Pointer erzeugen: + L 0;//Bei Merker = 0 ! + T %LW4;//DB_Nummer + L 220;//Adresse + SLD 3; + L 16#8300_0000;//Kennung: Merker + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche , + DSTBLK := #Weiche //#Ziel + ); + + L #Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Dyn.Error.BLKMov;//Error bei Block kopieren + BEB; + + L #Weiche.Weichen_Typ;//Weichentyp = 1280 (HM-Weiche 2fach_Plus) + L 1280 ;//Dieser Aufruf-FB ? + ==I;//Ja ! + SPB en06_Mig; + + SET; + S #Dyn.Error.Undef_Weiche;//undefinierte Weiche + + L 0;//Weiche ungültig ! + T #Weiche.Weichen_Nr;//Nummer der Weiche + + BEA; + +en06_Mig: NOP 0; + +NETWORK +TITLE = Reset +// +// + UN #Dyn.Status.Reset_aktiv; + SPB En06; + + SET; + S #Antrieb_Weiche_vor; + S #Antrieb_Weiche_gerade_vor ;//Antrieb gerade einschalten + S #Antrieb_Weiche_abzweig_vor;//Antrieb abzweig einschalten + + UN #Antrieb_Weiche_aktiv; + ON "1s-Impuls"; + SPB En06; + + L #Dyn.Leer_Zeit ;//Zeit für LeerCheck [1s] + + +1; + T #Dyn.Leer_Zeit ;//Zeit für LeerCheck [1s] + + L #Weiche.Wartezeit_bis_Weiche_leer;//Leer-Zeit erreicht ? + I;//Ja ! + R #Dyn.Error.Err_Schleusen_DL;//Schleusen-Datenliste fehlerhaft + R #Dyn.Error."Err_Undef_Schleuse-1";//undefinierte Schleuse-1 + SPB En08; + + CALL "DatenOut" + ( SSDB := #Para.Schleusen_DL_DB , + SSDW := #Para.Schleusen_DL_DW , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := "MW196" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_DL_Schleusen;//Rückmeldung bei Datenbank-Zugriff (Weichen-DL) + + SPBI W_Ok; + + U "M199.0"; + = #Dyn.Error.Err_Schleusen_DL;//Schleusen-Datenliste fehlerhaft + BEB; + + SET; + S #Dyn.Error."Err_Undef_Schleuse-1";//undefinierte Schleuse-1 + + BEA; + +W_Ok: L "MW224" ;//Rein-FIFO-DB + T #SAVE.Schleusen_DB;//Weichen-FIFO-DB + L 0;//sinnvoller Wert ? + <=I;//Nein ! + S #Dyn.Error."Err_Undef_Schleuse-1";//undefinierte Schleuse-1 + BEB; + + L "MW226" ;//Schleuse -1 + T #SAVE."Schleuse-1_DW"; + +En08: NOP 0; + +NETWORK +TITLE = Störungen quittieren +// +// + +//Antrieb zusätzlich starten: + U #ErrQuit ;//Überwachungszeit abgelaufen quittieren + S #Antrieb_Weiche_vor;//Weichenantrieb starten + S #Antrieb_Weiche_gerade_vor ;//Antrieb gerade einschalten + S #Antrieb_Weiche_abzweig_vor;//Antrieb abzweig einschalten + + UN #ErrQuit; + UN #Keine_Einfahrt; + SPB En08_Mig; + +//Störungen löschen: + SET; + R #Dyn.Error.Ziel_undefiniert; + R #Dyn.Error.Err_Schleusen_DL; + R #Dyn.Error."Err_Undef_Schleuse-1"; + R #Dyn.Error.Übzeit_Gerade; + R #Dyn.Error.Übzeit_Abzweig; + R #Dyn.Error.Gerade_Sensor_aktiv; + R #Dyn.Error.Abzweig_Sensor_aktiv; + R #Dyn.Error.Gerade_Bereich_belegt; + R #Dyn.Error.Abzweig_Bereich_belegt; + +//Kann nur über Reset zurückgesetzt werden: +/// R #Dyn.Error.Weichen_DL +/// R #Dyn.Error.Undef_Weiche +/// R #Dyn.Error.BLKMov +/// R #Dyn.Error."Undef_Bereich+1" +/// R #Dyn.Error.Frei04 +/// R #Dyn.Error.Frei05 +/// R #Dyn.Error.Reset_aktiv//Reset ist aktiv + +En08_Mig: NOP 0; + +NETWORK +TITLE = Einfahrt angemeldet/reserviert ? + U #Keine_Einfahrt ;//Also keine Schleuse -1 aktiv + UN #Dyn.Status.Warten_auf_Mindestzeit; + O #Dyn.Error.Err_Schleusen_DL;//Schleusen-Datenliste fehlerhaft + O #Dyn.Error."Err_Undef_Schleuse-1";//undefinierte Schleuse-1 + SPBN Schalt ;//Negierter Sprung! + +//Einsprung löschen: + L 0; + T #SAVE.Schleusen_DB; + T #SAVE."Schleuse-1_DW"; + +//Weichendaten löschen: + L DINT#0; + T #Dyn.TrolleyID; + L 0; + T #Dyn.Weichen_Ziel; + T #Dyn.Zwischen_Ziel; + T #Dyn.FahrKontrolle.Akt_Mindestzeitzeit; + T #Dyn.FahrKontrolle.Akt_Überwachungszeit; + + SET; + R #Dyn.Status.Kein_StartOk; + R #Dyn.Status.MindestZeit_ok; + R #Dyn.Status.Ziel_erreicht; + R #Dyn.Status.Weiche_geradeaus; + R #Dyn.Status.Weiche_abzweigen; + + SPA Ret ;//Weichen-Checkerei überspringen + +NETWORK +TITLE = Weiche aufgrund vom Weichen-Ziel checken + +//Ziel-Check für Kontrolle: +Schalt: L #Dyn.Weichen_Ziel; + L #Weiche.Abzweig.Ziel;//Abzweig-Ziel? + ==I;//Ja! + = #Abzweig_Ziel; + + TAK; + L #Weiche.Gerade.Ziel ;//Gerade-Ziel? + ==I;//Ja! + = #Gerade_Ziel; + +//Sind noch Teile im Weichenbereich?: + L #SAVE."Schleuse-1_DW"; + ITD; + T #AR1Start;//Startwert mit Offset 0 + + L #AR1Start;//Startwert mit Offset 0 + + DINT#162; + SLD 3; + T #AR1Zeiger ;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #SAVE.Schleusen_DB];//FABE+ -DB öffnen + + L DBW[ #AR1Zeiger] ;//Raus-Trolleys von Schleuse-1 (DBW162) + L 0 ;//Teile vorhanden? + >I ;//JA ! + = #Weichen_Trolleys; + +//Evtl. Weiche umschalten: + U #Weichen_Trolleys ;//Trolleys im Weichenbereich! + U(; + O #Dyn.Status.Weiche_geradeaus;//Weiche auf Gerade schalten + O #Dyn.Status.Weiche_abzweigen;//Weiche auf Abzweig schalten + ); + SPB en10; + + U #Dyn.Status.MindestZeit_ok; + R #Dyn.Status.Warten_auf_Mindestzeit; + + U #Dyn.Status.Warten_auf_Mindestzeit; + SPB en10; + + U #Dyn.Status.Weiche_abzweigen;//Weiche auf Abzweig schalten + O #Dyn.Status.Weiche_geradeaus;//Weiche auf Gerade schalten + O #Dyn.Status.Warten_auf_Mindestzeit; + R #Dyn.Error.Ziel_undefiniert; + R #Dyn.Error.Gerade_Sensor_aktiv; + R #Dyn.Error.Abzweig_Sensor_aktiv; + R #Dyn.Error.Gerade_Bereich_belegt; + R #Dyn.Error.Abzweig_Bereich_belegt; + SPB en10; + + UN #Fahren_Ok; + = #Dyn.Status.Kein_StartOk; + SPB Ret; + +//Ziel-Check zum Schalten: + L #Dyn.Weichen_Ziel; + L 0; + ==I; + S #Dyn.Error.Ziel_undefiniert; + SPB New; + + TAK; + L #Weiche.Abzweig.Ziel;//Abzweig-Ziel? + ==I;//Ja! + SPB Abzweigen; + + TAK; + L #Weiche.Gerade.Ziel ;//Gerade-Ziel? + ==I;//Ja! + SPB Gerade; + + SET; + S #Dyn.Error.Ziel_undefiniert; + + SPA New; + +Gerade: NOP 0; +//Gerade-Fahrt gewünscht************************************************** +//Ziel-Sensor-Check: + U #B_Ziel_gerade; + = #Dyn.Error.Gerade_Sensor_aktiv; + U #Dyn.Error.Gerade_Sensor_aktiv;//Muss erst quittiert werden! + SPB New; + +//Trolley geradeaus fahren: + SET; + S #Dyn.Status.Weiche_geradeaus;//Weiche auf Gerade schalten + R #Dyn.Status.Weiche_abzweigen;//Weiche auf Abzweig schalten + S #Dyn.Status.Warten_auf_Mindestzeit; + +//Zeiten speichern: + L #Weiche.Gerade.Mindestzeit;//Nach dieser Zeit kann Trolley erst aus Weiche sein + T #Dyn.FahrKontrolle.Para_Mindestzeit; + L #Weiche.Gerade.Überwachungszeit;//Nach dieser Zeit muss Trolley Zielbereich erreicht haben + T #Dyn.FahrKontrolle.Para_Überwachungszeit; + + SPA en10; + +Abzweigen: NOP 0; +//Abzweig-Fahrt gewünscht************************************************** +//Ziel-Sensor-Check: + U #B_Ziel_abzweig; + = #Dyn.Error.Abzweig_Sensor_aktiv; + U #Dyn.Error.Abzweig_Sensor_aktiv;//Muss erst quittiert werden! + SPB New; + +//Trolly abzweigen fahren: + SET; + S #Dyn.Status.Weiche_abzweigen;//Weiche auf Abzweig schalten + R #Dyn.Status.Weiche_geradeaus;//Weiche auf Gerade schalten + S #Dyn.Status.Warten_auf_Mindestzeit; + +//Zeiten speichern: + L #Weiche.Abzweig.Mindestzeit;//Nach dieser Zeit kann Trolley erst aus Weiche sein + T #Dyn.FahrKontrolle.Para_Mindestzeit; + L #Weiche.Abzweig.Überwachungszeit;//Nach dieser Zeit muss Trolley Zielbereich erreicht haben + T #Dyn.FahrKontrolle.Para_Überwachungszeit; + + SPA en10; + +New: UN #ErrQuit; + SPB en10; + + L 0 ;//Reservierung löschen + T #Dyn."Schleuse -1"; + +en10: NOP 0; + +NETWORK +TITLE = Mindestzeit / Überwachungszeit + U #Gerade_Ziel; + U(; + ON #Y_Weiche_gerade; + ON #Antrieb_Gerade_aktiv; + ); + O; + U #Abzweig_Ziel; + U(; + ON #Y_Weiche_abzweig; + ON #Antrieb_Abzweig_aktiv; + ); + SPB W011; + +//Mindestzeit neu triggern: (von Schleuse -1) + U #Dyn.Status.MindestZeit_nachtriggern; + R #Dyn.Status.MindestZeit_nachtriggern; + S #Dyn.Status.Warten_auf_Mindestzeit; + SPBN X011 ;//Negierter Sprung + +W011: L 0; + T #Dyn.FahrKontrolle.Akt_Mindestzeitzeit; + + SPA y011; + +//Zeiten aufaddieren: +X011: UN "1s-Impuls" ;//1s-Impuls + ON #Antrieb_Weiche_aktiv; + SPB X08E; + + L #Dyn.FahrKontrolle.Akt_Mindestzeitzeit; + + 1; + T #Dyn.FahrKontrolle.Akt_Mindestzeitzeit; + +y011: L #Dyn.FahrKontrolle.Akt_Mindestzeitzeit; + L #Dyn.FahrKontrolle.Para_Mindestzeit; + >=I; + = #Dyn.Status.MindestZeit_ok; + SPBN X080; + + T #Dyn.FahrKontrolle.Akt_Mindestzeitzeit; + +X080: U #Dyn.Error.Übzeit_Gerade; + O #Dyn.Error.Übzeit_Abzweig; + ON "1s-Impuls" ;//1s-Impuls + ON #Antrieb_Weiche_aktiv; + SPB X08E; + + L #Dyn.FahrKontrolle.Akt_Überwachungszeit; + + 1; + T #Dyn.FahrKontrolle.Akt_Überwachungszeit; + + L #Dyn.FahrKontrolle.Para_Überwachungszeit; + Inilauf gestartet - Puffer_nicht_leer_IN : Bool // Puffer oben nicht leer > Inilauf gestartet - Puffer_initialisieren_IN : Bool // VollPuffer oben initialisieren - MindestZeit_ok_IN : Bool // Schleuse ist MindestZeit geöffnet - Frei11 : Bool - Frei12 : Bool - Frei13 : Bool - Alles_ausfahren_OUT : Bool // Alle Trolleys ausfahren - Eintrag_DL_Leerliste_erfolgt : Bool // Eintrag in DLVPPuffer_leer (DB100) erfolgt - Eintrag_DL_Reinliste_erfolgt : Bool // Eintrag in DLVPPuffer_ShopGroup rein (DB101) erfolgt - Eintrag_DL_Abrufliste_erfolgt : Bool // Eintrag in DLVPPuffer_ShopGroup raus (DB901) erfolgt - Puffer : "UDLHMVollPuffer" // Statische VollPufferdaten (aus DL) - Dyn : Struct // Dynamische Daten - Status : Struct - Puffer_leer_OUT : Bool // Puffer oben ist leer - Puffer_hat Platz_OUT : Bool // Puffer oben hat noch Kapazität - Kein_neuer_Trolley_kommt_OUT : Bool // Puffer unten zeitlang ohne neuen Trolley - Leer_Check_OUT : Bool // VollPuffer unten wird auf leer gecheckt - Reset_aktiv_OUT : Bool // Reset unten aktiv - Trolley_nicht_in_Schleuse_OUT : Bool // Trolley unten fährt nicht in Schleuse > Inilauf gestartet - Puffer_nicht_leer_OUT : Bool // Puffer unten nicht leer > Inilauf gestartet - Puffer_initialisieren_OUT : Bool // VollPuffer unten initialisieren - MindestZeit_ok_OUT : Bool // Schleuse ist MindestZeit geöffnet - Undef.Trolley_in_Schleuse_OUT : Bool // Undefinierter Trolley in Schleuse unten erkannt - Trolley_wartet_Auftrag : Bool // Trolley wartet auf Auftrag (unten) - Trolley_wartet_Bereich+1 : Bool // Trolley wartet auf Bereich +1 (unten) - Einen_VollTrolley_ausfahren_OUT : Bool // Einen Voll-Trolley ausfahren - Trolley_fährt_aus_OUT : Bool // Trolley fährt aus (unten) - Trolley_draussen_Out : Bool // Trolley ist ausgefahren - Error_aktiv : Bool // Störung vorhanden - TrolleyID_Einfahrt : DInt // Trolley-Nr ist eingefahren - TrolleyID_Schleuse_IN : DInt // Trolley-Nr in Schleuse oben (Daten) - TrolleyID_Schleuse_Out : DInt // Trolley-Nr in Schleuse unten (Daten) - ShopGroup_IN : DInt // Diese Shopgruppe ist im oberen VollPuffer - ShopGroup_OUT : DInt // Diese Shopgruppe ist im unteren VollPuffer - ShopGroup_Auftrag_zum_Ausfahren : DInt // ShopGroup zum Ausfahren (FFFF = akt.Trolley ausfahren) - HMI : Struct - ShopGroup_IN : Int // ShopGroup im VollPuffer oben (IN:PLC, OUT:PLC) - ShopGroup_OUT : Int // ShopGroup im VollPuffer unten (IN:PLC, OUT:PLC) - Voll_Trolleys_IN : Int // Anzahl Trolleys oben (IN:PLC, OUT:PLC) - Voll_Trolleys_OUT : Int // Anzahl Trolleys unten (IN:PLC, OUT:PLC) - Res_Trolleys_IN : Int // Anzahl reservierte Trolleys oben (IN:PLC, OUT:PLC) - Frei_Plätze_IN : Int // Freiplätze für Trolleys (IN:PLC, OUT:PLC) - TrolleyID_Schleuse_IN : DInt // Trolley-Nr in Schleuse oben (IN:PLC, OUT:PLC) - TrolleyID_Schleuse_OUT : DInt // Trolley-Nr in Schleuse unten (IN:PLC, OUT:PLC) - Schleuse_resetten_IN : Bool // Schleuse resetten oben (IN:HMI, Out:PLC) - Schleuse_resetten_OUT : Bool // Schleuse resetten unten (IN:HMI, Out:PLC) - Puffer_initialisieren : Bool := 1 // VollPuffer initialisieren (IN:HMI, Out:PLC) - Einlagern_gesperrt : Bool // Einlagern gesperrt (IN:HMI, OUT:HMI) - AusLagern_gesperrt : Bool // AusLagern gesperrt (IN:HMI, OUT:HMI) - Sk_IN : "USk_Omni" // Status der Schrittkette Schleuse IN (oben) - Sk_OUT : "USk_Omni" // Status der Schrittkette Schleuse OUT (unten) - TrolleyID_doppelt : DInt // TrolleyID doppelt (eingefahrener Trolley) - TrolleyID_unbekannt_Einfahrt : DInt // TrolleyID unbekannt (eingefahrener Trolley) - TrolleyID_unbekannt_Schleuse_OUT : DInt // TrolleyID unbekannt (Trolley in Schleuse unten) - Rueckmld : Struct - RET_VAL_BLKMOV_VollPuffer : Int // Rückmeldung nach BLKMOV-Aufruf - RET_VAL_DL_VollPuffer : Byte // Rückmeldung nach DatenOut-Aufruf - RET_VAL_DL_Res_OUT : Byte // Rückmeldung nach DatenOut-Aufruf - RET_VAL_DL_VollPufferTrolley_IN : Byte // Rückmeldung nach DatenIN-Aufruf - RET_VAL_DL_VollPufferTrolley_OUT : Byte // Rückmeldung nach DatenOut-Aufruf - Error : "UErrHMVollpuffer" - Stau_Zeit : Int // Sensor B_Einfahrt ist belegt [1s] - Mindest_Zeit_IN : Int // Sensor B_in_Schleuse oben ist frei [1s] - Mindest_Zeit_OUT : Int // Sensor B_in_Schleuse unten ist frei [1s] - Leer_Zeit_IN : Int // Puffer oben ist frei [1s] - Leer_Zeit_OUT : Int // Puffer unten ist frei [1s] - Stop_Ursache_IN : Word // Stop-Stelle: Nw + Position - Stop_Ursache_OUT : Word // Stop-Stelle: Nw + Position - Vereinzelungstakte_OUT : DInt // Anzahl der getätigten Vereinzelungstakte - TrolleyID_ausgefahren : DInt // TrolleyID des ausgefahrenen Trolleys - ShopGroup_EFL_Gespeichert : DInt // In EinfahrListe gespeicherte ShopGroup - ShopGroup_AFL_Gespeichert : DInt // In AusfahrListe gespeicherte ShopGroup - Reservierungs_DL : Struct // AB DW200: Liste der resevierter Trolleys - Datenlistenkopf : Struct - KOPF : Word := WORD#16#DA04 // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128) - LAENGE : Int := 12 // Länge der Datenliste (maximale Anzahl der Datensätze) - STAMMDATEN : Int := 2 // Stammdatenlänge in Word (1 - 9) - INDDB : Int // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) - LAENGEINDDB : Int // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!) - INDDATEN_WANDEL_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) - LETZTERZUGRIFF : Int // Speicherung des letzten Zugriffs - Belegt14 : Int // reserviert von Sort-Datenliste - AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!) - Reserve18 : Int // Reserve - Res_Trolley : Array[1..12] of Struct // Reservierter Trolley für VollPuffer - Trolley_ID : DInt // Trolley_ID - ShopGroup : DInt // Shop-Gruppe auf Trolley - Endekennung : Word := WORD#16#DAEE // Datensort-Ende-Kennung (DBEE) - Res350 : Array[1..16] of Int - Trolley_DL_Einfahrt : Struct // AB DW350: Liste der Trolleys im VollPuffer - Datenlistenkopf : Struct - KOPF : Word := WORD#16#DA04 // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128) - LAENGE : Int := 12 // Länge der Datenliste (maximale Anzahl der Datensätze) - STAMMDATEN : Int := 2 // Stammdatenlänge in Word (1 - 9) - INDDB : Int // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) - LAENGEINDDB : Int // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!) - INDDATEN_WANDEL_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) - LETZTERZUGRIFF : Int // Speicherung des letzten Zugriffs - Belegt14 : Int // reserviert von Sort-Datenliste - AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!) - Reserve18 : Int // Reserve - VollPuffer_Trolley_IN : Array[1..12] of Struct // Trolley im VollPuffer - Trolley_ID : DInt // Trolley_ID - Abruf_ShopGroup : DInt // Reserviert für Ausfahrt - Endekennung : Word := WORD#16#DAEE // Datensort-Ende-Kennung (DBEE) - Res500 : Array[1..16] of Int - Trolley_DL_Ausfahrt : Struct // AB DW350: Liste der Trolleys im VollPuffer - Datenlistenkopf : Struct - KOPF : Word := WORD#16#DA04 // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128) - LAENGE : Int := 12 // Länge der Datenliste (maximale Anzahl der Datensätze) - STAMMDATEN : Int := 2 // Stammdatenlänge in Word (1 - 9) - INDDB : Int // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) - LAENGEINDDB : Int // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!) - INDDATEN_WANDEL_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) - LETZTERZUGRIFF : Int // Speicherung des letzten Zugriffs - Belegt14 : Int // reserviert von Sort-Datenliste - AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!) - Reserve18 : Int // Reserve - VollPuffer_Trolley_Out : Array[1..12] of Struct // Trolley im VollPuffer - Trolley_ID : DInt // Trolley_ID - Abruf_ShopGroup : DInt // Reserviert für Ausfahrt - Endekennung : Word := WORD#16#DAEE // Datensort-Ende-Kennung (DBEE) - Res700 : Array[1..41] of Int // Reserve - None: - VollPuffer_Nr : Int // Nummer der VollPuffer - Puffer_Typ : Int // VollPufferntyp = 276 (VollPuffer) - Puffer_Position : Word // VollPuffer-Position (für Gesamt-TrolleyDatenliste) - Puffer_Position_Inks : Int // VollPuffer-Position_Inks (für Ausfahrsteuerung) - None: - Reset : Bool := 1 - None: - Reset : Bool := 1 - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Ueb_akt : Bool // Überwachungszeit aktivieren - Weiter : Bool // Weiterschaltbedingung ist erfüllt - Warte_neu : Bool // Wartezeit neu triggern - Warte_stop : Bool // Wartezeit stoppen - 1.Trolley_IN : Bool - Neu_Trolley_in_Puffer_IN : Bool // Neuer Trolley in Puffer eingefahren - 1.Trolley_OUT : Bool - Inks_Ok : Bool // Starten aufgrund der Inks erlaubt - Puffer_IN_ist_leer : Bool // VollPuffer zeitlang ohne Sensor - Puffer_OUT_ist_leer : Bool // VollPuffer zeitlang ohne Sensor - Abruf_Trolley_vorne : Bool // Abruf-Trolley ist in Schleuse - Oberen_Puffer_Freigeben : Bool - Oberen_Puffer_nichts_einfahren : Bool - Puffer_B : Bool - GesamtAnzahl : Int - SSDW : Int - Schleife : Word // Loopzähler - Trolley : Int - Position : Int - Akive_ShopGroup : DInt - EndZiel : Word - ZwischenZiel : Word - ShopGroup : DInt - Standort : Word - Error_Check : Bool - Constant: - ---- NW 1: Parameter-Übergabe --- - L VollPuffer_Nr - - L 275 // Einsprung Puffer-DL - T Para.VollPuffer_DL_DB // vor Aufruf übergeben! - L 0 - T Para.VollPuffer_DL_DW - - ---- NW 2: Anzeige OP --- - L 252 // Bereichsstop aktiv - AN Dyn.Sk_OUT.Bereich_ok // Also: Bereichsstop / Not-Aus - JC w010 - - L 253 - AN Dyn.Sk_OUT.Auto_akt // Keine Betriebsart - AN Dyn.Sk_OUT.Hand_akt - JC w010 - - L 255 // Handbetrieb aktiv - A Dyn.Sk_OUT.Hand_akt - JC w010 - - L Dyn.Sk_IN.Akt_Schritt // Aktiver Schritt - T Dyn.Sk_IN.OP_Schritt - L Dyn.Sk_OUT.Akt_Schritt // Aktiver Schritt - T Dyn.Sk_OUT.OP_Schritt - - JU OP_Ok - -w010: T Dyn.Sk_IN.OP_Schritt - T Dyn.Sk_OUT.OP_Schritt - -OP_Ok: NOP 0 - - ---- NW 3: Out-Bits zum Zurücksetzen / Antrieb plus starten --- - SET - R Y_Schleuse_Auf_IN - R Y_Schleuse_Auf_OUT - R Puffer_IN_ist_leer - R Puffer_OUT_ist_leer - - SET // Jeden Zyklus neu - R Dyn.Status.Trolley_wartet_Auftrag - R Dyn.Status."Trolley_wartet_Bereich+1" - R Dyn.Status."Trolley_fährt_aus_OUT" - R Dyn.Status.Trolley_draussen_Out - R "1.Trolley_IN" - R "1.Trolley_OUT" - R Neu_Trolley_in_Puffer_IN - - A Dyn.Sk_IN.Reset - O Dyn.Sk_IN.Reset_Akt - = Status2.Reset_aktiv_IN - - A Dyn.Sk_OUT.Reset - O Dyn.Sk_OUT.Reset_Akt - = Dyn.Status.Reset_aktiv_OUT - - SET - R Inks_Ok - - A Dyn.Sk_OUT.Auto_akt - = Dyn.Sk_IN.Auto_akt - A Dyn.Sk_OUT.Bereich_ok - = Dyn.Sk_IN.Bereich_ok - -// Antrieb zusätlich starten: - A ErrQuit // Überwachungszeit abgelaufen quittieren - S Antrieb_plus_start // Kreisel-Antrieb plus starten - - ---- NW 4: HMI-Zeug --- -// Von HMI: - A Dyn.HMI.Schleuse_resetten_IN - R Dyn.HMI.Schleuse_resetten_IN - S Dyn.Sk_IN.Reset // SK zurücksetzen - - A Dyn.HMI.Schleuse_resetten_OUT - R Dyn.HMI.Schleuse_resetten_OUT - S Dyn.Sk_OUT.Reset // SK zurücksetzen - - A Dyn.HMI.Puffer_initialisieren - R Dyn.HMI.Puffer_initialisieren - S Status2.Puffer_initialisieren_IN - S Dyn.Status.Puffer_initialisieren_OUT - - A Dyn.HMI.Einlagern_gesperrt // Wird unten direkt verarbeitet - - A Dyn.HMI.AusLagern_gesperrt // Wird unten direkt verarbeitet - - CLR - -// An HMI: - L Dyn.ShopGroup_IN - T Dyn.HMI.ShopGroup_IN - L Dyn.ShopGroup_OUT - T Dyn.HMI.ShopGroup_OUT - - L Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege - T Dyn.HMI.Voll_Trolleys_IN - L Dyn.Trolley_DL_Ausfahrt.Datenlistenkopf.AnzahlEintraege - T Dyn.HMI.Voll_Trolleys_OUT - - L Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege - T Dyn.HMI.Res_Trolleys_IN - - L Puffer.MaxAnzahl_Einfahrt - L Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege - -I - L Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege - -I - T Dyn.HMI."Frei_Plätze_IN" - - L Dyn.TrolleyID_Schleuse_IN - T Dyn.HMI.TrolleyID_Schleuse_IN - L Dyn.TrolleyID_Schleuse_Out - T Dyn.HMI.TrolleyID_Schleuse_OUT - - ---- NW 5: Oberen Puffer für neue ShopGroup freigeben? --- - A( - L "DLVollPuffer_leer".Datenlistenkopf.AnzahlEintraege - L 0 // Keine Leer-Puffer mehr vorhanden? - ==I // Ja ! - O Dyn.Status.Puffer_leer_OUT // unterer Puffer ist leer - O - A Status2.Puffer_leer_IN // oberer Puffer ist leer - A Status2.Alles_ausfahren_OUT - ) - A Status2.Puffer_leer_IN // Könnte mit neuer ShopGroup bestückt werden! - = Oberen_Puffer_Freigeben - JCN En05 // Negierter Sprung - - L DINT#0 - T Dyn.ShopGroup_IN - -En05: NOP 0 - - ---- NW 6: Schrittkette IN zurücksetzen --- - AN Dyn.Sk_IN.Reset // SK zurücksetzen - JC INen04 - -// Schrittkette zurücksetzen: -// Automatischer Inilauf bei Reset, falls Trolley nicht in Schleuse: - A Dyn.Error.Err_Trolley_nicht_in_Schleuse_IN - S Status2.Trolley_nicht_in_Schleuse_IN - S Status2.Puffer_initialisieren_IN // Damit Einfahren blockiert wird - - L 0 // Schritt 0: Warten - T Dyn.Sk_IN.Akt_Schritt - - L 0 // Zeitwert löschen - T Dyn.Sk_IN.Terr_Zelle - T Dyn.Sk_IN.Tok_Zelle - T Dyn.Leer_Zeit_IN - - SET - R Dyn.Error.Err_BLKMov // Error bei Block kopieren - R Dyn.Sk_IN.Reset // SK zurücksetzen - R Dyn.Sk_IN.Err_Schritt // Undefinierter Schritt - R Dyn.Sk_IN.Err_Uebzeit // Sofort weiter ! - S Dyn.Sk_IN.Reset_Akt // Reset ist aktiv - - SET - R Dyn.Error.Puffer_DL // VollPuffer-Datenliste fehlerhaft - R Dyn.Error.Undef_Puffer // undefiniertes VollPuffer - R Status2.Trolley_nicht_in_Schleuse_IN // Trolley fährt nicht in Schleuse - R Status2.Puffer_nicht_leer_IN // Puffer unten nicht leer - R Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen - R Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert - R Dyn.Error.Err_Stau_Einfahrt // Stau am VollPuffer-Eingang - R Dyn.Error.Err_BLKMov - - L 0 - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - T Dyn.Mindest_Zeit_IN // Sensor B_VorSep ist frei [1s] - T SAVE.Weichen_DB - T SAVE.Weichen_DW - - JU OUT_Sk - -INen04: NOP 0 - - ---- NW 7: Schrittkette OUT zurücksetzen --- - AN Dyn.Sk_OUT.Reset // SK zurücksetzen - JC en04 - -// Schrittkette zurücksetzen: -// Automatischer Inilauf bei Reset, falls Trolley nicht in Schleuse: - A Dyn.Error.Err_Trolley_nicht_in_Schleuse_OUT - S Dyn.Status.Trolley_nicht_in_Schleuse_OUT - S Dyn.Status.Puffer_initialisieren_OUT // Damit Einfahren blockiert wird - - L 0 // Schritt 0: Warten - T Dyn.Sk_OUT.Akt_Schritt - - L 0 // Zeitwert löschen - T Dyn.Sk_OUT.Terr_Zelle - T Dyn.Sk_OUT.Tok_Zelle - T Dyn.Leer_Zeit_OUT - - SET - R Status2.Alles_ausfahren_OUT - R Dyn.Error.Err_BLKMov // Error bei Block kopieren - R Dyn.Sk_OUT.Reset // SK zurücksetzen - R Dyn.Sk_OUT.Err_Schritt // Undefinierter Schritt - R Dyn.Sk_OUT.Err_Uebzeit // Sofort weiter ! - S Dyn.Sk_OUT.Reset_Akt // Reset ist aktiv - - SET - R Dyn.Error.Puffer_DL // VollPuffer-Datenliste fehlerhaft - R Dyn.Error.Undef_Puffer // undefiniertes VollPuffer - R Dyn.Status.Trolley_nicht_in_Schleuse_OUT // Trolley fährt nicht in Schleuse - R Dyn.Status.Puffer_nicht_leer_OUT // Puffer unten nicht leer - R Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen - R Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert - R Dyn.Error.Err_Stau_Einfahrt // Stau am VollPuffer-Eingang - R Dyn.Error.Err_BLKMov - - L 0 - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - T Dyn.Mindest_Zeit_OUT // Sensor B_VorSep ist frei [1s] - T SAVE.Weichen_DB - T SAVE.Weichen_DW - -// Defaultwerte übergeben: - L 0 // Damit statische Werte neu aus Datenbank geholt werden ! - T Puffer.VollPuffer_Nr // Nummer des VollPuffers - - BEU - -en04: NOP 0 - - ---- NW 8: Störungen nach Außen übergeben --- - L 0 - T "MW200" - - A Dyn.Error.Puffer_DL // VollPuffer-Datenliste fehlerhaft - = "M200.0" - A Dyn.Error.Undef_Puffer // undefiniertes VollPuffer - = "M200.1" - A Dyn.Error.Err_Trolley_nicht_in_Schleuse_OUT // Trolley fährt nicht in untere Schleuse - = "M200.2" - A Dyn.Sk_IN.Err_Uebzeit - O Dyn.Sk_OUT.Err_Uebzeit - = Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen - = "M200.3" - NEG - R Dyn.Sk_OUT.Err_Uebzeit_AnzOk - A Dyn.Sk_OUT.Err_Schritt - = Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert - = "M200.4" - A Dyn.Error.Err_Stau_Einfahrt // Stau am VollPuffer-Eingang - = "M200.5" - A Dyn.Error.Err_BLKMov // Error bei Block kopieren - = "M200.6" - A Dyn.Error.Err_Trolley_raus_OUT // Trolley fährt nicht aus unterer Schleuse - = "M200.7" - A Dyn.Error.Err_Puffer_nicht_leer_OUT // Trolley unten in Schleuse, obwohl keine Daten! Initialisieren hat gestartet! - = "M201.0" - A Dyn.Error.Err_Trolley_nicht_in_Schleuse_IN // Trolley fährt nicht in mittlere Schleuse - = "M201.1" - A Dyn.Error.Err_Trolley_raus_IN // Trolley fährt nicht aus mittlere Schleuse - = "M201.2" - A Dyn.Error.Err_Puffer_nicht_leer_IN // Trolley mittig in Schleuse, obwohl keine Daten! Initialisieren hat gestartet! - = "M201.3" - CLR - = "M201.4" - A Dyn.Error.Err_Raus_Sensor - = "M201.5" - CLR - = "M201.6" - A Dyn.Sk_OUT.Reset_Akt // Reset ist aktiv - = Dyn.Error.Reset_aktiv - = "M201.7" - -// Andere Meldung als Überwachungszeit aktiv ?: - L "MW200" - L 2#1111_0111_1111_1111 - AW - L 2#0000_0000_0000_0000 // Andere Meldung als Üb.zeit aktiv ? - <>I // Ja ! - ON Dyn.Sk_OUT.Err_Uebzeit_AnzOk // Störung anzeigen ok, da 2.Zyklus aktiv ! - R "M200.3" // Üb.Zeit-Meldung nicht an PC senden - - A Dyn.Sk_OUT.Err_Uebzeit - S Dyn.Sk_OUT.Err_Uebzeit_AnzOk // Störung anzeigen ok, da 2.Zyklus aktiv ! - - L "MW200" - T Error // Schnittstelle nach Außen - -// Störung vorhanden: - L 0 - <>I // Ja ! - = Dyn.Status.Error_aktiv - CLR // Es gibt keine Quittier-Störung! - A Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen - S hStOk - -// Störungen pro Zyklus neu erzeugen: - SET - R Dyn.Error.Puffer_DL // VollPuffer-Datenliste fehlerhaft - R Dyn.Error.Undef_Puffer // undefiniertes VollPuffer - R Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert - R Dyn.Error.Err_BLKMov - R Dyn.Error.Err_Puffer_nicht_leer_OUT // Trolley unten in Schleuse, obwohl keine Daten! Initialisieren hat gestartet! - R Dyn.Error.Err_Trolley_nicht_in_Schleuse_OUT // Trolley fährt nicht in unterer Schleuse - R Dyn.Error.Err_Trolley_raus_OUT // Trolley fährt nicht aus unterer Schleuse - R Dyn.Error.Err_Puffer_nicht_leer_IN // Trolley mittig in Schleuse, obwohl keine Daten! Initialisieren hat gestartet! - R Dyn.Error.Err_Trolley_nicht_in_Schleuse_IN // Trolley fährt nicht in mittlere Schleuse - R Dyn.Error.Err_Trolley_raus_IN // Trolley fährt nicht aus mittlere Schleuse - R Dyn.Error.Err_Raus_Sensor - - ---- NW 9: Statische VollPuffer-Parameter holen --- - L Puffer.VollPuffer_Nr // Nummer des VollPuffers - L VollPuffer_Nr // Aufruf-Parameter - ==I // Identisch ? - R Dyn.Error.Puffer_DL // VollPufferdatenbank fehlerhaft - R Dyn.Error.Undef_Puffer // undefiniertes VollPuffer - JC en06 // Ja ! - - T "MW200" // Search-Daten - -CALL FC "DatenOut" (SSDB:=Para.VollPuffer_DL_DB, SSDW:=Para.VollPuffer_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:=Dyn.Rueckmld.RET_VAL_DL_VollPuffer, OUTDATEN:=P#M220.0, Position:="MW196") - - JBI G_Ok - - A "M199.0" - JCN w060 - - SET - = Dyn.Error.Puffer_DL // VollPufferdatenbank fehlerhaft - - L 16#A061 - T Dyn.Stop_Ursache_OUT - - BEU - -w060: SET - S Dyn.Error.Undef_Puffer // undefinierter VollPuffer - - L 16#0062 - T Dyn.Stop_Ursache_IN - T Dyn.Stop_Ursache_OUT - - BEU - -// Kennung + Datenbytes -G_Ok: SET - R Dyn.Error.Puffer_DL // Gefälledatenbank fehlerhaft - R Dyn.Error.Undef_Puffer // undefinierte Gefällestrecke - - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 20 // Datenwords speichern - T LW2 // Wiederholungen - -// Quelle-Pointer erzeugen: - L 0 // Bei Merker = 0 ! - T LW4 // DB_Nummer - L 220 // Adresse - SLD 3 - L 16#8300_0000 // Kennung: Merker - OD - T LD6 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_VollPuffer, DSTBLK:=Puffer) // Datenliste-Daten speichern | #Ziel - - L 16#0063 - T Dyn.Stop_Ursache_IN - T Dyn.Stop_Ursache_OUT +FUNCTION_BLOCK "MHMVollpuffer" +TITLE = Omni H&M-Vollpuffer-Modul +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-960629 +// +//Version: H&M Vollpuffer / 10.2025 +// +//Version: Omniflow 2100 / 10.2024 +// +//Schritt 0: Warten auf Trolley +//Schritt 1: Betriebsart ok/angegeben? +//Schritt 5: Mit Scanner fahren: Defaultziel ? +//Schritt 6: Scanner triggern +//Schritt 7: "DREQ" an PC senden +//Schritt 8: Warten auf PC-Antwort +//Schritt 9: PC-Antwort auswerten +//Schritt 10: Fahrtrichtung ermitteln +//Schritt 11: Ausfahren ok ? +//Schritt 12: Warten auf Pin-Signal +//Schritt 13: Weichenbereich raus bereit ? +//Schritt 14: Daten an Rausweiche übergeben +//Schritt 15: Schleuse Mindestzeit öffnen +//Schritt 16: Trolley ausgefahren ? +//Schritt 17: Trolley ist draussen +//Schritt 18: BM wurde vereinzelt +//Schritt 19: Beladezustand checken +//Schritt 20: Schleuse resetten +//Schritt 21: Reset ist zu Ende +// + VAR_INPUT + VollPuffer_Nr { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Aufruf für Voll-Puffer + ErrQuit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Ablaufstörung quittieren + B_VollPufferEinfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley fährt in VollPuffer + B_InSchleuse_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley ist in Schleuse oben + B_InSchleuse_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley ist in Schleuse unten + B_AusSchleuse_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley hat Schleuse unten verlassen + B_Stau_raus_Out { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Stau im Bereich unten rausfahren + B_QuerTrolley_Out : Bool; // Crash-Trolley auf Crashkurs erkannt + Antrieb_plus_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Kreisel-Antrieb plus aktiv + Schleuse_geöffnet_IN : Bool; // Schleuse oben hat geöffnet + Schleuse_geöffnet_OUT : Bool; // Schleuse unten hat geöffnet + END_VAR + + VAR_OUTPUT + Y_Schleuse_Auf_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse oben öffnen + Y_Schleuse_Auf_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse unten öffnen + Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Störungen übergeben + END_VAR + + VAR_IN_OUT + Start_Ok : Bool; // Starten von ausserhalb ist erlaubt + Antrieb_plus_start { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Antrieb plus starten + Antrieb_plus_stoppen : Bool; // Antrieb plus stoppen + hStOk : Bool; // Anzeige Start n. Störung aktivieren + Ausfahr_Inks : Int; // Rest-Inks, wo sich Trolley befindet + END_VAR + + VAR + Res16 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..2] of Int; // Reserve + SAVE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Weichen_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Weichen-FIFO-DB + Weichen_DW { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Weichen-FIFO-DW + END_STRUCT; + Para { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // Parameter + VollPuffer_DL_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung VollPuffer-Datenliste-DB + VollPuffer_DL_DW { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung VollPuffer-Datenliste-DW + Res1 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..2] of Int; // Reserve + END_STRUCT; + Status2 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Puffer_leer_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer oben ist leer + "Puffer_hat Platz_IN" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer oben hat noch Kapazität + Kein_neuer_Trolley_kommt_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer oben zeitlang ohne neuen Trolley + Leer_Check_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // VollPuffer oben wird auf leer gecheckt + Reset_aktiv_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Reset oben aktiv + Trolley_nicht_in_Schleuse_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley oben fährt nicht in Schleuse > Inilauf gestartet + Puffer_nicht_leer_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer oben nicht leer > Inilauf gestartet + Puffer_initialisieren_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // VollPuffer oben initialisieren + MindestZeit_ok_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse ist MindestZeit geöffnet + Frei11 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + Frei12 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + Frei13 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + Alles_ausfahren_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Alle Trolleys ausfahren + Eintrag_DL_Leerliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLVPPuffer_leer (DB100) erfolgt + Eintrag_DL_Reinliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLVPPuffer_ShopGroup rein (DB101) erfolgt + Eintrag_DL_Abrufliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLVPPuffer_ShopGroup raus (DB901) erfolgt + END_STRUCT; + Puffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "UDLHMVollPuffer"; // Statische VollPufferdaten (aus DL) + Dyn : Struct // Dynamische Daten + Status { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Puffer_leer_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer oben ist leer + "Puffer_hat Platz_OUT" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer oben hat noch Kapazität + Kein_neuer_Trolley_kommt_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer unten zeitlang ohne neuen Trolley + Leer_Check_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // VollPuffer unten wird auf leer gecheckt + Reset_aktiv_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Reset unten aktiv + Trolley_nicht_in_Schleuse_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley unten fährt nicht in Schleuse > Inilauf gestartet + Puffer_nicht_leer_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer unten nicht leer > Inilauf gestartet + Puffer_initialisieren_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // VollPuffer unten initialisieren + MindestZeit_ok_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse ist MindestZeit geöffnet + "Undef.Trolley_in_Schleuse_OUT" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Undefinierter Trolley in Schleuse unten erkannt + Trolley_wartet_Auftrag { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley wartet auf Auftrag (unten) + "Trolley_wartet_Bereich+1" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley wartet auf Bereich +1 (unten) + Einen_VollTrolley_ausfahren_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Einen Voll-Trolley ausfahren + Trolley_fährt_aus_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt aus (unten) + Trolley_draussen_Out { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley ist ausgefahren + Error_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Störung vorhanden + END_STRUCT; + TrolleyID_Einfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-Nr ist eingefahren + TrolleyID_Schleuse_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-Nr in Schleuse oben (Daten) + TrolleyID_Schleuse_Out { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-Nr in Schleuse unten (Daten) + ShopGroup_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Diese Shopgruppe ist im oberen VollPuffer + ShopGroup_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Diese Shopgruppe ist im unteren VollPuffer + ShopGroup_Auftrag_zum_Ausfahren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // ShopGroup zum Ausfahren (FFFF = akt.Trolley ausfahren) + HMI : Struct + ShopGroup_IN { ExternalWritable := 'False'} : Int; // ShopGroup im VollPuffer oben (IN:PLC, OUT:PLC) + ShopGroup_OUT { ExternalWritable := 'False'} : Int; // ShopGroup im VollPuffer unten (IN:PLC, OUT:PLC) + Voll_Trolleys_IN { ExternalWritable := 'False'} : Int; // Anzahl Trolleys oben (IN:PLC, OUT:PLC) + Voll_Trolleys_OUT { ExternalWritable := 'False'} : Int; // Anzahl Trolleys unten (IN:PLC, OUT:PLC) + Res_Trolleys_IN { ExternalWritable := 'False'} : Int; // Anzahl reservierte Trolleys oben (IN:PLC, OUT:PLC) + Frei_Plätze_IN { ExternalWritable := 'False'} : Int; // Freiplätze für Trolleys (IN:PLC, OUT:PLC) + TrolleyID_Schleuse_IN { ExternalWritable := 'False'} : DInt; // Trolley-Nr in Schleuse oben (IN:PLC, OUT:PLC) + TrolleyID_Schleuse_OUT { ExternalWritable := 'False'} : DInt; // Trolley-Nr in Schleuse unten (IN:PLC, OUT:PLC) + Schleuse_resetten_IN : Bool; // Schleuse resetten oben (IN:HMI, Out:PLC) + Schleuse_resetten_OUT : Bool; // Schleuse resetten unten (IN:HMI, Out:PLC) + Puffer_initialisieren : Bool := 1; // VollPuffer initialisieren (IN:HMI, Out:PLC) + Einlagern_gesperrt : Bool; // Einlagern gesperrt (IN:HMI, OUT:HMI) + AusLagern_gesperrt : Bool; // AusLagern gesperrt (IN:HMI, OUT:HMI) + END_STRUCT; + Sk_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "USk_Omni" := ((), (), (), (), (), (), (), (), (), (), 1, (), (), (), (), (), ()); // Status der Schrittkette Schleuse IN (oben) + Sk_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "USk_Omni" := ((), (), (), (), (), (), (), (), (), (), 1, (), (), (), (), (), ()); // Status der Schrittkette Schleuse OUT (unten) + TrolleyID_doppelt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'True'} : DInt; // TrolleyID doppelt (eingefahrener Trolley) + TrolleyID_unbekannt_Einfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'True'} : DInt; // TrolleyID unbekannt (eingefahrener Trolley) + TrolleyID_unbekannt_Schleuse_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'True'} : DInt; // TrolleyID unbekannt (Trolley in Schleuse unten) + Rueckmld { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + RET_VAL_BLKMOV_VollPuffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Rückmeldung nach BLKMOV-Aufruf + RET_VAL_DL_VollPuffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf + RET_VAL_DL_Res_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf + RET_VAL_DL_VollPufferTrolley_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenIN-Aufruf + RET_VAL_DL_VollPufferTrolley_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf + END_STRUCT; + Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : "UErrHMVollpuffer"; + Stau_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Sensor B_Einfahrt ist belegt [1s] + Mindest_Zeit_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Sensor B_in_Schleuse oben ist frei [1s] + Mindest_Zeit_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Sensor B_in_Schleuse unten ist frei [1s] + Leer_Zeit_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Puffer oben ist frei [1s] + Leer_Zeit_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Puffer unten ist frei [1s] + Stop_Ursache_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Stop-Stelle: Nw + Position + Stop_Ursache_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Stop-Stelle: Nw + Position + Vereinzelungstakte_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Anzahl der getätigten Vereinzelungstakte + TrolleyID_ausgefahren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // TrolleyID des ausgefahrenen Trolleys + ShopGroup_EFL_Gespeichert : DInt; // In EinfahrListe gespeicherte ShopGroup + ShopGroup_AFL_Gespeichert : DInt; // In AusfahrListe gespeicherte ShopGroup + Reservierungs_DL { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // AB DW200: Liste der resevierter Trolleys + Datenlistenkopf { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + KOPF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DA04; // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128) + LAENGE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 12; // Länge der Datenliste (maximale Anzahl der Datensätze) + STAMMDATEN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 2; // Stammdatenlänge in Word (1 - 9) + INDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) + LAENGEINDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!) + INDDATEN_WANDEL_FC { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) + LETZTERZUGRIFF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Speicherung des letzten Zugriffs + Belegt14 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // reserviert von Sort-Datenliste + AnzahlEintraege { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!) + Reserve18 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Reserve + END_STRUCT; + Res_Trolley { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..12] of Struct // Reservierter Trolley für VollPuffer + Trolley_ID { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley_ID + ShopGroup { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Shop-Gruppe auf Trolley + END_STRUCT; + Endekennung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DAEE; // Datensort-Ende-Kennung (DBEE) + END_STRUCT; + Res350 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..16] of Int; + Trolley_DL_Einfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // AB DW350: Liste der Trolleys im VollPuffer + Datenlistenkopf { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + KOPF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DA04; // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128) + LAENGE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 12; // Länge der Datenliste (maximale Anzahl der Datensätze) + STAMMDATEN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 2; // Stammdatenlänge in Word (1 - 9) + INDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) + LAENGEINDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!) + INDDATEN_WANDEL_FC { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) + LETZTERZUGRIFF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Speicherung des letzten Zugriffs + Belegt14 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // reserviert von Sort-Datenliste + AnzahlEintraege { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!) + Reserve18 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Reserve + END_STRUCT; + VollPuffer_Trolley_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..12] of Struct // Trolley im VollPuffer + Trolley_ID { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley_ID + Abruf_ShopGroup { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Reserviert für Ausfahrt + END_STRUCT; + Endekennung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DAEE; // Datensort-Ende-Kennung (DBEE) + END_STRUCT; + Res500 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..16] of Int; + Trolley_DL_Ausfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // AB DW350: Liste der Trolleys im VollPuffer + Datenlistenkopf { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + KOPF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DA04; // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128) + LAENGE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 12; // Länge der Datenliste (maximale Anzahl der Datensätze) + STAMMDATEN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 2; // Stammdatenlänge in Word (1 - 9) + INDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) + LAENGEINDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!) + INDDATEN_WANDEL_FC { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) + LETZTERZUGRIFF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Speicherung des letzten Zugriffs + Belegt14 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // reserviert von Sort-Datenliste + AnzahlEintraege { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!) + Reserve18 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Reserve + END_STRUCT; + VollPuffer_Trolley_Out { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..12] of Struct // Trolley im VollPuffer + Trolley_ID { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley_ID + Abruf_ShopGroup { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Reserviert für Ausfahrt + END_STRUCT; + Endekennung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DAEE; // Datensort-Ende-Kennung (DBEE) + END_STRUCT; + Res700 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..41] of Int; // Reserve + END_STRUCT; + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Ueb_akt : Bool; // Überwachungszeit aktivieren + Weiter : Bool; // Weiterschaltbedingung ist erfüllt + Warte_neu : Bool; // Wartezeit neu triggern + Warte_stop : Bool; // Wartezeit stoppen + "1.Trolley_IN" : Bool; + Neu_Trolley_in_Puffer_IN : Bool; // Neuer Trolley in Puffer eingefahren + "1.Trolley_OUT" : Bool; + Inks_Ok : Bool; // Starten aufgrund der Inks erlaubt + Puffer_IN_ist_leer : Bool; // VollPuffer zeitlang ohne Sensor + Puffer_OUT_ist_leer : Bool; // VollPuffer zeitlang ohne Sensor + Abruf_Trolley_vorne : Bool; // Abruf-Trolley ist in Schleuse + Oberen_Puffer_Freigeben : Bool; + Oberen_Puffer_nichts_einfahren : Bool; + Puffer_B : Bool; + GesamtAnzahl : Int; + SSDW : Int; + Schleife : Word; // Loopzähler + Trolley : Int; + Position : Int; + Akive_ShopGroup : DInt; + EndZiel : Word; + ZwischenZiel : Word; + ShopGroup : DInt; + Standort : Word; + Error_Check : Bool; + END_VAR + + +BEGIN +NETWORK +TITLE = Parameter-Übergabe + L #VollPuffer_Nr; + + L 275 ;//Einsprung Puffer-DL + T #Para.VollPuffer_DL_DB;//vor Aufruf übergeben! + L 0; + T #Para.VollPuffer_DL_DW; + +NETWORK +TITLE = Anzeige OP + L 252;//Bereichsstop aktiv + UN #Dyn.Sk_OUT.Bereich_ok;//Also: Bereichsstop / Not-Aus + SPB w010; + + L 253; + UN #Dyn.Sk_OUT.Auto_akt;//Keine Betriebsart + UN #Dyn.Sk_OUT.Hand_akt; + SPB w010; + + L 255;//Handbetrieb aktiv + U #Dyn.Sk_OUT.Hand_akt; + SPB w010; + + L #Dyn.Sk_IN.Akt_Schritt;//Aktiver Schritt + T #Dyn.Sk_IN.OP_Schritt; + L #Dyn.Sk_OUT.Akt_Schritt;//Aktiver Schritt + T #Dyn.Sk_OUT.OP_Schritt; + + SPA OP_Ok; + +w010: T #Dyn.Sk_IN.OP_Schritt; + T #Dyn.Sk_OUT.OP_Schritt; + +OP_Ok: NOP 0; + +NETWORK +TITLE = Out-Bits zum Zurücksetzen / Antrieb plus starten + SET; + R #Y_Schleuse_Auf_IN; + R #Y_Schleuse_Auf_OUT; + R #Puffer_IN_ist_leer; + R #Puffer_OUT_ist_leer; + + SET ;//Jeden Zyklus neu + R #Dyn.Status.Trolley_wartet_Auftrag; + R #Dyn.Status."Trolley_wartet_Bereich+1"; + R #Dyn.Status.Trolley_fährt_aus_OUT; + R #Dyn.Status.Trolley_draussen_Out; + R #"1.Trolley_IN"; + R #"1.Trolley_OUT"; + R #Neu_Trolley_in_Puffer_IN; + + U #Dyn.Sk_IN.Reset; + O #Dyn.Sk_IN.Reset_Akt; + = #Status2.Reset_aktiv_IN; + + U #Dyn.Sk_OUT.Reset; + O #Dyn.Sk_OUT.Reset_Akt; + = #Dyn.Status.Reset_aktiv_OUT; + + SET; + R #Inks_Ok; + + U #Dyn.Sk_OUT.Auto_akt; + = #Dyn.Sk_IN.Auto_akt; + U #Dyn.Sk_OUT.Bereich_ok; + = #Dyn.Sk_IN.Bereich_ok; + +//Antrieb zusätlich starten: + U #ErrQuit ;//Überwachungszeit abgelaufen quittieren + S #Antrieb_plus_start;//Kreisel-Antrieb plus starten + +NETWORK +TITLE = HMI-Zeug + +//Von HMI: + U #Dyn.HMI.Schleuse_resetten_IN; + R #Dyn.HMI.Schleuse_resetten_IN; + S #Dyn.Sk_IN.Reset ;//SK zurücksetzen + + U #Dyn.HMI.Schleuse_resetten_OUT; + R #Dyn.HMI.Schleuse_resetten_OUT; + S #Dyn.Sk_OUT.Reset ;//SK zurücksetzen + + U #Dyn.HMI.Puffer_initialisieren; + R #Dyn.HMI.Puffer_initialisieren; + S #Status2.Puffer_initialisieren_IN; + S #Dyn.Status.Puffer_initialisieren_OUT; + + U #Dyn.HMI.Einlagern_gesperrt;//Wird unten direkt verarbeitet + + U #Dyn.HMI.AusLagern_gesperrt;//Wird unten direkt verarbeitet + + CLR; + +//An HMI: + L #Dyn.ShopGroup_IN; + T #Dyn.HMI.ShopGroup_IN; + L #Dyn.ShopGroup_OUT; + T #Dyn.HMI.ShopGroup_OUT; + + L #Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege; + T #Dyn.HMI.Voll_Trolleys_IN; + L #Dyn.Trolley_DL_Ausfahrt.Datenlistenkopf.AnzahlEintraege; + T #Dyn.HMI.Voll_Trolleys_OUT; + + L #Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege; + T #Dyn.HMI.Res_Trolleys_IN; + + L #Puffer.MaxAnzahl_Einfahrt; + L #Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege; + -I; + L #Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege; + -I; + T #Dyn.HMI.Frei_Plätze_IN; + + L #Dyn.TrolleyID_Schleuse_IN; + T #Dyn.HMI.TrolleyID_Schleuse_IN; + L #Dyn.TrolleyID_Schleuse_Out; + T #Dyn.HMI.TrolleyID_Schleuse_OUT; + +NETWORK +TITLE = Oberen Puffer für neue ShopGroup freigeben? + U(; + L "DLVollPuffer_leer".Datenlistenkopf.AnzahlEintraege; + L 0 ;//Keine Leer-Puffer mehr vorhanden? + ==I;//Ja ! + O #Dyn.Status.Puffer_leer_OUT;//unterer Puffer ist leer + O; + U #Status2.Puffer_leer_IN;//oberer Puffer ist leer + U #Status2.Alles_ausfahren_OUT; + ); + U #Status2.Puffer_leer_IN;//Könnte mit neuer ShopGroup bestückt werden! + = #Oberen_Puffer_Freigeben; + SPBN En05;//Negierter Sprung + + L DINT#0; + T #Dyn.ShopGroup_IN; + +En05: NOP 0; + +NETWORK +TITLE = Schrittkette IN zurücksetzen + UN #Dyn.Sk_IN.Reset ;//SK zurücksetzen + SPB INen04; + +//Schrittkette zurücksetzen: +//Automatischer Inilauf bei Reset, falls Trolley nicht in Schleuse: + U #Dyn.Error.Err_Trolley_nicht_in_Schleuse_IN; + S #Status2.Trolley_nicht_in_Schleuse_IN; + S #Status2.Puffer_initialisieren_IN;//Damit Einfahren blockiert wird + + L 0;//Schritt 0: Warten + T #Dyn.Sk_IN.Akt_Schritt; + + L 0;//Zeitwert löschen + T #Dyn.Sk_IN.Terr_Zelle; + T #Dyn.Sk_IN.Tok_Zelle; + T #Dyn.Leer_Zeit_IN; + + SET; + R #Dyn.Error.Err_BLKMov;//Error bei Block kopieren + R #Dyn.Sk_IN.Reset ;//SK zurücksetzen + R #Dyn.Sk_IN.Err_Schritt;//Undefinierter Schritt + R #Dyn.Sk_IN.Err_Uebzeit;//Sofort weiter ! + S #Dyn.Sk_IN.Reset_Akt;//Reset ist aktiv + + SET; + R #Dyn.Error.Puffer_DL;//VollPuffer-Datenliste fehlerhaft + R #Dyn.Error.Undef_Puffer;//undefiniertes VollPuffer + R #Status2.Trolley_nicht_in_Schleuse_IN;//Trolley fährt nicht in Schleuse + R #Status2.Puffer_nicht_leer_IN;//Puffer unten nicht leer + R #Dyn.Error.Err_Uebzeit;//Überwachungzeit ist abgelaufen + R #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert + R #Dyn.Error.Err_Stau_Einfahrt;//Stau am VollPuffer-Eingang + R #Dyn.Error.Err_BLKMov; + + L 0; + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + T #Dyn.Mindest_Zeit_IN;//Sensor B_VorSep ist frei [1s] + T #SAVE.Weichen_DB; + T #SAVE.Weichen_DW; + + SPA OUT_Sk; + +INen04: NOP 0; + +NETWORK +TITLE = Schrittkette OUT zurücksetzen + UN #Dyn.Sk_OUT.Reset;//SK zurücksetzen + SPB en04; + +//Schrittkette zurücksetzen: +//Automatischer Inilauf bei Reset, falls Trolley nicht in Schleuse: + U #Dyn.Error.Err_Trolley_nicht_in_Schleuse_OUT; + S #Dyn.Status.Trolley_nicht_in_Schleuse_OUT; + S #Dyn.Status.Puffer_initialisieren_OUT;//Damit Einfahren blockiert wird + + L 0;//Schritt 0: Warten + T #Dyn.Sk_OUT.Akt_Schritt; + + L 0;//Zeitwert löschen + T #Dyn.Sk_OUT.Terr_Zelle; + T #Dyn.Sk_OUT.Tok_Zelle; + T #Dyn.Leer_Zeit_OUT; + + SET; + R #Status2.Alles_ausfahren_OUT; + R #Dyn.Error.Err_BLKMov;//Error bei Block kopieren + R #Dyn.Sk_OUT.Reset;//SK zurücksetzen + R #Dyn.Sk_OUT.Err_Schritt;//Undefinierter Schritt + R #Dyn.Sk_OUT.Err_Uebzeit;//Sofort weiter ! + S #Dyn.Sk_OUT.Reset_Akt;//Reset ist aktiv + + SET; + R #Dyn.Error.Puffer_DL;//VollPuffer-Datenliste fehlerhaft + R #Dyn.Error.Undef_Puffer;//undefiniertes VollPuffer + R #Dyn.Status.Trolley_nicht_in_Schleuse_OUT;//Trolley fährt nicht in Schleuse + R #Dyn.Status.Puffer_nicht_leer_OUT;//Puffer unten nicht leer + R #Dyn.Error.Err_Uebzeit;//Überwachungzeit ist abgelaufen + R #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert + R #Dyn.Error.Err_Stau_Einfahrt;//Stau am VollPuffer-Eingang + R #Dyn.Error.Err_BLKMov; + + L 0; + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + T #Dyn.Mindest_Zeit_OUT ;//Sensor B_VorSep ist frei [1s] + T #SAVE.Weichen_DB; + T #SAVE.Weichen_DW; + +//Defaultwerte übergeben: + L 0 ;//Damit statische Werte neu aus Datenbank geholt werden ! + T #Puffer.VollPuffer_Nr;//Nummer des VollPuffers + + BEA; + +en04: NOP 0; + +NETWORK +TITLE = Störungen nach Außen übergeben + L 0; + T "MW200"; + + U #Dyn.Error.Puffer_DL;//VollPuffer-Datenliste fehlerhaft + = "M200.0"; + U #Dyn.Error.Undef_Puffer;//undefiniertes VollPuffer + = "M200.1"; + U #Dyn.Error.Err_Trolley_nicht_in_Schleuse_OUT;//Trolley fährt nicht in untere Schleuse + = "M200.2"; + U #Dyn.Sk_IN.Err_Uebzeit; + O #Dyn.Sk_OUT.Err_Uebzeit; + = #Dyn.Error.Err_Uebzeit;//Überwachungzeit ist abgelaufen + = "M200.3"; + NOT; + R #Dyn.Sk_OUT.Err_Uebzeit_AnzOk; + U #Dyn.Sk_OUT.Err_Schritt; + = #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert + = "M200.4"; + U #Dyn.Error.Err_Stau_Einfahrt;//Stau am VollPuffer-Eingang + = "M200.5"; + U #Dyn.Error.Err_BLKMov;//Error bei Block kopieren + = "M200.6"; + U #Dyn.Error.Err_Trolley_raus_OUT;//Trolley fährt nicht aus unterer Schleuse + = "M200.7"; + U #Dyn.Error.Err_Puffer_nicht_leer_OUT;//Trolley unten in Schleuse, obwohl keine Daten! Initialisieren hat gestartet! + = "M201.0"; + U #Dyn.Error.Err_Trolley_nicht_in_Schleuse_IN;//Trolley fährt nicht in mittlere Schleuse + = "M201.1"; + U #Dyn.Error.Err_Trolley_raus_IN;//Trolley fährt nicht aus mittlere Schleuse + = "M201.2"; + U #Dyn.Error.Err_Puffer_nicht_leer_IN;//Trolley mittig in Schleuse, obwohl keine Daten! Initialisieren hat gestartet! + = "M201.3"; + CLR; + = "M201.4"; + U #Dyn.Error.Err_Raus_Sensor; + = "M201.5"; + CLR; + = "M201.6"; + U #Dyn.Sk_OUT.Reset_Akt;//Reset ist aktiv + = #Dyn.Error.Reset_aktiv; + = "M201.7"; + +//Andere Meldung als Überwachungszeit aktiv ?: + L "MW200"; + L 2#1111_0111_1111_1111; + UW; + L 2#0000_0000_0000_0000;//Andere Meldung als Üb.zeit aktiv ? + <>I;//Ja ! + ON #Dyn.Sk_OUT.Err_Uebzeit_AnzOk;//Störung anzeigen ok, da 2.Zyklus aktiv ! + R "M200.3";//Üb.Zeit-Meldung nicht an PC senden + + U #Dyn.Sk_OUT.Err_Uebzeit; + S #Dyn.Sk_OUT.Err_Uebzeit_AnzOk;//Störung anzeigen ok, da 2.Zyklus aktiv ! + + L "MW200"; + T #Error;//Schnittstelle nach Außen + +//Störung vorhanden: + L 0; + <>I;//Ja ! + = #Dyn.Status.Error_aktiv; + CLR;//Es gibt keine Quittier-Störung! + U #Dyn.Error.Err_Uebzeit;//Überwachungzeit ist abgelaufen + S #hStOk; + +//Störungen pro Zyklus neu erzeugen: + SET; + R #Dyn.Error.Puffer_DL;//VollPuffer-Datenliste fehlerhaft + R #Dyn.Error.Undef_Puffer;//undefiniertes VollPuffer + R #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert + R #Dyn.Error.Err_BLKMov; + R #Dyn.Error.Err_Puffer_nicht_leer_OUT;//Trolley unten in Schleuse, obwohl keine Daten! Initialisieren hat gestartet! + R #Dyn.Error.Err_Trolley_nicht_in_Schleuse_OUT;//Trolley fährt nicht in unterer Schleuse + R #Dyn.Error.Err_Trolley_raus_OUT;//Trolley fährt nicht aus unterer Schleuse + R #Dyn.Error.Err_Puffer_nicht_leer_IN;//Trolley mittig in Schleuse, obwohl keine Daten! Initialisieren hat gestartet! + R #Dyn.Error.Err_Trolley_nicht_in_Schleuse_IN;//Trolley fährt nicht in mittlere Schleuse + R #Dyn.Error.Err_Trolley_raus_IN;//Trolley fährt nicht aus mittlere Schleuse + R #Dyn.Error.Err_Raus_Sensor; + +NETWORK +TITLE = Statische VollPuffer-Parameter holen + L #Puffer.VollPuffer_Nr;//Nummer des VollPuffers + L #VollPuffer_Nr;//Aufruf-Parameter + ==I;//Identisch ? + R #Dyn.Error.Puffer_DL;//VollPufferdatenbank fehlerhaft + R #Dyn.Error.Undef_Puffer;//undefiniertes VollPuffer + SPB en06;//Ja ! + + T "MW200";//Search-Daten + + CALL "DatenOut" + ( SSDB := #Para.VollPuffer_DL_DB , + SSDW := #Para.VollPuffer_DL_DW , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := #Dyn.Rueckmld.RET_VAL_DL_VollPuffer , + OUTDATEN := P#M220.0 , + Position := "MW196" + ); + + SPBI G_Ok; + + U "M199.0"; + SPBN w060; + + SET; + = #Dyn.Error.Puffer_DL;//VollPufferdatenbank fehlerhaft + + L 16#A061; + T #Dyn.Stop_Ursache_OUT; + + BEA; + +w060: SET; + S #Dyn.Error.Undef_Puffer;//undefinierter VollPuffer + + L 16#0062; + T #Dyn.Stop_Ursache_IN; + T #Dyn.Stop_Ursache_OUT; + + BEA; + +//Kennung + Datenbytes +G_Ok: SET; + R #Dyn.Error.Puffer_DL;//Gefälledatenbank fehlerhaft + R #Dyn.Error.Undef_Puffer;//undefinierte Gefällestrecke + + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 20;//Datenwords speichern + T %LW2;//Wiederholungen + +//Quelle-Pointer erzeugen: + L 0;//Bei Merker = 0 ! + T %LW4;//DB_Nummer + L 220;//Adresse + SLD 3; + L 16#8300_0000;//Kennung: Merker + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #Dyn.Rueckmld.RET_VAL_BLKMOV_VollPuffer , + DSTBLK := #Puffer //#Ziel + ); + + L 16#0063; + T #Dyn.Stop_Ursache_IN; + T #Dyn.Stop_Ursache_OUT; + + L #Dyn.Rueckmld.RET_VAL_BLKMOV_VollPuffer;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Dyn.Error.Err_BLKMov ;//Error bei Block kopieren + BEB; + + L #Puffer.Puffer_Typ ;//Puffertyp = 1276 (Vollpuffer) + L 1276 ;//Dieser Aufruf-FB ? + ==I;//Ja ! + SPB w061; + + SET; + S #Dyn.Error.Undef_Puffer;//undefinierter VollPuffer + + L 0 ;//VollPuffer ungültig ! + T #Puffer.VollPuffer_Nr;//Nummer des VollPuffers + + L 16#0064; + T #Dyn.Stop_Ursache_IN; + T #Dyn.Stop_Ursache_OUT; + + BEA; + +//Defaultwerte übergeben: +w061: NOP 0; + + BEA; + +en06: NOP 0; + +NETWORK +TITLE = Störungen quittieren + U #ErrQuit ;//Überwachungszeit abgelaufen quittieren + R #Dyn.Sk_IN.Err_Uebzeit; + R #Dyn.Sk_OUT.Err_Uebzeit; + +NETWORK +TITLE = Einfahrenden Trolley in Puffer-DL IN eintragen + L #Dyn.TrolleyID_Einfahrt; + T "MD220"; + L DINT#0; + ==I; + SPB NoNewT; + + SET; + S #Neu_Trolley_in_Puffer_IN; + +//Erster einfahrender Trolley ? + L #Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege; + L 0; + ==I ;//Ja ! + = #"1.Trolley_IN"; + +//Neue Position an Gesamt-Trolley-DL übergeben: + CALL "Trolley_DL_Neue_Pos" + ( Gesamt_Trolley_DL := #Puffer.Gesamt_Trolley_DL , + TrolleyID := #Dyn.TrolleyID_Einfahrt , + Position := #Puffer.Puffer_Position , + ShopGroup := Dint#0 , + Err := "M199.0" + ); + +//EndZiel löschen: + CALL "Trolleydaten_ändern" + ( Gesamt_Trolley_DL := #Puffer.Gesamt_Trolley_DL , + TrolleyID := #Dyn.TrolleyID_Einfahrt , + Endziel := 16#0 , + ShopGroup := DINT#-1 + ); + + U "M199.0" ;//Kein sinnvolles Ergebnis + SPBN Ok80 ;//negierter Sprung + + L "MD220"; + T #Dyn.TrolleyID_unbekannt_Einfahrt; + +Ok80: UN #"1.Trolley_IN"; + SPB NoFirst; + +//ShopGroup speichern bei 1.Trolley speichern: + L "TrolleyDL_OutDaten".OUTDaten.ShopGroup;//von oben "Neue Pos..." übernommen + T #Dyn.ShopGroup_IN; + +//Daten Puffer eintragen: +NoFirst: L #Puffer.Puffer_Dyn_DW; + L #Puffer.PufferTrolleyliste_DW_IN; + +I; + T #SSDW; + + L #Dyn.TrolleyID_Einfahrt; + T "MD220"; + L DINT#0 ;//Abruf-ShopGroup erst mal löschen! + T "MD224"; + + CALL "DatenIn" + ( SSDB := #Puffer.Puffer_Dyn_DB , + SSDW := #SSDW , + INDATEN := P#M220.0 , + RE_VAL := "MB199" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_DL_VollPufferTrolley_IN;//wegen Bit-Auswertung + +//Austrag aus Trolley-Reservierungsliste + L #Dyn.TrolleyID_Einfahrt;//Eintrag ist erfolgt + T "MD220"; + +ResOut: L #Puffer.Puffer_Dyn_DW; + L #Puffer.PufferReservierungsliste_DW; + +I; + T #SSDW; + + CALL "DatenOut" + ( SSDB := #Puffer.Puffer_Dyn_DB , + SSDW := #SSDW , + PARA := 16#E100 , //Eintrag löschen + SEARCHDATEN := P#M220.0 , + RE_VAL := #Dyn.Rueckmld.RET_VAL_DL_Res_OUT , + OUTDATEN := P#M220.0 , //Nicht relevant + Position := "MW196" + ); + + L DINT#0; + T #Dyn.TrolleyID_Einfahrt; + +NoNewT: NOP 0; + +NETWORK +TITLE = Error: Stau Bereich-Eingang + +//Sensor bei Bereichs-Einfahrt bleibt belegt?: + UN #B_VollPufferEinfahrt ;//Sensor Trolley fährt in Bereich (kein Stau !) + R #Dyn.Error.Err_Stau_Einfahrt;//Stau bei Einfahrt + SPB X090 ;//StauZeit neu aufziehen + + UN "1s-Impuls"; + O #Dyn.Error.Err_Stau_Einfahrt;//Zeit bereits abgelaufen + SPB Xn09; + + L #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + + +1; + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + + L 25 ;//Stau-Zeit erreicht ? + >=I;//Ja ! + S #Dyn.Error.Err_Stau_Einfahrt;//Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb + SPBN Xn09; + +X090: L 0 ;//Zeiten löschen + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + +Xn09: NOP 0; + +NETWORK +TITLE = Schleuse IN: Mindestzeit geöffnet/frei + L #Dyn.Sk_IN.Akt_Schritt; + L 6 ;//Mindestzeit ok? + <>I;//Nein! + O #B_InSchleuse_IN ;//Sensor Trolley in Schleuse vorhanden + ON #Schleuse_geöffnet_IN;//Schleuse hat geöffnet + R #Status2.MindestZeit_ok_IN; + SPB INX100 ;//FreiZeit neu aufziehen + + UN "1s-Impuls"; + O #Status2.MindestZeit_ok_IN;//Zeit bereits abgelaufen + SPB INX10E; + + L #Dyn.Mindest_Zeit_IN;//Sensor B_im_Sep ist frei [1s] + + +1; + T #Dyn.Mindest_Zeit_IN;//Sensor B_im_Sep ist frei [1s] + + L 10 ;//Mindest-Zeit erreicht ? + >=I;//Ja ! + S #Status2.MindestZeit_ok_IN; + SPBN INX10E; + +INX100: L 0 ;//Zeiten löschen + T #Dyn.Mindest_Zeit_IN;//Sensor B_im_Sep ist frei [1s] + +INX10E: NOP 0; + +NETWORK +TITLE = Schleuse OUT: Mindestzeit geöffnet/frei, Position-Inks übergeben + L #Dyn.Sk_OUT.Akt_Schritt; + L 6 ;//Mindestzeit ok? + <>I;//Nein! + O #B_InSchleuse_OUT ;//Sensor Trolley in Schleuse vorhanden + ON #Schleuse_geöffnet_OUT;//Schleuse hat geöffnet + R #Dyn.Status.MindestZeit_ok_OUT; + SPB X100 ;//FreiZeit neu aufziehen - L Dyn.Rueckmld.RET_VAL_BLKMOV_VollPuffer // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Dyn.Error.Err_BLKMov // Error bei Block kopieren - BEC + UN "1s-Impuls"; + O; + U #Puffer.Parameter_allg.Antrieb_Plus_vorhanden; + UN #Antrieb_plus_aktiv; + O #Dyn.Status.MindestZeit_ok_OUT;//Zeit bereits abgelaufen + SPB Xn10; - L Puffer.Puffer_Typ // Puffertyp = 1276 (Vollpuffer) - L 1276 // Dieser Aufruf-FB ? - ==I // Ja ! - JC w061 + L #Dyn.Mindest_Zeit_OUT ;//Sensor B_im_Sep ist frei [1s] + + +1; + T #Dyn.Mindest_Zeit_OUT ;//Sensor B_im_Sep ist frei [1s] - SET - S Dyn.Error.Undef_Puffer // undefinierter VollPuffer + L #Puffer.Mindeszeit_Schleuse_geoeffnet ;//Mindest-Zeit erreicht ? + >=I;//Ja ! + S #Dyn.Status.MindestZeit_ok_OUT; + SPBN Xn10; - L 0 // VollPuffer ungültig ! - T Puffer.VollPuffer_Nr // Nummer des VollPuffers +X100: L 0 ;//Zeiten löschen + T #Dyn.Mindest_Zeit_OUT ;//Sensor B_im_Sep ist frei [1s] - L 16#0064 - T Dyn.Stop_Ursache_IN - T Dyn.Stop_Ursache_OUT +//Schleuse geöffnet: (Position-Inks übergeben) +Xn10: UN #Schleuse_geöffnet_OUT ;//Schleuse hat geöffnet + SPB X10E; - BEU + L #Ausfahr_Inks; + L #Puffer.Puffer_Position_Inks; + >I;//Rest-Inks-Wert ist größer! + SPB X10E; -// Defaultwerte übergeben: -w061: NOP 0 + L #Puffer.Puffer_Position_Inks; + T #Ausfahr_Inks; - BEU +X10E: NOP 0; -en06: NOP 0 +NETWORK +TITLE = Keine neue Trolley-Einfahrt Puffer IN ? +//Neu-Trolley ist im Puffer oben: + U #Neu_Trolley_in_Puffer_IN; + O #B_VollPufferEinfahrt; + SPB INX110; + + UN "1s-Impuls"; + O #Status2.Kein_neuer_Trolley_kommt_IN; + SPB INXn11; + + L #Dyn.Leer_Zeit_IN ;//Zeit für LeerCheck [1s] + + +1; + T #Dyn.Leer_Zeit_IN ;//Zeit für LeerCheck [1s] + + L #Puffer.Wartezeit_bis_Puffer_leer;//Leer-Zeit erreicht ? + >=I;//Ja ! + SPBN INXn11; + + T #Dyn.Leer_Zeit_IN ;//Zeit für LeerCheck einfrieren + + SET; + S #Status2.Kein_neuer_Trolley_kommt_IN; + + SPA INXn11; + +INX110: L 0 ;//Zeiten löschen + T #Dyn.Leer_Zeit_IN; + + SET; + R #Status2.Kein_neuer_Trolley_kommt_IN; + +INXn11: NOP 0; + +NETWORK +TITLE = Keine neue Trolley-Einfahrt Puffer OUT ? + +//Neu-Trolley ist im Puffer oben: + U #Schleuse_geöffnet_IN; + SPB X110; ---- NW 10: Störungen quittieren --- - A ErrQuit // Überwachungszeit abgelaufen quittieren - R Dyn.Sk_IN.Err_Uebzeit - R Dyn.Sk_OUT.Err_Uebzeit + UN "1s-Impuls"; + O #Dyn.Status.Kein_neuer_Trolley_kommt_OUT; + SPB Xn11; + L #Dyn.Leer_Zeit_OUT ;//Zeit für LeerCheck [1s] + + +1; + T #Dyn.Leer_Zeit_OUT ;//Zeit für LeerCheck [1s] + + L #Puffer.Wartezeit_bis_Puffer_leer;//Leer-Zeit erreicht ? + >=I;//Ja ! + SPBN Xn11; + + T #Dyn.Leer_Zeit_OUT ;//Zeit für LeerCheck einfrieren + + SET; + S #Dyn.Status.Kein_neuer_Trolley_kommt_OUT; + + SPA Xn11; + +X110: L 0 ;//Zeiten löschen + T #Dyn.Leer_Zeit_OUT; + + SET; + R #Dyn.Status.Kein_neuer_Trolley_kommt_OUT; ---- NW 11: Einfahrenden Trolley in Puffer-DL IN eintragen --- - L Dyn.TrolleyID_Einfahrt - T "MD220" - L DINT#0 - ==I - JC NoNewT +Xn11: NOP 0; - SET - S Neu_Trolley_in_Puffer_IN +NETWORK +TITLE = Reservierungs-Check + L #Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege; + L 0; + ==I; + SPB NoResCheck ;//Später -> Hauptstrangdaten checken! -// Erster einfahrender Trolley ? - L Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege - L 0 - ==I // Ja ! - = "1.Trolley_IN" + L #VollPuffer_Nr; + L 126; + >=I; + = #Puffer_B;//Puffer gehört zu Bereich B -// Neue Position an Gesamt-Trolley-DL übergeben: -CALL FC "Trolley_DL_Neue_Pos" (Gesamt_Trolley_DL:=Puffer.Gesamt_Trolley_DL, TrolleyID:=Dyn.TrolleyID_Einfahrt, Position:=Puffer.Puffer_Position, ShopGroup:=Dint#0, Err:="M199.0") +//Keine Trolleydaten in Sorter A? + U "DVP_Sorter_A".Sorter_A_leer; + UN #Puffer_B ;//Puffer gehört zu Bereich B + SPB ResDel; -// EndZiel löschen: -CALL FC "Trolleydaten_ändern" (Gesamt_Trolley_DL:=Puffer.Gesamt_Trolley_DL, TrolleyID:=Dyn.TrolleyID_Einfahrt, Endziel:=16#0, ShopGroup:=DINT#-1) +//Keine Trolleydaten in Sorter A+B? + U "DVP_Sorter_A".Sorter_A_leer; + U "DVP_Sorter_B".Sorter_B_leer; + U #Puffer_B ;//Puffer gehört zu Bereich B + SPB ResDel; - A "M199.0" // Kein sinnvolles Ergebnis - JCN Ok80 // negierter Sprung +//Ansonsten über Ziel-Check +//Daten vom 1.Reservierungs-Trolley holen: + L #Dyn.Reservierungs_DL.Res_Trolley[1].Trolley_ID; + T "TrolleyDL_SearchDaten".SEARCHDaten.TrolleyID; - L "MD220" - T Dyn.TrolleyID_unbekannt_Einfahrt +//Trolleydaten lesen: + CALL "DatenOut" + ( SSDB := 1000 , + SSDW := 0 , + PARA := 16#0000 , //Eintrag lesen + SEARCHDATEN := %DB1012.DBX0.0 , + RE_VAL := "MB198" , + OUTDATEN := %DB1011.DBX0.0 , + Position := "MW200" + ); -Ok80: AN "1.Trolley_IN" - JC NoFirst + L "MB198"; + L 2#10000000 ;//Datensatz vorhanden? + <>I;//Nein! + SPB NoResCheck; -// ShopGroup speichern bei 1.Trolley speichern: - L "TrolleyDL_OutDaten".OUTDaten.ShopGroup // von oben "Neue Pos..." übernommen - T Dyn.ShopGroup_IN + L "TrolleyDL_OutDaten".OUTDaten.EndZiel; + L 101 ;//VollPuffer ? + >=I ;//Ja! + U(; + TAK; + L 151 ;//VollPuffer ? + <=I ;//Ja! + ); + SPB NoResCheck ;//Warten, Trolley kommt noch! -// Daten Puffer eintragen: -NoFirst: L Puffer.Puffer_Dyn_DW - L Puffer.PufferTrolleyliste_DW_IN - +I - T SSDW +ResDel: L #Dyn.Reservierungs_DL.Res_Trolley[1].Trolley_ID; + T "MD220"; - L Dyn.TrolleyID_Einfahrt - T "MD220" - L DINT#0 // Abruf-ShopGroup erst mal löschen! - T "MD224" + SPA ResOut; + +NoResCheck: NOP 0; + +NETWORK +TITLE = Leer-Check IN aktiv + +//Falls Inilauf aktiv: + U #Status2.Puffer_initialisieren_IN; + UN #Status2.Leer_Check_IN; + S #Status2.Leer_Check_IN; + SPBN Check_IN ;//Negierter Sprung + + L 0 ;//Zeiten neu aufziehen + T #Dyn.Leer_Zeit_IN; + + SET; + R #Status2.Kein_neuer_Trolley_kommt_IN; + +Check_IN: NOP 0; +//Abbruch, da Trolley ist doch noch in Schleuse gefahren: + U #Status2.Puffer_initialisieren_IN; + U #Status2.Trolley_nicht_in_Schleuse_IN; + U #B_InSchleuse_IN; + R #Status2.Puffer_initialisieren_IN; + R #Status2.Trolley_nicht_in_Schleuse_IN; + R #Status2.Leer_Check_IN; + + UN #Status2.Leer_Check_IN; + SPB INXn12; + +//Trolley während Check erkannt: + UN #Status2.Kein_neuer_Trolley_kommt_IN; + SPB INXn12; + +//Aber: + U #Schleuse_geöffnet_IN ;//aber Schleuse noch geöffnet + O #B_InSchleuse_IN ;//aber Trolley noch in Schleuse + SPBN Fertig_IN ;//Negierter Sprung + + L 0 ;//Zeit neu aufziehen + T #Dyn.Leer_Zeit_IN; + + SET; + R #Status2.Kein_neuer_Trolley_kommt_IN; + + SPA Xn12; + +Fertig_IN: SET; + R #Status2.Leer_Check_IN; + + U #Status2.Puffer_initialisieren_IN; + R #Status2.Puffer_initialisieren_IN; + SPBN Reset_IN ;//Negierter Sprung + +//Trolleyliste löschen: + L #Puffer.Puffer_Dyn_DW; + L #Puffer.PufferTrolleyliste_DW_IN; + +I; + T #SSDW; + + CALL "DatenReset" + ( SSDB := #Puffer.Puffer_Dyn_DB , + SSDW := #SSDW , + RE_VAL := "MB198" + ); + + SPA INXn12 ;//Nicht mehr wegen Gefahr der Überfüllung, besser Reservierungen checken + +//Reservierungs-Liste löschen: + L #Puffer.Puffer_Dyn_DW; + L #Puffer.PufferReservierungsliste_DW; + +I; + T #SSDW; + + CALL "DatenReset" + ( SSDB := #Puffer.Puffer_Dyn_DB , + SSDW := #SSDW , + RE_VAL := "MB198" + ); + + SPA Reset_IN; + +INXn12: NOP 0; + +NETWORK +TITLE = Leer-Check OUT aktiv + +//Falls Inilauf aktiv: + U #Dyn.Status.Puffer_initialisieren_OUT; + UN #Dyn.Status.Leer_Check_OUT; + S #Dyn.Status.Leer_Check_OUT; + SPBN Check;//Negierter Sprung + + L 0 ;//Zeiten neu aufziehen + T #Dyn.Leer_Zeit_OUT; + + SET; + R #Dyn.Status.Kein_neuer_Trolley_kommt_OUT; + +Check: NOP 0; +//Abbruch, da Trolley ist doch noch in Schleuse gefahren: + U #Dyn.Status.Puffer_initialisieren_OUT; + U #Dyn.Status.Trolley_nicht_in_Schleuse_OUT; + U #B_InSchleuse_OUT; + CLR;//Ist Blödsinn + R #Dyn.Status.Puffer_initialisieren_OUT; + R #Dyn.Status.Trolley_nicht_in_Schleuse_OUT; + R #Dyn.Status.Leer_Check_OUT; + + UN #Dyn.Status.Leer_Check_OUT; + SPB Xn12; + +//Trolley währen Check erkannt: + UN #Dyn.Status.Kein_neuer_Trolley_kommt_OUT; + SPB Xn12; + +//Aber: + U #Schleuse_geöffnet_OUT;//aber Schleuse noch geöffnet + O #B_InSchleuse_OUT ;//aber Trolley noch in Schleuse + SPBN Fertig ;//Negierter Sprung + + L 0 ;//Zeit neu aufziehen + T #Dyn.Leer_Zeit_OUT; + + SET; + R #Dyn.Status.Kein_neuer_Trolley_kommt_OUT; + + SPA Xn12; + +Fertig: SET; + R #Dyn.Status.Leer_Check_OUT; + + U #Dyn.Status.Puffer_initialisieren_OUT; + R #Dyn.Status.Puffer_initialisieren_OUT; + SPBN Reset_OUT ;//Negierter Sprung + +//Trolleyliste löschen: + L #Puffer.Puffer_Dyn_DW; + L #Puffer.PufferTrolleyliste_DW_Out; + +I; + T #SSDW; + + CALL "DatenReset" + ( SSDB := #Puffer.Puffer_Dyn_DB , + SSDW := #SSDW , + RE_VAL := "MB198" + ); + + SPA Reset_OUT; + +Xn12: NOP 0; + +NETWORK +TITLE = Reset IN aktiv + SPA INEn14; + +Reset_IN: SET; + R #Dyn.Sk_IN.Err_Uebzeit; + R #Status2.Eintrag_DL_Leerliste_erfolgt; + R #Status2.Eintrag_DL_Reinliste_erfolgt; + R #Status2.Trolley_nicht_in_Schleuse_IN; + R #Status2.Puffer_nicht_leer_IN; + + L DINT#0; +/// T #Dyn.ShopGroup_IN //siehe Nw 5 + T #Dyn.ShopGroup_EFL_Gespeichert ;//Kein ShopGroup_IN mehr eingetragen + L 0; + T #Dyn.Leer_Zeit_IN; + T #Dyn.ShopGroup_EFL_Gespeichert ;//Kein ShopGroup_IN mehr eingetragen + +//Trolleyliste löschen: + L #Puffer.Puffer_Dyn_DW; + L #Puffer.PufferTrolleyliste_DW_IN; + +I; + T #SSDW; + + CALL "DatenReset" + ( SSDB := #Puffer.Puffer_Dyn_DB , + SSDW := #SSDW , + RE_VAL := "MB198" + ); + +INEn14: NOP 0; + +NETWORK +TITLE = Reset Out aktiv + SPA En14; + +Reset_OUT: SET; + R #Dyn.Sk_OUT.Err_Uebzeit; + R #Dyn.Status.Puffer_initialisieren_OUT; + R #Dyn.Status.Trolley_nicht_in_Schleuse_OUT; + R #Dyn.Status.Puffer_nicht_leer_OUT; + R #Dyn.HMI.Puffer_initialisieren;//Button-Anzeige wieder normal + R #Status2.Eintrag_DL_Abrufliste_erfolgt; + R #Dyn.Error.Err_Raus_Sensor; + R #Dyn.Status.Trolley_fährt_aus_OUT; + + L DINT#0; + T #Dyn.ShopGroup_OUT; + T #Dyn.ShopGroup_AFL_Gespeichert ;//Kein ShopGroup_OUT mehr eingetragen + L 0; + T #Dyn.Leer_Zeit_OUT; + +//Trolleyliste löschen: + L #Puffer.Puffer_Dyn_DW; + L #Puffer.PufferTrolleyliste_DW_Out; + +I; + T #SSDW; + + CALL "DatenReset" + ( SSDB := #Puffer.Puffer_Dyn_DB , + SSDW := #SSDW , + RE_VAL := "MB198" + ); + +En14: NOP 0; + +NETWORK +TITLE = Beide Puffer identische ShopGroup + L #Dyn.ShopGroup_IN; + L #Dyn.ShopGroup_OUT;//Gleiche Daten ? + <>I;//Nein! + R #Oberen_Puffer_nichts_einfahren;//Einfahrt oben verhindern, sonst evtl. Dauerlauf + SPB NixGleich; + +//Sonderfall "Alles ausfahren": + U #Status2.Alles_ausfahren_OUT;//Unterer Puffer soll leer werden! + = #Oberen_Puffer_nichts_einfahren;//Einfahrt oben verhindern, sonst evtl. Dauerlauf + +NixGleich: NOP 0; + +NETWORK +TITLE = Puffer oben hat Platz / ist frei + +//Puffer hat Platz: + L #Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege; + L #Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege; + +I; + T #GesamtAnzahl; + + L #Puffer.MaxAnzahl_Einfahrt; + I;//Ja! + O(; + L 1;//Minimalwert ? + ==I;//Ja ! + ); + = #Inks_Ok; + +X14E: NOP 0; + +NETWORK +TITLE = DLPuffer_leer: Ein-/Austrag + L #GesamtAnzahl; + L 0 ;//Trolleys unterwegs/drin ? + <>I ;//Ja ! + ON #Status2.Puffer_leer_IN;//Kann mit neuer ShopGroup bestückt werden! + O #Puffer.Parameter_allg.Kein_Lager;//Überlauf-/Fehler-Strecke + O #Status2.Puffer_initialisieren_IN; + O #Dyn.Status.Puffer_initialisieren_OUT; + SPB Austrag_Leerliste; + +//Eintrag in Leerliste: + L #VollPuffer_Nr; + T "MW220" ;//Puffer, der leer ist + + CALL "DatenIn"//Anforderung in Datenliste eintragen + ( SSDB := 100 , + SSDW := 0 , + INDATEN := P#M220.0 , + RE_VAL := "MB219" + ); + + UN "M219.6";//Daten wurden überschrieben + UN "M219.7";//Eintrag ist richtig erfolgt + SPB NoChange_Leerliste; + + SET; + S #Status2.Eintrag_DL_Leerliste_erfolgt; + + SPA NoChange_Leerliste; + +Austrag_Leerliste: NOP 0; +//Austrag aus Leerliste: + L #VollPuffer_Nr; + T "MW220" ;//Puffer, der leer ist + + CALL "DatenOut"//Anforderung aus Datenliste löschen + ( SSDB := 100 , + SSDW := 0 , + PARA := WORD#16#E100 , + SEARCHDATEN := P#M220.0 , + RE_VAL := "MB219" , + OUTDATEN := P#M230.0 , + Position := "MW196" + ); + + SET; + R #Status2.Eintrag_DL_Leerliste_erfolgt; + +NoChange_Leerliste: NOP 0; + +NETWORK +TITLE = DLPuffer_ShopGroup_einfahren: Ein-/Austrag + +//Relevante ShopGroup ermittel: + L #Dyn.ShopGroup_IN; + L DINT#0 ;//ShopGroup bekannt ? + <>D ;//Ja ! + SPB ASG; + + L #Dyn.Reservierungs_DL.Res_Trolley[1].ShopGroup; + L DINT#0 ;//Trolleys mit ShopGroup reseviert ? + <>D ;//Ja ! + SPB ASG; + + L DINT#0;//wegen TAK + +ASG: TAK; + T #Akive_ShopGroup; + + L #Akive_ShopGroup; + L DINT#0 ;//Relevante ShopGroup bekannt ? + ==D ;//Nein ! + ON #Status2."Puffer_hat Platz_IN";//Puffer hat kein Platz mehr + O #Oberen_Puffer_Freigeben; + O #Puffer.Parameter_allg.Kein_Lager;//Überlauf-/Fehler-Strecke + O #Status2.Puffer_initialisieren_IN; + O #Dyn.Status.Puffer_initialisieren_OUT; + SPB Austrag_Reinliste; + +//Eintrag in Reinliste: + L #Akive_ShopGroup; + L #Dyn.ShopGroup_EFL_Gespeichert; + ==I;//Eintrag schon erfolgt + SPB NoChange_Reinliste; + + L #Dyn.Reservierungs_DL.Res_Trolley[1].ShopGroup; + T "MD222" ;//Übergabe zum Speichern + L 0 ;//Trolleys mit ShopGroup reseviert ? + <>D ;//Ja ! + SPB X190; + + L #Akive_ShopGroup; + T "MD222" ;//Übergabe zum Speichern + L 0 ;//ShopGroup bekannt? + <>D ;//Ja ! + SPB X190; + + SPA NoChange_Reinliste; + +X190: L #VollPuffer_Nr ;//angefahrener Puffer + T "MW220"; + + CALL "DatenIn"//Anforderung in Datenliste eintragen + ( SSDB := 101 , + SSDW := 0 , + INDATEN := P#M220.0 , + RE_VAL := "MB219" + ); + + UN "M219.6";//Daten wurden überschrieben + UN "M219.7";//Eintrag ist richtig erfolgt + SPB NoChange_Reinliste; + + L #Akive_ShopGroup; + T #Dyn.ShopGroup_EFL_Gespeichert;//Eingetragene ShopGroup_IN + + SET; + S #Status2.Eintrag_DL_Reinliste_erfolgt; + + SPA NoChange_Reinliste; + +Austrag_Reinliste: NOP 0; +//Austrag aus Reinliste: + L #VollPuffer_Nr; + T "MW220"; + + CALL "DatenOut"//Anforderung aus Datenliste löschen + ( SSDB := 101 , + SSDW := 0 , + PARA := WORD#16#E100 , + SEARCHDATEN := P#M220.0 , + RE_VAL := "MB219" , + OUTDATEN := P#M230.0 , + Position := "MW196" + ); + + L DINT#0; + T #Dyn.ShopGroup_EFL_Gespeichert ;//Kein ShopGroup_IN mehr eingetragen + + SET; + R #Status2.Eintrag_DL_Reinliste_erfolgt; + +NoChange_Reinliste: NOP 0; + +NETWORK +TITLE = DLPuffer_ShopGroup_abrufen: Ein-/Austrag + L #Dyn.ShopGroup_OUT; + L DINT#0 ;//Bekannt ? + ==D ;//Nein ! + O #Dyn.Status.Puffer_leer_OUT;//Kann mit neuer ShopGroup bestückt werden! + O #Dyn.HMI.AusLagern_gesperrt; + O #Puffer.Parameter_allg.Kein_Lager;//Überlauf-/Fehler-Strecke + O #Status2.Puffer_initialisieren_IN; + O #Dyn.Status.Puffer_initialisieren_OUT; + SPB Austrag_Abrufliste; + +//Eintrag aus Abrufliste: + L #Dyn.ShopGroup_OUT; + L #Dyn.ShopGroup_AFL_Gespeichert; + ==I;//Eintrag schon erfolgt + SPB NoChange_Abrufliste; + + L #VollPuffer_Nr ;//angefahrener Puffer + T "MW220"; + L #Dyn.ShopGroup_OUT; + T "MD222"; + + CALL "DatenIn"//Anforderung in Datenliste eintragen + ( SSDB := 102 , + SSDW := 0 , + INDATEN := P#M220.0 , + RE_VAL := "MB219" + ); + + UN "M219.6";//Daten wurden überschrieben + UN "M219.7";//Eintrag ist richtig erfolgt + SPB NoChange_Abrufliste; + + L #Dyn.ShopGroup_OUT; + T #Dyn.ShopGroup_AFL_Gespeichert ;//Eingetragene ShopGroup_OUT + + SET; + S #Status2.Eintrag_DL_Abrufliste_erfolgt; + + SPA NoChange_Abrufliste; + +Austrag_Abrufliste: NOP 0; +//Austrag aus Abrufliste: + L #VollPuffer_Nr ;//angefahrener Puffer + T "MW220"; + + CALL "DatenOut"//Anforderung aus Datenliste löschen + ( SSDB := 102 , + SSDW := 0 , + PARA := WORD#16#E100 , + SEARCHDATEN := P#M220.0 , + RE_VAL := "MB219" , + OUTDATEN := P#M230.0 , + Position := "MW196" + ); + + L DINT#0; + T #Dyn.ShopGroup_AFL_Gespeichert ;//Kein ShopGroup_OUT mehr eingetragen + + SET; + R #Status2.Eintrag_DL_Abrufliste_erfolgt; + +NoChange_Abrufliste: NOP 0; + +NETWORK +TITLE = Schrittkette anhalten + U #Dyn.Sk_OUT.Auto_akt;//Automatik ist aktiv + U #Dyn.Sk_OUT.Bereich_ok; + SPA en08_Mig;//Schrittkette nicht anhalten ! + + SET;//Störungen löschen + R #Dyn.Sk_IN.Err_Uebzeit; + R #Dyn.Sk_IN.Err_Schritt; + R #Dyn.Sk_OUT.Err_Uebzeit; + R #Dyn.Sk_OUT.Err_Schritt; + + L 0;//Zeitwerte löschen + T #Dyn.Sk_IN.Terr_Zelle; + T #Dyn.Sk_IN.Tok_Zelle; + T #Dyn.Sk_OUT.Terr_Zelle; + T #Dyn.Sk_OUT.Tok_Zelle; + + SPA RET; + +en08_Mig: NOP 0; + +NETWORK +TITLE = IN-Sprungverteiler + L #Dyn.Sk_IN.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + L -1;//angegeben ? + ==I;//Nein ! + SPB INNEU; + + TAK;//Neuen Schritt übergeben + T #Dyn.Sk_IN.Akt_Schritt; + + L -1;//Urzustand + T #Dyn.Sk_IN.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + +INNEU: SET; + R #Ueb_akt ;//Überwachungszeit aktivieren + R #Warte_neu;//Wartezeit neutriggern + R #Warte_stop;//Wartezeit stoppen + + L #Dyn.Sk_IN.Akt_Schritt; + SPL INEnde; + SPA INs000 ;//Schritt 0 + SPA INs001 ;//Schritt 1 + SPA INs002 ;//Schritt 2 + SPA INs003 ;//Schritt 3 + SPA INs004 ;//Schritt 4 + SPA INs005 ;//Schritt 5 + SPA INs006 ;//Schritt 6 + SPA INs007 ;//Schritt 7 + SPA INs008 ;//Schritt 8 + SPA INs009 ;//Schritt 9 + SPA INs010 ;//Schritt 10 + SPA INs011 ;//Schritt 11 + SPA INs012 ;//Schritt 12 + SPA INs013 ;//Schritt 13 + SPA INs014 ;//Schritt 14 + SPA INs015 ;//Schritt 15 + SPA INs016 ;//Schritt 16 + SPA INs017 ;//Schritt 17 + SPA INs018 ;//Schritt 18 + SPA INs019 ;//Schritt 19 + SPA INs020 ;//Schritt 20 + SPA INs021 ;//Schritt 21 + SPA INs022 ;//Schritt 22 + SPA INs023 ;//Schritt 23 + SPA INs024 ;//Schritt 24 + SPA INs025 ;//Schritt 25 + SPA INs026 ;//Schritt 26 + SPA INs027 ;//Schritt 27 + SPA INs028 ;//Schritt 28 + SPA INs029 ;//Schritt 29 + SPA INs030 ;//Schritt 30 +INEnde: S #Dyn.Sk_IN.Err_Schritt;//Undefinierter Schritt + + L 16#AA01; + T #Dyn.Stop_Ursache_IN; + + SPA OUT_Sk; + +INNeu_Mig: U #Dyn.Sk_IN.Err_Uebzeit; + SPBN INSk; + + L 16#AA02; + T #Dyn.Stop_Ursache_IN; + + SPA OUT_Sk; + +INSk: T #Dyn.Sk_IN.Akt_Schritt; + + L 0;//Zeitwerte löschen + T #Dyn.Sk_IN.Terr_Zelle; + T #Dyn.Sk_IN.Tok_Zelle; + L -1; + T #Dyn.Sk_IN.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + SPA INNEU; + +//Nicht programmierte Schritte: +//INs000: SPA INEnde +//INs001: SPA INEnde +//INs002: SPA INEnde +INs003: SPA INEnde; +//INs004 : SPA INEnde +//INs005: SPA INEnde +//INs006: SPA INEnde +//INs007: SPA INEnde +INs008: SPA INEnde; +INs009: SPA INEnde; +INs010: SPA INEnde; +INs011: SPA INEnde; +INs012: SPA INEnde; +INs013: SPA INEnde; +INs014: SPA INEnde; +INs015: SPA INEnde; +INs016: SPA INEnde; +INs017: SPA INEnde; +INs018: SPA INEnde; +INs019: SPA INEnde; +//INs020: SPA INEnde +//INs021: SPA INEnde +INs022: SPA INEnde; +INs023: SPA INEnde; +INs024: SPA INEnde; +INs025: SPA INEnde; +INs026: SPA INEnde; +INs027: SPA INEnde; +INs028: SPA INEnde; +INs029: SPA INEnde; +INs030: SPA INEnde; + +NETWORK +TITLE = IN-Schritt X: Reserve + SET;//Weiterschaltbedingung + = #Weiter; + +//Schrittaktionen: + SET; + + L 16#A001; + T #Dyn.Stop_Ursache_IN; + + U #Dyn.Sk_IN.Reset_Akt;//Reset ist aktiv + L 20;//Weiter mit Schritt 20 + SPB INNeu_Mig ;//Bei diesem Schritt weiter + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk_IN.Err_Uebzeit;//Sofort weiter ! + + L 0;//Angabe der Wartezeit (*10ms) + SPB INPlus ;//Nächsten Schritt starten + + L 1;//Weiter mit Schritt 1 + SPB INNeu_Mig ;//Bei diesem Schritt weiter + + T #Dyn.Sk_IN.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + SET; + U #Dyn.Sk_IN.Auto_akt;//Automatik ist aktiv + U #Dyn.Sk_IN.Bereich_ok; + = #Ueb_akt;//Überwachungszeit aktivieren + L 50 ;//Angabe der Überwachungszeit (*1s) + SPA INtueb ;//Überwachungszeit + + SPA OUT_Sk; + +NETWORK +TITLE = IN-Schritt 0: Warten auf Trolley +INs000: SET ;//Weiterschaltbedingung + U #B_InSchleuse_IN ;//Trolley im Schleuse erkannt + U #Dyn.Sk_IN.Auto_akt ;//Automatik ist aktiv + U #Dyn.Sk_IN.Bereich_ok; + = #Weiter; + +//Schrittaktionen: + SET; + R #Dyn.Error.Err_Puffer_nicht_leer_IN; + + U #Dyn.Sk_IN.Reset_Akt;//Reset ist aktiv + L 20;//Weiter mit Schritt 20 + SPB INNeu_Mig ;//Bei diesem Schritt weiter + + L 0; + T #Dyn.TrolleyID_Schleuse_IN; + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk_IN.Err_Uebzeit;//Sofort weiter ! + L 100 ;//Angabe der Wartezeit (*10ms) + SPB INPlus ;//Nächsten Schritt starten + + L 16#A001; + T #Dyn.Stop_Ursache_IN; + +//Überwachungszeit starten: + L #Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege; + L 0;//Trolleydaten vorhanden ? + >I ;//Ja ! + UN #B_InSchleuse_IN ;//Trolley im Schleuse erkannt + UN #Schleuse_geöffnet_IN; + = #Ueb_akt ;//Überwachungszeit aktivieren + + U #Dyn.Sk_IN.Err_Uebzeit; + UN #B_InSchleuse_IN ;//Trolley im Schleuse erkannt + UN #Status2.Trolley_nicht_in_Schleuse_IN;//Reset / Inilauf aktiv + S #Dyn.Error.Err_Trolley_nicht_in_Schleuse_IN; + + L #Puffer.Übzeit_in_Schleuse; + + SPA INtueb ;//Überwachungszeit + +NETWORK +TITLE = IN-Schritt 1: Trolley ist in Schleuse / Gleiche Shop-Gruppe? +INs001: NOP 0; + +//Schrittaktionen: + UN #B_InSchleuse_IN ;//Trolley im Schleuse erkannt + L 0 ;//Weiter mit Schritt 0 + T #Dyn.Sk_IN.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + SPB OUT_Sk; + + SET; + R #Status2.Trolley_nicht_in_Schleuse_IN; + +//Aber keine Daten mehr ?: + L #Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege; + L 0; + ==I; + SPBN In_Ok;//Negierter Sprung! + +//Falls ein Trolley reserviert, diesen dann übergeben: + L #Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege; + L 0;//Trolley reserviert? + ==I;//Nein! + S #Status2.Puffer_nicht_leer_IN; + S #Status2.Puffer_initialisieren_IN;//Damit Einfahren blockiert wird + SPB In_Ok; + +//Diesen Trolley als eingefahrenen übergeben: + L #Dyn.Reservierungs_DL.Res_Trolley[1].Trolley_ID; + T #Dyn.TrolleyID_Einfahrt; + + //Puffer unten diesselbe Shop-Gruppe?: +In_Ok: L #Dyn.ShopGroup_IN; + L #Dyn.ShopGroup_OUT; + ==D ;//Gleich! + U(; + L dint#0;//Und angegeben ? + <>D;//Ja ! + ); + O #Dyn.Status.Puffer_leer_OUT;//oder leer! + O #Status2.Puffer_initialisieren_IN;//wird in Schritt 2 gecheckt + L 2 ;//Weiter mit Schritt 2 + SPB INNeu_Mig ;//Bei diesem Schritt weiter + + L 16#A011; + T #Dyn.Stop_Ursache_IN; + + SPA OUT_Sk ;//Warten! + +NETWORK +TITLE = IN-Schritt 2: Nach unten fahren ok ? +INs002: NOP 0; +//Schrittaktionen: + UN #B_InSchleuse_IN ;//Trolley im Schleuse erkannt + L 0 ;//Weiter mit Schritt 0 + T #Dyn.Sk_IN.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + SPB OUT_Sk; + +//Anlage aus oder Störung: + L 16#A021; + T #Dyn.Stop_Ursache_IN; + + UN #Dyn.Sk_IN.Auto_akt ;//Automatik ist aktiv + ON #Dyn.Sk_IN.Bereich_ok;//Bereich ist gestört + SPB INX002; + +//Puffer unten Platz?: + L 16#A022; + T #Dyn.Stop_Ursache_IN; + +//Sonderfall Inilauf in beiden Puffern: + U #Status2.Puffer_initialisieren_IN; + U #Dyn.Status.Puffer_initialisieren_OUT; + U #Schleuse_geöffnet_OUT; + U #B_InSchleuse_OUT;//Nur einmalig + SPB Y002 ;//Damit schneller fertig + + UN #Dyn.Status."Puffer_hat Platz_OUT";//Starten ist erlaubt + SPB INX002; + +//Kein Antrieb im Puffer: +Y002: U #Dyn.Sk_OUT.Auto_akt;//Automatik ist aktiv + U #Dyn.Sk_OUT.Bereich_ok; + L 4 ;//Daten an Puffer unten übergeben + SPB INNeu_Mig ;//Bei diesem Schritt weiter + + SPA OUT_Sk; + +INX002: L 1;//Check + T #Dyn.Sk_IN.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + SPA OUT_Sk; + +NETWORK +TITLE = IN-Schritt 4: Pufferdaten unten/oben ändern +INs004: SET ;//Weiterschaltbedingung + = #Weiter; + +//Schrittaktionen: +//Shop-Group übergeben: + L #Dyn.Trolley_DL_Ausfahrt.Datenlistenkopf.AnzahlEintraege; + L 0; + ==I ;//Ja ! + = #"1.Trolley_OUT";//Also kommt 1.Trolley + + UN #"1.Trolley_OUT"; + SPB INNoFirst; + +//ShopGroup speichern bei 1.Trolley speichern: + L #Dyn.ShopGroup_IN; + T #Dyn.ShopGroup_OUT; + +INNoFirst: NOP 0; +//Daten an Puffer unten übergeben: + L #Dyn.Trolley_DL_Einfahrt.VollPuffer_Trolley_IN[1].Abruf_ShopGroup; + T "MD224"; + L #Dyn.Trolley_DL_Einfahrt.VollPuffer_Trolley_IN[1].Trolley_ID; + T "MD220"; + +//ID: sinnvolle Daten ? + L DINT#0; + <>D; + SPB Daten_ok; + + L DINT#0 ;//Bleibt trotzdem 0 + T "MD220"; + +//Daten Puffer unten eintragen: +Daten_ok: L #Puffer.Puffer_Dyn_DW; + L #Puffer.PufferTrolleyliste_DW_Out; + +I; + T #SSDW; + + CALL "DatenIn" + ( SSDB := #Puffer.Puffer_Dyn_DB , + SSDW := #SSDW , + INDATEN := P#M220.0 , + RE_VAL := "MB199" + ); + +//Puffer oben Daten austragen: +//Austrag aus Trolley-VollPufferliste oben + L #Dyn.Trolley_DL_Einfahrt.VollPuffer_Trolley_IN[1].Trolley_ID; + T "MD220"; + + L #Puffer.Puffer_Dyn_DW; + L #Puffer.PufferTrolleyliste_DW_IN; + +I; + T #SSDW; + + CALL "DatenOut" + ( SSDB := #Puffer.Puffer_Dyn_DB , + SSDW := #SSDW , + PARA := 16#E100 , //Eintrag löschen + SEARCHDATEN := P#M220.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , //Nicht relevant + Position := "MW196" + ); + + L 5 ;//Nur 1 langes Signal! + SPA INNeu_Mig ;//Bei diesem Schritt weiter + +NETWORK +TITLE = IN-Schritt 5: Trolley fährt aus ? +INs005: SET ;//Weiterschaltbedingung + UN #B_InSchleuse_IN ;//Sensor Trolley ist in Schleuse + U #Schleuse_geöffnet_IN; + = #Weiter; + +//Schrittaktionen: + SET; + S #Y_Schleuse_Auf_IN;//Schleuse öffnen + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk_IN.Err_Uebzeit;//Sofort weiter ! + R #Dyn.Error.Err_Trolley_raus_IN;//Trolley fährt nicht aus + L 100 ;//Angabe der Wartezeit (*10ms) + SPB INPlus ;//Nächsten Schritt starten + + U #Dyn.Sk_IN.Err_Uebzeit; + S #Dyn.Error.Err_Trolley_raus_IN;//Trolley fährt nicht aus + + L 16#B051; + T #Dyn.Stop_Ursache_IN; + + SET; + = #Ueb_akt ;//Überwachungszeit aktivieren + L #Puffer.Übzeit_aus_Schleuse;//Angabe der Überwachungszeit (*1s) + SPA INtueb ;//Überwachungszeit + +NETWORK +TITLE = IN-Schritt 6: Schleuse Mindestzeit geöffnet ? +INs006: SET ;//Weiterschaltbedingung + U #Status2.MindestZeit_ok_IN; + = #Weiter; + +//Schrittaktionen: + SET; + S #Y_Schleuse_Auf_IN;//Schleuse öffnen + + U #B_InSchleuse_IN ;//Trolley wieder erkannt + L 5 ;//Weiter mit Schritt 5 + SPB INNeu_Mig ;//Bei diesem Schritt weiter + + U #Weiter; + L 0; + SPB INPlus ;//Nächsten Schritt starten + + L 16#B061; + T #Dyn.Stop_Ursache_IN; + + SPA OUT_Sk; + +NETWORK +TITLE = IN-Schritt 7: Letzter Trolley oben ? +INs007: SET ;//Weiterschaltbedingung + = #Weiter; + +//Schrittaktionen: +//Letzter Trolley ausgefahren?: + L #Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege; + L 0;//Liste leer? + ==I; + S #Status2.Leer_Check_IN; + +//Inilauf aktiv?: + UN #Status2.Puffer_initialisieren_IN; + SPB INENDE_Mig; + + L 0 ;//Zeiten löschen + T #Dyn.Leer_Zeit_IN; + + SPA INENDE_Mig; + +NETWORK +TITLE = IN-Schritt 20: Schleuse resetten +INs020: SET ;//Weiterschaltbedingung + = #Weiter;//Weiterschaltbedingung ist erfüllt + +//Schrittaktionen: + L 16#A201; + T #Dyn.Stop_Ursache_IN; + + U #Weiter;//Weiterschaltbedingung ist erfüllt + L 300;//Angabe der Wartezeit (*10ms) + SPB INPlus ;//Nächsten Schritt starten + + SET; + = #Ueb_akt;//Überwachungszeit aktivieren + L 30;//Angabe der Überwachungszeit (*100ms) + SPA INtueb ;//Überwachungszeit + +NETWORK +TITLE = IN-Schritt 21: Reset ist zu Ende +INs021: SET; + R #Dyn.Sk_IN.Reset_Akt;//Reset ist aktiv + R #Dyn.HMI.Schleuse_resetten_IN; -CALL FC "DatenIn" (SSDB:=Puffer.Puffer_Dyn_DB, SSDW:=SSDW, INDATEN:=P#M220.0, RE_VAL:="MB199") + SPA INENDE_Mig ;//Neubeginn - L "MB199" - T Dyn.Rueckmld.RET_VAL_DL_VollPufferTrolley_IN // wegen Bit-Auswertung +NETWORK +TITLE = IN-Schrittkette beenden +INENDE_Mig: L 0;//Schritt 0: Warten + T #Dyn.Sk_IN.Akt_Schritt; -// Austrag aus Trolley-Reservierungsliste - L Dyn.TrolleyID_Einfahrt // Eintrag ist erfolgt - T "MD220" + L 0;//Zeitwert löschen + T #Dyn.Sk_IN.Terr_Zelle; + T #Dyn.Sk_IN.Tok_Zelle; -ResOut: L Puffer.Puffer_Dyn_DW - L Puffer.PufferReservierungsliste_DW - +I - T SSDW + SET; + R #Dyn.Sk_IN.Err_Uebzeit; -CALL FC "DatenOut" (SSDB:=Puffer.Puffer_Dyn_DB, SSDW:=SSDW, PARA:=16#E100, SEARCHDATEN:=P#M220.0, RE_VAL:=Dyn.Rueckmld.RET_VAL_DL_Res_OUT, OUTDATEN:=P#M220.0, Position:="MW196") // Eintrag löschen | Nicht relevant + SPA OUT_Sk; + +NETWORK +TITLE = IN-Nächsten Schritt aktivieren +INPlus: T #Dyn.Sk_IN.T_ok;//Wartezeit übergeben + + U #Dyn.Sk_IN.Err_Uebzeit ;//Störung noch nicht quittiert + SPB OUT_Sk; + + L 0;//keine Wartezeit ? + ==I;//Ja ! -> sofort weiter + SPB INw220; + + UN #Warte_neu;//Wartezeit neutriggern + SPB INW220_Mig; + + L 0; + T #Dyn.Sk_IN.Tok_Zelle;//Wartezeit + +INW220_Mig: U #Warte_stop;//Wartezeit stoppen + SPB OUT_Sk; + + L #Dyn.Sk_IN.Tok_Zelle; + L "MW4";//Wartezeit +10ms + +I; + T #Dyn.Sk_IN.Tok_Zelle;//Wartezeit + L #Dyn.Sk_IN.T_ok;//abgelaufen ? + I;//abgelaufen ? + UN #Dyn.Sk_IN.Err_Uebzeit; + SPB INen24 ;//Nein ! + + U #Ueb_akt;//Überwachungszeit aktivieren + S #Dyn.Sk_IN.Err_Uebzeit; + + L 0;//Zeitwert löschen + T #Dyn.Sk_IN.Terr_Zelle; + + SPA OUT_Sk; + +INen24: NOP 0; + +NETWORK +TITLE = IN-Überwachungszeit +1 + UN #Dyn.Sk_IN.Ueb_akt;//Schrittaktion ist aktiv + ON "1s-Impuls"; + SPB OUT_Sk; + + L #Dyn.Sk_IN.Terr_Zelle; + + 1 ;//Üb.zeit +1s + T #Dyn.Sk_IN.Terr_Zelle; + + SPA OUT_Sk; + +NETWORK +TITLE = OUT-Sprungverteiler +OUT_Sk: L #Dyn.Sk_OUT.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + L -1;//angegeben ? + ==I;//Nein ! + SPB NEU; + + TAK;//Neuen Schritt übergeben + T #Dyn.Sk_OUT.Akt_Schritt; + + L -1;//Urzustand + T #Dyn.Sk_OUT.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + +NEU: SET; + R #Ueb_akt ;//Überwachungszeit aktivieren + R #Warte_neu;//Wartezeit neutriggern + R #Warte_stop;//Wartezeit stoppen + + L #Dyn.Sk_OUT.Akt_Schritt; + SPL Ende; + SPA s000;//Schritt 0 + SPA s001;//Schritt 1 + SPA s002;//Schritt 2 + SPA s003;//Schritt 3 + SPA s004;//Schritt 4 + SPA s005;//Schritt 5 + SPA s006;//Schritt 6 + SPA s007;//Schritt 7 + SPA s008;//Schritt 8 + SPA s009;//Schritt 9 + SPA s010;//Schritt 10 + SPA s011;//Schritt 11 + SPA s012;//Schritt 12 + SPA s013;//Schritt 13 + SPA s014;//Schritt 14 + SPA s015;//Schritt 15 + SPA s016;//Schritt 16 + SPA s017;//Schritt 17 + SPA s018;//Schritt 18 + SPA s019;//Schritt 19 + SPA s020;//Schritt 20 + SPA s021;//Schritt 21 + SPA s022;//Schritt 22 + SPA s023;//Schritt 23 + SPA s024;//Schritt 24 + SPA s025;//Schritt 25 + SPA s026;//Schritt 26 + SPA s027;//Schritt 27 + SPA s028;//Schritt 28 + SPA s029;//Schritt 29 + SPA s030;//Schritt 30 +Ende: S #Dyn.Sk_OUT.Err_Schritt;//Undefinierter Schritt + + L 16#A131; + T #Dyn.Stop_Ursache_OUT; + + SPA RET; + +Neu_Mig: U #Dyn.Sk_OUT.Err_Uebzeit; + SPBN Sk; + + L 16#A132; + T #Dyn.Stop_Ursache_OUT; + + SPA RET; + +Sk: T #Dyn.Sk_OUT.Akt_Schritt; + + L 0;//Zeitwerte löschen + T #Dyn.Sk_OUT.Terr_Zelle; + T #Dyn.Sk_OUT.Tok_Zelle; + + SPA NEU; + +//Nicht programmierte Schritte: +//s000: SPA Ende +//s001: SPA Ende +//s002: SPA Ende +s003: SPA Ende; +s004: SPA Ende; +//s005: SPA Ende +//s006: SPA Ende +//s007: SPA Ende +s008: SPA Ende; +s009: SPA Ende; +s010: SPA Ende; +s011: SPA Ende; +s012: SPA Ende; +s013: SPA Ende; +s014: SPA Ende; +s015: SPA Ende; +s016: SPA Ende; +s017: SPA Ende; +s018: SPA Ende; +s019: SPA Ende; +//s020: SPA Ende +//s021: SPA Ende +s022: SPA Ende; +s023: SPA Ende; +s024: SPA Ende; +s025: SPA Ende; +s026: SPA Ende; +s027: SPA Ende; +s028: SPA Ende; +s029: SPA Ende; +s030: SPA Ende; + +NETWORK +TITLE = OUT-Schritt X: Reserve + SET;//Weiterschaltbedingung + = #Weiter; + +//Schrittaktionen: + SET; + + L 16#B001; + T #Dyn.Stop_Ursache_OUT; + + U #Dyn.Sk_OUT.Reset_Akt;//Reset ist aktiv + L 20;//Weiter mit Schritt 20 + SPB Neu_Mig;//Bei diesem Schritt weiter + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk_OUT.Err_Uebzeit;//Sofort weiter ! + L 0 ;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + L 1;//Weiter mit Schritt 1 + SPB Neu_Mig;//Bei diesem Schritt weiter + + T #Dyn.Sk_OUT.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + SET; + U #Dyn.Sk_OUT.Auto_akt;//Automatik ist aktiv + U #Dyn.Sk_OUT.Bereich_ok; + = #Ueb_akt;//Überwachungszeit aktivieren + L 50 ;//Angabe der Überwachungszeit (*1s) + SPA tueb;//Überwachungszeit + + SPA RET; + +NETWORK +TITLE = OUT-Schritt 0: Warten auf Trolley +s000: SET;//Weiterschaltbedingung + U #B_InSchleuse_OUT ;//Trolley im Schleuse erkannt + U #Dyn.Sk_OUT.Auto_akt ;//Automatik ist aktiv + U #Dyn.Sk_OUT.Bereich_ok; + = #Weiter; + +//Schrittaktionen: + SET; + R #Dyn.Error.Err_Puffer_nicht_leer_OUT; + + U #Dyn.Sk_OUT.Reset_Akt;//Reset ist aktiv + L 20;//Weiter mit Schritt 20 + SPB Neu_Mig;//Bei diesem Schritt weiter + + L 0; + T #Dyn.TrolleyID_Schleuse_Out; + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk_OUT.Err_Uebzeit;//Sofort weiter ! + L 100 ;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + L 16#B001; + T #Dyn.Stop_Ursache_OUT; + + //Überwachungszeit starten: + L #Dyn.Trolley_DL_Ausfahrt.Datenlistenkopf.AnzahlEintraege; + L 0;//Trolleydaten vorhanden ? + >I ;//Ja ! + UN #B_InSchleuse_OUT ;//Trolley im Schleuse erkannt + UN #Schleuse_geöffnet_OUT; + = #Ueb_akt ;//Überwachungszeit aktivieren + + U #Dyn.Sk_OUT.Err_Uebzeit; + UN #B_InSchleuse_OUT ;//Trolley im Schleuse erkannt + UN #Dyn.Status.Trolley_nicht_in_Schleuse_OUT;//Reset / Inilauf aktiv + S #Dyn.Error.Err_Trolley_nicht_in_Schleuse_OUT; + + L #Puffer.Übzeit_in_Schleuse; + + SPA tueb;//Überwachungszeit + +NETWORK +TITLE = OUT-Schritt 1: Trolley ist in Schleuse / Warten auf Auftrag +s001: NOP 0; + +//Schrittaktionen: + UN #B_InSchleuse_OUT ;//Trolley im Schleuse erkannt + L 0 ;//Weiter mit Schritt 0 + SPB Neu_Mig;//Bei diesem Schritt weiter + + L #Dyn.Trolley_DL_Ausfahrt.VollPuffer_Trolley_Out[1].Trolley_ID; + T #Dyn.TrolleyID_Schleuse_Out;//Damit bei Ausfahrt angezeigt werden kann + +//Aber keine Daten mehr ?: + L #Dyn.Trolley_DL_Ausfahrt.Datenlistenkopf.AnzahlEintraege; + L 0; + ==I; + S #Dyn.Status.Puffer_nicht_leer_OUT; + S #Dyn.Status.Puffer_initialisieren_OUT;//Damit Einfahren blockiert wird + +//Spezial-Betriebsarten: + U #Dyn.Status.Einen_VollTrolley_ausfahren_OUT; + O #Status2.Alles_ausfahren_OUT; + O #Dyn.Status.Puffer_initialisieren_OUT; + O; + U #Dyn.Status."Undef.Trolley_in_Schleuse_OUT"; + UN #Schleuse_geöffnet_IN;//Trolley fährt noch ein + L 2 ;//Weiter mit Schritt 2 + SPB Neu_Mig ;//Bei diesem Schritt weiter + +//Trolleydaten anzeigen: + L 16#B011; + T #Dyn.Stop_Ursache_OUT; + + L #Dyn.TrolleyID_Schleuse_Out; + L DINT#0; + ==D;//Nein! + = #Dyn.Error.Err_Puffer_nicht_leer_IN; + SPB RET; + +//TrolleyID checken, ob in Trolleyliste: +/// CALL "Trolley_DL_Check_ID" +// Gesamt_Trolley_DL :=#Puffer.Gesamt_Trolley_DL +// TrolleyID :=#Dyn.TrolleyID_Schleuse_Out +// Check_EndZiel :="MW220"//Hier uninteressant +// Check_ZwischenZiel :="MW220"//Hier uninteressant +// Check_ShopGroup :="MD220"//Hier uninteressant +// Check_Standort :="MW220"//Hier uninteressant +// Err :=#Dyn.Error.Err_TrolleyID_Schleuse_unbekannt + +//Ausfahr-Auftrag vorhanden?: + L 16#B012; + T #Dyn.Stop_Ursache_OUT; + + L #Dyn.ShopGroup_Auftrag_zum_Ausfahren;//TrolleyID zum Ausfahren angegeben? + T "MD220"; + L DINT#0; + ==D;//Nein! + S #Dyn.Status.Trolley_wartet_Auftrag; + SPB RET; + +//Definierten Trolley checken, ob in TrolleyListe vorhanden: + L #Puffer.Puffer_Dyn_DW; + L #Puffer.PufferTrolleyliste_DW_Out; + +I; + T #SSDW; + + CALL "DatenOut" + ( SSDB := #Puffer.Puffer_Dyn_DB , + SSDW := #SSDW , + PARA := 16#0000 , //Eintrag suchen + SEARCHDATEN := P#M220.0 , + RE_VAL := #Dyn.Rueckmld.RET_VAL_DL_VollPufferTrolley_OUT , + OUTDATEN := P#M220.0 , //Nicht relevant + Position := "MW196" + ); + + L 16#B013; + T #Dyn.Stop_Ursache_OUT; + + L #Dyn.Rueckmld.RET_VAL_DL_VollPufferTrolley_OUT; + L 2#10000000; + <>I; +/// = #Dyn.Error.Err_TrolleyID_nicht_im_Leerpuffer + S #Dyn.Status.Trolley_wartet_Auftrag; + SPB RET; + + L 2 ;//Weiter mit Schritt 2 + SPA Neu_Mig ;//Bei diesem Schritt weiter + +NETWORK +TITLE = OUT-Schritt 2: Ausfahren ok ? +s002: NOP 0; + +//Schrittaktionen: + UN #B_InSchleuse_OUT ;//Trolley im Schleuse erkannt + L 0 ;//Weiter mit Schritt 0 + SPB Neu_Mig;//Bei diesem Schritt weiter + + SET; + S #Dyn.Status."Trolley_wartet_Bereich+1"; + +//Anlage aus oder Störung: + L 16#B020; + T #Dyn.Stop_Ursache_OUT; + + UN #Dyn.Sk_OUT.Auto_akt ;//Automatik ist aktiv + ON #Dyn.Sk_OUT.Bereich_ok;//Bereich ist gestört + SPB X002; + +//Starten erlaut Trolley ?: + L 16#B021; + T #Dyn.Stop_Ursache_OUT; + + UN #Start_Ok ;//Starten ist erlaubt + SPB X002; + +//Inks ok ?: + L 16#B022; + T #Dyn.Stop_Ursache_OUT; + + UN #Inks_Ok ;//Starten ist erlaubt + SPB X002; + +//Stau im Bereich +1: + L 16#B023; + T #Dyn.Stop_Ursache_OUT; + + U #B_Stau_raus_Out; + SPB X002 ;//Stau + +//B_Aus_Schleuse aktiv: + L 16#B024; + T #Dyn.Stop_Ursache_OUT; + + U #Puffer.Parameter_allg.B_AusSep_vorhanden; + U #B_AusSchleuse_OUT; + = #Dyn.Error.Err_Raus_Sensor;//Raus-Sensor wird nicht erreicht (oder dauernd aktiv)! + SPB X002; + +//Antriebe aktivieren / aktiv ?: + U #Puffer.Parameter_allg.Antrieb_Plus_vorhanden;//Schleuse an weiterem Antrieb (Weiche) + S #Antrieb_plus_start;//Kreisel-Antrieb plus starten + + L 16#B025; + T #Dyn.Stop_Ursache_OUT; + + UN #Antrieb_plus_aktiv;//Kreisel-Antrieb plus aktiv + U #Puffer.Parameter_allg.Antrieb_Plus_vorhanden;//Schleuse an weiterem Antrieb (Weiche) + ON #Dyn.Sk_OUT.Auto_akt;//Automatik ist aktiv + ON #Dyn.Sk_OUT.Bereich_ok; + SPB RET; + + L 5 ;//Nur 1 langes Signal! + SPA Neu_Mig ;//Bei diesem Schritt weiter + +X002: L 1 ;//Auftrag checken + T #Dyn.Sk_OUT.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + SPA RET; + +NETWORK +TITLE = OUT-Schritt 5: Trolley fährt aus/ausgefahren ? +s005: SET ;//Weiterschaltbedingung + UN #B_InSchleuse_OUT ;//Sensor Trolley ist in Schleuse + U(; + O #B_AusSchleuse_OUT ;//Sensor Trolley aus Schleuse gefahren + ON #Puffer.Parameter_allg.B_AusSep_vorhanden; + ); + U #Antrieb_plus_aktiv; + = #Weiter; + +//Schrittaktionen: + SET; + R #Start_Ok ;//Damit kein weiterer Puffer ausfährt + S #Y_Schleuse_Auf_OUT ;//Schleuse öffnen + S #Dyn.Status.Trolley_fährt_aus_OUT; + S #Antrieb_plus_start;//Kreisel-Antrieb plus starten + +//Trolley ist draussen: + U(; + O #B_AusSchleuse_OUT ;//Sensor Trolley aus Schleuse gefahren + ON #Puffer.Parameter_allg.B_AusSep_vorhanden; + ); + R #Dyn.Sk_OUT.Err_Uebzeit;//Sofort weiter ! + R #Dyn.Error.Err_Trolley_raus_OUT;//Trolley fährt nicht aus + L 0; + SPB Plus ;//Nächsten Schritt starten + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk_OUT.Err_Uebzeit;//Sofort weiter ! + R #Dyn.Error.Err_Trolley_raus_OUT;//Trolley fährt nicht aus + L 50;//Falls nur mit Sensor gefahren wird, dann Wartezeit! + SPB Plus ;//Nächsten Schritt starten + +//Trolley fährt nicht raus!: + U #Dyn.Sk_OUT.Err_Uebzeit; + O #B_QuerTrolley_Out;//QuerTrolley auf Crashkurs + S #Dyn.Error.Err_Trolley_raus_OUT;//Trolley fährt nicht aus + + L 16#B051; + T #Dyn.Stop_Ursache_OUT; + + UN #B_AusSchleuse_OUT ;//Sensor Trolley aus Schleuse gefahren + SPB x052; + + L 16#B052; + T #Dyn.Stop_Ursache_OUT; + +x052: U #Antrieb_plus_aktiv; + = #Ueb_akt ;//Überwachungszeit aktivieren + L #Puffer.Übzeit_aus_Schleuse;//Angabe der Überwachungszeit (*1s) + SPA tueb ;//Überwachungszeit + +NETWORK +TITLE = OUT-Schritt 6: Schleuse Mindestzeit geöffnet ? +s006: SET ;//Weiterschaltbedingung + U #Dyn.Status.MindestZeit_ok_OUT; + O; + U #Puffer.Parameter_allg.B_AusSep_vorhanden; + U #B_AusSchleuse_OUT ;//Sensor Trolley aus Schleuse gefahren + = #Weiter; + +//Schrittaktionen: + U #B_QuerTrolley_Out ;//QuerTrolley auf Crashkurs + S #Dyn.Error.Err_Trolley_raus_OUT;//Trolley fährt nicht aus + + SET; + R #Start_Ok;//Damit kein weiterer Puffer ausfährt + S #Y_Schleuse_Auf_OUT ;//Schleuse öffnen + S #Antrieb_plus_start;//Kreisel-Antrieb plus starten + S #Dyn.Status.Trolley_fährt_aus_OUT; + + U #B_InSchleuse_OUT;//Trolley wieder erkannt + L 5 ;//Weiter mit Schritt 5 + SPB Neu_Mig;//Bei diesem Schritt weiter + + U #Weiter; + L 0; + SPB Plus ;//Nächsten Schritt starten + + L 16#B061; + T #Dyn.Stop_Ursache_OUT; + + SPA RET; +NETWORK +TITLE = OUT-Schritt 7: Trolleydaten ändern +s007: SET ;//Weiterschaltbedingung + = #Weiter; + +//Schrittaktionen: + SET; + R #Dyn.Status.Einen_VollTrolley_ausfahren_OUT; + S #Dyn.Status.Trolley_draussen_Out;//1 Zyklus + + L #Dyn.Vereinzelungstakte_OUT; + + DINT#1;//Vereinzelungen +1 + T #Dyn.Vereinzelungstakte_OUT; + +//Neue Position B01A an Trolleyliste übergeben: + CALL "Trolley_DL_Neue_Pos" + ( Gesamt_Trolley_DL := #Puffer.Gesamt_Trolley_DL , + TrolleyID := #Dyn.TrolleyID_Schleuse_Out , + Position := 16#B01A , + ShopGroup := DINT#0 , + Err := "M199.0" + ); + +//Austrag aus Trolley-VollPufferliste + L #Dyn.TrolleyID_Schleuse_Out; + T "MD220"; + T #Dyn.TrolleyID_ausgefahren; + + L #Puffer.Puffer_Dyn_DW; + L #Puffer.PufferTrolleyliste_DW_Out; + +I; + T #SSDW; + + CALL "DatenOut" + ( SSDB := #Puffer.Puffer_Dyn_DB , + SSDW := #SSDW , + PARA := 16#E100 , //Eintrag löschen + SEARCHDATEN := P#M220.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , //Nicht relevant + Position := "MW196" + ); + +//Gewollter Trolley ausgefahren?: + L #Dyn.ShopGroup_Auftrag_zum_Ausfahren; + L #Dyn.TrolleyID_ausgefahren; + <>I;//Nicht identisch! + SPB NixAuftrag; + + L 0;//Auftrag löschen, da ausgefahren + T #Dyn.ShopGroup_Auftrag_zum_Ausfahren; + +//Trolley löschen: +NixAuftrag: L DINT#0; + T #Dyn.TrolleyID_Schleuse_Out; + +//Letzter Trolley ausgefahren?: + L #Dyn.Trolley_DL_Ausfahrt.Datenlistenkopf.AnzahlEintraege; + L 0;//Liste leer? + ==I; + S #Dyn.Status.Leer_Check_OUT; + + SPA ENDE_Mig; + +NETWORK +TITLE = OUT-Schritt 20: Schleuse resetten +s020: SET;//Weiterschaltbedingung + = #Weiter;//Weiterschaltbedingung ist erfüllt + +//Schrittaktionen: + U #Schleuse_geöffnet_OUT; + R #Start_Ok;//Damit kein weiterer Puffer ausfährt + + L 16#B201; + T #Dyn.Stop_Ursache_OUT; + + U #Weiter;//Weiterschaltbedingung ist erfüllt + L 300;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + SET; + = #Ueb_akt;//Überwachungszeit aktivieren + L 30;//Angabe der Überwachungszeit (*100ms) + SPA tueb;//Überwachungszeit + +NETWORK +TITLE = OUT-Schritt 21: Reset ist zu Ende +s021: SET; + R #Dyn.Sk_OUT.Reset_Akt;//Reset ist aktiv + R #Dyn.HMI.Schleuse_resetten_OUT; + + SPA ENDE_Mig;//Neubeginn + +NETWORK +TITLE = OUT-Schrittkette beenden +ENDE_Mig: L 0;//Schritt 0: Warten + T #Dyn.Sk_OUT.Akt_Schritt; + + L 0;//Zeitwert löschen + T #Dyn.Sk_OUT.Terr_Zelle; + T #Dyn.Sk_OUT.Tok_Zelle; + + SET; + R #Dyn.Sk_OUT.Err_Uebzeit; + + SPA RET; + +NETWORK +TITLE = OUT-Nächsten Schritt aktivieren +Plus: T #Dyn.Sk_OUT.T_ok;//Wartezeit übergeben + + U #Dyn.Sk_OUT.Err_Uebzeit ;//Störung noch nicht quittiert + SPB RET; + + L 0;//keine Wartezeit ? + ==I;//Ja ! -> sofort weiter + SPB w220; + + UN #Warte_neu;//Wartezeit neutriggern + SPB W220_Mig; + + L 0; + T #Dyn.Sk_OUT.Tok_Zelle;//Wartezeit + +W220_Mig: U #Warte_stop;//Wartezeit stoppen + SPB RET; - L DINT#0 - T Dyn.TrolleyID_Einfahrt + L #Dyn.Sk_OUT.Tok_Zelle; + L "MW4";//Wartezeit +10ms + +I; + T #Dyn.Sk_OUT.Tok_Zelle;//Wartezeit + L #Dyn.Sk_OUT.T_ok;//abgelaufen ? + I;//abgelaufen ? + UN #Dyn.Sk_OUT.Err_Uebzeit; + SPB en24;//Nein ! - L 25 // Stau-Zeit erreicht ? - >=I // Ja ! - S Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb - JCN Xn09 + U #Ueb_akt;//Überwachungszeit aktivieren + S #Dyn.Sk_OUT.Err_Uebzeit; -X090: L 0 // Zeiten löschen - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] + L 0;//Zeitwert löschen + T #Dyn.Sk_OUT.Terr_Zelle; -Xn09: NOP 0 + SPA RET; +en24: NOP 0; +NETWORK +TITLE = OUT-Überwachungszeit +1 + UN #Dyn.Sk_OUT.Ueb_akt;//Schrittaktion ist aktiv + ON "1s-Impuls"; + SPB RET; ---- NW 13: Schleuse IN: Mindestzeit geöffnet/frei --- - L Dyn.Sk_IN.Akt_Schritt - L 6 // Mindestzeit ok? - <>I // Nein! - O B_InSchleuse_IN // Sensor Trolley in Schleuse vorhanden - ON "Schleuse_geöffnet_IN" // Schleuse hat geöffnet - R Status2.MindestZeit_ok_IN - JC INX100 // FreiZeit neu aufziehen + L #Dyn.Sk_OUT.Terr_Zelle; + + 1 ;//Üb.zeit +1s + T #Dyn.Sk_OUT.Terr_Zelle; - AN "1s-Impuls" - O Status2.MindestZeit_ok_IN // Zeit bereits abgelaufen - JC INX10E + SPA RET; - L Dyn.Mindest_Zeit_IN // Sensor B_im_Sep ist frei [1s] - + +1 - T Dyn.Mindest_Zeit_IN // Sensor B_im_Sep ist frei [1s] +NETWORK +TITLE = Ende +RET: NOP 0; - L 10 // Mindest-Zeit erreicht ? - >=I // Ja ! - S Status2.MindestZeit_ok_IN - JCN INX10E + U #Dyn.Status.Puffer_initialisieren_OUT; + O #Status2.Alles_ausfahren_OUT; + R #Start_Ok;//Sonst starten Alle auf einmal durcheinander! -INX100: L 0 // Zeiten löschen - T Dyn.Mindest_Zeit_IN // Sensor B_im_Sep ist frei [1s] + BE; -INX10E: NOP 0 - - ---- NW 14: Schleuse OUT: Mindestzeit geöffnet/frei, Position-Inks übergeben --- - L Dyn.Sk_OUT.Akt_Schritt - L 6 // Mindestzeit ok? - <>I // Nein! - O B_InSchleuse_OUT // Sensor Trolley in Schleuse vorhanden - ON "Schleuse_geöffnet_OUT" // Schleuse hat geöffnet - R Dyn.Status.MindestZeit_ok_OUT - JC X100 // FreiZeit neu aufziehen - - AN "1s-Impuls" - O - A Puffer.Parameter_allg.Antrieb_Plus_vorhanden - AN Antrieb_plus_aktiv - O Dyn.Status.MindestZeit_ok_OUT // Zeit bereits abgelaufen - JC Xn10 - - L Dyn.Mindest_Zeit_OUT // Sensor B_im_Sep ist frei [1s] - + +1 - T Dyn.Mindest_Zeit_OUT // Sensor B_im_Sep ist frei [1s] - - L Puffer.Mindeszeit_Schleuse_geoeffnet // Mindest-Zeit erreicht ? - >=I // Ja ! - S Dyn.Status.MindestZeit_ok_OUT - JCN Xn10 - -X100: L 0 // Zeiten löschen - T Dyn.Mindest_Zeit_OUT // Sensor B_im_Sep ist frei [1s] - -// Schleuse geöffnet: (Position-Inks übergeben) -Xn10: AN "Schleuse_geöffnet_OUT" // Schleuse hat geöffnet - JC X10E - - L Ausfahr_Inks - L Puffer.Puffer_Position_Inks - >I // Rest-Inks-Wert ist größer! - JC X10E - - L Puffer.Puffer_Position_Inks - T Ausfahr_Inks - -X10E: NOP 0 - - ---- NW 15: Keine neue Trolley-Einfahrt Puffer IN ? --- -// Neu-Trolley ist im Puffer oben: - A Neu_Trolley_in_Puffer_IN - O B_VollPufferEinfahrt - JC INX110 - - AN "1s-Impuls" - O Status2.Kein_neuer_Trolley_kommt_IN - JC INXn11 - - L Dyn.Leer_Zeit_IN // Zeit für LeerCheck [1s] - + +1 - T Dyn.Leer_Zeit_IN // Zeit für LeerCheck [1s] - - L Puffer.Wartezeit_bis_Puffer_leer // Leer-Zeit erreicht ? - >=I // Ja ! - JCN INXn11 - - T Dyn.Leer_Zeit_IN // Zeit für LeerCheck einfrieren - - SET - S Status2.Kein_neuer_Trolley_kommt_IN - - JU INXn11 - -INX110: L 0 // Zeiten löschen - T Dyn.Leer_Zeit_IN - - SET - R Status2.Kein_neuer_Trolley_kommt_IN - -INXn11: NOP 0 - - ---- NW 16: Keine neue Trolley-Einfahrt Puffer OUT ? --- -// Neu-Trolley ist im Puffer oben: - A "Schleuse_geöffnet_IN" - JC X110 - - AN "1s-Impuls" - O Dyn.Status.Kein_neuer_Trolley_kommt_OUT - JC Xn11 - - L Dyn.Leer_Zeit_OUT // Zeit für LeerCheck [1s] - + +1 - T Dyn.Leer_Zeit_OUT // Zeit für LeerCheck [1s] - - L Puffer.Wartezeit_bis_Puffer_leer // Leer-Zeit erreicht ? - >=I // Ja ! - JCN Xn11 - - T Dyn.Leer_Zeit_OUT // Zeit für LeerCheck einfrieren - - SET - S Dyn.Status.Kein_neuer_Trolley_kommt_OUT - - JU Xn11 - -X110: L 0 // Zeiten löschen - T Dyn.Leer_Zeit_OUT - - SET - R Dyn.Status.Kein_neuer_Trolley_kommt_OUT - -Xn11: NOP 0 - - ---- NW 17: Reservierungs-Check --- - L Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege - L 0 - ==I - JC NoResCheck // Später -> Hauptstrangdaten checken! - - L VollPuffer_Nr - L 126 - >=I - = Puffer_B // Puffer gehört zu Bereich B - -// Keine Trolleydaten in Sorter A? - A "DVP_Sorter_A".Sorter_A_leer - AN Puffer_B // Puffer gehört zu Bereich B - JC ResDel - -// Keine Trolleydaten in Sorter A+B? - A "DVP_Sorter_A".Sorter_A_leer - A "DVP_Sorter_B".Sorter_B_leer - A Puffer_B // Puffer gehört zu Bereich B - JC ResDel - -// Ansonsten über Ziel-Check -// Daten vom 1.Reservierungs-Trolley holen: - L Dyn.Reservierungs_DL.Res_Trolley[1].Trolley_ID - T "TrolleyDL_SearchDaten".SEARCHDaten.TrolleyID - -// Trolleydaten lesen: -CALL FC "DatenOut" (SSDB:=1000, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=DB1012.DBX0.0, RE_VAL:="MB198", OUTDATEN:=DB1011.DBX0.0, Position:="MW200") // Eintrag lesen - - L "MB198" - L 2#10000000 // Datensatz vorhanden? - <>I // Nein! - JC NoResCheck - - L "TrolleyDL_OutDaten".OUTDaten.EndZiel - L 101 // VollPuffer ? - >=I // Ja! - A( - CAC - L 151 // VollPuffer ? - <=I // Ja! - ) - JC NoResCheck // Warten, Trolley kommt noch! - -ResDel: L Dyn.Reservierungs_DL.Res_Trolley[1].Trolley_ID - T "MD220" - - JU ResOut - -NoResCheck: NOP 0 - - ---- NW 18: Leer-Check IN aktiv --- -// Falls Inilauf aktiv: - A Status2.Puffer_initialisieren_IN - AN Status2.Leer_Check_IN - S Status2.Leer_Check_IN - JCN Check_IN // Negierter Sprung - - L 0 // Zeiten neu aufziehen - T Dyn.Leer_Zeit_IN - - SET - R Status2.Kein_neuer_Trolley_kommt_IN - -Check_IN: NOP 0 -// Abbruch, da Trolley ist doch noch in Schleuse gefahren: - A Status2.Puffer_initialisieren_IN - A Status2.Trolley_nicht_in_Schleuse_IN - A B_InSchleuse_IN - R Status2.Puffer_initialisieren_IN - R Status2.Trolley_nicht_in_Schleuse_IN - R Status2.Leer_Check_IN - - AN Status2.Leer_Check_IN - JC INXn12 - -// Trolley während Check erkannt: - AN Status2.Kein_neuer_Trolley_kommt_IN - JC INXn12 - -// Aber: - A "Schleuse_geöffnet_IN" // aber Schleuse noch geöffnet - O B_InSchleuse_IN // aber Trolley noch in Schleuse - JCN Fertig_IN // Negierter Sprung - - L 0 // Zeit neu aufziehen - T Dyn.Leer_Zeit_IN - - SET - R Status2.Kein_neuer_Trolley_kommt_IN - - JU Xn12 - -Fertig_IN: SET - R Status2.Leer_Check_IN - - A Status2.Puffer_initialisieren_IN - R Status2.Puffer_initialisieren_IN - JCN Reset_IN // Negierter Sprung - -// Trolleyliste löschen: - L Puffer.Puffer_Dyn_DW - L Puffer.PufferTrolleyliste_DW_IN - +I - T SSDW - -CALL FC "DatenReset" (SSDB:=Puffer.Puffer_Dyn_DB, SSDW:=SSDW, RE_VAL:="MB198") - - JU INXn12 // Nicht mehr wegen Gefahr der Überfüllung, besser Reservierungen checken - -// Reservierungs-Liste löschen: - L Puffer.Puffer_Dyn_DW - L Puffer.PufferReservierungsliste_DW - +I - T SSDW - -CALL FC "DatenReset" (SSDB:=Puffer.Puffer_Dyn_DB, SSDW:=SSDW, RE_VAL:="MB198") - - JU Reset_IN - -INXn12: NOP 0 - - ---- NW 19: Leer-Check OUT aktiv --- -// Falls Inilauf aktiv: - A Dyn.Status.Puffer_initialisieren_OUT - AN Dyn.Status.Leer_Check_OUT - S Dyn.Status.Leer_Check_OUT - JCN Check // Negierter Sprung - - L 0 // Zeiten neu aufziehen - T Dyn.Leer_Zeit_OUT - - SET - R Dyn.Status.Kein_neuer_Trolley_kommt_OUT - -Check: NOP 0 -// Abbruch, da Trolley ist doch noch in Schleuse gefahren: - A Dyn.Status.Puffer_initialisieren_OUT - A Dyn.Status.Trolley_nicht_in_Schleuse_OUT - A B_InSchleuse_OUT - CLR // Ist Blödsinn - R Dyn.Status.Puffer_initialisieren_OUT - R Dyn.Status.Trolley_nicht_in_Schleuse_OUT - R Dyn.Status.Leer_Check_OUT - - AN Dyn.Status.Leer_Check_OUT - JC Xn12 - -// Trolley währen Check erkannt: - AN Dyn.Status.Kein_neuer_Trolley_kommt_OUT - JC Xn12 - -// Aber: - A "Schleuse_geöffnet_OUT" // aber Schleuse noch geöffnet - O B_InSchleuse_OUT // aber Trolley noch in Schleuse - JCN Fertig // Negierter Sprung - - L 0 // Zeit neu aufziehen - T Dyn.Leer_Zeit_OUT - - SET - R Dyn.Status.Kein_neuer_Trolley_kommt_OUT - - JU Xn12 - -Fertig: SET - R Dyn.Status.Leer_Check_OUT - - A Dyn.Status.Puffer_initialisieren_OUT - R Dyn.Status.Puffer_initialisieren_OUT - JCN Reset_OUT // Negierter Sprung - -// Trolleyliste löschen: - L Puffer.Puffer_Dyn_DW - L Puffer.PufferTrolleyliste_DW_Out - +I - T SSDW - -CALL FC "DatenReset" (SSDB:=Puffer.Puffer_Dyn_DB, SSDW:=SSDW, RE_VAL:="MB198") - - JU Reset_OUT - -Xn12: NOP 0 - - ---- NW 20: Reset IN aktiv --- - JU INEn14 - -Reset_IN: SET - R Dyn.Sk_IN.Err_Uebzeit - R Status2.Eintrag_DL_Leerliste_erfolgt - R Status2.Eintrag_DL_Reinliste_erfolgt - R Status2.Trolley_nicht_in_Schleuse_IN - R Status2.Puffer_nicht_leer_IN - - L DINT#0 -// / T #Dyn.ShopGroup_IN //siehe Nw 5 - T Dyn.ShopGroup_EFL_Gespeichert // Kein ShopGroup_IN mehr eingetragen - L 0 - T Dyn.Leer_Zeit_IN - T Dyn.ShopGroup_EFL_Gespeichert // Kein ShopGroup_IN mehr eingetragen - -// Trolleyliste löschen: - L Puffer.Puffer_Dyn_DW - L Puffer.PufferTrolleyliste_DW_IN - +I - T SSDW - -CALL FC "DatenReset" (SSDB:=Puffer.Puffer_Dyn_DB, SSDW:=SSDW, RE_VAL:="MB198") - -INEn14: NOP 0 - - ---- NW 21: Reset Out aktiv --- - JU En14 - -Reset_OUT: SET - R Dyn.Sk_OUT.Err_Uebzeit - R Dyn.Status.Puffer_initialisieren_OUT - R Dyn.Status.Trolley_nicht_in_Schleuse_OUT - R Dyn.Status.Puffer_nicht_leer_OUT - R Dyn.HMI.Puffer_initialisieren // Button-Anzeige wieder normal - R Status2.Eintrag_DL_Abrufliste_erfolgt - R Dyn.Error.Err_Raus_Sensor - R Dyn.Status."Trolley_fährt_aus_OUT" - - L DINT#0 - T Dyn.ShopGroup_OUT - T Dyn.ShopGroup_AFL_Gespeichert // Kein ShopGroup_OUT mehr eingetragen - L 0 - T Dyn.Leer_Zeit_OUT - -// Trolleyliste löschen: - L Puffer.Puffer_Dyn_DW - L Puffer.PufferTrolleyliste_DW_Out - +I - T SSDW - -CALL FC "DatenReset" (SSDB:=Puffer.Puffer_Dyn_DB, SSDW:=SSDW, RE_VAL:="MB198") - -En14: NOP 0 - - ---- NW 22: Beide Puffer identische ShopGroup --- - L Dyn.ShopGroup_IN - L Dyn.ShopGroup_OUT // Gleiche Daten ? - <>I // Nein! - R Oberen_Puffer_nichts_einfahren // Einfahrt oben verhindern, sonst evtl. Dauerlauf - JC NixGleich - -// Sonderfall "Alles ausfahren": - A Status2.Alles_ausfahren_OUT // Unterer Puffer soll leer werden! - = Oberen_Puffer_nichts_einfahren // Einfahrt oben verhindern, sonst evtl. Dauerlauf - -NixGleich: NOP 0 - - ---- NW 23: Puffer oben hat Platz / ist frei --- -// Puffer hat Platz: - L Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege - L Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege - +I - T GesamtAnzahl - - L Puffer.MaxAnzahl_Einfahrt - I // Ja! - O( - L 1 // Minimalwert ? - ==I // Ja ! - ) - = Inks_Ok - -X14E: NOP 0 - - ---- NW 26: DLPuffer_leer: Ein-/Austrag --- - L GesamtAnzahl - L 0 // Trolleys unterwegs/drin ? - <>I // Ja ! - ON Status2.Puffer_leer_IN // Kann mit neuer ShopGroup bestückt werden! - O Puffer.Parameter_allg.Kein_Lager // Überlauf-/Fehler-Strecke - O Status2.Puffer_initialisieren_IN - O Dyn.Status.Puffer_initialisieren_OUT - JC Austrag_Leerliste - -// Eintrag in Leerliste: - L VollPuffer_Nr - T "MW220" // Puffer, der leer ist - -CALL FC "DatenIn" (SSDB:=100, SSDW:=0, INDATEN:=P#M220.0, RE_VAL:="MB219") // Anforderung in Datenliste eintragen - - AN "M219.6" // Daten wurden überschrieben - AN "M219.7" // Eintrag ist richtig erfolgt - JC NoChange_Leerliste - - SET - S Status2.Eintrag_DL_Leerliste_erfolgt - - JU NoChange_Leerliste - -Austrag_Leerliste: NOP 0 -// Austrag aus Leerliste: - L VollPuffer_Nr - T "MW220" // Puffer, der leer ist - -CALL FC "DatenOut" (SSDB:=100, SSDW:=0, PARA:=WORD#16#E100, SEARCHDATEN:=P#M220.0, RE_VAL:="MB219", OUTDATEN:=P#M230.0, Position:="MW196") // Anforderung aus Datenliste löschen - - SET - R Status2.Eintrag_DL_Leerliste_erfolgt - -NoChange_Leerliste: NOP 0 - - ---- NW 27: DLPuffer_ShopGroup_einfahren: Ein-/Austrag --- -// Relevante ShopGroup ermittel: - L Dyn.ShopGroup_IN - L DINT#0 // ShopGroup bekannt ? - <>D // Ja ! - JC ASG - - L Dyn.Reservierungs_DL.Res_Trolley[1].ShopGroup - L DINT#0 // Trolleys mit ShopGroup reseviert ? - <>D // Ja ! - JC ASG - - L DINT#0 // wegen TAK - -ASG: CAC - T Akive_ShopGroup - - L Akive_ShopGroup - L DINT#0 // Relevante ShopGroup bekannt ? - ==D // Nein ! - ON Status2."Puffer_hat Platz_IN" // Puffer hat kein Platz mehr - O Oberen_Puffer_Freigeben - O Puffer.Parameter_allg.Kein_Lager // Überlauf-/Fehler-Strecke - O Status2.Puffer_initialisieren_IN - O Dyn.Status.Puffer_initialisieren_OUT - JC Austrag_Reinliste - -// Eintrag in Reinliste: - L Akive_ShopGroup - L Dyn.ShopGroup_EFL_Gespeichert - ==I // Eintrag schon erfolgt - JC NoChange_Reinliste - - L Dyn.Reservierungs_DL.Res_Trolley[1].ShopGroup - T "MD222" // Übergabe zum Speichern - L 0 // Trolleys mit ShopGroup reseviert ? - <>D // Ja ! - JC X190 - - L Akive_ShopGroup - T "MD222" // Übergabe zum Speichern - L 0 // ShopGroup bekannt? - <>D // Ja ! - JC X190 - - JU NoChange_Reinliste - -X190: L VollPuffer_Nr // angefahrener Puffer - T "MW220" - -CALL FC "DatenIn" (SSDB:=101, SSDW:=0, INDATEN:=P#M220.0, RE_VAL:="MB219") // Anforderung in Datenliste eintragen - - AN "M219.6" // Daten wurden überschrieben - AN "M219.7" // Eintrag ist richtig erfolgt - JC NoChange_Reinliste - - L Akive_ShopGroup - T Dyn.ShopGroup_EFL_Gespeichert // Eingetragene ShopGroup_IN - - SET - S Status2.Eintrag_DL_Reinliste_erfolgt - - JU NoChange_Reinliste - -Austrag_Reinliste: NOP 0 -// Austrag aus Reinliste: - L VollPuffer_Nr - T "MW220" - -CALL FC "DatenOut" (SSDB:=101, SSDW:=0, PARA:=WORD#16#E100, SEARCHDATEN:=P#M220.0, RE_VAL:="MB219", OUTDATEN:=P#M230.0, Position:="MW196") // Anforderung aus Datenliste löschen - - L DINT#0 - T Dyn.ShopGroup_EFL_Gespeichert // Kein ShopGroup_IN mehr eingetragen - - SET - R Status2.Eintrag_DL_Reinliste_erfolgt - -NoChange_Reinliste: NOP 0 - - ---- NW 28: DLPuffer_ShopGroup_abrufen: Ein-/Austrag --- - L Dyn.ShopGroup_OUT - L DINT#0 // Bekannt ? - ==D // Nein ! - O Dyn.Status.Puffer_leer_OUT // Kann mit neuer ShopGroup bestückt werden! - O Dyn.HMI.AusLagern_gesperrt - O Puffer.Parameter_allg.Kein_Lager // Überlauf-/Fehler-Strecke - O Status2.Puffer_initialisieren_IN - O Dyn.Status.Puffer_initialisieren_OUT - JC Austrag_Abrufliste - -// Eintrag aus Abrufliste: - L Dyn.ShopGroup_OUT - L Dyn.ShopGroup_AFL_Gespeichert - ==I // Eintrag schon erfolgt - JC NoChange_Abrufliste - - L VollPuffer_Nr // angefahrener Puffer - T "MW220" - L Dyn.ShopGroup_OUT - T "MD222" - -CALL FC "DatenIn" (SSDB:=102, SSDW:=0, INDATEN:=P#M220.0, RE_VAL:="MB219") // Anforderung in Datenliste eintragen - - AN "M219.6" // Daten wurden überschrieben - AN "M219.7" // Eintrag ist richtig erfolgt - JC NoChange_Abrufliste - - L Dyn.ShopGroup_OUT - T Dyn.ShopGroup_AFL_Gespeichert // Eingetragene ShopGroup_OUT - - SET - S Status2.Eintrag_DL_Abrufliste_erfolgt - - JU NoChange_Abrufliste - -Austrag_Abrufliste: NOP 0 -// Austrag aus Abrufliste: - L VollPuffer_Nr // angefahrener Puffer - T "MW220" - -CALL FC "DatenOut" (SSDB:=102, SSDW:=0, PARA:=WORD#16#E100, SEARCHDATEN:=P#M220.0, RE_VAL:="MB219", OUTDATEN:=P#M230.0, Position:="MW196") // Anforderung aus Datenliste löschen - - L DINT#0 - T Dyn.ShopGroup_AFL_Gespeichert // Kein ShopGroup_OUT mehr eingetragen - - SET - R Status2.Eintrag_DL_Abrufliste_erfolgt - -NoChange_Abrufliste: NOP 0 - - ---- NW 29: Schrittkette anhalten --- - A Dyn.Sk_OUT.Auto_akt // Automatik ist aktiv - A Dyn.Sk_OUT.Bereich_ok - JU en08_Mig // Schrittkette nicht anhalten ! - - SET // Störungen löschen - R Dyn.Sk_IN.Err_Uebzeit - R Dyn.Sk_IN.Err_Schritt - R Dyn.Sk_OUT.Err_Uebzeit - R Dyn.Sk_OUT.Err_Schritt - - L 0 // Zeitwerte löschen - T Dyn.Sk_IN.Terr_Zelle - T Dyn.Sk_IN.Tok_Zelle - T Dyn.Sk_OUT.Terr_Zelle - T Dyn.Sk_OUT.Tok_Zelle - - JU RET - -en08_Mig: NOP 0 - - ---- NW 30: IN-Sprungverteiler --- - L Dyn.Sk_IN.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - L -1 // angegeben ? - ==I // Nein ! - JC INNEU - - CAC // Neuen Schritt übergeben - T Dyn.Sk_IN.Akt_Schritt - - L -1 // Urzustand - T Dyn.Sk_IN.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - -INNEU: SET - R Ueb_akt // Überwachungszeit aktivieren - R Warte_neu // Wartezeit neutriggern - R Warte_stop // Wartezeit stoppen - - L Dyn.Sk_IN.Akt_Schritt - JL INEnde - JU INs000 // Schritt 0 - JU INs001 // Schritt 1 - JU INs002 // Schritt 2 - JU INs003 // Schritt 3 - JU INs004 // Schritt 4 - JU INs005 // Schritt 5 - JU INs006 // Schritt 6 - JU INs007 // Schritt 7 - JU INs008 // Schritt 8 - JU INs009 // Schritt 9 - JU INs010 // Schritt 10 - JU INs011 // Schritt 11 - JU INs012 // Schritt 12 - JU INs013 // Schritt 13 - JU INs014 // Schritt 14 - JU INs015 // Schritt 15 - JU INs016 // Schritt 16 - JU INs017 // Schritt 17 - JU INs018 // Schritt 18 - JU INs019 // Schritt 19 - JU INs020 // Schritt 20 - JU INs021 // Schritt 21 - JU INs022 // Schritt 22 - JU INs023 // Schritt 23 - JU INs024 // Schritt 24 - JU INs025 // Schritt 25 - JU INs026 // Schritt 26 - JU INs027 // Schritt 27 - JU INs028 // Schritt 28 - JU INs029 // Schritt 29 - JU INs030 // Schritt 30 -INEnde: S Dyn.Sk_IN.Err_Schritt // Undefinierter Schritt - - L 16#AA01 - T Dyn.Stop_Ursache_IN - - JU OUT_Sk - -INNeu_Mig: A Dyn.Sk_IN.Err_Uebzeit - JCN INSk - - L 16#AA02 - T Dyn.Stop_Ursache_IN - - JU OUT_Sk - -INSk: T Dyn.Sk_IN.Akt_Schritt - - L 0 // Zeitwerte löschen - T Dyn.Sk_IN.Terr_Zelle - T Dyn.Sk_IN.Tok_Zelle - L -1 - T Dyn.Sk_IN.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - JU INNEU - -// Nicht programmierte Schritte: -// INs000: SPA INEnde -// INs001: SPA INEnde -// INs002: SPA INEnde -INs003: JU INEnde -// INs004 : SPA INEnde -// INs005: SPA INEnde -// INs006: SPA INEnde -// INs007: SPA INEnde -INs008: JU INEnde -INs009: JU INEnde -INs010: JU INEnde -INs011: JU INEnde -INs012: JU INEnde -INs013: JU INEnde -INs014: JU INEnde -INs015: JU INEnde -INs016: JU INEnde -INs017: JU INEnde -INs018: JU INEnde -INs019: JU INEnde -// INs020: SPA INEnde -// INs021: SPA INEnde -INs022: JU INEnde -INs023: JU INEnde -INs024: JU INEnde -INs025: JU INEnde -INs026: JU INEnde -INs027: JU INEnde -INs028: JU INEnde -INs029: JU INEnde -INs030: JU INEnde - - ---- NW 31: IN-Schritt X: Reserve --- - SET // Weiterschaltbedingung - = Weiter - -// Schrittaktionen: - SET - - L 16#A001 - T Dyn.Stop_Ursache_IN - - A Dyn.Sk_IN.Reset_Akt // Reset ist aktiv - L 20 // Weiter mit Schritt 20 - JC INNeu_Mig // Bei diesem Schritt weiter - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk_IN.Err_Uebzeit // Sofort weiter ! - - L 0 // Angabe der Wartezeit (*10ms) - JC INPlus // Nächsten Schritt starten - - L 1 // Weiter mit Schritt 1 - JC INNeu_Mig // Bei diesem Schritt weiter - - T Dyn.Sk_IN.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - SET - A Dyn.Sk_IN.Auto_akt // Automatik ist aktiv - A Dyn.Sk_IN.Bereich_ok - = Ueb_akt // Überwachungszeit aktivieren - L 50 // Angabe der Überwachungszeit (*1s) - JU INtueb // Überwachungszeit - - JU OUT_Sk - - ---- NW 32: IN-Schritt 0: Warten auf Trolley --- -INs000: SET // Weiterschaltbedingung - A B_InSchleuse_IN // Trolley im Schleuse erkannt - A Dyn.Sk_IN.Auto_akt // Automatik ist aktiv - A Dyn.Sk_IN.Bereich_ok - = Weiter - -// Schrittaktionen: - SET - R Dyn.Error.Err_Puffer_nicht_leer_IN - - A Dyn.Sk_IN.Reset_Akt // Reset ist aktiv - L 20 // Weiter mit Schritt 20 - JC INNeu_Mig // Bei diesem Schritt weiter - - L 0 - T Dyn.TrolleyID_Schleuse_IN - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk_IN.Err_Uebzeit // Sofort weiter ! - L 100 // Angabe der Wartezeit (*10ms) - JC INPlus // Nächsten Schritt starten - - L 16#A001 - T Dyn.Stop_Ursache_IN - -// Überwachungszeit starten: - L Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege - L 0 // Trolleydaten vorhanden ? - >I // Ja ! - AN B_InSchleuse_IN // Trolley im Schleuse erkannt - AN "Schleuse_geöffnet_IN" - = Ueb_akt // Überwachungszeit aktivieren - - A Dyn.Sk_IN.Err_Uebzeit - AN B_InSchleuse_IN // Trolley im Schleuse erkannt - AN Status2.Trolley_nicht_in_Schleuse_IN // Reset / Inilauf aktiv - S Dyn.Error.Err_Trolley_nicht_in_Schleuse_IN - - L Puffer."Übzeit_in_Schleuse" - - JU INtueb // Überwachungszeit - - ---- NW 33: IN-Schritt 1: Trolley ist in Schleuse / Gleiche Shop-Gruppe? --- -INs001: NOP 0 - -// Schrittaktionen: - AN B_InSchleuse_IN // Trolley im Schleuse erkannt - L 0 // Weiter mit Schritt 0 - T Dyn.Sk_IN.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - JC OUT_Sk - - SET - R Status2.Trolley_nicht_in_Schleuse_IN - -// Aber keine Daten mehr ?: - L Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege - L 0 - ==I - JCN In_Ok // Negierter Sprung! - -// Falls ein Trolley reserviert, diesen dann übergeben: - L Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege - L 0 // Trolley reserviert? - ==I // Nein! - S Status2.Puffer_nicht_leer_IN - S Status2.Puffer_initialisieren_IN // Damit Einfahren blockiert wird - JC In_Ok - -// Diesen Trolley als eingefahrenen übergeben: - L Dyn.Reservierungs_DL.Res_Trolley[1].Trolley_ID - T Dyn.TrolleyID_Einfahrt - -// Puffer unten diesselbe Shop-Gruppe?: -In_Ok: L Dyn.ShopGroup_IN - L Dyn.ShopGroup_OUT - ==D // Gleich! - A( - L dint#0 // Und angegeben ? - <>D // Ja ! - ) - O Dyn.Status.Puffer_leer_OUT // oder leer! - O Status2.Puffer_initialisieren_IN // wird in Schritt 2 gecheckt - L 2 // Weiter mit Schritt 2 - JC INNeu_Mig // Bei diesem Schritt weiter - - L 16#A011 - T Dyn.Stop_Ursache_IN - - JU OUT_Sk // Warten! - - ---- NW 34: IN-Schritt 2: Nach unten fahren ok ? --- -INs002: NOP 0 -// Schrittaktionen: - AN B_InSchleuse_IN // Trolley im Schleuse erkannt - L 0 // Weiter mit Schritt 0 - T Dyn.Sk_IN.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - JC OUT_Sk - -// Anlage aus oder Störung: - L 16#A021 - T Dyn.Stop_Ursache_IN - - AN Dyn.Sk_IN.Auto_akt // Automatik ist aktiv - ON Dyn.Sk_IN.Bereich_ok // Bereich ist gestört - JC INX002 - -// Puffer unten Platz?: - L 16#A022 - T Dyn.Stop_Ursache_IN - -// Sonderfall Inilauf in beiden Puffern: - A Status2.Puffer_initialisieren_IN - A Dyn.Status.Puffer_initialisieren_OUT - A "Schleuse_geöffnet_OUT" - A B_InSchleuse_OUT // Nur einmalig - JC Y002 // Damit schneller fertig - - AN Dyn.Status."Puffer_hat Platz_OUT" // Starten ist erlaubt - JC INX002 - -// Kein Antrieb im Puffer: -Y002: A Dyn.Sk_OUT.Auto_akt // Automatik ist aktiv - A Dyn.Sk_OUT.Bereich_ok - L 4 // Daten an Puffer unten übergeben - JC INNeu_Mig // Bei diesem Schritt weiter - - JU OUT_Sk - -INX002: L 1 // Check - T Dyn.Sk_IN.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - JU OUT_Sk - - ---- NW 35: IN-Schritt 4: Pufferdaten unten/oben ändern --- -INs004: SET // Weiterschaltbedingung - = Weiter - -// Schrittaktionen: -// Shop-Group übergeben: - L Dyn.Trolley_DL_Ausfahrt.Datenlistenkopf.AnzahlEintraege - L 0 - ==I // Ja ! - = "1.Trolley_OUT" // Also kommt 1.Trolley - - AN "1.Trolley_OUT" - JC INNoFirst - -// ShopGroup speichern bei 1.Trolley speichern: - L Dyn.ShopGroup_IN - T Dyn.ShopGroup_OUT - -INNoFirst: NOP 0 -// Daten an Puffer unten übergeben: - L Dyn.Trolley_DL_Einfahrt.VollPuffer_Trolley_IN[1].Abruf_ShopGroup - T "MD224" - L Dyn.Trolley_DL_Einfahrt.VollPuffer_Trolley_IN[1].Trolley_ID - T "MD220" - -// ID: sinnvolle Daten ? - L DINT#0 - <>D - JC Daten_ok - - L DINT#0 // Bleibt trotzdem 0 - T "MD220" - -// Daten Puffer unten eintragen: -Daten_ok: L Puffer.Puffer_Dyn_DW - L Puffer.PufferTrolleyliste_DW_Out - +I - T SSDW - -CALL FC "DatenIn" (SSDB:=Puffer.Puffer_Dyn_DB, SSDW:=SSDW, INDATEN:=P#M220.0, RE_VAL:="MB199") - -// Puffer oben Daten austragen: -// Austrag aus Trolley-VollPufferliste oben - L Dyn.Trolley_DL_Einfahrt.VollPuffer_Trolley_IN[1].Trolley_ID - T "MD220" - - L Puffer.Puffer_Dyn_DW - L Puffer.PufferTrolleyliste_DW_IN - +I - T SSDW - -CALL FC "DatenOut" (SSDB:=Puffer.Puffer_Dyn_DB, SSDW:=SSDW, PARA:=16#E100, SEARCHDATEN:=P#M220.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196") // Eintrag löschen | Nicht relevant - - L 5 // Nur 1 langes Signal! - JU INNeu_Mig // Bei diesem Schritt weiter - - ---- NW 36: IN-Schritt 5: Trolley fährt aus ? --- -INs005: SET // Weiterschaltbedingung - AN B_InSchleuse_IN // Sensor Trolley ist in Schleuse - A "Schleuse_geöffnet_IN" - = Weiter - -// Schrittaktionen: - SET - S Y_Schleuse_Auf_IN // Schleuse öffnen - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk_IN.Err_Uebzeit // Sofort weiter ! - R Dyn.Error.Err_Trolley_raus_IN // Trolley fährt nicht aus - L 100 // Angabe der Wartezeit (*10ms) - JC INPlus // Nächsten Schritt starten - - A Dyn.Sk_IN.Err_Uebzeit - S Dyn.Error.Err_Trolley_raus_IN // Trolley fährt nicht aus - - L 16#B051 - T Dyn.Stop_Ursache_IN - - SET - = Ueb_akt // Überwachungszeit aktivieren - L Puffer."Übzeit_aus_Schleuse" // Angabe der Überwachungszeit (*1s) - JU INtueb // Überwachungszeit - - ---- NW 37: IN-Schritt 6: Schleuse Mindestzeit geöffnet ? --- -INs006: SET // Weiterschaltbedingung - A Status2.MindestZeit_ok_IN - = Weiter - -// Schrittaktionen: - SET - S Y_Schleuse_Auf_IN // Schleuse öffnen - - A B_InSchleuse_IN // Trolley wieder erkannt - L 5 // Weiter mit Schritt 5 - JC INNeu_Mig // Bei diesem Schritt weiter - - A Weiter - L 0 - JC INPlus // Nächsten Schritt starten - - L 16#B061 - T Dyn.Stop_Ursache_IN - - JU OUT_Sk - - ---- NW 38: IN-Schritt 7: Letzter Trolley oben ? --- -INs007: SET // Weiterschaltbedingung - = Weiter - -// Schrittaktionen: -// Letzter Trolley ausgefahren?: - L Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege - L 0 // Liste leer? - ==I - S Status2.Leer_Check_IN - -// Inilauf aktiv?: - AN Status2.Puffer_initialisieren_IN - JC INENDE_Mig - - L 0 // Zeiten löschen - T Dyn.Leer_Zeit_IN - - JU INENDE_Mig - - ---- NW 39: IN-Schritt 20: Schleuse resetten --- -INs020: SET // Weiterschaltbedingung - = Weiter // Weiterschaltbedingung ist erfüllt - -// Schrittaktionen: - L 16#A201 - T Dyn.Stop_Ursache_IN - - A Weiter // Weiterschaltbedingung ist erfüllt - L 300 // Angabe der Wartezeit (*10ms) - JC INPlus // Nächsten Schritt starten - - SET - = Ueb_akt // Überwachungszeit aktivieren - L 30 // Angabe der Überwachungszeit (*100ms) - JU INtueb // Überwachungszeit - - ---- NW 40: IN-Schritt 21: Reset ist zu Ende --- -INs021: SET - R Dyn.Sk_IN.Reset_Akt // Reset ist aktiv - R Dyn.HMI.Schleuse_resetten_IN - - JU INENDE_Mig // Neubeginn - - ---- NW 41: IN-Schrittkette beenden --- -INENDE_Mig: L 0 // Schritt 0: Warten - T Dyn.Sk_IN.Akt_Schritt - - L 0 // Zeitwert löschen - T Dyn.Sk_IN.Terr_Zelle - T Dyn.Sk_IN.Tok_Zelle - - SET - R Dyn.Sk_IN.Err_Uebzeit - - JU OUT_Sk - - ---- NW 42: IN-Nächsten Schritt aktivieren --- -INPlus: T Dyn.Sk_IN.T_ok // Wartezeit übergeben - - A Dyn.Sk_IN.Err_Uebzeit // Störung noch nicht quittiert - JC OUT_Sk - - L 0 // keine Wartezeit ? - ==I // Ja ! -> sofort weiter - JC INw220 - - AN Warte_neu // Wartezeit neutriggern - JC INW220_Mig - - L 0 - T Dyn.Sk_IN.Tok_Zelle // Wartezeit - -INW220_Mig: A Warte_stop // Wartezeit stoppen - JC OUT_Sk - - L Dyn.Sk_IN.Tok_Zelle - L "MW4" // Wartezeit +10ms - +I - T Dyn.Sk_IN.Tok_Zelle // Wartezeit - L Dyn.Sk_IN.T_ok // abgelaufen ? - I // abgelaufen ? - AN Dyn.Sk_IN.Err_Uebzeit - JC INen24 // Nein ! - - A Ueb_akt // Überwachungszeit aktivieren - S Dyn.Sk_IN.Err_Uebzeit - - L 0 // Zeitwert löschen - T Dyn.Sk_IN.Terr_Zelle - - JU OUT_Sk - -INen24: NOP 0 - - ---- NW 44: IN-Überwachungszeit +1 --- - AN Dyn.Sk_IN.Ueb_akt // Schrittaktion ist aktiv - ON "1s-Impuls" - JC OUT_Sk - - L Dyn.Sk_IN.Terr_Zelle - + 1 // Üb.zeit +1s - T Dyn.Sk_IN.Terr_Zelle - - JU OUT_Sk - - ---- NW 45: OUT-Sprungverteiler --- -OUT_Sk: L Dyn.Sk_OUT.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - L -1 // angegeben ? - ==I // Nein ! - JC NEU - - CAC // Neuen Schritt übergeben - T Dyn.Sk_OUT.Akt_Schritt - - L -1 // Urzustand - T Dyn.Sk_OUT.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - -NEU: SET - R Ueb_akt // Überwachungszeit aktivieren - R Warte_neu // Wartezeit neutriggern - R Warte_stop // Wartezeit stoppen - - L Dyn.Sk_OUT.Akt_Schritt - JL Ende - JU s000 // Schritt 0 - JU s001 // Schritt 1 - JU s002 // Schritt 2 - JU s003 // Schritt 3 - JU s004 // Schritt 4 - JU s005 // Schritt 5 - JU s006 // Schritt 6 - JU s007 // Schritt 7 - JU s008 // Schritt 8 - JU s009 // Schritt 9 - JU s010 // Schritt 10 - JU s011 // Schritt 11 - JU s012 // Schritt 12 - JU s013 // Schritt 13 - JU s014 // Schritt 14 - JU s015 // Schritt 15 - JU s016 // Schritt 16 - JU s017 // Schritt 17 - JU s018 // Schritt 18 - JU s019 // Schritt 19 - JU s020 // Schritt 20 - JU s021 // Schritt 21 - JU s022 // Schritt 22 - JU s023 // Schritt 23 - JU s024 // Schritt 24 - JU s025 // Schritt 25 - JU s026 // Schritt 26 - JU s027 // Schritt 27 - JU s028 // Schritt 28 - JU s029 // Schritt 29 - JU s030 // Schritt 30 -Ende: S Dyn.Sk_OUT.Err_Schritt // Undefinierter Schritt - - L 16#A131 - T Dyn.Stop_Ursache_OUT - - JU RET - -Neu_Mig: A Dyn.Sk_OUT.Err_Uebzeit - JCN Sk - - L 16#A132 - T Dyn.Stop_Ursache_OUT - - JU RET - -Sk: T Dyn.Sk_OUT.Akt_Schritt - - L 0 // Zeitwerte löschen - T Dyn.Sk_OUT.Terr_Zelle - T Dyn.Sk_OUT.Tok_Zelle - - JU NEU - -// Nicht programmierte Schritte: -// s000: SPA Ende -// s001: SPA Ende -// s002: SPA Ende -s003: JU Ende -s004: JU Ende -// s005: SPA Ende -// s006: SPA Ende -// s007: SPA Ende -s008: JU Ende -s009: JU Ende -s010: JU Ende -s011: JU Ende -s012: JU Ende -s013: JU Ende -s014: JU Ende -s015: JU Ende -s016: JU Ende -s017: JU Ende -s018: JU Ende -s019: JU Ende -// s020: SPA Ende -// s021: SPA Ende -s022: JU Ende -s023: JU Ende -s024: JU Ende -s025: JU Ende -s026: JU Ende -s027: JU Ende -s028: JU Ende -s029: JU Ende -s030: JU Ende - - ---- NW 46: OUT-Schritt X: Reserve --- - SET // Weiterschaltbedingung - = Weiter - -// Schrittaktionen: - SET - - L 16#B001 - T Dyn.Stop_Ursache_OUT - - A Dyn.Sk_OUT.Reset_Akt // Reset ist aktiv - L 20 // Weiter mit Schritt 20 - JC Neu_Mig // Bei diesem Schritt weiter - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk_OUT.Err_Uebzeit // Sofort weiter ! - L 0 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - L 1 // Weiter mit Schritt 1 - JC Neu_Mig // Bei diesem Schritt weiter - - T Dyn.Sk_OUT.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - SET - A Dyn.Sk_OUT.Auto_akt // Automatik ist aktiv - A Dyn.Sk_OUT.Bereich_ok - = Ueb_akt // Überwachungszeit aktivieren - L 50 // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - - JU RET - - ---- NW 47: OUT-Schritt 0: Warten auf Trolley --- -s000: SET // Weiterschaltbedingung - A B_InSchleuse_OUT // Trolley im Schleuse erkannt - A Dyn.Sk_OUT.Auto_akt // Automatik ist aktiv - A Dyn.Sk_OUT.Bereich_ok - = Weiter - -// Schrittaktionen: - SET - R Dyn.Error.Err_Puffer_nicht_leer_OUT - - A Dyn.Sk_OUT.Reset_Akt // Reset ist aktiv - L 20 // Weiter mit Schritt 20 - JC Neu_Mig // Bei diesem Schritt weiter - - L 0 - T Dyn.TrolleyID_Schleuse_Out - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk_OUT.Err_Uebzeit // Sofort weiter ! - L 100 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - L 16#B001 - T Dyn.Stop_Ursache_OUT - -// Überwachungszeit starten: - L Dyn.Trolley_DL_Ausfahrt.Datenlistenkopf.AnzahlEintraege - L 0 // Trolleydaten vorhanden ? - >I // Ja ! - AN B_InSchleuse_OUT // Trolley im Schleuse erkannt - AN "Schleuse_geöffnet_OUT" - = Ueb_akt // Überwachungszeit aktivieren - - A Dyn.Sk_OUT.Err_Uebzeit - AN B_InSchleuse_OUT // Trolley im Schleuse erkannt - AN Dyn.Status.Trolley_nicht_in_Schleuse_OUT // Reset / Inilauf aktiv - S Dyn.Error.Err_Trolley_nicht_in_Schleuse_OUT - - L Puffer."Übzeit_in_Schleuse" - - JU tueb // Überwachungszeit - - ---- NW 48: OUT-Schritt 1: Trolley ist in Schleuse / Warten auf Auftrag --- -s001: NOP 0 - -// Schrittaktionen: - AN B_InSchleuse_OUT // Trolley im Schleuse erkannt - L 0 // Weiter mit Schritt 0 - JC Neu_Mig // Bei diesem Schritt weiter - - L Dyn.Trolley_DL_Ausfahrt.VollPuffer_Trolley_Out[1].Trolley_ID - T Dyn.TrolleyID_Schleuse_Out // Damit bei Ausfahrt angezeigt werden kann - -// Aber keine Daten mehr ?: - L Dyn.Trolley_DL_Ausfahrt.Datenlistenkopf.AnzahlEintraege - L 0 - ==I - S Dyn.Status.Puffer_nicht_leer_OUT - S Dyn.Status.Puffer_initialisieren_OUT // Damit Einfahren blockiert wird - -// Spezial-Betriebsarten: - A Dyn.Status.Einen_VollTrolley_ausfahren_OUT - O Status2.Alles_ausfahren_OUT - O Dyn.Status.Puffer_initialisieren_OUT - O - A Dyn.Status."Undef.Trolley_in_Schleuse_OUT" - AN "Schleuse_geöffnet_IN" // Trolley fährt noch ein - L 2 // Weiter mit Schritt 2 - JC Neu_Mig // Bei diesem Schritt weiter - -// Trolleydaten anzeigen: - L 16#B011 - T Dyn.Stop_Ursache_OUT - - L Dyn.TrolleyID_Schleuse_Out - L DINT#0 - ==D // Nein! - = Dyn.Error.Err_Puffer_nicht_leer_IN - JC RET - -// TrolleyID checken, ob in Trolleyliste: -// / CALL "Trolley_DL_Check_ID" -// Gesamt_Trolley_DL :=#Puffer.Gesamt_Trolley_DL -// TrolleyID :=#Dyn.TrolleyID_Schleuse_Out -// Check_EndZiel :="MW220"//Hier uninteressant -// Check_ZwischenZiel :="MW220"//Hier uninteressant -// Check_ShopGroup :="MD220"//Hier uninteressant -// Check_Standort :="MW220"//Hier uninteressant -// Err :=#Dyn.Error.Err_TrolleyID_Schleuse_unbekannt - -// Ausfahr-Auftrag vorhanden?: - L 16#B012 - T Dyn.Stop_Ursache_OUT - - L Dyn.ShopGroup_Auftrag_zum_Ausfahren // TrolleyID zum Ausfahren angegeben? - T "MD220" - L DINT#0 - ==D // Nein! - S Dyn.Status.Trolley_wartet_Auftrag - JC RET - -// Definierten Trolley checken, ob in TrolleyListe vorhanden: - L Puffer.Puffer_Dyn_DW - L Puffer.PufferTrolleyliste_DW_Out - +I - T SSDW - -CALL FC "DatenOut" (SSDB:=Puffer.Puffer_Dyn_DB, SSDW:=SSDW, PARA:=16#0000, SEARCHDATEN:=P#M220.0, RE_VAL:=Dyn.Rueckmld.RET_VAL_DL_VollPufferTrolley_OUT, OUTDATEN:=P#M220.0, Position:="MW196") // Eintrag suchen | Nicht relevant - - L 16#B013 - T Dyn.Stop_Ursache_OUT - - L Dyn.Rueckmld.RET_VAL_DL_VollPufferTrolley_OUT - L 2#10000000 - <>I -// / = #Dyn.Error.Err_TrolleyID_nicht_im_Leerpuffer - S Dyn.Status.Trolley_wartet_Auftrag - JC RET - - L 2 // Weiter mit Schritt 2 - JU Neu_Mig // Bei diesem Schritt weiter - - ---- NW 49: OUT-Schritt 2: Ausfahren ok ? --- -s002: NOP 0 - -// Schrittaktionen: - AN B_InSchleuse_OUT // Trolley im Schleuse erkannt - L 0 // Weiter mit Schritt 0 - JC Neu_Mig // Bei diesem Schritt weiter - - SET - S Dyn.Status."Trolley_wartet_Bereich+1" - -// Anlage aus oder Störung: - L 16#B020 - T Dyn.Stop_Ursache_OUT - - AN Dyn.Sk_OUT.Auto_akt // Automatik ist aktiv - ON Dyn.Sk_OUT.Bereich_ok // Bereich ist gestört - JC X002 - -// Starten erlaut Trolley ?: - L 16#B021 - T Dyn.Stop_Ursache_OUT - - AN Start_Ok // Starten ist erlaubt - JC X002 - -// Inks ok ?: - L 16#B022 - T Dyn.Stop_Ursache_OUT - - AN Inks_Ok // Starten ist erlaubt - JC X002 - -// Stau im Bereich +1: - L 16#B023 - T Dyn.Stop_Ursache_OUT - - A B_Stau_raus_Out - JC X002 // Stau - -// B_Aus_Schleuse aktiv: - L 16#B024 - T Dyn.Stop_Ursache_OUT - - A Puffer.Parameter_allg.B_AusSep_vorhanden - A B_AusSchleuse_OUT - = Dyn.Error.Err_Raus_Sensor // Raus-Sensor wird nicht erreicht (oder dauernd aktiv)! - JC X002 - -// Antriebe aktivieren / aktiv ?: - A Puffer.Parameter_allg.Antrieb_Plus_vorhanden // Schleuse an weiterem Antrieb (Weiche) - S Antrieb_plus_start // Kreisel-Antrieb plus starten - - L 16#B025 - T Dyn.Stop_Ursache_OUT - - AN Antrieb_plus_aktiv // Kreisel-Antrieb plus aktiv - A Puffer.Parameter_allg.Antrieb_Plus_vorhanden // Schleuse an weiterem Antrieb (Weiche) - ON Dyn.Sk_OUT.Auto_akt // Automatik ist aktiv - ON Dyn.Sk_OUT.Bereich_ok - JC RET - - L 5 // Nur 1 langes Signal! - JU Neu_Mig // Bei diesem Schritt weiter - -X002: L 1 // Auftrag checken - T Dyn.Sk_OUT.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - JU RET - - ---- NW 50: OUT-Schritt 5: Trolley fährt aus/ausgefahren ? --- -s005: SET // Weiterschaltbedingung - AN B_InSchleuse_OUT // Sensor Trolley ist in Schleuse - A( - O B_AusSchleuse_OUT // Sensor Trolley aus Schleuse gefahren - ON Puffer.Parameter_allg.B_AusSep_vorhanden - ) - A Antrieb_plus_aktiv - = Weiter - -// Schrittaktionen: - SET - R Start_Ok // Damit kein weiterer Puffer ausfährt - S Y_Schleuse_Auf_OUT // Schleuse öffnen - S Dyn.Status."Trolley_fährt_aus_OUT" - S Antrieb_plus_start // Kreisel-Antrieb plus starten - -// Trolley ist draussen: - A( - O B_AusSchleuse_OUT // Sensor Trolley aus Schleuse gefahren - ON Puffer.Parameter_allg.B_AusSep_vorhanden - ) - R Dyn.Sk_OUT.Err_Uebzeit // Sofort weiter ! - R Dyn.Error.Err_Trolley_raus_OUT // Trolley fährt nicht aus - L 0 - JC Plus // Nächsten Schritt starten - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk_OUT.Err_Uebzeit // Sofort weiter ! - R Dyn.Error.Err_Trolley_raus_OUT // Trolley fährt nicht aus - L 50 // Falls nur mit Sensor gefahren wird, dann Wartezeit! - JC Plus // Nächsten Schritt starten - -// Trolley fährt nicht raus!: - A Dyn.Sk_OUT.Err_Uebzeit - O B_QuerTrolley_Out // QuerTrolley auf Crashkurs - S Dyn.Error.Err_Trolley_raus_OUT // Trolley fährt nicht aus - - L 16#B051 - T Dyn.Stop_Ursache_OUT - - AN B_AusSchleuse_OUT // Sensor Trolley aus Schleuse gefahren - JC x052 - - L 16#B052 - T Dyn.Stop_Ursache_OUT - -x052: A Antrieb_plus_aktiv - = Ueb_akt // Überwachungszeit aktivieren - L Puffer."Übzeit_aus_Schleuse" // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - - ---- NW 51: OUT-Schritt 6: Schleuse Mindestzeit geöffnet ? --- -s006: SET // Weiterschaltbedingung - A Dyn.Status.MindestZeit_ok_OUT - O - A Puffer.Parameter_allg.B_AusSep_vorhanden - A B_AusSchleuse_OUT // Sensor Trolley aus Schleuse gefahren - = Weiter - -// Schrittaktionen: - A B_QuerTrolley_Out // QuerTrolley auf Crashkurs - S Dyn.Error.Err_Trolley_raus_OUT // Trolley fährt nicht aus - - SET - R Start_Ok // Damit kein weiterer Puffer ausfährt - S Y_Schleuse_Auf_OUT // Schleuse öffnen - S Antrieb_plus_start // Kreisel-Antrieb plus starten - S Dyn.Status."Trolley_fährt_aus_OUT" - - A B_InSchleuse_OUT // Trolley wieder erkannt - L 5 // Weiter mit Schritt 5 - JC Neu_Mig // Bei diesem Schritt weiter - - A Weiter - L 0 - JC Plus // Nächsten Schritt starten - - L 16#B061 - T Dyn.Stop_Ursache_OUT - - JU RET - ---- NW 52: OUT-Schritt 7: Trolleydaten ändern --- -s007: SET // Weiterschaltbedingung - = Weiter - -// Schrittaktionen: - SET - R Dyn.Status.Einen_VollTrolley_ausfahren_OUT - S Dyn.Status.Trolley_draussen_Out // 1 Zyklus - - L Dyn.Vereinzelungstakte_OUT - + DINT#1 // Vereinzelungen +1 - T Dyn.Vereinzelungstakte_OUT - -// Neue Position B01A an Trolleyliste übergeben: -CALL FC "Trolley_DL_Neue_Pos" (Gesamt_Trolley_DL:=Puffer.Gesamt_Trolley_DL, TrolleyID:=Dyn.TrolleyID_Schleuse_Out, Position:=16#B01A, ShopGroup:=DINT#0, Err:="M199.0") - -// Austrag aus Trolley-VollPufferliste - L Dyn.TrolleyID_Schleuse_Out - T "MD220" - T Dyn.TrolleyID_ausgefahren - - L Puffer.Puffer_Dyn_DW - L Puffer.PufferTrolleyliste_DW_Out - +I - T SSDW - -CALL FC "DatenOut" (SSDB:=Puffer.Puffer_Dyn_DB, SSDW:=SSDW, PARA:=16#E100, SEARCHDATEN:=P#M220.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196") // Eintrag löschen | Nicht relevant - -// Gewollter Trolley ausgefahren?: - L Dyn.ShopGroup_Auftrag_zum_Ausfahren - L Dyn.TrolleyID_ausgefahren - <>I // Nicht identisch! - JC NixAuftrag - - L 0 // Auftrag löschen, da ausgefahren - T Dyn.ShopGroup_Auftrag_zum_Ausfahren - -// Trolley löschen: -NixAuftrag: L DINT#0 - T Dyn.TrolleyID_Schleuse_Out - -// Letzter Trolley ausgefahren?: - L Dyn.Trolley_DL_Ausfahrt.Datenlistenkopf.AnzahlEintraege - L 0 // Liste leer? - ==I - S Dyn.Status.Leer_Check_OUT - - JU ENDE_Mig - - ---- NW 53: OUT-Schritt 20: Schleuse resetten --- -s020: SET // Weiterschaltbedingung - = Weiter // Weiterschaltbedingung ist erfüllt - -// Schrittaktionen: - A "Schleuse_geöffnet_OUT" - R Start_Ok // Damit kein weiterer Puffer ausfährt - - L 16#B201 - T Dyn.Stop_Ursache_OUT - - A Weiter // Weiterschaltbedingung ist erfüllt - L 300 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - SET - = Ueb_akt // Überwachungszeit aktivieren - L 30 // Angabe der Überwachungszeit (*100ms) - JU tueb // Überwachungszeit - - ---- NW 54: OUT-Schritt 21: Reset ist zu Ende --- -s021: SET - R Dyn.Sk_OUT.Reset_Akt // Reset ist aktiv - R Dyn.HMI.Schleuse_resetten_OUT - - JU ENDE_Mig // Neubeginn - - ---- NW 55: OUT-Schrittkette beenden --- -ENDE_Mig: L 0 // Schritt 0: Warten - T Dyn.Sk_OUT.Akt_Schritt - - L 0 // Zeitwert löschen - T Dyn.Sk_OUT.Terr_Zelle - T Dyn.Sk_OUT.Tok_Zelle - - SET - R Dyn.Sk_OUT.Err_Uebzeit - - JU RET - - ---- NW 56: OUT-Nächsten Schritt aktivieren --- -Plus: T Dyn.Sk_OUT.T_ok // Wartezeit übergeben - - A Dyn.Sk_OUT.Err_Uebzeit // Störung noch nicht quittiert - JC RET - - L 0 // keine Wartezeit ? - ==I // Ja ! -> sofort weiter - JC w220 - - AN Warte_neu // Wartezeit neutriggern - JC W220_Mig - - L 0 - T Dyn.Sk_OUT.Tok_Zelle // Wartezeit - -W220_Mig: A Warte_stop // Wartezeit stoppen - JC RET - - L Dyn.Sk_OUT.Tok_Zelle - L "MW4" // Wartezeit +10ms - +I - T Dyn.Sk_OUT.Tok_Zelle // Wartezeit - L Dyn.Sk_OUT.T_ok // abgelaufen ? - I // abgelaufen ? - AN Dyn.Sk_OUT.Err_Uebzeit - JC en24 // Nein ! - - A Ueb_akt // Überwachungszeit aktivieren - S Dyn.Sk_OUT.Err_Uebzeit - - L 0 // Zeitwert löschen - T Dyn.Sk_OUT.Terr_Zelle - - JU RET - -en24: NOP 0 - ---- NW 58: OUT-Überwachungszeit +1 --- - AN Dyn.Sk_OUT.Ueb_akt // Schrittaktion ist aktiv - ON "1s-Impuls" - JC RET - - L Dyn.Sk_OUT.Terr_Zelle - + 1 // Üb.zeit +1s - T Dyn.Sk_OUT.Terr_Zelle - - JU RET - - ---- NW 59: Ende --- -RET: NOP 0 - - A Dyn.Status.Puffer_initialisieren_OUT - O Status2.Alles_ausfahren_OUT - R Start_Ok // Sonst starten Alle auf einmal durcheinander! - - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Module/MHMÜbergang_ohne_Schleuse.awl b/=A01+UH07-KF00/Programmbausteine/Module/MHMÜbergang_ohne_Schleuse.awl index c09b9ae..e35ac01 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/MHMÜbergang_ohne_Schleuse.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/MHMÜbergang_ohne_Schleuse.awl @@ -1,91 +1,122 @@ -=== FB 183: MHMÜbergang_ohne_Schleuse [STL] === -INTERFACE: - Input: - ErrQuit : Bool - B_Anfang : Bool - B_Am_Übergang : Bool - B_Stau_Antrieb_plus : Bool - Antrieb_aktiv : Bool - Antrieb_plus_aktiv : Bool - Output: - InOut: - Antrieb_vor : Bool - Antrieb_start : Bool - Antrieb_stop : Bool - Antrieb_plus_vor : Bool - Antrieb_plus_start : Bool - Static: - Am_Übergang : "MSensoren" - Stau_Antrieb_plus : "MSensoren" - Temp: - Antrieb : Bool - Antrieb_gestoppt : Bool - Constant: +FUNCTION_BLOCK "MHMÜbergang_ohne_Schleuse" +TITLE = Übergang ohne Schleuse zu anderem Antrieb +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-960629 +// +//Version: HM-Omniflow 2100 / 11.2025 +// + VAR_INPUT + ErrQuit : Bool; + B_Anfang : Bool; + B_Am_Übergang : Bool; + B_Stau_Antrieb_plus : Bool; + Antrieb_aktiv : Bool; + Antrieb_plus_aktiv : Bool; + END_VAR ---- NW 1: Antrieb ansteuern --- - SET - R Antrieb_gestoppt // Falls bei Aufruf nicht gestoppt wird! + VAR_IN_OUT + Antrieb_vor : Bool; + Antrieb_start : Bool; + Antrieb_stop : Bool; + Antrieb_plus_vor : Bool; + Antrieb_plus_start : Bool; + END_VAR -// Antrieb starten: - A ErrQuit - O B_Anfang - S Antrieb_start - S Antrieb_vor + VAR + Am_Übergang { S7_SetPoint := 'False'} : "MSensoren"; + Stau_Antrieb_plus : "MSensoren"; + END_VAR -// Trolley am Übergang: - AN "Am_Übergang".Stat.B_Akt - JC Nix - -// Antrieb stoppen: - A Stau_Antrieb_plus.Stat.B_Akt - S Antrieb_stop // Trolley stoppen - S Antrieb_gestoppt // Falls bei Aufruf nicht gestoppt wird! - JC Nix - - AN Stau_Antrieb_plus.Stat.B_Akt - S Antrieb_plus_vor // Antrieb plus einschalten - - SET - S Antrieb_plus_start // Antrieb plus zeitlang starten - - AN Antrieb_plus_aktiv - S Antrieb_stop // Trolley stoppen - S Antrieb_gestoppt // Falls bei Aufruf nicht gestoppt wird! - JC Nix - -// Antrieb einschalten: - SET - S Antrieb_vor // Trolley weiterfahren - -Nix: NOP 0 + VAR_TEMP + Antrieb : Bool; + Antrieb_gestoppt : Bool; + END_VAR ---- NW 2: Antrieb plus zusätzlich ansteuern --- -// Antrieb plus starten: - A B_Stau_Antrieb_plus // Sensor - O ErrQuit - S Antrieb_plus_start // Antrieb plus zeitlang starten +BEGIN +NETWORK +TITLE = Antrieb ansteuern + SET; + R #Antrieb_gestoppt;//Falls bei Aufruf nicht gestoppt wird! -// Antrieb plus einschalten: - A B_Stau_Antrieb_plus - AN Stau_Antrieb_plus.Stat.B_Akt - CLR // Nicht mehr! - S Antrieb_plus_vor // Antrieb plus einschalten +//Antrieb starten: + U #ErrQuit; + O #B_Anfang; + S #Antrieb_start; + S #Antrieb_vor; +//Trolley am Übergang: + UN #Am_Übergang.Stat.B_Akt; + SPB Nix; ---- NW 3: Trolley ist am Übergang --- - A Antrieb_aktiv - A Antrieb_plus_aktiv - AN Antrieb_gestoppt // Falls bei Aufruf nicht gestoppt wird! - = Antrieb +//Antrieb stoppen: + U #Stau_Antrieb_plus.Stat.B_Akt; + S #Antrieb_stop;//Trolley stoppen + S #Antrieb_gestoppt;//Falls bei Aufruf nicht gestoppt wird! + SPB Nix; -CALL FB "None" , (ESensor:="B_Am_Übergang", T_Ein:=1, T_Aus:=50, tein_aktiv:=1, taus_aktiv:=Antrieb) + UN #Stau_Antrieb_plus.Stat.B_Akt; + S #Antrieb_plus_vor ;//Antrieb plus einschalten + SET; + S #Antrieb_plus_start;//Antrieb plus zeitlang starten ---- NW 4: Stau im Förderer plus --- -CALL FB "None" , (ESensor:=B_Stau_Antrieb_plus, T_Ein:=100, T_Aus:=50, tein_aktiv:=1, taus_aktiv:=1) + UN #Antrieb_plus_aktiv; + S #Antrieb_stop;//Trolley stoppen + S #Antrieb_gestoppt;//Falls bei Aufruf nicht gestoppt wird! + SPB Nix; +//Antrieb einschalten: + SET; + S #Antrieb_vor;//Trolley weiterfahren ---- NW 5: Ende --- - BE +Nix: NOP 0; + +NETWORK +TITLE = Antrieb plus zusätzlich ansteuern + +//Antrieb plus starten: + U #B_Stau_Antrieb_plus;//Sensor + O #ErrQuit; + S #Antrieb_plus_start;//Antrieb plus zeitlang starten + +//Antrieb plus einschalten: + U #B_Stau_Antrieb_plus; + UN #Stau_Antrieb_plus.Stat.B_Akt; + CLR;//Nicht mehr! + S #Antrieb_plus_vor ;//Antrieb plus einschalten + +NETWORK +TITLE = Trolley ist am Übergang + U #Antrieb_aktiv; + U #Antrieb_plus_aktiv; + UN #Antrieb_gestoppt ;//Falls bei Aufruf nicht gestoppt wird! + = #Antrieb; + + CALL #Am_Übergang + ( ESensor := #B_Am_Übergang , + T_Ein := 1 , + T_Aus := 50 , + tein_aktiv := 1 , + taus_aktiv := #Antrieb + ); + +NETWORK +TITLE = Stau im Förderer plus + CALL #Stau_Antrieb_plus + ( ESensor := #B_Stau_Antrieb_plus , + T_Ein := 100 , + T_Aus := 50 , + tein_aktiv := 1 , + taus_aktiv := 1 + ); + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Module/MHMÜberlauf_VP.awl b/=A01+UH07-KF00/Programmbausteine/Module/MHMÜberlauf_VP.awl index ef93376..e6eed6d 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/MHMÜberlauf_VP.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/MHMÜberlauf_VP.awl @@ -1,1178 +1,1252 @@ -=== FB 276: MHMÜberlauf_VP [STL] === -INTERFACE: - Input: - VollPuffer_Nr : Int // Aufruf für Voll-Puffer - ErrQuit : Bool // Ablaufstörung quittieren - B_VollPufferEinfahrt : Bool // Sensor Trolley fährt in VollPuffer - B_InSchleuse_IN : Bool // Sensor Trolley ist in Schleuse oben - B_InSchleuse_OUT : Bool // Sensor Trolley ist in Schleuse unten - B_AusSchleuse_OUT : Bool // Sensor Trolley hat Schleuse unten verlassen - B_Stau_raus_Out : Bool // Sensor Stau im Bereich unten rausfahren - B_QuerTrolley_Out : Bool // Crash-Trolley auf Crashkurs erkannt - Antrieb_plus_aktiv : Bool // Kreisel-Antrieb plus aktiv - Schleuse_geöffnet_IN : Bool // Schleuse oben hat geöffnet - Schleuse_geöffnet_OUT : Bool // Schleuse unten hat geöffnet - Output: - Y_Schleuse_Auf_IN : Bool // Schleuse oben öffnen - Y_Schleuse_Auf_OUT : Bool // Schleuse unten öffnen - Error : Word // Störungen übergeben - InOut: - Start_Ok : Bool // Starten von ausserhalb ist erlaubt - Antrieb_plus_start : Bool // Antrieb plus starten - Antrieb_plus_stoppen : Bool // Antrieb plus stoppen - hStOk : Bool // Anzeige Start n. Störung aktivieren - Ausfahr_Inks : Int // Rest-Inks, wo sich Trolley befindet - Static: - Res16 : Array[1..2] of Int // Reserve - SAVE : Struct - Weichen_DB : Int // Weichen-FIFO-DB - Weichen_DW : Int // Weichen-FIFO-DW - Para : Struct // Parameter - VollPuffer_DL_DB : Int // Einsprung VollPuffer-Datenliste-DB - VollPuffer_DL_DW : Int // Einsprung VollPuffer-Datenliste-DW - Res1 : Array[1..2] of Int // Reserve - Status2 : Struct - Puffer_leer_IN : Bool // Puffer oben ist leer - Puffer_hat Platz_IN : Bool // Puffer oben hat noch Kapazität - Kein_neuer_Trolley_kommt_IN : Bool // Puffer oben zeitlang ohne neuen Trolley - Leer_Check_IN : Bool // VollPuffer oben wird auf leer gecheckt - Reset_aktiv_IN : Bool // Reset oben aktiv - Trolley_nicht_in_Schleuse_IN : Bool // Trolley oben fährt nicht in Schleuse > Inilauf gestartet - Puffer_nicht_leer_IN : Bool // Puffer oben nicht leer > Inilauf gestartet - Puffer_initialisieren_IN : Bool // VollPuffer oben initialisieren - MindestZeit_ok_IN : Bool // Schleuse ist MindestZeit geöffnet - Frei11 : Bool - Frei12 : Bool - Frei13 : Bool - Alles_ausfahren_OUT : Bool // Alle Trolleys ausfahren - Eintrag_DL_Leerliste_erfolgt : Bool // Eintrag in DLVPPuffer_leer (DB100) erfolgt - Eintrag_DL_Reinliste_erfolgt : Bool // Eintrag in DLVPPuffer_ShopGroup rein (DB101) erfolgt - Eintrag_DL_Abrufliste_erfolgt : Bool // Eintrag in DLVPPuffer_ShopGroup raus (DB901) erfolgt - Puffer : "UDLHMVollPuffer" // Statische VollPufferdaten (aus DL) - Dyn : Struct // Dynamische Daten - Status : Struct - Puffer_leer_OUT : Bool // Puffer oben ist leer - Puffer_hat Platz_OUT : Bool // Puffer oben hat noch Kapazität - Kein_neuer_Trolley_kommt_OUT : Bool // Puffer unten zeitlang ohne neuen Trolley - Leer_Check_OUT : Bool // VollPuffer unten wird auf leer gecheckt - Reset_aktiv_OUT : Bool // Reset unten aktiv - Trolley_nicht_in_Schleuse_OUT : Bool // Trolley unten fährt nicht in Schleuse > Inilauf gestartet - Puffer_nicht_leer_OUT : Bool // Puffer unten nicht leer > Inilauf gestartet - Puffer_initialisieren_OUT : Bool // VollPuffer unten initialisieren - MindestZeit_ok_OUT : Bool // Schleuse ist MindestZeit geöffnet - Undef.Trolley_in_Schleuse_OUT : Bool // Undefinierter Trolley in Schleuse unten erkannt - Trolley_wartet_Auftrag : Bool // Trolley wartet auf Auftrag (unten) - Trolley_wartet_Bereich+1 : Bool // Trolley wartet auf Bereich +1 (unten) - Einen_VollTrolley_ausfahren_OUT : Bool // Einen Voll-Trolley ausfahren - Trolley_fährt_aus_OUT : Bool // Trolley fährt aus (unten) - Trolley_draussen_Out : Bool // Trolley ist ausgefahren - Error_aktiv : Bool // Störung vorhanden - TrolleyID_Einfahrt : DInt // Trolley-Nr ist eingefahren - TrolleyID_Schleuse_IN : DInt // Trolley-Nr in Schleuse oben (Daten) - TrolleyID_Schleuse_Out : DInt // Trolley-Nr in Schleuse unten (Daten) - ShopGroup_IN : DInt // Diese Shopgruppe ist im oberen VollPuffer - ShopGroup_OUT : DInt // Diese Shopgruppe ist im unteren VollPuffer - ShopGroup_Auftrag_zum_Ausfahren : DInt // ShopGroup zum Ausfahren (FFFF = akt.Trolley ausfahren) - HMI : Struct - ShopGroup_IN : Int // ShopGroup im VollPuffer oben (IN:PLC, OUT:PLC) - ShopGroup_OUT : Int // ShopGroup im VollPuffer unten (IN:PLC, OUT:PLC) - Voll_Trolleys_IN : Int // Anzahl Trolleys oben (IN:PLC, OUT:PLC) - Voll_Trolleys_OUT : Int // Anzahl Trolleys unten (IN:PLC, OUT:PLC) - Res_Trolleys_IN : Int // Anzahl reservierte Trolleys oben (IN:PLC, OUT:PLC) - Frei_Plätze_IN : Int // Freiplätze für Trolleys (IN:PLC, OUT:PLC) - TrolleyID_Schleuse_IN : DInt // Trolley-Nr in Schleuse oben (IN:PLC, OUT:PLC) - TrolleyID_Schleuse_OUT : DInt // Trolley-Nr in Schleuse unten (IN:PLC, OUT:PLC) - Schleuse_resetten_IN : Bool // Schleuse resetten oben (IN:HMI, Out:PLC) - Schleuse_resetten_OUT : Bool // Schleuse resetten unten (IN:HMI, Out:PLC) - Puffer_initialisieren : Bool := 1 // VollPuffer initialisieren (IN:HMI, Out:PLC) - Einlagern_gesperrt : Bool // Einlagern gesperrt (IN:HMI, OUT:HMI) - AusLagern_gesperrt : Bool // AusLagern gesperrt (IN:HMI, OUT:HMI) - Sk_IN : "USk_Omni" // Status der Schrittkette Schleuse IN (oben) - Sk_OUT : "USk_Omni" // Status der Schrittkette Schleuse OUT (unten) - TrolleyID_doppelt : DInt // TrolleyID doppelt (eingefahrener Trolley) - TrolleyID_unbekannt_Einfahrt : DInt // TrolleyID unbekannt (eingefahrener Trolley) - TrolleyID_unbekannt_Schleuse_OUT : DInt // TrolleyID unbekannt (Trolley in Schleuse unten) - Rueckmld : Struct - RET_VAL_BLKMOV_VollPuffer : Int // Rückmeldung nach BLKMOV-Aufruf - RET_VAL_DL_VollPuffer : Byte // Rückmeldung nach DatenOut-Aufruf - RET_VAL_DL_Res_OUT : Byte // Rückmeldung nach DatenOut-Aufruf - RET_VAL_DL_VollPufferTrolley_IN : Byte // Rückmeldung nach DatenIN-Aufruf - RET_VAL_DL_VollPufferTrolley_OUT : Byte // Rückmeldung nach DatenOut-Aufruf - Error : "UErrHMVollpuffer" - Stau_Zeit : Int // Sensor B_Einfahrt ist belegt [1s] - Mindest_Zeit_IN : Int // Sensor B_in_Schleuse oben ist frei [1s] - Mindest_Zeit_OUT : Int // Sensor B_in_Schleuse unten ist frei [1s] - Leer_Zeit_IN : Int // Puffer oben ist frei [1s] - Leer_Zeit_OUT : Int // Puffer unten ist frei [1s] - Stop_Ursache_IN : Word // Stop-Stelle: Nw + Position - Stop_Ursache_OUT : Word // Stop-Stelle: Nw + Position - Vereinzelungstakte_OUT : DInt // Anzahl der getätigten Vereinzelungstakte - TrolleyID_ausgefahren : DInt // TrolleyID des ausgefahrenen Trolleys - ShopGroup_EFL_Gespeichert : DInt // In EinfahrListe gespeicherte ShopGroup - ShopGroup_AFL_Gespeichert : DInt // In AusfahrListe gespeicherte ShopGroup - Reservierungs_DL : Struct // AB DW200: Liste der resevierter Trolleys - Datenlistenkopf : Struct - KOPF : Word := WORD#16#DA04 // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128) - LAENGE : Int := 12 // Länge der Datenliste (maximale Anzahl der Datensätze) - STAMMDATEN : Int := 2 // Stammdatenlänge in Word (1 - 9) - INDDB : Int // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) - LAENGEINDDB : Int // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!) - INDDATEN_WANDEL_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) - LETZTERZUGRIFF : Int // Speicherung des letzten Zugriffs - Belegt14 : Int // reserviert von Sort-Datenliste - AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!) - Reserve18 : Int // Reserve - Res_Trolley : Array[1..12] of Struct // Reservierter Trolley für VollPuffer - Trolley_ID : DInt // Trolley_ID - ShopGroup : DInt // Shop-Gruppe auf Trolley - Endekennung : Word := WORD#16#DAEE // Datensort-Ende-Kennung (DBEE) - Res350 : Array[1..16] of Int - Trolley_DL_Einfahrt : Struct // AB DW350: Liste der Trolleys im VollPuffer - Datenlistenkopf : Struct - KOPF : Word := WORD#16#DA04 // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128) - LAENGE : Int := 12 // Länge der Datenliste (maximale Anzahl der Datensätze) - STAMMDATEN : Int := 2 // Stammdatenlänge in Word (1 - 9) - INDDB : Int // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) - LAENGEINDDB : Int // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!) - INDDATEN_WANDEL_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) - LETZTERZUGRIFF : Int // Speicherung des letzten Zugriffs - Belegt14 : Int // reserviert von Sort-Datenliste - AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!) - Reserve18 : Int // Reserve - VollPuffer_Trolley_IN : Array[1..12] of Struct // Trolley im VollPuffer - Trolley_ID : DInt // Trolley_ID - Abruf_ShopGroup : DInt // Reserviert für Ausfahrt - Endekennung : Word := WORD#16#DAEE // Datensort-Ende-Kennung (DBEE) - Res500 : Array[1..16] of Int - Trolley_DL_Ausfahrt : Struct // AB DW350: Liste der Trolleys im VollPuffer - Datenlistenkopf : Struct - KOPF : Word := WORD#16#DA04 // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128) - LAENGE : Int := 12 // Länge der Datenliste (maximale Anzahl der Datensätze) - STAMMDATEN : Int := 2 // Stammdatenlänge in Word (1 - 9) - INDDB : Int // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) - LAENGEINDDB : Int // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!) - INDDATEN_WANDEL_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) - LETZTERZUGRIFF : Int // Speicherung des letzten Zugriffs - Belegt14 : Int // reserviert von Sort-Datenliste - AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!) - Reserve18 : Int // Reserve - VollPuffer_Trolley_Out : Array[1..12] of Struct // Trolley im VollPuffer - Trolley_ID : DInt // Trolley_ID - Abruf_ShopGroup : DInt // Reserviert für Ausfahrt - Endekennung : Word := WORD#16#DAEE // Datensort-Ende-Kennung (DBEE) - Res700 : Array[1..41] of Int // Reserve - None: - VollPuffer_Nr : Int // Nummer der VollPuffer - Puffer_Typ : Int // VollPufferntyp = 276 (VollPuffer) - Puffer_Position : Word // VollPuffer-Position (für Gesamt-TrolleyDatenliste) - Puffer_Position_Inks : Int // VollPuffer-Position_Inks (für Ausfahrsteuerung) - None: - Reset : Bool := 1 - None: - Reset : Bool := 1 - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Ueb_akt : Bool // Überwachungszeit aktivieren - Weiter : Bool // Weiterschaltbedingung ist erfüllt - Warte_neu : Bool // Wartezeit neu triggern - Warte_stop : Bool // Wartezeit stoppen - 1.Trolley_IN : Bool - Neu_Trolley_in_Puffer_IN : Bool // Neuer Trolley in Puffer eingefahren - 1.Trolley_OUT : Bool - Inks_Ok : Bool // Starten aufgrund der Inks erlaubt - Puffer_IN_ist_leer : Bool // VollPuffer zeitlang ohne Sensor - Puffer_OUT_ist_leer : Bool // VollPuffer zeitlang ohne Sensor - Abruf_Trolley_vorne : Bool // Abruf-Trolley ist in Schleuse - Oberen_Puffer_Freigeben : Bool - Oberen_Puffer_nichts_einfahren : Bool - Puffer_B : Bool - GesamtAnzahl : Int - SSDW : Int - Schleife : Word // Loopzähler - Trolley : Int - Position : Int - Akive_ShopGroup : DInt - Constant: - ---- NW 1: Parameter-Übergabe --- - L VollPuffer_Nr - - L 275 // Einsprung Puffer-DL - T Para.VollPuffer_DL_DB // vor Aufruf übergeben! - L 0 - T Para.VollPuffer_DL_DW - - ---- NW 2: Anzeige OP --- - L 252 // Bereichsstop aktiv - AN Dyn.Sk_OUT.Bereich_ok // Also: Bereichsstop / Not-Aus - JC w010 - - L 253 - AN Dyn.Sk_OUT.Auto_akt // Keine Betriebsart - AN Dyn.Sk_OUT.Hand_akt - JC w010 - - L 255 // Handbetrieb aktiv - A Dyn.Sk_OUT.Hand_akt - JC w010 - - L Dyn.Sk_IN.Akt_Schritt // Aktiver Schritt - T Dyn.Sk_IN.OP_Schritt - L Dyn.Sk_OUT.Akt_Schritt // Aktiver Schritt - T Dyn.Sk_OUT.OP_Schritt - - JU OP_Ok - -w010: T Dyn.Sk_IN.OP_Schritt - T Dyn.Sk_OUT.OP_Schritt - -OP_Ok: NOP 0 - - ---- NW 3: Out-Bits zum Zurücksetzen / Antrieb plus starten --- - SET - R Y_Schleuse_Auf_IN - R Y_Schleuse_Auf_OUT - R Puffer_IN_ist_leer - R Puffer_OUT_ist_leer - - SET // Jeden Zyklus neu - R Dyn.Status.Trolley_wartet_Auftrag - R Dyn.Status."Trolley_wartet_Bereich+1" - R Dyn.Status."Trolley_fährt_aus_OUT" - R Dyn.Status.Trolley_draussen_Out - R "1.Trolley_IN" - R "1.Trolley_OUT" - R Neu_Trolley_in_Puffer_IN - - A Dyn.Sk_IN.Reset - O Dyn.Sk_IN.Reset_Akt - = Status2.Reset_aktiv_IN - - A Dyn.Sk_OUT.Reset - O Dyn.Sk_OUT.Reset_Akt - = Dyn.Status.Reset_aktiv_OUT - - SET - R Inks_Ok - - A Dyn.Sk_OUT.Auto_akt - = Dyn.Sk_IN.Auto_akt - A Dyn.Sk_OUT.Bereich_ok - = Dyn.Sk_IN.Bereich_ok - -// Antrieb zusätlich starten: - A ErrQuit // Überwachungszeit abgelaufen quittieren - S Antrieb_plus_start // Kreisel-Antrieb plus starten - - ---- NW 4: HMI-Zeug --- -// Von HMI: - A Dyn.HMI.Schleuse_resetten_IN - R Dyn.HMI.Schleuse_resetten_IN - S Dyn.Sk_IN.Reset // SK zurücksetzen - - A Dyn.HMI.Schleuse_resetten_OUT - R Dyn.HMI.Schleuse_resetten_OUT - S Dyn.Sk_OUT.Reset // SK zurücksetzen - - A Dyn.HMI.Puffer_initialisieren - R Dyn.HMI.Puffer_initialisieren // Ohne Reaktion, da keine Daten - - A Dyn.HMI.Einlagern_gesperrt // Wird unten direkt verarbeitet - - A Dyn.HMI.AusLagern_gesperrt // Wird unten direkt verarbeitet - - CLR - -// An HMI: - L 0 - T Dyn.HMI.ShopGroup_IN - T Dyn.HMI.ShopGroup_OUT - T Dyn.HMI.Voll_Trolleys_IN - T Dyn.HMI.Voll_Trolleys_OUT - T Dyn.HMI.Res_Trolleys_IN - T Dyn.HMI."Frei_Plätze_IN" - - L DINT#0 - T Dyn.HMI.TrolleyID_Schleuse_IN - T Dyn.HMI.TrolleyID_Schleuse_OUT - - ---- NW 5: Schrittkette OUT zurücksetzen --- - AN Dyn.Sk_OUT.Reset // SK zurücksetzen - JC en04 - -// Schrittkette zurücksetzen: - L 0 // Schritt 0: Warten - T Dyn.Sk_OUT.Akt_Schritt - - L 0 // Zeitwert löschen - T Dyn.Sk_OUT.Terr_Zelle - T Dyn.Sk_OUT.Tok_Zelle - T Dyn.Leer_Zeit_OUT - - SET - R Status2.Alles_ausfahren_OUT - R Dyn.Error.Err_BLKMov // Error bei Block kopieren - R Dyn.Sk_OUT.Reset // SK zurücksetzen - R Dyn.Sk_OUT.Err_Schritt // Undefinierter Schritt - R Dyn.Sk_OUT.Err_Uebzeit // Sofort weiter ! - S Dyn.Sk_OUT.Reset_Akt // Reset ist aktiv - - SET - R Dyn.Error.Puffer_DL // VollPuffer-Datenliste fehlerhaft - R Dyn.Error.Undef_Puffer // undefiniertes VollPuffer - R Dyn.Status.Trolley_nicht_in_Schleuse_OUT // Trolley fährt nicht in Schleuse - R Dyn.Status.Puffer_nicht_leer_OUT // Puffer unten nicht leer - R Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen - R Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert - R Dyn.Error.Err_Stau_Einfahrt // Stau am VollPuffer-Eingang - R Dyn.Error.Err_BLKMov - - L 0 - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - T Dyn.Mindest_Zeit_OUT // Sensor B_VorSep ist frei [1s] - T SAVE.Weichen_DB - T SAVE.Weichen_DW - -// Defaultwerte übergeben: - L 0 // Damit statische Werte neu aus Datenbank geholt werden ! - T Puffer.VollPuffer_Nr // Nummer des VollPuffers - - BEU - -en04: NOP 0 - - ---- NW 6: Störungen nach Außen übergeben --- - L 0 - T "MW200" - - A Dyn.Error.Puffer_DL // VollPuffer-Datenliste fehlerhaft - = "M200.0" - A Dyn.Error.Undef_Puffer // undefiniertes VollPuffer - = "M200.1" - A Dyn.Error.Err_Trolley_nicht_in_Schleuse_OUT // Trolley fährt nicht in untere Schleuse - = "M200.2" - A Dyn.Sk_IN.Err_Uebzeit - O Dyn.Sk_OUT.Err_Uebzeit - = Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen - = "M200.3" - NEG - R Dyn.Sk_OUT.Err_Uebzeit_AnzOk - A Dyn.Sk_OUT.Err_Schritt - = Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert - = "M200.4" - A Dyn.Error.Err_Stau_Einfahrt // Stau am VollPuffer-Eingang - = "M200.5" - A Dyn.Error.Err_BLKMov // Error bei Block kopieren - = "M200.6" - A Dyn.Error.Err_Trolley_raus_OUT // Trolley fährt nicht aus unterer Schleuse - = "M200.7" - A Dyn.Error.Err_Puffer_nicht_leer_OUT // Trolley unten in Schleuse, obwohl keine Daten! Initialisieren hat gestartet! - = "M201.0" - A Dyn.Error.Err_Trolley_nicht_in_Schleuse_IN // Trolley fährt nicht in mittlere Schleuse - = "M201.1" - A Dyn.Error.Err_Trolley_raus_IN // Trolley fährt nicht aus mittlere Schleuse - = "M201.2" - A Dyn.Error.Err_Puffer_nicht_leer_IN // Trolley mittig in Schleuse, obwohl keine Daten! Initialisieren hat gestartet! - = "M201.3" - CLR - = "M201.4" - A Dyn.Error.Err_Raus_Sensor - = "M201.5" - CLR - = "M201.6" - A Dyn.Sk_OUT.Reset_Akt // Reset ist aktiv - = Dyn.Error.Reset_aktiv - = "M201.7" - -// Andere Meldung als Überwachungszeit aktiv ?: - L "MW200" - L 2#1111_0111_1111_1111 - AW - L 2#0000_0000_0000_0000 // Andere Meldung als Üb.zeit aktiv ? - <>I // Ja ! - ON Dyn.Sk_OUT.Err_Uebzeit_AnzOk // Störung anzeigen ok, da 2.Zyklus aktiv ! - R "M200.3" // Üb.Zeit-Meldung nicht an PC senden - - A Dyn.Sk_OUT.Err_Uebzeit - S Dyn.Sk_OUT.Err_Uebzeit_AnzOk // Störung anzeigen ok, da 2.Zyklus aktiv ! - - L "MW200" - T Error // Schnittstelle nach Außen - -// Störung vorhanden: - L 0 - <>I // Ja ! - = Dyn.Status.Error_aktiv - CLR // Es gibt keine Quittier-Störung! - A Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen - S hStOk - -// Störungen pro Zyklus neu erzeugen: - SET - R Dyn.Error.Puffer_DL // VollPuffer-Datenliste fehlerhaft - R Dyn.Error.Undef_Puffer // undefiniertes VollPuffer - R Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert - R Dyn.Error.Err_BLKMov - R Dyn.Error.Err_Puffer_nicht_leer_OUT // Trolley unten in Schleuse, obwohl keine Daten! Initialisieren hat gestartet! - R Dyn.Error.Err_Trolley_nicht_in_Schleuse_OUT // Trolley fährt nicht in unterer Schleuse - R Dyn.Error.Err_Trolley_raus_OUT // Trolley fährt nicht aus unterer Schleuse - R Dyn.Error.Err_Puffer_nicht_leer_IN // Trolley mittig in Schleuse, obwohl keine Daten! Initialisieren hat gestartet! - R Dyn.Error.Err_Trolley_nicht_in_Schleuse_IN // Trolley fährt nicht in mittlere Schleuse - R Dyn.Error.Err_Trolley_raus_IN // Trolley fährt nicht aus mittlere Schleuse - R Dyn.Error.Err_Raus_Sensor - - ---- NW 7: Statische VollPuffer-Parameter holen --- - L Puffer.VollPuffer_Nr // Nummer des VollPuffers - L VollPuffer_Nr // Aufruf-Parameter - ==I // Identisch ? - R Dyn.Error.Puffer_DL // VollPufferdatenbank fehlerhaft - R Dyn.Error.Undef_Puffer // undefiniertes VollPuffer - JC en06 // Ja ! - - T "MW200" // Search-Daten - -CALL FC "DatenOut" (SSDB:=Para.VollPuffer_DL_DB, SSDW:=Para.VollPuffer_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:=Dyn.Rueckmld.RET_VAL_DL_VollPuffer, OUTDATEN:=P#M220.0, Position:="MW196") - - JBI G_Ok - - A "M199.0" - JCN w060 - - SET - = Dyn.Error.Puffer_DL // VollPufferdatenbank fehlerhaft - - L 16#A061 - T Dyn.Stop_Ursache_OUT - - BEU - -w060: SET - S Dyn.Error.Undef_Puffer // undefinierter VollPuffer - - L 16#0062 - T Dyn.Stop_Ursache_IN - T Dyn.Stop_Ursache_OUT - - BEU - -// Kennung + Datenbytes -G_Ok: SET - R Dyn.Error.Puffer_DL // Gefälledatenbank fehlerhaft - R Dyn.Error.Undef_Puffer // undefinierte Gefällestrecke - - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 20 // Datenwords speichern - T LW2 // Wiederholungen - -// Quelle-Pointer erzeugen: - L 0 // Bei Merker = 0 ! - T LW4 // DB_Nummer - L 220 // Adresse - SLD 3 - L 16#8300_0000 // Kennung: Merker - OD - T LD6 // Kennung, Adresse +FUNCTION_BLOCK "MHMÜberlauf_VP" +TITLE = Omni H&M-Überlaufstrecke-Vollpuffer-Modul +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-960629 +// +//Version: H&M ÜberlaufstreckeVP / 03.2026: +// +//Formaloperanden + Daten bleiben erhalten, damit kein Unterschied bei Zugriffen, +//aber Mittig-Stopper entfernt, usw. +// +//Version: H&M Vollpuffer / 10.2025 +// +//Version: Omniflow 2100 / 10.2024 +// + VAR_INPUT + VollPuffer_Nr { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Aufruf für Voll-Puffer + ErrQuit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Ablaufstörung quittieren + B_VollPufferEinfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley fährt in VollPuffer + B_InSchleuse_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley ist in Schleuse oben + B_InSchleuse_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley ist in Schleuse unten + B_AusSchleuse_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley hat Schleuse unten verlassen + B_Stau_raus_Out { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Stau im Bereich unten rausfahren + B_QuerTrolley_Out : Bool; // Crash-Trolley auf Crashkurs erkannt + Antrieb_plus_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Kreisel-Antrieb plus aktiv + Schleuse_geöffnet_IN : Bool; // Schleuse oben hat geöffnet + Schleuse_geöffnet_OUT : Bool; // Schleuse unten hat geöffnet + END_VAR + + VAR_OUTPUT + Y_Schleuse_Auf_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse oben öffnen + Y_Schleuse_Auf_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse unten öffnen + Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Störungen übergeben + END_VAR + + VAR_IN_OUT + Start_Ok : Bool; // Starten von ausserhalb ist erlaubt + Antrieb_plus_start { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Antrieb plus starten + Antrieb_plus_stoppen : Bool; // Antrieb plus stoppen + hStOk : Bool; // Anzeige Start n. Störung aktivieren + Ausfahr_Inks : Int; // Rest-Inks, wo sich Trolley befindet + END_VAR + + VAR + Res16 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..2] of Int; // Reserve + SAVE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Weichen_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Weichen-FIFO-DB + Weichen_DW { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Weichen-FIFO-DW + END_STRUCT; + Para { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // Parameter + VollPuffer_DL_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung VollPuffer-Datenliste-DB + VollPuffer_DL_DW { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung VollPuffer-Datenliste-DW + Res1 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..2] of Int; // Reserve + END_STRUCT; + Status2 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Puffer_leer_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer oben ist leer + "Puffer_hat Platz_IN" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer oben hat noch Kapazität + Kein_neuer_Trolley_kommt_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer oben zeitlang ohne neuen Trolley + Leer_Check_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // VollPuffer oben wird auf leer gecheckt + Reset_aktiv_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Reset oben aktiv + Trolley_nicht_in_Schleuse_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley oben fährt nicht in Schleuse > Inilauf gestartet + Puffer_nicht_leer_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer oben nicht leer > Inilauf gestartet + Puffer_initialisieren_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // VollPuffer oben initialisieren + MindestZeit_ok_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse ist MindestZeit geöffnet + Frei11 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + Frei12 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + Frei13 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; + Alles_ausfahren_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Alle Trolleys ausfahren + Eintrag_DL_Leerliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLVPPuffer_leer (DB100) erfolgt + Eintrag_DL_Reinliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLVPPuffer_ShopGroup rein (DB101) erfolgt + Eintrag_DL_Abrufliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLVPPuffer_ShopGroup raus (DB901) erfolgt + END_STRUCT; + Puffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "UDLHMVollPuffer"; // Statische VollPufferdaten (aus DL) + Dyn : Struct // Dynamische Daten + Status { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + Puffer_leer_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer oben ist leer + "Puffer_hat Platz_OUT" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer oben hat noch Kapazität + Kein_neuer_Trolley_kommt_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer unten zeitlang ohne neuen Trolley + Leer_Check_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // VollPuffer unten wird auf leer gecheckt + Reset_aktiv_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Reset unten aktiv + Trolley_nicht_in_Schleuse_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley unten fährt nicht in Schleuse > Inilauf gestartet + Puffer_nicht_leer_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer unten nicht leer > Inilauf gestartet + Puffer_initialisieren_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // VollPuffer unten initialisieren + MindestZeit_ok_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse ist MindestZeit geöffnet + "Undef.Trolley_in_Schleuse_OUT" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Undefinierter Trolley in Schleuse unten erkannt + Trolley_wartet_Auftrag { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley wartet auf Auftrag (unten) + "Trolley_wartet_Bereich+1" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley wartet auf Bereich +1 (unten) + Einen_VollTrolley_ausfahren_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Einen Voll-Trolley ausfahren + Trolley_fährt_aus_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt aus (unten) + Trolley_draussen_Out { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley ist ausgefahren + Error_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Störung vorhanden + END_STRUCT; + TrolleyID_Einfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-Nr ist eingefahren + TrolleyID_Schleuse_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-Nr in Schleuse oben (Daten) + TrolleyID_Schleuse_Out { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-Nr in Schleuse unten (Daten) + ShopGroup_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Diese Shopgruppe ist im oberen VollPuffer + ShopGroup_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Diese Shopgruppe ist im unteren VollPuffer + ShopGroup_Auftrag_zum_Ausfahren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // ShopGroup zum Ausfahren (FFFF = akt.Trolley ausfahren) + HMI : Struct + ShopGroup_IN { ExternalWritable := 'False'} : Int; // ShopGroup im VollPuffer oben (IN:PLC, OUT:PLC) + ShopGroup_OUT { ExternalWritable := 'False'} : Int; // ShopGroup im VollPuffer unten (IN:PLC, OUT:PLC) + Voll_Trolleys_IN { ExternalWritable := 'False'} : Int; // Anzahl Trolleys oben (IN:PLC, OUT:PLC) + Voll_Trolleys_OUT { ExternalWritable := 'False'} : Int; // Anzahl Trolleys unten (IN:PLC, OUT:PLC) + Res_Trolleys_IN { ExternalWritable := 'False'} : Int; // Anzahl reservierte Trolleys oben (IN:PLC, OUT:PLC) + Frei_Plätze_IN { ExternalWritable := 'False'} : Int; // Freiplätze für Trolleys (IN:PLC, OUT:PLC) + TrolleyID_Schleuse_IN { ExternalWritable := 'False'} : DInt; // Trolley-Nr in Schleuse oben (IN:PLC, OUT:PLC) + TrolleyID_Schleuse_OUT { ExternalWritable := 'False'} : DInt; // Trolley-Nr in Schleuse unten (IN:PLC, OUT:PLC) + Schleuse_resetten_IN : Bool; // Schleuse resetten oben (IN:HMI, Out:PLC) + Schleuse_resetten_OUT : Bool; // Schleuse resetten unten (IN:HMI, Out:PLC) + Puffer_initialisieren : Bool := 1; // VollPuffer initialisieren (IN:HMI, Out:PLC) + Einlagern_gesperrt : Bool; // Einlagern gesperrt (IN:HMI, OUT:HMI) + AusLagern_gesperrt : Bool; // AusLagern gesperrt (IN:HMI, OUT:HMI) + END_STRUCT; + Sk_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "USk_Omni" := ((), (), (), (), (), (), (), (), (), (), 1, (), (), (), (), (), ()); // Status der Schrittkette Schleuse IN (oben) + Sk_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "USk_Omni" := ((), (), (), (), (), (), (), (), (), (), 1, (), (), (), (), (), ()); // Status der Schrittkette Schleuse OUT (unten) + TrolleyID_doppelt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'True'} : DInt; // TrolleyID doppelt (eingefahrener Trolley) + TrolleyID_unbekannt_Einfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'True'} : DInt; // TrolleyID unbekannt (eingefahrener Trolley) + TrolleyID_unbekannt_Schleuse_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'True'} : DInt; // TrolleyID unbekannt (Trolley in Schleuse unten) + Rueckmld { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + RET_VAL_BLKMOV_VollPuffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Rückmeldung nach BLKMOV-Aufruf + RET_VAL_DL_VollPuffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf + RET_VAL_DL_Res_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf + RET_VAL_DL_VollPufferTrolley_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenIN-Aufruf + RET_VAL_DL_VollPufferTrolley_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf + END_STRUCT; + Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : "UErrHMVollpuffer"; + Stau_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Sensor B_Einfahrt ist belegt [1s] + Mindest_Zeit_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Sensor B_in_Schleuse oben ist frei [1s] + Mindest_Zeit_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Sensor B_in_Schleuse unten ist frei [1s] + Leer_Zeit_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Puffer oben ist frei [1s] + Leer_Zeit_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Puffer unten ist frei [1s] + Stop_Ursache_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Stop-Stelle: Nw + Position + Stop_Ursache_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Stop-Stelle: Nw + Position + Vereinzelungstakte_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Anzahl der getätigten Vereinzelungstakte + TrolleyID_ausgefahren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // TrolleyID des ausgefahrenen Trolleys + ShopGroup_EFL_Gespeichert : DInt; // In EinfahrListe gespeicherte ShopGroup + ShopGroup_AFL_Gespeichert : DInt; // In AusfahrListe gespeicherte ShopGroup + Reservierungs_DL { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // AB DW200: Liste der resevierter Trolleys + Datenlistenkopf { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + KOPF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DA04; // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128) + LAENGE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 12; // Länge der Datenliste (maximale Anzahl der Datensätze) + STAMMDATEN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 2; // Stammdatenlänge in Word (1 - 9) + INDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) + LAENGEINDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!) + INDDATEN_WANDEL_FC { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) + LETZTERZUGRIFF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Speicherung des letzten Zugriffs + Belegt14 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // reserviert von Sort-Datenliste + AnzahlEintraege { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!) + Reserve18 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Reserve + END_STRUCT; + Res_Trolley { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..12] of Struct // Reservierter Trolley für VollPuffer + Trolley_ID { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley_ID + ShopGroup { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Shop-Gruppe auf Trolley + END_STRUCT; + Endekennung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DAEE; // Datensort-Ende-Kennung (DBEE) + END_STRUCT; + Res350 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..16] of Int; + Trolley_DL_Einfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // AB DW350: Liste der Trolleys im VollPuffer + Datenlistenkopf { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + KOPF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DA04; // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128) + LAENGE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 12; // Länge der Datenliste (maximale Anzahl der Datensätze) + STAMMDATEN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 2; // Stammdatenlänge in Word (1 - 9) + INDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) + LAENGEINDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!) + INDDATEN_WANDEL_FC { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) + LETZTERZUGRIFF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Speicherung des letzten Zugriffs + Belegt14 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // reserviert von Sort-Datenliste + AnzahlEintraege { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!) + Reserve18 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Reserve + END_STRUCT; + VollPuffer_Trolley_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..12] of Struct // Trolley im VollPuffer + Trolley_ID { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley_ID + Abruf_ShopGroup { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Reserviert für Ausfahrt + END_STRUCT; + Endekennung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DAEE; // Datensort-Ende-Kennung (DBEE) + END_STRUCT; + Res500 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..16] of Int; + Trolley_DL_Ausfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // AB DW350: Liste der Trolleys im VollPuffer + Datenlistenkopf { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + KOPF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DA04; // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128) + LAENGE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 12; // Länge der Datenliste (maximale Anzahl der Datensätze) + STAMMDATEN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 2; // Stammdatenlänge in Word (1 - 9) + INDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!) + LAENGEINDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!) + INDDATEN_WANDEL_FC { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!) + LETZTERZUGRIFF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Speicherung des letzten Zugriffs + Belegt14 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // reserviert von Sort-Datenliste + AnzahlEintraege { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!) + Reserve18 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Reserve + END_STRUCT; + VollPuffer_Trolley_Out { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..12] of Struct // Trolley im VollPuffer + Trolley_ID { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley_ID + Abruf_ShopGroup { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Reserviert für Ausfahrt + END_STRUCT; + Endekennung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DAEE; // Datensort-Ende-Kennung (DBEE) + END_STRUCT; + Res700 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..41] of Int; // Reserve + END_STRUCT; + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Ueb_akt : Bool; // Überwachungszeit aktivieren + Weiter : Bool; // Weiterschaltbedingung ist erfüllt + Warte_neu : Bool; // Wartezeit neu triggern + Warte_stop : Bool; // Wartezeit stoppen + "1.Trolley_IN" : Bool; + Neu_Trolley_in_Puffer_IN : Bool; // Neuer Trolley in Puffer eingefahren + "1.Trolley_OUT" : Bool; + Inks_Ok : Bool; // Starten aufgrund der Inks erlaubt + Puffer_IN_ist_leer : Bool; // VollPuffer zeitlang ohne Sensor + Puffer_OUT_ist_leer : Bool; // VollPuffer zeitlang ohne Sensor + Abruf_Trolley_vorne : Bool; // Abruf-Trolley ist in Schleuse + Oberen_Puffer_Freigeben : Bool; + Oberen_Puffer_nichts_einfahren : Bool; + Puffer_B : Bool; + GesamtAnzahl : Int; + SSDW : Int; + Schleife : Word; // Loopzähler + Trolley : Int; + Position : Int; + Akive_ShopGroup : DInt; + END_VAR + + +BEGIN +NETWORK +TITLE = Parameter-Übergabe + L #VollPuffer_Nr; + + L 275 ;//Einsprung Puffer-DL + T #Para.VollPuffer_DL_DB;//vor Aufruf übergeben! + L 0; + T #Para.VollPuffer_DL_DW; + +NETWORK +TITLE = Anzeige OP + L 252;//Bereichsstop aktiv + UN #Dyn.Sk_OUT.Bereich_ok;//Also: Bereichsstop / Not-Aus + SPB w010; + + L 253; + UN #Dyn.Sk_OUT.Auto_akt;//Keine Betriebsart + UN #Dyn.Sk_OUT.Hand_akt; + SPB w010; + + L 255;//Handbetrieb aktiv + U #Dyn.Sk_OUT.Hand_akt; + SPB w010; + + L #Dyn.Sk_IN.Akt_Schritt;//Aktiver Schritt + T #Dyn.Sk_IN.OP_Schritt; + L #Dyn.Sk_OUT.Akt_Schritt;//Aktiver Schritt + T #Dyn.Sk_OUT.OP_Schritt; + + SPA OP_Ok; + +w010: T #Dyn.Sk_IN.OP_Schritt; + T #Dyn.Sk_OUT.OP_Schritt; + +OP_Ok: NOP 0; + +NETWORK +TITLE = Out-Bits zum Zurücksetzen / Antrieb plus starten + SET; + R #Y_Schleuse_Auf_IN; + R #Y_Schleuse_Auf_OUT; + R #Puffer_IN_ist_leer; + R #Puffer_OUT_ist_leer; + + SET ;//Jeden Zyklus neu + R #Dyn.Status.Trolley_wartet_Auftrag; + R #Dyn.Status."Trolley_wartet_Bereich+1"; + R #Dyn.Status.Trolley_fährt_aus_OUT; + R #Dyn.Status.Trolley_draussen_Out; + R #"1.Trolley_IN"; + R #"1.Trolley_OUT"; + R #Neu_Trolley_in_Puffer_IN; + + U #Dyn.Sk_IN.Reset; + O #Dyn.Sk_IN.Reset_Akt; + = #Status2.Reset_aktiv_IN; + + U #Dyn.Sk_OUT.Reset; + O #Dyn.Sk_OUT.Reset_Akt; + = #Dyn.Status.Reset_aktiv_OUT; + + SET; + R #Inks_Ok; + + U #Dyn.Sk_OUT.Auto_akt; + = #Dyn.Sk_IN.Auto_akt; + U #Dyn.Sk_OUT.Bereich_ok; + = #Dyn.Sk_IN.Bereich_ok; + +//Antrieb zusätlich starten: + U #ErrQuit ;//Überwachungszeit abgelaufen quittieren + S #Antrieb_plus_start;//Kreisel-Antrieb plus starten + +NETWORK +TITLE = HMI-Zeug + +//Von HMI: + U #Dyn.HMI.Schleuse_resetten_IN; + R #Dyn.HMI.Schleuse_resetten_IN; + S #Dyn.Sk_IN.Reset ;//SK zurücksetzen + + U #Dyn.HMI.Schleuse_resetten_OUT; + R #Dyn.HMI.Schleuse_resetten_OUT; + S #Dyn.Sk_OUT.Reset ;//SK zurücksetzen + + U #Dyn.HMI.Puffer_initialisieren; + R #Dyn.HMI.Puffer_initialisieren;//Ohne Reaktion, da keine Daten + + U #Dyn.HMI.Einlagern_gesperrt;//Wird unten direkt verarbeitet + + U #Dyn.HMI.AusLagern_gesperrt;//Wird unten direkt verarbeitet + + CLR; + +//An HMI: + L 0; + T #Dyn.HMI.ShopGroup_IN; + T #Dyn.HMI.ShopGroup_OUT; + T #Dyn.HMI.Voll_Trolleys_IN; + T #Dyn.HMI.Voll_Trolleys_OUT; + T #Dyn.HMI.Res_Trolleys_IN; + T #Dyn.HMI.Frei_Plätze_IN; + + L DINT#0; + T #Dyn.HMI.TrolleyID_Schleuse_IN; + T #Dyn.HMI.TrolleyID_Schleuse_OUT; + +NETWORK +TITLE = Schrittkette OUT zurücksetzen + UN #Dyn.Sk_OUT.Reset;//SK zurücksetzen + SPB en04; + +//Schrittkette zurücksetzen: + L 0;//Schritt 0: Warten + T #Dyn.Sk_OUT.Akt_Schritt; + + L 0;//Zeitwert löschen + T #Dyn.Sk_OUT.Terr_Zelle; + T #Dyn.Sk_OUT.Tok_Zelle; + T #Dyn.Leer_Zeit_OUT; + + SET; + R #Status2.Alles_ausfahren_OUT; + R #Dyn.Error.Err_BLKMov;//Error bei Block kopieren + R #Dyn.Sk_OUT.Reset;//SK zurücksetzen + R #Dyn.Sk_OUT.Err_Schritt;//Undefinierter Schritt + R #Dyn.Sk_OUT.Err_Uebzeit;//Sofort weiter ! + S #Dyn.Sk_OUT.Reset_Akt;//Reset ist aktiv + + SET; + R #Dyn.Error.Puffer_DL;//VollPuffer-Datenliste fehlerhaft + R #Dyn.Error.Undef_Puffer;//undefiniertes VollPuffer + R #Dyn.Status.Trolley_nicht_in_Schleuse_OUT;//Trolley fährt nicht in Schleuse + R #Dyn.Status.Puffer_nicht_leer_OUT;//Puffer unten nicht leer + R #Dyn.Error.Err_Uebzeit;//Überwachungzeit ist abgelaufen + R #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert + R #Dyn.Error.Err_Stau_Einfahrt;//Stau am VollPuffer-Eingang + R #Dyn.Error.Err_BLKMov; + + L 0; + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + T #Dyn.Mindest_Zeit_OUT ;//Sensor B_VorSep ist frei [1s] + T #SAVE.Weichen_DB; + T #SAVE.Weichen_DW; + +//Defaultwerte übergeben: + L 0 ;//Damit statische Werte neu aus Datenbank geholt werden ! + T #Puffer.VollPuffer_Nr;//Nummer des VollPuffers + + BEA; + +en04: NOP 0; + +NETWORK +TITLE = Störungen nach Außen übergeben + L 0; + T "MW200"; + + U #Dyn.Error.Puffer_DL;//VollPuffer-Datenliste fehlerhaft + = "M200.0"; + U #Dyn.Error.Undef_Puffer;//undefiniertes VollPuffer + = "M200.1"; + U #Dyn.Error.Err_Trolley_nicht_in_Schleuse_OUT;//Trolley fährt nicht in untere Schleuse + = "M200.2"; + U #Dyn.Sk_IN.Err_Uebzeit; + O #Dyn.Sk_OUT.Err_Uebzeit; + = #Dyn.Error.Err_Uebzeit;//Überwachungzeit ist abgelaufen + = "M200.3"; + NOT; + R #Dyn.Sk_OUT.Err_Uebzeit_AnzOk; + U #Dyn.Sk_OUT.Err_Schritt; + = #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert + = "M200.4"; + U #Dyn.Error.Err_Stau_Einfahrt;//Stau am VollPuffer-Eingang + = "M200.5"; + U #Dyn.Error.Err_BLKMov;//Error bei Block kopieren + = "M200.6"; + U #Dyn.Error.Err_Trolley_raus_OUT;//Trolley fährt nicht aus unterer Schleuse + = "M200.7"; + U #Dyn.Error.Err_Puffer_nicht_leer_OUT;//Trolley unten in Schleuse, obwohl keine Daten! Initialisieren hat gestartet! + = "M201.0"; + U #Dyn.Error.Err_Trolley_nicht_in_Schleuse_IN;//Trolley fährt nicht in mittlere Schleuse + = "M201.1"; + U #Dyn.Error.Err_Trolley_raus_IN;//Trolley fährt nicht aus mittlere Schleuse + = "M201.2"; + U #Dyn.Error.Err_Puffer_nicht_leer_IN;//Trolley mittig in Schleuse, obwohl keine Daten! Initialisieren hat gestartet! + = "M201.3"; + CLR; + = "M201.4"; + U #Dyn.Error.Err_Raus_Sensor; + = "M201.5"; + CLR; + = "M201.6"; + U #Dyn.Sk_OUT.Reset_Akt;//Reset ist aktiv + = #Dyn.Error.Reset_aktiv; + = "M201.7"; + +//Andere Meldung als Überwachungszeit aktiv ?: + L "MW200"; + L 2#1111_0111_1111_1111; + UW; + L 2#0000_0000_0000_0000;//Andere Meldung als Üb.zeit aktiv ? + <>I;//Ja ! + ON #Dyn.Sk_OUT.Err_Uebzeit_AnzOk;//Störung anzeigen ok, da 2.Zyklus aktiv ! + R "M200.3";//Üb.Zeit-Meldung nicht an PC senden + + U #Dyn.Sk_OUT.Err_Uebzeit; + S #Dyn.Sk_OUT.Err_Uebzeit_AnzOk;//Störung anzeigen ok, da 2.Zyklus aktiv ! + + L "MW200"; + T #Error;//Schnittstelle nach Außen + +//Störung vorhanden: + L 0; + <>I;//Ja ! + = #Dyn.Status.Error_aktiv; + CLR;//Es gibt keine Quittier-Störung! + U #Dyn.Error.Err_Uebzeit;//Überwachungzeit ist abgelaufen + S #hStOk; + +//Störungen pro Zyklus neu erzeugen: + SET; + R #Dyn.Error.Puffer_DL;//VollPuffer-Datenliste fehlerhaft + R #Dyn.Error.Undef_Puffer;//undefiniertes VollPuffer + R #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert + R #Dyn.Error.Err_BLKMov; + R #Dyn.Error.Err_Puffer_nicht_leer_OUT;//Trolley unten in Schleuse, obwohl keine Daten! Initialisieren hat gestartet! + R #Dyn.Error.Err_Trolley_nicht_in_Schleuse_OUT;//Trolley fährt nicht in unterer Schleuse + R #Dyn.Error.Err_Trolley_raus_OUT;//Trolley fährt nicht aus unterer Schleuse + R #Dyn.Error.Err_Puffer_nicht_leer_IN;//Trolley mittig in Schleuse, obwohl keine Daten! Initialisieren hat gestartet! + R #Dyn.Error.Err_Trolley_nicht_in_Schleuse_IN;//Trolley fährt nicht in mittlere Schleuse + R #Dyn.Error.Err_Trolley_raus_IN;//Trolley fährt nicht aus mittlere Schleuse + R #Dyn.Error.Err_Raus_Sensor; + +NETWORK +TITLE = Statische VollPuffer-Parameter holen + L #Puffer.VollPuffer_Nr;//Nummer des VollPuffers + L #VollPuffer_Nr;//Aufruf-Parameter + ==I;//Identisch ? + R #Dyn.Error.Puffer_DL;//VollPufferdatenbank fehlerhaft + R #Dyn.Error.Undef_Puffer;//undefiniertes VollPuffer + SPB en06;//Ja ! + + T "MW200";//Search-Daten + + CALL "DatenOut" + ( SSDB := #Para.VollPuffer_DL_DB , + SSDW := #Para.VollPuffer_DL_DW , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := #Dyn.Rueckmld.RET_VAL_DL_VollPuffer , + OUTDATEN := P#M220.0 , + Position := "MW196" + ); + + SPBI G_Ok; + + U "M199.0"; + SPBN w060; + + SET; + = #Dyn.Error.Puffer_DL;//VollPufferdatenbank fehlerhaft + + L 16#A061; + T #Dyn.Stop_Ursache_OUT; + + BEA; + +w060: SET; + S #Dyn.Error.Undef_Puffer;//undefinierter VollPuffer + + L 16#0062; + T #Dyn.Stop_Ursache_IN; + T #Dyn.Stop_Ursache_OUT; + + BEA; + +//Kennung + Datenbytes +G_Ok: SET; + R #Dyn.Error.Puffer_DL;//Gefälledatenbank fehlerhaft + R #Dyn.Error.Undef_Puffer;//undefinierte Gefällestrecke + + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 20;//Datenwords speichern + T %LW2;//Wiederholungen + +//Quelle-Pointer erzeugen: + L 0;//Bei Merker = 0 ! + T %LW4;//DB_Nummer + L 220;//Adresse + SLD 3; + L 16#8300_0000;//Kennung: Merker + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #Dyn.Rueckmld.RET_VAL_BLKMOV_VollPuffer , + DSTBLK := #Puffer //#Ziel + ); + + L 16#0063; + T #Dyn.Stop_Ursache_IN; + T #Dyn.Stop_Ursache_OUT; + + L #Dyn.Rueckmld.RET_VAL_BLKMOV_VollPuffer;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Dyn.Error.Err_BLKMov ;//Error bei Block kopieren + BEB; + + L #Puffer.Puffer_Typ ;//Puffertyp = 1276 (Vollpuffer) + L 1276 ;//Dieser Aufruf-FB ? + ==I;//Ja ! + SPB w061; + + SET; + S #Dyn.Error.Undef_Puffer;//undefinierter VollPuffer + + L 0 ;//VollPuffer ungültig ! + T #Puffer.VollPuffer_Nr;//Nummer des VollPuffers + + L 16#0064; + T #Dyn.Stop_Ursache_IN; + T #Dyn.Stop_Ursache_OUT; + + BEA; + +//Defaultwerte übergeben: +w061: NOP 0; + + BEA; + +en06: NOP 0; + +NETWORK +TITLE = Störungen quittieren + U #ErrQuit ;//Überwachungszeit abgelaufen quittieren + R #Dyn.Sk_IN.Err_Uebzeit; + R #Dyn.Sk_OUT.Err_Uebzeit; + +NETWORK +TITLE = Einfahrenden Trolley aus Reservierungliste austragen + L #Dyn.TrolleyID_Einfahrt; + T "MD220"; + L DINT#0; + ==I; + SPB NoNewT; + +//Neue Position an Gesamt-Trolley-DL übergeben: + CALL "Trolley_DL_Neue_Pos" + ( Gesamt_Trolley_DL := #Puffer.Gesamt_Trolley_DL , + TrolleyID := #Dyn.TrolleyID_Einfahrt , + Position := #Puffer.Puffer_Position , + ShopGroup := Dint#0 , + Err := "M199.0" + ); + +//Austrag aus Trolley-Reservierungsliste + L #Dyn.TrolleyID_Einfahrt;//Eintrag ist erfolgt + T "MD220"; + +ResOut: L #Puffer.Puffer_Dyn_DW; + L #Puffer.PufferReservierungsliste_DW; + +I; + T #SSDW; + + CALL "DatenOut" + ( SSDB := #Puffer.Puffer_Dyn_DB , + SSDW := #SSDW , + PARA := 16#E100 , //Eintrag löschen + SEARCHDATEN := P#M220.0 , + RE_VAL := #Dyn.Rueckmld.RET_VAL_DL_Res_OUT , + OUTDATEN := P#M220.0 , //Nicht relevant + Position := "MW196" + ); + + L DINT#0; + T #Dyn.TrolleyID_Einfahrt; + +NoNewT: NOP 0; + +NETWORK +TITLE = Error: Stau Bereich-Eingang + +//Sensor bei Bereichs-Einfahrt bleibt belegt?: + UN #B_VollPufferEinfahrt ;//Sensor Trolley fährt in Bereich (kein Stau !) + R #Dyn.Error.Err_Stau_Einfahrt;//Stau bei Einfahrt + SPB X090 ;//StauZeit neu aufziehen + + UN "1s-Impuls"; + O #Dyn.Error.Err_Stau_Einfahrt;//Zeit bereits abgelaufen + SPB Xn09; + + L #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + + +1; + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + + L 25 ;//Stau-Zeit erreicht ? + >=I;//Ja ! + S #Dyn.Error.Err_Stau_Einfahrt;//Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb + SPBN Xn09; + +X090: L 0 ;//Zeiten löschen + T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s] + +Xn09: NOP 0; + +NETWORK +TITLE = Schleuse OUT: Mindestzeit geöffnet/frei, Position-Inks übergeben + L #Dyn.Sk_OUT.Akt_Schritt; + L 6 ;//Mindestzeit ok? + <>I;//Nein! + O #B_InSchleuse_OUT ;//Sensor Trolley in Schleuse vorhanden + ON #Schleuse_geöffnet_OUT;//Schleuse hat geöffnet + R #Dyn.Status.MindestZeit_ok_OUT; + SPB X100 ;//FreiZeit neu aufziehen + + UN "1s-Impuls"; + O; + U #Puffer.Parameter_allg.Antrieb_Plus_vorhanden; + UN #Antrieb_plus_aktiv; + O #Dyn.Status.MindestZeit_ok_OUT;//Zeit bereits abgelaufen + SPB Xn10; + + L #Dyn.Mindest_Zeit_OUT ;//Sensor B_im_Sep ist frei [1s] + + +1; + T #Dyn.Mindest_Zeit_OUT ;//Sensor B_im_Sep ist frei [1s] + + L #Puffer.Mindeszeit_Schleuse_geoeffnet ;//Mindest-Zeit erreicht ? + >=I;//Ja ! + S #Dyn.Status.MindestZeit_ok_OUT; + SPBN Xn10; + +X100: L 0 ;//Zeiten löschen + T #Dyn.Mindest_Zeit_OUT ;//Sensor B_im_Sep ist frei [1s] + +//Schleuse geöffnet: (Position-Inks übergeben) +Xn10: UN #Schleuse_geöffnet_OUT ;//Schleuse hat geöffnet + SPB X10E; + + L #Ausfahr_Inks; + L #Puffer.Puffer_Position_Inks; + >I;//Rest-Inks-Wert ist größer! + SPB X10E; + + L #Puffer.Puffer_Position_Inks; + T #Ausfahr_Inks; + +X10E: NOP 0; + +NETWORK +TITLE = Reservierungs-Check + L #Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege; + L 0; + ==I; + SPB NoResCheck ;//Später -> Hauptstrangdaten checken! + + L #VollPuffer_Nr; + L 126; + >=I; + = #Puffer_B;//Puffer gehört zu Bereich B + +//Keine Trolleydaten in Sorter A? + U "DVP_Sorter_A".Sorter_A_leer; + UN #Puffer_B ;//Puffer gehört zu Bereich B + SPB ResDel; + +//Keine Trolleydaten in Sorter A+B? + U "DVP_Sorter_A".Sorter_A_leer; + U "DVP_Sorter_B".Sorter_B_leer; + U #Puffer_B ;//Puffer gehört zu Bereich B + SPB ResDel; + +//Ansonsten über Ziel-Check +//Daten vom 1.Reservierungs-Trolley holen: + L #Dyn.Reservierungs_DL.Res_Trolley[1].Trolley_ID; + T "TrolleyDL_SearchDaten".SEARCHDaten.TrolleyID; + +//Trolleydaten lesen: + CALL "DatenOut" + ( SSDB := 1000 , + SSDW := 0 , + PARA := 16#0000 , //Eintrag lesen + SEARCHDATEN := %DB1012.DBX0.0 , + RE_VAL := "MB198" , + OUTDATEN := %DB1011.DBX0.0 , + Position := "MW200" + ); + + L "MB198"; + L 2#10000000 ;//Datensatz vorhanden? + <>I;//Nein! + SPB NoResCheck; + + L "TrolleyDL_OutDaten".OUTDaten.EndZiel; + L 101 ;//VollPuffer ? + >=I ;//Ja! + U(; + TAK; + L 151 ;//VollPuffer ? + <=I ;//Ja! + ); + SPB NoResCheck ;//Warten, Trolley kommt noch! + +ResDel: L #Dyn.Reservierungs_DL.Res_Trolley[1].Trolley_ID; + T "MD220"; + + SPA ResOut; + +NoResCheck: NOP 0; + +NETWORK +TITLE = Puffer oben hat Platz / ist frei + +//Puffer hat Platz: + L #Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege; + L #Puffer.MaxAnzahl_Einfahrt; + I;//Ja! + O(; + L 1;//Minimalwert ? + ==I;//Ja ! + ); + = #Inks_Ok; + +X14E: NOP 0; + +NETWORK +TITLE = OUT-Sprungverteiler +OUT_Sk: L #Dyn.Sk_OUT.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + L -1;//angegeben ? + ==I;//Nein ! + SPB NEU; + + TAK;//Neuen Schritt übergeben + T #Dyn.Sk_OUT.Akt_Schritt; + + L -1;//Urzustand + T #Dyn.Sk_OUT.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + +NEU: SET; + R #Ueb_akt ;//Überwachungszeit aktivieren + R #Warte_neu;//Wartezeit neutriggern + R #Warte_stop;//Wartezeit stoppen + + L #Dyn.Sk_OUT.Akt_Schritt; + SPL Ende; + SPA s000;//Schritt 0 + SPA s001;//Schritt 1 + SPA s002;//Schritt 2 + SPA s003;//Schritt 3 + SPA s004;//Schritt 4 + SPA s005;//Schritt 5 + SPA s006;//Schritt 6 + SPA s007;//Schritt 7 + SPA s008;//Schritt 8 + SPA s009;//Schritt 9 + SPA s010;//Schritt 10 + SPA s011;//Schritt 11 + SPA s012;//Schritt 12 + SPA s013;//Schritt 13 + SPA s014;//Schritt 14 + SPA s015;//Schritt 15 + SPA s016;//Schritt 16 + SPA s017;//Schritt 17 + SPA s018;//Schritt 18 + SPA s019;//Schritt 19 + SPA s020;//Schritt 20 + SPA s021;//Schritt 21 + SPA s022;//Schritt 22 + SPA s023;//Schritt 23 + SPA s024;//Schritt 24 + SPA s025;//Schritt 25 + SPA s026;//Schritt 26 + SPA s027;//Schritt 27 + SPA s028;//Schritt 28 + SPA s029;//Schritt 29 + SPA s030;//Schritt 30 +Ende: S #Dyn.Sk_OUT.Err_Schritt;//Undefinierter Schritt + + L 16#A131; + T #Dyn.Stop_Ursache_OUT; + + SPA RET; + +Neu_Mig: U #Dyn.Sk_OUT.Err_Uebzeit; + SPBN Sk; + + L 16#A132; + T #Dyn.Stop_Ursache_OUT; + + SPA RET; + +Sk: T #Dyn.Sk_OUT.Akt_Schritt; + + L 0;//Zeitwerte löschen + T #Dyn.Sk_OUT.Terr_Zelle; + T #Dyn.Sk_OUT.Tok_Zelle; + + SPA NEU; + +//Nicht programmierte Schritte: +//s000: SPA Ende +//s001: SPA Ende +//s002: SPA Ende +s003: SPA Ende; +s004: SPA Ende; +//s005: SPA Ende +//s006: SPA Ende +//s007: SPA Ende +s008: SPA Ende; +s009: SPA Ende; +s010: SPA Ende; +s011: SPA Ende; +s012: SPA Ende; +s013: SPA Ende; +s014: SPA Ende; +s015: SPA Ende; +s016: SPA Ende; +s017: SPA Ende; +s018: SPA Ende; +s019: SPA Ende; +//s020: SPA Ende +//s021: SPA Ende +s022: SPA Ende; +s023: SPA Ende; +s024: SPA Ende; +s025: SPA Ende; +s026: SPA Ende; +s027: SPA Ende; +s028: SPA Ende; +s029: SPA Ende; +s030: SPA Ende; + +NETWORK +TITLE = OUT-Schritt X: Reserve + SET;//Weiterschaltbedingung + = #Weiter; + +//Schrittaktionen: + SET; + + L 16#B001; + T #Dyn.Stop_Ursache_OUT; + + U #Dyn.Sk_OUT.Reset_Akt;//Reset ist aktiv + L 20;//Weiter mit Schritt 20 + SPB Neu_Mig;//Bei diesem Schritt weiter + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk_OUT.Err_Uebzeit;//Sofort weiter ! + L 0 ;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + L 1;//Weiter mit Schritt 1 + SPB Neu_Mig;//Bei diesem Schritt weiter + + T #Dyn.Sk_OUT.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + SET; + U #Dyn.Sk_OUT.Auto_akt;//Automatik ist aktiv + U #Dyn.Sk_OUT.Bereich_ok; + = #Ueb_akt;//Überwachungszeit aktivieren + L 50 ;//Angabe der Überwachungszeit (*1s) + SPA tueb;//Überwachungszeit + + SPA RET; + +NETWORK +TITLE = OUT-Schritt 0: Warten auf Trolley +s000: SET;//Weiterschaltbedingung + U #B_InSchleuse_OUT ;//Trolley im Schleuse erkannt + U #Dyn.Sk_OUT.Auto_akt ;//Automatik ist aktiv + U #Dyn.Sk_OUT.Bereich_ok; + = #Weiter; + +//Schrittaktionen: + SET; + R #Dyn.Error.Err_Puffer_nicht_leer_OUT; + + U #Dyn.Sk_OUT.Reset_Akt;//Reset ist aktiv + L 20;//Weiter mit Schritt 20 + SPB Neu_Mig;//Bei diesem Schritt weiter + + L 0; + T #Dyn.TrolleyID_Schleuse_Out; + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk_OUT.Err_Uebzeit;//Sofort weiter ! + L 100 ;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + L 16#B001; + T #Dyn.Stop_Ursache_OUT; + + SPA RET; + +NETWORK +TITLE = OUT-Schritt 1: Trolley ist in Schleuse +s001: NOP 0; + +//Schrittaktionen: + UN #B_InSchleuse_OUT ;//Trolley im Schleuse erkannt + L 0 ;//Weiter mit Schritt 0 + SPB Neu_Mig;//Bei diesem Schritt weiter + + L 2 ;//Weiter mit Schritt 2 + SPA Neu_Mig ;//Bei diesem Schritt weiter + +NETWORK +TITLE = OUT-Schritt 2: Ausfahren ok ? +s002: NOP 0; + +//Schrittaktionen: + UN #B_InSchleuse_OUT ;//Trolley im Schleuse erkannt + L 0 ;//Weiter mit Schritt 0 + SPB Neu_Mig;//Bei diesem Schritt weiter + + SET; + S #Dyn.Status."Trolley_wartet_Bereich+1"; + +//Anlage aus oder Störung: + L 16#B020; + T #Dyn.Stop_Ursache_OUT; + + UN #Dyn.Sk_OUT.Auto_akt ;//Automatik ist aktiv + ON #Dyn.Sk_OUT.Bereich_ok;//Bereich ist gestört + SPB X002; + +//Starten erlaut Trolley ?: + L 16#B021; + T #Dyn.Stop_Ursache_OUT; + + UN #Start_Ok ;//Starten ist erlaubt + SPB X002; + +//Inks ok ?: + L 16#B022; + T #Dyn.Stop_Ursache_OUT; + + UN #Inks_Ok ;//Starten ist erlaubt + SPB X002; + +//Stau im Bereich +1: + L 16#B023; + T #Dyn.Stop_Ursache_OUT; + + U #B_Stau_raus_Out; + SPB X002 ;//Stau + +//B_Aus_Schleuse aktiv: + L 16#B024; + T #Dyn.Stop_Ursache_OUT; + + U #Puffer.Parameter_allg.B_AusSep_vorhanden; + U #B_AusSchleuse_OUT; + = #Dyn.Error.Err_Raus_Sensor;//Raus-Sensor wird nicht erreicht (oder dauernd aktiv)! + SPB X002; + +//Antriebe aktivieren / aktiv ?: + U #Puffer.Parameter_allg.Antrieb_Plus_vorhanden;//Schleuse an weiterem Antrieb (Weiche) + S #Antrieb_plus_start;//Kreisel-Antrieb plus starten + + L 16#B025; + T #Dyn.Stop_Ursache_OUT; + + UN #Antrieb_plus_aktiv;//Kreisel-Antrieb plus aktiv + U #Puffer.Parameter_allg.Antrieb_Plus_vorhanden;//Schleuse an weiterem Antrieb (Weiche) + ON #Dyn.Sk_OUT.Auto_akt;//Automatik ist aktiv + ON #Dyn.Sk_OUT.Bereich_ok; + SPB RET; + + L 5 ;//Nur 1 langes Signal! + SPA Neu_Mig ;//Bei diesem Schritt weiter + +X002: L 1 ;//Auftrag checken + T #Dyn.Sk_OUT.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + SPA RET; + +NETWORK +TITLE = OUT-Schritt 5: Trolley fährt aus/ausgefahren ? +s005: SET ;//Weiterschaltbedingung + UN #B_InSchleuse_OUT ;//Sensor Trolley ist in Schleuse + U(; + O #B_AusSchleuse_OUT ;//Sensor Trolley aus Schleuse gefahren + ON #Puffer.Parameter_allg.B_AusSep_vorhanden; + ); + U #Antrieb_plus_aktiv; + = #Weiter; + +//Schrittaktionen: + SET; + R #Start_Ok ;//Damit kein weiterer Puffer ausfährt + S #Y_Schleuse_Auf_OUT ;//Schleuse öffnen + S #Dyn.Status.Trolley_fährt_aus_OUT; + S #Antrieb_plus_start;//Kreisel-Antrieb plus starten + +//Trolley ist draussen: + U(; + O #B_AusSchleuse_OUT ;//Sensor Trolley aus Schleuse gefahren + ON #Puffer.Parameter_allg.B_AusSep_vorhanden; + ); + R #Dyn.Sk_OUT.Err_Uebzeit;//Sofort weiter ! + R #Dyn.Error.Err_Trolley_raus_OUT;//Trolley fährt nicht aus + L 0; + SPB Plus ;//Nächsten Schritt starten + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk_OUT.Err_Uebzeit;//Sofort weiter ! + R #Dyn.Error.Err_Trolley_raus_OUT;//Trolley fährt nicht aus + L 50;//Falls nur mit Sensor gefahren wird, dann Wartezeit! + SPB Plus ;//Nächsten Schritt starten + +//Trolley fährt nicht raus!: + U #Dyn.Sk_OUT.Err_Uebzeit; + O #B_QuerTrolley_Out;//QuerTrolley auf Crashkurs + S #Dyn.Error.Err_Trolley_raus_OUT;//Trolley fährt nicht aus + + L 16#B051; + T #Dyn.Stop_Ursache_OUT; + + UN #B_AusSchleuse_OUT ;//Sensor Trolley aus Schleuse gefahren + SPB x052; + + L 16#B052; + T #Dyn.Stop_Ursache_OUT; + +x052: U #Antrieb_plus_aktiv; + = #Ueb_akt ;//Überwachungszeit aktivieren + L #Puffer.Übzeit_aus_Schleuse;//Angabe der Überwachungszeit (*1s) + SPA tueb ;//Überwachungszeit + +NETWORK +TITLE = OUT-Schritt 6: Schleuse Mindestzeit geöffnet ? +s006: SET ;//Weiterschaltbedingung + U #Dyn.Status.MindestZeit_ok_OUT; + O; + U #Puffer.Parameter_allg.B_AusSep_vorhanden; + U #B_AusSchleuse_OUT ;//Sensor Trolley aus Schleuse gefahren + = #Weiter; + +//Schrittaktionen: + U #B_QuerTrolley_Out ;//QuerTrolley auf Crashkurs + S #Dyn.Error.Err_Trolley_raus_OUT;//Trolley fährt nicht aus + + SET; + R #Start_Ok;//Damit kein weiterer Puffer ausfährt + S #Y_Schleuse_Auf_OUT ;//Schleuse öffnen + S #Antrieb_plus_start;//Kreisel-Antrieb plus starten + S #Dyn.Status.Trolley_fährt_aus_OUT; + + U #B_InSchleuse_OUT;//Trolley wieder erkannt + L 5 ;//Weiter mit Schritt 5 + SPB Neu_Mig;//Bei diesem Schritt weiter + + U #Weiter; + L 0; + SPB Plus ;//Nächsten Schritt starten + + L 16#B061; + T #Dyn.Stop_Ursache_OUT; + + SPA RET; +NETWORK +TITLE = OUT-Schritt 7: Trolleydaten ändern +s007: SET ;//Weiterschaltbedingung + = #Weiter; + +//Schrittaktionen: + SET; + R #Dyn.Status.Einen_VollTrolley_ausfahren_OUT; + S #Dyn.Status.Trolley_draussen_Out;//1 Zyklus + + L #Dyn.Vereinzelungstakte_OUT; + + DINT#1;//Vereinzelungen +1 + T #Dyn.Vereinzelungstakte_OUT; + + SPA ENDE_Mig; + +NETWORK +TITLE = OUT-Schritt 20: Schleuse resetten +s020: SET;//Weiterschaltbedingung + = #Weiter;//Weiterschaltbedingung ist erfüllt + +//Schrittaktionen: + U #Schleuse_geöffnet_OUT; + R #Start_Ok;//Damit kein weiterer Puffer ausfährt + + L 16#B201; + T #Dyn.Stop_Ursache_OUT; + + U #Weiter;//Weiterschaltbedingung ist erfüllt + L 300;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + SET; + = #Ueb_akt;//Überwachungszeit aktivieren + L 30;//Angabe der Überwachungszeit (*100ms) + SPA tueb;//Überwachungszeit + +NETWORK +TITLE = OUT-Schritt 21: Reset ist zu Ende +s021: SET; + R #Dyn.Sk_OUT.Reset_Akt;//Reset ist aktiv + R #Dyn.HMI.Schleuse_resetten_OUT; -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_VollPuffer, DSTBLK:=Puffer) // Datenliste-Daten speichern | #Ziel + SPA ENDE_Mig;//Neubeginn + +NETWORK +TITLE = OUT-Schrittkette beenden +ENDE_Mig: L 0;//Schritt 0: Warten + T #Dyn.Sk_OUT.Akt_Schritt; - L 16#0063 - T Dyn.Stop_Ursache_IN - T Dyn.Stop_Ursache_OUT + L 0;//Zeitwert löschen + T #Dyn.Sk_OUT.Terr_Zelle; + T #Dyn.Sk_OUT.Tok_Zelle; - L Dyn.Rueckmld.RET_VAL_BLKMOV_VollPuffer // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Dyn.Error.Err_BLKMov // Error bei Block kopieren - BEC + SET; + R #Dyn.Sk_OUT.Err_Uebzeit; - L Puffer.Puffer_Typ // Puffertyp = 1276 (Vollpuffer) - L 1276 // Dieser Aufruf-FB ? - ==I // Ja ! - JC w061 + SPA RET; - SET - S Dyn.Error.Undef_Puffer // undefinierter VollPuffer +NETWORK +TITLE = OUT-Nächsten Schritt aktivieren +Plus: T #Dyn.Sk_OUT.T_ok;//Wartezeit übergeben - L 0 // VollPuffer ungültig ! - T Puffer.VollPuffer_Nr // Nummer des VollPuffers + U #Dyn.Sk_OUT.Err_Uebzeit ;//Störung noch nicht quittiert + SPB RET; - L 16#0064 - T Dyn.Stop_Ursache_IN - T Dyn.Stop_Ursache_OUT + L 0;//keine Wartezeit ? + ==I;//Ja ! -> sofort weiter + SPB w220; - BEU + UN #Warte_neu;//Wartezeit neutriggern + SPB W220_Mig; -// Defaultwerte übergeben: -w061: NOP 0 + L 0; + T #Dyn.Sk_OUT.Tok_Zelle;//Wartezeit - BEU +W220_Mig: U #Warte_stop;//Wartezeit stoppen + SPB RET; -en06: NOP 0 + L #Dyn.Sk_OUT.Tok_Zelle; + L "MW4";//Wartezeit +10ms + +I; + T #Dyn.Sk_OUT.Tok_Zelle;//Wartezeit + L #Dyn.Sk_OUT.T_ok;//abgelaufen ? + I;//abgelaufen ? + UN #Dyn.Sk_OUT.Err_Uebzeit; + SPB en24;//Nein ! -// Austrag aus Trolley-Reservierungsliste - L Dyn.TrolleyID_Einfahrt // Eintrag ist erfolgt - T "MD220" + U #Ueb_akt;//Überwachungszeit aktivieren + S #Dyn.Sk_OUT.Err_Uebzeit; -ResOut: L Puffer.Puffer_Dyn_DW - L Puffer.PufferReservierungsliste_DW - +I - T SSDW + L 0;//Zeitwert löschen + T #Dyn.Sk_OUT.Terr_Zelle; -CALL FC "DatenOut" (SSDB:=Puffer.Puffer_Dyn_DB, SSDW:=SSDW, PARA:=16#E100, SEARCHDATEN:=P#M220.0, RE_VAL:=Dyn.Rueckmld.RET_VAL_DL_Res_OUT, OUTDATEN:=P#M220.0, Position:="MW196") // Eintrag löschen | Nicht relevant + SPA RET; - L DINT#0 - T Dyn.TrolleyID_Einfahrt +en24: NOP 0; +NETWORK +TITLE = OUT-Überwachungszeit +1 + UN #Dyn.Sk_OUT.Ueb_akt;//Schrittaktion ist aktiv + ON "1s-Impuls"; + SPB RET; -NoNewT: NOP 0 + L #Dyn.Sk_OUT.Terr_Zelle; + + 1 ;//Üb.zeit +1s + T #Dyn.Sk_OUT.Terr_Zelle; + SPA RET; ---- NW 10: Error: Stau Bereich-Eingang --- -// Sensor bei Bereichs-Einfahrt bleibt belegt?: - AN B_VollPufferEinfahrt // Sensor Trolley fährt in Bereich (kein Stau !) - R Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt - JC X090 // StauZeit neu aufziehen +NETWORK +TITLE = Ende +RET: NOP 0; - AN "1s-Impuls" - O Dyn.Error.Err_Stau_Einfahrt // Zeit bereits abgelaufen - JC Xn09 + BE; - L Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - + +1 - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - - L 25 // Stau-Zeit erreicht ? - >=I // Ja ! - S Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb - JCN Xn09 - -X090: L 0 // Zeiten löschen - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s] - -Xn09: NOP 0 - - ---- NW 11: Schleuse OUT: Mindestzeit geöffnet/frei, Position-Inks übergeben --- - L Dyn.Sk_OUT.Akt_Schritt - L 6 // Mindestzeit ok? - <>I // Nein! - O B_InSchleuse_OUT // Sensor Trolley in Schleuse vorhanden - ON "Schleuse_geöffnet_OUT" // Schleuse hat geöffnet - R Dyn.Status.MindestZeit_ok_OUT - JC X100 // FreiZeit neu aufziehen - - AN "1s-Impuls" - O - A Puffer.Parameter_allg.Antrieb_Plus_vorhanden - AN Antrieb_plus_aktiv - O Dyn.Status.MindestZeit_ok_OUT // Zeit bereits abgelaufen - JC Xn10 - - L Dyn.Mindest_Zeit_OUT // Sensor B_im_Sep ist frei [1s] - + +1 - T Dyn.Mindest_Zeit_OUT // Sensor B_im_Sep ist frei [1s] - - L Puffer.Mindeszeit_Schleuse_geoeffnet // Mindest-Zeit erreicht ? - >=I // Ja ! - S Dyn.Status.MindestZeit_ok_OUT - JCN Xn10 - -X100: L 0 // Zeiten löschen - T Dyn.Mindest_Zeit_OUT // Sensor B_im_Sep ist frei [1s] - -// Schleuse geöffnet: (Position-Inks übergeben) -Xn10: AN "Schleuse_geöffnet_OUT" // Schleuse hat geöffnet - JC X10E - - L Ausfahr_Inks - L Puffer.Puffer_Position_Inks - >I // Rest-Inks-Wert ist größer! - JC X10E - - L Puffer.Puffer_Position_Inks - T Ausfahr_Inks - -X10E: NOP 0 - - ---- NW 12: Reservierungs-Check --- - L Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege - L 0 - ==I - JC NoResCheck // Später -> Hauptstrangdaten checken! - - L VollPuffer_Nr - L 126 - >=I - = Puffer_B // Puffer gehört zu Bereich B - -// Keine Trolleydaten in Sorter A? - A "DVP_Sorter_A".Sorter_A_leer - AN Puffer_B // Puffer gehört zu Bereich B - JC ResDel - -// Keine Trolleydaten in Sorter A+B? - A "DVP_Sorter_A".Sorter_A_leer - A "DVP_Sorter_B".Sorter_B_leer - A Puffer_B // Puffer gehört zu Bereich B - JC ResDel - -// Ansonsten über Ziel-Check -// Daten vom 1.Reservierungs-Trolley holen: - L Dyn.Reservierungs_DL.Res_Trolley[1].Trolley_ID - T "TrolleyDL_SearchDaten".SEARCHDaten.TrolleyID - -// Trolleydaten lesen: -CALL FC "DatenOut" (SSDB:=1000, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=DB1012.DBX0.0, RE_VAL:="MB198", OUTDATEN:=DB1011.DBX0.0, Position:="MW200") // Eintrag lesen - - L "MB198" - L 2#10000000 // Datensatz vorhanden? - <>I // Nein! - JC NoResCheck - - L "TrolleyDL_OutDaten".OUTDaten.EndZiel - L 101 // VollPuffer ? - >=I // Ja! - A( - CAC - L 151 // VollPuffer ? - <=I // Ja! - ) - JC NoResCheck // Warten, Trolley kommt noch! - -ResDel: L Dyn.Reservierungs_DL.Res_Trolley[1].Trolley_ID - T "MD220" - - JU ResOut - -NoResCheck: NOP 0 - - ---- NW 13: Puffer oben hat Platz / ist frei --- -// Puffer hat Platz: - L Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege - L Puffer.MaxAnzahl_Einfahrt - I // Ja! - O( - L 1 // Minimalwert ? - ==I // Ja ! - ) - = Inks_Ok - -X14E: NOP 0 - - ---- NW 15: OUT-Sprungverteiler --- -OUT_Sk: L Dyn.Sk_OUT.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - L -1 // angegeben ? - ==I // Nein ! - JC NEU - - CAC // Neuen Schritt übergeben - T Dyn.Sk_OUT.Akt_Schritt - - L -1 // Urzustand - T Dyn.Sk_OUT.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - -NEU: SET - R Ueb_akt // Überwachungszeit aktivieren - R Warte_neu // Wartezeit neutriggern - R Warte_stop // Wartezeit stoppen - - L Dyn.Sk_OUT.Akt_Schritt - JL Ende - JU s000 // Schritt 0 - JU s001 // Schritt 1 - JU s002 // Schritt 2 - JU s003 // Schritt 3 - JU s004 // Schritt 4 - JU s005 // Schritt 5 - JU s006 // Schritt 6 - JU s007 // Schritt 7 - JU s008 // Schritt 8 - JU s009 // Schritt 9 - JU s010 // Schritt 10 - JU s011 // Schritt 11 - JU s012 // Schritt 12 - JU s013 // Schritt 13 - JU s014 // Schritt 14 - JU s015 // Schritt 15 - JU s016 // Schritt 16 - JU s017 // Schritt 17 - JU s018 // Schritt 18 - JU s019 // Schritt 19 - JU s020 // Schritt 20 - JU s021 // Schritt 21 - JU s022 // Schritt 22 - JU s023 // Schritt 23 - JU s024 // Schritt 24 - JU s025 // Schritt 25 - JU s026 // Schritt 26 - JU s027 // Schritt 27 - JU s028 // Schritt 28 - JU s029 // Schritt 29 - JU s030 // Schritt 30 -Ende: S Dyn.Sk_OUT.Err_Schritt // Undefinierter Schritt - - L 16#A131 - T Dyn.Stop_Ursache_OUT - - JU RET - -Neu_Mig: A Dyn.Sk_OUT.Err_Uebzeit - JCN Sk - - L 16#A132 - T Dyn.Stop_Ursache_OUT - - JU RET - -Sk: T Dyn.Sk_OUT.Akt_Schritt - - L 0 // Zeitwerte löschen - T Dyn.Sk_OUT.Terr_Zelle - T Dyn.Sk_OUT.Tok_Zelle - - JU NEU - -// Nicht programmierte Schritte: -// s000: SPA Ende -// s001: SPA Ende -// s002: SPA Ende -s003: JU Ende -s004: JU Ende -// s005: SPA Ende -// s006: SPA Ende -// s007: SPA Ende -s008: JU Ende -s009: JU Ende -s010: JU Ende -s011: JU Ende -s012: JU Ende -s013: JU Ende -s014: JU Ende -s015: JU Ende -s016: JU Ende -s017: JU Ende -s018: JU Ende -s019: JU Ende -// s020: SPA Ende -// s021: SPA Ende -s022: JU Ende -s023: JU Ende -s024: JU Ende -s025: JU Ende -s026: JU Ende -s027: JU Ende -s028: JU Ende -s029: JU Ende -s030: JU Ende - - ---- NW 16: OUT-Schritt X: Reserve --- - SET // Weiterschaltbedingung - = Weiter - -// Schrittaktionen: - SET - - L 16#B001 - T Dyn.Stop_Ursache_OUT - - A Dyn.Sk_OUT.Reset_Akt // Reset ist aktiv - L 20 // Weiter mit Schritt 20 - JC Neu_Mig // Bei diesem Schritt weiter - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk_OUT.Err_Uebzeit // Sofort weiter ! - L 0 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - L 1 // Weiter mit Schritt 1 - JC Neu_Mig // Bei diesem Schritt weiter - - T Dyn.Sk_OUT.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - SET - A Dyn.Sk_OUT.Auto_akt // Automatik ist aktiv - A Dyn.Sk_OUT.Bereich_ok - = Ueb_akt // Überwachungszeit aktivieren - L 50 // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - - JU RET - - ---- NW 17: OUT-Schritt 0: Warten auf Trolley --- -s000: SET // Weiterschaltbedingung - A B_InSchleuse_OUT // Trolley im Schleuse erkannt - A Dyn.Sk_OUT.Auto_akt // Automatik ist aktiv - A Dyn.Sk_OUT.Bereich_ok - = Weiter - -// Schrittaktionen: - SET - R Dyn.Error.Err_Puffer_nicht_leer_OUT - - A Dyn.Sk_OUT.Reset_Akt // Reset ist aktiv - L 20 // Weiter mit Schritt 20 - JC Neu_Mig // Bei diesem Schritt weiter - - L 0 - T Dyn.TrolleyID_Schleuse_Out - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk_OUT.Err_Uebzeit // Sofort weiter ! - L 100 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - L 16#B001 - T Dyn.Stop_Ursache_OUT - - JU RET - - ---- NW 18: OUT-Schritt 1: Trolley ist in Schleuse --- -s001: NOP 0 - -// Schrittaktionen: - AN B_InSchleuse_OUT // Trolley im Schleuse erkannt - L 0 // Weiter mit Schritt 0 - JC Neu_Mig // Bei diesem Schritt weiter - - L 2 // Weiter mit Schritt 2 - JU Neu_Mig // Bei diesem Schritt weiter - - ---- NW 19: OUT-Schritt 2: Ausfahren ok ? --- -s002: NOP 0 - -// Schrittaktionen: - AN B_InSchleuse_OUT // Trolley im Schleuse erkannt - L 0 // Weiter mit Schritt 0 - JC Neu_Mig // Bei diesem Schritt weiter - - SET - S Dyn.Status."Trolley_wartet_Bereich+1" - -// Anlage aus oder Störung: - L 16#B020 - T Dyn.Stop_Ursache_OUT - - AN Dyn.Sk_OUT.Auto_akt // Automatik ist aktiv - ON Dyn.Sk_OUT.Bereich_ok // Bereich ist gestört - JC X002 - -// Starten erlaut Trolley ?: - L 16#B021 - T Dyn.Stop_Ursache_OUT - - AN Start_Ok // Starten ist erlaubt - JC X002 - -// Inks ok ?: - L 16#B022 - T Dyn.Stop_Ursache_OUT - - AN Inks_Ok // Starten ist erlaubt - JC X002 - -// Stau im Bereich +1: - L 16#B023 - T Dyn.Stop_Ursache_OUT - - A B_Stau_raus_Out - JC X002 // Stau - -// B_Aus_Schleuse aktiv: - L 16#B024 - T Dyn.Stop_Ursache_OUT - - A Puffer.Parameter_allg.B_AusSep_vorhanden - A B_AusSchleuse_OUT - = Dyn.Error.Err_Raus_Sensor // Raus-Sensor wird nicht erreicht (oder dauernd aktiv)! - JC X002 - -// Antriebe aktivieren / aktiv ?: - A Puffer.Parameter_allg.Antrieb_Plus_vorhanden // Schleuse an weiterem Antrieb (Weiche) - S Antrieb_plus_start // Kreisel-Antrieb plus starten - - L 16#B025 - T Dyn.Stop_Ursache_OUT - - AN Antrieb_plus_aktiv // Kreisel-Antrieb plus aktiv - A Puffer.Parameter_allg.Antrieb_Plus_vorhanden // Schleuse an weiterem Antrieb (Weiche) - ON Dyn.Sk_OUT.Auto_akt // Automatik ist aktiv - ON Dyn.Sk_OUT.Bereich_ok - JC RET - - L 5 // Nur 1 langes Signal! - JU Neu_Mig // Bei diesem Schritt weiter - -X002: L 1 // Auftrag checken - T Dyn.Sk_OUT.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - JU RET - - ---- NW 20: OUT-Schritt 5: Trolley fährt aus/ausgefahren ? --- -s005: SET // Weiterschaltbedingung - AN B_InSchleuse_OUT // Sensor Trolley ist in Schleuse - A( - O B_AusSchleuse_OUT // Sensor Trolley aus Schleuse gefahren - ON Puffer.Parameter_allg.B_AusSep_vorhanden - ) - A Antrieb_plus_aktiv - = Weiter - -// Schrittaktionen: - SET - R Start_Ok // Damit kein weiterer Puffer ausfährt - S Y_Schleuse_Auf_OUT // Schleuse öffnen - S Dyn.Status."Trolley_fährt_aus_OUT" - S Antrieb_plus_start // Kreisel-Antrieb plus starten - -// Trolley ist draussen: - A( - O B_AusSchleuse_OUT // Sensor Trolley aus Schleuse gefahren - ON Puffer.Parameter_allg.B_AusSep_vorhanden - ) - R Dyn.Sk_OUT.Err_Uebzeit // Sofort weiter ! - R Dyn.Error.Err_Trolley_raus_OUT // Trolley fährt nicht aus - L 0 - JC Plus // Nächsten Schritt starten - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk_OUT.Err_Uebzeit // Sofort weiter ! - R Dyn.Error.Err_Trolley_raus_OUT // Trolley fährt nicht aus - L 50 // Falls nur mit Sensor gefahren wird, dann Wartezeit! - JC Plus // Nächsten Schritt starten - -// Trolley fährt nicht raus!: - A Dyn.Sk_OUT.Err_Uebzeit - O B_QuerTrolley_Out // QuerTrolley auf Crashkurs - S Dyn.Error.Err_Trolley_raus_OUT // Trolley fährt nicht aus - - L 16#B051 - T Dyn.Stop_Ursache_OUT - - AN B_AusSchleuse_OUT // Sensor Trolley aus Schleuse gefahren - JC x052 - - L 16#B052 - T Dyn.Stop_Ursache_OUT - -x052: A Antrieb_plus_aktiv - = Ueb_akt // Überwachungszeit aktivieren - L Puffer."Übzeit_aus_Schleuse" // Angabe der Überwachungszeit (*1s) - JU tueb // Überwachungszeit - - ---- NW 21: OUT-Schritt 6: Schleuse Mindestzeit geöffnet ? --- -s006: SET // Weiterschaltbedingung - A Dyn.Status.MindestZeit_ok_OUT - O - A Puffer.Parameter_allg.B_AusSep_vorhanden - A B_AusSchleuse_OUT // Sensor Trolley aus Schleuse gefahren - = Weiter - -// Schrittaktionen: - A B_QuerTrolley_Out // QuerTrolley auf Crashkurs - S Dyn.Error.Err_Trolley_raus_OUT // Trolley fährt nicht aus - - SET - R Start_Ok // Damit kein weiterer Puffer ausfährt - S Y_Schleuse_Auf_OUT // Schleuse öffnen - S Antrieb_plus_start // Kreisel-Antrieb plus starten - S Dyn.Status."Trolley_fährt_aus_OUT" - - A B_InSchleuse_OUT // Trolley wieder erkannt - L 5 // Weiter mit Schritt 5 - JC Neu_Mig // Bei diesem Schritt weiter - - A Weiter - L 0 - JC Plus // Nächsten Schritt starten - - L 16#B061 - T Dyn.Stop_Ursache_OUT - - JU RET - ---- NW 22: OUT-Schritt 7: Trolleydaten ändern --- -s007: SET // Weiterschaltbedingung - = Weiter - -// Schrittaktionen: - SET - R Dyn.Status.Einen_VollTrolley_ausfahren_OUT - S Dyn.Status.Trolley_draussen_Out // 1 Zyklus - - L Dyn.Vereinzelungstakte_OUT - + DINT#1 // Vereinzelungen +1 - T Dyn.Vereinzelungstakte_OUT - - JU ENDE_Mig - - ---- NW 23: OUT-Schritt 20: Schleuse resetten --- -s020: SET // Weiterschaltbedingung - = Weiter // Weiterschaltbedingung ist erfüllt - -// Schrittaktionen: - A "Schleuse_geöffnet_OUT" - R Start_Ok // Damit kein weiterer Puffer ausfährt - - L 16#B201 - T Dyn.Stop_Ursache_OUT - - A Weiter // Weiterschaltbedingung ist erfüllt - L 300 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - SET - = Ueb_akt // Überwachungszeit aktivieren - L 30 // Angabe der Überwachungszeit (*100ms) - JU tueb // Überwachungszeit - - ---- NW 24: OUT-Schritt 21: Reset ist zu Ende --- -s021: SET - R Dyn.Sk_OUT.Reset_Akt // Reset ist aktiv - R Dyn.HMI.Schleuse_resetten_OUT - - JU ENDE_Mig // Neubeginn - - ---- NW 25: OUT-Schrittkette beenden --- -ENDE_Mig: L 0 // Schritt 0: Warten - T Dyn.Sk_OUT.Akt_Schritt - - L 0 // Zeitwert löschen - T Dyn.Sk_OUT.Terr_Zelle - T Dyn.Sk_OUT.Tok_Zelle - - SET - R Dyn.Sk_OUT.Err_Uebzeit - - JU RET - - ---- NW 26: OUT-Nächsten Schritt aktivieren --- -Plus: T Dyn.Sk_OUT.T_ok // Wartezeit übergeben - - A Dyn.Sk_OUT.Err_Uebzeit // Störung noch nicht quittiert - JC RET - - L 0 // keine Wartezeit ? - ==I // Ja ! -> sofort weiter - JC w220 - - AN Warte_neu // Wartezeit neutriggern - JC W220_Mig - - L 0 - T Dyn.Sk_OUT.Tok_Zelle // Wartezeit - -W220_Mig: A Warte_stop // Wartezeit stoppen - JC RET - - L Dyn.Sk_OUT.Tok_Zelle - L "MW4" // Wartezeit +10ms - +I - T Dyn.Sk_OUT.Tok_Zelle // Wartezeit - L Dyn.Sk_OUT.T_ok // abgelaufen ? - I // abgelaufen ? - AN Dyn.Sk_OUT.Err_Uebzeit - JC en24 // Nein ! - - A Ueb_akt // Überwachungszeit aktivieren - S Dyn.Sk_OUT.Err_Uebzeit - - L 0 // Zeitwert löschen - T Dyn.Sk_OUT.Terr_Zelle - - JU RET - -en24: NOP 0 - ---- NW 28: OUT-Überwachungszeit +1 --- - AN Dyn.Sk_OUT.Ueb_akt // Schrittaktion ist aktiv - ON "1s-Impuls" - JC RET - - L Dyn.Sk_OUT.Terr_Zelle - + 1 // Üb.zeit +1s - T Dyn.Sk_OUT.Terr_Zelle - - JU RET - - ---- NW 29: Ende --- -RET: NOP 0 - - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Module/MImpulsGeber.awl b/=A01+UH07-KF00/Programmbausteine/Module/MImpulsGeber.awl index fdda011..9405c2b 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/MImpulsGeber.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/MImpulsGeber.awl @@ -1,122 +1,147 @@ -=== FB 100: MImpulsGeber [STL] === -INTERFACE: - Input: - Ink_DB : Int // DB-Nr des Inkremental-Gebers (Zählerbaugruppe) Neu-Sync-Zähler - B_Zaehlen : Bool // Sensor zum Zählen - Antrieb_aktiv : Bool // Antrieb ist aktiv - Quit : Bool - Zeit_Signal_zu_lang : Time := T#350ms - Zeit_Kein_Signal : Time := T#500ms - Output: - Signal : Bool // Falls kein InkDB - InOut: - Err_Kein_Signal : Bool // Kein_Signal bei laufenden Antrieb - Err_Signal_zu_lang : Bool // Signal bei laufenden Antrieb zu lang - Static: - Sensor_entprellen : Bool - Timer_1 : TON_TIME - Timer_2 : TON_TIME - Timer_3 : TON_TIME - Temp: - Constant: +FUNCTION_BLOCK "MImpulsGeber" +TITLE = Modul Zähler über Zahnrad-Sensor Wert in Zähler-DB eintragen +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 + VAR_INPUT + Ink_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // DB-Nr des Inkremental-Gebers (Zählerbaugruppe) Neu-Sync-Zähler + B_Zaehlen : Bool; // Sensor zum Zählen + Antrieb_aktiv : Bool; // Antrieb ist aktiv + Quit : Bool; + Zeit_Signal_zu_lang : Time := T#350ms; + Zeit_Kein_Signal : Time := T#500ms; + END_VAR ---- NW 1: Initialisierung --- - SET - R Signal + VAR_OUTPUT + Signal : Bool; // Falls kein InkDB + END_VAR + + VAR_IN_OUT + Err_Kein_Signal : Bool; // Kein_Signal bei laufenden Antrieb + Err_Signal_zu_lang : Bool; // Signal bei laufenden Antrieb zu lang + END_VAR + + VAR + Sensor_entprellen : Bool; + Timer_1 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; + Timer_2 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; + Timer_3 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; + END_VAR ---- NW 2: Störungen --- -// Störung quittieren: - A Quit - R Err_Signal_zu_lang - R Err_Kein_Signal +BEGIN +NETWORK +TITLE = Initialisierung + SET; + R #Signal; -// Signal zu lang: - A B_Zaehlen // Sensor zum Zählen - A Antrieb_aktiv // Antrieb ist aktiv - AN Quit - = "M200.0" +NETWORK +TITLE = Störungen -CALL SYS "TON" (IN:="M200.0", PT:=Zeit_Signal_zu_lang, Q:=?, ET:=?) +//Störung quittieren: + U #Quit; + R #Err_Signal_zu_lang; + R #Err_Kein_Signal; - A Timer_2.Q - S Err_Signal_zu_lang +//Signal zu lang: + U #B_Zaehlen ;//Sensor zum Zählen + U #Antrieb_aktiv ;//Antrieb ist aktiv + UN #Quit; + = "M200.0"; -// Kein Signal: - AN B_Zaehlen // Sensor zum Zählen - A Antrieb_aktiv // Antrieb ist aktiv - AN Quit - = "M200.0" + CALL #Timer_2 + {time_type := 'Time'} + ( IN := "M200.0" , + PT := #Zeit_Signal_zu_lang + ); -CALL SYS "TON" (IN:="M200.0", PT:=Zeit_Kein_Signal, Q:=?, ET:=?) + U #Timer_2.Q; + S #Err_Signal_zu_lang; - A Timer_3.Q - S Err_Kein_Signal +//Kein Signal: + UN #B_Zaehlen ;//Sensor zum Zählen + U #Antrieb_aktiv ;//Antrieb ist aktiv + UN #Quit; + = "M200.0"; + CALL #Timer_3 + {time_type := 'Time'} + ( IN := "M200.0" , + PT := #Zeit_Kein_Signal + ); ---- NW 3: Zählen über Sensor --- - AN B_Zaehlen // Sensor zum Zählen - A Sensor_entprellen // Sperre Auswertung schon erfolgt - A Antrieb_aktiv // Antrieb ist aktiv - = "M200.0" + U #Timer_3.Q; + S #Err_Kein_Signal; -CALL SYS "TON" (IN:="M200.0", PT:=t#50ms, Q:=?, ET:=?) +NETWORK +TITLE = Zählen über Sensor + UN #B_Zaehlen ;//Sensor zum Zählen + U #Sensor_entprellen ;//Sperre Auswertung schon erfolgt + U #Antrieb_aktiv ;//Antrieb ist aktiv + = "M200.0"; - A Timer_1.Q - R Sensor_entprellen // Sperre Auswertung schon erfolgt + CALL #Timer_1 + {time_type := 'Time'} + ( IN := "M200.0" , + PT := t#50ms + ); - AN B_Zaehlen // Sensor zum Zählen - O Sensor_entprellen - BEC + U #Timer_1.Q; + R #Sensor_entprellen ;//Sperre Auswertung schon erfolgt - SET - S Sensor_entprellen // Sperre Auswertung schon erfolgt - S Signal // Für Signal-Auswertung ohne InkDB + UN #B_Zaehlen ;//Sensor zum Zählen + O #Sensor_entprellen; + BEB; + SET; + S #Sensor_entprellen ;//Sperre Auswertung schon erfolgt + S #Signal ;//Für Signal-Auswertung ohne InkDB ---- NW 4: Übergabe an Inkrement-Baustein / max.Wert erreicht? --- - L Ink_DB - T "MW200" +NETWORK +TITLE = Übergabe an Inkrement-Baustein / max.Wert erreicht? + L #Ink_DB; + T "MW200"; - L 0 // Sinnvolle Angabe? - <=I // Nein! - BEC // Also nur Signal-Auswertung ! + L 0;//Sinnvolle Angabe? + <=I;//Nein! + BEB;//Also nur Signal-Auswertung ! - OPN DB["MW200"] // Zähler-DB öffnen + AUF DB[ "MW200"] ;//Zähler-DB öffnen - L DBD80 - + DINT#1 // Aktueller Zählerwert +1 - T DBD80 + L %DBD80; + + DINT#1 ;//Aktueller Zählerwert +1 + T %DBD80; - L DBD80 // Aktueller Zählerwert - L DBD76 // Max. Wert erreicht ? - <=D // Nein ! - R DBX74.5 // Ohne Flag-Lauf wurde beendet - R DBX74.4 // Flag-Lauf wurde beendet - BEC + L %DBD80 ;//Aktueller Zählerwert + L %DBD76 ;//Max. Wert erreicht ? + <=D ;//Nein ! + R %DBX74.5 ;//Ohne Flag-Lauf wurde beendet + R %DBX74.4 ;//Flag-Lauf wurde beendet + BEB; - -D // Restwert als Startwert nehmen ! - T DBD80 // Keine Inkrementalgeber verbaut, sondern nur Sensor + -D ;//Restwert als Startwert nehmen ! + T %DBD80 ;//Keine Inkrementalgeber verbaut, sondern nur Sensor - AN DBX74.3 // Umschaltung Zähl-Lauf ohne-mit-ohne Flag - = DBX74.5 // Ohne Flag-Lauf wurde beendet - A DBX74.3 // Umschaltung Zähl-Lauf ohne-mit-ohne Flag - = DBX74.4 // Flag-Lauf wurde beendet + UN %DBX74.3 ;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag + = %DBX74.5 ;//Ohne Flag-Lauf wurde beendet + U %DBX74.3 ;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag + = %DBX74.4 ;//Flag-Lauf wurde beendet - AN DBX74.3 // Umschaltung Zähl-Lauf ohne-mit-ohne Flag - = DBX74.3 + UN %DBX74.3 ;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag + = %DBX74.3; -// Zähler auf 000 setzen ?: - AN DBX74.6 // Zähler Zero-Load - BEC +//Zähler auf 000 setzen ?: + UN %DBX74.6 ;//Zähler Zero-Load + BEB; - SET - R DBX74.6 + SET; + R %DBX74.6; - L 0 - T DBD80 // Zählerwert zum Setzen + L 0; + T %DBD80 ;//Zählerwert zum Setzen +NETWORK +TITLE = Ende + BE; ---- NW 5: Ende --- - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Module/MSensoren.awl b/=A01+UH07-KF00/Programmbausteine/Module/MSensoren.awl index a0302d6..cdce1a7 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/MSensoren.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/MSensoren.awl @@ -1,87 +1,94 @@ -=== FB 91: MSensoren [STL] === -INTERFACE: - Input: - ESensor : Bool // Eingang des zu überwachenden Sensors - T_Ein : Int := 1 // Einschaltzeitverzögerung (*100ms) - T_Aus : Int := 5 // Ausschaltzeitverzögerung (*100ms) - tein_aktiv : Bool := TRUE // Einschaltzeit aktivieren - taus_aktiv : Bool := TRUE // Ausschaltzeit aktivieren - Output: - InOut: - Static: - Stat : "USensor_Ein_Aus" // Status des Endschalters - Temp: - Constant: +FUNCTION_BLOCK "MSensoren" +TITLE = Ein-/Ausschaltverzögerung für Entprellung der Sensoren +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : EAN +VERSION : 0.1 + VAR_INPUT + ESensor { ExternalWritable := 'False'} : Bool; // Eingang des zu überwachenden Sensors + T_Ein { ExternalWritable := 'False'} : Int := 1; // Einschaltzeitverzögerung (*100ms) + T_Aus { ExternalWritable := 'False'} : Int := 5; // Ausschaltzeitverzögerung (*100ms) + tein_aktiv { ExternalWritable := 'False'} : Bool := TRUE; // Einschaltzeit aktivieren + taus_aktiv { ExternalWritable := 'False'} : Bool := TRUE; // Ausschaltzeit aktivieren + END_VAR ---- NW 1: Zeitwert löschen --- - A ESensor - A Stat.B_Akt - O - AN ESensor - AN Stat.B_Akt - JCN Nw02 + VAR + Stat { ExternalWritable := 'False'} : "USensor_Ein_Aus"; // Status des Endschalters + END_VAR -tdel: L 0 // Zeitwert löschen - T Stat.T_Zelle - - BEU - ---- NW 2: Einschaltzeit abgelaufen ? --- -Nw02: L Stat.T_Ein_Akt // Gewollter Zeitwert - L 9999 // angegeben ? - <>I // Ja ! - JC w020 - - L T_Ein // Sollwert übergeben - T Stat.T_Ein_Akt // Gewollter Zeitwert - -w020: A Stat.B_Akt - JC Nw03 - - L Stat.T_Zelle // Aktueller Zeitwert - L Stat.T_Ein_Akt // Gewollter Zeitwert erreicht ? - >=I - S Stat.B_Akt // Sensor ist nach Einschaltzeit aktiv - JC tdel // Zeit löschen - - JU Nw04 - ---- NW 3: Ausschaltzeit abgelaufen ? --- -Nw03: L Stat.T_Aus_Akt // Gewollter Zeitwert - L 9999 // angegeben ? - <>I // Ja ! - JC w030 - - L T_Aus // Sollwert übergeben - T Stat.T_Aus_Akt // Gewollter Zeitwert - -w030: AN Stat.B_Akt - JC Nw04 - - L Stat.T_Zelle // Aktueller Zeitwert - L Stat.T_Aus_Akt // Gewollter Zeitwert erreicht ? - >=I - R Stat.B_Akt // Sensor ist nach Ausschaltzeit nicht mehr aktiv - JC tdel // Zeit löschen +BEGIN +NETWORK +TITLE = Zeitwert löschen + U #ESensor; + U #Stat.B_Akt; + O; + UN #ESensor; + UN #Stat.B_Akt; + SPBN Nw02; ---- NW 4: Zeit läuft --- -Nw04: AN "100ms-Impuls" // nur als Impuls - O - AN Stat.B_Akt // Einschaltzeit läuft - AN tein_aktiv // aber Zeit einfrieren - O - A Stat.B_Akt // Ausschaltzeit läuft - AN taus_aktiv // aber Zeit einfrieren - BEC +tdel: L 0;//Zeitwert löschen + T #Stat.T_Zelle; - L Stat.T_Zelle - L "MW2" - +I - T Stat.T_Zelle + BEA; +NETWORK +TITLE = Einschaltzeit abgelaufen ? +Nw02: L #Stat.T_Ein_Akt;//Gewollter Zeitwert + L 9999;//angegeben ? + <>I;//Ja ! + SPB w020; + L #T_Ein;//Sollwert übergeben + T #Stat.T_Ein_Akt;//Gewollter Zeitwert ---- NW 5: Ende --- - BE +w020: U #Stat.B_Akt; + SPB Nw03; + + L #Stat.T_Zelle;//Aktueller Zeitwert + L #Stat.T_Ein_Akt;//Gewollter Zeitwert erreicht ? + >=I; + S #Stat.B_Akt;//Sensor ist nach Einschaltzeit aktiv + SPB tdel;//Zeit löschen + + SPA Nw04; +NETWORK +TITLE = Ausschaltzeit abgelaufen ? +Nw03: L #Stat.T_Aus_Akt;//Gewollter Zeitwert + L 9999;//angegeben ? + <>I;//Ja ! + SPB w030; + + L #T_Aus;//Sollwert übergeben + T #Stat.T_Aus_Akt;//Gewollter Zeitwert + +w030: UN #Stat.B_Akt; + SPB Nw04; + + L #Stat.T_Zelle;//Aktueller Zeitwert + L #Stat.T_Aus_Akt;//Gewollter Zeitwert erreicht ? + >=I; + R #Stat.B_Akt;//Sensor ist nach Ausschaltzeit nicht mehr aktiv + SPB tdel;//Zeit löschen + +NETWORK +TITLE = Zeit läuft +Nw04: UN "100ms-Impuls";//nur als Impuls + O; + UN #Stat.B_Akt;//Einschaltzeit läuft + UN #tein_aktiv;//aber Zeit einfrieren + O; + U #Stat.B_Akt;//Ausschaltzeit läuft + UN #taus_aktiv;//aber Zeit einfrieren + BEB; + + L #Stat.T_Zelle; + L "MW2"; + +I; + T #Stat.T_Zelle; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Module/MSepSorterRein.awl b/=A01+UH07-KF00/Programmbausteine/Module/MSepSorterRein.awl index 4082e4c..6cafb08 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/MSepSorterRein.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/MSepSorterRein.awl @@ -1,2318 +1,2433 @@ -=== FB 176: MSepSorterRein [STL] === -INTERFACE: - Input: - Separator_Nr : Int // Aufruf für Separator - ErrQuit : Bool // Ablaufstörung quittieren - B_VorSep : Bool // Sensor BT fährt in Bereich - B_ImSep : Bool // Sensor BT ist im Separator - B_AusSep : Bool // Sensor BT hat Separator verlassen - B_Beladen_im_Sep : Bool // Sensor BT ist beladen im Sep - B_Pinsensor : Bool // Zustand Pinsensor - B_Beladen_nach_Sep : Bool // Sensor BT ist beladen nach Sep - Start_Ok : Bool // Starten ist erlaubt - Antrieb_aktiv : Bool // Kreisel-Antrieb aktiv - Antrieb_plus_aktiv : Bool // Kreisel-Antrieb plus aktiv - Output: - Y_Sep_Auf : Bool // Separator öffnen - K_Sanner_triggern : Bool // Scanner triggern - Sorter_Reset : Bool // Sorterbereich resetten - Error : Word // Störungen übergeben - InOut: - Antrieb_start : Bool // Kreiselantrieb starten - Antrieb_plus_start : Bool // Kreisel-Antrieb plus starten - Antrieb_stoppen : Bool // Kreiselantrieb stoppen - hStOk : Bool // Anzeige Start n. Störung aktivieren - Static: - Res1 : Array[1..1] of Int // Reserve - SAVE : Struct - Frei : DInt - Sensorfrei_Zeit : Int // Sensor B_imSep ist frei [10ms] - Last_Ziel : Int // Letztes angefahrenes Ziel - Para : Struct // Parameter - Separator_DL_DB : Int // Einsprung Separator-Datenliste-DB - Separator_DL_DW : Int // Einsprung Separator-Datenliste-DW - Res1 : Array[1..3] of Int // Reserve - Separator : "UDLSepSorterRein" // Fahrbereichs Daten - Dyn : Struct // Dynamische Daten - Status : Struct - Vereinzelungstakte : DInt // Anzahl der getätigten Vereinzelungstakte - Stop_Ursache : Word // Stop-Stelle: Nw + Position - Betriebsart_Art : Struct // Aktive Betriebsart - Listen : Bool // [SCTL=1] Meldung an PC, falls BT in Schleuse - Rapidfire : Bool // [SCTL=2] Alle BTs austakten (ohne Ende) - TillEmpty : Bool // [SCTL=3] Alle BTs austakten (Ende nach zeitlang kein BT) - Job : Bool // [SCTL=4] Anzahl von BTs austakten (Ende nach Anzahl) - Job_TillEmpty : Bool // [SCTL=5] Anzahl von BTs austakten (Ende nach zeitlang kein BT) - DestFull : Bool // [SCTL=6] Alle BTs austakten (bis Stau-Sensor aktiv) - Scannen : Bool // [SCTL=7] Ausfahren über Scanner + PC-Rückmeldung - Scannen_TillEmpty : Bool // [SCTL=8] wie oben [SCTL=7](Ende nach zeitlang kein BT) - PC_Del : Bool // Betriebsart aufgrund vom PC löschen - Sack_Tel : Bool // Sack-Telegramm senden - Res12 : Bool - BT_leer : Bool // BT/MT ist leer - BT_beladen : Bool // BT/MT ist beladen - BT_kommt : Bool // BT/MT fährt zum Sep - Stau_vor_Sep : Bool // Stau vor Separator-Einfahrt - ErrBLKMov : Bool // Fehler bei Block kopieren - Betriebsart_Ziel : Int // Ziel für BTs - Betriebsart_Anzahl_Soll : Int // Anzahl der zu fahrenden BTs - Betriebsart_Anzahl_Ist : Int // Anzahl der gefahrenden BTs - Betriebsart_Quelle : Int := -1 // Betriebsart: Partner, der Betriebart gestartet hat - Sk : "USk_ILS" // Status der Schrittkette - Scanner : Struct - Send_IDX : DInt // IDX, welche mit DREQ zum PC gesendet wurde - Rec_IDX : DInt // Index - Rec_DEST_Ziel : Int // 1...X Ziellinie - Rec_DEST_Type : Byte // 0=fix, 1=fallback, ... - Rueckmld : Struct - RET_VAL_BLKMOV_Separator : Int // Rückmeldung nach BLKMOV-Aufruf - RET_VAL_DL_SortRein : Byte // Rückmeldung nach DatenOut-Aufruf - RET_VAL_TravelFIFO_In : Byte // Rückmeldung nach Aufruf - RET_VAL_TravelFIFO_Out : Byte // Rückmeldung nach Aufruf - RET_VAL_TravelFIFO_Reset : Byte // Rückmeldung nach Aufruf - RET_VAL_SendFIFO : Byte // Rückmeldung nach SendPC_FIFO-Aufruf - RET_VAL_Res : Byte - Error : "UErrSepSorterRein" - ohne_B_starten : Bool // 1.Vereinzelung auch ohne B_im_Sep - Betriebsart_del : Bool // Betriebsart löschen - Scannerdaten : Bool // Scannerdaten erhalten - Dest0 : Bool // PC-Antwort mit Ziel=0 erhalten - BT_draussen : Bool // BT/MT hat Separator verlassen - B_Beladen : Bool // BT/MT ist beladen (über Sensor) - BT_gestartet : Bool // BT ist aus Separator gestartet (nur 1 Zyklus) - BT_draussen_erkannt : Bool // Sensor hat BT draussen erkannt - Del_Last_Ziel_Flag : Bool // Bei diesem Flag letzes Ziel löschen - SorterReset_Start_Flag : Bool // Bei diesem Flag Sorter-Reset starten - GesamtSorterReset : Bool // Gesamten Sorterbereich resetten - GesamtSorterReset_aktiv : Bool // Gesamten Sorterbereich resetten ist aktiv - BT_beruhigt : Bool // 1. einfahrender BügelTräger ist im Sep - Flanke_Pin : Bool // Flankenmerker für Pin-Signal - Gleiches_Ziel : Bool // BT hat gleiches Ziel - BT_beladen : Bool // BT ist beladen - Del_Last_Ziel_Ink : DInt // Bei diesen Inks letztes Ziel löschen - SorterReset_Start_Ink : DInt // Bei diesen Inks Sorter-Reset starten - Max_Wert : DInt // Maximal erlaubter Zählwert - Stau_Zeit : Int // Sensor B_VorSep ist belegt [10ms] - Frei_Zeit : Int // Sensor B_VorSep ist frei [10ms] - Err_Zeit : Int // BT fährt nicht in Sep [10ms] - Stop_Ursache : Word // Stop-Stelle: Nw + Position - Ursache_Anz : Int // Anzeige Stop-Ursache [100ms] - Leer_Zeit : Int - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Warte_neu : Bool // Wartezeit - Ueb_akt : Bool // Überwachungszeit aktivieren - Err_Uebzeit : Bool // Überwachungzeit ist abgelaufen - Weiter : Bool // Weiterschaltbedingung ist erfüllt - Warte_stop : Bool // Wartezeit stoppen - Lauf_Flag : Bool // Zähl-Lauf mit Flag ist aktiv - Flag_Lauf_fertig : Bool // Flag-Lauf wurde beendet - Ohne_Lauf_fertig : Bool // Ohne Flag-Lauf wurde beendet - Max_Uebergabe : Bool // MaxWert wird gerade übertragen ! - PinSignal : Bool - IDX_Ok : Bool // Send_IDX bekannt - Ink_Wert : DInt // Aktueller Inkrementalwert - BT_State : Byte // Beladezustand des BTs - DatenDB : Int // DB öffnen - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - Constant: - ---- NW 1: Parameter-Übergabe --- - L Separator_Nr - - L "MW174" // Einsprung Separator-DL - T Para.Separator_DL_DB // vor Aufruf übergeben! - L 0 - T Para.Separator_DL_DW - - ---- NW 2: Anzeige OP --- - L 252 // Bereichsstop aktiv - AN Dyn.Sk.Bereich_ok // Also: Bereichsstop / Not-Aus - JC w010 - - L 253 - AN Dyn.Sk.Auto_akt // Keine Betriebsart - AN Dyn.Sk.Hand_akt - JC w010 - - L 255 // Handbetrieb aktiv - A Dyn.Sk.Hand_akt - JC w010 - - L Dyn.Sk.Akt_Schritt // Aktiver Schritt -w010: T Dyn.Sk.OP_Schritt - - ---- NW 3: Out-Bits zum Zurücksetzen --- - A B_Pinsensor // Zustand Pinsensor - Rise Dyn.Flanke_Pin // Flankenmerker für Pin-Signal - = PinSignal - - SET - R K_Sanner_triggern // Scanner triggern - R Sorter_Reset // Sorterbereich resetten - R Dyn.BT_gestartet // BT ist aus Separator gestartet (nur 1 Zyklus) - - CLR // Erst nach Err BT fährt nicht ein! - R Y_Sep_Auf // Separator öffnen - -// Antrieb anhalten: - A Dyn.Error.Err_BT_raus // BT/MT fährt nicht aus - AN ErrQuit - S Antrieb_stoppen // Da auf PinBand vereinzelt wird! - A Dyn.Error.Err_BT_raus // BT/MT fährt nicht aus - S hStOk - -// Stop-Ursache anzeigen: - AN "100ms-Impuls" - JC En03 - - L Dyn.Ursache_Anz // Anzeige Stop-Ursache [100ms] - + 1 - T Dyn.Ursache_Anz - L 5 - I // Ja ! - S Dyn.Error.Travel_FIFO // Travel-FIFO fehlerhaft - - L 0 - T SAVE.Last_Ziel // Letztes angefahrenes Ziel speichern - - BEU - -en04: NOP 0 - ---- NW 5: Störungen nach Außen übergeben --- - L 0 - T "MW200" - - A Dyn.Error.Separator_DL // Separator-Datenliste fehlerhaft - = "M200.0" - A Dyn.Error.Undef_Separator // undefinierter Separator - = "M200.1" - A Dyn.Error.Err_BT_rein // BT/MT fährt nicht in Separator - = "M200.2" - A Dyn.Sk.Err_Uebzeit - = Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen - = "M200.3" - NEG - R Dyn.Sk.Err_Uebzeit_AnzOk - A Dyn.Sk.Err_Schritt - = Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert - = "M200.4" - A Dyn.Error.Err_Betriebsart // Betriebsart ist nicht möglich - = "M200.5" - A Dyn.Error.Err_PinSignal // Es kommt kein Pin-Signal - = "M200.6" - A Dyn.Error.Err_BT_raus // BT/MT fährt nicht aus - = "M200.7" - A Dyn.Error.Err_Raus_Sensor // Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! - = "M201.0" - A Dyn.Error.Travel_FIFO // Travel-FIFO fehlerhaft - = "M201.1" - A Dyn.Error.Daten_out // Letzte Carrier-Daten konnten nicht an Travel-FIFO übergeben werden - = "M201.2" - A Dyn.Error.BC_doppelt // Wieder gleichen BC von PC erhalten - = "M201.3" - A Dyn.Error.Korrektur_Modus_aktiv // Korrektur-Modus nach Crash aktiviert (wird vor Aufruf gesetzt!) - = "M201.4" - A Dyn.Error.Send_FIFO_fehlerhaft // Send-FIFO zum PC ist fehlerhaft - = "M201.5" - A Dyn.Error.Send_FIFO_voll // Send-FIFO zu PC ist voll - = "M201.6" - A Dyn.Sk.Reset_Akt // Reset ist aktiv - O Dyn.GesamtSorterReset_aktiv // Gesamten Sorterbereich resetten ist aktiv - = Dyn.Error.Reset_aktiv - = "M201.7" - -// Andere Meldung als Überwachungszeit aktiv ?: - L "MW200" - L 2#1111_0111_1111_1111 - AW - L 2#0000_0000_0000_0000 // Andere Meldung als Üb.zeit aktiv ? - <>I // Ja ! - ON Dyn.Sk.Err_Uebzeit_AnzOk // Störung anzeigen ok, da 2.Zyklus aktiv ! - R "M200.3" // Üb.Zeit-Meldung nicht an PC senden - - A Dyn.Sk.Err_Uebzeit - S Dyn.Sk.Err_Uebzeit_AnzOk // Störung anzeigen ok, da 2.Zyklus aktiv ! - - L "MW200" - T Error // Schnittstelle nach Außen - - ---- NW 6: Statische Separator-Parameter holen --- - L Separator.Separator_Nr // Nummer des Separators - L Separator_Nr // Aufruf-Parameter - ==I // Identisch ? - R Dyn.Error.Separator_DL // Separatordatenbank fehlerhaft - R Dyn.Error.Undef_Separator // undefinierter Separator - JC en06 // Ja ! - - T "MW200" // Search-Daten - -CALL FC "DatenOut" (SSDB:=Para.Separator_DL_DB, SSDW:=Para.Separator_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196") - - L "MB199" - T Dyn.Rueckmld.RET_VAL_DL_SortRein // Rückmeldung bei Datenbank-Zugriff (Gefälle-DL) - - JBI G_Ok - - A "M199.0" - JCN w060 - - SET - = Dyn.Error.Separator_DL // Separatordatenbank fehlerhaft - - L 16#A061 - T Dyn.Stop_Ursache - - BEU - -w060: SET - S Dyn.Error.Undef_Separator // undefinierter Separator - - L 16#A062 - T Dyn.Stop_Ursache - - BEU - -// Kennung + Datenbytes -G_Ok: SET - R Dyn.Error.Separator_DL // Gefälledatenbank fehlerhaft - R Dyn.Error.Undef_Separator // undefinierte Gefällestrecke - - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 20 // Datenwords speichern - T LW2 // Wiederholungen - -// Quelle-Pointer erzeugen: - L 0 // Bei Merker = 0 ! - T LW4 // DB_Nummer - L 220 // Adresse - SLD 3 - L 16#8300_0000 // Kennung: Merker - OD - T LD6 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_Separator, DSTBLK:=Separator) // Datenliste-Daten speichern | #Ziel - - L 16#A063 - T Dyn.Stop_Ursache - - L Dyn.Rueckmld.RET_VAL_BLKMOV_Separator // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Dyn.Status.Betriebsart_Art.ErrBLKMov // Error bei Block kopieren - BEC - - L Separator.Separator_Typ // Separatortyp = 176 (SorterRein) - L 176 // Dieser Aufruf-FB ? - ==I // Ja ! - JC w061 +FUNCTION_BLOCK "MSepSorterRein" +TITLE = Separator vor Hauptstrang-Strecke +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 +//Neu: ohne MT-Zeug! +// +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-960629 +// +//Version: op Mobility (03/2025) +//-Gesamt-Reset-Startpunkt ohne Faktor 10! +// +//Version 4.12.2014: +//-Bei Zielwechsel muss Travel-FIFO zusätzlich leer sein! +// +//Version: ILS2100 / 05.02.2010 +// +//Schritt 0: Warten auf BT +//Schritt 1: Betriebsart ok/angegeben? +//Schritt 5: Mit Scanner fahren: Defaultziel ? +//Schritt 6: Scanner triggern +//Schritt 7: "DREQ" an PC senden +//Schritt 8: Warten auf PC-Antwort +//Schritt 9: PC-Antwort auswerten +//Schritt 11: Ausfahren ok ? +//Schritt 12: Warten auf Pin-Signal +//Schritt 13: Travel-Buffer ok ? +//Schritt 14: Separator Mindestzeit öffnen +//Schritt 15: BT ausgefahren ? +//Schritt 16: BT ist draussen +//Schritt 17: Daten in Travel-FIFO eintragen +//Schritt 19: Beladezustand checken +//Schritt 20: Separator resetten +//Schritt 21: Reset ist zu Ende +//Schritt 23: GesamtSorter-Reset: Start-Ink speichern +//Schritt 24: GesamtSorter-Reset: Start-Ink erreicht ? +//Schritt 25: GesamtSorter-Reset starten +// + VAR_INPUT + Separator_Nr : Int; // Aufruf für Separator + ErrQuit : Bool; // Ablaufstörung quittieren + B_VorSep : Bool; // Sensor BT fährt in Bereich + B_ImSep : Bool; // Sensor BT ist im Separator + B_AusSep : Bool; // Sensor BT hat Separator verlassen + B_Beladen_im_Sep : Bool; // Sensor BT ist beladen im Sep + B_Pinsensor : Bool; // Zustand Pinsensor + B_Beladen_nach_Sep : Bool; // Sensor BT ist beladen nach Sep + Start_Ok : Bool; // Starten ist erlaubt + Antrieb_aktiv : Bool; // Kreisel-Antrieb aktiv + Antrieb_plus_aktiv : Bool; // Kreisel-Antrieb plus aktiv + END_VAR + + VAR_OUTPUT + Y_Sep_Auf { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Separator öffnen + K_Sanner_triggern : Bool; // Scanner triggern + Sorter_Reset : Bool; // Sorterbereich resetten + Error : Word; // Störungen übergeben + END_VAR + + VAR_IN_OUT + Antrieb_start : Bool; // Kreiselantrieb starten + Antrieb_plus_start : Bool; // Kreisel-Antrieb plus starten + Antrieb_stoppen : Bool; // Kreiselantrieb stoppen + hStOk : Bool; // Anzeige Start n. Störung aktivieren + END_VAR + + VAR + Res1 : Array[1..1] of Int; // Reserve + SAVE : Struct + Frei : DInt; + Sensorfrei_Zeit : Int; // Sensor B_imSep ist frei [10ms] + Last_Ziel : Int; // Letztes angefahrenes Ziel + END_STRUCT; + Para : Struct // Parameter + Separator_DL_DB : Int; // Einsprung Separator-Datenliste-DB + Separator_DL_DW : Int; // Einsprung Separator-Datenliste-DW + Res1 : Array[1..3] of Int; // Reserve + END_STRUCT; + Separator : "UDLSepSorterRein"; // Fahrbereichs Daten + Dyn : Struct // Dynamische Daten + Status : Struct + Vereinzelungstakte : DInt; // Anzahl der getätigten Vereinzelungstakte + Stop_Ursache : Word; // Stop-Stelle: Nw + Position + Betriebsart_Art : Struct // Aktive Betriebsart + Listen : Bool; // [SCTL=1] Meldung an PC, falls BT in Schleuse + Rapidfire : Bool; // [SCTL=2] Alle BTs austakten (ohne Ende) + TillEmpty : Bool; // [SCTL=3] Alle BTs austakten (Ende nach zeitlang kein BT) + Job : Bool; // [SCTL=4] Anzahl von BTs austakten (Ende nach Anzahl) + Job_TillEmpty : Bool; // [SCTL=5] Anzahl von BTs austakten (Ende nach zeitlang kein BT) + DestFull : Bool; // [SCTL=6] Alle BTs austakten (bis Stau-Sensor aktiv) + Scannen : Bool; // [SCTL=7] Ausfahren über Scanner + PC-Rückmeldung + Scannen_TillEmpty : Bool; // [SCTL=8] wie oben [SCTL=7](Ende nach zeitlang kein BT) + PC_Del : Bool; // Betriebsart aufgrund vom PC löschen + Sack_Tel : Bool; // Sack-Telegramm senden + Res12 : Bool; + BT_leer : Bool; // BT/MT ist leer + BT_beladen : Bool; // BT/MT ist beladen + BT_kommt : Bool; // BT/MT fährt zum Sep + Stau_vor_Sep : Bool; // Stau vor Separator-Einfahrt + ErrBLKMov : Bool; // Fehler bei Block kopieren + END_STRUCT; + Betriebsart_Ziel : Int; // Ziel für BTs + Betriebsart_Anzahl_Soll : Int; // Anzahl der zu fahrenden BTs + Betriebsart_Anzahl_Ist : Int; // Anzahl der gefahrenden BTs + Betriebsart_Quelle : Int := -1; // Betriebsart: Partner, der Betriebart gestartet hat + END_STRUCT; + Sk : "USk_ILS"; // Status der Schrittkette + Scanner : Struct + Send_IDX : DInt; // IDX, welche mit DREQ zum PC gesendet wurde + Rec_IDX : DInt; // Index + Rec_DEST_Ziel : Int; // 1...X Ziellinie + Rec_DEST_Type : Byte; // 0=fix, 1=fallback, ... + END_STRUCT; + Rueckmld : Struct + RET_VAL_BLKMOV_Separator : Int; // Rückmeldung nach BLKMOV-Aufruf + RET_VAL_DL_SortRein : Byte; // Rückmeldung nach DatenOut-Aufruf + RET_VAL_TravelFIFO_In : Byte; // Rückmeldung nach Aufruf + RET_VAL_TravelFIFO_Out : Byte; // Rückmeldung nach Aufruf + RET_VAL_TravelFIFO_Reset : Byte; // Rückmeldung nach Aufruf + RET_VAL_SendFIFO : Byte; // Rückmeldung nach SendPC_FIFO-Aufruf + RET_VAL_Res : Byte; + END_STRUCT; + Error : "UErrSepSorterRein"; + ohne_B_starten : Bool; // 1.Vereinzelung auch ohne B_im_Sep + Betriebsart_del : Bool; // Betriebsart löschen + Scannerdaten : Bool; // Scannerdaten erhalten + Dest0 : Bool; // PC-Antwort mit Ziel=0 erhalten + BT_draussen : Bool; // BT/MT hat Separator verlassen + B_Beladen : Bool; // BT/MT ist beladen (über Sensor) + BT_gestartet : Bool; // BT ist aus Separator gestartet (nur 1 Zyklus) + BT_draussen_erkannt : Bool; // Sensor hat BT draussen erkannt + Del_Last_Ziel_Flag : Bool; // Bei diesem Flag letzes Ziel löschen + SorterReset_Start_Flag : Bool; // Bei diesem Flag Sorter-Reset starten + GesamtSorterReset : Bool; // Gesamten Sorterbereich resetten + GesamtSorterReset_aktiv : Bool; // Gesamten Sorterbereich resetten ist aktiv + BT_beruhigt : Bool; // 1. einfahrender BügelTräger ist im Sep + Flanke_Pin : Bool; // Flankenmerker für Pin-Signal + Gleiches_Ziel : Bool; // BT hat gleiches Ziel + BT_beladen : Bool; // BT ist beladen + Del_Last_Ziel_Ink : DInt; // Bei diesen Inks letztes Ziel löschen + SorterReset_Start_Ink : DInt; // Bei diesen Inks Sorter-Reset starten + Max_Wert : DInt; // Maximal erlaubter Zählwert + Stau_Zeit : Int; // Sensor B_VorSep ist belegt [10ms] + Frei_Zeit : Int; // Sensor B_VorSep ist frei [10ms] + Err_Zeit : Int; // BT fährt nicht in Sep [10ms] + Stop_Ursache : Word; // Stop-Stelle: Nw + Position + Ursache_Anz : Int; // Anzeige Stop-Ursache [100ms] + Leer_Zeit : Int; + END_STRUCT; + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Warte_neu : Bool; // Wartezeit + Ueb_akt : Bool; // Überwachungszeit aktivieren + Err_Uebzeit : Bool; // Überwachungzeit ist abgelaufen + Weiter : Bool; // Weiterschaltbedingung ist erfüllt + Warte_stop : Bool; // Wartezeit stoppen + Lauf_Flag : Bool; // Zähl-Lauf mit Flag ist aktiv + Flag_Lauf_fertig : Bool; // Flag-Lauf wurde beendet + Ohne_Lauf_fertig : Bool; // Ohne Flag-Lauf wurde beendet + Max_Uebergabe : Bool; // MaxWert wird gerade übertragen ! + PinSignal : Bool; + IDX_Ok : Bool; // Send_IDX bekannt + Ink_Wert : DInt; // Aktueller Inkrementalwert + BT_State : Byte; // Beladezustand des BTs + DatenDB : Int; // DB öffnen + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + END_VAR + + +BEGIN +NETWORK +TITLE = Parameter-Übergabe + L #Separator_Nr; + + L "MW174";//Einsprung Separator-DL + T #Para.Separator_DL_DB;//vor Aufruf übergeben! + L 0; + T #Para.Separator_DL_DW; + +NETWORK +TITLE = Anzeige OP + L 252;//Bereichsstop aktiv + UN #Dyn.Sk.Bereich_ok;//Also: Bereichsstop / Not-Aus + SPB w010; + + L 253; + UN #Dyn.Sk.Auto_akt;//Keine Betriebsart + UN #Dyn.Sk.Hand_akt; + SPB w010; + + L 255;//Handbetrieb aktiv + U #Dyn.Sk.Hand_akt; + SPB w010; + + L #Dyn.Sk.Akt_Schritt;//Aktiver Schritt +w010: T #Dyn.Sk.OP_Schritt; + +NETWORK +TITLE = Out-Bits zum Zurücksetzen + U #B_Pinsensor;//Zustand Pinsensor + FP #Dyn.Flanke_Pin;//Flankenmerker für Pin-Signal + = #PinSignal; + + SET; + R #K_Sanner_triggern;//Scanner triggern + R #Sorter_Reset;//Sorterbereich resetten + R #Dyn.BT_gestartet;//BT ist aus Separator gestartet (nur 1 Zyklus) + + CLR;//Erst nach Err BT fährt nicht ein! + R #Y_Sep_Auf;//Separator öffnen + +//Antrieb anhalten: + U #Dyn.Error.Err_BT_raus;//BT/MT fährt nicht aus + UN #ErrQuit; + S #Antrieb_stoppen;//Da auf PinBand vereinzelt wird! + U #Dyn.Error.Err_BT_raus;//BT/MT fährt nicht aus + S #hStOk; + +//Stop-Ursache anzeigen: + UN "100ms-Impuls"; + SPB En03; + + L #Dyn.Ursache_Anz;//Anzeige Stop-Ursache [100ms] + + 1; + T #Dyn.Ursache_Anz; + L 5; + I;//Ja ! + S #Dyn.Error.Travel_FIFO;//Travel-FIFO fehlerhaft + + L 0; + T #SAVE.Last_Ziel;//Letztes angefahrenes Ziel speichern + + BEA; + +en04: NOP 0; +NETWORK +TITLE = Störungen nach Außen übergeben + L 0; + T "MW200"; + + U #Dyn.Error.Separator_DL;//Separator-Datenliste fehlerhaft + = "M200.0"; + U #Dyn.Error.Undef_Separator;//undefinierter Separator + = "M200.1"; + U #Dyn.Error.Err_BT_rein;//BT/MT fährt nicht in Separator + = "M200.2"; + U #Dyn.Sk.Err_Uebzeit; + = #Dyn.Error.Err_Uebzeit;//Überwachungzeit ist abgelaufen + = "M200.3"; + NOT; + R #Dyn.Sk.Err_Uebzeit_AnzOk; + U #Dyn.Sk.Err_Schritt; + = #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert + = "M200.4"; + U #Dyn.Error.Err_Betriebsart;//Betriebsart ist nicht möglich + = "M200.5"; + U #Dyn.Error.Err_PinSignal;//Es kommt kein Pin-Signal + = "M200.6"; + U #Dyn.Error.Err_BT_raus;//BT/MT fährt nicht aus + = "M200.7"; + U #Dyn.Error.Err_Raus_Sensor;//Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! + = "M201.0"; + U #Dyn.Error.Travel_FIFO;//Travel-FIFO fehlerhaft + = "M201.1"; + U #Dyn.Error.Daten_out;//Letzte Carrier-Daten konnten nicht an Travel-FIFO übergeben werden + = "M201.2"; + U #Dyn.Error.BC_doppelt;//Wieder gleichen BC von PC erhalten + = "M201.3"; + U #Dyn.Error.Korrektur_Modus_aktiv;//Korrektur-Modus nach Crash aktiviert (wird vor Aufruf gesetzt!) + = "M201.4"; + U #Dyn.Error.Send_FIFO_fehlerhaft;//Send-FIFO zum PC ist fehlerhaft + = "M201.5"; + U #Dyn.Error.Send_FIFO_voll;//Send-FIFO zu PC ist voll + = "M201.6"; + U #Dyn.Sk.Reset_Akt;//Reset ist aktiv + O #Dyn.GesamtSorterReset_aktiv;//Gesamten Sorterbereich resetten ist aktiv + = #Dyn.Error.Reset_aktiv; + = "M201.7"; + +//Andere Meldung als Überwachungszeit aktiv ?: + L "MW200"; + L 2#1111_0111_1111_1111; + UW; + L 2#0000_0000_0000_0000;//Andere Meldung als Üb.zeit aktiv ? + <>I;//Ja ! + ON #Dyn.Sk.Err_Uebzeit_AnzOk;//Störung anzeigen ok, da 2.Zyklus aktiv ! + R "M200.3";//Üb.Zeit-Meldung nicht an PC senden + + U #Dyn.Sk.Err_Uebzeit; + S #Dyn.Sk.Err_Uebzeit_AnzOk;//Störung anzeigen ok, da 2.Zyklus aktiv ! + + L "MW200"; + T #Error;//Schnittstelle nach Außen + +NETWORK +TITLE = Statische Separator-Parameter holen + L #Separator.Separator_Nr;//Nummer des Separators + L #Separator_Nr;//Aufruf-Parameter + ==I;//Identisch ? + R #Dyn.Error.Separator_DL;//Separatordatenbank fehlerhaft + R #Dyn.Error.Undef_Separator;//undefinierter Separator + SPB en06;//Ja ! + + T "MW200";//Search-Daten + + CALL "DatenOut" + ( SSDB := #Para.Separator_DL_DB , + SSDW := #Para.Separator_DL_DW , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := "MW196" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_DL_SortRein;//Rückmeldung bei Datenbank-Zugriff (Gefälle-DL) + + SPBI G_Ok; + + U "M199.0"; + SPBN w060; + + SET; + = #Dyn.Error.Separator_DL;//Separatordatenbank fehlerhaft + + L 16#A061; + T #Dyn.Stop_Ursache; + + BEA; + +w060: SET; + S #Dyn.Error.Undef_Separator;//undefinierter Separator + + L 16#A062; + T #Dyn.Stop_Ursache; + + BEA; + +//Kennung + Datenbytes +G_Ok: SET; + R #Dyn.Error.Separator_DL;//Gefälledatenbank fehlerhaft + R #Dyn.Error.Undef_Separator;//undefinierte Gefällestrecke + + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 20;//Datenwords speichern + T %LW2;//Wiederholungen + +//Quelle-Pointer erzeugen: + L 0;//Bei Merker = 0 ! + T %LW4;//DB_Nummer + L 220;//Adresse + SLD 3; + L 16#8300_0000;//Kennung: Merker + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #Dyn.Rueckmld.RET_VAL_BLKMOV_Separator , + DSTBLK := #Separator //#Ziel + ); + + L 16#A063; + T #Dyn.Stop_Ursache; + + L #Dyn.Rueckmld.RET_VAL_BLKMOV_Separator;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Dyn.Status.Betriebsart_Art.ErrBLKMov;//Error bei Block kopieren + BEB; + + L #Separator.Separator_Typ;//Separatortyp = 176 (SorterRein) + L 176;//Dieser Aufruf-FB ? + ==I;//Ja ! + SPB w061; + + SET; + S #Dyn.Error.Undef_Separator;//undefinierter Separator + + L 0;//Separator ungültig ! + T #Separator.Separator_Nr;//Nummer des Separators + + L 16#A064; + T #Dyn.Stop_Ursache; + + BEA; + +//Defaultwerte übergeben: +w061: U #Separator.Default_Betriebsart.Listen;//Betriebart nach Urlöschen/Reset + = #Dyn.Status.Betriebsart_Art.Listen; + U #Separator.Default_Betriebsart.Rapidfire; + = #Dyn.Status.Betriebsart_Art.Rapidfire; + U #Separator.Default_Betriebsart.TillEmpty; + = #Dyn.Status.Betriebsart_Art.TillEmpty; + U #Separator.Default_Betriebsart.Job; + = #Dyn.Status.Betriebsart_Art.Job; + U #Separator.Default_Betriebsart.Job_TillEmpty; + = #Dyn.Status.Betriebsart_Art.Job_TillEmpty; + U #Separator.Default_Betriebsart.DestFull; + = #Dyn.Status.Betriebsart_Art.DestFull; + U #Separator.Default_Betriebsart.Scannen; + = #Dyn.Status.Betriebsart_Art.Scannen; + U #Separator.Default_Betriebsart.Scannen_TillEmpty; + = #Dyn.Status.Betriebsart_Art.Scannen_TillEmpty; + + L #Separator.Default_Ziel;//Ziel nach Urlöschen/Reset + T #Dyn.Status.Betriebsart_Ziel;//Ziel für BTs + + BEA; + +en06: NOP 0; + +NETWORK +TITLE = Indirekt adressierte Daten in temporäre Daten übergeben + U #Dyn.Sk.Err_Uebzeit;//Wegen Speicherbedarf und Zykluszeit ! + = #Err_Uebzeit; + + U #ErrQuit;//Überwachungszeit abgelaufen quittieren + R #Dyn.Sk.Err_Uebzeit; + S #Antrieb_start;//Kreiselantrieb starten + S #Antrieb_plus_start;//Kreisel-Antrieb plus starten + + U #B_AusSep;//Sensor BT hat Separator verlassen + U #Y_Sep_Auf; + S #Dyn.BT_draussen_erkannt;//Sensor hat BT draussen erkannt + + U #B_Beladen_nach_Sep;//Sensor BT ist beladen nach Sep + U #Y_Sep_Auf; + S #Dyn.BT_beladen;//BT ist beladen + + UN #Separator.Parameter_allg.Belade_Kontrolle_im_Sep;//Keine Belade-Kontrolle vorhanden (B-Erkennung) + O #B_Beladen_im_Sep;//Sensor BT ist beladen + S #Dyn.B_Beladen;//0=leerer, 1= beladcenener BT + + U #Y_Sep_Auf;//Separator geöffnet + R #Dyn.B_Beladen;//0=leerer, 1= beladcenener BT + + U #ErrQuit; + R #Dyn.Error.Daten_out;//Letzte Carrier-Daten konnten nicht an Travel-FIFO übergeben werden + +NETWORK +TITLE = Stau vor / Err fährt nicht in Separator + U #Dyn.Status.Betriebsart_Art.Stau_vor_Sep;//Stau vor Separator-Einfahrt (FreiZeit ermitteln) + SPB W072; + +//StauZeit ermitteln: + UN #B_VorSep;//Sensor BT fährt in Bereich (kein Stau !) + SPB W070;//StauZeit neu aufziehen + + UN "100ms-Impuls"; + SPB Xn08; + + L #Dyn.Stau_Zeit;//Sensor B_VorSep ist belegt [100ms] + L "MW2";//Stauzeit +100ms + +I; + T #Dyn.Stau_Zeit;//Sensor B_VorSep ist belegt [100ms] + + SPA W071; + +W070: L 0; + T #Dyn.Stau_Zeit;//Sensor B_VorSep ist belegt [100ms] + +W071: L #Dyn.Stau_Zeit;//Sensor B_VorSep ist belegt [100ms] + L 10;//Stau-Zeit erreicht ? + >=I;//Ja ! + S #Dyn.Status.Betriebsart_Art.Stau_vor_Sep;//Stau vor Separator-Einfahrt + SPBN Xn08; + + L 0;//Zeiten löschen + T #Dyn.Stau_Zeit;//Sensor B_VorSep ist belegt [100ms] + +//FreiZeit ermitteln: +W072: U #B_VorSep;//Sensor BT fährt in Bereich (immer noch Stau !) + ON #Dyn.Status.Betriebsart_Art.Stau_vor_Sep;//Stau vor Separator-Einfahrt + SPB X070;//FreiZeit neu aufziehen + + UN "100ms-Impuls"; + SPB Xn08; + + L #Dyn.Frei_Zeit;//Sensor B_VorSep ist frei [100ms] + L "MW2";//FreiZeit +100ms + +I; + T #Dyn.Frei_Zeit;//Sensor B_VorSep ist frei [100ms] + + SPA X071; + +X070: L 0; + T #Dyn.Frei_Zeit;//Sensor B_VorSep ist frei [100ms] + +X071: L #Dyn.Frei_Zeit;//Sensor B_VorSep ist frei [100ms] + L 20;//Frei-Zeit erreicht ? + >=I;//Ja ! + R #Dyn.Status.Betriebsart_Art.Stau_vor_Sep;//Stau vor Separator-Einfahrt + SPBN Xn08; + + L 0;//Zeiten löschen + T #Dyn.Frei_Zeit;//Sensor B_VorSep ist frei [100ms] + +//ErrorZeit ermitteln: +Xn08: U #B_VorSep;//Sensor BT fährt in Bereich (kein Stau !) + U #Antrieb_aktiv;//nur bei laufendem Antrieb ! + S #Dyn.Status.Betriebsart_Art.BT_kommt;//BT/MT fährt zum Sep + U #B_ImSep; + O #ErrQuit;//Ablaufstörung quittieren (sonst dauerhaft Err, falls BT entnommen) + R #Dyn.Status.Betriebsart_Art.BT_kommt;//BT/MT fährt zum Sep + + U #Dyn.Status.Betriebsart_Art.BT_kommt;//BT/MT fährt zum Sep + UN #B_ImSep;//aber noch nicht im Sep ! + S #Antrieb_start;//Kreisel-Antrieb starten + R #Antrieb_stoppen; + + UN #Dyn.Status.Betriebsart_Art.BT_kommt;//BT/MT fährt zum Sep + O #B_ImSep; + O #Y_Sep_Auf; + SPB W090;//ErrZeit neu aufziehen + + UN "100ms-Impuls"; + O #Dyn.Error.Err_BT_rein;//BT/MT fährt nicht in Separator + ON #Antrieb_aktiv ;//Kreisel-Antrieb aktiv + SPB W091; + + L #Dyn.Err_Zeit;//BT fährt nicht in Sep [100ms] + L "MW2";//ErrZeit +100ms + +I; + T #Dyn.Err_Zeit;//BT fährt nicht in Sep [100ms] + + SPA W091; + +W090: L 0; + T #Dyn.Err_Zeit;//BT fährt nicht in Sep [100ms] + +W091: L #Dyn.Err_Zeit;//BT fährt nicht in Sep [100ms] + L 300;//Err-Zeit erreicht ? + >=I;//Ja ! + = #Dyn.Error.Err_BT_rein;//BT/MT fährt nicht in Separator + SPBN W09E; + + T #Dyn.Err_Zeit;//BT fährt nicht in Sep [100ms] + +W09E: SET; + R #Y_Sep_Auf;//Separator öffnen + +NETWORK +TITLE = BT hat Separator verlassen + L #Dyn.Sk.Akt_Schritt;//Aktueller Schritt + L 14;//Beim Vereinzeln ? + <>I;//Nein ! + U(; + TAK; + L 15;//Beim Vereinzeln ? + <>I;//Nein ! + ); + O #B_ImSep;//Sensor BT ist im Separator +/// ON #Antrieb_aktiv //Kreisel-Antrieb aktiv + SPB w070_Mig;//Freizeit neu aufziehen + + U #Dyn.BT_draussen;//BT/MT hat Separator verlassen + SPB w071_Mig; + + L #SAVE.Sensorfrei_Zeit;//Sensor B_imSep ist frei [10ms] + L "MW4";//Freizeit +10ms + +I; + T #SAVE.Sensorfrei_Zeit;//Sensor B_imSep ist frei [10ms] + + L #Separator.Wartezeit_bis_draussen;//Nach dieser Zeit hat BT den Sep. verlassen [10ms] + <=I ;//Maximum erreicht ? + SPB w071_Mig ;//Nein ! + + T #SAVE.Sensorfrei_Zeit;//Maximum übergeben + + SPA w071_Mig; + +w070_Mig: L 0; + T #SAVE.Sensorfrei_Zeit;//Sensor B_imSep ist frei [10ms] + +w071_Mig: L #SAVE.Sensorfrei_Zeit;//Sensor B_imSep ist frei [10ms] + L #Separator.Wartezeit_bis_draussen;//Nach dieser Zeit hat BT den Sep. verlassen [10ms] + >=I; + UN #B_ImSep;//Sensor BT ist im Separator + U(; + O #Dyn.BT_draussen_erkannt;//Sensor hat BT draussen erkannt + ON #Separator.Parameter_allg.B_AusSep_vorhanden;//Sensor BT hat Separator verlassen ist eingebaut (Konrolle kann erfolgen) + ); + = #Dyn.BT_draussen;//BT/MT hat Separator verlassen + +NETWORK +TITLE = Daten des Inkremental-Gebers holen + L 0; + T #Ink_Wert; + CLR; + = #Flag_Lauf_fertig; + = #Ohne_Lauf_fertig; + = #Lauf_Flag; + +//Weichendaten auslesen: + CALL "FifoOut" + ( SSDB := #Separator.Parameter_SorterRein.TravelFIFO_DB , + SSDW := #Separator.Parameter_SorterRein.TravelFIFO_DW , + PARA := WORD#16#E214 , //Alle Zusatzdaten lesen + OUTDATEN := P#M220.0 , + RE_VAL := "MB199" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_TravelFIFO_Out;//Rückmeldung bei FIFO-Zugriff (Travel-FIFO) + SET;//alw + R #Dyn.Error.Travel_FIFO;//Travel-FIFO fehlerhaft + SPBI Z_Ok; + + SET; + S #Dyn.Error.Travel_FIFO;//Weichen-FIFO fehlerhaft + + SPA En08; + +//Zähler-Daten übergeben: +Z_Ok: U "M247.7";//Übergabe MaxWert aktiv + = #Max_Uebergabe;//MaxWert wird gerade übertragen ! + SPB w080; + + L "MD242" ;//Inkwert + T #Ink_Wert; + U "M246.3";//Flag-Info + = #Lauf_Flag; + U "M246.4";//Fertig-Info + = #Flag_Lauf_fertig; + U "M246.5" ;//Fertig-Info + = #Ohne_Lauf_fertig; + + SPA En08; + +w080: L "MD242";//MaxWert übergeben + T #Dyn.Max_Wert; + +En08: NOP 0; + +NETWORK +TITLE = Letzter BT mit anderem Ziel genügend Abstand ? + U #Max_Uebergabe;//MaxWert wird gerade übertragen ! + SPB En10; + + L #Dyn.Del_Last_Ziel_Ink;//Bei diesen Inks letztes Ziel löschen + L 0;//sinnvolle Angabe ? + <=D;//Nein ! + SET ;///Hier egal, da großer Trolley-Abstand + Stauklappe zum Synchronisieren! + SPB W100; + + U #Dyn.Del_Last_Ziel_Flag;//Bei diesem Flag letzes Ziel löschen + U #Flag_Lauf_fertig;//Flag-Lauf wurde beendet + O; + UN #Dyn.Del_Last_Ziel_Flag;//Bei diesem Flag letzes Ziel löschen + U #Ohne_Lauf_fertig;//Flag-Lauf wurde beendet + SPB W100;//beim Ende des Lauf sind Inkremente uninteressant + + U #Dyn.Del_Last_Ziel_Flag;//Bei diesem Flag letzes Ziel löschen + U #Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv + O; + UN #Dyn.Del_Last_Ziel_Flag;//Bei diesem Flag letzes Ziel löschen + UN #Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv + SPBN En10; + + L #Ink_Wert;//Aktuelle Inkrementalwert + L #Dyn.Del_Last_Ziel_Ink;//Bei diesen Inks letztes Ziel löschen + =I;//Ja ! + U(; + L 0;//Sinnvolle Angabe ? + >I;//Ja ! + ); + U(; + O #Dyn.Status.Betriebsart_Art.Job; + O #Dyn.Status.Betriebsart_Art.Job_TillEmpty; + ); + R #Dyn.Status.Betriebsart_Art.Job;//Betriebsarten beenden + R #Dyn.Status.Betriebsart_Art.Job_TillEmpty; + S #Dyn.Betriebsart_del;//Betriebsart löschen + S #Dyn.Status.Betriebsart_Art.Sack_Tel;//Sack-Telegramm senden + SPB Sack; + + UN #Weiter;//Weiterschaltbedingung ist erfüllt + SPB w100_Mig; + + SET; + R #Dyn.Sk.Err_Uebzeit;//sofort weiter + R #Err_Uebzeit; + + U #Dyn.BT_beruhigt;//1. einfahrender BügelTräger ist im Sep +/// O #Separator.Parameter_allg.Antrieb_vorhanden + L 15;//Angabe der Wartezeit (*10ms) [kurz] + SPA Plus;//Nächsten Schritt starten + +//Überwachungszeit abgelaufen ?: +w100_Mig: UN #Err_Uebzeit; + SPB x101; + + SET; + R #Dyn.Sk.Err_Uebzeit;//Einmalige Auswertung + R #Err_Uebzeit; + + SPA w101; + +//Überwachungszeit starten: +x101: UN #B_ImSep;//BT im Separator erkannt + U(; + O #Dyn.Status.Betriebsart_Art.TillEmpty; + O #Dyn.Status.Betriebsart_Art.Job_TillEmpty; + O #Dyn.Status.Betriebsart_Art.Scannen_TillEmpty; + ); + U #Dyn.Sk.Auto_akt;//Automatik ist aktiv + U #Dyn.Sk.Bereich_ok; + = #Ueb_akt;//Überwachungszeit aktivieren + + L 16#B001; + T #Dyn.Stop_Ursache; + + UN #Dyn.Sk.Auto_akt;//Automatik ist aktiv + SPB x001_Mig; + + L 16#B002; + T #Dyn.Stop_Ursache; + + UN #Dyn.Sk.Bereich_ok; + SPB x001_Mig; + + L 16#B003; + T #Dyn.Stop_Ursache; + + UN #B_ImSep; + SPB x001_Mig; + +x001_Mig: L #Separator.Wartezeit_bis_leer;//Angabe der Überwachungszeit (*100ms) + SPA tueb;//Überwachungszeit + +//Folgende Betriebsarten beenden ?: +w101: U #Dyn.Status.Betriebsart_Art.TillEmpty; + R #Dyn.Status.Betriebsart_Art.TillEmpty; + S #Dyn.Betriebsart_del;//Betriebsart löschen + S #Dyn.Status.Betriebsart_Art.Sack_Tel;//Sack-Telegramm senden + SPB Sack;//Sack-Telegramm senden + + U #Dyn.Status.Betriebsart_Art.Job_TillEmpty; + R #Dyn.Status.Betriebsart_Art.Job_TillEmpty; + S #Dyn.Betriebsart_del;//Betriebsart löschen + S #Dyn.Status.Betriebsart_Art.Sack_Tel;//Sack-Telegramm senden + SPB Sack;//Sack-Telegramm senden + + U #Dyn.Status.Betriebsart_Art.Scannen_TillEmpty; + R #Dyn.Status.Betriebsart_Art.Scannen_TillEmpty; + S #Dyn.Betriebsart_del;//Betriebsart löschen + S #Dyn.Status.Betriebsart_Art.Sack_Tel;//Sack-Telegramm senden + SPB Sack;//Sack-Telegramm senden + + BEA; + +Sack: UN #Separator.Parameter_allg.PC_Komm_aktiv; + R #Dyn.Error.Send_FIFO_voll;//Send-FIFO zu PC ist voll + SPB w102; + +//Daten aufbereiten: + L 'SACK'; + T "MD214";//Telegramm-Kennung + L 30; + T "MW218";//Anzahl Bytes + L #Separator_Nr; + T "MD220";//Sep-ID + L 0; + T "MB224";//State + L #Dyn.Status.Betriebsart_Anzahl_Soll; + T "MW225";//Target-Counts + L #Dyn.Status.Betriebsart_Anzahl_Ist; + T "MW227";//Actual-Counts + L 16#0003; + T "MB229";//ETX + + L 0;//Rest nullen + T "MB230"; + T "MB231"; + T "MB232"; + T "MB233"; + T "MB234"; + T "MB235"; + T "MB236"; + T "MB237"; + T "MB238"; + T "MB239"; + T #Dyn.Status.Betriebsart_Anzahl_Ist; + + L #Dyn.Status.Betriebsart_Quelle;//SendFIFO des PC, der Betriebart gestartet hat + L 0;//bekannt ? + >I;//Ja ! + SPB sack_Mig; + + L #Separator.PC_Send_FIFO;//Send-FIFO für PC-Sendungen + T #Dyn.Status.Betriebsart_Quelle; + +sack_Mig: SET; + R #Dyn.Error.Send_FIFO_voll;//Send-FIFO zu PC ist voll + R #Dyn.Error.Send_FIFO_fehlerhaft;//Send-FIFO fehlerhaft + + CALL "FifoIn" + ( SSDB := #Dyn.Status.Betriebsart_Quelle , + SSDW := 0 , + PARA := WORD#16#0000 , + INDATEN := P#M214.0 , + RE_VAL := "MB199" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_SendFIFO; + + SPBI w102; + + U "M199.2"; + SPBN x002_Mig; + + SET; + S #Dyn.Error.Send_FIFO_voll;//Send-FIFO zu PC ist voll + + L 16#B005; + T #Dyn.Stop_Ursache; + + BEA;//Warten + +x002_Mig: SET; + S #Dyn.Error.Send_FIFO_fehlerhaft;//Send-FIFO fehlerhaft + + L 16#B006; + T #Dyn.Stop_Ursache; + + BEA;//Warten + +w102: L 0;//unbekannt + T #Dyn.Status.Betriebsart_Quelle;//SendFIFO des PC, der Betriebart gestartet hat + + SET; + R #Dyn.Status.Betriebsart_Art.Sack_Tel;//Sack-Telegramm senden + + SPA ENDE_Mig;//Neubeginn + +NETWORK +TITLE = Schritt 1: Betriebsart ok/angegeben? +s001: SET;//Weiterschaltbedingung +//Schrittaktionen: + S #Dyn.BT_beruhigt;//1. einfahrender BügelTräger ist im Sep + + U #Dyn.Status.Betriebsart_Art.PC_Del;//Betriebsart aufgrund vom PC löschen + L 0;//Weiter mit Schritt 0 + SPB Neu_Mig;//Bei diesem Schritt weiter + + UN #Dyn.Error.Korrektur_Modus_aktiv;//Korrektur-Modus nach Crash aktiviert (wird vor Aufruf gesetzt!) + SPB W108; + + L 16#B010; + T #Dyn.Stop_Ursache; + + BEA; + +//Betriebsart checken: +W108: L #Dyn.Status.Betriebsart_Anzahl_Soll;//Anzahl der zu fahrenden BTs + L 0;//Sinnvolle Angabe ? + <=I;//Nein ! + U(; + O #Dyn.Status.Betriebsart_Art.Job;//Aber Betriebsart mit Anzahl ! + O #Dyn.Status.Betriebsart_Art.Job_TillEmpty; + ); + O; + U(; + O #Dyn.Status.Betriebsart_Art.Scannen; + O #Dyn.Status.Betriebsart_Art.Scannen_TillEmpty; + ); + UN #Separator.Parameter_allg.Scanner_eingebaut; + = #Dyn.Error.Err_Betriebsart;//Betriebsart ist nicht möglich + SPBN w108_Mig; + + L 16#B011; + T #Dyn.Stop_Ursache; + + BEA; + +w108_Mig: U #B_ImSep;//BT im Separator erkannt + O #Dyn.ohne_B_starten;//1.Vereinzelung auch ohne B_im_Sep + SPB w109; + + L 16#B012; + T #Dyn.Stop_Ursache; - SET - S Dyn.Error.Undef_Separator // undefinierter Separator + L 0;//Nächsten Zyklus Schritt 0 (Warten auf BT) + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll - L 0 // Separator ungültig ! - T Separator.Separator_Nr // Nummer des Separators + BEA; - L 16#A064 - T Dyn.Stop_Ursache +w109: U #Dyn.Status.Betriebsart_Art.Scannen; + O #Dyn.Status.Betriebsart_Art.Scannen_TillEmpty; + SPB W110; - BEU + SET; + R #Dyn.Scannerdaten;//Scannerdaten erhalten + R #Dyn.Dest0;//PC-Antwort mit Ziel=0 erhalten -// Defaultwerte übergeben: -w061: A Separator.Default_Betriebsart.Listen // Betriebart nach Urlöschen/Reset - = Dyn.Status.Betriebsart_Art.Listen - A Separator.Default_Betriebsart.Rapidfire - = Dyn.Status.Betriebsart_Art.Rapidfire - A Separator.Default_Betriebsart.TillEmpty - = Dyn.Status.Betriebsart_Art.TillEmpty - A Separator.Default_Betriebsart.Job - = Dyn.Status.Betriebsart_Art.Job - A Separator.Default_Betriebsart.Job_TillEmpty - = Dyn.Status.Betriebsart_Art.Job_TillEmpty - A Separator.Default_Betriebsart.DestFull - = Dyn.Status.Betriebsart_Art.DestFull - A Separator.Default_Betriebsart.Scannen - = Dyn.Status.Betriebsart_Art.Scannen - A Separator.Default_Betriebsart.Scannen_TillEmpty - = Dyn.Status.Betriebsart_Art.Scannen_TillEmpty + L #Dyn.Status.Betriebsart_Ziel;//Ziel für BTs (ohne PC) + L 0;//Ziel mit angegeben ? + <>I;//Ja ! + U #Dyn.Status.Betriebsart_Art.Listen; + O #Dyn.Status.Betriebsart_Art.Rapidfire; + O #Dyn.Status.Betriebsart_Art.TillEmpty; + O #Dyn.Status.Betriebsart_Art.Job; + O #Dyn.Status.Betriebsart_Art.Job_TillEmpty; + O #Dyn.Status.Betriebsart_Art.DestFull; + SPB W111; - L Separator.Default_Ziel // Ziel nach Urlöschen/Reset - T Dyn.Status.Betriebsart_Ziel // Ziel für BTs + L 0;//Betriebsart löschen + T #Dyn.Status.Betriebsart_Ziel; - BEU + L 0;//Nächsten Zyklus Schritt 0 (Warten auf BT) + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + T #Dyn.Status.Betriebsart_Anzahl_Ist; -en06: NOP 0 + L 16#B013; + T #Dyn.Stop_Ursache; + + BEA; + +W111: L 0;//Ziel mit angegeben ? + L #Dyn.Status.Betriebsart_Ziel;//Fest-Ziel für BTs (ohne PC) + <>I;//Ja ! + SPB W112; + + L #Separator.Default_Ziel;//Ziel nach Urlöschen/Reset +W112: T #Dyn.Scanner.Rec_DEST_Ziel;//1...X Ziellinie + + L 11;//Weiter mit Schritt 11 (Ausfahren ok?) + SPA Neu_Mig;//Bei diesem Schritt weiter + +//Betriebsart mit Scannen: +W110: U #Dyn.ohne_B_starten;//1.Vereinzelung auch ohne B_im_Sep + R #Dyn.ohne_B_starten;//nicht erlaubt ! + BEB; + + L 5;//Weiter mit Schritt 5 (Default-Ziel ?) + SPA Neu_Mig;//Bei diesem Schritt weiter + +NETWORK +TITLE = Schritt 5: Mit Scanner fahren: Defaultziel ? +s005: SET;//Weiterschaltbedingung + L #Separator.Default_Ziel; + L 0;//angegeben ? + ==I;//Nein ! + = #Weiter; + +//Schrittaktionen: + U #Weiter;//Weiterschaltbedingung ist erfüllt + U #Separator.Parameter_allg.Scanner_eingebaut; + U #Separator.Parameter_allg.PC_Komm_aktiv; + L 6 ;//Weiter mit Schritt 6 (Scanner triggern) + SPB Neu_Mig;//Bei diesem Schritt weiter + + L 16#B051; + T #Dyn.Stop_Ursache; + + U #Weiter; + BEB; + +//Ohne Scannen/PC-Daten fahren: + L 0; + T #Dyn.Scanner.Rec_IDX;//IDX + L #Separator.Default_Ziel; + T #Dyn.Scanner.Rec_DEST_Ziel;//Ziel + + L 11;//Weiter mit Schritt 11 (Ausfahren ok?) + SPA Neu_Mig;//Bei diesem Schritt weiter + +NETWORK +TITLE = Schritt 6: Scanner triggern +s006: SET;//Weiterschaltbedingung + = #Weiter;//Weiterschaltbedingung ist erfüllt + +//Schrittaktionen: + U #Dyn.Scannerdaten;//Scannerdaten erhalten + L 8;//Weiter mit Schritt 8 (Warten auf PC-Daten) + SPB Neu_Mig;//Bei diesem Schritt weiter + + U #Weiter;//Weiterschaltbedingung ist erfüllt + S #K_Sanner_triggern;//Scanner triggern + + U #Weiter;//Weiterschaltbedingung ist erfüllt + L 0;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + L 16#B061; + T #Dyn.Stop_Ursache; + + L 0;//Nächsten Zyklus Schritt 0 (Warten auf BT) + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + BEA; + +NETWORK +TITLE = Schritt 7: "DREQ" an PC senden +s007: SET;//Weiterschaltbedingung + = #Weiter;//Weiterschaltbedingung ist erfüllt + +//Schrittaktionen: + SET; + S #K_Sanner_triggern;//Scanner triggern + + L #Dyn.Scanner.Send_IDX;//IDX noch vorhanden, da BT nicht vereinzelt wurde + L 0; + >I; + = #IDX_Ok;//Send_IDX bekannt + SPB w110_Mig; + + L "SGes".IDX; + + 1; + T "SGes".IDX; + T #Dyn.Scanner.Send_IDX; + + L 0;//positiv ? + >I;//Ja ! + U(; + TAK; + L 32000;//unterhalb Maximum ? + <=I;//Ja ! + ); + SPB w110_Mig; + + L 1;//Start-IDX + T "SGes".IDX; + T #Dyn.Scanner.Send_IDX; + +//BT-Belade-Info an PC mitsenden: +w110_Mig: U #Dyn.B_Beladen;//0=leerer, 1= beladenener BT + L 6;//beladen + SPB X110; + + L 5;//Leerer/Escort BT + +X110: T #BT_State;//Beladezustand des BTs + + L 'DREQ'; + T "MD214";//Telegramm-Kennung + L 33; + T "MW218";//Anzahl Bytes + L #Separator_Nr; + T "MD220";//Sep-ID + L #Dyn.Scanner.Send_IDX; + T "MW224";//Carrier-IDX + L #BT_State;//Beladezustand des BTs + T "MB226";//Carrier-Type + L 0; + T "MB227";//Scan-State + L 0; + T "MD228";//Barcode + L 16#0003; + T "MB232";//ETX + + L 0;//Rest nullen + T "MB233"; + T "MB234"; + T "MB235"; + T "MB236"; + T "MB237"; + T "MB238"; + T "MB239"; + + SET; + R #Dyn.Error.Send_FIFO_voll;//Send-FIFO zu PC ist voll + R #Dyn.Error.Send_FIFO_fehlerhaft;//Send-FIFO fehlerhaft + + CALL "FifoIn" + ( SSDB := #Separator.PC_Send_FIFO , //Send-FIFO für PC-Sndungen + SSDW := 0 , + PARA := WORD#16#0000 , + INDATEN := P#M214.0 , + RE_VAL := "MB199" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_SendFIFO; + + SPBI w111_Mig; + + SET;//Bei Problem + R #K_Sanner_triggern;//Scanner triggern ausschalten + + U "M199.2"; + SPBN x070_Mig; + + SET; + S #Dyn.Error.Send_FIFO_voll;//Send-FIFO zu PC ist voll + + L 16#B071; + T #Dyn.Stop_Ursache; + + BEA;//Warten + +x070_Mig: SET; + S #Dyn.Error.Send_FIFO_fehlerhaft;//Send-FIFO fehlerhaft + + L 16#B072; + T #Dyn.Stop_Ursache; + + BEA; + +// Empfangsfach leeren... +w111_Mig: U #IDX_Ok;//Send_IDX bekannt + SPB w112_Mig; + + L 0; + T #Dyn.Scanner.Rec_IDX;//IDX + T #Dyn.Scanner.Rec_DEST_Type;//Ziel-Typ + T #Dyn.Scanner.Rec_DEST_Ziel;//Ziel + + SET; + R #Dyn.Dest0; + +w112_Mig: U #Weiter;//Weiterschaltbedingung ist erfüllt + L 0;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + BEA; + +NETWORK +TITLE = Schritt 8: Warten auf PC-Antwort +s008: SET;//Weiterschaltbedingung + L #Dyn.Scanner.Send_IDX; + L #Dyn.Scanner.Rec_IDX;//Daten für gesendete IDX empfangen ? + ==I;//Ja ! + = #Weiter; + +//Schrittaktionen: + U #Dyn.Sk.Err_Uebzeit; + UN #Weiter; + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + R #Err_Uebzeit; + R #Dyn.Scannerdaten;//Scannerdaten erhalten + SPB ENDE_Mig;//Neustart + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + R #Err_Uebzeit; + S #Dyn.Scannerdaten;//Scannerdaten erhalten + L 9;//Weiter mit Schritt + SPB Neu_Mig;//Bei diesem Schritt weiter + + L 16#B081; + T #Dyn.Stop_Ursache; + + L #Dyn.Scanner.Rec_IDX;//Daten empfangen ? + L 0; + ==I;//Nein ! + SPBN x080; + + L 16#B082; + T #Dyn.Stop_Ursache; + +x080: SET; + = #Ueb_akt;//Überwachungszeit aktivieren + + L 300;//Angabe der Überwachungszeit (*100ms) + U #Dyn.Dest0;//PC-Antwort mit Ziel=0 erhalten, dann lange Wartezeit ! + SPB tueb;//Überwachungszeit + + L 30;//Angabe der Überwachungszeit (*100ms) + SPA tueb;//Überwachungszeit + + BEA; + +NETWORK +TITLE = Schritt 9: PC-Antwort auswerten +s009: SET;//Weiterschaltbedingung + = #Weiter; + +//Schrittaktionen: + L #Dyn.Scanner.Rec_DEST_Ziel;//Ziel + L 0; + ==I; + = #Dyn.Dest0;//PC-Antwort mit Ziel=0 erhalten, dann Type auswerten (s.u.) + SPBN w130;//negierter Sprung ! + + L 0;//weiteres Telegramm nötig ! + T #Dyn.Scanner.Rec_IDX;//IDX + + L 8;//Weiter mit Schritt 8 (Warten auf PC-Daten) + SPA Neu_Mig;//Bei diesem Schritt weiter + +w130: L #Dyn.Scanner.Rec_DEST_Type;//Ziel-Typ + L 9;//Entladen per Hand ? + <>I;//Nein ! + SPB w131; + + L 16#B092; + T #Dyn.Stop_Ursache; + + BEA; + +w131: TAK; + L 1;//Ist BT leer? + ==I;//Ja ! + U #Separator.Parameter_allg.Belade_Kontrolle_nachSep; + = #Dyn.Status.Betriebsart_Art.BT_leer; + + TAK; + L 2;//Ist BT beladen? + ==I;//Ja ! + U #Separator.Parameter_allg.Belade_Kontrolle_nachSep; + = #Dyn.Status.Betriebsart_Art.BT_beladen; + + U #Weiter;//Weiterschaltbedingung ist erfüllt + L 11;//Weiter mit Schritt 11 (Ausfahren ok?) + SPB Neu_Mig;//Bei diesem Schritt weiter + + BEA; + +//Wartezeit bei gleichem BC: + U #Err_Uebzeit;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + R #Err_Uebzeit; + SPB ENDE_Mig; + + SET; + = #Ueb_akt;//Überwachungszeit aktivieren + S #Antrieb_start;//Kreiselantrieb starten (damit AutoDel funktioniert) + R #Antrieb_stoppen; + + L 30;//Angabe der Überwachungszeit (*100ms) + SPA tueb;//Überwachungszeit + + BEA; + +NETWORK +TITLE = Schritt 11: Ausfahren ok ? + +//Schrittaktionen: +s011: UN #B_ImSep;//Sensor BT ist im Separator + SPB ENDE_Mig;//Neustart + +//Anlage aus oder Störung: + UN #Dyn.Sk.Auto_akt;//Automatik ist aktiv + ON #Dyn.Sk.Bereich_ok;//Bereich ist gestört + L 16#B111; + T #Dyn.Stop_Ursache; + SPB ENDE_Mig;//Neustart + +//Neues Ziel ? + L #Dyn.Scanner.Rec_DEST_Ziel;//Ziel + L #SAVE.Last_Ziel;//Letztes angefahrenes Ziel + <>I;//unterschiedlich ! + U(; + L 0;//noch gespeichert ? + <>I;//Ja ! + ); + L 16#B112; + T #Dyn.Stop_Ursache; + R #Dyn.Error.Err_PinSignal;//Es kommt kein Pin-Signal + BEB;//Warten ! + +//Gleiches Ziel ? + L #Dyn.Scanner.Rec_DEST_Ziel;//Ziel + L #SAVE.Last_Ziel;//Letztes angefahrenes Ziel + ==I;//identisch ! + U(; + L 0;//noch gespeichert ? + <>I;//Ja ! + ); + = #Dyn.Gleiches_Ziel;//BT hat gleiches Ziel + SPB X180;//Sofort weiter ! + +//Genügend Abstand bei Ziel-Wechsel: + L #SAVE.Last_Ziel;//Letztes angefahrenes Ziel + L 0;//gelöscht ? (nach Zielwechsel-Abstand) + <>I;//Nein ! + L 16#B11A; + T #Dyn.Stop_Ursache; + R #Dyn.Error.Err_PinSignal;//Es kommt kein Pin-Signal + BEB; + + UN #Separator.Parameter_allg.Wechsel_bei_Travel_leer;//Zielwechsel nur bei Travel-FIFO leer + SPB X180;//Sofort weiter ! + +//Travel-Fifo leer ? + L #Separator.Parameter_SorterRein.TravelFIFO_DB; + T #DatenDB; + + AUF DB[ #DatenDB]; + + L #Separator.Parameter_SorterRein.TravelFIFO_DW; + + 8;//Anzahl der Datensätze (eingetragene) + ITD; + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + L DBW[ #AR1Zeiger];//Anzahl der Datensätze (eingetragene) + L 0; + ==I; + SPB X180;//Sofort weiter ! + + L 16#B11B; + T #Dyn.Stop_Ursache; + SET; + R #Dyn.Error.Err_PinSignal;//Es kommt kein Pin-Signal + BEA;//Warten ! + +//BT noch beim Ausfahren ?: +X180: U #Dyn.Error.Err_Raus_Sensor;//Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! Störung schon erkannt ! + U(; + U #B_AusSep;//Sensor BT hat Separator verlassen + U #Separator.Parameter_allg.B_AusSep_vorhanden;//Sensor BT hat Separator verlassen ist eingebaut + O; + U #B_Beladen_nach_Sep;//Sensor BT ist beladen nach Sep + U #Separator.Parameter_allg.Belade_Kontrolle_nachSep;//Belade-Kontrolle vorhanden nach Separator + ); + S #Antrieb_start;//Kreiselantrieb starten + R #Antrieb_stoppen; + L 16#B115; + T #Dyn.Stop_Ursache; + R #Dyn.Error.Err_PinSignal;//Es kommt kein Pin-Signal + BEB;//Warten ! + + U #B_AusSep;//Sensor BT hat Separator verlassen + U #Separator.Parameter_allg.B_AusSep_vorhanden;//Sensor BT hat Separator verlassen ist eingebaut + O; + U #B_Beladen_nach_Sep;//Sensor BT ist beladen nach Sep + U #Separator.Parameter_allg.Belade_Kontrolle_nachSep;//Belade-Kontrolle vorhanden nach Separator + S #Antrieb_start;//Kreiselantrieb starten + R #Antrieb_stoppen; + SPB w181; + + SET; + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + R #Err_Uebzeit; + R #Dyn.Error.Err_Raus_Sensor;//Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! + +//Starten erlaubt ?: + UN #Start_Ok;//Starten ist erlaubt + L 16#B116; + T #Dyn.Stop_Ursache; + R #Dyn.Error.Err_PinSignal;//Es kommt kein Pin-Signal + BEB;//Warten ! + +//Antriebe aktiv ?: + U #Separator.Parameter_allg.Antrieb_Plus_vorhanden;//Separator an weiterem Antrieb (Weiche) + S #Antrieb_plus_start;//Kreisel-Antrieb plus starten + + U(; + O #Antrieb_plus_aktiv;//Kreisel-Antrieb plus aktiv + ON #Separator.Parameter_allg.Antrieb_Plus_vorhanden;//Separator an weiterem Antrieb (Weiche) + ); + S #Antrieb_start;//Kreiselantrieb starten + R #Antrieb_stoppen; + + U #Antrieb_aktiv;//Kreisel-Antrieb aktiv + U(; + O #Antrieb_plus_aktiv;//Kreisel-Antrieb plus aktiv + ON #Separator.Parameter_allg.Antrieb_Plus_vorhanden;//Separator an weiterem Antrieb (Weiche) + ); + L 12;//Weiter mit Schritt (Warten auf Pin-Signal) + SPB Neu_Mig;//Bei diesem Schritt weiter + + L 16#B117; + T #Dyn.Stop_Ursache; + + SET; + R #Dyn.Error.Err_PinSignal;//Es kommt kein Pin-Signal + BEA; + +//Störung Verlassen-Sensor: +w181: U #Err_Uebzeit; + S #Dyn.Error.Err_Raus_Sensor;//Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! + + SET; + R #Dyn.Error.Err_PinSignal;//Es kommt kein Pin-Signal + + L 16#B118; + T #Dyn.Stop_Ursache; + + U #Antrieb_aktiv; + = #Ueb_akt;//Überwachungszeit aktivieren + L 150 ;//Angabe der Überwachungszeit (*100ms) + SPA tueb;//Überwachungszeit + +NETWORK +TITLE = Schritt 12: Warten auf Pin-Signal +s012: SET;//Weiterschaltbedingung + U(; + U #B_Pinsensor;//Zustand Pinsensor (eventl. verlängert) + U #Dyn.Gleiches_Ziel;//BT hat gleiches Ziel + O #PinSignal;//Impuls + ON #Separator.Parameter_allg.PinSignal;//Pin-Signal bei Ausfahrt beachten + ); + U #Antrieb_aktiv;//Kreisel-Antrieb aktiv + U(; + O #Antrieb_plus_aktiv;//Kreisel-Antrieb plus aktiv + ON #Separator.Parameter_allg.Antrieb_Plus_vorhanden;//Separator an weiterem Antrieb (Weiche) + ); + U #Start_Ok;//Starten ist erlaubt + = #Weiter; + +//Schrittaktionen: + SET; + R #Dyn.BT_draussen; + R #Dyn.BT_draussen_erkannt; + R #Dyn.BT_beladen;//BT ist beladen + + U #Separator.Parameter_allg.Antrieb_Plus_vorhanden;//Separator an weiterem Antrieb (Weiche) + S #Antrieb_plus_start;//Kreisel-Antrieb plus starten + + U(; + O #Antrieb_plus_aktiv;//Kreisel-Antrieb plus aktiv + ON #Separator.Parameter_allg.Antrieb_Plus_vorhanden;//Separator an weiterem Antrieb (Weiche) + ); + S #Antrieb_start;//Kreiselantrieb starten + R #Antrieb_stoppen; + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + R #Err_Uebzeit; + R #Dyn.Error.Err_PinSignal;//Es kommt kein Pin-Signal + L 13;//Weiter mit Schritt 13 (Weiche raus bereit ?) + SPB Neu_Mig;//Bei diesem Schritt weiter + + UN #Start_Ok;//Starten ist erlaubt + ON #Antrieb_aktiv; + O; + UN #Antrieb_plus_aktiv;//Kreisel-Antrieb plus aktiv + U #Separator.Parameter_allg.Antrieb_Plus_vorhanden;//Separator an weiterem Antrieb (Weiche) + SPB X012;//Abbruch + + U #Err_Uebzeit; + S #Dyn.Error.Err_PinSignal;//Es kommt kein Pin-Signal + + L 16#B121; + T #Dyn.Stop_Ursache; + + U #Antrieb_aktiv; + = #Ueb_akt;//Überwachungszeit aktivieren + L 50;//Angabe der Überwachungszeit (*100ms) + SPA tueb;//Überwachungszeit + +X012: L 11;//Nächsten Zyklus Schritt 0 (Ausfahren ok?) + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + BEA; + +NETWORK +TITLE = Schritt 13: Travel-Buffer ok ? +s013: NOP 0; + +//Schrittaktionen: + SET; + S #Antrieb_start;//Kreiselantrieb starten + R #Antrieb_stoppen; + + UN #B_ImSep;//Sensor BT ist im Separator + SPB ENDE_Mig;//Neustart + + L #Dyn.Max_Wert;//Max.Wert + L 0;//schon bekannt ? + <=D;//Nein ! + L 16#B131; + T #Dyn.Stop_Ursache; + SPB w151; + + CALL "FifoIn" + ( SSDB := #Separator.Parameter_SorterRein.TravelFIFO_DB , + SSDW := #Separator.Parameter_SorterRein.TravelFIFO_DW , + PARA := WORD#16#FF00 , //Testsendung + INDATEN := P#M220.0 , + RE_VAL := "MB199" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_TravelFIFO_In; + L 0;//Aufruf mit Fehler ? + ==I;//Nein ! + R #Dyn.Error.Travel_FIFO;//Travel-FIFO fehlerhaft + SPB w150; + + U "M199.2";//FIFO ist voll + L 16#B132; + T #Dyn.Stop_Ursache; + SPB w151; + + SET; + S #Dyn.Error.Travel_FIFO;//Travel-FIFO fehlerhaft + + L 16#B133; + T #Dyn.Stop_Ursache; + + SPA w151; + +w150: L 17;//Weiter mit Schritt 17 (Daten an Travel-FIFO) + SPA Neu_Mig;//Bei diesem Schritt weiter + +w151: L 11;//Nächsten Zyklus Schritt 0 (Ausfahren ok?) + T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll + + BEA; + +NETWORK +TITLE = Schritt 14: Separator Mindestzeit öffnen +s014: SET;//Weiterschaltbedingung + U #Antrieb_aktiv;//Kreisel-Antrieb aktiv + = #Weiter; + +//Schrittaktionen: + SET; + S #Y_Sep_Auf;//Separator öffnen + S #Antrieb_start;//Kreiselantrieb starten + R #Antrieb_stoppen; + S #Antrieb_plus_start;//Kreisel-Antrieb plus starten + + UN #Weiter; + = #Warte_neu;//Wartezeit neutriggern + SPB w251; + + L 16#B142; + T #Dyn.Stop_Ursache; + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Err_Uebzeit; + L #Separator.Mindeszeit_Sep_geoeffnet;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + +w251: L 16#B143; + T #Dyn.Stop_Ursache; + + BEA; + +NETWORK +TITLE = Schritt 15: BT ausgefahren ? (Wartezeit bis draussen) +s015: SET;//Weiterschaltbedingung + U #Dyn.BT_draussen;//BT/MT hat Separator verlassen +/// U #Antrieb_aktiv //Kreisel-Antrieb aktiv + = #Weiter; + +//Schrittaktionen: + SET; + S #Y_Sep_Auf;//Separator öffnen + S #Antrieb_start;//Kreiselantrieb starten + R #Antrieb_stoppen; + S #Antrieb_plus_start;//Kreisel-Antrieb plus starten + + U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + R #Err_Uebzeit; + R #Dyn.Error.Err_BT_raus;//BT/MT fährt nicht aus + L 16;//Weiter mit Schritt 16 (MT 1.Achse,...) + SPB Neu_Mig;//Bei diesem Schritt weiter + + U #Err_Uebzeit; + S #Dyn.Error.Err_BT_raus;//BT/MT fährt nicht aus + + L 16#B152; + T #Dyn.Stop_Ursache; + + UN #Antrieb_aktiv;//Kreisel-Antrieb aktiv + SPB x150; + + L 16#B153; + T #Dyn.Stop_Ursache; + + UN #Dyn.BT_draussen;//BT/MT hat Separator verlassen + SPB x150; + + L 16#B154; + T #Dyn.Stop_Ursache; + + UN #Antrieb_aktiv;//Kreisel-Antrieb aktiv + SPB x150; + +x150: U #Antrieb_aktiv; + = #Ueb_akt;//Überwachungszeit aktivieren + L 150 ;//Angabe der Überwachungszeit (*100ms) + SPA tueb;//Überwachungszeit + +NETWORK +TITLE = Schritt 16: BT ist draussen +s016: SET;//Weiterschaltbedingung + = #Weiter; + +//Schrittaktionen: + SET; + S #Dyn.BT_gestartet;//BT ist aus Separator gestartet (nur 1 Zyklus) + +//Belade-Check nach Sep?: + U #Separator.Parameter_allg.Belade_Kontrolle_nachSep;//Belade-Kontrolle vorhanden nach Separator + U(; + O #Dyn.Status.Betriebsart_Art.BT_leer;//BT/MT ist leer + O #Dyn.Status.Betriebsart_Art.BT_beladen; + ); + L 19;//Weiter mit Schritt 19 + SPB Neu_Mig;//Bei diesem Schritt weiter + +//Scannerdaten löschen: + SET; + R #Dyn.Scannerdaten;//Scannerdaten erhalten + + L 0;//IDX löschen, da BT vereinzelt wurde + T #Dyn.Scanner.Send_IDX;//damit neue IDX geholt wird + T #Dyn.Scanner.Rec_IDX; + T #Dyn.Scanner.Rec_DEST_Ziel; + T #Dyn.Scanner.Rec_DEST_Type; + + SPA ENDE_Mig; + +NETWORK +TITLE = Schritt 17: Daten in FIFO eintragen +s017: L 16#B171; + T #Dyn.Stop_Ursache; + + U #Max_Uebergabe;//MaxWert wird gerade übertragen ! + BEB; + +//Vereinzelungstakte +1: + L #Dyn.Status.Vereinzelungstakte; + L 1; + +D; + T #Dyn.Status.Vereinzelungstakte; + + L 0;//negativer Wert ? + >=D;//Nein ! + SPB W230; + + L #Dyn.Status.Vereinzelungstakte; + L 1; + -D;//damit wieder pos.Wert ! + T #Dyn.Status.Vereinzelungstakte; + +//Letztes angefahrnes Ziel speichern/Rücksetz-Inks speichern: +W230: L 0; + T #SAVE.Last_Ziel;//Letztes angefahrenes Ziel erst mal löschen + + L #Separator.Abstand_Zielwechsel;//Abstand bei Zielwechsel [inc] + L 0;//sinnvolle Angabe ? + <=I;//Nein ! + SPB W231; + + L #Dyn.Scanner.Rec_DEST_Ziel;//Ziel + T #SAVE.Last_Ziel;//Letztes angefahrenes Ziel speichern + + L #Separator.Abstand_Zielwechsel;//Abstand bei Zielwechsel [inc] + ITD; + L #Ink_Wert;//Aktuelle Inkrementalwert + +D; + T #Dyn.Del_Last_Ziel_Ink;//Bei diesen Inks letztes Ziel löschen + U #Lauf_Flag; + = #Dyn.Del_Last_Ziel_Flag;//Bei diesem Flag letzes Ziel löschen + L #Dyn.Max_Wert;//Maximal erlaubter Zählwert + >D; + SPBN W231; + + -D;//Restwert übernehmen + T #Dyn.Del_Last_Ziel_Ink;//Bei diesen Inks letztes Ziel löschen + UN #Lauf_Flag;//Aktuelles Lauf-Flag invertieren, da Überlauf ! + = #Dyn.Del_Last_Ziel_Flag;//Bei diesem Flag letzes Ziel löschen + +//Daten für Eintrag vorbereiten: +W231: L #Ink_Wert;//Aktueller Ink-Wert + T "MD210";//Start-Ink (für Rückkontrolle) + L 0; + T "MW214"; + U #Lauf_Flag; + = "M214.0"; + L #Dyn.Scanner.Rec_DEST_Type;//Ziel-Typ + L 3;//Letztes Teil vom Block ? + ==I;//Ja ! + = "M214.2";//Letztes Teil vom Block gestartet + + L #Dyn.Scanner.Rec_IDX;//IDX + T "MD216"; + L 0;//angegeben ? + <>I;//Ja ! + SPB u233; + +//z.Bsp. bei Default-Ziel: + L "SGes".IDX; + + DINT#1; + T "SGes".IDX; + T "MD216"; + +u233: L #Dyn.Scanner.Rec_DEST_Ziel;//Ziel + T "MW220"; + + L #Dyn.Status.Betriebsart_Ziel;//Fest-Ziel für BTs (ohne PC) + L 0;//vorgegeben ? (dann keine Einlagermeldung an PC) + ==I;//Nein ! + L #Separator.PC_Komm_SorterID;//ID für PC-Kommunikation + SPB w233; + + L 0;//Keine Angabe + +w233: T "MW222"; + + L 0;//Restliche Daten löschen + T "MW224"; + T "MW226"; + T "MW228"; + T "MW230"; + + CALL "FifoIn" + ( SSDB := #Separator.Parameter_SorterRein.TravelFIFO_DB , + SSDW := #Separator.Parameter_SorterRein.TravelFIFO_DW , + PARA := WORD#16#0000 , //Daten speichern + INDATEN := P#M210.0 , + RE_VAL := "MB199" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_TravelFIFO_In; + + SPBI w232; + + SET; + S #Dyn.Error.Daten_out;//Letzte Carrier-Daten konnten nicht an Travel-FIFO übergeben werden + + L 16#B172; + T #Dyn.Stop_Ursache; + + BEA; + +w232: L 14;//Weiter mit Schritt 14 + SPA Neu_Mig;//Bei diesem Schritt weiter + +NETWORK +TITLE = Schritt 19: Belade-Check +s019: SET; + S #Antrieb_start; + R #Antrieb_stoppen; + U #Separator.Parameter_allg.Antrieb_Plus_vorhanden;//Separator an weiterem Antrieb (Weiche) + S #Antrieb_plus_start;//Kreisel-Antrieb plus starten + + U #Dyn.Status.Betriebsart_Art.BT_beladen;//BT/MT ist beladen + U #Dyn.BT_beladen;//BT ist beladen + SPB X199;//Alles ok! + + U #Dyn.Status.Betriebsart_Art.BT_leer;//BT/MT ist leer + U #Dyn.BT_beladen;//BT ist beladen + SPB X19E;//Leerer BT ist beladen! + + U #Err_Uebzeit;//Ohne Verlassen-Sensor nach 1 s + O #Separator.Parameter_allg.B_AusSep_vorhanden;//Sensor BT hat Separator verlassen ist eingebaut + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + R #Err_Uebzeit; + SPB X190; + + U #Antrieb_aktiv; + = #Ueb_akt;//Überwachungszeit aktivieren + L 10;//Angabe der Überwachungszeit (*100ms) + SPA tueb;//Überwachungszeit + +//BT am Belade-Sensor vorbei: +X190: U #Dyn.Status.Betriebsart_Art.BT_leer;//BT/MT ist leer + SPB X199;//Alles ok! + +//Also Beladener BT ist leer! +//Fehler-Telegramm an PC: +X19E: NOP 0; +//BT-Belade-Info an PC mitsenden: + U #Dyn.Status.Betriebsart_Art.BT_leer;//BT/MT ist leer (also bei Error beladen!) + L 6;//beladen + SPB X191; + + L 4;//Leerer BT + +X191: T #BT_State;//Beladezustand des BTs + + L 'LERR'; + T "MD214";//Telegramm-Kennung + L 33; + T "MW218";//Anzahl Bytes + L #Separator_Nr; + T "MD220";//Sep-ID + L #Dyn.Scanner.Send_IDX; + T "MW224";//Carrier-IDX + L #BT_State;//Beladezustand des BTs + T "MB226";//Carrier-Type + L 0; + T "MB227";//Scan-State + L 0; + T "MD228";//Barcode + L 16#0003; + T "MB232";//ETX + + L 0;//Rest nullen + T "MB233"; + T "MB234"; + T "MB235"; + T "MB236"; + T "MB237"; + T "MB238"; + T "MB239"; + + SET; + R #Dyn.Error.Send_FIFO_voll;//Send-FIFO zu PC ist voll + R #Dyn.Error.Send_FIFO_fehlerhaft;//Send-FIFO fehlerhaft + + CALL "FifoIn" + ( SSDB := #Separator.PC_Send_FIFO , //Send-FIFO für PC-Sendungen + SSDW := 0 , + PARA := WORD#16#0000 , + INDATEN := P#M214.0 , + RE_VAL := "MB199" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_SendFIFO; + + SPBI X199; + + SET;//Bei Problem + R #K_Sanner_triggern;//Scanner triggern ausschalten + + U "M199.2"; + SPBN X192; + + SET; + S #Dyn.Error.Send_FIFO_voll;//Send-FIFO zu PC ist voll + + L 16#B191; + T #Dyn.Stop_Ursache; + + BEA;//Warten + +X192: SET; + S #Dyn.Error.Send_FIFO_fehlerhaft;//Send-FIFO fehlerhaft + + L 16#B192; + T #Dyn.Stop_Ursache; + + BEA; + +//Scannerdaten löschen: +X199: SET; + R #Dyn.Scannerdaten;//Scannerdaten erhalten + R #Dyn.Status.Betriebsart_Art.BT_leer;//BT/MT ist leer + R #Dyn.Status.Betriebsart_Art.BT_beladen;//BT/MT ist beladen + + L 0;//IDX löschen, da BT vereinzelt wurde + T #Dyn.Scanner.Rec_IDX;//Daten für gesendete IDX empfangen ? + T #Dyn.Scanner.Send_IDX;//IDX noch vorhanden, da BT nicht vereinzelt wurde + + SPA ENDE_Mig; + +NETWORK +TITLE = Schritt 20: Separator resetten +s020: SET;//Weiterschaltbedingung + = #Weiter;//Weiterschaltbedingung ist erfüllt + +//Schrittaktionen: + SET;//ELS in Grundstellung fahren + S #Antrieb_start;//Kreiselantrieb starten + R #Antrieb_stoppen; + + L 16#B201; + T #Dyn.Stop_Ursache; + + U #Weiter;//Weiterschaltbedingung ist erfüllt + L 300;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + SET; + = #Ueb_akt;//Überwachungszeit aktivieren + L 30;//Angabe der Überwachungszeit (*100ms) + SPA tueb;//Überwachungszeit + +NETWORK +TITLE = Schritt 21: Reset ist zu Ende +s021: SET; + R #Dyn.Sk.Reset_Akt;//Reset ist aktiv + + SPA ENDE_Mig;//Neubeginn + +NETWORK +TITLE = Schritt 23: GesamtSorter-Reset: Start-Ink speichern +s023: SET;//Weiterschaltbedingung + = #Weiter; + +//Schrittaktionen: + L #Dyn.Max_Wert; + L DINT#0; + <=D; + O #Max_Uebergabe ;//MaxWert wird gerade übertragen ! + BEB; + + L #Separator.Parameter_SorterRein.Abstand_Reset_Start;//Nach diesen Abstand kann Gesamt-Reset gestartet werden [*10inc] + ITD; + L #Ink_Wert ;//Aktuelle Inkrementalwert + +D; + T #Dyn.SorterReset_Start_Ink;//Bei diesen Inks Sorter-Reset starten + U #Lauf_Flag; + = #Dyn.SorterReset_Start_Flag;//Bei diesem Flag Sorter-Reset starten + L #Dyn.Max_Wert;//Maximal erlaubter Zählwert + >D; + SPBN W291; + + -D;//Restwert übernehmen + T #Dyn.SorterReset_Start_Ink;//Bei diesen Inks Sorter-Reset starten + UN #Lauf_Flag;//Aktuelles Lauf-Flag invertieren, da Überlauf ! + = #Dyn.SorterReset_Start_Flag;//Bei diesem Flag Sorter-Reset starten + +W291: U #Weiter;//Weiterschaltbedingung ist erfüllt + R #Dyn.Sk.Err_Uebzeit;//Sofort weiter ! + R #Err_Uebzeit; + L 0;//Angabe der Wartezeit (*10ms) + SPB Plus;//Nächsten Schritt starten + + CLR; + = #Ueb_akt;//Überwachungszeit aktivieren + L 50;//Angabe der Überwachungszeit (*100ms) + SPA tueb;//Überwachungszeit + + BEA; + +NETWORK +TITLE = Schritt 24: GesamtSorter-Reset: Start-Ink erreicht ? + +//Schrittaktionen: +s024: L 16#B241; + T #Dyn.Stop_Ursache; + + SET; + S #Antrieb_start;//Kreiselantrieb starten + R #Antrieb_stoppen; + S #Antrieb_plus_start; + + U #ErrQuit; + R #Dyn.Error.Err_BT_raus ;//BT/MT fährt nicht aus + + U #Max_Uebergabe;//MaxWert wird gerade übertragen ! + BEB; + + U #Dyn.SorterReset_Start_Flag;//Bei diesem Flag Sorter-Reset starten + U #Flag_Lauf_fertig;//Flag-Lauf wurde beendet + O; + UN #Dyn.SorterReset_Start_Flag;//Bei diesem Flag Sorter-Reset starten + U #Ohne_Lauf_fertig;//Flag-Lauf wurde beendet + SPB W300;//beim Ende des Lauf sind Inkremente uninteressant + + U #Dyn.SorterReset_Start_Flag;//Bei diesem Flag Sorter-Reset starten + UN #Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv + O; + UN #Dyn.SorterReset_Start_Flag;//Bei diesem Flag Sorter-Reset starten + U #Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv + L 16#B242; + T #Dyn.Stop_Ursache; + BEB; + + L #Ink_Wert;//Aktuelle Inkrementalwert + L #Dyn.SorterReset_Start_Ink;//Bei diesen Inks Sorter-Reset starten + sofort weiter + SPB w220; + + UN #Warte_neu;//Wartezeit neutriggern + SPB W220_Mig; + + L 0; + T #Dyn.Sk.Tok_Zelle;//Wartezeit + +W220_Mig: U #Warte_stop;//Wartezeit stoppen + BEB; + + L #Dyn.Sk.Tok_Zelle; + L "MW4" ;//Wartezeit +10ms + +I; + T #Dyn.Sk.Tok_Zelle;//Wartezeit + L #Dyn.Sk.T_ok;//abgelaufen ? + I;//abgelaufen ? + UN #Dyn.Sk.Err_Uebzeit; + SPB en24;//Nein ! + + U #Ueb_akt;//Überwachungszeit aktivieren + S #Dyn.Sk.Err_Uebzeit; + + L 0;//Zeitwert löschen + T #Dyn.Sk.Terr_Zelle; + + BEA; + +en24: NOP 0; +NETWORK +TITLE = Überwachungszeit +1 + UN #Dyn.Sk.Ueb_akt;//Schrittaktion ist aktiv + ON "100ms-Impuls"; + BEB; + L #Dyn.Sk.Terr_Zelle; + L "MW2"; + +I; + T #Dyn.Sk.Terr_Zelle; ---- NW 7: Indirekt adressierte Daten in temporäre Daten übergeben --- - A Dyn.Sk.Err_Uebzeit // Wegen Speicherbedarf und Zykluszeit ! - = Err_Uebzeit + BEA; - A ErrQuit // Überwachungszeit abgelaufen quittieren - R Dyn.Sk.Err_Uebzeit - S Antrieb_start // Kreiselantrieb starten - S Antrieb_plus_start // Kreisel-Antrieb plus starten +NETWORK +TITLE = Ende + BE; - A B_AusSep // Sensor BT hat Separator verlassen - A Y_Sep_Auf - S Dyn.BT_draussen_erkannt // Sensor hat BT draussen erkannt - - A B_Beladen_nach_Sep // Sensor BT ist beladen nach Sep - A Y_Sep_Auf - S Dyn.BT_beladen // BT ist beladen - - AN Separator.Parameter_allg.Belade_Kontrolle_im_Sep // Keine Belade-Kontrolle vorhanden (B-Erkennung) - O B_Beladen_im_Sep // Sensor BT ist beladen - S Dyn.B_Beladen // 0=leerer, 1= beladcenener BT - - A Y_Sep_Auf // Separator geöffnet - R Dyn.B_Beladen // 0=leerer, 1= beladcenener BT - - A ErrQuit - R Dyn.Error.Daten_out // Letzte Carrier-Daten konnten nicht an Travel-FIFO übergeben werden - - ---- NW 8: Stau vor / Err fährt nicht in Separator --- - A Dyn.Status.Betriebsart_Art.Stau_vor_Sep // Stau vor Separator-Einfahrt (FreiZeit ermitteln) - JC W072 - -// StauZeit ermitteln: - AN B_VorSep // Sensor BT fährt in Bereich (kein Stau !) - JC W070 // StauZeit neu aufziehen - - AN "100ms-Impuls" - JC Xn08 - - L Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [100ms] - L "MW2" // Stauzeit +100ms - +I - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [100ms] - - JU W071 - -W070: L 0 - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [100ms] - -W071: L Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [100ms] - L 10 // Stau-Zeit erreicht ? - >=I // Ja ! - S Dyn.Status.Betriebsart_Art.Stau_vor_Sep // Stau vor Separator-Einfahrt - JCN Xn08 - - L 0 // Zeiten löschen - T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [100ms] - -// FreiZeit ermitteln: -W072: A B_VorSep // Sensor BT fährt in Bereich (immer noch Stau !) - ON Dyn.Status.Betriebsart_Art.Stau_vor_Sep // Stau vor Separator-Einfahrt - JC X070 // FreiZeit neu aufziehen - - AN "100ms-Impuls" - JC Xn08 - - L Dyn.Frei_Zeit // Sensor B_VorSep ist frei [100ms] - L "MW2" // FreiZeit +100ms - +I - T Dyn.Frei_Zeit // Sensor B_VorSep ist frei [100ms] - - JU X071 - -X070: L 0 - T Dyn.Frei_Zeit // Sensor B_VorSep ist frei [100ms] - -X071: L Dyn.Frei_Zeit // Sensor B_VorSep ist frei [100ms] - L 20 // Frei-Zeit erreicht ? - >=I // Ja ! - R Dyn.Status.Betriebsart_Art.Stau_vor_Sep // Stau vor Separator-Einfahrt - JCN Xn08 - - L 0 // Zeiten löschen - T Dyn.Frei_Zeit // Sensor B_VorSep ist frei [100ms] - -// ErrorZeit ermitteln: -Xn08: A B_VorSep // Sensor BT fährt in Bereich (kein Stau !) - A Antrieb_aktiv // nur bei laufendem Antrieb ! - S Dyn.Status.Betriebsart_Art.BT_kommt // BT/MT fährt zum Sep - A B_ImSep - O ErrQuit // Ablaufstörung quittieren (sonst dauerhaft Err, falls BT entnommen) - R Dyn.Status.Betriebsart_Art.BT_kommt // BT/MT fährt zum Sep - - A Dyn.Status.Betriebsart_Art.BT_kommt // BT/MT fährt zum Sep - AN B_ImSep // aber noch nicht im Sep ! - S Antrieb_start // Kreisel-Antrieb starten - R Antrieb_stoppen - - AN Dyn.Status.Betriebsart_Art.BT_kommt // BT/MT fährt zum Sep - O B_ImSep - O Y_Sep_Auf - JC W090 // ErrZeit neu aufziehen - - AN "100ms-Impuls" - O Dyn.Error.Err_BT_rein // BT/MT fährt nicht in Separator - ON Antrieb_aktiv // Kreisel-Antrieb aktiv - JC W091 - - L Dyn.Err_Zeit // BT fährt nicht in Sep [100ms] - L "MW2" // ErrZeit +100ms - +I - T Dyn.Err_Zeit // BT fährt nicht in Sep [100ms] - - JU W091 - -W090: L 0 - T Dyn.Err_Zeit // BT fährt nicht in Sep [100ms] - -W091: L Dyn.Err_Zeit // BT fährt nicht in Sep [100ms] - L 300 // Err-Zeit erreicht ? - >=I // Ja ! - = Dyn.Error.Err_BT_rein // BT/MT fährt nicht in Separator - JCN W09E - - T Dyn.Err_Zeit // BT fährt nicht in Sep [100ms] - -W09E: SET - R Y_Sep_Auf // Separator öffnen - - ---- NW 9: BT hat Separator verlassen --- - L Dyn.Sk.Akt_Schritt // Aktueller Schritt - L 14 // Beim Vereinzeln ? - <>I // Nein ! - A( - CAC - L 15 // Beim Vereinzeln ? - <>I // Nein ! - ) - O B_ImSep // Sensor BT ist im Separator -// / ON #Antrieb_aktiv //Kreisel-Antrieb aktiv - JC w070_Mig // Freizeit neu aufziehen - - A Dyn.BT_draussen // BT/MT hat Separator verlassen - JC w071_Mig - - L SAVE.Sensorfrei_Zeit // Sensor B_imSep ist frei [10ms] - L "MW4" // Freizeit +10ms - +I - T SAVE.Sensorfrei_Zeit // Sensor B_imSep ist frei [10ms] - - L Separator.Wartezeit_bis_draussen // Nach dieser Zeit hat BT den Sep. verlassen [10ms] - <=I // Maximum erreicht ? - JC w071_Mig // Nein ! - - T SAVE.Sensorfrei_Zeit // Maximum übergeben - - JU w071_Mig - -w070_Mig: L 0 - T SAVE.Sensorfrei_Zeit // Sensor B_imSep ist frei [10ms] - -w071_Mig: L SAVE.Sensorfrei_Zeit // Sensor B_imSep ist frei [10ms] - L Separator.Wartezeit_bis_draussen // Nach dieser Zeit hat BT den Sep. verlassen [10ms] - >=I - AN B_ImSep // Sensor BT ist im Separator - A( - O Dyn.BT_draussen_erkannt // Sensor hat BT draussen erkannt - ON Separator.Parameter_allg.B_AusSep_vorhanden // Sensor BT hat Separator verlassen ist eingebaut (Konrolle kann erfolgen) - ) - = Dyn.BT_draussen // BT/MT hat Separator verlassen - - ---- NW 10: Daten des Inkremental-Gebers holen --- - L 0 - T Ink_Wert - CLR - = Flag_Lauf_fertig - = Ohne_Lauf_fertig - = Lauf_Flag - -// Weichendaten auslesen: -CALL FC "FifoOut" (SSDB:=Separator.Parameter_SorterRein.TravelFIFO_DB, SSDW:=Separator.Parameter_SorterRein.TravelFIFO_DW, PARA:=WORD#16#E214, OUTDATEN:=P#M220.0, RE_VAL:="MB199") // Alle Zusatzdaten lesen - - L "MB199" - T Dyn.Rueckmld.RET_VAL_TravelFIFO_Out // Rückmeldung bei FIFO-Zugriff (Travel-FIFO) - SET // alw - R Dyn.Error.Travel_FIFO // Travel-FIFO fehlerhaft - JBI Z_Ok - - SET - S Dyn.Error.Travel_FIFO // Weichen-FIFO fehlerhaft - - JU En08 - -// Zähler-Daten übergeben: -Z_Ok: A "M247.7" // Übergabe MaxWert aktiv - = Max_Uebergabe // MaxWert wird gerade übertragen ! - JC w080 - - L "MD242" // Inkwert - T Ink_Wert - A "M246.3" // Flag-Info - = Lauf_Flag - A "M246.4" // Fertig-Info - = Flag_Lauf_fertig - A "M246.5" // Fertig-Info - = Ohne_Lauf_fertig - - JU En08 - -w080: L "MD242" // MaxWert übergeben - T Dyn.Max_Wert - -En08: NOP 0 - - ---- NW 11: Letzter BT mit anderem Ziel genügend Abstand ? --- - A Max_Uebergabe // MaxWert wird gerade übertragen ! - JC En10 - - L Dyn.Del_Last_Ziel_Ink // Bei diesen Inks letztes Ziel löschen - L 0 // sinnvolle Angabe ? - <=D // Nein ! - SET // /Hier egal, da großer Trolley-Abstand + Stauklappe zum Synchronisieren! - JC W100 - - A Dyn.Del_Last_Ziel_Flag // Bei diesem Flag letzes Ziel löschen - A Flag_Lauf_fertig // Flag-Lauf wurde beendet - O - AN Dyn.Del_Last_Ziel_Flag // Bei diesem Flag letzes Ziel löschen - A Ohne_Lauf_fertig // Flag-Lauf wurde beendet - JC W100 // beim Ende des Lauf sind Inkremente uninteressant - - A Dyn.Del_Last_Ziel_Flag // Bei diesem Flag letzes Ziel löschen - A Lauf_Flag // Zähl-Lauf mit Flag ist aktiv - O - AN Dyn.Del_Last_Ziel_Flag // Bei diesem Flag letzes Ziel löschen - AN Lauf_Flag // Zähl-Lauf mit Flag ist aktiv - JCN En10 - - L Ink_Wert // Aktuelle Inkrementalwert - L Dyn.Del_Last_Ziel_Ink // Bei diesen Inks letztes Ziel löschen - =I // Ja ! - A( - L 0 // Sinnvolle Angabe ? - >I // Ja ! - ) - A( - O Dyn.Status.Betriebsart_Art.Job - O Dyn.Status.Betriebsart_Art.Job_TillEmpty - ) - R Dyn.Status.Betriebsart_Art.Job // Betriebsarten beenden - R Dyn.Status.Betriebsart_Art.Job_TillEmpty - S Dyn.Betriebsart_del // Betriebsart löschen - S Dyn.Status.Betriebsart_Art.Sack_Tel // Sack-Telegramm senden - JC Sack - - AN Weiter // Weiterschaltbedingung ist erfüllt - JC w100_Mig - - SET - R Dyn.Sk.Err_Uebzeit // sofort weiter - R Err_Uebzeit - - A Dyn.BT_beruhigt // 1. einfahrender BügelTräger ist im Sep -// / O #Separator.Parameter_allg.Antrieb_vorhanden - L 15 // Angabe der Wartezeit (*10ms) [kurz] - JU Plus // Nächsten Schritt starten - -// Überwachungszeit abgelaufen ?: -w100_Mig: AN Err_Uebzeit - JC x101 - - SET - R Dyn.Sk.Err_Uebzeit // Einmalige Auswertung - R Err_Uebzeit - - JU w101 - -// Überwachungszeit starten: -x101: AN B_ImSep // BT im Separator erkannt - A( - O Dyn.Status.Betriebsart_Art.TillEmpty - O Dyn.Status.Betriebsart_Art.Job_TillEmpty - O Dyn.Status.Betriebsart_Art.Scannen_TillEmpty - ) - A Dyn.Sk.Auto_akt // Automatik ist aktiv - A Dyn.Sk.Bereich_ok - = Ueb_akt // Überwachungszeit aktivieren - - L 16#B001 - T Dyn.Stop_Ursache - - AN Dyn.Sk.Auto_akt // Automatik ist aktiv - JC x001_Mig - - L 16#B002 - T Dyn.Stop_Ursache - - AN Dyn.Sk.Bereich_ok - JC x001_Mig - - L 16#B003 - T Dyn.Stop_Ursache - - AN B_ImSep - JC x001_Mig - -x001_Mig: L Separator.Wartezeit_bis_leer // Angabe der Überwachungszeit (*100ms) - JU tueb // Überwachungszeit - -// Folgende Betriebsarten beenden ?: -w101: A Dyn.Status.Betriebsart_Art.TillEmpty - R Dyn.Status.Betriebsart_Art.TillEmpty - S Dyn.Betriebsart_del // Betriebsart löschen - S Dyn.Status.Betriebsart_Art.Sack_Tel // Sack-Telegramm senden - JC Sack // Sack-Telegramm senden - - A Dyn.Status.Betriebsart_Art.Job_TillEmpty - R Dyn.Status.Betriebsart_Art.Job_TillEmpty - S Dyn.Betriebsart_del // Betriebsart löschen - S Dyn.Status.Betriebsart_Art.Sack_Tel // Sack-Telegramm senden - JC Sack // Sack-Telegramm senden - - A Dyn.Status.Betriebsart_Art.Scannen_TillEmpty - R Dyn.Status.Betriebsart_Art.Scannen_TillEmpty - S Dyn.Betriebsart_del // Betriebsart löschen - S Dyn.Status.Betriebsart_Art.Sack_Tel // Sack-Telegramm senden - JC Sack // Sack-Telegramm senden - - BEU - -Sack: AN Separator.Parameter_allg.PC_Komm_aktiv - R Dyn.Error.Send_FIFO_voll // Send-FIFO zu PC ist voll - JC w102 - -// Daten aufbereiten: - L 'SACK' - T "MD214" // Telegramm-Kennung - L 30 - T "MW218" // Anzahl Bytes - L Separator_Nr - T "MD220" // Sep-ID - L 0 - T "MB224" // State - L Dyn.Status.Betriebsart_Anzahl_Soll - T "MW225" // Target-Counts - L Dyn.Status.Betriebsart_Anzahl_Ist - T "MW227" // Actual-Counts - L 16#0003 - T "MB229" // ETX - - L 0 // Rest nullen - T "MB230" - T "MB231" - T "MB232" - T "MB233" - T "MB234" - T "MB235" - T "MB236" - T "MB237" - T "MB238" - T "MB239" - T Dyn.Status.Betriebsart_Anzahl_Ist - - L Dyn.Status.Betriebsart_Quelle // SendFIFO des PC, der Betriebart gestartet hat - L 0 // bekannt ? - >I // Ja ! - JC sack_Mig - - L Separator.PC_Send_FIFO // Send-FIFO für PC-Sendungen - T Dyn.Status.Betriebsart_Quelle - -sack_Mig: SET - R Dyn.Error.Send_FIFO_voll // Send-FIFO zu PC ist voll - R Dyn.Error.Send_FIFO_fehlerhaft // Send-FIFO fehlerhaft - -CALL FC "FifoIn" (SSDB:=Dyn.Status.Betriebsart_Quelle, SSDW:=0, PARA:=WORD#16#0000, INDATEN:=P#M214.0, RE_VAL:="MB199") - - L "MB199" - T Dyn.Rueckmld.RET_VAL_SendFIFO - - JBI w102 - - A "M199.2" - JCN x002_Mig - - SET - S Dyn.Error.Send_FIFO_voll // Send-FIFO zu PC ist voll - - L 16#B005 - T Dyn.Stop_Ursache - - BEU // Warten - -x002_Mig: SET - S Dyn.Error.Send_FIFO_fehlerhaft // Send-FIFO fehlerhaft - - L 16#B006 - T Dyn.Stop_Ursache - - BEU // Warten - -w102: L 0 // unbekannt - T Dyn.Status.Betriebsart_Quelle // SendFIFO des PC, der Betriebart gestartet hat - - SET - R Dyn.Status.Betriebsart_Art.Sack_Tel // Sack-Telegramm senden - - JU ENDE_Mig // Neubeginn - - ---- NW 16: Schritt 1: Betriebsart ok/angegeben? --- -s001: SET // Weiterschaltbedingung -// Schrittaktionen: - S Dyn.BT_beruhigt // 1. einfahrender BügelTräger ist im Sep - - A Dyn.Status.Betriebsart_Art.PC_Del // Betriebsart aufgrund vom PC löschen - L 0 // Weiter mit Schritt 0 - JC Neu_Mig // Bei diesem Schritt weiter - - AN Dyn.Error.Korrektur_Modus_aktiv // Korrektur-Modus nach Crash aktiviert (wird vor Aufruf gesetzt!) - JC W108 - - L 16#B010 - T Dyn.Stop_Ursache - - BEU - -// Betriebsart checken: -W108: L Dyn.Status.Betriebsart_Anzahl_Soll // Anzahl der zu fahrenden BTs - L 0 // Sinnvolle Angabe ? - <=I // Nein ! - A( - O Dyn.Status.Betriebsart_Art.Job // Aber Betriebsart mit Anzahl ! - O Dyn.Status.Betriebsart_Art.Job_TillEmpty - ) - O - A( - O Dyn.Status.Betriebsart_Art.Scannen - O Dyn.Status.Betriebsart_Art.Scannen_TillEmpty - ) - AN Separator.Parameter_allg.Scanner_eingebaut - = Dyn.Error.Err_Betriebsart // Betriebsart ist nicht möglich - JCN w108_Mig - - L 16#B011 - T Dyn.Stop_Ursache - - BEU - -w108_Mig: A B_ImSep // BT im Separator erkannt - O Dyn.ohne_B_starten // 1.Vereinzelung auch ohne B_im_Sep - JC w109 - - L 16#B012 - T Dyn.Stop_Ursache - - L 0 // Nächsten Zyklus Schritt 0 (Warten auf BT) - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - BEU - -w109: A Dyn.Status.Betriebsart_Art.Scannen - O Dyn.Status.Betriebsart_Art.Scannen_TillEmpty - JC W110 - - SET - R Dyn.Scannerdaten // Scannerdaten erhalten - R Dyn.Dest0 // PC-Antwort mit Ziel=0 erhalten - - L Dyn.Status.Betriebsart_Ziel // Ziel für BTs (ohne PC) - L 0 // Ziel mit angegeben ? - <>I // Ja ! - A Dyn.Status.Betriebsart_Art.Listen - O Dyn.Status.Betriebsart_Art.Rapidfire - O Dyn.Status.Betriebsart_Art.TillEmpty - O Dyn.Status.Betriebsart_Art.Job - O Dyn.Status.Betriebsart_Art.Job_TillEmpty - O Dyn.Status.Betriebsart_Art.DestFull - JC W111 - - L 0 // Betriebsart löschen - T Dyn.Status.Betriebsart_Ziel - - L 0 // Nächsten Zyklus Schritt 0 (Warten auf BT) - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - T Dyn.Status.Betriebsart_Anzahl_Ist - - L 16#B013 - T Dyn.Stop_Ursache - - BEU - -W111: L 0 // Ziel mit angegeben ? - L Dyn.Status.Betriebsart_Ziel // Fest-Ziel für BTs (ohne PC) - <>I // Ja ! - JC W112 - - L Separator.Default_Ziel // Ziel nach Urlöschen/Reset -W112: T Dyn.Scanner.Rec_DEST_Ziel // 1...X Ziellinie - - L 11 // Weiter mit Schritt 11 (Ausfahren ok?) - JU Neu_Mig // Bei diesem Schritt weiter - -// Betriebsart mit Scannen: -W110: A Dyn.ohne_B_starten // 1.Vereinzelung auch ohne B_im_Sep - R Dyn.ohne_B_starten // nicht erlaubt ! - BEC - - L 5 // Weiter mit Schritt 5 (Default-Ziel ?) - JU Neu_Mig // Bei diesem Schritt weiter - - ---- NW 17: Schritt 5: Mit Scanner fahren: Defaultziel ? --- -s005: SET // Weiterschaltbedingung - L Separator.Default_Ziel - L 0 // angegeben ? - ==I // Nein ! - = Weiter - -// Schrittaktionen: - A Weiter // Weiterschaltbedingung ist erfüllt - A Separator.Parameter_allg.Scanner_eingebaut - A Separator.Parameter_allg.PC_Komm_aktiv - L 6 // Weiter mit Schritt 6 (Scanner triggern) - JC Neu_Mig // Bei diesem Schritt weiter - - L 16#B051 - T Dyn.Stop_Ursache - - A Weiter - BEC - -// Ohne Scannen/PC-Daten fahren: - L 0 - T Dyn.Scanner.Rec_IDX // IDX - L Separator.Default_Ziel - T Dyn.Scanner.Rec_DEST_Ziel // Ziel - - L 11 // Weiter mit Schritt 11 (Ausfahren ok?) - JU Neu_Mig // Bei diesem Schritt weiter - - ---- NW 18: Schritt 6: Scanner triggern --- -s006: SET // Weiterschaltbedingung - = Weiter // Weiterschaltbedingung ist erfüllt - -// Schrittaktionen: - A Dyn.Scannerdaten // Scannerdaten erhalten - L 8 // Weiter mit Schritt 8 (Warten auf PC-Daten) - JC Neu_Mig // Bei diesem Schritt weiter - - A Weiter // Weiterschaltbedingung ist erfüllt - S K_Sanner_triggern // Scanner triggern - - A Weiter // Weiterschaltbedingung ist erfüllt - L 0 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - L 16#B061 - T Dyn.Stop_Ursache - - L 0 // Nächsten Zyklus Schritt 0 (Warten auf BT) - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - BEU - - ---- NW 19: Schritt 7: "DREQ" an PC senden --- -s007: SET // Weiterschaltbedingung - = Weiter // Weiterschaltbedingung ist erfüllt - -// Schrittaktionen: - SET - S K_Sanner_triggern // Scanner triggern - - L Dyn.Scanner.Send_IDX // IDX noch vorhanden, da BT nicht vereinzelt wurde - L 0 - >I - = IDX_Ok // Send_IDX bekannt - JC w110_Mig - - L "SGes".IDX - + 1 - T "SGes".IDX - T Dyn.Scanner.Send_IDX - - L 0 // positiv ? - >I // Ja ! - A( - CAC - L 32000 // unterhalb Maximum ? - <=I // Ja ! - ) - JC w110_Mig - - L 1 // Start-IDX - T "SGes".IDX - T Dyn.Scanner.Send_IDX - -// BT-Belade-Info an PC mitsenden: -w110_Mig: A Dyn.B_Beladen // 0=leerer, 1= beladenener BT - L 6 // beladen - JC X110 - - L 5 // Leerer/Escort BT - -X110: T BT_State // Beladezustand des BTs - - L 'DREQ' - T "MD214" // Telegramm-Kennung - L 33 - T "MW218" // Anzahl Bytes - L Separator_Nr - T "MD220" // Sep-ID - L Dyn.Scanner.Send_IDX - T "MW224" // Carrier-IDX - L BT_State // Beladezustand des BTs - T "MB226" // Carrier-Type - L 0 - T "MB227" // Scan-State - L 0 - T "MD228" // Barcode - L 16#0003 - T "MB232" // ETX - - L 0 // Rest nullen - T "MB233" - T "MB234" - T "MB235" - T "MB236" - T "MB237" - T "MB238" - T "MB239" - - SET - R Dyn.Error.Send_FIFO_voll // Send-FIFO zu PC ist voll - R Dyn.Error.Send_FIFO_fehlerhaft // Send-FIFO fehlerhaft - -CALL FC "FifoIn" (SSDB:=Separator.PC_Send_FIFO, SSDW:=0, PARA:=WORD#16#0000, INDATEN:=P#M214.0, RE_VAL:="MB199") // Send-FIFO für PC-Sndungen - - L "MB199" - T Dyn.Rueckmld.RET_VAL_SendFIFO - - JBI w111_Mig - - SET // Bei Problem - R K_Sanner_triggern // Scanner triggern ausschalten - - A "M199.2" - JCN x070_Mig - - SET - S Dyn.Error.Send_FIFO_voll // Send-FIFO zu PC ist voll - - L 16#B071 - T Dyn.Stop_Ursache - - BEU // Warten - -x070_Mig: SET - S Dyn.Error.Send_FIFO_fehlerhaft // Send-FIFO fehlerhaft - - L 16#B072 - T Dyn.Stop_Ursache - - BEU - -// Empfangsfach leeren... -w111_Mig: A IDX_Ok // Send_IDX bekannt - JC w112_Mig - - L 0 - T Dyn.Scanner.Rec_IDX // IDX - T Dyn.Scanner.Rec_DEST_Type // Ziel-Typ - T Dyn.Scanner.Rec_DEST_Ziel // Ziel - - SET - R Dyn.Dest0 - -w112_Mig: A Weiter // Weiterschaltbedingung ist erfüllt - L 0 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - BEU - - ---- NW 20: Schritt 8: Warten auf PC-Antwort --- -s008: SET // Weiterschaltbedingung - L Dyn.Scanner.Send_IDX - L Dyn.Scanner.Rec_IDX // Daten für gesendete IDX empfangen ? - ==I // Ja ! - = Weiter - -// Schrittaktionen: - A Dyn.Sk.Err_Uebzeit - AN Weiter - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - R Err_Uebzeit - R Dyn.Scannerdaten // Scannerdaten erhalten - JC ENDE_Mig // Neustart - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - R Err_Uebzeit - S Dyn.Scannerdaten // Scannerdaten erhalten - L 9 // Weiter mit Schritt - JC Neu_Mig // Bei diesem Schritt weiter - - L 16#B081 - T Dyn.Stop_Ursache - - L Dyn.Scanner.Rec_IDX // Daten empfangen ? - L 0 - ==I // Nein ! - JCN x080 - - L 16#B082 - T Dyn.Stop_Ursache - -x080: SET - = Ueb_akt // Überwachungszeit aktivieren - - L 300 // Angabe der Überwachungszeit (*100ms) - A Dyn.Dest0 // PC-Antwort mit Ziel=0 erhalten, dann lange Wartezeit ! - JC tueb // Überwachungszeit - - L 30 // Angabe der Überwachungszeit (*100ms) - JU tueb // Überwachungszeit - - BEU - - ---- NW 21: Schritt 9: PC-Antwort auswerten --- -s009: SET // Weiterschaltbedingung - = Weiter - -// Schrittaktionen: - L Dyn.Scanner.Rec_DEST_Ziel // Ziel - L 0 - ==I - = Dyn.Dest0 // PC-Antwort mit Ziel=0 erhalten, dann Type auswerten (s.u.) - JCN w130 // negierter Sprung ! - - L 0 // weiteres Telegramm nötig ! - T Dyn.Scanner.Rec_IDX // IDX - - L 8 // Weiter mit Schritt 8 (Warten auf PC-Daten) - JU Neu_Mig // Bei diesem Schritt weiter - -w130: L Dyn.Scanner.Rec_DEST_Type // Ziel-Typ - L 9 // Entladen per Hand ? - <>I // Nein ! - JC w131 - - L 16#B092 - T Dyn.Stop_Ursache - - BEU - -w131: CAC - L 1 // Ist BT leer? - ==I // Ja ! - A Separator.Parameter_allg.Belade_Kontrolle_nachSep - = Dyn.Status.Betriebsart_Art.BT_leer - - CAC - L 2 // Ist BT beladen? - ==I // Ja ! - A Separator.Parameter_allg.Belade_Kontrolle_nachSep - = Dyn.Status.Betriebsart_Art.BT_beladen - - A Weiter // Weiterschaltbedingung ist erfüllt - L 11 // Weiter mit Schritt 11 (Ausfahren ok?) - JC Neu_Mig // Bei diesem Schritt weiter - - BEU - -// Wartezeit bei gleichem BC: - A Err_Uebzeit // Weiterschaltbedingung ist erfüllt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - R Err_Uebzeit - JC ENDE_Mig - - SET - = Ueb_akt // Überwachungszeit aktivieren - S Antrieb_start // Kreiselantrieb starten (damit AutoDel funktioniert) - R Antrieb_stoppen - - L 30 // Angabe der Überwachungszeit (*100ms) - JU tueb // Überwachungszeit - - BEU - - ---- NW 22: Schritt 11: Ausfahren ok ? --- -// Schrittaktionen: -s011: AN B_ImSep // Sensor BT ist im Separator - JC ENDE_Mig // Neustart - -// Anlage aus oder Störung: - AN Dyn.Sk.Auto_akt // Automatik ist aktiv - ON Dyn.Sk.Bereich_ok // Bereich ist gestört - L 16#B111 - T Dyn.Stop_Ursache - JC ENDE_Mig // Neustart - -// Neues Ziel ? - L Dyn.Scanner.Rec_DEST_Ziel // Ziel - L SAVE.Last_Ziel // Letztes angefahrenes Ziel - <>I // unterschiedlich ! - A( - L 0 // noch gespeichert ? - <>I // Ja ! - ) - L 16#B112 - T Dyn.Stop_Ursache - R Dyn.Error.Err_PinSignal // Es kommt kein Pin-Signal - BEC // Warten ! - -// Gleiches Ziel ? - L Dyn.Scanner.Rec_DEST_Ziel // Ziel - L SAVE.Last_Ziel // Letztes angefahrenes Ziel - ==I // identisch ! - A( - L 0 // noch gespeichert ? - <>I // Ja ! - ) - = Dyn.Gleiches_Ziel // BT hat gleiches Ziel - JC X180 // Sofort weiter ! - -// Genügend Abstand bei Ziel-Wechsel: - L SAVE.Last_Ziel // Letztes angefahrenes Ziel - L 0 // gelöscht ? (nach Zielwechsel-Abstand) - <>I // Nein ! - L 16#B11A - T Dyn.Stop_Ursache - R Dyn.Error.Err_PinSignal // Es kommt kein Pin-Signal - BEC - - AN Separator.Parameter_allg.Wechsel_bei_Travel_leer // Zielwechsel nur bei Travel-FIFO leer - JC X180 // Sofort weiter ! - -// Travel-Fifo leer ? - L Separator.Parameter_SorterRein.TravelFIFO_DB - T DatenDB - - OPN DB[DatenDB] - - L Separator.Parameter_SorterRein.TravelFIFO_DW - + 8 // Anzahl der Datensätze (eingetragene) - ITD - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - L DBW [AR1Zeiger] // Anzahl der Datensätze (eingetragene) - L 0 - ==I - JC X180 // Sofort weiter ! - - L 16#B11B - T Dyn.Stop_Ursache - SET - R Dyn.Error.Err_PinSignal // Es kommt kein Pin-Signal - BEU // Warten ! - -// BT noch beim Ausfahren ?: -X180: A Dyn.Error.Err_Raus_Sensor // Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! Störung schon erkannt ! - A( - A B_AusSep // Sensor BT hat Separator verlassen - A Separator.Parameter_allg.B_AusSep_vorhanden // Sensor BT hat Separator verlassen ist eingebaut - O - A B_Beladen_nach_Sep // Sensor BT ist beladen nach Sep - A Separator.Parameter_allg.Belade_Kontrolle_nachSep // Belade-Kontrolle vorhanden nach Separator - ) - S Antrieb_start // Kreiselantrieb starten - R Antrieb_stoppen - L 16#B115 - T Dyn.Stop_Ursache - R Dyn.Error.Err_PinSignal // Es kommt kein Pin-Signal - BEC // Warten ! - - A B_AusSep // Sensor BT hat Separator verlassen - A Separator.Parameter_allg.B_AusSep_vorhanden // Sensor BT hat Separator verlassen ist eingebaut - O - A B_Beladen_nach_Sep // Sensor BT ist beladen nach Sep - A Separator.Parameter_allg.Belade_Kontrolle_nachSep // Belade-Kontrolle vorhanden nach Separator - S Antrieb_start // Kreiselantrieb starten - R Antrieb_stoppen - JC w181 - - SET - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - R Err_Uebzeit - R Dyn.Error.Err_Raus_Sensor // Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! - -// Starten erlaubt ?: - AN Start_Ok // Starten ist erlaubt - L 16#B116 - T Dyn.Stop_Ursache - R Dyn.Error.Err_PinSignal // Es kommt kein Pin-Signal - BEC // Warten ! - -// Antriebe aktiv ?: - A Separator.Parameter_allg.Antrieb_Plus_vorhanden // Separator an weiterem Antrieb (Weiche) - S Antrieb_plus_start // Kreisel-Antrieb plus starten - - A( - O Antrieb_plus_aktiv // Kreisel-Antrieb plus aktiv - ON Separator.Parameter_allg.Antrieb_Plus_vorhanden // Separator an weiterem Antrieb (Weiche) - ) - S Antrieb_start // Kreiselantrieb starten - R Antrieb_stoppen - - A Antrieb_aktiv // Kreisel-Antrieb aktiv - A( - O Antrieb_plus_aktiv // Kreisel-Antrieb plus aktiv - ON Separator.Parameter_allg.Antrieb_Plus_vorhanden // Separator an weiterem Antrieb (Weiche) - ) - L 12 // Weiter mit Schritt (Warten auf Pin-Signal) - JC Neu_Mig // Bei diesem Schritt weiter - - L 16#B117 - T Dyn.Stop_Ursache - - SET - R Dyn.Error.Err_PinSignal // Es kommt kein Pin-Signal - BEU - -// Störung Verlassen-Sensor: -w181: A Err_Uebzeit - S Dyn.Error.Err_Raus_Sensor // Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)! - - SET - R Dyn.Error.Err_PinSignal // Es kommt kein Pin-Signal - - L 16#B118 - T Dyn.Stop_Ursache - - A Antrieb_aktiv - = Ueb_akt // Überwachungszeit aktivieren - L 150 // Angabe der Überwachungszeit (*100ms) - JU tueb // Überwachungszeit - - ---- NW 23: Schritt 12: Warten auf Pin-Signal --- -s012: SET // Weiterschaltbedingung - A( - A B_Pinsensor // Zustand Pinsensor (eventl. verlängert) - A Dyn.Gleiches_Ziel // BT hat gleiches Ziel - O PinSignal // Impuls - ON Separator.Parameter_allg.PinSignal // Pin-Signal bei Ausfahrt beachten - ) - A Antrieb_aktiv // Kreisel-Antrieb aktiv - A( - O Antrieb_plus_aktiv // Kreisel-Antrieb plus aktiv - ON Separator.Parameter_allg.Antrieb_Plus_vorhanden // Separator an weiterem Antrieb (Weiche) - ) - A Start_Ok // Starten ist erlaubt - = Weiter - -// Schrittaktionen: - SET - R Dyn.BT_draussen - R Dyn.BT_draussen_erkannt - R Dyn.BT_beladen // BT ist beladen - - A Separator.Parameter_allg.Antrieb_Plus_vorhanden // Separator an weiterem Antrieb (Weiche) - S Antrieb_plus_start // Kreisel-Antrieb plus starten - - A( - O Antrieb_plus_aktiv // Kreisel-Antrieb plus aktiv - ON Separator.Parameter_allg.Antrieb_Plus_vorhanden // Separator an weiterem Antrieb (Weiche) - ) - S Antrieb_start // Kreiselantrieb starten - R Antrieb_stoppen - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - R Err_Uebzeit - R Dyn.Error.Err_PinSignal // Es kommt kein Pin-Signal - L 13 // Weiter mit Schritt 13 (Weiche raus bereit ?) - JC Neu_Mig // Bei diesem Schritt weiter - - AN Start_Ok // Starten ist erlaubt - ON Antrieb_aktiv - O - AN Antrieb_plus_aktiv // Kreisel-Antrieb plus aktiv - A Separator.Parameter_allg.Antrieb_Plus_vorhanden // Separator an weiterem Antrieb (Weiche) - JC X012 // Abbruch - - A Err_Uebzeit - S Dyn.Error.Err_PinSignal // Es kommt kein Pin-Signal - - L 16#B121 - T Dyn.Stop_Ursache - - A Antrieb_aktiv - = Ueb_akt // Überwachungszeit aktivieren - L 50 // Angabe der Überwachungszeit (*100ms) - JU tueb // Überwachungszeit - -X012: L 11 // Nächsten Zyklus Schritt 0 (Ausfahren ok?) - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - BEU - - ---- NW 24: Schritt 13: Travel-Buffer ok ? --- -s013: NOP 0 - -// Schrittaktionen: - SET - S Antrieb_start // Kreiselantrieb starten - R Antrieb_stoppen - - AN B_ImSep // Sensor BT ist im Separator - JC ENDE_Mig // Neustart - - L Dyn.Max_Wert // Max.Wert - L 0 // schon bekannt ? - <=D // Nein ! - L 16#B131 - T Dyn.Stop_Ursache - JC w151 - -CALL FC "FifoIn" (SSDB:=Separator.Parameter_SorterRein.TravelFIFO_DB, SSDW:=Separator.Parameter_SorterRein.TravelFIFO_DW, PARA:=WORD#16#FF00, INDATEN:=P#M220.0, RE_VAL:="MB199") // Testsendung - - L "MB199" - T Dyn.Rueckmld.RET_VAL_TravelFIFO_In - L 0 // Aufruf mit Fehler ? - ==I // Nein ! - R Dyn.Error.Travel_FIFO // Travel-FIFO fehlerhaft - JC w150 - - A "M199.2" // FIFO ist voll - L 16#B132 - T Dyn.Stop_Ursache - JC w151 - - SET - S Dyn.Error.Travel_FIFO // Travel-FIFO fehlerhaft - - L 16#B133 - T Dyn.Stop_Ursache - - JU w151 - -w150: L 17 // Weiter mit Schritt 17 (Daten an Travel-FIFO) - JU Neu_Mig // Bei diesem Schritt weiter - -w151: L 11 // Nächsten Zyklus Schritt 0 (Ausfahren ok?) - T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll - - BEU - - ---- NW 25: Schritt 14: Separator Mindestzeit öffnen --- -s014: SET // Weiterschaltbedingung - A Antrieb_aktiv // Kreisel-Antrieb aktiv - = Weiter - -// Schrittaktionen: - SET - S Y_Sep_Auf // Separator öffnen - S Antrieb_start // Kreiselantrieb starten - R Antrieb_stoppen - S Antrieb_plus_start // Kreisel-Antrieb plus starten - - AN Weiter - = Warte_neu // Wartezeit neutriggern - JC w251 - - L 16#B142 - T Dyn.Stop_Ursache - - A Weiter // Weiterschaltbedingung ist erfüllt - R Err_Uebzeit - L Separator.Mindeszeit_Sep_geoeffnet // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - -w251: L 16#B143 - T Dyn.Stop_Ursache - - BEU - - ---- NW 26: Schritt 15: BT ausgefahren ? (Wartezeit bis draussen) --- -s015: SET // Weiterschaltbedingung - A Dyn.BT_draussen // BT/MT hat Separator verlassen -// / U #Antrieb_aktiv //Kreisel-Antrieb aktiv - = Weiter - -// Schrittaktionen: - SET - S Y_Sep_Auf // Separator öffnen - S Antrieb_start // Kreiselantrieb starten - R Antrieb_stoppen - S Antrieb_plus_start // Kreisel-Antrieb plus starten - - A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - R Err_Uebzeit - R Dyn.Error.Err_BT_raus // BT/MT fährt nicht aus - L 16 // Weiter mit Schritt 16 (MT 1.Achse,...) - JC Neu_Mig // Bei diesem Schritt weiter - - A Err_Uebzeit - S Dyn.Error.Err_BT_raus // BT/MT fährt nicht aus - - L 16#B152 - T Dyn.Stop_Ursache - - AN Antrieb_aktiv // Kreisel-Antrieb aktiv - JC x150 - - L 16#B153 - T Dyn.Stop_Ursache - - AN Dyn.BT_draussen // BT/MT hat Separator verlassen - JC x150 - - L 16#B154 - T Dyn.Stop_Ursache - - AN Antrieb_aktiv // Kreisel-Antrieb aktiv - JC x150 - -x150: A Antrieb_aktiv - = Ueb_akt // Überwachungszeit aktivieren - L 150 // Angabe der Überwachungszeit (*100ms) - JU tueb // Überwachungszeit - - ---- NW 27: Schritt 16: BT ist draussen --- -s016: SET // Weiterschaltbedingung - = Weiter - -// Schrittaktionen: - SET - S Dyn.BT_gestartet // BT ist aus Separator gestartet (nur 1 Zyklus) - -// Belade-Check nach Sep?: - A Separator.Parameter_allg.Belade_Kontrolle_nachSep // Belade-Kontrolle vorhanden nach Separator - A( - O Dyn.Status.Betriebsart_Art.BT_leer // BT/MT ist leer - O Dyn.Status.Betriebsart_Art.BT_beladen - ) - L 19 // Weiter mit Schritt 19 - JC Neu_Mig // Bei diesem Schritt weiter - -// Scannerdaten löschen: - SET - R Dyn.Scannerdaten // Scannerdaten erhalten - - L 0 // IDX löschen, da BT vereinzelt wurde - T Dyn.Scanner.Send_IDX // damit neue IDX geholt wird - T Dyn.Scanner.Rec_IDX - T Dyn.Scanner.Rec_DEST_Ziel - T Dyn.Scanner.Rec_DEST_Type - - JU ENDE_Mig - - ---- NW 28: Schritt 17: Daten in FIFO eintragen --- -s017: L 16#B171 - T Dyn.Stop_Ursache - - A Max_Uebergabe // MaxWert wird gerade übertragen ! - BEC - -// Vereinzelungstakte +1: - L Dyn.Status.Vereinzelungstakte - L 1 - +D - T Dyn.Status.Vereinzelungstakte - - L 0 // negativer Wert ? - >=D // Nein ! - JC W230 - - L Dyn.Status.Vereinzelungstakte - L 1 - -D // damit wieder pos.Wert ! - T Dyn.Status.Vereinzelungstakte - -// Letztes angefahrnes Ziel speichern/Rücksetz-Inks speichern: -W230: L 0 - T SAVE.Last_Ziel // Letztes angefahrenes Ziel erst mal löschen - - L Separator.Abstand_Zielwechsel // Abstand bei Zielwechsel [inc] - L 0 // sinnvolle Angabe ? - <=I // Nein ! - JC W231 - - L Dyn.Scanner.Rec_DEST_Ziel // Ziel - T SAVE.Last_Ziel // Letztes angefahrenes Ziel speichern - - L Separator.Abstand_Zielwechsel // Abstand bei Zielwechsel [inc] - ITD - L Ink_Wert // Aktuelle Inkrementalwert - +D - T Dyn.Del_Last_Ziel_Ink // Bei diesen Inks letztes Ziel löschen - A Lauf_Flag - = Dyn.Del_Last_Ziel_Flag // Bei diesem Flag letzes Ziel löschen - L Dyn.Max_Wert // Maximal erlaubter Zählwert - >D - JCN W231 - - -D // Restwert übernehmen - T Dyn.Del_Last_Ziel_Ink // Bei diesen Inks letztes Ziel löschen - AN Lauf_Flag // Aktuelles Lauf-Flag invertieren, da Überlauf ! - = Dyn.Del_Last_Ziel_Flag // Bei diesem Flag letzes Ziel löschen - -// Daten für Eintrag vorbereiten: -W231: L Ink_Wert // Aktueller Ink-Wert - T "MD210" // Start-Ink (für Rückkontrolle) - L 0 - T "MW214" - A Lauf_Flag - = "M214.0" - L Dyn.Scanner.Rec_DEST_Type // Ziel-Typ - L 3 // Letztes Teil vom Block ? - ==I // Ja ! - = "M214.2" // Letztes Teil vom Block gestartet - - L Dyn.Scanner.Rec_IDX // IDX - T "MD216" - L 0 // angegeben ? - <>I // Ja ! - JC u233 - -// z.Bsp. bei Default-Ziel: - L "SGes".IDX - + DINT#1 - T "SGes".IDX - T "MD216" - -u233: L Dyn.Scanner.Rec_DEST_Ziel // Ziel - T "MW220" - - L Dyn.Status.Betriebsart_Ziel // Fest-Ziel für BTs (ohne PC) - L 0 // vorgegeben ? (dann keine Einlagermeldung an PC) - ==I // Nein ! - L Separator.PC_Komm_SorterID // ID für PC-Kommunikation - JC w233 - - L 0 // Keine Angabe - -w233: T "MW222" - - L 0 // Restliche Daten löschen - T "MW224" - T "MW226" - T "MW228" - T "MW230" - -CALL FC "FifoIn" (SSDB:=Separator.Parameter_SorterRein.TravelFIFO_DB, SSDW:=Separator.Parameter_SorterRein.TravelFIFO_DW, PARA:=WORD#16#0000, INDATEN:=P#M210.0, RE_VAL:="MB199") // Daten speichern - - L "MB199" - T Dyn.Rueckmld.RET_VAL_TravelFIFO_In - - JBI w232 - - SET - S Dyn.Error.Daten_out // Letzte Carrier-Daten konnten nicht an Travel-FIFO übergeben werden - - L 16#B172 - T Dyn.Stop_Ursache - - BEU - -w232: L 14 // Weiter mit Schritt 14 - JU Neu_Mig // Bei diesem Schritt weiter - - ---- NW 29: Schritt 19: Belade-Check --- -s019: SET - S Antrieb_start - R Antrieb_stoppen - A Separator.Parameter_allg.Antrieb_Plus_vorhanden // Separator an weiterem Antrieb (Weiche) - S Antrieb_plus_start // Kreisel-Antrieb plus starten - - A Dyn.Status.Betriebsart_Art.BT_beladen // BT/MT ist beladen - A Dyn.BT_beladen // BT ist beladen - JC X199 // Alles ok! - - A Dyn.Status.Betriebsart_Art.BT_leer // BT/MT ist leer - A Dyn.BT_beladen // BT ist beladen - JC X19E // Leerer BT ist beladen! - - A Err_Uebzeit // Ohne Verlassen-Sensor nach 1 s - O Separator.Parameter_allg.B_AusSep_vorhanden // Sensor BT hat Separator verlassen ist eingebaut - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - R Err_Uebzeit - JC X190 - - A Antrieb_aktiv - = Ueb_akt // Überwachungszeit aktivieren - L 10 // Angabe der Überwachungszeit (*100ms) - JU tueb // Überwachungszeit - -// BT am Belade-Sensor vorbei: -X190: A Dyn.Status.Betriebsart_Art.BT_leer // BT/MT ist leer - JC X199 // Alles ok! - -// Also Beladener BT ist leer! -// Fehler-Telegramm an PC: -X19E: NOP 0 -// BT-Belade-Info an PC mitsenden: - A Dyn.Status.Betriebsart_Art.BT_leer // BT/MT ist leer (also bei Error beladen!) - L 6 // beladen - JC X191 - - L 4 // Leerer BT - -X191: T BT_State // Beladezustand des BTs - - L 'LERR' - T "MD214" // Telegramm-Kennung - L 33 - T "MW218" // Anzahl Bytes - L Separator_Nr - T "MD220" // Sep-ID - L Dyn.Scanner.Send_IDX - T "MW224" // Carrier-IDX - L BT_State // Beladezustand des BTs - T "MB226" // Carrier-Type - L 0 - T "MB227" // Scan-State - L 0 - T "MD228" // Barcode - L 16#0003 - T "MB232" // ETX - - L 0 // Rest nullen - T "MB233" - T "MB234" - T "MB235" - T "MB236" - T "MB237" - T "MB238" - T "MB239" - - SET - R Dyn.Error.Send_FIFO_voll // Send-FIFO zu PC ist voll - R Dyn.Error.Send_FIFO_fehlerhaft // Send-FIFO fehlerhaft - -CALL FC "FifoIn" (SSDB:=Separator.PC_Send_FIFO, SSDW:=0, PARA:=WORD#16#0000, INDATEN:=P#M214.0, RE_VAL:="MB199") // Send-FIFO für PC-Sendungen - - L "MB199" - T Dyn.Rueckmld.RET_VAL_SendFIFO - - JBI X199 - - SET // Bei Problem - R K_Sanner_triggern // Scanner triggern ausschalten - - A "M199.2" - JCN X192 - - SET - S Dyn.Error.Send_FIFO_voll // Send-FIFO zu PC ist voll - - L 16#B191 - T Dyn.Stop_Ursache - - BEU // Warten - -X192: SET - S Dyn.Error.Send_FIFO_fehlerhaft // Send-FIFO fehlerhaft - - L 16#B192 - T Dyn.Stop_Ursache - - BEU - -// Scannerdaten löschen: -X199: SET - R Dyn.Scannerdaten // Scannerdaten erhalten - R Dyn.Status.Betriebsart_Art.BT_leer // BT/MT ist leer - R Dyn.Status.Betriebsart_Art.BT_beladen // BT/MT ist beladen - - L 0 // IDX löschen, da BT vereinzelt wurde - T Dyn.Scanner.Rec_IDX // Daten für gesendete IDX empfangen ? - T Dyn.Scanner.Send_IDX // IDX noch vorhanden, da BT nicht vereinzelt wurde - - JU ENDE_Mig - - ---- NW 30: Schritt 20: Separator resetten --- -s020: SET // Weiterschaltbedingung - = Weiter // Weiterschaltbedingung ist erfüllt - -// Schrittaktionen: - SET // ELS in Grundstellung fahren - S Antrieb_start // Kreiselantrieb starten - R Antrieb_stoppen - - L 16#B201 - T Dyn.Stop_Ursache - - A Weiter // Weiterschaltbedingung ist erfüllt - L 300 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - SET - = Ueb_akt // Überwachungszeit aktivieren - L 30 // Angabe der Überwachungszeit (*100ms) - JU tueb // Überwachungszeit - - ---- NW 31: Schritt 21: Reset ist zu Ende --- -s021: SET - R Dyn.Sk.Reset_Akt // Reset ist aktiv - - JU ENDE_Mig // Neubeginn - - ---- NW 32: Schritt 23: GesamtSorter-Reset: Start-Ink speichern --- -s023: SET // Weiterschaltbedingung - = Weiter - -// Schrittaktionen: - L Dyn.Max_Wert - L DINT#0 - <=D - O Max_Uebergabe // MaxWert wird gerade übertragen ! - BEC - - L Separator.Parameter_SorterRein.Abstand_Reset_Start // Nach diesen Abstand kann Gesamt-Reset gestartet werden [*10inc] - ITD - L Ink_Wert // Aktuelle Inkrementalwert - +D - T Dyn.SorterReset_Start_Ink // Bei diesen Inks Sorter-Reset starten - A Lauf_Flag - = Dyn.SorterReset_Start_Flag // Bei diesem Flag Sorter-Reset starten - L Dyn.Max_Wert // Maximal erlaubter Zählwert - >D - JCN W291 - - -D // Restwert übernehmen - T Dyn.SorterReset_Start_Ink // Bei diesen Inks Sorter-Reset starten - AN Lauf_Flag // Aktuelles Lauf-Flag invertieren, da Überlauf ! - = Dyn.SorterReset_Start_Flag // Bei diesem Flag Sorter-Reset starten - -W291: A Weiter // Weiterschaltbedingung ist erfüllt - R Dyn.Sk.Err_Uebzeit // Sofort weiter ! - R Err_Uebzeit - L 0 // Angabe der Wartezeit (*10ms) - JC Plus // Nächsten Schritt starten - - CLR - = Ueb_akt // Überwachungszeit aktivieren - L 50 // Angabe der Überwachungszeit (*100ms) - JU tueb // Überwachungszeit - - BEU - - ---- NW 33: Schritt 24: GesamtSorter-Reset: Start-Ink erreicht ? --- -// Schrittaktionen: -s024: L 16#B241 - T Dyn.Stop_Ursache - - SET - S Antrieb_start // Kreiselantrieb starten - R Antrieb_stoppen - S Antrieb_plus_start - - A ErrQuit - R Dyn.Error.Err_BT_raus // BT/MT fährt nicht aus - - A Max_Uebergabe // MaxWert wird gerade übertragen ! - BEC - - A Dyn.SorterReset_Start_Flag // Bei diesem Flag Sorter-Reset starten - A Flag_Lauf_fertig // Flag-Lauf wurde beendet - O - AN Dyn.SorterReset_Start_Flag // Bei diesem Flag Sorter-Reset starten - A Ohne_Lauf_fertig // Flag-Lauf wurde beendet - JC W300 // beim Ende des Lauf sind Inkremente uninteressant - - A Dyn.SorterReset_Start_Flag // Bei diesem Flag Sorter-Reset starten - AN Lauf_Flag // Zähl-Lauf mit Flag ist aktiv - O - AN Dyn.SorterReset_Start_Flag // Bei diesem Flag Sorter-Reset starten - A Lauf_Flag // Zähl-Lauf mit Flag ist aktiv - L 16#B242 - T Dyn.Stop_Ursache - BEC - - L Ink_Wert // Aktuelle Inkrementalwert - L Dyn.SorterReset_Start_Ink // Bei diesen Inks Sorter-Reset starten - sofort weiter - JC w220 - - AN Warte_neu // Wartezeit neutriggern - JC W220_Mig - - L 0 - T Dyn.Sk.Tok_Zelle // Wartezeit - -W220_Mig: A Warte_stop // Wartezeit stoppen - BEC - - L Dyn.Sk.Tok_Zelle - L "MW4" // Wartezeit +10ms - +I - T Dyn.Sk.Tok_Zelle // Wartezeit - L Dyn.Sk.T_ok // abgelaufen ? - I // abgelaufen ? - AN Dyn.Sk.Err_Uebzeit - JC en24 // Nein ! - - A Ueb_akt // Überwachungszeit aktivieren - S Dyn.Sk.Err_Uebzeit - - L 0 // Zeitwert löschen - T Dyn.Sk.Terr_Zelle - - BEU - -en24: NOP 0 - ---- NW 38: Überwachungszeit +1 --- - AN Dyn.Sk.Ueb_akt // Schrittaktion ist aktiv - ON "100ms-Impuls" - BEC - - L Dyn.Sk.Terr_Zelle - L "MW2" - +I - T Dyn.Sk.Terr_Zelle - - BEU - - ---- NW 39: Ende --- - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Module/MSorter_Uebergabe.awl b/=A01+UH07-KF00/Programmbausteine/Module/MSorter_Uebergabe.awl index f1911b7..f11f08b 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/MSorter_Uebergabe.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/MSorter_Uebergabe.awl @@ -1,574 +1,654 @@ -=== FB 180: MSorter_Uebergabe [STL] === -INTERFACE: - Input: - Uebergabe_Nr : Int // Aufruf für Übergabe - KorrekturFaktor : Real // Korrektur-Faktor wegen Kettenlängung - ErrQuit : Bool // Ablaufstörung quittieren - Antrieb_aktiv : Bool // Kreisel-Antrieb aktiv - Output: - Error : Word // Störungen übergeben - InOut: - Antrieb_start : Bool // Kreiselantrieb starten - Antrieb_stoppen : Bool // Kreiselantrieb stoppen - hStOk : Bool // Anzeige Start n. Störung aktivieren - Static: - SAVE : Struct - Last_Sort_ID : Int - Res : Array[1..3] of Int // Reserve - Para : Struct // Parameter - Uebergabe_DL_DB : Int // Einsprung Weichen-Datenliste-DB - Uebergabe_DL_DW : Int // Einsprung Weichen-Datenliste-DW - Res1 : Array[1..3] of Int // Reserve - Uebergabe : "UDLUebergabe" // Fahrbereichs Daten - Dyn : Struct // Dynamische Daten fürs Einfahren - Status : Struct // Status - BT_Daten_vorhanden : Bool // Daten für Travel-FIFO vorhanden - Reset : Bool := TRUE // Reset Einfahrseite starten - Rueckmld : Struct - RET_VAL_BLKMOV_Uebergabe : Int // Rückmeldung nach BLKMOV-Aufruf - RET_VAL_DL_Weichen : Byte // Rückmeldung nach DatenOut-Aufruf - RET_VAL_Sortliste_Out : Byte // Rückmeldung nach Sortdaten-Out-Aufruf - RET_VAL_TravelFIFO_In : Byte // Rückmeldung nach Travel-FIFO-In-Aufruf - RET_VAL_SendFIFO : Byte // Rückmeldung nach SendPC_FIFO-Aufruf - Error : "UErrUebergabe" - Ink_Wert : DInt // Aktueller Inkrementalwert - Max_Wert : DInt // Maximal erlaubter Zählwert - Lauf_Flag : Bool // Zähl-Lauf mit Flag ist aktiv - Flag_Lauf_fertig : Bool // Flag-Lauf wurde beendet - Ohne_Lauf_fertig : Bool // Ohne Flag-Lauf wurde beendet - Hauptstrang_Flag : Bool // Flag zum Weiche schalten (vom Hauptstrang) - FIFO_Flag : Bool // Flag zum Weiche schalten (von Rein-FIFO) - Save_Flag : Bool // Flag zum Daten in Sortliste speichern - Last_Flag : Bool // Flag des letzten durchfahrenden Teils - Hauptstrang_Ink : DInt // Inkremente zum Weiche schalten (vom Hauptstrang) - Hauptstrang_Sortliste : Int // Sortliste aus welcher Hauptstrangdaten sind - Hauptstrang_Search_Ink : DInt // Inkremente zum Daten auslesen (Start-Ink) - Hauptstrang_Pos : Int // Aktuelle Position der Daten in Datenliste - Last_Ink : DInt // Inkremente des letzten durchfahrenden Teils - Last_IDX : DInt := -1 // IDX des letzten durchfahrenden Teils - Last_Ziel : Int := -1 // Ziel des letzten durchfahrenden Teils - Save_Ink : DInt // Inkremente zum Daten in Sortliste speichern - Res1 : Array[1..6] of Int // Reserve - Daten : "UBT_Daten" - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Del : Bool // Nur Sortdaten löschen - FC86_Para : Word // Parameter-Übergabe - Hauptstrang_Ink : DInt // Inkremente zum Weiche schalten (vom Hauptstrang) - Parameter : Word // Parameter - Freigabe : Int - DatenDB : Int // DB öffnen - Constant: - ---- NW 1: Parameter-Übergabe --- - L Uebergabe_Nr // Aufruf-Parameter (für Baustein beobachten) - - L "MW178" // Einsprung Übergabe-DL - T Para.Uebergabe_DL_DB - L 0 - T Para.Uebergabe_DL_DW - - ---- NW 2: Gesamt: Out-Bits zum Zurücksetzen --- - SET - - ---- NW 3: - --- - AN Dyn.Status.Reset - JC En06 - -// Dyn.Daten löschen: - SET - R Dyn.Status.Reset - R Dyn.Hauptstrang_Flag - R Dyn.FIFO_Flag - R Dyn.Save_Flag - R Dyn.Last_Flag - - L 0 - T Dyn.Hauptstrang_Ink - T Dyn.Hauptstrang_Search_Ink - T Dyn.Last_Ink - T Dyn.Save_Ink - - L 0 - T Dyn.Hauptstrang_Sortliste - T Dyn.Last_IDX - T Dyn.Last_Ziel - -// Rückmeldungen löschen: - L 0 - T Dyn.Rueckmld.RET_VAL_TravelFIFO_In - -// Störungen löschen: - SET - R Dyn.Error.Uebergabe_DL - R Dyn.Error.Undef_Uebergabe - R Dyn.Error.BLKMov - R Dyn.Error.Haupstrang_DL - R Dyn.Error.Keine_HSDaten - R Dyn.Error.Travel_FIFO_ERR - R Dyn.Error.Travel_FIFO_voll - R Dyn.Error.Frei07 - R Dyn.Error.Frei10 - R Dyn.Error.Frei11 - R Dyn.Error.Frei12 - R Dyn.Error.Frei13 - R Dyn.Error.Frei14 - R Dyn.Error.Send_FIFO_fehlerhaft - R Dyn.Error.Send_FIFO_voll - R Dyn.Error.Reset_aktiv // Reset ist aktiv - - L 0 // Damit statische Werte neu aus Datenbank geholt werden ! - T Uebergabe.Uebergabe_Nr // Nummer der Übergabe - - BEU - -En06: NOP 0 - - ---- NW 4: Störungen nach Außen übergeben --- - L 0 - T "MW200" - - A Dyn.Error.Uebergabe_DL // Weichen-Datenliste fehlerhaft - = "M200.0" - A Dyn.Error.Undef_Uebergabe // undefinierte Weiche - = "M200.1" - A Dyn.Error.BLKMov // Fehler bei Block kopieren - = "M200.2" - A Dyn.Error.Haupstrang_DL // Haupstrang-Datenliste fehlerhaft - = "M200.3" - A Dyn.Error.Keine_HSDaten // Keine Hauptstrang-Daten mehr vorhanden - = "M200.4" - A Dyn.Error.Travel_FIFO_ERR // Rein-FIFO fehlerhaft - = "M200.5" - A Dyn.Error.Travel_FIFO_voll // Keine Rein-Daten mehr vorhanden - = "M200.6" - A Dyn.Error.Frei07 - = "M200.7" - A Dyn.Error.Frei10 - = "M201.0" - A Dyn.Error.Frei11 - = "M201.1" - A Dyn.Error.Frei12 - = "M201.2" - A Dyn.Error.Frei13 - = "M201.3" - A Dyn.Error.Frei14 - = "M201.4" - A Dyn.Error.Send_FIFO_fehlerhaft - = "M201.5" - A Dyn.Error.Send_FIFO_voll - = "M201.5" - CLR // Reset ist aktiv (gibts nicht!) - = Dyn.Error.Reset_aktiv - = "M201.7" - - L "MW200" - T Error // Schnittstelle nach Außen - -// Antrieb stoppen: - A( - O Dyn.Error.Travel_FIFO_ERR // Daten-Übergabe fand nicht statt -> Antrieb stoppen) - O Dyn.Error.Travel_FIFO_voll // Daten-Übergabe fand nicht statt -> Antrieb stoppen) - ) - AN ErrQuit - S Antrieb_stoppen // Kreiselantrieb stoppen - -// Anzeige Start n. Störung aktivieren: - A Dyn.Error.Travel_FIFO_ERR // Daten-Übergabe fand nicht statt -> Antrieb stoppen) - O Dyn.Error.Travel_FIFO_voll // Daten-Übergabe fand nicht statt -> Antrieb stoppen) - S hStOk - - ---- NW 5: Statische Übergabe-Parameter holen --- - L Uebergabe.Uebergabe_Nr // Nummer der Übergabe - L Uebergabe_Nr // Aufruf-Parameter - ==I // Identisch ? - R Dyn.Error.Uebergabe_DL // Weichendatenbank fehlerhaft - R Dyn.Error.Undef_Uebergabe // undefinierte Weiche - JC en06_Mig // Ja ! - - T "MW200" // Search-Daten - -CALL FC "DatenOut" (SSDB:=Para.Uebergabe_DL_DB, SSDW:=Para.Uebergabe_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196") - - L "MB199" - T Dyn.Rueckmld.RET_VAL_DL_Weichen // Rückmeldung bei Datenbank-Zugriff (Gefälle-DL) - - JBI G_Ok - - A "M199.0" - = Dyn.Error.Uebergabe_DL // Weichendatenbank fehlerhaft - BEC - - SET - S Dyn.Error.Undef_Uebergabe // undefinierte Weiche - - BEU - -// Kennung + Datenbytes -G_Ok: SET - R Dyn.Error.Uebergabe_DL // Weichendatenbank fehlerhaft - R Dyn.Error.Undef_Uebergabe // undefinierte Weiche - - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 40 // Datenwords speichern - T LW2 // Wiederholungen - -// Quelle-Pointer erzeugen: - L 0 // Bei Merker = 0 ! - T LW4 // DB_Nummer - L 220 // Adresse - SLD 3 - L 16#8300_0000 // Kennung: Merker - OD - T LD6 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_Uebergabe, DSTBLK:=Uebergabe) // Datenliste-Daten speichern | #Ziel - - L Dyn.Rueckmld.RET_VAL_BLKMOV_Uebergabe // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Dyn.Error.BLKMov // Error bei Block kopieren - BEC - - L Uebergabe.Uebergabe_Typ // Übergabentyp = 180 (Übergabe) - L 180 // Dieser Aufruf-FB ? - ==I // Ja ! - JC en06_Mig - - SET - S Dyn.Error.Undef_Uebergabe // undefinierte Weiche - - L 0 // Übergabe ungültig ! - T Uebergabe.Uebergabe_Nr // Nummer der Übergabe - - BEU - -en06_Mig: NOP 0 - - ---- NW 6: Daten des Inkremental-Gebers holen / Zeit-Inkremente --- - L Uebergabe.Ink_DB // DB-Nr des Inkremental-Geber - L 0 // angegeben ? - <=I // Nein ! - JC w040 - - CAC - T "MW200" - OPN DB["MW200"] // Zähler-DB öffnen - L DBD80 - T Dyn.Ink_Wert - L DBD76 - T Dyn.Max_Wert - A DBX74.3 - = Dyn.Lauf_Flag - A DBX74.4 - = Dyn.Flag_Lauf_fertig - A DBX74.5 - = Dyn.Ohne_Lauf_fertig - - JU en04 - -// Zeit-Inkremente erzeugen: -w040: AN Antrieb_aktiv - JC w041 - - L "MW4" // 10ms-Takte - ITD - L Dyn.Ink_Wert - +D // Aktueller Zählerwert +100ms-Takte - T Dyn.Ink_Wert - -w041: L 10000 // Festwert: 10000 (100s) - T Dyn.Max_Wert - - L Dyn.Ink_Wert // Aktueller Zählerwert - L Dyn.Max_Wert // Max. Wert erreicht ? - <=D // Nein ! - R Dyn.Ohne_Lauf_fertig // Ohne Flag-Lauf wurde beendet - R Dyn.Flag_Lauf_fertig // Flag-Lauf wurde beendet - JC en04 - - -D // Restwert als Startwert nehmen ! - T Dyn.Ink_Wert - - AN Dyn.Lauf_Flag // Umschaltung Zähl-Lauf ohne-mit-ohne Flag - = Dyn.Ohne_Lauf_fertig // Ohne Flag-Lauf wurde beendet - A Dyn.Lauf_Flag // Umschaltung Zähl-Lauf ohne-mit-ohne Flag - = Dyn.Flag_Lauf_fertig // Flag-Lauf wurde beendet - - AN Dyn.Lauf_Flag // Umschaltung Zähl-Lauf ohne-mit-ohne Flag - = Dyn.Lauf_Flag - -en04: NOP 0 - - ---- NW 7: - --- - AN ErrQuit -// / CLR ///09.09.18, da Störung ohnehin nicht behebbar - JC En07 // /Am 21.12.18 aufgrund vom Kundenwunsch wieder wie früher - - SET - R Dyn.Status.Reset - -// Störungen löschen: - SET - R Dyn.Error.Keine_HSDaten - R Dyn.Error.Travel_FIFO_ERR - R Dyn.Error.Travel_FIFO_voll - -En07: NOP 0 - - ---- NW 8: Übergabepunkt aufgrund von Hauptstrangdaten suchen --- - L Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - L 0 // schon bekannt ? - >D // Ja ! - JC Nw09 - - L Uebergabe.Hauptstrang_DL_DB // Sortlisten-DB für diese Weiche (Hauptstrang) - L 0 // Sinnvolle Angabe ? - <=I // Nein ! - O( - L Uebergabe.Hauptstrang_DL_DW // Sortlisten-DW für diese Weiche (Hauptstrang) - L 0 // Sinnvolle Angabe ? - D // Gleiches Flag/Flag wie Inkgeber zum Suchen - JC w071 - -// Anders Flag/Liste wie Inkgeber zum Suchen: - L Uebergabe.Hauptstrang_DL_DB - - A Dyn.Lauf_Flag // Inkgeber schon mit Lauf-Flag - JC w070 - - + 1 - -w070: T Dyn.Hauptstrang_Sortliste // Sortliste aus welcher Hauptstrangdaten sind - - JU w073 - -// Gleiches Flag/Liste wie Inkgeber zum Suchen: -w071: L Uebergabe.Hauptstrang_DL_DB - - AN Dyn.Lauf_Flag // Inkgebeer ohne Lauf-Flag - JC w072 - - + 1 - -w072: T Dyn.Hauptstrang_Sortliste // Sortliste aus welcher Hauptstrangdaten sind - -// Hauptstrang Sortliste nach Position -1 durchsuchen: -w073: CALL FC "DatenFindOffsetSort" (SSDB:=Dyn.Hauptstrang_Sortliste, SSDW:=Uebergabe.Hauptstrang_DL_DW, PARA:=WORD#16#0B01, SEARCHDATEN:=Uebergabe.Position_minus, RE_VAL:="MB199", OUTDATEN:=Daten, Position:="MW196") // nach 11.DW (letzte Position) suchen - - L "MB199" - T Dyn.Rueckmld.RET_VAL_Sortliste_Out - - A "M199.7" // Datensatz ist vorhanden - R Dyn.Error.Haupstrang_DL // Sortliste fehlerhaft - JC w074 - - A "M199.6" // Datensatz ist nicht vorhanden - R Dyn.Error.Haupstrang_DL // Sortliste fehlerhaft - JC Xn08 // Warten, da noch keine Daten vorhanden - - SET - S Dyn.Error.Haupstrang_DL // Sortliste fehlerhaft - -w076: L 0 // Keine Daten auf Hauptstrang vorhanden - T Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - - JU Xn08 - -// Search-Ink speichern: -w074: L Daten.Start_Ink // Stamm-Daten speichern - T Dyn.Hauptstrang_Search_Ink // Inkremente zum Daten auslesen (Start-Ink) - -// Hauptstrang-Schaltdaten errechnen/speichern: -// Kettenlängungs-Korrektur: - L KorrekturFaktor // Korrektur-Faktor wegen Kettenlängung - L 0.95 // sinnvoller Wert ? (maximal 5% Abweichung erlaubt) - >=R // Ja ! - A( - CAC - L 1.05 - <=R - ) - JC w075 - - L 1.0 // dann ohne Korrektur ! - T KorrekturFaktor // Korrektur-Faktor wegen Kettenlängung - -// Schaltdaten errechnen: -w075: A Daten.Start_Flag // Lauf-Flag bei Start-Inkremente - = Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang) - - L Uebergabe.Off_Ink // Inkremente zum Weiche schalten - DTR - L KorrekturFaktor // Korrektur-Faktor wegen Kettenlängung - *R - RND - L Daten.Start_Ink // Daten aus Sortliste dazuaddieren - +D - T Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - L Dyn.Max_Wert // Maximal erlaubter Zählwert - >D - JCN Xn08 - - -D // Restwert übernehmen - T Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - - AN Daten.Start_Flag // Lauf-Flag bei Start-Inkremente (invertieren) - = Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang) - - ---- NW 9: Hauptstrangdaten auslesen --- -Nw09: L Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - L 0 // angegeben ? - ==D // Nein ! - JC Xn08 - - Antrieb stoppen) - JC en08 - - SET - S Dyn.Error.Travel_FIFO_ERR // Daten-Übergabe fand nicht statt -> Antrieb stoppen) - - JU en08 - -w8Ok: SET - R Dyn.Status.BT_Daten_vorhanden // Daten für Travel-FIFO vorhanden - -w08E: L 0 - T Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - -en08: NOP 0 - - ---- NW 11: Antrieb einschalten --- - L Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - L 0 // schon bekannt ? - >D // Ja ! - S Antrieb_start // Kreiselantrieb starten - - ---- NW 12: Ende --- - BE +FUNCTION_BLOCK "MSorter_Uebergabe" +TITLE = Übergabe-Modul +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-960629 +// +//Version: CDDC / 02.2020 +//-Daten werden immer in Travel-FIFO+1 übergeben +// +//Version: ILS2100 / 04.2016 +//-Daten werden bei Sensor-Signal (zielunabhängig) in Travel-FIFO+1 übergeben. +// + VAR_INPUT + Uebergabe_Nr : Int; // Aufruf für Übergabe + KorrekturFaktor : Real; // Korrektur-Faktor wegen Kettenlängung + ErrQuit : Bool; // Ablaufstörung quittieren + Antrieb_aktiv : Bool; // Kreisel-Antrieb aktiv + END_VAR + + VAR_OUTPUT + Error : Word; // Störungen übergeben + END_VAR + + VAR_IN_OUT + Antrieb_start : Bool; // Kreiselantrieb starten + Antrieb_stoppen : Bool; // Kreiselantrieb stoppen + hStOk : Bool; // Anzeige Start n. Störung aktivieren + END_VAR + + VAR + SAVE : Struct + Last_Sort_ID : Int; + Res : Array[1..3] of Int; // Reserve + END_STRUCT; + Para : Struct // Parameter + Uebergabe_DL_DB : Int; // Einsprung Weichen-Datenliste-DB + Uebergabe_DL_DW : Int; // Einsprung Weichen-Datenliste-DW + Res1 : Array[1..3] of Int; // Reserve + END_STRUCT; + Uebergabe : "UDLUebergabe"; // Fahrbereichs Daten + Dyn : Struct // Dynamische Daten fürs Einfahren + Status : Struct // Status + BT_Daten_vorhanden : Bool; // Daten für Travel-FIFO vorhanden + Reset : Bool := TRUE; // Reset Einfahrseite starten + END_STRUCT; + Rueckmld : Struct + RET_VAL_BLKMOV_Uebergabe : Int; // Rückmeldung nach BLKMOV-Aufruf + RET_VAL_DL_Weichen : Byte; // Rückmeldung nach DatenOut-Aufruf + RET_VAL_Sortliste_Out : Byte; // Rückmeldung nach Sortdaten-Out-Aufruf + RET_VAL_TravelFIFO_In : Byte; // Rückmeldung nach Travel-FIFO-In-Aufruf + RET_VAL_SendFIFO : Byte; // Rückmeldung nach SendPC_FIFO-Aufruf + END_STRUCT; + Error : "UErrUebergabe"; + Ink_Wert : DInt; // Aktueller Inkrementalwert + Max_Wert : DInt; // Maximal erlaubter Zählwert + Lauf_Flag : Bool; // Zähl-Lauf mit Flag ist aktiv + Flag_Lauf_fertig : Bool; // Flag-Lauf wurde beendet + Ohne_Lauf_fertig : Bool; // Ohne Flag-Lauf wurde beendet + Hauptstrang_Flag : Bool; // Flag zum Weiche schalten (vom Hauptstrang) + FIFO_Flag : Bool; // Flag zum Weiche schalten (von Rein-FIFO) + Save_Flag : Bool; // Flag zum Daten in Sortliste speichern + Last_Flag : Bool; // Flag des letzten durchfahrenden Teils + Hauptstrang_Ink : DInt; // Inkremente zum Weiche schalten (vom Hauptstrang) + Hauptstrang_Sortliste : Int; // Sortliste aus welcher Hauptstrangdaten sind + Hauptstrang_Search_Ink : DInt; // Inkremente zum Daten auslesen (Start-Ink) + Hauptstrang_Pos : Int; // Aktuelle Position der Daten in Datenliste + Last_Ink : DInt; // Inkremente des letzten durchfahrenden Teils + Last_IDX : DInt := -1; // IDX des letzten durchfahrenden Teils + Last_Ziel : Int := -1; // Ziel des letzten durchfahrenden Teils + Save_Ink : DInt; // Inkremente zum Daten in Sortliste speichern + Res1 : Array[1..6] of Int; // Reserve + END_STRUCT; + Daten : "UBT_Daten"; + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Del : Bool; // Nur Sortdaten löschen + FC86_Para : Word; // Parameter-Übergabe + Hauptstrang_Ink : DInt; // Inkremente zum Weiche schalten (vom Hauptstrang) + Parameter : Word; // Parameter + Freigabe : Int; + DatenDB : Int; // DB öffnen + END_VAR + + +BEGIN +NETWORK +TITLE = Parameter-Übergabe + L #Uebergabe_Nr;//Aufruf-Parameter (für Baustein beobachten) + + L "MW178" ;//Einsprung Übergabe-DL + T #Para.Uebergabe_DL_DB; + L 0; + T #Para.Uebergabe_DL_DW; + +NETWORK +TITLE = Gesamt: Out-Bits zum Zurücksetzen + SET; + +NETWORK +TITLE = Reset +// +// + UN #Dyn.Status.Reset; + SPB En06; + +//Dyn.Daten löschen: + SET; + R #Dyn.Status.Reset; + R #Dyn.Hauptstrang_Flag; + R #Dyn.FIFO_Flag; + R #Dyn.Save_Flag; + R #Dyn.Last_Flag; + + L 0; + T #Dyn.Hauptstrang_Ink; + T #Dyn.Hauptstrang_Search_Ink; + T #Dyn.Last_Ink; + T #Dyn.Save_Ink; + + L 0; + T #Dyn.Hauptstrang_Sortliste; + T #Dyn.Last_IDX; + T #Dyn.Last_Ziel; + +//Rückmeldungen löschen: + L 0; + T #Dyn.Rueckmld.RET_VAL_TravelFIFO_In; + +//Störungen löschen: + SET; + R #Dyn.Error.Uebergabe_DL; + R #Dyn.Error.Undef_Uebergabe; + R #Dyn.Error.BLKMov; + R #Dyn.Error.Haupstrang_DL; + R #Dyn.Error.Keine_HSDaten; + R #Dyn.Error.Travel_FIFO_ERR; + R #Dyn.Error.Travel_FIFO_voll; + R #Dyn.Error.Frei07; + R #Dyn.Error.Frei10; + R #Dyn.Error.Frei11; + R #Dyn.Error.Frei12; + R #Dyn.Error.Frei13; + R #Dyn.Error.Frei14; + R #Dyn.Error.Send_FIFO_fehlerhaft; + R #Dyn.Error.Send_FIFO_voll; + R #Dyn.Error.Reset_aktiv;//Reset ist aktiv + + L 0;//Damit statische Werte neu aus Datenbank geholt werden ! + T #Uebergabe.Uebergabe_Nr;//Nummer der Übergabe + + BEA; + +En06: NOP 0; + +NETWORK +TITLE = Störungen nach Außen übergeben + L 0; + T "MW200"; + + U #Dyn.Error.Uebergabe_DL;//Weichen-Datenliste fehlerhaft + = "M200.0"; + U #Dyn.Error.Undef_Uebergabe;//undefinierte Weiche + = "M200.1"; + U #Dyn.Error.BLKMov;//Fehler bei Block kopieren + = "M200.2"; + U #Dyn.Error.Haupstrang_DL;//Haupstrang-Datenliste fehlerhaft + = "M200.3"; + U #Dyn.Error.Keine_HSDaten;//Keine Hauptstrang-Daten mehr vorhanden + = "M200.4"; + U #Dyn.Error.Travel_FIFO_ERR;//Rein-FIFO fehlerhaft + = "M200.5"; + U #Dyn.Error.Travel_FIFO_voll;//Keine Rein-Daten mehr vorhanden + = "M200.6"; + U #Dyn.Error.Frei07; + = "M200.7"; + U #Dyn.Error.Frei10; + = "M201.0"; + U #Dyn.Error.Frei11; + = "M201.1"; + U #Dyn.Error.Frei12; + = "M201.2"; + U #Dyn.Error.Frei13; + = "M201.3"; + U #Dyn.Error.Frei14; + = "M201.4"; + U #Dyn.Error.Send_FIFO_fehlerhaft; + = "M201.5"; + U #Dyn.Error.Send_FIFO_voll; + = "M201.5"; + CLR;//Reset ist aktiv (gibts nicht!) + = #Dyn.Error.Reset_aktiv; + = "M201.7"; + + L "MW200"; + T #Error;//Schnittstelle nach Außen + +//Antrieb stoppen: + U(; + O #Dyn.Error.Travel_FIFO_ERR;//Daten-Übergabe fand nicht statt -> Antrieb stoppen) + O #Dyn.Error.Travel_FIFO_voll;//Daten-Übergabe fand nicht statt -> Antrieb stoppen) + ); + UN #ErrQuit; + S #Antrieb_stoppen;//Kreiselantrieb stoppen + +//Anzeige Start n. Störung aktivieren: + U #Dyn.Error.Travel_FIFO_ERR;//Daten-Übergabe fand nicht statt -> Antrieb stoppen) + O #Dyn.Error.Travel_FIFO_voll;//Daten-Übergabe fand nicht statt -> Antrieb stoppen) + S #hStOk; + +NETWORK +TITLE = Statische Übergabe-Parameter holen + L #Uebergabe.Uebergabe_Nr;//Nummer der Übergabe + L #Uebergabe_Nr;//Aufruf-Parameter + ==I;//Identisch ? + R #Dyn.Error.Uebergabe_DL;//Weichendatenbank fehlerhaft + R #Dyn.Error.Undef_Uebergabe;//undefinierte Weiche + SPB en06_Mig;//Ja ! + + T "MW200" ;//Search-Daten + + CALL "DatenOut" + ( SSDB := #Para.Uebergabe_DL_DB , + SSDW := #Para.Uebergabe_DL_DW , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := "MW196" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_DL_Weichen;//Rückmeldung bei Datenbank-Zugriff (Gefälle-DL) + + SPBI G_Ok; + + U "M199.0"; + = #Dyn.Error.Uebergabe_DL;//Weichendatenbank fehlerhaft + BEB; + + SET; + S #Dyn.Error.Undef_Uebergabe;//undefinierte Weiche + + BEA; + +//Kennung + Datenbytes +G_Ok: SET; + R #Dyn.Error.Uebergabe_DL;//Weichendatenbank fehlerhaft + R #Dyn.Error.Undef_Uebergabe;//undefinierte Weiche + + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 40;//Datenwords speichern + T %LW2;//Wiederholungen + +//Quelle-Pointer erzeugen: + L 0;//Bei Merker = 0 ! + T %LW4;//DB_Nummer + L 220;//Adresse + SLD 3; + L 16#8300_0000;//Kennung: Merker + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #Dyn.Rueckmld.RET_VAL_BLKMOV_Uebergabe , + DSTBLK := #Uebergabe //#Ziel + ); + + L #Dyn.Rueckmld.RET_VAL_BLKMOV_Uebergabe;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Dyn.Error.BLKMov;//Error bei Block kopieren + BEB; + + L #Uebergabe.Uebergabe_Typ;//Übergabentyp = 180 (Übergabe) + L 180;//Dieser Aufruf-FB ? + ==I;//Ja ! + SPB en06_Mig; + + SET; + S #Dyn.Error.Undef_Uebergabe;//undefinierte Weiche + + L 0;//Übergabe ungültig ! + T #Uebergabe.Uebergabe_Nr;//Nummer der Übergabe + + BEA; + +en06_Mig: NOP 0; + +NETWORK +TITLE = Daten des Inkremental-Gebers holen / Zeit-Inkremente + L #Uebergabe.Ink_DB;//DB-Nr des Inkremental-Geber + L 0;//angegeben ? + <=I;//Nein ! + SPB w040; + + TAK; + T "MW200"; + AUF DB[ "MW200"] ;//Zähler-DB öffnen + L %DBD80; + T #Dyn.Ink_Wert; + L %DBD76; + T #Dyn.Max_Wert; + U %DBX74.3; + = #Dyn.Lauf_Flag; + U %DBX74.4; + = #Dyn.Flag_Lauf_fertig; + U %DBX74.5; + = #Dyn.Ohne_Lauf_fertig; + + SPA en04; + +//Zeit-Inkremente erzeugen: +w040: UN #Antrieb_aktiv; + SPB w041; + + L "MW4" ;//10ms-Takte + ITD; + L #Dyn.Ink_Wert; + +D;//Aktueller Zählerwert +100ms-Takte + T #Dyn.Ink_Wert; + +w041: L 10000;//Festwert: 10000 (100s) + T #Dyn.Max_Wert; + + L #Dyn.Ink_Wert;//Aktueller Zählerwert + L #Dyn.Max_Wert;//Max. Wert erreicht ? + <=D;//Nein ! + R #Dyn.Ohne_Lauf_fertig;//Ohne Flag-Lauf wurde beendet + R #Dyn.Flag_Lauf_fertig;//Flag-Lauf wurde beendet + SPB en04; + + -D;//Restwert als Startwert nehmen ! + T #Dyn.Ink_Wert; + + UN #Dyn.Lauf_Flag;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag + = #Dyn.Ohne_Lauf_fertig;//Ohne Flag-Lauf wurde beendet + U #Dyn.Lauf_Flag;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag + = #Dyn.Flag_Lauf_fertig;//Flag-Lauf wurde beendet + + UN #Dyn.Lauf_Flag;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag + = #Dyn.Lauf_Flag; + +en04: NOP 0; + +NETWORK +TITLE = Störungen quittieren +// +// + UN #ErrQuit; +/// CLR ///09.09.18, da Störung ohnehin nicht behebbar + SPB En07;///Am 21.12.18 aufgrund vom Kundenwunsch wieder wie früher + + SET; + R #Dyn.Status.Reset; + +//Störungen löschen: + SET; + R #Dyn.Error.Keine_HSDaten; + R #Dyn.Error.Travel_FIFO_ERR; + R #Dyn.Error.Travel_FIFO_voll; + +En07: NOP 0; + +NETWORK +TITLE = Übergabepunkt aufgrund von Hauptstrangdaten suchen + L #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + L 0;//schon bekannt ? + >D;//Ja ! + SPB Nw09; + + L #Uebergabe.Hauptstrang_DL_DB;//Sortlisten-DB für diese Weiche (Hauptstrang) + L 0;//Sinnvolle Angabe ? + <=I;//Nein ! + O(; + L #Uebergabe.Hauptstrang_DL_DW;//Sortlisten-DW für diese Weiche (Hauptstrang) + L 0;//Sinnvolle Angabe ? + D;//Gleiches Flag/Flag wie Inkgeber zum Suchen + SPB w071; + +//Anders Flag/Liste wie Inkgeber zum Suchen: + L #Uebergabe.Hauptstrang_DL_DB; + + U #Dyn.Lauf_Flag;//Inkgeber schon mit Lauf-Flag + SPB w070; + + + 1; + +w070: T #Dyn.Hauptstrang_Sortliste;//Sortliste aus welcher Hauptstrangdaten sind + + SPA w073; + +//Gleiches Flag/Liste wie Inkgeber zum Suchen: +w071: L #Uebergabe.Hauptstrang_DL_DB; + + UN #Dyn.Lauf_Flag;//Inkgebeer ohne Lauf-Flag + SPB w072; + + + 1; + +w072: T #Dyn.Hauptstrang_Sortliste;//Sortliste aus welcher Hauptstrangdaten sind + +//Hauptstrang Sortliste nach Position -1 durchsuchen: +w073: CALL "DatenFindOffsetSort" + ( SSDB := #Dyn.Hauptstrang_Sortliste , + SSDW := #Uebergabe.Hauptstrang_DL_DW , + PARA := WORD#16#0B01 , //nach 11.DW (letzte Position) suchen + SEARCHDATEN := #Uebergabe.Position_minus , + RE_VAL := "MB199" , + OUTDATEN := #Daten , + Position := "MW196" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_Sortliste_Out; + + U "M199.7" ;//Datensatz ist vorhanden + R #Dyn.Error.Haupstrang_DL;//Sortliste fehlerhaft + SPB w074; + + U "M199.6" ;//Datensatz ist nicht vorhanden + R #Dyn.Error.Haupstrang_DL;//Sortliste fehlerhaft + SPB Xn08;//Warten, da noch keine Daten vorhanden + + SET; + S #Dyn.Error.Haupstrang_DL;//Sortliste fehlerhaft + +w076: L 0;//Keine Daten auf Hauptstrang vorhanden + T #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + + SPA Xn08; + +//Search-Ink speichern: +w074: L #Daten.Start_Ink;//Stamm-Daten speichern + T #Dyn.Hauptstrang_Search_Ink;//Inkremente zum Daten auslesen (Start-Ink) + +//Hauptstrang-Schaltdaten errechnen/speichern: +//Kettenlängungs-Korrektur: + L #KorrekturFaktor;//Korrektur-Faktor wegen Kettenlängung + L 0.95;//sinnvoller Wert ? (maximal 5% Abweichung erlaubt) + >=R;//Ja ! + U(; + TAK; + L 1.05; + <=R; + ); + SPB w075; + + L 1.0;//dann ohne Korrektur ! + T #KorrekturFaktor;//Korrektur-Faktor wegen Kettenlängung + +//Schaltdaten errechnen: +w075: U #Daten.Start_Flag;//Lauf-Flag bei Start-Inkremente + = #Dyn.Hauptstrang_Flag;//Flag zum Weiche schalten (vom Hauptstrang) + + L #Uebergabe.Off_Ink;//Inkremente zum Weiche schalten + DTR; + L #KorrekturFaktor;//Korrektur-Faktor wegen Kettenlängung + *R; + RND; + L #Daten.Start_Ink;//Daten aus Sortliste dazuaddieren + +D; + T #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + L #Dyn.Max_Wert;//Maximal erlaubter Zählwert + >D; + SPBN Xn08; + + -D;//Restwert übernehmen + T #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + + UN #Daten.Start_Flag;//Lauf-Flag bei Start-Inkremente (invertieren) + = #Dyn.Hauptstrang_Flag;//Flag zum Weiche schalten (vom Hauptstrang) + +NETWORK +TITLE = Hauptstrangdaten auslesen +Nw09: L #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + L 0;//angegeben ? + ==D;//Nein ! + SPB Xn08; + + Antrieb stoppen) + SPB en08; + + SET; + S #Dyn.Error.Travel_FIFO_ERR;//Daten-Übergabe fand nicht statt -> Antrieb stoppen) + + SPA en08; + +w8Ok: SET; + R #Dyn.Status.BT_Daten_vorhanden;//Daten für Travel-FIFO vorhanden + +w08E: L 0; + T #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + +en08: NOP 0; + +NETWORK +TITLE = Antrieb einschalten + L #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + L 0;//schon bekannt ? + >D;//Ja ! + S #Antrieb_start ;//Kreiselantrieb starten + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Module/MStartSync.awl b/=A01+UH07-KF00/Programmbausteine/Module/MStartSync.awl index 481ed67..218d1c5 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/MStartSync.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/MStartSync.awl @@ -1,1322 +1,1450 @@ -=== FB 177: MStartSync [STL] === -INTERFACE: - Input: - Sync_Nr : Int // Aufruf für Weiche - ErrQuit : Bool // Ablaufstörung quittieren - B_BT_da : Bool // Sensor BT ist an Sychronisierstelle - B_RefPunkt : Bool // Sensor RefHaken am Referenzpunkt erkannt - B_TeachPunk : Bool // Sensor RefHaken am Teachpunkt erkannt - Antrieb_aktiv : Bool // Band ist aktiv - Output: - Error : Word // Störungen übergeben - InOut: - Antrieb_start : Bool // Kreiselantrieb starten - hStOk : Bool // Anzeige Start n. Störung aktivieren - Static: - Teil_IDX_Old : Int // BT/MT-IDX (wird bei Auslagerung gemeldet) - Teil_Ziel_Old : Int // BT/MT bei diesem Abwurf-Ziel ausfahren/entladen - Res1 : Array[1..3] of Int // Reserve - SAVE : Struct - Ink_ohne_Zeit : Int // Zeit Inkremntalgeberwert ohne Änderung [100ms] - Para : Struct // Parameter - Weichen_DL_DB : Int // Einsprung Weichen-Datenliste-DB - Weichen_DL_DW : Int // Einsprung Weichen-Datenliste-DW - Offset_RefPunkt : DInt // Offset Refpunkt zu TaschenPunkt (für Teachen) - Res1 : Array[1..1] of Int // Reserve - SyncPkt : "UDLStartSync" // Fahrbereichs Daten - Dyn : Struct // Dynamische Daten - Status : Struct // Status - TeachModus_Aktiv : Bool // Teach-Modus ist aktiv - MoreTeach : Bool // Nächsten Teachpunkt ohne neuen Refpunkt - Res02 : Bool // Reserve - Res03 : Bool // Reserve - Res04 : Bool // Reserve - Res05 : Bool // Reserve - Res06 : Bool // Reserve - Res07 : Bool // Reserve - Res10 : Bool - Res11 : Bool - Res12 : Bool - Res13 : Bool - Res14 : Bool // Reserve - Res15 : Bool // Reserve - Res16 : Bool // Reserve - Res17 : Bool // Reserve - Rueckmld : Struct - RET_VAL_BLKMOV_Sync : Int // Rückmeldung nach BLKMOV-Aufruf - RET_VAL_DL_Weichen_Out : Byte // Rückmeldung nach DatenOut-Aufruf - RET_VAL_Hauptstrang_In : Byte // Rückmeldung nach Hauptstrangdaten-In-Aufruf - RET_VAL_TravelFIFO_In : Byte // Rückmeldung nach Aufruf - RET_VAL_TravelFIFO_Out : Byte // Rückmeldung nach Aufruf - RET_VAL_Teach_OUT : Byte // Rückmeldung bei Datenlisten-Zugriff - RET_VAL_Teach_IN : Byte // Rückmeldung bei Datenlisten-Zugriff - Error : "UErrStartSync" - BT_ausgewertet : Bool // BT wurde schon ausgewertet - TeachPunkt : Int // Punkt zum Ein-Teachen - Refpunkt_ausgewertet : Bool // Referenzpunkt ausgewertet - Refpunkt_ok : Bool // Referenzpunkt erkannt - Teachpunkt_ausgewertet : Bool // Teachpunkt ausgewertet - Reset : Bool // Bereich + FIFO resetten - Ink_Flag : Bool // Laufflag bei Speicherung - Ref_Flag : Bool // Lauf-Flag bei Ref-Inkremente - Teach_Flag : Bool // Lauf-Flag bei Teach-Inkremente - Ende_Flag : Bool // Lauf-Flag bei Synchron-Ende (MT) - FIFO_Flag : Bool // Lauf-Flag bei FIFO-Wechsel (sonst Err) - Stop : Bool // Rein-Separator stoppen - Max_raus : Bool // Max_Wert wurde schon übertragen - InkZelle : DInt // Inkzelle: Sync-Sensor dauernd aktiv - Ref_Ink : DInt // Inkremente bei Referenzpunkt - Teach_Ink : DInt // Inkremente bei Teachpunkt - Ende_Ink : DInt // Inkremente bei Synchron-Ende (MT) - FIFO_Ink : DInt // Inkremente bei FIFO-Wechsel (sonst Err) - Daten : "UBT_Daten" - Max_Wert : DInt // Maximal erlaubter Zählwert - Lauf_Flag : Bool // Zähl-Lauf mit Flag ist aktiv - Flag_Lauf_fertig : Bool // Flag-Lauf wurde beendet - Ohne_Lauf_fertig : Bool // Ohne Flag-Lauf wurde beendet - Ink_Wert : DInt // Aktuelle Inkrementalwert - Abstands_Ink : DInt // Abstands-Inkremente nach Teachen - Sich_Ink : DInt // Übrige Inks, bevor dann gestoppt wird ! - Reserve : Array[1..1] of Int - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Adresse0 : DInt // Für indirekte Adressierung (Offset 0) - Adresse2 : DInt // Für indirekte Adressierung (Offset 0) - Adresse4 : DInt // Für indirekte Adressierung (Offset 4) - Adresse8 : DInt // Für indirekte Adressierung (Offset 8) - Abwurf_DB : Int // Abwurf-DB für 1.Rückschaltung - HaupstranglistenDB : Int // Aktueller Hauptstranglisten-DB - Parameter : Word // Parameter - sB_BT_da : Bool // Sensor BT ist an Sychronisierstelle - ZSW2_ENC : Word - G1_ZSW : Word - G1_XIST1 : DWord - G1_XIST2 : DWord // Positionswert 2, Sensor 1 - STW2_ENC : Word // Steuerwort 2, Encoder - G1_STW : Word // Steuerwort, Sensor 1 - tABS_Resolution : DInt - tInk_Wert : DInt // Aktueller Zählerwert - tSpeicherung : DInt // Speicherung des aktuellen Zählerwerts (für Neustart) - tLastSingelturn_Wert : DInt // Speicherung des letzten Zählerwerts (für Neustart) - tLauf_Flag : Bool // Zähl-Lauf mit Flag ist aktiv - tFlag_Lauf_fertig : Bool // Flag-Lauf wurde beendet - tOhne_Lauf_fertig : Bool // Ohne Flag-Lauf wurde beendet - tNull_laden : Bool // Zähler mit 0000 laden - tQuit : Bool - Constant: - ---- NW 1: Eingangsvariablen einlesen --- - L Sync_Nr - - A B_BT_da - = sB_BT_da - - ---- NW 2: Parameter-Übergabe --- - L Sync_Nr - - L "MW178" // Einsprung Weichen-DL - T Para.Weichen_DL_DB // vor Aufruf übergeben! - L 0 - T Para.Weichen_DL_DW - - ---- NW 3: Gesamt: Out-Bits zum Zurücksetzen / temp --- - AN Dyn.Max_raus // Max_Wert wurde schon übertragen - O Dyn.BT_ausgewertet // BT wurde schon ausgewertet - S Antrieb_start // Kreiselantrieb starten - - - A ErrQuit - O Dyn.Reset // Bereich + FIFO resetten - = tQuit // Für ABS-Modul - - ---- NW 4: Reset --- -// Reset oder Tastendruck: - A ErrQuit - A "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - A Dyn.Error.TravelFIFO_belegt // Travel-FIFO bleibt belegt - S Dyn.Reset // Bereich + FIFO resetten - - A "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - A Dyn.Error.TravelFIFO_leer // keine Daten im Travel-FIFO eingetragen (Auto-Reset!) - AN Dyn.BT_ausgewertet // BT wurde schon ausgewertet - S Dyn.Reset // Bereich + FIFO resetten - - AN Dyn.Reset // Bereich + FIFO resetten - JC en02 - - SET - R Dyn.Reset // Bereich + FIFO resetten - R Dyn.Error.SyncPkt_DL_Err // Sync-Punkt-Datenliste fehlerhaft - R Dyn.Error.Undef_SyncPkt // undefinierter Synchronpunkt - R Dyn.Error.BLKMov // Fehler bei Block kopieren - R Dyn.Error.Sync_Sensor_aktiv // Sync-Sensor dauernd aktiv - R Dyn.Error.TravelFIFO_Err // Travel-FIFO fehlerhaft - R Dyn.Error.TravelFIFO_leer // keine Daten im Travel-FIFO eingetragen - R Dyn.Error.TravelFIFO_belegt // Travel-FIFO bleibt belegt - R Dyn.Error.Hauptstrangliste_Err // Hauptstrangliste fehlerhaft - R Dyn.Error.Hauptstrangliste_voll // Hauptstrangliste ist voll - R Dyn.Error.Inkgeber_Err // Übergabeliste fehlerhaft - R Dyn.Error.Keine_Hauptstrangliste // Keine Hauptstrangliste zum Eintragen angegeben - R Dyn.Error.Keine_TeachPktdaten // Teach-Punkt in Datenliste nicht vorhanden ! - R Dyn.Error.TeachPkt_Datenliste_Err // Teachdatenliste fehlerhaft - R Dyn.Error.Kein_Parameter - R Dyn.Error.Err_Parameter - R Dyn.Error.Inkrementalgeber // Inkrementalgeberwert ohne Änderung - - SET - R Dyn.BT_ausgewertet // BT wurde schon ausgewertet - R Dyn.Status.TeachModus_Aktiv // Teach-Modus ist aktiv - R Dyn.Stop // Rein-Separator stoppen - - L 0 - T Dyn.InkZelle // Inkzelle: Sync-Sensor dauernd aktiv - L 0 - T Dyn.FIFO_Ink // Inkremente bei FIFO-Wechsel (sonst Err) - T Sich_Ink // Übrige Inks, bevor dann gestoopt wird ! - - L 0 // Damit statische Werte neu aus Datenbank geholt werden ! - T SyncPkt.Sync_Nr // Nummer des Sync-Punktes - -// Travel-FIFO zurücksetzen: -CALL FC "FifoReset" (SSDB:=SyncPkt.TravelFIFO_DB, SSDW:=SyncPkt.TravelFIFO_DW, PARA:=WORD#16#0000, RE_VAL:="MB199") // normaler FIFO - - L "MB199" - T Dyn.Rueckmld.RET_VAL_TravelFIFO_Out - - L 0 // Aufruf mit Fehler ? - <>I // Ja ! - = Dyn.Error.TravelFIFO_Err // Error bei FIFO-Zugriff - -// Hauptstrang-Daten zurücksetzen: -CALL FC "DatenResetSort" (SSDB:=SyncPkt.Hauptstrang_DL_DB, SSDW:=SyncPkt.Hauptstrang_DL_DW, RE_VAL:="MB198") - - L SyncPkt.Hauptstrang_DL_DB - + 1 - T HaupstranglistenDB - -CALL FC "DatenResetSort" (SSDB:=HaupstranglistenDB, SSDW:=SyncPkt.Hauptstrang_DL_DW, RE_VAL:="MB199") - - L "MB198" - L "MB199" - L 0 // Aufruf mit Fehler ? - <>I // Ja ! - = Dyn.Error.Hauptstrangliste_Err // Hauptstrang-DL fehlerhaft - - BEU - -en02: NOP 0 - - ---- NW 5: Störungen nach Außen übergeben --- - L 0 - T "MW200" - - A Dyn.Error.SyncPkt_DL_Err // Sync-Punkt-Datenliste fehlerhaft - = "M200.0" - A Dyn.Error.Undef_SyncPkt // undefinierter Synchronpunkt - = "M200.1" - A Dyn.Error.BLKMov // Fehler bei Block kopieren - = "M200.2" - A Dyn.Error.Sync_Sensor_aktiv // Sync-Sensor dauernd aktiv - = "M200.3" - A Dyn.Error.TravelFIFO_Err // Travel-FIFO fehlerhaft - = "M200.4" - A Dyn.Error.TravelFIFO_leer // keine Daten im Travel-FIFO eingetragen - = "M200.5" - A Dyn.Error.TravelFIFO_belegt // Travel-FIFO bleibt belegt - = "M200.6" - A Dyn.Error.Hauptstrangliste_Err // Hauptstrangliste fehlerhaft - = "M200.7" - A Dyn.Error.Hauptstrangliste_voll // Hauptstrangliste ist voll - = "M201.0" - A Dyn.Error.Inkgeber_Err // Inkrementalgeber meldet Störung - = "M201.1" - A Dyn.Error.Keine_Hauptstrangliste // Keine Hauptstrangliste zum Eintragen angegeben - = "M201.2" - A Dyn.Error.Keine_TeachPktdaten // Teach-Punkt in Datenliste nicht vorhanden ! - = "M201.3" - A Dyn.Error.TeachPkt_Datenliste_Err // Teachdatenliste fehlerhaft - = "M201.4" - A Dyn.Error.Kein_Parameter - = "M201.5" - A Dyn.Error.Err_Parameter - = "M201.6" - A Dyn.Error.Inkrementalgeber // Inkrementalgeberwert ohne Änderung - = "M201.7" - - L "MW200" - T Error // Schnittstelle nach Außen - -// Anzeige Start n. Störung aktivieren: - A "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - A( - O Dyn.Error.TravelFIFO_leer // keine Daten im Travel-FIFO eingetragen - O Dyn.Error.TravelFIFO_belegt // Travel-FIFO bleibt belegt - ) - O Dyn.Error.Sync_Sensor_aktiv // Sync-Sensor dauernd aktiv - O Dyn.Error.Inkrementalgeber // Inkrementalgeberwert ohne Änderung - S hStOk - - ---- NW 6: Statische Sync-Parameter holen --- - L SyncPkt.Sync_Nr // Nummer des Synchron-Puntes - L Sync_Nr // Aufruf-Parameter - ==I // Identisch ? - R Dyn.Error.SyncPkt_DL_Err // Sync-Punkt-Datenliste fehlerhaft - R Dyn.Error.Undef_SyncPkt // undefinierter Synchronpunkt - JC en03 // Ja ! - - T "MW200" // Search-Daten - -CALL FC "DatenOut" (SSDB:=Para.Weichen_DL_DB, SSDW:=Para.Weichen_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196") - - L "MB199" - T Dyn.Rueckmld.RET_VAL_DL_Weichen_Out // Rückmeldung bei Datenbank-Zugriff (Gefälle-DL) - - JBI G_Ok - - A "M199.0" - = Dyn.Error.SyncPkt_DL_Err // Sync-Punkt-Datenliste fehlerhaft - BEC - - SET - S Dyn.Error.Undef_SyncPkt // undefinierter Synchronpunkt - - BEU - -// Kennung + Datenbytes -G_Ok: SET - R Dyn.Error.SyncPkt_DL_Err // Sync-Punkt-Datenliste fehlerhaft - R Dyn.Error.Undef_SyncPkt // undefinierter Synchronpunkt - - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 40 // Datenwords speichern - T LW2 // Wiederholungen - -// Quelle-Pointer erzeugen: - L 0 // Bei Merker = 0 ! - T LW4 // DB_Nummer - L 220 // Adresse - SLD 3 - L 16#8300_0000 // Kennung: Merker - OD - T LD6 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_Sync, DSTBLK:=SyncPkt) // Datenliste-Daten speichern | #Ziel - - L Dyn.Rueckmld.RET_VAL_BLKMOV_Sync // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Dyn.Error.BLKMov // Error bei Block kopieren - BEC - - L SyncPkt.Sync_Typ // Synchron-Punkt-Typ = 177 (StartSync) - L 177 // Dieser Aufruf-FB ? - ==I // Ja ! - JC en03 - - SET - S Dyn.Error.Undef_SyncPkt // undefinierter Synchronpunkt - - L 0 // Synchronpunkt ungültig ! - T SyncPkt.Sync_Nr // Nummer des Synchron-Puntes - - BEU - -en03: NOP 0 - - ---- NW 7: Störungen quittieren --- - AN ErrQuit - JC en05 - - SET - R Dyn.Error.Keine_TeachPktdaten // Teach-Punkt in Datenliste nicht vorhanden ! - R Dyn.Error.Hauptstrangliste_voll // Hauptstrangliste ist voll - R Dyn.Error.Keine_Hauptstrangliste // Keine Hauptstrangliste zum Eintragen angegeben - R Dyn.Error.TravelFIFO_leer // keine Daten im Travel-FIFO eingetragen - R Dyn.Error.Inkrementalgeber // Inkrementalgeberwert ohne Änderung - -// Kann nur über Reset zurückgesetzt werden: -// R #Dyn.Error.SyncPkt_DL_Err //Sync-Punkt-Datenliste fehlerhaft -// R #Dyn.Error.Undef_SyncPkt //undefinierter Synchronpunkt -// R #Dyn.Error.BLKMov //Fehler bei Block kopieren -// R #Dyn.Error.Sync_Sensor_aktiv //Sync-Sensor dauernd aktiv -// R #Dyn.Error.TravelFIFO //Travel-FIFO fehlerhaft -// R #Dyn.Error.TravelFIFO_belegt //Travel-FIFO bleibt belegt -// R #Dyn.Error.Hauptstrangliste_Err //Hauptstrangliste fehlerhaft -// R #Dyn.Error.Uebergabeliste_Err //Übergabeliste fehlerhaft -// R #Dyn.Error.TeachPkt_Datenliste_Err //Teachdatenliste fehlerhaft -// R #Dyn.Error.Keine_TeachPktdaten //Keine Teachdaten in Datenliste vorhanden ! -// R #Dyn.Error.Err16 - -// werden weiter unten quittiert: -// R #Dyn.Error.Sync_Sensor_aktiv //Sync-Sensor dauernd aktiv - -en05: NOP 0 - - ---- NW 8: Auswahl der Wegerfassung --- - L SyncPkt.Ink_DB // Zähler-DB - L 0 // Sinnvolle Angabe ? - <=I // Nein ! - S Dyn.Error.Kein_Parameter // Kein Parameter zur Wegerfassung definiert - JC OK - - A SyncPkt.Parameter.InkSim // Inkrementalgeber simulieren - JC ISim - - A SyncPkt.Parameter.ET200 // Inkremental-Geber mit Zähler-Baugruppe (ET200) - JC ET20 - - A SyncPkt.Parameter.Sick_ABS_single - JC ABS // Inkremental-Geber mit Zähler-Baugruppe (FM350/FM450) - - JU OK - - ---- NW 9: Inkremental-Geber über 10ms-Takte simulieren und Antrieb aktiv --- -ISim: L SyncPkt.Ink_DB - T "MW200" - OPN DB["MW200"] // Zähler-DB öffnen - - SET - R DBX74.1 // Überlauf - R DBX74.4 // Flag-Lauf wurde beendet - R DBX74.5 // Ohne Flag-Lauf wurde beendet - - AN Antrieb_aktiv // Antrieb ist aktiv - JC chk // weitere Kontrollen - - L "MW4" // Anzahl der 10ms-Takte (letzter Zyklus) - ITD - L DBD80 - +D // 10ms-Takte dazuaddieren - T DBD80 - - JU chk // weitere Kontrollen - -// Zähler auf 000 setzen ?: -chk: AN DBX74.6 // Zähler Zero-Load - JC new - - SET - R DBX74.6 - - L 0 - T DBD70 // Zählerwert zum Setzen - - JU load - -// Zähler neu setzen ?: -new: A DBX74.0 // Zähler Neustart - R DBX74.0 - JC load - -// Zähler-Überlauf ?: - L DBD80 // Aktueller Zählerwert - A DBX75.0 // Speicherung einfrieren - JC nos - - T DBD70 // Speicherung - -nos: L DBD76 // Max. Wert erreicht ? - <=D // Nein ! - JC OK - - -D // Restwert als Startwert nehmen ! - T DBD70 // Zählerwert zum Setzen - - AN DBX74.3 // Umschaltung Zähl-Lauf ohne-mit-ohne Flag - = DBX74.5 // Ohne Flag-Lauf wurde beendet - A DBX74.3 // Umschaltung Zähl-Lauf ohne-mit-ohne Flag - = DBX74.4 // Flag-Lauf wurde beendet - - AN DBX74.3 // Umschaltung Zähl-Lauf ohne-mit-ohne Flag - = DBX74.3 - - SET - S DBX74.1 // Überlauf - -load: L SyncPkt.Ink_DB - T "MW200" - OPN DB["MW200"] // Zähler-DB öffnen - - L DBD70 // Zählerwert zum Setzen - T DBD80 - - JU OK - - ---- NW 10: Inkremental-Geber mit Zähler-Baugruppe (ET200) --- -ET20: L SyncPkt.Ink_DB - T "MW200" - OPN DB["MW200"] // Zähler-DB öffnen - - L SyncPkt.Ink_HW_Adress // Hardware-Adresse der ET200-Zählerbaugruppe - L 0 // Adresse sinnvoll ? (also ohne Zählerbaugruppe !) - <=I // Nein ! - S Dyn.Error.Err_Parameter // Parameter für ET200 fehlerhaft - JC OK - -// Zählerwert einlesen: - L SyncPkt.Ink_HW_Adress // Hardware-Adresse der ET200-Zählerbaugruppe - SLW 3 // Pointer erzeugen - T Adresse0 - L PeripheryInputD [Adresse0] - T DBD80 - - L SyncPkt.Ink_HW_Adress // Hardware-Adresse der ET200-Zählerbaugruppe - + 4 // Offset 4 DWs - SLW 3 // Pointer erzeugen - T Adresse4 - L PeripheryInputD [Adresse4] - T DBD4 - - L SyncPkt.Ink_HW_Adress // Hardware-Adresse der ET200-Zählerbaugruppe - + 8 - SLW 3 // Pointer erzeugen - T Adresse8 - L PeripheryInputD [Adresse8] - T DBD8 // eigentlich doppelt - - L DBD80 // Aktueller Zählerwert - L DBD70 // Speicherung (Zählerwert letzter Zyklus) - <>D // ist verändert ! - JC Ok_I - - AN Antrieb_aktiv // Antrieb ist aktiv - O ErrQuit // Ablaufstörung quittieren - JC X_I - - L SAVE.Ink_ohne_Zeit // Zeit Inkremntalgeberwert ohne Änderung [10ms] - L "MW4" // Anzahl der 10ms-Takte (letzter Zyklus) - +I // aufaddieren - T SAVE.Ink_ohne_Zeit // Zeit Inkremntalgeberwert ohne Änderung [10ms] - - L 50 // 500ms ohne Änderung ? - >=I // Ja ! - S Dyn.Error.Inkrementalgeber // Inkrementalgeberwert ohne Änderung - - JU X_I - -Ok_I: L 0 - T SAVE.Ink_ohne_Zeit // Zeit Inkremntalgeberwert ohne Änderung [10ms] - -// Software-Gate öffnen: -X_I: SET - S DBX16.0 // SW-Gate öffnen - -// Zähler setzen läuft: - A DBX74.2 // Zähler setzen - O DBX74.7 // Zähler laden ist aktiv - R DBX74.5 // Ohne Flag-Lauf wurde beendet - R DBX74.4 // Flag-Lauf wurde beendet - JC LOAD_Mig - -// Zähler auf 000 setzen ?: - L 0 - T DBD12 // Zählerwert zum Setzen - - A DBX74.6 // Zähler Zero-Load - S DBX74.2 // Zähler setzen - JC LOAD_Mig - -// Zähler neu setzen ?: - L DBD70 // Speicherung - T DBD12 // Zählerwert zum Setzen - - A DBX74.0 // Zähler Neustart - S DBX74.2 // Zähler setzen - JC LOAD_Mig - -// Zähler-Überlauf ?: - L DBD80 // Aktueller Zählerwert - L DBD76 // Max. Wert erreicht ? - <=D // Nein ! - JC Ok_Mig - - -D // Restwert als Startwert nehmen ! - T DBD12 // Zählerwert zum Setzen - - AN DBX74.3 // Umschaltung Zähl-Lauf ohne-mit-ohne Flag - = DBX74.5 // Ohne Flag-Lauf wurde beendet - A DBX74.3 // Umschaltung Zähl-Lauf ohne-mit-ohne Flag - = DBX74.4 // Flag-Lauf wurde beendet - - AN DBX74.3 // Umschaltung Zähl-Lauf ohne-mit-ohne Flag - = DBX74.3 - - SET - S DBX74.1 // Überlauf - S DBX74.2 // Zähler setzen - -LOAD_Mig: A DBX74.2 // Zähler setzen - = DBX17.0 // Load_Val - JCN Ok_Mig - -// Daten an Zähler senden: - L DBD12 - T PeripheryOutputD [Adresse0] - -Ok_Mig: L DBW16 - T PeripheryOutputW [Adresse4] - -// Zählerstatus einlesen: - L SyncPkt.Ink_HW_Adress // Hardware-Adresse der ET200-Zählerbaugruppe - + 4 // Offset 4 DWs - SLW 3 // Pointer erzeugen - T Adresse4 - L PeripheryInputD [Adresse4] - T DBD4 - - L SyncPkt.Ink_DB - T "MW200" - OPN DB["MW200"] // Zähler-DB öffnen - - A DBX74.2 // Zähler setzen - A DBX4.0 // Zähler wird geladen (Modul-Rückmeldung) - S DBX74.7 // Zähler laden ist aktiv - R DBX74.2 // Zähler setzen - - A DBX74.7 // Zähler laden ist aktiv - AN DBX4.0 // Zähler wird geladen (Modul-Rückmeldung) - R DBX74.7 // Zähler laden ist aktiv - R DBX74.6 // Zähler Zero-Load - R DBX74.0 // Zähler Neustart - R DBX74.1 // Überlauf - - A DBX74.2 // Zähler setzen - O DBX74.7 // Zähler laden ist aktiv - O DBX4.0 // Zähler wird geladen (Modul-Rückmeldung) - JC Fake - - L DBD80 // Aktueller Zählerwert - L 0 // Sinnvoller Wert ? - <=D // Nein ! - O DBX75.0 // Speicherung einfrieren - JC OK - - L DBD80 // Aktueller Zählerwert - T DBD70 // Speicherung - - JU OK - -Fake: L SyncPkt.Ink_DB - T "MW200" - OPN DB["MW200"] // Zähler-DB öffnen - - L DBD12 // Während Neusetzen Loadwert übergeben - T DBD80 - - JU OK - - ---- NW 11: Inkremental-Geber mit Zähler-Baugruppe (ABS single) --- -ABS: L SyncPkt.Ink_DB - T "MW200" - OPN DB["MW200"] // Zähler-DB öffnen - - L SyncPkt.Ink_HW_Adress // Hardware-Adresse der ET200-Zählerbaugruppe - L 0 // Adresse sinnvoll ? (also ohne Zählerbaugruppe !) - <=I // Nein ! - S Dyn.Error.Err_Parameter // Parameter für ET200 fehlerhaft - JC OK - -// Zählerwert einlesen: - L SyncPkt.Ink_HW_Adress // Hardware-Adresse der ET200-Zählerbaugruppe - SLW 3 // Pointer erzeugen - T Adresse0 - - L IW [Adresse0] - T DBW0 - T ZSW2_ENC - - L SyncPkt.Ink_HW_Adress // Hardware-Adresse der ET200-Zählerbaugruppe - + 2 // Offset 2 DWs - SLW 3 // Pointer erzeugen - T Adresse2 - L IW [Adresse2] - T DBW0 - T G1_ZSW - - L SyncPkt.Ink_HW_Adress // Hardware-Adresse der Zählerbaugruppe - + 4 // Offset 4 DWs - SLW 3 // Pointer erzeugen - T Adresse4 - - L ID [Adresse4] - T DBD4 - T G1_XIST1 - - L SyncPkt.Ink_HW_Adress // Hardware-Adresse der Zählerbaugruppe - + 8 - SLW 3 // Pointer erzeugen - T Adresse8 - L ID [Adresse8] - T DBD8 - T G1_XIST2 - -// Gespeicherte Werte einlesen: - L DBD80 - T tInk_Wert - - L DBD70 - T tSpeicherung - - L DBD16 - T tLastSingelturn_Wert - - L DBD20 - T tABS_Resolution - - A DBX74.3 - = tLauf_Flag - A DBX74.4 - = tFlag_Lauf_fertig - A DBX74.5 - = tOhne_Lauf_fertig - A DBX74.6 - = tNull_laden - -CALL FC "Sick_ABS_single" (ZSW2_ENC:=ZSW2_ENC, G1_ZSW:=G1_ZSW, G1_XIST1:=G1_XIST1, G1_XIST2:=G1_XIST2, Resolution:=tABS_Resolution, MaxValue:=Max_Wert, Error_Quit:=tQuit, STW2_ENC:=STW2_ENC, G1_STW:=G1_STW, Inkgeber_Err:=Dyn.Error.Inkgeber_Err, Ink_Wert:=tInk_Wert, Last_Singelturn_Wert:=tLastSingelturn_Wert, Lauf_Flag:=tLauf_Flag, Flag_Lauf_fertig:=tFlag_Lauf_fertig, Ohne_Lauf_fertig:=tOhne_Lauf_fertig, Null_laden:=tNull_laden) - -// Steuerwerte übergeben: - L SyncPkt.Ink_DB - T "MW200" - OPN DB["MW200"] // Zähler-DB öffnen - - L STW2_ENC - T PeripheryOutputW [Adresse0] - T DBW12 - - L G1_STW - T PeripheryOutputW [Adresse2] - T DBW14 - -// Werte speichern: - L tInk_Wert - T DBD80 - T DBD70 - - L tLastSingelturn_Wert - T DBD16 - - A tLauf_Flag - = DBX74.3 - A tFlag_Lauf_fertig - = DBX74.4 - A tOhne_Lauf_fertig - = DBX74.5 - A tNull_laden - = DBX74.6 - -// Ändert sich der Inkwert ?: - L DBD80 // Aktueller Zählerwert - L tSpeicherung // Speicherung (Zählerwert letzter Zyklus) - <>D // ist verändert ! - JC ok_I_Mig - - AN Antrieb_aktiv // Antrieb ist aktiv - O ErrQuit // Ablaufstörung quittieren - JC OK - - L SAVE.Ink_ohne_Zeit // Zeit Inkremntalgeberwert ohne Änderung [10ms] - L "MW4" // Anzahl der 10ms-Takte (letzter Zyklus) - +I // aufaddieren - T SAVE.Ink_ohne_Zeit // Zeit Inkremntalgeberwert ohne Änderung [10ms] - - L 50 // 500ms ohne Änderung ? - >=I // Ja ! - S Dyn.Error.Inkrementalgeber // Inkrementalgeberwert ohne Änderung - - JU OK - -ok_I_Mig: L 0 - T SAVE.Ink_ohne_Zeit // Zeit Inkremntalgeberwert ohne Änderung [10ms] - - ---- NW 12: Inkwerte holen --- -// Daten des Inktremental-Gebers übergeben: -OK: L SyncPkt.Ink_DB - T "MW200" - OPN DB["MW200"] // Zähler-DB öffnen - L DBD80 - T Ink_Wert - L DBD76 - T Max_Wert - A DBX74.3 - = Lauf_Flag - A DBX74.4 - = Flag_Lauf_fertig - A DBX74.5 - = Ohne_Lauf_fertig - - ---- NW 13: Zusatz-DWs an Travel-FIFO übergeben --- - L SyncPkt.TravelFIFO_DB // Travel-FIFO: DB-Nr. - L 0 // sinnvolle Angabe ? - <=I // Nein ! - O( - L SyncPkt.TravelFIFO_DW // Einfahr-FIFO: DW-Nr. - L 0 // Sinnvolle Angabe ? - D - JCN en04_Mig - - -D // Restwert übernehmen - T Dyn.Ende_Ink // Inkremente bei Synchron-Ende (MT) - - AN Lauf_Flag // Zähl-Lauf mit Flag ist aktiv - = Dyn.Ende_Flag // Lauf-Flag bei Synchron-Ende (MT) - -en04_Mig: NOP 0 - - ---- NW 16: Error: Sync-Sensor dauernd aktiv --- - AN sB_BT_da // Sensor Sync ist an Sychronisierstelle - O - A Lauf_Flag // Neuspeicherung nötig - AN Dyn.Ink_Flag - O - AN Lauf_Flag // Neuspeicherung nötig - A Dyn.Ink_Flag - O ErrQuit // Störung quittieren - O Dyn.Reset // Bereich resetten - JC W030 - - A Dyn.Error.Sync_Sensor_aktiv // Sync-Sensor dauernd aktiv - JC En03_Mig - - L Dyn.InkZelle // Speicherung Sensor frei - L 0 // Speicherung vorhanden ? - ==D // Nein ! - JC En03_Mig - - L Ink_Wert // Aktueller Ink-Wert - L Dyn.InkZelle // Speicherung Sensor frei - -D // Differenz bilden - L 10 // davon 10% - /D - L SyncPkt.Entprellung_B_Sync // Falls also 10mal Entprellwert, dann - >=D - S Dyn.Error.Sync_Sensor_aktiv // Sync-Sensor dauernd aktiv - - JU En03_Mig - -W030: L Ink_Wert // Aktueller Ink-Wert - T Dyn.InkZelle // Speicherung Sensor frei - A Lauf_Flag - = Dyn.Ink_Flag // Speicherung Laufflag - SET - R Dyn.Error.Sync_Sensor_aktiv // Sync-Sensor dauernd aktiv - -En03_Mig: NOP 0 - - ---- NW 17: Error: Travel-FIFO bleibt voll --- - L Dyn.FIFO_Ink // Inkremente bei FIFO-Wechsel (sonst Stop/Err) - L 0 // sinnvolle Angabe ? - <=D // Nein ! - O Dyn.Status.TeachModus_Aktiv // Teach-Modus ist aktiv - O Dyn.Error.TravelFIFO_belegt // Travel-FIFO bleibt belegt - JC w061 - - A Dyn.FIFO_Flag // Flag bei FIFO-Wechsel (sonst Stop/Err) - A Flag_Lauf_fertig // Flag-Lauf wurde beendet - O - AN Dyn.FIFO_Flag // Flag bei FIFO-Wechsel (sonst Stop/Err) - A Ohne_Lauf_fertig // Flag-Lauf wurde beendet - JC w060 // beim Ende des Lauf sind Inkremente uninteressant - - A Dyn.FIFO_Flag // Flag bei FIFO-Wechsel (sonst Stop/Err) - A Lauf_Flag // Zähl-Lauf mit Flag ist aktiv - O - AN Dyn.FIFO_Flag // Flag bei FIFO-Wechsel (sonst Stop/Err) - AN Lauf_Flag // Zähl-Lauf mit Flag ist aktiv - JCN En06 - - L Ink_Wert // Aktuelle Inkrementalwert - L Dyn.FIFO_Ink // Inkremente bei FIFO-Wechsel (sonst Stop/Err) - Sync-Sensor (in Inkremente) - L 0 // sinnvoller Wert ? - >D // Nein ! - S Dyn.Error.TravelFIFO_belegt // Travel-FIFO bleibt belegt - -w061: L 0 - T Dyn.FIFO_Ink // Inkremente bei FIFO-Wechsel (sonst Err) - SET - R Dyn.FIFO_Flag // Flag bei FIFO-Wechsel (sonst Err) - -// Kontrolle, ob Daten im Travel-FIFO vorhanden: -CALL FC "FifoOut" (SSDB:=SyncPkt.TravelFIFO_DB, SSDW:=SyncPkt.TravelFIFO_DW, PARA:=WORD#16#0000, OUTDATEN:=P#M220.0, RE_VAL:="MB199") // Daten lesen - - L "MB199" - L 0 // Aufruf mit Fehler ? - ==I // Nein ! - R Dyn.Error.TravelFIFO_Err // Travel-FIFO fehlerhaft - JC w062 - - A "M199.2" // FIFO ist leer - R Dyn.Error.TravelFIFO_Err // Travel-FIFO fehlerhaft - R Dyn.Stop // Rein-Separator stoppen - R Dyn.Error.TravelFIFO_belegt // Travel-FIFO bleibt belegt - JC En06 - - SET - S Dyn.Error.TravelFIFO_Err // Travel-FIFO fehlerhaft - - JU En06 - -// Inkremente speichern, bei denen spätestens FIFO-Zugriff erfolgen muss (sonst Stop)! -w062: L SyncPkt.Abstand_StartSep // Abstand Start-Separator <-> Sync-Sensor (in Inkremente) - L 0 // sinnvoller Wert ? - <=D // Nein ! - JC En06 - - CAC -// / L MD 220 //Ink-Wert des nächsten BTs beim Vereinzeln - L Ink_Wert // Aktueller Ink-Wert - +D - T Dyn.FIFO_Ink // Inkremente bei FIFO-Wechsel (sonst Stop) -// / U M 224.0 //Lauf-Flag des nächsten BTs beim Vereinzeln - A Lauf_Flag - = Dyn.FIFO_Flag // Lauf-Flag bei FIFO-Wechsel (sonst Stop) - L Max_Wert // Maximal erlaubter Zählwert - >D - JCN En06 - - -D // Restwert übernehmen - T Dyn.FIFO_Ink // Inkremente bei FIFO-Wechsel (sonst Stop) - - AN "M224.0" // Lauf-Flag des nächsten BTs beim Vereinzeln (unvertieren) - = Dyn.FIFO_Flag // Lauf-Flag bei FIFO-Wechsel (sonst Stop) - - JU En06 - -// Inkremente speichern, bei denen spätestens FIFO leer (sonst Err) -w063: L SyncPkt.Abstand_StartSep // Abstand Start-Separator <-> Sync-Sensor (in Inkremente) - L Ink_Wert // Aktueller Ink-Wert - +D - T Dyn.FIFO_Ink // Inkremente bei FIFO-Wechsel (sonst Err) - A Lauf_Flag - = Dyn.FIFO_Flag // Lauf-Flag bei FIFO-Wechsel (sonst Err) - L Max_Wert // Maximal erlaubter Zählwert - >D - JCN En06 - - -D // Restwert übernehmen - T Dyn.FIFO_Ink // Inkremente bei FIFO-Wechsel (sonst Err) - - AN Lauf_Flag // Zähl-Lauf mit Flag ist aktiv - = Dyn.FIFO_Flag // Lauf-Flag bei FIFO-Wechsel (sonst Err) - -En06: NOP 0 - - ---- NW 18: Sync-Sensor ist aktiv --- - A sB_BT_da // BT ist an Sychronisierstelle - A Antrieb_aktiv // /bei H&M - AN Dyn.BT_ausgewertet // BT wurde schon ausgewertet - AN Dyn.Error.Sync_Sensor_aktiv // Sync-Sensor dauernd aktiv - AN Dyn.Status.TeachModus_Aktiv // Teach-Modus ist aktiv - S Dyn.BT_ausgewertet // BT wurde schon ausgewertet - JC Sync - - JU Teac - - ---- NW 19: Daten aus Travel-FIFO holen --- -Sync: CALL FC "FifoOut" (SSDB:=SyncPkt.TravelFIFO_DB, SSDW:=SyncPkt.TravelFIFO_DW, PARA:=WORD#16#E100, OUTDATEN:=Daten, RE_VAL:="MB199") // Daten lesen + austragen - - L "MB199" - T Dyn.Rueckmld.RET_VAL_TravelFIFO_Out - L 0 // Aufruf mit Fehler ? - ==I // Nein ! - R Dyn.Error.TravelFIFO_leer // keine Daten im Travel-FIFO eingetragen - JC X081 - - A "M199.2" // FIFO ist leer - S Dyn.Error.TravelFIFO_leer // keine Daten im Travel-FIFO eingetragen - JC X080 - - SET - S Dyn.Error.TravelFIFO_Err // Travel-FIFO fehlerhaft - -X080: JU En18 // Keine Reaktion ist am Besten ! - - L -1 // Null-Daten übergeben - T Daten.Sort_Info.Teil_IDX - L -1 // in nächsten Bereich fahren - T Daten.Sort_Info.Teil_Ziel - - JU X082 - - L Teil_IDX_Old // Letzte gültige Daten übergeben - T Daten.Sort_Info.Teil_IDX // nicht mehr, da nur Ärger! - L Teil_Ziel_Old - T Daten.Sort_Info.Teil_Ziel - - JU X082 - -// IDX und Ziel speichern (für Travel-FIFO leer,...) -X081: L Daten.Sort_Info.Teil_IDX - T Teil_IDX_Old - L Daten.Sort_Info.Teil_Ziel - T Teil_Ziel_Old - -// Travel-FIFO-Daten übergeben: -X082: A Dyn.Stop // Rein-Separator stoppen - JC X083 - - L Dyn.FIFO_Ink // Inkremente bei FIFO-Wechsel (sonst Stop) - L Ink_Wert // Aktueller Ink-Wert - -D - T Sich_Ink // Übrige Inks, bevor dann gestoppt wird ! - -X083: L 0 - T Dyn.FIFO_Ink // Inkremente bei FIFO-Wechsel (sonst Stop) - - A SyncPkt.Parameter.Kein_Sync_B - R Dyn.BT_ausgewertet // BT wurde schon ausgewertet - - ---- NW 20: Daten für Haupstrangdaten aufbereiten --- -// Sync-Info: - L Ink_Wert // Aktuelle Inkrementalwert (Start-Sync-Zähler) - T Daten.Start_Ink - - A Lauf_Flag // Start-Flag übergeben (für evtl. Fahrsync) - = Daten.Start_Flag - -// Sort-Info werden von Travel-FIFO übernommen - -// Quell_Info: - L SyncPkt.Sync_Nr // Identifikation des Synchron-Punktes - T Daten.Quelle - T Daten.letzte_Position - - ---- NW 21: Daten in Haupstrangdaten eintragen --- - L SyncPkt.Hauptstrang_DL_DB // Hauptstrang-DB - T HaupstranglistenDB // Aktueller Hauptstrang-DB - L 0 // angegeben ? - ==I // Nein ! - S Dyn.Error.Keine_Hauptstrangliste // Keine Hauptstrangliste zum Eintragen angegeben - JC En18 - - AN Lauf_Flag // Start-Flag - JC w180 - - L SyncPkt.Hauptstrang_DL_DB // Hauptstrang-DB - + 1 // DB+1 bei Flaglauf ! - T HaupstranglistenDB // Aktueller Hauptstrang-DB - -w180: CALL FC "DatenInSort" (SSDB:=HaupstranglistenDB, SSDW:=SyncPkt.Hauptstrang_DL_DW, INDATEN:=Daten, RE_VAL:="MB199") // Hauptstrangliste mit Lauf-Flag | Aktueller Hauptstrang-DB - - L "MB199" - T Dyn.Rueckmld.RET_VAL_Hauptstrang_In - - A "M199.2" // Hauptstrangliste ist voll - S Dyn.Error.Hauptstrangliste_voll // Hauptstrangliste ist voll - JC En18 - - A "M199.7" // Eintrag richtig erfolgt - JC En18 - - SET - S Dyn.Error.Hauptstrangliste_Err // Error bei Hauptstrang-Zugriff - -En18: NOP 0 - - ---- NW 22: Teach-Modus aktiv ? --- -Teac: L Dyn.TeachPunkt // Punkt zum Ein-Teachen - L 0 // bekannt ? - <>I // Ja ! - A Dyn.Status.TeachModus_Aktiv // Teach-Modus ist aktiv - JC en20 - - L 0 - T Dyn.Ref_Ink // Inkremente bei Referenzpunkt - T Dyn.Teach_Ink // Inkremente bei Teachpunkt - T Abstands_Ink // Abstands-Inkremente nach Teachen - - SET - R Dyn.Status.TeachModus_Aktiv // Teach-Modus ist aktiv - R Dyn.Ref_Flag // Lauf-Flag bei Ref-Inkremente - R Dyn.Teach_Flag // Lauf-Flag bei Teach-Inkremente - R Dyn.Refpunkt_ausgewertet // Referenzpunkt ausgewertet - R Dyn.Teachpunkt_ausgewertet // Teachpunkt ausgewertet - R Dyn.Refpunkt_ok // Referenzpunkt erkannt - - BEU - -en20: NOP 0 - - ---- NW 23: Ref-Inkremente speichern --- - AN B_RefPunkt // Sensor RefBT am Referenzpunkt erkannt - R Dyn.Refpunkt_ausgewertet // Referenzpunkt ausgewertet - - A B_RefPunkt // Sensor RefBT am Referenzpunkt erkannt - AN Dyn.Refpunkt_ausgewertet // Referenzpunkt ausgewertet - JCN en21 - - L Ink_Wert // Aktuelle Inkrementalwert - T Dyn.Ref_Ink // Inkremente bei Referenzpunkt - A Lauf_Flag - = Dyn.Ref_Flag // Lauf-Flag bei Ref-Inkremente - - SET - S Dyn.Refpunkt_ausgewertet // Referenzpunkt ausgewertet - S Dyn.Refpunkt_ok // Referenzpunkt erkannt - - L 0 - T Dyn.Teach_Ink // Inkremente bei Teachpunkt - T Abstands_Ink // Abstands-Inkremente nach Teachen - SET - R Dyn.Teachpunkt_ausgewertet // Teachpunkt ausgewertet - R Dyn.Teach_Flag // Lauf-Flag bei Teach-Inkremente - -en21: NOP 0 - - ---- NW 24: Teach-Inkremente speichern --- - AN B_TeachPunk // Sensor RefHaken am Teachpunkt erkannt - A Antrieb_aktiv // Antrieb aktiv - R Dyn.Teachpunkt_ausgewertet // Teachpunkt ausgewertet - - AN B_TeachPunk // Sensor RefHaken am Teachpunkt erkannt - O Dyn.Teachpunkt_ausgewertet // Teachpunkt ausgewertet - ON Dyn.Refpunkt_ok // Referenzpunkt erkannt - ON Antrieb_aktiv // Antrieb aktiv - BEC - - L Ink_Wert // Aktuelle Inkrementalwert - T Dyn.Teach_Ink // Inkremente bei Teachpunkt - A Lauf_Flag - = Dyn.Teach_Flag // Lauf-Flag bei Teach-Inkremente - - SET - S Dyn.Teachpunkt_ausgewertet // Teachpunkt ausgewertet - - ---- NW 25: Abstand ermitteln --- - AN Dyn.Ref_Flag // Lauf-Flag bei Ref-Inkremente - AN Dyn.Teach_Flag // Lauf-Flag bei Teach-Inkremente - O - A Dyn.Ref_Flag // Lauf-Flag bei Ref-Inkremente - A Dyn.Teach_Flag // Lauf-Flag bei Teach-Inkremente - JCN w230 - -// Inkremente im gleichem Lauf: - L Dyn.Teach_Ink // Inkremente bei Teachpunkt - L Dyn.Ref_Ink // Inkremente bei Referenzpunkt - -D - T Abstands_Ink // Abstands-Inkremente nach Teachen - - JU en23 - -w230: L Max_Wert // Max. Wert beim Zähler - L Dyn.Ref_Ink // Inkremente bei Referenzpunkt - -D - L Dyn.Teach_Ink // Inkremente bei Teachpunkt - +D - T Abstands_Ink - -en23: NOP 0 - - ---- NW 26: Teach-Inkremente in Datenbank abspeichern --- - L Dyn.TeachPunkt // Punkt zum Ein-Teachen - T "MW200" - -CALL FC "DatenOut" (SSDB:=Para.Weichen_DL_DB, SSDW:=Para.Weichen_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M200.0, Position:="MW196") // Nach angegeben Datensatz suchen - - L "MB199" - T Dyn.Rueckmld.RET_VAL_Teach_OUT - - A "M199.7" // Datensatz ist vorhanden - JC w240 - - A "M199.6" // Datensatz ist nicht vorhanden - = Dyn.Error.Keine_TeachPktdaten // Teach-Punkt in Datenliste nicht vorhanden ! - R Dyn.Status.TeachModus_Aktiv // Teach-Modus ist aktiv - BEC - - SET - R Dyn.Status.TeachModus_Aktiv // Teach-Modus ist aktiv - S Dyn.Error.TeachPkt_Datenliste_Err - - BEU - -w240: L Abstands_Ink - L Para.Offset_RefPunkt // Offset Refpunkt zu SyncPunkt (für Teachen) - +D - T "MD218" - -CALL FC "DatenIn" (SSDB:=Para.Weichen_DL_DB, SSDW:=Para.Weichen_DL_DW, INDATEN:=P#M200.0, RE_VAL:="MB199") - AN Dyn.Status.MoreTeach // Nächsten Teachpunkt ohne neuen Refpunkt - R Dyn.Refpunkt_ok // Referenzpunkt erkannt - - L "MB199" - T Dyn.Rueckmld.RET_VAL_Teach_IN - - A "M199.7" // Datensatz ist vorhanden - JC MORE - - A "M199.6" // Datensatz ist nicht vorhanden - = Dyn.Error.Keine_TeachPktdaten // Teach-Punkt in Datenliste nicht vorhanden ! - R Dyn.Status.TeachModus_Aktiv // Teach-Modus ist aktiv - BEC - - SET - R Dyn.Status.TeachModus_Aktiv // Teach-Modus ist aktiv - S Dyn.Error.TeachPkt_Datenliste_Err - - BEU - -MORE: AN Dyn.Status.MoreTeach // Nächsten Teachpunkt ohne neuen Refpunkt - BEC - -CALL FC "DatenOut" (SSDB:=Para.Weichen_DL_DB, SSDW:=Para.Weichen_DL_DW, PARA:=WORD#16#FF00, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M200.0, Position:="MW196") // Nach nächsten Datensatz suchen - - L "MW206" // Weichentyp - L 178 // Sorterweiche ? - <>I // Nein! - O "M199.2" // Listenende erreicht! - JC TEND - - L "MW200" - T Dyn.TeachPunkt // Punkt zum Ein-Teachen - - BEU - -TEND: L 0 - T Dyn.TeachPunkt - - BEU - - ---- NW 27: - --- - BE +FUNCTION_BLOCK "MStartSync" +TITLE = Synchronisation Anfang neuer Sortbereich +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-960629 +// +//Version 4.12.2014: +//-Entprellung ohne Antrieb! +// +//Version: ILS2100 / 12.01.2010 +// +// + VAR_INPUT + Sync_Nr : Int; // Aufruf für Weiche + ErrQuit : Bool; // Ablaufstörung quittieren + B_BT_da : Bool; // Sensor BT ist an Sychronisierstelle + B_RefPunkt : Bool; // Sensor RefHaken am Referenzpunkt erkannt + B_TeachPunk : Bool; // Sensor RefHaken am Teachpunkt erkannt + Antrieb_aktiv : Bool; // Band ist aktiv + END_VAR + + VAR_OUTPUT + Error : Word; // Störungen übergeben + END_VAR + + VAR_IN_OUT + Antrieb_start : Bool; // Kreiselantrieb starten + hStOk : Bool; // Anzeige Start n. Störung aktivieren + END_VAR + + VAR + Teil_IDX_Old : Int; // BT/MT-IDX (wird bei Auslagerung gemeldet) + Teil_Ziel_Old : Int; // BT/MT bei diesem Abwurf-Ziel ausfahren/entladen + Res1 : Array[1..3] of Int; // Reserve + SAVE : Struct + Ink_ohne_Zeit : Int; // Zeit Inkremntalgeberwert ohne Änderung [100ms] + END_STRUCT; + Para : Struct // Parameter + Weichen_DL_DB : Int; // Einsprung Weichen-Datenliste-DB + Weichen_DL_DW : Int; // Einsprung Weichen-Datenliste-DW + Offset_RefPunkt : DInt; // Offset Refpunkt zu TaschenPunkt (für Teachen) + Res1 : Array[1..1] of Int; // Reserve + END_STRUCT; + SyncPkt : "UDLStartSync"; // Fahrbereichs Daten + Dyn : Struct // Dynamische Daten + Status : Struct // Status + TeachModus_Aktiv : Bool; // Teach-Modus ist aktiv + MoreTeach : Bool; // Nächsten Teachpunkt ohne neuen Refpunkt + Res02 : Bool; // Reserve + Res03 : Bool; // Reserve + Res04 : Bool; // Reserve + Res05 : Bool; // Reserve + Res06 : Bool; // Reserve + Res07 : Bool; // Reserve + Res10 : Bool; + Res11 : Bool; + Res12 : Bool; + Res13 : Bool; + Res14 : Bool; // Reserve + Res15 : Bool; // Reserve + Res16 : Bool; // Reserve + Res17 : Bool; // Reserve + END_STRUCT; + Rueckmld : Struct + RET_VAL_BLKMOV_Sync : Int; // Rückmeldung nach BLKMOV-Aufruf + RET_VAL_DL_Weichen_Out : Byte; // Rückmeldung nach DatenOut-Aufruf + RET_VAL_Hauptstrang_In : Byte; // Rückmeldung nach Hauptstrangdaten-In-Aufruf + RET_VAL_TravelFIFO_In : Byte; // Rückmeldung nach Aufruf + RET_VAL_TravelFIFO_Out : Byte; // Rückmeldung nach Aufruf + RET_VAL_Teach_OUT : Byte; // Rückmeldung bei Datenlisten-Zugriff + RET_VAL_Teach_IN : Byte; // Rückmeldung bei Datenlisten-Zugriff + END_STRUCT; + Error : "UErrStartSync"; + BT_ausgewertet : Bool; // BT wurde schon ausgewertet + TeachPunkt : Int; // Punkt zum Ein-Teachen + Refpunkt_ausgewertet : Bool; // Referenzpunkt ausgewertet + Refpunkt_ok : Bool; // Referenzpunkt erkannt + Teachpunkt_ausgewertet : Bool; // Teachpunkt ausgewertet + Reset : Bool; // Bereich + FIFO resetten + Ink_Flag : Bool; // Laufflag bei Speicherung + Ref_Flag : Bool; // Lauf-Flag bei Ref-Inkremente + Teach_Flag : Bool; // Lauf-Flag bei Teach-Inkremente + Ende_Flag : Bool; // Lauf-Flag bei Synchron-Ende (MT) + FIFO_Flag : Bool; // Lauf-Flag bei FIFO-Wechsel (sonst Err) + Stop : Bool; // Rein-Separator stoppen + Max_raus : Bool; // Max_Wert wurde schon übertragen + InkZelle : DInt; // Inkzelle: Sync-Sensor dauernd aktiv + Ref_Ink : DInt; // Inkremente bei Referenzpunkt + Teach_Ink : DInt; // Inkremente bei Teachpunkt + Ende_Ink : DInt; // Inkremente bei Synchron-Ende (MT) + FIFO_Ink : DInt; // Inkremente bei FIFO-Wechsel (sonst Err) + END_STRUCT; + Daten : "UBT_Daten"; + Max_Wert : DInt; // Maximal erlaubter Zählwert + Lauf_Flag : Bool; // Zähl-Lauf mit Flag ist aktiv + Flag_Lauf_fertig : Bool; // Flag-Lauf wurde beendet + Ohne_Lauf_fertig : Bool; // Ohne Flag-Lauf wurde beendet + Ink_Wert : DInt; // Aktuelle Inkrementalwert + Abstands_Ink : DInt; // Abstands-Inkremente nach Teachen + Sich_Ink : DInt; // Übrige Inks, bevor dann gestoppt wird ! + Reserve : Array[1..1] of Int; + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Adresse0 : DInt; // Für indirekte Adressierung (Offset 0) + Adresse2 : DInt; // Für indirekte Adressierung (Offset 0) + Adresse4 : DInt; // Für indirekte Adressierung (Offset 4) + Adresse8 : DInt; // Für indirekte Adressierung (Offset 8) + Abwurf_DB : Int; // Abwurf-DB für 1.Rückschaltung + HaupstranglistenDB : Int; // Aktueller Hauptstranglisten-DB + Parameter : Word; // Parameter + sB_BT_da : Bool; // Sensor BT ist an Sychronisierstelle + ZSW2_ENC : Word; + G1_ZSW : Word; + G1_XIST1 : DWord; + G1_XIST2 : DWord; // Positionswert 2, Sensor 1 + STW2_ENC : Word; // Steuerwort 2, Encoder + G1_STW : Word; // Steuerwort, Sensor 1 + tABS_Resolution : DInt; + tInk_Wert : DInt; // Aktueller Zählerwert + tSpeicherung : DInt; // Speicherung des aktuellen Zählerwerts (für Neustart) + tLastSingelturn_Wert : DInt; // Speicherung des letzten Zählerwerts (für Neustart) + tLauf_Flag : Bool; // Zähl-Lauf mit Flag ist aktiv + tFlag_Lauf_fertig : Bool; // Flag-Lauf wurde beendet + tOhne_Lauf_fertig : Bool; // Ohne Flag-Lauf wurde beendet + tNull_laden : Bool; // Zähler mit 0000 laden + tQuit : Bool; + END_VAR + + +BEGIN +NETWORK +TITLE = Eingangsvariablen einlesen + L #Sync_Nr; + + U #B_BT_da; + = #sB_BT_da; + +NETWORK +TITLE = Parameter-Übergabe + L #Sync_Nr; + + L "MW178";//Einsprung Weichen-DL + T #Para.Weichen_DL_DB;//vor Aufruf übergeben! + L 0; + T #Para.Weichen_DL_DW; + +NETWORK +TITLE = Gesamt: Out-Bits zum Zurücksetzen / temp + UN #Dyn.Max_raus;//Max_Wert wurde schon übertragen + O #Dyn.BT_ausgewertet;//BT wurde schon ausgewertet + S #Antrieb_start;//Kreiselantrieb starten + + + U #ErrQuit; + O #Dyn.Reset ;//Bereich + FIFO resetten + = #tQuit ;//Für ABS-Modul + +NETWORK +TITLE = Reset + +//Reset oder Tastendruck: + U #ErrQuit; + U "Hauptstrang_leer";//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + U #Dyn.Error.TravelFIFO_belegt;//Travel-FIFO bleibt belegt + S #Dyn.Reset;//Bereich + FIFO resetten + + U "Hauptstrang_leer";//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + U #Dyn.Error.TravelFIFO_leer;//keine Daten im Travel-FIFO eingetragen (Auto-Reset!) + UN #Dyn.BT_ausgewertet;//BT wurde schon ausgewertet + S #Dyn.Reset;//Bereich + FIFO resetten + + UN #Dyn.Reset;//Bereich + FIFO resetten + SPB en02; + + SET; + R #Dyn.Reset;//Bereich + FIFO resetten + R #Dyn.Error.SyncPkt_DL_Err;//Sync-Punkt-Datenliste fehlerhaft + R #Dyn.Error.Undef_SyncPkt;//undefinierter Synchronpunkt + R #Dyn.Error.BLKMov;//Fehler bei Block kopieren + R #Dyn.Error.Sync_Sensor_aktiv;//Sync-Sensor dauernd aktiv + R #Dyn.Error.TravelFIFO_Err;//Travel-FIFO fehlerhaft + R #Dyn.Error.TravelFIFO_leer;//keine Daten im Travel-FIFO eingetragen + R #Dyn.Error.TravelFIFO_belegt;//Travel-FIFO bleibt belegt + R #Dyn.Error.Hauptstrangliste_Err;//Hauptstrangliste fehlerhaft + R #Dyn.Error.Hauptstrangliste_voll;//Hauptstrangliste ist voll + R #Dyn.Error.Inkgeber_Err;//Übergabeliste fehlerhaft + R #Dyn.Error.Keine_Hauptstrangliste;//Keine Hauptstrangliste zum Eintragen angegeben + R #Dyn.Error.Keine_TeachPktdaten;//Teach-Punkt in Datenliste nicht vorhanden ! + R #Dyn.Error.TeachPkt_Datenliste_Err;//Teachdatenliste fehlerhaft + R #Dyn.Error.Kein_Parameter; + R #Dyn.Error.Err_Parameter; + R #Dyn.Error.Inkrementalgeber;//Inkrementalgeberwert ohne Änderung + + SET; + R #Dyn.BT_ausgewertet;//BT wurde schon ausgewertet + R #Dyn.Status.TeachModus_Aktiv;//Teach-Modus ist aktiv + R #Dyn.Stop;//Rein-Separator stoppen + + L 0; + T #Dyn.InkZelle;//Inkzelle: Sync-Sensor dauernd aktiv + L 0; + T #Dyn.FIFO_Ink;//Inkremente bei FIFO-Wechsel (sonst Err) + T #Sich_Ink;//Übrige Inks, bevor dann gestoopt wird ! + + L 0;//Damit statische Werte neu aus Datenbank geholt werden ! + T #SyncPkt.Sync_Nr;//Nummer des Sync-Punktes + +//Travel-FIFO zurücksetzen: + CALL "FifoReset" + ( SSDB := #SyncPkt.TravelFIFO_DB , + SSDW := #SyncPkt.TravelFIFO_DW , + PARA := WORD#16#0000 , //normaler FIFO + RE_VAL := "MB199" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_TravelFIFO_Out; + + L 0;//Aufruf mit Fehler ? + <>I;//Ja ! + = #Dyn.Error.TravelFIFO_Err;//Error bei FIFO-Zugriff + +//Hauptstrang-Daten zurücksetzen: + CALL "DatenResetSort" + ( SSDB := #SyncPkt.Hauptstrang_DL_DB , + SSDW := #SyncPkt.Hauptstrang_DL_DW , + RE_VAL := "MB198" + ); + + L #SyncPkt.Hauptstrang_DL_DB; + + 1; + T #HaupstranglistenDB; + + CALL "DatenResetSort" + ( SSDB := #HaupstranglistenDB , + SSDW := #SyncPkt.Hauptstrang_DL_DW , + RE_VAL := "MB199" + ); + + L "MB198"; + L "MB199"; + L 0;//Aufruf mit Fehler ? + <>I;//Ja ! + = #Dyn.Error.Hauptstrangliste_Err;//Hauptstrang-DL fehlerhaft + + BEA; + +en02: NOP 0; + +NETWORK +TITLE = Störungen nach Außen übergeben + L 0; + T "MW200"; + + U #Dyn.Error.SyncPkt_DL_Err;//Sync-Punkt-Datenliste fehlerhaft + = "M200.0"; + U #Dyn.Error.Undef_SyncPkt;//undefinierter Synchronpunkt + = "M200.1"; + U #Dyn.Error.BLKMov;//Fehler bei Block kopieren + = "M200.2"; + U #Dyn.Error.Sync_Sensor_aktiv;//Sync-Sensor dauernd aktiv + = "M200.3"; + U #Dyn.Error.TravelFIFO_Err;//Travel-FIFO fehlerhaft + = "M200.4"; + U #Dyn.Error.TravelFIFO_leer;//keine Daten im Travel-FIFO eingetragen + = "M200.5"; + U #Dyn.Error.TravelFIFO_belegt;//Travel-FIFO bleibt belegt + = "M200.6"; + U #Dyn.Error.Hauptstrangliste_Err;//Hauptstrangliste fehlerhaft + = "M200.7"; + U #Dyn.Error.Hauptstrangliste_voll;//Hauptstrangliste ist voll + = "M201.0"; + U #Dyn.Error.Inkgeber_Err;//Inkrementalgeber meldet Störung + = "M201.1"; + U #Dyn.Error.Keine_Hauptstrangliste;//Keine Hauptstrangliste zum Eintragen angegeben + = "M201.2"; + U #Dyn.Error.Keine_TeachPktdaten;//Teach-Punkt in Datenliste nicht vorhanden ! + = "M201.3"; + U #Dyn.Error.TeachPkt_Datenliste_Err;//Teachdatenliste fehlerhaft + = "M201.4"; + U #Dyn.Error.Kein_Parameter; + = "M201.5"; + U #Dyn.Error.Err_Parameter; + = "M201.6"; + U #Dyn.Error.Inkrementalgeber;//Inkrementalgeberwert ohne Änderung + = "M201.7"; + + L "MW200"; + T #Error;//Schnittstelle nach Außen + +//Anzeige Start n. Störung aktivieren: + U "Hauptstrang_leer";//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + U(; + O #Dyn.Error.TravelFIFO_leer;//keine Daten im Travel-FIFO eingetragen + O #Dyn.Error.TravelFIFO_belegt;//Travel-FIFO bleibt belegt + ); + O #Dyn.Error.Sync_Sensor_aktiv;//Sync-Sensor dauernd aktiv + O #Dyn.Error.Inkrementalgeber;//Inkrementalgeberwert ohne Änderung + S #hStOk; + +NETWORK +TITLE = Statische Sync-Parameter holen + L #SyncPkt.Sync_Nr;//Nummer des Synchron-Puntes + L #Sync_Nr;//Aufruf-Parameter + ==I;//Identisch ? + R #Dyn.Error.SyncPkt_DL_Err;//Sync-Punkt-Datenliste fehlerhaft + R #Dyn.Error.Undef_SyncPkt;//undefinierter Synchronpunkt + SPB en03;//Ja ! + + T "MW200";//Search-Daten + + CALL "DatenOut" + ( SSDB := #Para.Weichen_DL_DB , + SSDW := #Para.Weichen_DL_DW , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := "MW196" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_DL_Weichen_Out;//Rückmeldung bei Datenbank-Zugriff (Gefälle-DL) + + SPBI G_Ok; + + U "M199.0"; + = #Dyn.Error.SyncPkt_DL_Err;//Sync-Punkt-Datenliste fehlerhaft + BEB; + + SET; + S #Dyn.Error.Undef_SyncPkt;//undefinierter Synchronpunkt + + BEA; + +//Kennung + Datenbytes +G_Ok: SET; + R #Dyn.Error.SyncPkt_DL_Err;//Sync-Punkt-Datenliste fehlerhaft + R #Dyn.Error.Undef_SyncPkt;//undefinierter Synchronpunkt + + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 40;//Datenwords speichern + T %LW2;//Wiederholungen + +//Quelle-Pointer erzeugen: + L 0;//Bei Merker = 0 ! + T %LW4;//DB_Nummer + L 220;//Adresse + SLD 3; + L 16#8300_0000;//Kennung: Merker + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #Dyn.Rueckmld.RET_VAL_BLKMOV_Sync , + DSTBLK := #SyncPkt //#Ziel + ); + + L #Dyn.Rueckmld.RET_VAL_BLKMOV_Sync;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Dyn.Error.BLKMov;//Error bei Block kopieren + BEB; + + L #SyncPkt.Sync_Typ;//Synchron-Punkt-Typ = 177 (StartSync) + L 177;//Dieser Aufruf-FB ? + ==I;//Ja ! + SPB en03; + + SET; + S #Dyn.Error.Undef_SyncPkt;//undefinierter Synchronpunkt + + L 0;//Synchronpunkt ungültig ! + T #SyncPkt.Sync_Nr;//Nummer des Synchron-Puntes + + BEA; + +en03: NOP 0; + +NETWORK +TITLE = Störungen quittieren + UN #ErrQuit; + SPB en05; + + SET; + R #Dyn.Error.Keine_TeachPktdaten;//Teach-Punkt in Datenliste nicht vorhanden ! + R #Dyn.Error.Hauptstrangliste_voll;//Hauptstrangliste ist voll + R #Dyn.Error.Keine_Hauptstrangliste;//Keine Hauptstrangliste zum Eintragen angegeben + R #Dyn.Error.TravelFIFO_leer;//keine Daten im Travel-FIFO eingetragen + R #Dyn.Error.Inkrementalgeber;//Inkrementalgeberwert ohne Änderung + +//Kann nur über Reset zurückgesetzt werden: +// R #Dyn.Error.SyncPkt_DL_Err //Sync-Punkt-Datenliste fehlerhaft +// R #Dyn.Error.Undef_SyncPkt //undefinierter Synchronpunkt +// R #Dyn.Error.BLKMov //Fehler bei Block kopieren +// R #Dyn.Error.Sync_Sensor_aktiv //Sync-Sensor dauernd aktiv +// R #Dyn.Error.TravelFIFO //Travel-FIFO fehlerhaft +// R #Dyn.Error.TravelFIFO_belegt //Travel-FIFO bleibt belegt +// R #Dyn.Error.Hauptstrangliste_Err //Hauptstrangliste fehlerhaft +// R #Dyn.Error.Uebergabeliste_Err //Übergabeliste fehlerhaft +// R #Dyn.Error.TeachPkt_Datenliste_Err //Teachdatenliste fehlerhaft +// R #Dyn.Error.Keine_TeachPktdaten //Keine Teachdaten in Datenliste vorhanden ! +// R #Dyn.Error.Err16 + +//werden weiter unten quittiert: +// R #Dyn.Error.Sync_Sensor_aktiv //Sync-Sensor dauernd aktiv + +en05: NOP 0; + +NETWORK +TITLE = Auswahl der Wegerfassung + L #SyncPkt.Ink_DB;//Zähler-DB + L 0;//Sinnvolle Angabe ? + <=I;//Nein ! + S #Dyn.Error.Kein_Parameter;//Kein Parameter zur Wegerfassung definiert + SPB OK; + + U #SyncPkt.Parameter.InkSim;//Inkrementalgeber simulieren + SPB ISim; + + U #SyncPkt.Parameter.ET200;//Inkremental-Geber mit Zähler-Baugruppe (ET200) + SPB ET20; + + U #SyncPkt.Parameter.Sick_ABS_single; + SPB ABS ;//Inkremental-Geber mit Zähler-Baugruppe (FM350/FM450) + + SPA OK; + +NETWORK +TITLE = Inkremental-Geber über 10ms-Takte simulieren und Antrieb aktiv +ISim: L #SyncPkt.Ink_DB; + T "MW200"; + AUF DB[ "MW200"];//Zähler-DB öffnen + + SET; + R %DBX74.1;//Überlauf + R %DBX74.4;//Flag-Lauf wurde beendet + R %DBX74.5;//Ohne Flag-Lauf wurde beendet + + UN #Antrieb_aktiv;//Antrieb ist aktiv + SPB chk;//weitere Kontrollen + + L "MW4";//Anzahl der 10ms-Takte (letzter Zyklus) + ITD; + L %DBD80; + +D;//10ms-Takte dazuaddieren + T %DBD80; + + SPA chk;//weitere Kontrollen + +//Zähler auf 000 setzen ?: +chk: UN %DBX74.6;//Zähler Zero-Load + SPB new; + + SET; + R %DBX74.6; + + L 0; + T %DBD70;//Zählerwert zum Setzen + + SPA load; + +//Zähler neu setzen ?: +new: U %DBX74.0;//Zähler Neustart + R %DBX74.0; + SPB load; + +//Zähler-Überlauf ?: + L %DBD80;//Aktueller Zählerwert + U %DBX75.0;//Speicherung einfrieren + SPB nos; + + T %DBD70;//Speicherung + +nos: L %DBD76;//Max. Wert erreicht ? + <=D;//Nein ! + SPB OK; + + -D;//Restwert als Startwert nehmen ! + T %DBD70;//Zählerwert zum Setzen + + UN %DBX74.3;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag + = %DBX74.5;//Ohne Flag-Lauf wurde beendet + U %DBX74.3;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag + = %DBX74.4;//Flag-Lauf wurde beendet + + UN %DBX74.3;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag + = %DBX74.3; + + SET; + S %DBX74.1;//Überlauf + +load: L #SyncPkt.Ink_DB; + T "MW200"; + AUF DB[ "MW200"];//Zähler-DB öffnen + + L %DBD70;//Zählerwert zum Setzen + T %DBD80; + + SPA OK; + +NETWORK +TITLE = Inkremental-Geber mit Zähler-Baugruppe (ET200) +ET20: L #SyncPkt.Ink_DB; + T "MW200"; + AUF DB[ "MW200"];//Zähler-DB öffnen + + L #SyncPkt.Ink_HW_Adress;//Hardware-Adresse der ET200-Zählerbaugruppe + L 0;//Adresse sinnvoll ? (also ohne Zählerbaugruppe !) + <=I;//Nein ! + S #Dyn.Error.Err_Parameter;//Parameter für ET200 fehlerhaft + SPB OK; + +//Zählerwert einlesen: + L #SyncPkt.Ink_HW_Adress;//Hardware-Adresse der ET200-Zählerbaugruppe + SLW 3;//Pointer erzeugen + T #Adresse0; + L PED[ #Adresse0]; + T %DBD80; + + L #SyncPkt.Ink_HW_Adress;//Hardware-Adresse der ET200-Zählerbaugruppe + + 4;//Offset 4 DWs + SLW 3;//Pointer erzeugen + T #Adresse4; + L PED[ #Adresse4]; + T %DBD4; + + L #SyncPkt.Ink_HW_Adress;//Hardware-Adresse der ET200-Zählerbaugruppe + + 8; + SLW 3;//Pointer erzeugen + T #Adresse8; + L PED[ #Adresse8]; + T %DBD8;//eigentlich doppelt + + L %DBD80;//Aktueller Zählerwert + L %DBD70;//Speicherung (Zählerwert letzter Zyklus) + <>D;//ist verändert ! + SPB Ok_I; + + UN #Antrieb_aktiv;//Antrieb ist aktiv + O #ErrQuit;//Ablaufstörung quittieren + SPB X_I; + + L #SAVE.Ink_ohne_Zeit;//Zeit Inkremntalgeberwert ohne Änderung [10ms] + L "MW4";//Anzahl der 10ms-Takte (letzter Zyklus) + +I;//aufaddieren + T #SAVE.Ink_ohne_Zeit;//Zeit Inkremntalgeberwert ohne Änderung [10ms] + + L 50;//500ms ohne Änderung ? + >=I;//Ja ! + S #Dyn.Error.Inkrementalgeber;//Inkrementalgeberwert ohne Änderung + + SPA X_I; + +Ok_I: L 0; + T #SAVE.Ink_ohne_Zeit;//Zeit Inkremntalgeberwert ohne Änderung [10ms] + +//Software-Gate öffnen: +X_I: SET; + S %DBX16.0;//SW-Gate öffnen + +//Zähler setzen läuft: + U %DBX74.2;//Zähler setzen + O %DBX74.7;//Zähler laden ist aktiv + R %DBX74.5;//Ohne Flag-Lauf wurde beendet + R %DBX74.4;//Flag-Lauf wurde beendet + SPB LOAD_Mig; + +//Zähler auf 000 setzen ?: + L 0; + T %DBD12;//Zählerwert zum Setzen + + U %DBX74.6;//Zähler Zero-Load + S %DBX74.2;//Zähler setzen + SPB LOAD_Mig; + +//Zähler neu setzen ?: + L %DBD70;//Speicherung + T %DBD12;//Zählerwert zum Setzen + + U %DBX74.0;//Zähler Neustart + S %DBX74.2;//Zähler setzen + SPB LOAD_Mig; + +//Zähler-Überlauf ?: + L %DBD80;//Aktueller Zählerwert + L %DBD76;//Max. Wert erreicht ? + <=D;//Nein ! + SPB Ok_Mig; + + -D;//Restwert als Startwert nehmen ! + T %DBD12;//Zählerwert zum Setzen + + UN %DBX74.3;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag + = %DBX74.5;//Ohne Flag-Lauf wurde beendet + U %DBX74.3;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag + = %DBX74.4;//Flag-Lauf wurde beendet + + UN %DBX74.3;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag + = %DBX74.3; + + SET; + S %DBX74.1;//Überlauf + S %DBX74.2;//Zähler setzen + +LOAD_Mig: U %DBX74.2;//Zähler setzen + = %DBX17.0;//Load_Val + SPBN Ok_Mig; + +//Daten an Zähler senden: + L %DBD12; + T PAD[ #Adresse0]; + +Ok_Mig: L %DBW16; + T PAW[ #Adresse4]; + +//Zählerstatus einlesen: + L #SyncPkt.Ink_HW_Adress;//Hardware-Adresse der ET200-Zählerbaugruppe + + 4;//Offset 4 DWs + SLW 3;//Pointer erzeugen + T #Adresse4; + L PED[ #Adresse4]; + T %DBD4; + + L #SyncPkt.Ink_DB; + T "MW200"; + AUF DB[ "MW200"];//Zähler-DB öffnen + + U %DBX74.2;//Zähler setzen + U %DBX4.0;//Zähler wird geladen (Modul-Rückmeldung) + S %DBX74.7;//Zähler laden ist aktiv + R %DBX74.2;//Zähler setzen + + U %DBX74.7;//Zähler laden ist aktiv + UN %DBX4.0;//Zähler wird geladen (Modul-Rückmeldung) + R %DBX74.7;//Zähler laden ist aktiv + R %DBX74.6;//Zähler Zero-Load + R %DBX74.0;//Zähler Neustart + R %DBX74.1;//Überlauf + + U %DBX74.2;//Zähler setzen + O %DBX74.7;//Zähler laden ist aktiv + O %DBX4.0;//Zähler wird geladen (Modul-Rückmeldung) + SPB Fake; + + L %DBD80;//Aktueller Zählerwert + L 0;//Sinnvoller Wert ? + <=D;//Nein ! + O %DBX75.0;//Speicherung einfrieren + SPB OK; + + L %DBD80;//Aktueller Zählerwert + T %DBD70;//Speicherung + + SPA OK; + +Fake: L #SyncPkt.Ink_DB; + T "MW200"; + AUF DB[ "MW200"];//Zähler-DB öffnen + + L %DBD12;//Während Neusetzen Loadwert übergeben + T %DBD80; + + SPA OK; + +NETWORK +TITLE = Inkremental-Geber mit Zähler-Baugruppe (ABS single) +ABS: L #SyncPkt.Ink_DB; + T "MW200"; + AUF DB[ "MW200"];//Zähler-DB öffnen + + L #SyncPkt.Ink_HW_Adress;//Hardware-Adresse der ET200-Zählerbaugruppe + L 0;//Adresse sinnvoll ? (also ohne Zählerbaugruppe !) + <=I;//Nein ! + S #Dyn.Error.Err_Parameter;//Parameter für ET200 fehlerhaft + SPB OK; + +//Zählerwert einlesen: + L #SyncPkt.Ink_HW_Adress;//Hardware-Adresse der ET200-Zählerbaugruppe + SLW 3;//Pointer erzeugen + T #Adresse0; + + L EW[ #Adresse0]; + T %DBW0; + T #ZSW2_ENC; + + L #SyncPkt.Ink_HW_Adress;//Hardware-Adresse der ET200-Zählerbaugruppe + + 2 ;//Offset 2 DWs + SLW 3;//Pointer erzeugen + T #Adresse2; + L EW[ #Adresse2]; + T %DBW0; + T #G1_ZSW; + + L #SyncPkt.Ink_HW_Adress;//Hardware-Adresse der Zählerbaugruppe + + 4;//Offset 4 DWs + SLW 3;//Pointer erzeugen + T #Adresse4; + + L ED[ #Adresse4]; + T %DBD4; + T #G1_XIST1; + + L #SyncPkt.Ink_HW_Adress;//Hardware-Adresse der Zählerbaugruppe + + 8; + SLW 3;//Pointer erzeugen + T #Adresse8; + L ED[ #Adresse8]; + T %DBD8; + T #G1_XIST2; + +//Gespeicherte Werte einlesen: + L %DBD80; + T #tInk_Wert; + + L %DBD70; + T #tSpeicherung; + + L %DBD16; + T #tLastSingelturn_Wert; + + L %DBD20; + T #tABS_Resolution; + + U %DBX74.3; + = #tLauf_Flag; + U %DBX74.4; + = #tFlag_Lauf_fertig; + U %DBX74.5; + = #tOhne_Lauf_fertig; + U %DBX74.6; + = #tNull_laden; + + CALL "Sick_ABS_single" + ( ZSW2_ENC := #ZSW2_ENC , + G1_ZSW := #G1_ZSW , + G1_XIST1 := #G1_XIST1 , + G1_XIST2 := #G1_XIST2 , + Resolution := #tABS_Resolution , + MaxValue := #Max_Wert , + Error_Quit := #tQuit , + STW2_ENC := #STW2_ENC , + G1_STW := #G1_STW , + Inkgeber_Err := #Dyn.Error.Inkgeber_Err , + Ink_Wert := #tInk_Wert , + Last_Singelturn_Wert := #tLastSingelturn_Wert , + Lauf_Flag := #tLauf_Flag , + Flag_Lauf_fertig := #tFlag_Lauf_fertig , + Ohne_Lauf_fertig := #tOhne_Lauf_fertig , + Null_laden := #tNull_laden + ); + +//Steuerwerte übergeben: + L #SyncPkt.Ink_DB; + T "MW200"; + AUF DB[ "MW200"];//Zähler-DB öffnen + + L #STW2_ENC; + T PAW[ #Adresse0]; + T %DBW12; + + L #G1_STW; + T PAW[ #Adresse2]; + T %DBW14; + +//Werte speichern: + L #tInk_Wert; + T %DBD80; + T %DBD70; + + L #tLastSingelturn_Wert; + T %DBD16; + + U #tLauf_Flag; + = %DBX74.3; + U #tFlag_Lauf_fertig; + = %DBX74.4; + U #tOhne_Lauf_fertig; + = %DBX74.5; + U #tNull_laden; + = %DBX74.6; + +//Ändert sich der Inkwert ?: + L %DBD80 ;//Aktueller Zählerwert + L #tSpeicherung;//Speicherung (Zählerwert letzter Zyklus) + <>D;//ist verändert ! + SPB ok_I_Mig; + + UN #Antrieb_aktiv;//Antrieb ist aktiv + O #ErrQuit;//Ablaufstörung quittieren + SPB OK; + + L #SAVE.Ink_ohne_Zeit;//Zeit Inkremntalgeberwert ohne Änderung [10ms] + L "MW4";//Anzahl der 10ms-Takte (letzter Zyklus) + +I;//aufaddieren + T #SAVE.Ink_ohne_Zeit;//Zeit Inkremntalgeberwert ohne Änderung [10ms] + + L 50;//500ms ohne Änderung ? + >=I;//Ja ! + S #Dyn.Error.Inkrementalgeber;//Inkrementalgeberwert ohne Änderung + + SPA OK; + +ok_I_Mig: L 0; + T #SAVE.Ink_ohne_Zeit;//Zeit Inkremntalgeberwert ohne Änderung [10ms] + +NETWORK +TITLE = Inkwerte holen + +//Daten des Inktremental-Gebers übergeben: +OK: L #SyncPkt.Ink_DB; + T "MW200"; + AUF DB[ "MW200"];//Zähler-DB öffnen + L %DBD80; + T #Ink_Wert; + L %DBD76; + T #Max_Wert; + U %DBX74.3; + = #Lauf_Flag; + U %DBX74.4; + = #Flag_Lauf_fertig; + U %DBX74.5; + = #Ohne_Lauf_fertig; + +NETWORK +TITLE = Zusatz-DWs an Travel-FIFO übergeben + L #SyncPkt.TravelFIFO_DB;//Travel-FIFO: DB-Nr. + L 0;//sinnvolle Angabe ? + <=I;//Nein ! + O(; + L #SyncPkt.TravelFIFO_DW;//Einfahr-FIFO: DW-Nr. + L 0;//Sinnvolle Angabe ? + D; + SPBN en04_Mig; + + -D;//Restwert übernehmen + T #Dyn.Ende_Ink;//Inkremente bei Synchron-Ende (MT) + + UN #Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv + = #Dyn.Ende_Flag;//Lauf-Flag bei Synchron-Ende (MT) + +en04_Mig: NOP 0; + +NETWORK +TITLE = Error: Sync-Sensor dauernd aktiv + UN #sB_BT_da;//Sensor Sync ist an Sychronisierstelle + O; + U #Lauf_Flag;//Neuspeicherung nötig + UN #Dyn.Ink_Flag; + O; + UN #Lauf_Flag;//Neuspeicherung nötig + U #Dyn.Ink_Flag; + O #ErrQuit;//Störung quittieren + O #Dyn.Reset;//Bereich resetten + SPB W030; + + U #Dyn.Error.Sync_Sensor_aktiv;//Sync-Sensor dauernd aktiv + SPB En03_Mig; + + L #Dyn.InkZelle;//Speicherung Sensor frei + L 0;//Speicherung vorhanden ? + ==D;//Nein ! + SPB En03_Mig; + + L #Ink_Wert;//Aktueller Ink-Wert + L #Dyn.InkZelle;//Speicherung Sensor frei + -D;//Differenz bilden + L 10;//davon 10% + /D; + L #SyncPkt.Entprellung_B_Sync;//Falls also 10mal Entprellwert, dann + >=D; + S #Dyn.Error.Sync_Sensor_aktiv;//Sync-Sensor dauernd aktiv + + SPA En03_Mig; + +W030: L #Ink_Wert;//Aktueller Ink-Wert + T #Dyn.InkZelle;//Speicherung Sensor frei + U #Lauf_Flag; + = #Dyn.Ink_Flag;//Speicherung Laufflag + SET; + R #Dyn.Error.Sync_Sensor_aktiv;//Sync-Sensor dauernd aktiv + +En03_Mig: NOP 0; + +NETWORK +TITLE = Error: Travel-FIFO bleibt voll + L #Dyn.FIFO_Ink;//Inkremente bei FIFO-Wechsel (sonst Stop/Err) + L 0;//sinnvolle Angabe ? + <=D;//Nein ! + O #Dyn.Status.TeachModus_Aktiv;//Teach-Modus ist aktiv + O #Dyn.Error.TravelFIFO_belegt;//Travel-FIFO bleibt belegt + SPB w061; + + U #Dyn.FIFO_Flag;//Flag bei FIFO-Wechsel (sonst Stop/Err) + U #Flag_Lauf_fertig;//Flag-Lauf wurde beendet + O; + UN #Dyn.FIFO_Flag;//Flag bei FIFO-Wechsel (sonst Stop/Err) + U #Ohne_Lauf_fertig;//Flag-Lauf wurde beendet + SPB w060;//beim Ende des Lauf sind Inkremente uninteressant + + U #Dyn.FIFO_Flag;//Flag bei FIFO-Wechsel (sonst Stop/Err) + U #Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv + O; + UN #Dyn.FIFO_Flag;//Flag bei FIFO-Wechsel (sonst Stop/Err) + UN #Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv + SPBN En06; + + L #Ink_Wert;//Aktuelle Inkrementalwert + L #Dyn.FIFO_Ink;//Inkremente bei FIFO-Wechsel (sonst Stop/Err) + Sync-Sensor (in Inkremente) + L 0;//sinnvoller Wert ? + >D;//Nein ! + S #Dyn.Error.TravelFIFO_belegt;//Travel-FIFO bleibt belegt + +w061: L 0; + T #Dyn.FIFO_Ink;//Inkremente bei FIFO-Wechsel (sonst Err) + SET; + R #Dyn.FIFO_Flag;//Flag bei FIFO-Wechsel (sonst Err) + +//Kontrolle, ob Daten im Travel-FIFO vorhanden: + CALL "FifoOut" + ( SSDB := #SyncPkt.TravelFIFO_DB , + SSDW := #SyncPkt.TravelFIFO_DW , + PARA := WORD#16#0000 , //Daten lesen + OUTDATEN := P#M220.0 , + RE_VAL := "MB199" + ); + + L "MB199"; + L 0;//Aufruf mit Fehler ? + ==I;//Nein ! + R #Dyn.Error.TravelFIFO_Err;//Travel-FIFO fehlerhaft + SPB w062; + + U "M199.2";//FIFO ist leer + R #Dyn.Error.TravelFIFO_Err;//Travel-FIFO fehlerhaft + R #Dyn.Stop;//Rein-Separator stoppen + R #Dyn.Error.TravelFIFO_belegt;//Travel-FIFO bleibt belegt + SPB En06; + + SET; + S #Dyn.Error.TravelFIFO_Err;//Travel-FIFO fehlerhaft + + SPA En06; + +//Inkremente speichern, bei denen spätestens FIFO-Zugriff erfolgen muss (sonst Stop)! +w062: L #SyncPkt.Abstand_StartSep;//Abstand Start-Separator <-> Sync-Sensor (in Inkremente) + L 0;//sinnvoller Wert ? + <=D;//Nein ! + SPB En06; + + TAK; +/// L MD 220 //Ink-Wert des nächsten BTs beim Vereinzeln + L #Ink_Wert;//Aktueller Ink-Wert + +D; + T #Dyn.FIFO_Ink;//Inkremente bei FIFO-Wechsel (sonst Stop) +/// U M 224.0 //Lauf-Flag des nächsten BTs beim Vereinzeln + U #Lauf_Flag; + = #Dyn.FIFO_Flag;//Lauf-Flag bei FIFO-Wechsel (sonst Stop) + L #Max_Wert;//Maximal erlaubter Zählwert + >D; + SPBN En06; + + -D;//Restwert übernehmen + T #Dyn.FIFO_Ink;//Inkremente bei FIFO-Wechsel (sonst Stop) + + UN "M224.0";//Lauf-Flag des nächsten BTs beim Vereinzeln (unvertieren) + = #Dyn.FIFO_Flag;//Lauf-Flag bei FIFO-Wechsel (sonst Stop) + + SPA En06; + +//Inkremente speichern, bei denen spätestens FIFO leer (sonst Err) +w063: L #SyncPkt.Abstand_StartSep;//Abstand Start-Separator <-> Sync-Sensor (in Inkremente) + L #Ink_Wert;//Aktueller Ink-Wert + +D; + T #Dyn.FIFO_Ink;//Inkremente bei FIFO-Wechsel (sonst Err) + U #Lauf_Flag; + = #Dyn.FIFO_Flag;//Lauf-Flag bei FIFO-Wechsel (sonst Err) + L #Max_Wert;//Maximal erlaubter Zählwert + >D; + SPBN En06; + + -D;//Restwert übernehmen + T #Dyn.FIFO_Ink;//Inkremente bei FIFO-Wechsel (sonst Err) + + UN #Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv + = #Dyn.FIFO_Flag;//Lauf-Flag bei FIFO-Wechsel (sonst Err) + +En06: NOP 0; + +NETWORK +TITLE = Sync-Sensor ist aktiv + U #sB_BT_da;//BT ist an Sychronisierstelle + U #Antrieb_aktiv;///bei H&M + UN #Dyn.BT_ausgewertet;//BT wurde schon ausgewertet + UN #Dyn.Error.Sync_Sensor_aktiv;//Sync-Sensor dauernd aktiv + UN #Dyn.Status.TeachModus_Aktiv;//Teach-Modus ist aktiv + S #Dyn.BT_ausgewertet;//BT wurde schon ausgewertet + SPB Sync; + + SPA Teac; + +NETWORK +TITLE = Daten aus Travel-FIFO holen +Sync: CALL "FifoOut" + ( SSDB := #SyncPkt.TravelFIFO_DB , + SSDW := #SyncPkt.TravelFIFO_DW , + PARA := WORD#16#E100 , //Daten lesen + austragen + OUTDATEN := #Daten , + RE_VAL := "MB199" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_TravelFIFO_Out; + L 0;//Aufruf mit Fehler ? + ==I;//Nein ! + R #Dyn.Error.TravelFIFO_leer;//keine Daten im Travel-FIFO eingetragen + SPB X081; + + U "M199.2";//FIFO ist leer + S #Dyn.Error.TravelFIFO_leer;//keine Daten im Travel-FIFO eingetragen + SPB X080; + + SET; + S #Dyn.Error.TravelFIFO_Err;//Travel-FIFO fehlerhaft + +X080: SPA En18;//Keine Reaktion ist am Besten ! + + L -1;//Null-Daten übergeben + T #Daten.Sort_Info.Teil_IDX; + L -1;//in nächsten Bereich fahren + T #Daten.Sort_Info.Teil_Ziel; + + SPA X082; + + L #Teil_IDX_Old;//Letzte gültige Daten übergeben + T #Daten.Sort_Info.Teil_IDX;//nicht mehr, da nur Ärger! + L #Teil_Ziel_Old; + T #Daten.Sort_Info.Teil_Ziel; + + SPA X082; + +//IDX und Ziel speichern (für Travel-FIFO leer,...) +X081: L #Daten.Sort_Info.Teil_IDX; + T #Teil_IDX_Old; + L #Daten.Sort_Info.Teil_Ziel; + T #Teil_Ziel_Old; + +//Travel-FIFO-Daten übergeben: +X082: U #Dyn.Stop;//Rein-Separator stoppen + SPB X083; + + L #Dyn.FIFO_Ink;//Inkremente bei FIFO-Wechsel (sonst Stop) + L #Ink_Wert;//Aktueller Ink-Wert + -D; + T #Sich_Ink;//Übrige Inks, bevor dann gestoppt wird ! + +X083: L 0; + T #Dyn.FIFO_Ink;//Inkremente bei FIFO-Wechsel (sonst Stop) + + U #SyncPkt.Parameter.Kein_Sync_B; + R #Dyn.BT_ausgewertet;//BT wurde schon ausgewertet + +NETWORK +TITLE = Daten für Haupstrangdaten aufbereiten + +//Sync-Info: + L #Ink_Wert;//Aktuelle Inkrementalwert (Start-Sync-Zähler) + T #Daten.Start_Ink; + + U #Lauf_Flag;//Start-Flag übergeben (für evtl. Fahrsync) + = #Daten.Start_Flag; + +//Sort-Info werden von Travel-FIFO übernommen + +//Quell_Info: + L #SyncPkt.Sync_Nr;//Identifikation des Synchron-Punktes + T #Daten.Quelle; + T #Daten.letzte_Position; + +NETWORK +TITLE = Daten in Haupstrangdaten eintragen + L #SyncPkt.Hauptstrang_DL_DB;//Hauptstrang-DB + T #HaupstranglistenDB;//Aktueller Hauptstrang-DB + L 0;//angegeben ? + ==I;//Nein ! + S #Dyn.Error.Keine_Hauptstrangliste;//Keine Hauptstrangliste zum Eintragen angegeben + SPB En18; + + UN #Lauf_Flag;//Start-Flag + SPB w180; + + L #SyncPkt.Hauptstrang_DL_DB;//Hauptstrang-DB + + 1;//DB+1 bei Flaglauf ! + T #HaupstranglistenDB;//Aktueller Hauptstrang-DB + +w180: CALL "DatenInSort"//Hauptstrangliste mit Lauf-Flag + ( SSDB := #HaupstranglistenDB , //Aktueller Hauptstrang-DB + SSDW := #SyncPkt.Hauptstrang_DL_DW , + INDATEN := #Daten , + RE_VAL := "MB199" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_Hauptstrang_In; + + U "M199.2";//Hauptstrangliste ist voll + S #Dyn.Error.Hauptstrangliste_voll;//Hauptstrangliste ist voll + SPB En18; + + U "M199.7";//Eintrag richtig erfolgt + SPB En18; + + SET; + S #Dyn.Error.Hauptstrangliste_Err;//Error bei Hauptstrang-Zugriff + +En18: NOP 0; + +NETWORK +TITLE = Teach-Modus aktiv ? +Teac: L #Dyn.TeachPunkt;//Punkt zum Ein-Teachen + L 0;//bekannt ? + <>I;//Ja ! + U #Dyn.Status.TeachModus_Aktiv;//Teach-Modus ist aktiv + SPB en20; + + L 0; + T #Dyn.Ref_Ink;//Inkremente bei Referenzpunkt + T #Dyn.Teach_Ink;//Inkremente bei Teachpunkt + T #Abstands_Ink;//Abstands-Inkremente nach Teachen + + SET; + R #Dyn.Status.TeachModus_Aktiv;//Teach-Modus ist aktiv + R #Dyn.Ref_Flag;//Lauf-Flag bei Ref-Inkremente + R #Dyn.Teach_Flag;//Lauf-Flag bei Teach-Inkremente + R #Dyn.Refpunkt_ausgewertet;//Referenzpunkt ausgewertet + R #Dyn.Teachpunkt_ausgewertet;//Teachpunkt ausgewertet + R #Dyn.Refpunkt_ok;//Referenzpunkt erkannt + + BEA; + +en20: NOP 0; + +NETWORK +TITLE = Ref-Inkremente speichern + UN #B_RefPunkt;//Sensor RefBT am Referenzpunkt erkannt + R #Dyn.Refpunkt_ausgewertet;//Referenzpunkt ausgewertet + + U #B_RefPunkt;//Sensor RefBT am Referenzpunkt erkannt + UN #Dyn.Refpunkt_ausgewertet;//Referenzpunkt ausgewertet + SPBN en21; + + L #Ink_Wert;//Aktuelle Inkrementalwert + T #Dyn.Ref_Ink;//Inkremente bei Referenzpunkt + U #Lauf_Flag; + = #Dyn.Ref_Flag;//Lauf-Flag bei Ref-Inkremente + + SET; + S #Dyn.Refpunkt_ausgewertet;//Referenzpunkt ausgewertet + S #Dyn.Refpunkt_ok;//Referenzpunkt erkannt + + L 0; + T #Dyn.Teach_Ink;//Inkremente bei Teachpunkt + T #Abstands_Ink;//Abstands-Inkremente nach Teachen + SET; + R #Dyn.Teachpunkt_ausgewertet;//Teachpunkt ausgewertet + R #Dyn.Teach_Flag;//Lauf-Flag bei Teach-Inkremente + +en21: NOP 0; + +NETWORK +TITLE = Teach-Inkremente speichern + UN #B_TeachPunk;//Sensor RefHaken am Teachpunkt erkannt + U #Antrieb_aktiv;//Antrieb aktiv + R #Dyn.Teachpunkt_ausgewertet;//Teachpunkt ausgewertet + + UN #B_TeachPunk;//Sensor RefHaken am Teachpunkt erkannt + O #Dyn.Teachpunkt_ausgewertet;//Teachpunkt ausgewertet + ON #Dyn.Refpunkt_ok;//Referenzpunkt erkannt + ON #Antrieb_aktiv ;//Antrieb aktiv + BEB; + + L #Ink_Wert;//Aktuelle Inkrementalwert + T #Dyn.Teach_Ink;//Inkremente bei Teachpunkt + U #Lauf_Flag; + = #Dyn.Teach_Flag;//Lauf-Flag bei Teach-Inkremente + + SET; + S #Dyn.Teachpunkt_ausgewertet;//Teachpunkt ausgewertet + +NETWORK +TITLE = Abstand ermitteln + UN #Dyn.Ref_Flag;//Lauf-Flag bei Ref-Inkremente + UN #Dyn.Teach_Flag;//Lauf-Flag bei Teach-Inkremente + O; + U #Dyn.Ref_Flag;//Lauf-Flag bei Ref-Inkremente + U #Dyn.Teach_Flag;//Lauf-Flag bei Teach-Inkremente + SPBN w230; + +//Inkremente im gleichem Lauf: + L #Dyn.Teach_Ink;//Inkremente bei Teachpunkt + L #Dyn.Ref_Ink;//Inkremente bei Referenzpunkt + -D; + T #Abstands_Ink;//Abstands-Inkremente nach Teachen + + SPA en23; + +w230: L #Max_Wert;//Max. Wert beim Zähler + L #Dyn.Ref_Ink;//Inkremente bei Referenzpunkt + -D; + L #Dyn.Teach_Ink;//Inkremente bei Teachpunkt + +D; + T #Abstands_Ink; + +en23: NOP 0; + +NETWORK +TITLE = Teach-Inkremente in Datenbank abspeichern + L #Dyn.TeachPunkt;//Punkt zum Ein-Teachen + T "MW200"; + + CALL "DatenOut" + ( SSDB := #Para.Weichen_DL_DB , + SSDW := #Para.Weichen_DL_DW , + PARA := WORD#16#0000 , //Nach angegeben Datensatz suchen + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M200.0 , + Position := "MW196" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_Teach_OUT; + + U "M199.7";//Datensatz ist vorhanden + SPB w240; + + U "M199.6";//Datensatz ist nicht vorhanden + = #Dyn.Error.Keine_TeachPktdaten;//Teach-Punkt in Datenliste nicht vorhanden ! + R #Dyn.Status.TeachModus_Aktiv;//Teach-Modus ist aktiv + BEB; + + SET; + R #Dyn.Status.TeachModus_Aktiv;//Teach-Modus ist aktiv + S #Dyn.Error.TeachPkt_Datenliste_Err; + + BEA; + +w240: L #Abstands_Ink; + L #Para.Offset_RefPunkt;//Offset Refpunkt zu SyncPunkt (für Teachen) + +D; + T "MD218"; + + CALL "DatenIn" + ( SSDB := #Para.Weichen_DL_DB , + SSDW := #Para.Weichen_DL_DW , + INDATEN := P#M200.0 , + RE_VAL := "MB199" + ); + UN #Dyn.Status.MoreTeach;//Nächsten Teachpunkt ohne neuen Refpunkt + R #Dyn.Refpunkt_ok;//Referenzpunkt erkannt + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_Teach_IN; + + U "M199.7";//Datensatz ist vorhanden + SPB MORE; + + U "M199.6";//Datensatz ist nicht vorhanden + = #Dyn.Error.Keine_TeachPktdaten;//Teach-Punkt in Datenliste nicht vorhanden ! + R #Dyn.Status.TeachModus_Aktiv;//Teach-Modus ist aktiv + BEB; + + SET; + R #Dyn.Status.TeachModus_Aktiv;//Teach-Modus ist aktiv + S #Dyn.Error.TeachPkt_Datenliste_Err; + + BEA; + +MORE: UN #Dyn.Status.MoreTeach;//Nächsten Teachpunkt ohne neuen Refpunkt + BEB; + + CALL "DatenOut" + ( SSDB := #Para.Weichen_DL_DB , + SSDW := #Para.Weichen_DL_DW , + PARA := WORD#16#FF00 , //Nach nächsten Datensatz suchen + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M200.0 , + Position := "MW196" + ); + + L "MW206";//Weichentyp + L 178;//Sorterweiche ? + <>I;//Nein! + O "M199.2" ;//Listenende erreicht! + SPB TEND; + + L "MW200"; + T #Dyn.TeachPunkt ;//Punkt zum Ein-Teachen + + BEA; + +TEND: L 0; + T #Dyn.TeachPunkt; + + BEA; + +NETWORK +TITLE = Ende +// +// + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Module/MWeiche_Sorter.awl b/=A01+UH07-KF00/Programmbausteine/Module/MWeiche_Sorter.awl index 385cd9c..df47529 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/MWeiche_Sorter.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/MWeiche_Sorter.awl @@ -1,1136 +1,1235 @@ -=== FB 178: MWeiche_Sorter [STL] === -INTERFACE: - Input: - Weichen_Nr : Int // Aufruf für Weiche - KorrekturFaktor : Real - ErrQuit : Bool // Ablaufstörung quittieren - Stau_Ausfahrtbereich : Bool // Ausfahrtsbereich hat Stau - B_Gerade : Bool // Kontroll-Sensor nach Weiche Gerade - B_Ausfahrt : Bool // Kontroll-Sensor nach Weiche Ausfahrt - Antrieb_aktiv : Bool // Kreisel-Antrieb aktiv - Output: - Y_Weiche_abzweigen : Bool // Weiche auf Abzweig schalten - Y_Weiche_geradeaus : Bool // Weiche auf Gerade schalten - Error : Word // Störungen übergeben - InOut: - Antrieb_start : Bool // Kreiselantrieb starten - Antrieb_stoppen : Bool // Kreiselantrieb stoppen - hStOk : Bool // Anzeige Start n. Störung aktivieren - Static: - SAVE : Struct - IDX_Flag : Bool // Hauptstrang_DL +1 durchsuchen - Kontroll_Flag : Bool // Hauptstrang_DL +1 durchsuchen - Teil_IDX_Old : DInt // BT/MT-IDX (wurde bei Auslagerung gemeldet) - Para : Struct // Parameter - Weichen_DL_DB : Int // Einsprung Weichen-Datenliste-DB - Weichen_DL_DW : Int // Einsprung Weichen-Datenliste-DW - Res : Array[1..3] of Int // Reserve - Weiche : "UDLWeiche_Sorter" // Fahrbereichs Daten - Dyn : Struct // Dynamische Daten fürs Einfahren - Status : Struct // Status - Schalttakte : DInt // Anzahl der getätigten Umschaltungen - Strecke_gesperrt : Bool // Gefällestrecke ist gesperrt - Strecke_voll : Bool // Gefällestrecke ist voll - Weiche_abzweigen : Bool // Weiche auf Abzweig schalten - Weiche_geradeaus : Bool // Weiche auf Gerade schalten - TeachModus_aktiv : Bool // Teach-Modus ist aktiv - Res45 : Bool - Weichentest_aktiv : Bool // Testschaltung für Einfahrweiche aktiviert - Reset : Bool := TRUE // Reset Einfahrseite starten - Ziel_unbekannt : Bool // Ziel des BT ist unbekannt - Rueckmld : Struct - RET_VAL_BLKMOV_Weiche : Int // Rückmeldung nach BLKMOV-Aufruf - RET_VAL_DL_Weichen : Byte // Rückmeldung nach DatenOut-Aufruf - RET_VAL_Sortliste_Out : Byte // Rückmeldung nach Sortdaten-Out-Aufruf - RET_VAL_SendFIFO : Byte // Rückmeldung nach SendPC_FIFO-Aufruf - Error : "UErrWeiche_Sorter" - Ink_Wert : DInt // Aktueller Inkrementalwert - Max_Wert : DInt // Maximal erlaubter Zählwert - Lauf_Flag : Bool // Zähl-Lauf mit Flag ist aktiv - Flag_Lauf_fertig : Bool // Flag-Lauf wurde beendet - Ohne_Lauf_fertig : Bool // Ohne Flag-Lauf wurde beendet - Hauptstrang_Flag : Bool // Flag zum Weiche schalten (vom Hauptstrang) - Last_Flag : Bool // Flag des letzten durchfahrenden Teils - GSTschalt_Flag : Bool // Flag bei Weiche auf GST schalten - Carr : Bool // CARR-Telegramm muss noch gesendet werden - Puffer_IDX : Bool // Trolley-ID in Puffer eintragen - Ohne_VerklemmKontrolle : Bool // Verklemmkontrolle ausschalten - BM_raus : Bool // BM wurde ausgeschleußt (1 Zyklus) - BM_gerade : Bool // BM wurde gerade gefahren (1 Zyklus) - Max_raus : Bool // Max_Wert wurde schon übertragen - Hauptstrang_Ink : DInt // Inkremente zum Weiche schalten (vom Hauptstrang) - Hauptstrang_Sortliste : Int // Sortliste aus welcher Hauptstrangdaten sind - Hauptstrang_Search_Ink : DInt // Inkremente zum Daten auslesen (Start-Ink) - Hauptstrang_Pos : Int // Aktuelle Position der Daten in Datenliste - GSTschalt_Ink : DInt // Inkremente zum Weiche auf GST schalten - Last_Ink : DInt // Inkremente des letzten durchfahrenden Teils - Last_IDX : DInt // IDX des letzten durchfahrenden Teils - FahrKontrolle : Struct - Ohne_VerklemmKontrolle : Bool // Verklemmkontrolle ausschalten - BT_Gerade : Bool // BM fährt geradeaus durch Weichenbereich - BT_Ausfahrt : Bool // BM fährt aus Weichenbereich - BM_Gerade_erkannt : Bool // Geradeausfahrendes BM wurde erkannt - Gerade_Neg : Bool // Geradeaus: Kontroll-Time ist negativ - BM_Ausfahrt_erkannt : Bool // Ausfahrendes BM wurde erkannt - Ausfahrt_Neg : Bool // Ausfahrend: Kontroll-Time ist negativ - Kontroll_Time_Gerade : Int // Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] - Kontroll_Time_Ausfahrt : Int // Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] - Time_Ausfahrt : Int // Diese Zeit benötigt BM zum Ausfahren [100ms] - Res128 : Array[1..1] of Int // Reserve - Daten : "UBT_Daten" - Kontroll_IDX : DInt // IDX des zu kontollierenden Teils - Res200 : Array[1..23] of Int // Reserve - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Del : Bool // Nur Sortdaten löschen - Error_SendFIFO : Bool - FC86_Para : Word // Parameter-Übergabe - Hauptstrang_Ink : DInt // Inkremente zum Weiche schalten (vom Hauptstrang) - Parameter : Word // Parameter - Freigabe : Int - Carr_Ziel : Int // Ziel, das bei Carr-Telegramm gemeldet wird - DatenDB : Int // DB öffnen - sKorrekturFaktor : Real // Korrektur-Faktor wegen Kettenlängung - AR1Start : DInt // Startwert mit Offset 0 - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - Constant: - ---- NW 1: Parameter-Übergabe --- - L Weichen_Nr // Aufruf-Parameter (für Baustein beobachten) - - L "MW178" // Einsprung Weichen-DL - T Para.Weichen_DL_DB // vor Aufruf übergeben! - L 0 - T Para.Weichen_DL_DW - - ---- NW 2: Eingangsvariablen einlesen --- - L KorrekturFaktor - T sKorrekturFaktor - - ---- NW 3: Für Inbetriebnahme --- -// Beim Teachen Weiche auf gerade: - A Dyn.Status.TeachModus_aktiv - S Y_Weiche_geradeaus // Weiche auf gerade schalten - R Y_Weiche_abzweigen - R Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten - R Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten - BEC - -// Weichentest: - AN Dyn.Status.Weichentest_aktiv - JC en01 - - A "Clock_1Hz" - = Y_Weiche_abzweigen // Weiche zyklisch umschalten - NEG - = Y_Weiche_geradeaus - - SET - R Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten - R Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten - - BEU - -en01: NOP 0 - - ---- NW 4: Gesamt: Out-Bits zum Zurücksetzen --- - SET - R Y_Weiche_abzweigen // Weiche auf Abzweig schalten - R Y_Weiche_geradeaus // Weiche auf gerade schalten - R Dyn.BM_raus // BM wurde ausgeschleußt (1 Zyklus) - R Dyn.BM_gerade // BM wurde gerade gefahren (1 Zyklus) - - ---- NW 5: Statische Weichen-Parameter holen --- - L Weiche.Weichen_Nr // Nummer der Weiche - L Weichen_Nr // Aufruf-Parameter - ==I // Identisch ? - R Dyn.Error.Weichen_DL // Weichendatenbank fehlerhaft - R Dyn.Error.Undef_Weiche // undefinierte Weiche - JC en06 // Ja ! - - T "MW200" // Search-Daten - -CALL FC "DatenOut" (SSDB:=Para.Weichen_DL_DB, SSDW:=Para.Weichen_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196") - - L "MB199" - T Dyn.Rueckmld.RET_VAL_DL_Weichen // Rückmeldung bei Datenbank-Zugriff (Gefälle-DL) - - JBI G_Ok - - A "M199.0" - = Dyn.Error.Weichen_DL // Weichendatenbank fehlerhaft - BEC - - SET - S Dyn.Error.Undef_Weiche // undefinierte Weiche - - BEU - -// Kennung + Datenbytes -G_Ok: SET - R Dyn.Error.Weichen_DL // Weichendatenbank fehlerhaft - R Dyn.Error.Undef_Weiche // undefinierte Weiche - - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 40 // Datenwords speichern - T LW2 // Wiederholungen - -// Quelle-Pointer erzeugen: - L 0 // Bei Merker = 0 ! - T LW4 // DB_Nummer - L 220 // Adresse - SLD 3 - L 16#8300_0000 // Kennung: Merker - OD - T LD6 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche, DSTBLK:=Weiche) // Datenliste-Daten speichern | #Ziel - - L Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Dyn.Error.BLKMov // Error bei Block kopieren - BEC - - L Weiche.Weichen_Typ // Weichentyp = 178 (Weiche) - L 178 // Dieser Aufruf-FB ? - ==I // Ja ! - JC en06 - - SET - S Dyn.Error.Undef_Weiche // undefinierte Weiche - - L 0 // Weiche ungültig ! - T Weiche.Weichen_Nr // Nummer der Weiche - - BEU - -en06: NOP 0 - - ---- NW 6: - --- - AN Dyn.Status.Reset - JC En06_Mig - -// Dyn.Daten löschen: - SET - R Dyn.Status.Reset - R Dyn.Status.Strecke_voll - R Y_Weiche_abzweigen // Weiche auf Abzweig schalten - S Y_Weiche_geradeaus // Weiche auf gerade schalten - R Dyn.Status.Weichentest_aktiv - R Dyn.Hauptstrang_Flag - R Dyn.Last_Flag - R Dyn.FahrKontrolle.BT_Gerade // BM fährt geradeaus durch Weichenbereich - R Dyn.FahrKontrolle.BT_Ausfahrt // BM fährt aus Weichenbereich - R Dyn.FahrKontrolle.Gerade_Neg // Geradeaus: Kontroll-Time ist negativ - R Dyn.FahrKontrolle.Ausfahrt_Neg // Ausfahrend: Kontroll-Time ist negativ -// / R #Dyn.Ohne_VerklemmKontrolle //Verklemmkontrolle ausschalten - R Dyn.Max_raus // Max_Wert wurde schon übertragen - - A Weiche.Parameter.Weichen_GST_gerade - = Dyn.Status.Weiche_geradeaus - A Weiche.Parameter.Weichen_GST_abzweig - AN Weiche.Parameter.Weichen_GST_gerade - = Dyn.Status.Weiche_abzweigen - - L 0 - T Dyn.Hauptstrang_Ink - T Dyn.Hauptstrang_Search_Ink - T Dyn.Last_Ink - - L 0 - T Dyn.Hauptstrang_Sortliste - T Dyn.FahrKontrolle.Kontroll_Time_Gerade // Innerhalb dieser Zeit muss BM Weiche verlassen haben [100ms] - T Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt // Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] - - L DINT#0 - T Kontroll_IDX - T Dyn.Last_IDX - -// Rückmeldungen löschen: - L 0 - T Dyn.Rueckmld.RET_VAL_DL_Weichen - T Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche - T Dyn.Rueckmld.RET_VAL_Sortliste_Out - -// Störungen löschen: - SET - R Dyn.Error.Weichen_DL - R Dyn.Error.Undef_Weiche - R Dyn.Error.BLKMov - R Dyn.Error.Haupstrang_DL - R Dyn.Error.Haupstrang_DL_voll - R Dyn.Error.Keine_HSDaten - R Dyn.Error.Rein_FIFO - R Dyn.Error.Keine_FIFODaten - R Dyn.Error.Stau_AusfahrBereich - R Dyn.Error.BM_verklemmt_Gerade - R Dyn.Error.BM_verklemmt_Ausfahrt - R Dyn.Error.BM_undef_Gerade - R Dyn.Error.Frei14 - R Dyn.Error.Send_FIFO_fehlerhaft // Send-FIFO zum PC ist fehlerhaft - R Dyn.Error.Send_FIFO_voll // Send-FIFO zu PC ist voll - R Dyn.Error.Reset_aktiv // Reset ist aktiv - - L 0 // Damit statische Werte neu aus Datenbank geholt werden ! - T Weiche.Weichen_Nr // Nummer der Weiche - - BEU - -En06_Mig: NOP 0 - - ---- NW 7: Störungen nach Außen übergeben --- - L 0 - T "MB200" - - A Dyn.Error.Weichen_DL // Weichen-Datenliste fehlerhaft - = "M200.0" - A Dyn.Error.Undef_Weiche // undefinierte Weiche - = "M200.1" - A Dyn.Error.BLKMov // Fehler bei Block kopieren - = "M200.2" - A Dyn.Error.Haupstrang_DL // Haupstrang-Datenliste fehlerhaft - = "M200.3" - A Dyn.Error.Haupstrang_DL_voll // Haupstrang-Datenliste ist voll - = "M200.4" - A Dyn.Error.Keine_HSDaten // Keine Hauptstrang-Daten mehr vorhanden - = "M200.5" - A Dyn.Error.Rein_FIFO // Rein-FIFO fehlerhaft - = "M200.6" - A Dyn.Error.Keine_FIFODaten // Keine Rein-Daten mehr vorhanden - = "M200.7" - A Dyn.Error.Stau_AusfahrBereich // Stau im Ausfahrbereich (-> Antrieb stoppen) - = "M201.0" - A Dyn.Error.BM_verklemmt_Gerade // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) - = "M201.1" - A Dyn.Error.BM_verklemmt_Ausfahrt // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen) - = "M201.2" - A Dyn.Error.BM_undef_Gerade // undefiniertes BM bei Weiterfahrt erkannt - = "M201.3" - A Dyn.Error.Frei14 - = "M201.4" - A Dyn.Error.Send_FIFO_fehlerhaft // Send-FIFO zum PC ist fehlerhaft - = "M201.5" - A Dyn.Error.Send_FIFO_voll // Send-FIFO zu PC ist voll - = "M201.6" - CLR // Reset ist aktiv (gibts nicht!) - = Dyn.Error.Reset_aktiv - = "M201.7" - - L "MW200" - T Error // Schnittstelle nach Außen - -// Kreiselantrieb stoppen: - AN Stau_Ausfahrtbereich // Ausfahrtsbereich hat Stau - R Dyn.Error.Stau_AusfahrBereich // Stau im Ausfahrbereich (-> Antrieb stoppen) - -// Antrieb stoppen: - A( - O Dyn.Error.BM_verklemmt_Ausfahrt // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen) - O Dyn.Error.BM_verklemmt_Gerade // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) - ) - AN ErrQuit - O Dyn.Error.Stau_AusfahrBereich // Stau im Ausfahrbereich (-> Antrieb stoppen) - O Dyn.Error.Send_FIFO_fehlerhaft // Send-FIFO zum PC ist fehlerhaft - O Dyn.Error.Send_FIFO_voll // Send-FIFO zu PC ist voll - S Antrieb_stoppen // Kreiselantrieb stoppen - -// Anzeige Start n. Störung aktivieren: - A Dyn.Error.BM_verklemmt_Ausfahrt // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen) - O Dyn.Error.BM_verklemmt_Gerade // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) - O Dyn.Error.Stau_AusfahrBereich // Stau im Ausfahrbereich (-> Antrieb stoppen) - S hStOk - - ---- NW 8: Daten des Inkremental-Gebers holen / Zeit-Inkremente --- - L Weiche.Ink_DB // DB-Nr des Inkremental-Geber - L 0 // angegeben ? - <=I // Nein ! - JC w040 - - CAC - T "MW200" - OPN DB["MW200"] // Zähler-DB öffnen - L DBD80 - T Dyn.Ink_Wert - L DBD76 - T Dyn.Max_Wert - A DBX74.3 - = Dyn.Lauf_Flag - A DBX74.4 - = Dyn.Flag_Lauf_fertig - A DBX74.5 - = Dyn.Ohne_Lauf_fertig - - JU en04 - -// Zeit-Inkremente erzeugen: -w040: AN Antrieb_aktiv - JC w041 - - L "MW4" // 10ms-Takte - ITD - L Dyn.Ink_Wert - +D // Aktueller Zählerwert +100ms-Takte - T Dyn.Ink_Wert - -w041: L DINT#10000 // Festwert: 10000 (100s) - T Dyn.Max_Wert - - L Dyn.Ink_Wert // Aktueller Zählerwert - L Dyn.Max_Wert // Max. Wert erreicht ? - <=D // Nein ! - R Dyn.Ohne_Lauf_fertig // Ohne Flag-Lauf wurde beendet - R Dyn.Flag_Lauf_fertig // Flag-Lauf wurde beendet - JC en04 - - -D // Restwert als Startwert nehmen ! - T Dyn.Ink_Wert - - AN Dyn.Lauf_Flag // Umschaltung Zähl-Lauf ohne-mit-ohne Flag - = Dyn.Ohne_Lauf_fertig // Ohne Flag-Lauf wurde beendet - A Dyn.Lauf_Flag // Umschaltung Zähl-Lauf ohne-mit-ohne Flag - = Dyn.Flag_Lauf_fertig // Flag-Lauf wurde beendet - - AN Dyn.Lauf_Flag // Umschaltung Zähl-Lauf ohne-mit-ohne Flag - = Dyn.Lauf_Flag - -en04: NOP 0 - - ---- NW 9: - --- - A "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - AN B_Gerade - R Dyn.Error.BM_undef_Gerade // undefiniertes BM bei Weiterfahrt erkannt - - AN ErrQuit - JC En08 - -// Störungen löschen: - SET - R Dyn.Error.BM_undef_Gerade - R Dyn.Error.Frei14 - - A "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - A Dyn.Error.BM_verklemmt_Gerade - CLR // Nie da große Trolleys - R Dyn.Error.BM_verklemmt_Gerade - R Dyn.FahrKontrolle.BT_Gerade - - A "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - A Dyn.Error.BM_verklemmt_Ausfahrt - CLR // Nie da große Trolleys - R Dyn.Error.BM_verklemmt_Ausfahrt - R Dyn.FahrKontrolle.BT_Ausfahrt - -// Kann nur über Reset zurückgesetzt werden: -// R #Dyn.Error.Weichen_DL -// R #Dyn.Error.Undef_Weiche -// R #Dyn.Error.BLKMov -// R #Dyn.Error.Haupstrang_DL -// R #Dyn.Error.Haupstrang_DL_voll -// R #Dyn.Error.Keine_HSDaten -// R #Dyn.Error.Rein_FIFO -// R #Dyn.Error.Keine_FIFODaten -// R #Dyn.Error.Stau_AusfahrBereich -// R #Dyn.Error.BM_verklemmt_Gerade -// R #Dyn.Error.BM_verklemmt_Ausfahrt -// R #Dyn.Error.Send_FIFO_fehlerhaft //Send-FIFO zum PC ist fehlerhaft -// R #Dyn.Error.Send_FIFO_voll //Send-FIFO zu PC ist voll -// R #Dyn.Error.Reset_aktiv //Reset ist aktiv - -En08: NOP 0 - - ---- NW 10: Schaltpunkt aufgrund von Hauptstrangdaten suchen --- - L Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - L DINT#0 // schon bekannt ? - >D // Ja ! - S Antrieb_start // Kreiselantrieb starten - JC Nw09 - -// Nach neuen Daten suchen: - AN "Weiche_NewData" // Im Weichenbereich nach neuen Daten suchen - JC w076 - - L Dyn.Ink_Wert // Aktueller Inkrementalwert - L Weiche.Off_Ink // Inkremente zum Weiche schalten - >D // Gleiches Flag/Flag wie Inkgeber zum Suchen - JC w071 - -// Anders Flag/Liste wie Inkgeber zum Suchen: - L Weiche.Hauptstrang_DL_DB - - A Dyn.Lauf_Flag // Inkgeber schon mit Lauf-Flag - R SAVE.IDX_Flag // Hauptstrang_DL +1 durchsuchen - JC w070 - - SET - S SAVE.IDX_Flag // Hauptstrang_DL +1 durchsuchen - - + 1 - -w070: T Dyn.Hauptstrang_Sortliste // Sortliste aus welcher Hauptstrangdaten sind - - JU w073 - -// Gleiches Flag/Liste wie Inkgeber zum Suchen: -w071: L Weiche.Hauptstrang_DL_DB - - AN Dyn.Lauf_Flag // Inkgebeer ohne Lauf-Flag - R SAVE.IDX_Flag // Hauptstrang_DL +1 durchsuchen - JC w072 - - SET - S SAVE.IDX_Flag // Hauptstrang_DL +1 durchsuchen - - + 1 - -w072: T Dyn.Hauptstrang_Sortliste // Sortliste aus welcher Hauptstrangdaten sind - -// Hauptstrang Sortliste nach Position -1 durchsuchen: -w073: CALL FC "DatenFindOffsetSort" (SSDB:=Dyn.Hauptstrang_Sortliste, SSDW:=Weiche.Hauptstrang_DL_DW, PARA:=WORD#16#0B01, SEARCHDATEN:=Weiche.Position_minus, RE_VAL:="MB199", OUTDATEN:=Daten, Position:="MW196") // nach 11.DW (letzte Position) suchen - - L "MB199" - T Dyn.Rueckmld.RET_VAL_Sortliste_Out - - A "M199.7" // Datensatz ist vorhanden - R Dyn.Error.Haupstrang_DL // Sortliste fehlerhaft - JC w074 - - A "M199.6" // Datensatz ist nicht vorhanden - R Dyn.Error.Haupstrang_DL // Sortliste fehlerhaft - JC Nw09 // Warten, da noch keine Daten vorhanden - - SET - S Dyn.Error.Haupstrang_DL // Sortliste fehlerhaft - -w076: L 0 // Keine Daten auf Hauptstrang vorhanden - T Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - - JU Nw09 - -// Search-Ink speichern: -w074: L Daten.Start_Ink // Stamm-Daten speichern - T Dyn.Hauptstrang_Search_Ink // Inkremente zum Daten auslesen (Start-Ink) - -// Hauptstrang-Schaltdaten errechnen/speichern: -// Kettenlängungs-Korrektur: - L sKorrekturFaktor // Korrektur-Faktor wegen Kettenlängung - L 0.995 // sinnvoller Wert ? (maximal 0,5% Abweichung erlaubt) - >=R // Ja ! - A( - CAC - L 1.005 - <=R - ) - JC w075 - - L 1.0 // dann ohne Korrektur ! - T sKorrekturFaktor // Korrektur-Faktor wegen Kettenlängung - -// Schaltdaten errechnen: -w075: A Daten.Start_Flag // Lauf-Flag bei Start-Inkremente - = Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang) - - L Weiche.Off_Ink // Inkremente zum Weiche schalten - DTR - L sKorrekturFaktor // Korrektur-Faktor wegen Kettenlängung - *R - RND - L Daten.Start_Ink // Daten aus Sortliste dazuaddieren - +D - T Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - L Dyn.Max_Wert // Maximal erlaubter Zählwert - >D - JCN Nw09 - - -D // Restwert übernehmen - T Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - - AN Daten.Start_Flag // Lauf-Flag bei Start-Inkremente (invertieren) - = Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang) - - ---- NW 11: Weiche aufgrund der Hauptstrangdaten schalten --- -Nw09: L Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - L DINT#0 // angegeben ? - <=D // Nein ! - JC w08E - - A Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang) - A Dyn.Flag_Lauf_fertig // Flag-Lauf wurde beendet - O - AN Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang) - A Dyn.Ohne_Lauf_fertig // Flag-Lauf wurde beendet - JC w080 // beim Ende des Lauf sind Inkremente uninteressant - - A Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang) - A Dyn.Lauf_Flag // Zähl-Lauf mit Flag ist aktiv - O - AN Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang) - AN Dyn.Lauf_Flag // Zähl-Lauf mit Flag ist aktiv - JCN en08_Mig - - L Dyn.Ink_Wert // Aktuelle Inkrementalwert - L Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - I // BM soll nicht ausfahren ! - ON Weiche.Parameter.ErsatzZiel_bei_Stau // Bei Stau soll Ersatz-Ziel angefahren werden - ON Stau_Ausfahrtbereich - JC x081 - - L Weiche.ErsatzZiel // Ersatz-Ziel übergeben - T Daten.Sort_Info.Teil_Ziel - -x081: L Daten.Sort_Info.Teil_Ziel // Ziel des BT (aufgrund vom Hauptstrang) - L 0 - <=I - = Dyn.Status.Ziel_unbekannt // Ziel des BT ist unbekannt - - A Dyn.Status.Ziel_unbekannt // Ziel des BT ist unbekannt - A Weiche.Parameter.Weichen_GST_gerade - AN Weiche.Parameter.Weichen_GST_abzweig - JC x100 // BT mit unbekanntem Ziel geradeaus fahren - - A Dyn.Status.Ziel_unbekannt // Ziel des BT ist unbekannt - AN Weiche.Parameter.Weichen_GST_gerade - A Weiche.Parameter.Weichen_GST_abzweig - JC w082 // BT mit unbekanntem Ziel ausfahren - - L Daten.Sort_Info.Teil_Ziel // Ziel des BT (aufgrund vom Hauptstrang) - L Weiche.AbzweigZiel // Bei diesem Ziel Weiche auf Abzweig schalten + Carl - T Carr_Ziel // Ziel, das bei Carr-Telegramm gemeldet wird - ==I // BM soll ausfahren - S Dyn.Carr // CARR-Telegramm muss noch gesendet werden - S Dyn.Puffer_IDX // Trolley-ID in Puffer eintragen - JC w082 // Teil ausfahren - - L Daten.Sort_Info.Teil_Ziel // Ziel des BT (aufgrund vom Hauptstrang) - L Weiche.GeradeZiel // Bei diesem Ziel Weiche auf Gerade schalten + Carl - <>I // BM soll also ausfahren, da nicht das GeradeZiel! - A( - L 0 // sinnvolle Angabe ? - >I // Ja ! - ) - JC w082 // Teil ausfahren (ohne CARR, da undef. rausfahren!) - -// Teile geradeaus fahren:****************************************************************************************************** -x100: SET - S Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten - R Dyn.Status.Weiche_abzweigen - S Dyn.BM_gerade // BM wurde gerade gefahren (1 Zyklus) - -// Verklemm-Kontroll-Info speichern: - AN Weiche.Parameter.Kontroll_B_Gerade // Kontroll-Sensor bei Weiterfahrt (gerade) - JC k100 // Letzter BM noch nicht kontrolliert - - A Dyn.FahrKontrolle.BT_Gerade // BM fährt geradeaus durch Weichenbereich - JC k100 // Letzter BM noch nicht kontrolliert - - L Dyn.Last_IDX // IDX des letzten durchfahrenden Teils - T Kontroll_IDX // IDX des zu kontollierenden Teils - A SAVE.IDX_Flag // Hauptstrang_DL +1 durchsuchen - = SAVE.Kontroll_Flag // Hauptstrang_DL +1 durchsuchen - - L Weiche.Kontroll_Zeit_gerade // Nach dieser Zeit muss BM Weichenbereich verlassen haben [100ms] - T Dyn.FahrKontrolle.Kontroll_Time_Gerade // Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] - - SET - S Dyn.FahrKontrolle.BT_Gerade // BM fährt geradeaus durch Weichenbereich - R Dyn.FahrKontrolle.Gerade_Neg // Geradeaus: Kontroll-Time ist negativ - -// CARR-Telegramm erwünscht ?: -k100: L Daten.Sort_Info.Teil_Ziel // Ziel des BT (aufgrund vom Hauptstrang) - L Weiche.GeradeZiel // Bei diesem Ziel Weiche auf Gerade schalten + Carl - T Carr_Ziel // Ziel, das bei Carr-Telegramm gemeldet wird - ==I // BM soll ausfahren - S Dyn.Carr // CARR-Telegramm muss noch gesendet werden - - A Weiche.Parameter.Letzte_Weiche // Letzte Weiche im Verbund - S Del // Nur Sortdaten löschen - JC w084 // Daten aus Sortliste löschen - -// Letzte Position neu speichern: -New: L Weiche.Weichen_Nr // Nummer der Weiche - T Daten.letzte_Position // Letzte Position, wo Teil vorbeigefahren ist - -CALL FC "DatenIn" (SSDB:=Dyn.Hauptstrang_Sortliste, SSDW:=Weiche.Hauptstrang_DL_DW, INDATEN:=Daten, RE_VAL:="MB199") - - L "MB199" - T Dyn.Rueckmld.RET_VAL_Sortliste_Out - - A "M199.7" // Datensatz ist vorhanden /Alles Ok) - JC GST - - SET - S Dyn.Error.Haupstrang_DL // Sortliste fehlerhaft - JU GST - -// Teile ausfahren:************************************************************************************************************ -w082: A Dyn.Status.Weiche_abzweigen // Weiche war schon auf Abzweig - JC w083 - - L Dyn.Status.Schalttakte - + DINT#1 // Auf Abzweig umgeschaltet +1 - T Dyn.Status.Schalttakte - -w083: SET - S Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten - R Dyn.Status.Weiche_geradeaus - R Del // Nur Sortdaten löschen - S Dyn.BM_raus // BM wurde ausgeschleußt (1 Zyklus) - - L 300 // Nach dieser Zeit ist BM ausgefahren [300*100ms] - T Dyn.FahrKontrolle.Time_Ausfahrt // Diese Zeit benötigt BM zum Ausfahren [100ms] - -// Verklemm-Kontroll-Info speichern: - AN Weiche.Parameter.Kontroll_B_Ausfahrt // Kontroll-Sensor bei Ausfahrt (abzweig) - JC k101 // Letzter BM noch nicht kontrolliert - - A Dyn.FahrKontrolle.BT_Ausfahrt // BM fährt aus Weichenbereich - JC k101 // Letzter BM noch nicht kontrolliert - - L Dyn.Last_IDX // IDX des letzten durchfahrenden Teils - T Kontroll_IDX // IDX des zu kontollierenden Teils - A SAVE.IDX_Flag // Hauptstrang_DL +1 durchsuchen - = SAVE.Kontroll_Flag // Hauptstrang_DL +1 durchsuchen - - L Weiche.Kontroll_Zeit_abzweigen // Nach dieser Zeit muss BM Weichenbereich verlassen haben [100ms] - T Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt // Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] - - SET - S Dyn.FahrKontrolle.BT_Ausfahrt // BM fährt aus Weichenbereich - R Dyn.FahrKontrolle.Ausfahrt_Neg // Ausfahrend: Kontroll-Time ist negativ - -k101: A Stau_Ausfahrtbereich // Ausfahrtsbereich hat Stau - AN Weiche.Parameter.ErsatzZiel_bei_Stau // Bei Stau soll Ersatz-Ziel angefahren werden - S Dyn.Error.Stau_AusfahrBereich // Stau im Ausfahrbereich (-> Antrieb stoppen) - -// Falls Entlade-Weiche neues Leer-Ziel übergeben: - AN Weiche.Parameter.Entlade_Weiche // BM wird entladen -> Leerziel übergeben - O Weiche.Parameter.Letzte_Weiche // Letzte Weiche im Verbund - JC w084 - - L Weiche.LeerZiel // Nach Entladen des BM dieses Ziel übergeben - T Daten.Sort_Info.Teil_Ziel // BM bei diesem Abwurf-Ziel ausfahren/entladen - L 0 // Sinnvolle Angabe ? - >I // Ja ! - JC New // Daten mit neuem Ziel an Hauptstrang übergeben ! - -// Daten aus Sortliste löschen -w084: L Dyn.Hauptstrang_Pos // Aktuelle Position der Daten in Datenliste - L 16#0E00 // 0EYY: DS YY löschen - OW - T FC86_Para - -CALL FC "DatenOutSort" (SSDB:=Dyn.Hauptstrang_Sortliste, SSDW:=Weiche.Hauptstrang_DL_DW, PARA:=FC86_Para, OUTDATEN:=Daten, RE_VAL:="MB199") // DS YY löschen - -// GST-Schalt-Inks speichern: -GST: AN Weiche.Parameter.Weichen_GST_gerade - AN Weiche.Parameter.Weichen_GST_abzweig - JC w08E - - L Weiche.Ink_Schaltdauer // Inkremente (Fenster), danach wird Weiche in GST geschaltet - L 0 // sinnvoller Wert ? - <=I // Nein ! - JC w08E - - L Weiche.Ink_Schaltdauer // Inkremente (Fenster), danach wird Weiche in GST geschaltet - ITD - L Dyn.Ink_Wert // Aktueller Inkrementalwert - +D - T Dyn.GSTschalt_Ink // Inkremente bei Weiche auf GST schalten - A Dyn.Lauf_Flag // Zähl-Lauf mit Flag ist aktiv - = Dyn.GSTschalt_Flag // Flag bei Weiche auf GST schalten - - L Dyn.Max_Wert // Maximal erlaubter Zählwert überschritten ? - <=D // Nein ! - JC w08E - - -D // Restwert übernehmen - T Dyn.GSTschalt_Ink // Inkremente bei Weiche auf GST schalten - AN Dyn.Lauf_Flag // Zähl-Lauf mit Flag ist aktiv (invertieren, da Überlauf!) - = Dyn.GSTschalt_Flag // Flag bei Weiche auf GST schalten - -w08E: L DINT#0 - T Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - -en08_Mig: NOP 0 - - ---- NW 12: Weiche auf GST zurückschalten --- - L Dyn.GSTschalt_Ink // Inkremente bei Weiche auf GST schalten - L 0 // sinnvolle Angabe ? - <=D // Nein ! - JC X111 - - A Dyn.GSTschalt_Flag // Flag bei Weiche auf GST schalten - A Dyn.Flag_Lauf_fertig // Flag-Lauf wurde beendet - O - AN Dyn.GSTschalt_Flag // Flag bei Weiche auf GST schalten - A Dyn.Ohne_Lauf_fertig // Flag-Lauf wurde beendet - JC w110 // beim Ende des Lauf sind Inkremente uninteressant - - A Dyn.GSTschalt_Flag // Flag bei Weiche auf GST schalten - A Dyn.Lauf_Flag // Zähl-Lauf mit Flag ist aktiv - O - AN Dyn.GSTschalt_Flag // Flag bei Weiche auf GST schalten - AN Dyn.Lauf_Flag // Zähl-Lauf mit Flag ist aktiv - JCN en11 - - L Dyn.Ink_Wert // Aktuelle Inkrementalwert - L Dyn.GSTschalt_Ink // Inkremente bei Weiche auf GST schalten - D // Haupstrangdaten sind kleiner - A( - L 0 // sinnvolle Hauptstrang-Daten ? - <>D // Ja ! - ) - JC X111 // Nicht auf GST schalten, da nächste Daten schon kommen ! - -// Weiche auf GST schalten: - A Weiche.Parameter.Weichen_GST_gerade - AN Weiche.Parameter.Weichen_GST_abzweig - JCN W110_Mig // Negierter Sprung ! - - A Dyn.FahrKontrolle.BT_Ausfahrt // BM fährt aus Weichenbereich - O Dyn.Error.BM_verklemmt_Ausfahrt // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen) - JC en11 // Warten - - SET - S Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten - R Dyn.Status.Weiche_abzweigen - JU X111 - -W110_Mig: A Weiche.Parameter.Weichen_GST_abzweig - AN Weiche.Parameter.Weichen_GST_gerade - JCN X111 // Negierter Sprung ! - - A Dyn.FahrKontrolle.BT_Gerade // BM fährt geradeaus durch Weichenbereich - O Dyn.Error.BM_verklemmt_Gerade // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) - JC en11 // Warten - - SET - S Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten - R Dyn.Status.Weiche_geradeaus - -X111: L DINT#0 - T Dyn.GSTschalt_Ink // Inkremente bei Weiche auf GST schalten - SET - R Dyn.GSTschalt_Flag // Flag bei Weiche auf GST schalten - -en11: NOP 0 - - ---- NW 13: Weichenbereich auf verklemmte gerade fahrende BM kontrollieren --- - AN Weiche.Parameter.Kontroll_B_Gerade // Kontroll-Sensor bei Weiterfahrt (gerade) - O Dyn.Ohne_VerklemmKontrolle // Verklemmkontrolle ausschalten - O "Hauptstrang_leer" - R Dyn.FahrKontrolle.BT_Gerade // BM fährt geradeaus durch Weichenbereich - R Dyn.FahrKontrolle.BM_Gerade_erkannt // Geradeausfahrendes BM wurde erkannt - R Dyn.Error.BM_verklemmt_Gerade // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) - R Dyn.Error.BM_undef_Gerade // undefiniertes BM bei Weiterfahrt erkannt - S Dyn.FahrKontrolle.Gerade_Neg // Geradeaus: Kontroll-Time ist negativ - JC Nw17 - -// BM fährt geradeaus: - A B_Gerade // Kontroll-Sensor nach Weiche Gerade - AN Dyn.FahrKontrolle.BM_Gerade_erkannt // Geradeausfahrendes BM wurde erkannt - A Dyn.FahrKontrolle.BT_Gerade // BM fährt geradeaus durch Weichenbereich - R Dyn.FahrKontrolle.BT_Gerade - S Dyn.FahrKontrolle.BM_Gerade_erkannt // Geradeausfahrendes BM wurde erkannt - - AN B_Gerade // Kontroll-Sensor nach Weiche Gerade - R Dyn.FahrKontrolle.BM_Gerade_erkannt // Geradeausfahrendes BM wurde erkannt - - L Dyn.Last_IDX // IDX des letzten durchfahrenden Teils - T Kontroll_IDX // IDX des zu kontollierenden Teils - A SAVE.IDX_Flag // Hauptstrang_DL +1 durchsuchen - = SAVE.Kontroll_Flag // Hauptstrang_DL +1 durchsuchen - - JU Q_G - -N_G: L Weiche.Kontroll_Zeit_gerade // Nach dieser Zeit muss BM Weichenbereich verlassen haben [100ms] - T Dyn.FahrKontrolle.Kontroll_Time_Gerade // Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] - -Q_G: A ErrQuit - AN Dyn.FahrKontrolle.BT_Gerade // BM fährt geradeaus durch Weichenbereich - R Dyn.Error.BM_verklemmt_Gerade // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) - -// Zeit verändern: - AN Antrieb_aktiv // Band ist aktiv - ON "100ms-Impuls" - O Dyn.Error.BM_verklemmt_Gerade // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) - JC Un_G - - L Dyn.FahrKontrolle.Kontroll_Time_Gerade // Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] - L "MW2" // Anzahl der 100ms-Takte - -I - T Dyn.FahrKontrolle.Kontroll_Time_Gerade // Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] - L 0 // Kontroll-Zeit abgelaufen ? - >I // Nein ! - R Dyn.FahrKontrolle.Gerade_Neg // Geradeaus: Kontroll-Time ist negativ - JC en16 - -// BM verklemmt ?: - A Dyn.FahrKontrolle.Gerade_Neg // Geradeaus: Kontroll-Time ist negativ - JC Un_G - - SET - S Dyn.FahrKontrolle.Gerade_Neg // Geradeaus: Kontroll-Time ist negativ - - A Dyn.FahrKontrolle.BT_Gerade // BM fährt geradeaus durch Weichenbereich - S Dyn.Error.BM_verklemmt_Gerade // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) - JC N_G // Zeit neu laden - -// BM undefiniert ?: -Un_G: L Dyn.FahrKontrolle.Kontroll_Time_Gerade // Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] - L Weiche.DraussenZeit_gerade // Nach dieser neg. Zeit [100ms] Error undef.BM, falls Kontroll-Sensor aktiv - >I // Muss BM draussen sein ? Nein ! - JC en16 - - T Dyn.FahrKontrolle.Kontroll_Time_Gerade // Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] - - AN B_Gerade // Kontroll-Sensor nach Weiche Gerade - JC en16 - - SET - S Dyn.Error.BM_undef_Gerade // undefiniertes BM bei Weiterfahrt erkannt - -en16: NOP 0 - - ---- NW 14: Weichenbereich auf verklemmte ausfahrende BM kontrollieren --- -Nw17: AN Weiche.Parameter.Kontroll_B_Ausfahrt // Kontroll-Sensor bei Ausfahrt (abzweig) - O Dyn.Ohne_VerklemmKontrolle // Verklemmkontrolle ausschalten - R Dyn.FahrKontrolle.BT_Ausfahrt // BM fährt aus Weichenbereich - R Dyn.FahrKontrolle.BM_Ausfahrt_erkannt // Ausfahrendes BM wurde erkannt - R Dyn.Error.BM_verklemmt_Ausfahrt // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb gestoppt) - S Dyn.FahrKontrolle.Ausfahrt_Neg // Ausfahrend: Kontroll-Time ist negativ - JC Nw18 - -// BM fährt aus: - A B_Ausfahrt // Kontroll-Sensor nach Weiche Ausfahrt - AN Stau_Ausfahrtbereich // Bei Stau Einzelerkennung nicht mehr möglich! - AN Dyn.FahrKontrolle.BM_Ausfahrt_erkannt // Ausfahrendes BM wurde erkannt - A Dyn.FahrKontrolle.BT_Ausfahrt // BM fährt aus Weichenbereich - R Dyn.FahrKontrolle.BT_Ausfahrt - S Dyn.FahrKontrolle.BM_Ausfahrt_erkannt // Ausfahrendes BM wurde erkannt - - AN B_Ausfahrt // Kontroll-Sensor nach Weiche Ausfahrt - O Stau_Ausfahrtbereich // Bei Stau auch ! - R Dyn.FahrKontrolle.BM_Ausfahrt_erkannt // Ausfahrendes BM wurde erkannt - - JU Q_A - -N_A: L Weiche.Kontroll_Zeit_abzweigen // Nach dieser Zeit muss BM Weichenbereich verlassen haben [100ms] - T Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt // Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] - -Q_A: A ErrQuit // s.u. - SET // Ohne Quittierung - AN Dyn.FahrKontrolle.BT_Ausfahrt // BM fährt aus Weichenbereich - R Dyn.Error.BM_verklemmt_Ausfahrt // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb gestoppt) - -// Zeit verändern: - AN Antrieb_aktiv // Band ist aktiv - ON "100ms-Impuls" - O Dyn.Error.BM_verklemmt_Ausfahrt // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb gestoppt) - JC en17 - - L Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt // Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] - L "MW2" // Anzahl der 100ms-Takte - -I - T Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt // Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] - L 0 // Kontroll-Zeit abgelaufen ? - >I // Nein ! - R Dyn.FahrKontrolle.Ausfahrt_Neg // Ausfahrend: Kontroll-Time ist negativ - JC en17 - -// BM verklemmt ?: - A Dyn.FahrKontrolle.Ausfahrt_Neg // Ausfahrend: Kontroll-Time ist negativ - JC Un_A - - SET - S Dyn.FahrKontrolle.Ausfahrt_Neg // Ausfahrend: Kontroll-Time ist negativ - - A Dyn.FahrKontrolle.BT_Ausfahrt // BM fährt aus Weichenbereich - S Dyn.Error.BM_verklemmt_Ausfahrt // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb gestoppt) - JC N_A // Zeit neu laden - -Un_A: L 0 - T Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt // Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] - -en17: NOP 0 - -// BM fährt aus: -// Zeit verändern: - AN Antrieb_aktiv // Band ist aktiv - ON "100ms-Impuls" - JC En17_Mig - - L Dyn.FahrKontrolle.Time_Ausfahrt // Diese Zeit benötigt BM zum Ausfahren [100ms] - L "MW2" // Anzahl der 100ms-Takte - -I - T Dyn.FahrKontrolle.Time_Ausfahrt // Diese Zeit benötigt BM zum Ausfahren [100ms] - L 0 // Ausfahr-Zeit abgelaufen ? - >I // Nein ! - JC En17_Mig - - T Dyn.FahrKontrolle.Time_Ausfahrt // Minimum übergeben - -En17_Mig: NOP 0 - - ---- NW 15: CARR-Telegramm an PC senden --- -Nw18: AN Weiche.Parameter.PC_Komm_aktiv - ON Dyn.Carr // CARR-Telegramm muss noch gesendet werden - O "SGes".Ohne_PC_Fahren - R Dyn.Carr // CARR-Telegramm muss noch gesendet werden - JC en13 - -// CARR mit dieser IDX schon gesendet?: (wegen Travel-FIFO leer) - L Daten.Sort_Info.Teil_IDX // IDX des BT - T "MD220" - L SAVE.Teil_IDX_Old // BT/MT-IDX (wurde bei Auslagerung gemeldet) - ==D - JC X130 - -// Puffer ermitteln: - L Weiche.AbzweigZiel - + -100 - T "Daten_für_SendFIFO".Puffer_LinienNr - -// Shopgroup ermitteln: -CALL FC "DatenOut" (SSDB:=1000, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=P#M220.0, RE_VAL:="MB199", OUTDATEN:=DB1011.DBX0.0, Position:="MW196") // Eintrag lesen - - L "TrolleyDL_OutDaten".OUTDaten.ShopGroup - T "Daten_für_SendFIFO".StoreGroup - -// Bei leerem Trolley (-1) kein Telegramm: - L DINT#-1 - ==D - JC X130 - -CALL FB "Daten_in_SendFIFO_speichern" , (TelegrammKennung[1]:='B', TelegrammKennung[2]:='S', TelegrammKennung[3]:='R', TelegrammKennung[4]:='e', TelegrammKennung[5]:='s', TelegrammKennung[6]:='p', TelegrammKennung[7]:='M', TelegrammKennung[8]:=?, TelegrammKennung[9]:=?, TelegrammKennung[10]:=?, TrolleyID:=Daten.Sort_Info.Teil_IDX, StationsNr:=?, Puffer_LinienNr:=?, StoreGroup:=?, Status_1_Int:=?, Status_2_Bit[0]:=?, Status_2_Bit[1]:=?, Status_2_Bit[2]:=?, Status_2_Bit[3]:=?, Status_2_Bit[4]:=?, Status_2_Bit[5]:=?, Status_2_Bit[6]:=?, Status_2_Bit[7]:=?, Reserve[1]_Int:=?, Reserve[2]_Int:=?, Port:=1, Ret_Val_FIFO_IN:=?, Error:=Error_SendFIFO) // s.o. | s.o. - - A Error_SendFIFO - JC en13 - -X130: SET - R Dyn.Carr // CARR-Telegramm muss noch gesendet werden - - L Daten.Sort_Info.Teil_IDX // IDX des BT - T SAVE.Teil_IDX_Old // BT/MT-IDX (wurde bei Auslagerung gemeldet) - -en13: NOP 0 - - ---- NW 16: Trolley-ID in Puffer eintragen --- - AN Weiche.Parameter.IDX_an_Puffer - ON Dyn.Puffer_IDX // Trolley-ID in Puffer eintragen - R Dyn.Puffer_IDX // CARR-Telegramm muss noch gesendet werden - JC xn16 - - A Dyn.Status.Ziel_unbekannt // Ziel des BT ist unbekannt - JC X160 - - L Carr_Ziel // Ziel, das bei Carr-Telegramm gemeldet wird (1-20) - T "MW220" - -CALL FC "DatenOut" (SSDB:=275, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=P#M220.0, RE_VAL:="MB199", OUTDATEN:=DB1275.DBX0.0, Position:="MW196") // Eintrag lesen - - L "MB199" - L 2#1111111 // Bit 7 ausblenden - AW - L 0 // Fehler vorhanden? - <>I // Ja - JC X160 - - L "LagerDL_OutDaten".OUTDaten.Puffer_Dyn_DB - T DatenDB // s.u. - - L "LagerDL_OutDaten".OUTDaten.Puffer_Dyn_DW - ITD - T AR1Start // Startwert mit Offset 0 - - L AR1Start // Startwert mit Offset 0 - + DINT#72 // Offset TrolleyID_Einfahrt - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[DatenDB] - - L Daten.Sort_Info.Teil_IDX // IDX des Trolleys an Omnipuffer melden - T DBD [AR1Zeiger] // Lager +1 (DBW 72) - -X160: SET - R Dyn.Puffer_IDX // CARR-Telegramm muss noch gesendet werden - -xn16: NOP 0 - - ---- NW 17: Weiche schalten --- - A Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten - R Dyn.Status.Weiche_geradeaus - = Y_Weiche_abzweigen - - A Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten - = Y_Weiche_geradeaus - - ---- NW 18: Ende --- - BE +FUNCTION_BLOCK "MWeiche_Sorter" +TITLE = Weichen-Modul (AS) +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-960629 +//Version: ILS2100 / 03.02.2010 +// + VAR_INPUT + Weichen_Nr : Int; // Aufruf für Weiche + KorrekturFaktor : Real; + ErrQuit : Bool; // Ablaufstörung quittieren + Stau_Ausfahrtbereich : Bool; // Ausfahrtsbereich hat Stau + B_Gerade : Bool; // Kontroll-Sensor nach Weiche Gerade + B_Ausfahrt : Bool; // Kontroll-Sensor nach Weiche Ausfahrt + Antrieb_aktiv : Bool; // Kreisel-Antrieb aktiv + END_VAR + + VAR_OUTPUT + Y_Weiche_abzweigen : Bool; // Weiche auf Abzweig schalten + Y_Weiche_geradeaus : Bool; // Weiche auf Gerade schalten + Error : Word; // Störungen übergeben + END_VAR + + VAR_IN_OUT + Antrieb_start : Bool; // Kreiselantrieb starten + Antrieb_stoppen : Bool; // Kreiselantrieb stoppen + hStOk : Bool; // Anzeige Start n. Störung aktivieren + END_VAR + + VAR + SAVE : Struct + IDX_Flag : Bool; // Hauptstrang_DL +1 durchsuchen + Kontroll_Flag : Bool; // Hauptstrang_DL +1 durchsuchen + Teil_IDX_Old : DInt; // BT/MT-IDX (wurde bei Auslagerung gemeldet) + END_STRUCT; + Para : Struct // Parameter + Weichen_DL_DB : Int; // Einsprung Weichen-Datenliste-DB + Weichen_DL_DW : Int; // Einsprung Weichen-Datenliste-DW + Res : Array[1..3] of Int; // Reserve + END_STRUCT; + Weiche : "UDLWeiche_Sorter"; // Fahrbereichs Daten + Dyn : Struct // Dynamische Daten fürs Einfahren + Status : Struct // Status + Schalttakte : DInt; // Anzahl der getätigten Umschaltungen + Strecke_gesperrt : Bool; // Gefällestrecke ist gesperrt + Strecke_voll : Bool; // Gefällestrecke ist voll + Weiche_abzweigen : Bool; // Weiche auf Abzweig schalten + Weiche_geradeaus : Bool; // Weiche auf Gerade schalten + TeachModus_aktiv : Bool; // Teach-Modus ist aktiv + Res45 : Bool; + Weichentest_aktiv : Bool; // Testschaltung für Einfahrweiche aktiviert + Reset : Bool := TRUE; // Reset Einfahrseite starten + Ziel_unbekannt : Bool; // Ziel des BT ist unbekannt + END_STRUCT; + Rueckmld : Struct + RET_VAL_BLKMOV_Weiche : Int; // Rückmeldung nach BLKMOV-Aufruf + RET_VAL_DL_Weichen : Byte; // Rückmeldung nach DatenOut-Aufruf + RET_VAL_Sortliste_Out : Byte; // Rückmeldung nach Sortdaten-Out-Aufruf + RET_VAL_SendFIFO : Byte; // Rückmeldung nach SendPC_FIFO-Aufruf + END_STRUCT; + Error : "UErrWeiche_Sorter"; + Ink_Wert : DInt; // Aktueller Inkrementalwert + Max_Wert : DInt; // Maximal erlaubter Zählwert + Lauf_Flag : Bool; // Zähl-Lauf mit Flag ist aktiv + Flag_Lauf_fertig : Bool; // Flag-Lauf wurde beendet + Ohne_Lauf_fertig : Bool; // Ohne Flag-Lauf wurde beendet + Hauptstrang_Flag : Bool; // Flag zum Weiche schalten (vom Hauptstrang) + Last_Flag : Bool; // Flag des letzten durchfahrenden Teils + GSTschalt_Flag : Bool; // Flag bei Weiche auf GST schalten + Carr : Bool; // CARR-Telegramm muss noch gesendet werden + Puffer_IDX : Bool; // Trolley-ID in Puffer eintragen + Ohne_VerklemmKontrolle : Bool; // Verklemmkontrolle ausschalten + BM_raus : Bool; // BM wurde ausgeschleußt (1 Zyklus) + BM_gerade : Bool; // BM wurde gerade gefahren (1 Zyklus) + Max_raus : Bool; // Max_Wert wurde schon übertragen + Hauptstrang_Ink : DInt; // Inkremente zum Weiche schalten (vom Hauptstrang) + Hauptstrang_Sortliste : Int; // Sortliste aus welcher Hauptstrangdaten sind + Hauptstrang_Search_Ink : DInt; // Inkremente zum Daten auslesen (Start-Ink) + Hauptstrang_Pos : Int; // Aktuelle Position der Daten in Datenliste + GSTschalt_Ink : DInt; // Inkremente zum Weiche auf GST schalten + Last_Ink : DInt; // Inkremente des letzten durchfahrenden Teils + Last_IDX : DInt; // IDX des letzten durchfahrenden Teils + FahrKontrolle : Struct + Ohne_VerklemmKontrolle : Bool; // Verklemmkontrolle ausschalten + BT_Gerade : Bool; // BM fährt geradeaus durch Weichenbereich + BT_Ausfahrt : Bool; // BM fährt aus Weichenbereich + BM_Gerade_erkannt : Bool; // Geradeausfahrendes BM wurde erkannt + Gerade_Neg : Bool; // Geradeaus: Kontroll-Time ist negativ + BM_Ausfahrt_erkannt : Bool; // Ausfahrendes BM wurde erkannt + Ausfahrt_Neg : Bool; // Ausfahrend: Kontroll-Time ist negativ + Kontroll_Time_Gerade : Int; // Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] + Kontroll_Time_Ausfahrt : Int; // Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] + Time_Ausfahrt : Int; // Diese Zeit benötigt BM zum Ausfahren [100ms] + END_STRUCT; + Res128 : Array[1..1] of Int; // Reserve + END_STRUCT; + Daten : "UBT_Daten"; + Kontroll_IDX : DInt; // IDX des zu kontollierenden Teils + Res200 : Array[1..23] of Int; // Reserve + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Del : Bool; // Nur Sortdaten löschen + Error_SendFIFO : Bool; + FC86_Para : Word; // Parameter-Übergabe + Hauptstrang_Ink : DInt; // Inkremente zum Weiche schalten (vom Hauptstrang) + Parameter : Word; // Parameter + Freigabe : Int; + Carr_Ziel : Int; // Ziel, das bei Carr-Telegramm gemeldet wird + DatenDB : Int; // DB öffnen + sKorrekturFaktor : Real; // Korrektur-Faktor wegen Kettenlängung + AR1Start : DInt; // Startwert mit Offset 0 + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + END_VAR + + +BEGIN +NETWORK +TITLE = Parameter-Übergabe + L #Weichen_Nr;//Aufruf-Parameter (für Baustein beobachten) + + L "MW178";//Einsprung Weichen-DL + T #Para.Weichen_DL_DB;//vor Aufruf übergeben! + L 0; + T #Para.Weichen_DL_DW; + +NETWORK +TITLE = Eingangsvariablen einlesen + L #KorrekturFaktor; + T #sKorrekturFaktor; + +NETWORK +TITLE = Für Inbetriebnahme + +//Beim Teachen Weiche auf gerade: + U #Dyn.Status.TeachModus_aktiv; + S #Y_Weiche_geradeaus;//Weiche auf gerade schalten + R #Y_Weiche_abzweigen; + R #Dyn.Status.Weiche_abzweigen;//Weiche auf Abzweig schalten + R #Dyn.Status.Weiche_geradeaus;//Weiche auf Gerade schalten + BEB; + +//Weichentest: + UN #Dyn.Status.Weichentest_aktiv; + SPB en01; + + U "Clock_1Hz"; + = #Y_Weiche_abzweigen;//Weiche zyklisch umschalten + NOT; + = #Y_Weiche_geradeaus; + + SET; + R #Dyn.Status.Weiche_abzweigen;//Weiche auf Abzweig schalten + R #Dyn.Status.Weiche_geradeaus;//Weiche auf Gerade schalten + + BEA; + +en01: NOP 0; + +NETWORK +TITLE = Gesamt: Out-Bits zum Zurücksetzen + SET; + R #Y_Weiche_abzweigen;//Weiche auf Abzweig schalten + R #Y_Weiche_geradeaus;//Weiche auf gerade schalten + R #Dyn.BM_raus;//BM wurde ausgeschleußt (1 Zyklus) + R #Dyn.BM_gerade;//BM wurde gerade gefahren (1 Zyklus) + +NETWORK +TITLE = Statische Weichen-Parameter holen + L #Weiche.Weichen_Nr;//Nummer der Weiche + L #Weichen_Nr;//Aufruf-Parameter + ==I;//Identisch ? + R #Dyn.Error.Weichen_DL;//Weichendatenbank fehlerhaft + R #Dyn.Error.Undef_Weiche;//undefinierte Weiche + SPB en06;//Ja ! + + T "MW200";//Search-Daten + + CALL "DatenOut" + ( SSDB := #Para.Weichen_DL_DB , + SSDW := #Para.Weichen_DL_DW , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := "MW196" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_DL_Weichen;//Rückmeldung bei Datenbank-Zugriff (Gefälle-DL) + + SPBI G_Ok; + + U "M199.0"; + = #Dyn.Error.Weichen_DL;//Weichendatenbank fehlerhaft + BEB; + + SET; + S #Dyn.Error.Undef_Weiche;//undefinierte Weiche + + BEA; + +//Kennung + Datenbytes +G_Ok: SET; + R #Dyn.Error.Weichen_DL;//Weichendatenbank fehlerhaft + R #Dyn.Error.Undef_Weiche;//undefinierte Weiche + + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 40;//Datenwords speichern + T %LW2;//Wiederholungen + +//Quelle-Pointer erzeugen: + L 0;//Bei Merker = 0 ! + T %LW4;//DB_Nummer + L 220;//Adresse + SLD 3; + L 16#8300_0000;//Kennung: Merker + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche , + DSTBLK := #Weiche //#Ziel + ); + + L #Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Dyn.Error.BLKMov;//Error bei Block kopieren + BEB; + + L #Weiche.Weichen_Typ;//Weichentyp = 178 (Weiche) + L 178;//Dieser Aufruf-FB ? + ==I;//Ja ! + SPB en06; + + SET; + S #Dyn.Error.Undef_Weiche;//undefinierte Weiche + + L 0;//Weiche ungültig ! + T #Weiche.Weichen_Nr;//Nummer der Weiche + + BEA; + +en06: NOP 0; + +NETWORK +TITLE = Reset +// +// + UN #Dyn.Status.Reset; + SPB En06_Mig; + +//Dyn.Daten löschen: + SET; + R #Dyn.Status.Reset; + R #Dyn.Status.Strecke_voll; + R #Y_Weiche_abzweigen;//Weiche auf Abzweig schalten + S #Y_Weiche_geradeaus;//Weiche auf gerade schalten + R #Dyn.Status.Weichentest_aktiv; + R #Dyn.Hauptstrang_Flag; + R #Dyn.Last_Flag; + R #Dyn.FahrKontrolle.BT_Gerade;//BM fährt geradeaus durch Weichenbereich + R #Dyn.FahrKontrolle.BT_Ausfahrt;//BM fährt aus Weichenbereich + R #Dyn.FahrKontrolle.Gerade_Neg;//Geradeaus: Kontroll-Time ist negativ + R #Dyn.FahrKontrolle.Ausfahrt_Neg;//Ausfahrend: Kontroll-Time ist negativ +/// R #Dyn.Ohne_VerklemmKontrolle //Verklemmkontrolle ausschalten + R #Dyn.Max_raus;//Max_Wert wurde schon übertragen + + U #Weiche.Parameter.Weichen_GST_gerade; + = #Dyn.Status.Weiche_geradeaus; + U #Weiche.Parameter.Weichen_GST_abzweig; + UN #Weiche.Parameter.Weichen_GST_gerade; + = #Dyn.Status.Weiche_abzweigen; + + L 0; + T #Dyn.Hauptstrang_Ink; + T #Dyn.Hauptstrang_Search_Ink; + T #Dyn.Last_Ink; + + L 0; + T #Dyn.Hauptstrang_Sortliste; + T #Dyn.FahrKontrolle.Kontroll_Time_Gerade;//Innerhalb dieser Zeit muss BM Weiche verlassen haben [100ms] + T #Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt;//Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] + + L DINT#0; + T #Kontroll_IDX; + T #Dyn.Last_IDX; + +//Rückmeldungen löschen: + L 0; + T #Dyn.Rueckmld.RET_VAL_DL_Weichen; + T #Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche; + T #Dyn.Rueckmld.RET_VAL_Sortliste_Out; + +//Störungen löschen: + SET; + R #Dyn.Error.Weichen_DL; + R #Dyn.Error.Undef_Weiche; + R #Dyn.Error.BLKMov; + R #Dyn.Error.Haupstrang_DL; + R #Dyn.Error.Haupstrang_DL_voll; + R #Dyn.Error.Keine_HSDaten; + R #Dyn.Error.Rein_FIFO; + R #Dyn.Error.Keine_FIFODaten; + R #Dyn.Error.Stau_AusfahrBereich; + R #Dyn.Error.BM_verklemmt_Gerade; + R #Dyn.Error.BM_verklemmt_Ausfahrt; + R #Dyn.Error.BM_undef_Gerade; + R #Dyn.Error.Frei14; + R #Dyn.Error.Send_FIFO_fehlerhaft;//Send-FIFO zum PC ist fehlerhaft + R #Dyn.Error.Send_FIFO_voll;//Send-FIFO zu PC ist voll + R #Dyn.Error.Reset_aktiv;//Reset ist aktiv + + L 0;//Damit statische Werte neu aus Datenbank geholt werden ! + T #Weiche.Weichen_Nr;//Nummer der Weiche + + BEA; + +En06_Mig: NOP 0; + +NETWORK +TITLE = Störungen nach Außen übergeben + L 0; + T "MB200"; + + U #Dyn.Error.Weichen_DL;//Weichen-Datenliste fehlerhaft + = "M200.0"; + U #Dyn.Error.Undef_Weiche;//undefinierte Weiche + = "M200.1"; + U #Dyn.Error.BLKMov;//Fehler bei Block kopieren + = "M200.2"; + U #Dyn.Error.Haupstrang_DL;//Haupstrang-Datenliste fehlerhaft + = "M200.3"; + U #Dyn.Error.Haupstrang_DL_voll;//Haupstrang-Datenliste ist voll + = "M200.4"; + U #Dyn.Error.Keine_HSDaten;//Keine Hauptstrang-Daten mehr vorhanden + = "M200.5"; + U #Dyn.Error.Rein_FIFO;//Rein-FIFO fehlerhaft + = "M200.6"; + U #Dyn.Error.Keine_FIFODaten;//Keine Rein-Daten mehr vorhanden + = "M200.7"; + U #Dyn.Error.Stau_AusfahrBereich;//Stau im Ausfahrbereich (-> Antrieb stoppen) + = "M201.0"; + U #Dyn.Error.BM_verklemmt_Gerade;//BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) + = "M201.1"; + U #Dyn.Error.BM_verklemmt_Ausfahrt;//BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen) + = "M201.2"; + U #Dyn.Error.BM_undef_Gerade;//undefiniertes BM bei Weiterfahrt erkannt + = "M201.3"; + U #Dyn.Error.Frei14; + = "M201.4"; + U #Dyn.Error.Send_FIFO_fehlerhaft;//Send-FIFO zum PC ist fehlerhaft + = "M201.5"; + U #Dyn.Error.Send_FIFO_voll;//Send-FIFO zu PC ist voll + = "M201.6"; + CLR;//Reset ist aktiv (gibts nicht!) + = #Dyn.Error.Reset_aktiv; + = "M201.7"; + + L "MW200"; + T #Error;//Schnittstelle nach Außen + +//Kreiselantrieb stoppen: + UN #Stau_Ausfahrtbereich;//Ausfahrtsbereich hat Stau + R #Dyn.Error.Stau_AusfahrBereich;//Stau im Ausfahrbereich (-> Antrieb stoppen) + +//Antrieb stoppen: + U(; + O #Dyn.Error.BM_verklemmt_Ausfahrt;//BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen) + O #Dyn.Error.BM_verklemmt_Gerade;//BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) + ); + UN #ErrQuit; + O #Dyn.Error.Stau_AusfahrBereich;//Stau im Ausfahrbereich (-> Antrieb stoppen) + O #Dyn.Error.Send_FIFO_fehlerhaft;//Send-FIFO zum PC ist fehlerhaft + O #Dyn.Error.Send_FIFO_voll;//Send-FIFO zu PC ist voll + S #Antrieb_stoppen;//Kreiselantrieb stoppen + +//Anzeige Start n. Störung aktivieren: + U #Dyn.Error.BM_verklemmt_Ausfahrt;//BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen) + O #Dyn.Error.BM_verklemmt_Gerade;//BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) + O #Dyn.Error.Stau_AusfahrBereich;//Stau im Ausfahrbereich (-> Antrieb stoppen) + S #hStOk; + +NETWORK +TITLE = Daten des Inkremental-Gebers holen / Zeit-Inkremente + L #Weiche.Ink_DB;//DB-Nr des Inkremental-Geber + L 0;//angegeben ? + <=I;//Nein ! + SPB w040; + + TAK; + T "MW200"; + AUF DB[ "MW200"];//Zähler-DB öffnen + L %DBD80; + T #Dyn.Ink_Wert; + L %DBD76; + T #Dyn.Max_Wert; + U %DBX74.3; + = #Dyn.Lauf_Flag; + U %DBX74.4; + = #Dyn.Flag_Lauf_fertig; + U %DBX74.5; + = #Dyn.Ohne_Lauf_fertig; + + SPA en04; + +//Zeit-Inkremente erzeugen: +w040: UN #Antrieb_aktiv; + SPB w041; + + L "MW4";//10ms-Takte + ITD; + L #Dyn.Ink_Wert; + +D;//Aktueller Zählerwert +100ms-Takte + T #Dyn.Ink_Wert; + +w041: L DINT#10000 ;//Festwert: 10000 (100s) + T #Dyn.Max_Wert; + + L #Dyn.Ink_Wert;//Aktueller Zählerwert + L #Dyn.Max_Wert;//Max. Wert erreicht ? + <=D;//Nein ! + R #Dyn.Ohne_Lauf_fertig;//Ohne Flag-Lauf wurde beendet + R #Dyn.Flag_Lauf_fertig;//Flag-Lauf wurde beendet + SPB en04; + + -D;//Restwert als Startwert nehmen ! + T #Dyn.Ink_Wert; + + UN #Dyn.Lauf_Flag;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag + = #Dyn.Ohne_Lauf_fertig;//Ohne Flag-Lauf wurde beendet + U #Dyn.Lauf_Flag;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag + = #Dyn.Flag_Lauf_fertig;//Flag-Lauf wurde beendet + + UN #Dyn.Lauf_Flag;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag + = #Dyn.Lauf_Flag; + +en04: NOP 0; + +NETWORK +TITLE = Störungen quittieren +// +// + U "Hauptstrang_leer";//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + UN #B_Gerade; + R #Dyn.Error.BM_undef_Gerade;//undefiniertes BM bei Weiterfahrt erkannt + + UN #ErrQuit; + SPB En08; + +//Störungen löschen: + SET; + R #Dyn.Error.BM_undef_Gerade; + R #Dyn.Error.Frei14; + + U "Hauptstrang_leer";//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + U #Dyn.Error.BM_verklemmt_Gerade; + CLR;//Nie da große Trolleys + R #Dyn.Error.BM_verklemmt_Gerade; + R #Dyn.FahrKontrolle.BT_Gerade; + + U "Hauptstrang_leer";//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + U #Dyn.Error.BM_verklemmt_Ausfahrt; + CLR;//Nie da große Trolleys + R #Dyn.Error.BM_verklemmt_Ausfahrt; + R #Dyn.FahrKontrolle.BT_Ausfahrt; + +//Kann nur über Reset zurückgesetzt werden: +// R #Dyn.Error.Weichen_DL +// R #Dyn.Error.Undef_Weiche +// R #Dyn.Error.BLKMov +// R #Dyn.Error.Haupstrang_DL +// R #Dyn.Error.Haupstrang_DL_voll +// R #Dyn.Error.Keine_HSDaten +// R #Dyn.Error.Rein_FIFO +// R #Dyn.Error.Keine_FIFODaten +// R #Dyn.Error.Stau_AusfahrBereich +// R #Dyn.Error.BM_verklemmt_Gerade +// R #Dyn.Error.BM_verklemmt_Ausfahrt +// R #Dyn.Error.Send_FIFO_fehlerhaft //Send-FIFO zum PC ist fehlerhaft +// R #Dyn.Error.Send_FIFO_voll //Send-FIFO zu PC ist voll +// R #Dyn.Error.Reset_aktiv //Reset ist aktiv + +En08: NOP 0; + +NETWORK +TITLE = Schaltpunkt aufgrund von Hauptstrangdaten suchen + L #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + L DINT#0 ;//schon bekannt ? + >D;//Ja ! + S #Antrieb_start;//Kreiselantrieb starten + SPB Nw09; + +//Nach neuen Daten suchen: + UN "Weiche_NewData";//Im Weichenbereich nach neuen Daten suchen + SPB w076; + + L #Dyn.Ink_Wert;//Aktueller Inkrementalwert + L #Weiche.Off_Ink;//Inkremente zum Weiche schalten + >D;//Gleiches Flag/Flag wie Inkgeber zum Suchen + SPB w071; + +//Anders Flag/Liste wie Inkgeber zum Suchen: + L #Weiche.Hauptstrang_DL_DB; + + U #Dyn.Lauf_Flag;//Inkgeber schon mit Lauf-Flag + R #SAVE.IDX_Flag;//Hauptstrang_DL +1 durchsuchen + SPB w070; + + SET; + S #SAVE.IDX_Flag;//Hauptstrang_DL +1 durchsuchen + + + 1; + +w070: T #Dyn.Hauptstrang_Sortliste;//Sortliste aus welcher Hauptstrangdaten sind + + SPA w073; + +//Gleiches Flag/Liste wie Inkgeber zum Suchen: +w071: L #Weiche.Hauptstrang_DL_DB; + + UN #Dyn.Lauf_Flag;//Inkgebeer ohne Lauf-Flag + R #SAVE.IDX_Flag;//Hauptstrang_DL +1 durchsuchen + SPB w072; + + SET; + S #SAVE.IDX_Flag;//Hauptstrang_DL +1 durchsuchen + + + 1; + +w072: T #Dyn.Hauptstrang_Sortliste;//Sortliste aus welcher Hauptstrangdaten sind + +//Hauptstrang Sortliste nach Position -1 durchsuchen: +w073: CALL "DatenFindOffsetSort" + ( SSDB := #Dyn.Hauptstrang_Sortliste , + SSDW := #Weiche.Hauptstrang_DL_DW , + PARA := WORD#16#0B01 , //nach 11.DW (letzte Position) suchen + SEARCHDATEN := #Weiche.Position_minus , + RE_VAL := "MB199" , + OUTDATEN := #Daten , + Position := "MW196" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_Sortliste_Out; + + U "M199.7";//Datensatz ist vorhanden + R #Dyn.Error.Haupstrang_DL;//Sortliste fehlerhaft + SPB w074; + + U "M199.6";//Datensatz ist nicht vorhanden + R #Dyn.Error.Haupstrang_DL;//Sortliste fehlerhaft + SPB Nw09;//Warten, da noch keine Daten vorhanden + + SET; + S #Dyn.Error.Haupstrang_DL;//Sortliste fehlerhaft + +w076: L 0;//Keine Daten auf Hauptstrang vorhanden + T #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + + SPA Nw09; + +//Search-Ink speichern: +w074: L #Daten.Start_Ink;//Stamm-Daten speichern + T #Dyn.Hauptstrang_Search_Ink;//Inkremente zum Daten auslesen (Start-Ink) + +//Hauptstrang-Schaltdaten errechnen/speichern: +//Kettenlängungs-Korrektur: + L #sKorrekturFaktor;//Korrektur-Faktor wegen Kettenlängung + L 0.995 ;//sinnvoller Wert ? (maximal 0,5% Abweichung erlaubt) + >=R;//Ja ! + U(; + TAK; + L 1.005; + <=R; + ); + SPB w075; + + L 1.0;//dann ohne Korrektur ! + T #sKorrekturFaktor;//Korrektur-Faktor wegen Kettenlängung + +//Schaltdaten errechnen: +w075: U #Daten.Start_Flag;//Lauf-Flag bei Start-Inkremente + = #Dyn.Hauptstrang_Flag;//Flag zum Weiche schalten (vom Hauptstrang) + + L #Weiche.Off_Ink;//Inkremente zum Weiche schalten + DTR; + L #sKorrekturFaktor;//Korrektur-Faktor wegen Kettenlängung + *R; + RND; + L #Daten.Start_Ink;//Daten aus Sortliste dazuaddieren + +D; + T #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + L #Dyn.Max_Wert;//Maximal erlaubter Zählwert + >D; + SPBN Nw09; + + -D;//Restwert übernehmen + T #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + + UN #Daten.Start_Flag;//Lauf-Flag bei Start-Inkremente (invertieren) + = #Dyn.Hauptstrang_Flag;//Flag zum Weiche schalten (vom Hauptstrang) + +NETWORK +TITLE = Weiche aufgrund der Hauptstrangdaten schalten +Nw09: L #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + L DINT#0 ;//angegeben ? + <=D;//Nein ! + SPB w08E; + + U #Dyn.Hauptstrang_Flag;//Flag zum Weiche schalten (vom Hauptstrang) + U #Dyn.Flag_Lauf_fertig;//Flag-Lauf wurde beendet + O; + UN #Dyn.Hauptstrang_Flag;//Flag zum Weiche schalten (vom Hauptstrang) + U #Dyn.Ohne_Lauf_fertig;//Flag-Lauf wurde beendet + SPB w080;//beim Ende des Lauf sind Inkremente uninteressant + + U #Dyn.Hauptstrang_Flag;//Flag zum Weiche schalten (vom Hauptstrang) + U #Dyn.Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv + O; + UN #Dyn.Hauptstrang_Flag;//Flag zum Weiche schalten (vom Hauptstrang) + UN #Dyn.Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv + SPBN en08_Mig; + + L #Dyn.Ink_Wert;//Aktuelle Inkrementalwert + L #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + I ;//BM soll nicht ausfahren ! + ON #Weiche.Parameter.ErsatzZiel_bei_Stau;//Bei Stau soll Ersatz-Ziel angefahren werden + ON #Stau_Ausfahrtbereich; + SPB x081; + + L #Weiche.ErsatzZiel ;//Ersatz-Ziel übergeben + T #Daten.Sort_Info.Teil_Ziel; + +x081: L #Daten.Sort_Info.Teil_Ziel;//Ziel des BT (aufgrund vom Hauptstrang) + L 0; + <=I; + = #Dyn.Status.Ziel_unbekannt;//Ziel des BT ist unbekannt + + U #Dyn.Status.Ziel_unbekannt;//Ziel des BT ist unbekannt + U #Weiche.Parameter.Weichen_GST_gerade; + UN #Weiche.Parameter.Weichen_GST_abzweig; + SPB x100;//BT mit unbekanntem Ziel geradeaus fahren + + U #Dyn.Status.Ziel_unbekannt;//Ziel des BT ist unbekannt + UN #Weiche.Parameter.Weichen_GST_gerade; + U #Weiche.Parameter.Weichen_GST_abzweig; + SPB w082;//BT mit unbekanntem Ziel ausfahren + + L #Daten.Sort_Info.Teil_Ziel;//Ziel des BT (aufgrund vom Hauptstrang) + L #Weiche.AbzweigZiel;//Bei diesem Ziel Weiche auf Abzweig schalten + Carl + T #Carr_Ziel;//Ziel, das bei Carr-Telegramm gemeldet wird + ==I;//BM soll ausfahren + S #Dyn.Carr;//CARR-Telegramm muss noch gesendet werden + S #Dyn.Puffer_IDX;//Trolley-ID in Puffer eintragen + SPB w082;//Teil ausfahren + + L #Daten.Sort_Info.Teil_Ziel;//Ziel des BT (aufgrund vom Hauptstrang) + L #Weiche.GeradeZiel;//Bei diesem Ziel Weiche auf Gerade schalten + Carl + <>I;//BM soll also ausfahren, da nicht das GeradeZiel! + U(; + L 0;//sinnvolle Angabe ? + >I;//Ja ! + ); + SPB w082;//Teil ausfahren (ohne CARR, da undef. rausfahren!) + +//Teile geradeaus fahren:****************************************************************************************************** +x100: SET; + S #Dyn.Status.Weiche_geradeaus;//Weiche auf Gerade schalten + R #Dyn.Status.Weiche_abzweigen; + S #Dyn.BM_gerade;//BM wurde gerade gefahren (1 Zyklus) + +//Verklemm-Kontroll-Info speichern: + UN #Weiche.Parameter.Kontroll_B_Gerade;//Kontroll-Sensor bei Weiterfahrt (gerade) + SPB k100;//Letzter BM noch nicht kontrolliert + + U #Dyn.FahrKontrolle.BT_Gerade;//BM fährt geradeaus durch Weichenbereich + SPB k100;//Letzter BM noch nicht kontrolliert + + L #Dyn.Last_IDX;//IDX des letzten durchfahrenden Teils + T #Kontroll_IDX ;//IDX des zu kontollierenden Teils + U #SAVE.IDX_Flag;//Hauptstrang_DL +1 durchsuchen + = #SAVE.Kontroll_Flag;//Hauptstrang_DL +1 durchsuchen + + L #Weiche.Kontroll_Zeit_gerade;//Nach dieser Zeit muss BM Weichenbereich verlassen haben [100ms] + T #Dyn.FahrKontrolle.Kontroll_Time_Gerade;//Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] + + SET; + S #Dyn.FahrKontrolle.BT_Gerade;//BM fährt geradeaus durch Weichenbereich + R #Dyn.FahrKontrolle.Gerade_Neg;//Geradeaus: Kontroll-Time ist negativ + +//CARR-Telegramm erwünscht ?: +k100: L #Daten.Sort_Info.Teil_Ziel;//Ziel des BT (aufgrund vom Hauptstrang) + L #Weiche.GeradeZiel;//Bei diesem Ziel Weiche auf Gerade schalten + Carl + T #Carr_Ziel;//Ziel, das bei Carr-Telegramm gemeldet wird + ==I;//BM soll ausfahren + S #Dyn.Carr;//CARR-Telegramm muss noch gesendet werden + + U #Weiche.Parameter.Letzte_Weiche;//Letzte Weiche im Verbund + S #Del;//Nur Sortdaten löschen + SPB w084;//Daten aus Sortliste löschen + +//Letzte Position neu speichern: +New: L #Weiche.Weichen_Nr;//Nummer der Weiche + T #Daten.letzte_Position;//Letzte Position, wo Teil vorbeigefahren ist + + CALL "DatenIn" + ( SSDB := #Dyn.Hauptstrang_Sortliste , + SSDW := #Weiche.Hauptstrang_DL_DW , + INDATEN := #Daten , + RE_VAL := "MB199" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_Sortliste_Out; + + U "M199.7";//Datensatz ist vorhanden /Alles Ok) + SPB GST; + + SET; + S #Dyn.Error.Haupstrang_DL;//Sortliste fehlerhaft + SPA GST; + +//Teile ausfahren:************************************************************************************************************ +w082: U #Dyn.Status.Weiche_abzweigen;//Weiche war schon auf Abzweig + SPB w083; + + L #Dyn.Status.Schalttakte; + + DINT#1;//Auf Abzweig umgeschaltet +1 + T #Dyn.Status.Schalttakte; + +w083: SET; + S #Dyn.Status.Weiche_abzweigen;//Weiche auf Abzweig schalten + R #Dyn.Status.Weiche_geradeaus; + R #Del;//Nur Sortdaten löschen + S #Dyn.BM_raus;//BM wurde ausgeschleußt (1 Zyklus) + + L 300;//Nach dieser Zeit ist BM ausgefahren [300*100ms] + T #Dyn.FahrKontrolle.Time_Ausfahrt;//Diese Zeit benötigt BM zum Ausfahren [100ms] + +//Verklemm-Kontroll-Info speichern: + UN #Weiche.Parameter.Kontroll_B_Ausfahrt;//Kontroll-Sensor bei Ausfahrt (abzweig) + SPB k101;//Letzter BM noch nicht kontrolliert + + U #Dyn.FahrKontrolle.BT_Ausfahrt;//BM fährt aus Weichenbereich + SPB k101;//Letzter BM noch nicht kontrolliert + + L #Dyn.Last_IDX;//IDX des letzten durchfahrenden Teils + T #Kontroll_IDX ;//IDX des zu kontollierenden Teils + U #SAVE.IDX_Flag;//Hauptstrang_DL +1 durchsuchen + = #SAVE.Kontroll_Flag;//Hauptstrang_DL +1 durchsuchen + + L #Weiche.Kontroll_Zeit_abzweigen;//Nach dieser Zeit muss BM Weichenbereich verlassen haben [100ms] + T #Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt;//Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] + + SET; + S #Dyn.FahrKontrolle.BT_Ausfahrt;//BM fährt aus Weichenbereich + R #Dyn.FahrKontrolle.Ausfahrt_Neg;//Ausfahrend: Kontroll-Time ist negativ + +k101: U #Stau_Ausfahrtbereich;//Ausfahrtsbereich hat Stau + UN #Weiche.Parameter.ErsatzZiel_bei_Stau;//Bei Stau soll Ersatz-Ziel angefahren werden + S #Dyn.Error.Stau_AusfahrBereich;//Stau im Ausfahrbereich (-> Antrieb stoppen) + +//Falls Entlade-Weiche neues Leer-Ziel übergeben: + UN #Weiche.Parameter.Entlade_Weiche;//BM wird entladen -> Leerziel übergeben + O #Weiche.Parameter.Letzte_Weiche;//Letzte Weiche im Verbund + SPB w084; + + L #Weiche.LeerZiel;//Nach Entladen des BM dieses Ziel übergeben + T #Daten.Sort_Info.Teil_Ziel;//BM bei diesem Abwurf-Ziel ausfahren/entladen + L 0;//Sinnvolle Angabe ? + >I;//Ja ! + SPB New;//Daten mit neuem Ziel an Hauptstrang übergeben ! + +//Daten aus Sortliste löschen +w084: L #Dyn.Hauptstrang_Pos;//Aktuelle Position der Daten in Datenliste + L 16#0E00;//0EYY: DS YY löschen + OW; + T #FC86_Para; + + CALL "DatenOutSort" + ( SSDB := #Dyn.Hauptstrang_Sortliste , + SSDW := #Weiche.Hauptstrang_DL_DW , + PARA := #FC86_Para , //DS YY löschen + OUTDATEN := #Daten , + RE_VAL := "MB199" + ); + +//GST-Schalt-Inks speichern: +GST: UN #Weiche.Parameter.Weichen_GST_gerade; + UN #Weiche.Parameter.Weichen_GST_abzweig; + SPB w08E; + + L #Weiche.Ink_Schaltdauer;//Inkremente (Fenster), danach wird Weiche in GST geschaltet + L 0;//sinnvoller Wert ? + <=I;//Nein ! + SPB w08E; + + L #Weiche.Ink_Schaltdauer;//Inkremente (Fenster), danach wird Weiche in GST geschaltet + ITD; + L #Dyn.Ink_Wert;//Aktueller Inkrementalwert + +D; + T #Dyn.GSTschalt_Ink;//Inkremente bei Weiche auf GST schalten + U #Dyn.Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv + = #Dyn.GSTschalt_Flag;//Flag bei Weiche auf GST schalten + + L #Dyn.Max_Wert;//Maximal erlaubter Zählwert überschritten ? + <=D;//Nein ! + SPB w08E; + + -D;//Restwert übernehmen + T #Dyn.GSTschalt_Ink;//Inkremente bei Weiche auf GST schalten + UN #Dyn.Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv (invertieren, da Überlauf!) + = #Dyn.GSTschalt_Flag;//Flag bei Weiche auf GST schalten + +w08E: L DINT#0; + T #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + +en08_Mig: NOP 0; + +NETWORK +TITLE = Weiche auf GST zurückschalten + L #Dyn.GSTschalt_Ink;//Inkremente bei Weiche auf GST schalten + L 0;//sinnvolle Angabe ? + <=D;//Nein ! + SPB X111; + + U #Dyn.GSTschalt_Flag;//Flag bei Weiche auf GST schalten + U #Dyn.Flag_Lauf_fertig;//Flag-Lauf wurde beendet + O; + UN #Dyn.GSTschalt_Flag;//Flag bei Weiche auf GST schalten + U #Dyn.Ohne_Lauf_fertig;//Flag-Lauf wurde beendet + SPB w110;//beim Ende des Lauf sind Inkremente uninteressant + + U #Dyn.GSTschalt_Flag;//Flag bei Weiche auf GST schalten + U #Dyn.Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv + O; + UN #Dyn.GSTschalt_Flag;//Flag bei Weiche auf GST schalten + UN #Dyn.Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv + SPBN en11; + + L #Dyn.Ink_Wert;//Aktuelle Inkrementalwert + L #Dyn.GSTschalt_Ink;//Inkremente bei Weiche auf GST schalten + D;//Haupstrangdaten sind kleiner + U(; + L 0;//sinnvolle Hauptstrang-Daten ? + <>D;//Ja ! + ); + SPB X111;//Nicht auf GST schalten, da nächste Daten schon kommen ! + +//Weiche auf GST schalten: + U #Weiche.Parameter.Weichen_GST_gerade; + UN #Weiche.Parameter.Weichen_GST_abzweig; + SPBN W110_Mig;//Negierter Sprung ! + + U #Dyn.FahrKontrolle.BT_Ausfahrt;//BM fährt aus Weichenbereich + O #Dyn.Error.BM_verklemmt_Ausfahrt;//BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen) + SPB en11;//Warten + + SET; + S #Dyn.Status.Weiche_geradeaus;//Weiche auf Gerade schalten + R #Dyn.Status.Weiche_abzweigen; + SPA X111; + +W110_Mig: U #Weiche.Parameter.Weichen_GST_abzweig; + UN #Weiche.Parameter.Weichen_GST_gerade; + SPBN X111;//Negierter Sprung ! + + U #Dyn.FahrKontrolle.BT_Gerade;//BM fährt geradeaus durch Weichenbereich + O #Dyn.Error.BM_verklemmt_Gerade;//BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) + SPB en11;//Warten + + SET; + S #Dyn.Status.Weiche_abzweigen;//Weiche auf Abzweig schalten + R #Dyn.Status.Weiche_geradeaus; + +X111: L DINT#0; + T #Dyn.GSTschalt_Ink;//Inkremente bei Weiche auf GST schalten + SET; + R #Dyn.GSTschalt_Flag;//Flag bei Weiche auf GST schalten + +en11: NOP 0; + +NETWORK +TITLE = Weichenbereich auf verklemmte gerade fahrende BM kontrollieren + UN #Weiche.Parameter.Kontroll_B_Gerade;//Kontroll-Sensor bei Weiterfahrt (gerade) + O #Dyn.Ohne_VerklemmKontrolle;//Verklemmkontrolle ausschalten + O "Hauptstrang_leer"; + R #Dyn.FahrKontrolle.BT_Gerade;//BM fährt geradeaus durch Weichenbereich + R #Dyn.FahrKontrolle.BM_Gerade_erkannt;//Geradeausfahrendes BM wurde erkannt + R #Dyn.Error.BM_verklemmt_Gerade;//BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) + R #Dyn.Error.BM_undef_Gerade;//undefiniertes BM bei Weiterfahrt erkannt + S #Dyn.FahrKontrolle.Gerade_Neg;//Geradeaus: Kontroll-Time ist negativ + SPB Nw17; + +//BM fährt geradeaus: + U #B_Gerade;//Kontroll-Sensor nach Weiche Gerade + UN #Dyn.FahrKontrolle.BM_Gerade_erkannt;//Geradeausfahrendes BM wurde erkannt + U #Dyn.FahrKontrolle.BT_Gerade;//BM fährt geradeaus durch Weichenbereich + R #Dyn.FahrKontrolle.BT_Gerade; + S #Dyn.FahrKontrolle.BM_Gerade_erkannt;//Geradeausfahrendes BM wurde erkannt + + UN #B_Gerade;//Kontroll-Sensor nach Weiche Gerade + R #Dyn.FahrKontrolle.BM_Gerade_erkannt;//Geradeausfahrendes BM wurde erkannt + + L #Dyn.Last_IDX;//IDX des letzten durchfahrenden Teils + T #Kontroll_IDX ;//IDX des zu kontollierenden Teils + U #SAVE.IDX_Flag;//Hauptstrang_DL +1 durchsuchen + = #SAVE.Kontroll_Flag;//Hauptstrang_DL +1 durchsuchen + + SPA Q_G; + +N_G: L #Weiche.Kontroll_Zeit_gerade;//Nach dieser Zeit muss BM Weichenbereich verlassen haben [100ms] + T #Dyn.FahrKontrolle.Kontroll_Time_Gerade;//Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] + +Q_G: U #ErrQuit; + UN #Dyn.FahrKontrolle.BT_Gerade;//BM fährt geradeaus durch Weichenbereich + R #Dyn.Error.BM_verklemmt_Gerade;//BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) + +//Zeit verändern: + UN #Antrieb_aktiv;//Band ist aktiv + ON "100ms-Impuls"; + O #Dyn.Error.BM_verklemmt_Gerade;//BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) + SPB Un_G; + + L #Dyn.FahrKontrolle.Kontroll_Time_Gerade;//Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] + L "MW2";//Anzahl der 100ms-Takte + -I; + T #Dyn.FahrKontrolle.Kontroll_Time_Gerade;//Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] + L 0;//Kontroll-Zeit abgelaufen ? + >I;//Nein ! + R #Dyn.FahrKontrolle.Gerade_Neg;//Geradeaus: Kontroll-Time ist negativ + SPB en16; + +//BM verklemmt ?: + U #Dyn.FahrKontrolle.Gerade_Neg;//Geradeaus: Kontroll-Time ist negativ + SPB Un_G; + + SET; + S #Dyn.FahrKontrolle.Gerade_Neg;//Geradeaus: Kontroll-Time ist negativ + + U #Dyn.FahrKontrolle.BT_Gerade;//BM fährt geradeaus durch Weichenbereich + S #Dyn.Error.BM_verklemmt_Gerade;//BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) + SPB N_G;//Zeit neu laden + +//BM undefiniert ?: +Un_G: L #Dyn.FahrKontrolle.Kontroll_Time_Gerade;//Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] + L #Weiche.DraussenZeit_gerade;//Nach dieser neg. Zeit [100ms] Error undef.BM, falls Kontroll-Sensor aktiv + >I;//Muss BM draussen sein ? Nein ! + SPB en16; + + T #Dyn.FahrKontrolle.Kontroll_Time_Gerade;//Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] + + UN #B_Gerade;//Kontroll-Sensor nach Weiche Gerade + SPB en16; + + SET; + S #Dyn.Error.BM_undef_Gerade;//undefiniertes BM bei Weiterfahrt erkannt + +en16: NOP 0; + +NETWORK +TITLE = Weichenbereich auf verklemmte ausfahrende BM kontrollieren +Nw17: UN #Weiche.Parameter.Kontroll_B_Ausfahrt;//Kontroll-Sensor bei Ausfahrt (abzweig) + O #Dyn.Ohne_VerklemmKontrolle;//Verklemmkontrolle ausschalten + R #Dyn.FahrKontrolle.BT_Ausfahrt;//BM fährt aus Weichenbereich + R #Dyn.FahrKontrolle.BM_Ausfahrt_erkannt;//Ausfahrendes BM wurde erkannt + R #Dyn.Error.BM_verklemmt_Ausfahrt;//BM bei Ausfahrt in Weiche verklemmt (-> Antrieb gestoppt) + S #Dyn.FahrKontrolle.Ausfahrt_Neg;//Ausfahrend: Kontroll-Time ist negativ + SPB Nw18; + +//BM fährt aus: + U #B_Ausfahrt;//Kontroll-Sensor nach Weiche Ausfahrt + UN #Stau_Ausfahrtbereich;//Bei Stau Einzelerkennung nicht mehr möglich! + UN #Dyn.FahrKontrolle.BM_Ausfahrt_erkannt;//Ausfahrendes BM wurde erkannt + U #Dyn.FahrKontrolle.BT_Ausfahrt;//BM fährt aus Weichenbereich + R #Dyn.FahrKontrolle.BT_Ausfahrt; + S #Dyn.FahrKontrolle.BM_Ausfahrt_erkannt;//Ausfahrendes BM wurde erkannt + + UN #B_Ausfahrt;//Kontroll-Sensor nach Weiche Ausfahrt + O #Stau_Ausfahrtbereich;//Bei Stau auch ! + R #Dyn.FahrKontrolle.BM_Ausfahrt_erkannt;//Ausfahrendes BM wurde erkannt + + SPA Q_A; + +N_A: L #Weiche.Kontroll_Zeit_abzweigen;//Nach dieser Zeit muss BM Weichenbereich verlassen haben [100ms] + T #Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt;//Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] + +Q_A: U #ErrQuit;//s.u. + SET;//Ohne Quittierung + UN #Dyn.FahrKontrolle.BT_Ausfahrt;//BM fährt aus Weichenbereich + R #Dyn.Error.BM_verklemmt_Ausfahrt;//BM bei Ausfahrt in Weiche verklemmt (-> Antrieb gestoppt) + +//Zeit verändern: + UN #Antrieb_aktiv;//Band ist aktiv + ON "100ms-Impuls"; + O #Dyn.Error.BM_verklemmt_Ausfahrt;//BM bei Ausfahrt in Weiche verklemmt (-> Antrieb gestoppt) + SPB en17; + + L #Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt;//Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] + L "MW2";//Anzahl der 100ms-Takte + -I; + T #Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt;//Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] + L 0;//Kontroll-Zeit abgelaufen ? + >I;//Nein ! + R #Dyn.FahrKontrolle.Ausfahrt_Neg;//Ausfahrend: Kontroll-Time ist negativ + SPB en17; + +//BM verklemmt ?: + U #Dyn.FahrKontrolle.Ausfahrt_Neg;//Ausfahrend: Kontroll-Time ist negativ + SPB Un_A; + + SET; + S #Dyn.FahrKontrolle.Ausfahrt_Neg;//Ausfahrend: Kontroll-Time ist negativ + + U #Dyn.FahrKontrolle.BT_Ausfahrt;//BM fährt aus Weichenbereich + S #Dyn.Error.BM_verklemmt_Ausfahrt;//BM bei Ausfahrt in Weiche verklemmt (-> Antrieb gestoppt) + SPB N_A;//Zeit neu laden + +Un_A: L 0; + T #Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt;//Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] + +en17: NOP 0; + +//BM fährt aus: +//Zeit verändern: + UN #Antrieb_aktiv;//Band ist aktiv + ON "100ms-Impuls"; + SPB En17_Mig; + + L #Dyn.FahrKontrolle.Time_Ausfahrt;//Diese Zeit benötigt BM zum Ausfahren [100ms] + L "MW2";//Anzahl der 100ms-Takte + -I; + T #Dyn.FahrKontrolle.Time_Ausfahrt;//Diese Zeit benötigt BM zum Ausfahren [100ms] + L 0;//Ausfahr-Zeit abgelaufen ? + >I;//Nein ! + SPB En17_Mig; + + T #Dyn.FahrKontrolle.Time_Ausfahrt;//Minimum übergeben + +En17_Mig: NOP 0; + +NETWORK +TITLE = CARR-Telegramm an PC senden +Nw18: UN #Weiche.Parameter.PC_Komm_aktiv; + ON #Dyn.Carr ;//CARR-Telegramm muss noch gesendet werden + O "SGes".Ohne_PC_Fahren; + R #Dyn.Carr;//CARR-Telegramm muss noch gesendet werden + SPB en13; + +//CARR mit dieser IDX schon gesendet?: (wegen Travel-FIFO leer) + L #Daten.Sort_Info.Teil_IDX;//IDX des BT + T "MD220"; + L #SAVE.Teil_IDX_Old;//BT/MT-IDX (wurde bei Auslagerung gemeldet) + ==D; + SPB X130; + +//Puffer ermitteln: + L #Weiche.AbzweigZiel; + + -100; + T "Daten_für_SendFIFO".Puffer_LinienNr; + +//Shopgroup ermitteln: + CALL "DatenOut" + ( SSDB := 1000 , + SSDW := 0 , + PARA := 16#0000 , //Eintrag lesen + SEARCHDATEN := P#M220.0 , + RE_VAL := "MB199" , + OUTDATEN := %DB1011.DBX0.0 , + Position := "MW196" + ); + + L "TrolleyDL_OutDaten".OUTDaten.ShopGroup; + T "Daten_für_SendFIFO".StoreGroup; + +//Bei leerem Trolley (-1) kein Telegramm: + L DINT#-1; + ==D; + SPB X130; + + CALL "Daten_in_SendFIFO_speichern", "Daten_für_SendFIFO" + ( "TelegrammKennung[1]" := 'B' , + "TelegrammKennung[2]" := 'S' , + "TelegrammKennung[3]" := 'R' , + "TelegrammKennung[4]" := 'e' , + "TelegrammKennung[5]" := 's' , + "TelegrammKennung[6]" := 'p' , + "TelegrammKennung[7]" := 'M' , + TrolleyID := #Daten.Sort_Info.Teil_IDX , + Puffer_LinienNr := , //s.o. + StoreGroup := , //s.o. + Port := 1 , + Error := #Error_SendFIFO + ); + + U #Error_SendFIFO; + SPB en13; + +X130: SET; + R #Dyn.Carr;//CARR-Telegramm muss noch gesendet werden + + L #Daten.Sort_Info.Teil_IDX;//IDX des BT + T #SAVE.Teil_IDX_Old;//BT/MT-IDX (wurde bei Auslagerung gemeldet) + +en13: NOP 0; + +NETWORK +TITLE = Trolley-ID in Puffer eintragen + UN #Weiche.Parameter.IDX_an_Puffer; + ON #Dyn.Puffer_IDX ;//Trolley-ID in Puffer eintragen + R #Dyn.Puffer_IDX ;//CARR-Telegramm muss noch gesendet werden + SPB xn16; + + U #Dyn.Status.Ziel_unbekannt;//Ziel des BT ist unbekannt + SPB X160; + + L #Carr_Ziel ;//Ziel, das bei Carr-Telegramm gemeldet wird (1-20) + T "MW220"; + + CALL "DatenOut" + ( SSDB := 275 , + SSDW := 0 , + PARA := 16#0000 , //Eintrag lesen + SEARCHDATEN := P#M220.0 , + RE_VAL := "MB199" , + OUTDATEN := %DB1275.DBX0.0 , + Position := "MW196" + ); + + L "MB199"; + L 2#1111111 ;//Bit 7 ausblenden + UW; + L 0;//Fehler vorhanden? + <>I;//Ja + SPB X160; + + L "LagerDL_OutDaten".OUTDaten.Puffer_Dyn_DB; + T #DatenDB;//s.u. + + L "LagerDL_OutDaten".OUTDaten.Puffer_Dyn_DW; + ITD; + T #AR1Start;//Startwert mit Offset 0 + + L #AR1Start ;//Startwert mit Offset 0 + + DINT#72 ;//Offset TrolleyID_Einfahrt + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #DatenDB]; + + L #Daten.Sort_Info.Teil_IDX;//IDX des Trolleys an Omnipuffer melden + T DBD[ #AR1Zeiger] ;//Lager +1 (DBW 72) + +X160: SET; + R #Dyn.Puffer_IDX ;//CARR-Telegramm muss noch gesendet werden + +xn16: NOP 0; + +NETWORK +TITLE = Weiche schalten + U #Dyn.Status.Weiche_abzweigen;//Weiche auf Abzweig schalten + R #Dyn.Status.Weiche_geradeaus; + = #Y_Weiche_abzweigen; + + U #Dyn.Status.Weiche_geradeaus;//Weiche auf Gerade schalten + = #Y_Weiche_geradeaus; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Module/MWeiche_Sorter_EP.awl b/=A01+UH07-KF00/Programmbausteine/Module/MWeiche_Sorter_EP.awl index ecc3465..16d6d2f 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/MWeiche_Sorter_EP.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/MWeiche_Sorter_EP.awl @@ -1,1136 +1,1231 @@ -=== FB 1178: MWeiche_Sorter_EP [STL] === -INTERFACE: - Input: - Weichen_Nr : Int // Aufruf für Weiche - KorrekturFaktor : Real - ErrQuit : Bool // Ablaufstörung quittieren - Stau_Ausfahrtbereich : Bool // Ausfahrtsbereich hat Stau - B_Gerade : Bool // Kontroll-Sensor nach Weiche Gerade - B_Ausfahrt : Bool // Kontroll-Sensor nach Weiche Ausfahrt - Antrieb_aktiv : Bool // Kreisel-Antrieb aktiv - Output: - Y_Weiche_abzweigen : Bool // Weiche auf Abzweig schalten - Y_Weiche_geradeaus : Bool // Weiche auf Gerade schalten - Error : Word // Störungen übergeben - InOut: - Antrieb_start : Bool // Kreiselantrieb starten - Antrieb_stoppen : Bool // Kreiselantrieb stoppen - hStOk : Bool // Anzeige Start n. Störung aktivieren - Static: - SAVE : Struct - IDX_Flag : Bool // Hauptstrang_DL +1 durchsuchen - Kontroll_Flag : Bool // Hauptstrang_DL +1 durchsuchen - Teil_IDX_Old : DInt // BT/MT-IDX (wurde bei Auslagerung gemeldet) - Para : Struct // Parameter - Weichen_DL_DB : Int // Einsprung Weichen-Datenliste-DB - Weichen_DL_DW : Int // Einsprung Weichen-Datenliste-DW - Res : Array[1..3] of Int // Reserve - Weiche : "UDLWeiche_Sorter" // Fahrbereichs Daten - Dyn : Struct // Dynamische Daten fürs Einfahren - Status : Struct // Status - Schalttakte : DInt // Anzahl der getätigten Umschaltungen - Strecke_gesperrt : Bool // Gefällestrecke ist gesperrt - Strecke_voll : Bool // Gefällestrecke ist voll - Weiche_abzweigen : Bool // Weiche auf Abzweig schalten - Weiche_geradeaus : Bool // Weiche auf Gerade schalten - TeachModus_aktiv : Bool // Teach-Modus ist aktiv - Res45 : Bool - Weichentest_aktiv : Bool // Testschaltung für Einfahrweiche aktiviert - Reset : Bool := TRUE // Reset Einfahrseite starten - Ziel_unbekannt : Bool // Ziel des BT ist unbekannt - Rueckmld : Struct - RET_VAL_BLKMOV_Weiche : Int // Rückmeldung nach BLKMOV-Aufruf - RET_VAL_DL_Weichen : Byte // Rückmeldung nach DatenOut-Aufruf - RET_VAL_Sortliste_Out : Byte // Rückmeldung nach Sortdaten-Out-Aufruf - RET_VAL_SendFIFO : Byte // Rückmeldung nach SendPC_FIFO-Aufruf - Error : "UErrWeiche_Sorter" - Ink_Wert : DInt // Aktueller Inkrementalwert - Max_Wert : DInt // Maximal erlaubter Zählwert - Lauf_Flag : Bool // Zähl-Lauf mit Flag ist aktiv - Flag_Lauf_fertig : Bool // Flag-Lauf wurde beendet - Ohne_Lauf_fertig : Bool // Ohne Flag-Lauf wurde beendet - Hauptstrang_Flag : Bool // Flag zum Weiche schalten (vom Hauptstrang) - Last_Flag : Bool // Flag des letzten durchfahrenden Teils - GSTschalt_Flag : Bool // Flag bei Weiche auf GST schalten - Carr : Bool // CARR-Telegramm muss noch gesendet werden - Puffer_IDX : Bool // Trolley-ID in Puffer eintragen - Ohne_VerklemmKontrolle : Bool // Verklemmkontrolle ausschalten - BM_raus : Bool // BM wurde ausgeschleußt (1 Zyklus) - BM_gerade : Bool // BM wurde gerade gefahren (1 Zyklus) - Max_raus : Bool // Max_Wert wurde schon übertragen - Hauptstrang_Ink : DInt // Inkremente zum Weiche schalten (vom Hauptstrang) - Hauptstrang_Sortliste : Int // Sortliste aus welcher Hauptstrangdaten sind - Hauptstrang_Search_Ink : DInt // Inkremente zum Daten auslesen (Start-Ink) - Hauptstrang_Pos : Int // Aktuelle Position der Daten in Datenliste - GSTschalt_Ink : DInt // Inkremente zum Weiche auf GST schalten - Last_Ink : DInt // Inkremente des letzten durchfahrenden Teils - Last_IDX : DInt // IDX des letzten durchfahrenden Teils - FahrKontrolle : Struct - Ohne_VerklemmKontrolle : Bool // Verklemmkontrolle ausschalten - BT_Gerade : Bool // BM fährt geradeaus durch Weichenbereich - BT_Ausfahrt : Bool // BM fährt aus Weichenbereich - BM_Gerade_erkannt : Bool // Geradeausfahrendes BM wurde erkannt - Gerade_Neg : Bool // Geradeaus: Kontroll-Time ist negativ - BM_Ausfahrt_erkannt : Bool // Ausfahrendes BM wurde erkannt - Ausfahrt_Neg : Bool // Ausfahrend: Kontroll-Time ist negativ - Kontroll_Time_Gerade : Int // Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] - Kontroll_Time_Ausfahrt : Int // Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] - Time_Ausfahrt : Int // Diese Zeit benötigt BM zum Ausfahren [100ms] - Res128 : Array[1..1] of Int // Reserve - Daten : "UBT_Daten" - Kontroll_IDX : DInt // IDX des zu kontollierenden Teils - Res200 : Array[1..23] of Int // Reserve - Temp: - Quelle : Any // Zeiger, wo Rein-Daten sind - Ziel : Any // Zeiger, FIFO-Stelle - Del : Bool // Nur Sortdaten löschen - Error_SendFIFO : Bool - FC86_Para : Word // Parameter-Übergabe - Hauptstrang_Ink : DInt // Inkremente zum Weiche schalten (vom Hauptstrang) - Parameter : Word // Parameter - Freigabe : Int - Carr_Ziel : Int // Ziel, das bei Carr-Telegramm gemeldet wird - DatenDB : Int // DB öffnen - sKorrekturFaktor : Real // Korrektur-Faktor wegen Kettenlängung - AR1Start : DInt // Startwert mit Offset 0 - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - Constant: - ---- NW 1: Parameter-Übergabe --- - L Weichen_Nr // Aufruf-Parameter (für Baustein beobachten) - - L "MW178" // Einsprung Weichen-DL - T Para.Weichen_DL_DB // vor Aufruf übergeben! - L 0 - T Para.Weichen_DL_DW - - ---- NW 2: Eingangsvariablen einlesen --- - L KorrekturFaktor - T sKorrekturFaktor - - ---- NW 3: Für Inbetriebnahme --- -// Beim Teachen Weiche auf gerade: - A Dyn.Status.TeachModus_aktiv - S Y_Weiche_geradeaus // Weiche auf gerade schalten - R Y_Weiche_abzweigen - R Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten - R Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten - BEC - -// Weichentest: - AN Dyn.Status.Weichentest_aktiv - JC en01 - - A "Clock_1Hz" - = Y_Weiche_abzweigen // Weiche zyklisch umschalten - NEG - = Y_Weiche_geradeaus - - SET - R Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten - R Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten - - BEU - -en01: NOP 0 - - ---- NW 4: Gesamt: Out-Bits zum Zurücksetzen --- - SET - R Y_Weiche_abzweigen // Weiche auf Abzweig schalten - R Y_Weiche_geradeaus // Weiche auf gerade schalten - R Dyn.BM_raus // BM wurde ausgeschleußt (1 Zyklus) - R Dyn.BM_gerade // BM wurde gerade gefahren (1 Zyklus) - - ---- NW 5: Statische Weichen-Parameter holen --- - L Weiche.Weichen_Nr // Nummer der Weiche - L Weichen_Nr // Aufruf-Parameter - ==I // Identisch ? - R Dyn.Error.Weichen_DL // Weichendatenbank fehlerhaft - R Dyn.Error.Undef_Weiche // undefinierte Weiche - JC en06 // Ja ! - - T "MW200" // Search-Daten - -CALL FC "DatenOut" (SSDB:=Para.Weichen_DL_DB, SSDW:=Para.Weichen_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196") - - L "MB199" - T Dyn.Rueckmld.RET_VAL_DL_Weichen // Rückmeldung bei Datenbank-Zugriff (Gefälle-DL) - - JBI G_Ok - - A "M199.0" - = Dyn.Error.Weichen_DL // Weichendatenbank fehlerhaft - BEC - - SET - S Dyn.Error.Undef_Weiche // undefinierte Weiche - - BEU - -// Kennung + Datenbytes -G_Ok: SET - R Dyn.Error.Weichen_DL // Weichendatenbank fehlerhaft - R Dyn.Error.Undef_Weiche // undefinierte Weiche - - L 16#1004 // Kennung 10 + Word=04 - T LW0 // Any-Kennung, Datentyp - L 40 // Datenwords speichern - T LW2 // Wiederholungen - -// Quelle-Pointer erzeugen: - L 0 // Bei Merker = 0 ! - T LW4 // DB_Nummer - L 220 // Adresse - SLD 3 - L 16#8300_0000 // Kennung: Merker - OD - T LD6 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche, DSTBLK:=Weiche) // Datenliste-Daten speichern | #Ziel - - L Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Dyn.Error.BLKMov // Error bei Block kopieren - BEC - - L Weiche.Weichen_Typ // Weichentyp = 178 (Weiche) - L 178 // Dieser Aufruf-FB ? - ==I // Ja ! - JC en06 - - SET - S Dyn.Error.Undef_Weiche // undefinierte Weiche - - L 0 // Weiche ungültig ! - T Weiche.Weichen_Nr // Nummer der Weiche - - BEU - -en06: NOP 0 - - ---- NW 6: - --- - AN Dyn.Status.Reset - JC En06_Mig - -// Dyn.Daten löschen: - SET - R Dyn.Status.Reset - R Dyn.Status.Strecke_voll - R Y_Weiche_abzweigen // Weiche auf Abzweig schalten - S Y_Weiche_geradeaus // Weiche auf gerade schalten - R Dyn.Status.Weichentest_aktiv - R Dyn.Hauptstrang_Flag - R Dyn.Last_Flag - R Dyn.FahrKontrolle.BT_Gerade // BM fährt geradeaus durch Weichenbereich - R Dyn.FahrKontrolle.BT_Ausfahrt // BM fährt aus Weichenbereich - R Dyn.FahrKontrolle.Gerade_Neg // Geradeaus: Kontroll-Time ist negativ - R Dyn.FahrKontrolle.Ausfahrt_Neg // Ausfahrend: Kontroll-Time ist negativ -// / R #Dyn.Ohne_VerklemmKontrolle //Verklemmkontrolle ausschalten - R Dyn.Max_raus // Max_Wert wurde schon übertragen - - A Weiche.Parameter.Weichen_GST_gerade - = Dyn.Status.Weiche_geradeaus - A Weiche.Parameter.Weichen_GST_abzweig - AN Weiche.Parameter.Weichen_GST_gerade - = Dyn.Status.Weiche_abzweigen - - L 0 - T Dyn.Hauptstrang_Ink - T Dyn.Hauptstrang_Search_Ink - T Dyn.Last_Ink - - L 0 - T Dyn.Hauptstrang_Sortliste - T Dyn.FahrKontrolle.Kontroll_Time_Gerade // Innerhalb dieser Zeit muss BM Weiche verlassen haben [100ms] - T Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt // Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] - - L DINT#0 - T Kontroll_IDX - T Dyn.Last_IDX - -// Rückmeldungen löschen: - L 0 - T Dyn.Rueckmld.RET_VAL_DL_Weichen - T Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche - T Dyn.Rueckmld.RET_VAL_Sortliste_Out - -// Störungen löschen: - SET - R Dyn.Error.Weichen_DL - R Dyn.Error.Undef_Weiche - R Dyn.Error.BLKMov - R Dyn.Error.Haupstrang_DL - R Dyn.Error.Haupstrang_DL_voll - R Dyn.Error.Keine_HSDaten - R Dyn.Error.Rein_FIFO - R Dyn.Error.Keine_FIFODaten - R Dyn.Error.Stau_AusfahrBereich - R Dyn.Error.BM_verklemmt_Gerade - R Dyn.Error.BM_verklemmt_Ausfahrt - R Dyn.Error.BM_undef_Gerade - R Dyn.Error.Frei14 - R Dyn.Error.Send_FIFO_fehlerhaft // Send-FIFO zum PC ist fehlerhaft - R Dyn.Error.Send_FIFO_voll // Send-FIFO zu PC ist voll - R Dyn.Error.Reset_aktiv // Reset ist aktiv - - L 0 // Damit statische Werte neu aus Datenbank geholt werden ! - T Weiche.Weichen_Nr // Nummer der Weiche - - BEU - -En06_Mig: NOP 0 - - ---- NW 7: Störungen nach Außen übergeben --- - L 0 - T "MB200" - - A Dyn.Error.Weichen_DL // Weichen-Datenliste fehlerhaft - = "M200.0" - A Dyn.Error.Undef_Weiche // undefinierte Weiche - = "M200.1" - A Dyn.Error.BLKMov // Fehler bei Block kopieren - = "M200.2" - A Dyn.Error.Haupstrang_DL // Haupstrang-Datenliste fehlerhaft - = "M200.3" - A Dyn.Error.Haupstrang_DL_voll // Haupstrang-Datenliste ist voll - = "M200.4" - A Dyn.Error.Keine_HSDaten // Keine Hauptstrang-Daten mehr vorhanden - = "M200.5" - A Dyn.Error.Rein_FIFO // Rein-FIFO fehlerhaft - = "M200.6" - A Dyn.Error.Keine_FIFODaten // Keine Rein-Daten mehr vorhanden - = "M200.7" - A Dyn.Error.Stau_AusfahrBereich // Stau im Ausfahrbereich (-> Antrieb stoppen) - = "M201.0" - A Dyn.Error.BM_verklemmt_Gerade // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) - = "M201.1" - A Dyn.Error.BM_verklemmt_Ausfahrt // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen) - = "M201.2" - A Dyn.Error.BM_undef_Gerade // undefiniertes BM bei Weiterfahrt erkannt - = "M201.3" - A Dyn.Error.Frei14 - = "M201.4" - A Dyn.Error.Send_FIFO_fehlerhaft // Send-FIFO zum PC ist fehlerhaft - = "M201.5" - A Dyn.Error.Send_FIFO_voll // Send-FIFO zu PC ist voll - = "M201.6" - CLR // Reset ist aktiv (gibts nicht!) - = Dyn.Error.Reset_aktiv - = "M201.7" - - L "MW200" - T Error // Schnittstelle nach Außen - -// Kreiselantrieb stoppen: - AN Stau_Ausfahrtbereich // Ausfahrtsbereich hat Stau - R Dyn.Error.Stau_AusfahrBereich // Stau im Ausfahrbereich (-> Antrieb stoppen) - -// Antrieb stoppen: - A( - O Dyn.Error.BM_verklemmt_Ausfahrt // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen) - O Dyn.Error.BM_verklemmt_Gerade // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) - ) - AN ErrQuit - O Dyn.Error.Stau_AusfahrBereich // Stau im Ausfahrbereich (-> Antrieb stoppen) - O Dyn.Error.Send_FIFO_fehlerhaft // Send-FIFO zum PC ist fehlerhaft - O Dyn.Error.Send_FIFO_voll // Send-FIFO zu PC ist voll - S Antrieb_stoppen // Kreiselantrieb stoppen - -// Anzeige Start n. Störung aktivieren: - A Dyn.Error.BM_verklemmt_Ausfahrt // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen) - O Dyn.Error.BM_verklemmt_Gerade // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) - O Dyn.Error.Stau_AusfahrBereich // Stau im Ausfahrbereich (-> Antrieb stoppen) - S hStOk - - ---- NW 8: Daten des Inkremental-Gebers holen / Zeit-Inkremente --- - L Weiche.Ink_DB // DB-Nr des Inkremental-Geber - L 0 // angegeben ? - <=I // Nein ! - JC w040 - - CAC - T "MW200" - OPN DB["MW200"] // Zähler-DB öffnen - L DBD80 - T Dyn.Ink_Wert - L DBD76 - T Dyn.Max_Wert - A DBX74.3 - = Dyn.Lauf_Flag - A DBX74.4 - = Dyn.Flag_Lauf_fertig - A DBX74.5 - = Dyn.Ohne_Lauf_fertig - - JU en04 - -// Zeit-Inkremente erzeugen: -w040: AN Antrieb_aktiv - JC w041 - - L "MW4" // 10ms-Takte - ITD - L Dyn.Ink_Wert - +D // Aktueller Zählerwert +100ms-Takte - T Dyn.Ink_Wert - -w041: L DINT#10000 // Festwert: 10000 (100s) - T Dyn.Max_Wert - - L Dyn.Ink_Wert // Aktueller Zählerwert - L Dyn.Max_Wert // Max. Wert erreicht ? - <=D // Nein ! - R Dyn.Ohne_Lauf_fertig // Ohne Flag-Lauf wurde beendet - R Dyn.Flag_Lauf_fertig // Flag-Lauf wurde beendet - JC en04 - - -D // Restwert als Startwert nehmen ! - T Dyn.Ink_Wert - - AN Dyn.Lauf_Flag // Umschaltung Zähl-Lauf ohne-mit-ohne Flag - = Dyn.Ohne_Lauf_fertig // Ohne Flag-Lauf wurde beendet - A Dyn.Lauf_Flag // Umschaltung Zähl-Lauf ohne-mit-ohne Flag - = Dyn.Flag_Lauf_fertig // Flag-Lauf wurde beendet - - AN Dyn.Lauf_Flag // Umschaltung Zähl-Lauf ohne-mit-ohne Flag - = Dyn.Lauf_Flag - -en04: NOP 0 - - ---- NW 9: - --- - A "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - AN B_Gerade - R Dyn.Error.BM_undef_Gerade // undefiniertes BM bei Weiterfahrt erkannt - - AN ErrQuit - JC En08 - -// Störungen löschen: - SET - R Dyn.Error.BM_undef_Gerade - R Dyn.Error.Frei14 - - A "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - A Dyn.Error.BM_verklemmt_Gerade - CLR // Nie da große Trolleys - R Dyn.Error.BM_verklemmt_Gerade - R Dyn.FahrKontrolle.BT_Gerade - - A "Hauptstrang_leer" // Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen - A Dyn.Error.BM_verklemmt_Ausfahrt - CLR // Nie da große Trolleys - R Dyn.Error.BM_verklemmt_Ausfahrt - R Dyn.FahrKontrolle.BT_Ausfahrt - -// Kann nur über Reset zurückgesetzt werden: -// R #Dyn.Error.Weichen_DL -// R #Dyn.Error.Undef_Weiche -// R #Dyn.Error.BLKMov -// R #Dyn.Error.Haupstrang_DL -// R #Dyn.Error.Haupstrang_DL_voll -// R #Dyn.Error.Keine_HSDaten -// R #Dyn.Error.Rein_FIFO -// R #Dyn.Error.Keine_FIFODaten -// R #Dyn.Error.Stau_AusfahrBereich -// R #Dyn.Error.BM_verklemmt_Gerade -// R #Dyn.Error.BM_verklemmt_Ausfahrt -// R #Dyn.Error.Send_FIFO_fehlerhaft //Send-FIFO zum PC ist fehlerhaft -// R #Dyn.Error.Send_FIFO_voll //Send-FIFO zu PC ist voll -// R #Dyn.Error.Reset_aktiv //Reset ist aktiv - -En08: NOP 0 - - ---- NW 10: Schaltpunkt aufgrund von Hauptstrangdaten suchen --- - L Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - L DINT#0 // schon bekannt ? - >D // Ja ! - S Antrieb_start // Kreiselantrieb starten - JC Nw09 - -// Nach neuen Daten suchen: - AN "Weiche_NewData" // Im Weichenbereich nach neuen Daten suchen - JC w076 - - L Dyn.Ink_Wert // Aktueller Inkrementalwert - L Weiche.Off_Ink // Inkremente zum Weiche schalten - >D // Gleiches Flag/Flag wie Inkgeber zum Suchen - JC w071 - -// Anders Flag/Liste wie Inkgeber zum Suchen: - L Weiche.Hauptstrang_DL_DB - - A Dyn.Lauf_Flag // Inkgeber schon mit Lauf-Flag - R SAVE.IDX_Flag // Hauptstrang_DL +1 durchsuchen - JC w070 - - SET - S SAVE.IDX_Flag // Hauptstrang_DL +1 durchsuchen - - + 1 - -w070: T Dyn.Hauptstrang_Sortliste // Sortliste aus welcher Hauptstrangdaten sind - - JU w073 - -// Gleiches Flag/Liste wie Inkgeber zum Suchen: -w071: L Weiche.Hauptstrang_DL_DB - - AN Dyn.Lauf_Flag // Inkgebeer ohne Lauf-Flag - R SAVE.IDX_Flag // Hauptstrang_DL +1 durchsuchen - JC w072 - - SET - S SAVE.IDX_Flag // Hauptstrang_DL +1 durchsuchen - - + 1 - -w072: T Dyn.Hauptstrang_Sortliste // Sortliste aus welcher Hauptstrangdaten sind - -// Hauptstrang Sortliste nach Position -1 durchsuchen: -w073: CALL FC "DatenFindOffsetSort" (SSDB:=Dyn.Hauptstrang_Sortliste, SSDW:=Weiche.Hauptstrang_DL_DW, PARA:=WORD#16#0B01, SEARCHDATEN:=Weiche.Position_minus, RE_VAL:="MB199", OUTDATEN:=Daten, Position:="MW196") // nach 11.DW (letzte Position) suchen - - L "MB199" - T Dyn.Rueckmld.RET_VAL_Sortliste_Out - - A "M199.7" // Datensatz ist vorhanden - R Dyn.Error.Haupstrang_DL // Sortliste fehlerhaft - JC w074 - - A "M199.6" // Datensatz ist nicht vorhanden - R Dyn.Error.Haupstrang_DL // Sortliste fehlerhaft - JC Nw09 // Warten, da noch keine Daten vorhanden - - SET - S Dyn.Error.Haupstrang_DL // Sortliste fehlerhaft - -w076: L 0 // Keine Daten auf Hauptstrang vorhanden - T Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - - JU Nw09 - -// Search-Ink speichern: -w074: L Daten.Start_Ink // Stamm-Daten speichern - T Dyn.Hauptstrang_Search_Ink // Inkremente zum Daten auslesen (Start-Ink) - -// Hauptstrang-Schaltdaten errechnen/speichern: -// Kettenlängungs-Korrektur: - L sKorrekturFaktor // Korrektur-Faktor wegen Kettenlängung - L 0.995 // sinnvoller Wert ? (maximal 0,5% Abweichung erlaubt) - >=R // Ja ! - A( - CAC - L 1.005 - <=R - ) - JC w075 - - L 1.0 // dann ohne Korrektur ! - T sKorrekturFaktor // Korrektur-Faktor wegen Kettenlängung - -// Schaltdaten errechnen: -w075: A Daten.Start_Flag // Lauf-Flag bei Start-Inkremente - = Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang) - - L Weiche.Off_Ink // Inkremente zum Weiche schalten - DTR - L sKorrekturFaktor // Korrektur-Faktor wegen Kettenlängung - *R - RND - L Daten.Start_Ink // Daten aus Sortliste dazuaddieren - +D - T Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - L Dyn.Max_Wert // Maximal erlaubter Zählwert - >D - JCN Nw09 - - -D // Restwert übernehmen - T Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - - AN Daten.Start_Flag // Lauf-Flag bei Start-Inkremente (invertieren) - = Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang) - - ---- NW 11: Weiche aufgrund der Hauptstrangdaten schalten --- -Nw09: L Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - L DINT#0 // angegeben ? - <=D // Nein ! - JC w08E - - A Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang) - A Dyn.Flag_Lauf_fertig // Flag-Lauf wurde beendet - O - AN Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang) - A Dyn.Ohne_Lauf_fertig // Flag-Lauf wurde beendet - JC w080 // beim Ende des Lauf sind Inkremente uninteressant - - A Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang) - A Dyn.Lauf_Flag // Zähl-Lauf mit Flag ist aktiv - O - AN Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang) - AN Dyn.Lauf_Flag // Zähl-Lauf mit Flag ist aktiv - JCN en08_Mig - - L Dyn.Ink_Wert // Aktuelle Inkrementalwert - L Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - I // BM soll nicht ausfahren ! - ON Weiche.Parameter.ErsatzZiel_bei_Stau // Bei Stau soll Ersatz-Ziel angefahren werden - ON Stau_Ausfahrtbereich - JC x081 - - L Weiche.ErsatzZiel // Ersatz-Ziel übergeben - T Daten.Sort_Info.Teil_Ziel - -x081: L Daten.Sort_Info.Teil_Ziel // Ziel des BT (aufgrund vom Hauptstrang) - L 0 - <=I - = Dyn.Status.Ziel_unbekannt // Ziel des BT ist unbekannt - - A Dyn.Status.Ziel_unbekannt // Ziel des BT ist unbekannt - A Weiche.Parameter.Weichen_GST_gerade - AN Weiche.Parameter.Weichen_GST_abzweig - JC x100 // BT mit unbekanntem Ziel geradeaus fahren - - A Dyn.Status.Ziel_unbekannt // Ziel des BT ist unbekannt - AN Weiche.Parameter.Weichen_GST_gerade - A Weiche.Parameter.Weichen_GST_abzweig - JC w082 // BT mit unbekanntem Ziel ausfahren - - L Daten.Sort_Info.Teil_Ziel // Ziel des BT (aufgrund vom Hauptstrang) - L Weiche.AbzweigZiel // Bei diesem Ziel Weiche auf Abzweig schalten + Carl - T Carr_Ziel // Ziel, das bei Carr-Telegramm gemeldet wird - ==I // BM soll ausfahren - S Dyn.Carr // CARR-Telegramm muss noch gesendet werden - S Dyn.Puffer_IDX // Trolley-ID in Puffer eintragen - JC w082 // Teil ausfahren - - L Daten.Sort_Info.Teil_Ziel // Ziel des BT (aufgrund vom Hauptstrang) - L Weiche.GeradeZiel // Bei diesem Ziel Weiche auf Gerade schalten + Carl - <>I // BM soll also ausfahren, da nicht das GeradeZiel! - A( - L 0 // sinnvolle Angabe ? - >I // Ja ! - ) - JC w082 // Teil ausfahren (ohne CARR, da undef. rausfahren!) - -// Teile geradeaus fahren:****************************************************************************************************** -x100: SET - S Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten - R Dyn.Status.Weiche_abzweigen - S Dyn.BM_gerade // BM wurde gerade gefahren (1 Zyklus) - -// Verklemm-Kontroll-Info speichern: - AN Weiche.Parameter.Kontroll_B_Gerade // Kontroll-Sensor bei Weiterfahrt (gerade) - JC k100 // Letzter BM noch nicht kontrolliert - - A Dyn.FahrKontrolle.BT_Gerade // BM fährt geradeaus durch Weichenbereich - JC k100 // Letzter BM noch nicht kontrolliert - - L Dyn.Last_IDX // IDX des letzten durchfahrenden Teils - T Kontroll_IDX // IDX des zu kontollierenden Teils - A SAVE.IDX_Flag // Hauptstrang_DL +1 durchsuchen - = SAVE.Kontroll_Flag // Hauptstrang_DL +1 durchsuchen - - L Weiche.Kontroll_Zeit_gerade // Nach dieser Zeit muss BM Weichenbereich verlassen haben [100ms] - T Dyn.FahrKontrolle.Kontroll_Time_Gerade // Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] - - SET - S Dyn.FahrKontrolle.BT_Gerade // BM fährt geradeaus durch Weichenbereich - R Dyn.FahrKontrolle.Gerade_Neg // Geradeaus: Kontroll-Time ist negativ - -// CARR-Telegramm erwünscht ?: -k100: L Daten.Sort_Info.Teil_Ziel // Ziel des BT (aufgrund vom Hauptstrang) - L Weiche.GeradeZiel // Bei diesem Ziel Weiche auf Gerade schalten + Carl - T Carr_Ziel // Ziel, das bei Carr-Telegramm gemeldet wird - ==I // BM soll ausfahren - S Dyn.Carr // CARR-Telegramm muss noch gesendet werden - - A Weiche.Parameter.Letzte_Weiche // Letzte Weiche im Verbund - S Del // Nur Sortdaten löschen - JC w084 // Daten aus Sortliste löschen - -// Letzte Position neu speichern: -New: L Weiche.Weichen_Nr // Nummer der Weiche - T Daten.letzte_Position // Letzte Position, wo Teil vorbeigefahren ist - -CALL FC "DatenIn" (SSDB:=Dyn.Hauptstrang_Sortliste, SSDW:=Weiche.Hauptstrang_DL_DW, INDATEN:=Daten, RE_VAL:="MB199") - - L "MB199" - T Dyn.Rueckmld.RET_VAL_Sortliste_Out - - A "M199.7" // Datensatz ist vorhanden /Alles Ok) - JC GST - - SET - S Dyn.Error.Haupstrang_DL // Sortliste fehlerhaft - JU GST - -// Teile ausfahren:************************************************************************************************************ -w082: A Dyn.Status.Weiche_abzweigen // Weiche war schon auf Abzweig - JC w083 - - L Dyn.Status.Schalttakte - + DINT#1 // Auf Abzweig umgeschaltet +1 - T Dyn.Status.Schalttakte - -w083: SET - S Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten - R Dyn.Status.Weiche_geradeaus - R Del // Nur Sortdaten löschen - S Dyn.BM_raus // BM wurde ausgeschleußt (1 Zyklus) - - L 300 // Nach dieser Zeit ist BM ausgefahren [300*100ms] - T Dyn.FahrKontrolle.Time_Ausfahrt // Diese Zeit benötigt BM zum Ausfahren [100ms] - -// Verklemm-Kontroll-Info speichern: - AN Weiche.Parameter.Kontroll_B_Ausfahrt // Kontroll-Sensor bei Ausfahrt (abzweig) - JC k101 // Letzter BM noch nicht kontrolliert - - A Dyn.FahrKontrolle.BT_Ausfahrt // BM fährt aus Weichenbereich - JC k101 // Letzter BM noch nicht kontrolliert - - L Dyn.Last_IDX // IDX des letzten durchfahrenden Teils - T Kontroll_IDX // IDX des zu kontollierenden Teils - A SAVE.IDX_Flag // Hauptstrang_DL +1 durchsuchen - = SAVE.Kontroll_Flag // Hauptstrang_DL +1 durchsuchen - - L Weiche.Kontroll_Zeit_abzweigen // Nach dieser Zeit muss BM Weichenbereich verlassen haben [100ms] - T Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt // Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] - - SET - S Dyn.FahrKontrolle.BT_Ausfahrt // BM fährt aus Weichenbereich - R Dyn.FahrKontrolle.Ausfahrt_Neg // Ausfahrend: Kontroll-Time ist negativ - -k101: A Stau_Ausfahrtbereich // Ausfahrtsbereich hat Stau - AN Weiche.Parameter.ErsatzZiel_bei_Stau // Bei Stau soll Ersatz-Ziel angefahren werden - S Dyn.Error.Stau_AusfahrBereich // Stau im Ausfahrbereich (-> Antrieb stoppen) - -// Falls Entlade-Weiche neues Leer-Ziel übergeben: - AN Weiche.Parameter.Entlade_Weiche // BM wird entladen -> Leerziel übergeben - O Weiche.Parameter.Letzte_Weiche // Letzte Weiche im Verbund - JC w084 - - L Weiche.LeerZiel // Nach Entladen des BM dieses Ziel übergeben - T Daten.Sort_Info.Teil_Ziel // BM bei diesem Abwurf-Ziel ausfahren/entladen - L 0 // Sinnvolle Angabe ? - >I // Ja ! - JC New // Daten mit neuem Ziel an Hauptstrang übergeben ! - -// Daten aus Sortliste löschen -w084: L Dyn.Hauptstrang_Pos // Aktuelle Position der Daten in Datenliste - L 16#0E00 // 0EYY: DS YY löschen - OW - T FC86_Para - -CALL FC "DatenOutSort" (SSDB:=Dyn.Hauptstrang_Sortliste, SSDW:=Weiche.Hauptstrang_DL_DW, PARA:=FC86_Para, OUTDATEN:=Daten, RE_VAL:="MB199") // DS YY löschen - -// GST-Schalt-Inks speichern: -GST: AN Weiche.Parameter.Weichen_GST_gerade - AN Weiche.Parameter.Weichen_GST_abzweig - JC w08E - - L Weiche.Ink_Schaltdauer // Inkremente (Fenster), danach wird Weiche in GST geschaltet - L 0 // sinnvoller Wert ? - <=I // Nein ! - JC w08E - - L Weiche.Ink_Schaltdauer // Inkremente (Fenster), danach wird Weiche in GST geschaltet - ITD - L Dyn.Ink_Wert // Aktueller Inkrementalwert - +D - T Dyn.GSTschalt_Ink // Inkremente bei Weiche auf GST schalten - A Dyn.Lauf_Flag // Zähl-Lauf mit Flag ist aktiv - = Dyn.GSTschalt_Flag // Flag bei Weiche auf GST schalten - - L Dyn.Max_Wert // Maximal erlaubter Zählwert überschritten ? - <=D // Nein ! - JC w08E - - -D // Restwert übernehmen - T Dyn.GSTschalt_Ink // Inkremente bei Weiche auf GST schalten - AN Dyn.Lauf_Flag // Zähl-Lauf mit Flag ist aktiv (invertieren, da Überlauf!) - = Dyn.GSTschalt_Flag // Flag bei Weiche auf GST schalten - -w08E: L DINT#0 - T Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang) - -en08_Mig: NOP 0 - - ---- NW 12: Weiche auf GST zurückschalten --- - L Dyn.GSTschalt_Ink // Inkremente bei Weiche auf GST schalten - L 0 // sinnvolle Angabe ? - <=D // Nein ! - JC X111 - - A Dyn.GSTschalt_Flag // Flag bei Weiche auf GST schalten - A Dyn.Flag_Lauf_fertig // Flag-Lauf wurde beendet - O - AN Dyn.GSTschalt_Flag // Flag bei Weiche auf GST schalten - A Dyn.Ohne_Lauf_fertig // Flag-Lauf wurde beendet - JC w110 // beim Ende des Lauf sind Inkremente uninteressant - - A Dyn.GSTschalt_Flag // Flag bei Weiche auf GST schalten - A Dyn.Lauf_Flag // Zähl-Lauf mit Flag ist aktiv - O - AN Dyn.GSTschalt_Flag // Flag bei Weiche auf GST schalten - AN Dyn.Lauf_Flag // Zähl-Lauf mit Flag ist aktiv - JCN en11 - - L Dyn.Ink_Wert // Aktuelle Inkrementalwert - L Dyn.GSTschalt_Ink // Inkremente bei Weiche auf GST schalten - D // Haupstrangdaten sind kleiner - A( - L 0 // sinnvolle Hauptstrang-Daten ? - <>D // Ja ! - ) - JC X111 // Nicht auf GST schalten, da nächste Daten schon kommen ! - -// Weiche auf GST schalten: - A Weiche.Parameter.Weichen_GST_gerade - AN Weiche.Parameter.Weichen_GST_abzweig - JCN W110_Mig // Negierter Sprung ! - - A Dyn.FahrKontrolle.BT_Ausfahrt // BM fährt aus Weichenbereich - O Dyn.Error.BM_verklemmt_Ausfahrt // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen) - JC en11 // Warten - - SET - S Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten - R Dyn.Status.Weiche_abzweigen - JU X111 - -W110_Mig: A Weiche.Parameter.Weichen_GST_abzweig - AN Weiche.Parameter.Weichen_GST_gerade - JCN X111 // Negierter Sprung ! - - A Dyn.FahrKontrolle.BT_Gerade // BM fährt geradeaus durch Weichenbereich - O Dyn.Error.BM_verklemmt_Gerade // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) - JC en11 // Warten - - SET - S Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten - R Dyn.Status.Weiche_geradeaus - -X111: L DINT#0 - T Dyn.GSTschalt_Ink // Inkremente bei Weiche auf GST schalten - SET - R Dyn.GSTschalt_Flag // Flag bei Weiche auf GST schalten - -en11: NOP 0 - - ---- NW 13: Weichenbereich auf verklemmte gerade fahrende BM kontrollieren --- - AN Weiche.Parameter.Kontroll_B_Gerade // Kontroll-Sensor bei Weiterfahrt (gerade) - O Dyn.Ohne_VerklemmKontrolle // Verklemmkontrolle ausschalten - O "Hauptstrang_leer" - R Dyn.FahrKontrolle.BT_Gerade // BM fährt geradeaus durch Weichenbereich - R Dyn.FahrKontrolle.BM_Gerade_erkannt // Geradeausfahrendes BM wurde erkannt - R Dyn.Error.BM_verklemmt_Gerade // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) - R Dyn.Error.BM_undef_Gerade // undefiniertes BM bei Weiterfahrt erkannt - S Dyn.FahrKontrolle.Gerade_Neg // Geradeaus: Kontroll-Time ist negativ - JC Nw17 - -// BM fährt geradeaus: - A B_Gerade // Kontroll-Sensor nach Weiche Gerade - AN Dyn.FahrKontrolle.BM_Gerade_erkannt // Geradeausfahrendes BM wurde erkannt - A Dyn.FahrKontrolle.BT_Gerade // BM fährt geradeaus durch Weichenbereich - R Dyn.FahrKontrolle.BT_Gerade - S Dyn.FahrKontrolle.BM_Gerade_erkannt // Geradeausfahrendes BM wurde erkannt - - AN B_Gerade // Kontroll-Sensor nach Weiche Gerade - R Dyn.FahrKontrolle.BM_Gerade_erkannt // Geradeausfahrendes BM wurde erkannt - - L Dyn.Last_IDX // IDX des letzten durchfahrenden Teils - T Kontroll_IDX // IDX des zu kontollierenden Teils - A SAVE.IDX_Flag // Hauptstrang_DL +1 durchsuchen - = SAVE.Kontroll_Flag // Hauptstrang_DL +1 durchsuchen - - JU Q_G - -N_G: L Weiche.Kontroll_Zeit_gerade // Nach dieser Zeit muss BM Weichenbereich verlassen haben [100ms] - T Dyn.FahrKontrolle.Kontroll_Time_Gerade // Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] - -Q_G: A ErrQuit - AN Dyn.FahrKontrolle.BT_Gerade // BM fährt geradeaus durch Weichenbereich - R Dyn.Error.BM_verklemmt_Gerade // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) - -// Zeit verändern: - AN Antrieb_aktiv // Band ist aktiv - ON "100ms-Impuls" - O Dyn.Error.BM_verklemmt_Gerade // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) - JC Un_G - - L Dyn.FahrKontrolle.Kontroll_Time_Gerade // Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] - L "MW2" // Anzahl der 100ms-Takte - -I - T Dyn.FahrKontrolle.Kontroll_Time_Gerade // Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] - L 0 // Kontroll-Zeit abgelaufen ? - >I // Nein ! - R Dyn.FahrKontrolle.Gerade_Neg // Geradeaus: Kontroll-Time ist negativ - JC en16 - -// BM verklemmt ?: - A Dyn.FahrKontrolle.Gerade_Neg // Geradeaus: Kontroll-Time ist negativ - JC Un_G - - SET - S Dyn.FahrKontrolle.Gerade_Neg // Geradeaus: Kontroll-Time ist negativ - - A Dyn.FahrKontrolle.BT_Gerade // BM fährt geradeaus durch Weichenbereich - S Dyn.Error.BM_verklemmt_Gerade // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) - JC N_G // Zeit neu laden - -// BM undefiniert ?: -Un_G: L Dyn.FahrKontrolle.Kontroll_Time_Gerade // Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] - L Weiche.DraussenZeit_gerade // Nach dieser neg. Zeit [100ms] Error undef.BM, falls Kontroll-Sensor aktiv - >I // Muss BM draussen sein ? Nein ! - JC en16 - - T Dyn.FahrKontrolle.Kontroll_Time_Gerade // Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] - - AN B_Gerade // Kontroll-Sensor nach Weiche Gerade - JC en16 - - SET - S Dyn.Error.BM_undef_Gerade // undefiniertes BM bei Weiterfahrt erkannt - -en16: NOP 0 - - ---- NW 14: Weichenbereich auf verklemmte ausfahrende BM kontrollieren --- -Nw17: AN Weiche.Parameter.Kontroll_B_Ausfahrt // Kontroll-Sensor bei Ausfahrt (abzweig) - O Dyn.Ohne_VerklemmKontrolle // Verklemmkontrolle ausschalten - R Dyn.FahrKontrolle.BT_Ausfahrt // BM fährt aus Weichenbereich - R Dyn.FahrKontrolle.BM_Ausfahrt_erkannt // Ausfahrendes BM wurde erkannt - R Dyn.Error.BM_verklemmt_Ausfahrt // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb gestoppt) - S Dyn.FahrKontrolle.Ausfahrt_Neg // Ausfahrend: Kontroll-Time ist negativ - JC Nw18 - -// BM fährt aus: - A B_Ausfahrt // Kontroll-Sensor nach Weiche Ausfahrt - AN Stau_Ausfahrtbereich // Bei Stau Einzelerkennung nicht mehr möglich! - AN Dyn.FahrKontrolle.BM_Ausfahrt_erkannt // Ausfahrendes BM wurde erkannt - A Dyn.FahrKontrolle.BT_Ausfahrt // BM fährt aus Weichenbereich - R Dyn.FahrKontrolle.BT_Ausfahrt - S Dyn.FahrKontrolle.BM_Ausfahrt_erkannt // Ausfahrendes BM wurde erkannt - - AN B_Ausfahrt // Kontroll-Sensor nach Weiche Ausfahrt - O Stau_Ausfahrtbereich // Bei Stau auch ! - R Dyn.FahrKontrolle.BM_Ausfahrt_erkannt // Ausfahrendes BM wurde erkannt - - JU Q_A - -N_A: L Weiche.Kontroll_Zeit_abzweigen // Nach dieser Zeit muss BM Weichenbereich verlassen haben [100ms] - T Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt // Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] - -Q_A: A ErrQuit // s.u. - SET // Ohne Quittierung - AN Dyn.FahrKontrolle.BT_Ausfahrt // BM fährt aus Weichenbereich - R Dyn.Error.BM_verklemmt_Ausfahrt // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb gestoppt) - -// Zeit verändern: - AN Antrieb_aktiv // Band ist aktiv - ON "100ms-Impuls" - O Dyn.Error.BM_verklemmt_Ausfahrt // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb gestoppt) - JC en17 - - L Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt // Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] - L "MW2" // Anzahl der 100ms-Takte - -I - T Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt // Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] - L 0 // Kontroll-Zeit abgelaufen ? - >I // Nein ! - R Dyn.FahrKontrolle.Ausfahrt_Neg // Ausfahrend: Kontroll-Time ist negativ - JC en17 - -// BM verklemmt ?: - A Dyn.FahrKontrolle.Ausfahrt_Neg // Ausfahrend: Kontroll-Time ist negativ - JC Un_A - - SET - S Dyn.FahrKontrolle.Ausfahrt_Neg // Ausfahrend: Kontroll-Time ist negativ - - A Dyn.FahrKontrolle.BT_Ausfahrt // BM fährt aus Weichenbereich - S Dyn.Error.BM_verklemmt_Ausfahrt // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb gestoppt) - JC N_A // Zeit neu laden - -Un_A: L 0 - T Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt // Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] - -en17: NOP 0 - -// BM fährt aus: -// Zeit verändern: - AN Antrieb_aktiv // Band ist aktiv - ON "100ms-Impuls" - JC En17_Mig - - L Dyn.FahrKontrolle.Time_Ausfahrt // Diese Zeit benötigt BM zum Ausfahren [100ms] - L "MW2" // Anzahl der 100ms-Takte - -I - T Dyn.FahrKontrolle.Time_Ausfahrt // Diese Zeit benötigt BM zum Ausfahren [100ms] - L 0 // Ausfahr-Zeit abgelaufen ? - >I // Nein ! - JC En17_Mig - - T Dyn.FahrKontrolle.Time_Ausfahrt // Minimum übergeben - -En17_Mig: NOP 0 - - ---- NW 15: CARR-Telegramm an PC senden --- -Nw18: AN Weiche.Parameter.PC_Komm_aktiv - ON Dyn.Carr // CARR-Telegramm muss noch gesendet werden - O "SGes".Ohne_PC_Fahren - R Dyn.Carr // CARR-Telegramm muss noch gesendet werden - JC en13 - -// CARR mit dieser IDX schon gesendet?: (wegen Travel-FIFO leer) - L Daten.Sort_Info.Teil_IDX // IDX des BT - T "MD220" - L SAVE.Teil_IDX_Old // BT/MT-IDX (wurde bei Auslagerung gemeldet) - ==D - JC X130 - -// GOHDUM an Host senden: oder beim Verlaasen vom Sep4503? -// Puffer ermitteln: - L Weiche.AbzweigZiel - + -200 - T "Daten_für_SendFIFO".Puffer_LinienNr - -// Pufferstatus (Stau) ermitteln: - A "DEP_Sensoren".Stau_EP1.Stat.B_Akt - = "Daten_für_SendFIFO"."Status_2_Bit[0]" - A "DEP_Sensoren".Stau_EP2.Stat.B_Akt - = "Daten_für_SendFIFO"."Status_2_Bit[1]" - A "DEP_Sensoren".Stau_EP3.Stat.B_Akt - = "Daten_für_SendFIFO"."Status_2_Bit[2]" - A "DEP_Sensoren".Stau_EP4.Stat.B_Akt - = "Daten_für_SendFIFO"."Status_2_Bit[3]" - -CALL FB "Daten_in_SendFIFO_speichern" , (TelegrammKennung[1]:='G', TelegrammKennung[2]:='O', TelegrammKennung[3]:='H', TelegrammKennung[4]:='D', TelegrammKennung[5]:='U', TelegrammKennung[6]:='M', TelegrammKennung[7]:=?, TelegrammKennung[8]:=?, TelegrammKennung[9]:=?, TelegrammKennung[10]:=?, TrolleyID:=Daten.Sort_Info.Teil_IDX, StationsNr:=4503, Puffer_LinienNr:=?, StoreGroup:=?, Status_1_Int:=?, Status_2_Bit[0]:=?, Status_2_Bit[1]:=?, Status_2_Bit[2]:=?, Status_2_Bit[3]:=?, Status_2_Bit[4]:=?, Status_2_Bit[5]:=?, Status_2_Bit[6]:=?, Status_2_Bit[7]:=?, Reserve[1]_Int:=?, Reserve[2]_Int:=?, Port:=2, Ret_Val_FIFO_IN:="MB199", Error:=Error_SendFIFO) // s.o. | s.o. | s.o. | s.o. | s.o. - - A Error_SendFIFO - JC en13 - -X130: SET - R Dyn.Carr // CARR-Telegramm muss noch gesendet werden - - L Daten.Sort_Info.Teil_IDX // IDX des BT - T SAVE.Teil_IDX_Old // BT/MT-IDX (wurde bei Auslagerung gemeldet) - -en13: NOP 0 - - ---- NW 16: Trolley-ID in Puffer eintragen --- - AN Weiche.Parameter.IDX_an_Puffer - ON Dyn.Puffer_IDX // Trolley-ID in Puffer eintragen - R Dyn.Puffer_IDX // CARR-Telegramm muss noch gesendet werden - JC xn16 - - A Dyn.Status.Ziel_unbekannt // Ziel des BT ist unbekannt - JC X160 - - L Carr_Ziel // Ziel, das bei Carr-Telegramm gemeldet wird (1-20) - T "MW220" - -CALL FC "DatenOut" (SSDB:=275, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=P#M220.0, RE_VAL:="MB199", OUTDATEN:=DB1275.DBX0.0, Position:="MW196") // Eintrag lesen - - L "MB199" - L 2#1111111 // Bit 7 ausblenden - AW - L 0 // Fehler vorhanden? - <>I // Ja - JC X160 - - L "LagerDL_OutDaten".OUTDaten.Puffer_Dyn_DB - T DatenDB // s.u. - - L "LagerDL_OutDaten".OUTDaten.Puffer_Dyn_DW - ITD - T AR1Start // Startwert mit Offset 0 - - L AR1Start // Startwert mit Offset 0 - + DINT#72 // Offset TrolleyID_Einfahrt - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - - OPN DB[DatenDB] - - L Daten.Sort_Info.Teil_IDX // IDX des Trolleys an Omnipuffer melden - T DBD [AR1Zeiger] // Lager +1 (DBW 72) - -X160: SET - R Dyn.Puffer_IDX // CARR-Telegramm muss noch gesendet werden - -xn16: NOP 0 - - ---- NW 17: Weiche schalten --- - A Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten - R Dyn.Status.Weiche_geradeaus - = Y_Weiche_abzweigen - - A Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten - = Y_Weiche_geradeaus - - ---- NW 18: Ende --- - BE +FUNCTION_BLOCK "MWeiche_Sorter_EP" +TITLE = Weichen-Modul (AS) +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 +//COPYRIGHT by Ingenieurbüro A.Emmert +//Ortsstr.33, D-869925 Fuchstal (Germany) +//Tel.: 0049(0)8243-960629 +//Version: ILS2100 / 03.02.2010 +// + VAR_INPUT + Weichen_Nr : Int; // Aufruf für Weiche + KorrekturFaktor : Real; + ErrQuit : Bool; // Ablaufstörung quittieren + Stau_Ausfahrtbereich : Bool; // Ausfahrtsbereich hat Stau + B_Gerade : Bool; // Kontroll-Sensor nach Weiche Gerade + B_Ausfahrt : Bool; // Kontroll-Sensor nach Weiche Ausfahrt + Antrieb_aktiv : Bool; // Kreisel-Antrieb aktiv + END_VAR + + VAR_OUTPUT + Y_Weiche_abzweigen : Bool; // Weiche auf Abzweig schalten + Y_Weiche_geradeaus : Bool; // Weiche auf Gerade schalten + Error : Word; // Störungen übergeben + END_VAR + + VAR_IN_OUT + Antrieb_start : Bool; // Kreiselantrieb starten + Antrieb_stoppen : Bool; // Kreiselantrieb stoppen + hStOk : Bool; // Anzeige Start n. Störung aktivieren + END_VAR + + VAR + SAVE : Struct + IDX_Flag : Bool; // Hauptstrang_DL +1 durchsuchen + Kontroll_Flag : Bool; // Hauptstrang_DL +1 durchsuchen + Teil_IDX_Old : DInt; // BT/MT-IDX (wurde bei Auslagerung gemeldet) + END_STRUCT; + Para : Struct // Parameter + Weichen_DL_DB : Int; // Einsprung Weichen-Datenliste-DB + Weichen_DL_DW : Int; // Einsprung Weichen-Datenliste-DW + Res : Array[1..3] of Int; // Reserve + END_STRUCT; + Weiche : "UDLWeiche_Sorter"; // Fahrbereichs Daten + Dyn : Struct // Dynamische Daten fürs Einfahren + Status : Struct // Status + Schalttakte : DInt; // Anzahl der getätigten Umschaltungen + Strecke_gesperrt : Bool; // Gefällestrecke ist gesperrt + Strecke_voll : Bool; // Gefällestrecke ist voll + Weiche_abzweigen : Bool; // Weiche auf Abzweig schalten + Weiche_geradeaus : Bool; // Weiche auf Gerade schalten + TeachModus_aktiv : Bool; // Teach-Modus ist aktiv + Res45 : Bool; + Weichentest_aktiv : Bool; // Testschaltung für Einfahrweiche aktiviert + Reset : Bool := TRUE; // Reset Einfahrseite starten + Ziel_unbekannt : Bool; // Ziel des BT ist unbekannt + END_STRUCT; + Rueckmld : Struct + RET_VAL_BLKMOV_Weiche : Int; // Rückmeldung nach BLKMOV-Aufruf + RET_VAL_DL_Weichen : Byte; // Rückmeldung nach DatenOut-Aufruf + RET_VAL_Sortliste_Out : Byte; // Rückmeldung nach Sortdaten-Out-Aufruf + RET_VAL_SendFIFO : Byte; // Rückmeldung nach SendPC_FIFO-Aufruf + END_STRUCT; + Error : "UErrWeiche_Sorter"; + Ink_Wert : DInt; // Aktueller Inkrementalwert + Max_Wert : DInt; // Maximal erlaubter Zählwert + Lauf_Flag : Bool; // Zähl-Lauf mit Flag ist aktiv + Flag_Lauf_fertig : Bool; // Flag-Lauf wurde beendet + Ohne_Lauf_fertig : Bool; // Ohne Flag-Lauf wurde beendet + Hauptstrang_Flag : Bool; // Flag zum Weiche schalten (vom Hauptstrang) + Last_Flag : Bool; // Flag des letzten durchfahrenden Teils + GSTschalt_Flag : Bool; // Flag bei Weiche auf GST schalten + Carr : Bool; // CARR-Telegramm muss noch gesendet werden + Puffer_IDX : Bool; // Trolley-ID in Puffer eintragen + Ohne_VerklemmKontrolle : Bool; // Verklemmkontrolle ausschalten + BM_raus : Bool; // BM wurde ausgeschleußt (1 Zyklus) + BM_gerade : Bool; // BM wurde gerade gefahren (1 Zyklus) + Max_raus : Bool; // Max_Wert wurde schon übertragen + Hauptstrang_Ink : DInt; // Inkremente zum Weiche schalten (vom Hauptstrang) + Hauptstrang_Sortliste : Int; // Sortliste aus welcher Hauptstrangdaten sind + Hauptstrang_Search_Ink : DInt; // Inkremente zum Daten auslesen (Start-Ink) + Hauptstrang_Pos : Int; // Aktuelle Position der Daten in Datenliste + GSTschalt_Ink : DInt; // Inkremente zum Weiche auf GST schalten + Last_Ink : DInt; // Inkremente des letzten durchfahrenden Teils + Last_IDX : DInt; // IDX des letzten durchfahrenden Teils + FahrKontrolle : Struct + Ohne_VerklemmKontrolle : Bool; // Verklemmkontrolle ausschalten + BT_Gerade : Bool; // BM fährt geradeaus durch Weichenbereich + BT_Ausfahrt : Bool; // BM fährt aus Weichenbereich + BM_Gerade_erkannt : Bool; // Geradeausfahrendes BM wurde erkannt + Gerade_Neg : Bool; // Geradeaus: Kontroll-Time ist negativ + BM_Ausfahrt_erkannt : Bool; // Ausfahrendes BM wurde erkannt + Ausfahrt_Neg : Bool; // Ausfahrend: Kontroll-Time ist negativ + Kontroll_Time_Gerade : Int; // Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] + Kontroll_Time_Ausfahrt : Int; // Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] + Time_Ausfahrt : Int; // Diese Zeit benötigt BM zum Ausfahren [100ms] + END_STRUCT; + Res128 : Array[1..1] of Int; // Reserve + END_STRUCT; + Daten : "UBT_Daten"; + Kontroll_IDX : DInt; // IDX des zu kontollierenden Teils + Res200 : Array[1..23] of Int; // Reserve + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Rein-Daten sind + Ziel : Any; // Zeiger, FIFO-Stelle + Del : Bool; // Nur Sortdaten löschen + Error_SendFIFO : Bool; + FC86_Para : Word; // Parameter-Übergabe + Hauptstrang_Ink : DInt; // Inkremente zum Weiche schalten (vom Hauptstrang) + Parameter : Word; // Parameter + Freigabe : Int; + Carr_Ziel : Int; // Ziel, das bei Carr-Telegramm gemeldet wird + DatenDB : Int; // DB öffnen + sKorrekturFaktor : Real; // Korrektur-Faktor wegen Kettenlängung + AR1Start : DInt; // Startwert mit Offset 0 + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + END_VAR + + +BEGIN +NETWORK +TITLE = Parameter-Übergabe + L #Weichen_Nr;//Aufruf-Parameter (für Baustein beobachten) + + L "MW178";//Einsprung Weichen-DL + T #Para.Weichen_DL_DB;//vor Aufruf übergeben! + L 0; + T #Para.Weichen_DL_DW; + +NETWORK +TITLE = Eingangsvariablen einlesen + L #KorrekturFaktor; + T #sKorrekturFaktor; + +NETWORK +TITLE = Für Inbetriebnahme + +//Beim Teachen Weiche auf gerade: + U #Dyn.Status.TeachModus_aktiv; + S #Y_Weiche_geradeaus;//Weiche auf gerade schalten + R #Y_Weiche_abzweigen; + R #Dyn.Status.Weiche_abzweigen;//Weiche auf Abzweig schalten + R #Dyn.Status.Weiche_geradeaus;//Weiche auf Gerade schalten + BEB; + +//Weichentest: + UN #Dyn.Status.Weichentest_aktiv; + SPB en01; + + U "Clock_1Hz"; + = #Y_Weiche_abzweigen;//Weiche zyklisch umschalten + NOT; + = #Y_Weiche_geradeaus; + + SET; + R #Dyn.Status.Weiche_abzweigen;//Weiche auf Abzweig schalten + R #Dyn.Status.Weiche_geradeaus;//Weiche auf Gerade schalten + + BEA; + +en01: NOP 0; + +NETWORK +TITLE = Gesamt: Out-Bits zum Zurücksetzen + SET; + R #Y_Weiche_abzweigen;//Weiche auf Abzweig schalten + R #Y_Weiche_geradeaus;//Weiche auf gerade schalten + R #Dyn.BM_raus;//BM wurde ausgeschleußt (1 Zyklus) + R #Dyn.BM_gerade;//BM wurde gerade gefahren (1 Zyklus) + +NETWORK +TITLE = Statische Weichen-Parameter holen + L #Weiche.Weichen_Nr;//Nummer der Weiche + L #Weichen_Nr;//Aufruf-Parameter + ==I;//Identisch ? + R #Dyn.Error.Weichen_DL;//Weichendatenbank fehlerhaft + R #Dyn.Error.Undef_Weiche;//undefinierte Weiche + SPB en06;//Ja ! + + T "MW200";//Search-Daten + + CALL "DatenOut" + ( SSDB := #Para.Weichen_DL_DB , + SSDW := #Para.Weichen_DL_DW , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB199" , + OUTDATEN := P#M220.0 , + Position := "MW196" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_DL_Weichen;//Rückmeldung bei Datenbank-Zugriff (Gefälle-DL) + + SPBI G_Ok; + + U "M199.0"; + = #Dyn.Error.Weichen_DL;//Weichendatenbank fehlerhaft + BEB; + + SET; + S #Dyn.Error.Undef_Weiche;//undefinierte Weiche + + BEA; + +//Kennung + Datenbytes +G_Ok: SET; + R #Dyn.Error.Weichen_DL;//Weichendatenbank fehlerhaft + R #Dyn.Error.Undef_Weiche;//undefinierte Weiche + + L 16#1004;//Kennung 10 + Word=04 + T %LW0;//Any-Kennung, Datentyp + L 40;//Datenwords speichern + T %LW2;//Wiederholungen + +//Quelle-Pointer erzeugen: + L 0;//Bei Merker = 0 ! + T %LW4;//DB_Nummer + L 220;//Adresse + SLD 3; + L 16#8300_0000;//Kennung: Merker + OD; + T %LD6;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche , + DSTBLK := #Weiche //#Ziel + ); + + L #Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Dyn.Error.BLKMov;//Error bei Block kopieren + BEB; + + L #Weiche.Weichen_Typ;//Weichentyp = 178 (Weiche) + L 178;//Dieser Aufruf-FB ? + ==I;//Ja ! + SPB en06; + + SET; + S #Dyn.Error.Undef_Weiche;//undefinierte Weiche + + L 0;//Weiche ungültig ! + T #Weiche.Weichen_Nr;//Nummer der Weiche + + BEA; + +en06: NOP 0; + +NETWORK +TITLE = Reset +// +// + UN #Dyn.Status.Reset; + SPB En06_Mig; + +//Dyn.Daten löschen: + SET; + R #Dyn.Status.Reset; + R #Dyn.Status.Strecke_voll; + R #Y_Weiche_abzweigen;//Weiche auf Abzweig schalten + S #Y_Weiche_geradeaus;//Weiche auf gerade schalten + R #Dyn.Status.Weichentest_aktiv; + R #Dyn.Hauptstrang_Flag; + R #Dyn.Last_Flag; + R #Dyn.FahrKontrolle.BT_Gerade;//BM fährt geradeaus durch Weichenbereich + R #Dyn.FahrKontrolle.BT_Ausfahrt;//BM fährt aus Weichenbereich + R #Dyn.FahrKontrolle.Gerade_Neg;//Geradeaus: Kontroll-Time ist negativ + R #Dyn.FahrKontrolle.Ausfahrt_Neg;//Ausfahrend: Kontroll-Time ist negativ +/// R #Dyn.Ohne_VerklemmKontrolle //Verklemmkontrolle ausschalten + R #Dyn.Max_raus;//Max_Wert wurde schon übertragen + + U #Weiche.Parameter.Weichen_GST_gerade; + = #Dyn.Status.Weiche_geradeaus; + U #Weiche.Parameter.Weichen_GST_abzweig; + UN #Weiche.Parameter.Weichen_GST_gerade; + = #Dyn.Status.Weiche_abzweigen; + + L 0; + T #Dyn.Hauptstrang_Ink; + T #Dyn.Hauptstrang_Search_Ink; + T #Dyn.Last_Ink; + + L 0; + T #Dyn.Hauptstrang_Sortliste; + T #Dyn.FahrKontrolle.Kontroll_Time_Gerade;//Innerhalb dieser Zeit muss BM Weiche verlassen haben [100ms] + T #Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt;//Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] + + L DINT#0; + T #Kontroll_IDX; + T #Dyn.Last_IDX; + +//Rückmeldungen löschen: + L 0; + T #Dyn.Rueckmld.RET_VAL_DL_Weichen; + T #Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche; + T #Dyn.Rueckmld.RET_VAL_Sortliste_Out; + +//Störungen löschen: + SET; + R #Dyn.Error.Weichen_DL; + R #Dyn.Error.Undef_Weiche; + R #Dyn.Error.BLKMov; + R #Dyn.Error.Haupstrang_DL; + R #Dyn.Error.Haupstrang_DL_voll; + R #Dyn.Error.Keine_HSDaten; + R #Dyn.Error.Rein_FIFO; + R #Dyn.Error.Keine_FIFODaten; + R #Dyn.Error.Stau_AusfahrBereich; + R #Dyn.Error.BM_verklemmt_Gerade; + R #Dyn.Error.BM_verklemmt_Ausfahrt; + R #Dyn.Error.BM_undef_Gerade; + R #Dyn.Error.Frei14; + R #Dyn.Error.Send_FIFO_fehlerhaft;//Send-FIFO zum PC ist fehlerhaft + R #Dyn.Error.Send_FIFO_voll;//Send-FIFO zu PC ist voll + R #Dyn.Error.Reset_aktiv;//Reset ist aktiv + + L 0;//Damit statische Werte neu aus Datenbank geholt werden ! + T #Weiche.Weichen_Nr;//Nummer der Weiche + + BEA; + +En06_Mig: NOP 0; + +NETWORK +TITLE = Störungen nach Außen übergeben + L 0; + T "MB200"; + + U #Dyn.Error.Weichen_DL;//Weichen-Datenliste fehlerhaft + = "M200.0"; + U #Dyn.Error.Undef_Weiche;//undefinierte Weiche + = "M200.1"; + U #Dyn.Error.BLKMov;//Fehler bei Block kopieren + = "M200.2"; + U #Dyn.Error.Haupstrang_DL;//Haupstrang-Datenliste fehlerhaft + = "M200.3"; + U #Dyn.Error.Haupstrang_DL_voll;//Haupstrang-Datenliste ist voll + = "M200.4"; + U #Dyn.Error.Keine_HSDaten;//Keine Hauptstrang-Daten mehr vorhanden + = "M200.5"; + U #Dyn.Error.Rein_FIFO;//Rein-FIFO fehlerhaft + = "M200.6"; + U #Dyn.Error.Keine_FIFODaten;//Keine Rein-Daten mehr vorhanden + = "M200.7"; + U #Dyn.Error.Stau_AusfahrBereich;//Stau im Ausfahrbereich (-> Antrieb stoppen) + = "M201.0"; + U #Dyn.Error.BM_verklemmt_Gerade;//BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) + = "M201.1"; + U #Dyn.Error.BM_verklemmt_Ausfahrt;//BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen) + = "M201.2"; + U #Dyn.Error.BM_undef_Gerade;//undefiniertes BM bei Weiterfahrt erkannt + = "M201.3"; + U #Dyn.Error.Frei14; + = "M201.4"; + U #Dyn.Error.Send_FIFO_fehlerhaft;//Send-FIFO zum PC ist fehlerhaft + = "M201.5"; + U #Dyn.Error.Send_FIFO_voll;//Send-FIFO zu PC ist voll + = "M201.6"; + CLR;//Reset ist aktiv (gibts nicht!) + = #Dyn.Error.Reset_aktiv; + = "M201.7"; + + L "MW200"; + T #Error;//Schnittstelle nach Außen + +//Kreiselantrieb stoppen: + UN #Stau_Ausfahrtbereich;//Ausfahrtsbereich hat Stau + R #Dyn.Error.Stau_AusfahrBereich;//Stau im Ausfahrbereich (-> Antrieb stoppen) + +//Antrieb stoppen: + U(; + O #Dyn.Error.BM_verklemmt_Ausfahrt;//BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen) + O #Dyn.Error.BM_verklemmt_Gerade;//BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) + ); + UN #ErrQuit; + O #Dyn.Error.Stau_AusfahrBereich;//Stau im Ausfahrbereich (-> Antrieb stoppen) + O #Dyn.Error.Send_FIFO_fehlerhaft;//Send-FIFO zum PC ist fehlerhaft + O #Dyn.Error.Send_FIFO_voll;//Send-FIFO zu PC ist voll + S #Antrieb_stoppen;//Kreiselantrieb stoppen + +//Anzeige Start n. Störung aktivieren: + U #Dyn.Error.BM_verklemmt_Ausfahrt;//BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen) + O #Dyn.Error.BM_verklemmt_Gerade;//BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) + O #Dyn.Error.Stau_AusfahrBereich;//Stau im Ausfahrbereich (-> Antrieb stoppen) + S #hStOk; + +NETWORK +TITLE = Daten des Inkremental-Gebers holen / Zeit-Inkremente + L #Weiche.Ink_DB;//DB-Nr des Inkremental-Geber + L 0;//angegeben ? + <=I;//Nein ! + SPB w040; + + TAK; + T "MW200"; + AUF DB[ "MW200"];//Zähler-DB öffnen + L %DBD80; + T #Dyn.Ink_Wert; + L %DBD76; + T #Dyn.Max_Wert; + U %DBX74.3; + = #Dyn.Lauf_Flag; + U %DBX74.4; + = #Dyn.Flag_Lauf_fertig; + U %DBX74.5; + = #Dyn.Ohne_Lauf_fertig; + + SPA en04; + +//Zeit-Inkremente erzeugen: +w040: UN #Antrieb_aktiv; + SPB w041; + + L "MW4";//10ms-Takte + ITD; + L #Dyn.Ink_Wert; + +D;//Aktueller Zählerwert +100ms-Takte + T #Dyn.Ink_Wert; + +w041: L DINT#10000 ;//Festwert: 10000 (100s) + T #Dyn.Max_Wert; + + L #Dyn.Ink_Wert;//Aktueller Zählerwert + L #Dyn.Max_Wert;//Max. Wert erreicht ? + <=D;//Nein ! + R #Dyn.Ohne_Lauf_fertig;//Ohne Flag-Lauf wurde beendet + R #Dyn.Flag_Lauf_fertig;//Flag-Lauf wurde beendet + SPB en04; + + -D;//Restwert als Startwert nehmen ! + T #Dyn.Ink_Wert; + + UN #Dyn.Lauf_Flag;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag + = #Dyn.Ohne_Lauf_fertig;//Ohne Flag-Lauf wurde beendet + U #Dyn.Lauf_Flag;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag + = #Dyn.Flag_Lauf_fertig;//Flag-Lauf wurde beendet + + UN #Dyn.Lauf_Flag;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag + = #Dyn.Lauf_Flag; + +en04: NOP 0; + +NETWORK +TITLE = Störungen quittieren +// +// + U "Hauptstrang_leer";//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + UN #B_Gerade; + R #Dyn.Error.BM_undef_Gerade;//undefiniertes BM bei Weiterfahrt erkannt + + UN #ErrQuit; + SPB En08; + +//Störungen löschen: + SET; + R #Dyn.Error.BM_undef_Gerade; + R #Dyn.Error.Frei14; + + U "Hauptstrang_leer";//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + U #Dyn.Error.BM_verklemmt_Gerade; + CLR;//Nie da große Trolleys + R #Dyn.Error.BM_verklemmt_Gerade; + R #Dyn.FahrKontrolle.BT_Gerade; + + U "Hauptstrang_leer";//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen + U #Dyn.Error.BM_verklemmt_Ausfahrt; + CLR;//Nie da große Trolleys + R #Dyn.Error.BM_verklemmt_Ausfahrt; + R #Dyn.FahrKontrolle.BT_Ausfahrt; + +//Kann nur über Reset zurückgesetzt werden: +// R #Dyn.Error.Weichen_DL +// R #Dyn.Error.Undef_Weiche +// R #Dyn.Error.BLKMov +// R #Dyn.Error.Haupstrang_DL +// R #Dyn.Error.Haupstrang_DL_voll +// R #Dyn.Error.Keine_HSDaten +// R #Dyn.Error.Rein_FIFO +// R #Dyn.Error.Keine_FIFODaten +// R #Dyn.Error.Stau_AusfahrBereich +// R #Dyn.Error.BM_verklemmt_Gerade +// R #Dyn.Error.BM_verklemmt_Ausfahrt +// R #Dyn.Error.Send_FIFO_fehlerhaft //Send-FIFO zum PC ist fehlerhaft +// R #Dyn.Error.Send_FIFO_voll //Send-FIFO zu PC ist voll +// R #Dyn.Error.Reset_aktiv //Reset ist aktiv + +En08: NOP 0; + +NETWORK +TITLE = Schaltpunkt aufgrund von Hauptstrangdaten suchen + L #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + L DINT#0 ;//schon bekannt ? + >D;//Ja ! + S #Antrieb_start;//Kreiselantrieb starten + SPB Nw09; + +//Nach neuen Daten suchen: + UN "Weiche_NewData";//Im Weichenbereich nach neuen Daten suchen + SPB w076; + + L #Dyn.Ink_Wert;//Aktueller Inkrementalwert + L #Weiche.Off_Ink;//Inkremente zum Weiche schalten + >D;//Gleiches Flag/Flag wie Inkgeber zum Suchen + SPB w071; + +//Anders Flag/Liste wie Inkgeber zum Suchen: + L #Weiche.Hauptstrang_DL_DB; + + U #Dyn.Lauf_Flag;//Inkgeber schon mit Lauf-Flag + R #SAVE.IDX_Flag;//Hauptstrang_DL +1 durchsuchen + SPB w070; + + SET; + S #SAVE.IDX_Flag;//Hauptstrang_DL +1 durchsuchen + + + 1; + +w070: T #Dyn.Hauptstrang_Sortliste;//Sortliste aus welcher Hauptstrangdaten sind + + SPA w073; + +//Gleiches Flag/Liste wie Inkgeber zum Suchen: +w071: L #Weiche.Hauptstrang_DL_DB; + + UN #Dyn.Lauf_Flag;//Inkgebeer ohne Lauf-Flag + R #SAVE.IDX_Flag;//Hauptstrang_DL +1 durchsuchen + SPB w072; + + SET; + S #SAVE.IDX_Flag;//Hauptstrang_DL +1 durchsuchen + + + 1; + +w072: T #Dyn.Hauptstrang_Sortliste;//Sortliste aus welcher Hauptstrangdaten sind + +//Hauptstrang Sortliste nach Position -1 durchsuchen: +w073: CALL "DatenFindOffsetSort" + ( SSDB := #Dyn.Hauptstrang_Sortliste , + SSDW := #Weiche.Hauptstrang_DL_DW , + PARA := WORD#16#0B01 , //nach 11.DW (letzte Position) suchen + SEARCHDATEN := #Weiche.Position_minus , + RE_VAL := "MB199" , + OUTDATEN := #Daten , + Position := "MW196" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_Sortliste_Out; + + U "M199.7";//Datensatz ist vorhanden + R #Dyn.Error.Haupstrang_DL;//Sortliste fehlerhaft + SPB w074; + + U "M199.6";//Datensatz ist nicht vorhanden + R #Dyn.Error.Haupstrang_DL;//Sortliste fehlerhaft + SPB Nw09;//Warten, da noch keine Daten vorhanden + + SET; + S #Dyn.Error.Haupstrang_DL;//Sortliste fehlerhaft + +w076: L 0;//Keine Daten auf Hauptstrang vorhanden + T #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + + SPA Nw09; + +//Search-Ink speichern: +w074: L #Daten.Start_Ink;//Stamm-Daten speichern + T #Dyn.Hauptstrang_Search_Ink;//Inkremente zum Daten auslesen (Start-Ink) + +//Hauptstrang-Schaltdaten errechnen/speichern: +//Kettenlängungs-Korrektur: + L #sKorrekturFaktor;//Korrektur-Faktor wegen Kettenlängung + L 0.995 ;//sinnvoller Wert ? (maximal 0,5% Abweichung erlaubt) + >=R;//Ja ! + U(; + TAK; + L 1.005; + <=R; + ); + SPB w075; + + L 1.0;//dann ohne Korrektur ! + T #sKorrekturFaktor;//Korrektur-Faktor wegen Kettenlängung + +//Schaltdaten errechnen: +w075: U #Daten.Start_Flag;//Lauf-Flag bei Start-Inkremente + = #Dyn.Hauptstrang_Flag;//Flag zum Weiche schalten (vom Hauptstrang) + + L #Weiche.Off_Ink;//Inkremente zum Weiche schalten + DTR; + L #sKorrekturFaktor;//Korrektur-Faktor wegen Kettenlängung + *R; + RND; + L #Daten.Start_Ink;//Daten aus Sortliste dazuaddieren + +D; + T #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + L #Dyn.Max_Wert;//Maximal erlaubter Zählwert + >D; + SPBN Nw09; + + -D;//Restwert übernehmen + T #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + + UN #Daten.Start_Flag;//Lauf-Flag bei Start-Inkremente (invertieren) + = #Dyn.Hauptstrang_Flag;//Flag zum Weiche schalten (vom Hauptstrang) + +NETWORK +TITLE = Weiche aufgrund der Hauptstrangdaten schalten +Nw09: L #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + L DINT#0 ;//angegeben ? + <=D;//Nein ! + SPB w08E; + + U #Dyn.Hauptstrang_Flag;//Flag zum Weiche schalten (vom Hauptstrang) + U #Dyn.Flag_Lauf_fertig;//Flag-Lauf wurde beendet + O; + UN #Dyn.Hauptstrang_Flag;//Flag zum Weiche schalten (vom Hauptstrang) + U #Dyn.Ohne_Lauf_fertig;//Flag-Lauf wurde beendet + SPB w080;//beim Ende des Lauf sind Inkremente uninteressant + + U #Dyn.Hauptstrang_Flag;//Flag zum Weiche schalten (vom Hauptstrang) + U #Dyn.Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv + O; + UN #Dyn.Hauptstrang_Flag;//Flag zum Weiche schalten (vom Hauptstrang) + UN #Dyn.Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv + SPBN en08_Mig; + + L #Dyn.Ink_Wert;//Aktuelle Inkrementalwert + L #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + I ;//BM soll nicht ausfahren ! + ON #Weiche.Parameter.ErsatzZiel_bei_Stau;//Bei Stau soll Ersatz-Ziel angefahren werden + ON #Stau_Ausfahrtbereich; + SPB x081; + + L #Weiche.ErsatzZiel ;//Ersatz-Ziel übergeben + T #Daten.Sort_Info.Teil_Ziel; + +x081: L #Daten.Sort_Info.Teil_Ziel;//Ziel des BT (aufgrund vom Hauptstrang) + L 0; + <=I; + = #Dyn.Status.Ziel_unbekannt;//Ziel des BT ist unbekannt + + U #Dyn.Status.Ziel_unbekannt;//Ziel des BT ist unbekannt + U #Weiche.Parameter.Weichen_GST_gerade; + UN #Weiche.Parameter.Weichen_GST_abzweig; + SPB x100;//BT mit unbekanntem Ziel geradeaus fahren + + U #Dyn.Status.Ziel_unbekannt;//Ziel des BT ist unbekannt + UN #Weiche.Parameter.Weichen_GST_gerade; + U #Weiche.Parameter.Weichen_GST_abzweig; + SPB w082;//BT mit unbekanntem Ziel ausfahren + + L #Daten.Sort_Info.Teil_Ziel;//Ziel des BT (aufgrund vom Hauptstrang) + L #Weiche.AbzweigZiel;//Bei diesem Ziel Weiche auf Abzweig schalten + Carl + T #Carr_Ziel;//Ziel, das bei Carr-Telegramm gemeldet wird + ==I;//BM soll ausfahren + S #Dyn.Carr;//CARR-Telegramm muss noch gesendet werden + S #Dyn.Puffer_IDX;//Trolley-ID in Puffer eintragen + SPB w082;//Teil ausfahren + + L #Daten.Sort_Info.Teil_Ziel;//Ziel des BT (aufgrund vom Hauptstrang) + L #Weiche.GeradeZiel;//Bei diesem Ziel Weiche auf Gerade schalten + Carl + <>I;//BM soll also ausfahren, da nicht das GeradeZiel! + U(; + L 0;//sinnvolle Angabe ? + >I;//Ja ! + ); + SPB w082;//Teil ausfahren (ohne CARR, da undef. rausfahren!) + +//Teile geradeaus fahren:****************************************************************************************************** +x100: SET; + S #Dyn.Status.Weiche_geradeaus;//Weiche auf Gerade schalten + R #Dyn.Status.Weiche_abzweigen; + S #Dyn.BM_gerade;//BM wurde gerade gefahren (1 Zyklus) + +//Verklemm-Kontroll-Info speichern: + UN #Weiche.Parameter.Kontroll_B_Gerade;//Kontroll-Sensor bei Weiterfahrt (gerade) + SPB k100;//Letzter BM noch nicht kontrolliert + + U #Dyn.FahrKontrolle.BT_Gerade;//BM fährt geradeaus durch Weichenbereich + SPB k100;//Letzter BM noch nicht kontrolliert + + L #Dyn.Last_IDX;//IDX des letzten durchfahrenden Teils + T #Kontroll_IDX ;//IDX des zu kontollierenden Teils + U #SAVE.IDX_Flag;//Hauptstrang_DL +1 durchsuchen + = #SAVE.Kontroll_Flag;//Hauptstrang_DL +1 durchsuchen + + L #Weiche.Kontroll_Zeit_gerade;//Nach dieser Zeit muss BM Weichenbereich verlassen haben [100ms] + T #Dyn.FahrKontrolle.Kontroll_Time_Gerade;//Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] + + SET; + S #Dyn.FahrKontrolle.BT_Gerade;//BM fährt geradeaus durch Weichenbereich + R #Dyn.FahrKontrolle.Gerade_Neg;//Geradeaus: Kontroll-Time ist negativ + +//CARR-Telegramm erwünscht ?: +k100: L #Daten.Sort_Info.Teil_Ziel;//Ziel des BT (aufgrund vom Hauptstrang) + L #Weiche.GeradeZiel;//Bei diesem Ziel Weiche auf Gerade schalten + Carl + T #Carr_Ziel;//Ziel, das bei Carr-Telegramm gemeldet wird + ==I;//BM soll ausfahren + S #Dyn.Carr;//CARR-Telegramm muss noch gesendet werden + + U #Weiche.Parameter.Letzte_Weiche;//Letzte Weiche im Verbund + S #Del;//Nur Sortdaten löschen + SPB w084;//Daten aus Sortliste löschen + +//Letzte Position neu speichern: +New: L #Weiche.Weichen_Nr;//Nummer der Weiche + T #Daten.letzte_Position;//Letzte Position, wo Teil vorbeigefahren ist + + CALL "DatenIn" + ( SSDB := #Dyn.Hauptstrang_Sortliste , + SSDW := #Weiche.Hauptstrang_DL_DW , + INDATEN := #Daten , + RE_VAL := "MB199" + ); + + L "MB199"; + T #Dyn.Rueckmld.RET_VAL_Sortliste_Out; + + U "M199.7";//Datensatz ist vorhanden /Alles Ok) + SPB GST; + + SET; + S #Dyn.Error.Haupstrang_DL;//Sortliste fehlerhaft + SPA GST; + +//Teile ausfahren:************************************************************************************************************ +w082: U #Dyn.Status.Weiche_abzweigen;//Weiche war schon auf Abzweig + SPB w083; + + L #Dyn.Status.Schalttakte; + + DINT#1;//Auf Abzweig umgeschaltet +1 + T #Dyn.Status.Schalttakte; + +w083: SET; + S #Dyn.Status.Weiche_abzweigen;//Weiche auf Abzweig schalten + R #Dyn.Status.Weiche_geradeaus; + R #Del;//Nur Sortdaten löschen + S #Dyn.BM_raus;//BM wurde ausgeschleußt (1 Zyklus) + + L 300;//Nach dieser Zeit ist BM ausgefahren [300*100ms] + T #Dyn.FahrKontrolle.Time_Ausfahrt;//Diese Zeit benötigt BM zum Ausfahren [100ms] + +//Verklemm-Kontroll-Info speichern: + UN #Weiche.Parameter.Kontroll_B_Ausfahrt;//Kontroll-Sensor bei Ausfahrt (abzweig) + SPB k101;//Letzter BM noch nicht kontrolliert + + U #Dyn.FahrKontrolle.BT_Ausfahrt;//BM fährt aus Weichenbereich + SPB k101;//Letzter BM noch nicht kontrolliert + + L #Dyn.Last_IDX;//IDX des letzten durchfahrenden Teils + T #Kontroll_IDX ;//IDX des zu kontollierenden Teils + U #SAVE.IDX_Flag;//Hauptstrang_DL +1 durchsuchen + = #SAVE.Kontroll_Flag;//Hauptstrang_DL +1 durchsuchen + + L #Weiche.Kontroll_Zeit_abzweigen;//Nach dieser Zeit muss BM Weichenbereich verlassen haben [100ms] + T #Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt;//Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] + + SET; + S #Dyn.FahrKontrolle.BT_Ausfahrt;//BM fährt aus Weichenbereich + R #Dyn.FahrKontrolle.Ausfahrt_Neg;//Ausfahrend: Kontroll-Time ist negativ + +k101: U #Stau_Ausfahrtbereich;//Ausfahrtsbereich hat Stau + UN #Weiche.Parameter.ErsatzZiel_bei_Stau;//Bei Stau soll Ersatz-Ziel angefahren werden + S #Dyn.Error.Stau_AusfahrBereich;//Stau im Ausfahrbereich (-> Antrieb stoppen) + +//Falls Entlade-Weiche neues Leer-Ziel übergeben: + UN #Weiche.Parameter.Entlade_Weiche;//BM wird entladen -> Leerziel übergeben + O #Weiche.Parameter.Letzte_Weiche;//Letzte Weiche im Verbund + SPB w084; + + L #Weiche.LeerZiel;//Nach Entladen des BM dieses Ziel übergeben + T #Daten.Sort_Info.Teil_Ziel;//BM bei diesem Abwurf-Ziel ausfahren/entladen + L 0;//Sinnvolle Angabe ? + >I;//Ja ! + SPB New;//Daten mit neuem Ziel an Hauptstrang übergeben ! + +//Daten aus Sortliste löschen +w084: L #Dyn.Hauptstrang_Pos;//Aktuelle Position der Daten in Datenliste + L 16#0E00;//0EYY: DS YY löschen + OW; + T #FC86_Para; + + CALL "DatenOutSort" + ( SSDB := #Dyn.Hauptstrang_Sortliste , + SSDW := #Weiche.Hauptstrang_DL_DW , + PARA := #FC86_Para , //DS YY löschen + OUTDATEN := #Daten , + RE_VAL := "MB199" + ); + +//GST-Schalt-Inks speichern: +GST: UN #Weiche.Parameter.Weichen_GST_gerade; + UN #Weiche.Parameter.Weichen_GST_abzweig; + SPB w08E; + + L #Weiche.Ink_Schaltdauer;//Inkremente (Fenster), danach wird Weiche in GST geschaltet + L 0;//sinnvoller Wert ? + <=I;//Nein ! + SPB w08E; + + L #Weiche.Ink_Schaltdauer;//Inkremente (Fenster), danach wird Weiche in GST geschaltet + ITD; + L #Dyn.Ink_Wert;//Aktueller Inkrementalwert + +D; + T #Dyn.GSTschalt_Ink;//Inkremente bei Weiche auf GST schalten + U #Dyn.Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv + = #Dyn.GSTschalt_Flag;//Flag bei Weiche auf GST schalten + + L #Dyn.Max_Wert;//Maximal erlaubter Zählwert überschritten ? + <=D;//Nein ! + SPB w08E; + + -D;//Restwert übernehmen + T #Dyn.GSTschalt_Ink;//Inkremente bei Weiche auf GST schalten + UN #Dyn.Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv (invertieren, da Überlauf!) + = #Dyn.GSTschalt_Flag;//Flag bei Weiche auf GST schalten + +w08E: L DINT#0; + T #Dyn.Hauptstrang_Ink;//Inkremente zum Weiche schalten (vom Hauptstrang) + +en08_Mig: NOP 0; + +NETWORK +TITLE = Weiche auf GST zurückschalten + L #Dyn.GSTschalt_Ink;//Inkremente bei Weiche auf GST schalten + L 0;//sinnvolle Angabe ? + <=D;//Nein ! + SPB X111; + + U #Dyn.GSTschalt_Flag;//Flag bei Weiche auf GST schalten + U #Dyn.Flag_Lauf_fertig;//Flag-Lauf wurde beendet + O; + UN #Dyn.GSTschalt_Flag;//Flag bei Weiche auf GST schalten + U #Dyn.Ohne_Lauf_fertig;//Flag-Lauf wurde beendet + SPB w110;//beim Ende des Lauf sind Inkremente uninteressant + + U #Dyn.GSTschalt_Flag;//Flag bei Weiche auf GST schalten + U #Dyn.Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv + O; + UN #Dyn.GSTschalt_Flag;//Flag bei Weiche auf GST schalten + UN #Dyn.Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv + SPBN en11; + + L #Dyn.Ink_Wert;//Aktuelle Inkrementalwert + L #Dyn.GSTschalt_Ink;//Inkremente bei Weiche auf GST schalten + D;//Haupstrangdaten sind kleiner + U(; + L 0;//sinnvolle Hauptstrang-Daten ? + <>D;//Ja ! + ); + SPB X111;//Nicht auf GST schalten, da nächste Daten schon kommen ! + +//Weiche auf GST schalten: + U #Weiche.Parameter.Weichen_GST_gerade; + UN #Weiche.Parameter.Weichen_GST_abzweig; + SPBN W110_Mig;//Negierter Sprung ! + + U #Dyn.FahrKontrolle.BT_Ausfahrt;//BM fährt aus Weichenbereich + O #Dyn.Error.BM_verklemmt_Ausfahrt;//BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen) + SPB en11;//Warten + + SET; + S #Dyn.Status.Weiche_geradeaus;//Weiche auf Gerade schalten + R #Dyn.Status.Weiche_abzweigen; + SPA X111; + +W110_Mig: U #Weiche.Parameter.Weichen_GST_abzweig; + UN #Weiche.Parameter.Weichen_GST_gerade; + SPBN X111;//Negierter Sprung ! + + U #Dyn.FahrKontrolle.BT_Gerade;//BM fährt geradeaus durch Weichenbereich + O #Dyn.Error.BM_verklemmt_Gerade;//BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) + SPB en11;//Warten + + SET; + S #Dyn.Status.Weiche_abzweigen;//Weiche auf Abzweig schalten + R #Dyn.Status.Weiche_geradeaus; + +X111: L DINT#0; + T #Dyn.GSTschalt_Ink;//Inkremente bei Weiche auf GST schalten + SET; + R #Dyn.GSTschalt_Flag;//Flag bei Weiche auf GST schalten + +en11: NOP 0; + +NETWORK +TITLE = Weichenbereich auf verklemmte gerade fahrende BM kontrollieren + UN #Weiche.Parameter.Kontroll_B_Gerade;//Kontroll-Sensor bei Weiterfahrt (gerade) + O #Dyn.Ohne_VerklemmKontrolle;//Verklemmkontrolle ausschalten + O "Hauptstrang_leer"; + R #Dyn.FahrKontrolle.BT_Gerade;//BM fährt geradeaus durch Weichenbereich + R #Dyn.FahrKontrolle.BM_Gerade_erkannt;//Geradeausfahrendes BM wurde erkannt + R #Dyn.Error.BM_verklemmt_Gerade;//BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) + R #Dyn.Error.BM_undef_Gerade;//undefiniertes BM bei Weiterfahrt erkannt + S #Dyn.FahrKontrolle.Gerade_Neg;//Geradeaus: Kontroll-Time ist negativ + SPB Nw17; + +//BM fährt geradeaus: + U #B_Gerade;//Kontroll-Sensor nach Weiche Gerade + UN #Dyn.FahrKontrolle.BM_Gerade_erkannt;//Geradeausfahrendes BM wurde erkannt + U #Dyn.FahrKontrolle.BT_Gerade;//BM fährt geradeaus durch Weichenbereich + R #Dyn.FahrKontrolle.BT_Gerade; + S #Dyn.FahrKontrolle.BM_Gerade_erkannt;//Geradeausfahrendes BM wurde erkannt + + UN #B_Gerade;//Kontroll-Sensor nach Weiche Gerade + R #Dyn.FahrKontrolle.BM_Gerade_erkannt;//Geradeausfahrendes BM wurde erkannt + + L #Dyn.Last_IDX;//IDX des letzten durchfahrenden Teils + T #Kontroll_IDX ;//IDX des zu kontollierenden Teils + U #SAVE.IDX_Flag;//Hauptstrang_DL +1 durchsuchen + = #SAVE.Kontroll_Flag;//Hauptstrang_DL +1 durchsuchen + + SPA Q_G; + +N_G: L #Weiche.Kontroll_Zeit_gerade;//Nach dieser Zeit muss BM Weichenbereich verlassen haben [100ms] + T #Dyn.FahrKontrolle.Kontroll_Time_Gerade;//Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] + +Q_G: U #ErrQuit; + UN #Dyn.FahrKontrolle.BT_Gerade;//BM fährt geradeaus durch Weichenbereich + R #Dyn.Error.BM_verklemmt_Gerade;//BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) + +//Zeit verändern: + UN #Antrieb_aktiv;//Band ist aktiv + ON "100ms-Impuls"; + O #Dyn.Error.BM_verklemmt_Gerade;//BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) + SPB Un_G; + + L #Dyn.FahrKontrolle.Kontroll_Time_Gerade;//Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] + L "MW2";//Anzahl der 100ms-Takte + -I; + T #Dyn.FahrKontrolle.Kontroll_Time_Gerade;//Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] + L 0;//Kontroll-Zeit abgelaufen ? + >I;//Nein ! + R #Dyn.FahrKontrolle.Gerade_Neg;//Geradeaus: Kontroll-Time ist negativ + SPB en16; + +//BM verklemmt ?: + U #Dyn.FahrKontrolle.Gerade_Neg;//Geradeaus: Kontroll-Time ist negativ + SPB Un_G; + + SET; + S #Dyn.FahrKontrolle.Gerade_Neg;//Geradeaus: Kontroll-Time ist negativ + + U #Dyn.FahrKontrolle.BT_Gerade;//BM fährt geradeaus durch Weichenbereich + S #Dyn.Error.BM_verklemmt_Gerade;//BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen) + SPB N_G;//Zeit neu laden + +//BM undefiniert ?: +Un_G: L #Dyn.FahrKontrolle.Kontroll_Time_Gerade;//Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] + L #Weiche.DraussenZeit_gerade;//Nach dieser neg. Zeit [100ms] Error undef.BM, falls Kontroll-Sensor aktiv + >I;//Muss BM draussen sein ? Nein ! + SPB en16; + + T #Dyn.FahrKontrolle.Kontroll_Time_Gerade;//Innerhalb dieser Zeit muss BM Weiche gerade verlassen haben [100ms] + + UN #B_Gerade;//Kontroll-Sensor nach Weiche Gerade + SPB en16; + + SET; + S #Dyn.Error.BM_undef_Gerade;//undefiniertes BM bei Weiterfahrt erkannt + +en16: NOP 0; + +NETWORK +TITLE = Weichenbereich auf verklemmte ausfahrende BM kontrollieren +Nw17: UN #Weiche.Parameter.Kontroll_B_Ausfahrt;//Kontroll-Sensor bei Ausfahrt (abzweig) + O #Dyn.Ohne_VerklemmKontrolle;//Verklemmkontrolle ausschalten + R #Dyn.FahrKontrolle.BT_Ausfahrt;//BM fährt aus Weichenbereich + R #Dyn.FahrKontrolle.BM_Ausfahrt_erkannt;//Ausfahrendes BM wurde erkannt + R #Dyn.Error.BM_verklemmt_Ausfahrt;//BM bei Ausfahrt in Weiche verklemmt (-> Antrieb gestoppt) + S #Dyn.FahrKontrolle.Ausfahrt_Neg;//Ausfahrend: Kontroll-Time ist negativ + SPB Nw18; + +//BM fährt aus: + U #B_Ausfahrt;//Kontroll-Sensor nach Weiche Ausfahrt + UN #Stau_Ausfahrtbereich;//Bei Stau Einzelerkennung nicht mehr möglich! + UN #Dyn.FahrKontrolle.BM_Ausfahrt_erkannt;//Ausfahrendes BM wurde erkannt + U #Dyn.FahrKontrolle.BT_Ausfahrt;//BM fährt aus Weichenbereich + R #Dyn.FahrKontrolle.BT_Ausfahrt; + S #Dyn.FahrKontrolle.BM_Ausfahrt_erkannt;//Ausfahrendes BM wurde erkannt + + UN #B_Ausfahrt;//Kontroll-Sensor nach Weiche Ausfahrt + O #Stau_Ausfahrtbereich;//Bei Stau auch ! + R #Dyn.FahrKontrolle.BM_Ausfahrt_erkannt;//Ausfahrendes BM wurde erkannt + + SPA Q_A; + +N_A: L #Weiche.Kontroll_Zeit_abzweigen;//Nach dieser Zeit muss BM Weichenbereich verlassen haben [100ms] + T #Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt;//Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] + +Q_A: U #ErrQuit;//s.u. + SET;//Ohne Quittierung + UN #Dyn.FahrKontrolle.BT_Ausfahrt;//BM fährt aus Weichenbereich + R #Dyn.Error.BM_verklemmt_Ausfahrt;//BM bei Ausfahrt in Weiche verklemmt (-> Antrieb gestoppt) + +//Zeit verändern: + UN #Antrieb_aktiv;//Band ist aktiv + ON "100ms-Impuls"; + O #Dyn.Error.BM_verklemmt_Ausfahrt;//BM bei Ausfahrt in Weiche verklemmt (-> Antrieb gestoppt) + SPB en17; + + L #Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt;//Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] + L "MW2";//Anzahl der 100ms-Takte + -I; + T #Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt;//Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] + L 0;//Kontroll-Zeit abgelaufen ? + >I;//Nein ! + R #Dyn.FahrKontrolle.Ausfahrt_Neg;//Ausfahrend: Kontroll-Time ist negativ + SPB en17; + +//BM verklemmt ?: + U #Dyn.FahrKontrolle.Ausfahrt_Neg;//Ausfahrend: Kontroll-Time ist negativ + SPB Un_A; + + SET; + S #Dyn.FahrKontrolle.Ausfahrt_Neg;//Ausfahrend: Kontroll-Time ist negativ + + U #Dyn.FahrKontrolle.BT_Ausfahrt;//BM fährt aus Weichenbereich + S #Dyn.Error.BM_verklemmt_Ausfahrt;//BM bei Ausfahrt in Weiche verklemmt (-> Antrieb gestoppt) + SPB N_A;//Zeit neu laden + +Un_A: L 0; + T #Dyn.FahrKontrolle.Kontroll_Time_Ausfahrt;//Innerhalb dieser Zeit muss BM Weiche ausgefahren haben [100ms] + +en17: NOP 0; + +//BM fährt aus: +//Zeit verändern: + UN #Antrieb_aktiv;//Band ist aktiv + ON "100ms-Impuls"; + SPB En17_Mig; + + L #Dyn.FahrKontrolle.Time_Ausfahrt;//Diese Zeit benötigt BM zum Ausfahren [100ms] + L "MW2";//Anzahl der 100ms-Takte + -I; + T #Dyn.FahrKontrolle.Time_Ausfahrt;//Diese Zeit benötigt BM zum Ausfahren [100ms] + L 0;//Ausfahr-Zeit abgelaufen ? + >I;//Nein ! + SPB En17_Mig; + + T #Dyn.FahrKontrolle.Time_Ausfahrt;//Minimum übergeben + +En17_Mig: NOP 0; + +NETWORK +TITLE = CARR-Telegramm an PC senden +Nw18: UN #Weiche.Parameter.PC_Komm_aktiv; + ON #Dyn.Carr;//CARR-Telegramm muss noch gesendet werden + O "SGes".Ohne_PC_Fahren; + R #Dyn.Carr;//CARR-Telegramm muss noch gesendet werden + SPB en13; + +//CARR mit dieser IDX schon gesendet?: (wegen Travel-FIFO leer) + L #Daten.Sort_Info.Teil_IDX;//IDX des BT + T "MD220"; + L #SAVE.Teil_IDX_Old;//BT/MT-IDX (wurde bei Auslagerung gemeldet) + ==D; + SPB X130; + +//GOHDUM an Host senden: oder beim Verlaasen vom Sep4503? +//Puffer ermitteln: + L #Weiche.AbzweigZiel; + + -200; + T "Daten_für_SendFIFO".Puffer_LinienNr; + +//Pufferstatus (Stau) ermitteln: + U "DEP_Sensoren".Stau_EP1.Stat.B_Akt; + = "Daten_für_SendFIFO"."Status_2_Bit[0]"; + U "DEP_Sensoren".Stau_EP2.Stat.B_Akt; + = "Daten_für_SendFIFO"."Status_2_Bit[1]"; + U "DEP_Sensoren".Stau_EP3.Stat.B_Akt; + = "Daten_für_SendFIFO"."Status_2_Bit[2]"; + U "DEP_Sensoren".Stau_EP4.Stat.B_Akt; + = "Daten_für_SendFIFO"."Status_2_Bit[3]"; + + CALL "Daten_in_SendFIFO_speichern", "Daten_für_SendFIFO" + ( "TelegrammKennung[1]" := 'G' , + "TelegrammKennung[2]" := 'O' , + "TelegrammKennung[3]" := 'H' , + "TelegrammKennung[4]" := 'D' , + "TelegrammKennung[5]" := 'U' , + "TelegrammKennung[6]" := 'M' , + TrolleyID := #Daten.Sort_Info.Teil_IDX , + StationsNr := 4503 , + Puffer_LinienNr := , //s.o. + "Status_2_Bit[0]" := , //s.o. + "Status_2_Bit[1]" := , //s.o. + "Status_2_Bit[2]" := , //s.o. + "Status_2_Bit[3]" := , //s.o. + Port := 2 , + Ret_Val_FIFO_IN := "MB199" , + Error := #Error_SendFIFO + ); + + U #Error_SendFIFO; + SPB en13; + +X130: SET; + R #Dyn.Carr;//CARR-Telegramm muss noch gesendet werden + + L #Daten.Sort_Info.Teil_IDX;//IDX des BT + T #SAVE.Teil_IDX_Old;//BT/MT-IDX (wurde bei Auslagerung gemeldet) + +en13: NOP 0; + +NETWORK +TITLE = Trolley-ID in Puffer eintragen + UN #Weiche.Parameter.IDX_an_Puffer; + ON #Dyn.Puffer_IDX ;//Trolley-ID in Puffer eintragen + R #Dyn.Puffer_IDX ;//CARR-Telegramm muss noch gesendet werden + SPB xn16; + + U #Dyn.Status.Ziel_unbekannt;//Ziel des BT ist unbekannt + SPB X160; + + L #Carr_Ziel ;//Ziel, das bei Carr-Telegramm gemeldet wird (1-20) + T "MW220"; + + CALL "DatenOut" + ( SSDB := 275 , + SSDW := 0 , + PARA := 16#0000 , //Eintrag lesen + SEARCHDATEN := P#M220.0 , + RE_VAL := "MB199" , + OUTDATEN := %DB1275.DBX0.0 , + Position := "MW196" + ); + + L "MB199"; + L 2#1111111 ;//Bit 7 ausblenden + UW; + L 0;//Fehler vorhanden? + <>I;//Ja + SPB X160; + + L "LagerDL_OutDaten".OUTDaten.Puffer_Dyn_DB; + T #DatenDB;//s.u. + + L "LagerDL_OutDaten".OUTDaten.Puffer_Dyn_DW; + ITD; + T #AR1Start;//Startwert mit Offset 0 + + L #AR1Start ;//Startwert mit Offset 0 + + DINT#72 ;//Offset TrolleyID_Einfahrt + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + + AUF DB[ #DatenDB]; + + L #Daten.Sort_Info.Teil_IDX;//IDX des Trolleys an Omnipuffer melden + T DBD[ #AR1Zeiger] ;//Lager +1 (DBW 72) + +X160: SET; + R #Dyn.Puffer_IDX ;//CARR-Telegramm muss noch gesendet werden + +xn16: NOP 0; + +NETWORK +TITLE = Weiche schalten + U #Dyn.Status.Weiche_abzweigen;//Weiche auf Abzweig schalten + R #Dyn.Status.Weiche_geradeaus; + = #Y_Weiche_abzweigen; + + U #Dyn.Status.Weiche_geradeaus;//Weiche auf Gerade schalten + = #Y_Weiche_geradeaus; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Module/MZylinder.awl b/=A01+UH07-KF00/Programmbausteine/Module/MZylinder.awl index 4a6c6f5..0cc778e 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/MZylinder.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/MZylinder.awl @@ -1,203 +1,213 @@ -=== FB 92: MZylinder [STL] === -INTERFACE: - Input: - Automatik : Bool // Automatikbetrieb ist aktiv - Handbetrieb : Bool // Handbetrieb ist aktiv - T_Ast : Int := 5 // Zeit bis AST erreicht ist (*100ms) - T_Gst : Int := 5 // Zeit bis GST erreicht ist (*100ms) - Output: - ZylAst : Bool // Vorwärts-Ausgang des Antriebs - ZylGst : Bool // Rückwärts-Ausgang des Antriebs - InOut: - Static: - Stat : "UZylinder" - Temp: - Constant: +FUNCTION_BLOCK "MZylinder" +TITLE = Zylinder mit 3/2 oder 5/2+3- Wegeventil und Endlagensimulation +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR_INPUT + Automatik : Bool; // Automatikbetrieb ist aktiv + Handbetrieb : Bool; // Handbetrieb ist aktiv + T_Ast : Int := 5; // Zeit bis AST erreicht ist (*100ms) + T_Gst : Int := 5; // Zeit bis GST erreicht ist (*100ms) + END_VAR ---- NW 1: Zeitwert löschen --- - A ZylAst // Zylinder fährt nach AST - A( - O Stat.B_AST // Hat Endstellung erreicht - ON Stat.Old_Ast // Fuhr letzten Zyklus anders - ) - O - AN ZylAst // Zylinder fährt nach GST - A( - O Stat.B_GST // Hat Endstellung erreicht - O Stat.Old_Ast // Fuhr letzten Zyklus anders - ) - JCN Nw02 + VAR_OUTPUT + ZylAst : Bool; // Vorwärts-Ausgang des Antriebs + ZylGst : Bool; // Rückwärts-Ausgang des Antriebs + END_VAR -tdel: L 0 // Zeitwert löschen - T Stat.T_Zelle - - A ZylAst // Zylinder fährt nach AST - = Stat.Old_Ast // Fuhr letzten Zyklus nach AST - - JU Nw05 - ---- NW 2: AST-Erreichtzeit abgelaufen ? --- -Nw02: L Stat.T_AST_Akt // Gewollter Zeitwert - L 9999 // angegeben ? - <>I // Ja ! - JC w020 - - L T_Ast // Sollwert übergeben - T Stat.T_AST_Akt // Gewollter Zeitwert - -w020: A ZylAst // Zylinder fährt nach AST ? - JCN en02 - - SET - R Stat.B_GST - - L Stat.T_Zelle // Aktueller Zeitwert - L Stat.T_AST_Akt // Gewollter Zeitwert erreicht ? - >=I - S Stat.B_AST // Zylinder hat AST erreicht - JC tdel // Zeit nullen - - JU Nw03 - -en02: AN Stat.Typ5_3 // Zylinder hält seine Stellung ! - R Stat.B_AST + VAR + Stat : "UZylinder"; + END_VAR ---- NW 3: GST-Erreichtzeit abgelaufen ? --- -Nw03: L Stat.T_GST_Akt // Gewollter Zeitwert - L 9999 // angegeben ? - <>I // Ja ! - JC w030 +BEGIN +NETWORK +TITLE = Zeitwert löschen + U #ZylAst;//Zylinder fährt nach AST + U(; + O #Stat.B_AST;//Hat Endstellung erreicht + ON #Stat.Old_Ast;//Fuhr letzten Zyklus anders + ); + O; + UN #ZylAst;//Zylinder fährt nach GST + U(; + O #Stat.B_GST;//Hat Endstellung erreicht + O #Stat.Old_Ast;//Fuhr letzten Zyklus anders + ); + SPBN Nw02; - L T_Gst // Sollwert übergeben - T Stat.T_GST_Akt // Gewollter Zeitwert +tdel: L 0;//Zeitwert löschen + T #Stat.T_Zelle; -w030: A( // Zylinder fährt nach GST ? - O Stat.Typ5_2 // Zylinder mit 2-facher Ansteuerung - O Stat.Typ5_3 - ) - A ZylGst - O - A Stat.Typ3_2 // Zylinder mit 1-facher Ansteuerung - AN ZylAst - JCN en03 + U #ZylAst;//Zylinder fährt nach AST + = #Stat.Old_Ast;//Fuhr letzten Zyklus nach AST - SET - R Stat.B_AST + SPA Nw05; +NETWORK +TITLE = AST-Erreichtzeit abgelaufen ? +Nw02: L #Stat.T_AST_Akt;//Gewollter Zeitwert + L 9999;//angegeben ? + <>I;//Ja ! + SPB w020; - L Stat.T_Zelle // Aktueller Zeitwert - L Stat.T_GST_Akt // Gewollter Zeitwert erreicht ? - >=I - S Stat.B_GST // Zylinder hat GST erreicht - JC tdel // Zeit nullen + L #T_Ast;//Sollwert übergeben + T #Stat.T_AST_Akt;//Gewollter Zeitwert - JU Nw04 +w020: U #ZylAst;//Zylinder fährt nach AST ? + SPBN en02; -en03: AN Stat.Typ5_3 // Zylinder hält seine Stellung ! - R Stat.B_GST + SET; + R #Stat.B_GST; + L #Stat.T_Zelle;//Aktueller Zeitwert + L #Stat.T_AST_Akt;//Gewollter Zeitwert erreicht ? + >=I; + S #Stat.B_AST;//Zylinder hat AST erreicht + SPB tdel;//Zeit nullen ---- NW 4: Zeit läuft --- -Nw04: A( // Zylinder fährt nach GST ? - O Stat.Typ5_2 // Zylinder mit 2-facher Ansteuerung - O Stat.Typ5_3 - ) - AN ZylGst // Zylinder wird nicht angesteuert - AN ZylAst - ON "100ms-Impuls" // nur als Impuls - JC Nw05 + SPA Nw03; - L Stat.T_Zelle - L "MW2" // 100ms-Takte - +I - T Stat.T_Zelle +en02: UN #Stat.Typ5_3;//Zylinder hält seine Stellung ! + R #Stat.B_AST; +NETWORK +TITLE = GST-Erreichtzeit abgelaufen ? +Nw03: L #Stat.T_GST_Akt;//Gewollter Zeitwert + L 9999;//angegeben ? + <>I;//Ja ! + SPB w030; ---- NW 5: Undefinierte Zustände / Befehle --- -Nw05: A Automatik // Automatik + Hand aktiv - A Handbetrieb - O - AN Automatik // keine Betriebsart - AN Handbetrieb - O - A Stat.Ast // Arbeitsstellung- + Grundstellungfahren aktiv - A Stat.Gst - O - AN Stat.Typ3_2 // Undefinierter Ventil-Typ - AN Stat.Typ5_2 - AN Stat.Typ5_3 - O - A Stat.Typ3_2 - A( - O Stat.Typ5_2 - O Stat.Typ5_3 - ) - O - A Stat.Typ5_2 - A Stat.Typ5_3 - JCN en06 // Zylinderstellung bleibt eingefroren + L #T_Gst;//Sollwert übergeben + T #Stat.T_GST_Akt;//Gewollter Zeitwert - A Stat.Typ5_3 // Zylinder hält seine Stellung ! - R Stat.Ast // Bewegungsbits löschen - R Stat.Gst +w030: U(;//Zylinder fährt nach GST ? + O #Stat.Typ5_2;//Zylinder mit 2-facher Ansteuerung + O #Stat.Typ5_3; + ); + U #ZylGst; + O; + U #Stat.Typ3_2;//Zylinder mit 1-facher Ansteuerung + UN #ZylAst; + SPBN en03; - BEU + SET; + R #Stat.B_AST; -en06: NOP 0 + L #Stat.T_Zelle;//Aktueller Zeitwert + L #Stat.T_GST_Akt;//Gewollter Zeitwert erreicht ? + >=I; + S #Stat.B_GST;//Zylinder hat GST erreicht + SPB tdel;//Zeit nullen ---- NW 6: Zylinder auf Arbeitstellung fahren --- - A Stat.Ast - = ZylAst + SPA Nw04; +en03: UN #Stat.Typ5_3;//Zylinder hält seine Stellung ! + R #Stat.B_GST; ---- NW 7: Zylinder auf Grundstellung fahren --- - A( - O Stat.Typ5_2 - O Stat.Typ5_3 - ) - A Stat.Gst - = ZylGst +NETWORK +TITLE = Zeit läuft +Nw04: U(;//Zylinder fährt nach GST ? + O #Stat.Typ5_2;//Zylinder mit 2-facher Ansteuerung + O #Stat.Typ5_3; + ); + UN #ZylGst;//Zylinder wird nicht angesteuert + UN #ZylAst; + ON "100ms-Impuls";//nur als Impuls + SPB Nw05; + L #Stat.T_Zelle; + L "MW2" ;//100ms-Takte + +I; + T #Stat.T_Zelle; ---- NW 8: Daten, die zurückgesetzt werden --- - A Stat.Typ5_3 // Zylinder hält seine Stellung ! - R Stat.Ast // Bewegungsbits löschen - R Stat.Gst - A Stat.Typ3_2 - R Stat.Gst // Es gibt kein GST fahren ! +NETWORK +TITLE = Undefinierte Zustände / Befehle +Nw05: U #Automatik;//Automatik + Hand aktiv + U #Handbetrieb; + O; + UN #Automatik;//keine Betriebsart + UN #Handbetrieb; + O; + U #Stat.Ast;//Arbeitsstellung- + Grundstellungfahren aktiv + U #Stat.Gst; + O; + UN #Stat.Typ3_2;//Undefinierter Ventil-Typ + UN #Stat.Typ5_2; + UN #Stat.Typ5_3; + O; + U #Stat.Typ3_2; + U(; + O #Stat.Typ5_2; + O #Stat.Typ5_3; + ); + O; + U #Stat.Typ5_2; + U #Stat.Typ5_3; + SPBN en06;//Zylinderstellung bleibt eingefroren + U #Stat.Typ5_3;//Zylinder hält seine Stellung ! + R #Stat.Ast;//Bewegungsbits löschen + R #Stat.Gst; ---- NW 9: Ausgänge übergeben an OP übergeben --- - A ZylGst - = Stat.OP_Out_GST + BEA; - A ZylAst - = Stat.OP_Out_AST +en06: NOP 0; +NETWORK +TITLE = Zylinder auf Arbeitstellung fahren + U #Stat.Ast; + = #ZylAst; +NETWORK +TITLE = Zylinder auf Grundstellung fahren + U(; + O #Stat.Typ5_2; + O #Stat.Typ5_3; + ); + U #Stat.Gst; + = #ZylGst; ---- NW 10: Statistik --- - A ZylAst - Rise Stat.FP_AST - JCN AST2 +NETWORK +TITLE = Daten, die zurückgesetzt werden + U #Stat.Typ5_3;//Zylinder hält seine Stellung ! + R #Stat.Ast;//Bewegungsbits löschen + R #Stat.Gst; + U #Stat.Typ3_2; + R #Stat.Gst;//Es gibt kein GST fahren ! - L Stat.Statistik.AST_Schaltungen - L DINT#1 - +D - T Stat.Statistik.AST_Schaltungen +NETWORK +TITLE = Ausgänge übergeben an OP übergeben + U #ZylGst; + = #Stat.OP_Out_GST; -AST2: A ZylGst - A Stat.Typ5_3 - Rise Stat.FP_AST2 - JCN StatEnde + U #ZylAst; + = #Stat.OP_Out_AST; - L Stat.Statistik.AST2_Schaltungen - L DINT#1 - +D - T Stat.Statistik.AST2_Schaltungen +NETWORK +TITLE = Statistik + U #ZylAst; + FP #Stat.FP_AST; + SPBN AST2; -StatEnde: NOP 0 + L #Stat.Statistik.AST_Schaltungen; + L DINT#1; + +D; + T #Stat.Statistik.AST_Schaltungen; +AST2: U #ZylGst; + U #Stat.Typ5_3; + FP #Stat.FP_AST2; + SPBN StatEnde; ---- NW 11: Ende --- - BE + L #Stat.Statistik.AST2_Schaltungen; + L DINT#1; + +D; + T #Stat.Statistik.AST2_Schaltungen; + +StatEnde: NOP 0; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Module/Save_CARR_Gesendet.awl b/=A01+UH07-KF00/Programmbausteine/Module/Save_CARR_Gesendet.awl index f03e1eb..d737025 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/Save_CARR_Gesendet.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/Save_CARR_Gesendet.awl @@ -1,62 +1,76 @@ -=== FC 121: Save_CARR_Gesendet [STL] === -INTERFACE: - Input: - Kennung_1 : Char - Kennung_2 : Char - Kennung_3 : Char - Kennung_4 : Char - FIFO_DB : Int // FIFO-Ringspeicher - Teil_IDX : Int // BT/MT-IDX (wird bei Auslagerung gemeldet) - Teil_Ziel : Int // BT/MT bei diesem Abwurf-Ziel ausfahren/entladen - Sort_ID : Int // Sortier-Info (Sort-ID, mit welcher Fahrt gestartet wurde) - Output: - InOut: - Temp: - Constant: - Return: - Ret_Val : Void - ---- NW 1: Kennung CARR ? --- - L Kennung_1 - L 'C' - <>I // Nein ! - BEC - - L Kennung_2 - L 'A' - <>I // Nein ! - BEC - - L Kennung_3 - L 'R' - <>I // Nein ! - BEC - - L Kennung_4 - L 'R' - <>I // Nein ! - BEC +FUNCTION "Save_CARR_Gesendet" : Void +TITLE = Gesendete CARR-Telegramme zusätzlich speichern +{ S7_Optimized_Access := 'FALSE' } +VERSION : 0.1 + VAR_INPUT + Kennung_1 : Char; + Kennung_2 : Char; + Kennung_3 : Char; + Kennung_4 : Char; + FIFO_DB : Int; // FIFO-Ringspeicher + Teil_IDX : Int; // BT/MT-IDX (wird bei Auslagerung gemeldet) + Teil_Ziel : Int; // BT/MT bei diesem Abwurf-Ziel ausfahren/entladen + Sort_ID : Int; // Sortier-Info (Sort-ID, mit welcher Fahrt gestartet wurde) + END_VAR ---- NW 2: Daten aufbereiten --- - L Teil_IDX - T "MW220" +BEGIN +NETWORK +TITLE = Kennung CARR ? + L #Kennung_1; + L 'C'; + <>I;//Nein ! + BEB; - L Teil_Ziel - T "MW222" + L #Kennung_2; + L 'A'; + <>I;//Nein ! + BEB; - L Sort_ID - T "MW224" + L #Kennung_3; + L 'R'; + <>I;//Nein ! + BEB; + L #Kennung_4; + L 'R'; + <>I;//Nein ! + BEB; ---- NW 3: Daten speichern --- -CALL FC "FifoOut" (SSDB:=FIFO_DB, SSDW:=0, PARA:=WORD#16#E100, OUTDATEN:=P#M200.0, RE_VAL:="MB199") // da Ringspeicher nächster Eintrag lesen + austragen +NETWORK +TITLE = Daten aufbereiten + L #Teil_IDX; + T "MW220"; -CALL FC "FifoIn" (SSDB:=FIFO_DB, SSDW:=0, PARA:=WORD#16#0000, INDATEN:=P#M220.0, RE_VAL:="MB199") + L #Teil_Ziel; + T "MW222"; - L "MB199" + L #Sort_ID; + T "MW224"; +NETWORK +TITLE = Daten speichern + CALL "FifoOut" + ( SSDB := #FIFO_DB , + SSDW := 0 , + PARA := WORD#16#E100 , //da Ringspeicher nächster Eintrag lesen + austragen + OUTDATEN := P#M200.0 , + RE_VAL := "MB199" + ); ---- NW 4: Ende --- - BE + CALL "FifoIn" + ( SSDB := #FIFO_DB , + SSDW := 0 , + PARA := WORD#16#0000 , + INDATEN := P#M220.0 , + RE_VAL := "MB199" + ); + + L "MB199"; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Module/Save_Ziel.awl b/=A01+UH07-KF00/Programmbausteine/Module/Save_Ziel.awl index 38c8459..2d1bab7 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/Save_Ziel.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/Save_Ziel.awl @@ -1,32 +1,46 @@ -=== FC 122: Save_Ziel [STL] === -INTERFACE: - Input: - FIFO_DB : Int // FIFO-Ringspeicher - Teil_IDX : Int // BT/MT-IDX (wird bei Auslagerung gemeldet) - Teil_Ziel : Int // BT/MT bei diesem Abwurf-Ziel ausfahren/entladen - Output: - InOut: - Temp: - Constant: - Return: - Ret_Val : Void - ---- NW 1: Daten aufbereiten --- - L Teil_IDX - T "MW220" - - L Teil_Ziel - T "MW222" +FUNCTION "Save_Ziel" : Void +TITLE = Gesendete CARR-Telegramme zusätzlich speichern +{ S7_Optimized_Access := 'FALSE' } +VERSION : 0.1 + VAR_INPUT + FIFO_DB : Int; // FIFO-Ringspeicher + Teil_IDX : Int; // BT/MT-IDX (wird bei Auslagerung gemeldet) + Teil_Ziel : Int; // BT/MT bei diesem Abwurf-Ziel ausfahren/entladen + END_VAR ---- NW 2: Daten speichern --- -CALL FC "FifoOut" (SSDB:=FIFO_DB, SSDW:=0, PARA:=WORD#16#E100, OUTDATEN:=P#M200.0, RE_VAL:="MB199") // da Ringspeicher nächster Eintrag lesen + austragen +BEGIN +NETWORK +TITLE = Daten aufbereiten + L #Teil_IDX; + T "MW220"; -CALL FC "FifoIn" (SSDB:=FIFO_DB, SSDW:=0, PARA:=WORD#16#0000, INDATEN:=P#M220.0, RE_VAL:="MB199") + L #Teil_Ziel; + T "MW222"; - L "MB199" +NETWORK +TITLE = Daten speichern + CALL "FifoOut" + ( SSDB := #FIFO_DB , + SSDW := 0 , + PARA := WORD#16#E100 , //da Ringspeicher nächster Eintrag lesen + austragen + OUTDATEN := P#M200.0 , + RE_VAL := "MB199" + ); + CALL "FifoIn" + ( SSDB := #FIFO_DB , + SSDW := 0 , + PARA := WORD#16#0000 , + INDATEN := P#M220.0 , + RE_VAL := "MB199" + ); ---- NW 3: Ende --- - BE + L "MB199"; + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Module/Set_Input.awl b/=A01+UH07-KF00/Programmbausteine/Module/Set_Input.awl index 6102644..21fe504 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/Set_Input.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/Set_Input.awl @@ -1,34 +1,39 @@ -=== FC 1028: Set_Input [STL] === -INTERFACE: - Input: - Enable : Bool // Baustein aktivieren - Status : Bool // Angegebenen Ausgang auf diesen Status steuern - InByte : DInt // Eingangsbyte zum Steuern - InBit : Int // Eingangsbit zum Steuern - Output: - InOut: - Temp: - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - Constant: - Return: - Ret_Val : Void +FUNCTION "Set_Input" : Void +TITLE = Eingangsbit zwangssteuern +{ S7_Optimized_Access := 'FALSE' } +VERSION : 0.1 + VAR_INPUT + Enable : Bool; // Baustein aktivieren + Status : Bool; // Angegebenen Ausgang auf diesen Status steuern + InByte : DInt; // Eingangsbyte zum Steuern + InBit : Int; // Eingangsbit zum Steuern + END_VAR ---- NW 1: Baustein aktiviert ? --- - AN Enable - BEC + VAR_TEMP + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + END_VAR ---- NW 2: Eingang stuern --- - L InByte // Ausgangsbyte zum Steuern - SLD 3 - L InBit // Ausgangsbit zum Steuern - OW - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) +BEGIN +NETWORK +TITLE = Baustein aktiviert ? + UN #Enable; + BEB; - A Status - = IX [AR1Zeiger] // Eingang steuern +NETWORK +TITLE = Eingang stuern + L #InByte;//Ausgangsbyte zum Steuern + SLD 3; + L #InBit;//Ausgangsbit zum Steuern + OW; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #Status; + = E[ #AR1Zeiger];//Eingang steuern ---- NW 3: Ende --- - BE +NETWORK +TITLE = Ende + BE; + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Module/Set_Output.awl b/=A01+UH07-KF00/Programmbausteine/Module/Set_Output.awl index 0946eba..a7f2894 100644 --- a/=A01+UH07-KF00/Programmbausteine/Module/Set_Output.awl +++ b/=A01+UH07-KF00/Programmbausteine/Module/Set_Output.awl @@ -1,34 +1,39 @@ -=== FC 127: Set_Output [STL] === -INTERFACE: - Input: - Enable : Bool // Baustein aktivieren - Status : Bool // Angegebenen Ausgang auf diesen Status steuern - OutByte : DInt // Ausgangsbyte zum Steuern - OutBit : Int // Ausgangsbit zum Steuern - Output: - InOut: - Temp: - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - Constant: - Return: - Ret_Val : Void +FUNCTION "Set_Output" : Void +TITLE = Ausgangsbit zwangsstuern +{ S7_Optimized_Access := 'FALSE' } +VERSION : 0.1 + VAR_INPUT + Enable : Bool; // Baustein aktivieren + Status : Bool; // Angegebenen Ausgang auf diesen Status steuern + OutByte : DInt; // Ausgangsbyte zum Steuern + OutBit : Int; // Ausgangsbit zum Steuern + END_VAR ---- NW 1: Baustein aktiviert ? --- - AN Enable - BEC + VAR_TEMP + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + END_VAR ---- NW 2: Ausgang steuern --- - L OutByte // Ausgangsbyte zum Steuern - SLD 3 - L OutBit // Ausgangsbit zum Steuern - OW - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) +BEGIN +NETWORK +TITLE = Baustein aktiviert ? + UN #Enable; + BEB; - A Status - = QX [AR1Zeiger] // Ausgang steuern +NETWORK +TITLE = Ausgang steuern + L #OutByte;//Ausgangsbyte zum Steuern + SLD 3; + L #OutBit;//Ausgangsbit zum Steuern + OW; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #Status; + = A[ #AR1Zeiger];//Ausgang steuern ---- NW 3: Ende --- - BE +NETWORK +TITLE = Ende + BE; + +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_CheckTrolley.awl b/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_CheckTrolley.awl index afe24ec..4f517c6 100644 --- a/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_CheckTrolley.awl +++ b/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_CheckTrolley.awl @@ -1,201 +1,239 @@ -=== FB 158: Visu_CheckTrolley [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - SearchDaten : "UTrolley" - OutDaten : "UTrolley" - Leerfeld : "UTrolley" - Daten_Speichern : Bool // Aktuelle Daten übernehmen - Errors : Struct - Datenbank : Bool // Kein Datenlistenbereich / falscher Kopfinhalt / Endekennung - SFC20 : Bool // SFC20-Aufruf mit Fehler - Listenende : Bool // Listenende ist erreicht - Parameter : Bool // Falscher Parameter bei Aufruf - Stammdaten : Bool // Undefinierte Stammdaten zum Suchen - Outdaten : Bool // Undefinierte OUT-Daten - Ergebnis : Struct - Keine Abfrage : Bool // Keine Abfrage vorhanden - Falsche_Abfrage : Bool // Falsche / nicht eindeutige Abfrage - Keine Daten : Bool // Datensatz ist nicht vorhanden - Daten_vorhanden : Bool // Datensatz ist vorhanden - Abruf_erfolgt : Bool // Abruf einmalig ausgeführt - Eintrag_erfolgt : Bool // Speicherung ist erfolgt - Position : Int - TrolleyID : DInt - ShopGroup : DInt - RET_VAL_BLKMOV : Int - Temp: - Quelle : Any // Zeiger, wo Quell-Daten sind - Ziel : Any // Zeiger, wo Ziel-Daten sind - Error : Byte - Abfragen : Struct - TrolleyID : Bool - ShopGroup : Bool - Lager : Int - Lager_DB : Int - Lager_DW : Int - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - ErrorBit : Bool - Constant: +FUNCTION_BLOCK "Visu_CheckTrolley" +TITLE = Trolleydaten aus DB1000 auslesen +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + SearchDaten { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : "UTrolley"; + OutDaten { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : "UTrolley"; + Leerfeld : "UTrolley"; + Daten_Speichern : Bool; // Aktuelle Daten übernehmen + Errors : Struct + Datenbank : Bool; // Kein Datenlistenbereich / falscher Kopfinhalt / Endekennung + "SFC20" : Bool; // SFC20-Aufruf mit Fehler + Listenende : Bool; // Listenende ist erreicht + Parameter : Bool; // Falscher Parameter bei Aufruf + Stammdaten : Bool; // Undefinierte Stammdaten zum Suchen + Outdaten : Bool; // Undefinierte OUT-Daten + END_STRUCT; + Ergebnis : Struct + "Keine Abfrage" : Bool; // Keine Abfrage vorhanden + Falsche_Abfrage : Bool; // Falsche / nicht eindeutige Abfrage + "Keine Daten" : Bool; // Datensatz ist nicht vorhanden + Daten_vorhanden : Bool; // Datensatz ist vorhanden + Abruf_erfolgt : Bool; // Abruf einmalig ausgeführt + Eintrag_erfolgt : Bool; // Speicherung ist erfolgt + Position : Int; + TrolleyID { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; + ShopGroup { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; + END_STRUCT; + RET_VAL_BLKMOV : Int; + END_VAR ---- NW 1: Initialisieren --- - L 0 - T Error - - SET - R Ergebnis.Abruf_erfolgt + VAR_TEMP + Quelle : Any; // Zeiger, wo Quell-Daten sind + Ziel : Any; // Zeiger, wo Ziel-Daten sind + Error : Byte; + Abfragen : Struct + TrolleyID : Bool; + ShopGroup : Bool; + END_STRUCT; + Lager : Int; + Lager_DB : Int; + Lager_DW : Int; + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + ErrorBit : Bool; + END_VAR ---- NW 2: Daten speichern --- - AN Ergebnis.Daten_vorhanden - R Daten_Speichern - R Ergebnis.Eintrag_erfolgt +BEGIN +NETWORK +TITLE = Initialisieren + L 0; + T #Error; - A Daten_Speichern - R Daten_Speichern - R Ergebnis.Eintrag_erfolgt - JCN Nw3 + SET; + R #Ergebnis.Abruf_erfolgt; -CALL FC "DatenIn" (SSDB:=1000, SSDW:=0, INDATEN:=OutDaten, RE_VAL:="MB198") +NETWORK +TITLE = Daten speichern + UN #Ergebnis.Daten_vorhanden; + R #Daten_Speichern; + R #Ergebnis.Eintrag_erfolgt; - L "MB198" - L 2#11000000 - AW - L 0 - <>I - = Ergebnis.Eintrag_erfolgt + U #Daten_Speichern; + R #Daten_Speichern; + R #Ergebnis.Eintrag_erfolgt; + SPBN Nw3; - L OutDaten.TrolleyID - T SearchDaten.TrolleyID - L DINT#0 // Ergebnis neu holen - T Ergebnis.TrolleyID - T SearchDaten.ShopGroup + CALL "DatenIn" + ( SSDB := 1000 , + SSDW := 0 , + INDATEN := #OutDaten , + RE_VAL := "MB198" + ); - BEU + L "MB198"; + L 2#11000000; + UW; + L 0; + <>I; + = #Ergebnis.Eintrag_erfolgt; + L #OutDaten.TrolleyID; + T #SearchDaten.TrolleyID; + L DINT#0;//Ergebnis neu holen + T #Ergebnis.TrolleyID; + T #SearchDaten.ShopGroup; ---- NW 3: Abfrage vorhanden ? --- -Nw3: L SearchDaten.TrolleyID - L DINT#0 - <>D - = Abfragen.TrolleyID + BEA; - L SearchDaten.ShopGroup - L DINT#0 - <>D - = Abfragen.ShopGroup +NETWORK +TITLE = Abfrage vorhanden ? +Nw3: L #SearchDaten.TrolleyID; + L DINT#0; + <>D; + = #Abfragen.TrolleyID; - A Abfragen.TrolleyID - AN Abfragen.ShopGroup - JC ReadTrolley + L #SearchDaten.ShopGroup; + L DINT#0; + <>D; + = #Abfragen.ShopGroup; - A Abfragen.ShopGroup - AN Abfragen.TrolleyID - JC ReadAbrufID + U #Abfragen.TrolleyID; + UN #Abfragen.ShopGroup; + SPB ReadTrolley; - JU Ergebnis + U #Abfragen.ShopGroup; + UN #Abfragen.TrolleyID; + SPB ReadAbrufID; + SPA Ergebnis; ---- NW 4: Outdaten löschen: --- -// Kennung + Datenbytes -DEL: L DINT#0 - T Ergebnis.TrolleyID - T Ergebnis.ShopGroup +NETWORK +TITLE = Outdaten löschen: - L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L 10 // Datenwords speichern - T LW2 - T LW12 // Wiederholungen +//Kennung + Datenbytes +DEL: L DINT#0; + T #Ergebnis.TrolleyID; + T #Ergebnis.ShopGroup; -// Quelle-Pointer erzeugen: (Leerfeld) - L 158 - T LW4 // DB_Nummer - L 40 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse + L 16#1004 ;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L 10 ;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen -// Ziel-Pointer erzeugen: (Outdaten) - L 158 - T LW14 // DB_Nummer - L 20 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse +//Quelle-Pointer erzeugen: (Leerfeld) + L 158; + T %LW4;//DB_Nummer + L 40 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern +//Ziel-Pointer erzeugen: (Outdaten) + L 158; + T %LW14;//DB_Nummer + L 20 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse - BEU + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + BEA; ---- NW 5: Daten von TrolleyID lesen --- -ReadTrolley: L SearchDaten.TrolleyID - L Ergebnis.TrolleyID - ==D - = Ergebnis.Abruf_erfolgt - BEC +NETWORK +TITLE = Daten von TrolleyID lesen +ReadTrolley: L #SearchDaten.TrolleyID; + L #Ergebnis.TrolleyID; + ==D; + = #Ergebnis.Abruf_erfolgt; + BEB; -CALL FC "DatenOut" (SSDB:=1000, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=SearchDaten, RE_VAL:=Error, OUTDATEN:=OutDaten, Position:=Ergebnis.Position) // Eintrag lesen + CALL "DatenOut" + ( SSDB := 1000 , + SSDW := 0 , + PARA := 16#0000 , //Eintrag lesen + SEARCHDATEN := #SearchDaten , + RE_VAL := #Error , + OUTDATEN := #OutDaten , + Position := #Ergebnis.Position + ); - L OutDaten.TrolleyID - T Ergebnis.TrolleyID + L #OutDaten.TrolleyID; + T #Ergebnis.TrolleyID; - JU Ergebnis + SPA Ergebnis; +NETWORK +TITLE = Daten von AbrufID lesen +ReadAbrufID: L #SearchDaten.ShopGroup; + T "MD220"; + L #Ergebnis.ShopGroup; + ==D; + = #Ergebnis.Abruf_erfolgt; + BEB; ---- NW 6: Daten von AbrufID lesen --- -ReadAbrufID: L SearchDaten.ShopGroup - T "MD220" - L Ergebnis.ShopGroup - ==D - = Ergebnis.Abruf_erfolgt - BEC + CALL "DatenOut" + ( SSDB := 1000 , + SSDW := 0 , + PARA := 16#0500 , //ShopGroup mit 16#0500 suchen ! + SEARCHDATEN := P#M220.0 , + RE_VAL := #Error , + OUTDATEN := #OutDaten , + Position := #Ergebnis.Position + ); -CALL FC "DatenOut" (SSDB:=1000, SSDW:=0, PARA:=16#0500, SEARCHDATEN:=P#M220.0, RE_VAL:=Error, OUTDATEN:=OutDaten, Position:=Ergebnis.Position) // ShopGroup mit 16#0500 suchen ! + L #OutDaten.ShopGroup; + T #Ergebnis.ShopGroup; - L OutDaten.ShopGroup - T Ergebnis.ShopGroup +NETWORK +TITLE = Error / Ergebnis +//Errors: +Ergebnis: U %L20.0; + = #Errors.Datenbank; + U %L20.1; + = #Errors.SFC20; + U %L20.2; + = #Errors.Listenende; + U %L20.3; + = #Errors.Parameter; + U %L20.4; + = #Errors.Stammdaten; + U %L20.5; + = #Errors.Outdaten; ---- NW 7: Error / Ergebnis --- -// Errors: -Ergebnis: A L20.0 - = Errors.Datenbank - A L20.1 - = Errors.SFC20 - A L20.2 - = Errors.Listenende - A L20.3 - = Errors.Parameter - A L20.4 - = Errors.Stammdaten - A L20.5 - = Errors.Outdaten + //Ergebnis: + UN #Abfragen.TrolleyID; + UN #Abfragen.ShopGroup; + = #Ergebnis."Keine Abfrage"; + U #Abfragen.TrolleyID; + U #Abfragen.ShopGroup; + = #Ergebnis.Falsche_Abfrage; + U %L20.6; + = #Ergebnis."Keine Daten"; + U %L20.7; + = #Ergebnis.Daten_vorhanden; -// Ergebnis: - AN Abfragen.TrolleyID - AN Abfragen.ShopGroup - = Ergebnis."Keine Abfrage" - A Abfragen.TrolleyID - A Abfragen.ShopGroup - = Ergebnis.Falsche_Abfrage - A L20.6 - = Ergebnis."Keine Daten" - A L20.7 - = Ergebnis.Daten_vorhanden +//Resultat: + UN #Ergebnis.Daten_vorhanden; + SPB DEL; -// Resultat: - AN Ergebnis.Daten_vorhanden - JC DEL +NETWORK +TITLE = Ende + BE; - ---- NW 8: Ende --- - BE +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMLeerPuffer.awl b/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMLeerPuffer.awl index e826a2c..4c6bd4a 100644 --- a/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMLeerPuffer.awl +++ b/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMLeerPuffer.awl @@ -1,426 +1,446 @@ -=== FB 159: Visu_HMLeerPuffer [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - LeerPuffer_Visu : "MHMLeerpuffer" // Lager-Bereich für Visualisierung - LeerPuffer_Visu_old : "MHMLeerpuffer" // COPYRIGHT by Ingenieurbüro A.EmmertOrtsstr.33, D-869925 Fuchstal (Germany)Tel.: 0049(0)8243-960629Version: Omniflow 2100 / 10.2024Schritt 0: Warten auf TrolleySchritt 1: Betriebsart ok/angegeben?Schritt 5: Mit Scanner fahren: Defaultziel ?Schritt 6: Scanner triggernSchritt 7: "DREQ" an PC sendenSchritt 8: Warten auf PC-Antwort Schritt 9: PC-Antwort auswerten Schritt 10: Fahrtrichtung ermittelnSchritt 11: Ausfahren ok ?Schritt 12: Warten auf Pin-Signal Schritt 13: Weichenbereich raus bereit ? Schritt 14: Daten an Rausweiche übergebenSchritt 15: Lager Mindestzeit öffnen Schritt 16: Trolley ausgefahren ? Schritt 17: Trolley ist draussen Schritt 18: BM wurde vereinzeltSchritt 19: Beladezustand checkenSchritt 20: Schleuse resettenSchritt 21: Reset ist zu Ende - Empty_Visu : Array[1..250] of Int // Bereich für Daten-Löschung - DL_DB : Int // Datenlisten-DB - LeerPuffer_Nr_from_PC : Int // PC>PLC: Für diesen Lager Daten bereitstellen - LeerPuffer_Nr_from_PLC : Int // PLC>PC: Daten von diesem Lagere aktiv - LeerPuffer_Nr_from_VAR : Int // VAR>PLC: Für diesen Lager Daten bereitstellen - VAR_old : Int // VAR>PLC: Für diesen Lager Daten bereitstellen - VAR_Timer : Int // VAR>PLC: Für diesen Lager Daten bereitstellen - RET_VAL_Datenbank : Byte - RET_VAL_BLKMOV : Int - Durchlauf1 : Bool // 1.Durchlauf hat stattgefunden - Error : Struct - Datenbank : Bool - Undef_LeerPuffer : Bool - BLKMOV : Bool - Input: - Output: - InOut: - Static: - Puffer : "UDLHMLeerPuffer" - Dyn : Struct - Anzahl_LeerTrolleys : Int // AB DW250: Liste der Trolleys im Leerpuffer - None: - PufferTrolleyliste_DW : Int := 250 - Input: - Output: - InOut: - Static: - Puffer : "UDLHMLeerPuffer" - Dyn : Struct - Anzahl_LeerTrolleys : Int // AB DW250: Liste der Trolleys im Leerpuffer - None: - PufferTrolleyliste_DW : Int := 250 - Temp: - Quelle : Any // Zeiger, wo Quell-Daten sind - Ziel : Any // Zeiger, wo Ziel-Daten sind - Lager_DB : Int // Lager-DB - Lager_DW : Int // Lager-DW - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - Lager_Nr_aktiv : Int // Intern: Für diesen Lager Daten bereitstellen - Constant: - ---- NW 1: - --- - L LeerPuffer_Nr_from_VAR // Anforderung von Variablentabelle ? - L 0 - >I // Ja ! - JC X010 - - L LeerPuffer_Nr_from_PC // Anfoderung von Visualisierung? - L 0 - >I // Ja ! - JC X011 - - L 0 - T LeerPuffer_Nr_from_PLC - T VAR_old - T VAR_Timer - - SET - R Error.Datenbank - R Error.Undef_LeerPuffer - R Error.BLKMOV - - A Durchlauf1 - R Durchlauf1 // 1.Durchlauf hat stattgefunden - JC D010 - - BEU - -// Daten löschen: -// Kennung + Datenbytes -D010: L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L 250 // Datenwords speichern - T LW2 - T LW12 // Wiederholungen - -// Quelle-Pointer erzeugen: (Empty-Visu) - L 159 - T LW4 // DB_Nummer - L 1000 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: (Lager_Visu_Daten) - L 159 - T LW14 // DB_Nummer - L 0 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - -// Ziel-Pointer erzeugen: (Lager_Visu_old-Daten) - L 159 - T LW14 // DB_Nummer - L 500 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L 0 - T RET_VAL_Datenbank - T RET_VAL_BLKMOV - - BEU - -X010: CAC - T Lager_Nr_aktiv - - L 0 // Anforderung von PC löschen - T LeerPuffer_Nr_from_PC // Visualisierung - -// Automatisches Deaktivieren: - L LeerPuffer_Nr_from_VAR - L VAR_old // Noch diesselbe VAR-Nr. ? - ==I // Ja ! - A Durchlauf1 - JC Y010 - -// NeuBeginn: - L 3600 // 1 Stunde - T VAR_Timer // Timer neu laden - - L LeerPuffer_Nr_from_VAR - T VAR_old // VAR-Nr. speichern - - JU En01 - -// Timer aktiv: -Y010: AN "1s-Impuls" // 1s-Impuls - JC En01 - - L VAR_Timer // Timer - + -1 // 1s von Restzeit abziehen - T VAR_Timer // Timer - - L 0 // abgelaufen ? - >I // Nein ! - JC En01 - -// Timer abgelaufen: - L 0 // Automatisch beaktivieren - T LeerPuffer_Nr_from_VAR - T VAR_old - T VAR_Timer // Timer - - JU En01 - -X011: CAC - T Lager_Nr_aktiv - - L 0 // Anforderung von VAR löschen - T LeerPuffer_Nr_from_VAR // Visualisierung - T VAR_old - T VAR_Timer - -En01: NOP 0 - - ---- NW 2: Zeiger von gewolltem Lager ermitteln --- - L Lager_Nr_aktiv - T "MW200" // Search-Daten - -CALL FC "DatenOut" (SSDB:=DL_DB, SSDW:=0, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB219", OUTDATEN:=P#M220.0, Position:="MW298") // Datenlisten-DB - - L "MB219" - T RET_VAL_Datenbank // Rückmeldung bei Datenbank-Zugriff (Vorstau-DL) - - JBI ok2 - - A "M219.0" - S Error.Datenbank - -No: SET - S Error.Undef_LeerPuffer - - L 0 - T LeerPuffer_Nr_from_PLC // Aktiv-Lager - - JU D010 - -ok2: SET - R Error.Datenbank - R Error.Undef_LeerPuffer - - L "MW222" - L 1277 // HM-Leerpuffer ? - ==I // Ja! - JC Ok2_Mig - - JU No - -Ok2_Mig: L "MW224" - T Lager_DB - L "MW226" - T Lager_DW - - ---- NW 3: Neue Datenübergabe an PC ? --- - AN Durchlauf1 // 1.Durchlauf hat stattgefunden - JC En03 - -// Ziel-Pointer erzeugen: (PLC-Daten) - L Lager_DW - ITD - T AR1Start // Startwert mit Offset 0 - -// Anzahl Leertrolleys: - L LeerPuffer_Visu.Dyn.Anzahl_LeerTrolleys - L LeerPuffer_Visu_old.Dyn.Anzahl_LeerTrolleys - ==D // Keine Änderung ! - JC X309 - - L AR1Start // Startwert mit Offset 0 - + DINT#350 // Offset für Anzahl Leer-Trolleys - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - L LeerPuffer_Visu.Dyn.Anzahl_LeerTrolleys - OPN DB[Lager_DB] // Lager-DB öffnen - T DBW [AR1Zeiger] - -// HMI TrolleyID-Einfahrt: -X309: L LeerPuffer_Visu.Dyn.TrolleyID_Einfahrt - L LeerPuffer_Visu_old.Dyn.TrolleyID_Einfahrt - ==D // Keine Änderung ! - JC X310 - - L AR1Start // Startwert mit Offset 0 - + DINT#72 // Offset für TrolleyID Einfahrt - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - L LeerPuffer_Visu.Dyn.TrolleyID_Einfahrt - OPN DB[Lager_DB] // Lager-DB öffnen - T DBD [AR1Zeiger] - -// Lagern.Sk-Reset: -X310: A LeerPuffer_Visu.Dyn.Sk.Reset - A LeerPuffer_Visu_old.Dyn.Sk.Reset - O - AN LeerPuffer_Visu.Dyn.Sk.Reset - AN LeerPuffer_Visu_old.Dyn.Sk.Reset - JC X311 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#98 // Offset für SK-Zeug - SLD 3 - L 3 // Damit DBX_Bit 3 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A LeerPuffer_Visu.Dyn.Sk.Reset - OPN DB[Lager_DB] // Lager-DB öffnen - = DBX [AR1Zeiger] // Lager-SK-Reset - -// HMI-Schleuse-Reset: -X311: A LeerPuffer_Visu.Dyn.HMI.Schleuse_resetten_Leerpuffer - A LeerPuffer_Visu_old.Dyn.HMI.Schleuse_resetten_Leerpuffer - O - AN LeerPuffer_Visu.Dyn.HMI.Schleuse_resetten_Leerpuffer - AN LeerPuffer_Visu_old.Dyn.HMI.Schleuse_resetten_Leerpuffer - JC X312 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#82 // Offset für HMI-Zeug - SLD 3 - L 0 // Damit DBX_Bit 0 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A LeerPuffer_Visu.Dyn.HMI.Schleuse_resetten_Leerpuffer - OPN DB[Lager_DB] // Weiche-DB öffnen - = DBX [AR1Zeiger] // Weiche-SK-Reset - -// HMI-Lager initialisieren: -X312: A LeerPuffer_Visu.Dyn.HMI.LeerPuffer_initialisieren - A LeerPuffer_Visu_old.Dyn.HMI.LeerPuffer_initialisieren - O - AN LeerPuffer_Visu.Dyn.HMI.LeerPuffer_initialisieren - AN LeerPuffer_Visu_old.Dyn.HMI.LeerPuffer_initialisieren - JC X313 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#82 // Offset für HMI-Zeug - SLD 3 - L 1 // Damit DBX_Bit 1 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A LeerPuffer_Visu.Dyn.HMI.LeerPuffer_initialisieren - OPN DB[Lager_DB] // Weiche-DB öffnen - = DBX [AR1Zeiger] // Weiche-SK-Reset - -// HMI-Lager Einlagern sperren: -X313: A LeerPuffer_Visu.Dyn.HMI.Einlagern_gesperrt - A LeerPuffer_Visu_old.Dyn.HMI.Einlagern_gesperrt - O - AN LeerPuffer_Visu.Dyn.HMI.Einlagern_gesperrt - AN LeerPuffer_Visu_old.Dyn.HMI.Einlagern_gesperrt - JC X314 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#82 // Offset für HMI-Zeug - SLD 3 - L 2 // Damit DBX_Bit 2 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A LeerPuffer_Visu.Dyn.HMI.Einlagern_gesperrt - OPN DB[Lager_DB] // Weiche-DB öffnen - = DBX [AR1Zeiger] // Weiche-SK-Reset - -// HMI-Lager Auslagern sperren: -X314: A LeerPuffer_Visu.Dyn.HMI.AusLagern_gesperrt - A LeerPuffer_Visu_old.Dyn.HMI.AusLagern_gesperrt - O - AN LeerPuffer_Visu.Dyn.HMI.AusLagern_gesperrt - AN LeerPuffer_Visu_old.Dyn.HMI.AusLagern_gesperrt - JC X315 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#82 // Offset für HMI-Zeug - SLD 3 - L 3 // Damit DBX_Bit 3 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A LeerPuffer_Visu.Dyn.HMI.AusLagern_gesperrt - OPN DB[Lager_DB] // Weiche-DB öffnen - = DBX [AR1Zeiger] // Weiche-SK-Reset - -// Einen Leertrolley ausfahren: -X315: A LeerPuffer_Visu.Dyn.Status.Einen_LeerTrolley_ausfahren - A LeerPuffer_Visu_old.Dyn.Status.Einen_LeerTrolley_ausfahren - O - AN LeerPuffer_Visu.Dyn.Status.Einen_LeerTrolley_ausfahren - AN LeerPuffer_Visu_old.Dyn.Status.Einen_LeerTrolley_ausfahren - JC En03 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#71 // Offset für Weichen-Zeug - SLD 3 - L 4 // Damit DBX_Bit 4 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A LeerPuffer_Visu.Dyn.Status.Einen_LeerTrolley_ausfahren - OPN DB[Lager_DB] // Weiche-DB öffnen - = DBX [AR1Zeiger] // Weiche-SK-Reset - -En03: NOP 0 - - ---- NW 4: Datenübernahme vom PC --- -// Kennung + Datenbytes - L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L 250 // Datenwords speichern - T LW2 - T LW12 // Wiederholungen - -// Quelle-Pointer erzeugen: (PLC-Daten) - L Lager_DB - T LW4 // DB_Nummer - L Lager_DW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: (PC-Lager-Visu-Daten) - L 159 - T LW14 // DB_Nummer - L 0 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L RET_VAL_BLKMOV // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Error.BLKMOV // Error bei Block kopieren - BEC - -// Ziel-Pointer erzeugen: (Lager_Visu_old-Daten) - L 159 - T LW14 // DB_Nummer - L 500 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L RET_VAL_BLKMOV // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Error.BLKMOV // Error bei Block kopieren - BEC - - L Lager_Nr_aktiv - T LeerPuffer_Nr_from_PLC // Rückmeldung an PC (Daten stehen an) - - SET - S Durchlauf1 // 1.Durchlauf hat stattgefunden - - ---- NW 5: Ende --- - BE +FUNCTION_BLOCK "Visu_HMLeerPuffer" +TITLE = Interne Daten in einem Fenster + Lagern-Nr. mit PC visualisieren +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + LeerPuffer_Visu : "MHMLeerpuffer"; // Lager-Bereich für Visualisierung + LeerPuffer_Visu_old : "MHMLeerpuffer"; // COPYRIGHT by Ingenieurbüro A.EmmertOrtsstr.33, D-869925 Fuchstal (Germany)Tel.: 0049(0)8243-960629Version: Omniflow 2100 / 10.2024Schritt 0: Warten auf TrolleySchritt 1: Betriebsart ok/angegeben?Schritt 5: Mit Scanner fahren: Defaultziel ?Schritt 6: Scanner triggernSchritt 7: "DREQ" an PC sendenSchritt 8: Warten auf PC-Antwort Schritt 9: PC-Antwort auswerten Schritt 10: Fahrtrichtung ermittelnSchritt 11: Ausfahren ok ?Schritt 12: Warten auf Pin-Signal Schritt 13: Weichenbereich raus bereit ? Schritt 14: Daten an Rausweiche übergebenSchritt 15: Lager Mindestzeit öffnen Schritt 16: Trolley ausgefahren ? Schritt 17: Trolley ist draussen Schritt 18: BM wurde vereinzeltSchritt 19: Beladezustand checkenSchritt 20: Schleuse resettenSchritt 21: Reset ist zu Ende + Empty_Visu : Array[1..250] of Int; // Bereich für Daten-Löschung + DL_DB : Int; // Datenlisten-DB + LeerPuffer_Nr_from_PC : Int; // PC>PLC: Für diesen Lager Daten bereitstellen + LeerPuffer_Nr_from_PLC : Int; // PLC>PC: Daten von diesem Lagere aktiv + LeerPuffer_Nr_from_VAR : Int; // VAR>PLC: Für diesen Lager Daten bereitstellen + VAR_old : Int; // VAR>PLC: Für diesen Lager Daten bereitstellen + VAR_Timer : Int; // VAR>PLC: Für diesen Lager Daten bereitstellen + RET_VAL_Datenbank : Byte; + RET_VAL_BLKMOV : Int; + Durchlauf1 : Bool; // 1.Durchlauf hat stattgefunden + Error : Struct + Datenbank : Bool; + Undef_LeerPuffer : Bool; + BLKMOV : Bool; + END_STRUCT; + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Quell-Daten sind + Ziel : Any; // Zeiger, wo Ziel-Daten sind + Lager_DB : Int; // Lager-DB + Lager_DW : Int; // Lager-DW + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + Lager_Nr_aktiv : Int; // Intern: Für diesen Lager Daten bereitstellen + END_VAR + + +BEGIN +NETWORK +TITLE = Anforderung vom PC ? +// +// + L #LeerPuffer_Nr_from_VAR;//Anforderung von Variablentabelle ? + L 0; + >I;//Ja ! + SPB X010; + + L #LeerPuffer_Nr_from_PC;//Anfoderung von Visualisierung? + L 0; + >I;//Ja ! + SPB X011; + + L 0; + T #LeerPuffer_Nr_from_PLC; + T #VAR_old; + T #VAR_Timer; + + SET; + R #Error.Datenbank; + R #Error.Undef_LeerPuffer; + R #Error.BLKMOV; + + U #Durchlauf1; + R #Durchlauf1;//1.Durchlauf hat stattgefunden + SPB D010; + + BEA; + +//Daten löschen: +//Kennung + Datenbytes +D010: L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L 250 ;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//Quelle-Pointer erzeugen: (Empty-Visu) + L 159; + T %LW4;//DB_Nummer + L 1000 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: (Lager_Visu_Daten) + L 159; + T %LW14;//DB_Nummer + L 0;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + +//Ziel-Pointer erzeugen: (Lager_Visu_old-Daten) + L 159; + T %LW14;//DB_Nummer + L 500 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L 0; + T #RET_VAL_Datenbank; + T #RET_VAL_BLKMOV; + + BEA; + +X010: TAK; + T #Lager_Nr_aktiv; + + L 0;//Anforderung von PC löschen + T #LeerPuffer_Nr_from_PC;//Visualisierung + +//Automatisches Deaktivieren: + L #LeerPuffer_Nr_from_VAR; + L #VAR_old;//Noch diesselbe VAR-Nr. ? + ==I;//Ja ! + U #Durchlauf1; + SPB Y010; + +//NeuBeginn: + L 3600;//1 Stunde + T #VAR_Timer;//Timer neu laden + + L #LeerPuffer_Nr_from_VAR; + T #VAR_old;//VAR-Nr. speichern + + SPA En01; + +//Timer aktiv: +Y010: UN "1s-Impuls";//1s-Impuls + SPB En01; + + L #VAR_Timer;//Timer + + -1;//1s von Restzeit abziehen + T #VAR_Timer;//Timer + + L 0;//abgelaufen ? + >I;//Nein ! + SPB En01; + +//Timer abgelaufen: + L 0;//Automatisch beaktivieren + T #LeerPuffer_Nr_from_VAR; + T #VAR_old; + T #VAR_Timer;//Timer + + SPA En01; + +X011: TAK; + T #Lager_Nr_aktiv; + + L 0;//Anforderung von VAR löschen + T #LeerPuffer_Nr_from_VAR;//Visualisierung + T #VAR_old; + T #VAR_Timer; + +En01: NOP 0; + +NETWORK +TITLE = Zeiger von gewolltem Lager ermitteln + L #Lager_Nr_aktiv; + T "MW200";//Search-Daten + + CALL "DatenOut" + ( SSDB := #DL_DB , //Datenlisten-DB + SSDW := 0 , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB219" , + OUTDATEN := P#M220.0 , + Position := "MW298" + ); + + L "MB219"; + T #RET_VAL_Datenbank;//Rückmeldung bei Datenbank-Zugriff (Vorstau-DL) + + SPBI ok2; + + U "M219.0"; + S #Error.Datenbank; + +No: SET; + S #Error.Undef_LeerPuffer; + + L 0; + T #LeerPuffer_Nr_from_PLC ;//Aktiv-Lager + + SPA D010; + +ok2: SET; + R #Error.Datenbank; + R #Error.Undef_LeerPuffer; + + L "MW222"; + L 1277 ;//HM-Leerpuffer ? + ==I;//Ja! + SPB Ok2_Mig; + + SPA No; + +Ok2_Mig: L "MW224"; + T #Lager_DB; + L "MW226"; + T #Lager_DW; + +NETWORK +TITLE = Neue Datenübergabe an PC ? + UN #Durchlauf1;//1.Durchlauf hat stattgefunden + SPB En03; + +//Ziel-Pointer erzeugen: (PLC-Daten) + L #Lager_DW; + ITD; + T #AR1Start;//Startwert mit Offset 0 + +//Anzahl Leertrolleys: + L #LeerPuffer_Visu.Dyn.Anzahl_LeerTrolleys; + L #LeerPuffer_Visu_old.Dyn.Anzahl_LeerTrolleys; + ==D ;//Keine Änderung ! + SPB X309; + + L #AR1Start;//Startwert mit Offset 0 + + DINT#350 ;//Offset für Anzahl Leer-Trolleys + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + L #LeerPuffer_Visu.Dyn.Anzahl_LeerTrolleys; + AUF DB[ #Lager_DB] ;//Lager-DB öffnen + T DBW[ #AR1Zeiger]; + +//HMI TrolleyID-Einfahrt: +X309: L #LeerPuffer_Visu.Dyn.TrolleyID_Einfahrt; + L #LeerPuffer_Visu_old.Dyn.TrolleyID_Einfahrt; + ==D ;//Keine Änderung ! + SPB X310; + + L #AR1Start;//Startwert mit Offset 0 + + DINT#72 ;//Offset für TrolleyID Einfahrt + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + L #LeerPuffer_Visu.Dyn.TrolleyID_Einfahrt; + AUF DB[ #Lager_DB] ;//Lager-DB öffnen + T DBD[ #AR1Zeiger]; + +//Lagern.Sk-Reset: +X310: U #LeerPuffer_Visu.Dyn.Sk.Reset; + U #LeerPuffer_Visu_old.Dyn.Sk.Reset; + O; + UN #LeerPuffer_Visu.Dyn.Sk.Reset; + UN #LeerPuffer_Visu_old.Dyn.Sk.Reset; + SPB X311 ;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#98 ;//Offset für SK-Zeug + SLD 3; + L 3 ;//Damit DBX_Bit 3 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #LeerPuffer_Visu.Dyn.Sk.Reset; + AUF DB[ #Lager_DB] ;//Lager-DB öffnen + = DBX[ #AR1Zeiger] ;//Lager-SK-Reset + +//HMI-Schleuse-Reset: +X311: U #LeerPuffer_Visu.Dyn.HMI.Schleuse_resetten_Leerpuffer; + U #LeerPuffer_Visu_old.Dyn.HMI.Schleuse_resetten_Leerpuffer; + O; + UN #LeerPuffer_Visu.Dyn.HMI.Schleuse_resetten_Leerpuffer; + UN #LeerPuffer_Visu_old.Dyn.HMI.Schleuse_resetten_Leerpuffer; + SPB X312;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#82 ;//Offset für HMI-Zeug + SLD 3; + L 0 ;//Damit DBX_Bit 0 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #LeerPuffer_Visu.Dyn.HMI.Schleuse_resetten_Leerpuffer; + AUF DB[ #Lager_DB];//Weiche-DB öffnen + = DBX[ #AR1Zeiger] ;//Weiche-SK-Reset + +//HMI-Lager initialisieren: +X312: U #LeerPuffer_Visu.Dyn.HMI.LeerPuffer_initialisieren; + U #LeerPuffer_Visu_old.Dyn.HMI.LeerPuffer_initialisieren; + O; + UN #LeerPuffer_Visu.Dyn.HMI.LeerPuffer_initialisieren; + UN #LeerPuffer_Visu_old.Dyn.HMI.LeerPuffer_initialisieren; + SPB X313 ;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#82 ;//Offset für HMI-Zeug + SLD 3; + L 1 ;//Damit DBX_Bit 1 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #LeerPuffer_Visu.Dyn.HMI.LeerPuffer_initialisieren; + AUF DB[ #Lager_DB];//Weiche-DB öffnen + = DBX[ #AR1Zeiger] ;//Weiche-SK-Reset + +//HMI-Lager Einlagern sperren: +X313: U #LeerPuffer_Visu.Dyn.HMI.Einlagern_gesperrt; + U #LeerPuffer_Visu_old.Dyn.HMI.Einlagern_gesperrt; + O; + UN #LeerPuffer_Visu.Dyn.HMI.Einlagern_gesperrt; + UN #LeerPuffer_Visu_old.Dyn.HMI.Einlagern_gesperrt; + SPB X314 ;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#82 ;//Offset für HMI-Zeug + SLD 3; + L 2 ;//Damit DBX_Bit 2 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #LeerPuffer_Visu.Dyn.HMI.Einlagern_gesperrt; + AUF DB[ #Lager_DB];//Weiche-DB öffnen + = DBX[ #AR1Zeiger] ;//Weiche-SK-Reset + +//HMI-Lager Auslagern sperren: +X314: U #LeerPuffer_Visu.Dyn.HMI.AusLagern_gesperrt; + U #LeerPuffer_Visu_old.Dyn.HMI.AusLagern_gesperrt; + O; + UN #LeerPuffer_Visu.Dyn.HMI.AusLagern_gesperrt; + UN #LeerPuffer_Visu_old.Dyn.HMI.AusLagern_gesperrt; + SPB X315 ;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#82 ;//Offset für HMI-Zeug + SLD 3; + L 3 ;//Damit DBX_Bit 3 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #LeerPuffer_Visu.Dyn.HMI.AusLagern_gesperrt; + AUF DB[ #Lager_DB];//Weiche-DB öffnen + = DBX[ #AR1Zeiger] ;//Weiche-SK-Reset + +//Einen Leertrolley ausfahren: +X315: U #LeerPuffer_Visu.Dyn.Status.Einen_LeerTrolley_ausfahren; + U #LeerPuffer_Visu_old.Dyn.Status.Einen_LeerTrolley_ausfahren; + O; + UN #LeerPuffer_Visu.Dyn.Status.Einen_LeerTrolley_ausfahren; + UN #LeerPuffer_Visu_old.Dyn.Status.Einen_LeerTrolley_ausfahren; + SPB En03 ;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#71 ;//Offset für Weichen-Zeug + SLD 3; + L 4 ;//Damit DBX_Bit 4 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #LeerPuffer_Visu.Dyn.Status.Einen_LeerTrolley_ausfahren; + AUF DB[ #Lager_DB];//Weiche-DB öffnen + = DBX[ #AR1Zeiger] ;//Weiche-SK-Reset + +En03: NOP 0; + +NETWORK +TITLE = Datenübernahme vom PC + +//Kennung + Datenbytes + L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L 250 ;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//Quelle-Pointer erzeugen: (PLC-Daten) + L #Lager_DB; + T %LW4;//DB_Nummer + L #Lager_DW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: (PC-Lager-Visu-Daten) + L 159; + T %LW14;//DB_Nummer + L 0;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L #RET_VAL_BLKMOV;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Error.BLKMOV;//Error bei Block kopieren + BEB; + +//Ziel-Pointer erzeugen: (Lager_Visu_old-Daten) + L 159; + T %LW14;//DB_Nummer + L 500 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L #RET_VAL_BLKMOV;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Error.BLKMOV;//Error bei Block kopieren + BEB; + + L #Lager_Nr_aktiv; + T #LeerPuffer_Nr_from_PLC;//Rückmeldung an PC (Daten stehen an) + + SET; + S #Durchlauf1;//1.Durchlauf hat stattgefunden + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMOmniBereich_Plus.awl b/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMOmniBereich_Plus.awl index 54c3a77..e71a22c 100644 --- a/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMOmniBereich_Plus.awl +++ b/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMOmniBereich_Plus.awl @@ -1,336 +1,374 @@ -=== FB 252: Visu_HMOmniBereich_Plus [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Bereich_Visu : "MHMOmniBereich_Plus" // Schleuse-Bereich für Visualisierung - Bereich_Visu_old : "MHMOmniBereich_Plus" - Empty_Visu : Array[1..100] of Int // Bereich für Daten-Löschung - DL_DB : Int // Datenlisten-DB - Bereich_Nr_from_PC : Int // PC>PLC: Für diesen Schleuse Daten bereitstellen - Bereich_Nr_from_PLC : Int // PLC>PC: Daten von diesem Schleusee aktiv - Bereich_Nr_from_VAR : Int // VAR>PLC: Für diesen Schleuse Daten bereitstellen - VAR_old : Int // VAR>PLC: Für diesen Schleuse Daten bereitstellen - VAR_Timer : Int // VAR>PLC: Für diesen Schleuse Daten bereitstellen - RET_VAL_Datenbank : Byte - RET_VAL_BLKMOV : Int - Durchlauf1 : Bool // 1.Durchlauf hat stattgefunden - Error : Struct - Datenbank : Bool - Undef_Schleuse : Bool - BLKMOV : Bool - Temp: - Quelle : Any // Zeiger, wo Quell-Daten sind - Ziel : Any // Zeiger, wo Ziel-Daten sind - Bereichs_DB : Int // Schleuse-DB - Bereichs_DW : Int // Schleuse-DW - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - Schleuse_Nr_aktiv : Int // Intern: Für diesen Schleuse Daten bereitstellen - Constant: - ---- NW 1: - --- - L Bereich_Nr_from_VAR // Anforderung von Variablentabelle ? - L 0 - >I // Ja ! - JC X010 - - L Bereich_Nr_from_PC // Anfoderung von Visualisierung? - L 0 - >I // Ja ! - JC X011 - - L 0 - T Bereich_Nr_from_PLC - T VAR_old - T VAR_Timer - - SET - R Error.Datenbank - R Error.Undef_Schleuse - R Error.BLKMOV - - A Durchlauf1 - R Durchlauf1 // 1.Durchlauf hat stattgefunden - JC D010 - - BEU - -// Daten löschen: -// Kennung + Datenbytes -D010: L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L 100 // Datenwords speichern - T LW2 - T LW12 // Wiederholungen - -// Quelle-Pointer erzeugen: (Empty-Visu) - L 252 - T LW4 // DB_Nummer - L 400 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: (Schleuse_Visu_Daten) - L 252 - T LW14 // DB_Nummer - L 0 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - -// Ziel-Pointer erzeugen: (Schleuse_Visu_old-Daten) - L 252 - T LW14 // DB_Nummer - L 200 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L 0 - T RET_VAL_Datenbank - T RET_VAL_BLKMOV - - BEU - -X010: CAC - T Schleuse_Nr_aktiv - - L 0 // Anforderung von PC löschen - T Bereich_Nr_from_PC // Visualisierung - -// Automatisches Deaktivieren: - L Bereich_Nr_from_VAR - L VAR_old // Noch diesselbe VAR-Nr. ? - ==I // Ja ! - A Durchlauf1 - JC Y010 - -// NeuBeginn: - L 3600 // 1 Stunde - T VAR_Timer // Timer neu laden - - L Bereich_Nr_from_VAR - T VAR_old // VAR-Nr. speichern - - JU En01 - -// Timer aktiv: -Y010: AN "1s-Impuls" // 1s-Impuls - JC En01 - - L VAR_Timer // Timer - + -1 // 1s von Restzeit abziehen - T VAR_Timer // Timer - - L 0 // abgelaufen ? - >I // Nein ! - JC En01 - -// Timer abgelaufen: - L 0 // Automatisch beaktivieren - T Bereich_Nr_from_VAR - T VAR_old - T VAR_Timer // Timer - - JU En01 - -X011: CAC - T Schleuse_Nr_aktiv - - L 0 // Anforderung von VAR löschen - T Bereich_Nr_from_VAR // Visualisierung - T VAR_old - T VAR_Timer - -En01: NOP 0 - - ---- NW 2: Zeiger von gewolltem Bereich_Plus ermitteln --- - L Schleuse_Nr_aktiv - T "MW200" // Search-Daten - -CALL FC "DatenOut" (SSDB:=DL_DB, SSDW:=0, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB219", OUTDATEN:=P#M220.0, Position:="MW298") // Datenlisten-DB - - L "MB219" - T RET_VAL_Datenbank // Rückmeldung bei Datenbank-Zugriff (Vorstau-DL) - - JBI ok2 - - A "M219.0" - S Error.Datenbank - -No: SET - S Error.Undef_Schleuse - - L 0 - T Bereich_Nr_from_PLC // Aktiv-Schleuse - - JU D010 - -ok2: SET - R Error.Datenbank - R Error.Undef_Schleuse - - L "MW222" - L 2275 // Omni-Bereich_Plus? - ==I // Ja! - JC Ok2_Mig - - JU No - -Ok2_Mig: L "MW224" - T Bereichs_DB - L "MW226" - T Bereichs_DW - - ---- NW 3: Neue Datenübergabe an PC ? --- - AN Durchlauf1 // 1.Durchlauf hat stattgefunden - JC En03 - -// Ziel-Pointer erzeugen: (PLC-Daten) - L Bereichs_DW - ITD - T AR1Start // Startwert mit Offset 0 - -// Raus-Trolleys: - L Bereich_Visu.Dyn.Raus_Trolleys - L Bereich_Visu_old.Dyn.Raus_Trolleys - ==I // Keine Änderung ! - JC X200 - - L AR1Start // Startwert mit Offset 0 - + DINT#192 // Offset für Raus-Trolleys - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - L Bereich_Visu.Dyn.Raus_Trolleys - OPN DB[Bereichs_DB] // Schleuse-DB öffnen - T DBW [AR1Zeiger] // Raus-Trolleys - -// Fahrzeit: -X200: L Bereich_Visu.Bereich.Fahrzeit - L Bereich_Visu_old.Bereich.Fahrzeit - ==I // Keine Änderung ! - JC X201 - - L AR1Start // Startwert mit Offset 0 - + DINT#50 // Offset für Fahrzeit - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - L Bereich_Visu.Bereich.Fahrzeit - OPN DB[Bereichs_DB] // Schleuse-DB öffnen - T DBW [AR1Zeiger] // Schleuse-Zug - -// Schleusen.SK-Reset: -X201: A Bereich_Visu.Dyn.Sk.Reset - A Bereich_Visu_old.Dyn.Sk.Reset - O - AN Bereich_Visu.Dyn.Sk.Reset - AN Bereich_Visu_old.Dyn.Sk.Reset - JC X301 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#88 // Offset für SK-Zeug - SLD 3 - L 3 // Damit DBX_Bit 3 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A Bereich_Visu.Dyn.Sk.Reset - OPN DB[Bereichs_DB] // Schleuse-DB öffnen - = DBX [AR1Zeiger] // Schleuse-SK-Reset - -// HMI-Reset: -X301: A Bereich_Visu.Dyn.HMI.Bereich_resetten - A Bereich_Visu_old.Dyn.HMI.Bereich_resetten - O - AN Bereich_Visu.Dyn.HMI.Bereich_resetten - AN Bereich_Visu_old.Dyn.HMI.Bereich_resetten - JC En03 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#72 // Offset für HMI - SLD 3 - L 0 // Damit DBX_Bit 0 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A Bereich_Visu.Dyn.HMI.Bereich_resetten - OPN DB[Bereichs_DB] // Weiche-DB öffnen - = DBX [AR1Zeiger] // Weiche-SK-Reset - -En03: NOP 0 - - ---- NW 4: Datenübernahme vom PC --- -// Kennung + Datenbytes - L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L 100 // Datenwords speichern - T LW2 - T LW12 // Wiederholungen - -// Quelle-Pointer erzeugen: (PLC-Daten) - L Bereichs_DB - T LW4 // DB_Nummer - L Bereichs_DW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: (PC-Schleuse-Visu-Daten) - L 252 - T LW14 // DB_Nummer - L 0 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L RET_VAL_BLKMOV // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Error.BLKMOV // Error bei Block kopieren - BEC - -// Ziel-Pointer erzeugen: (Schleuse_Visu_old-Daten) - L 252 - T LW14 // DB_Nummer - L 200 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L RET_VAL_BLKMOV // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Error.BLKMOV // Error bei Block kopieren - BEC - - L Schleuse_Nr_aktiv - T Bereich_Nr_from_PLC // Rückmeldung an PC (Daten stehen an) - - SET - S Durchlauf1 // 1.Durchlauf hat stattgefunden - - ---- NW 5: Ende --- - BE +FUNCTION_BLOCK "Visu_HMOmniBereich_Plus" +TITLE = Interne Daten in einem Fenster + Schleusen-Nr. mit PC visualisieren +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + Bereich_Visu : "MHMOmniBereich_Plus"; // Schleuse-Bereich für Visualisierung + Bereich_Visu_old : "MHMOmniBereich_Plus"; + Empty_Visu : Array[1..100] of Int; // Bereich für Daten-Löschung + DL_DB : Int; // Datenlisten-DB + Bereich_Nr_from_PC : Int; // PC>PLC: Für diesen Schleuse Daten bereitstellen + Bereich_Nr_from_PLC : Int; // PLC>PC: Daten von diesem Schleusee aktiv + Bereich_Nr_from_VAR : Int; // VAR>PLC: Für diesen Schleuse Daten bereitstellen + VAR_old : Int; // VAR>PLC: Für diesen Schleuse Daten bereitstellen + VAR_Timer : Int; // VAR>PLC: Für diesen Schleuse Daten bereitstellen + RET_VAL_Datenbank : Byte; + RET_VAL_BLKMOV : Int; + Durchlauf1 : Bool; // 1.Durchlauf hat stattgefunden + Error : Struct + Datenbank : Bool; + Undef_Schleuse : Bool; + BLKMOV : Bool; + END_STRUCT; + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Quell-Daten sind + Ziel : Any; // Zeiger, wo Ziel-Daten sind + Bereichs_DB : Int; // Schleuse-DB + Bereichs_DW : Int; // Schleuse-DW + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + Schleuse_Nr_aktiv : Int; // Intern: Für diesen Schleuse Daten bereitstellen + END_VAR + + +BEGIN +NETWORK +TITLE = Anforderung vom PC ? +// +// + L #Bereich_Nr_from_VAR;//Anforderung von Variablentabelle ? + L 0; + >I;//Ja ! + SPB X010; + + L #Bereich_Nr_from_PC;//Anfoderung von Visualisierung? + L 0; + >I;//Ja ! + SPB X011; + + L 0; + T #Bereich_Nr_from_PLC; + T #VAR_old; + T #VAR_Timer; + + SET; + R #Error.Datenbank; + R #Error.Undef_Schleuse; + R #Error.BLKMOV; + + U #Durchlauf1; + R #Durchlauf1;//1.Durchlauf hat stattgefunden + SPB D010; + + BEA; + +//Daten löschen: +//Kennung + Datenbytes +D010: L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L 100 ;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//Quelle-Pointer erzeugen: (Empty-Visu) + L 252; + T %LW4;//DB_Nummer + L 400 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: (Schleuse_Visu_Daten) + L 252; + T %LW14;//DB_Nummer + L 0;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + +//Ziel-Pointer erzeugen: (Schleuse_Visu_old-Daten) + L 252; + T %LW14;//DB_Nummer + L 200 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L 0; + T #RET_VAL_Datenbank; + T #RET_VAL_BLKMOV; + + BEA; + +X010: TAK; + T #Schleuse_Nr_aktiv; + + L 0;//Anforderung von PC löschen + T #Bereich_Nr_from_PC;//Visualisierung + +//Automatisches Deaktivieren: + L #Bereich_Nr_from_VAR; + L #VAR_old;//Noch diesselbe VAR-Nr. ? + ==I;//Ja ! + U #Durchlauf1; + SPB Y010; + +//NeuBeginn: + L 3600;//1 Stunde + T #VAR_Timer;//Timer neu laden + + L #Bereich_Nr_from_VAR; + T #VAR_old;//VAR-Nr. speichern + + SPA En01; + +//Timer aktiv: +Y010: UN "1s-Impuls";//1s-Impuls + SPB En01; + + L #VAR_Timer;//Timer + + -1;//1s von Restzeit abziehen + T #VAR_Timer;//Timer + + L 0;//abgelaufen ? + >I;//Nein ! + SPB En01; + +//Timer abgelaufen: + L 0;//Automatisch beaktivieren + T #Bereich_Nr_from_VAR; + T #VAR_old; + T #VAR_Timer;//Timer + + SPA En01; + +X011: TAK; + T #Schleuse_Nr_aktiv; + + L 0;//Anforderung von VAR löschen + T #Bereich_Nr_from_VAR;//Visualisierung + T #VAR_old; + T #VAR_Timer; + +En01: NOP 0; + +NETWORK +TITLE = Zeiger von gewolltem Bereich_Plus ermitteln + L #Schleuse_Nr_aktiv; + T "MW200";//Search-Daten + + CALL "DatenOut" + ( SSDB := #DL_DB , //Datenlisten-DB + SSDW := 0 , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB219" , + OUTDATEN := P#M220.0 , + Position := "MW298" + ); + + L "MB219"; + T #RET_VAL_Datenbank;//Rückmeldung bei Datenbank-Zugriff (Vorstau-DL) + + SPBI ok2; + + U "M219.0"; + S #Error.Datenbank; + +No: SET; + S #Error.Undef_Schleuse; + + L 0; + T #Bereich_Nr_from_PLC;//Aktiv-Schleuse + + SPA D010; + +ok2: SET; + R #Error.Datenbank; + R #Error.Undef_Schleuse; + + L "MW222"; + L 2275 ;//Omni-Bereich_Plus? + ==I;//Ja! + SPB Ok2_Mig; + + SPA No; + +Ok2_Mig: L "MW224"; + T #Bereichs_DB; + L "MW226"; + T #Bereichs_DW; + +NETWORK +TITLE = Neue Datenübergabe an PC ? + UN #Durchlauf1;//1.Durchlauf hat stattgefunden + SPB En03; + +//Ziel-Pointer erzeugen: (PLC-Daten) + L #Bereichs_DW; + ITD; + T #AR1Start;//Startwert mit Offset 0 + +//Raus-Trolleys: + L #Bereich_Visu.Dyn.Raus_Trolleys; + L #Bereich_Visu_old.Dyn.Raus_Trolleys; + ==I ;//Keine Änderung ! + SPB X200; + + L #AR1Start;//Startwert mit Offset 0 + + DINT#192 ;//Offset für Raus-Trolleys + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + L #Bereich_Visu.Dyn.Raus_Trolleys; + AUF DB[ #Bereichs_DB] ;//Schleuse-DB öffnen + T DBW[ #AR1Zeiger] ;//Raus-Trolleys + +//Fahrzeit: +X200: L #Bereich_Visu.Bereich.Fahrzeit; + L #Bereich_Visu_old.Bereich.Fahrzeit; + ==I ;//Keine Änderung ! + SPB X201; + + L #AR1Start;//Startwert mit Offset 0 + + DINT#50 ;//Offset für Fahrzeit + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + L #Bereich_Visu.Bereich.Fahrzeit; + AUF DB[ #Bereichs_DB] ;//Schleuse-DB öffnen + T DBW[ #AR1Zeiger] ;//Schleuse-Zug + +//Schleusen.SK-Reset: +X201: U #Bereich_Visu.Dyn.Sk.Reset; + U #Bereich_Visu_old.Dyn.Sk.Reset; + O; + UN #Bereich_Visu.Dyn.Sk.Reset; + UN #Bereich_Visu_old.Dyn.Sk.Reset; + SPB X301 ;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#88 ;//Offset für SK-Zeug + SLD 3; + L 3 ;//Damit DBX_Bit 3 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #Bereich_Visu.Dyn.Sk.Reset; + AUF DB[ #Bereichs_DB] ;//Schleuse-DB öffnen + = DBX[ #AR1Zeiger] ;//Schleuse-SK-Reset + +//HMI-Reset: +X301: U #Bereich_Visu.Dyn.HMI.Bereich_resetten; + U #Bereich_Visu_old.Dyn.HMI.Bereich_resetten; + O; + UN #Bereich_Visu.Dyn.HMI.Bereich_resetten; + UN #Bereich_Visu_old.Dyn.HMI.Bereich_resetten; + SPB En03 ;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#72 ;//Offset für HMI + SLD 3; + L 0 ;//Damit DBX_Bit 0 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #Bereich_Visu.Dyn.HMI.Bereich_resetten; + AUF DB[ #Bereichs_DB];//Weiche-DB öffnen + = DBX[ #AR1Zeiger] ;//Weiche-SK-Reset + +En03: NOP 0; + +NETWORK +TITLE = Datenübernahme vom PC + +//Kennung + Datenbytes + L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L 100 ;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//Quelle-Pointer erzeugen: (PLC-Daten) + L #Bereichs_DB; + T %LW4;//DB_Nummer + L #Bereichs_DW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: (PC-Schleuse-Visu-Daten) + L 252; + T %LW14;//DB_Nummer + L 0;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L #RET_VAL_BLKMOV;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Error.BLKMOV;//Error bei Block kopieren + BEB; + +//Ziel-Pointer erzeugen: (Schleuse_Visu_old-Daten) + L 252; + T %LW14;//DB_Nummer + L 200 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L #RET_VAL_BLKMOV;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Error.BLKMOV;//Error bei Block kopieren + BEB; + + L #Schleuse_Nr_aktiv; + T #Bereich_Nr_from_PLC;//Rückmeldung an PC (Daten stehen an) + + SET; + S #Durchlauf1;//1.Durchlauf hat stattgefunden + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMOmniSchleuse.awl b/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMOmniSchleuse.awl index 4849ac4..5be7759 100644 --- a/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMOmniSchleuse.awl +++ b/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMOmniSchleuse.awl @@ -1,364 +1,388 @@ -=== FB 155: Visu_HMOmniSchleuse [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Schleuse_Visu : "MHMOmniSchleuse" // Schleuse-Bereich für Visualisierung - Schleuse_Visu_old : "MHMOmniSchleuse" - Empty_Visu : Array[1..100] of Int // Bereich für Daten-Löschung - DL_DB : Int // Datenlisten-DB - Schleuse_Nr_from_PC : Int // PC>PLC: Für diesen Schleuse Daten bereitstellen - Schleuse_Nr_from_PLC : Int // PLC>PC: Daten von diesem Schleusee aktiv - Schleuse_Nr_from_VAR : Int // VAR>PLC: Für diesen Schleuse Daten bereitstellen - VAR_old : Int // VAR>PLC: Für diesen Schleuse Daten bereitstellen - VAR_Timer : Int // VAR>PLC: Für diesen Schleuse Daten bereitstellen - RET_VAL_Datenbank : Byte - RET_VAL_BLKMOV : Int - Durchlauf1 : Bool // 1.Durchlauf hat stattgefunden - Error : Struct - Datenbank : Bool - Undef_Schleuse : Bool - BLKMOV : Bool - Input: - Output: - InOut: - Static: - Dyn : Struct - Stau_Zeit : Int // Sensor B_VorSchleuse ist belegt [100ms] - Mindest_Zeit : Int // Sensor B_VorSchleuse ist frei [100ms] - Input: - Output: - InOut: - Static: - Dyn : Struct - Stau_Zeit : Int // Sensor B_VorSchleuse ist belegt [100ms] - Mindest_Zeit : Int // Sensor B_VorSchleuse ist frei [100ms] - Temp: - Quelle : Any // Zeiger, wo Quell-Daten sind - Ziel : Any // Zeiger, wo Ziel-Daten sind - Schleusen_DB : Int // Schleuse-DB - Schleusen_DW : Int // Schleuse-DW - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - Schleuse_Nr_aktiv : Int // Intern: Für diesen Schleuse Daten bereitstellen - Constant: - ---- NW 1: - --- - L Schleuse_Nr_from_VAR // Anforderung von Variablentabelle ? - L 0 - >I // Ja ! - JC X010 - - L Schleuse_Nr_from_PC // Anfoderung von Visualisierung? - L 0 - >I // Ja ! - JC X011 - - L 0 - T Schleuse_Nr_from_PLC - T VAR_old - T VAR_Timer - - SET - R Error.Datenbank - R Error.Undef_Schleuse - R Error.BLKMOV - - A Durchlauf1 - R Durchlauf1 // 1.Durchlauf hat stattgefunden - JC D010 - - BEU - -// Daten löschen: -// Kennung + Datenbytes -D010: L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L 100 // Datenwords speichern - T LW2 - T LW12 // Wiederholungen - -// Quelle-Pointer erzeugen: (Empty-Visu) - L 155 - T LW4 // DB_Nummer - L 400 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: (Schleuse_Visu_Daten) - L 155 - T LW14 // DB_Nummer - L 0 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - -// Ziel-Pointer erzeugen: (Schleuse_Visu_old-Daten) - L 155 - T LW14 // DB_Nummer - L 200 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L 0 - T RET_VAL_Datenbank - T RET_VAL_BLKMOV - - BEU - -X010: CAC - T Schleuse_Nr_aktiv - - L 0 // Anforderung von PC löschen - T Schleuse_Nr_from_PC // Visualisierung - -// Automatisches Deaktivieren: - L Schleuse_Nr_from_VAR - L VAR_old // Noch diesselbe VAR-Nr. ? - ==I // Ja ! - A Durchlauf1 - JC Y010 - -// NeuBeginn: - L 3600 // 1 Stunde - T VAR_Timer // Timer neu laden - - L Schleuse_Nr_from_VAR - T VAR_old // VAR-Nr. speichern - - JU En01 - -// Timer aktiv: -Y010: AN "1s-Impuls" // 1s-Impuls - JC En01 - - L VAR_Timer // Timer - + -1 // 1s von Restzeit abziehen - T VAR_Timer // Timer - - L 0 // abgelaufen ? - >I // Nein ! - JC En01 - -// Timer abgelaufen: - L 0 // Automatisch beaktivieren - T Schleuse_Nr_from_VAR - T VAR_old - T VAR_Timer // Timer - - JU En01 - -X011: CAC - T Schleuse_Nr_aktiv - - L 0 // Anforderung von VAR löschen - T Schleuse_Nr_from_VAR // Visualisierung - T VAR_old - T VAR_Timer - -En01: NOP 0 - - ---- NW 2: Zeiger von gewolltem Schleuse ermitteln --- - L Schleuse_Nr_aktiv - T "MW200" // Search-Daten - -CALL FC "DatenOut" (SSDB:=DL_DB, SSDW:=0, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB219", OUTDATEN:=P#M220.0, Position:="MW298") // Datenlisten-DB - - L "MB219" - T RET_VAL_Datenbank // Rückmeldung bei Datenbank-Zugriff (Vorstau-DL) - - JBI ok2 - - A "M219.0" - S Error.Datenbank - -No: SET - S Error.Undef_Schleuse - - L 0 - T Schleuse_Nr_from_PLC // Aktiv-Schleuse - - JU D010 - -ok2: SET - R Error.Datenbank - R Error.Undef_Schleuse - - L "MW222" - L 1274 // HM-Omni-Schleuse? - ==I // Ja! - JC Ok2_Mig - - JU No - -Ok2_Mig: L "MW224" - T Schleusen_DB - L "MW226" - T Schleusen_DW - - ---- NW 3: Neue Datenübergabe an PC ? --- - AN Durchlauf1 // 1.Durchlauf hat stattgefunden - JC En03 - -// Ziel-Pointer erzeugen: (PLC-Daten) - L Schleusen_DW - ITD - T AR1Start // Startwert mit Offset 0 - -// Ausfahrzeit: - L Schleuse_Visu.Schleuse.AusfahrZeit - L Schleuse_Visu_old.Schleuse.AusfahrZeit - ==I // Keine Änderung ! - JC X200 - - L AR1Start // Startwert mit Offset 0 - + DINT#60 // Offset für Ausfahrzeit - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - L Schleuse_Visu.Schleuse.AusfahrZeit - OPN DB[Schleusen_DB] // Schleuse-DB öffnen - T DBW [AR1Zeiger] // Schleuse-Zug - -// HMI TrolleyID-Input: -X200: L Schleuse_Visu.Dyn.HMI.TrolleyID_Input - L Schleuse_Visu_old.Dyn.HMI.TrolleyID_Input - ==D // Keine Änderung ! - JC X201 - - L AR1Start // Startwert mit Offset 0 - + DINT#98 // Offset für DefaultZiel - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - L Schleuse_Visu.Dyn.HMI.TrolleyID_Input - OPN DB[Schleusen_DB] // Schleuse-DB öffnen - T DBD [AR1Zeiger] // Schleuse-Zug - -// SK.Akt_Schritt: -X201: L Schleuse_Visu.Dyn.Sk.Akt_Schritt - L Schleuse_Visu_old.Dyn.Sk.Akt_Schritt - ==D // Keine Änderung ! - JC X300 - - L AR1Start // Startwert mit Offset 0 - + DINT#104 // Offset für Akt.Schritt - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - L Schleuse_Visu.Dyn.Sk.Akt_Schritt - OPN DB[Schleusen_DB] // Schleuse-DB öffnen - T DBD [AR1Zeiger] // Schleuse-Zug - -// Schleusen.SK-Reset: -X300: A Schleuse_Visu.Dyn.Sk.Reset - A Schleuse_Visu_old.Dyn.Sk.Reset - O - AN Schleuse_Visu.Dyn.Sk.Reset - AN Schleuse_Visu_old.Dyn.Sk.Reset - JC X301 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#118 // Offset für SK-Zeug - SLD 3 - L 3 // Damit DBX_Bit 3 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A Schleuse_Visu.Dyn.Sk.Reset - OPN DB[Schleusen_DB] // Schleuse-DB öffnen - = DBX [AR1Zeiger] // Schleuse-SK-Reset - -// HMI-Reset: -X301: A Schleuse_Visu.Dyn.HMI.Schleuse_resetten - A Schleuse_Visu_old.Dyn.HMI.Schleuse_resetten - O - AN Schleuse_Visu.Dyn.HMI.Schleuse_resetten - AN Schleuse_Visu_old.Dyn.HMI.Schleuse_resetten - JC En03 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#102 // Offset für Weichen-Zeug - SLD 3 - L 0 // Damit DBX_Bit 0 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A Schleuse_Visu.Dyn.HMI.Schleuse_resetten - OPN DB[Schleusen_DB] // Weiche-DB öffnen - = DBX [AR1Zeiger] // Weiche-SK-Reset - -En03: NOP 0 - - ---- NW 4: Datenübernahme vom PC --- -// Kennung + Datenbytes - L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L 100 // Datenwords speichern - T LW2 - T LW12 // Wiederholungen - -// Quelle-Pointer erzeugen: (PLC-Daten) - L Schleusen_DB - T LW4 // DB_Nummer - L Schleusen_DW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: (PC-Schleuse-Visu-Daten) - L 155 - T LW14 // DB_Nummer - L 0 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L RET_VAL_BLKMOV // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Error.BLKMOV // Error bei Block kopieren - BEC - -// Ziel-Pointer erzeugen: (Schleuse_Visu_old-Daten) - L 155 - T LW14 // DB_Nummer - L 200 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L RET_VAL_BLKMOV // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Error.BLKMOV // Error bei Block kopieren - BEC - - L Schleuse_Nr_aktiv - T Schleuse_Nr_from_PLC // Rückmeldung an PC (Daten stehen an) - - SET - S Durchlauf1 // 1.Durchlauf hat stattgefunden - - ---- NW 5: Ende --- - BE +FUNCTION_BLOCK "Visu_HMOmniSchleuse" +TITLE = Interne Daten in einem Fenster + Schleusen-Nr. mit PC visualisieren +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + Schleuse_Visu : "MHMOmniSchleuse"; // Schleuse-Bereich für Visualisierung + Schleuse_Visu_old : "MHMOmniSchleuse"; + Empty_Visu : Array[1..100] of Int; // Bereich für Daten-Löschung + DL_DB : Int; // Datenlisten-DB + Schleuse_Nr_from_PC : Int; // PC>PLC: Für diesen Schleuse Daten bereitstellen + Schleuse_Nr_from_PLC : Int; // PLC>PC: Daten von diesem Schleusee aktiv + Schleuse_Nr_from_VAR : Int; // VAR>PLC: Für diesen Schleuse Daten bereitstellen + VAR_old : Int; // VAR>PLC: Für diesen Schleuse Daten bereitstellen + VAR_Timer : Int; // VAR>PLC: Für diesen Schleuse Daten bereitstellen + RET_VAL_Datenbank : Byte; + RET_VAL_BLKMOV : Int; + Durchlauf1 : Bool; // 1.Durchlauf hat stattgefunden + Error : Struct + Datenbank : Bool; + Undef_Schleuse : Bool; + BLKMOV : Bool; + END_STRUCT; + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Quell-Daten sind + Ziel : Any; // Zeiger, wo Ziel-Daten sind + Schleusen_DB : Int; // Schleuse-DB + Schleusen_DW : Int; // Schleuse-DW + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + Schleuse_Nr_aktiv : Int; // Intern: Für diesen Schleuse Daten bereitstellen + END_VAR + + +BEGIN +NETWORK +TITLE = Anforderung vom PC ? +// +// + L #Schleuse_Nr_from_VAR;//Anforderung von Variablentabelle ? + L 0; + >I;//Ja ! + SPB X010; + + L #Schleuse_Nr_from_PC;//Anfoderung von Visualisierung? + L 0; + >I;//Ja ! + SPB X011; + + L 0; + T #Schleuse_Nr_from_PLC; + T #VAR_old; + T #VAR_Timer; + + SET; + R #Error.Datenbank; + R #Error.Undef_Schleuse; + R #Error.BLKMOV; + + U #Durchlauf1; + R #Durchlauf1;//1.Durchlauf hat stattgefunden + SPB D010; + + BEA; + +//Daten löschen: +//Kennung + Datenbytes +D010: L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L 100 ;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//Quelle-Pointer erzeugen: (Empty-Visu) + L 155; + T %LW4;//DB_Nummer + L 400 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: (Schleuse_Visu_Daten) + L 155; + T %LW14;//DB_Nummer + L 0;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + +//Ziel-Pointer erzeugen: (Schleuse_Visu_old-Daten) + L 155; + T %LW14;//DB_Nummer + L 200 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L 0; + T #RET_VAL_Datenbank; + T #RET_VAL_BLKMOV; + + BEA; + +X010: TAK; + T #Schleuse_Nr_aktiv; + + L 0;//Anforderung von PC löschen + T #Schleuse_Nr_from_PC;//Visualisierung + +//Automatisches Deaktivieren: + L #Schleuse_Nr_from_VAR; + L #VAR_old;//Noch diesselbe VAR-Nr. ? + ==I;//Ja ! + U #Durchlauf1; + SPB Y010; + +//NeuBeginn: + L 3600;//1 Stunde + T #VAR_Timer;//Timer neu laden + + L #Schleuse_Nr_from_VAR; + T #VAR_old;//VAR-Nr. speichern + + SPA En01; + +//Timer aktiv: +Y010: UN "1s-Impuls";//1s-Impuls + SPB En01; + + L #VAR_Timer;//Timer + + -1;//1s von Restzeit abziehen + T #VAR_Timer;//Timer + + L 0;//abgelaufen ? + >I;//Nein ! + SPB En01; + +//Timer abgelaufen: + L 0;//Automatisch beaktivieren + T #Schleuse_Nr_from_VAR; + T #VAR_old; + T #VAR_Timer;//Timer + + SPA En01; + +X011: TAK; + T #Schleuse_Nr_aktiv; + + L 0;//Anforderung von VAR löschen + T #Schleuse_Nr_from_VAR;//Visualisierung + T #VAR_old; + T #VAR_Timer; + +En01: NOP 0; + +NETWORK +TITLE = Zeiger von gewolltem Schleuse ermitteln + L #Schleuse_Nr_aktiv; + T "MW200";//Search-Daten + + CALL "DatenOut" + ( SSDB := #DL_DB , //Datenlisten-DB + SSDW := 0 , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB219" , + OUTDATEN := P#M220.0 , + Position := "MW298" + ); + + L "MB219"; + T #RET_VAL_Datenbank;//Rückmeldung bei Datenbank-Zugriff (Vorstau-DL) + + SPBI ok2; + + U "M219.0"; + S #Error.Datenbank; + +No: SET; + S #Error.Undef_Schleuse; + + L 0; + T #Schleuse_Nr_from_PLC;//Aktiv-Schleuse + + SPA D010; + +ok2: SET; + R #Error.Datenbank; + R #Error.Undef_Schleuse; + + L "MW222"; + L 1274 ;//HM-Omni-Schleuse? + ==I;//Ja! + SPB Ok2_Mig; + + SPA No; + +Ok2_Mig: L "MW224"; + T #Schleusen_DB; + L "MW226"; + T #Schleusen_DW; + +NETWORK +TITLE = Neue Datenübergabe an PC ? + UN #Durchlauf1;//1.Durchlauf hat stattgefunden + SPB En03; + +//Ziel-Pointer erzeugen: (PLC-Daten) + L #Schleusen_DW; + ITD; + T #AR1Start;//Startwert mit Offset 0 + +//Ausfahrzeit: + L #Schleuse_Visu.Schleuse.AusfahrZeit; + L #Schleuse_Visu_old.Schleuse.AusfahrZeit; + ==I ;//Keine Änderung ! + SPB X200; + + L #AR1Start;//Startwert mit Offset 0 + + DINT#60 ;//Offset für Ausfahrzeit + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + L #Schleuse_Visu.Schleuse.AusfahrZeit; + AUF DB[ #Schleusen_DB] ;//Schleuse-DB öffnen + T DBW[ #AR1Zeiger] ;//Schleuse-Zug + +//HMI TrolleyID-Input: +X200: L #Schleuse_Visu.Dyn.HMI.TrolleyID_Input; + L #Schleuse_Visu_old.Dyn.HMI.TrolleyID_Input; + ==D ;//Keine Änderung ! + SPB X201; + + L #AR1Start;//Startwert mit Offset 0 + + DINT#98 ;//Offset für DefaultZiel + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + L #Schleuse_Visu.Dyn.HMI.TrolleyID_Input; + AUF DB[ #Schleusen_DB] ;//Schleuse-DB öffnen + T DBD[ #AR1Zeiger] ;//Schleuse-Zug + +//SK.Akt_Schritt: +X201: L #Schleuse_Visu.Dyn.Sk.Akt_Schritt; + L #Schleuse_Visu_old.Dyn.Sk.Akt_Schritt; + ==D ;//Keine Änderung ! + SPB X300; + + L #AR1Start;//Startwert mit Offset 0 + + DINT#104 ;//Offset für Akt.Schritt + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + L #Schleuse_Visu.Dyn.Sk.Akt_Schritt; + AUF DB[ #Schleusen_DB] ;//Schleuse-DB öffnen + T DBD[ #AR1Zeiger] ;//Schleuse-Zug + +//Schleusen.SK-Reset: +X300: U #Schleuse_Visu.Dyn.Sk.Reset; + U #Schleuse_Visu_old.Dyn.Sk.Reset; + O; + UN #Schleuse_Visu.Dyn.Sk.Reset; + UN #Schleuse_Visu_old.Dyn.Sk.Reset; + SPB X301 ;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#118 ;//Offset für SK-Zeug + SLD 3; + L 3 ;//Damit DBX_Bit 3 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #Schleuse_Visu.Dyn.Sk.Reset; + AUF DB[ #Schleusen_DB] ;//Schleuse-DB öffnen + = DBX[ #AR1Zeiger] ;//Schleuse-SK-Reset + +//HMI-Reset: +X301: U #Schleuse_Visu.Dyn.HMI.Schleuse_resetten; + U #Schleuse_Visu_old.Dyn.HMI.Schleuse_resetten; + O; + UN #Schleuse_Visu.Dyn.HMI.Schleuse_resetten; + UN #Schleuse_Visu_old.Dyn.HMI.Schleuse_resetten; + SPB En03 ;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#102 ;//Offset für Weichen-Zeug + SLD 3; + L 0 ;//Damit DBX_Bit 0 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #Schleuse_Visu.Dyn.HMI.Schleuse_resetten; + AUF DB[ #Schleusen_DB];//Weiche-DB öffnen + = DBX[ #AR1Zeiger] ;//Weiche-SK-Reset + +En03: NOP 0; + +NETWORK +TITLE = Datenübernahme vom PC + +//Kennung + Datenbytes + L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L 100 ;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//Quelle-Pointer erzeugen: (PLC-Daten) + L #Schleusen_DB; + T %LW4;//DB_Nummer + L #Schleusen_DW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: (PC-Schleuse-Visu-Daten) + L 155; + T %LW14;//DB_Nummer + L 0;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L #RET_VAL_BLKMOV;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Error.BLKMOV;//Error bei Block kopieren + BEB; + +//Ziel-Pointer erzeugen: (Schleuse_Visu_old-Daten) + L 155; + T %LW14;//DB_Nummer + L 200 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L #RET_VAL_BLKMOV;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Error.BLKMOV;//Error bei Block kopieren + BEB; + + L #Schleuse_Nr_aktiv; + T #Schleuse_Nr_from_PLC;//Rückmeldung an PC (Daten stehen an) + + SET; + S #Durchlauf1;//1.Durchlauf hat stattgefunden + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMOmniSchleuse_Plus.awl b/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMOmniSchleuse_Plus.awl index fd0e762..e86afc2 100644 --- a/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMOmniSchleuse_Plus.awl +++ b/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMOmniSchleuse_Plus.awl @@ -1,350 +1,388 @@ -=== FB 255: Visu_HMOmniSchleuse_Plus [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Schleuse_Visu : "MHMOmniSchleuse_Plus" // Schleuse-Bereich für Visualisierung - Schleuse_Visu_old : "MHMOmniSchleuse_Plus" - Empty_Visu : Array[1..100] of Int // Bereich für Daten-Löschung - DL_DB : Int // Datenlisten-DB - Schleuse_Nr_from_PC : Int // PC>PLC: Für diesen Schleuse Daten bereitstellen - Schleuse_Nr_from_PLC : Int // PLC>PC: Daten von diesem Schleusee aktiv - Schleuse_Nr_from_VAR : Int // VAR>PLC: Für diesen Schleuse Daten bereitstellen - VAR_old : Int // VAR>PLC: Für diesen Schleuse Daten bereitstellen - VAR_Timer : Int // VAR>PLC: Für diesen Schleuse Daten bereitstellen - RET_VAL_Datenbank : Byte - RET_VAL_BLKMOV : Int - Durchlauf1 : Bool // 1.Durchlauf hat stattgefunden - Error : Struct - Datenbank : Bool - Undef_Schleuse : Bool - BLKMOV : Bool - Temp: - Quelle : Any // Zeiger, wo Quell-Daten sind - Ziel : Any // Zeiger, wo Ziel-Daten sind - Schleusen_DB : Int // Schleuse-DB - Schleusen_DW : Int // Schleuse-DW - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - Schleuse_Nr_aktiv : Int // Intern: Für diesen Schleuse Daten bereitstellen - Constant: - ---- NW 1: - --- - L Schleuse_Nr_from_VAR // Anforderung von Variablentabelle ? - L 0 - >I // Ja ! - JC X010 - - L Schleuse_Nr_from_PC // Anfoderung von Visualisierung? - L 0 - >I // Ja ! - JC X011 - - L 0 - T Schleuse_Nr_from_PLC - T VAR_old - T VAR_Timer - - SET - R Error.Datenbank - R Error.Undef_Schleuse - R Error.BLKMOV - - A Durchlauf1 - R Durchlauf1 // 1.Durchlauf hat stattgefunden - JC D010 - - BEU - -// Daten löschen: -// Kennung + Datenbytes -D010: L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L 100 // Datenwords speichern - T LW2 - T LW12 // Wiederholungen - -// Quelle-Pointer erzeugen: (Empty-Visu) - L 255 - T LW4 // DB_Nummer - L 400 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: (Schleuse_Visu_Daten) - L 255 - T LW14 // DB_Nummer - L 0 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - -// Ziel-Pointer erzeugen: (Schleuse_Visu_old-Daten) - L 255 - T LW14 // DB_Nummer - L 200 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L 0 - T RET_VAL_Datenbank - T RET_VAL_BLKMOV - - BEU - -X010: CAC - T Schleuse_Nr_aktiv - - L 0 // Anforderung von PC löschen - T Schleuse_Nr_from_PC // Visualisierung - -// Automatisches Deaktivieren: - L Schleuse_Nr_from_VAR - L VAR_old // Noch diesselbe VAR-Nr. ? - ==I // Ja ! - A Durchlauf1 - JC Y010 - -// NeuBeginn: - L 3600 // 1 Stunde - T VAR_Timer // Timer neu laden - - L Schleuse_Nr_from_VAR - T VAR_old // VAR-Nr. speichern - - JU En01 - -// Timer aktiv: -Y010: AN "1s-Impuls" // 1s-Impuls - JC En01 - - L VAR_Timer // Timer - + -1 // 1s von Restzeit abziehen - T VAR_Timer // Timer - - L 0 // abgelaufen ? - >I // Nein ! - JC En01 - -// Timer abgelaufen: - L 0 // Automatisch beaktivieren - T Schleuse_Nr_from_VAR - T VAR_old - T VAR_Timer // Timer - - JU En01 - -X011: CAC - T Schleuse_Nr_aktiv - - L 0 // Anforderung von VAR löschen - T Schleuse_Nr_from_VAR // Visualisierung - T VAR_old - T VAR_Timer - -En01: NOP 0 - - ---- NW 2: Zeiger von gewolltem Schleuse ermitteln --- - L Schleuse_Nr_aktiv - T "MW200" // Search-Daten - -CALL FC "DatenOut" (SSDB:=DL_DB, SSDW:=0, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB219", OUTDATEN:=P#M220.0, Position:="MW298") // Datenlisten-DB - - L "MB219" - T RET_VAL_Datenbank // Rückmeldung bei Datenbank-Zugriff (Vorstau-DL) - - JBI ok2 - - A "M219.0" - S Error.Datenbank - -No: SET - S Error.Undef_Schleuse - - L 0 - T Schleuse_Nr_from_PLC // Aktiv-Schleuse - - JU D010 - -ok2: SET - R Error.Datenbank - R Error.Undef_Schleuse - - L "MW222" - L 1275 // HM-Omni-Schleuse_Plus? - ==I // Ja! - JC Ok2_Mig - - JU No - -Ok2_Mig: L "MW224" - T Schleusen_DB - L "MW226" - T Schleusen_DW - - ---- NW 3: Neue Datenübergabe an PC ? --- - AN Durchlauf1 // 1.Durchlauf hat stattgefunden - JC En03 - -// Ziel-Pointer erzeugen: (PLC-Daten) - L Schleusen_DW - ITD - T AR1Start // Startwert mit Offset 0 - -// Raus-Trolleys: - L Schleuse_Visu.Dyn.Raus_Trolleys - L Schleuse_Visu_old.Dyn.Raus_Trolleys - ==I // Keine Änderung ! - JC X200 - - L AR1Start // Startwert mit Offset 0 - + DINT#162 // Offset für Raus-Trolleys - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - L Schleuse_Visu.Dyn.Raus_Trolleys - OPN DB[Schleusen_DB] // Schleuse-DB öffnen - T DBW [AR1Zeiger] // Raus-Trolleys - -// HMI TrolleyID-Input: -X200: L Schleuse_Visu.Dyn.HMI.TrolleyID_Input - L Schleuse_Visu_old.Dyn.HMI.TrolleyID_Input - ==D // Keine Änderung ! - JC X201 - - L AR1Start // Startwert mit Offset 0 - + DINT#98 // Offset für DefaultZiel - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - L Schleuse_Visu.Dyn.HMI.TrolleyID_Input - OPN DB[Schleusen_DB] // Schleuse-DB öffnen - T DBD [AR1Zeiger] // Schleuse-Zug - -// SK.Akt_Schritt: -X201: L Schleuse_Visu.Dyn.Sk.Akt_Schritt - L Schleuse_Visu_old.Dyn.Sk.Akt_Schritt - ==D // Keine Änderung ! - JC X300 - - L AR1Start // Startwert mit Offset 0 - + DINT#104 // Offset für Akt.Schritt - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - L Schleuse_Visu.Dyn.Sk.Akt_Schritt - OPN DB[Schleusen_DB] // Schleuse-DB öffnen - T DBD [AR1Zeiger] // Schleuse-Zug - -// Schleusen.SK-Reset: -X300: A Schleuse_Visu.Dyn.Sk.Reset - A Schleuse_Visu_old.Dyn.Sk.Reset - O - AN Schleuse_Visu.Dyn.Sk.Reset - AN Schleuse_Visu_old.Dyn.Sk.Reset - JC X301 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#118 // Offset für SK-Zeug - SLD 3 - L 3 // Damit DBX_Bit 3 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A Schleuse_Visu.Dyn.Sk.Reset - OPN DB[Schleusen_DB] // Schleuse-DB öffnen - = DBX [AR1Zeiger] // Schleuse-SK-Reset - -// HMI-Reset: -X301: A Schleuse_Visu.Dyn.HMI.Schleuse_resetten - A Schleuse_Visu_old.Dyn.HMI.Schleuse_resetten - O - AN Schleuse_Visu.Dyn.HMI.Schleuse_resetten - AN Schleuse_Visu_old.Dyn.HMI.Schleuse_resetten - JC En03 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#102 // Offset für Weichen-Zeug - SLD 3 - L 0 // Damit DBX_Bit 0 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A Schleuse_Visu.Dyn.HMI.Schleuse_resetten - OPN DB[Schleusen_DB] // Weiche-DB öffnen - = DBX [AR1Zeiger] // Weiche-SK-Reset - -En03: NOP 0 - - ---- NW 4: Datenübernahme vom PC --- -// Kennung + Datenbytes - L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L 100 // Datenwords speichern - T LW2 - T LW12 // Wiederholungen - -// Quelle-Pointer erzeugen: (PLC-Daten) - L Schleusen_DB - T LW4 // DB_Nummer - L Schleusen_DW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: (PC-Schleuse-Visu-Daten) - L 255 - T LW14 // DB_Nummer - L 0 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L RET_VAL_BLKMOV // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Error.BLKMOV // Error bei Block kopieren - BEC - -// Ziel-Pointer erzeugen: (Schleuse_Visu_old-Daten) - L 255 - T LW14 // DB_Nummer - L 200 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L RET_VAL_BLKMOV // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Error.BLKMOV // Error bei Block kopieren - BEC - - L Schleuse_Nr_aktiv - T Schleuse_Nr_from_PLC // Rückmeldung an PC (Daten stehen an) - - SET - S Durchlauf1 // 1.Durchlauf hat stattgefunden - - ---- NW 5: Ende --- - BE +FUNCTION_BLOCK "Visu_HMOmniSchleuse_Plus" +TITLE = Interne Daten in einem Fenster + Schleusen-Nr. mit PC visualisieren +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + Schleuse_Visu : "MHMOmniSchleuse_Plus"; // Schleuse-Bereich für Visualisierung + Schleuse_Visu_old : "MHMOmniSchleuse_Plus"; + Empty_Visu : Array[1..100] of Int; // Bereich für Daten-Löschung + DL_DB : Int; // Datenlisten-DB + Schleuse_Nr_from_PC : Int; // PC>PLC: Für diesen Schleuse Daten bereitstellen + Schleuse_Nr_from_PLC : Int; // PLC>PC: Daten von diesem Schleusee aktiv + Schleuse_Nr_from_VAR : Int; // VAR>PLC: Für diesen Schleuse Daten bereitstellen + VAR_old : Int; // VAR>PLC: Für diesen Schleuse Daten bereitstellen + VAR_Timer : Int; // VAR>PLC: Für diesen Schleuse Daten bereitstellen + RET_VAL_Datenbank : Byte; + RET_VAL_BLKMOV : Int; + Durchlauf1 : Bool; // 1.Durchlauf hat stattgefunden + Error : Struct + Datenbank : Bool; + Undef_Schleuse : Bool; + BLKMOV : Bool; + END_STRUCT; + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Quell-Daten sind + Ziel : Any; // Zeiger, wo Ziel-Daten sind + Schleusen_DB : Int; // Schleuse-DB + Schleusen_DW : Int; // Schleuse-DW + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + Schleuse_Nr_aktiv : Int; // Intern: Für diesen Schleuse Daten bereitstellen + END_VAR + + +BEGIN +NETWORK +TITLE = Anforderung vom PC ? +// +// + L #Schleuse_Nr_from_VAR;//Anforderung von Variablentabelle ? + L 0; + >I;//Ja ! + SPB X010; + + L #Schleuse_Nr_from_PC;//Anfoderung von Visualisierung? + L 0; + >I;//Ja ! + SPB X011; + + L 0; + T #Schleuse_Nr_from_PLC; + T #VAR_old; + T #VAR_Timer; + + SET; + R #Error.Datenbank; + R #Error.Undef_Schleuse; + R #Error.BLKMOV; + + U #Durchlauf1; + R #Durchlauf1;//1.Durchlauf hat stattgefunden + SPB D010; + + BEA; + +//Daten löschen: +//Kennung + Datenbytes +D010: L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L 100 ;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//Quelle-Pointer erzeugen: (Empty-Visu) + L 255; + T %LW4;//DB_Nummer + L 400 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: (Schleuse_Visu_Daten) + L 255; + T %LW14;//DB_Nummer + L 0;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + +//Ziel-Pointer erzeugen: (Schleuse_Visu_old-Daten) + L 255; + T %LW14;//DB_Nummer + L 200 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L 0; + T #RET_VAL_Datenbank; + T #RET_VAL_BLKMOV; + + BEA; + +X010: TAK; + T #Schleuse_Nr_aktiv; + + L 0;//Anforderung von PC löschen + T #Schleuse_Nr_from_PC;//Visualisierung + +//Automatisches Deaktivieren: + L #Schleuse_Nr_from_VAR; + L #VAR_old;//Noch diesselbe VAR-Nr. ? + ==I;//Ja ! + U #Durchlauf1; + SPB Y010; + +//NeuBeginn: + L 3600;//1 Stunde + T #VAR_Timer;//Timer neu laden + + L #Schleuse_Nr_from_VAR; + T #VAR_old;//VAR-Nr. speichern + + SPA En01; + +//Timer aktiv: +Y010: UN "1s-Impuls";//1s-Impuls + SPB En01; + + L #VAR_Timer;//Timer + + -1;//1s von Restzeit abziehen + T #VAR_Timer;//Timer + + L 0;//abgelaufen ? + >I;//Nein ! + SPB En01; + +//Timer abgelaufen: + L 0;//Automatisch beaktivieren + T #Schleuse_Nr_from_VAR; + T #VAR_old; + T #VAR_Timer;//Timer + + SPA En01; + +X011: TAK; + T #Schleuse_Nr_aktiv; + + L 0;//Anforderung von VAR löschen + T #Schleuse_Nr_from_VAR;//Visualisierung + T #VAR_old; + T #VAR_Timer; + +En01: NOP 0; + +NETWORK +TITLE = Zeiger von gewolltem Schleuse ermitteln + L #Schleuse_Nr_aktiv; + T "MW200";//Search-Daten + + CALL "DatenOut" + ( SSDB := #DL_DB , //Datenlisten-DB + SSDW := 0 , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB219" , + OUTDATEN := P#M220.0 , + Position := "MW298" + ); + + L "MB219"; + T #RET_VAL_Datenbank;//Rückmeldung bei Datenbank-Zugriff (Vorstau-DL) + + SPBI ok2; + + U "M219.0"; + S #Error.Datenbank; + +No: SET; + S #Error.Undef_Schleuse; + + L 0; + T #Schleuse_Nr_from_PLC;//Aktiv-Schleuse + + SPA D010; + +ok2: SET; + R #Error.Datenbank; + R #Error.Undef_Schleuse; + + L "MW222"; + L 1275 ;//HM-Omni-Schleuse_Plus? + ==I;//Ja! + SPB Ok2_Mig; + + SPA No; + +Ok2_Mig: L "MW224"; + T #Schleusen_DB; + L "MW226"; + T #Schleusen_DW; + +NETWORK +TITLE = Neue Datenübergabe an PC ? + UN #Durchlauf1;//1.Durchlauf hat stattgefunden + SPB En03; + +//Ziel-Pointer erzeugen: (PLC-Daten) + L #Schleusen_DW; + ITD; + T #AR1Start;//Startwert mit Offset 0 + +//Raus-Trolleys: + L #Schleuse_Visu.Dyn.Raus_Trolleys; + L #Schleuse_Visu_old.Dyn.Raus_Trolleys; + ==I ;//Keine Änderung ! + SPB X200; + + L #AR1Start;//Startwert mit Offset 0 + + DINT#162 ;//Offset für Raus-Trolleys + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + L #Schleuse_Visu.Dyn.Raus_Trolleys; + AUF DB[ #Schleusen_DB] ;//Schleuse-DB öffnen + T DBW[ #AR1Zeiger] ;//Raus-Trolleys + +//HMI TrolleyID-Input: +X200: L #Schleuse_Visu.Dyn.HMI.TrolleyID_Input; + L #Schleuse_Visu_old.Dyn.HMI.TrolleyID_Input; + ==D ;//Keine Änderung ! + SPB X201; + + L #AR1Start;//Startwert mit Offset 0 + + DINT#98 ;//Offset für DefaultZiel + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + L #Schleuse_Visu.Dyn.HMI.TrolleyID_Input; + AUF DB[ #Schleusen_DB] ;//Schleuse-DB öffnen + T DBD[ #AR1Zeiger] ;//Schleuse-Zug + +//SK.Akt_Schritt: +X201: L #Schleuse_Visu.Dyn.Sk.Akt_Schritt; + L #Schleuse_Visu_old.Dyn.Sk.Akt_Schritt; + ==D ;//Keine Änderung ! + SPB X300; + + L #AR1Start;//Startwert mit Offset 0 + + DINT#104 ;//Offset für Akt.Schritt + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + L #Schleuse_Visu.Dyn.Sk.Akt_Schritt; + AUF DB[ #Schleusen_DB] ;//Schleuse-DB öffnen + T DBD[ #AR1Zeiger] ;//Schleuse-Zug + +//Schleusen.SK-Reset: +X300: U #Schleuse_Visu.Dyn.Sk.Reset; + U #Schleuse_Visu_old.Dyn.Sk.Reset; + O; + UN #Schleuse_Visu.Dyn.Sk.Reset; + UN #Schleuse_Visu_old.Dyn.Sk.Reset; + SPB X301 ;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#118 ;//Offset für SK-Zeug + SLD 3; + L 3 ;//Damit DBX_Bit 3 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #Schleuse_Visu.Dyn.Sk.Reset; + AUF DB[ #Schleusen_DB] ;//Schleuse-DB öffnen + = DBX[ #AR1Zeiger] ;//Schleuse-SK-Reset + +//HMI-Reset: +X301: U #Schleuse_Visu.Dyn.HMI.Schleuse_resetten; + U #Schleuse_Visu_old.Dyn.HMI.Schleuse_resetten; + O; + UN #Schleuse_Visu.Dyn.HMI.Schleuse_resetten; + UN #Schleuse_Visu_old.Dyn.HMI.Schleuse_resetten; + SPB En03 ;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#102 ;//Offset für Weichen-Zeug + SLD 3; + L 0 ;//Damit DBX_Bit 0 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #Schleuse_Visu.Dyn.HMI.Schleuse_resetten; + AUF DB[ #Schleusen_DB];//Weiche-DB öffnen + = DBX[ #AR1Zeiger] ;//Weiche-SK-Reset + +En03: NOP 0; + +NETWORK +TITLE = Datenübernahme vom PC + +//Kennung + Datenbytes + L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L 100 ;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//Quelle-Pointer erzeugen: (PLC-Daten) + L #Schleusen_DB; + T %LW4;//DB_Nummer + L #Schleusen_DW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: (PC-Schleuse-Visu-Daten) + L 255; + T %LW14;//DB_Nummer + L 0;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L #RET_VAL_BLKMOV;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Error.BLKMOV;//Error bei Block kopieren + BEB; + +//Ziel-Pointer erzeugen: (Schleuse_Visu_old-Daten) + L 255; + T %LW14;//DB_Nummer + L 200 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L #RET_VAL_BLKMOV;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Error.BLKMOV;//Error bei Block kopieren + BEB; + + L #Schleuse_Nr_aktiv; + T #Schleuse_Nr_from_PLC;//Rückmeldung an PC (Daten stehen an) + + SET; + S #Durchlauf1;//1.Durchlauf hat stattgefunden + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMOmniWeiche_Plus.awl b/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMOmniWeiche_Plus.awl index f8f15ae..0bda1e4 100644 --- a/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMOmniWeiche_Plus.awl +++ b/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMOmniWeiche_Plus.awl @@ -1,290 +1,328 @@ -=== FB 256: Visu_HMOmniWeiche_Plus [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Weiche_Visu : "MHMOmniWeiche_Plus" // Weiche-Bereich für Visualisierung - Weiche_Visu_old : "MHMOmniWeiche_Plus" - empty_Visu : Array[1..100] of Int // Bereich für Daten-Löschung - DL_DB : Int // Datenlisten-DB - Weiche_Nr_from_PC : Int // PC>PLC: Für diesen Weiche Daten bereitstellen - Weiche_Nr_from_PLC : Int // PLC>PC: Daten von diesem Weiche aktiv - Weiche_Nr_from_VAR : Int // VAR>PLC: Für diesen Weiche Daten bereitstellen - VAR_old : Int // VAR>PLC: Für diesen Weiche Daten bereitstellen - VAR_Timer : Int // VAR>PLC: Für diesen Weiche Daten bereitstellen - RET_VAL_Datenbank : Byte - RET_VAL_BLKMOV : Int - Durchlauf1 : Bool // 1.Durchlauf hat stattgefunden - Error : Struct - Datenbank : Bool - Undef_Weiche : Bool - BLKMOV : Bool - Temp: - Quelle : Any // Zeiger, wo Quell-Daten sind - Ziel : Any // Zeiger, wo Ziel-Daten sind - Weichen_DB : Int // Weiche-DB - Weichen_DW : Int // Weiche-DW - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - Weiche_Nr_aktiv : Int // Intern: Für diesen Weiche Daten bereitstellen - Constant: +FUNCTION_BLOCK "Visu_HMOmniWeiche_Plus" +TITLE = Interne Daten in einem Fenster + -Nr. mit PC visualisieren +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + Weiche_Visu : "MHMOmniWeiche_Plus"; // Weiche-Bereich für Visualisierung + Weiche_Visu_old : "MHMOmniWeiche_Plus"; + empty_Visu : Array[1..100] of Int; // Bereich für Daten-Löschung + DL_DB : Int; // Datenlisten-DB + Weiche_Nr_from_PC : Int; // PC>PLC: Für diesen Weiche Daten bereitstellen + Weiche_Nr_from_PLC : Int; // PLC>PC: Daten von diesem Weiche aktiv + Weiche_Nr_from_VAR : Int; // VAR>PLC: Für diesen Weiche Daten bereitstellen + VAR_old : Int; // VAR>PLC: Für diesen Weiche Daten bereitstellen + VAR_Timer : Int; // VAR>PLC: Für diesen Weiche Daten bereitstellen + RET_VAL_Datenbank : Byte; + RET_VAL_BLKMOV : Int; + Durchlauf1 : Bool; // 1.Durchlauf hat stattgefunden + Error : Struct + Datenbank : Bool; + Undef_Weiche : Bool; + BLKMOV : Bool; + END_STRUCT; + END_VAR ---- NW 1: - --- - L Weiche_Nr_from_VAR // Anforderung von Variablentabelle ? - L 0 - >I // Ja ! - JC X010 - - L Weiche_Nr_from_PC // Anfoderung von Visualisierung? - L 0 - >I // Ja ! - JC X011 - - L 0 - T Weiche_Nr_from_PLC - T VAR_old - T VAR_Timer - - SET - R Error.Datenbank - R Error.Undef_Weiche - R Error.BLKMOV - - A Durchlauf1 - R Durchlauf1 // 1.Durchlauf hat stattgefunden - JC D010 - - BEU - -// Daten löschen: -// Kennung + Datenbytes -D010: L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L 100 // Datenwords speichern - T LW2 - T LW12 // Wiederholungen - -// Quelle-Pointer erzeugen: (empty-Visu) - L 256 - T LW4 // DB_Nummer - L 400 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: (Weiche_Visu_Daten) - L 256 - T LW14 // DB_Nummer - L 0 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - -// Ziel-Pointer erzeugen: (Weiche_Visu_old-Daten) - L 256 - T LW14 // DB_Nummer - L 150 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L 0 - T RET_VAL_Datenbank - T RET_VAL_BLKMOV - - BEU - -X010: CAC - T Weiche_Nr_aktiv - - L 0 // Anforderung von PC löschen - T Weiche_Nr_from_PC // Visualisierung - -// Automatisches Deaktivieren: - L Weiche_Nr_from_VAR - L VAR_old // Noch diesselbe VAR-Nr. ? - ==I // Ja ! - A Durchlauf1 - JC Y010 - -// NeuBeginn: - L 3600 // 1 Stunde - T VAR_Timer // Timer neu laden - - L Weiche_Nr_from_VAR - T VAR_old // VAR-Nr. speichern - - JU En01 - -// Timer aktiv: -Y010: AN "1s-Impuls" // 1s-Impuls - JC En01 - - L VAR_Timer // Timer - + -1 // 1s von Restzeit abziehen - T VAR_Timer // Timer - - L 0 // abgelaufen ? - >I // Nein ! - JC En01 - -// Timer abgelaufen: - L 0 // Automatisch beaktivieren - T Weiche_Nr_from_VAR - T VAR_old - T VAR_Timer // Timer - - JU En01 - -X011: CAC - T Weiche_Nr_aktiv - - L 0 // Anforderung von VAR löschen - T Weiche_Nr_from_VAR // Visualisierung - T VAR_old - T VAR_Timer - -En01: NOP 0 + VAR_TEMP + Quelle : Any; // Zeiger, wo Quell-Daten sind + Ziel : Any; // Zeiger, wo Ziel-Daten sind + Weichen_DB : Int; // Weiche-DB + Weichen_DW : Int; // Weiche-DW + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + Weiche_Nr_aktiv : Int; // Intern: Für diesen Weiche Daten bereitstellen + END_VAR ---- NW 2: Zeiger von gewolltem Weiche ermitteln --- - L Weiche_Nr_aktiv - T "MW200" // Search-Daten +BEGIN +NETWORK +TITLE = Anforderung vom PC ? +// +// + L #Weiche_Nr_from_VAR;//Anforderung von Variablentabelle ? + L 0; + >I;//Ja ! + SPB X010; -CALL FC "DatenOut" (SSDB:=DL_DB, SSDW:=0, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB219", OUTDATEN:=P#M220.0, Position:="MW298") // Datenlisten-DB + L #Weiche_Nr_from_PC;//Anfoderung von Visualisierung? + L 0; + >I;//Ja ! + SPB X011; - L "MB219" - T RET_VAL_Datenbank // Rückmeldung bei Datenbank-Zugriff (Vorstau-DL) + L 0; + T #Weiche_Nr_from_PLC; + T #VAR_old; + T #VAR_Timer; - JBI ok2 + SET; + R #Error.Datenbank; + R #Error.Undef_Weiche; + R #Error.BLKMOV; - A "M219.0" - S Error.Datenbank + U #Durchlauf1; + R #Durchlauf1;//1.Durchlauf hat stattgefunden + SPB D010; -No: SET - S Error.Undef_Weiche + BEA; - L 0 - T Weiche_Nr_from_PLC // Aktiv-Weiche +//Daten löschen: +//Kennung + Datenbytes +D010: L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L 100 ;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen - JU D010 +//Quelle-Pointer erzeugen: (empty-Visu) + L 256; + T %LW4;//DB_Nummer + L 400 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse -ok2: SET - R Error.Datenbank - R Error.Undef_Weiche +//Ziel-Pointer erzeugen: (Weiche_Visu_Daten) + L 256; + T %LW14;//DB_Nummer + L 0;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse - L "MW222" - L 1280 // HMOmni-Weiche_Plus? - ==I // Ja! - JC Ok2_Mig + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); - JU No +//Ziel-Pointer erzeugen: (Weiche_Visu_old-Daten) + L 256; + T %LW14;//DB_Nummer + L 150;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse -Ok2_Mig: L "MW224" - T Weichen_DB - L "MW226" - T Weichen_DW + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + L 0; + T #RET_VAL_Datenbank; + T #RET_VAL_BLKMOV; ---- NW 3: Neue Datenübergabe an PC ? --- - AN Durchlauf1 // 1.Durchlauf hat stattgefunden - JC En03 + BEA; -// Ziel-Pointer erzeugen: (PLC-Daten) - L Weichen_DW - ITD - T AR1Start // Startwert mit Offset 0 +X010: TAK; + T #Weiche_Nr_aktiv; -// HMI-Reset: -X300: A Weiche_Visu.Dyn.HMI.Weiche_resetten - A Weiche_Visu_old.Dyn.HMI.Weiche_resetten - O - AN Weiche_Visu.Dyn.HMI.Weiche_resetten - AN Weiche_Visu_old.Dyn.HMI.Weiche_resetten - JC En03 // Keine Änderung ! + L 0;//Anforderung von PC löschen + T #Weiche_Nr_from_PC;//Visualisierung - L AR1Start // Startwert mit Offset 0 - + DINT#90 // Offset für Weichen-Zeug - SLD 3 - L 0 // Damit DBX_Bit 0 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A Weiche_Visu.Dyn.HMI.Weiche_resetten - OPN DB[Weichen_DB] // Weiche-DB öffnen - = DBX [AR1Zeiger] // Weiche-SK-Reset +//Automatisches Deaktivieren: + L #Weiche_Nr_from_VAR; + L #VAR_old;//Noch diesselbe VAR-Nr. ? + ==I;//Ja ! + U #Durchlauf1; + SPB Y010; -En03: NOP 0 +//NeuBeginn: + L 3600;//1 Stunde + T #VAR_Timer;//Timer neu laden + L #Weiche_Nr_from_VAR; + T #VAR_old;//VAR-Nr. speichern ---- NW 4: Datenübernahme vom PC --- -// Kennung + Datenbytes - L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L 100 // Datenwords speichern - T LW2 - T LW12 // Wiederholungen + SPA En01; -// Quelle-Pointer erzeugen: (PLC-Daten) - L Weichen_DB - T LW4 // DB_Nummer - L Weichen_DW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse +//Timer aktiv: +Y010: UN "1s-Impuls";//1s-Impuls + SPB En01; -// Ziel-Pointer erzeugen: (PC-Weiche-Visu-Daten) - L 256 - T LW14 // DB_Nummer - L 0 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse + L #VAR_Timer;//Timer + + -1;//1s von Restzeit abziehen + T #VAR_Timer;//Timer -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern + L 0;//abgelaufen ? + >I;//Nein ! + SPB En01; - L RET_VAL_BLKMOV // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Error.BLKMOV // Error bei Block kopieren - BEC +//Timer abgelaufen: + L 0;//Automatisch beaktivieren + T #Weiche_Nr_from_VAR; + T #VAR_old; + T #VAR_Timer;//Timer -// Ziel-Pointer erzeugen: (Weiche_Visu_old-Daten) - L 256 - T LW14 // DB_Nummer - L 200 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse + SPA En01; -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern +X011: TAK; + T #Weiche_Nr_aktiv; - L RET_VAL_BLKMOV // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Error.BLKMOV // Error bei Block kopieren - BEC + L 0;//Anforderung von VAR löschen + T #Weiche_Nr_from_VAR;//Visualisierung + T #VAR_old; + T #VAR_Timer; - L Weiche_Nr_aktiv - T Weiche_Nr_from_PLC // Rückmeldung an PC (Daten stehen an) +En01: NOP 0; - SET - S Durchlauf1 // 1.Durchlauf hat stattgefunden +NETWORK +TITLE = Zeiger von gewolltem Weiche ermitteln + L #Weiche_Nr_aktiv; + T "MW200";//Search-Daten + CALL "DatenOut" + ( SSDB := #DL_DB , //Datenlisten-DB + SSDW := 0 , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB219" , + OUTDATEN := P#M220.0 , + Position := "MW298" + ); ---- NW 5: Ende --- - BE + L "MB219"; + T #RET_VAL_Datenbank;//Rückmeldung bei Datenbank-Zugriff (Vorstau-DL) + + SPBI ok2; + + U "M219.0"; + S #Error.Datenbank; + +No: SET; + S #Error.Undef_Weiche; + + L 0; + T #Weiche_Nr_from_PLC;//Aktiv-Weiche + + SPA D010; + +ok2: SET; + R #Error.Datenbank; + R #Error.Undef_Weiche; + + L "MW222"; + L 1280 ;//HMOmni-Weiche_Plus? + ==I;//Ja! + SPB Ok2_Mig; + + SPA No; + +Ok2_Mig: L "MW224"; + T #Weichen_DB; + L "MW226"; + T #Weichen_DW; + +NETWORK +TITLE = Neue Datenübergabe an PC ? + UN #Durchlauf1;//1.Durchlauf hat stattgefunden + SPB En03; + +//Ziel-Pointer erzeugen: (PLC-Daten) + L #Weichen_DW; + ITD; + T #AR1Start;//Startwert mit Offset 0 + +//HMI-Reset: +X300: U #Weiche_Visu.Dyn.HMI.Weiche_resetten; + U #Weiche_Visu_old.Dyn.HMI.Weiche_resetten; + O; + UN #Weiche_Visu.Dyn.HMI.Weiche_resetten; + UN #Weiche_Visu_old.Dyn.HMI.Weiche_resetten; + SPB En03 ;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#90 ;//Offset für Weichen-Zeug + SLD 3; + L 0 ;//Damit DBX_Bit 0 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #Weiche_Visu.Dyn.HMI.Weiche_resetten; + AUF DB[ #Weichen_DB] ;//Weiche-DB öffnen + = DBX[ #AR1Zeiger] ;//Weiche-SK-Reset + +En03: NOP 0; + +NETWORK +TITLE = Datenübernahme vom PC + +//Kennung + Datenbytes + L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L 100 ;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//Quelle-Pointer erzeugen: (PLC-Daten) + L #Weichen_DB; + T %LW4;//DB_Nummer + L #Weichen_DW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: (PC-Weiche-Visu-Daten) + L 256; + T %LW14;//DB_Nummer + L 0;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L #RET_VAL_BLKMOV;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Error.BLKMOV;//Error bei Block kopieren + BEB; + +//Ziel-Pointer erzeugen: (Weiche_Visu_old-Daten) + L 256; + T %LW14;//DB_Nummer + L 200 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L #RET_VAL_BLKMOV;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Error.BLKMOV;//Error bei Block kopieren + BEB; + + L #Weiche_Nr_aktiv; + T #Weiche_Nr_from_PLC;//Rückmeldung an PC (Daten stehen an) + + SET; + S #Durchlauf1;//1.Durchlauf hat stattgefunden + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMVollPuffer.awl b/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMVollPuffer.awl index 197ed6e..7a6834a 100644 --- a/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMVollPuffer.awl +++ b/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_HMVollPuffer.awl @@ -1,476 +1,492 @@ -=== FB 157: Visu_HMVollPuffer [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - VollPuffer_Visu : "MHMVollpuffer" // Lager-Bereich für Visualisierung - VollPuffer_Visu_old : "MHMVollpuffer" // COPYRIGHT by Ingenieurbüro A.EmmertOrtsstr.33, D-869925 Fuchstal (Germany)Tel.: 0049(0)8243-960629Version: Omniflow 2100 / 10.2024Schritt 0: Warten auf TrolleySchritt 1: Betriebsart ok/angegeben?Schritt 5: Mit Scanner fahren: Defaultziel ?Schritt 6: Scanner triggernSchritt 7: "DREQ" an PC sendenSchritt 8: Warten auf PC-Antwort Schritt 9: PC-Antwort auswerten Schritt 10: Fahrtrichtung ermittelnSchritt 11: Ausfahren ok ?Schritt 12: Warten auf Pin-Signal Schritt 13: Lagernbereich raus bereit ? Schritt 14: Daten an RausLager übergebenSchritt 15: Lager Mindestzeit öffnen Schritt 16: Trolley ausgefahren ? Schritt 17: Trolley ist draussen Schritt 18: BM wurde vereinzeltSchritt 19: Beladezustand checkenSchritt 20: Schleuse resettenSchritt 21: Reset ist zu Ende - Empty_Visu : Array[1..350] of Int // Bereich für Daten-Löschung - DL_DB : Int // Datenlisten-DB - VollPuffer_Nr_from_PC : Int // PC>PLC: Für diesen Lager Daten bereitstellen - VollPuffer_Nr_from_PLC : Int // PLC>PC: Daten von diesem Lagere aktiv - VollPuffer_Nr_from_VAR : Int // VAR>PLC: Für diesen Lager Daten bereitstellen - VAR_old : Int // VAR>PLC: Für diesen Lager Daten bereitstellen - VAR_Timer : Int // VAR>PLC: Für diesen Lager Daten bereitstellen - RET_VAL_Datenbank : Byte - RET_VAL_BLKMOV : Int - Durchlauf1 : Bool // 1.Durchlauf hat stattgefunden - Error : Struct - Datenbank : Bool - Undef_VollPuffer : Bool - BLKMOV : Bool - Input: - Output: - InOut: - Static: - SAVE : Struct - Weichen_DB : Int // Lagern-FIFO-DB - Weichen_DW : Int // Lagern-FIFO-DW - Puffer : "UDLHMVollPuffer" - None: - Parameter_allg : Struct - Antrieb_Plus_vorhanden : Bool // Schleuse an weiterem Antrieb (Lager) - Input: - Output: - InOut: - Static: - SAVE : Struct - Weichen_DB : Int // Lagern-FIFO-DB - Weichen_DW : Int // Lagern-FIFO-DW - Puffer : "UDLHMVollPuffer" - None: - Parameter_allg : Struct - Antrieb_Plus_vorhanden : Bool // Schleuse an weiterem Antrieb (Lager) - Temp: - Quelle : Any // Zeiger, wo Quell-Daten sind - Ziel : Any // Zeiger, wo Ziel-Daten sind - Lager_DB : Int // Lager-DB - Lager_DW : Int // Lager-DW - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - Lager_Nr_aktiv : Int // Intern: Für diesen Lager Daten bereitstellen - Constant: - ---- NW 1: - --- - L VollPuffer_Nr_from_VAR // Anforderung von Variablentabelle ? - L 0 - >I // Ja ! - JC X010 - - L VollPuffer_Nr_from_PC // Anfoderung von Visualisierung? - L 0 - >I // Ja ! - JC X011 - - L 0 - T VollPuffer_Nr_from_PLC - T VAR_old - T VAR_Timer - - SET - R Error.Datenbank - R Error.Undef_VollPuffer - R Error.BLKMOV - - A Durchlauf1 - R Durchlauf1 // 1.Durchlauf hat stattgefunden - JC D010 - - BEU - -// Daten löschen: -// Kennung + Datenbytes -D010: L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L 350 // Datenwords speichern - T LW2 - T LW12 // Wiederholungen - -// Quelle-Pointer erzeugen: (Empty-Visu) - L 157 - T LW4 // DB_Nummer - L 1400 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: (Lager_Visu_Daten) - L 157 - T LW14 // DB_Nummer - L 0 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - -// Ziel-Pointer erzeugen: (Lager_Visu_old-Daten) - L 157 - T LW14 // DB_Nummer - L 700 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L 0 - T RET_VAL_Datenbank - T RET_VAL_BLKMOV - - BEU - -X010: CAC - T Lager_Nr_aktiv - - L 0 // Anforderung von PC löschen - T VollPuffer_Nr_from_PC // Visualisierung - -// Automatisches Deaktivieren: - L VollPuffer_Nr_from_VAR - L VAR_old // Noch diesselbe VAR-Nr. ? - ==I // Ja ! - A Durchlauf1 - JC Y010 - -// NeuBeginn: - L 3600 // 1 Stunde - T VAR_Timer // Timer neu laden - - L VollPuffer_Nr_from_VAR - T VAR_old // VAR-Nr. speichern - - JU En01 - -// Timer aktiv: -Y010: AN "1s-Impuls" // 1s-Impuls - JC En01 - - L VAR_Timer // Timer - + -1 // 1s von Restzeit abziehen - T VAR_Timer // Timer - - L 0 // abgelaufen ? - >I // Nein ! - JC En01 - -// Timer abgelaufen: - L 0 // Automatisch beaktivieren - T VollPuffer_Nr_from_VAR - T VAR_old - T VAR_Timer // Timer - - JU En01 - -X011: CAC - T Lager_Nr_aktiv - - L 0 // Anforderung von VAR löschen - T VollPuffer_Nr_from_VAR // Visualisierung - T VAR_old - T VAR_Timer - -En01: NOP 0 - - ---- NW 2: Zeiger von gewolltem Lager ermitteln --- - L Lager_Nr_aktiv - T "MW200" // Search-Daten - -CALL FC "DatenOut" (SSDB:=DL_DB, SSDW:=0, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB219", OUTDATEN:=P#M220.0, Position:="MW298") // Datenlisten-DB - - L "MB219" - T RET_VAL_Datenbank // Rückmeldung bei Datenbank-Zugriff (Vorstau-DL) - - JBI ok2 - - A "M219.0" - S Error.Datenbank - -No: SET - S Error.Undef_VollPuffer - - L 0 - T VollPuffer_Nr_from_PLC // Aktiv-Lager - - JU D010 - -ok2: SET - R Error.Datenbank - R Error.Undef_VollPuffer - - L "MW222" - L 1276 // HM-Vollpuffer ? - ==I // Ja! - JC Ok2_Mig - - JU No - -Ok2_Mig: L "MW224" - T Lager_DB - L "MW226" - T Lager_DW - - ---- NW 3: Neue Datenübergabe an PC ? --- - AN Durchlauf1 // 1.Durchlauf hat stattgefunden - JC En03 - -// Ziel-Pointer erzeugen: (PLC-Daten) - L Lager_DW - ITD - T AR1Start // Startwert mit Offset 0 - -// HMI TrolleyID-Input: - L VollPuffer_Visu.Dyn.TrolleyID_Schleuse_IN - L VollPuffer_Visu_old.Dyn.TrolleyID_Schleuse_IN - ==D // Keine Änderung ! - JC X301 - - L AR1Start // Startwert mit Offset 0 - + DINT#76 // Offset für TrolleyID Schleuse - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - L VollPuffer_Visu.Dyn.TrolleyID_Schleuse_IN - OPN DB[Lager_DB] // Lager-DB öffnen - T DBD [AR1Zeiger] // Lager-Zug - -// HMI TrolleyID-Einfahrt: -X301: L VollPuffer_Visu.Dyn.TrolleyID_Einfahrt - L VollPuffer_Visu_old.Dyn.TrolleyID_Einfahrt - ==D // Keine Änderung ! - JC X302 - - L AR1Start // Startwert mit Offset 0 - + DINT#72 // Offset für TrolleyID Einfahrt - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - L VollPuffer_Visu.Dyn.TrolleyID_Einfahrt - OPN DB[Lager_DB] // Lager-DB öffnen - T DBD [AR1Zeiger] - -// ShopGroup_IN: -X302: L VollPuffer_Visu.Dyn.ShopGroup_IN - L VollPuffer_Visu_old.Dyn.ShopGroup_IN - ==D // Keine Änderung ! - JC X303 - - L AR1Start // Startwert mit Offset 0 - + DINT#84 // Offset für ShopGroup_IN - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - L VollPuffer_Visu.Dyn.ShopGroup_IN - OPN DB[Lager_DB] // Lager-DB öffnen - T DBD [AR1Zeiger] - -// ShopGroup_OUT -X303: L VollPuffer_Visu.Dyn.ShopGroup_OUT - L VollPuffer_Visu_old.Dyn.ShopGroup_OUT - ==D // Keine Änderung ! - JC X310 - - L AR1Start // Startwert mit Offset 0 - + DINT#88 // Offset für ShopGroup_OUT - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - L VollPuffer_Visu.Dyn.ShopGroup_OUT - OPN DB[Lager_DB] // Lager-DB öffnen - T DBD [AR1Zeiger] - -// HMI-Schleuse_IN-Reset: -X310: A VollPuffer_Visu.Dyn.HMI.Schleuse_resetten_IN - A VollPuffer_Visu_old.Dyn.HMI.Schleuse_resetten_IN - O - AN VollPuffer_Visu.Dyn.HMI.Schleuse_resetten_IN - AN VollPuffer_Visu_old.Dyn.HMI.Schleuse_resetten_IN - JC X311 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#116 // Offset für Schleusen-Zeug - SLD 3 - L 0 // Damit DBX_Bit 0 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A VollPuffer_Visu.Dyn.HMI.Schleuse_resetten_IN - OPN DB[Lager_DB] // Lager-DB öffnen - = DBX [AR1Zeiger] // Lager-SK-Reset - -// HMI-Schleuse_OUT-Reset: -X311: A VollPuffer_Visu.Dyn.HMI.Schleuse_resetten_OUT - A VollPuffer_Visu_old.Dyn.HMI.Schleuse_resetten_OUT - O - AN VollPuffer_Visu.Dyn.HMI.Schleuse_resetten_OUT - AN VollPuffer_Visu_old.Dyn.HMI.Schleuse_resetten_OUT - JC X312 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#116 // Offset für Schleusen-Zeug - SLD 3 - L 1 // Damit DBX_Bit 1 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A VollPuffer_Visu.Dyn.HMI.Schleuse_resetten_OUT - OPN DB[Lager_DB] // Lager-DB öffnen - = DBX [AR1Zeiger] // Lager-SK-Reset - -// HMI-Lager initialisieren: -X312: A VollPuffer_Visu.Dyn.HMI.Puffer_initialisieren - A VollPuffer_Visu_old.Dyn.HMI.Puffer_initialisieren - O - AN VollPuffer_Visu.Dyn.HMI.Puffer_initialisieren - AN VollPuffer_Visu_old.Dyn.HMI.Puffer_initialisieren - JC X313 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#116 // Offset für Lagern-Zeug - SLD 3 - L 2 // Damit DBX_Bit 2 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A VollPuffer_Visu.Dyn.HMI.Puffer_initialisieren - OPN DB[Lager_DB] // Lager-DB öffnen - = DBX [AR1Zeiger] // Lager-SK-Reset - -// HMI-Lager Einlagern sperren: -X313: A VollPuffer_Visu.Dyn.HMI.Einlagern_gesperrt - A VollPuffer_Visu_old.Dyn.HMI.Einlagern_gesperrt - O - AN VollPuffer_Visu.Dyn.HMI.Einlagern_gesperrt - AN VollPuffer_Visu_old.Dyn.HMI.Einlagern_gesperrt - JC X314 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#116 // Offset für Lagern-Zeug - SLD 3 - L 3 // Damit DBX_Bit 3 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A VollPuffer_Visu.Dyn.HMI.Einlagern_gesperrt - OPN DB[Lager_DB] // Lager-DB öffnen - = DBX [AR1Zeiger] // Lager-SK-Reset - -// HMI-Lager Auslagern sperren: -X314: A VollPuffer_Visu.Dyn.HMI.AusLagern_gesperrt - A VollPuffer_Visu_old.Dyn.HMI.AusLagern_gesperrt - O - AN VollPuffer_Visu.Dyn.HMI.AusLagern_gesperrt - AN VollPuffer_Visu_old.Dyn.HMI.AusLagern_gesperrt - JC X315 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#116 // Offset für Lagern-Zeug - SLD 3 - L 4 // Damit DBX_Bit 4 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A VollPuffer_Visu.Dyn.HMI.AusLagern_gesperrt - OPN DB[Lager_DB] // Lager-DB öffnen - = DBX [AR1Zeiger] // Lager-SK-Reset - -// Alles ausfahren: -X315: A VollPuffer_Visu.Status2.Alles_ausfahren_OUT - A VollPuffer_Visu_old.Status2.Alles_ausfahren_OUT - O - AN VollPuffer_Visu.Status2.Alles_ausfahren_OUT - AN VollPuffer_Visu_old.Status2.Alles_ausfahren_OUT - JC X316 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#29 // Offset Status 2 - SLD 3 - L 4 // Damit DBX_Bit 4 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A VollPuffer_Visu.Status2.Alles_ausfahren_OUT - OPN DB[Lager_DB] // Lager-DB öffnen - = DBX [AR1Zeiger] // Lager-SK-Reset - -// Einen Volltrolley ausfahren: -X316: A VollPuffer_Visu.Dyn.Status.Einen_VollTrolley_ausfahren_OUT - A VollPuffer_Visu_old.Dyn.Status.Einen_VollTrolley_ausfahren_OUT - O - AN VollPuffer_Visu.Dyn.Status.Einen_VollTrolley_ausfahren_OUT - AN VollPuffer_Visu_old.Dyn.Status.Einen_VollTrolley_ausfahren_OUT - JC En03 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#71 // Offset für Status - SLD 3 - L 4 // Damit DBX_Bit 4 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A VollPuffer_Visu.Dyn.Status.Einen_VollTrolley_ausfahren_OUT - OPN DB[Lager_DB] // Lager-DB öffnen - = DBX [AR1Zeiger] // Lager-SK-Reset - -En03: NOP 0 - - ---- NW 4: Datenübernahme vom PC --- -// Kennung + Datenbytes - L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L 350 // Datenwords speichern - T LW2 - T LW12 // Wiederholungen - -// Quelle-Pointer erzeugen: (PLC-Daten) - L Lager_DB - T LW4 // DB_Nummer - L Lager_DW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: (PC-Lager-Visu-Daten) - L 157 - T LW14 // DB_Nummer - L 0 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L RET_VAL_BLKMOV // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Error.BLKMOV // Error bei Block kopieren - BEC - -// Ziel-Pointer erzeugen: (Lager_Visu_old-Daten) - L 157 - T LW14 // DB_Nummer - L 700 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L RET_VAL_BLKMOV // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Error.BLKMOV // Error bei Block kopieren - BEC - - L Lager_Nr_aktiv - T VollPuffer_Nr_from_PLC // Rückmeldung an PC (Daten stehen an) - - SET - S Durchlauf1 // 1.Durchlauf hat stattgefunden - - ---- NW 5: Ende --- - BE +FUNCTION_BLOCK "Visu_HMVollPuffer" +TITLE = Interne Daten in einem Fenster + Lagern-Nr. mit PC visualisieren +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + VollPuffer_Visu : "MHMVollpuffer"; // Lager-Bereich für Visualisierung + VollPuffer_Visu_old : "MHMVollpuffer"; // COPYRIGHT by Ingenieurbüro A.EmmertOrtsstr.33, D-869925 Fuchstal (Germany)Tel.: 0049(0)8243-960629Version: Omniflow 2100 / 10.2024Schritt 0: Warten auf TrolleySchritt 1: Betriebsart ok/angegeben?Schritt 5: Mit Scanner fahren: Defaultziel ?Schritt 6: Scanner triggernSchritt 7: "DREQ" an PC sendenSchritt 8: Warten auf PC-Antwort Schritt 9: PC-Antwort auswerten Schritt 10: Fahrtrichtung ermittelnSchritt 11: Ausfahren ok ?Schritt 12: Warten auf Pin-Signal Schritt 13: Lagernbereich raus bereit ? Schritt 14: Daten an RausLager übergebenSchritt 15: Lager Mindestzeit öffnen Schritt 16: Trolley ausgefahren ? Schritt 17: Trolley ist draussen Schritt 18: BM wurde vereinzeltSchritt 19: Beladezustand checkenSchritt 20: Schleuse resettenSchritt 21: Reset ist zu Ende + Empty_Visu : Array[1..350] of Int; // Bereich für Daten-Löschung + DL_DB : Int; // Datenlisten-DB + VollPuffer_Nr_from_PC : Int; // PC>PLC: Für diesen Lager Daten bereitstellen + VollPuffer_Nr_from_PLC : Int; // PLC>PC: Daten von diesem Lagere aktiv + VollPuffer_Nr_from_VAR : Int; // VAR>PLC: Für diesen Lager Daten bereitstellen + VAR_old : Int; // VAR>PLC: Für diesen Lager Daten bereitstellen + VAR_Timer : Int; // VAR>PLC: Für diesen Lager Daten bereitstellen + RET_VAL_Datenbank : Byte; + RET_VAL_BLKMOV : Int; + Durchlauf1 : Bool; // 1.Durchlauf hat stattgefunden + Error : Struct + Datenbank : Bool; + Undef_VollPuffer : Bool; + BLKMOV : Bool; + END_STRUCT; + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Quell-Daten sind + Ziel : Any; // Zeiger, wo Ziel-Daten sind + Lager_DB : Int; // Lager-DB + Lager_DW : Int; // Lager-DW + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + Lager_Nr_aktiv : Int; // Intern: Für diesen Lager Daten bereitstellen + END_VAR + + +BEGIN +NETWORK +TITLE = Anforderung vom PC ? +// +// + L #VollPuffer_Nr_from_VAR;//Anforderung von Variablentabelle ? + L 0; + >I;//Ja ! + SPB X010; + + L #VollPuffer_Nr_from_PC;//Anfoderung von Visualisierung? + L 0; + >I;//Ja ! + SPB X011; + + L 0; + T #VollPuffer_Nr_from_PLC; + T #VAR_old; + T #VAR_Timer; + + SET; + R #Error.Datenbank; + R #Error.Undef_VollPuffer; + R #Error.BLKMOV; + + U #Durchlauf1; + R #Durchlauf1;//1.Durchlauf hat stattgefunden + SPB D010; + + BEA; + +//Daten löschen: +//Kennung + Datenbytes +D010: L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L 350 ;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//Quelle-Pointer erzeugen: (Empty-Visu) + L 157; + T %LW4;//DB_Nummer + L 1400 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: (Lager_Visu_Daten) + L 157; + T %LW14;//DB_Nummer + L 0;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + +//Ziel-Pointer erzeugen: (Lager_Visu_old-Daten) + L 157; + T %LW14;//DB_Nummer + L 700 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L 0; + T #RET_VAL_Datenbank; + T #RET_VAL_BLKMOV; + + BEA; + +X010: TAK; + T #Lager_Nr_aktiv; + + L 0;//Anforderung von PC löschen + T #VollPuffer_Nr_from_PC;//Visualisierung + +//Automatisches Deaktivieren: + L #VollPuffer_Nr_from_VAR; + L #VAR_old;//Noch diesselbe VAR-Nr. ? + ==I;//Ja ! + U #Durchlauf1; + SPB Y010; + +//NeuBeginn: + L 3600;//1 Stunde + T #VAR_Timer;//Timer neu laden + + L #VollPuffer_Nr_from_VAR; + T #VAR_old;//VAR-Nr. speichern + + SPA En01; + +//Timer aktiv: +Y010: UN "1s-Impuls";//1s-Impuls + SPB En01; + + L #VAR_Timer;//Timer + + -1;//1s von Restzeit abziehen + T #VAR_Timer;//Timer + + L 0;//abgelaufen ? + >I;//Nein ! + SPB En01; + +//Timer abgelaufen: + L 0;//Automatisch beaktivieren + T #VollPuffer_Nr_from_VAR; + T #VAR_old; + T #VAR_Timer;//Timer + + SPA En01; + +X011: TAK; + T #Lager_Nr_aktiv; + + L 0;//Anforderung von VAR löschen + T #VollPuffer_Nr_from_VAR;//Visualisierung + T #VAR_old; + T #VAR_Timer; + +En01: NOP 0; + +NETWORK +TITLE = Zeiger von gewolltem Lager ermitteln + L #Lager_Nr_aktiv; + T "MW200";//Search-Daten + + CALL "DatenOut" + ( SSDB := #DL_DB , //Datenlisten-DB + SSDW := 0 , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB219" , + OUTDATEN := P#M220.0 , + Position := "MW298" + ); + + L "MB219"; + T #RET_VAL_Datenbank;//Rückmeldung bei Datenbank-Zugriff (Vorstau-DL) + + SPBI ok2; + + U "M219.0"; + S #Error.Datenbank; + +No: SET; + S #Error.Undef_VollPuffer; + + L 0; + T #VollPuffer_Nr_from_PLC ;//Aktiv-Lager + + SPA D010; + +ok2: SET; + R #Error.Datenbank; + R #Error.Undef_VollPuffer; + + L "MW222"; + L 1276 ;//HM-Vollpuffer ? + ==I;//Ja! + SPB Ok2_Mig; + + SPA No; + +Ok2_Mig: L "MW224"; + T #Lager_DB; + L "MW226"; + T #Lager_DW; + +NETWORK +TITLE = Neue Datenübergabe an PC ? + UN #Durchlauf1;//1.Durchlauf hat stattgefunden + SPB En03; + +//Ziel-Pointer erzeugen: (PLC-Daten) + L #Lager_DW; + ITD; + T #AR1Start;//Startwert mit Offset 0 + +//HMI TrolleyID-Input: + L #VollPuffer_Visu.Dyn.TrolleyID_Schleuse_IN; + L #VollPuffer_Visu_old.Dyn.TrolleyID_Schleuse_IN; + ==D ;//Keine Änderung ! + SPB X301; + + L #AR1Start;//Startwert mit Offset 0 + + DINT#76 ;//Offset für TrolleyID Schleuse + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + L #VollPuffer_Visu.Dyn.TrolleyID_Schleuse_IN; + AUF DB[ #Lager_DB] ;//Lager-DB öffnen + T DBD[ #AR1Zeiger] ;//Lager-Zug + +//HMI TrolleyID-Einfahrt: +X301: L #VollPuffer_Visu.Dyn.TrolleyID_Einfahrt; + L #VollPuffer_Visu_old.Dyn.TrolleyID_Einfahrt; + ==D ;//Keine Änderung ! + SPB X302; + + L #AR1Start;//Startwert mit Offset 0 + + DINT#72 ;//Offset für TrolleyID Einfahrt + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + L #VollPuffer_Visu.Dyn.TrolleyID_Einfahrt; + AUF DB[ #Lager_DB] ;//Lager-DB öffnen + T DBD[ #AR1Zeiger]; + +//ShopGroup_IN: +X302: L #VollPuffer_Visu.Dyn.ShopGroup_IN; + L #VollPuffer_Visu_old.Dyn.ShopGroup_IN; + ==D ;//Keine Änderung ! + SPB X303; + + L #AR1Start;//Startwert mit Offset 0 + + DINT#84 ;//Offset für ShopGroup_IN + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + L #VollPuffer_Visu.Dyn.ShopGroup_IN; + AUF DB[ #Lager_DB] ;//Lager-DB öffnen + T DBD[ #AR1Zeiger]; + +//ShopGroup_OUT +X303: L #VollPuffer_Visu.Dyn.ShopGroup_OUT; + L #VollPuffer_Visu_old.Dyn.ShopGroup_OUT; + ==D ;//Keine Änderung ! + SPB X310; + + L #AR1Start;//Startwert mit Offset 0 + + DINT#88 ;//Offset für ShopGroup_OUT + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + L #VollPuffer_Visu.Dyn.ShopGroup_OUT; + AUF DB[ #Lager_DB] ;//Lager-DB öffnen + T DBD[ #AR1Zeiger]; + +//HMI-Schleuse_IN-Reset: +X310: U #VollPuffer_Visu.Dyn.HMI.Schleuse_resetten_IN; + U #VollPuffer_Visu_old.Dyn.HMI.Schleuse_resetten_IN; + O; + UN #VollPuffer_Visu.Dyn.HMI.Schleuse_resetten_IN; + UN #VollPuffer_Visu_old.Dyn.HMI.Schleuse_resetten_IN; + SPB X311 ;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#116 ;//Offset für Schleusen-Zeug + SLD 3; + L 0 ;//Damit DBX_Bit 0 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #VollPuffer_Visu.Dyn.HMI.Schleuse_resetten_IN; + AUF DB[ #Lager_DB] ;//Lager-DB öffnen + = DBX[ #AR1Zeiger] ;//Lager-SK-Reset + +//HMI-Schleuse_OUT-Reset: +X311: U #VollPuffer_Visu.Dyn.HMI.Schleuse_resetten_OUT; + U #VollPuffer_Visu_old.Dyn.HMI.Schleuse_resetten_OUT; + O; + UN #VollPuffer_Visu.Dyn.HMI.Schleuse_resetten_OUT; + UN #VollPuffer_Visu_old.Dyn.HMI.Schleuse_resetten_OUT; + SPB X312;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#116 ;//Offset für Schleusen-Zeug + SLD 3; + L 1 ;//Damit DBX_Bit 1 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #VollPuffer_Visu.Dyn.HMI.Schleuse_resetten_OUT; + AUF DB[ #Lager_DB] ;//Lager-DB öffnen + = DBX[ #AR1Zeiger] ;//Lager-SK-Reset + +//HMI-Lager initialisieren: +X312: U #VollPuffer_Visu.Dyn.HMI.Puffer_initialisieren; + U #VollPuffer_Visu_old.Dyn.HMI.Puffer_initialisieren; + O; + UN #VollPuffer_Visu.Dyn.HMI.Puffer_initialisieren; + UN #VollPuffer_Visu_old.Dyn.HMI.Puffer_initialisieren; + SPB X313 ;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#116 ;//Offset für Lagern-Zeug + SLD 3; + L 2 ;//Damit DBX_Bit 2 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #VollPuffer_Visu.Dyn.HMI.Puffer_initialisieren; + AUF DB[ #Lager_DB] ;//Lager-DB öffnen + = DBX[ #AR1Zeiger] ;//Lager-SK-Reset + +//HMI-Lager Einlagern sperren: +X313: U #VollPuffer_Visu.Dyn.HMI.Einlagern_gesperrt; + U #VollPuffer_Visu_old.Dyn.HMI.Einlagern_gesperrt; + O; + UN #VollPuffer_Visu.Dyn.HMI.Einlagern_gesperrt; + UN #VollPuffer_Visu_old.Dyn.HMI.Einlagern_gesperrt; + SPB X314 ;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#116 ;//Offset für Lagern-Zeug + SLD 3; + L 3 ;//Damit DBX_Bit 3 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #VollPuffer_Visu.Dyn.HMI.Einlagern_gesperrt; + AUF DB[ #Lager_DB] ;//Lager-DB öffnen + = DBX[ #AR1Zeiger] ;//Lager-SK-Reset + +//HMI-Lager Auslagern sperren: +X314: U #VollPuffer_Visu.Dyn.HMI.AusLagern_gesperrt; + U #VollPuffer_Visu_old.Dyn.HMI.AusLagern_gesperrt; + O; + UN #VollPuffer_Visu.Dyn.HMI.AusLagern_gesperrt; + UN #VollPuffer_Visu_old.Dyn.HMI.AusLagern_gesperrt; + SPB X315 ;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#116 ;//Offset für Lagern-Zeug + SLD 3; + L 4 ;//Damit DBX_Bit 4 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #VollPuffer_Visu.Dyn.HMI.AusLagern_gesperrt; + AUF DB[ #Lager_DB] ;//Lager-DB öffnen + = DBX[ #AR1Zeiger] ;//Lager-SK-Reset + +//Alles ausfahren: +X315: U #VollPuffer_Visu.Status2.Alles_ausfahren_OUT; + U #VollPuffer_Visu_old.Status2.Alles_ausfahren_OUT; + O; + UN #VollPuffer_Visu.Status2.Alles_ausfahren_OUT; + UN #VollPuffer_Visu_old.Status2.Alles_ausfahren_OUT; + SPB X316 ;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#29 ;//Offset Status 2 + SLD 3; + L 4 ;//Damit DBX_Bit 4 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #VollPuffer_Visu.Status2.Alles_ausfahren_OUT; + AUF DB[ #Lager_DB] ;//Lager-DB öffnen + = DBX[ #AR1Zeiger] ;//Lager-SK-Reset + +//Einen Volltrolley ausfahren: +X316: U #VollPuffer_Visu.Dyn.Status.Einen_VollTrolley_ausfahren_OUT; + U #VollPuffer_Visu_old.Dyn.Status.Einen_VollTrolley_ausfahren_OUT; + O; + UN #VollPuffer_Visu.Dyn.Status.Einen_VollTrolley_ausfahren_OUT; + UN #VollPuffer_Visu_old.Dyn.Status.Einen_VollTrolley_ausfahren_OUT; + SPB En03 ;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#71 ;//Offset für Status + SLD 3; + L 4 ;//Damit DBX_Bit 4 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #VollPuffer_Visu.Dyn.Status.Einen_VollTrolley_ausfahren_OUT; + AUF DB[ #Lager_DB] ;//Lager-DB öffnen + = DBX[ #AR1Zeiger] ;//Lager-SK-Reset + +En03: NOP 0; + +NETWORK +TITLE = Datenübernahme vom PC + +//Kennung + Datenbytes + L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L 350 ;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//Quelle-Pointer erzeugen: (PLC-Daten) + L #Lager_DB; + T %LW4;//DB_Nummer + L #Lager_DW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: (PC-Lager-Visu-Daten) + L 157; + T %LW14;//DB_Nummer + L 0;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L #RET_VAL_BLKMOV;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Error.BLKMOV;//Error bei Block kopieren + BEB; + +//Ziel-Pointer erzeugen: (Lager_Visu_old-Daten) + L 157; + T %LW14;//DB_Nummer + L 700 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L #RET_VAL_BLKMOV;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Error.BLKMOV;//Error bei Block kopieren + BEB; + + L #Lager_Nr_aktiv; + T #VollPuffer_Nr_from_PLC;//Rückmeldung an PC (Daten stehen an) + + SET; + S #Durchlauf1;//1.Durchlauf hat stattgefunden + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_Sorter_Rein.awl b/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_Sorter_Rein.awl index aba9707..05c54b4 100644 --- a/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_Sorter_Rein.awl +++ b/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_Sorter_Rein.awl @@ -1,368 +1,406 @@ -=== FB 151: Visu_Sorter_Rein [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Sep_Visu : "MSepSorterRein" // Sep-Bereich für Visualisierung - Sep_Visu_old : "MSepSorterRein" - Empty_Visu : Array[1..75] of Int // Bereich für Daten-Löschung - DL_DB : Int // Datenlisten-DB - Sep_Nr_from_PC : Int // PC>PLC: Für diesen Sep Daten bereitstellen - Sep_Nr_from_PLC : Int // PLC>PC: Daten von diesem Sepe aktiv - Sep_Nr_from_VAR : Int // VAR>PLC: Für diesen Sep Daten bereitstellen - VAR_old : Int // VAR>PLC: Für diesen Sep Daten bereitstellen - VAR_Timer : Int // VAR>PLC: Für diesen Sep Daten bereitstellen - RET_VAL_Datenbank : Byte - RET_VAL_BLKMOV : Int - Durchlauf1 : Bool // 1.Durchlauf hat stattgefunden - Error : Struct - Datenbank : Bool - Undef_Sep : Bool - BLKMOV : Bool - Temp: - Quelle : Any // Zeiger, wo Quell-Daten sind - Ziel : Any // Zeiger, wo Ziel-Daten sind - Sep_DB : Int // Sep-DB - Sep_DW : Int // Sep-DW - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - Sep_Nr_aktiv : Int // Intern: Für diesen Sep Daten bereitstellen - Constant: - ---- NW 1: - --- - L Sep_Nr_from_VAR // Anforderung von Variablentabelle ? - L 0 - >I // Ja ! - JC X010 - - L Sep_Nr_from_PC // Anfoderung von Visualisierung? - L 0 - >I // Ja ! - JC X011 - - L 0 - T Sep_Nr_from_PLC - T VAR_old - T VAR_Timer - - SET - R Error.Datenbank - R Error.Undef_Sep - R Error.BLKMOV - - A Durchlauf1 - R Durchlauf1 // 1.Durchlauf hat stattgefunden - JC D010 - - BEU - -// Daten löschen: -// Kennung + Datenbytes -D010: L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L 75 // Datenwords speichern - T LW2 - T LW12 // Wiederholungen - -// Quelle-Pointer erzeugen: (Empty-Visu) - L 151 - T LW4 // DB_Nummer - L 300 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: (Sep_Visu_Daten) - L 151 - T LW14 // DB_Nummer - L 0 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - -// Ziel-Pointer erzeugen: (Sep_Visu_old-Daten) - L 151 - T LW14 // DB_Nummer - L 150 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L 0 - T RET_VAL_Datenbank - T RET_VAL_BLKMOV - - BEU - -X010: CAC - T Sep_Nr_aktiv - - L 0 // Anforderung von PC löschen - T Sep_Nr_from_PC // Visualisierung - -// Automatisches Deaktivieren: - L Sep_Nr_from_VAR - L VAR_old // Noch diesselbe VAR-Nr. ? - ==I // Ja ! - A Durchlauf1 - JC Y010 - -// NeuBeginn: - L 3600 // 1 Stunde - T VAR_Timer // Timer neu laden - - L Sep_Nr_from_VAR - T VAR_old // VAR-Nr. speichern - - JU En01 - -// Timer aktiv: -Y010: AN "1s-Impuls" // 1s-Impuls - JC En01 - - L VAR_Timer // Timer - + -1 // 1s von Restzeit abziehen - T VAR_Timer // Timer - - L 0 // abgelaufen ? - >I // Nein ! - JC En01 - -// Timer abgelaufen: - L 0 // Automatisch beaktivieren - T Sep_Nr_from_VAR - T VAR_old - T VAR_Timer // Timer - - JU En01 - -X011: CAC - T Sep_Nr_aktiv - - L 0 // Anforderung von VAR löschen - T Sep_Nr_from_VAR // Visualisierung - T VAR_old - T VAR_Timer - -En01: NOP 0 - - ---- NW 2: Zeiger von gewolltem Sep ermitteln --- - L Sep_Nr_aktiv - T "MW200" // Search-Daten - -CALL FC "DatenOut" (SSDB:=DL_DB, SSDW:=0, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB219", OUTDATEN:=P#M220.0, Position:="MW298") // Datenlisten-DB - - L "MB219" - T RET_VAL_Datenbank // Rückmeldung bei Datenbank-Zugriff (Vorstau-DL) - - JBI ok2 - - A "M219.0" - S Error.Datenbank - -No: SET - S Error.Undef_Sep - - L 0 - T Sep_Nr_from_PLC // Aktiv-Sep - - JU D010 - -ok2: SET - R Error.Datenbank - R Error.Undef_Sep - - L "MW222" - L 176 // Sep Sorter Rein? - ==I // Ja! - JC Ok2_Mig - - JU No - -Ok2_Mig: L "MW224" - T Sep_DB - L "MW226" - T Sep_DW - - ---- NW 3: Neue Datenübergabe an PC ? --- - AN Durchlauf1 // 1.Durchlauf hat stattgefunden - JC En03 - -// Ziel-Pointer erzeugen: (PLC-Daten) - L Sep_DW - ITD - T AR1Start // Startwert mit Offset 0 - -// Default-Ziel: - L Sep_Visu.Separator.Default_Ziel - L Sep_Visu_old.Separator.Default_Ziel - ==I // Keine Änderung ! - JC X300 - - L AR1Start // Startwert mit Offset 0 - + DINT#46 // Offset für DefaultZiel - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - L Sep_Visu.Separator.Default_Ziel - OPN DB[Sep_DB] // Sep-DB öffnen - T DBW [AR1Zeiger] // Sep-Zug - -// Rec-DEST-Ziel: -X300: L Sep_Visu.Dyn.Scanner.Rec_DEST_Ziel - L Sep_Visu_old.Dyn.Scanner.Rec_DEST_Ziel - ==I // Keine Änderung ! - JC X301 - - L AR1Start // Startwert mit Offset 0 - + DINT#106 // Rec-DEST-Ziel - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - L Sep_Visu.Dyn.Scanner.Rec_DEST_Ziel - OPN DB[Sep_DB] // Sep-DB öffnen - T DBW [AR1Zeiger] // Sep-Reservierung - -// Betriebsart-Ziel: -X301: L Sep_Visu.Dyn.Status.Betriebsart_Ziel - L Sep_Visu_old.Dyn.Status.Betriebsart_Ziel - ==I // Keine Änderung ! - JC X302 - - L AR1Start // Startwert mit Offset 0 - + DINT#78 // Betriebsart-Ziel - SLD 3 - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - L Sep_Visu.Dyn.Status.Betriebsart_Ziel - OPN DB[Sep_DB] // Sep-DB öffnen - T DBW [AR1Zeiger] // Sep-Reservierung - -// Betriebsrat Rapidfire: -X302: A Sep_Visu.Dyn.Status.Betriebsart_Art.Rapidfire - A Sep_Visu_old.Dyn.Status.Betriebsart_Art.Rapidfire - O - AN Sep_Visu.Dyn.Status.Betriebsart_Art.Rapidfire - AN Sep_Visu_old.Dyn.Status.Betriebsart_Art.Rapidfire - JC X303 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#76 // Offset für Betriebsart - SLD 3 - L 1 // Damit DBX_Bit 1 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A Sep_Visu.Dyn.Status.Betriebsart_Art.Rapidfire - OPN DB[Sep_DB] // Sep-DB öffnen - = DBX [AR1Zeiger] // Sep-SK-Reset - -// Sep-Reset: -X303: A Sep_Visu.Dyn.Sk.Reset - A Sep_Visu_old.Dyn.Sk.Reset - O - AN Sep_Visu.Dyn.Sk.Reset - AN Sep_Visu_old.Dyn.Sk.Reset - JC X304 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#100 // Offset für SK-Zeug - SLD 3 - L 3 // Damit DBX_Bit 3 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A Sep_Visu.Dyn.Sk.Reset - OPN DB[Sep_DB] // Sep-DB öffnen - = DBX [AR1Zeiger] // Sep-SK-Reset - -// Gesamt-Sorter-Reset: -X304: A Sep_Visu.Dyn.GesamtSorterReset - A Sep_Visu_old.Dyn.GesamtSorterReset - O - AN Sep_Visu.Dyn.GesamtSorterReset - AN Sep_Visu_old.Dyn.GesamtSorterReset - JC En03 // Keine Änderung ! - - L AR1Start // Startwert mit Offset 0 - + DINT#125 // Offset DW125 - SLD 3 - L 2 // Damit DBX_Bit 2 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A Sep_Visu.Dyn.GesamtSorterReset - OPN DB[Sep_DB] // Sep-DB öffnen - = DBX [AR1Zeiger] // Sep-SK-Reset - -En03: NOP 0 - - ---- NW 4: Datenübernahme vom PC --- -// Kennung + Datenbytes - L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L 75 // Datenwords speichern - T LW2 - T LW12 // Wiederholungen - -// Quelle-Pointer erzeugen: (PLC-Daten) - L Sep_DB - T LW4 // DB_Nummer - L Sep_DW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: (PC-Sep-Visu-Daten) - L 151 - T LW14 // DB_Nummer - L 0 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L RET_VAL_BLKMOV // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Error.BLKMOV // Error bei Block kopieren - BEC - -// Ziel-Pointer erzeugen: (Sep_Visu_old-Daten) - L 151 - T LW14 // DB_Nummer - L 150 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L RET_VAL_BLKMOV // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Error.BLKMOV // Error bei Block kopieren - BEC - - L Sep_Nr_aktiv - T Sep_Nr_from_PLC // Rückmeldung an PC (Daten stehen an) - - SET - S Durchlauf1 // 1.Durchlauf hat stattgefunden - - ---- NW 5: Ende --- - BE +FUNCTION_BLOCK "Visu_Sorter_Rein" +TITLE = Interne Daten in einem Fenster + Sep-Nr. mit PC visualisieren +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + Sep_Visu : "MSepSorterRein"; // Sep-Bereich für Visualisierung + Sep_Visu_old : "MSepSorterRein"; + Empty_Visu : Array[1..75] of Int; // Bereich für Daten-Löschung + DL_DB : Int; // Datenlisten-DB + Sep_Nr_from_PC : Int; // PC>PLC: Für diesen Sep Daten bereitstellen + Sep_Nr_from_PLC : Int; // PLC>PC: Daten von diesem Sepe aktiv + Sep_Nr_from_VAR : Int; // VAR>PLC: Für diesen Sep Daten bereitstellen + VAR_old : Int; // VAR>PLC: Für diesen Sep Daten bereitstellen + VAR_Timer : Int; // VAR>PLC: Für diesen Sep Daten bereitstellen + RET_VAL_Datenbank : Byte; + RET_VAL_BLKMOV : Int; + Durchlauf1 : Bool; // 1.Durchlauf hat stattgefunden + Error : Struct + Datenbank : Bool; + Undef_Sep : Bool; + BLKMOV : Bool; + END_STRUCT; + END_VAR + + VAR_TEMP + Quelle : Any; // Zeiger, wo Quell-Daten sind + Ziel : Any; // Zeiger, wo Ziel-Daten sind + Sep_DB : Int; // Sep-DB + Sep_DW : Int; // Sep-DW + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + Sep_Nr_aktiv : Int; // Intern: Für diesen Sep Daten bereitstellen + END_VAR + + +BEGIN +NETWORK +TITLE = Anforderung vom PC ? +// +// + L #Sep_Nr_from_VAR;//Anforderung von Variablentabelle ? + L 0; + >I;//Ja ! + SPB X010; + + L #Sep_Nr_from_PC;//Anfoderung von Visualisierung? + L 0; + >I;//Ja ! + SPB X011; + + L 0; + T #Sep_Nr_from_PLC; + T #VAR_old; + T #VAR_Timer; + + SET; + R #Error.Datenbank; + R #Error.Undef_Sep; + R #Error.BLKMOV; + + U #Durchlauf1; + R #Durchlauf1;//1.Durchlauf hat stattgefunden + SPB D010; + + BEA; + +//Daten löschen: +//Kennung + Datenbytes +D010: L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L 75;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//Quelle-Pointer erzeugen: (Empty-Visu) + L 151; + T %LW4;//DB_Nummer + L 300;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: (Sep_Visu_Daten) + L 151; + T %LW14;//DB_Nummer + L 0;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + +//Ziel-Pointer erzeugen: (Sep_Visu_old-Daten) + L 151; + T %LW14;//DB_Nummer + L 150;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L 0; + T #RET_VAL_Datenbank; + T #RET_VAL_BLKMOV; + + BEA; + +X010: TAK; + T #Sep_Nr_aktiv; + + L 0;//Anforderung von PC löschen + T #Sep_Nr_from_PC;//Visualisierung + +//Automatisches Deaktivieren: + L #Sep_Nr_from_VAR; + L #VAR_old;//Noch diesselbe VAR-Nr. ? + ==I;//Ja ! + U #Durchlauf1; + SPB Y010; + +//NeuBeginn: + L 3600;//1 Stunde + T #VAR_Timer;//Timer neu laden + + L #Sep_Nr_from_VAR; + T #VAR_old;//VAR-Nr. speichern + + SPA En01; + +//Timer aktiv: +Y010: UN "1s-Impuls";//1s-Impuls + SPB En01; + + L #VAR_Timer;//Timer + + -1;//1s von Restzeit abziehen + T #VAR_Timer;//Timer + + L 0;//abgelaufen ? + >I;//Nein ! + SPB En01; + +//Timer abgelaufen: + L 0;//Automatisch beaktivieren + T #Sep_Nr_from_VAR; + T #VAR_old; + T #VAR_Timer;//Timer + + SPA En01; + +X011: TAK; + T #Sep_Nr_aktiv; + + L 0;//Anforderung von VAR löschen + T #Sep_Nr_from_VAR;//Visualisierung + T #VAR_old; + T #VAR_Timer; + +En01: NOP 0; + +NETWORK +TITLE = Zeiger von gewolltem Sep ermitteln + L #Sep_Nr_aktiv; + T "MW200";//Search-Daten + + CALL "DatenOut" + ( SSDB := #DL_DB , //Datenlisten-DB + SSDW := 0 , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB219" , + OUTDATEN := P#M220.0 , + Position := "MW298" + ); + + L "MB219"; + T #RET_VAL_Datenbank;//Rückmeldung bei Datenbank-Zugriff (Vorstau-DL) + + SPBI ok2; + + U "M219.0"; + S #Error.Datenbank; + +No: SET; + S #Error.Undef_Sep; + + L 0; + T #Sep_Nr_from_PLC;//Aktiv-Sep + + SPA D010; + +ok2: SET; + R #Error.Datenbank; + R #Error.Undef_Sep; + + L "MW222"; + L 176;//Sep Sorter Rein? + ==I;//Ja! + SPB Ok2_Mig; + + SPA No; + +Ok2_Mig: L "MW224"; + T #Sep_DB; + L "MW226"; + T #Sep_DW; + +NETWORK +TITLE = Neue Datenübergabe an PC ? + UN #Durchlauf1;//1.Durchlauf hat stattgefunden + SPB En03; + +//Ziel-Pointer erzeugen: (PLC-Daten) + L #Sep_DW; + ITD; + T #AR1Start;//Startwert mit Offset 0 + +//Default-Ziel: + L #Sep_Visu.Separator.Default_Ziel; + L #Sep_Visu_old.Separator.Default_Ziel; + ==I;//Keine Änderung ! + SPB X300; + + L #AR1Start;//Startwert mit Offset 0 + + DINT#46;//Offset für DefaultZiel + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + L #Sep_Visu.Separator.Default_Ziel; + AUF DB[ #Sep_DB];//Sep-DB öffnen + T DBW[ #AR1Zeiger];//Sep-Zug + +//Rec-DEST-Ziel: +X300: L #Sep_Visu.Dyn.Scanner.Rec_DEST_Ziel; + L #Sep_Visu_old.Dyn.Scanner.Rec_DEST_Ziel; + ==I;//Keine Änderung ! + SPB X301; + + L #AR1Start;//Startwert mit Offset 0 + + DINT#106;//Rec-DEST-Ziel + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + L #Sep_Visu.Dyn.Scanner.Rec_DEST_Ziel; + AUF DB[ #Sep_DB];//Sep-DB öffnen + T DBW[ #AR1Zeiger];//Sep-Reservierung + +//Betriebsart-Ziel: +X301: L #Sep_Visu.Dyn.Status.Betriebsart_Ziel; + L #Sep_Visu_old.Dyn.Status.Betriebsart_Ziel; + ==I;//Keine Änderung ! + SPB X302; + + L #AR1Start;//Startwert mit Offset 0 + + DINT#78;//Betriebsart-Ziel + SLD 3; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + L #Sep_Visu.Dyn.Status.Betriebsart_Ziel; + AUF DB[ #Sep_DB];//Sep-DB öffnen + T DBW[ #AR1Zeiger];//Sep-Reservierung + +//Betriebsrat Rapidfire: +X302: U #Sep_Visu.Dyn.Status.Betriebsart_Art.Rapidfire; + U #Sep_Visu_old.Dyn.Status.Betriebsart_Art.Rapidfire; + O; + UN #Sep_Visu.Dyn.Status.Betriebsart_Art.Rapidfire; + UN #Sep_Visu_old.Dyn.Status.Betriebsart_Art.Rapidfire; + SPB X303;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#76;//Offset für Betriebsart + SLD 3; + L 1;//Damit DBX_Bit 1 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #Sep_Visu.Dyn.Status.Betriebsart_Art.Rapidfire; + AUF DB[ #Sep_DB];//Sep-DB öffnen + = DBX[ #AR1Zeiger];//Sep-SK-Reset + +//Sep-Reset: +X303: U #Sep_Visu.Dyn.Sk.Reset; + U #Sep_Visu_old.Dyn.Sk.Reset; + O; + UN #Sep_Visu.Dyn.Sk.Reset; + UN #Sep_Visu_old.Dyn.Sk.Reset; + SPB X304;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#100;//Offset für SK-Zeug + SLD 3; + L 3;//Damit DBX_Bit 3 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #Sep_Visu.Dyn.Sk.Reset; + AUF DB[ #Sep_DB];//Sep-DB öffnen + = DBX[ #AR1Zeiger];//Sep-SK-Reset + +//Gesamt-Sorter-Reset: +X304: U #Sep_Visu.Dyn.GesamtSorterReset; + U #Sep_Visu_old.Dyn.GesamtSorterReset; + O; + UN #Sep_Visu.Dyn.GesamtSorterReset; + UN #Sep_Visu_old.Dyn.GesamtSorterReset; + SPB En03;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#125;//Offset DW125 + SLD 3; + L 2;//Damit DBX_Bit 2 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #Sep_Visu.Dyn.GesamtSorterReset; + AUF DB[ #Sep_DB];//Sep-DB öffnen + = DBX[ #AR1Zeiger];//Sep-SK-Reset + +En03: NOP 0; + +NETWORK +TITLE = Datenübernahme vom PC + +//Kennung + Datenbytes + L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L 75;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//Quelle-Pointer erzeugen: (PLC-Daten) + L #Sep_DB; + T %LW4;//DB_Nummer + L #Sep_DW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: (PC-Sep-Visu-Daten) + L 151; + T %LW14;//DB_Nummer + L 0;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L #RET_VAL_BLKMOV;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Error.BLKMOV;//Error bei Block kopieren + BEB; + +//Ziel-Pointer erzeugen: (Sep_Visu_old-Daten) + L 151; + T %LW14;//DB_Nummer + L 150;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L #RET_VAL_BLKMOV;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Error.BLKMOV;//Error bei Block kopieren + BEB; + + L #Sep_Nr_aktiv; + T #Sep_Nr_from_PLC;//Rückmeldung an PC (Daten stehen an) + + SET; + S #Durchlauf1;//1.Durchlauf hat stattgefunden + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_StartSync_Visu.awl b/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_StartSync_Visu.awl index 971bc5d..20a12db 100644 --- a/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_StartSync_Visu.awl +++ b/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_StartSync_Visu.awl @@ -1,290 +1,328 @@ -=== FB 154: Visu_StartSync_Visu [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - StartSync_Visu : "MStartSync" // StartSync-Bereich für Visualisierung - StartSync_Visu_old : "MStartSync" - Empty_Visu : Array[1..75] of Int // Bereich für Daten-Löschung - DL_DB : Int // Datenlisten-DB - StartSync_Nr_from_PC : Int // PC>PLC: Für diese StartSync Daten bereitstellen - StartSync_Nr_from_PLC : Int // PLC>PC: Daten von diesem StartSynce aktiv - StartSync_Nr_from_VAR : Int // VAR>PLC: Für diese StartSync Daten bereitstellen - VAR_old : Int // VAR>PLC: Für diese StartSync Daten bereitstellen - VAR_Timer : Int // VAR>PLC: Für diese StartSync Daten bereitstellen - RET_VAL_Datenbank : Byte - RET_VAL_BLKMOV : Int - Durchlauf1 : Bool // 1.Durchlauf hat stattgefunden - Error : Struct - Datenbank : Bool - Undef_StartSync : Bool - BLKMOV : Bool - Temp: - Quelle : Any // Zeiger, wo Quell-Daten sind - Ziel : Any // Zeiger, wo Ziel-Daten sind - Weiche_DB : Int // Weiche-DB - Weiche_DW : Int // Weiche-DW - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - StartSync_Nr_aktiv : Int // Intern: Für diese StartSync Daten bereitstellen - Constant: +FUNCTION_BLOCK "Visu_StartSync_Visu" +TITLE = Interne Daten in einem Fenster + Sep-Nr. mit PC visualisieren +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + StartSync_Visu : "MStartSync"; // StartSync-Bereich für Visualisierung + StartSync_Visu_old : "MStartSync"; + Empty_Visu : Array[1..75] of Int; // Bereich für Daten-Löschung + DL_DB : Int; // Datenlisten-DB + StartSync_Nr_from_PC : Int; // PC>PLC: Für diese StartSync Daten bereitstellen + StartSync_Nr_from_PLC : Int; // PLC>PC: Daten von diesem StartSynce aktiv + StartSync_Nr_from_VAR : Int; // VAR>PLC: Für diese StartSync Daten bereitstellen + VAR_old : Int; // VAR>PLC: Für diese StartSync Daten bereitstellen + VAR_Timer : Int; // VAR>PLC: Für diese StartSync Daten bereitstellen + RET_VAL_Datenbank : Byte; + RET_VAL_BLKMOV : Int; + Durchlauf1 : Bool; // 1.Durchlauf hat stattgefunden + Error : Struct + Datenbank : Bool; + Undef_StartSync : Bool; + BLKMOV : Bool; + END_STRUCT; + END_VAR ---- NW 1: - --- - L StartSync_Nr_from_VAR // Anforderung von Variablentabelle ? - L 0 - >I // Ja ! - JC X010 - - L StartSync_Nr_from_PC // Anfoderung von Visualisierung? - L 0 - >I // Ja ! - JC X011 - - L 0 - T StartSync_Nr_from_PLC - T VAR_old - T VAR_Timer - - SET - R Error.Datenbank - R Error.Undef_StartSync - R Error.BLKMOV - - A Durchlauf1 - R Durchlauf1 // 1.Durchlauf hat stattgefunden - JC D010 - - BEU - -// Daten löschen: -// Kennung + Datenbytes -D010: L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L 75 // Datenwords speichern - T LW2 - T LW12 // Wiederholungen - -// Quelle-Pointer erzeugen: (Empty-Visu) - L 154 - T LW4 // DB_Nummer - L 300 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: (Sep_Visu_Daten) - L 154 - T LW14 // DB_Nummer - L 0 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - -// Ziel-Pointer erzeugen: (Sep_Visu_old-Daten) - L 154 - T LW14 // DB_Nummer - L 150 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L 0 - T RET_VAL_Datenbank - T RET_VAL_BLKMOV - - BEU - -X010: CAC - T StartSync_Nr_aktiv - - L 0 // Anforderung von PC löschen - T StartSync_Nr_from_PC // Visualisierung - -// Automatisches Deaktivieren: - L StartSync_Nr_from_VAR - L VAR_old // Noch diesselbe VAR-Nr. ? - ==I // Ja ! - A Durchlauf1 - JC Y010 - -// NeuBeginn: - L 3600 // 1 Stunde - T VAR_Timer // Timer neu laden - - L StartSync_Nr_from_VAR - T VAR_old // VAR-Nr. speichern - - JU En01 - -// Timer aktiv: -Y010: AN "1s-Impuls" // 1s-Impuls - JC En01 - - L VAR_Timer // Timer - + -1 // 1s von Restzeit abziehen - T VAR_Timer // Timer - - L 0 // abgelaufen ? - >I // Nein ! - JC En01 - -// Timer abgelaufen: - L 0 // Automatisch beaktivieren - T StartSync_Nr_from_VAR - T VAR_old - T VAR_Timer // Timer - - JU En01 - -X011: CAC - T StartSync_Nr_aktiv - - L 0 // Anforderung von VAR löschen - T StartSync_Nr_from_VAR // Visualisierung - T VAR_old - T VAR_Timer - -En01: NOP 0 + VAR_TEMP + Quelle : Any; // Zeiger, wo Quell-Daten sind + Ziel : Any; // Zeiger, wo Ziel-Daten sind + Weiche_DB : Int; // Weiche-DB + Weiche_DW : Int; // Weiche-DW + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + StartSync_Nr_aktiv : Int; // Intern: Für diese StartSync Daten bereitstellen + END_VAR ---- NW 2: Zeiger von gewollte Weiche ermitteln --- - L StartSync_Nr_aktiv - T "MW200" // Search-Daten +BEGIN +NETWORK +TITLE = Anforderung vom PC ? +// +// + L #StartSync_Nr_from_VAR;//Anforderung von Variablentabelle ? + L 0; + >I;//Ja ! + SPB X010; -CALL FC "DatenOut" (SSDB:=DL_DB, SSDW:=0, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB219", OUTDATEN:=P#M220.0, Position:="MW298") // Datenlisten-DB + L #StartSync_Nr_from_PC;//Anfoderung von Visualisierung? + L 0; + >I;//Ja ! + SPB X011; - L "MB219" - T RET_VAL_Datenbank // Rückmeldung bei Datenbank-Zugriff (Vorstau-DL) + L 0; + T #StartSync_Nr_from_PLC; + T #VAR_old; + T #VAR_Timer; - JBI ok2 + SET; + R #Error.Datenbank; + R #Error.Undef_StartSync; + R #Error.BLKMOV; - A "M219.0" - S Error.Datenbank + U #Durchlauf1; + R #Durchlauf1;//1.Durchlauf hat stattgefunden + SPB D010; -No: SET - S Error.Undef_StartSync + BEA; - L 0 - T StartSync_Nr_from_PLC // Aktiv-Weiche +//Daten löschen: +//Kennung + Datenbytes +D010: L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L 75;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen - JU D010 +//Quelle-Pointer erzeugen: (Empty-Visu) + L 154; + T %LW4;//DB_Nummer + L 300;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse -ok2: SET - R Error.Datenbank - R Error.Undef_StartSync +//Ziel-Pointer erzeugen: (Sep_Visu_Daten) + L 154; + T %LW14;//DB_Nummer + L 0;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse - L "MW226" - L 177 // StartSync? - ==I // Ja! - JC Ok2_Mig + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); - JU No +//Ziel-Pointer erzeugen: (Sep_Visu_old-Daten) + L 154; + T %LW14;//DB_Nummer + L 150;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse -Ok2_Mig: L "MW222" - T Weiche_DB - L "MW224" - T Weiche_DW + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + L 0; + T #RET_VAL_Datenbank; + T #RET_VAL_BLKMOV; ---- NW 3: Neue Datenübergabe an PC ? --- - AN Durchlauf1 // 1.Durchlauf hat stattgefunden - JC En03 + BEA; -// Ziel-Pointer erzeugen: (PLC-Daten) - L Weiche_DW - ITD - T AR1Start // Startwert mit Offset 0 +X010: TAK; + T #StartSync_Nr_aktiv; -// StartSync-Reset: - A StartSync_Visu.Dyn.Reset - A StartSync_Visu_old.Dyn.Reset - O - AN StartSync_Visu.Dyn.Reset - AN StartSync_Visu_old.Dyn.Reset - JC En03 // Keine Änderung ! + L 0;//Anforderung von PC löschen + T #StartSync_Nr_from_PC;//Visualisierung - L AR1Start // Startwert mit Offset 0 - + DINT#86 // Offset für Status - SLD 3 - L 3 // Damit DBX_Bit 3 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A StartSync_Visu.Dyn.Reset - OPN DB[Weiche_DB] // Sep-DB öffnen - = DBX [AR1Zeiger] // Sep-SK-Reset +//Automatisches Deaktivieren: + L #StartSync_Nr_from_VAR; + L #VAR_old;//Noch diesselbe VAR-Nr. ? + ==I;//Ja ! + U #Durchlauf1; + SPB Y010; -En03: NOP 0 +//NeuBeginn: + L 3600;//1 Stunde + T #VAR_Timer;//Timer neu laden + L #StartSync_Nr_from_VAR; + T #VAR_old;//VAR-Nr. speichern ---- NW 4: Datenübernahme vom PC --- -// Kennung + Datenbytes - L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L 75 // Datenwords speichern - T LW2 - T LW12 // Wiederholungen + SPA En01; -// Quelle-Pointer erzeugen: (PLC-Daten) - L Weiche_DB - T LW4 // DB_Nummer - L Weiche_DW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse +//Timer aktiv: +Y010: UN "1s-Impuls";//1s-Impuls + SPB En01; -// Ziel-Pointer erzeugen: (PC-Sep-Visu-Daten) - L 154 - T LW14 // DB_Nummer - L 0 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse + L #VAR_Timer;//Timer + + -1;//1s von Restzeit abziehen + T #VAR_Timer;//Timer -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern + L 0;//abgelaufen ? + >I;//Nein ! + SPB En01; - L RET_VAL_BLKMOV // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Error.BLKMOV // Error bei Block kopieren - BEC +//Timer abgelaufen: + L 0;//Automatisch beaktivieren + T #StartSync_Nr_from_VAR; + T #VAR_old; + T #VAR_Timer;//Timer -// Ziel-Pointer erzeugen: (Sep_Visu_old-Daten) - L 154 - T LW14 // DB_Nummer - L 150 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse + SPA En01; -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern +X011: TAK; + T #StartSync_Nr_aktiv; - L RET_VAL_BLKMOV // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Error.BLKMOV // Error bei Block kopieren - BEC + L 0;//Anforderung von VAR löschen + T #StartSync_Nr_from_VAR;//Visualisierung + T #VAR_old; + T #VAR_Timer; - L StartSync_Nr_aktiv - T StartSync_Nr_from_PLC // Rückmeldung an PC (Daten stehen an) +En01: NOP 0; - SET - S Durchlauf1 // 1.Durchlauf hat stattgefunden +NETWORK +TITLE = Zeiger von gewollte Weiche ermitteln + L #StartSync_Nr_aktiv; + T "MW200";//Search-Daten + CALL "DatenOut" + ( SSDB := #DL_DB , //Datenlisten-DB + SSDW := 0 , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB219" , + OUTDATEN := P#M220.0 , + Position := "MW298" + ); ---- NW 5: Ende --- - BE + L "MB219"; + T #RET_VAL_Datenbank;//Rückmeldung bei Datenbank-Zugriff (Vorstau-DL) + + SPBI ok2; + + U "M219.0"; + S #Error.Datenbank; + +No: SET; + S #Error.Undef_StartSync; + + L 0; + T #StartSync_Nr_from_PLC;//Aktiv-Weiche + + SPA D010; + +ok2: SET; + R #Error.Datenbank; + R #Error.Undef_StartSync; + + L "MW226"; + L 177;//StartSync? + ==I;//Ja! + SPB Ok2_Mig; + + SPA No; + +Ok2_Mig: L "MW222"; + T #Weiche_DB; + L "MW224"; + T #Weiche_DW; + +NETWORK +TITLE = Neue Datenübergabe an PC ? + UN #Durchlauf1;//1.Durchlauf hat stattgefunden + SPB En03; + +//Ziel-Pointer erzeugen: (PLC-Daten) + L #Weiche_DW; + ITD; + T #AR1Start;//Startwert mit Offset 0 + +//StartSync-Reset: + U #StartSync_Visu.Dyn.Reset; + U #StartSync_Visu_old.Dyn.Reset; + O; + UN #StartSync_Visu.Dyn.Reset; + UN #StartSync_Visu_old.Dyn.Reset; + SPB En03;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#86;//Offset für Status + SLD 3; + L 3;//Damit DBX_Bit 3 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #StartSync_Visu.Dyn.Reset; + AUF DB[ #Weiche_DB];//Sep-DB öffnen + = DBX[ #AR1Zeiger];//Sep-SK-Reset + +En03: NOP 0; + +NETWORK +TITLE = Datenübernahme vom PC + +//Kennung + Datenbytes + L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L 75;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//Quelle-Pointer erzeugen: (PLC-Daten) + L #Weiche_DB; + T %LW4;//DB_Nummer + L #Weiche_DW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: (PC-Sep-Visu-Daten) + L 154; + T %LW14;//DB_Nummer + L 0;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L #RET_VAL_BLKMOV;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Error.BLKMOV;//Error bei Block kopieren + BEB; + +//Ziel-Pointer erzeugen: (Sep_Visu_old-Daten) + L 154; + T %LW14;//DB_Nummer + L 150;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L #RET_VAL_BLKMOV;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Error.BLKMOV;//Error bei Block kopieren + BEB; + + L #StartSync_Nr_aktiv; + T #StartSync_Nr_from_PLC;//Rückmeldung an PC (Daten stehen an) + + SET; + S #Durchlauf1;//1.Durchlauf hat stattgefunden + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_Weiche_Sorter.awl b/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_Weiche_Sorter.awl index f606a12..c4caedb 100644 --- a/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_Weiche_Sorter.awl +++ b/=A01+UH07-KF00/Programmbausteine/Visualisierung/Visu_Weiche_Sorter.awl @@ -1,308 +1,346 @@ -=== FB 153: Visu_Weiche_Sorter [STL] === -INTERFACE: - Input: - Output: - InOut: - Static: - Weiche_Visu : "MWeiche_Sorter" // Weiche-Bereich für Visualisierung - Weiche_Visu_old : "MWeiche_Sorter" - Empty_Visu : Array[1..75] of Int // Bereich für Daten-Löschung - DL_DB : Int // Datenlisten-DB - Weiche_Nr_from_PC : Int // PC>PLC: Für diese Weiche Daten bereitstellen - Weiche_Nr_from_PLC : Int // PLC>PC: Daten von diesem Weichee aktiv - Weiche_Nr_from_VAR : Int // VAR>PLC: Für diese Weiche Daten bereitstellen - VAR_old : Int // VAR>PLC: Für diese Weiche Daten bereitstellen - VAR_Timer : Int // VAR>PLC: Für diese Weiche Daten bereitstellen - RET_VAL_Datenbank : Byte - RET_VAL_BLKMOV : Int - Durchlauf1 : Bool // 1.Durchlauf hat stattgefunden - Error : Struct - Datenbank : Bool - Undef_Weiche : Bool - BLKMOV : Bool - Temp: - Quelle : Any // Zeiger, wo Quell-Daten sind - Ziel : Any // Zeiger, wo Ziel-Daten sind - Weiche_DB : Int // Weiche-DB - Weiche_DW : Int // Weiche-DW - AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) - AR1Start : DInt // Startwert mit Offset 0 - Weiche_Nr_aktiv : Int // Intern: Für diese Weiche Daten bereitstellen - Constant: +FUNCTION_BLOCK "Visu_Weiche_Sorter" +TITLE = Interne Daten in einem Fenster + Weichen-Nr. mit PC visualisiere +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : IBAE +VERSION : 0.1 + VAR + Weiche_Visu : "MWeiche_Sorter"; // Weiche-Bereich für Visualisierung + Weiche_Visu_old : "MWeiche_Sorter"; + Empty_Visu : Array[1..75] of Int; // Bereich für Daten-Löschung + DL_DB : Int; // Datenlisten-DB + Weiche_Nr_from_PC : Int; // PC>PLC: Für diese Weiche Daten bereitstellen + Weiche_Nr_from_PLC : Int; // PLC>PC: Daten von diesem Weichee aktiv + Weiche_Nr_from_VAR : Int; // VAR>PLC: Für diese Weiche Daten bereitstellen + VAR_old : Int; // VAR>PLC: Für diese Weiche Daten bereitstellen + VAR_Timer : Int; // VAR>PLC: Für diese Weiche Daten bereitstellen + RET_VAL_Datenbank : Byte; + RET_VAL_BLKMOV : Int; + Durchlauf1 : Bool; // 1.Durchlauf hat stattgefunden + Error : Struct + Datenbank : Bool; + Undef_Weiche : Bool; + BLKMOV : Bool; + END_STRUCT; + END_VAR ---- NW 1: - --- - L Weiche_Nr_from_VAR // Anforderung von Variablentabelle ? - L 0 - >I // Ja ! - JC X010 - - L Weiche_Nr_from_PC // Anfoderung von Visualisierung? - L 0 - >I // Ja ! - JC X011 - - L 0 - T Weiche_Nr_from_PLC - T VAR_old - T VAR_Timer - - SET - R Error.Datenbank - R Error.Undef_Weiche - R Error.BLKMOV - - A Durchlauf1 - R Durchlauf1 // 1.Durchlauf hat stattgefunden - JC D010 - - BEU - -// Daten löschen: -// Kennung + Datenbytes -D010: L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L 100 // Datenwords speichern - T LW2 - T LW12 // Wiederholungen - -// Quelle-Pointer erzeugen: (Empty-Visu) - L 153 - T LW4 // DB_Nummer - L 400 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse - -// Ziel-Pointer erzeugen: (Weichen_Visu_Daten) - L 153 - T LW14 // DB_Nummer - L 0 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - -// Ziel-Pointer erzeugen: (Weichen_Visu_old-Daten) - L 153 - T LW14 // DB_Nummer - L 200 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse - -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern - - L 0 - T RET_VAL_Datenbank - T RET_VAL_BLKMOV - - BEU - -X010: CAC - T Weiche_Nr_aktiv - - L 0 // Anforderung von PC löschen - T Weiche_Nr_from_PC // Visualisierung - -// Automatisches Deaktivieren: - L Weiche_Nr_from_VAR - L VAR_old // Noch diesselbe VAR-Nr. ? - ==I // Ja ! - A Durchlauf1 - JC Y010 - -// NeuBeginn: - L 3600 // 1 Stunde - T VAR_Timer // Timer neu laden - - L Weiche_Nr_from_VAR - T VAR_old // VAR-Nr. speichern - - JU En01 - -// Timer aktiv: -Y010: AN "1s-Impuls" // 1s-Impuls - JC En01 - - L VAR_Timer // Timer - + -1 // 1s von Restzeit abziehen - T VAR_Timer // Timer - - L 0 // abgelaufen ? - >I // Nein ! - JC En01 - -// Timer abgelaufen: - L 0 // Automatisch beaktivieren - T Weiche_Nr_from_VAR - T VAR_old - T VAR_Timer // Timer - - JU En01 - -X011: CAC - T Weiche_Nr_aktiv - - L 0 // Anforderung von VAR löschen - T Weiche_Nr_from_VAR // Visualisierung - T VAR_old - T VAR_Timer - -En01: NOP 0 + VAR_TEMP + Quelle : Any; // Zeiger, wo Quell-Daten sind + Ziel : Any; // Zeiger, wo Ziel-Daten sind + Weiche_DB : Int; // Weiche-DB + Weiche_DW : Int; // Weiche-DW + AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes) + AR1Start : DInt; // Startwert mit Offset 0 + Weiche_Nr_aktiv : Int; // Intern: Für diese Weiche Daten bereitstellen + END_VAR ---- NW 2: Zeiger von gewollte Weiche ermitteln --- - L Weiche_Nr_aktiv - T "MW200" // Search-Daten +BEGIN +NETWORK +TITLE = Anforderung vom PC ? +// +// + L #Weiche_Nr_from_VAR;//Anforderung von Variablentabelle ? + L 0; + >I;//Ja ! + SPB X010; -CALL FC "DatenOut" (SSDB:=DL_DB, SSDW:=0, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB219", OUTDATEN:=P#M220.0, Position:="MW298") // Datenlisten-DB + L #Weiche_Nr_from_PC;//Anfoderung von Visualisierung? + L 0; + >I;//Ja ! + SPB X011; - L "MB219" - T RET_VAL_Datenbank // Rückmeldung bei Datenbank-Zugriff (Vorstau-DL) + L 0; + T #Weiche_Nr_from_PLC; + T #VAR_old; + T #VAR_Timer; - JBI ok2 + SET; + R #Error.Datenbank; + R #Error.Undef_Weiche; + R #Error.BLKMOV; - A "M219.0" - S Error.Datenbank + U #Durchlauf1; + R #Durchlauf1;//1.Durchlauf hat stattgefunden + SPB D010; -No: SET - S Error.Undef_Weiche + BEA; - L 0 - T Weiche_Nr_from_PLC // Aktiv-Weiche +//Daten löschen: +//Kennung + Datenbytes +D010: L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L 100 ;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen - JU D010 +//Quelle-Pointer erzeugen: (Empty-Visu) + L 153; + T %LW4;//DB_Nummer + L 400 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse -ok2: SET - R Error.Datenbank - R Error.Undef_Weiche +//Ziel-Pointer erzeugen: (Weichen_Visu_Daten) + L 153; + T %LW14;//DB_Nummer + L 0;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse - L "MW226" - L 178 // Weiche Sorter? - ==I // Ja! - JC Ok2_Mig + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); - JU No +//Ziel-Pointer erzeugen: (Weichen_Visu_old-Daten) + L 153; + T %LW14;//DB_Nummer + L 200 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse -Ok2_Mig: L "MW222" - T Weiche_DB - L "MW224" - T Weiche_DW + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + L 0; + T #RET_VAL_Datenbank; + T #RET_VAL_BLKMOV; ---- NW 3: Neue Datenübergabe an PC ? --- - AN Durchlauf1 // 1.Durchlauf hat stattgefunden - JC En03 + BEA; -// Ziel-Pointer erzeugen: (PLC-Daten) - L Weiche_DW - ITD - T AR1Start // Startwert mit Offset 0 +X010: TAK; + T #Weiche_Nr_aktiv; -// Ohne Verklemm-Kontrolle - A Weiche_Visu.Dyn.Ohne_VerklemmKontrolle - A Weiche_Visu_old.Dyn.Ohne_VerklemmKontrolle - O - AN Weiche_Visu.Dyn.Ohne_VerklemmKontrolle - AN Weiche_Visu_old.Dyn.Ohne_VerklemmKontrolle - JC X301 // Keine Änderung ! + L 0;//Anforderung von PC löschen + T #Weiche_Nr_from_PC;//Visualisierung - L AR1Start // Startwert mit Offset 0 - + DINT#92 // Offset für Status - SLD 3 - L 6 // Damit DBX_Bit 6 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A Weiche_Visu.Dyn.Ohne_VerklemmKontrolle - OPN DB[Weiche_DB] // Sep-DB öffnen - = DBX [AR1Zeiger] // Sep-SK-Reset +//Automatisches Deaktivieren: + L #Weiche_Nr_from_VAR; + L #VAR_old;//Noch diesselbe VAR-Nr. ? + ==I;//Ja ! + U #Durchlauf1; + SPB Y010; -// Weichen-Reset: -X301: A Weiche_Visu.Dyn.Status.Reset - A Weiche_Visu_old.Dyn.Status.Reset - O - AN Weiche_Visu.Dyn.Status.Reset - AN Weiche_Visu_old.Dyn.Status.Reset - JC En03 // Keine Änderung ! +//NeuBeginn: + L 3600;//1 Stunde + T #VAR_Timer;//Timer neu laden - L AR1Start // Startwert mit Offset 0 - + DINT#74 // Offset für Status - SLD 3 - L 7 // Damit DBX_Bit 7 - OD - T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) - A Weiche_Visu.Dyn.Status.Reset - OPN DB[Weiche_DB] // Weichen-DB öffnen - = DBX [AR1Zeiger] // Weichen-SK-Reset + L #Weiche_Nr_from_VAR; + T #VAR_old;//VAR-Nr. speichern -En03: NOP 0 + SPA En01; +//Timer aktiv: +Y010: UN "1s-Impuls";//1s-Impuls + SPB En01; ---- NW 4: Datenübernahme vom PC --- -// Kennung + Datenbytes - L 16#1004 // Kennung 10 + Word=04 - T LW0 - T LW10 // Any-Kennung, Datentyp - L 100 // Datenwords speichern - T LW2 - T LW12 // Wiederholungen + L #VAR_Timer;//Timer + + -1;//1s von Restzeit abziehen + T #VAR_Timer;//Timer -// Quelle-Pointer erzeugen: (PLC-Daten) - L Weiche_DB - T LW4 // DB_Nummer - L Weiche_DW // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD6 // Kennung, Adresse + L 0;//abgelaufen ? + >I;//Nein ! + SPB En01; -// Ziel-Pointer erzeugen: (PC-Weichen-Visu-Daten) - L 153 - T LW14 // DB_Nummer - L 0 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse +//Timer abgelaufen: + L 0;//Automatisch beaktivieren + T #Weiche_Nr_from_VAR; + T #VAR_old; + T #VAR_Timer;//Timer -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern + SPA En01; - L RET_VAL_BLKMOV // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Error.BLKMOV // Error bei Block kopieren - BEC +X011: TAK; + T #Weiche_Nr_aktiv; -// Ziel-Pointer erzeugen: (Weichen_Visu_old-Daten) - L 153 - T LW14 // DB_Nummer - L 200 // Adresse - SLD 3 - L 16#8400_0000 // Kennung: Daten - OD - T LD16 // Kennung, Adresse + L 0;//Anforderung von VAR löschen + T #Weiche_Nr_from_VAR;//Visualisierung + T #VAR_old; + T #VAR_Timer; -CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RET_VAL_BLKMOV, DSTBLK:=Ziel) // Datenliste-Daten speichern +En01: NOP 0; - L RET_VAL_BLKMOV // Rückmeldung - L 0 // Fehler vorhanden ? - <>I // Ja ! - = Error.BLKMOV // Error bei Block kopieren - BEC +NETWORK +TITLE = Zeiger von gewollte Weiche ermitteln + L #Weiche_Nr_aktiv; + T "MW200";//Search-Daten - L Weiche_Nr_aktiv - T Weiche_Nr_from_PLC // Rückmeldung an PC (Daten stehen an) + CALL "DatenOut" + ( SSDB := #DL_DB , //Datenlisten-DB + SSDW := 0 , + PARA := WORD#16#0000 , + SEARCHDATEN := P#M200.0 , + RE_VAL := "MB219" , + OUTDATEN := P#M220.0 , + Position := "MW298" + ); - SET - S Durchlauf1 // 1.Durchlauf hat stattgefunden + L "MB219"; + T #RET_VAL_Datenbank;//Rückmeldung bei Datenbank-Zugriff (Vorstau-DL) + SPBI ok2; ---- NW 5: Ende --- - BE + U "M219.0"; + S #Error.Datenbank; + +No: SET; + S #Error.Undef_Weiche; + + L 0; + T #Weiche_Nr_from_PLC;//Aktiv-Weiche + + SPA D010; + +ok2: SET; + R #Error.Datenbank; + R #Error.Undef_Weiche; + + L "MW226"; + L 178;//Weiche Sorter? + ==I;//Ja! + SPB Ok2_Mig; + + SPA No; + +Ok2_Mig: L "MW222"; + T #Weiche_DB; + L "MW224"; + T #Weiche_DW; + +NETWORK +TITLE = Neue Datenübergabe an PC ? + UN #Durchlauf1;//1.Durchlauf hat stattgefunden + SPB En03; + +//Ziel-Pointer erzeugen: (PLC-Daten) + L #Weiche_DW; + ITD; + T #AR1Start;//Startwert mit Offset 0 + +//Ohne Verklemm-Kontrolle + U #Weiche_Visu.Dyn.Ohne_VerklemmKontrolle; + U #Weiche_Visu_old.Dyn.Ohne_VerklemmKontrolle; + O; + UN #Weiche_Visu.Dyn.Ohne_VerklemmKontrolle; + UN #Weiche_Visu_old.Dyn.Ohne_VerklemmKontrolle; + SPB X301;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#92;//Offset für Status + SLD 3; + L 6;//Damit DBX_Bit 6 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #Weiche_Visu.Dyn.Ohne_VerklemmKontrolle; + AUF DB[ #Weiche_DB];//Sep-DB öffnen + = DBX[ #AR1Zeiger];//Sep-SK-Reset + +//Weichen-Reset: +X301: U #Weiche_Visu.Dyn.Status.Reset; + U #Weiche_Visu_old.Dyn.Status.Reset; + O; + UN #Weiche_Visu.Dyn.Status.Reset; + UN #Weiche_Visu_old.Dyn.Status.Reset; + SPB En03;//Keine Änderung ! + + L #AR1Start;//Startwert mit Offset 0 + + DINT#74;//Offset für Status + SLD 3; + L 7;//Damit DBX_Bit 7 + OD; + T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes) + U #Weiche_Visu.Dyn.Status.Reset; + AUF DB[ #Weiche_DB];//Weichen-DB öffnen + = DBX[ #AR1Zeiger];//Weichen-SK-Reset + +En03: NOP 0; + +NETWORK +TITLE = Datenübernahme vom PC + +//Kennung + Datenbytes + L 16#1004;//Kennung 10 + Word=04 + T %LW0; + T %LW10;//Any-Kennung, Datentyp + L 100 ;//Datenwords speichern + T %LW2; + T %LW12;//Wiederholungen + +//Quelle-Pointer erzeugen: (PLC-Daten) + L #Weiche_DB; + T %LW4;//DB_Nummer + L #Weiche_DW;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD6;//Kennung, Adresse + +//Ziel-Pointer erzeugen: (PC-Weichen-Visu-Daten) + L 153; + T %LW14;//DB_Nummer + L 0;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L #RET_VAL_BLKMOV;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Error.BLKMOV;//Error bei Block kopieren + BEB; + +//Ziel-Pointer erzeugen: (Weichen_Visu_old-Daten) + L 153; + T %LW14;//DB_Nummer + L 200 ;//Adresse + SLD 3; + L 16#8400_0000;//Kennung: Daten + OD; + T %LD16;//Kennung, Adresse + + CALL BLKMOV//Datenliste-Daten speichern + {blk_type := 'Variant'} + ( SRCBLK := #Quelle , + RET_VAL := #RET_VAL_BLKMOV , + DSTBLK := #Ziel + ); + + L #RET_VAL_BLKMOV;//Rückmeldung + L 0;//Fehler vorhanden ? + <>I;//Ja ! + = #Error.BLKMOV;//Error bei Block kopieren + BEB; + + L #Weiche_Nr_aktiv; + T #Weiche_Nr_from_PLC;//Rückmeldung an PC (Daten stehen an) + + SET; + S #Durchlauf1;//1.Durchlauf hat stattgefunden + +NETWORK +TITLE = Ende + BE; + +END_FUNCTION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/_All/CYC_INT8_(10ms).awl b/=A01+UH07-KF00/Programmbausteine/_All/CYC_INT8_(10ms).awl index 37e4987..a6f60bd 100644 --- a/=A01+UH07-KF00/Programmbausteine/_All/CYC_INT8_(10ms).awl +++ b/=A01+UH07-KF00/Programmbausteine/_All/CYC_INT8_(10ms).awl @@ -1,68 +1,77 @@ -=== OB 35: CYC_INT8_(10ms) [STL] === -INTERFACE: - Temp: - OB35_EV_CLASS : Byte // Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1) - OB35_STRT_INF : Byte // 16#36 (OB 35 has started) - OB35_PRIORITY : Byte // Priority of OB Execution - OB35_OB_NUMBR : Byte // 35 (Organization block 35, OB35) - OB35_RESERVED_1 : Byte // Reserved for system - OB35_RESERVED_2 : Byte // Reserved for system - OB35_PHASE_OFFSET : Word // Phase offset (msec) - OB35_RESERVED_3 : Int // Reserved for system - OB35_EXC_FREQ : Int // Frequency of execution (msec) - OB35_DATE_TIME : Date_And_Time // Date and time OB35 started - Save1 : DInt - Save2 : DInt - Constant: - ---- NW 1: AR1 und AR2 sichern --- - TAR1 - T Save1 - TAR2 - T Save2 +ORGANIZATION_BLOCK "CYC_INT8_(10ms)" +TITLE = "Cyclic Interrupt" +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 + VAR_TEMP + OB35_EV_CLASS : Byte; // Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1) + OB35_STRT_INF : Byte; // 16#36 (OB 35 has started) + OB35_PRIORITY : Byte; // Priority of OB Execution + OB35_OB_NUMBR : Byte; // 35 (Organization block 35, OB35) + OB35_RESERVED_1 : Byte; // Reserved for system + OB35_RESERVED_2 : Byte; // Reserved for system + OB35_PHASE_OFFSET : Word; // Phase offset (msec) + OB35_RESERVED_3 : Int; // Reserved for system + OB35_EXC_FREQ : Int; // Frequency of execution (msec) + OB35_DATE_TIME : Date_And_Time; // Date and time OB35 started + Save1 : DInt; + Save2 : DInt; + END_VAR ---- NW 2: Sensoren mit kurzen Imuls --- -// / L "PEB112":P -// / T "PEB112" -// / U "TascheOK_M0051" -// / S "DBereich"."Fast-Sensors".B1123 +BEGIN +NETWORK +TITLE = AR1 und AR2 sichern + TAR1; + T #Save1; + TAR2; + T #Save2; +NETWORK +TITLE = Sensoren mit kurzen Imuls ---- NW 3: 10ms Impuls --- - L "MW38" - + 1 // 10ms-Takte aufaddieren - T "MW38" +/// L "PEB112":P +/// T "PEB112" +/// U "TascheOK_M0051" +/// S "DBereich"."Fast-Sensors".B1123 - CLR - CU "Z35" +NETWORK +TITLE = 10ms Impuls + L "MW38"; + + 1;//10ms-Takte aufaddieren + T "MW38"; - SET - CU "Z35" + CLR; + ZV "Z35"; - L "Z35" - L 10 - Vollpuffer --- -CALL FC "HWtoOB_Bereich" - - ---- NW 14: 1_Vollpuffer --- -CALL FC "VP_Bereich" - - ---- NW 15: 2_Vollpuffer > Entnahmepuffer --- -CALL FC "VPtoEP_Bereich" - - ---- NW 16: 3_Entnahmepuffer --- -CALL FC "EP_Bereich" - - ---- NW 17: 4_ Entnahmepuffer > Leerpuffer --- -CALL FC "EPtoLP_Bereich" - - ---- NW 18: 5_Leerpuffer --- - L "DLLeerPuffer_ausfahren".Datenlistenkopf.AnzahlEintraege - L 4 // Falls mehr oder gleich Puffer zum Ausfahren, dann kein Saugmodus - T "DLeerPufferStrecken".SaugModus.Ok_Anzahl - - L "DLLeerPuffer_leer".Datenlistenkopf.AnzahlEintraege - L 1 // Falls mehr oder gleich Leerpuffer, dann kein Durchfahrmodus - T "DLeerPufferStrecken".DurchfahrModus.Ok_Anzahl - -CALL FC "LP_Bereich" - - ---- NW 19: 6_Leerpuffer > Highway --- -CALL FC "LPtoHW_Bereich" - - ---- NW 20: Visu-Zeug --- -CALL FB "Visu_Sorter_Rein" , - -CALL FB "Visu_Weiche_Sorter" , - -CALL FB "Visu_StartSync_Visu" , - -CALL FB "Visu_HMOmniSchleuse" , - -CALL FB "Visu_HMOmniSchleuse_Plus" , - -CALL FB "Visu_HMOmniBereich_Plus" , - -CALL FB "Visu_HMOmniWeiche_Plus" , - -CALL FB "Visu_HMVollPuffer" , - -CALL FB "Visu_HMLeerPuffer" , - -CALL FB "Visu_CheckTrolley" , - - ---- NW 21: Lampentest --- -CALL FC "LTest" - - ---- NW 22: Ausgang ansteuern --- - A "Clock_0.5Hz" - = "M1000.0" - -CALL FC "Set_Output" (Enable:="M1000.1", Status:="M1000.0", OutByte:="MD1002", OutBit:="MW1006") - - ---- NW 23: Daten an UH06/AMR senden --- - A "DSchnittstelle_zu_AMR".To_UH06.MA0203_A_vor - = "INTERFACE_TO_UH06_Byte1.x0" - A "DSchnittstelle_zu_AMR".To_UH06.MA0203_A_start - = "INTERFACE_TO_UH06_Byte1.x1" - A "DSchnittstelle_zu_AMR".To_UH06.MA0200_kein_Stau - = "INTERFACE_TO_UH06_Byte1.x2" - A "DSchnittstelle_zu_AMR".To_UH06.MA0200_aktiv - = "INTERFACE_TO_UH06_Byte1.x3" - A "DSchnittstelle_zu_AMR".To_UH06.BG3724_aktiv - = "INTERFACE_TO_UH06_Byte1.x4" - - ---- NW 24: Daten an Host senden --- -CALL FB "Daten_Host_senden" , - - ---- NW 25: Ende --- - BE - - ---- NW 26: Daten in SendFifo schreiben --- - A "M83.1" - R "M83.1" - JCN nix - -CALL FB "Daten_in_SendFIFO_speichern" , (TelegrammKennung[1]:='B', TelegrammKennung[2]:='2', TelegrammKennung[3]:='C', TelegrammKennung[4]:='D', TelegrammKennung[5]:='E', TelegrammKennung[6]:='F', TelegrammKennung[7]:='G', TelegrammKennung[8]:='I', TelegrammKennung[9]:='J', TelegrammKennung[10]:='K', TrolleyID:=DINT#4711, StationsNr:=13, Puffer_LinienNr:=7, StoreGroup:=DINT#0815, Status_1_Int:=83, Status_2_Bit[0]:=1, Status_2_Bit[1]:=0, Status_2_Bit[2]:=1, Status_2_Bit[3]:=0, Status_2_Bit[4]:=1, Status_2_Bit[5]:=0, Status_2_Bit[6]:=1, Status_2_Bit[7]:=1, Reserve[1]_Int:=62, Reserve[2]_Int:=63, Port:=2, Ret_Val_FIFO_IN:="MB199", Error:="M83.0") - -nix: NOP 0 - - ---- NW 27: Test mit DL1000 --- - L "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse - - A "M83.0" - R "M83.0" - JCN more - -CALL FC "Trolleydaten_löschen" (Gesamt_Trolley_DL:=1000, TrolleyID:="DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse) - -more: A "M83.1" - R "M83.1" - JCN ready - -CALL FC "Trolleydaten_neu_anlegen" (Gesamt_Trolley_DL:=1000, TrolleyID:="DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse, Endziel:=16#B000, ShopGroup:=DINT#-1) - -CALL FC "Trolley_DL_Neue_Pos" (Gesamt_Trolley_DL:=1000, TrolleyID:="DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse, Position:=16#3323, ShopGroup:=-1, Err:="M199.0") - - -ready: NOP 0 - - - BEU - - ---- NW 28: Eingang ansteuern --- -CALL FC "Set_Input" (Enable:="M2000.1", Status:="M2000.0", InByte:="MD2002", InBit:="MW2006") - - ---- NW 29: Ausgang ansteuern --- - A "Clock_1Hz" - = "M1000.0" - -CALL FC "Set_Output" (Enable:="M1000.1", Status:="M1000.0", OutByte:="MD1002", OutBit:="MW1006") - - ---- NW 30: Teachen Sorter LP --- -// Nach Teach-Ergebnis anhalten !: - L "DLP_Sorter".Sync_BG3306.Abstands_Ink - L DINT#0 - <>D - A "DLP_Sorter".Sync_BG3306.Dyn.Status.TeachModus_Aktiv - A "DLP_Sorter".Sync_BG3306.Dyn.Status.MoreTeach - A "M900.0" - R "M900.0" - - A "M900.0" - AN "DLP_Sorter".Sync_BG3306.Dyn.Error.Keine_TeachPktdaten - = "MB3305" - = "MA0064" // Zusätzlich im Lastbaustein EP>LP_Antriebe, da Aufruf vor Sorter-FB - - ---- NW 31: Teachen Sorter EP --- -// Nach Teach-Ergebnis anhalten !: - L "DEP_Sorter".Sync_BG4527.Abstands_Ink - L DINT#0 - <>D - A "DEP_Sorter".Sync_BG4527.Dyn.Status.TeachModus_Aktiv - A "DEP_Sorter".Sync_BG4527.Dyn.Status.MoreTeach - A "M902.0" - R "M902.0" - - A "M902.0" - AN "DEP_Sorter".Sync_BG4527.Dyn.Error.Keine_TeachPktdaten - = "MB4503" - = "MA0325" // Zusätzlich im Lastbaustein VP>EP_Antriebe, da Aufruf vor Sorter-FB - - ---- NW 32: Teachen Sorter VP A --- -// Nach Teach-Ergebnis anhalten !: - L "DVP_Sorter_A".Sync_BG3120.Abstands_Ink - L DINT#0 - <>D - A "DVP_Sorter_A".Sync_BG3120.Dyn.Status.TeachModus_Aktiv - A "DVP_Sorter_A".Sync_BG3120.Dyn.Status.MoreTeach - A "M901.1" - R "M901.1" - - A "M901.1" - AN "DVP_Sorter_A".Sync_BG3120.Dyn.Error.Keine_TeachPktdaten - = "MB3121" - = "MA0144" - = "MA0145" - = "MA0152" - - ---- NW 33: Teachen Sorter VP B --- -// Nach Teach-Ergebnis anhalten !: - L "DVP_Sorter_B".Sync_BG3003.Abstands_Ink - L DINT#0 - <>D - A "DVP_Sorter_B".Sync_BG3003.Dyn.Status.TeachModus_Aktiv - A "DVP_Sorter_B".Sync_BG3003.Dyn.Status.MoreTeach - A "M901.2" - R "M901.2" - - A "M901.2" - AN "DVP_Sorter_B".Sync_BG3003.Dyn.Error.Keine_TeachPktdaten - = "MA0146" - = "MA0145" +ORGANIZATION_BLOCK "Cycle Execution" +TITLE = Hauptprogramm +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 +//H&M Cheb + VAR_TEMP + OB1_EV_CLASS : Byte; // Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1) + OB1_SCAN_1 : Byte; // 1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1) + OB1_PRIORITY : Byte; // 1 (Priority of 1 is lowest) + OB1_OB_NUMBR : Byte; // 1 (Organization block 1, OB1) + OB1_RESERVED_1 : Byte; // Reserved for system + OB1_RESERVED_2 : Byte; // Reserved for system + OB1_PREV_CYCLE : Int; // Cycle time of previous OB1 scan (milliseconds) + OB1_MIN_CYCLE : Int; // Minimum cycle time of OB1 (milliseconds) + OB1_MAX_CYCLE : Int; // Maximum cycle time of OB1 (milliseconds) + OB1_DATE_TIME : "OB1-Date+Time"; // Date and time OB1 started + END_VAR + + +BEGIN +NETWORK +TITLE = Version / Ersteller / letzter Bearbeiter, Datum + L 'H&M' ;//Projekt H&M in Cheb + L 'Fort' ;//Fortna + L 'na'; + L 'Cheb' ;//Cheb + L 500592 ;//500592 + L 'UH07' ;//Outbound UH07 + L 'IBAE' ;//Version + + L 'IBAE';//Ersteller + + L 'IBAE';//Letzter Bearbeiter + L '1106' ;//Letzte Bearbeitung (Tag/Monat) + L '2026' ;//Letzte Bearbeitung (Jahr) + L 'Ja' ;//Beim Kunden eingespielt + L 'Ja' ;//Internes EPROM + +NETWORK +TITLE = Performance-Test + +//Aktivieren: + SET; + = "FB_PerfTest_7_OB_Einfahrt".xTestActive; + = "FB_PerfTest_7_VP_Sorter_Sync".xTestActive; + = "FB_PerfTest_7_VP_Ausfahrt".xTestActive; + = "FB_PerfTest_7_VP_Rück".xTestActive; + = "FB_PerfTest_7_EP_Einfahrt".xTestActive; + = "FB_PerfTest_7_EP_Ausfahrt".xTestActive; + = "FB_PerfTest_7_LP_Einfahrt".xTestActive; + = "FB_PerfTest_7_LT_Beladung".xTestActive; + = "FB_PerfTest_7_VP_Rück".xTestActive; + +//Resetten: + CLR; + = "FB_PerfTest_7_OB_Einfahrt".xInReset; + = "FB_PerfTest_7_VP_Sorter_Sync".xInReset; + = "FB_PerfTest_7_VP_Ausfahrt".xInReset; + = "FB_PerfTest_7_VP_Rück".xInReset; + = "FB_PerfTest_7_EP_Einfahrt".xInReset; + = "FB_PerfTest_7_EP_Ausfahrt".xInReset; + = "FB_PerfTest_7_LP_Einfahrt".xInReset; + = "FB_PerfTest_7_LT_Beladung".xInReset; + +//OB Einfahrt: + CALL "FB_PerfTest", "FB_PerfTest_7_OB_Einfahrt" + ( nInSepNo := 3143 , + xInSepFlag := "MB3143" + ); + +//VP-Sorter-Sync: + CALL "FB_PerfTest", "FB_PerfTest_7_VP_Sorter_Sync" + ( nInSepNo := 3120 , + xInSepFlag := "BG3120" + ); + +//VP_Ausfahrt: + CALL "FB_PerfTest", "FB_PerfTest_7_VP_Ausfahrt" + ( nInSepNo := 3244 , + xInSepFlag := "MB3244" + ); + +//VP_Rückschleßstrecke: + CALL "FB_PerfTest", "FB_PerfTest_7_VP_Rück" + ( nInSepNo := 3133 , + xInSepFlag := "MB3123" + ); + +//EP Einfahrt: + CALL "FB_PerfTest", "FB_PerfTest_7_EP_Einfahrt" + ( nInSepNo := 4503 , + xInSepFlag := "MB4503" + ); + +//EP Ausfahrt: + CALL "FB_PerfTest", "FB_PerfTest_7_EP_Ausfahrt" + ( nInSepNo := 4512 , + xInSepFlag := "MB4512" + ); + +//LP Einfahrt: + CALL "FB_PerfTest", "FB_PerfTest_7_LP_Einfahrt" + ( nInSepNo := 3305 , + xInSepFlag := "MB3305" + ); + +//Leer-Trolley-Beladung: + CALL "FB_PerfTest", "FB_PerfTest_7_LT_Beladung" + ( nInSepNo := 3323 , + xInSepFlag := "MB3323" + ); + + +NETWORK +TITLE = Zum Suchen + SET; +/// R "SF0000" ///Damit Anlage aus! + U "MB4522"; + U "PF0237"; + U "7_HMI_Err_UH07_OB".Logistik.Kein_Platz_im_VollLager; + U "PF0046"; + + U "7_HMI_Err_UH07_OB".System.Gesamt_Feueralarm_Halle3; + + U "7_HMI_Err_UH07_OB".RFID_Gate.Gate_ByPAss; + U "7_HMI_Err_UH07_OB".Auslagerbereich_LeerPuffer."TrolleyStau BGXY"; + + U "BG4201"; + + + CLR; + +NETWORK +TITLE = Neustart ? + U "SGes".Neustart; + L s5t#30s; + SE "T0"; + U "T0"; + U "SF0000" ;//Also haben Eingänge Verbindung + R "SGes".Neustart; + + U "SGes".Neustart; + = "7_HMI_Err_UH07_OB".System.Bus_Anlauf; + BEB; + + U "M900.7"; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UH07; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UC071; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UC073; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ0701; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ0702; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ0703; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7101; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7102; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7103; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7104; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7105; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7106; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7107; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7301; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7302; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7303; + R "DOutbound_Bereich".A01_UC072.Not_Aus.UC072; + R "DOutbound_Bereich".A01_UC072.Not_Aus.UZ7201; + R "DOutbound_Bereich".A01_UC072.Not_Aus.UZ7202; + R "DOutbound_Bereich".A01_UC074.Not_Aus.UC074; + R "DOutbound_Bereich".A01_UC074.Not_Aus.UZ7401; + R "DOutbound_Bereich".A01_UC074.Not_Aus.UZ7402; + +NETWORK +TITLE = Simulation / Anlage blockieren + +//SET: Anlage kann nicht eingeschaltet werden +//CLR: Anlage Normalbetrieb + CLR; + R "SF0000"; + +//Ohne PC fahren + SET; + S "SGes".Ohne_PC_Fahren; + +//Simulation ohne Hardware + SET; + R "SGes".Simulation_ohne_HW_aktiv; + +//Ohne andere Not-Aus-Bereiche: + SET; + S "DSchnittstelle_zu_Safety".ToSafety.Ohne_Partner; + +//Start nach Störung am UH07: + U "M900.7"; + R "M900.7"; + S "SF0002";//UH07 + S "SF0117";//UC071 + S "SF0177" ;//UC072 + S "SF0237" ;//UC073 + S "SF0297" ;//UC074 + +//Feuer-/BST-Zeug: + U "DI0033" ;//Meldezentrale (Halle4) + U "DI0034" ;//Meldezentrale (Halle3) + U "DI0035" ;//BST 1 + U "DI0036"; + U "DI0037"; + U "DI0170" ;//BST 2 + U "DI0171"; + U "DI0172"; + CLR; + +//SI: + U "DI0223"; + U "DI0283"; + SET; + = "DI0223"; + = "DI0283"; + +NETWORK +TITLE = Eingang ansteuern + CALL "Set_Input" + ( Enable := "M2000.1" , + Status := "M2000.0" , + InByte := "MD2002" , + InBit := "MW2006" + ); + + U "SF0002";//UH07 +// S "SF0117" //sollen nur von ihren Unterverteilern quittiert werden können +// S "SF0177" +// S "SF0237" +// S "SF0297" + S "SF0041"; + S "SF0043"; + S "SF0045"; + + U "SF0117";//UC071 + S "SF0121"; + S "SF0123"; + S "SF0125"; + S "SF0127"; + S "SF0131"; + S "SF0133"; + S "SF0135"; + + U "SF0177";//UC072 + S "SF0181"; + S "SF0183"; + + U "SF0237";//UC073 + S "SF0241"; + S "SF0243"; + S "SF0245"; + + U "SF0297";//UC074 + S "SF0301"; + S "SF0303"; + S "SF0305"; + +NETWORK +TITLE = Daten von Host empfangen + CALL "Daten_von_Host_empfangen", "DDaten_von_Host_empfangen"; + +NETWORK +TITLE = Daten von UH06/AMR holen + U "INTERFACE_FROM_UH06_Byte2".%X0; + = "DSchnittstelle_zu_AMR".From_UH06.MA0200_A_vor; + U "INTERFACE_FROM_UH06_Byte2".%X1; + = "DSchnittstelle_zu_AMR".From_UH06.MA0200_A_start; + U "INTERFACE_FROM_UH06_Byte2".%X2; + = "DSchnittstelle_zu_AMR".From_UH06.MA0203_kein_Stau; + U "INTERFACE_FROM_UH06_Byte2".%X3; + = "DSchnittstelle_zu_AMR".From_UH06.MA0203_aktiv; + +NETWORK +TITLE = 100ms Impuls Takt erzeugen / Taktanzahl übergeben + U "M35.0";//von OB35 (100ms Zeitinterrupt) + R "M35.0"; + = "100ms-Impuls";//nur als Impuls + L "MW36" ;//Anzahl der 100ms-Takte + T "MW2";//übernehmen + + L 0; + T "MW36";//Takte neu aufaddieren + + L "MW38";//Anzahl der 10ms-Takte + T "MW4";//übernehmen + + L 0; + T "MW38";//Takte neu aufaddieren + +//Old-Takt erzeugen: + L "Clock_Byte"; + T "Old_Takt"; + + U "1s-Takt"; + FP "Fp-1s-Impuls"; + = "1s-Impuls" ;//1s-Impuls + + UN "10s-Impuls"; + L S5T#10S; + SE "T10"; + U "T10"; + = "10s-Impuls"; + +NETWORK +TITLE = Systemzeit übergeben + L #OB1_DATE_TIME.Jahr; + T "SGes".DATE_TIME.Jahr; + + L #OB1_DATE_TIME.Monat; + T "SGes".DATE_TIME.Monat; + + L #OB1_DATE_TIME.Tag; + T "SGes".DATE_TIME.Tag; + + L #OB1_DATE_TIME.Stunde; + BTI;//Wandeln in + + 2 ;//CPU-Systemzeit ist 1h zu wenig (keine Ahnung warum) + ITB; + T "SGes".DATE_TIME.Stunde; + + L #OB1_DATE_TIME.Minute; + T "SGes".DATE_TIME.Minute; + + L #OB1_DATE_TIME.Sekunde; + T "SGes".DATE_TIME.Sekunde; + +NETWORK +TITLE = System + CALL "OutBound_Bereich", "DOutbound_Bereich"; + +NETWORK +TITLE = Kamera-Leser + CALL "FB_BarcodeReader", "FB_BarcodeReader_DB"; + + CALL "FB_CommunicationWCSBL", "FB_CommunicationWCSBL_DB" + ( fbInOutSendFIFO := "DB_LGF_FIFO_CommWCSBL" , + arFifoSendBuffer := "DB_Buffer_CommunicationWCSBL".BUFFER + ); + + CALL "FB_CommunicationLogger", "FB_CommunicationLogger_DB" + ( fbInOutSendFIFO := "DB_LGF_FIFO_CommLogger" , + arFifoSendBuffer := "DB_Buffer_CommunicationLogger".BUFFER + ); + + + +NETWORK +TITLE = 0_Highway > Vollpuffer + CALL "HWtoOB_Bereich"; + +NETWORK +TITLE = 1_Vollpuffer + CALL "VP_Bereich"; + +NETWORK +TITLE = 2_Vollpuffer > Entnahmepuffer + CALL "VPtoEP_Bereich"; + +NETWORK +TITLE = 3_Entnahmepuffer + CALL "EP_Bereich"; + +NETWORK +TITLE = 4_ Entnahmepuffer > Leerpuffer + CALL "EPtoLP_Bereich"; + +NETWORK +TITLE = 5_Leerpuffer + L "DLLeerPuffer_ausfahren".Datenlistenkopf.AnzahlEintraege; + L 4 ;//Falls mehr oder gleich Puffer zum Ausfahren, dann kein Saugmodus + T "DLeerPufferStrecken".SaugModus.Ok_Anzahl; + + L "DLLeerPuffer_leer".Datenlistenkopf.AnzahlEintraege; + L 1;//Falls mehr oder gleich Leerpuffer, dann kein Durchfahrmodus + T "DLeerPufferStrecken".DurchfahrModus.Ok_Anzahl; + + CALL "LP_Bereich"; + +NETWORK +TITLE = 6_Leerpuffer > Highway + CALL "LPtoHW_Bereich"; + +NETWORK +TITLE = Visu-Zeug + CALL "Visu_Sorter_Rein", "DVisu_Sorter_Rein"; + + CALL "Visu_Weiche_Sorter", "DVisu_Weiche_Sorter"; + + CALL "Visu_StartSync_Visu", "DVisu_StartSync"; + + CALL "Visu_HMOmniSchleuse", "DVisu_HMOmnischleuse"; + + CALL "Visu_HMOmniSchleuse_Plus", "DVisu_HMOmniSchleuse_Plus"; + + CALL "Visu_HMOmniBereich_Plus", "DVisu_HMOmniBereich_Plus"; + + CALL "Visu_HMOmniWeiche_Plus", "DVisu_HMOmniWeiche_Plus"; + + CALL "Visu_HMVollPuffer", "DVisu_HMVollpuffer"; + + CALL "Visu_HMLeerPuffer", "DVisu_HMLeerPuffer"; + + CALL "Visu_CheckTrolley", "DVisu_CheckTrolley"; + +NETWORK +TITLE = Lampentest + CALL "LTest"; + +NETWORK +TITLE = Ausgang ansteuern + U "Clock_0.5Hz"; + = "M1000.0"; + + CALL "Set_Output" + ( Enable := "M1000.1" , + Status := "M1000.0" , + OutByte := "MD1002" , + OutBit := "MW1006" + ); + +NETWORK +TITLE = Daten an UH06/AMR senden + U "DSchnittstelle_zu_AMR".To_UH06.MA0203_A_vor; + = "INTERFACE_TO_UH06_Byte1".%X0; + U "DSchnittstelle_zu_AMR".To_UH06.MA0203_A_start; + = "INTERFACE_TO_UH06_Byte1".%X1; + U "DSchnittstelle_zu_AMR".To_UH06.MA0200_kein_Stau; + = "INTERFACE_TO_UH06_Byte1".%X2; + U "DSchnittstelle_zu_AMR".To_UH06.MA0200_aktiv; + = "INTERFACE_TO_UH06_Byte1".%X3; + U "DSchnittstelle_zu_AMR".To_UH06.BG3724_aktiv; + = "INTERFACE_TO_UH06_Byte1".%X4; + +NETWORK +TITLE = Daten an Host senden + CALL "Daten_Host_senden", "DDaten_Host_senden"; + +NETWORK +TITLE = Ende + BE; + +NETWORK +TITLE = Daten in SendFifo schreiben + U "M83.1"; + R "M83.1"; + SPBN nix; + + CALL "Daten_in_SendFIFO_speichern", "Daten_für_SendFIFO" + ( "TelegrammKennung[1]" := 'B' , + "TelegrammKennung[2]" := '2' , + "TelegrammKennung[3]" := 'C' , + "TelegrammKennung[4]" := 'D' , + "TelegrammKennung[5]" := 'E' , + "TelegrammKennung[6]" := 'F' , + "TelegrammKennung[7]" := 'G' , + "TelegrammKennung[8]" := 'I' , + "TelegrammKennung[9]" := 'J' , + "TelegrammKennung[10]" := 'K' , + TrolleyID := DINT#4711 , + StationsNr := 13 , + Puffer_LinienNr := 7 , + StoreGroup := DINT#0815 , + Status_1_Int := 83 , + "Status_2_Bit[0]" := 1 , + "Status_2_Bit[1]" := 0 , + "Status_2_Bit[2]" := 1 , + "Status_2_Bit[3]" := 0 , + "Status_2_Bit[4]" := 1 , + "Status_2_Bit[5]" := 0 , + "Status_2_Bit[6]" := 1 , + "Status_2_Bit[7]" := 1 , + "Reserve[1]_Int" := 62 , + "Reserve[2]_Int" := 63 , + Port := 2 , + Ret_Val_FIFO_IN := "MB199" , + Error := "M83.0" + ); + +nix: NOP 0; + +NETWORK +TITLE = Test mit DL1000 + L "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse; + + U "M83.0"; + R "M83.0"; + SPBN more; + + CALL "Trolleydaten_löschen" + ( Gesamt_Trolley_DL := 1000 , + TrolleyID := "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse + ); + +more: U "M83.1"; + R "M83.1"; + SPBN ready; + + CALL "Trolleydaten_neu_anlegen" + ( Gesamt_Trolley_DL := 1000 , + TrolleyID := "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse , + Endziel := 16#B000 , + ShopGroup := DINT#-1 + ); + + CALL "Trolley_DL_Neue_Pos" + ( Gesamt_Trolley_DL := 1000 , + TrolleyID := "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse , + Position := 16#3323 , + ShopGroup := -1 , + Err := "M199.0" + ); + + +ready: NOP 0; + + + BEA; + +NETWORK +TITLE = Eingang ansteuern + CALL "Set_Input" + ( Enable := "M2000.1" , + Status := "M2000.0" , + InByte := "MD2002" , + InBit := "MW2006" + ); + +NETWORK +TITLE = Ausgang ansteuern + U "Clock_1Hz"; + = "M1000.0"; + + CALL "Set_Output" + ( Enable := "M1000.1" , + Status := "M1000.0" , + OutByte := "MD1002" , + OutBit := "MW1006" + ); + +NETWORK +TITLE = Teachen Sorter LP + +//Nach Teach-Ergebnis anhalten !: + L "DLP_Sorter".Sync_BG3306.Abstands_Ink; + L DINT#0; + <>D; + U "DLP_Sorter".Sync_BG3306.Dyn.Status.TeachModus_Aktiv; + U "DLP_Sorter".Sync_BG3306.Dyn.Status.MoreTeach; + U "M900.0"; + R "M900.0"; + + U "M900.0"; + UN "DLP_Sorter".Sync_BG3306.Dyn.Error.Keine_TeachPktdaten; + = "MB3305"; + = "MA0064";//Zusätzlich im Lastbaustein EP>LP_Antriebe, da Aufruf vor Sorter-FB + +NETWORK +TITLE = Teachen Sorter EP + +//Nach Teach-Ergebnis anhalten !: + L "DEP_Sorter".Sync_BG4527.Abstands_Ink; + L DINT#0; + <>D; + U "DEP_Sorter".Sync_BG4527.Dyn.Status.TeachModus_Aktiv; + U "DEP_Sorter".Sync_BG4527.Dyn.Status.MoreTeach; + U "M902.0"; + R "M902.0"; + + U "M902.0"; + UN "DEP_Sorter".Sync_BG4527.Dyn.Error.Keine_TeachPktdaten; + = "MB4503"; + = "MA0325" ;//Zusätzlich im Lastbaustein VP>EP_Antriebe, da Aufruf vor Sorter-FB + +NETWORK +TITLE = Teachen Sorter VP A + +//Nach Teach-Ergebnis anhalten !: + L "DVP_Sorter_A".Sync_BG3120.Abstands_Ink; + L DINT#0; + <>D; + U "DVP_Sorter_A".Sync_BG3120.Dyn.Status.TeachModus_Aktiv; + U "DVP_Sorter_A".Sync_BG3120.Dyn.Status.MoreTeach; + U "M901.1"; + R "M901.1"; + + U "M901.1"; + UN "DVP_Sorter_A".Sync_BG3120.Dyn.Error.Keine_TeachPktdaten; + = "MB3121"; + = "MA0144"; + = "MA0145"; + = "MA0152"; + +NETWORK +TITLE = Teachen Sorter VP B + +//Nach Teach-Ergebnis anhalten !: + L "DVP_Sorter_B".Sync_BG3003.Abstands_Ink; + L DINT#0; + <>D; + U "DVP_Sorter_B".Sync_BG3003.Dyn.Status.TeachModus_Aktiv; + U "DVP_Sorter_B".Sync_BG3003.Dyn.Status.MoreTeach; + U "M901.2"; + R "M901.2"; + + U "M901.2"; + UN "DVP_Sorter_B".Sync_BG3003.Dyn.Error.Keine_TeachPktdaten; + = "MA0146"; + = "MA0145"; + +END_ORGANIZATION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/_All/LTest.awl b/=A01+UH07-KF00/Programmbausteine/_All/LTest.awl index 45bb440..90bead6 100644 --- a/=A01+UH07-KF00/Programmbausteine/_All/LTest.awl +++ b/=A01+UH07-KF00/Programmbausteine/_All/LTest.awl @@ -1,194 +1,196 @@ -=== FC 1016: LTest [STL] === -INTERFACE: - Input: - Output: - InOut: - Temp: - Constant: - Return: - Ret_Val : Void +FUNCTION "LTest" : Void +TITLE = Störungsanzeigen am HSS / Lampentest +{ S7_Optimized_Access := 'FALSE' } +AUTHOR : AE +VERSION : 0.1 ---- NW 1: Anzeigen Anlage ausschalten ? --- - A "DOutbound_Bereich".A01_UH07.AnlageEin - JC Nw02 +BEGIN +NETWORK +TITLE = Anzeigen Anlage ausschalten ? + U "DOutbound_Bereich".A01_UH07.AnlageEin; + SPB Nw02; -// Anzeigen ausschalten: - SET - R "PF0000" - R "PF0001" - R "PF0002" - R "PF0003" - R "PF0004" - R "PF0005" -// R "PF0006" //Feueralarm -// R "PF0030" //Not-Aus - R "PF0031" - R "PF0032" - R "PF0033" - R "PF0034" - R "PF0040" - R "PF0041" - R "PF0042" - R "PF0043" - R "PF0044" - R "PF0045" - R "PF0046" - R "PF0100" - R "PF0101" - R "PF0102" - R "PF0117" - R "PF0100" - R "PF0101" - R "PF0102" - R "PF0120" - R "PF0121" - R "PF0122" - R "PF0123" - R "PF0124" - R "PF0125" - R "PF0126" - R "PF0127" - R "PF0130" - R "PF0131" - R "PF0132" - R "PF0133" - R "PF0134" - R "PF0135" - R "PF0136" - R "PF0160" - R "PF0161" - R "PF0162" - R "PF0177" - R "PF0180" - R "PF0181" - R "PF0182" - R "PF0183" - R "PF0220" - R "PF0221" - R "PF0222" - R "PF0237" - R "PF0240" - R "PF0241" - R "PF0242" - R "PF0243" - R "PF0244" - R "PF0245" - R "PF0280" - R "PF0281" - R "PF0282" - R "PF0297" - R "PF0300" - R "PF0301" - R "PF0302" - R "PF0303" - R "PF0304" - R "PF0305" + //Anzeigen ausschalten: + SET; + R "PF0000"; + R "PF0001"; + R "PF0002"; + R "PF0003"; + R "PF0004"; + R "PF0005"; +// R "PF0006" //Feueralarm +// R "PF0030" //Not-Aus + R "PF0031"; + R "PF0032"; + R "PF0033"; + R "PF0034"; + R "PF0040"; + R "PF0041"; + R "PF0042"; + R "PF0043"; + R "PF0044"; + R "PF0045"; + R "PF0046"; + R "PF0100"; + R "PF0101"; + R "PF0102"; + R "PF0117"; + R "PF0100"; + R "PF0101"; + R "PF0102"; + R "PF0120"; + R "PF0121"; + R "PF0122"; + R "PF0123"; + R "PF0124"; + R "PF0125"; + R "PF0126"; + R "PF0127"; + R "PF0130"; + R "PF0131"; + R "PF0132"; + R "PF0133"; + R "PF0134"; + R "PF0135"; + R "PF0136"; + R "PF0160"; + R "PF0161"; + R "PF0162"; + R "PF0177"; + R "PF0180"; + R "PF0181"; + R "PF0182"; + R "PF0183"; + R "PF0220"; + R "PF0221"; + R "PF0222"; + R "PF0237"; + R "PF0240"; + R "PF0241"; + R "PF0242"; + R "PF0243"; + R "PF0244"; + R "PF0245"; + R "PF0280"; + R "PF0281"; + R "PF0282"; + R "PF0297"; + R "PF0300"; + R "PF0301"; + R "PF0302"; + R "PF0303"; + R "PF0304"; + R "PF0305"; +NETWORK +TITLE = Taste "Lampentest" gedrückt ? +// +// ---- NW 2: - --- -// Einschalten: -Nw02: A "SF0003" - AN "SGes".Lampentest_aktiv - AN "SGes".I_Lampentest_aktiv // Tastensperre - S "SGes".I_Lampentest_aktiv - S "SGes".Lampentest_aktiv +//Einschalten: +Nw02: U "SF0003"; + UN "SGes".Lampentest_aktiv; + UN "SGes".I_Lampentest_aktiv;//Tastensperre + S "SGes".I_Lampentest_aktiv; + S "SGes".Lampentest_aktiv; - AN "SF0003" - R "SGes".I_Lampentest_aktiv // Tastensperre + UN "SF0003"; + R "SGes".I_Lampentest_aktiv;//Tastensperre -// Ausschalten: - A "SF0003" - AN "SGes".I_Lampentest_aktiv // Tastensperre - A "SGes".Lampentest_aktiv - S "SGes".I_Lampentest_aktiv - R "SGes".Lampentest_aktiv +//Ausschalten: + U "SF0003"; + UN "SGes".I_Lampentest_aktiv;//Tastensperre + U "SGes".Lampentest_aktiv; + S "SGes".I_Lampentest_aktiv; + R "SGes".Lampentest_aktiv; -// Lampentest zeitlang aktiv: - A "SGes".Lampentest_aktiv // Automatisch ausschalten - L S5T#5M // 5min - OnDelay "T16" - A "T16" // Nach 5min automatisch ausschalten - R "SGes".Lampentest_aktiv +//Lampentest zeitlang aktiv: + U "SGes".Lampentest_aktiv;//Automatisch ausschalten + L S5T#5M ;//5min + SE "T16"; + U "T16" ;//Nach 5min automatisch ausschalten + R "SGes".Lampentest_aktiv; - AN "SGes".Lampentest_aktiv - BEC + UN "SGes".Lampentest_aktiv; + BEB; -// Anzeigen einschalten: - A "SF0003" - = "PF0034" +//Anzeigen einschalten: + U "SF0003"; + = "PF0034"; - SET - S "PF0000" - S "PF0001" - S "PF0002" - S "PF0003" - S "PF0004" - S "PF0005" - S "PF0006" - S "PF0030" - S "PF0031" - S "PF0032" - S "PF0033" - S "PF0040" - S "PF0041" - S "PF0042" - S "PF0043" - S "PF0044" - S "PF0045" - S "PF0046" - S "PF0100" - S "PF0101" - S "PF0102" - S "PF0117" - S "PF0100" - S "PF0101" - S "PF0102" - S "PF0120" - S "PF0121" - S "PF0122" - S "PF0123" - S "PF0124" - S "PF0125" - S "PF0126" - S "PF0127" - S "PF0130" - S "PF0131" - S "PF0132" - S "PF0133" - S "PF0134" - S "PF0135" - S "PF0136" - S "PF0160" - S "PF0161" - S "PF0162" - S "PF0177" - S "PF0180" - S "PF0181" - S "PF0182" - S "PF0183" - S "PF0220" - S "PF0221" - S "PF0222" - S "PF0237" - S "PF0240" - S "PF0241" - S "PF0242" - S "PF0243" - S "PF0244" - S "PF0245" - S "PF0280" - S "PF0281" - S "PF0282" - S "PF0297" - S "PF0300" - S "PF0301" - S "PF0302" - S "PF0303" - S "PF0304" - S "PF0305" + SET; + S "PF0000"; + S "PF0001"; + S "PF0002"; + S "PF0003"; + S "PF0004"; + S "PF0005"; + S "PF0006"; + S "PF0030"; + S "PF0031"; + S "PF0032"; + S "PF0033"; + S "PF0040"; + S "PF0041"; + S "PF0042"; + S "PF0043"; + S "PF0044"; + S "PF0045"; + S "PF0046"; + S "PF0100"; + S "PF0101"; + S "PF0102"; + S "PF0117"; + S "PF0100"; + S "PF0101"; + S "PF0102"; + S "PF0120"; + S "PF0121"; + S "PF0122"; + S "PF0123"; + S "PF0124"; + S "PF0125"; + S "PF0126"; + S "PF0127"; + S "PF0130"; + S "PF0131"; + S "PF0132"; + S "PF0133"; + S "PF0134"; + S "PF0135"; + S "PF0136"; + S "PF0160"; + S "PF0161"; + S "PF0162"; + S "PF0177"; + S "PF0180"; + S "PF0181"; + S "PF0182"; + S "PF0183"; + S "PF0220"; + S "PF0221"; + S "PF0222"; + S "PF0237"; + S "PF0240"; + S "PF0241"; + S "PF0242"; + S "PF0243"; + S "PF0244"; + S "PF0245"; + S "PF0280"; + S "PF0281"; + S "PF0282"; + S "PF0297"; + S "PF0300"; + S "PF0301"; + S "PF0302"; + S "PF0303"; + S "PF0304"; + S "PF0305"; +NETWORK +TITLE = Ende + BE; ---- NW 3: Ende --- - BE +END_FUNCTION diff --git a/=A01+UH07-KF00/Programmbausteine/_All/Startup.awl b/=A01+UH07-KF00/Programmbausteine/_All/Startup.awl index 5f29c85..ccb15f2 100644 --- a/=A01+UH07-KF00/Programmbausteine/_All/Startup.awl +++ b/=A01+UH07-KF00/Programmbausteine/_All/Startup.awl @@ -1,41 +1,42 @@ -=== OB 100: Startup [STL] === -INTERFACE: - Input: - LostRetentive : Bool // True if retentive data are lost - LostRTC : Bool // True if date and time are lost - Temp: - Constant: +ORGANIZATION_BLOCK "Startup" +TITLE = "Complete Restart" +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 ---- NW 1: Neustart --- - SET - R "DOutbound_Bereich".A01_UH07.AnlageEin - S "SGes".Neustart +BEGIN +NETWORK +TITLE = Neustart + SET; + R "DOutbound_Bereich".A01_UH07.AnlageEin; + S "SGes".Neustart; - SET - R "DOutbound_Bereich".A01_UH07.Not_Aus.UH07 // Bei Neustart alle Not-Aus löschen! - R "DOutbound_Bereich".A01_UH07.Not_Aus.UC071 - R "DOutbound_Bereich".A01_UH07.Not_Aus.UC073 - R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ0701 - R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ0702 - R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ0703 - R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7101 - R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7102 - R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7103 - R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7104 - R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7105 - R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7106 - R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7107 - R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7301 - R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7302 - R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7303 - R "DOutbound_Bereich".A01_UC072.Not_Aus.UC072 - R "DOutbound_Bereich".A01_UC072.Not_Aus.UZ7201 - R "DOutbound_Bereich".A01_UC072.Not_Aus.UZ7202 - R "DOutbound_Bereich".A01_UC074.Not_Aus.UC074 - R "DOutbound_Bereich".A01_UC074.Not_Aus.UZ7401 - R "DOutbound_Bereich".A01_UC074.Not_Aus.UZ7402 + SET; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UH07;//Bei Neustart alle Not-Aus löschen! + R "DOutbound_Bereich".A01_UH07.Not_Aus.UC071; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UC073; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ0701; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ0702; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ0703; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7101; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7102; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7103; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7104; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7105; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7106; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7107; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7301; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7302; + R "DOutbound_Bereich".A01_UH07.Not_Aus.UZ7303; + R "DOutbound_Bereich".A01_UC072.Not_Aus.UC072; + R "DOutbound_Bereich".A01_UC072.Not_Aus.UZ7201; + R "DOutbound_Bereich".A01_UC072.Not_Aus.UZ7202; + R "DOutbound_Bereich".A01_UC074.Not_Aus.UC074; + R "DOutbound_Bereich".A01_UC074.Not_Aus.UZ7401; + R "DOutbound_Bereich".A01_UC074.Not_Aus.UZ7402; +NETWORK +TITLE = Ende + BE; ---- NW 2: Ende --- - BE +END_ORGANIZATION_BLOCK diff --git a/=A01+UH07-KF00/Programmbausteine/xCommunication/FB_CommunicationWCSBL.scl b/=A01+UH07-KF00/Programmbausteine/xCommunication/FB_CommunicationWCSBL.scl index 742c297..274bdc8 100644 --- a/=A01+UH07-KF00/Programmbausteine/xCommunication/FB_CommunicationWCSBL.scl +++ b/=A01+UH07-KF00/Programmbausteine/xCommunication/FB_CommunicationWCSBL.scl @@ -160,7 +160,7 @@ BEGIN xInLaneStatusReq := TRUE, nInBarcode := "SS_Port2_SendDaten".Port2.TrolleyID, sInSSCC := '', - sInDecisionPoint := "FC_Convert_SchleusetoDecisionPoint"("SS_Port2_SendDaten".Port2.StationsNr), + sInDecisionPoint := "FC_Convert_Schleuse_DecisionPoint"("SS_Port2_SendDaten".Port2.StationsNr), sInDockDoor := '', sInLengthInfo := '', arInLaneStatus := #arLaneStatus, @@ -179,7 +179,7 @@ BEGIN xInLaneStatusReq := FALSE, nInBarcode := "SS_Port2_SendDaten".Port2.TrolleyID, sInSSCC := '', - sInDecisionPoint := "FC_Convert_SchleusetoDecisionPoint"("SS_Port2_SendDaten".Port2.StationsNr), + sInDecisionPoint := "FC_Convert_Schleuse_DecisionPoint"("SS_Port2_SendDaten".Port2.StationsNr), sInDockDoor := '', sInLengthInfo := '', arInLaneStatus := #arLaneNix, @@ -198,7 +198,7 @@ BEGIN ELSIF #sTelegramKennung = 'GOHDUM' THEN "FC_Send_GOHDUM"(sInPLCID := "cPLCID", nInBarcode := "SS_Port2_SendDaten".Port2.TrolleyID, - sInDecisionPoint := "FC_Convert_SchleusetoDecisionPoint"("SS_Port2_SendDaten".Port2.StationsNr), + sInDecisionPoint := "FC_Convert_Schleuse_DecisionPoint"("SS_Port2_SendDaten".Port2.StationsNr), sInActionTaken := "FC_ActionConvert"("SS_Port2_SendDaten".Port2.Puffer_LinienNr), //DELETE(IN := INT_TO_STRING("SS_Port2_SendDaten".Port2.Status_1), L := 1, P := 1), nReasonCode := '1', //todo FIFO := "DB_LGF_FIFO_CommWCSBL",