Code:
Beschreibung :Dieses Programm simuliert eine 60W Glühlampe. Erstellt wurde sie ausgehend von den Daten einer Osram Clasic A 60W Lampe. Bislang sind die Funktionen W und S durch wählen dieser Start- parameter verfügbar. S Simuliert den Einschaltvorgang einer Birne bei 230V solange bis stationäre Werte gemäß "statvar" erreicht sind. Ausgegeben werden Leistung, Spannung, Temperatur, Straglungsleistung sowie Laufzeit. W Simuliert eine lampe wie in S für alle Spannungen von 1V bis 230V in 0.1V Schritten. Ausgegeben werden Spannung und Stromstärke. Beide können durch den vorherigen Parameter Q (Quiet) still gestellt werden, sodass keine Einheiten mit ausgegeben werden. *========================================================================= v0.10 16.06.2010: Erstellung des Programms v0.11 17.06.2010: Polynomische Näherung des WIderstandes eingebaut v0.11b 18.06.2010: Fehler korrigiert v0.12 21.06.2010: Einbau Naeherung Gesamtemissionsgrad v0.13 26.06.2010: Einbau Überprüfung auf Stationärität v0.14 27.06.2010: Polynomische Näherung für epsilon erstellt, UIDiagramm erstellt v0.15 28.06.2010: Speichern der Werte eingebaut v0.16 05.07.2010: Längenänderung eingebaut, Spannungsabfall an Haltedraht eingebaut v0.16b 06.07.2010: Kleinere Optimierungen v0.17 08.07.2010: Irreführendes Wellenlaengen() umbenannt in UIDiagramm(), Fehler beseitigt v0.18 12.07.2010: Änderung des Programmaufrufs, Customout() erstellt, Wechselstrom() eingebaut Quelltext kommentiert und optimiert v0.19 04.08.2010: Optimierung des Quelltextes .*/ #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> #include <stdio.h> // Anfang Definition der beteiligten Elemente FILE *datei; double // Eigenschaften des Drahtes l = 0.45, // Länge des Drahtes in m r = 0.00002, // Radius des Drahtes in m Ob, // Oberfläche Draht A, // Querschnittsfläche des Drahtes V, // Volumen des Drahtes Rspe = 0.0000000528,// Spezifischer Wiederstand Wolfram in Ohm*m Rhod = 19300, // Dichte von Wolfram in kg/m3 md, // Masse des Drahtes Rd, // Wiederstand des Drahtes Rel, // Elektrischer Wiederstand des Drahtes bei T Rt, // Spezifische-elektrische Wiederstand des Drahtes in Abhängigkeit von der Temperatur Rhalte=3.5, // Widerstand des Haltedrahtes und des Gehäuses Tschmelz = 3695.15, // Schmelztemperatur des Drahtes in °K // Temperaturkonstanten/variablen Tr = 293.15, // Raumtemperatur in K / Temperatur des Drahtes bei t=0 T, // Temperatur des Drahtes in Abhängigkeit von der Zeit Tc, // Temperatur des Drahtes in Celsius Td, // Temperaturdifferenz Raum-Draht in °C Ter, // Erwärmung des Drahtes alpha = 0.0041, // Linearer Temperaturkoeffizient in 1/°C beta = 0.000001, // Linearer Temperaturkoeffizient in 1/°C lambda = 163, // Wärmeleitfähigkeit Wolfram c = 134, // spezifische Wärmekapazität Wolfram in J/(kg*°C) // Allgemeine Variablen / Konstanten iterationen = 100000000, // Anzahl der maximalen Iterationen der Simulation lambdamax, // Maximum der Strahlungsintensität in Nanometern Ug = 230, // Spannung U, // Spannung die am Draht anliegt in V I, // Stromstärke die am Draht anliegt in A f = 50, // Frequenz der Wechselspannung in Hz P, // Leistung im Draht Pg, // Aufgenommene Leistung Pgesamt C, // Wärmekapazität Bk = 0.000000056704, // Stefan-Boltzmann-Konstante Pstr, // Strahlungsleistung des Drahtes deltat = 0.000001, // Zeitschritt pro Iteration in Sekunden epsilon, // Näherung des Gesamtemmisionsgrades quiet = 0, // Nur Daten ausgeben, keine weiteren Informationen stat = 1, // Stationäre Werte erreicht falls stat==0 Im, // Memory der Werte für stat() statvar = 1.00000001, // Faktor um den P variieren darf um als stat. zu gelten k=10, // Zähler für Wellenlaenge(), Startwert der Spannung/10 für UI-Diagramm //Längenänderung Draht deltal, // Länge deltar, // Radius deltaT, // Temperatur ausdkoeff = 0.0000045, // Ausdehnungskoeffizient la, // Länge nach Ausdehnung ra, // Radius nach Audehnung t, // Zeitpunkt in Sekunden nach dem einschalten // Ausgabevariablen custom=0, // Kündigt eigene Ausgabe an: uout=0, // Spannung U wird ausgegeben iout=0, // Stromstärke I wird ausgegeben lambdamaxout=0, // Wellenlänge mit max. Strahlungsintensität wird ausgegeben pout, // Aufgenommene Leistung ausgeben tout=0, // Temperatur in C° wird ausgegeben wechselstrom=0, // Wird der Wechselstorm beachtet? freq = 50, timeout=0; // Laufzeit in s wurd ausgegeben int type; // Ende Definition der beteiligten Elemente // Anfang Mem Anfang Mem Anfang Mem Anfang Mem Anfang Mem Anfang Mem Anfang Mem void Mem() { if (wechselstrom==1) // Falls mit Wechselstrom simuliert wird: { if (Ug == 325 ); // Es wird die Stromstärke bei der Maximalspannung verglichen, { Im = I;} } if (wechselstrom ==0) Im= I; // } // Ende Mem Ende Mem Ende Mem Ende Mem Ende Mem Ende Mem Ende Mem Ende Mem Ende Mem // Anfang Stationar Anfang Stationar Anfang Stationar Anfang Stationar Anfang Stationar void Stationaer() // Überprüfung auf Stationäre Werte { if (wechselstrom==0) // Ohne Wechselstrom: { if (I >= Im){ if(I<=Im*statvar){ stat = 0;}} // Hier wird bei jeder Iteration verglichen else if (I <= Im){ if(I*statvar>=Im){ stat = 0;}} } else // Mit Wechselstrom: { if (Ug==325) // Hier wird nur bei der <Maximalspannung verglichen { if (I >= Im){ if(I<=Im*statvar){ stat = 0;}} else if (I <= Im){ if(I*statvar>=Im){ stat = 0;}} } } } // Ende Stationaer Ende Stationaer Ende Stationaer Ende Stationaer Ende Stationaer // Anfang Wechselstrom Anfang Wechselstrom Anfang Wechselstrom Anfang Wechselstrom void Wechselstrom() { Ug=325*sin((M_PI*t)/((1/freq))); // Simmuliet eine Sinusförmige Wechselspannung } // Ende Wechselstrom Ende Wechselstrom Ende Wechselstrom Ende Wechselstrom Ende Wechselstrom // Anfang Laengenaenderung Anfang Laengenaenderung Anfang Laengenaenderung Anfang Laengenaenderung void Laengenaenderung() // Simuliert die Temperaturanhängige Ausdehnung des Drahtes { deltaT = T - Tr; // Temperaturdifferenz Draht - Raum deltal = l*ausdkoeff*deltaT; // Längenänderung des Drahtes deltar = r*ausdkoeff*deltaT; // Änderung des Drahtradius la = l + deltal; // Drahtlänge nach Ausdehnung ra = r + deltar; // Drahtradius nach Ausdehnung Ob = 2*ra*M_PI*la; // Neue Oberfläche des Drahtes } // Ende Laengenaenderung Ende Laengenaenderung Ende Laengenaenderung Ende Laengenaenderung // Anfang Farbe Anfang Farbe Anfang Farbe Anfang Farbe Anfang Farbe Anfang Farbe Anfang Farbe void Farbe() // Beschreibt die Farbe mit der max. Strahlungsleistung { if (lambdamax > 780 && lambdamax < 1000000) printf("Infrarot\n"); else if (lambdamax > 0 && lambdamax <380) printf("Ultraviolett\n"); else if (lambdamax > 380 && lambdamax <450) printf("der Farbe Pupurblau\n"); else if (lambdamax > 450 && lambdamax <482) printf("der Farbe Blau\n"); else if (lambdamax > 482 && lambdamax <487) printf("der Farbe Grünlich-Blau\n"); else if (lambdamax > 487 && lambdamax <492) printf("der Farbe Cyan\n"); else if (lambdamax > 492 && lambdamax <497) printf("der Farbe Bläulich-Grün\n"); else if (lambdamax > 497 && lambdamax <530) printf("der Farbe Grün\n"); else if (lambdamax > 530 && lambdamax <560) printf("der Farbe Gelblich-Grün\n"); else if (lambdamax > 560 && lambdamax <570) printf("der Farbe Gelb-Grün\n"); else if (lambdamax > 570 && lambdamax <575) printf("der Farbe Grünlich-Gelb\n"); else if (lambdamax > 575 && lambdamax <580) printf("der Farbe Gelb\n"); else if (lambdamax > 580 && lambdamax <585) printf("der Farbe Gelblich-Orange\n"); else if (lambdamax > 585 && lambdamax <595) printf("der Farbe Orange\n"); else if (lambdamax > 595 && lambdamax <620) printf("der Farbe Rötlich-Orange\n"); else if (lambdamax > 620 && lambdamax <780) printf("der Farbe Rot\n"); } // Ende Farbe Ende Farbe Ende Farbe Ende Farbe Ende Farbe Ende Farbe Ende Farbe Ende Farbe // Anfang Konstantenberechnung Anfang Konstantenberechnung Anfang Konstantenberechnung void Konstantenberechnung() {// Hier werden die im Laufe der Rechnung benoetigten Konstanten berechnet T = Tr; // T Temperatur des Drahtes ist Raumtemperatur Tr A = r*r*M_PI; // Querschnittflaeche des Drahtes V = A*l; // Volumen des Drahtes Ob = 2*r*M_PI*l; // Oberfläche des Drahtes md = V*Rhod; // Masse des Drahtes //Rel = (Rspe*l)/A; // elektrischer Widerstand des Drahtes Rel = 58.5; // Widerstand laut Osram C = c*md; // Wärmekapazität t=0; if (quiet == 0)printf(" Oberfläche %9.8fm² Gewicht %10.9fkg Rel %10.8fOhm C%10.9f\n" ,Ob,md,Rel,C); } // Ende Konstantenberechnung Anfang Konstantenberechnung Anfang Konstantenberechnung // Anfang Berechnung Anfang Berechnung Anfang Berechnung Anfang Berechnung void Berechnung() // Anfang: Berechnung eines Zeitabschnittes { if (wechselstrom==1) Wechselstrom(); Laengenaenderung(); // Beachten der Temperaturabhängigen Ausdehnung des Glühdrahtes Td = T - 293.15; // Temperaturdifferenz Draht-Raumtemperatur //Elektrische Eigenschaften----------------- Rt = Rel*(1+alpha*(Td)+beta*pow(Td,2)); // Spezifische-elektrische Wiederstand des Drahtes U = Ug - (Ug * Rhalte / (Rhalte + Rt)); // Spannung die am Glühdraht anliegt, //Haltedrahtwiderstand subtr. P =0.98*((U*U)/Rt); // Aufgenommene Leistung I = U / Rt; // Stromstaerke I wird berechnet Pg= U * I; // vom Draht aufgenommene Leistung //Gesamtemissionsgrad----------------------------------- //epsilon = 0.05 + ((0.39/3300)*(T-273.153)); // Gesamtemissionsgrad linear Tc = T - 273.15; // Temperatur von Kelvin in Celsius umrechnen epsilon = -1*pow(10, -8)*Tc*Tc +0.0002*Tc + 0.0235; // Gesamtemissionsgrad polynomisch if (epsilon > 0.39) // Lineare Naeherung mit 0.39 als Obergrenze epsilon=0.39; //Strahlung---------------------------------------------- Pstr = (pow(T,4)*Bk*Ob*epsilon); // Strahlungsleistung nach Stefan-Boltzmann-Gesetz P = P-Pstr; // Summe der Leistungsaufnahme/abgabe lambdamax = 2897800 / T; // Wiensches Verschiebungsgesetz Ter = (P*deltat)/C; // Ter = Erwärmung des Drahtes T = T + Ter; // Aktualisierung der Drahttemperatur t = t + deltat; // Aktualisierung der Laufzeit } // Ende Berechnung Ende Berechnung Ende Berechnung Ende Berechnung Ende Berechnung // Anfang Datenausgabe Anfang Datenausgabe Anfang Datenausgabe Anfang Datenausgabe void DatenausgabeSim() // Für "Simulation()" { datei = fopen ("Simulation.dat", "a"); // Öffnen der Zeildatei if (datei != NULL) // Falls fehlerfrei if (quiet == 1) // Ausgabe ohne Einheiten { printf(" %8.3f %10.8f %10.9f %7.2f %8.6f\n" ,Pg,I,T-273.15,Pstr,t); // Ausgabe in der Console, ohne Einheiten fprintf (datei," %8.3f %5.2f %10.9f %7.2f %8.6f\n" ,Pg,I,T-273.15,Pstr,t); // Hinzufügen einer Zeile, ohne Einheiten } else // Ausgabe mit Einheiten { printf(" P %15.10fW I %10.8fA T %8.2f°C Strahll. %7.2fW t %8.6fs\n" ,Pg,I,T-273.15,Pstr,t); // Ausgabe in der Console, mit Einheiten fprintf (datei, " P %10.3fW I %5.2fA T %8.2f°C Strahll. %7.2fW t %8.6fs\n" ,Pg,I,T-273.15,Pstr,t);// Hinzufügen einer Zeile, mit Einheiten } fclose (datei); // Schließen der Zieldatei } void DatenausgabeUID() // Für UIDiagramm { datei = fopen ("UIDiagramm.dat", "a"); // Öffnen der Zeildatei if (datei != NULL) // Falls fehlerfrei if (quiet == 1) // Falls keine Einheuten ausgegeben werden sollen { fprintf (datei, "%5.1f %6.5f\n" ,Ug,I); // Hinzufügen einer Zeile, ohne Einheiten printf("%5.1f %6.5f\n" ,Ug,I); // Ausgabe in der Console, ohne Einheiten } else // Falls Einheiten mit ausgegeben werden sollen { fprintf (datei, "%5.1fV %6.5fA\n" ,Ug,I); // Hinzufügen einer Zeile, ohne Einheiten printf("%5.1fV %6.5fA\n" ,Ug,I); // Ausgabe in der Console, ohne Einheiten } fclose (datei); // Schließen der Zieldatei } // Ende Datenausgabe Ende Datenausgabe Ende Datenausgabe Ende Datenausgabe Ende Datenausgabe // Anfang Customout Anfang Customout Anfang Customout Anfang Customout Anfang Customout void Customout() // Falls eine eigene Ausgabe gewünscht ist, wird diese hier entsprechend den Parametern erstellt { if (quiet == 0) // Einheiten werden ausgegeben { if (timeout==1){ printf ("%8.6fs ",t); fprintf (datei, "%8.6fs " ,t);} // Laufzeit if (uout==1){ printf ("%5.1fV ",Ug); fprintf (datei, "%5.1fV " ,Ug);} // Spannung if (iout==1){ printf ("%6.4fA ",I); fprintf (datei, "%6.4fA " ,I);} // Stromstärke if (pout==1){ printf ("%6.4fW ",Pg); fprintf (datei, "%6.4f " ,Pg);} // Aufgenommene //Leistung gesamt if (lambdamaxout==1){ printf ("%5.1fnm ",lambdamax); fprintf (datei, "%5.1fnm " ,lambdamax);} // Wellenlänge mit max. Strahlungsleistung if (tout==1){ printf ("%6.2f°C ",T-273.15); fprintf (datei, "%5.1f°C " ,T-273.15);} // Temperatur in °C printf ("\n"); fprintf (datei, "\n"); // Zeilenumbruch fclose (datei); } else // Einheiten werden nicht ausgegeben { if (timeout==1){ printf ("%8.6f ",t); fprintf (datei, "%8.6f " ,t);} // Laufzeit if (uout==1){ printf ("%5.1f ",Ug); fprintf (datei, "%5.1f " ,Ug);} // Spannung if (iout==1){ printf ("%6.4f ",I); fprintf (datei, "%6.4f " ,I);} // Stromstärke if (pout==1){ printf ("%6.4f ",Pg); fprintf (datei, "%6.4f " ,Pg);} // Aufgenommene // Leistung gesamt if (lambdamaxout==1){ printf ("%5.1f ",lambdamax); fprintf (datei, "%5.1f" ,lambdamax);} // Wellenlänge mit max. Strahlungsleistung if (tout==1){ printf ("%6.2f",T-273.15); fprintf (datei, "%6.2f " ,T-273.15);} // Temperatur in °C printf ("\n"); fprintf (datei, "\n"); // Zeilenumbruch fclose (datei); } } // Ende Customout Ende Customout Ende Customout Ende Customout Ende Customout // Anfang Simulation Anfang Simulation Anfang Simulation Anfang Simulation Anfang Simulation { Konstantenberechnung(); int i; for (i=0; i<iterationen*stat; i++) // Iteriert bis stationäre Werte erreicht sind { Mem(); // Speichert die Momentane Stromstärke um sie mit der nächsten zu vergleichen Berechnung(); // Eigentliche Berechnung der Lampe if (custom == 1) // Falls eigene Ausgabe gewünscht ist { datei = fopen ("Simulation.dat", "a"); Customout(); // Eigene Ausgabe } else if (custom == 0) // Ansonsten Standartausgabe DatenausgabeSim(); // Gibt die Werte aus Stationaer(); // Vergleicht die Werte aus Mem() mit den aktuellen if (stat == 1 && i == iterationen-1) // Falls keine Stationären Werte erreicht werden und alle // Schleifen durchgelaufen sind printf(" Ende der Schleife\n Keine Stationären Werte erreicht\n"); } if (quiet == 0) { if (T > Tschmelz) printf("Die Drahttemperatur überschreitet denn Schmelzpunkt. Der Draht versagt!\n"); printf ("Stationäre Werte erreicht bei %7.6fs, Änderung P < 0.01promille\n",t); printf("Maximale Strahlungsleistung bei %8.6fnm, das entspricht " ,lambdamax); Farbe(); printf("\n"); } } // Ende Simulation Ende Simulation Ende Simulation Ende Simulation Ende Simulation Ende Simulation // Anfang UIDiagramm Anfang UIDiagramm Anfang UIDiagramm Anfang UIDiagramm Anfang UIDiagramm void UIDiagramm() { int i; if(quiet == 0) printf("UIDiagramm Start\n"); Konstantenberechnung(); datei = fopen ("UIDiagramm.dat", "a"); if (datei != NULL) for (k; k<2301; k++) // Intervall für das die stationären Werte berechnet werden { Ug=k*0.1; // 0.1V Schritte if (timeout==1) // Nur falls die Zeit bis zur Stationärität benötigt wird { // Andernfalls wird so die Rechenzeit verkürzt T = Tr; // Widerherstellung der Ausgangswerte: Draht hat Raumtemperatur Ob = 2*r*M_PI*l; // Oberfläche des Drahtes, Längenänderung zurücknehmen t = 0; // Laufzeit auf 0 } for (i=0; i<iterationen*stat; i++) // Widerholen bis stat. Werte erreicht sind { Mem(); // Speichert die Momentane Stromstärke um sie mit der nächsten zu vergleichen Berechnung(); // Eigentliche Berechnung der Lampe Stationaer(); // Vergleicht die Werte aus Mem() mit den aktuellen } stat=1; // stationär wider "unwahr" setzen { if (custom == 1) // Eigene Ausgabe { datei = fopen ("UIDiagramm.dat", "a"); Customout(); } else if (custom == 0) // Standart Ausgabe { DatenausgabeUID(); } } } if(quiet == 0) printf("UIDiagramm Ende\n" ); // Statusmeldung } // Ende UIDiagramm Ende UIDiagramm Ende UIDiagramm Ende UIDiagramm Ende UIDiagramm Ende UIDiagramm // Anfang main Anfang main Anfang main Anfang main Anfang main Anfang main Anfang main int main(int argc,char* argv[]) { int gueltig=1; // Parameter für gültige Eingabe int i = 1; if (argc == 1) printf("Kein Parameter übergeben.\nDas Programm wurde beendet. \nSiehe Bericht: '5.Programmaufruf'."); // Falls kein Parameter übergeben wird for(; i < argc*gueltig; ++i) // Überprüfung der Parameter, bis ein ungültiger auftritt { if (!strcmp( argv[i], "quiet" )) // Nur Daten werden ausgegeben, quiet = 1; // Keine Einheiten/Statusmeldung else if (!strcmp( argv[i], "U" )) // Spannung U ausgeben { custom = 1; // Benutzerdefienierte Ausgabe uout = 1; } else if (!strcmp( argv[i], "I" )) // Stromstärke I ausgeben { custom = 1; // Benutzerdefienierte Ausgabe iout = 1; } else if (!strcmp( argv[i], "L" )) // Gibt Wellenlänge mit maximaler { // Strahlungsleistung aus custom = 1; // Benutzerdefienierte Ausgabe lambdamaxout = 1; } else if (!strcmp( argv[i], "T" )) // Gibt die Temperatur in Grad Celsius aus { custom = 1; // Benutzerdefienierte Ausgabe tout = 1; } else if (!strcmp( argv[i], "P" )) // GIbt die aufgenommene Leistung aus { custom = 1; // Benutzerdefienierte Ausgabe pout = 1; } else if (!strcmp( argv[i], "speed" )) // Beschleunigt den Iterationsvorgang zu { // Lasten der Ergebnisse statvar = ((statvar-1)*10)+1; k = k+100; // Erhöht Anfang des UIDiagramms um 10V } else if (!strcmp( argv[i], "Z" )) // Gibt die Laufzeit aus { timeout = 1; custom = 1; // Benutzerdefienierte Ausgabe } else if (!strcmp( argv[i], "wechsel" ))// Simuliert mit Wechselspannung { wechselstrom = 1; statvar = 1.0001; // Verringert nötige Genauiggkeit } else if (!strcmp( argv[i], "S" )) { FILE *datei; // Erstellen bzw überschreiben des Textdokumentes datei = fopen ("Simulation.dat", "w"); if (datei != NULL) fprintf (datei, ""); fclose (datei); Simulation(); // Eigentliche Berechnung } else if (!strcmp( argv[i], "W" )) { FILE *datei; // Erstellen bzw überschreiben des Textdokumentes datei = fopen ("UIDiagramm.dat", "w"); if (datei != NULL) fprintf (datei, ""); fclose (datei); UIDiagramm(); // Eigentliche Berechnung } else // Ungültige Parameter abfangen { printf("Ungültiger Parameter '%s'\nDas Programm wurde beendet." "\nBitte verwenden Sie nur gültige Parameter.",argv[i]); gueltig=0; // Stoppt das Programm } } return 0; } // Ende Main Ende Main Ende Main Ende Main Ende Main Ende Main Ende Main Ende Main // Ende des Programms