lsa-planer

LSA-Planer Professional – Planungssoftware für Lichtsignalanlagen nach RiLSA 2015 und § 45 StVO. EUPL-1.2.

/ src domain rilsa constants.ts

78,3 KB Rohdatei
src/domain/rilsa/constants.ts — 1685 Zeilen
1 import type {
2 KilometersPerHour,
3 Meters,
4 MetersPerSecond,
5 Ratio,
6 Seconds,
7 VehiclesPerHour,
8 } from '../units';
9 import type { Anlagenart, Movement, TrafficMode, UeberfahrzeitAnsatz, VehicleClass } from './types';
10 import type { Pruefstand } from './quellen';
11
12 /**
13 * Zentrale Kennwerte nach RiLSA 2015 (Richtlinien fuer Lichtsignalanlagen,
14 * FGSV 321) sowie HBS 2015 fuer die Qualitaetsbewertung.
15 *
16 * WICHTIG - Umgang mit diesen Werten:
17 *
18 * 1. Dies ist die EINZIGE Quelle dieser Groessen im gesamten Programm. Im
19 * Altbestand standen dieselben Zahlen zusaetzlich hartcodiert in der
20 * Berechnung, in der Validierung und in der Simulation - mit abweichenden
21 * Werten, sodass dieselbe Anlage je nach Programmteil anders bewertet wurde.
22 *
23 * 2. Die Werte sind ueber die Vorgabenverwaltung anpassbar (frueher
24 * "Formel-Studio"), jedoch nur innerhalb der in SAFETY_FLOORS
25 * festgelegten Schranken. Sicherheitsrelevante Mindestwerte lassen sich
26 * nicht unterschreiten.
27 *
28 * 3. Korrekturen gegenueber dem Altbestand, die das Ergebnis sicherheitsrelevant
29 * veraendern, sind an der jeweiligen Stelle mit "KORREKTUR" vermerkt.
30 *
31 * Die Kennwerte sind nach bestem Wissen aus dem Regelwerk uebernommen. Vor dem
32 * produktiven Einsatz sind sie einmalig gegen die eigene Ausgabe von RiLSA 2015
33 * abzugleichen; die Vorgabenverwaltung zeigt zu jedem Wert die hier hinterlegte
34 * Herkunft an.
35 *
36 * 4. ABSCHNITTSNUMMERN NUR NACH ABGLEICH AM ORIGINAL (Fassung 5.27.0; zuvor
37 * Befund D4). Hier standen einmal drei geratene
38 * Verweise ("Abschnitt 3.2", "Abschnitt 3.4"), und alle drei waren falsch.
39 * Solange die RiLSA nicht vorlag, galt deshalb: gar keine Nummern. Seit dem
40 * 10.09.2026 liegt die gekaufte Ausgabe vor; die Nummern in dieser Datei
41 * und in quellen.ts sind an ihr nachgeschlagen. Fuer HBS, RSA 21 und
42 * VwV-StVO liegt kein Original vor - dort bleibt es bei Regelwerk und
43 * Sachgebiet. Eine falsche Fundstelle ist schlimmer als gar keine, weil sie
44 * den Pruefer an die falsche Stelle schickt und den ganzen Wert entwertet,
45 * sobald er dort nichts findet.
46 *
47 * 5. KEIN WORTLAUT DES REGELWERKS. Die RiLSA ist urheberrechtlich geschuetzt.
48 * Genannt werden Fundstelle und Kennwert; zitiert wird hoechstens kurz und
49 * mit Quellenangabe, nie ein ganzer Abschnitt.
50 */
51
52 /** Gelbzeiten in Abhaengigkeit von der zulaessigen Hoechstgeschwindigkeit. */
53 export interface YellowTimeStep {
54 /** Obergrenze der zulaessigen Hoechstgeschwindigkeit (einschliesslich). */
55 readonly upToKmh: KilometersPerHour;
56 readonly yellow: Seconds;
57 }
58
59 export interface RilsaDefaults {
60 /** Gelbzeitstaffel Kraftfahrzeugverkehr (RiLSA 2015, Signalzeiten). */
61 readonly yellowBySpeed: readonly YellowTimeStep[];
62 /**
63 * Gelbzeit fuer Radverkehr mit eigenem Signalgeber.
64 *
65 * KORREKTUR (Fassung 5.27.0, RiLSA 2015 Abschnitt 2.4): Hier standen 3 s.
66 * Die RiLSA nennt fuer gesondert signalisierten Radverkehr eine einheitliche
67 * Uebergangszeit GELB von 2 s und ROT/GELB von 1 s. Die Ueberfahrzeit des
68 * Radverkehrs haengt nicht an diesem Wert (Fall 5: tue = 1 s, siehe
69 * crossingTime.radDefault); die Gelbzeit wirkt auf den Signalzeitenplan und
70 * ueber die Uebergangszeit auf die Umlaufzeit.
71 */
72 readonly yellowRad: Seconds;
73 /**
74 * Rot-Gelb-Zeit.
75 * KORREKTUR: Der Altbestand setzte 2 s an. RiLSA 2015 gibt 1 s vor. Zwei
76 * Sekunden verlaengern jeden Phasenuebergang und verschieben die gesamte
77 * Freigabezeitverteilung.
78 */
79 readonly redYellow: Seconds;
80 /** Mindestfreigabezeiten je Verkehrsart (RiLSA 2015, Signalzeiten). */
81 readonly minGreen: Readonly<Record<TrafficMode, Seconds>>;
82 /** Uebliche Obergrenze der Freigabezeit; reiner Plausibilitaetswert. */
83 readonly maxGreen: Seconds;
84
85 /**
86 * Raeumgeschwindigkeiten vr in m/s (RiLSA 2015, Zwischenzeitberechnung).
87 * KORREKTUR: Der Altbestand rechnete fuer Kfz mit 50 km/h = 13,9 m/s. Das ist
88 * deutlich schneller als der Regelwert und verkuerzt die Raeumzeit - und damit
89 * die Zwischenzeit - sicherheitsrelevant.
90 */
91 readonly clearingSpeed: {
92 readonly kfzStraight: MetersPerSecond;
93 readonly kfzTurning: MetersPerSecond;
94 /**
95 * Abbiegende Kraftfahrzeuge an einer Konfliktbeziehung, die als "enger
96 * Innenradius" gekennzeichnet ist.
97 *
98 * REGELWERKSWERT (Fassung 5.27.0): RiLSA 2015, Abschnitt 2.5.2, Fall 2 -
99 * die Raeumgeschwindigkeit abbiegender Kraftfahrzeuge betraegt 7 m/s, bei
100 * einem Radius des Fahrstreifeninnenrands unter 10 m dagegen 5 m/s. Der
101 * Wert wirkt nur, wo das Merkmal an der einzelnen Beziehung gesetzt ist;
102 * ohne Merkmal gilt kfzTurning. Das Programm kennt keinen Abbiegeradius
103 * und kann die Schwelle nicht selbst pruefen - das bleibt Sache des
104 * Bearbeiters. Beleglage siehe unten bei kfzTurning und in quellen.ts
105 * ('praxis-enger-radius'; der Schluessel behaelt seinen Namen, weil an ihm
106 * die vom Anwender eingetragene Fundstelle haengt).
107 */
108 readonly kfzTurningEngerRadius: MetersPerSecond;
109 readonly rad: MetersPerSecond;
110 readonly fuss: MetersPerSecond;
111 readonly fussReducedMobility: MetersPerSecond;
112 /**
113 * NUR NOCH RUECKFALLWERT (Fassung 5.4.0, Befund A2): Die RiLSA
114 * 2015 setzt fuer gesondert signalisierten OePNV keine feste
115 * Raeumgeschwindigkeit an, sondern vr = Vmax/3,6 (Zwischenzeitfall 3,
116 * woertlich im FGSV-Aenderungsblatt vom 29.07.2015, Originalseite 24).
117 * Dieser Wert gilt nur, wenn am Strom keine zulaessige
118 * Hoechstgeschwindigkeit hinterlegt ist - dann konservativ, siehe
119 * intergreen.ts.
120 */
121 readonly oepnv: MetersPerSecond;
122 };
123
124 /** Einfahrgeschwindigkeiten ve in m/s (RiLSA 2015). */
125 readonly enteringSpeed: Readonly<Record<TrafficMode, MetersPerSecond>>;
126
127 /**
128 * Ueberfahrzeiten tue in s (RiLSA 2015).
129 * Fuer Kraftfahrzeuge entspricht tue der Gelbzeit. Fuer den OePNV gilt die
130 * Vmax-Staffel OEPNV_UEBERFAHRZEIT_STAFFEL; einen festen Vorgabewert gibt es
131 * seit Fassung 5.4.0 (Befund A2) nicht mehr - er stand fest auf
132 * 0 s, was nach RiLSA nur im Haltefall (Fall 4) bzw. bei Abmeldung zulaessig
133 * ist.
134 *
135 * BELEGLAGE (Fassung 5.27.0, am Original nachgeschlagen): RiLSA 2015,
136 * Abschnitt 2.5.2 setzt die Ueberfahrzeit des Kraftfahrzeugverkehrs FEST -
137 * tue = 3 s fuer geradeaus fahrende Kraftfahrzeuge "unabhaengig von der
138 * zulaessigen Hoechstgeschwindigkeit" (Fall 1) und tue = 2 s fuer abbiegende
139 * (Fall 2). Der Regelwerksansatz ist damit der FESTE; die Kopplung an die
140 * Gelbzeit ist der Ansatz dieses Programms.
141 *
142 * WAS DAS BERICHTIGT: Bis 5.26.0 stand hier, der Wortlaut zu den Faellen 1
143 * und 2 sei "im Aenderungsblatt weggeschnitten und damit oeffentlich nicht
144 * abgleichbar"; belegt sei nur der Umkehrschluss aus den Zwischenzeitentafeln
145 * des Hamburger LSA-Leitfadens. Der Umkehrschluss war richtig - die Zahlen
146 * stimmen -, aber er ist jetzt nicht mehr noetig.
147 *
148 * WARUM DIE VORGABE TROTZDEM 'gelbzeit' BLEIBT: Die feste Ueberfahrzeit
149 * VERKUERZT die Zwischenzeit - beim Abbiegen um bis zu 3 s je Uebergang (5 s
150 * groesste Gelbzeit gegen 2 s), geradeaus oberhalb von 50 km/h um 1 bis 2 s.
151 * Die Vorgabe eines ausgelieferten Programms so zu aendern, dass jede
152 * Zwischenzeit kuerzer wird, ist die gefaehrliche Richtung; dieselbe
153 * Abwaegung wie bei SAFETY_FLOORS.maxClearingSpeedFuss. Beide Werte sind
154 * einstellbar; Richtung und Groessenordnung fuer die WIRKSAMEN Vorgaben
155 * bildet ansaetze.ts (ueberfahrzeitAnsatzRichtungSatz), damit keine Ausgabe
156 * eine Verkuerzung behauptet, die die eingetragenen Zahlen nicht hergeben
157 * (Fassung 5.5.0, Befund B5). Der Ansatz ist WAEHLBAR
158 * (Project.settings.ueberfahrzeitAnsatz): 'gelbzeit' rechnet nie kuerzer als
159 * die Regelwerte der RiLSA, 'fest' ist der Ansatz des Regelwerks - ob seine
160 * beiden WERTE die Regelwerte sind, beantwortet festeWerteNachRegelwert
161 * (ansaetze.ts), denn einstellbar sind sie von 1 bis 10 s. Der
162 * Pruefbericht nennt beide beim Namen und verlangt fuer den Regelansatz
163 * dieses Programms keine Begruendung - fuer den festen die Bestaetigung, dass
164 * er gewollt ist (checkUeberfahrzeitAnsatz in validation/engine.ts meldet
165 * allein 'fest'; wo der feste Ansatz in keine Zahl des Plans eingeht, meldet
166 * er statt der Warnung einen Hinweis).
167 *
168 * "NIE KUERZER" UND NICHT "DER LAENGERE" (Fassung 5.43.0): Hier stand
169 * "'gelbzeit' ist der laengere, 'fest' der regelkonforme", und darunter, der
170 * Bericht verlange "fuer den laengeren keine Begruendung - fuer den
171 * kuerzeren" die Bestaetigung. Bei 50 km/h geradeaus ergeben beide Ansaetze
172 * 3 s; laenger ist die Gelbzeitkopplung dort nicht, und mit festen Vorgaben
173 * ueber der groessten Gelbzeit ist sie die kuerzere - dann haette der Bericht
174 * nach dem eigenen Wortlaut den Regelansatz melden muessen, und er meldet ihn
175 * nicht. Wahr bei jeder zulaessigen Vorgabe ist nur "nie kuerzer", und auch
176 * das nur gegen die Regelwerte der RiLSA (Beleg: SAFETY_FLOORS.yellowKfz
177 * gegen crossingTime.kfzGeradeaus/kfzAbbiegend, siehe
178 * UEBERFAHRZEIT_ANSATZ_LABELS). Dieselbe Uebertreibung war am Bildschirm, im
179 * Pruefbericht und in bewertung.ts schon behoben; im Docblock des Kennwerts
180 * selbst stand sie weiter.
181 *
182 * UND DER ANSATZ IST NICHT SEINE ZAHL (Fassung 5.43.0): Danach stand hier
183 * "'fest' ist der Regelwerksansatz selbst" - richtig fuer den ANSATZ, zu
184 * stark fuer seine WERTE, denn die beiden Felder darunter sind von 1 bis 10 s
185 * einstellbar. Genau diese Verwechslung war Befund B5 der Fassung 5.5.0, und
186 * wegen ihr gibt es festeWerteNachRegelwert und festeWerteZuschreibungSatz;
187 * dieser Docblock ist die Stelle, an der der naechste Bearbeiter nachliest.
188 * Bewacht von tests/domain/ueberholteZuschreibungen.test.ts.
189 *
190 * DIE UNTERGRENZE IST SEIT 5.27.0 EINGEBAUT: RiLSA 2015, Abschnitt 2.5.2
191 * verlangt fuer die Faelle 1 und 2 tue + tr >= tG + 1. Hier stand bis 5.26.0
192 * das Gegenteil ("KEINE UNTERGRENZE"), weil die Regel damals nur auf einer
193 * sich selbst widersprechenden Webseite stand. Sie steht im Regelwerk; siehe
194 * UEBERFAHR_RAEUMZEIT_ZUSCHLAG und intergreen.ts.
195 */
196 readonly crossingTime: {
197 readonly radDefault: Seconds;
198 readonly fuss: Seconds;
199 /** Nur bei Ansatz 'fest': Ueberfahrzeit geradeausfahrender Kfz. */
200 readonly kfzGeradeaus: Seconds;
201 /** Nur bei Ansatz 'fest': Ueberfahrzeit abbiegender Kfz. */
202 readonly kfzAbbiegend: Seconds;
203 };
204
205 /** Laengenzuschlag zum Raeumweg je Fahrzeugart in Metern. */
206 readonly vehicleLength: Readonly<Record<VehicleClass, Meters>>;
207
208 /** Umlaufzeitgrenzen (RiLSA 2015, Umlaufzeit). */
209 readonly cycleTime: {
210 readonly min: Seconds;
211 readonly max: Seconds;
212 readonly recommendedMin: Seconds;
213 readonly recommendedMax: Seconds;
214 /** Rasterung der ermittelten Umlaufzeit. */
215 readonly step: Seconds;
216 };
217
218 /**
219 * Anfahrverlustzeit je Freigabezeitbeginn in Sekunden.
220 * KORREKTUR: Der Altbestand setzte pauschal 4 s Verlustzeit je Phase an und
221 * zaehlte die Zwischenzeiten NICHT dazu. Tatsaechlich setzt sich die
222 * Verlustzeit je Umlauf aus den Anfahrverlusten und den Zwischenzeiten
223 * zusammen; beides wird jetzt getrennt und vollstaendig erfasst.
224 */
225 readonly startUpLostTime: Seconds;
226
227 /** Kapazitaetskennwerte (HBS 2015). */
228 readonly capacity: {
229 /**
230 * Saettigungsverkehrsstaerke je Fahrstreifen in Fz/h.
231 * KORREKTUR (Fassung 5.4.0, Befund B3): Hier standen 1800 Fz/h
232 * unter der Ueberschrift "HBS 2015". Der Wert des HBS (2001 wie 2015) ist
233 * 2000 Kfz/h (Zeitbedarfswert 1,8 s/Kfz); BASt-Bericht V 400 (2025)
234 * bestaetigt ihn empirisch: "Saettigungsverkehrsstaerke von 2000 Kfz/h im
235 * Pkw-Verkehr ohne weitere Einfluesse". 1800 war konservativ, aber als
236 * Regelwerkswert nicht belegbar - und stand so in der Planunterlage.
237 *
238 * Der Wert gilt unter den Standardbedingungen des HBS
239 * (HBS_STANDARDBEDINGUNGEN) und bei reinem Pkw-Verkehr; den Schwerverkehr
240 * beruecksichtigt der Anpassungsfaktor fSV (rilsa/capacity.ts,
241 * schwerverkehrsfaktor).
242 */
243 readonly saturationFlow: VehiclesPerHour;
244 /** Abminderung fuer abbiegende Stroeme. */
245 readonly turningFactor: Ratio;
246 /**
247 * Angestrebter Auslastungsgrad x.
248 *
249 * RiLSA 2015, Abschnitt 2.6: Fuer x kann zweckmaessigerweise ein Wert
250 * zwischen 0,80 und 0,90 angesetzt werden. 0,85 liegt in der Mitte dieses
251 * Bandes; die Wahl innerhalb des Bandes trifft dieses Programm.
252 */
253 readonly targetDegreeOfSaturation: Ratio;
254 /**
255 * Obergrenze des Auslastungsgrades fuer eine bemessbare Anlage.
256 *
257 * KORREKTUR (Fassung 5.27.0): Hier standen 0,95 - ausserhalb des Bandes,
258 * das die RiLSA 2015 in Abschnitt 2.6 fuer x nennt (0,80 bis 0,90). Der
259 * Wert steht im Nenner der HCM-Umlaufzeit und ist die Schwelle der Meldung
260 * "hoch ausgelastet"; mit 0,95 galt eine Anlage bis dahin als bemessbar,
261 * die das Regelwerk schon nicht mehr so bemessen wuerde. Jetzt das obere
262 * Ende des Bandes. Die Richtung ist die vorsichtige: laengere Umlaufzeit
263 * nach HCM, frueher greifende Meldung.
264 */
265 readonly maxDegreeOfSaturation: Ratio;
266 /**
267 * Instationaritaetsfaktor fin des HBS 2015 fuer den Reststau bei
268 * Freigabezeitende: fin = 1 + ((q15/q) - 1) / 1,5, mit q15 als
269 * Verkehrsstaerke des hoechstbelasteten 15-min-Intervalls der
270 * Bemessungsstunde (Leyn 2016, Gl. 3-2; HBS 2015 Gl. S4-46).
271 *
272 * Der Vorgabewert 1,1 ist der vom FGSV-Dialog zum HBS 2015 (Kapitel S4)
273 * genannte Ansatz, wenn keine 15-min-Zaehldaten vorliegen: "Liegen keine
274 * so differenzierten Zaehldaten vor, sollen vier 15-Minutenintervalle
275 * verwendet werden, die nach Gl. S4-46 zu einem Instationaritaetsfaktor
276 * von 1,1 fuehren." Er entspricht q15/q = 1,15. Liegen Zaehldaten vor,
277 * ist der Wert ueber die Vorgabenverwaltung anzupassen; 1,0 bedeutet
278 * gleichmaessigen Zufluss.
279 */
280 readonly instationaritaetsfaktor: Ratio;
281 };
282
283 /** Kenngroessen der Koordinierung (Gruene Welle). */
284 readonly coordination: {
285 readonly minSpeed: KilometersPerHour;
286 readonly maxSpeed: KilometersPerHour;
287 readonly defaultSpeed: KilometersPerHour;
288 };
289 }
290
291 export const RILSA_DEFAULTS: RilsaDefaults = {
292 yellowBySpeed: [
293 { upToKmh: 50, yellow: 3 },
294 { upToKmh: 60, yellow: 4 },
295 { upToKmh: Number.POSITIVE_INFINITY, yellow: 5 },
296 ],
297 yellowRad: 2,
298 redYellow: 1,
299 minGreen: {
300 kfz: 5,
301 rad: 5,
302 fuss: 5,
303 // Sondersignale des OePNV kennen keine feste Mindestfreigabezeit; der Wert
304 // dient nur als Plausibilitaetsuntergrenze. Seit Fassung 5.4.0
305 // (Befund C19) sagt das auch das Fundstellenverzeichnis: Das Vorgabenfeld
306 // steht unter 'praxis' und nicht mehr unter 'rilsa-signalzeiten' - belegt
307 // ist nur die allgemeine Mindestfreigabezeit von 5 s.
308 oepnv: 3,
309 },
310 maxGreen: 120,
311
312 clearingSpeed: {
313 kfzStraight: 10.0,
314 /*
315 * BELEGLAGE (Fassung 5.27.0, am Original nachgeschlagen): RiLSA 2015,
316 * Abschnitt 2.5.2, Fall 2 setzt fuer abbiegende Kraftfahrzeuge die
317 * Raeumgeschwindigkeit vr = 7 m/s an, bei einem Radius des
318 * Fahrstreifeninnenrands unter 10 m dagegen vr = 5 m/s; die Ueberfahrzeit
319 * betraegt dort tue = 2 s und die Fahrzeuglaenge lFZ = 6 m.
320 *
321 * WAS DAS BERICHTIGT: Bis 5.26.0 stand hier, Fall 2 komme im
322 * FGSV-Aenderungsblatt nur als Bildunterschrift vor, die 7,0 m/s seien
323 * allein durch den Hamburger LSA-Leitfaden gestuetzt und die 5 m/s bei
324 * Innenradius unter 10 m stuenden "auf EINER Quellenlinie" und seien "in
325 * der RiLSA 2015 nicht nachweisbar". Das war der Stand ohne Original und
326 * ist durch die gekaufte Ausgabe widerlegt: Beide Zahlen und die
327 * Radiusschwelle stehen dort.
328 *
329 * WARUM DAS MERKMAL TROTZDEM AN DER EINZELNEN BEZIEHUNG HAENGT UND NICHT
330 * VORGABE IST: Das Programm kennt den Radius des Fahrstreifeninnenrands
331 * nicht - es hat kein Feld dafuer und koennte die Schwelle nicht pruefen.
332 * Wer sie ansetzt, setzt sie an der Beziehung, und der Pruefbericht sagt,
333 * dass er es getan hat. Das ist seit 5.27.0 keine Abweichung mehr, sondern
334 * die Anwendung des Regelwerksfalls; der Bericht fuehrt sie als Hinweis
335 * (Conflict.engerRadius, Schema 12).
336 */
337 kfzTurning: 7.0,
338 kfzTurningEngerRadius: 5.0,
339 /*
340 * KORREKTUR (Fassung 5.4.0, Befund A1): Hier standen 5,0 m/s.
341 * RiLSA 2015, Zwischenzeitfall 5 "Radfahrer raeumen" setzt 4 m/s an -
342 * woertlich belegt durch das FGSV-Aenderungsblatt vom 29.07.2015, das die
343 * Originalseite 25 wiedergibt (tue + tr = 1 + s0/4). Der zu hohe Wert
344 * verkuerzte die Zwischenzeit zulasten des raeumenden Radverkehrs um
345 * typischerweise 1 s je 20 m Raeumweg.
346 */
347 rad: 4.0,
348 fuss: 1.2,
349 fussReducedMobility: 1.0,
350 /*
351 * KORREKTUR (Fassung 5.4.0, Befund A2): Kein Regelwert mehr,
352 * sondern Rueckfallwert ohne bekannte Vmax. Der Regelfall rechnet
353 * vr = Vmax/3,6 (RiLSA 2015, Fall 3). Die 10,0 m/s entsprechen dem
354 * bisherigen festen Ansatz und bleiben als konservative Untergrenze
355 * stehen, solange die Vmax des Stroms fehlt.
356 */
357 oepnv: 10.0,
358 },
359
360 enteringSpeed: {
361 kfz: 11.1,
362 rad: 5.0,
363 fuss: 1.5,
364 /*
365 * ABGEGLICHEN (Fassung 5.27.0), UND BEWUSST GROESSER ALS DER REGELWERT:
366 * RiLSA 2015, Abschnitt 2.5.3 nennt fuer Strassenbahnen, die nicht
367 * regelmaessig von einer Haltestelle aus in den Knotenpunkt einfahren,
368 * Ve = 20 km/h - also 5,6 m/s statt der hier stehenden 11,1 m/s (40 km/h,
369 * der Wert des Kraftfahrzeugverkehrs). Bis 5.26.0 war das offen; das
370 * FGSV-Aenderungsblatt gibt die Einfahrzeiten nicht wieder.
371 *
372 * WARUM DER GROESSERE WERT BLEIBT: Die Einfahrzeit wird ABGEZOGEN
373 * (tz = tue + tr - te). Eine hoeher angesetzte Einfahrgeschwindigkeit
374 * ergibt eine kuerzere Einfahrzeit und damit eine LAENGERE Zwischenzeit -
375 * die sichere Seite. Der Regelwert von 20 km/h wuerde jede Zwischenzeit
376 * verkuerzen, an der eine einfahrende Bahn beteiligt ist. Die RiLSA selbst
377 * verlangt im selben Absatz, oertlich hoehere Einfahrgeschwindigkeiten zu
378 * beruecksichtigen; 40 km/h sind eine solche Annahme und decken den Fall
379 * mit ab, in dem die Bahn schneller einfaehrt als der Regelwert. Die
380 * Abweichung wird nicht verschwiegen: quellen.ts nennt sie unter
381 * 'rilsa-zwischenzeiten' als Verschaerfung dieses Programms - dieselbe
382 * Bauart wie bei der Raeumgeschwindigkeit der Fussgaenger.
383 *
384 * Der Haltefall (regelmaessige Einfahrt aus einer Haltestelle) wird von
385 * diesem Wert nicht beruehrt; die RiLSA rechnet ihn ueber die
386 * Anfahrbeschleunigung, und dieses Programm bildet ihn auf der RAEUMenden
387 * Seite ab (OEPNV_ANFAHRBESCHLEUNIGUNG, Fall 4).
388 */
389 oepnv: 11.1,
390 },
391
392 crossingTime: {
393 radDefault: 1,
394 fuss: 0,
395 /*
396 * NEU (Fassung 5.5.0): Die beiden Werte des Ansatzes 'fest'. Sie stehen
397 * hier und nicht in der Rechnung, damit sie in der Vorgabenverwaltung
398 * sichtbar und oertlich anpassbar sind - und damit dort steht, woher sie
399 * kommen: Kopfzeilen der Zwischenzeitentafeln des Hamburger
400 * LSA-Leitfadens, Anlage A ("geradeausfahrende Kfz (schnell): vr 10 m/s,
401 * tue 3 s"; "abbiegende Kfz (langsam): vr 7 m/s, tue 2 s"), an rund
402 * zwanzig Tabellenwerten nachgerechnet. Kein Regelwerkswert - siehe die
403 * Beleglage im Kopf von RilsaDefaults.crossingTime.
404 *
405 * Bei der Vorgabe 'gelbzeit' gehen sie in keine Zahl ein; die
406 * Vorgabenverwaltung vermerkt das (settings.ts, wirkungslosigkeit).
407 */
408 kfzGeradeaus: 3,
409 kfzAbbiegend: 2,
410 // KORREKTUR (Fassung 5.4.0, Befund A2): 'oepnv: 0' ist entfallen.
411 // Die Ueberfahrzeit des OePNV folgt der Vmax-Staffel (siehe
412 // OEPNV_UEBERFAHRZEIT_STAFFEL); 0 s gilt nur im Haltefall.
413 },
414
415 vehicleLength: {
416 /*
417 * KORREKTUR (Fassung 5.4.0, Befund B5): Hier standen Lkw 12 m,
418 * Bus 12 m und Lastzug 18,75 m - die zulassungsrechtlichen Hoechstlaengen
419 * nach Par. 32 StVZO, keine RiLSA-Rechenwerte. Die RiLSA rechnet mit
420 * fiktiven Laengen: 6 m fuer Kraftfahrzeuge einschliesslich Lastzuege und
421 * Linienbusse (Fall 3 woertlich: "lFZ = 6 m bei Linienbussen"; fuer Lkw
422 * und Lastzug uebereinstimmende Sekundaerquellen, u. a. der Hamburger
423 * Leitfaden fuer Lichtsignalanlagen, der Lkw mit "fiktiver Fahrzeuglaenge
424 * = 6 m" rechnet). Die alten Werte waren konservativ, standen aber als
425 * "gesichert nach RiLSA 2015" in der Planunterlage - ein Pruefer, der die
426 * Matrix nachrechnet, kam auf andere Zwischenzeiten. Wer laenger ansetzen
427 * will, tut das ueber die Vorgabenverwaltung als begruendete oertliche
428 * Verschaerfung; die Fahrzeugarten bleiben dafuer erhalten.
429 */
430 pkw: 6,
431 lkw: 6,
432 bus: 6,
433 lastzug: 6,
434 /*
435 * KORREKTUR (Fassung 5.4.0, Befund A2): Fahrzeugart neu. RiLSA
436 * 2015, Fall 3, woertlich (FGSV-Aenderungsblatt vom 29.07.2015,
437 * Originalseite 24): "lFZ = 15 m bei Strassenbahnen, lFZ = 6 m bei
438 * Linienbussen".
439 */
440 strassenbahn: 15,
441 rad: 0,
442 keine: 0,
443 },
444
445 /*
446 * KORREKTUR (Fassung 5.27.0, RiLSA 2015 Abschnitt 2.6): `recommendedMin`
447 * stand auf 60 s. Die RiLSA nennt als Richtwerte fuer die Umlaufzeit
448 * minimal 30 s und maximal 90 (120) s - eine Untergrenze von 60 s gibt es
449 * dort nicht. Sie war eine Zahl dieses Programms, und das Verzeichnis sagte
450 * das auch ("die 60 s als Untergrenze setzt dieses Programm"); nur hat sie
451 * jeden Umlauf zwischen 30 und 60 s als "ausserhalb des ueblichen Bereichs"
452 * gemeldet, den die RiLSA ausdruecklich zulaesst. Der Regelbereich ist jetzt
453 * der der RiLSA.
454 */
455 cycleTime: {
456 min: 30,
457 max: 120,
458 recommendedMin: 30,
459 recommendedMax: 90,
460 step: 5,
461 },
462
463 startUpLostTime: 2,
464
465 capacity: {
466 saturationFlow: 2000,
467 turningFactor: 0.9,
468 targetDegreeOfSaturation: 0.85,
469 maxDegreeOfSaturation: 0.9,
470 instationaritaetsfaktor: 1.1,
471 },
472
473 coordination: {
474 minSpeed: 30,
475 maxSpeed: 60,
476 defaultSpeed: 50,
477 },
478 };
479
480 /**
481 * Kennwerte der Engstellensignalisierung nach RiLSA 2015, Abschnitt 5.2.
482 *
483 * DIES IST EIN ZWEITES RECHENVERFAHREN und keine Variante des ersten. Die
484 * RiLSA sagt in Abschnitt 5.2.1, die Ausfuehrungen gelten "primaer fuer die
485 * transportablen, das heisst voruebergehend eingesetzten Lichtsignalanlagen
486 * (Baustellenampeln) an Arbeitsstellen" - also fuer die Anlagenart
487 * `einstreifig` dieses Programms. Was daraus folgt, steht ausgeschrieben im
488 * Kopf von rilsa/engstellensignalisierung.ts; hier stehen die Zahlen.
489 *
490 * NEU (Fassung 5.27.0). Bis dahin rechnete dieses Programm die einstreifige
491 * Verkehrsfuehrung nach den Knotenpunktregeln des Abschnitts 2.
492 */
493 export const RILSA_ENGSTELLE = {
494 /** Uebergangszeit GELB an einer Engstelle - unabhaengig von der Vzul. */
495 gelbzeit: 4 as Seconds,
496 /** Uebergangszeit ROT/GELB. */
497 rotGelb: 1 as Seconds,
498 /** Ueberfahrzeit tue in der Zwischenzeitformel des Abschnitts 5.2.2. */
499 ueberfahrzeit: 4 as Seconds,
500 /**
501 * Mittlere Raeumgeschwindigkeit Vr nach der zulaessigen
502 * Hoechstgeschwindigkeit - in km/h, weil die Formel des Abschnitts mit
503 * km/h rechnet (tz = tue + sr/Vr * 3,6). Absteigend geordnet: Die erste
504 * Stufe, deren `vZulAb` erreicht ist, gilt.
505 */
506 raeumgeschwindigkeit: [
507 { vZulAb: 60 as KilometersPerHour, vrKmh: 50 as KilometersPerHour },
508 { vZulAb: 50 as KilometersPerHour, vrKmh: 40 as KilometersPerHour },
509 { vZulAb: 40 as KilometersPerHour, vrKmh: 30 as KilometersPerHour },
510 ],
511 /**
512 * Bei schlechter Fahrbahn oder regelmaessig auftretenden
513 * landwirtschaftlichen Fahrzeugen - unabhaengig von der Vzul.
514 */
515 vrSchlechteFahrbahn: 30 as KilometersPerHour,
516 /**
517 * Raeumgeschwindigkeit des Radverkehrs. Sie wird massgebend, wenn die
518 * Engstelle nicht so breit und uebersichtlich ist, dass sich
519 * Kraftfahrzeuge und Radfahrer unbedenklich begegnen koennen.
520 */
521 vrRadverkehr: 18 as KilometersPerHour,
522 /**
523 * Ueberschlaegliche Saettigungsverkehrsstaerke je Fahrtrichtung. Am
524 * Knotenpunkt rechnet dieses Programm mit 2000 Kfz/h nach HBS; fuer die
525 * Engstelle nennt die RiLSA diesen kleineren Anhaltswert und verweist im
526 * Uebrigen auf das HBS.
527 */
528 saettigungUeberschlaeglich: 1500 as VehiclesPerHour,
529 /** Beiwert vor der Zwischenzeitsumme in der Umlaufzeitformel. */
530 umlaufzeitFaktor: 1.3,
531 /** Zuschlag in der Umlaufzeitformel. */
532 umlaufzeitZuschlag: 4 as Seconds,
533 /** Die Umlaufzeit sollte nicht groesser sein. */
534 maxUmlaufzeit: 300 as Seconds,
535 } as const;
536
537 /**
538 * Kennwerte der Koordinierung nach RiLSA 2015, Abschnitt 4.4.4 - die
539 * Groessen, die das Programm bis 5.26.0 gar nicht kannte.
540 *
541 * WARUM SIE HIER STEHEN, OBWOHL SIE HEUTE NUR IN HINWEISE EINGEHEN: Dieselbe
542 * Begruendung wie bei HBS_STANDARDBEDINGUNGEN. Die Vorgabenwerte der
543 * Koordinierung (`RILSA_DEFAULTS.coordination`) sind ABSOLUTE Schranken -
544 * 30 bis 60 km/h, Vorgabe 50 - und stammen aus keinem Regelwerk. Die RiLSA
545 * gibt statt dessen eine RELATIVE Regel: 90 bis 100 Prozent der zulaessigen
546 * Hoechstgeschwindigkeit. Bei Vzul 30 km/h liegt die absolute Untergrenze des
547 * Programms damit ueber dem gesamten zulaessigen Band, bei Vzul 70 km/h die
548 * Obergrenze darunter. Wer die Koordinierung prueft, muss das lesen koennen.
549 */
550 export const RILSA_KOORDINIERUNG = {
551 /** Kleinster Anteil der Progressionsgeschwindigkeit an Vzul (90 %). */
552 progressionsanteilVon: 0.9,
553 /** Groesster Anteil der Progressionsgeschwindigkeit an Vzul (100 %). */
554 progressionsanteilBis: 1.0,
555 /** Abstand, bis zu dem Gruene Wellen wirksam sind. */
556 wirkbereichRegel: 750 as Meters,
557 /** Abstand, bis zu dem sie in besonders guenstigen Faellen noch wirksam sind. */
558 wirkbereichGuenstig: 1000 as Meters,
559 /**
560 * Auslastungsgrad, den eine Zufahrt im Zuge einer Gruenen Welle
561 * unterschreiten muss, damit eine gute Koordinierungsqualitaet erreichbar
562 * ist. Dieselbe Zahl wie der Ziel-Auslastungsgrad, aber eine andere Aussage:
563 * dort eine Bemessungsschwelle, hier eine Bedingung der Koordinierung.
564 */
565 auslastungsgradGrenze: 0.85 as Ratio,
566 } as const;
567
568 /**
569 * Furtkennwerte nach RiLSA 2015, Abschnitt 3.6.
570 *
571 * WARUM SIE HIER STEHEN, OBWOHL SIE IN KEINE RECHNUNG EINGEHEN: Dieses
572 * Programm fuehrt die FurtLAENGE (als Raeumweg der Fussgaengergruppe), aber
573 * keine FurtBREITE - es hat kein Feld dafuer. Die drei Zahlen sind gleichwohl
574 * Kennwerte des Regelwerks, an denen eine Planung gemessen wird, und die
575 * Unterlage soll sagen, dass das Programm sie nicht prueft. Wer eine Furt
576 * schmaler als 3,00 m plant oder breiter als 8,00 m ohne zweiten Signalgeber,
577 * erfaehrt das nicht von hier.
578 */
579 export const RILSA_FURT = {
580 /** Regelbreite einer Fussgaengerfurt. */
581 regelbreite: 4.0 as Meters,
582 /** Mindestbreite einer Fussgaengerfurt. */
583 mindestbreite: 3.0 as Meters,
584 /** Ab dieser Furtbreite sollte je Richtung ein zweiter Signalgeber stehen. */
585 zweiterSignalgeberAb: 8.0 as Meters,
586 } as const;
587
588 /**
589 * Zeiten der Phasenuebergaenge nach RiLSA 2015, Abschnitt 2.7 - ebenfalls
590 * Kennwerte ohne Rechenwirkung in dieser Fassung.
591 *
592 * Zeitvorsprung (2.7.5) und verzoegerter Freigabezeitbeginn (2.7.6) gehoeren
593 * zur bedingt vertraeglichen Fuehrung, die dieses Programm bewusst nicht
594 * abbildet. Die Mindestsperrzeit (2.7.3) ist eine Schranke, die eine
595 * Festzeitsteuerung mit sinnvollen Freigabezeiten nie erreicht - sie steht
596 * hier, damit die Unterlage sie nennen kann und nicht der Eindruck entsteht,
597 * das Programm habe sie uebersehen.
598 */
599 export const RILSA_PHASENUEBERGANG = {
600 /** Kuerzeste Sperrzeit einer Signalgruppe. */
601 mindestsperrzeit: 1 as Seconds,
602 /** Zeitvorsprung bevorrechtigter Fussgaenger und Radfahrer, von. */
603 zeitvorsprungVon: 1 as Seconds,
604 /** Zeitvorsprung bevorrechtigter Fussgaenger und Radfahrer, bis. */
605 zeitvorsprungBis: 2 as Seconds,
606 /** Verzoegerter Freigabezeitbeginn nicht vertraeglicher Stroeme, von. */
607 verzoegerterBeginnVon: 2 as Seconds,
608 /** Verzoegerter Freigabezeitbeginn nicht vertraeglicher Stroeme, bis. */
609 verzoegerterBeginnBis: 4 as Seconds,
610 } as const;
611
612 /**
613 * Uebergangszeit gesondert signalisierter OePNV-Fahrzeuge - die Dauer des
614 * Uebergangssignals von der Freigabe- zur Sperrzeit (RiLSA 2015,
615 * Abschnitt 2.4), gestaffelt nach der betrieblich zugelassenen
616 * Hoechstgeschwindigkeit in der Knotenpunktzufahrt.
617 *
618 * NEU (Fassung 5.27.0). Bis dahin lieferte yellowTime fuer OePNV-Gruppen 0 s
619 * mit dem Vermerk "Sondersignale (Balkensignale) kennen kein Gelb", und der
620 * Pruefbericht sagte denselben Satz. Beides ist falsch: Fuer gesondert
621 * signalisierte Strassenbahnen soll beim Uebergang von der Freigabe- zur
622 * Sperrzeit ein Uebergangssignal nach Par. 51 BOStrab gezeigt werden, und die
623 * RiLSA staffelt seine Dauer. Ein Signalzeitenplan ohne diese Zeit zeichnet
624 * einen Uebergang, den es so nicht gibt.
625 *
626 * NICHT ABGEBILDET, UND ZWAR BEIDES IN DIE LAENGERE RICHTUNG:
627 *
628 * - Die drei Bedingungen, unter denen das Uebergangssignal ENTFALLEN kann
629 * (ausnahmslos zu halten, Signalwechsel im Betriebsbremsweg ausgeschlossen,
630 * Hoechstgeschwindigkeit bis 20 km/h - und zwar zusammen). Sie haengen an
631 * der Oertlichkeit und an der Betriebsvorschrift; das Programm kennt davon
632 * nur den Halt, und den je Konfliktbeziehung, nicht je Signalgruppe.
633 * - Die Erlaubnis, die Uebergangszeiten von LINIENBUSSEN mit Sondersignal
634 * denen der Kraftfahrzeuge anzupassen. Die Staffel liegt bei jeder
635 * Geschwindigkeit ueber der Kfz-Gelbzeit; wer die kuerzere ansetzen will,
636 * traegt sie ueber die Vorgabenverwaltung ein.
637 *
638 * Oberhalb 70 km/h und ohne bekannte Vmax gilt die oberste Stufe - dieselbe
639 * Regel wie bei der Ueberfahrzeit-Staffel und aus demselben Grund.
640 */
641 export const OEPNV_UEBERGANGSZEIT_STAFFEL: readonly {
642 readonly upToKmh: KilometersPerHour;
643 readonly uebergang: Seconds;
644 }[] = [
645 { upToKmh: 30, uebergang: 4 },
646 { upToKmh: 40, uebergang: 5 },
647 { upToKmh: 50, uebergang: 6 },
648 { upToKmh: 60, uebergang: 7 },
649 { upToKmh: 70, uebergang: 8 },
650 ];
651
652 /**
653 * Zuschlag der Untergrenze fuer die Ueberfahr- und Raeumzeit des
654 * Kraftfahrzeugverkehrs: RiLSA 2015, Abschnitt 2.5.2 verlangt fuer die
655 * Faelle 1 und 2 tue + tr >= tG + 1.
656 *
657 * NEU (Fassung 5.27.0). Bis dahin war diese Schranke NICHT eingebaut, und der
658 * Kommentar bei `crossingTime` begruendete das ausfuehrlich: Die Regel habe
659 * "als woertliche Quelle nur eine Webseite, die sich im selben Text
660 * widerspricht". Das war der Stand, solange die RiLSA nicht vorlag. Sie steht
661 * dort woertlich, unmittelbar vor der Aufzaehlung der sechs Faelle, und gilt
662 * ausdruecklich nur fuer das Ueberfahren und Raeumen geradeaus fahrender
663 * (Fall 1) und abbiegender Kraftfahrzeuge (Fall 2) - nicht fuer Rad, Fuss und
664 * OePNV. Genau so ist sie eingebaut.
665 *
666 * WARUM EINE FESTE SEKUNDE UND NICHT DIE ROT-GELB-ZEIT: Die RiLSA schreibt die
667 * Zahl 1 und nicht tRG. Der Sache nach ist es die Rot-Gelb-Zeit des
668 * einfahrenden Stroms - aber das ist ein Schluss, und die Rot-Gelb-Zeit ist in
669 * diesem Programm einstellbar (bis 2 s). Wer die Schranke an sie haengte,
670 * rechnete bei 2 s Rot-Gelb mit einer Untergrenze, die im Regelwerk nicht
671 * steht. Die Zahl bleibt deshalb die des Regelwerks.
672 *
673 * RICHTUNG: Die Schranke VERLAENGERT die Zwischenzeit - die sichere Seite. Sie
674 * greift, wo der Raeumweg kurz ist: beim Ansatz "Ueberfahrzeit = Gelbzeit"
675 * unterhalb eines Raeumwegs von vr * 1 s, beim Ansatz "feste Ueberfahrzeit"
676 * deutlich frueher, weil dort tue kleiner als die Gelbzeit sein kann.
677 */
678 export const UEBERFAHR_RAEUMZEIT_ZUSCHLAG: Seconds = 1;
679
680 /**
681 * Ueberfahrzeit-Staffel fuer gesondert signalisierte OePNV-Fahrzeuge, die den
682 * Knotenpunkt OHNE Halt raeumen (RiLSA 2015, Zwischenzeitfall 3).
683 *
684 * Woertlich belegt durch das FGSV-Aenderungsblatt vom 29.07.2015, das die
685 * Originalseiten 23-24 wiedergibt: "Die Ueberfahrzeit betraegt bei
686 * Strassenbahnen: tue = 3 s bei Vmax <= 30 km/h, tue = 5 s bei
687 * 30 km/h < Vmax <= 50 km/h, tue = 7 s bei 50 km/h < Vmax <= 70 km/h."
688 *
689 * Massgebend ist die betrieblich zugelassene Hoechstgeschwindigkeit des
690 * Stroms. Oberhalb 70 km/h endet die Staffel; angesetzt wird dann die oberste
691 * Stufe (laengere Ueberfahrzeit = laengere Zwischenzeit, sichere Seite), und
692 * die Rechnung meldet die Ueberschreitung (LSA sollen oberhalb 70 km/h nicht
693 * betrieben werden, VwV-StVO zu Par. 37 Rn. 10).
694 *
695 * KORREKTUR (Fassung 5.4.0, Befund A2): Zuvor stand die OePNV-Ueberfahrzeit
696 * fest auf 0 s - das gilt nach dem Aenderungsblatt nur im Haltefall (Fall 4)
697 * oder "durch eine Abmeldung nach Passieren des Freigabesignals".
698 */
699 export const OEPNV_UEBERFAHRZEIT_STAFFEL: readonly {
700 readonly upToKmh: KilometersPerHour;
701 readonly crossing: Seconds;
702 }[] = [
703 { upToKmh: 30, crossing: 3 },
704 { upToKmh: 50, crossing: 5 },
705 { upToKmh: 70, crossing: 7 },
706 ];
707
708 /**
709 * Anfahrbeschleunigung fuer den OePNV-Haltefall (RiLSA 2015,
710 * Zwischenzeitfall 4: "OePNV-Fahrzeuge raeumen - bei Halt vor dem
711 * Knotenpunkt").
712 *
713 * Woertlich belegt durch das FGSV-Aenderungsblatt vom 29.07.2015
714 * (Originalseite 24): "Der Regelwert fuer die Beschleunigung von
715 * Strassenbahnen betraegt a = 1,0 m/s2. Antriebs- und uebertragungsbedingt
716 * kann dieser Wert in einem Bereich von a = 0,7 m/s2 bis 1,5 m/s2 variieren
717 * [...]. Fuer Linienbusse betraegt der Regelwert a = 1,2 m/s2. Schwankungen
718 * koennen von a = 1,0 m/s2 bis 1,5 m/s2 auftreten."
719 *
720 * Angesetzt werden die Regelwerte. Fuer jede andere Fahrzeugart eines
721 * OePNV-Stroms gilt der kleinere Wert (1,0 m/s2) - er ergibt die laengere
722 * Anfahrzeit und liegt damit auf der sicheren Seite.
723 */
724 export const OEPNV_ANFAHRBESCHLEUNIGUNG = {
725 /** Strassenbahn, Regelwert in m/s2. */
726 strassenbahn: 1.0,
727 /** Linienbus, Regelwert in m/s2. */
728 bus: 1.2,
729 } as const;
730
731 /**
732 * Pkw-Gleichwerte des Schwerverkehrs nach HBS 2015.
733 *
734 * KORREKTUR (Fassung 5.5.0): Hier gab es nichts - die
735 * Saettigungsverkehrsstaerke wurde in plan/signalPlan.ts mit
736 * `base / (1 + Schwerverkehrsanteil)` gerechnet. Das entspricht einem
737 * Pkw-Gleichwert von 2,0, und dieser Wert ist NACHWEISLICH NICHT der des HBS:
738 * BASt-Bericht V 400 (2025), S. 68, woertlich - "Die verwendeten
739 * Pkw-Gleichwerte von 1,75 fuer Lastkraftwagen (Lkw) und Busse sowie 2,50 fuer
740 * Sattelkraftfahrzeuge und Lastzuege (Lz) wurden von AHN (1987) fuer den
741 * Geradeausverkehr bestimmt (1,90 bei unbekannter Aufteilung). [...] Im
742 * HCM 2010 (TRB, 2010) wurde an LSA ein konstanter Pkw-Gleichwert von 2,00
743 * verwendet." Das Programm fuehrte den HCM-Wert unter der HBS-Quelle - dieselbe
744 * Fehlerklasse wie Befund B3 (1800 Fz/h als "HBS 2015").
745 *
746 * Die Zahlen 1,5 und 2,0 des HBS gehoeren zu dessen Kapitel S5
747 * (vorfahrtgeregelte Knotenpunkte OHNE Lichtsignalanlage) und duerfen nicht
748 * auf S4 uebertragen werden - auch das steht woertlich in derselben Fundstelle.
749 *
750 * NICHT UEBERNOMMEN: Der Aenderungsvorschlag desselben Berichts (1,7 statt
751 * 1,75 und 2,3 statt 2,50, Gl. 4-6) ist ein Forschungsergebnis von 2025 und
752 * nicht das geltende HBS 2015.
753 */
754 export const HBS_PKW_GLEICHWERTE = {
755 /** Lkw und Busse (Gl. 2-5). */
756 lkwUndBus: 1.75,
757 /** Lkw mit Anhaenger und Sattel-Kfz (Gl. 2-5). */
758 lkwMitAnhaenger: 2.5,
759 /**
760 * Schwerverkehr insgesamt bei unbekannter Aufteilung (Gl. 2-6).
761 * V 400 nennt die Annahme dahinter: ein Anteil der Lkw mit Anhaenger und
762 * Sattel-Kfz am Schwerverkehr von 20 % (siehe
763 * HBS_LASTZUGANTEIL_BEI_UNBEKANNTER_AUFTEILUNG).
764 */
765 schwerverkehrPauschal: 1.9,
766 } as const;
767
768 /**
769 * Der Lastzuganteil AM SCHWERVERKEHR, der hinter dem Pauschalwert 1,90 steckt.
770 *
771 * NEU (Schema 13): Solange das Programm keine Aufteilung des Schwerverkehrs
772 * erfassen konnte, war der Pauschalwert eine Zahl ohne Vorgeschichte. Er hat
773 * eine, und sie ist woertlich belegt - BASt-Bericht V 400 (2025), S. 10, zu
774 * Bild 2-1 d): "Bei einem Anteil der Lkw mit Anhaenger und Sattel-Kfz
775 * (Fahrzeugklasse LkwK) am Schwerverkehr von 20 % ergibt sich der
776 * Funktionsverlauf der Gleichung (2-6)."
777 *
778 * NACHGERECHNET: 1,75 * 0,8 + 2,50 * 0,2 = 1,40 + 0,50 = 1,90 - exakt, ohne
779 * Rundung. Gl. 2-6 IST also Gl. 2-5 mit 20 % Lastzuegen am Schwerverkehr.
780 *
781 * WARUM DAS ALS KONSTANTE HIER STEHT UND NICHT NUR IM FLIESSTEXT: An dieser
782 * Zahl haengen drei Aussagen, die auseinanderlaufen wuerden, wenn jede ihre
783 * eigene 0,2 mitbraechte - der Pruefbericht (er benennt die Annahme, unter der
784 * ein Strom ohne erfasste Aufteilung gerechnet wird), der Nachweis, dass beide
785 * Gleichungen bei diesem Anteil dasselbe liefern, und die Aussage der
786 * Planunterlage. Die Erfassung der Aufteilung ist damit KEIN anderes
787 * Verfahren, sondern eine Verfeinerung derselben Gleichung: Wer 20 % eintraegt,
788 * rechnet weiter wie zuvor.
789 *
790 * KEIN VORGABENFELD (Befund C20): Der Wert ist keine Wahl des Bearbeiters,
791 * sondern die Annahme, die im Regelwerk hinter Gl. 2-6 steckt. Wer sie fuer
792 * seinen Strom nicht teilt, traegt den tatsaechlichen Lastzuganteil ein - dann
793 * rechnet das Programm nach Gl. 2-5 und die Annahme entfaellt.
794 */
795 export const HBS_LASTZUGANTEIL_BEI_UNBEKANNTER_AUFTEILUNG = 0.2;
796
797 /**
798 * Zeitzuschlag je Freigabezeitfenster, um den der Abfluss in die Gelbzeit
799 * hineinlaeuft (HBS 2015): tA = tF + 1 s.
800 *
801 * Belegt bei Leyn 2016 zu Gl. 2-8 ("tA,j = tF,j + 1 s"); der BASt-Bericht V 400
802 * bestaetigt den Zuschlag empirisch "naeherungsweise". Verwendet wird er in
803 * `abflusszeit` (capacity.ts) und ueber die Abflusszeit in der Kapazitaet und
804 * der Wartezeit.
805 *
806 * HIER UND NICHT IN capacity.ts (Fassung 5.11.0): Der Zuschlag ist ein Kennwert
807 * und wird auch als solcher gefuehrt - mit Fundstelle 'hbs-kapazitaet' und
808 * Pruefstand "gesichert". Er stand trotzdem als eigene Konstante in capacity.ts
809 * und war damit der einzige Kennwert der Kapazitaetsrechnung ausserhalb dieser
810 * Datei. Wer die Herkunft im Quelltext nachschlug, fand ihn nicht dort, wo die
811 * Kennwerte stehen. Dieselbe Aufraeumung hatte der Pkw-Gleichwert 2,0 bereits
812 * erhalten (Fassung 5.5.0); diese Zeile war dabei uebersehen worden.
813 *
814 * KEIN VORGABENFELD - wie HBS_PKW_GLEICHWERTE und
815 * HBS_LASTZUGANTEIL_BEI_UNBEKANNTER_AUFTEILUNG: Waehlbar ist das
816 * Bewertungsverfahren, nicht der Wert des Regelwerks.
817 */
818 export const HBS_ABFLUSSZUSCHLAG: Seconds = 1;
819
820 /**
821 * Randbedingungen, unter denen der Zeitbedarfswert 1,8 s und damit die
822 * Saettigungsverkehrsstaerke von 2000 Kfz/h gelten.
823 *
824 * Woertlich (BASt V 400, S. 9): "Unter Standardbedingungen (Laengsneigung
825 * -2 % <= s <= 2 %, Kurvenradius R >= 20 m, Fahrstreifenbreite b >= 3 m) bei
826 * reinem Pkw-Verkehr gibt das HBS 2015 einen Zeitbedarfswert von 1,8 s an, der
827 * einer Saettigungsverkehrsstaerke von 2000 Kfz/h entspricht."
828 *
829 * WARUM DIESE ZAHLEN HIER STEHEN, OBWOHL SIE IN KEINE RECHNUNG EINGEHEN: Das
830 * Programm bildet die Anpassungsfaktoren f1 und f2 (Fahrstreifenbreite,
831 * Abbiegeradius, Laengsneigung) NICHT ab und rechnet damit fuer schmale
832 * Fahrstreifen, enge Abbiegeradien oder Steigungen eine zu GROSSE
833 * Saettigungsverkehrsstaerke - die unsichere Richtung. Wer die Unterlage
834 * prueft, muss lesen koennen, wofuer die 2000 Kfz/h gelten; die Zahlen
835 * erscheinen deshalb im Fundstellenverzeichnis (quellen.ts, 'hbs-kapazitaet').
836 */
837 export const HBS_STANDARDBEDINGUNGEN = {
838 /** Laengsneigung in Prozent, Betrag (|s| <= 2 %). */
839 laengsneigungBis: 2,
840 /** Kleinster Kurvenradius in Metern (R >= 20 m). */
841 kurvenradiusAb: 20 as Meters,
842 /** Kleinste Fahrstreifenbreite in Metern (b >= 3 m). */
843 fahrstreifenbreiteAb: 3 as Meters,
844 } as const;
845
846 /**
847 * Die drei Geraden der geometrischen Anpassungsfaktoren (BASt V 400).
848 *
849 * Woertlich: fb = -0,375 * b + 2,125 fuer b < 3,00 m;
850 * fR = -0,015 * R + 1,3 fuer R < 20 m; fs = 0,03 * s + 1,0 (s in Prozent, mit
851 * Vorzeichen, positiv fuer die Steigung).
852 *
853 * NACHGERECHNET AN DEN GRENZPUNKTEN, an denen die Standardbedingungen enden:
854 * fb(3,00 m) = -1,125 + 2,125 = 1,000. fR(20 m) = -0,30 + 1,30 = 1,000.
855 * fs(0 %) = 1,000. Die drei Geraden gehen dort stetig in den Regelfall ueber;
856 * eine Schwelle, an der der Faktor springt, gibt es nicht.
857 *
858 * DIE SCHWELLEN STEHEN NICHT HIER, sondern in HBS_STANDARDBEDINGUNGEN - es
859 * sind dieselben Zahlen, und zwei Stellen fuer dieselbe Grenze liefen
860 * auseinander. Der Achsenabschnitt von fs ist ebenfalls keine eigene Zahl: Er
861 * ist 1 und steht als Literal in der Formel, weil eine Konstante namens
862 * "eins" nichts erklaert.
863 *
864 * WAS HIER NICHT STEHT, weil es eine Entscheidung dieses Programms ist und
865 * kein Kennwert: der Deckel bei 1 und der Wegfall von fR an abbiegenden
866 * Stroemen. Beides steht mit seiner Begruendung an `geometriefaktor` in
867 * rilsa/capacity.ts.
868 */
869 export const HBS_GEOMETRIE = {
870 breite: { steigung: -0.375, achsenabschnitt: 2.125 },
871 radius: { steigung: -0.015, achsenabschnitt: 1.3 },
872 neigung: { steigung: 0.03 },
873 } as const;
874
875 /**
876 * Was die drei Geometriefelder bewirken - eine Stelle fuer Ansicht, Hilfe und
877 * Ausdruck, aus demselben Grund wie UEBERFAHRZEIT_ANSATZ_LABELS.
878 *
879 * Der Satz muss beide Abweichungen von der geschlossenen Formel nennen, sonst
880 * sucht der Bearbeiter die Wirkung, die er erwartet, und findet sie nicht:
881 * ein Gefaelle hebt nichts, und an einem Abbieger wirkt der Radius nicht.
882 */
883 export const STAURAUM_HINWEIS =
884 'Der Stauraum ist die Länge, die dem Rückstau zur Verfügung steht: bis zum Ende des ' +
885 'Aufstellstreifens, bis zur nächsten Grundstückszufahrt oder bis zum vorgelagerten ' +
886 'Knotenpunkt. Er geht in keine Rechnung ein. Der Plan hält den mittleren Rückstau bei ' +
887 'Freigabezeitende dagegen und warnt, wo er ihn erreicht – und weil das der MITTLERE ' +
888 'Rückstau ist, steht in etwa der Hälfte der Umläufe mehr. Ein Stauraum, der gerade eben ' +
889 'reicht, reicht nicht.';
890
891 export const GEOMETRIEFAKTOREN_HINWEIS =
892 'Ein leeres Feld heißt Standardbedingung (Breite ab 3,00 m, Radius ab 20 m, Längsneigung ' +
893 'zwischen −2 % und 2 %); der Faktor ist dann 1, und es wird gerechnet wie bisher. Eine ' +
894 'schmale Zufahrt, ein enger Bogen und eine Steigung senken die ' +
895 'Sättigungsverkehrsstärke. Zwei Fälle wirken bewusst nicht: Ein Gefälle hebt sie in diesem ' +
896 'Programm nicht an, obwohl die Formel es täte, und an einem abbiegenden Strom bleibt der ' +
897 'Radius ohne Wirkung, weil ihn der pauschale Abbiegerfaktor 0,90 bereits abdeckt. Beides ' +
898 'ist im Fundstellenverzeichnis begründet.';
899
900 /**
901 * Grenzen der drei Geometriefelder an der Signalgruppe.
902 *
903 * KEINE REGELWERKSWERTE, sondern der Bereich, in dem eine Eingabe ueberhaupt
904 * eine Zufahrt beschreibt. Sie stehen hier und nicht in der Ansicht, weil das
905 * Feld UND der sichtbare Bereichshinweis daraus gebildet werden - dieselbe
906 * Ueberlegung wie bei den Grenzen der Phasenansicht.
907 *
908 * Die Geraden sind ausserhalb dieser Bereiche nicht mehr sinnvoll: fb waere
909 * bei 1,00 m Breite 1,75 und ergaebe eine Saettigungsverkehrsstaerke von
910 * 1143 Kfz/h - eine Zahl, die kein Fahrstreifen dieser Breite mehr traegt,
911 * weil dort kein Kraftfahrzeug mehr faehrt.
912 */
913 export const GEOMETRIE_GRENZEN = {
914 breite: { min: 2 as Meters, max: 6 as Meters, step: 0.05 },
915 radius: { min: 3 as Meters, max: 200 as Meters, step: 0.5 },
916 neigung: { min: -12, max: 12, step: 0.5 },
917 /**
918 * Stauraum (Schema 15). Die Obergrenze ist grosszuegig: An einer
919 * Ortsdurchfahrt kann der naechste Knotenpunkt einen halben Kilometer
920 * entfernt sein, und ein Stauraum, der nie erreicht wird, ist keine falsche
921 * Angabe - nur eine, die zu keiner Meldung fuehrt.
922 */
923 stauraum: { min: 5 as Meters, max: 2000 as Meters, step: 1 },
924 } as const;
925
926 /**
927 * Benennung der beiden Ueberfahrzeit-Ansaetze - dieselbe am Bildschirm, im
928 * Pruefbericht und im Ausdruck (Vorbild: BEWERTUNGSVERFAHREN_LABELS).
929 *
930 * DIE BESCHRIFTUNGEN HABEN SICH MIT 5.27.0 VERTAUSCHT, und das ist keine
931 * Stilpflege. Bis dahin hiess 'fest' "Praxisansatz nach behoerdlichen
932 * Leitfaeden; der Wortlaut der RiLSA 2015 ist nicht abgleichbar" - weil der
933 * Wortlaut zu den Faellen 1 und 2 im FGSV-Aenderungsblatt weggeschnitten ist.
934 * Die gekaufte Ausgabe hat ihn: Abschnitt 2.5.2 setzt tue = 3 s fuer geradeaus
935 * fahrende Kraftfahrzeuge "unabhaengig von der zulaessigen
936 * Hoechstgeschwindigkeit" und tue = 2 s fuer abbiegende. Der REGELWERKSANSATZ
937 * ist also der feste; die Kopplung an die Gelbzeit ist der Ansatz DIESES
938 * Programms.
939 *
940 * WARUM 'gelbzeit' trotzdem die Vorgabe bleibt: Mit der Regelstaffel ist sie
941 * bei jeder zulaessigen Hoechstgeschwindigkeit ueber 50 km/h und bei jedem
942 * Abbieger die LAENGERE Ueberfahrzeit und damit die laengere Zwischenzeit. Eine
943 * Vorgabe zu aendern, die jede Zwischenzeit eines ausgelieferten Programms
944 * verkuerzt, waere die gefaehrliche Richtung; dieselbe Abwaegung wie bei der
945 * Raeumgeschwindigkeit der Fussgaenger (SAFETY_FLOORS.maxClearingSpeedFuss).
946 * Wer regelkonform rechnen will, waehlt 'fest' - und die Beschriftung sagt
947 * jetzt, dass das der Regelwerksansatz ist.
948 *
949 * "NIE KUERZER", NICHT "LAENGER" (Fassung 5.43.0): Hier stand "länger als der
950 * Regelwert". Bei 50 km/h geradeaus ergeben beide Ansaetze 3 s, und ein
951 * Bildschirmfoto der Vorgabenansicht zeigte genau diese Beschriftung neben "tü
952 * 3,00 s". Eine Tempogrenze ("oberhalb von 50 km/h länger") gehoert ebenso
953 * wenig hinein: Die Gelbzeitstaffel ist einstellbar. Bei JEDER zulaessigen
954 * Vorgabe wahr ist nur "nie kürzer" - keine Gelbzeit liegt unter
955 * SAFETY_FLOORS.yellowKfz (3 s), und die Regelwerte sind 3 s geradeaus und 2 s
956 * abbiegend. Wer die Schranke oder einen Regelwert aendert, prueft diesen Satz
957 * (tests/ui/konfliktfensterUeberfahrzeit.test.ts).
958 */
959 export const UEBERFAHRZEIT_ANSATZ_LABELS: Readonly<Record<UeberfahrzeitAnsatz, string>> = {
960 gelbzeit:
961 'Überfahrzeit = Gelbzeit (3/4/5 s nach zulässiger Höchstgeschwindigkeit) – Ansatz dieses ' +
962 'Programms, nie kürzer als der Regelwert',
963 fest:
964 'feste Überfahrzeit 3 s geradeaus / 2 s abbiegend – Regelwert nach RiLSA 2015, ' +
965 'Abschnitt 2.5.2 (Fälle 1 und 2)',
966 };
967
968 /**
969 * Beschriftung des Merkmals "enger Innenradius" - eine Stelle fuer Ansicht,
970 * Pruefbericht und Ausdruck, aus demselben Grund wie
971 * UEBERFAHRZEIT_ANSATZ_LABELS.
972 *
973 * Die Klammer bleibt Teil der BESCHRIFTUNG und ist nicht Teil der Rechnung:
974 * Das Programm kennt keinen Abbiegeradius und prueft die Schwelle nicht nach.
975 * Die Schwelle selbst steht seit 5.27.0 belegt in der RiLSA (Abschnitt 2.5.2,
976 * Fall 2) - bis dahin sagte diese Zeile "in der RiLSA 2015 nicht nachweisbar",
977 * und das war der Stand ohne Original.
978 */
979 export const ENGER_RADIUS_LABEL =
980 'enger Innenradius – Radius des Fahrstreifeninnenrands unter 10 m ' +
981 '(RiLSA 2015, Abschnitt 2.5.2, Fall 2)';
982
983 /**
984 * Schranken und Regelbereiche je Anlagenart.
985 *
986 * PRUEFSTAND: Belegt ist am Knotenpunkt der zulaessige Umlaufzeitbereich von
987 * 30 bis 120 s (RiLSA 2015) und die 90 s als Obergrenze des Regelbereichs.
988 * Alles Weitere - Untergrenze des Regelbereichs, saemtliche Wartezeitschwellen,
989 * die groessten eintragbaren Wege - ist hergeleitet oder Praxis und traegt seine
990 * eigene Herkunft im Feld `herkunft` (Fassung 5.4.0, Befund B8).
991 * Die Werte fuer die einstreifige Verkehrsfuehrung sind gaenzlich
992 * NICHT belegt - Arbeitsstellen behandelt die RSA eigenstaendig, und dort steht die
993 * zumutbare Wartezeit im Vordergrund, nicht die Umlaufzeit. Die hier gesetzten
994 * 300 s Obergrenze sind aus den uebrigen Schranken hergeleitet und keine
995 * Zahl aus einem Regelwerk: Bei der groessten eintragbaren Engstelle von
996 * 1000 m ergeben sich 104 s Zwischenzeit je Richtung ((1000 m + 6 m
997 * Fahrzeuglaenge) / 10 m/s + 3 s Gelb, aufgerundet), mit zwei Uebergaengen und
998 * 20 s Freigabe je Richtung also 248 s Umlauf. Wer laenger absperrt, braucht
999 * ein anderes Verfahren (RSA_ALTERNATIVEN_ZUR_SIGNALREGELUNG), und das ist
1000 * keine Frage der Signalzeiten mehr.
1001 *
1002 * Hier standen bis 5.3.4 rund 125 s und 290 s. Beide Zahlen ergaben sich aus
1003 * keiner Rechnung dieses Programms; 125 s setzten eine Raeumgeschwindigkeit von
1004 * 8,2 m/s voraus, die es nirgends gibt. Dieselben Zahlen standen in den
1005 * Begleitunterlagen und - schlimmer - im Ausdruck. Der Ausdruck
1006 * rechnet sie jetzt ueber rilsa/engstelle.ts, statt sie zu behaupten; die
1007 * Zahlen hier sind nachgerechnet (tests/domain/engstelle.test.ts).
1008 *
1009 * Diese Werte sind vor dem Einsatz gegen die eigene Ausgabe der RSA
1010 * abzugleichen; der Pruefbericht weist sie entsprechend aus.
1011 */
1012 /**
1013 * Herkunft EINER Schranke - Text und Pruefstand, wie sie in Ausdruck und
1014 * Pruefbericht erscheinen.
1015 *
1016 * KORREKTUR (Fassung 5.4.0, Befund B8): Bis dahin trug die ganze Anlagenart
1017 * EINE Quelle (`quelle`), und der Ausdruck schrieb sie in jede Zeile der
1018 * Tabelle "Schranken der Anlagenart" - "RiLSA 2015, gesichert" auch neben die
1019 * Wartezeitschwellen 90/120 s und "RSA 21" auch neben die Umlaufzeit von 30 bis
1020 * 300 s. Beides gibt es in den genannten Regelwerken nicht: Die RSA 21 enthaelt
1021 * weder Umlaufzeitgrenzen noch bezifferte Wartezeitschwellen fuer
1022 * signalgeregelte Engstellen, und oeffentlich belegte RiLSA-Wartezeitschwellen
1023 * existieren nicht. Ein Pruefer, der eine gedruckte Zahl im genannten Regelwerk
1024 * sucht, findet sie dort nicht - und weiss dann nicht mehr, welcher Angabe der
1025 * Unterlage er noch trauen kann.
1026 *
1027 * Deshalb traegt jede Zeile ihre eigene Herkunft. Sie steht hier und nicht im
1028 * Ausdruck, damit Ausdruck (pdf.ts) und Pruefbericht (Befund B9) dieselbe
1029 * Aussage fuehren.
1030 *
1031 * Zum Pruefstand: Fuer eine Schwelle, die dieses Programm selbst setzt, gibt es
1032 * keinen "gesicherten" Zustand - sie steht in keinem Druckwerk. Sie traegt
1033 * deshalb 'abzugleichen': abzustimmen ist sie mit der Straszenverkehrsbehoerde,
1034 * nicht am Regelwerk nachzuschlagen. Was sie ist, sagt der Text.
1035 */
1036 export interface SchrankenHerkunft {
1037 /** Woher der Wert stammt - im Klartext, so wie er gedruckt wird. */
1038 readonly text: string;
1039 readonly pruefstand: Pruefstand;
1040 }
1041
1042 /** Herkunft je Zeile der Schrankentabelle einer Anlagenart. */
1043 export interface AnlagenartHerkunft {
1044 /** Zulaessiger Bereich der Umlaufzeit (min bis max). */
1045 readonly umlaufzeit: SchrankenHerkunft;
1046 /** Empfohlener Bereich der Umlaufzeit (recommendedMin bis recommendedMax). */
1047 readonly regelbereich: SchrankenHerkunft;
1048 /** Groesster eintragbarer Raeumweg. */
1049 readonly raeumweg: SchrankenHerkunft;
1050 /** Wartezeit: Warnung und Beanstandung. */
1051 readonly wartezeit: SchrankenHerkunft;
1052 }
1053
1054 /**
1055 * Eingabegrenze des Programms fuer den Raeumweg - bei jeder Anlagenart
1056 * dieselbe Aussage, weil es bei jeder dieselbe Groesse ist: eine Schranke des
1057 * Eingabefeldes, kein Wert eines Regelwerks. Sie gehoert trotzdem in die
1058 * Unterlage, weil sie erklaert, dass ein laengerer Weg gar nicht erfassbar
1059 * gewesen waere.
1060 */
1061 const HERKUNFT_RAEUMWEG: SchrankenHerkunft = {
1062 text: 'Eingabegrenze dieses Programms, kein Regelwerkswert',
1063 pruefstand: 'abzugleichen',
1064 };
1065
1066 export interface AnlagenartGrenzen {
1067 readonly cycleTime: {
1068 readonly min: Seconds;
1069 readonly max: Seconds;
1070 readonly recommendedMin: Seconds;
1071 readonly recommendedMax: Seconds;
1072 };
1073 /**
1074 * Groesster eintragbarer Raeumweg.
1075 *
1076 * Am Knotenpunkt ist der Raeumweg der Konfliktbereich; mehr als 500 m
1077 * deuten dort auf einen Eingabefehler hin. Bei einer einstreifigen
1078 * Verkehrsfuehrung IST der Raeumweg die Engstelle.
1079 */
1080 readonly maxClearingDistance: Meters;
1081 /** Wartezeit, ab der gewarnt wird (Umlaufzeit abzueglich eigener Freigabe). */
1082 readonly warteZeitWarnung: Seconds;
1083 /** Wartezeit, ab der die Planung zu beanstanden ist. */
1084 readonly warteZeitFehler: Seconds;
1085 /**
1086 * Regelwerk, das die Anlagenart ueberhaupt behandelt.
1087 *
1088 * Nicht zu verwechseln mit `herkunft`: `quelle` sagt, in welchem Sachgebiet
1089 * des Fundstellenverzeichnisses die Anlagenart steht (RiLSA fuer Knotenpunkt
1090 * und Fussgaengerschutzanlage, RSA fuer die Arbeitsstelle); `herkunft` sagt
1091 * je Schranke, ob der ZAHLENWERT dort auch wirklich steht. Beim Knotenpunkt
1092 * faellt beides zusammen, bei der Arbeitsstelle gerade nicht.
1093 */
1094 readonly quelle: 'rilsa-umlaufzeit' | 'rsa-arbeitsstellen';
1095 /** Herkunft je Schranke (Fassung 5.4.0, Befund B8). */
1096 readonly herkunft: AnlagenartHerkunft;
1097 }
1098
1099 export const ANLAGENART_GRENZEN: Readonly<Record<Anlagenart, AnlagenartGrenzen>> = {
1100 knotenpunkt: {
1101 cycleTime: { min: 30, max: 120, recommendedMin: 30, recommendedMax: 90 },
1102 maxClearingDistance: 500,
1103 warteZeitWarnung: 90,
1104 warteZeitFehler: 120,
1105 quelle: 'rilsa-umlaufzeit',
1106 herkunft: {
1107 // Belegt: 30 s Mindestumlauf und 120 s Hoechstumlauf am Knotenpunkt
1108 // (UDV-Veroeffentlichung, Masterarbeit mit Seitenzitat).
1109 umlaufzeit: {
1110 text: 'RiLSA 2015 – Umlaufzeit am Knotenpunkt (30 bis 120 s)',
1111 pruefstand: 'gesichert',
1112 },
1113 /*
1114 * BERICHTIGT (Fassung 5.27.0, am Original nachgeschlagen): Der
1115 * Regelbereich ist der der RiLSA - Abschnitt 2.6 nennt als Richtwerte
1116 * minimal 30 s und maximal 90 (120) s. Hier standen 60 bis 90 s.
1117 *
1118 * Die Vorgeschichte gehoert dazu, weil sie zweimal umschlug: Bis zur
1119 * Fassung 5.5.0 (15.08.2026) hiess es "90 s als Obergrenze belegt; 60 s
1120 * als Untergrenze abzugleichen". 5.5.0 hat den RiLSA-Bezug der 60 s
1121 * gestrichen und sie als Zahl dieses Programms ausgewiesen - richtig,
1122 * soweit es ging. Was damals nicht zu sehen war: Die RiLSA nennt sehr wohl
1123 * eine Untergrenze, naemlich 30 s, dieselbe Zahl wie beim zulaessigen
1124 * Bereich. Was sie gestrichen hat, ist der frueher "normal" genannte
1125 * MITTELbereich von 50 bis 75 s.
1126 */
1127 regelbereich: {
1128 text:
1129 'RiLSA 2015, Abschnitt 2.6 – Richtwerte der Umlaufzeit (minimal 30 s, maximal ' +
1130 '90 (120) s); größere Umlaufzeiten als 90 s sind nach Möglichkeit zu vermeiden',
1131 pruefstand: 'gesichert',
1132 },
1133 raeumweg: HERKUNFT_RAEUMWEG,
1134 // Bezifferte Wartezeitschranken nennt weder die RiLSA noch
1135 // das HBS in einer oeffentlich belegten Fassung. Die Zahlen sind hier aus
1136 // den Umlaufzeitgrenzen abgeleitet - 90 s ist das Ende des
1137 // Regelbereichs, 120 s die Obergrenze -, und genau das steht jetzt auch
1138 // in der Unterlage.
1139 wartezeit: {
1140 text:
1141 'Schwelle dieses Programms, kein Regelwerkswert – aus den RiLSA-Umlaufzeitgrenzen ' +
1142 'abgeleitet (Warnung ab dem Ende des Regelbereichs, Beanstandung ab der Obergrenze)',
1143 pruefstand: 'abzugleichen',
1144 },
1145 },
1146 },
1147 /*
1148 * Fussgaengerschutzanlage: dieselben Umlaufzeiten wie am Knotenpunkt, aber
1149 * eine deutlich engere Wartezeitschranke. Wer als Fussgaenger deutlich
1150 * laenger als eine halbe Minute wartet, geht bei Rot; die Schranke steht
1151 * deshalb bei 45 s - das ist der haeufigste Grund,
1152 * warum eine Furt ihre Schutzwirkung verliert. Der Raeumweg ist die
1153 * Furtlaenge; mehr als 100 m gibt es nicht.
1154 */
1155 fussgaengerschutzanlage: {
1156 cycleTime: { min: 30, max: 120, recommendedMin: 40, recommendedMax: 70 },
1157 maxClearingDistance: 100,
1158 warteZeitWarnung: 45,
1159 warteZeitFehler: 90,
1160 quelle: 'rilsa-umlaufzeit',
1161 herkunft: {
1162 /*
1163 * Dieselben zulaessigen Umlaufzeiten wie am Knotenpunkt und aus derselben
1164 * Quelle: Die RiLSA staffelt die Grenzen nicht nach Anlagenart. Genau das
1165 * steht seit der Fassung 5.4.0 (Befund B-6) auch im gedruckten Text -
1166 * zuvor stand es nur hier im Kommentar und in einer Begleitunterlage, die
1167 * damit etwas zitierte, was in der Unterlage nicht zu finden war. Es
1168 * traegt zugleich einen Vorbehalt: Belegt ist die Zeile "am Knotenpunkt".
1169 */
1170 umlaufzeit: {
1171 text:
1172 'RiLSA 2015 – Umlaufzeit (30 bis 120 s); die RiLSA staffelt die Grenzen nicht nach ' +
1173 'Anlagenart',
1174 pruefstand: 'gesichert',
1175 },
1176 /*
1177 * 40 bis 70 s hat dieses Programm gesetzt: An einer Furt ist die
1178 * Wartezeit das Mass, und ein Umlauf von 90 s waere dort bereits zu lang.
1179 * In der RiLSA steht dieser Bereich nicht - und die
1180 * einzige einschlaegige Fundstelle sagt sogar das Gegenteil, naemlich
1181 * dass es hier ueberhaupt keine Vorgabe gibt. Das gehoert in die
1182 * Unterlage: Wer den Hinweis liest, soll wissen, dass er eine Zahl dieses
1183 * Programms gegen sich hat und keine Vorschrift.
1184 */
1185 regelbereich: {
1186 text:
1187 'Schwelle dieses Programms, kein Regelwerkswert – der Hamburger LSA-Leitfaden sagt für ' +
1188 'Fußgängerschutzanlagen ausdrücklich, die Umlaufzeit richte sich nach den erforderlichen ' +
1189 'Freigabezeiten und sei „an keine weiteren Vorgaben gebunden"',
1190 pruefstand: 'abzugleichen',
1191 },
1192 raeumweg: HERKUNFT_RAEUMWEG,
1193 /*
1194 * KORREKTUR (Stand 15.08.2026): Die Zahlen bleiben - fuer
1195 * 45 s und 90 s gibt es weiterhin keinen Regelwerksbeleg. Ihre BEGRUENDUNG
1196 * war aber unvollstaendig: Der Satz "wer als Fussgaenger laenger wartet,
1197 * geht bei Rot" ist keine Erfahrung dieses Programms, sondern ein
1198 * belegter Wert - nur eben aus der EFA 2002 und nicht aus der RiLSA. Das
1199 * Forschungsinformationssystem des Bundesverkehrsministeriums gibt ihn
1200 * mit Literaturaufloesung wieder: "Wird die von Zufussgehenden weitgehend
1201 * akzeptierte Wartezeit von maximal 40 Sekunden ueberschritten, [...]
1202 * fuehrt [dies] auch zu einer Gefaehrdung, da die Rotlichtmissachtung ab
1203 * dieser Zeitdauer deutlich zunimmt."
1204 */
1205 wartezeit: {
1206 text:
1207 'Schwelle dieses Programms, kein Regelwerkswert – 90 s aus der ' +
1208 'RiLSA-Umlaufzeitobergrenze abgeleitet, 45 s aus der Planungspraxis; die belegte Zahl ' +
1209 'dahinter ist die von Zufußgehenden weitgehend akzeptierte Wartezeit von 40 s nach ' +
1210 'EFA 2002 (darüber nimmt die Rotlichtmissachtung deutlich zu) – nicht nach RiLSA',
1211 pruefstand: 'abzugleichen',
1212 },
1213 },
1214 },
1215 einstreifig: {
1216 cycleTime: { min: 30, max: 300, recommendedMin: 60, recommendedMax: 180 },
1217 maxClearingDistance: 1000,
1218 warteZeitWarnung: 180,
1219 warteZeitFehler: 300,
1220 quelle: 'rsa-arbeitsstellen',
1221 herkunft: {
1222 /*
1223 * Die RSA 21 rechnet Baustellenampeln nach RiLSA (Teil A 3.2 Abs. 3),
1224 * nennt selbst aber keine Umlaufzeitgrenze - die einzige Zahl zur Dauer
1225 * betrifft Arbeiten kuerzerer Dauer OHNE Lichtsignalanlage (10 Minuten).
1226 * Die 300 s sind aus den uebrigen Schranken dieses Programms hergeleitet
1227 * (siehe die Rechnung im Kopfkommentar dieser Tabelle). Der Ausdruck
1228 * druckte hier "RSA 21" - und behauptete damit eine Deckung, die es
1229 * nicht gibt.
1230 */
1231 umlaufzeit: {
1232 text:
1233 'Schwelle dieses Programms, aus den übrigen Schranken hergeleitet – kein RSA-Wert ' +
1234 '(die RSA 21 regelt Arbeitsstellen ohne Umlaufzeitgrenze)',
1235 pruefstand: 'abzugleichen',
1236 },
1237 regelbereich: {
1238 text: 'Schwelle dieses Programms, kein Regelwerkswert',
1239 pruefstand: 'abzugleichen',
1240 },
1241 raeumweg: HERKUNFT_RAEUMWEG,
1242 wartezeit: {
1243 text:
1244 'Schwelle dieses Programms, kein Regelwerkswert – die RSA 21 nennt für ' +
1245 'signalgeregelte Engstellen keine bezifferte Wartezeitschwelle',
1246 pruefstand: 'abzugleichen',
1247 },
1248 },
1249 },
1250 };
1251
1252 /**
1253 * Was die RSA 21 vorsieht, wenn eine Engstelle fuer eine Signalregelung zu
1254 * lang ist - dieselbe Formulierung in Pruefbericht, Assistent und Ausdruck.
1255 *
1256 * KORREKTUR (Fassung 5.4.0, Befund B7): An sieben Stellen stand
1257 * "Begleitfahrzeug oder Verkehrsposten". Die RSA 21 kennt beides nicht:
1258 * Warnposten duerfen keine Verkehrsregelung vornehmen - sie bleibt der Polizei
1259 * vorbehalten (Teil A, Abschnitt 6) -, und das Begleitfahrzeug gehoert zum
1260 * Grossraum- und Schwertransportrecht. RSA-konform sind die Umleitung
1261 * mindestens einer Fahrtrichtung (Teil B 2.3.4) und die behoerdlich
1262 * angeordnete Handschaltung der Lichtsignalanlage (Teil A 3.2 Abs. 4); daneben
1263 * die Verkehrsregelung durch die Polizei. Eine Empfehlung, die das Regelwerk
1264 * nicht kennt, ist in einer Planunterlage schlimmer als keine.
1265 */
1266 export const RSA_ALTERNATIVEN_ZUR_SIGNALREGELUNG =
1267 'die Umleitung mindestens einer Fahrtrichtung (RSA 21, Teil B 2.3.4), eine behördlich ' +
1268 'angeordnete Handschaltung der Lichtsignalanlage (RSA 21, Teil A 3.2 Abs. 4) oder eine ' +
1269 'Verkehrsregelung durch die Polizei; Warnposten dürfen keine Verkehrsregelung vornehmen ' +
1270 '(RSA 21, Teil A Abschnitt 6)';
1271
1272 /**
1273 * Zulaessige Hoechstgeschwindigkeit, bis zu der Lichtsignalanlagen eingerichtet
1274 * werden sollen: VwV-StVO zu Par. 37 Rn. 10 - "Ueber 70 km/h sollen
1275 * Lichtzeichenanlagen nicht eingerichtet werden." Eine Soll-Vorschrift, keine
1276 * Rechengroesse; die Gelbzeitstaffel endet aus demselben Grund offen bei
1277 * "5 s darueber".
1278 *
1279 * NEU (Fassung 5.4.0, Befund C2): Bis dahin waren 130 km/h an
1280 * Signalgruppe und Knotenpunkt eintragbar, ohne dass der Pruefbericht ein
1281 * Wort verlor. Die Feldgrenzen bleiben - die Eingabe ist moeglich, damit auch
1282 * eine Ausnahme abgebildet werden kann -, aber der Bericht nennt sie.
1283 */
1284 export const VZUL_OBERGRENZE_LSA: KilometersPerHour = 70;
1285
1286 /**
1287 * Anhaltswerte der RSA 21 fuer die einstreifige Verkehrsfuehrung.
1288 *
1289 * NEU (Fassung 5.4.0, Befunde C3 und C6). PRUEFSTAND: abzugleichen -
1290 * die Zahlen sind aus der Fachpraxis zur RSA 21 uebernommen und vor dem
1291 * Einsatz an der eigenen Ausgabe zu pruefen (quellen.ts, 'rsa-arbeitsstellen').
1292 * Sie erzeugen ausschliesslich Hinweise; keine dieser Zahlen geht in eine
1293 * Signalzeit ein.
1294 */
1295 export const RSA_EINSTREIFIG = {
1296 /**
1297 * Bis zu dieser Engstellenlaenge kann nach RSA 21 (Teil B) die Regelung nach
1298 * Par. 6 StVO bzw. mit den Zeichen 208/308 ("Vorrang des Gegenverkehrs" /
1299 * "Vorrang vor dem Gegenverkehr") genuegen - eine Lichtsignalanlage ist dann
1300 * nicht zwingend.
1301 */
1302 kurzeEngstelleBis: 50 as Meters,
1303 /**
1304 * Richtwert der Verkehrsstaerke (beide Richtungen zusammen), ab dem eine
1305 * Signalregelung in Betracht kommt (RSA 21, Teil B: Anordnungskriterien
1306 * Verkehrsstaerke, Laenge der Engstelle, Sichtverhaeltnisse).
1307 */
1308 verkehrsstaerkeRichtwert: 500 as VehiclesPerHour,
1309 /**
1310 * Zulaessige Hoechstgeschwindigkeit, auf die an Arbeitsstellen laengerer
1311 * Dauer in der Regel zu beschraenken ist (RSA 21, Teil C 2.3.2).
1312 */
1313 vZulRegel: 50 as KilometersPerHour,
1314 } as const;
1315
1316 /**
1317 * Laenge einer Engstelle, ab der die Behoerdenpraxis Abstimmungsbedarf sieht.
1318 *
1319 * BEHOERDENPRAXIS, KEIN REGELWERKSWERT: Strassenbaubehoerden (z. B. Hessen
1320 * Mobil) stellen Baustellenampeln bis rund 400 m auf, ausnahmsweise und mit
1321 * Zustimmung bis 600 m. Weder RSA noch RiLSA nennen diese Zahlen. Sie stehen
1322 * hier, weil eine Planung, die darueber liegt, in der Anordnung erklaert
1323 * werden muss - und der Bearbeiter das vorher erfahren soll, nicht erst von der
1324 * Behoerde.
1325 *
1326 * NEU (Fassung 5.4.0, Befund C5): Bis dahin schlug die erste Warnung
1327 * erst bei rund 835 m an, wo die Wartezeitschranke der Anlagenart greift.
1328 * Wer 700 m absperrte, hoerte vom Programm nichts.
1329 */
1330 export const ENGSTELLE_PRAXIS = {
1331 /** Ab dieser Laenge (einschliesslich) ein Hinweis auf die uebliche Obergrenze. */
1332 hinweisAb: 400 as Meters,
1333 /** Ab dieser Laenge (einschliesslich) eine Warnung: nur ausnahmsweise mit Zustimmung. */
1334 warnungAb: 600 as Meters,
1335 } as const;
1336
1337 /**
1338 * Laenge, die ein wartendes Fahrzeug im Rueckstau belegt - Fahrzeug und
1339 * Abstand zum vorausfahrenden.
1340 *
1341 * PRAXISWERT, KEIN REGELWERKSWERT. Weder RiLSA noch HBS nennen ihn; er ist die
1342 * uebliche Faustzahl fuer eine Pkw-Warteschlange. Ein hoeherer Schwerverkehrs-
1343 * anteil verlaengert den Rueckstau ueber diesen Wert hinaus - das Programm
1344 * bildet das nicht ab, und die Laenge faellt dort zu kurz aus.
1345 *
1346 * HIERHER GEHOBEN (Fassung 5.28.0): Bis dahin stand die Zahl als
1347 * `QUEUE_SPACING_METERS` modullokal in `simulation/simulation.ts`, ohne
1348 * Ausfuhr, ohne Eintrag in dieser Datei, ohne Quelle, ohne Pruefstand und ohne
1349 * einen einzigen Test - waehrend die Simulationsansicht die daraus gebildete
1350 * Laenge als Meterangabe anzeigte. Die Hausregel dazu ist eindeutig: Diese
1351 * Datei ist die einzige Quelle aller Kennwerte. Die Herkunft steht jetzt in
1352 * `quellen.ts` unter `praxis-stauraum-je-fahrzeug`.
1353 *
1354 * WOFUER ER NICHT GILT: Fuer die Bemessung nach HBS spielt er keine Rolle. Der
1355 * Rueckstau der Leistungsfaehigkeitsrechnung wird in Fahrzeugen gefuehrt; eine
1356 * Laenge bildet allein die Simulation, und sie ist eine Veranschaulichung,
1357 * keine Nachweisgroesse.
1358 */
1359 export const STAURAUMBEDARF_JE_FAHRZEUG: Meters = 7;
1360
1361 /** Benennung der Anlagenart - dieselbe am Bildschirm wie im Ausdruck. */
1362 export const ANLAGENART_LABELS: Readonly<Record<Anlagenart, string>> = {
1363 knotenpunkt: 'Knotenpunkt (Kreuzung oder Einmündung)',
1364 fussgaengerschutzanlage: 'Fußgängerschutzanlage auf freier Strecke',
1365 einstreifig: 'Einstreifige Verkehrsführung (Arbeitsstelle oder Engstelle)',
1366 };
1367
1368 /** Kurzform fuer Tabellen und Statuszeile. */
1369 export const ANLAGENART_KURZ: Readonly<Record<Anlagenart, string>> = {
1370 knotenpunkt: 'Knotenpunkt',
1371 fussgaengerschutzanlage: 'Fußgängerschutzanlage',
1372 einstreifig: 'Einstreifige Verkehrsführung',
1373 };
1374
1375 /**
1376 * Harte Schranken, die auch ueber die Vorgabenverwaltung nicht unterschritten
1377 * werden duerfen.
1378 *
1379 * Im Altbestand liess sich ueber das Formel-Studio jede Konstante frei
1380 * ueberschreiben - einschliesslich Gelbzeit und Mindestfreigabezeit. Eine auf
1381 * 0 s gesetzte Gelbzeit haette einen formal gueltigen, tatsaechlich aber
1382 * gefaehrlichen Signalzeitenplan erzeugt.
1383 */
1384 export const SAFETY_FLOORS = {
1385 /** Kuerzeste zulaessige Gelbzeit fuer Kraftfahrzeugverkehr. */
1386 yellowKfz: 3 as Seconds,
1387 /** Kuerzeste zulaessige Rot-Gelb-Zeit. */
1388 redYellow: 1 as Seconds,
1389 /**
1390 * Laengste zulaessige Rot-Gelb-Zeit.
1391 * KORREKTUR (Fassung 5.4.0, Befund B6): Das Vorgabenfeld liess bis
1392 * 3 s zu, und 2,5 oder 3 s erzeugten nur einen Abweichungshinweis. Die
1393 * VwV-StVO zu Par. 37 (Rn. 17) ist eindeutig: Rot-Gelb "soll fuer
1394 * Kraftfahrzeugstroeme eine Sekunde dauern, darf aber nicht laenger als zwei
1395 * Sekunden sein". Eine ueberlange Rot-Gelb-Zeit beguenstigt fruehes
1396 * Einfahren vor Freigabebeginn - die unsichere Richtung.
1397 */
1398 maxRedYellow: 2 as Seconds,
1399 /** Kuerzeste zulaessige Freigabezeit fuer Kfz, Rad und Fussgaenger. */
1400 minGreen: 5 as Seconds,
1401 /** Hoechste ansetzbare Raeumgeschwindigkeit fuer Kraftfahrzeuge. */
1402 maxClearingSpeedKfz: 10.0 as MetersPerSecond,
1403 /**
1404 * Hoechste ansetzbare Raeumgeschwindigkeit fuer Radverkehr.
1405 * KORREKTUR (Fassung 5.4.0, Befund A1): Bislang wurden Rad-Werte nur
1406 * gegen die Kfz-Schranke von 10 m/s geprueft - ein Wert von 8 m/s passierte
1407 * ohne jede Meldung und halbierte die Raeumzeit. Der RiLSA-Regelwert 4 m/s
1408 * ist zugleich die Obergrenze, wie bei den Fussgaengern (1,2 m/s).
1409 */
1410 maxClearingSpeedRad: 4.0 as MetersPerSecond,
1411 /**
1412 * Hoechste ansetzbare Raeumgeschwindigkeit fuer Fussgaenger.
1413 *
1414 * BEWUSST STRENGER ALS DAS REGELWERK (Stand 15.08.2026): Der
1415 * RiLSA-Originalwortlaut zu Fall 6 ist inzwischen woertlich belegt (verdeckte
1416 * Textschicht des FGSV-Aenderungsblatts vom 29.07.2015): "Der Regelwert fuer
1417 * die Raeumgeschwindigkeit von Fussgaengern ist vr = 1,2 m/s. Variationen von
1418 * vr = 1,0 m/s bis hoechstens vr = 1,5 m/s sind moeglich." Die RiLSA laesst
1419 * also bis 1,5 m/s zu, dieses Programm nur bis 1,2 m/s.
1420 *
1421 * WARUM DIE SCHRANKE TROTZDEM BEI 1,2 m/s BLEIBT: Eine hoehere
1422 * Raeumgeschwindigkeit VERKUERZT die Zwischenzeit - die unsichere Richtung,
1423 * und zwar fuer die ungeschuetzteste Verkehrsart. Die BASt hat gemessen, dass
1424 * "mehr als 70 Prozent der Fussgaenger langsamer gehen als der [...]
1425 * Maximalwert der Raeumgeschwindigkeit von 1,5 Meter pro Sekunde"
1426 * (Forschung kompakt 01/13 zum Bericht V 217). Eine Sicherheitsschranke auf
1427 * ein neu gehobenes Zitat hin zu lockern, ginge in die gefaehrliche
1428 * Richtung. Die Abweichung wird nicht verschwiegen: Das
1429 * Fundstellenverzeichnis nennt sie als Verschaerfung dieses Programms
1430 * (quellen.ts, 'rilsa-zwischenzeiten'). Wer 1,5 m/s braucht, muss die
1431 * Schranke hier aendern und die Aenderung verantworten.
1432 */
1433 maxClearingSpeedFuss: 1.2 as MetersPerSecond,
1434 /**
1435 * Hoechste ansetzbare Raeumgeschwindigkeit fuer gesondert signalisierten
1436 * OePNV: 70 km/h / 3,6 = 19,44 m/s.
1437 *
1438 * KORREKTUR (Fassung 5.4.0, Befund A2): Mit vr = Vmax/3,6 nach
1439 * RiLSA-Fall 3 darf eine Bahn bei Vmax 70 km/h legitim schneller raeumen
1440 * als die Kfz-Schranke von 10 m/s. Die Grenze liegt bei 70 km/h, weil
1441 * oberhalb dieser Geschwindigkeit Lichtsignalanlagen nicht betrieben werden
1442 * sollen (VwV-StVO zu Par. 37 Rn. 10) - die Ueberfahrzeit-Staffel der RiLSA
1443 * endet aus demselben Grund bei 70 km/h. Zusaetzlich gilt je Strom die
1444 * konkrete Vmax als Deckel (nicht schneller raeumen, als gefahren werden
1445 * darf) - siehe intergreen.ts; ohne bekannte Vmax bleibt es bei den
1446 * konservativen 10 m/s.
1447 */
1448 maxClearingSpeedOepnv: 70 / 3.6,
1449 /*
1450 * EINFAHRGESCHWINDIGKEITEN - die Schranke liegt UNTEN (Fassung 5.10.0).
1451 *
1452 * tz = tue + tr - te: Die Einfahrzeit wird ABGEZOGEN. Eine niedrigere
1453 * Einfahrgeschwindigkeit verlaengert te und verkuerzt damit jede
1454 * Zwischenzeit, an der ein einfahrender Strom dieser Verkehrsart beteiligt
1455 * ist - die gefaehrliche Richtung. Bei den Raeumgeschwindigkeiten ist es
1456 * umgekehrt; deshalb steht dort der Regelwert als Ober- und hier als
1457 * Untergrenze.
1458 *
1459 * Bis 5.9.0 trugen die vier Vorgabenfelder nur Plausibilitaetsschranken
1460 * (Kfz ab 5 m/s, also weniger als die Haelfte des Regelwerts) und keine
1461 * Begruendung. Die Absenkung schaltete zugleich die Warnung
1462 * 'einfahrgeschwindigkeit-unter-regelwert' stumm, weil die Handeingabe je
1463 * Konfliktbeziehung gegen den bereits abgesenkten Kennwertsatz gemessen
1464 * wird. Nach OBEN bleibt es bei der bisherigen Plausibilitaetsschranke des
1465 * Vorgabenfeldes (Kfz und OePNV 20, Rad 8, Fussgaenger 2,5 m/s; settings.ts);
1466 * eine Sicherheitsschranke ist dort nicht noetig, weil ein hoeher
1467 * angesetzter einfahrender Strom die Zwischenzeit verlaengert.
1468 *
1469 * Die Werte sind die Regelwerte aus RILSA_DEFAULTS.enteringSpeed; ein Test
1470 * bindet beide aneinander.
1471 */
1472 /** Kleinste ansetzbare Einfahrgeschwindigkeit fuer Kraftfahrzeuge. */
1473 minEnteringSpeedKfz: 11.1 as MetersPerSecond,
1474 /** Kleinste ansetzbare Einfahrgeschwindigkeit fuer den Radverkehr. */
1475 minEnteringSpeedRad: 5.0 as MetersPerSecond,
1476 /** Kleinste ansetzbare Einfahrgeschwindigkeit fuer Fussgaenger. */
1477 minEnteringSpeedFuss: 1.5 as MetersPerSecond,
1478 /** Kleinste ansetzbare Einfahrgeschwindigkeit fuer gesondert signalisierten OePNV. */
1479 minEnteringSpeedOepnv: 11.1 as MetersPerSecond,
1480 /** Kuerzeste ansetzbare Fahrzeuglaenge fuer Kraftfahrzeuge. */
1481 minVehicleLengthKfz: 6 as Meters,
1482 /**
1483 * Kuerzeste ansetzbare Fahrzeuglaenge fuer Strassenbahnen - die
1484 * RiLSA-Rechenlaenge (15 m, Fall 3) ist zugleich die Untergrenze: Ein
1485 * kuerzerer Zuschlag verkuerzt den Raeumweg unzulaessig.
1486 */
1487 minVehicleLengthStrassenbahn: 15 as Meters,
1488 /** Untere Schranke der Umlaufzeit - gilt fuer jede Anlagenart. */
1489 minCycleTime: 30 as Seconds,
1490 /*
1491 * Die obere Schranke der Umlaufzeit steht hier NICHT.
1492 *
1493 * Sie ist keine harte Schranke im Sinne dieser Liste, sondern haengt an der
1494 * Anlagenart: 120 s am Knotenpunkt und an der Fussgaengerschutzanlage, 300 s
1495 * bei einstreifiger Verkehrsfuehrung. Sie steht deshalb in
1496 * ANLAGENART_GRENZEN, und die Vorgabenverwaltung holt sie von dort
1497 * (settings.ts, grenzeVonArt).
1498 *
1499 * Bis 5.3.4 lag hier zusaetzlich ein maxCycleTime von 120 s. Seit die
1500 * Vorgabenfelder ihre Schranken aus der Anlagenart beziehen, las es niemand
1501 * mehr - eine wirkungslose Zahl unter der Ueberschrift "harte Schranken" ist
1502 * schlimmer als keine: Wer sie aendert, glaubt etwas bewirkt zu haben.
1503 */
1504 } as const;
1505
1506 /** Eine Stufe einer Bewertungstafel: gilt bis EINSCHLIESSLICH `maxDelay`. */
1507 export interface ServiceLevelStep {
1508 readonly grade: 'A' | 'B' | 'C' | 'D' | 'E' | 'F';
1509 readonly maxDelay: Seconds;
1510 readonly label: string;
1511 }
1512
1513 /**
1514 * Qualitaetsstufen des Verkehrsablaufs.
1515 *
1516 * Zwei Verfahren, weil beide in der Praxis vorkommen und der Altbestand sie
1517 * vermischt hat: Er trug die HCM-Grenzwerte unter der Bezeichnung
1518 * "Level of Service" und beschriftete das Ergebnis deutsch als Bewertung nach
1519 * RiLSA. Das Verfahren wird am Ergebnis mit ausgegeben.
1520 *
1521 * KORREKTUR (Fassung 5.4.0, Befund B1): Die bis dahin als "HBS 2015"
1522 * gefuehrte Kfz-Tafel (E bis 100 s, F darueber) war die Tabelle des HBS 2001.
1523 * Nach HBS 2015 endet die Kfz-Tafel bei E > 70 s ohne Obergrenze, und die
1524 * Stufe F ist keine Wartezeitstufe: Sie ist erreicht, wenn die nachgefragte
1525 * Verkehrsstaerke ueber der Kapazitaet liegt (q > C, Auslastungsgrad > 1).
1526 * Deshalb steht F fuer Kfz nicht in der Tafel, sondern wird in delay.ts an
1527 * den Auslastungsgrad gekoppelt (`kriterium: 'ueberlastung'`).
1528 *
1529 * KORREKTUR (Befund B4): Fussgaenger und Radverkehr bewertet das HBS 2015 nach
1530 * der MAXIMALEN Wartezeit (laengste Sperrzeit im Umlauf) mit eigener Tafel;
1531 * bisher liefen Radgruppen auf der Kfz-Tafel und Fussgaenger erhielten
1532 * ueber einen Unendlich-Pfad formal die Stufe F.
1533 *
1534 * Belege: HBS-2015-Kfz-Tafel samt F-Regel zitiert in Verkehrsuntersuchungen
1535 * nach HBS 2015 (z. B. Modus Consult, L 267, 2020: "Die QSV F ist erreicht,
1536 * wenn die nachgefragte Verkehrsstaerke q ueber der Kapazitaet C liegt");
1537 * Fuss/Rad- und OePNV-Tafeln nach zwei uebereinstimmenden Sekundaerquellen
1538 * (Pruefstand: abzugleichen, siehe quellen.ts).
1539 */
1540 export const SERVICE_LEVEL_SCALES: {
1541 readonly HBS: {
1542 /** Kfz-Verkehr, mittlere Wartezeit; F nur bei Ueberlastung (x > 1). */
1543 readonly kfz: readonly ServiceLevelStep[];
1544 /** Strassengebundener OePNV, mittlere Wartezeit. */
1545 readonly oepnv: readonly ServiceLevelStep[];
1546 /** Fussgaenger und Radverkehr, MAXIMALE Wartezeit (laengste Sperrzeit). */
1547 readonly fussRad: readonly ServiceLevelStep[];
1548 };
1549 readonly HCM: {
1550 /** Highway Capacity Manual, Level of Service nach mittlerer Wartezeit. */
1551 readonly kfz: readonly ServiceLevelStep[];
1552 };
1553 } = {
1554 HBS: {
1555 kfz: [
1556 { grade: 'A', maxDelay: 20, label: 'sehr gut' },
1557 { grade: 'B', maxDelay: 35, label: 'gut' },
1558 { grade: 'C', maxDelay: 50, label: 'befriedigend' },
1559 { grade: 'D', maxDelay: 70, label: 'ausreichend' },
1560 { grade: 'E', maxDelay: Number.POSITIVE_INFINITY, label: 'mangelhaft' },
1561 ],
1562 oepnv: [
1563 { grade: 'A', maxDelay: 5, label: 'sehr gut' },
1564 { grade: 'B', maxDelay: 15, label: 'gut' },
1565 { grade: 'C', maxDelay: 25, label: 'befriedigend' },
1566 { grade: 'D', maxDelay: 40, label: 'ausreichend' },
1567 { grade: 'E', maxDelay: 60, label: 'mangelhaft' },
1568 { grade: 'F', maxDelay: Number.POSITIVE_INFINITY, label: 'ungenügend' },
1569 ],
1570 fussRad: [
1571 { grade: 'A', maxDelay: 30, label: 'sehr gut' },
1572 { grade: 'B', maxDelay: 40, label: 'gut' },
1573 { grade: 'C', maxDelay: 55, label: 'befriedigend' },
1574 { grade: 'D', maxDelay: 70, label: 'ausreichend' },
1575 { grade: 'E', maxDelay: 85, label: 'mangelhaft' },
1576 { grade: 'F', maxDelay: Number.POSITIVE_INFINITY, label: 'ungenügend' },
1577 ],
1578 },
1579 HCM: {
1580 kfz: [
1581 { grade: 'A', maxDelay: 10, label: 'sehr gut' },
1582 { grade: 'B', maxDelay: 20, label: 'gut' },
1583 { grade: 'C', maxDelay: 35, label: 'befriedigend' },
1584 { grade: 'D', maxDelay: 55, label: 'ausreichend' },
1585 { grade: 'E', maxDelay: 80, label: 'mangelhaft' },
1586 { grade: 'F', maxDelay: Number.POSITIVE_INFINITY, label: 'ungenügend' },
1587 ],
1588 },
1589 };
1590
1591 /** Beschriftung der Stufe F bei Ueberlastung (Kfz nach HBS 2015 / HCM 2010). */
1592 export const SERVICE_LEVEL_F_UEBERLASTET: ServiceLevelStep = {
1593 grade: 'F',
1594 maxDelay: Number.POSITIVE_INFINITY,
1595 label: 'ungenügend (überlastet)',
1596 };
1597
1598 /**
1599 * Name des Bewertungsverfahrens - dieselbe Benennung am Bildschirm, im
1600 * Ausdruck, in der Tabellenausgabe und im Pruefbericht. Vor Fassung
1601 * 5.4.0 schrieb der Ausdruck "Bewertung nach HBS 2015", die Tabelle nur
1602 * "HBS" - fuer eine Rechnung, die in Wahrheit die HCM-Formel war. Die
1603 * Benennung darf deshalb nirgends mehr frei formuliert werden.
1604 */
1605 export const BEWERTUNGSVERFAHREN_LABELS: Readonly<Record<'HBS' | 'HCM', string>> = {
1606 HBS: 'HBS 2015',
1607 HCM: 'HCM',
1608 };
1609
1610 /**
1611 * Woran eine Stufe gemessen wurde. Ein blosses "D" sagt nicht, ob eine
1612 * mittlere Wartezeit von 60 s (Kfz) oder eine laengste Sperrzeit von 60 s
1613 * (Fussgaenger) dahintersteht - und ein "F" nicht, ob es an der Wartezeit oder
1614 * an q > C liegt. Das Kriterium gehoert deshalb neben jede gedruckte Stufe.
1615 */
1616 export const KRITERIUM_LABELS: Readonly<
1617 Record<'mittlere-wartezeit' | 'maximale-wartezeit' | 'ueberlastung', string>
1618 > = {
1619 'mittlere-wartezeit': 'mittlere Wartezeit',
1620 'maximale-wartezeit': 'maximale Wartezeit',
1621 ueberlastung: 'Überlastung (q > C)',
1622 };
1623
1624 /** Beschriftungen der Verkehrsarten fuer die Oberflaeche und den Ausdruck. */
1625 export const TRAFFIC_MODE_LABELS: Readonly<Record<TrafficMode, string>> = {
1626 kfz: 'Kraftfahrzeuge',
1627 rad: 'Radverkehr',
1628 fuss: 'Fußgänger',
1629 oepnv: 'ÖPNV',
1630 };
1631
1632 /** Beschriftungen der Fahrbeziehungen. */
1633 export const MOVEMENT_LABELS: Readonly<Record<Movement, string>> = {
1634 geradeaus: 'geradeaus',
1635 rechts: 'rechts abbiegend',
1636 links: 'links abbiegend',
1637 querung: 'querend',
1638 };
1639
1640 /** Benennung der Fahrzeugarten, ohne Laengenangabe. */
1641 export const VEHICLE_CLASS_NAMES: Readonly<Record<VehicleClass, string>> = {
1642 pkw: 'Pkw',
1643 lkw: 'Lkw',
1644 bus: 'Bus',
1645 lastzug: 'Lastzug',
1646 strassenbahn: 'Straßenbahn',
1647 rad: 'Fahrrad',
1648 keine: 'ohne Längenzuschlag',
1649 };
1650
1651 /**
1652 * Fahrzeugart mit dem Laengenzuschlag, der TATSAECHLICH angesetzt wird.
1653 *
1654 * Die Zahl darf nicht fest in der Beschriftung stehen. Der Zuschlag ist ueber
1655 * die Vorgabenverwaltung einstellbar (vehicleLengthPkw bis vehicleLengthRad),
1656 * und eine feste Beschriftung widerlegt sich dann im selben Dokument selbst:
1657 * Die Signalgruppentabelle sagte "Lastzug (18,75 m)", waehrend die Tabelle mit
1658 * dem Rechenweg zwei Seiten weiter mit 22 m rechnete und die Abweichungstabelle
1659 * daneben "Angesetzt: 22 m, Regelwert: 18,75 m" auswies. Ebenso "Fahrrad (kein
1660 * Zuschlag)" bei einem eingestellten Zuschlag von 2,5 m.
1661 */
1662 export function fahrzeugartBeschriftung(
1663 vehicleClass: VehicleClass,
1664 defaults: RilsaDefaults = RILSA_DEFAULTS,
1665 ): string {
1666 const name = VEHICLE_CLASS_NAMES[vehicleClass] as string | undefined;
1667 const zuschlag = defaults.vehicleLength[vehicleClass] as number | undefined;
1668 /*
1669 * Unbekannte Fahrzeugart (nur an der Schema-Reparatur vorbei erreichbar):
1670 * Hier stand `?? 0` und ergab "undefined (kein Zuschlag)" - waehrend die
1671 * Zwischenzeit fuer sie mit der Kfz-Rechenlaenge rechnet und der Bericht
1672 * einen Fehler fuehrt (Fassung 5.4.0, Befund C8). Genau der Widerspruch, den
1673 * dieser Docblock verbietet. Die Beschriftung nennt deshalb keine Zahl, die
1674 * sie nicht kennt (fuer Fussgaenger bleibt es bei 0 m, fuer Kraftfahrzeuge
1675 * sind es 6 m), sondern den Zustand und den Ort, an dem der Zuschlag steht.
1676 */
1677 if (name === undefined || zuschlag === undefined) {
1678 return `unbekannte Fahrzeugart „${String(vehicleClass)}“ – Längenzuschlag siehe Prüfbericht`;
1679 }
1680 if (vehicleClass === 'keine') return name;
1681 // Ohne Zugriff auf die Anzeigeschicht: Das Dezimalkomma wird hier gesetzt.
1682 return zuschlag > 0
1683 ? `${name} (${String(zuschlag).replace('.', ',')} m)`
1684 : `${name} (kein Zuschlag)`;
1685 }