#from distutils.log import debug import math import sys #from pickle import FALSE import unittest import json JSON_IDENT =5 # 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, **kwargs): """ kwargs can contain the keys rsm_direct rsm_fa flyer_f40 neuenhauser flyer verbindungsstrecken_w puffer turm """ mengen = { #"SYSTEM":"", #"RSM":0, #"Flyer":2, #"Flyer_Puffer":2, #"Flyer_Electrojet_incl_intergrierte_Putzmaschine":2, #"Flyer_Electrojet_incl_intergrierte_Putzmaschine_Vorpuffer":2, #"Flyer_Electrojet_incl_intergrierte_Putzmaschine_Nachpuffer":3, #"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_Wendlungen":0, } # wenn Flyer Electrojet 1, dann sollten Vor- und Nachpuffer größer 1 sein # wenn Neuenhauser 1, dann sollten Vor- und Nachpuffer größer 1 sein # wenn Cason 1, dann sollten Vor- und Nachpuffer größer 1 sein # wenn Puffer, dann mindestens 2 Strecken # Bypass, wenn mindestens 2 Flyer oder 2 RSM # Turm: kein Kriterium self._deckblatt = deckblatt self._RSM_Anzahl = deckblatt.get("RSM", 0) rsm_direct_mengen = {} if "rsm_direct" in kwargs: rsm_direct_mengen = kwargs['rsm_direct'] rsm_direct_mengen["Anzahl"] = self._RSM_Anzahl #übernahme aus deckblatt rsm_fa_mengen = {} if "rsm_fa" in kwargs: rsm_fa_mengen = kwargs['rsm_fa'] rsm_fa_mengen["Anzahl_RSM"] = self._RSM_Anzahl #übernahme aus deckblatt flyer_f40_mengen = {} if "flyer_f40" in kwargs: flyer_f40_mengen = kwargs['flyer_f40'] flyer_f40_mengen["Flyer_Electrojet_incl_intergrierte_Putzmaschine"] = deckblatt.get("Flyer_Electrojet_incl_intergrierte_Putzmaschine", 0) #übernahme aus deckblatt flyer_f40_mengen["Flyer_Electrojet_incl_intergrierte_Putzmaschine_Vorpuffer"] = deckblatt.get("Flyer_Electrojet_incl_intergrierte_Putzmaschine_Vorpuffer", 0) #übernahme aus deckblatt flyer_f40_mengen["Flyer_Electrojet_incl_intergrierte_Putzmaschine_Nachpuffer"] = deckblatt.get("Flyer_Electrojet_incl_intergrierte_Putzmaschine_Nachpuffer", 0) #übernahme aus deckblatt neuenhauser_mengen = {} if "neuenhauser" in kwargs: neuenhauser_mengen = kwargs['neuenhauser'] neuenhauser_mengen["Neuenhauser-Putzmaschine"] = deckblatt.get("Neuenhauser-Putzmaschine", 0) neuenhauser_mengen["Neuenhauser-Putzmaschine_Vorpuffer"] = deckblatt.get("Neuenhauser-Putzmaschine_Vorpuffer", 0) neuenhauser_mengen["Neuenhauser-Putzmaschine_Nachpuffer"] = deckblatt.get("Neuenhauser-Putzmaschine_Nachpuffer", 0) flyer_mengen = {} if "flyer" in kwargs: flyer_mengen = kwargs['flyer'] flyer_mengen["Anzahl"] = deckblatt.get("Flyer", 0) flyer_mengen["Flyer"] = deckblatt.get("Flyer", 0) flyer_mengen["Anzahl_Schienen"] = deckblatt.get("Flyer_Puffer", 0) puffer_mengen = {} if "puffer" in kwargs: puffer_mengen = kwargs['puffer'] puffer_mengen["Puffer"] = deckblatt.get("Puffer", 0) puffer_mengen["Anzahl_Pufferstrecken"] = deckblatt.get("Anzahl_der_Pufferstrecken_pro_Puffer", 0) turm_mengen = {} if "turm" in kwargs: turm_mengen = kwargs['turm'] turm_mengen["Turm"] = deckblatt.get("Turm", 0) turm_mengen["Anzahl_Wendlungen"] = deckblatt.get("Turm_Anzahl_Wendlungen", 0) verbindungsstrecken_w_mengen = {} if "verbindungsstrecken_w" in kwargs: verbindungsstrecken_w_mengen = kwargs['verbindungsstrecken_w'] #überprüfe welche Art von System, setze dict der unrelevanten klasse = 0 system = deckblatt.get("SYSTEM", "") self._rsm_direct = RSM_direct({}) self._rsm_fa = RSM_FA({}) if (system.lower() == "direct"): self._rsm_direct = RSM_direct(rsm_direct_mengen) elif (system.lower() == "fa"): self._rsm_fa = RSM_FA(rsm_fa_mengen) self._flyer_f40 = Flyer_F40_EJet_inc_Putz(flyer_f40_mengen) self._neuenhauser = Putzmaschine_Neuenhauser(neuenhauser_mengen) self._flyer = Flyer_EJet(flyer_mengen) self._verbindungsstrecken_w = Verbindungsstrecken_Wechsel(verbindungsstrecken_w_mengen) self._puffer = Puffer(puffer_mengen) self._turm = Turm(turm_mengen) def get_deckblatt_value(self, key): return self._deckblatt.get(key, 0) def get_value_of_object(self, objectname, key): # Deckblatt if (objectname.lower() == "deckblatt"): return self._deckblatt.get(key) # RSM_direct if (objectname.lower() == "rsm_direct"): return self._rsm_direct.anzahl(key) # RSM_FA if (objectname.lower() == "rsm_fa"): return self._rsm_fa.anzahl(key) # Flyer_F40_EJet_inc_Putz if (objectname.lower() == "flyer_f40_ejet_inc_putz"): return self._flyer_f40.anzahl(key) # Putzmaschine_Neuenhauser if (objectname.lower() == "putzmaschine_neuenhauser"): return self._neuenhauser.anzahl(key) # Flyer_EJet if (objectname.lower() == "flyer_ejet"): return self._flyer.anzahl(key) # Verbindungsstrecken_Wechsel if (objectname.lower() == "verbindungsstrecken_wechsel"): return self._verbindungsstrecken_w.anzahl(key) # Puffer if (objectname.lower() == "puffer"): return self._puffer.anzahl(key) # Turm if (objectname.lower() == "turm"): return self._turm.anzahl(key) def getresult(self): res = { "RSM direct": self._rsm_direct._Mengen, "RSM FA": self._rsm_fa._Mengen, "Flyer F40 (Electrojet) incl. Putzmaschine": self._flyer_f40._Mengen, "Putzmaschine (Neuenhauser)": self._neuenhauser._Mengen, "Flyer (Electrojet)": self._flyer._Mengen, "Verbindungsstrecken/Wechsel": self._verbindungsstrecken_w._Mengen, "Puffer": self._puffer._Mengen, "Turm": self._turm._Mengen, } return res def tojson(self, input:dict): return json.dumps(input, sort_keys=False, indent=4) def tofile(self): json = self.tojson(self.getresult()) with open("json_mengengeruest.json", "w") as file: file.write(json) def ztofile(self): json = self.tojson(self.zusammenfassung()) with open("zusammenfassung_mengengeruest.json", "w") as file: file.write(json) def zusammenfassung(self): #in Excel Zellwerte und Bezüge der Spalte "G" können ignoriert werden zmengen = { "Sensor_optisch_Traverse": 0, "Sensor_induktiv_Spulenalter_Zug_positionierung": 0, "Sensor_Spulenprüfung_voll/leer": 0, "Seilzugsschalter": 0, "Drucktaster_automatische_Umfahrung": 0, "Bedientableau_1fach": 0, "Bedientableau_2fach": 0, "Bedientableau_14fach": 0, "Interface_Putzmaschine": 0, "Interface_Doffer": 0, "Weiche": 0, "Dreifachweiche": 0, "Wechsel": 0, "Stopper": 0, "Meldelampe_Überstrom": 0, "Hauptschalter_Ein-Meldung": 0, "Werma_Rundumleuchte_Störung": 0, "Weiche_nach_PM_(bipolar)": 0, "Kreuzungsweiche": 0, "RA_uni": 0, "RA_uni_abhebbar": 0, "RA_uni_ohne_SPS-Ansteuerung": 0, "RA_bi": 0, "RA_bi_ohne_SPS-Ansteuerung": 0, "RA_bi_abhebbar": 0, "Doppelstreckenantrieb": 0, "gemeinsame_Wendung": 0, "Gesamtanzahl_Antriebe": 0, } zmengen["Sensor_optisch_Traverse"] = self._rsm_direct._Mengen.get("Sensor_optisch_Traverse", 0) +\ self._rsm_fa._Mengen.get("Sensor_optisch_Traverse", 0) +\ self._flyer_f40._Mengen.get("Sensor_optisch_Traverse", 0) +\ self._neuenhauser._Mengen.get("Sensor_optisch_Traverse", 0) +\ self._flyer._Mengen.get("Sensor_optisch_Traverse", 0) +\ self._verbindungsstrecken_w._Mengen.get("Sensor_optisch_Traverse",0) +\ self._verbindungsstrecken_w._Mengen.get("Dreifachweiche",0) * 2 +\ self._verbindungsstrecken_w._Mengen.get("Kreuzungsweiche",0) * 4 +\ self._puffer._Mengen.get("Sensor_optisch_Traverse",0) +\ self._turm._Mengen.get("Sensor_optisch_Traverse",0) zmengen["Sensor_induktiv_Spulenalter_Zug_positionierung"] = self._flyer_f40._Mengen.get("Sensor_induktiv_Spulenhalter",0) +\ self._neuenhauser._Mengen.get("Sensorik_Zugpositionierung",0) zmengen["Sensor_Spulenprüfung_voll/leer"] = self._neuenhauser._Mengen.get("Sensor_WT18_Spulenprüfung_voll/leer",0) zmengen["Seilzugsschalter"] = self._rsm_fa._Mengen.get("Seilzugsschalter", 0) zmengen["Drucktaster_automatische_Umfahrung"] = self._rsm_fa._Mengen.get("Mit_Drucktaster", 0) zmengen["Bedientableau_1fach"] = self._rsm_fa._Mengen.get("Bedientableau_1fach", 0) + self._verbindungsstrecken_w._Mengen.get("Bedientableau_1fach", 0) zmengen["Bedientableau_2fach"] = self._rsm_direct._Mengen.get("Bedientableau_2fach", 0) +\ self._rsm_fa._Mengen.get("Bedientableau_2fach", 0) +\ self._flyer_f40._Mengen.get("Bedientableau_2fach", 0) +\ self._neuenhauser._Mengen.get("Bedientableau_2fach", 0) +\ self._flyer._Mengen.get("Bedientableau_2fach", 0) +\ self._verbindungsstrecken_w._Mengen.get("Bedientableau_2fach", 0) +\ self._turm._Mengen.get("Bedientableau_2fach", 0) zmengen["Bedientableau_14fach"] = self._verbindungsstrecken_w._Mengen.get("Bedientableau_14fach", 0) zmengen["Interface_Putzmaschine"] = self._neuenhauser._Mengen.get("Interface_Putzmaschine", 0) zmengen["Interface_Doffer"] = self._flyer_f40._Mengen.get("Interface_Doffer", 0) + self._flyer._Mengen.get("Interface_Doffer", 0) zmengen["Weiche"] = self._rsm_direct._Mengen.get("Weiche", 0) +\ self._rsm_fa._Mengen.get("Weiche", 0) +\ self._flyer_f40._Mengen.get("Weiche", 0) +\ self._neuenhauser._Mengen.get("Weiche", 0) +\ self._flyer._Mengen.get("Weiche", 0) +\ self._verbindungsstrecken_w._Mengen.get("Weiche", 0) +\ self._puffer._Mengen.get("Weiche", 0) +\ self._turm._Mengen.get("Weiche", 0) zmengen["Dreifachweiche"] = self._rsm_direct._Mengen.get("Weiche_Gemeinsame_Rückstellung", 0) +\ self._flyer_f40._Mengen.get("Dreifachweiche", 0) +\ self._flyer._Mengen.get("Dreifachweiche", 0) #TODO: ist "Weiche_Gemeinsame_Rückstellung" == "Dreifachweiche"? zmengen["Wechsel"] = self._flyer_f40._Mengen.get("Wechsel", 0) +\ self._flyer._Mengen.get("Wechsel", 0) zmengen["Stopper"] = self._flyer_f40._Mengen.get("Stopper", 0) zmengen["Meldelampe_Überstrom"] = self._rsm_direct._Mengen.get("Meldelampe_Überstrom", 0) +\ self._rsm_fa._Mengen.get("Meldelampe_Überstrom", 0) +\ self._flyer_f40._Mengen.get("Meldelampe_Überstrom", 0) +\ self._neuenhauser._Mengen.get("Meldelampe_Überstrom", 0) +\ self._flyer._Mengen.get("Meldelampe_Überstrom", 0) +\ self._puffer._Mengen.get("Meldelampe_Überstrom", 0) zmengen["Hauptschalter_Ein-Meldung"] = self._rsm_direct._Mengen.get("Hauptschalter_Ein-Meldung", 0) +\ self._rsm_fa._Mengen.get("Hauptschalter_Ein-Meldung", 0) +\ self._flyer_f40._Mengen.get("Hauptschalter_Ein-Meldung", 0) +\ self._neuenhauser._Mengen.get("Hauptschalter_Ein-Meldung", 0) +\ self._flyer._Mengen.get("Hauptschalter_Ein-Meldung", 0) +\ self._puffer._Mengen.get("Hauptschalter_Ein-Meldung", 0) zmengen["Werma_Rundumleuchte_Störung"] = self._rsm_direct._Mengen.get("Werma_Rundumleuchte_Störung", 0) +\ self._rsm_fa._Mengen.get("Werma_Rundumleuchte_Störung", 0) +\ self._flyer_f40._Mengen.get("Werma_Rundumleuchte_Störung", 0) +\ self._neuenhauser._Mengen.get("Werma_Rundumleuchte_Störung", 0) +\ self._flyer._Mengen.get("Werma_Rundumleuchte_Störung", 0) +\ self._verbindungsstrecken_w._Mengen.get("Werma_Rundumleuchte_Störung", 0) zmengen["Weiche_nach_PM_(bipolar)"] = self._flyer_f40._Mengen.get("Weiche_nach_PM_(bipolar)", 0) +\ self._neuenhauser._Mengen.get("Weiche_nach_PM_(bipolar)", 0) zmengen["Kreuzungsweiche"] = self._verbindungsstrecken_w._Mengen.get("Kreuzungsweiche", 0) zmengen["RA_uni"] = self._verbindungsstrecken_w._Mengen.get("RA_uni", 0) +\ self._flyer_f40._Mengen.get("RA_uni", 0) zmengen["RA_uni_abhebbar"] = self._flyer_f40._Mengen.get("RA_uni_abhebbar", 0) +\ self._neuenhauser._Mengen.get("RA_uni_abhebbar", 0) zmengen["RA_uni_ohne_SPS-Ansteuerung"] = self._flyer_f40._Mengen.get("RA_uni_ohne_SPS-Ansteuerung", 0) +\ self._neuenhauser._Mengen.get("RA_uni_ohne_SPS-Ansteuerung", 0) +\ self._verbindungsstrecken_w._Mengen.get("RA_uni_ohne_SPS-Ansteuerung", 0) zmengen["RA_bi"] = self._rsm_fa._Mengen.get("RRA_bi", 0) +\ self._flyer_f40._Mengen.get("RA_bi", 0) +\ self._flyer._Mengen.get("RA_bi", 0) +\ self._verbindungsstrecken_w._Mengen.get("RA_bi", 0) +\ self._puffer._Mengen.get("RA_bi", 0) +\ self._turm._Mengen.get("RA_bi", 0) zmengen["RA_bi_ohne_SPS-Ansteuerung"] = self._rsm_fa._Mengen.get("RRA_bi_ohne_SPS-Ansteuerung", 0) +\ self._flyer_f40._Mengen.get("RRA_bi_ohne_SPS-Ansteuerung", 0) +\ self._flyer._Mengen.get("RA_bi_ohne_SPS-Ansteuerung", 0) +\ self._verbindungsstrecken_w._Mengen.get("RA_bi_ohne_SPS-Ansteuerung", 0) +\ self._turm._Mengen.get("RA_bi_ohne_SPS-Ansteuerung", 0) #TODO: Notation beachten: RA_bi, RRA_bi zmengen["RA_bi_abhebbar"] = self._rsm_direct._Mengen.get("RA_bi_abhebbar", 0) +\ self._flyer_f40._Mengen.get("RRA_BI_abhebbar", 0) +\ self._flyer._Mengen.get("RA_bi_abhebbar", 0) #TODO: Notation beachten: RA_bi, RRA_bi zmengen["Doppelstreckenantrieb"] = self._rsm_direct._Mengen.get("Doppelstreckenantrieb", 0) +\ self._flyer_f40._Mengen.get("Doppelstreckenantrieb", 0) +\ self._neuenhauser._Mengen.get("Doppelstreckenantrieb", 0) +\ self._flyer._Mengen.get("Doppelstreckenantrieb", 0) +\ self._verbindungsstrecken_w._Mengen.get("Doppelstreckenantrieb", 0) +\ self._puffer._Mengen.get("Doppelstreckenantrieb", 0) zmengen["gemeinsame_Wendung"] = self._rsm_direct._Mengen.get("gemeinsame_Wendung", 0) +\ self._rsm_fa._Mengen.get("gemeinsame_Wendung", 0) zmengen["Gesamtanzahl_Antriebe"] = zmengen.get("RA_uni", 0) +\ zmengen.get("RA_uni_abhebbar", 0) +\ zmengen.get("RA_uni_ohne_SPS-Ansteuerung", 0) +\ zmengen.get("RA_bi", 0) +\ zmengen.get("RA_bi_ohne_SPS-Ansteuerung", 0) +\ zmengen.get("RA_bi_abhebbar", 0) +\ zmengen.get("Doppelstreckenantrieb", 0) return zmengen # RSM_direct: class RSM_direct(): def __init__(self, anzahl:dict): mengen = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet "Anzahl":0, #"Anzahl_Strecken/RSM":8, "Sensor_optisch_Traverse":0, #"Lichtschranke_Traverse":0, #"Bedientableau_2fach":0, "Bedientableau_2fach_Korrektur":0, #"Bedientableau_2fach_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._Mengen = {} 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_2fach"] = math.ceil(self._RSM_Anzahl/10) + anzahl.get("Bedientableau_2fach_Korrektur", 0) self._Mengen["Bedientableau_2fach_Korrektur"] = anzahl.get("Bedientableau_2fach_Korrektur", 0) self._Mengen["Bedientableau_2fach_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"] = math.ceil(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"] = math.ceil(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) def tojson(self): return json.dumps(self._Mengen) def mengengeruest(self): return self._Mengen # RSM_FA: class RSM_FA(): def __init__(self, anzahl:dict): mengen = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet "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, #"Bedientableau_1fach":0, "Bedientableau_1fach_Korrektur":0, #"Bedientableau_2fach":0, "Bedientableau_2fach_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._Mengen = {} self._RSM_Anzahl = anzahl.get("Anzahl_RSM", 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 self.flex_a_premium(): 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) self._Mengen["Sensor_optisch_Traverse_zusätzlich"] = anzahl.get("Sensor_optisch_Traverse_zusätzlich", 0) #hier keine Korrektur, dafür "Zusätzlich" vorgesehen tableaufaktor_premium = 1 tableaufaktor_beidseitig = 0 if self.flex_a_premium(): tableaufaktor_premium = 0 if (anzahl.get("RSM_Einfahrt_Ein_Beidseitig", False)): tableaufaktor_beidseitig = 1 self._Mengen["Bedientableau_1fach"] = self._RSM_Anzahl*(tableaufaktor_premium + tableaufaktor_beidseitig) + anzahl.get("Bedientableau_1fach_Korrektur", 0) self._Mengen["Bedientableau_1fach_Korrektur"] = anzahl.get("Bedientableau_1fach_Korrektur", 0) self._Mengen["Bedientableau_2fach"] = math.ceil(self._RSM_Anzahl/10) + anzahl.get("Bedientableau_2fach_Korrektur", 0) self._Mengen["Bedientableau_2fach_Korrektur"] = anzahl.get("Bedientableau_2fach_Korrektur", 0) weichefaktor_premium = 1 weichefaktor_beidseitig = 0 if self.flex_a_premium(): 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 self.flex_a_premium(): 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 self.flex_a_premium(): 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 self.flex_a_premium(): 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 self.flex_a_premium(): self._Mengen["Mit_Drucktaster"] = self._RSM_Anzahl * 8 else: self._Mengen["Mit_Drucktaster"] = 0 self._Mengen["Mit_Drucktaster_Korrektur"] = anzahl.get("Mit_Drucktaster_Korrektur",0) 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) def flex_a_premium(self): return self._Mengen.get("Flex_A_Premium", False) def anzahl(self, partname): return self._Mengen.get(partname, 0) def tojson(self): return json.dumps(self._Mengen) def mengengeruest(self): return self._Mengen # Flyer_F40_(Electrojet)_incl._Putzmaschine: class Flyer_F40_EJet_inc_Putz(): def __init__(self, anzahl:dict): mengen = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet #"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_2fach":0, "Bedientableau_2fach_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._Mengen = {} 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["Flyer_Electrojet_incl_intergrierte_Putzmaschine"] = anzahl.get("Flyer_Electrojet_incl_intergrierte_Putzmaschine", 0) self._Mengen["Flyer_Electrojet_incl_intergrierte_Putzmaschine_Korrektur"] = anzahl.get("Flyer_Electrojet_incl_intergrierte_Putzmaschine_Korrektur", 0) self._Mengen["Flyer_Electrojet_incl_intergrierte_Putzmaschine_Vorpuffer"] = anzahl.get("Flyer_Electrojet_incl_intergrierte_Putzmaschine_Vorpuffer", 0) self._Mengen["Flyer_Electrojet_incl_intergrierte_Putzmaschine_Nachpuffer"] = 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) 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_2fach"] = self._Flyer_Anzahl + anzahl.get("Bedientableau_2fach_Korrektur", 0) self._Mengen["Bedientableau_2fach_Korrektur"] = anzahl.get("Bedientableau_2fach_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_Korrektur"] = 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) 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 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)): 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) 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 * math.floor(self._Mengen.get("Anzahl_Schienen", 0)/2) + self._Flyer_Anzahl else: self._Mengen["Doppelstreckenantrieb"] = self._Flyer_Anzahl * math.floor(self._Mengen.get("Anzahl_Schienen", 0)/2) + 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) def anzahl(self, partname): return self._Mengen.get(partname, 0) def tojson(self): return json.dumps(self._Mengen) def mengengeruest(self): return self._Mengen # Putzmaschine_(Neuenhauser): class Putzmaschine_Neuenhauser(): def __init__(self, anzahl:dict): mengen = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet #"Anzahl":0, "Neuenhauser-Putzmaschine":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_2fach":0, "Bedientableau_2fach_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._Mengen = {} 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 #'Neuenhauser-Putzmaschine_Vorpuffer' (Deckblatt) ist äquivalent zu 'Anzahl_Vorstaustrecken' (Mengengerüst/Putzmaschine) self._Mengen["Anzahl_Vorstaustrecken"] = self._Vorpuffer_Anzahl self._Mengen["Neuenhauser-Putzmaschine_Nachpuffer"] = self._Nachpuffer_Anzahl #'Neuenhauser-Putzmaschine_Nachpuffer' (Deckblatt) ist äquivalent zu 'Anzahl_Nachstaustrecken' (Mengengerüst/Putzmaschine) self._Mengen["Anzahl_Nachstaustrecken"] = 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_2fach"] = self._Putze_Anzahl + anzahl.get("Bedientableau_2fach_Korrektur", 0) self._Mengen["Bedientableau_2fach_Korrektur"] = anzahl.get("Bedientableau_2fach_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) 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) def anzahl(self, partname): return self._Mengen.get(partname, 0) def tojson(self): return json.dumps(self._Mengen) def mengengeruest(self): return self._Mengen # Flyer_(Electrojet): class Flyer_EJet(): def __init__(self, anzahl:dict): mengen = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet #"Anzahl":0, "Flyer":0, # äquivalent zu 'Anzahl' "Anzahl_Schienen:":0, #"Sensor_optisch_Traverse":0, "Sensor_optisch_Traverse_Korrektur":0, #"Sensor_induktiv_Spulenalter_Zug_positionierung":0, #"Bedientableau_2fach":0, #"Interface_Doffer":0, #"Weiche":0, "Weiche_Korrektur":0, #"Weiche_nach_Flyer_bipolar":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._Mengen = {} self._Flyer_Anzahl = anzahl.get("Flyer", 0) self._Mengen["Anzahl"] = self._Flyer_Anzahl self._Mengen["Flyer"] = self._Flyer_Anzahl 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_2fach"] = 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 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) def anzahl(self, partname): return self._Mengen.get(partname, 0) def tojson(self): return json.dumps(self._Mengen) def mengengeruest(self): return self._Mengen # Verbindungsstrecken/_Wechsel: class Verbindungsstrecken_Wechsel(): def __init__(self, anzahl:dict): mengen = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet "Sensor_optisch_Traverse":0, "Bedientableau_1fach":0, "Bedientableau_2fach":0, "Bedientableau_14fach":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._Mengen = {} self._Mengen["Sensor_optisch_Traverse"] = anzahl.get("Sensor_optisch_Traverse", 0) self._Mengen["Bedientableau_1fach"] = anzahl.get("Bedientableau_1fach", 0) self._Mengen["Bedientableau_2fach"] = anzahl.get("Bedientableau_2fach", 0) self._Mengen["Bedientableau_14fach"] = anzahl.get("Bedientableau_14fach", 0) self._Mengen["Weiche"] = anzahl.get("Weiche", 0) self._Mengen["Dreifachweiche"] = anzahl.get("Dreifachweiche", 0) self._Mengen["Kreuzungsweiche"] = anzahl.get("Kreuzungsweiche", 0) self._Mengen["Werma_Rundumleuchte_Störung"] = anzahl.get("Werma_Rundumleuchte_Störung", 0) self._Mengen["RA_uni"] = anzahl.get("RA_uni", 0) self._Mengen["RA_uni_ohne_SPS-Ansteuerung"] = anzahl.get("RA_uni_ohne_SPS-Ansteuerung", 0) self._Mengen["RA_bi"] = anzahl.get("RA_bi", 0) self._Mengen["RA_bi_ohne_SPS-Ansteuerung"] = anzahl.get("RA_bi_ohne_SPS-Ansteuerung", 0) self._Mengen["Doppelstreckenantrieb"] = anzahl.get("Doppelstreckenantrieb", 0) def tojson(self): return json.dumps(self._Mengen) def mengengeruest(self): return self._Mengen # Puffer class Puffer(): def __init__(self, anzahl:dict): mengen = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet #"Anzahl":0, "Puffer":0, #äquivalent zu Anzahl "Anzahl_Pufferstrecken":0, #äquivalent zu Anzahl_Staustrecken #"Anzahl_Staustrecken":0, #"Sensor_optisch_Traverse":0, "Sensor_optisch_Traverse_Korrektur":0, #"Weiche":0, "Weiche_Korrektur":0, "RA_bi_(ungerade_Schiene)":0, #"Doppelstreckenantrieb":0, #"Meldelampe_Überstrom":0, "Meldelampe_Überstrom_Korrektur":0, #"Hauptschalter_Ein-Meldung":0, "Hauptschalter_Ein-Meldung_Korrektur":0, } self._Mengen = {} self._Puffer_Anzahl = anzahl.get("Puffer", 0) self._Strecken_Anzahl = anzahl.get("Anzahl_Pufferstrecken", 0) self._Mengen["Anzahl"] = self._Puffer_Anzahl self._Mengen["Anzahl_Staustrecken"] = self._Strecken_Anzahl self._Mengen["Sensor_optisch_Traverse"] = self._Puffer_Anzahl*self._Strecken_Anzahl + anzahl.get("Sensor_optisch_Traverse_Korrektur", 0) self._Mengen["Sensor_optisch_Traverse_Korrektur"] = anzahl.get("Sensor_optisch_Traverse_Korrektur", 0) self._Mengen["Weiche"] = self._Puffer_Anzahl*self._Strecken_Anzahl + anzahl.get("Weiche_Korrektur", 0) self._Mengen["RA_bi_(ungerade_Schiene)"] = anzahl.get("RA_bi_(ungerade_Schiene)", 0) self._Mengen["Weiche_Korrektur"] = anzahl.get("Weiche_Korrektur", 0) self._Mengen["Doppelstreckenantrieb"] = self._Puffer_Anzahl * math.floor(self._Strecken_Anzahl/2) self._Mengen["Meldelampe_Überstrom"] = self._Puffer_Anzahl + anzahl.get("Meldelampe_Überstrom_Korrektur", 0) self._Mengen["Meldelampe_Überstrom_Korrektur"] = anzahl.get("Meldelampe_Überstrom_Korrektur", 0) self._Mengen["Hauptschalter_Ein-Meldung"] = self._Puffer_Anzahl + anzahl.get("Hauptschalter_Ein-Meldung_Korrektur", 0) self._Mengen["Hauptschalter_Ein-Meldung_Korrektur"] = anzahl.get("Hauptschalter_Ein-Meldung_Korrektur", 0) def anzahl(self, partname): return self._Mengen.get(partname, 0) def tojson(self): return json.dumps(self._Mengen) def mengengeruest(self): return self._Mengen # Turm class Turm(): mengen = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet #"Anzahl":0, "Turm":0, #äquivalent zu Anzahl "Anzahl_Wendlungen":0, #äquivalent zu Anzahl_Staustrecken #"Anzahl_Staustrecken":0, #"Sensor_optisch_Traverse":0, #"Weiche":0, #"RA_bi":0, "RA_bi_Korrektur":0, #"RA_bi_ohne_SPS":0, "RA_bi_ohne_SPS_Korrektur":0, #"Bedientableau_2fach":0, } def __init__(self, anzahl:dict): self._Mengen = {} self._Turm_Anzahl = anzahl.get("Turm", 0) self._Mengen["Anzahl"] = self._Turm_Anzahl self._Staustrecken_Anzahl = anzahl.get("Anzahl_Wendlungen", 0) self._Mengen["Anzahl_Staustrecken"] = self._Staustrecken_Anzahl self._Mengen["Sensor_optisch_Traverse"] = self._Turm_Anzahl*5 self._Mengen["Weiche"] = self._Turm_Anzahl*3 self._Mengen["RA_bi"] = self._Turm_Anzahl*2 + anzahl.get("RA_bi_Korrektur", 0) self._Mengen["RA_bi_Korrektur"] = anzahl.get("RA_bi_Korrektur", 0) self._Mengen["RA_bi_ohne_SPS"] = self._Turm_Anzahl*self._Staustrecken_Anzahl*2 + anzahl.get("RA_bi_ohne_SPS_Korrektur", 0) self._Mengen["RA_bi_ohne_SPS_Korrektur"] = anzahl.get("RA_bi_ohne_SPS_Korrektur", 0) self._Mengen["Bedientableau_2fach"] = self._Turm_Anzahl*2 def anzahl(self, partname): return self._Mengen.get(partname, 0) def tojson(self): return json.dumps(self._Mengen) def mengengeruest(self): return self._Mengen 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), # "Drucktaster_Lampentest": (1, 0), # "Sammeleingang_Ueberstrom": (5, 1), # "Sammeleingang_Not_Aus": (2, 1), # "Sammeleingang_Druckluft_fehlt": (1, 1), # "Drucktaster_Reset": (1, 0), # "Sammeleingang_Antriebe_abheben": (1, 2), # "Reserve": (9, 7), "Bedienelemente_Steuerschrank": (24, 16), # Bedienstation, "bedienstation_1fach_Not_Aus": (1, 1), "bedienstation_einfach_Zug_Wechseln": (1, 1), "bedienstation_automatische_Umfahrung": (1, 1), "bedienstation_zweifach_Wechs_BCD_10f": (5, 1), "bedienstation_zweifach_Not_Aus_Reset": (3, 3), "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_nach_PM_bipolar": (0, 2), "gemeinsame_Weichenrueckstellung": (0, 1), "Dreifach_Weiche_DIRECT": (0, 4), "Kreuzungsweiche": (0, 10), "Stopper": (0, 1), "Ventil_RA_3_2_abhebbar": (0, 1), "Ventil_Doppelstreckenantrieb_5_2_abhebbar": (0, 2), "Blitzleuchte_Stoerung": (0, 1), "Schnittstelle_Flyer_ElectroJet": (2, 2), "Schnittstelle_Flyer_Putzmaschine_ElectroJet": (2, 2), "Schnittstelle_Flyer_Neuhauser": (4, 4), "FEldbux_UV_EinAusgang": (2, 1), "Spulenumsetzstation": (40, 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, 1), "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": (1, 3), } 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(): mengen = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet "schaltschrankgehaeuse_b1x800_zubehoer": 0, "schaltschrankgehaeuse_b2x800_zubehoer": 0, "schaltschrankgehaeuse_b1x1200+1x800_zubehoer": 0, "sps_simatic_s7_cpu315_2_pn_dp": 0, "speicherkarte_fuer_sps_512_kb": 0, "comfort_panel_tp_900_mit_pn": 0, "sps_simatic_s7_cpu317_2_pn_dp": 0, "speicherkarte_fuer_sps2_mb": 0, "sps_simatic_s7_1513_1": 0, "sps_simatic_s7_1515_2": 0, "sps_simatic_s7_1517_3": 0, "sps_simatic_s7_1518_4": 0, "sps_et200_1512sp": 0, #"memory_card_256_mb": 0 #"memory_card_2_gb": 0 "memory_card_2_gb":0, "et200_sp_ea_ebene":0, "netzwerk_fernwartung":0, "abgang_400v":0, "abgang_24_v":0, "anlagenrechner":0, "zusaetzlicher_bildschirm":0, #"unterverteiler_fuer_1neuenhauser_pm":0, "unterverteiler_fuer_1flyer":0, "unterverteiler_fuer_2flyer":0, "unterverteiler_fuer_1flyer_f40_mit_integrierter_putzmaschine":0, "unterverteiler_fuer_2flyer_f40_mit_integrierter_putzmaschine":0, "unterverteiler_fuer_puffer":0, "unterverteiler_fuer_5_rsm_fa":0, "korrektur_1_rsm_zusaetzlich_im_unterverteiler":0, "unterverteiler_fuer_10_rsm_fa":0, "unterverteiler_fuer_3_rsm_fa_mit_umfahrung_steckbar":0, "korrektur_3_rsm_zusaetzlich_im_unterverteiler":0, "unterverteiler_fuer_4_rsm_direct":0, "korrektur_4_rsm_zusaetzlich_im_unterverteiler":0, "unterverteiler_fuer_12_rsm_direct":0, "korrektur_12_rsm_zusaetzlich_im_unterverteiler":0, "unterverteiler_fuer_8_rsm_direct":0, "korrektur_8_rsm_zusaetzlich_im_unterverteiler":0, "busverteiler_6_rsm_direct":0, "korrektur_6_rsm_zusaetzlich_im_unterverteiler":0, "busverteiler_8_rsm_direct":0, "korrektur_8_rsm_zusaetzlich_im_unterverteiler":0, "antrieb_unidirektional_halbleiter":0, "antrieb_bidirektional_halbleiter":0, "antrieb_unidirektional_schuetz":0, "antrieb_bidirektional_schuetz":0, "motorschutzschalter":0, "wendeschuetzschaltung":0, "frequenzumrichter":0, ## summe_motorstarter "bedienstation_1fach_kpl":0, "bedienst_2fach_wechs_bcd_10f":0, "bedienstation_2fach_kpl":0, "bedienstation_3fach_kpl":0, "bedienstation_4fach_kpl":0, "bedienstation_10fach_kpl":0, "drucktaster_automatische_umfahrung":0, "halter_fuer_drucktaster":0, # summe_bedienstationen # bis:0, "sps_hardware_siemens_s7":0, "s7_1500_cpu_1515_2_pn_mit_ethernet":0, "s7_1500_cpu_1517_3_pn_dp_mit_ethernet":0, "s7_1500_mmc_12mb_":0, "simatic_pn_pn_coupler_6es7158_3ad10_0xa0_+_busadapter_ba_2xrj45":0, "_et200_mp_im155_5_pn":0, "et_200sp_bundle_profinet_im_155_6pn_st_ba_2xrj45":0, "profinetstrecker_je_1st_cpu_und_im153":0, "s7_1500_eingangskarte_sm_321_16de":0, "s7_1500_ausgangskarte_sm_322_16da":0, "s7_1500_eingangskarte_sm_321_32de":0, "s7_1500_ausgangskarte_sm_322_32da":0, # _summe_sps_hardware # ET200_SP "et_200sp_bundle_profinet_im_155_6pn_st_ba_2xrj45":0, "et200_sp_eingangskarte_8_de":0, "et200_sp_eingangskarte_16_de":0, "et200_sp_eingangskarte_8_do":0, "et200_sp_eingangskarte_16_do":0, "et200_sp_base_unit_neue_last":0, "et200_sp_base_unit_links_gebrueckt":0, "et200_sp_base_unit_neue_last":0, "et200_sp_base_unit_links_gebrueckt":0, # SLIO "et_200sp_bundle_profinet_im_155_6pn_st_ba_2xrj45":0, "slio_eingangskarte_4_de":0, "slio_eingangskarte_8_de":0, "slio_ausgangskarte_4_do":0, "slio_ausgangskarte_8_do":0, "slio_power_modul":0, "slio_4_x_dc_24v_4_x_dc_0v":0, "slio_8_x_dc_24v":0, "slio_8_x_dc_0v":0, # Summe_material_in_ll # MATERIAL VOR ORT "movimot_fu_mit_anschaltung":0, "sensor_optisch_traverse":0, "sensorhalter_ohne_sensor_":0, "reflexionslichtschranke_rsm_direct":0, "stoppersensor_induktiv_mit_halter":0, "sensor_spulenpruefung_voll_leer":0, "seilzugschalter":0, "seil_fuer_seilzugschalter":0, "blitzleuchte":0, "spulenumsetzstation":0, "sensorkabel_je_20m":0, "stopper_weichenkabel_je_5m":0, "motorkabel_je_30m":0, "kabelpritschen_leitern_200_60":0, "kabelpritsche_rsm_100_60":0, "kabelpritsche_rsm_50_35":0, "klemmkasten_rsm":0, "klemmkasten_direct_in_rsm":0, "erdung":0, "kleinteile_rohre_schellen_kabelbinder_ect":0, "kabel_fuer_klemmkasten_und_bts_60m":0, "zuleitung_75_m_unterverteiler_4x4mm2_400vac":0, "zuleitung_75_m_unterverteiler_12x4mm2_24_vdc":0, "zuleitung_75_m_unterverteiler_12x2_5mm2_24_vdc":0, "zuleitung_55_m_klemmkasten_rsm_mitte_14g1_5_mm":0, "zuleitung_55_m_klemmkasten_rsm_mitte_14g1_0_mm":0, "profinetkabel":0, "schnittstellen_8x1mm2_30m":0, } # Einzelteilpreise in € ep = { # Schaltschrank Einzelpreis "schaltschrankgehaeuse_b1x800_zubehoer": 2000, # "schaltschrankgehaeuse_b2x800_zubehoer": 4157, # 790821101 "schaltschrankgehaeuse_b1x1200+1x800_zubehoer": 5135, # 790821102 "sps_simatic_s7_cpu315_2_pn_dp": 1880, # 708003004 "speicherkarte_fuer_sps_512_kb": 150, # 708003012 "comfort_panel_tp_900_mit_pn": 1486, # 708001102 "sps_simatic_s7_cpu317_2_pn_dp": 3324, # 708003007 "speicherkarte_fuer_sps2_mb": 215, # 708003027 "sps_simatic_s7_1513_1": 1143, # 790008100 "sps_simatic_s7_1515_2": 1927, # 790008100 "sps_simatic_s7_1517_3": 3828, # 790008101 "sps_simatic_s7_1518_4": 5402, # 6ES7518-4AP00-0AB0 "sps_et200_1512sp": 623, # 709000003 "memory_card_256_mb": 250, # 708015093 "memory_card_2_gb": 474, # 708015094 "et200_sp_ea_ebene": 0, # 790009001 "netzwerk_fernwartung": 750, # 790011001 "abgang_400v": 250, # ---- "abgang_24_v": 250, # ---- # "anlagenrechner": 1657, # 790011000 "zusaetzlicher_bildschirm": 750, # # _summe_schaltschrank "unterverteiler_fuer_1neuenhauser_pm": 1000, # 790820210 "unterverteiler_fuer_1flyer": 1000, # 790820207_A "unterverteiler_fuer_2flyer": 400, # 790820209_A "unterverteiler_fuer_1flyer_f40_mit_integrierter_putzmaschine": 700, # 790820210 "unterverteiler_fuer_2flyer_f40_mit_integrierter_putzmaschine": 1100, # 790820210 "unterverteiler_fuer_puffer": 700, # 790820210_F "unterverteiler_fuer_5_rsm_fa": 700, # 790820210_D # korrektur_1_rsm_zusaetzlich_im_unterverteiler "unterverteiler_fuer_10_rsm_fa": 800, # 790820210_F # "unterverteiler_fuer_3_rsm_fa_mit_umfahrung_steckbar": 1000, # 790820209_C # korrektur_3_rsm_zusaetzlich_im_unterverteiler "unterverteiler_fuer_4_rsm_direct": 5027, # 790820300 # korrektur_4_rsm_zusaetzlich_im_unterverteiler "unterverteiler_fuer_12_rsm_direct": 7930, # 790820302 # korrektur_12_rsm_zusaetzlich_im_unterverteiler "unterverteiler_fuer_8_rsm_direct": 6322, # 790820301 # korrektur_8_rsm_zusaetzlich_im_unterverteiler "busverteiler_6_rsm_direct": 1818, # 790801002 # korrektur_6_rsm_zusaetzlich_im_unterverteiler "busverteiler_8_rsm_direct": 1818, # 790801001 # korrektur_8_rsm_zusaetzlich_im_unterverteiler "antrieb_unidirektional_halbleiter": 75, "antrieb_bidirektional_halbleiter": 90, "antrieb_unidirektional_schuetz": 0, "antrieb_bidirektional_schuetz": 0, "motorschutzschalter": 0, "wendeschuetzschaltung": 75, "frequenzumrichter": 250, # summe_motorstarter "bedienstation_1fach_kpl": 51, "bedienst_2fach_wechs_bcd_10f": 90, "bedienstation_2fach_kpl": 92, # 790002021_A "bedienstation_3fach_kpl": 104, "bedienstation_4fach_kpl": 116, "bedienstation_10fach_kpl": 380, "drucktaster_automatische_umfahrung": 28, "halter_fuer_drucktaster": 33, # summe_bedienstationen # bis: 1.000 E_A "sps_hardware_siemens_s7": 1500, "s7_1500_cpu_1515_2_pn_mit_ethernet": 1607, "s7_1500_cpu_1517_3_pn_dp_mit_ethernet": 3366, "s7_1500_mmc_12mb_": 205, "simatic_pn_pn_coupler_6es7158_3ad10_0xa0_+_busadapter_ba_2xrj45": 354, "_et200_mp_im155_5_pn": 169, "et_200sp_bundle_profinet_im_155_6pn_st_ba_2xrj45": 176, "profinetstrecker_je_1st_cpu_und_im153": 12, "s7_1500_eingangskarte_sm_321_16de": 146, "s7_1500_ausgangskarte_sm_322_16da": 135, "s7_1500_eingangskarte_sm_321_32de": 221, "s7_1500_ausgangskarte_sm_322_32da": 269, # _summe_sps_hardware # ET200_SP "et_200sp_bundle_profinet_im_155_6pn_st_ba_2xrj45": 185, # 709000006 "et200_sp_eingangskarte_8_de": 30, # 709000021 "et200_sp_eingangskarte_16_de": 54, # 709000022 "et200_sp_eingangskarte_8_do": 45, # 709000031_A "et200_sp_eingangskarte_16_do": 62, # 709000032 "et200_sp_base_unit_neue_last": 20, # 709000014 "et200_sp_base_unit_links_gebrueckt": 13, # 709000015 "et200_sp_base_unit_neue_last": 17, # 709000011 "et200_sp_base_unit_links_gebrueckt": 10, # 709000010 # SLIO "et_200sp_bundle_profinet_im_155_6pn_st_ba_2xrj45": 155, # 709000500 "slio_eingangskarte_4_de": 25, # 709000510 "slio_eingangskarte_8_de": 33, # 709000511 "slio_ausgangskarte_4_do": 30, # 709000021 "slio_ausgangskarte_8_do": 36, # 709000021 "slio_power_modul": 18, # 709000014 "slio_4_x_dc_24v_4_x_dc_0v": 13, # 709000015 "slio_8_x_dc_24v": 13, # 709000011 "slio_8_x_dc_0v": 13, # 709000010 # Summe_material_in_ll # MATERIAL VOR ORT "movimot_fu_mit_anschaltung": 550, "sensor_optisch_traverse": 25, # 827072200 "sensorhalter_ohne_sensor_": 8, # 827072xxx "reflexionslichtschranke_rsm_direct": 45, # 827072207 "stoppersensor_induktiv_mit_halter": 63, # 827072205 "sensor_spulenpruefung_voll_leer": 126, # 827072204 + 721000041 "seilzugschalter": 150, "seil_fuer_seilzugschalter": 0.40, "blitzleuchte": 72, # 790000006 "spulenumsetzstation": 0, "sensorkabel_je_20m": 20, # 722001xxx "stopper_weichenkabel_je_5m": 15, # 722001xxx "motorkabel_je_30m": 23, "kabelpritschen_leitern_200_60": 12, "kabelpritsche_rsm_100_60": 11, # 715000020 "kabelpritsche_rsm_50_35": 7, # 715003010 "klemmkasten_rsm": 120, "klemmkasten_direct_in_rsm": 97, # 790000703 "erdung": 9, "kleinteile_rohre_schellen_kabelbinder_ect": 500, "kabel_fuer_klemmkasten_und_bts_60m": 37, "zuleitung_75_m_unterverteiler_4x4mm2_400vac": 146, "zuleitung_75_m_unterverteiler_12x4mm2_24_vdc": 450, "zuleitung_75_m_unterverteiler_12x2_5mm2_24_vdc": 250, "zuleitung_55_m_klemmkasten_rsm_mitte_14g1_5_mm": 145, "zuleitung_55_m_klemmkasten_rsm_mitte_14g1_0_mm": 136, "profinetkabel": 42, "schnittstellen_8x1mm2_30m": 25, } Keys_of_Vor_Ort = [ "movimot_fu_mit_anschaltung", "sensor_optisch_traverse", "sensorhalter_ohne_sensor_", "reflexionslichtschranke_rsm_direct", "stoppersensor_induktiv_mit_halter", "sensor_spulenpruefung_voll_leer", "seilzugschalter", "seil_fuer_seilzugschalter", "blitzleuchte", "spulenumsetzstation", "sensorkabel_je_20m", "stopper_weichenkabel_je_5m", "motorkabel_je_30m", "kabelpritschen_leitern_200_60", "kabelpritsche_rsm_100_60", "kabelpritsche_rsm_50_35", "klemmkasten_rsm", "klemmkasten_direct_in_rsm", "erdung", "kleinteile_rohre_schellen_kabelbinder_ect", "kabel_fuer_klemmkasten_und_bts_60m", "zuleitung_75_m_unterverteiler_4x4mm2_400vac", "zuleitung_75_m_unterverteiler_12x4mm2_24_vdc", "zuleitung_75_m_unterverteiler_12x2_5mm2_24_vdc", "zuleitung_55_m_klemmkasten_rsm_mitte_14g1_5_mm", "zuleitung_55_m_klemmkasten_rsm_mitte_14g1_0_mm", "profinetkabel", "schnittstellen_8x1mm2_30m" ] def __init__(self, anzahl:dict, mg: type[MG], eas: type[EA]): self._anzahl = anzahl self._anzahl["schaltschrankgehaeuse_b1x800_zubehoer"] = anzahl.get("schaltschrankgehaeuse_b1x800_zubehoer", 0) self._anzahl["schaltschrankgehaeuse_b2x800_zubehoer"] = anzahl.get("schaltschrankgehaeuse_b2x800_zubehoer", 0) self._anzahl["schaltschrankgehaeuse_b1x1200+1x800_zubehoer"] = anzahl.get("schaltschrankgehaeuse_b1x1200+1x800_zubehoer", 0) self._anzahl["sps_simatic_s7_cpu315_2_pn_dp"] = anzahl.get("sps_simatic_s7_cpu315_2_pn_dp", 0) self._anzahl["speicherkarte_fuer_sps_512_kb"] = anzahl.get("speicherkarte_fuer_sps_512_kb", 0) self._anzahl["comfort_panel_tp_900_mit_pn"] = anzahl.get("comfort_panel_tp_900_mit_pn", 0) self._anzahl["sps_simatic_s7_cpu317_2_pn_dp"] = anzahl.get("sps_simatic_s7_cpu317_2_pn_dp", 0) self._anzahl["speicherkarte_fuer_sps2_mb"] = anzahl.get("speicherkarte_fuer_sps2_mb", 0) self._anzahl["sps_simatic_s7_1513_1"] = anzahl.get("sps_simatic_s7_1513_1", 0) self._anzahl["sps_simatic_s7_1515_2"] = anzahl.get("sps_simatic_s7_1515_2", 0) self._anzahl["sps_simatic_s7_1517_3"] = anzahl.get("sps_simatic_s7_1517_3", 0) self._anzahl["sps_simatic_s7_1518_4"] = anzahl.get("sps_simatic_s7_1518_4", 0) self._anzahl["sps_et200_1512sp"] = anzahl.get("sps_et200_1512sp", 0) self._anzahl["memory_card_256_mb"] = self._anzahl["speicherkarte_fuer_sps2_mb"] + \ self._anzahl["sps_simatic_s7_1513_1"] + \ self._anzahl["sps_simatic_s7_1515_2"] + \ self._anzahl["sps_simatic_s7_1517_3"] + \ self._anzahl["sps_simatic_s7_1518_4"] self._anzahl["memory_card_2_gb"] = self._anzahl.get("sps_simatic_s7_1518_4", 0) self._anzahl["et200_sp_ea_ebene"] = anzahl.get("et200_sp_ea_ebene", 0) # TODO: Violett, nur bedingt ändern self._anzahl["netzwerk_fernwartung"] = anzahl.get("netzwerk_fernwartung", 0) self._anzahl["abgang_400v"] = anzahl.get("abgang_400v", 0) self._anzahl["abgang_24_v"] = anzahl.get("abgang_24_v", 0) self._anzahl["anlagenrechner"] = anzahl.get("anlagenrechner", 0) self._anzahl["zusaetzlicher_bildschirm"] = anzahl.get("zusaetzlicher_bildschirm", 0) # end Violett self._anzahl["unterverteiler_fuer_1neuenhauser_pm"] = mg.get_deckblatt_value("RSM") self._anzahl["unterverteiler_fuer_1flyer"] = anzahl.get("unterverteiler_fuer_1flyer", 0) self._anzahl["unterverteiler_fuer_2flyer"] = anzahl.get("unterverteiler_fuer_2flyer", 0) self._anzahl["unterverteiler_fuer_1flyer_f40_mit_integrierter_putzmaschine"] = anzahl.get("unterverteiler_fuer_1flyer_f40_mit_integrierter_putzmaschine", 0) self._anzahl["unterverteiler_fuer_2flyer_f40_mit_integrierter_putzmaschine"] = anzahl.get("unterverteiler_fuer_2flyer_f40_mit_integrierter_putzmaschine", 0) self._anzahl["unterverteiler_fuer_puffer"] = anzahl.get("unterverteiler_fuer_puffer", 0) if (mg.get_value_of_object("rsm_fa", "Flex_A_Premium") == False): num_rsms = mg.get_value_of_object("rsm_fa", "Anzahl_RSM") self._anzahl["unterverteiler_fuer_5_rsm_fa"] = math.ceil(num_rsms/5) + anzahl.get("korrektur_1_rsm_zusaetzlich_im_unterverteiler", 0) if (mg.get_value_of_object("rsm_fa", "Flex_A_Premium") == False): num_rsms = mg.get_value_of_object("rsm_fa", "Anzahl_RSM") self._anzahl["unterverteiler_fuer_10_rsm_fa"] = math.ceil(num_rsms/10) else: num_rsms = mg.get_value_of_object("rsm_fa", "Anzahl_RSM") self._anzahl["unterverteiler_fuer_3_rsm_fa_mit_umfahrung_steckbar"] = math.ceil(num_rsms/3) # TODO "korrektur_3_rsm_zusaetzlich_im_unterverteiler" # TODO "unterverteiler_fuer_4_rsm_direct" ist 0. Warum? # "korrektur_4_rsm_zusaetzlich_im_unterverteiler" self._anzahl["unterverteiler_fuer_12_rsm_direct"] = mg.get_deckblatt_value("RSM") /12. # "korrektur_12_rsm_zusaetzlich_im_unterverteiler" # TODO "unterverteiler_fuer_8_rsm_direct" ist 0, warum? # "korrektur_8_rsm_zusaetzlich_im_unterverteiler" self._anzahl["unterverteiler_fuer_8_rsm_direct"] = mg.get_deckblatt_value("RSM") /8. # "busverteiler_6_rsm_direct" # "korrektur_6_rsm_zusaetzlich_im_unterverteiler" # "busverteiler_8_rsm_direct" # "korrektur_8_rsm_zusaetzlich_im_unterverteiler" motoren_uni_flyer_f40= mg.get_value_of_object("flyer_f40", "RA_uni") \ + mg.get_value_of_object("flyer_f40", "RA_uni_abhebbar") \ + mg.get_value_of_object("flyer_f40", "RA_uni_abhebbar_Korrektur") # TODO warum ist hier bi drin? motoren_uni_rsm_direct = mg.get_value_of_object("rsm_direct", "RA_bi_abhebbar") \ + mg.get_value_of_object("rsm_direct", "Doppelstreckenantrieb") self._anzahl["antrieb_unidirektional_halbleiter"] = motoren_uni_flyer_f40 + motoren_uni_rsm_direct motoren_bi_flyer_f40 = mg.get_value_of_object("flyer_f40", "RRA_BI_abhebbar") + \ mg.get_value_of_object("flyer_f40", "RRA_BI_abhebbar_Korrektur") + \ mg.get_value_of_object("flyer_f40", "RRA_bi") + \ mg.get_value_of_object("flyer_f40", "RRA_bi_Korrektur") + \ mg.get_value_of_object("flyer_f40", "RRA_bi_ohne_SPS-Ansteuerung") + \ mg.get_value_of_object("flyer_f40", "RRA_bi_ohne_SPS_Ansteuerung_Korrektur") + \ mg.get_value_of_object("flyer_f40", "Doppelstreckenantrieb") motoren_uni_rsm_direct = mg.get_value_of_object("flyer_ejet", "RA_bi_abhebbar") + \ mg.get_value_of_object("flyer_f40", "RA_bi_abhebbar_Korrektur") + \ mg.get_value_of_object("flyer_f40", "RA_bi") + \ mg.get_value_of_object("flyer_f40", "Doppelstreckenantrieb") + \ mg.get_value_of_object("flyer_f40", "RA_bi_abhebbar_unger_Schiene-Ansteuerung") self._anzahl["antrieb_bidirektional_halbleiter"] = motoren_bi_flyer_f40 + motoren_uni_rsm_direct # "antrieb_unidirektional_schuetz" TODO wo sind die? in Excel 0 # "antrieb_bidirektional_schuetz" # "motorschutzschalter" TODO von EAS holen? # "wendeschuetzschaltung" self._anzahl["frequenzumrichter"] = eas.anzahl("frequenzumrichter") # # summe_motorstarter # "bedienstation_1fach_kpl" # "bedienst_2fach_wechs_bcd_10f" # "bedienstation_2fach_kpl" # "bedienstation_3fach_kpl" # "bedienstation_4fach_kpl" # "bedienstation_10fach_kpl" # "drucktaster_automatische_umfahrung" # "halter_fuer_drucktaster" # # summe_bedienstationen # # bis # "sps_hardware_siemens_s7" # "s7_1500_cpu_1515_2_pn_mit_ethernet" # "s7_1500_cpu_1517_3_pn_dp_mit_ethernet" # "s7_1500_mmc_12mb_" # "simatic_pn_pn_coupler_6es7158_3ad10_0xa0_+_busadapter_ba_2xrj45" # "_et200_mp_im155_5_pn" # "et_200sp_bundle_profinet_im_155_6pn_st_ba_2xrj45" # "profinetstrecker_je_1st_cpu_und_im153" # "s7_1500_eingangskarte_sm_321_16de" # "s7_1500_ausgangskarte_sm_322_16da" # "s7_1500_eingangskarte_sm_321_32de" # "s7_1500_ausgangskarte_sm_322_32da" # # _summe_sps_hardware # # ET200_SP # "et_200sp_bundle_profinet_im_155_6pn_st_ba_2xrj45" # "et200_sp_eingangskarte_8_de" # "et200_sp_eingangskarte_16_de" # "et200_sp_eingangskarte_8_do" # "et200_sp_eingangskarte_16_do" # "et200_sp_base_unit_neue_last" # "et200_sp_base_unit_links_gebrueckt" # "et200_sp_base_unit_neue_last" # "et200_sp_base_unit_links_gebrueckt" # # SLIO # "et_200sp_bundle_profinet_im_155_6pn_st_ba_2xrj45" # "slio_eingangskarte_4_de" # "slio_eingangskarte_8_de" # "slio_ausgangskarte_4_do" # "slio_ausgangskarte_8_do" # "slio_power_modul" # "slio_4_x_dc_24v_4_x_dc_0v" # "slio_8_x_dc_24v" # "slio_8_x_dc_0v" # # Summe_material_in_ll # # MATERIAL VOR ORT # "movimot_fu_mit_anschaltung" # "sensor_optisch_traverse" # "sensorhalter_ohne_sensor_" # "reflexionslichtschranke_rsm_direct" # "stoppersensor_induktiv_mit_halter" # "sensor_spulenpruefung_voll_leer" # "seilzugschalter" # "seil_fuer_seilzugschalter" # "blitzleuchte" # "spulenumsetzstation" # "sensorkabel_je_20m" # "stopper_weichenkabel_je_5m" # "motorkabel_je_30m" # "kabelpritschen_leitern_200_60" # "kabelpritsche_rsm_100_60" # "kabelpritsche_rsm_50_35" # "klemmkasten_rsm" # "klemmkasten_direct_in_rsm" # "erdung" # "kleinteile_rohre_schellen_kabelbinder_ect" # "kabel_fuer_klemmkasten_und_bts_60m" # "zuleitung_75_m_unterverteiler_4x4mm2_400vac" # "zuleitung_75_m_unterverteiler_12x4mm2_24_vdc" # "zuleitung_75_m_unterverteiler_12x2_5mm2_24_vdc" # "zuleitung_55_m_klemmkasten_rsm_mitte_14g1_5_mm" # "zuleitung_55_m_klemmkasten_rsm_mitte_14g1_0_mm" # "profinetkabel" # "schnittstellen_8x1mm2_30m" # 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_Vor_Ort: pass else: 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_Vor_Ort: preis = anz * self.ep[k] res += preis return res def summe_h_unterverteiler(self): """ gibt dies Summer der Stunden zur Montage der Unterverteiler zurück""" keys_unterverteiler = [ "unterverteiler_fuer_1neuenhauser_pm", "unterverteiler_fuer_1flyer", "unterverteiler_fuer_2flyer", "unterverteiler_fuer_1flyer_f40_mit_integrierter_putzmaschine", "unterverteiler_fuer_2flyer_f40_mit_integrierter_putzmaschine", "unterverteiler_fuer_puffer", "unterverteiler_fuer_5_rsm_fa", "unterverteiler_fuer_10_rsm_fa", "unterverteiler_fuer_3_rsm_fa_mit_umfahrung_steckbar", "unterverteiler_fuer_4_rsm_direct", "unterverteiler_fuer_12_rsm_direct", "unterverteiler_fuer_8_rsm_direct", "busverteiler_6_rsm_direct", "busverteiler_8_rsm_direct", ] res = 0 for k in keys_unterverteiler: anz = self._anzahl.get(k, 0) preis = anz * self.ep[k] res += preis return res def summe_h_schaltschrank(self): """ gibt dies Summer der Stunden zur Montage des Schaltschranks zurück""" keys_schaltschrank = [ "schaltschrankgehaeuse_b1x800_zubehoer", "schaltschrankgehaeuse_b2x800_zubehoer", "schaltschrankgehaeuse_b1x1200+1x800_zubehoer", "sps_simatic_s7_cpu315_2_pn_dp", "speicherkarte_fuer_sps_512_kb", "comfort_panel_tp_900_mit_pn", "sps_simatic_s7_cpu317_2_pn_dp", "speicherkarte_fuer_sps2_mb", "sps_simatic_s7_1513_1", "sps_simatic_s7_1515_2", "sps_simatic_s7_1517_3", "sps_simatic_s7_1518_4", "sps_et200_1512sp", "memory_card_256_mb", "memory_card_2_gb", "et200_sp_ea_ebene", "netzwerk_fernwartung", "abgang_400v", "abgang_24_v", "anlagenrechner", "zusaetzlicher_bildschirm", ] res = 0 for k in keys_schaltschrank: anz = self._anzahl.get(k, 0) preis = anz * self.ep[k] res += preis return res class Dienstleistung(): # Angaben in h mengen = { "Pflichtenheft_Autom_Schnittstellen": 0, ## Hardwareplanung #"Erstellung_Steuerungslayout": 1, #"Schaltplanerstellung_incl_Korrekturen": 1, #"Projektkoordination": 1, #"Materialdispo": 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 #Unterverteilerbau #Klemmkastenbau_je_2h #Bedientableaubau "Vormontage_im_Haus": 0, } def __init__(self, Anzahl_DL, hw: type[HW]): # hier sind die Dienstleistungen in Stunden gegeben, bzw. werden errechnet self._Hours = Anzahl_DL # "Pflichtenheft_Autom_Schnittstellen": 0, ## Hardwareplanung FaktorLayout = 0.15 FaktorSchaltplan = 0.55 FaktorProjektkoord = 0.05 FaktorDispo = 0.15 FaktorAbstimmung = 0.05 FaktorMontageUnterlagen = 0.05 self._Hours["Erstellung_Steuerungslayout"] = hw.summe_h_unterverteiler() * FaktorLayout self._Hours["Schaltplanerstellung_incl_Korrekturen"] = hw.summe_h_unterverteiler() * FaktorSchaltplan self._Hours["Projektkoordination"] = hw.summe_h_unterverteiler() * FaktorProjektkoord self._Hours["Materialdispo"] = hw.summe_h_unterverteiler() * FaktorDispo self._Hours["Abstimmung_mit_E_Werkstatt"] = hw.summe_h_unterverteiler() * FaktorAbstimmung self._Hours["Erstellen_E_Montageunterlagen"] = hw.summe_h_unterverteiler() * FaktorMontageUnterlagen # Test_und_Installation self._Hours["PC_Installation"] = 0 # TODO woher kommt das? self._Hours["Oberfläche_Simulation" ] = 0 # was heisst hier bedingt ändern? self._Hours["SPS_Test_im_Haus_Simulation"] = 0 ## Dokumentation self._Hours["Bedienerhandbuch"] = 0 self._Hours["SPS_Doku"] = 0 self._Hours["PC_Doku"] = 0 ## Elektrowerkstatt self._Hours["Schaltschrankbau"] = hw.summe_h_schaltschrank() self._Hours["Unterverteilerbau"] = 0 self._Hours["Klemmkastenbau_je_2h"] = 0 self._Hours["Bedientableaubau"] = 0 self._Hours["Vormontage_im_Haus"] = 0 # TODO: Nur bedingt ändern? 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 0 def stunden_elektrowerkstatt(self): return 0 def stunden_elektro_Landsberg(self): return 0 #EMO class EMO(): montagezeiten = { "Schaltschrank_aufstellen": 6.0, #(h/St) "Unterverteiler_montieren": 3.0, #(h/St) "Pritsche_montieren_umbauen_demontieren": 6.0, #(m/h) "Pritsche_in_RSM_montieren": 21.0, "Motor_verdrahten_und_anschliessen": 0.9, #(h/Motor) "Tableau_befestigen_und_anschliessen": 1.0, #(h/St) "Schnittstelle_Flyer_Putzmaschine": 1.5, #(h/St) "Sensoren_montieren": 0.45, #(h/St) "Seilzugschalter_installieren": 4.0, #(h/St) "Blitzleuchte_installieren": 0.5, #(h/St) "Weiche_Stopper_anschliessen": 0.45, #(h/St) "Erdung": 0.5, #(h) } def __init__(self, ea: type[EA], hw: type[HW], mg: type[MG]): #für jede Zeile (Eintrag im dict 'mengen') muss ein Wert übergeben werden, der aus den Klassen HW(), MG() oder EA() stammt mengen = { "Schaltschrank_aufstellen": 0, "Unterverteiler_montieren": 0, "Pritsche_montieren_umbauen_demontieren": 0, "Pritsche_in_RSM_montieren": 0, "Motor_verdrahten_und_anschliessen": 0, "Tableau_befestigen_und_anschliessen": 0, "Schnittstelle_Flyer_Putzmaschine": 0, "Sensoren_montieren": 0, "Seilzugschalter_installieren": 0, "Blitzleuchte_installieren": 0, "Weiche_Stopper_anschliessen": 0, "Erdung": 0, } self._Mengen = {} #TODO: Namensgebung für dict Keys aus HW() und EA() anpassen, wenn Klassen fertiggestellt sind self._Mengen["Schaltschrank_aufstellen"] = self.montagezeiten.get("Schaltschrank_aufstellen", 0) * (hw.anzahl("schaltschrank_und_zubehör_b_1_800") +\ hw.anzahl("schaltschrank_und_zubehör_b_2_800") +\ hw.anzahl("schaltschrank_und_zubehör_b_1_1200_1_800")) self._Mengen["Unterverteiler_montieren"] = math.ceil(self.montagezeiten.get("Unterverteiler_montieren", 0) * hw.anzahl("75_m_Zuleitung_Unterverteiler_4x4_400VAC")) self._Mengen["Pritsche_montieren_umbauen_demontieren"] = math.ceil(hw.anzahl("kabelpritschen_leitern_200_60")/self.montagezeiten.get("Pritsche_montieren_umbauen_demontieren", 0)) self._Mengen["Pritsche_in_RSM_montieren"] = math.ceil(hw.anzahl("kabelpritsche_rsm_100_60")/self.montagezeiten.get("Pritsche_in_RSM_montieren", 0)) self._Mengen["Motor_verdrahten_und_anschliessen"] = self.montagezeiten.get("Motor_verdrahten_und_anschliessen", 0) * mg.zusammenfassung().get("Gesamtanzahl_Antriebe",0) self._Mengen["Tableau_befestigen_und_anschliessen"] = self.montagezeiten.get("Tableau_befestigen_und_anschliessen", 0) * ( hw.anzahl("Bedienstation_1fach") +\ hw.anzahl("Bedienst_2fach_DIR") +\ hw.anzahl("Bedienstation_2") +\ hw.anzahl("Bedienstation_3") +\ hw.anzahl("Bedienstation_4") +\ hw.anzahl("Bedienstation_10") +\ hw.anzahl("Drucktaster_autom_Umfahrung")) self._Mengen["Schnittstelle_Flyer_Putzmaschine"] = self.montagezeiten.get("Schnittstelle_Flyer_Putzmaschine", 0) * (ea.anzahl("Schnittstelle_Flyer_EJet") +\ ea.anzahl("Schnittstelle_Putzmaschine_EJet") +\ ea.anzahl("Schnittstelle_Putzmaschine_Neuenhauser")) #TODO: "Schnittstelle_Flyer_Putzmaschine" Werte aus Mengengerüst Fragwürdig; EAs!B53 keine Formel hinterlegt self._Mengen["Sensoren_montieren"] = math.ceil(self.montagezeiten.get("Sensoren_montieren", 0) * hw.anzahl("sensorkabel_je_20m")) self._Mengen["Seilzugschalter_installieren"] = math.ceil(self.montagezeiten.get("Seilzugschalter_installieren", 0) * ea.anzahl("Seilzugschalter")) self._Mengen["Blitzleuchte_installieren"] = math.ceil(self.montagezeiten.get("Blitzleuchte_installieren", 0) * ea.anzahl("Blitzleuchte_Stoerung")) self._Mengen["Weiche_Stopper_anschliessen"] = math.ceil(self.montagezeiten.get("Weiche_Stopper_anschliessen", 0) * ea.anzahl("stopper_weichenkabel_je_5m")) self._Mengen["Erdung"] = math.ceil(self.montagezeiten.get("Erdung", 0) * hw.anzahl("75_m_Zuleitung_Unterverteiler_4x4_400VAC")) print(self._Mengen) class TestObjectMethods(unittest.TestCase): def test_deckblatt(self): deckblatt_eingabe = { "SYSTEM":"", "RSM":13, "Flyer":7, "Flyer_Puffer":13, "Flyer_Electrojet_incl_intergrierte_Putzmaschine":4, "Flyer_Electrojet_incl_intergrierte_Putzmaschine_Vorpuffer":2, "Flyer_Electrojet_incl_intergrierte_Putzmaschine_Nachpuffer":3, "Neuenhauser-Putzmaschine":11, "Neuenhauser-Putzmaschine_Vorpuffer":12, "Neuenhauser-Putzmaschine_Nachpuffer":14, "Cason-Putzmaschine":0, "Cason-Putzmaschine_Vorpuffer":0, "Cason-Putzmaschine_Nachpuffer":0, "Puffer":5, "Anzahl_der_Pufferstrecken_pro_Puffer":11, "Begegnungsstrecke_Bypass":0, "Turm":2, "Turm_Anzahl_Wendlungen":5, } #auskommentiert Zeilen sind nicht einzugeben rsm_direct_eingabe = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet #"Anzahl":0, # wird in deckblatt-Klasse berechnet #"Anzahl_Strecken/RSM":8, "Sensor_optisch_Traverse":4, #"Lichtschranke_Traverse":0, #"Bedientableau_2fach":0, "Bedientableau_2fach_Korrektur":4, #"Bedientableau_2fach_Direct":0, #"Weiche":0, "Weiche_Korrektur":4, #"Weiche_Gemeinsame_Rückstellung":0, "Weiche_Gemeinsame_Rückstellung_Korrektur":4, #"RA_bi_abhebbar":0, "RA_bi_abhebbar_Korrektur":4, #"Doppelstreckenantrieb":0, #"gemeinsame_Wendung":0, #"Meldelampe_Überstrom":0, "Meldelampe_Überstrom_Korrektur":4, #"Hauptschalter_Ein-Meldung":0, "Hauptschalter_Ein-Meldung_Korrektur":4, #"Werma_Rundumleuchte_Störung":0, "Werma_Rundumleuchte_Störung_Korrektur":4, } rsm_fa_eingabe = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet #"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":True, "RSM_Einfahrt_Ein_Beidseitig":True, #"Sensor_optisch_Traverse":0, "Sensor_optisch_Traverse_zusätzlich":3, "Sensor_optisch_Traverse_Korrektur":3, #"Bedientableau_1fach":0, "Bedientableau_1fach_Korrektur":3, #"Bedientableau_2fach":0, "Bedientableau_2fach_Korrektur":3, #"Weiche":0, "Weiche_Korrektur":3, #"RRA_bi":0, "RRA_bi_Korrektur":3, "RRA_bi_auf_Haupstrecke":3, #"RRA_bi_ohne_SPS-Ansteuerung":0, "gemeinsame_Wendung":3, #"Seilzugschalter":0, #"Mit_Drucktaster":0, "Mit_Drucktaster_Korrektur":3, #"Meldelampe_Überstrom":0, "Meldelampe_Überstrom_Korrektur":3, #"Hauptschalter_Ein-Meldung":0, "Hauptschalter_Ein-Meldung_Korrektur":3, #"Werma_Rundumleuchte_Störung":0, "Werma_Rundumleuchte_Störung_Korrektur":3, } flyer_f40_eingabe = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet #"Anzahl":0, #"Flyer_Electrojet_incl_intergrierte_Putzmaschine":0, #wird in deckblatt-Klasse berechnet "Flyer_Electrojet_incl_intergrierte_Putzmaschine_Korrektur":2, #"Flyer_Electrojet_incl_intergrierte_Putzmaschine_Vorpuffer":2, #wird in deckblatt-Klasse berechnet #"Flyer_Electrojet_incl_intergrierte_Putzmaschine_Nachpuffer":2, #wird in deckblatt-Klasse berechnet #"Anzahl_Schienen":0, "Single-Line_/_Durchfahrt":True, "Nachpuffer":True, #"Sensor_optisch_Traverse":0, "Sensor_optisch_Traverse_Korrektur":3, #"Sensor_induktiv_Spulenhalter":0, "Sensor_induktiv_Spulenhalter_Korrektur":2, #"Bedientableau_2fach":0, "Bedientableau_2fach_Korrektur":3, #"Interface_Doffer":0, "Interface_Doffer_Korrektur":2, #"Weiche":0, "Weiche_Korrektur":3, #"Weiche_nach_Flyer_bipolar":0, "Weiche_nach_Flyer_bipolar_Korrektur":2, "Dreifachweiche":7, "Wechsel":6, "Stopper":5, "RA_uni":4, #"RA_uni_abhebbar":0, "RA_uni_abhebbar_Korrektur":3, #"RA_uni_ohne_SPS-Ansteuerung":0, "RA_uni_ohne_SPS-Ansteuerung_Korrektur":2, #"RRA_BI_abhebbar":0, "RRA_BI_abhebbar_Korrektur":3, "RRA_bi":0, #"RRA_bi_Korrektur":0, #"RRA_bi_ohne_SPS-Ansteuerung":0, "RRA_bi_ohne_SPS_Ansteuerung_Korrektur":3, #"Doppelstreckenantrieb":0, "Doppelstreckenantrieb_Korrektur":2, "RA_bi_abhebbar_unger_Schiene":3, #"Meldelampe_Überstrom":0, "Meldelampe_Überstrom_Korrektur":3, #"Hauptschalter_Ein-Meldung":0, "Hauptschalter_Ein-Meldung_Korrektur":2, #"Werma_Rundumleuchte_Störung":0, "Werma_Rundumleuchte_Störung_Korrektur":3, } neuenhauser_eingabe = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet #"Anzahl":0, #"Neuenhauser-Putzmaschine":0, #wird in deckblatt-Klasse zugewiesen #"Neuenhauser-Putzmaschine_Vorpuffer":0, #wird in deckblatt-Klasse zugewiesen #"Neuenhauser-Putzmaschine_Nachpuffer":0, #wird in deckblatt-Klasse zugewiesen #"Anzahl_Vorstaustrecken":0, #"Anzahl_Nachstaustrecken":0, #"Sensor_optisch_Traverse":0, "Sensor_optisch_Traverse_Korrektur":3, #"Sensorik_Zugpositionierung":0, #"Sensor_WT18_Spulenprüfung_voll/leer":0, #"Bedientableau_2fach":0, "Bedientableau_2fach_Korrektur":3, #"Interface_Putzmaschine":0, #"Weiche":0, "Weiche_Korrektur":2, #"Weiche_nach_PM_(bipolar)":0, #"RA_uni_abhebbar":0, "RA_uni_abhebbar_Korrektur":3, #"RA_uni_ohne_SPS-Ansteuerung":0, #"RA_uni_abhebbar_(unger._Sch.)":0, #"Doppelstreckenantrieb":0, #"Meldelampe_Überstrom":0, "Meldelampe_Überstrom_Korrektur":2, #"Hauptschalter_Ein-Meldung":0, "Hauptschalter_Ein-Meldung_Korrektur":3, #"Werma_Rundumleuchte_Störung":0, "Werma_Rundumleuchte_Störung_Korrektur":2, } flyer_eingabe = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet #"Anzahl":0, #"Flyer":0, # äquivalent zu 'Anzahl' #"Anzahl_Schienen:":0, #"Sensor_optisch_Traverse":0, "Sensor_optisch_Traverse_Korrektur":3, #"Sensor_induktiv_Spulenalter_Zug_positionierung":0, #"Bedientableau_2fach":0, #"Interface_Doffer":0, #"Weiche":0, "Weiche_Korrektur":4, #"Weiche_nach_Flyer_bipolar":0, "Weiche_nach_Flyer_bipolar_Korrektur":3, "Dreifachweiche":3, #"Wechsel":0, "Wechsel_Korrektur":4, #"RA_bi_ohne_SPS-Ansteuerung":0, #"RA_bi_abhebbar":0, "RA_bi_abhebbar_Korrektur":3, "RA_bi":3, #"Doppelstreckenantrieb":0, "RA_bi_abhebbar_unger_Schiene":4, #"Meldelampe_Überstrom":0, "Meldelampe_Überstrom_Korrektur":3, #"Hauptschalter_Ein-Meldung":0, "Hauptschalter_Ein-Meldung_Korrektur":4, #"Werma_Rundumleuchte_Störung":0, "Werma_Rundumleuchte_Störung_Korrektur":3, } puffer_eingabe = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet #"Anzahl":0, #"Puffer":0, #äquivalent zu Anzahl #"Anzahl_Pufferstrecken":0, #äquivalent zu Anzahl_Staustrecken #"Anzahl_Staustrecken":0, #"Sensor_optisch_Traverse":0, "Sensor_optisch_Traverse_Korrektur":5, #"Weiche":0, "Weiche_Korrektur":6, "RA_bi_(ungerade_Schiene)":7, #"Doppelstreckenantrieb":0, #"Meldelampe_Überstrom":0, "Meldelampe_Überstrom_Korrektur":6, #"Hauptschalter_Ein-Meldung":0, "Hauptschalter_Ein-Meldung_Korrektur":5, } turm_eingabe = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet #"Anzahl":0, #"Turm":0, #äquivalent zu Anzahl #"Anzahl_Wendlungen":0, #äquivalent zu Anzahl_Staustrecken #"Anzahl_Staustrecken":0, #"Sensor_optisch_Traverse":0, #"Weiche":0, #"RA_bi":0, "RA_bi_Korrektur":5, #"RA_bi_ohne_SPS":0, "RA_bi_ohne_SPS_Korrektur":6, #"Bedientableau_2fach":0, } deckblatt = MG(deckblatt_eingabe, rsm_direct=rsm_direct_eingabe, rsm_fa=rsm_fa_eingabe, flyer_f40=flyer_f40_eingabe, neuenhauser=neuenhauser_eingabe, flyer=flyer_eingabe, #verbindungsstrecken_w=, puffer=puffer_eingabe, turm=turm_eingabe) #Testmethoden: ''' # self.assertEqual(deckblatt._rsm_direct.anzahl("Anzahl"), 13) # self.assertEqual(deckblatt._rsm_direct.anzahl("Anzahl_Strecken/RSM"), 8) # self.assertEqual(deckblatt._rsm_direct.anzahl("Sensor_optisch_Traverse"), 4) # self.assertEqual(deckblatt._rsm_direct.anzahl("Lichtschranke_Traverse"), 78) # self.assertEqual(deckblatt._rsm_direct.anzahl("Bedientableau_2fach"), 6) # self.assertEqual(deckblatt._rsm_direct.anzahl("Bedientableau_2fach_Direct"), 13) # self.assertEqual(deckblatt._rsm_direct.anzahl("Weiche"), 56) # self.assertEqual(deckblatt._rsm_direct.anzahl("Weiche_Gemeinsame_Rückstellung"), 6) # self.assertEqual(deckblatt._rsm_direct.anzahl("RA_bi_abhebbar"), 9) # self.assertEqual(deckblatt._rsm_direct.anzahl("Doppelstreckenantrieb"), 104) # self.assertEqual(deckblatt._rsm_direct.anzahl("gemeinsame_Wendung"), 6) # self.assertEqual(deckblatt._rsm_direct.anzahl("Meldelampe_Überstrom"), 6) # self.assertEqual(deckblatt._rsm_direct.anzahl("Hauptschalter_Ein-Meldung"), 6) # self.assertEqual(deckblatt._rsm_direct.anzahl("Werma_Rundumleuchte_Störung"), 6) # self.assertEqual(deckblatt._rsm_fa.anzahl("Anzahl_RSM"), 13) # self.assertEqual(deckblatt._rsm_fa.anzahl("Sensor_optisch_Traverse"), 32) # self.assertEqual(deckblatt._rsm_fa.anzahl("Sensor_optisch_Traverse_zusätzlich"), 3) # self.assertEqual(deckblatt._rsm_fa.anzahl("Bedientableau_1fach"), 29) # self.assertEqual(deckblatt._rsm_fa.anzahl("Bedientableau_2fach"), 5) # self.assertEqual(deckblatt._rsm_fa.anzahl("Weiche"), 29) # self.assertEqual(deckblatt._rsm_fa.anzahl("RRA_bi"), 32) # self.assertEqual(deckblatt._rsm_fa.anzahl("RRA_bi_auf_Haupstrecke"), 3) # self.assertEqual(deckblatt._rsm_fa.anzahl("RRA_bi_ohne_SPS-Ansteuerung"), 0) # self.assertEqual(deckblatt._rsm_fa.anzahl("gemeinsame_Wendung"), 3) # self.assertEqual(deckblatt._rsm_fa.anzahl("Seilzugschalter"), 26) # self.assertEqual(deckblatt._rsm_fa.anzahl("Mit_Drucktaster"), 3) # self.assertEqual(deckblatt._rsm_fa.anzahl("Meldelampe_Überstrom"), 5) # self.assertEqual(deckblatt._rsm_fa.anzahl("Hauptschalter_Ein-Meldung"), 5) # self.assertEqual(deckblatt._rsm_fa.anzahl("Werma_Rundumleuchte_Störung"), 5) self.assertEqual(deckblatt._flyer_f40.anzahl("Anzahl"), 6) self.assertEqual(deckblatt._flyer_f40.anzahl("Anzahl_Schienen"), 5) #self.assertEqual(deckblatt._flyer_f40.anzahl("Sensor_optisch_Traverse"), 80) # TODO: Wenn Nachpuffer == True, dann wird Sensor_optisch_Traverse_Korrektur doppelt addiert => =WENN(B49="ja";B46*(B47*1)+(B46*5)+(B56*2);B46*(B47*1)+(B46*7)+(B56*2))+C50 self.assertEqual(deckblatt._flyer_f40.anzahl("Sensor_induktiv_Spulenhalter"), 14) self.assertEqual(deckblatt._flyer_f40.anzahl("Bedientableau_2fach"), 9) self.assertEqual(deckblatt._flyer_f40.anzahl("Interface_Doffer"), 8) self.assertEqual(deckblatt._flyer_f40.anzahl("Weiche"), 39) self.assertEqual(deckblatt._flyer_f40.anzahl("Weiche_nach_Flyer_bipolar"), 8) self.assertEqual(deckblatt._flyer_f40.anzahl("Dreifachweiche"), 7) self.assertEqual(deckblatt._flyer_f40.anzahl("Wechsel"), 6) self.assertEqual(deckblatt._flyer_f40.anzahl("Stopper"), 5) self.assertEqual(deckblatt._flyer_f40.anzahl("RA_uni"), 4) self.assertEqual(deckblatt._flyer_f40.anzahl("RA_uni_abhebbar"), 9) self.assertEqual(deckblatt._flyer_f40.anzahl("RA_uni_ohne_SPS-Ansteuerung"), 6) self.assertEqual(deckblatt._flyer_f40.anzahl("RRA_BI_abhebbar"), 9) self.assertEqual(deckblatt._flyer_f40.anzahl("RRA_bi_ohne_SPS-Ansteuerung"), 3) self.assertEqual(deckblatt._flyer_f40.anzahl("Doppelstreckenantrieb"), 13.5) self.assertEqual(deckblatt._flyer_f40.anzahl("RA_bi_abhebbar_unger_Schiene"), 3) self.assertEqual(deckblatt._flyer_f40.anzahl("Meldelampe_Überstrom"), 9) self.assertEqual(deckblatt._flyer_f40.anzahl("Hauptschalter_Ein-Meldung"), 8) self.assertEqual(deckblatt._flyer_f40.anzahl("Werma_Rundumleuchte_Störung"), 9) self.assertEqual(deckblatt._neuenhauser.anzahl("Anzahl"), 11) self.assertEqual(deckblatt._neuenhauser.anzahl("Anzahl_Vorstaustrecken"), 12) self.assertEqual(deckblatt._neuenhauser.anzahl("Anzahl_Nachstaustrecken"), 14) self.assertEqual(deckblatt._neuenhauser.anzahl("Sensor_optisch_Traverse"), 322) self.assertEqual(deckblatt._neuenhauser.anzahl("Sensorik_Zugpositionierung"), 44) self.assertEqual(deckblatt._neuenhauser.anzahl("Sensor_WT18_Spulenprüfung_voll/leer"), 22) self.assertEqual(deckblatt._neuenhauser.anzahl("Bedientableau_2fach"), 14) self.assertEqual(deckblatt._neuenhauser.anzahl("Interface_Putzmaschine"), 11) self.assertEqual(deckblatt._neuenhauser.anzahl("Weiche"), 134) self.assertEqual(deckblatt._neuenhauser.anzahl("Weiche_nach_PM_(bipolar)"), 143) self.assertEqual(deckblatt._neuenhauser.anzahl("RA_uni_abhebbar"), 14) self.assertEqual(deckblatt._neuenhauser.anzahl("RA_uni_ohne_SPS-Ansteuerung"), 11) self.assertEqual(deckblatt._neuenhauser.anzahl("RA_uni_abhebbar_(unger._Sch.)"), 88) self.assertEqual(deckblatt._neuenhauser.anzahl("Doppelstreckenantrieb"), 143) self.assertEqual(deckblatt._neuenhauser.anzahl("Meldelampe_Überstrom"), 13) self.assertEqual(deckblatt._neuenhauser.anzahl("Hauptschalter_Ein-Meldung"), 14) self.assertEqual(deckblatt._neuenhauser.anzahl("Werma_Rundumleuchte_Störung"), 13) self.assertEqual(deckblatt._flyer.anzahl("Anzahl"), 7) self.assertEqual(deckblatt._flyer.anzahl("Anzahl_Schienen"), 13) self.assertEqual(deckblatt._flyer.anzahl("Sensor_optisch_Traverse"), 206) self.assertEqual(deckblatt._flyer.anzahl("Sensor_induktiv_Spulenalter_Zug_positionierung"), 7) self.assertEqual(deckblatt._flyer.anzahl("Bedientableau_2fach"), 7) self.assertEqual(deckblatt._flyer.anzahl("Interface_Doffer"), 7) self.assertEqual(deckblatt._flyer.anzahl("Weiche"), 95) self.assertEqual(deckblatt._flyer.anzahl("Weiche_nach_Flyer_bipolar"), 7) self.assertEqual(deckblatt._flyer.anzahl("Wechsel"), 11) self.assertEqual(deckblatt._flyer.anzahl("Dreifachweiche"), 3) self.assertEqual(deckblatt._flyer.anzahl("RA_bi_ohne_SPS-Ansteuerung"), 7) self.assertEqual(deckblatt._flyer.anzahl("RA_bi_abhebbar"), 14) self.assertEqual(deckblatt._flyer.anzahl("Doppelstreckenantrieb"), 42) self.assertEqual(deckblatt._flyer.anzahl("Meldelampe_Überstrom"), 10) self.assertEqual(deckblatt._flyer.anzahl("Hauptschalter_Ein-Meldung"), 11) self.assertEqual(deckblatt._flyer.anzahl("Werma_Rundumleuchte_Störung"), 10) self.assertEqual(deckblatt._puffer.anzahl("Anzahl"), 5) self.assertEqual(deckblatt._puffer.anzahl("Anzahl_Staustrecken"), 11) self.assertEqual(deckblatt._puffer.anzahl("Sensor_optisch_Traverse"), 60) self.assertEqual(deckblatt._puffer.anzahl("Weiche"), 61) self.assertEqual(deckblatt._puffer.anzahl("RA_bi_(ungerade_Schiene)"), 7) self.assertEqual(deckblatt._puffer.anzahl("Doppelstreckenantrieb"), 25) self.assertEqual(deckblatt._puffer.anzahl("Meldelampe_Überstrom"), 11) self.assertEqual(deckblatt._puffer.anzahl("Hauptschalter_Ein-Meldung"), 10) self.assertEqual(deckblatt._turm.anzahl("Anzahl"), 2) self.assertEqual(deckblatt._turm.anzahl("Anzahl_Staustrecken"), 5) self.assertEqual(deckblatt._turm.anzahl("Weiche"), 6) self.assertEqual(deckblatt._turm.anzahl("RA_bi"), 9) self.assertEqual(deckblatt._turm.anzahl("RA_bi_ohne_SPS"), 26) self.assertEqual(deckblatt._turm.anzahl("Bedientableau_2fach"), 4) ''' self.assertEqual(deckblatt._turm.anzahl("Anzahl"), 2) self.assertEqual(deckblatt._turm.anzahl("Anzahl_Staustrecken"), 5) self.assertEqual(deckblatt._turm.anzahl("Weiche"), 6) self.assertEqual(deckblatt._turm.anzahl("RA_bi"), 9) self.assertEqual(deckblatt._turm.anzahl("RA_bi_ohne_SPS"), 26) self.assertEqual(deckblatt._turm.anzahl("Bedientableau_2fach"), 4) def test_RSM_direct(self): Anzahl_RSM = { "Anzahl":0, "Sensor_optisch_Traverse":0, "Bedientableau_2fach_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_2fach":0, "Bedientableau_2fach_Korrektur":0, "Bedientableau_2fach_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, } # mg = MG(deckblatt, {}) # eas = EA(Anzahl_EAS) # hw = HW(Anzahl_HW, eas) # hw = HW(Anzahl_HW, mg, 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 def test2(): # Anzahl der für das Projekt benutzten Anzahl_MG = { "SYSTEM":"DIRECT", "RSM":11, "Flyer":0, "Flyer_Puffer":2, "Flyer_Electrojet_incl_intergrierte_Putzmaschine":1, "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":1, "Anzahl_der_Pufferstrecken_pro_Puffer":2, "Begegnungsstrecke_Bypass":0, "Turm":0, "Turm_Anzahl_Wendlungen":0, } rsm_direct_eingabe = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet #"Anzahl":0, # wird in deckblatt-Klasse berechnet #"Anzahl_Strecken/RSM":8, "Sensor_optisch_Traverse":0, #"Lichtschranke_Traverse":0, #"Bedientableau_2fach":0, "Bedientableau_2fach_Korrektur":0, #"Bedientableau_2fach_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, } rsm_fa_eingabe = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet #"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, #"Bedientableau_1fach":0, "Bedientableau_1fach_Korrektur":0, #"Bedientableau_2fach":0, "Bedientableau_2fach_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, "Mit_Drucktaster_Korrektur":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, } flyer_f40_eingabe = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet #"Anzahl":0, #"Flyer_Electrojet_incl_intergrierte_Putzmaschine":0, #wird in deckblatt-Klasse berechnet "Flyer_Electrojet_incl_intergrierte_Putzmaschine_Korrektur":0, #"Flyer_Electrojet_incl_intergrierte_Putzmaschine_Vorpuffer":2, #wird in deckblatt-Klasse berechnet #"Flyer_Electrojet_incl_intergrierte_Putzmaschine_Nachpuffer":2, #wird in deckblatt-Klasse berechnet #"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_2fach":0, "Bedientableau_2fach_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, } neuenhauser_eingabe = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet #"Anzahl":0, #"Neuenhauser-Putzmaschine":0, #wird in deckblatt-Klasse zugewiesen #"Neuenhauser-Putzmaschine_Vorpuffer":0, #wird in deckblatt-Klasse zugewiesen #"Neuenhauser-Putzmaschine_Nachpuffer":0, #wird in deckblatt-Klasse zugewiesen #"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_2fach":0, "Bedientableau_2fach_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, } flyer_eingabe = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet #"Anzahl":0, #"Flyer":0, # äquivalent zu 'Anzahl' #"Anzahl_Schienen:":0, #"Sensor_optisch_Traverse":0, "Sensor_optisch_Traverse_Korrektur":0, #"Sensor_induktiv_Spulenalter_Zug_positionierung":0, #"Bedientableau_2fach":0, #"Interface_Doffer":0, #"Weiche":0, "Weiche_Korrektur":0, #"Weiche_nach_Flyer_bipolar":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, } verbindungsstrecken_w_eingabe = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet "Sensor_optisch_Traverse":0, "Bedientableau_1fach":0, "Bedientableau_2fach":0, "Bedientableau_14fach":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 } puffer_eingabe = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet #"Anzahl":0, #"Puffer":0, #äquivalent zu Anzahl #"Anzahl_Pufferstrecken":0, #äquivalent zu Anzahl_Staustrecken #"Anzahl_Staustrecken":0, #"Sensor_optisch_Traverse":0, "Sensor_optisch_Traverse_Korrektur":0, #"Weiche":0, "Weiche_Korrektur":0, "RA_bi_(ungerade_Schiene)":0, #"Doppelstreckenantrieb":0, #"Meldelampe_Überstrom":0, "Meldelampe_Überstrom_Korrektur":0, #"Hauptschalter_Ein-Meldung":0, "Hauptschalter_Ein-Meldung_Korrektur":0, } turm_eingabe = { #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet #"Anzahl":0, #"Turm":0, #äquivalent zu Anzahl #"Anzahl_Wendlungen":0, #äquivalent zu Anzahl_Staustrecken #"Anzahl_Staustrecken":0, #"Sensor_optisch_Traverse":0, #"Weiche":0, #"RA_bi":0, "RA_bi_Korrektur":0, #"RA_bi_ohne_SPS":0, "RA_bi_ohne_SPS_Korrektur":0, #"Bedientableau_2fach":0, } mg = MG(Anzahl_MG, rsm_direct=rsm_direct_eingabe, rsm_fa=rsm_fa_eingabe, flyer_f40=flyer_f40_eingabe, neuenhauser=neuenhauser_eingabe, flyer=flyer_eingabe, verbindungsstrecken_w=verbindungsstrecken_w_eingabe, puffer=puffer_eingabe, turm=turm_eingabe) #mg.tofile() #mg.ztofile() 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, mg, eas) emo_eingabe = { "Schaltschrank_aufstellen": 1, "Unterverteiler_montieren": 4, "Pritsche_montieren_umbauen_demontieren": 66, "Pritsche_in_RSM_montieren": 0, "Motor_verdrahten_und_anschliessen": 97, "Tableau_befestigen_und_anschliessen": 15, "Schnittstelle_Flyer_Putzmaschine": 1, "Sensoren_montieren": 84, "Seilzugschalter_installieren": 0, "Blitzleuchte_installieren": 3, "Weiche_Stopper_anschliessen": 244, "Erdung": 40, } emo = EMO(eas, hw, mg) def test_Unittests(): unittest.main() if __name__ == '__main__': test2() #test_Unittests()