Hallo zusammen
inzwischen bin ich mit dem Script für die Allegheny recht weit gekommen und konnte auch so einiges selbst aus den gemachten Erfahrungen ableiten. Was ich aber derzeit nicht korrekt hinbekomme, ist eine Steuerung der Zylinderhahn Emitter, die ich gerne einzeln ansteuern möchte, also kein dauerhafter Dampfausstoss, sondern zeitversetzt und mit zunehmender Geschwindigkeit auch natürlich kürzere Öffnungszeiten.
Ich habe mir nach dem Tip von Maik Goltz gedacht, dass ich diese Sinusfunktion hier gebrauchen könnte, und mir einen ControlValue für Drehzahl der Räder erstellt, sowie Controlvalues für linken und rechten "Kolben", und natürlich Controlvalues für jeden Zylinderhahn.
Die Idee war, mit steigender Drehzahl die Sinuskurve entsprechend in der Frequenz zu beeinflussen, habe in den Quellen wo ich mich ein wenig schlau gemacht habe gelesen, dass die wohl als Parameter "b" bezeichnet wird. Der Ansatz ist sicher vielleicht nicht extrem genau bzw. es erfordert einiges testen bis man die Öffnungszeiten angenähert hat - könnte aber damit leben wenn dies eben nur genähert ist.
Im Grunde war ich mit der Lösung sogar erfolgreich, beim Start bleiben die Hähne länger auf, die Zeiten verkürzen sich auch mit steigendem Tempo.
Was mich aber absolut wundert ist, dass bei einer Bremsung, sobald wohl eine Verögerung eintritt, die Öffnunszeiten extrem schnell erfolgen, viel schneller als bei erhöhen des Tempos. Dies bleibt auch bis zum Stillstand so, beim Wiederanfahren bleibt dies merkwürdigerweise auch so - ich habe mit den Parametern etwas hin und her probiert, und zumindest dieses Phänomen deutlich vermindert. Ich frage mich halt ob da irgendwelche von Acceleration / Tractive Effort mit einbezogen werden, obwohl ich in der Rechnung davon keinen dieser Werte mit einbeziehe - als variables Element habe ich nur die Drehzahl bzw. auch einmal die Simulationtime genutzt.
Hat jemand noch eine andere Idee wie ich die Hähne synchronisieren könnte, also z.B. über Zeit / Weg oder sonstiges? Oder habe ich da einen Denkfehler generell in meinem Ansatz? Oder schlau gedacht und nur schlecht gemacht?
Unten mein erster so weit funktionierender Code, ich habe die eigentliche Berechnung für gCockLHval und gCockRHval noch einige Male überarbeitet, meine einige KLammern passen hier nicht bzw. fehlen, stelle die aktuelle Variante später auch noch ein.
Dort ist Simulationtime nicht mehr enthalten, der Wertebereich wurde verändert usw. - letztlich bleibt aber das Verhalten beim Bremsen.
Erledigt - den notwendigen Input fand ich hier:
https://www.trainsimdev.com/forum/viewtopic.php?f=30&t=282#
Danke für jeden Input und viele Grüsse
Thorsten
gSpeed = Call("GetSpeed")
gRPM = (gSpeed * 60) / 5.02;
if gSpeed > 0.1 then
Call("SetControlValue","DriverRPM", 0, gRPM);
else
Call("SetControlValue", "DriverRPM", 0, 0);
end
gCockLR = Call ("GetControlValue", "CockLR", 0)
gCockLF = Call ("GetControlValue", "CockLF", 0)
gCockRF = Call ("GetControlValue", "CockRF", 0)
gCockRR = Call ("GetControlValue", "CockRR", 0)
gCockvalLH = (math.sin)(0.035*gRPM*gSimulationTime)*8+8
gCockvalRH = (math.sin)(0.035*gRPM*gSimulationTime)*8+12
Call("SetControlValue","CylCockValLH", 0, gCockvalLH);
Call("SetControlValue","CylCockValRH", 0, gCockvalRH);
gCockactionLH = Call ("GetControlValue", "CylCockValLH", 0)
if gCockactionLH >= 0 and gCockactionLH <= 4.0 then
Call("SetControlValue", "CockLF", 0, 1);
elseif gCockactionLH >= 12 and gCockactionLH <= 16 then
Call("SetControlValue", "CockLR", 0, 1);
else
Call("SetControlValue", "CockLF", 0, 0);
Call("SetControlValue", "CockLR", 0, 0);
end
gCockactionRH = Call ("GetControlValue", "CylCockValRH", 0)
if gCockactionRH >= 4 and gCockactionRH <= 8 then
Call("SetControlValue", "CockRR", 0, 1);
elseif gCockactionRH >= 16 and gCockactionRH <= 20 then
Call("SetControlValue", "CockRF", 0, 1);
else
Call("SetControlValue", "CockRR", 0, 0);
Call("SetControlValue", "CockRF", 0, 0);
end
Alles anzeigen