You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
304 lines
12 KiB
304 lines
12 KiB
1 year ago
|
/**
|
||
|
* @file Zusi 3 Antrieb DLL Test
|
||
|
* @author Jonathan Pilborough / jonathanp
|
||
|
*/
|
||
|
|
||
|
#ifndef ANTRIEB_H
|
||
|
#define ANTRIEB_H
|
||
|
|
||
|
#include <stdint.h>
|
||
|
|
||
|
enum Fahrleitungstyp : uint8_t
|
||
|
{
|
||
|
Fahrl_Ohne,
|
||
|
Fahrl_Unbestimmt,
|
||
|
Fahrl_15kV16Hz,
|
||
|
Fahrl_25kV50Hz,
|
||
|
Fahrl_1500VDC,
|
||
|
Fahrl_1200VDCHamburg,
|
||
|
Fahrl_3kVDC,
|
||
|
Fahrl_750VDCBerlin,
|
||
|
Fahrl_Bordsystem
|
||
|
};
|
||
|
|
||
|
enum AntriebsRenderModus : uint8_t
|
||
|
{
|
||
|
AntrRnd_EigenesFzg,
|
||
|
AntrRnd_EigenerZug,
|
||
|
AntrRnd_AndererZugOderAP,
|
||
|
AntrRnd_Unsichtbar,
|
||
|
AntrRnd_NichtAufgegleist
|
||
|
};
|
||
|
|
||
|
//NOT USED?
|
||
|
struct RechnungVereinfachtGesamtzug
|
||
|
{
|
||
|
// Konstanten (in akt. Zusammenstellung)
|
||
|
const float MasseGesamt; // kg
|
||
|
const float RotationsZuschlag; // kg
|
||
|
const float Laenge;
|
||
|
const float spMax;
|
||
|
const float LeistungMax;
|
||
|
const float DynLeistungMax;
|
||
|
const float AnfahrKraftMax;
|
||
|
const float BremskraftMax;
|
||
|
const float Bremsmasse;
|
||
|
const float cwA;
|
||
|
const int32_t AnzahlAntriebsAchsen;
|
||
|
|
||
|
// Variablen
|
||
|
float ZugkraftAkt;
|
||
|
float ZugkraftMaxAkt; // f(sp), die gerade max. möglich Zugkraft
|
||
|
float BremskraftLuftAkt;
|
||
|
float BremskraftDynAkt;
|
||
|
float BremskraftMgAkt;
|
||
|
float HangabtrKraftAkt; // neg: geht bergab
|
||
|
float RollwiderstAkt;
|
||
|
float BogenwiderstAkt;
|
||
|
float LuftwiderstAkt;
|
||
|
};
|
||
|
|
||
|
//NOT USED?
|
||
|
struct ProtokollMehrfachTraktion
|
||
|
{
|
||
|
float SollZugkraft; // absolute Vorgabe aus gesteuertem Fahrzeug
|
||
|
float SollLeistungNormiert; // 0...1
|
||
|
float ZylDruckDynBremse; // druckluftergänzungsbremse usw.
|
||
|
uint8_t SASchaltungAktuell; // 0 oder $F
|
||
|
};
|
||
|
|
||
|
enum KombiSchalterFunktion : uint8_t {
|
||
|
KSF_Nichts,
|
||
|
KSF_FahrstufeX, KSF_FahrstufeSchnellAus, KSF_FahrstufeAufX, KSF_FahrstufeFahren, KSF_FahrstufeAbX,
|
||
|
KSF_DynBremseX, KSF_DynBremsenull, KSF_DynBremseAufX, KSF_DynBremseBremsen, KSF_DynBremseAbX,
|
||
|
KSF_AFBX, KSF_AFBnull, KSF_AFBAuf, KSF_AFBAb,
|
||
|
KSF_AFBEinX,
|
||
|
KSF_ZugkraftX, KSF_ZugkraftSchnellAus, KSF_ZugkraftAuf, KSF_ZugkraftFahren, KSF_ZugkraftAb,
|
||
|
KSF_HllFuellen, KSF_HllDruckX, KSF_HllAbschluss, KSF_HllMittel, KSF_HllBremsenSchnell,
|
||
|
KSF_Angleicher,
|
||
|
KSF_ZbvLoesen, KSF_ZbvMittel, KSF_ZbvBremsen,
|
||
|
KSF_GangWahlX, KSF_GangWahlnull, KSF_GangWahlAuf, KSF_GangwahlFahren, KSF_GangWahlAb,
|
||
|
KSF_RischaV, KSF_RischaM, KSF_Rischa0, KSF_RischaR,
|
||
|
KSF_StufenschalterLG, KSF_Stufenschalter0, KSF_StufenschalterSG,
|
||
|
KSF_GruppenschalterStop, KSF_GruppenschalterAus, KSF_GruppenschalterEin, KSF_GruppenschalterStart,
|
||
|
KSF_StromabnehmerAb, KSF_StromabnehmerNull, KSF_StromabnehmerAuf,
|
||
|
KSF_HauptschalterAus, KSF_HauptschalterNull, KSF_HauptschalterEin,
|
||
|
KSF_MgBremseX,
|
||
|
KSF_SandenX,
|
||
|
KSF_PfeifeX, // ist frei und kann neu belegt werden
|
||
|
KSF_GlockeX, // ist frei und kann neu belegt werden
|
||
|
KSF_LokbremseentlueftenX,
|
||
|
KSF_LuefterX,
|
||
|
KSF_Individuell_01, KSF_Individuell_02, KSF_Individuell_03, KSF_Individuell_04, KSF_Individuell_05,
|
||
|
KSF_Individuell_06, KSF_Individuell_07, KSF_Individuell_08, KSF_Individuell_09, KSF_Individuell_10,
|
||
|
KSF_Individuell_11, KSF_Individuell_12, KSF_Individuell_13, KSF_Individuell_14, KSF_Individuell_15,
|
||
|
KSF_Individuell_16, KSF_Individuell_17, KSF_Individuell_18, KSF_Individuell_19, KSF_Individuell_20,
|
||
|
KSF_WandlerfuellungX,
|
||
|
KSF_LuftpresserAus,
|
||
|
KSF_Notaus,
|
||
|
KSF_Individuell_21, KSF_Individuell_22, KSF_Individuell_23, KSF_Individuell_24, KSF_Individuell_25,
|
||
|
KSF_Individuell_26, KSF_Individuell_27, KSF_Individuell_28, KSF_Individuell_29, KSF_Individuell_30,
|
||
|
KSF_Individuell_31, KSF_Individuell_32, KSF_Individuell_33, KSF_Individuell_34, KSF_Individuell_35,
|
||
|
KSF_Individuell_36, KSF_Individuell_37, KSF_Individuell_38, KSF_Individuell_39, KSF_Individuell_40,
|
||
|
KSF_FederspeicherAnlegen, KSF_FederspeicherNull, KSF_FederspeicherLoesen, KSF_FederspeicherUmschalten,
|
||
|
KSF_BatterieHSAus, KSF_BatterieHSNull, KSF_BatterieHSEin,
|
||
|
KSF_FahrschalterLSSAus,
|
||
|
KSF_DynBremseLSSAus,
|
||
|
KSF_ComputerBremseX, KSF_ComputerBremseAufX, KSF_ComputerBremseBremsen, KSF_ComputerBremseAbX,
|
||
|
KSF_FtdIntern_01, KSF_FtdIntern_02, KSF_FtdIntern_03, KSF_FtdIntern_04, KSF_FtdIntern_05,
|
||
|
KSF_FtdIntern_06, KSF_FtdIntern_07, KSF_FtdIntern_08, KSF_FtdIntern_09, KSF_FtdIntern_10,
|
||
|
KSF_FtdIntern_11, KSF_FtdIntern_12, KSF_FtdIntern_13, KSF_FtdIntern_14, KSF_FtdIntern_15,
|
||
|
KSF_FtdIntern_16, KSF_FtdIntern_17, KSF_FtdIntern_18, KSF_FtdIntern_19, KSF_FtdIntern_20,
|
||
|
KSF_FuehrertischDeaktiviert,
|
||
|
KSF_AntriebsUmschaltung
|
||
|
};
|
||
|
|
||
|
struct KombischalterFkt {
|
||
|
KombiSchalterFunktion funktion;
|
||
|
float parameter;
|
||
|
};
|
||
|
|
||
|
// Achtung Änderungen sind releveant für Antriebs-Brems-dll !!!
|
||
|
struct ProtokollFst {
|
||
|
KombischalterFkt fbv;
|
||
|
KombischalterFkt bv;
|
||
|
KombischalterFkt rischa;
|
||
|
uint8_t sandEin;
|
||
|
uint8_t luefterEin;
|
||
|
uint8_t mgManuellEin;
|
||
|
uint8_t antriebAbregelnEin; // für Eingriffe Schleuderschutz usw.
|
||
|
uint16_t traktionssperreGrund; // 0: Nichts; 1: Federspeicherbremse aktiv; 2: Türsystem; 3: Bremsprobe läuft; 4: Sifa-HS
|
||
|
uint8_t betriebszwangsbremsungEin;
|
||
|
uint8_t zwangshaltEin;
|
||
|
KombischalterFkt schaltstufenSteller;
|
||
|
KombischalterFkt dynBremsSteller;
|
||
|
KombischalterFkt computerBremsSteller;
|
||
|
KombischalterFkt zugkraftSteller;
|
||
|
KombischalterFkt wandlerfuellung;
|
||
|
KombischalterFkt AFBvSollSteller;
|
||
|
KombischalterFkt ganghebel;
|
||
|
KombischalterFkt stufenschalter;
|
||
|
KombischalterFkt gruppenschalter;
|
||
|
KombischalterFkt hauptschalter;
|
||
|
KombischalterFkt stromabnehmer;
|
||
|
KombischalterFkt batterieHS;
|
||
|
uint8_t dynBremseLSSAus;
|
||
|
uint8_t fahrschalterLSSAus; // 1:deaktiviert 2:Normalzustand 3:gestört
|
||
|
uint8_t AFBEin; // Lage des Schalters
|
||
|
uint8_t AFBvSollNullstellungszwang; // wird gf. von LZB aktiviert
|
||
|
float AFBspMax; // 160 oder fzg-vmax und Beachtung Zugdaten
|
||
|
float AFBsppMax; // max. Beschl, default 0.5
|
||
|
uint8_t TAVHaltebremse;
|
||
|
uint8_t AFBHaltebremseTrotzFahrschalter;
|
||
|
uint8_t tempomatEin; // Lage des Schalters
|
||
|
uint8_t angleicher;
|
||
|
uint8_t luftpresserAus;
|
||
|
uint8_t lokBremseEntlueften;
|
||
|
uint8_t automatischfahren;
|
||
|
float individuell[40]; // 0 - 39 -> 1 - 40
|
||
|
KombischalterFkt federspeicher;
|
||
|
uint16_t bremsprobeStatus;
|
||
|
uint8_t schleuderschutzElektronischWirksam;
|
||
|
float ftdIntern[20]; // 0 -> 19 -> 1 - 19
|
||
|
KombischalterFkt fuehrertischDeaktiviert;
|
||
|
KombischalterFkt antriebsaktivierung;
|
||
|
};
|
||
|
|
||
|
struct Grundfahrdaten { // das was jedes Fzg braucht, auch wenn der AP fährt
|
||
|
float pAkt;
|
||
|
float zugkraftAkt;
|
||
|
};
|
||
|
|
||
|
struct Mehrfachtraktionsdaten {
|
||
|
Grundfahrdaten Grundfahrdaten;
|
||
|
float spAktNormiert; // 0..1
|
||
|
float lastAktNormiert; // 0..1
|
||
|
float lastAktDynBremseNormiert;
|
||
|
float zylDruckDynBremse; // druckluftergänzungsbremse usw.
|
||
|
float druckHL;
|
||
|
float druckHBL;
|
||
|
uint8_t hauptschalterRaus;
|
||
|
uint8_t trennschuetzRaus;
|
||
|
uint8_t sand;
|
||
|
Fahrleitungstyp streckenStromsystem;
|
||
|
float fahrlSpannungsfaktor; // 0, wenn kein SA oben, sonst 1 oder 1,x für schwankende Spannung
|
||
|
KombiSchalterFunktion fahrtRichtung; // KSF_RischaV, KSF_RischaM, KSF_Rischa0, KSF_RischaR,
|
||
|
uint16_t antriebsumschaltung; // Index-Nr ab 1 (0=nichts los)
|
||
|
};
|
||
|
|
||
|
#define DLLEXPORT __declspec(dllexport)
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C"
|
||
|
{
|
||
|
#endif
|
||
|
// alle Einheiten in SI (m, N, m/s, kg, s)
|
||
|
|
||
|
/* Global Information Functions */
|
||
|
|
||
|
// die Funktion sollte eine Messagebox starten, die als kurze Doku zur Funktion
|
||
|
// der dll für den Fahrzeugbauer liefert
|
||
|
DLLEXPORT void Info();
|
||
|
|
||
|
// die dll kann mehrere Varianten enthalten, es muss mindestens 1 zurückgegeben werden
|
||
|
DLLEXPORT uint16_t AnzahlVarianten();
|
||
|
|
||
|
// Für jede Variante soll ein kurzer String als Beschreibung zurückgegeben werden
|
||
|
// Die strings werden im Fahrzeugeditor in die Combobox gefüllt
|
||
|
// index beginnt bei 0 für die 1. Variante
|
||
|
DLLEXPORT wchar_t* VariantenName(int32_t index);
|
||
|
|
||
|
/* Initialisation */
|
||
|
|
||
|
// Diese Funktion wird beim Start der Fahrt einmal aufgerufen, um der dll
|
||
|
// mitzuteilen, welche der Varianten berechnet werden soll
|
||
|
// index beginnt bei 0 für die 1. Variante
|
||
|
// Rückgabe ist eine Adresse, über die die dll bei mehrfacher Verwendung erkennen
|
||
|
// kann, welche Instanz gerade gefragt ist. Der hier zurückgegebene Wert wird
|
||
|
// von Zusi bei allen Aufrufen als "Instanz" wieder übergeben
|
||
|
DLLEXPORT void* VarianteAktivieren(int32_t index);
|
||
|
|
||
|
// Antriebstyp gemäß TCP-Doku 0002 000A 008E 0001 0025 0001
|
||
|
DLLEXPORT uint8_t LeseAntriebstyp(void* instanz);
|
||
|
|
||
|
/* Input - Simulation Step */
|
||
|
|
||
|
// ruft der Sim einmal pro Rechenschritt für das selbstgefahrene Fahrzeug und
|
||
|
// für Fahrzeuge im Mehrfachtraktionsmodus im selbstgefahrenen Zug auf,
|
||
|
// um die Führerstandsbedienung zu übertragen
|
||
|
DLLEXPORT void Bedienung(void* instanz, AntriebsRenderModus antriebsRenderModus, ProtokollFst* prot, float sp);
|
||
|
|
||
|
// ruft der Sim einmal pro Rechenschritt auf, dort sollen die Berechnungen erfolgen
|
||
|
// wird nur für das selbstgefahrene Fahrzeug und für Fahrzeuge im
|
||
|
// Mehrfachtraktionsmodus im selbstgefahrenen Zug aufgerufen
|
||
|
DLLEXPORT void Berechnung(void* instanz, double dt, AntriebsRenderModus antriebsRenderModus, Mehrfachtraktionsdaten mehrfachtraktionsdaten);
|
||
|
|
||
|
// das wird für Fahrzeuge einmal pro Rechenschritt aufgerufen, die im eigenen
|
||
|
// Zug im Modus "eigener Tf" fahren und für alle Fahrzeuge im Autopilotmodus
|
||
|
// es muss hier eine vereinfachte, schnelle Berechnung durchgeführt werden
|
||
|
// komplexe Rechenmanöver können die Performance beeinflussen, da sehe viele Züge
|
||
|
// mit diesem Modus im fahrplan unterwegs sein können
|
||
|
DLLEXPORT void VorspanntraktionsdatenSetzen(void* instanz, float sp, float sollLeistungNormiert);
|
||
|
|
||
|
/* Input - Event Triggers */
|
||
|
|
||
|
// wird vom Sim aufgerufen, wenn ein Nullstellungszwang durch das Antriebssystem
|
||
|
// erfolgen muss
|
||
|
DLLEXPORT void Nullstellungszwang(void* instanz);
|
||
|
|
||
|
// wird vom Sim aufgerufen, wenn sich der Modus des HS ändern soll
|
||
|
// modus: 0: HS ein, 1: HS aus, 2: Spannung frisch an, 3: HS frisch ein
|
||
|
DLLEXPORT void SetzeHauptschalterzustand(void* instanz, uint8_t modus);
|
||
|
|
||
|
/* Ouput */
|
||
|
|
||
|
// die bei der angegebenen Geschwindigkeit max. mögliche Zugkraft
|
||
|
DLLEXPORT float LeseMaxAntriebskraft(void* instanz, float spAkt);
|
||
|
|
||
|
// div. Fahrgrößen
|
||
|
DLLEXPORT float LeseAntriebskraft(void* instanz);
|
||
|
DLLEXPORT float LeseAntriebskraftSollNormiert(void* instanz);
|
||
|
DLLEXPORT float LeseOberstrom(void* instanz);
|
||
|
DLLEXPORT float LeseMotorstrom(void* instanz);
|
||
|
DLLEXPORT float LeseMotorspannung(void* instanz);
|
||
|
DLLEXPORT int32_t LeseAchsen(void* instanz);
|
||
|
DLLEXPORT float LeseSollZugkraft(void* instanz);
|
||
|
DLLEXPORT float LeseMotordrehzahl(void* instanz);
|
||
|
DLLEXPORT float LeseMotormoment(void* instanz);
|
||
|
DLLEXPORT float LeseMotorlast(void* instanz);
|
||
|
DLLEXPORT float LeseFahrstufe(void* instanz);
|
||
|
|
||
|
// C-Druck für Druckluftergänzungsbremse o.ä. soll Druckluft-Bremse überstimmen
|
||
|
// -1 keine Vorgabe
|
||
|
DLLEXPORT float LeseZylSolldruck(void* instanz);
|
||
|
|
||
|
// muss true zurückgeben, wenn das Schaltwerk auf 0 steht
|
||
|
DLLEXPORT float PruefeFahrstufe0(void* instanz);
|
||
|
|
||
|
// muss true zurückgeben, wenn aus Sicht des Antriebsmodells ein
|
||
|
// Nullstellungszwang aktiv ist
|
||
|
DLLEXPORT uint8_t NullstellungszwangAktiv(void* instanz);
|
||
|
|
||
|
// muss true zurückgeben, wenn aus Sicht des Antriebsmodells eine
|
||
|
// Hauptschalterauslösung nötig ist wegen unpassender Fahrleitungsspannung
|
||
|
// Spannungsfaktor ist 1, wenn die Fahrleitungsspannung genau dem Sollwert entspricht
|
||
|
DLLEXPORT uint8_t HauptschalterWgOLEnde(void* instanz, Fahrleitungstyp fahrlTyp, float spannungsfaktor);
|
||
|
|
||
|
// muss true zurückgeben, wenn aus Sicht des Antriebsmodells eine
|
||
|
// Hauptschalterauslösung wg. Oberstromüberschreitung nötig ist.
|
||
|
// für diesen Antrieb muss sich die dll selbst um die Auswirkungen kümmern
|
||
|
// Die Funktion teilt das hier nur z.B. den anderen Einheiten einer Mehrfachtraktion mit
|
||
|
DLLEXPORT uint8_t HauptschalterWgOberstrom(void* instanz);
|
||
|
|
||
|
// Angabe gemäß Doku zu Führerstands-ID x0013
|
||
|
DLLEXPORT uint8_t Hauptschalterstatus(void* instanz);
|
||
|
|
||
|
// Zustand angeben für Luftpresser-Steuerung
|
||
|
DLLEXPORT uint8_t HauptschalterDrin(void* instanz);
|
||
|
DLLEXPORT uint8_t DieselmotorLaeuft(void* instanz);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif
|