From 8c7b38d0ebb7e7d5ba2c5ee3e777d1e29cb1bd0b Mon Sep 17 00:00:00 2001 From: Simon Schmutzler Date: Wed, 16 Mar 2022 17:46:43 +0100 Subject: [PATCH] =?UTF-8?q?erste=20fassung=20der=20Mengenr=C3=BCst=20Versi?= =?UTF-8?q?on=20eingepflegt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rieter_ekalk.py | 1522 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1522 insertions(+) create mode 100644 rieter_ekalk.py diff --git a/rieter_ekalk.py b/rieter_ekalk.py new file mode 100644 index 0000000..cd7644a --- /dev/null +++ b/rieter_ekalk.py @@ -0,0 +1,1522 @@ +#from distutils.log import debug +import math +#from pickle import FALSE +import unittest + + +# Press Umschalt+F10 to execute it or replace it with your code. +# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. +class MG(): + def __init__(self, deckblatt:dict): + self.Deckblatt = { + "SYSTEM":"", + "RSM":0, + "Flyer":2, + "Flyer_P":2, + "Flyer_Electrojet_incl_intergrierte_Putzmaschine":2, + "Flyer_Electrojet_incl_intergrierte_Putzmaschine_Vorpuffer":2, + "Flyer_Electrojet_incl_intergrierte_Putzmaschine_Nachpuffer":2, + "Neuenhauser-Putzmaschine":0, + "Neuenhauser-Putzmaschine_Vorpuffer":0, + "Neuenhauser-Putzmaschine_Nachpuffer":0, + "Cason-Putzmaschine":0, + "Cason-Putzmaschine_Vorpuffer":0, + "Cason-Putzmaschine_Nachpuffer":0, + "Puffer":0, + "Anzahl_der_Pufferstrecken_pro_Puffer":0, + "Begegnungsstrecke_Bypass":0, + "Turm":0, + "Turm_Anzahl_Wendungen":0, + } + + + +# RSM_direct: +class RSM_direct(): + def __init__(self, anzahl:dict): + self._Mengen = { + "Anzahl":0, + "Anzahl_Strecken/RSM":8, + "Sensor_optisch_Traverse":0, + "Lichtschranke_Traverse":0, + "Bedientableau_2-fach":0, + "Bedientableau_2-fach_Korrektur":0, + "Bedientableau_2-fach_Direct":0, + "Weiche":0, + "Weiche_Korrektur":0, + "Weiche_Gemeinsame_Rückstellung":0, + "Weiche_Gemeinsame_Rückstellung_Korrektur":0, + "RA_bi_abhebbar":0, + "RA_bi_abhebbar_Korrektur":0, + "Doppelstreckenantrieb":0, + "gemeinsame_Wendung":0, + "Meldelampe_Überstrom":0, + "Meldelampe_Überstrom_Korrektur":0, + "Hauptschalter_Ein-Meldung":0, + "Hauptschalter_Ein-Meldung_Korrektur":0, + "Werma_Rundumleuchte_Störung":0, + "Werma_Rundumleuchte_Störung_Korrektur":0, + } + #Berechnungen basieren auf der Anzahl der Ringspinnmaschinen (rsm_anzahl) mit Ausnahme 'Sensor_optisch_Traverse' + #sowie teilweise manueller Eingaben von Korrekturfaktoren, hier mit dem Anhang '_Korrektur' + self._RSM_Anzahl = anzahl.get("Anzahl", 0) + self._Mengen["Anzahl"] = anzahl.get("Anzahl", 0) + self._Mengen["Anzahl_Strecken/RSM"] = 8 + self._Mengen["Sensor_optisch_Traverse"] = anzahl.get("Sensor_optisch_Traverse", 0) + self._Mengen["Lichtschranke_Traverse"] = self._RSM_Anzahl * 6 + self._Mengen["Bedientableau_2-fach"] = math.ceil(self._RSM_Anzahl/10) + anzahl.get("Bedientableau_2-fach_Korrektur", 0) + self._Mengen["Bedientableau_2-fach_Korrektur"] = anzahl.get("Bedientableau_2-fach_Korrektur", 0) + self._Mengen["Bedientableau_2-fach_Direct"] = self._RSM_Anzahl + self._Mengen["Weiche"] = self._RSM_Anzahl * 4 + anzahl.get("Weiche_Korrektur", 0) + self._Mengen["Weiche_Gemeinsame_Rückstellung"] = math.ceil(self._RSM_Anzahl/10) + anzahl.get("Weiche_Gemeinsame_Rückstellung_Korrektur", 0) + self._Mengen["Weiche_Gemeinsame_Rückstellung_Korrektur"] = anzahl.get("Weiche_Gemeinsame_Rückstellung_Korrektur", 0) + self._Mengen["RA_bi_abhebbar"] = math.ceil(self._RSM_Anzahl * 0.31) + anzahl.get("RA_bi_abhebbar_Korrektur", 0) + self._Mengen["RA_bi_abhebbar_Korrektur"] = anzahl.get("RA_bi_abhebbar_Korrektur", 0) + self._Mengen["Doppelstreckenantrieb"] = self._RSM_Anzahl * self._Mengen.get("Anzahl_Strecken/RSM", 0) + self._Mengen["gemeinsame_Wendung"] = math.ceil(self._RSM_Anzahl / 6) * 2 + self._Mengen["Meldelampe_Überstrom"] = self._RSM_Anzahl / 8 + anzahl.get("Meldelampe_Überstrom_Korrektur", 0) + self._Mengen["Meldelampe_Überstrom_Korrektur"] = anzahl.get("Meldelampe_Überstrom_Korrektur", 0) + self._Mengen["Hauptschalter_Ein-Meldung"] = self._RSM_Anzahl / 8 + anzahl.get("Hauptschalter_Ein-Meldung_Korrektur", 0) + self._Mengen["Hauptschalter_Ein-Meldung_Korrektur"] = anzahl.get("Hauptschalter_Ein-Meldung_Korrektur", 0) + self._Mengen["Werma_Rundumleuchte_Störung"] = math.floor(self._RSM_Anzahl / 5) + anzahl.get("Werma_Rundumleuchte_Störung_Korrektur", 0) + self._Mengen["Werma_Rundumleuchte_Störung_Korrektur"] = anzahl.get("Werma_Rundumleuchte_Störung_Korrektur", 0) + + def anzahl(self, partname): + return self._Mengen.get(partname, 0) + + +# RSM_FA: +class RSM_FA(): + def __init__(self, anzahl:dict): + self.Mengen = { + "Anzahl_RSM":0, + #"Automatische_Umfahrung":0, # 'Automatische_Umfahrung' und 'Flex-A_Premium' sind eine Zelle -> identischer Wert + "Flex-A_Premium":False, + "Getriebe_in_der_Mitte":False, + "RSM-Einfahrt_Ein-/Beidseitig":False, + "Sensor_optisch_Traverse":0, + "Sensor_optisch_Traverse_zusätzlich":0, + "Sensor_optisch_Traverse_Korrektur":0, + "Bedientableau_1-fach":0, + "Bedientableau_1-fach_Korrektur":0, + "Bedientableau_2-fach":0, + "Bedientableau_2-fach_Korrektur":0, + "Weiche":0, + "Weiche_Korrektur":0, + "RRA_bi":0, + "RRA_bi_Korrektur":0, + "RRA_bi_auf_Haupstrecke":0, + "RRA_bi_ohne_SPS-Ansteuerung":0, + "gemeinsame_Wendung":0, + "Seilzugschalter":0, + "Mit_Drucktaster":0, + "Meldelampe_Überstrom":0, + "Meldelampe_Überstrom_Korrektur":0, + "Hauptschalter_Ein-Meldung":0, + "Hauptschalter_Ein-Meldung_Korrektur":0, + "Werma_Rundumleuchte_Störung":0, + "Werma_Rundumleuchte_Störung_Korrektur":0, + } + + self._RSM_Anzahl = anzahl.get("Anzahl", 0) + self.Mengen["Anzahl_RSM"] = self._RSM_Anzahl + self.Mengen["Flex-A_Premium"] = anzahl.get("Flex-A_Premium", False) + self.Mengen["Getriebe_in_der_Mitte"] = anzahl.get("Getriebe_in_der_Mitte", False) + self.Mengen["RSM-Einfahrt_Ein-/Beidseitig"] = anzahl.get("RSM-Einfahrt_Ein-/Beidseitig", False) + + sensorfaktor_premium = 1 + sensorfaktor_beidseitig = 0 + if(anzahl.get("Flex-A_Premium", False)): + sensorfaktor_premium = 4 + if(anzahl.get("RSM-Einfahrt_Ein-/Beidseitig", False)): + sensorfaktor_beidseitig = 1 + self.Mengen["Sensor_optisch_Traverse"] = self._RSM_Anzahl*(sensorfaktor_premium + sensorfaktor_beidseitig) + anzahl.get("Sensor_optisch_Traverse_zusätzlich", 0) + anzahl.get("Sensor_optisch_Traverse_Korrektur", 0) # TODO Korrekturfaktor hier auch anwenden, da in Excel Zelle (C30) nicht grau, wird aber addiert? + self.Mengen["Sensor_optisch_Traverse_zusätzlich"] = anzahl.get("Sensor_optisch_Traverse_zusätzlich", 0) + self.Mengen["Sensor_optisch_Traverse_Korrektur"] = anzahl.get("Sensor_optisch_Traverse_Korrektur", 0) + + tableaufaktor_premium = 1 + tableaufaktor_beidseitig = 0 + if(anzahl.get("Flex-A_Premium", False)): + tableaufaktor_premium = 0 + if(anzahl.get("RSM-Einfahrt_Ein-/Beidseitig", False)): + tableaufaktor_beidseitig = 1 + self.Mengen["Bedientableau_1-fach"] = self._RSM_Anzahl*(tableaufaktor_premium + tableaufaktor_beidseitig) + anzahl.get("Bedientableau_1-fach_Korrektur", 0) + self.Mengen["Bedientableau_1-fach_Korrektur"] = anzahl.get("Bedientableau_1-fach_Korrektur", 0) + self.Mengen["Bedientableau_2-fach"] = math.ceil(self._RSM_Anzahl/10) + anzahl.get("Bedientableau_2-fach_Korrektur", 0) + self.Mengen["Bedientableau_2-fach_Korrektur"] = anzahl.get("Bedientableau_2-fach_Korrektur", 0) + + weichefaktor_premium = 1 + weichefaktor_beidseitig = 0 + if(anzahl.get("Flex-A_Premium", False)): + weichefaktor_premium = 3 + if(anzahl.get("RSM-Einfahrt_Ein-/Beidseitig", False)): + weichefaktor_beidseitig = 1 + self.Mengen["Weiche"] = self._RSM_Anzahl * (weichefaktor_premium + weichefaktor_beidseitig) + anzahl.get("Weiche_Korrektur", 0) + self.Mengen["Weiche_Korrektur"] = anzahl.get("Weiche_Korrektur", 0) + + rrafaktor_premium = 1 + rrafaktor_beidseitig = 0 + if(anzahl.get("Flex-A_Premium", False)): + rrafaktor_premium = 2 + if(anzahl.get("RSM-Einfahrt_Ein-/Beidseitig", False)): + rrafaktor_beidseitig = 1 + self.Mengen["RRA_bi"] = self._RSM_Anzahl * (rrafaktor_premium + rrafaktor_beidseitig) + anzahl.get("RRA_bi_auf_Haupstrecke", 0) + anzahl.get("RRA_bi_Korrektur", 0) + self.Mengen["RRA_bi_Korrektur"] = anzahl.get("RRA_bi_Korrektur", 0) + self.Mengen["RRA_bi_auf_Haupstrecke"] = anzahl.get("RRA_bi_auf_Haupstrecke", 0) + + if(anzahl.get("Flex-A_Premium", False)): + self.Mengen["RRA_bi_ohne_SPS-Ansteuerung"] = self._RSM_Anzahl * 4 + else: + self.Mengen["RRA_bi_ohne_SPS-Ansteuerung"] = 0 + + self.Mengen["gemeinsame_Wendung"] = anzahl.get("gemeinsame_Wendung", 0) + + seilzfaktor_premium = 0 + seilzfaktor_getriebe_mitte = 0 + if(anzahl.get("Flex-A_Premium", False)): + seilzfaktor_premium = 2 + if(anzahl.get("Getriebe_in_der_Mitte", False)): + seilzfaktor_getriebe_mitte = 2 + self.Mengen["Seilzugschalter"] = self._RSM_Anzahl * (seilzfaktor_premium + seilzfaktor_getriebe_mitte) + + if(anzahl.get("Flex-A_Premium", False)): + self.Mengen["Mit_Drucktaster"] = self._RSM_Anzahl * 8 # TODO + C40 in excel, allerdings gelbe Zelle ohne Bezüge, Korrektur? + else: + self.Mengen["Mit_Drucktaster"] = 0 # + C40 (s.o.) + + self.Mengen["Meldelampe_Überstrom"] = math.ceil(self._RSM_Anzahl/10) + anzahl.get("Meldelampe_Überstrom_Korrektur", 0) + self.Mengen["Meldelampe_Überstrom_Korrektur"] = anzahl.get("Meldelampe_Überstrom_Korrektur", 0) + self.Mengen["Hauptschalter_Ein-Meldung"] = math.ceil(self._RSM_Anzahl/10) + anzahl.get("Hauptschalter_Ein-Meldung_Korrektur", 0) + self.Mengen["Hauptschalter_Ein-Meldung_Korrektur"] = anzahl.get("Hauptschalter_Ein-Meldung_Korrektur", 0) + self.Mengen["Werma_Rundumleuchte_Störung"] = math.ceil(self._RSM_Anzahl/10) + anzahl.get("Werma_Rundumleuchte_Störung_Korrektur", 0) + self.Mengen["Werma_Rundumleuchte_Störung_Korrektur"] = anzahl.get("Werma_Rundumleuchte_Störung_Korrektur", 0) + + + + +# Flyer_F40_(Electrojet)_incl._Putzmaschine: +class Flyer_F40_EJet_inc_Putz(): + def __init__(self, anzahl:dict): + self.Mengen = { + "Anzahl":0, + "Flyer_Electrojet_incl_intergrierte_Putzmaschine":0, + "Flyer_Electrojet_incl_intergrierte_Putzmaschine_Korrektur":0, + "Flyer_Electrojet_incl_intergrierte_Putzmaschine_Vorpuffer":2, + "Flyer_Electrojet_incl_intergrierte_Putzmaschine_Nachpuffer":2, + "Anzahl_Schienen":0, + "Single-Line_/_Durchfahrt":False, + "Nachpuffer":False, + "Sensor_optisch_Traverse":0, + "Sensor_optisch_Traverse_Korrektur":0, + "Sensor_induktiv_Spulenhalter":0, + "Sensor_induktiv_Spulenhalter_Korrektur":0, + "Bedientableau_2-fach":0, + "Bedientableau_2-fach_Korrektur":0, + "Interface_Doffer":0, + "Interface_Doffer_Korrektur":0, + "Weiche":0, + "Weiche_Korrektur":0, + "Weiche_nach_Flyer_(bipolar)":0, + "Weiche_nach_Flyer_(bipolar)_Korrektur":0, + "Dreifachweiche":0, + "Wechsel":0, + "Stopper":0, + "RA_uni":0, + "RA_uni_abhebbar":0, + "RA_uni_abhebbar_Korrektur":0, + "RA_uni_ohne_SPS-Ansteuerung":0, + "RA_uni_ohne_SPS-Ansteuerung_Korrektur":0, + "RRA_BI_abhebbar":0, + "RRA_BI_abhebbar_Korrektur":0, + "RRA_bi":0, + "RRA_bi_Korrektur":0, + "RRA_bi_ohne_SPS-Ansteuerung":0, + "RRA_bi_ohne_SPS-Ansteuerung_Korrektur":0, + "Doppelstreckenantrieb":0, + "Doppelstreckenantrieb_Korrektur":0, + "RA_bi_abhebbar_(unger._Schiene)":0, + "Meldelampe_Überstrom":0, + "Meldelampe_Überstrom_Korrektur":0, + "Hauptschalter_Ein-Meldung":0, + "Hauptschalter_Ein-Meldung_Korrektur":0, + "Werma_Rundumleuchte_Störung":0, + "Werma_Rundumleuchte_Störung_Korrektur":0, + } + self._Flyer_Anzahl = anzahl.get("Flyer_Electrojet_incl_intergrierte_Putzmaschine", 0) +\ + anzahl.get("Flyer_Electrojet_incl_intergrierte_Putzmaschine_Korrektur", 0) + self.Mengen["Anzahl"] = self._Flyer_Anzahl + self.Mengen["Anzahl_Schienen"] = anzahl.get("Flyer_Electrojet_incl_intergrierte_Putzmaschine_Vorpuffer", 0) +\ + anzahl.get("Flyer_Electrojet_incl_intergrierte_Putzmaschine_Nachpuffer", 0) + self.Mengen["Single-Line_/_Durchfahrt"] = anzahl.get("Single-Line_/_Durchfahrt", False) + self.Mengen["Nachpuffer"] = anzahl.get("Nachpuffer", False) + + #SensoroptTraverse=WENN(B49="ja";B46*(B47*1)+(B46*5)+C50+(B56*2);B46*(B47*1)+(B46*7)+(B56*2))+C50 TODO: Achtung, hier wird C50 zweimal addiert, wenn Nachpuffer==True + # nachpuffer == True: B46*(B47*1)+(B56*2)+(B46*5)+C50 + #else: B46*(B47*1)+(B56*2)+(B46*7)) +C50 + sensorfaktor_nachpuffer = 7 + if(anzahl.get("Nachpuffer", False)): + sensorfaktor_nachpuffer = 5 + self.Mengen["Sensor_optisch_Traverse"] = self._Flyer_Anzahl * (self.Mengen.get("Anzahl_Schienen", 0) + sensorfaktor_nachpuffer) + anzahl.get("Dreifachweiche", 0) * 2 + anzahl.get("Sensor_optisch_Traverse_Korrektur", 0) + self.Mengen["Sensor_optisch_Traverse_Korrektur"] = anzahl.get("Sensor_optisch_Traverse_Korrektur", 0) + self.Mengen["Sensor_induktiv_Spulenhalter"] = self._Flyer_Anzahl * 2 + anzahl.get("Sensor_induktiv_Spulenhalter_Korrektur", 0) + self.Mengen["Sensor_induktiv_Spulenhalter_Korrektur"] = anzahl.get("Sensor_induktiv_Spulenhalter_Korrektur", 0) + self.Mengen["Bedientableau_2-fach"] = self._Flyer_Anzahl + anzahl.get("Bedientableau_2-fach_Korrektur", 0) + self.Mengen["Bedientableau_2-fach_Korrektur"] = anzahl.get("Bedientableau_2-fach_Korrektur", 0) + self.Mengen["Interface_Doffer"] = self._Flyer_Anzahl + anzahl.get("Interface_Doffer_Korrektur", 0) + self.Mengen["Interface_Doffer_Korrektur"] = anzahl.get("Interface_Doffer_Korrektur", 0) + self.Mengen["Weiche"] = self._Flyer_Anzahl * self.Mengen.get("Anzahl_Schienen", 0) + anzahl.get("Weiche_Korrektur", 0) + anzahl.get("Wechsel", 0) + self.Mengen["Weiche"] = anzahl.get("Weiche_Korrektur", 0) + + if(anzahl.get("Single-Line_/_Durchfahrt", False)): + self.Mengen["Weiche_nach_Flyer_(bipolar)"] = self._Flyer_Anzahl + anzahl.get("Weiche_nach_Flyer_(bipolar)_Korrektur", 0) + else: + self.Mengen["Weiche_nach_Flyer_(bipolar)"] = anzahl.get("Weiche_nach_Flyer_(bipolar)_Korrektur", 0) + self.Mengen["Weiche_nach_Flyer_(bipolar)_Korrektur"] = anzahl.get("Weiche_nach_Flyer_(bipolar)_Korrektur", 0) + self.Mengen["Dreifachweiche"] = anzahl.get("Dreifachweiche", 0) + self.Mengen["Wechsel"] = anzahl.get("Wechsel", 0) + self.Mengen["Stopper"] = anzahl.get("Stopper", 0) # TODO: Korrekturfaktor überflüssig da manuelle Eingabe? + self.Mengen["RA_uni"] = anzahl.get("RA_uni", 0) + + rraunifaktor_durchfahrt = 0 + rraunifaktor_nachpuffer = 1 + if(anzahl.get("Single-Line_/_Durchfahrt", False)): + rraunifaktor_durchfahrt = 1 + if(anzahl.get("Nachpuffer", False)): + rraunifaktor_nachpuffer = 0 + self.Mengen["RA_uni_abhebbar"] = self._Flyer_Anzahl * (rraunifaktor_durchfahrt + rraunifaktor_nachpuffer) + anzahl.get("RA_uni_abhebbar_Korrektur", 0) + self.Mengen["RA_uni_abhebbar_Korrektur"] = anzahl.get("RA_uni_abhebbar_Korrektur", 0) + + if(anzahl.get("Single-Line_/_Durchfahrt", False)): + self.Mengen["RA_uni_ohne_SPS-Ansteuerung"] = self._Flyer_Anzahl # TODO: Korrekturfaktor nur wenn Durchfahrt==False? + else: + self.Mengen["RA_uni_ohne_SPS-Ansteuerung"] = anzahl.get("RA_uni_ohne_SPS-Ansteuerung_Korrektur", 0) + self.Mengen["RA_uni_ohne_SPS-Ansteuerung_Korrektur"] = anzahl.get("RA_uni_ohne_SPS-Ansteuerung_Korrektur", 0) + + if(anzahl.get("Single-Line_/_Durchfahrt", False)): # TODO: =WENN($B$48="nein";$B$46*1;0+C62)+WENN($B$48="ja";$B$46*1;0) Sinn? Zellverweise korrekt? + self.Mengen["RRA_BI_abhebbar"] = self._Flyer_Anzahl + else: + self.Mengen["RRA_BI_abhebbar"] = anzahl.get("RRA_BI_abhebbar_Korrektur", 0) + self.Mengen["RRA_BI_abhebbar_Korrektur"] = anzahl.get("RRA_BI_abhebbar_Korrektur", 0) + + self.Mengen["RRA_bi"] = anzahl.get("RRA_bi", 0) # TODO: Rote Zelle? + + if(anzahl.get("Single-Line_/_Durchfahrt", False)): + self.Mengen["RRA_bi_ohne_SPS-Ansteuerung"] = anzahl.get("RRA_bi_ohne_SPS-Ansteuerung_Korrektur", 0) + else: + self.Mengen["RRA_bi_ohne_SPS-Ansteuerung"] = self._Flyer_Anzahl + + if(anzahl.get("Single-Line_/_Durchfahrt", False)): + self.Mengen["Doppelstreckenantrieb"] = (self._Flyer_Anzahl * self.Mengen.get("Anzahl_Schienen", 0))/4 + self._Flyer_Anzahl + else: + self.Mengen["Doppelstreckenantrieb"] = (self._Flyer_Anzahl * self.Mengen.get("Anzahl_Schienen", 0))/4 + anzahl.get("Doppelstreckenantrieb_Korrektur", 0) + self.Mengen["Doppelstreckenantrieb_Korrektur"] = anzahl.get("Doppelstreckenantrieb_Korrektur", 0) + self.Mengen["RA_bi_abhebbar_(unger._Schiene)"] = anzahl.get("RA_bi_abhebbar_(unger._Schiene)", 0) + + self.Mengen["Meldelampe_Überstrom"] = self._Flyer_Anzahl + anzahl.get("Meldelampe_Überstrom_Korrektur", 0) + self.Mengen["Meldelampe_Überstrom_Korrektur"] = anzahl.get("Meldelampe_Überstrom_Korrektur", 0) + self.Mengen["Hauptschalter_Ein-Meldung"] = self._Flyer_Anzahl + anzahl.get("Hauptschalter_Ein-Meldung_Korrektur", 0) + self.Mengen["Hauptschalter_Ein-Meldung_Korrektur"] = anzahl.get("Hauptschalter_Ein-Meldung_Korrektur", 0) + self.Mengen["Werma_Rundumleuchte_Störung"] = self._Flyer_Anzahl + anzahl.get("Werma_Rundumleuchte_Störung_Korrektur", 0) + self.Mengen["Werma_Rundumleuchte_Störung_Korrektur"] = anzahl.get("Werma_Rundumleuchte_Störung_Korrektur", 0) + +# Putzmaschine_(Neuenhauser): +class Putzmaschine_Neuenhauser(): + def __init__(self, anzahl:dict): + self._Mengen = { + "Anzahl":0, + "Neuenhauser-Putzmaschine_Vorpuffer":0, + "Neuenhauser-Putzmaschine_Nachpuffer":0, + "Anzahl_Vorstaustrecken":0, + "Anzahl_Nachstaustrecken":0, + "Sensor_optisch_Traverse":0, + "Sensor_optisch_Traverse_Korrektur":0, + "Sensorik_Zugpositionierung":0, + "Sensor_WT18_Spulenprüfung_voll/leer":0, + "Bedientableau_2-fach":0, + "Bedientableau_2-fach_Korrektur":0, + "Interface_Putzmaschine":0, + "Weiche":0, + "Weiche_Korrektur":0, + "Weiche_nach_PM_(bipolar)":0, + "RA_uni_abhebbar":0, + "RA_uni_abhebbar_Korrektur":0, + "RA_uni_ohne_SPS-Ansteuerung":0, + "RA_uni_abhebbar_(unger._Sch.)":0, + "Doppelstreckenantrieb":0, + "Meldelampe_Überstrom":0, + "Meldelampe_Überstrom_Korrektur":0, + "Hauptschalter_Ein-Meldung":0, + "Hauptschalter_Ein-Meldung_Korrektur":0, + "Werma_Rundumleuchte_Störung":0, + "Werma_Rundumleuchte_Störung_Korrektur":0, + } + self._Putze_Anzahl = anzahl.get("Neuenhauser-Putzmaschine", 0) + self._Vorpuffer_Anzahl = anzahl.get("Neuenhauser-Putzmaschine_Vorpuffer", 0) + self._Nachpuffer_Anzahl = anzahl.get("Neuenhauser-Putzmaschine_Nachpuffer", 0) + self._Mengen["Anzahl"] = self._Putze_Anzahl + self._Mengen["Neuenhauser-Putzmaschine_Vorpuffer"] = self._Vorpuffer_Anzahl + self._Mengen["Neuenhauser-Putzmaschine_Nachpuffer"] = self._Nachpuffer_Anzahl + + self._Mengen["Sensor_optisch_Traverse"] = self._Putze_Anzahl * (self._Vorpuffer_Anzahl + self._Nachpuffer_Anzahl + 3) + anzahl.get("Sensor_optisch_Traverse_Korrektur", 0) + self._Mengen["Sensor_optisch_Traverse_Korrektur"] = anzahl.get("Sensor_optisch_Traverse_Korrektur", 0) + + self._Mengen["Sensorik_Zugpositionierung"] = self._Putze_Anzahl * 4 + self._Mengen["Sensor_WT18_Spulenprüfung_voll/leer"] = self._Putze_Anzahl * 2 + + self._Mengen["Bedientableau_2-fach"] = self._Putze_Anzahl + anzahl.get("Bedientableau_2-fach_Korrektur", 0)#=Mengengerüst!B72+Mengengerüst!G72 TODO: ist G72 Korrektur? + self._Mengen["Bedientableau_2-fach_Korrektur"] = anzahl.get("Bedientableau_2-fach_Korrektur", 0) + + self._Mengen["Interface_Putzmaschine"] = self._Putze_Anzahl + self._Mengen["Weiche"] = self._Putze_Anzahl * self._Vorpuffer_Anzahl + anzahl.get("Weiche_Korrektur", 0) + self._Mengen["Weiche_Korrektur"] = anzahl.get("Weiche_Korrektur", 0) + self._Mengen["Weiche_nach_PM_(bipolar)"] = self._Putze_Anzahl * (self._Nachpuffer_Anzahl-1) # TODO: Wert kann negativ sein... + self._Mengen["RA_uni_abhebbar"] = self._Putze_Anzahl + anzahl.get("RA_uni_abhebbar_Korrektur", 0) + self._Mengen["RA_uni_abhebbar_Korrektur"] = anzahl.get("RA_uni_abhebbar_Korrektur", 0) + self._Mengen["RA_uni_ohne_SPS-Ansteuerung"] = self._Putze_Anzahl + + self._Mengen["RA_uni_abhebbar_(unger._Sch.)"] = self._Putze_Anzahl * (math.floor(self._Vorpuffer_Anzahl/3) + math.floor(self._Nachpuffer_Anzahl/3)) + self._Mengen["Doppelstreckenantrieb"] = self._Putze_Anzahl * (math.floor(self._Vorpuffer_Anzahl/2) + math.floor(self._Nachpuffer_Anzahl/2)) + self._Mengen["Meldelampe_Überstrom"] = self._Putze_Anzahl + anzahl.get("Meldelampe_Überstrom_Korrektur", 0) + self._Mengen["Meldelampe_Überstrom_Korrektur"] = anzahl.get("Meldelampe_Überstrom_Korrektur", 0) + self._Mengen["Hauptschalter_Ein-Meldung"] = self._Putze_Anzahl + anzahl.get("Hauptschalter_Ein-Meldung_Korrektur", 0) + self._Mengen["Hauptschalter_Ein-Meldung_Korrektur"] = anzahl.get("Hauptschalter_Ein-Meldung_Korrektur", 0) + self._Mengen["Werma_Rundumleuchte_Störung"] = self._Putze_Anzahl + anzahl.get("Werma_Rundumleuchte_Störung_Korrektur", 0) + self._Mengen["Werma_Rundumleuchte_Störung_Korrektur"] = anzahl.get("Werma_Rundumleuchte_Störung_Korrektur", 0) + + + +# Flyer_(Electrojet): +class Flyer_EJet(): + def __init__(self, anzahl:dict): + self._Mengen = { + "Anzahl":0, + "Anzahl_Schienen:":0, + "Sensor_optisch_Traverse":0, + "Sensor_optisch_Traverse_Korrektur":0, + "Sensor_induktiv_Spulenalter_(Zug_positionierung)":0, + "Bedientableau_2-fach":0, + "Interface_Doffer":0, + "Weiche":0, + "Weiche_Korrektur":0, + "Weiche_nach_Flyer_(bipolar)":0, + "Weiche_nach_Flyer_(bipolar)_Korrektur":0, + "Dreifachweiche":0, + "Wechsel":0, + "Wechsel_Korrektur":0, + "RA_bi_ohne_SPS-Ansteuerung":0, + "RA_bi_abhebbar":0, + "RA_bi_abhebbar_Korrektur":0, + "RA_bi":0, + "Doppelstreckenantrieb":0, + "RA_bi_abhebbar_(unger._Schiene)":0, + "Meldelampe_Überstrom":0, + "Meldelampe_Überstrom_Korrektur":0, + "Hauptschalter_Ein-Meldung":0, + "Hauptschalter_Ein-Meldung_Korrektur":0, + "Werma_Rundumleuchte_Störung":0, + "Werma_Rundumleuchte_Störung_Korrektur":0, + } + + self._Flyer_Anzahl = anzahl.get("Flyer", 0) + self._Mengen["Anzahl"] = anzahl.get("Flyer", 0) + self._Schienen_Anzahl = anzahl.get("Anzahl_Schienen", 0) + self._Mengen["Anzahl_Schienen"] = anzahl.get("Anzahl_Schienen", 0) + + self._Mengen["Sensor_optisch_Traverse"] = self._Flyer_Anzahl * (2*self._Schienen_Anzahl + 3) + anzahl.get("Sensor_optisch_Traverse_Korrektur", 0) + self._Mengen["Sensor_optisch_Traverse_Korrektur"] = anzahl.get("Sensor_optisch_Traverse_Korrektur", 0) + self._Mengen["Sensor_induktiv_Spulenalter_(Zug_positionierung)"] = self._Flyer_Anzahl + self._Mengen["Bedientableau_2-fach"] = self._Flyer_Anzahl + self._Mengen["Interface_Doffer"] = self._Flyer_Anzahl + self._Mengen["Weiche"] = self._Flyer_Anzahl * self._Schienen_Anzahl + anzahl.get("Weiche_Korrektur", 0) + self._Mengen["Weiche_Korrektur"] = anzahl.get("Weiche_Korrektur", 0) + self._Mengen["Weiche_nach_Flyer_(bipolar)"] = self._Flyer_Anzahl + anzahl.get("Weiche_nach_Flyer_(bipolar)_Korrektur", 0) + self._Mengen["Weiche_nach_Flyer_(bipolar)_Korrektur"] = anzahl.get("Weiche_nach_Flyer_(bipolar)_Korrektur", 0) + self._Mengen["Dreifachweiche"] = anzahl.get("Dreifachweiche", 0) + self._Mengen["Wechsel"] = self._Flyer_Anzahl + anzahl.get("Wechsel_Korrektur", 0) + self._Mengen["Wechsel_Korrektur"] = anzahl.get("Wechsel_Korrektur", 0) + self._Mengen["RA_bi_ohne_SPS-Ansteuerung"] = self._Flyer_Anzahl + self._Mengen["RA_bi_abhebbar"] = self._Flyer_Anzahl + anzahl.get("RA_bi_abhebbar_(unger._Schiene)", 0) + anzahl.get("RA_bi_abhebbar_Korrektur", 0) + self._Mengen["RA_bi_abhebbar_Korrektur"] = anzahl.get("RA_bi_abhebbar_Korrektur", 0) + self._Mengen["RA_bi"] = anzahl.get("RA_bi", 0) + self._Mengen["Doppelstreckenantrieb"] = self._Flyer_Anzahl * math.floor(self._Schienen_Anzahl/2) + self._Mengen["RA_bi_abhebbar_(unger._Schiene)"] = anzahl.get("RA_bi_abhebbar_(unger._Schiene)", 0) + self._Mengen["Meldelampe_Überstrom"] = self._Flyer_Anzahl + anzahl.get("Meldelampe_Überstrom_Korrektur", 0) + self._Mengen["Meldelampe_Überstrom_Korrektur"] = anzahl.get("Meldelampe_Überstrom_Korrektur", 0) + self._Mengen["Hauptschalter_Ein-Meldung"] = self._Flyer_Anzahl + anzahl.get("Hauptschalter_Ein-Meldung_Korrektur", 0) + self._Mengen["Hauptschalter_Ein-Meldung_Korrektur"] = anzahl.get("Hauptschalter_Ein-Meldung_Korrektur", 0) + self._Mengen["Werma_Rundumleuchte_Störung"] = self._Flyer_Anzahl + anzahl.get("Werma_Rundumleuchte_Störung_Korrektur", 0) + self._Mengen["Werma_Rundumleuchte_Störung_Korrektur"] = anzahl.get("Werma_Rundumleuchte_Störung_Korrektur", 0) + + +# Verbindungsstrecken/_Wechsel: +class Verbindungsstrecken_Wechsel(): + def __init__(self, deckblatt:dict): + self.Mengen = { + "Sensor_optisch_Traverse":0, + "Bedientableau_1-fach":0, + "Bedientableau_2-fach":0, + "Bedientableau_14-fach":0, + "Weiche":0, + "Dreifachweiche":0, + "Kreuzungsweiche":0, + "Werma_Rundumleuchte_Störung":0, + "RA_uni":0, + "RA_uni_ohne_SPS-Ansteuerung":0, + "RA_bi":0, + "RA_bi_ohne_SPS-Ansteuerung":0, + "Doppelstreckenantrieb":0 + } + self._Deckblatt = deckblatt + +# Puffer +class Puffer(): + def __init__(self, deckblatt:dict): + self.Mengen = { + "Anzahl":0, + "Anzahl_Staustrecken":0, + "Sensor_optisch_Traverse":0, + "Weiche":0, + "RA_bi_(ungerade_Schiene)":0, + "Doppelstreckenantrieb":0, + "Meldelampe_Überstrom":0, + "Hauptschalter_Ein-Meldung":0 + } + self._Deckblatt = deckblatt + +# Turm +class Turm(): + inhalt = { + #"Anzahl":0, + "Anzahl_Staustrecken":0, + "Sensor_optisch_Traverse":0, + "Weiche":0, + "RA_bi":0, + "RA_bi_ohne_SPS":0, + "Bedientableau_2-fach":0, + } + + def __init__(self, anzahl:dict): + self._Anzahl = anzahl + + + +class EA(): + def __init__(self, anzahl:dict): + # Eingänge und Ausgänge jeder Hardwareeinheit + self.EAs = { + # # Bedienelemente_Steuerschrank + # "Drucktaster_Anlage_AUS": (1, 0), + # "Leuchtdrucktaster_Anlage_EIN": (1, 1), + # "Leuchtdrucktaster_Start_nach_Stoerung": (1, 1), + # "Leuchtdrucktaster_Laufzeitfehler": (1, 1), + # "Sammeleingang_Ueberstrom": (1, 1), + # "Sammeleingang_Not_Aus": (1, 1), + # "Sammeleingang_Druckluft_fehlt": (1, 1), + # "Drucktaster_Reset": (1, 0), + # "Sammeleingang_Antriebe_abheben": (1, 1), + # "Reserve": (7, 9), + "Bedienelemente_Steuerschrank": (16, 16), + + # Bedienstation, + "bedienstation_1fach_Not_Aus": (1, 1), + "bedienstation_einfach_Zug_Wechseln": (1, 1), + "bedienstation_zweifach_Wechs_BCD_8f": (4, 1), + "bedienstation_zweifach_Not_Aus_Fahrdauerueb": (2, 2), + "bedienst_dreifach": (3, 3), + "bedienst_vierfach": (4, 4), + "bedienst_sechsfach": (6, 6), + + # Ermittlung_Mengengeruest_Anzahl, + "Sensor_Traversenabfrage_optisch": (1, 0), + "Reflexionslichtschranke_RSM_DIRECT": (1, 0), + "Sensor_Stopper_induktiv": (1, 0), + "Seilzugschalter": (1, 0), + + "Weiche": (0, 1), + "Weiche_mit_gemeinsamer_Rueckstellung": (0, 1), + "gemeinsame_Weichenrueckstellung": (0, 1), + "Dreifach_Weiche_DIRECT": (0, 4), + "Kreuzungsweiche": (0, 10), + "Stopper": (0, 0), + "Ventil_RA_3_2_abhebbar": (0, 1), + "Ventil_Doppelstreckenantrieb_5_2_abhebbar": (0, 2), + "Blitzleuchte_Stoerung": (0, 1), + + "Schnittstelle_Flyer_Mazoli": (1, 2), + "Schnittstelle_Putzmaschine_Cason": (3, 1), + + "Spulenumsetzstation": (0, 20), + + "RA_unidirektional": (0, 1), + "RA_unidirektional_abhebbar": (0, 1), + "RA_unidirektional_mit_gemeinsamer_Wendung": (0, 1), + "RA_unidirektional_ohne_SPS_Ansteuerung": (0, 0), + "RA_bidirektional": (0, 2), + "RA_bidirektional_abhebbar": (0, 2), + "RA_bidirektional_abhebbar_gemeinsWend": (0, 1), + "RA_bidirektional_ohne_SPS_Ansteuerung": (0, 0), + "RA_in_RSM_bidirektional": (0, 2), + "RA_in_RSM_bi_Anzahl_Antriebe_je_Seite": (0, 0), # Füll zeile. Eigentlich gibt es hier keine E/As. Dies wird hier nur die Anzahl gebraucht + "Doppelstreckenantrieb": (0, 2), + "Doppelstreckenantriebgemeinsame_Wendung": (0, 1), + "gemeinsame_Wendung": (0, 2), + } + + self._Anzahl = anzahl + Stopper = anzahl.get("Stopper", 0) + if Stopper > 0: + self._Anzahl["Sensor_Stopper_induktiv"] = anzahl.get("Stopper", 0) + + RA_unidirektional_abhebbar = anzahl.get("RA_unidirektional_abhebbar", 0) + RA_bidirektional_abhebbar = anzahl.get("RA_bidirektional_abhebbar", 0) + RA_bidirektional_abhebbar_gemeinsWend = anzahl.get("RA_bidirektional_abhebbar_gemeinsWend", 0) + Ventil_RA_3_2_abhebbar = RA_unidirektional_abhebbar + \ + RA_bidirektional_abhebbar + RA_bidirektional_abhebbar_gemeinsWend + if Ventil_RA_3_2_abhebbar > 0: + self._Anzahl["Ventil_RA_3_2_abhebbar"] = Ventil_RA_3_2_abhebbar + + Doppelstreckenantrieb = anzahl.get("Doppelstreckenantrieb", 0) + Doppelstreckenantriebgemeinsame_Wendung = anzahl.get("Doppelstreckenantriebgemeinsame_Wendung", 0) + Ventil_Doppelstreckenantrieb_5_2_abhebbar = Doppelstreckenantrieb + Doppelstreckenantriebgemeinsame_Wendung + if Ventil_Doppelstreckenantrieb_5_2_abhebbar > 0: + self._Anzahl["Ventil_Doppelstreckenantrieb_5_2_abhebbar"] = Ventil_Doppelstreckenantrieb_5_2_abhebbar + + # TODO Letzer Abschnit der EAS? "Zentraler Aufbau der SPS..." wo verwendet? + + def getE(self, partname): + return self.EAs[partname][0] + def getA(self, partname): + return self.EAs[partname][1] + def anzahl(self, partname): + return self._Anzahl.get(partname, 0) + + def get_SE(self, partname): + num_of_e = self.getE(partname) + zahl = self.anzahl(partname) + return num_of_e * zahl + def get_SA(self, partname): + num_of_a = self.getA(partname) + zahl = self.anzahl(partname) + return num_of_a * zahl + + def __repr__(self): + return repr(self._Anzahl) + + + def gesamt_E(self): + res = 0 + for k,n in self._Anzahl.items(): + res += self.EAs[k][0] * n + return res + + def gesamt_A(self): + res = 0 + for k,n in self._Anzahl.items(): + res += self.EAs[k][1] * n + return res + +class HW(): + # Einzelteilpreise in € + ep = { + # Material Anzahl + # Material in LL + # schaltschrank_anzahl + "schaltschrankgehäuse_und_zubehör": 850, + "einspeisungssatz": 350, + "kleinmaterial": 350, + # _Summe_Schaltschrank + + # unterverteiler, + "unterverteilergehäuse_und_zubehör": 850, + "hauptschalter": 25, + "hauptschütz": 30, + "kleinmaterial_unterverteiler": 400, + # _Summe_Unterverteiler + # _Anzahl_Unterverteiler + + "schnittstellenrelais": 5, + + "antrieb_unidirektional_halbleiter": 55, + "antrieb_bidirektional_halbleiter": 60, + "antrieb_unidirektional_schütz": 65, + "antrieb_bidirektional_schütz": 80, + "motorschutzschalter": 30, + "gemeinsame_wendung": 60, + # _Summe_Motorstarter + + "bedienstation_1fach": 23, + "bedienst_2fach_red": 68, + "bedienstation_2": 52, + "bedienstation_3": 66, + "bedienstation_4": 81, + "bedienstation_6": 109, + # _Summe_Bedienstationen + + "panel_pc": 3.736, + "pc": 1.200, + "switch": 98, + "ewon_router_für_fernwartung": 750, + "drucker": 200, + # _Summe_PC + + "profibus_asi_gateway_netzteil": 666, + "ein_ausgangsmodul": 69, + "blindverschlüsse": 0, + "asi_buskabel": 1, + "buskabel_24V": 1, + "extension_plug": 39, + "profibus_stecker": 35, + # _Summe_ASI_Hardware + + # bis_64_E/A + # sps_hardware_vipa_100, + "cpu_114r_16de_8da": 258, + "mmc_512kb_memory_64": 30, + "eingangskarte_8de": 119, + "ausgangskarte_8da_bereits_integriert": 0, + "eingangskarte_16de": 230, + "ausgangskarte_16da_bereits_integriert": 0, + + # bis_1.000_E_A + # sps_hardware_siemens_s7_300 + "cpu_315_2_pn_dp_mit_ethernet": 1.625, + "cpu_315sn_net_vipa": 1.376, + "mmc_512kb_memory_1000": 130, + "cpu_317_2_pn_dp_mit_ethernet": 2.872, + "cpu_317sn_net_vipa": 2.295, + "cpu_319_2_pn_dp_mit_ethernet": 3.453, + "mmc_2mb_memory": 186, + "kommunikationsprozessor_cp_343_1": 983, + "et200m_anschaltung_im_153": 169, + "profibusstecker_je_1st_cpu_und_im153": 35, + "eingangskarte_sm_321_16de": 75, + "ausgangskarte_sm_322_16da": 103, + "frontstecker_für_ein_ausgangskarte_16": 16, + "eingangskarte_sm_321_32de": 149, + "ausgangskarte_sm_322_32da": 206, + "frontstecker_für_ein_ausgangskarte_32": 33, + + # über_1.000_E_A + # sps_hardware_siemens_s7_400, + "cpu_414_2": 2.317, + "baugruppenträger_ur_1": 593, + "stromversorgung_ps405_230vac10A": 444, + "pufferbatterie": 8, + "speicherkarte_2_mb": 543, + "ethernet_anschaltung_cp443_1": 1.388, + "eingangskarte_sm_421_32de": 209, + "ausgangskarte_sm_422_32da": 307, + "frontstecker_für_ein_ausgangskarte": 27, + + # _Summe_Material_in_LL + + # Material_vor_Ort + "movimot_fu_mit_anschaltung": 550, + "trolleytraversensabfrage_optisch": 29, + "reflexionslichtschranke_rsm_direct": 41, + "stoppersensor_induktiv": 30, + "seilzugschalter": 150, + "blitzleuchte": 85, + "spulenumsetzstation": 0, + "sensorkabel_je_20m": 20, + "stopper_weichenkabel_je_5m": 12, + "motorkabel_je_40m": 16, + "kabelpritschen_leitern": 10, + "kabelpritsche_rsm": 4, + "klemmkasten_flyer_und_putzmaschine": 120, + "klemmkasten_direct_in_rsm": 90, + "erdung": 154, + "kleinteile": 750, + + "sonstige_kabel_busleitung_etc": 750, + "zuleitung_unterverteiler_4x10_40m": 144, + "zuleitung_unterverteiler_7x4_40m": 80, + "profibuskabel": 30, + "schnittstellen_8x1mm": 21, + } + + Keys_of_LL = ["movimot_fu_mit_anschaltung", "trolleytraversensabfrage_optisch", + "reflexionslichtschranke_rsm_direct", + "stoppersensor_induktiv", "seilzugschalter", "blitzleuchte", "spulenumsetzstation", + "sensorkabel_je_20m", + "stopper_weichenkabel_je_5m", "motorkabel_je_40m", "kabelpritschen_leitern", "kabelpritsche_rsm", + "klemmkasten_flyer_und_putzmaschine", "klemmkasten_direct_in_rsm", "erdung", "kleinteile", + "sonstige_kabel_busleitung_etc", "zuleitung_unterverteiler_4x10_40m", + "zuleitung_unterverteiler_7x4_40m", + "profibuskabel", "schnittstellen_8x1mm"] + + def __init__(self, anzahl:dict, eas: type[EA]): + self._anzahl = anzahl + + ## Material in LL + self._anzahl["schnittstellenrelais"] = eas.get_SA("Schnittstelle_Flyer_Mazoli") +\ + eas.get_SA("Schnittstelle_Putzmaschine_Cason") + + self._anzahl["antrieb_unidirektional_halbleiter"] = eas.anzahl("RA_unidirektional") + \ + eas.anzahl("RA_unidirektional_abhebbar") + \ + eas.anzahl("RA_unidirektional_mit_gemeinsamer_Wendung") + \ + eas.anzahl("RA_unidirektional_ohne_SPS_Ansteuerung") + \ + eas.anzahl("RA_bidirektional_abhebbar_gemeinsWend") + # self._anzahl["antrieb_bidirektional_halbleiter"] = eas.anzahl("RA_bidirektional") + \ + # eas.anzahl("RA_bidirektional_abhebbar") + \ + # eas.anzahl("RA_bidirektional_ohne_SPS_Ansteuerung") +\ + # eas.anzahl("Doppelstreckenantrieb") + self._anzahl["antrieb_bidirektional_halbleiter"] = eas.anzahl("RA_bidirektional") + \ + eas.anzahl("RA_bidirektional_abhebbar") + \ + eas.anzahl("RA_bidirektional_abhebbar_gemeinsWend") +\ + eas.anzahl("RA_bidirektional_ohne_SPS_Ansteuerung") +\ + eas.anzahl("RA_in_RSM_bidirektional") + self._anzahl["antrieb_unidirektional_schütz"] = eas.anzahl("Stopper") + \ + eas.anzahl("Ventil_RA_3_2_abhebbar") + \ + eas.anzahl("Ventil_Doppelstreckenantrieb_5_2_abhebbar") + self._anzahl["antrieb_bidirektional_schütz"] = eas.anzahl("Blitzleuchte_Stoerung") + \ + eas.anzahl("Ventil_RA_3_2_abhebbar") + \ + eas.anzahl("Ventil_Doppelstreckenantrieb_5_2_abhebbar") + + self._anzahl["motorschutzschalter"] = eas.anzahl("RA_in_RSM_bidirektional") * eas.anzahl("RA_in_RSM_bi_Anzahl_Antriebe_je_Seite") + self._anzahl["gemeinsame_wendung"] = eas.anzahl("RA_in_RSM_bidirektional") + eas.anzahl("gemeinsame_Wendung") + + self._anzahl["bedienstation_1fach"] = eas.anzahl("bedienstation_1fach_Not_Aus") + eas.anzahl("bedienstation_einfach_Zug_Wechseln") + self._anzahl["bedienst_2fach_red"] = eas.anzahl("bedienstation_zweifach_Wechs_BCD_8f") + self._anzahl["bedienstation_2"] = eas.anzahl("bedienstation_zweifach_Not_Aus_Fahrdauerueb") + self._anzahl["bedienstation_3"] = eas.anzahl("bedienst_dreifach") + self._anzahl["bedienstation_4"] = eas.anzahl("bedienst_vierfach") + self._anzahl["bedienstation_6"] = eas.anzahl("bedienst_sechsfach") + + ein_ausgangsmodul = self._anzahl.get("ein_ausgangsmodul", 0) + profibus_asi_gateway_netzteil = math.ceil(ein_ausgangsmodul / 25) # Excel AUFRUNDEN() + self._anzahl["profibus_asi_gateway_netzteil"] = profibus_asi_gateway_netzteil + self._anzahl["blindverschlüsse"] = ein_ausgangsmodul * 2 + self._anzahl["asi_buskabel"] = profibus_asi_gateway_netzteil * 100 + self._anzahl["buskabel_24V"] = profibus_asi_gateway_netzteil * 100 + + self._anzahl["profibus_stecker"] = ein_ausgangsmodul + + ## bis_64_E/A + self._anzahl["ausgangskarte_8da_bereits_integriert"] = self._anzahl.get("eingangskarte_8de", 0) + self._anzahl["ausgangskarte_16da_bereits_integriert"] = self._anzahl.get("eingangskarte_16de", 0) + + ## bis_1.000_E_A + self._anzahl["mmc_512kb_memory_64"] = self._anzahl.get("cpu_315_2_pn_dp_mit_ethernet", 0) + \ + self._anzahl.get("cpu_315sn_net_vipa", 0) + self._anzahl["mmc_2mb_memory"] = self._anzahl.get("cpu_317_2_pn_dp_mit_ethernet", 0) + \ + self._anzahl.get("cpu_317sn_net_vipa", 0) + \ + self._anzahl.get("cpu_319_2_pn_dp_mit_ethernet", 0) + + et200m_anschaltung_im_153 = self._anzahl.get("eingangskarte_sm_321_16de", 0) + \ + self._anzahl.get("ausgangskarte_sm_322_16da", 0) + \ + self._anzahl.get("eingangskarte_sm_321_32de", 0) + \ + self._anzahl.get("eingangskarte_sm_321_32da", 0) + self._anzahl["et200m_anschaltung_im_153"] = math.floor(et200m_anschaltung_im_153 /8) # Excel: ABRUNDEN() + self._anzahl["profibusstecker_je_1st_cpu_und_im153"] = self._anzahl.get("et200m_anschaltung_im_153", 0) + 1 + self._anzahl["frontstecker_für_ein_ausgangskarte_16"] = self._anzahl.get("eingangskarte_sm_321_16de", 0) + \ + self._anzahl.get("ausgangskarte_sm_322_16da", 0) + self._anzahl["frontstecker_für_ein_ausgangskarte_32"] = self._anzahl.get("eingangskarte_sm_321_32de", 0) + \ + self._anzahl.get("ausgangskarte_sm_322_32da", 0) + ## über_1.000_E_A + self._anzahl["frontstecker_für_ein_ausgangskarte_32"] = self._anzahl.get("eingangskarte_sm_421_32de", 0) + \ + self._anzahl.get("ausgangskarte_sm_422_32da", 0) + + ## Material_vor_Ort + self._anzahl["trolleytraversensabfrage_optisch"] = eas.anzahl("Sensor_Traversenabfrage_optisch") + self._anzahl["reflexionslichtschranke_rsm_direct"] = eas.anzahl("Reflexionslichtschranke_RSM_DIRECT") + self._anzahl["stoppersensor_induktiv"] = eas.anzahl("Sensor_Stopper_induktiv") + self._anzahl["seilzugschalter"] = eas.anzahl("Seilzugschalter") + self._anzahl["blitzleuchte"] = eas.anzahl("Blitzleuchte_Stoerung") + self._anzahl["spulenumsetzstation"] = eas.anzahl("Spulenumsetzstation") + self._anzahl["sensorkabel_je_20m"] = eas.anzahl("Sensor_Traversenabfrage_optisch") +\ + eas.anzahl("Reflexionslichtschranke_RSM_DIRECT") +\ + eas.anzahl("Sensor_Stopper_induktiv") +\ + eas.anzahl("Seilzugschalter") + self._anzahl["stopper_weichenkabel_je_5m"] = eas.anzahl("Weiche") +\ + eas.anzahl("Weiche_mit_gemeinsamer_Rueckstellung") +\ + eas.anzahl("gemeinsame_Weichenrueckstellung") +\ + eas.anzahl("Dreifach_Weiche_DIRECT") +\ + eas.anzahl("Kreuzungsweiche") +\ + eas.anzahl("Stopper") +\ + eas.anzahl("Ventil_RA_3_2_abhebbar") +\ + eas.anzahl("Ventil_Doppelstreckenantrieb_5_2_abhebbar") + self._anzahl["motorkabel_je_40m"] = self._anzahl.get("antrieb_unidirektional_halbleiter", 0) +\ + self._anzahl.get("antrieb_bidirektional_halbleiter", 0) + self._anzahl["klemmkasten_flyer_und_putzmaschine"] = eas.anzahl("Schnittstelle_Flyer_Mazoli") +\ + eas.anzahl("Schnittstelle_Putzmaschine_Cason") + self._anzahl["klemmkasten_direct_in_rsm"] = eas.anzahl("bedienstation_zweifach_Wechs_BCD_8f") + # TODO anzahl_unterverteiler ist im hw ein Wert im Excel der von Hand eingetragen werden muss? + self._anzahl["zuleitung_unterverteiler_4x10_40m"] = eas.anzahl("anzahl_unterverteiler") + 1 + self._anzahl["zuleitung_unterverteiler_7x4_40m"] = eas.anzahl("anzahl_unterverteiler") + 1 + self._anzahl["profibuskabel"] = eas.anzahl("anzahl_unterverteiler") + 1 + # -> end TODO + self._anzahl["schnittstellen_8x1mm"] = eas.anzahl("Schnittstelle_Flyer_Mazoli") +\ + eas.anzahl("Schnittstelle_Putzmaschine_Cason") + + + # remove all elements with the number of 0. They are of no use + l = [] + for k,v in self._anzahl.items(): + if v == 0: + l.append(k) + for item in l: + del self._anzahl[item] + + def __repr__(self): + return repr(self._anzahl) + + def anzahl(self, partname): + return self._anzahl.get(partname, 0) + + def summe_gesamt(self): + """ + :return: price sum of all given items within self._anzahl + """ + res = 0 + for k,anz in self._anzahl.items(): + preis = anz * self.ep[k] + res += preis + return res + def summe_in_LL(self): + res = 0 + for k,anz in self._anzahl.items(): + if k in self.Keys_of_LL: + preis = anz * self.ep[k] + res += preis + return res + + def summe_vorort(self): + res = 0 + for k,anz in self._anzahl.items(): + if k in self.Keys_of_LL: + pass + else: + preis = anz * self.ep[k] + res += preis + + return res + +class Dienstleistung(): + + + def __init__(self, Anzahl_DL, ea: type[EA], hw: type[HW]): + + self._Hours = Anzahl_DL + + # TODO Warum ist hier RA _uni und _bi mit drin? + Summe_EA_plus_Antriebe = ea.gesamt_E() + ea.gesamt_A() +\ + ea.anzahl("RA_unidirektional_ohne_SPS_Ansteuerung") +\ + ea.anzahl("RA_bidirektional_ohne_SPS_Ansteuerung") + # TODO woher kommen die "magic numbers" /8 usw. ? + self.Hardwareplan_Erstellung_Steuerungslayout = Summe_EA_plus_Antriebe/8* 0.6 + self.Schaltplanerstellung_incl_Korrekturen = Summe_EA_plus_Antriebe/8* 1.25 + self.Materialdisposition = Summe_EA_plus_Antriebe * 0.05 + # hier nur zur visualisierung der Ergebnisse: + self._Hours["Hardwareplan_Erstellung_Steuerungslayout"] = self.Hardwareplan_Erstellung_Steuerungslayout + self._Hours["Schaltplanerstellung_incl_Korrekturen"] = self.Schaltplanerstellung_incl_Korrekturen + self._Hours["Materialdisposition"] = self.Materialdisposition + + self.Pflichtenheft_Autom_Schnittstellen = Anzahl_DL["Pflichtenheft_Autom_Schnittstellen"] + # Hardwareplanung + self.Projektkoordination = Anzahl_DL["Projektkoordination"] + + self.Abstimmung_mit_E_Werkstatt = Anzahl_DL["Abstimmung_mit_E_Werkstatt"] + self.Erstellen_E_Montageunterlagen = Anzahl_DL["Erstellen_E_Montageunterlagen"] + # Test_und_Installation + self.PC_Installation = Anzahl_DL["PC_Installation"] + self.Oberfläche_Simulation = Anzahl_DL["Oberfläche_Simulation"] + self.SPS_Test_im_Haus_Simulation = Anzahl_DL["SPS_Test_im_Haus_Simulation"] + # Dokumentation + self.Bedienerhandbuch = Anzahl_DL["Bedienerhandbuch"] + self.SPS_Doku = Anzahl_DL["SPS_Doku"] + self.PC_Doku = Anzahl_DL["PC_Doku"] + # Elektrowerkstatt + # TODO: Woher kokmmt "Summe Schaltschrank" im Excel Reiter "HW"? woher "Anzahl Unterverteiler" B20? was soll 0.5 * 20 ? + #self.Schaltschrankbau = hw.anzahl("schaltschrankgehäuse_und_zubehör") * hw.anzahl("summe_schaltschrank")/0.4 +\ + # (hw.anzahl("summe_unterverteiler") * hw.anzahl("unterverteilergehäuse_und_zubehör")) / 0.5 * 20 + self.Schaltschrankbau = 0 + self.Klemmkastenbau_je_1h = hw.anzahl("klemmkasten_direct_in_rsm") + hw.anzahl("klemmkasten_flyer_und_putzmaschine") + self.Bedientableaubau = ( hw.anzahl("bedienstation_1fach") +\ + hw.anzahl("bedienst_2fach_red") +\ + hw.anzahl("bedienstation_2") +\ + hw.anzahl("bedienstation_3") +\ + hw.anzahl("bedienstation_4") +\ + hw.anzahl("bedienstation_6") ) * 0.5 + # hier nur zur visualisierung der Ergebnisse: + self._Hours["Schaltschrankbau"] = self.Schaltschrankbau + self._Hours["Klemmkastenbau_je_1h"] = self.Klemmkastenbau_je_1h + self._Hours["Bedientableaubau"] = self.Bedientableaubau + self.Vormontage_im_Haus = Anzahl_DL["Vormontage_im_Haus"] + + # hier sind die Dienstleistungen in Stunden gegeben, bzw. werden errechnet + + def __repr__(self): + return repr(self._Hours) + + def get_hours_of(self, dlname): + return self._Hours.get(dlname, 0) + + def summe_stunden(self): + """returns hours necessary""" + return self.Pflichtenheft_Autom_Schnittstellen + self.Hardwareplan_Erstellung_Steuerungslayout + self.Schaltplanerstellung_incl_Korrekturen + self.Projektkoordination + self.Materialdisposition + self.Abstimmung_mit_E_Werkstatt + self.Erstellen_E_Montageunterlagen + self.PC_Installation + self.Oberfläche_Simulation + self.SPS_Test_im_Haus_Simulation + self.Bedienerhandbuch + self.SPS_Doku + self.PC_Doku + self.Schaltschrankbau + self.Klemmkastenbau_je_1h + self.Bedientableaubau + self.Vormontage_im_Haus + + def stunden_elektrowerkstatt(self): + return self.Schaltschrankbau + self.Klemmkastenbau_je_1h + self.Bedientableaubau + self.Vormontage_im_Haus + + def stunden_elektro_Landsberg(self): + return self.Pflichtenheft_Autom_Schnittstellen + self.Hardwareplan_Erstellung_Steuerungslayout + self.Schaltplanerstellung_incl_Korrekturen + self.Projektkoordination + self.Materialdisposition + self.Abstimmung_mit_E_Werkstatt + self.Erstellen_E_Montageunterlagen + self.PC_Installation + self.Oberfläche_Simulation + self.SPS_Test_im_Haus_Simulation + self.Bedienerhandbuch + self.SPS_Doku + self.PC_Doku + +class calc_main_tab(): + + # Stundensätze + Preis_Ewerkstatt = 35 # €/h + Preis_Dienstl_LL = 50 # €/h + + SPS_Programmierung = 80 # €/h + SPS_Programmtest = 80 # €/h + PC_Visualisierung = 15 # €/h + + Montage_elektrisch = 50 # €/h + Inbetriebnahmetest_Hardware_durch_Montage = 50 # €/h + + SPS_Inbetriebsetzung = 80 # €/h + PC_Inbetriebsetzung = 80 # €/h + Inbetriebnahmeunterstützung_durch_Montage = 50 # €/h + + Übersetzung_Dokumentation = 1.000 # €/h + Schulung_vor_Ort_beim_Kunden = 50 # €/h + + Abnahme = 50 # €/h + + SPS_Anlagenbetreuung = 80 # €/h + PC_Anlagenbetreuung = 80 # €/h + Anlagenbetreuung_durch_Montage = 50 # €/h + + montage_elektrisch = 41 # €/h + sps_inbetriebsetzung = 41 # €/h + pc_inbetriebsetzung = 41 # €/h + hotelkosten_pro_tag = 70 # €/h + + def __init__(self, hw, dl): + """ + + :type dl: class Dienstleistung + """ + # KOSTENART + installationsmaterial_vor_ort = hw.summe_vorort() + material_in_ll = hw.summe_in_LL() + HARDWARE_GESAMT = installationsmaterial_vor_ort + hw.summe_in_LL() + + e_werkstatt = dl.stunden_elektrowerkstatt() * self.Preis_Ewerkstatt + dienstleistung_in_ll = dl.stunden_elektro_Landsberg() * self.Preis_Dienstl_LL + sps_programmierung = 7400 + sps_programmtest = 0 + pc_visualisierung = 2000 + + montage_elektrisch = self.Montage_elektrisch * 114 + inbetriebnahmetest_hardware_durch_montage = 0 + + sps_inbetriebsetzung = 0 + pc_inbetriebsetzung = 0 + inbetriebnahmeunterstützung_durch_montage = 0 + + übersetzung_dokumentation = 1000 + schulung_vor_ort_beim_kunden = 0 + + abnahme = 0 + + sps_anlagenbetreuung = 0 + pc_anlagenbetreuung = 0 + anlagenbetreuung_durch_montage = 0 + + # Reisekosten, Spesen + montage_elektrisch = 0 + sps_inbetriebsetzung = 0 + pc_inbetriebsetzung = 0 + hotelkosten_pro_tag = 0 + + +# Press the green button in the gutter to run the script. +if __name__ == '__main__': + # Anzahl der für das Projekt benutzten + Anzahl_EAS = { + "Bedienelemente_Steuerschrank" : 1, + + # Bedienstation, + "bedienstation_1fach_Not_Aus": 0, + "bedienstation_einfach_Zug_Wechseln": 9, + "bedienstation_zweifach_Wechs_BCD_8f": 0, + "bedienstation_zweifach_Not_Aus_Fahrdauerueb": 4, + "bedienst_dreifach": 0, + "bedienst_vierfach": 0, + "bedienst_sechsfach": 0, + + # Ermittlung_Mengengeruest + "Sensor_Traversenabfrage_optisch": 21, + "Reflexionslichtschranke_RSM_DIRECT": 0, + + "Seilzugschalter": 0, + + "Weiche": 16, + "Weiche_mit_gemeinsamer_Rueckstellung": 0, + "gemeinsame_Weichenrueckstellung": 0, + "Dreifach_Weiche_DIRECT": 0, + "Kreuzungsweiche": 0, + "Stopper": 3, + "Blitzleuchte_Stoerung": 2, + + "Schnittstelle_Flyer_Mazoli": 3, + "Schnittstelle_Putzmaschine_Cason": 0, + + "Spulenumsetzstation": 0, + + "RA_unidirektional": 0, + "RA_unidirektional_abhebbar": 0, + "RA_unidirektional_mit_gemeinsamer_Wendung": 9, + "RA_unidirektional_ohne_SPS_Ansteuerung": 0, + "RA_bidirektional": 3, + "RA_bidirektional_abhebbar": 3, + "RA_bidirektional_abhebbar_gemeinsWend": 0, + "RA_bidirektional_ohne_SPS_Ansteuerung": 4, + "RA_in_RSM_bidirektional": 0, + "RA_in_RSM_bi_Anzahl_Antriebe_je_Seite": 3, + "Doppelstreckenantrieb": 3, + "Doppelstreckenantriebgemeinsame_Wendung": 0, + "gemeinsame_Wendung": 1, + } + Anzahl_HW = { + ## Material Anzahl + ## Material in LL + # schaltschrank_anzahl + "schaltschrankgehäuse_und_zubehör": 1.2, + "einspeisungssatz": 1, + "kleinmaterial": 1, + + ## unterverteiler + "unterverteilergehäuse_und_zubehör": 2, + "hauptschalter": 1, + "hauptschütz": 1, + "kleinmaterial_unterverteiler": 1, + #schnittstellenrelais + #antrieb_unidirektional_halbleiter + #antrieb_bidirektional_halbleiter + #antrieb_unidirektional_schütz + #antrieb_bidirektional_schütz + #motorschutzschalter + #gemeinsame_wendung + #bedienstation_1fach + #bedienst_2fach_red + #bedienstation_2" + #bedienstation_3 + #bedienstation_4 + #bedienstation_6 + + "panel_pc": 0, + "pc": 1, + "switch": 2, + "ewon_router_für_fernwartung": 1, + "drucker": 0, + # _Summe_PC + + "ein_ausgangsmodul": 0, + "extension_plug": 0, + + ## bis_64_E/A + ## sps_hardware_vipa_100, + "cpu_114r_16de_8da": 258, + "mmc_512kb_memory_64": 0, + "eingangskarte_8de": 0, + "eingangskarte_16de": 0, + + ## bis_1.000_E_A + ## sps_hardware_siemens_s7_300 + "cpu_315_2_pn_dp_mit_ethernet": 1, + "cpu_315sn_net_vipa": 0, + + "cpu_317_2_pn_dp_mit_ethernet": 0, + "cpu_317sn_net_vipa": 0, + "cpu_319_2_pn_dp_mit_ethernet": 0, + + "kommunikationsprozessor_cp_343_1": 0, + #et200m_anschaltung_im_153 + "profibusstecker_je_1st_cpu_und_im153": 1, + "eingangskarte_sm_321_16de": 1, + "ausgangskarte_sm_322_16da": 1, + #frontstecker_für_ein_ausgangskarte_16 + "eingangskarte_sm_321_32de": 2, + "ausgangskarte_sm_322_32da": 3, + #frontstecker_für_ein_ausgangskarte_32 + + ## über_1.000_E_A + ## sps_hardware_siemens_s7_400, + "cpu_414_2": 0, + "baugruppenträger_ur_1": 0, + "stromversorgung_ps405_230vac10A": 0, + "pufferbatterie": 0, + "speicherkarte_2_mb": 0, + "ethernet_anschaltung_cp443_1": 0, + "eingangskarte_sm_421_32de": 0, + "ausgangskarte_sm_422_32da": 0, + #frontstecker_für_ein_ausgangskarte + + ## Material_vor_Ort + "movimot_fu_mit_anschaltung": 0, + #trolleytraversensabfrage_optisch + #reflexionslichtschranke_rsm_direct + #stoppersensor_induktiv + #seilzugschalter + #blitzleuchte + #spulenumsetzstation + #sensorkabel_je_20m + #stopper_weichenkabel_je_5m + #motorkabel_je_40m + "kabelpritschen_leitern": 117, + "kabelpritsche_rsm": 0, + #klemmkasten_flyer_und_putzmaschine + #klemmkasten_direct_in_rsm + "erdung": 1, + "kleinteile": 1, + + "sonstige_kabel_busleitung_etc": 1, + #zuleitung_unterverteiler_4x10_40m + #zuleitung_unterverteiler_7x4_40m + #profibuskabel + #schnittstellen_8x1mm + } + Anzahl_DL = { + "Pflichtenheft_Autom_Schnittstellen": 0, + # Hardwareplanung + "Projektkoordination": 1, + + "Abstimmung_mit_E_Werkstatt": 1, + "Erstellen_E_Montageunterlagen": 1, + # Test_und_Installation + "PC_Installation": 0, + "Oberfläche_Simulation": 0, + "SPS_Test_im_Haus_Simulation": 0, + # Dokumentation + "Bedienerhandbuch": 0, + "SPS_Doku": 0, + "PC_Doku": 0, + # Elektrowerkstatt + #Schaltschrankbau + #Klemmkastenbau_je_1h + #Bedientableaubau + "Vormontage_im_Haus": 0, + } + + eas = EA(Anzahl_EAS) + hw = HW(Anzahl_HW, eas) + dl = Dienstleistung(Anzahl_DL, eas, hw) + calc_main_tab(hw, dl) + + + +class TestObjectMethods(unittest.TestCase): + + def test_RSM_direct(self): + Anzahl_RSM = { + "Anzahl":0, + "Sensor_optisch_Traverse":0, + "Bedientableau_2-fach_Korrektur":0, + "Weiche_Korrektur":0, + "Weiche_Gemeinsame_Rückstellung_Korrektur":0, + "RA_bi_abhebbar_Korrektur":0, + "Meldelampe_Überstrom_Korrektur":0, + "Hauptschalter_Ein-Meldung_Korrektur":0, + "Werma_Rundumleuchte_Störung_Korrektur":0, + } + cont = { + "Anzahl":0, + "Anzahl_Strecken/RSM":0, + "Sensor_optisch_Traverse":0, + "Lichtschranke_Traverse":0, + "Bedientableau_2-fach":0, + "Bedientableau_2-fach_Korrektur":0, + "Bedientableau_2-fach_Direct":0, + "Weiche":0, + "Weiche_Korrektur":0, + "Weiche_Gemeinsame_Rückstellung":0, + "Weiche_Gemeinsame_Rückstellung_Korrektur":0, + "RA_bi_abhebbar":0, + "RA_bi_abhebbar_Korrektur":0, + "Doppelstreckenantrieb":0, + "gemeinsame_Wendung":0, + "Meldelampe_Überstrom":0, + "Meldelampe_Überstrom_Korrektur":0, + "Hauptschalter_Ein-Meldung":0, + "Hauptschalter_Ein-Meldung_Korrektur":0, + "Werma_Rundumleuchte_Störung":0, + "Werma_Rundumleuchte_Störung_Korrektur":0, + } + mg = RSM_direct(Anzahl_RSM) + self.assertEqual(mg.anzahl("Anzahl_Strecken/RSM"), 8) + + + def test_EA(self): + Anzahl_EAS = { + "bedienstation_einfach_Zug_Wechseln": 9, + "Weiche": 16, + } + eas = EA(Anzahl_EAS) + self.assertEqual(eas.anzahl("bedienstation_einfach_Zug_Wechseln"), 9) + self.assertEqual(eas.anzahl("Weiche"), 16) + + self.assertEqual(eas.getE("bedienstation_einfach_Zug_Wechseln"), 1) + self.assertEqual(eas.getA("bedienstation_einfach_Zug_Wechseln"), 1) + self.assertEqual(eas.getE("Weiche"), 0) + self.assertEqual(eas.getA("Weiche"), 1) + + self.assertEqual(eas.getE("Bedienelemente_Steuerschrank"), 16) + self.assertEqual(eas.getA("Bedienelemente_Steuerschrank"), 16) + + self.assertEqual(repr(eas), "{'bedienstation_einfach_Zug_Wechseln': 9, 'Weiche': 16}") + + self.assertEqual(eas.get_SE("bedienstation_einfach_Zug_Wechseln"), 9) + self.assertEqual(eas.get_SA("bedienstation_einfach_Zug_Wechseln"), 9) + self.assertEqual(eas.get_SE("Weiche"), 0) + self.assertEqual(eas.get_SA("Weiche"), 16) + + self.assertEqual(eas.gesamt_E(), 9) + self.assertEqual(eas.gesamt_A(), 25) + + + def test_EA_implicit(self): + Anzahl_EAS = { + "Stopper": 5, + } + eas = EA(Anzahl_EAS) + self.assertEqual(eas.anzahl("Stopper"), 5) + + self.assertEqual(eas.getE("Stopper"), 0) + self.assertEqual(eas.getA("Stopper"), 0) + + # Sensor für Stopper wird automatisch hinzugefügt + self.assertEqual(repr(eas), "{'Stopper': 5, 'Sensor_Stopper_induktiv': 5}") + + self.assertEqual(eas.gesamt_E(), 5) + self.assertEqual(eas.gesamt_A(), 0) + + + def test_EA_A_La_Presa(self): + + Anzahl_EAS_A_La_Presa = { + "Bedienelemente_Steuerschrank": 1, + "bedienstation_einfach_Zug_Wechseln": 9, + "bedienstation_zweifach_Not_Aus_Fahrdauerueb": 4, + "Sensor_Traversenabfrage_optisch": 21, + "Weiche": 16, + "Stopper": 3, + "Blitzleuchte_Stoerung": 2, + "Schnittstelle_Flyer_Mazoli": 3, + "RA_unidirektional_mit_gemeinsamer_Wendung": 9, + "RA_bidirektional": 3, + "RA_bidirektional_abhebbar": 3, + "RA_bidirektional_ohne_SPS_Ansteuerung": 4, + "RA_in_RSM_bi_Anzahl_Antriebe_je_Seite": 3, + "Doppelstreckenantrieb": 3, + "gemeinsame_Wendung": 1, + } + eas_alapresa = EA(Anzahl_EAS_A_La_Presa) + self.assertEqual(eas_alapresa.gesamt_E(), 60) + self.assertEqual(eas_alapresa.gesamt_A(), 95) + + res_eas_alapresa_E = eas_alapresa.gesamt_E()*1.15 + res_eas_alapresa_A = eas_alapresa.gesamt_A()*1.15 + self.assertEqual(math.floor(res_eas_alapresa_E), 69) + self.assertEqual(math.floor(res_eas_alapresa_A), 109) + + def test_HW_A_La_Presa(self): + Anzahl_EAS_A_La_Presa = { + "Bedienelemente_Steuerschrank": 1, + "bedienstation_einfach_Zug_Wechseln": 9, + "bedienstation_zweifach_Not_Aus_Fahrdauerueb": 4, + "Sensor_Traversenabfrage_optisch": 21, + "Weiche": 16, + "Stopper": 3, + "Blitzleuchte_Stoerung": 2, + "Schnittstelle_Flyer_Mazoli": 3, + "RA_unidirektional_mit_gemeinsamer_Wendung": 9, + "RA_bidirektional": 3, + "RA_bidirektional_abhebbar": 3, + "RA_bidirektional_ohne_SPS_Ansteuerung": 4, + "RA_in_RSM_bi_Anzahl_Antriebe_je_Seite": 3, + "Doppelstreckenantrieb": 3, + "gemeinsame_Wendung": 1, + } + Anzahl_HW_A_La_Presa = { + # Material Anzahl + # Material in LL + # schaltschrank_anzahl + "schaltschrankgehäuse_und_zubehör": 1.2, + "einspeisungssatz": 1, + "kleinmaterial": 1, + # _Summe_Schaltschrank + + # unterverteiler, + "unterverteilergehäuse_und_zubehör": 2, + "hauptschalter": 1, + "hauptschütz": 1, + "kleinmaterial_unterverteiler": 1, + # _Summe_Unterverteiler + # _Anzahl_Unterverteiler + + "schnittstellenrelais": 6, + + "antrieb_unidirektional_halbleiter": 9, + "antrieb_bidirektional_halbleiter": 13, + "antrieb_unidirektional_schütz": 0, + "antrieb_bidirektional_schütz": 0, + "motorschutzschalter": 0, + "gemeinsame_wendung": 1, + # _Summe_Motorstarter + + "bedienstation_1fach": 9, + "bedienst_2fach_red": 0, + "bedienstation_2": 4, + "bedienstation_3": 0, + "bedienstation_4": 0, + "bedienstation_6": 0, + # _Summe_Bedienstationen + + "panel_pc": 0, + "pc": 1, + "switch": 2, + "ewon_router_für_fernwartung": 1, + "drucker": 0, + # _Summe_PC + + "profibus_asi_gateway_netzteil": 0, + "ein_ausgangsmodul": 0, + "blindverschlüsse": 0, + "asi_buskabel": 0, + "buskabel_24V": 0, + "extension_plug": 0, + "profibus_stecker": 0, + # _Summe_ASI_Hardware + + # bis_64_E/A + # sps_hardware_vipa_100, + "cpu_114r_16de_8da": 0, + "mmc_512kb_memory_64": 0, + "eingangskarte_8de": 0, + "ausgangskarte_8da_bereits_integriert": 0, + "eingangskarte_16de": 0, + "ausgangskarte_16da_bereits_integriert": 0, + + # bis_1.000_E_A + # sps_hardware_siemens_s7_300 + "cpu_315_2_pn_dp_mit_ethernet": 1, + "cpu_315sn_net_vipa": 0, + "mmc_512kb_memory_1000": 1, + "cpu_317_2_pn_dp_mit_ethernet": 0, + "cpu_317sn_net_vipa": 0, + "cpu_319_2_pn_dp_mit_ethernet": 0, + "mmc_2mb_memory": 0, + "kommunikationsprozessor_cp_343_1": 0, + "et200m_anschaltung_im_153": 0, + "profibusstecker_je_1st_cpu_und_im153": 1, + "eingangskarte_sm_321_16de": 1, + "ausgangskarte_sm_322_16da": 1, + "frontstecker_für_ein_ausgangskarte_16": 2, + "eingangskarte_sm_321_32de": 2, + "ausgangskarte_sm_322_32da": 3, + "frontstecker_für_ein_ausgangskarte_32": 5, + + # über_1.000_E_A + # sps_hardware_siemens_s7_400, + "cpu_414_2": 0, + "baugruppenträger_ur_1": 0, + "stromversorgung_ps405_230vac10A": 0, + "pufferbatterie": 0, + "speicherkarte_2_mb": 0, + "ethernet_anschaltung_cp443_1": 0, + "eingangskarte_sm_421_32de": 0, + "ausgangskarte_sm_422_32da": 0, + "frontstecker_für_ein_ausgangskarte": 0, + + # _Summe_Material_in_LL + + # Material_vor_Ort + "movimot_fu_mit_anschaltung": 0, + "trolleytraversensabfrage_optisch": 21, + "reflexionslichtschranke_rsm_direct": 0, + "stoppersensor_induktiv": 3, + "seilzugschalter": 0, + "blitzleuchte": 2, + "spulenumsetzstation": 0, + "sensorkabel_je_20m": 24, + "stopper_weichenkabel_je_5m": 25, + "motorkabel_je_40m": 22, + "kabelpritschen_leitern": 117, + "kabelpritsche_rsm": 0, + "klemmkasten_flyer_und_putzmaschine": 3, + "klemmkasten_direct_in_rsm": 0, + "erdung": 1, + "kleinteile": 1, + + "sonstige_kabel_busleitung_etc": 1, + "zuleitung_unterverteiler_4x10_40m": 1, + "zuleitung_unterverteiler_7x4_40m": 1, + "profibuskabel": 1, + "schnittstellen_8x1mm": 3, + } + + + hw = HW(Anzahl_HW_A_La_Presa, EA(Anzahl_EAS_A_La_Presa)) + + self.assertEqual(hw.anzahl("schaltschrankgehäuse_und_zubehör"), 1.2) + self.assertEqual(hw.anzahl("einspeisungssatz"), 1) + self.assertEqual(hw.anzahl("kleinmaterial"), 1) + self.assertEqual(hw.anzahl("unterverteilergehäuse_und_zubehör"), 2) + self.assertEqual(hw.anzahl("hauptschalter"), 1) + self.assertEqual(hw.anzahl("hauptschütz"), 1) + self.assertEqual(hw.anzahl("kleinmaterial_unterverteiler"), 1) + + self.assertEqual(hw.anzahl("schnittstellenrelais"), 6) + + self.assertEqual(hw.anzahl("antrieb_unidirektional_halbleiter"), 9) + #self.assertEqual(hw.anzahl("antrieb_bidirektional_halbleiter"), 13) + #self.assertEqual(hw.anzahl("antrieb_unidirektional_schütz"), 0) + #self.assertEqual(hw.anzahl("antrieb_bidirektional_schütz"), 0) + self.assertEqual(hw.anzahl("motorschutzschalter"), 0) + self.assertEqual(hw.anzahl("gemeinsame_wendung"), 1) + + + #self.assertEqual(hw.anzahl("antrieb_bidirektional_halbleiter"), 13) #in HW korrekte Rechnung auskommentiert? + #self.assertEqual(hw.summe_in_LL(), 8727) + #self.assertEqual(hw.summe_vorort(), 5503) + #self.assertEqual(hw.summe_gesamt(), 14230) + + + def test_HW(self): + Anzahl_EAS = { + "bedienstation_einfach_Zug_Wechseln": 1, + "Weiche": 2, + "RA_unidirektional": 1 + } + Anzahl_HW = { + "hauptschalter": 2, + "panel_pc": 1, + "antrieb_unidirektional_halbleiter": 1, + } + eas = EA(Anzahl_EAS) + hw = HW(Anzahl_HW, eas) + self.assertEqual(hw.anzahl("hauptschalter"), 2) + self.assertEqual(hw.anzahl("panel_pc"), 1) + print (hw) + #self.assertEqual(hw.anzahl("antrieb_unidirektional_halbleiter"), 1) + self.assertEqual(hw.summe_gesamt(), 460.736) + self.assertEqual(hw.summe_in_LL(), 294) + self.assertEqual(hw.summe_vorort(), 166.736) + + + # TODO: Check dependencies step by step + # print(hw) + + + # def test_DL(self): + # Anzahl_EAS = { + # "bedienstation_einfach_Zug_Wechseln": 9, + # "Weiche": 16, + # } + # eas + +if __name__ == '__main__': + unittest.main() \ No newline at end of file