feat(iace): Sprint 4A — Residual Risk Modeling (Suppression Engine)

RiskReduction Struct + automatische Risk Trajectory:
- RiskReduction{SeverityDelta, ExposureDelta, ProbabilityDelta} auf ProtectiveMeasureEntry
- CalculateRiskTrajectory() in engine.go: berechnet schrittweise Risikoreduktion
  entlang ISO 12100 Hierarchie (design → protection → information)
- Kumulative Deltas pro Stufe, Clamp auf Minimum 1
- RiskTrajectoryStep mit Stage, S/E/P, Score, Level, IsAcceptable

101 Massnahmen mit RiskReduction-Profilen versehen:
- Design/Geometry (M001-M010): S-1, E-1 (Gefahrstelle eliminiert)
- Design/Force (M011-M022): S-2 (Energie/Kraft reduziert)
- Design/Control (M039-M050): P-2 (sichere Steuerung)
- Protection/Guards (M061-M072): E-2 (Zugang verhindert)
- Protection/Electro (M073-M079): E-1, P-1 (Erkennung)
- Protection/Safety (M105-M113): P-2 (sichere SPS)
- Protection/Monitoring (M114-M120): P-1 (Frueerkennung)
- Protection/Cyber (M121-M130): P-1
- Information/Training (M161-M168): P-1
- Information/PPE (M169-M175): S-1

8 neue Tests: NoMeasures, DesignReduce, FullHierarchy, ClampMin1,
  OnlyProtection, WithoutReduction, MandatoryAsProtective, LibraryCount

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-05-10 09:15:43 +02:00
parent 05d98ea95f
commit 6d2616cad7
5 changed files with 348 additions and 103 deletions
+67
View File
@@ -123,6 +123,73 @@ func (e *RiskEngine) CalculateResidualRisk(severity, exposure, probability int,
return inherent * (1 - cEff) return inherent * (1 - cEff)
} }
// RiskTrajectoryStep represents one step in the risk reduction trajectory.
type RiskTrajectoryStep struct {
Stage string `json:"stage"` // "inherent", "after_design", "after_protection", "after_information"
Severity int `json:"severity"`
Exposure int `json:"exposure"`
Probability int `json:"probability"`
RiskScore float64 `json:"risk_score"`
RiskLevel string `json:"risk_level"`
IsAcceptable bool `json:"is_acceptable"`
}
// CalculateRiskTrajectory computes the step-by-step risk reduction when measures
// are applied in ISO 12100 hierarchy order: design → protection → information.
// Each measure's RiskReduction deltas are cumulated per stage.
// Parameters are clamped to minimum 1 after each stage.
func (e *RiskEngine) CalculateRiskTrajectory(
severity, exposure, probability int,
measures []ProtectiveMeasureEntry,
) []RiskTrajectoryStep {
s, ex, p := clamp(severity, 1, 5), clamp(exposure, 1, 5), clamp(probability, 1, 5)
// Inherent risk (no measures)
steps := []RiskTrajectoryStep{{
Stage: "inherent", Severity: s, Exposure: ex, Probability: p,
RiskScore: float64(s * ex * p),
RiskLevel: string(e.DetermineRiskLevel(float64(s * ex * p))),
}}
// Group measures by reduction type in hierarchy order
stages := []struct {
name string
rtype string
}{
{"after_design", "design"},
{"after_protection", "protection"},
{"after_protection", "protective"}, // MandatoryNorm measures use "protective"
{"after_information", "information"},
}
for _, stage := range stages {
dS, dE, dP := 0, 0, 0
for _, m := range measures {
if m.ReductionType != stage.rtype || m.RiskReduction == nil {
continue
}
dS += m.RiskReduction.SeverityDelta
dE += m.RiskReduction.ExposureDelta
dP += m.RiskReduction.ProbabilityDelta
}
if dS == 0 && dE == 0 && dP == 0 {
continue
}
s = clamp(s+dS, 1, 5)
ex = clamp(ex+dE, 1, 5)
p = clamp(p+dP, 1, 5)
score := float64(s * ex * p)
level := e.DetermineRiskLevel(score)
steps = append(steps, RiskTrajectoryStep{
Stage: stage.name, Severity: s, Exposure: ex, Probability: p,
RiskScore: score, RiskLevel: string(level),
IsAcceptable: score < 15,
})
}
return steps
}
// DetermineRiskLevel classifies the residual risk into a RiskLevel category. // DetermineRiskLevel classifies the residual risk into a RiskLevel category.
// //
// Thresholds: // Thresholds:
@@ -25,30 +25,30 @@ func GetProtectiveMeasureLibrary() []ProtectiveMeasureEntry {
func getDesignMeasures() []ProtectiveMeasureEntry { func getDesignMeasures() []ProtectiveMeasureEntry {
return []ProtectiveMeasureEntry{ return []ProtectiveMeasureEntry{
// ── Geometry (M001-M010) ───────────────────────────────────────────── // ── Geometry (M001-M010) ─────────────────────────────────────────────
{ID: "M001", ReductionType: "design", SubType: "geometry", Name: "Gefahrstelle konstruktiv eliminieren", Description: "Durch konstruktive Gestaltung wird die Gefahrstelle vollstaendig beseitigt.", HazardCategory: "mechanical", Examples: []string{"Quetschstelle durch Geometrieaenderung entfernen", "Einzugsstelle durch vergroesserten Spalt eliminieren"}, NormReferences: []string{"ISO 12100 — Inhaerent sichere Konstruktion"}}, {ID: "M001", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}, ReductionType: "design", SubType: "geometry", Name: "Gefahrstelle konstruktiv eliminieren", Description: "Durch konstruktive Gestaltung wird die Gefahrstelle vollstaendig beseitigt.", HazardCategory: "mechanical", Examples: []string{"Quetschstelle durch Geometrieaenderung entfernen", "Einzugsstelle durch vergroesserten Spalt eliminieren"}, NormReferences: []string{"ISO 12100 — Inhaerent sichere Konstruktion"}},
{ID: "M002", ReductionType: "design", SubType: "geometry", Name: "Sicherheitsabstaende vergroessern", Description: "Abstaende zwischen Gefahrstellen und zugaenglichen Bereichen werden nach Norm dimensioniert.", HazardCategory: "mechanical", Examples: []string{"Greifabstand an Walzen vergroessern", "Abstand zu heissen Oberflaechen erhoehen"}, NormReferences: []string{"ISO 13857", "ISO 13854"}}, {ID: "M002", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}, ReductionType: "design", SubType: "geometry", Name: "Sicherheitsabstaende vergroessern", Description: "Abstaende zwischen Gefahrstellen und zugaenglichen Bereichen werden nach Norm dimensioniert.", HazardCategory: "mechanical", Examples: []string{"Greifabstand an Walzen vergroessern", "Abstand zu heissen Oberflaechen erhoehen"}, NormReferences: []string{"ISO 13857", "ISO 13854"}},
{ID: "M003", ReductionType: "design", SubType: "geometry", Name: "Scharfe Kanten entfernen", Description: "Alle zugaenglichen Kanten werden abgerundet oder entgratet.", HazardCategory: "mechanical", Examples: []string{"Radien an Blechkanten anbringen", "Entgratung aller Stanzteile sicherstellen"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}}, {ID: "M003", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}, ReductionType: "design", SubType: "geometry", Name: "Scharfe Kanten entfernen", Description: "Alle zugaenglichen Kanten werden abgerundet oder entgratet.", HazardCategory: "mechanical", Examples: []string{"Radien an Blechkanten anbringen", "Entgratung aller Stanzteile sicherstellen"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}},
{ID: "M004", ReductionType: "design", SubType: "geometry", Name: "Sichere Geometrie", Description: "Die Bauteilgeometrie vermeidet Quetsch-, Scher- und Einzugsstellen.", HazardCategory: "mechanical", Examples: []string{"Abgerundete Formteile statt scharfkantiger verwenden", "Spaltmasse an Fuehrungen einhalten"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}}, {ID: "M004", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}, ReductionType: "design", SubType: "geometry", Name: "Sichere Geometrie", Description: "Die Bauteilgeometrie vermeidet Quetsch-, Scher- und Einzugsstellen.", HazardCategory: "mechanical", Examples: []string{"Abgerundete Formteile statt scharfkantiger verwenden", "Spaltmasse an Fuehrungen einhalten"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}},
{ID: "M005", ReductionType: "design", SubType: "geometry", Name: "Rotationsbewegung vermeiden", Description: "Rotierende Teile werden durch Alternativloesungen ersetzt.", HazardCategory: "mechanical", Examples: []string{"Linearantrieb statt Drehantrieb verwenden", "Riemenantrieb durch Zahnstange ersetzen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, {ID: "M005", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}, ReductionType: "design", SubType: "geometry", Name: "Rotationsbewegung vermeiden", Description: "Rotierende Teile werden durch Alternativloesungen ersetzt.", HazardCategory: "mechanical", Examples: []string{"Linearantrieb statt Drehantrieb verwenden", "Riemenantrieb durch Zahnstange ersetzen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}},
{ID: "M006", ReductionType: "design", SubType: "geometry", Name: "Kollisionsfreie Bewegungsbahnen", Description: "Bewegungsbahnen werden so geplant, dass Kollisionen mit Personen ausgeschlossen sind.", HazardCategory: "mechanical", Examples: []string{"Verfahrwege ausserhalb des Bedienerbereichs legen", "Bewegungsbahnen in der Simulation pruefen"}, NormReferences: []string{"ISO 12100 — Allgemeine technische Kenntnisse"}}, {ID: "M006", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}, ReductionType: "design", SubType: "geometry", Name: "Kollisionsfreie Bewegungsbahnen", Description: "Bewegungsbahnen werden so geplant, dass Kollisionen mit Personen ausgeschlossen sind.", HazardCategory: "mechanical", Examples: []string{"Verfahrwege ausserhalb des Bedienerbereichs legen", "Bewegungsbahnen in der Simulation pruefen"}, NormReferences: []string{"ISO 12100 — Allgemeine technische Kenntnisse"}},
{ID: "M007", ReductionType: "design", SubType: "geometry", Name: "Sichere Greiferkonstruktion", Description: "Greifersysteme verhindern unkontrolliertes Freisetzen von Werkstuecken.", HazardCategory: "mechanical", Examples: []string{"Formschluessige Greiferbacken verwenden", "Federbelastete Greifer fuer Fail-Safe"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung", "ISO 10218-2"}}, {ID: "M007", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}, ReductionType: "design", SubType: "geometry", Name: "Sichere Greiferkonstruktion", Description: "Greifersysteme verhindern unkontrolliertes Freisetzen von Werkstuecken.", HazardCategory: "mechanical", Examples: []string{"Formschluessige Greiferbacken verwenden", "Federbelastete Greifer fuer Fail-Safe"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung", "ISO 10218-2"}},
{ID: "M008", ReductionType: "design", SubType: "geometry", Name: "Sichere Werkstueckaufnahme", Description: "Werkstueckaufnahmen verhindern Herausschleudern bei allen Betriebszustaenden.", HazardCategory: "mechanical", Examples: []string{"Spannvorrichtung mit Formschluss", "Automatische Spannkontrolle integrieren"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}}, {ID: "M008", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}, ReductionType: "design", SubType: "geometry", Name: "Sichere Werkstueckaufnahme", Description: "Werkstueckaufnahmen verhindern Herausschleudern bei allen Betriebszustaenden.", HazardCategory: "mechanical", Examples: []string{"Spannvorrichtung mit Formschluss", "Automatische Spannkontrolle integrieren"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}},
{ID: "M009", ReductionType: "design", SubType: "geometry", Name: "Sichere Kabelfuehrung", Description: "Elektrische Leitungen werden vor mechanischer Beschaedigung und Hitze geschuetzt.", HazardCategory: "electrical", Examples: []string{"Kabelkanaele mit Deckel verwenden", "Leitungen in Schleppketten fuehren"}, NormReferences: []string{"IEC 60204-1", "ISO 12100 — Minimierung Fehlerwahrscheinlichkeit"}}, {ID: "M009", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}, ReductionType: "design", SubType: "geometry", Name: "Sichere Kabelfuehrung", Description: "Elektrische Leitungen werden vor mechanischer Beschaedigung und Hitze geschuetzt.", HazardCategory: "electrical", Examples: []string{"Kabelkanaele mit Deckel verwenden", "Leitungen in Schleppketten fuehren"}, NormReferences: []string{"IEC 60204-1", "ISO 12100 — Minimierung Fehlerwahrscheinlichkeit"}},
{ID: "M010", ReductionType: "design", SubType: "geometry", Name: "Sichere Sensorposition", Description: "Sensoren werden zuverlaessig messend und vor mechanischer Beschaedigung geschuetzt positioniert.", HazardCategory: "software_control", Examples: []string{"Sensoren in geschuetzten Nischen montieren", "Sensoren ausserhalb des Gefahrbereichs platzieren"}, NormReferences: []string{"ISO 12100 — Sicherheitsbezogene Steuerungssysteme"}}, {ID: "M010", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}, ReductionType: "design", SubType: "geometry", Name: "Sichere Sensorposition", Description: "Sensoren werden zuverlaessig messend und vor mechanischer Beschaedigung geschuetzt positioniert.", HazardCategory: "software_control", Examples: []string{"Sensoren in geschuetzten Nischen montieren", "Sensoren ausserhalb des Gefahrbereichs platzieren"}, NormReferences: []string{"ISO 12100 — Sicherheitsbezogene Steuerungssysteme"}},
// ── Force / Energy (M011-M022) ────────────────────────────────────── // ── Force / Energy (M011-M022) ──────────────────────────────────────
{ID: "M011", ReductionType: "design", SubType: "force_energy", Name: "Bewegungsenergie reduzieren", Description: "Kinetische Energie beweglicher Maschinenteile wird auf ein sicheres Niveau begrenzt.", HazardCategory: "mechanical", Examples: []string{"Masse beweglicher Teile verringern", "Hublaenge verkuerzen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, {ID: "M011", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Bewegungsenergie reduzieren", Description: "Kinetische Energie beweglicher Maschinenteile wird auf ein sicheres Niveau begrenzt.", HazardCategory: "mechanical", Examples: []string{"Masse beweglicher Teile verringern", "Hublaenge verkuerzen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}},
{ID: "M012", ReductionType: "design", SubType: "force_energy", Name: "Geschwindigkeit reduzieren", Description: "Verfahrgeschwindigkeit wird konstruktiv auf ein verletzungssicheres Niveau begrenzt.", HazardCategory: "mechanical", Examples: []string{"Maximale Achsgeschwindigkeit mechanisch begrenzen", "Drehzahlbegrenzer einbauen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, {ID: "M012", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Geschwindigkeit reduzieren", Description: "Verfahrgeschwindigkeit wird konstruktiv auf ein verletzungssicheres Niveau begrenzt.", HazardCategory: "mechanical", Examples: []string{"Maximale Achsgeschwindigkeit mechanisch begrenzen", "Drehzahlbegrenzer einbauen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}},
{ID: "M013", ReductionType: "design", SubType: "force_energy", Name: "Kraft begrenzen", Description: "Die maximal auftretende Kraft wird konstruktiv so begrenzt, dass keine Verletzungsgefahr besteht.", HazardCategory: "mechanical", Examples: []string{"Federbelastete Kraftbegrenzung einsetzen", "Antriebsdrehmoment begrenzen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten", "ISO/TS 15066"}}, {ID: "M013", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Kraft begrenzen", Description: "Die maximal auftretende Kraft wird konstruktiv so begrenzt, dass keine Verletzungsgefahr besteht.", HazardCategory: "mechanical", Examples: []string{"Federbelastete Kraftbegrenzung einsetzen", "Antriebsdrehmoment begrenzen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten", "ISO/TS 15066"}},
{ID: "M014", ReductionType: "design", SubType: "force_energy", Name: "Kinematik aendern", Description: "Bewegungsart oder -richtung wird umgestaltet, sodass die Gefaehrdung entfaellt.", HazardCategory: "mechanical", Examples: []string{"Linearbewegung statt Rotation einsetzen", "Bewegungsrichtung von Bedienerseite wegfuehren"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, {ID: "M014", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Kinematik aendern", Description: "Bewegungsart oder -richtung wird umgestaltet, sodass die Gefaehrdung entfaellt.", HazardCategory: "mechanical", Examples: []string{"Linearbewegung statt Rotation einsetzen", "Bewegungsrichtung von Bedienerseite wegfuehren"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}},
{ID: "M015", ReductionType: "design", SubType: "force_energy", Name: "Gewicht reduzieren", Description: "Gewicht beweglicher Maschinenteile wird minimiert zur Verringerung der Verletzungsschwere.", HazardCategory: "mechanical", Examples: []string{"Leichtbauwerkstoffe fuer bewegliche Arme", "Hohlprofile statt Vollmaterial"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, {ID: "M015", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Gewicht reduzieren", Description: "Gewicht beweglicher Maschinenteile wird minimiert zur Verringerung der Verletzungsschwere.", HazardCategory: "mechanical", Examples: []string{"Leichtbauwerkstoffe fuer bewegliche Arme", "Hohlprofile statt Vollmaterial"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}},
{ID: "M016", ReductionType: "design", SubType: "force_energy", Name: "Redundante Konstruktion", Description: "Sicherheitskritische Bauteile sind mehrfach ausgefuehrt fuer Ausfallsicherheit.", HazardCategory: "mechanical", Examples: []string{"Doppelte Tragseile an Hebezeugen", "Redundante Bremssysteme vorsehen"}, NormReferences: []string{"ISO 12100 — Allgemeine technische Kenntnisse", "ISO 13849-1"}}, {ID: "M016", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Redundante Konstruktion", Description: "Sicherheitskritische Bauteile sind mehrfach ausgefuehrt fuer Ausfallsicherheit.", HazardCategory: "mechanical", Examples: []string{"Doppelte Tragseile an Hebezeugen", "Redundante Bremssysteme vorsehen"}, NormReferences: []string{"ISO 12100 — Allgemeine technische Kenntnisse", "ISO 13849-1"}},
{ID: "M017", ReductionType: "design", SubType: "force_energy", Name: "Mechanische Begrenzung", Description: "Feste mechanische Anschlaege begrenzen den Bewegungsbereich.", HazardCategory: "mechanical", Examples: []string{"Feste Endanschlaege an Linearachsen", "Drehwinkelbegrenzung an Drehachsen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, {ID: "M017", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Mechanische Begrenzung", Description: "Feste mechanische Anschlaege begrenzen den Bewegungsbereich.", HazardCategory: "mechanical", Examples: []string{"Feste Endanschlaege an Linearachsen", "Drehwinkelbegrenzung an Drehachsen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}},
{ID: "M018", ReductionType: "design", SubType: "force_energy", Name: "Schwerkraftsichere Konstruktion", Description: "Konstruktion verhindert unkontrollierte Bewegung durch Schwerkraft bei Energieausfall.", HazardCategory: "mechanical", Examples: []string{"Lasthalteventile in Hubzylindern", "Federspeicherbremsen an Vertikalachsen"}, NormReferences: []string{"ISO 12100 — Allgemeine technische Kenntnisse", "EN 693"}}, {ID: "M018", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Schwerkraftsichere Konstruktion", Description: "Konstruktion verhindert unkontrollierte Bewegung durch Schwerkraft bei Energieausfall.", HazardCategory: "mechanical", Examples: []string{"Lasthalteventile in Hubzylindern", "Federspeicherbremsen an Vertikalachsen"}, NormReferences: []string{"ISO 12100 — Allgemeine technische Kenntnisse", "EN 693"}},
{ID: "M019", ReductionType: "design", SubType: "force_energy", Name: "Energiebegrenzung", Description: "Die gesamt verfuegbare Energie im System wird konstruktiv auf ein sicheres Niveau begrenzt.", HazardCategory: "mechanical", Examples: []string{"Kleine Pneumatikzylinder statt grosser verwenden", "Niedrigdruck-Hydraulik einsetzen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}}, {ID: "M019", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Energiebegrenzung", Description: "Die gesamt verfuegbare Energie im System wird konstruktiv auf ein sicheres Niveau begrenzt.", HazardCategory: "mechanical", Examples: []string{"Kleine Pneumatikzylinder statt grosser verwenden", "Niedrigdruck-Hydraulik einsetzen"}, NormReferences: []string{"ISO 12100 — Physikalische Kenndaten"}},
{ID: "M020", ReductionType: "design", SubType: "force_energy", Name: "Sichere Energieuebertragung", Description: "Energieleitungen werden so verlegt, dass Leckagen oder Brueche keine Gefaehrdung darstellen.", HazardCategory: "electrical", Examples: []string{"Schleppketten fuer flexible Leitungen", "Doppelwandige Druckleitungen verwenden"}, NormReferences: []string{"ISO 12100 — Minimierung Fehlerwahrscheinlichkeit"}}, {ID: "M020", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Sichere Energieuebertragung", Description: "Energieleitungen werden so verlegt, dass Leckagen oder Brueche keine Gefaehrdung darstellen.", HazardCategory: "electrical", Examples: []string{"Schleppketten fuer flexible Leitungen", "Doppelwandige Druckleitungen verwenden"}, NormReferences: []string{"ISO 12100 — Minimierung Fehlerwahrscheinlichkeit"}},
{ID: "M021", ReductionType: "design", SubType: "force_energy", Name: "Nachgiebige Elemente", Description: "Maschinenteile im Kontaktbereich werden nachgiebig gestaltet zur Verletzungsminimierung.", HazardCategory: "mechanical", Examples: []string{"Polsterungen an Klemmpunkten", "Federnd gelagerte Anschlaege"}, NormReferences: []string{"ISO/TS 15066", "ISO 12100 — Physikalische Kenndaten"}}, {ID: "M021", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Nachgiebige Elemente", Description: "Maschinenteile im Kontaktbereich werden nachgiebig gestaltet zur Verletzungsminimierung.", HazardCategory: "mechanical", Examples: []string{"Polsterungen an Klemmpunkten", "Federnd gelagerte Anschlaege"}, NormReferences: []string{"ISO/TS 15066", "ISO 12100 — Physikalische Kenndaten"}},
{ID: "M022", ReductionType: "design", SubType: "force_energy", Name: "Sichere Kraftuebertragung", Description: "Kraftuebertragungselemente sind gesichert gegen Bruch oder Loesen.", HazardCategory: "mechanical", Examples: []string{"Wellensicherungen gegen Axialverschiebung", "Sicherheitswellen mit Sollbruchstelle"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}}, {ID: "M022", RiskReduction: &RiskReduction{SeverityDelta: -2}, ReductionType: "design", SubType: "force_energy", Name: "Sichere Kraftuebertragung", Description: "Kraftuebertragungselemente sind gesichert gegen Bruch oder Loesen.", HazardCategory: "mechanical", Examples: []string{"Wellensicherungen gegen Axialverschiebung", "Sicherheitswellen mit Sollbruchstelle"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}},
// ── Material (M023-M028) ──────────────────────────────────────────── // ── Material (M023-M028) ────────────────────────────────────────────
{ID: "M023", ReductionType: "design", SubType: "material", Name: "Sichere Materialwahl", Description: "Werkstoffe werden so gewaehlt, dass sie keine zusaetzlichen Gefaehrdungen verursachen.", HazardCategory: "material_environmental", Examples: []string{"Nicht-toxische Kunststoffe waehlen", "Korrosionsbestaendige Legierungen einsetzen"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}}, {ID: "M023", ReductionType: "design", SubType: "material", Name: "Sichere Materialwahl", Description: "Werkstoffe werden so gewaehlt, dass sie keine zusaetzlichen Gefaehrdungen verursachen.", HazardCategory: "material_environmental", Examples: []string{"Nicht-toxische Kunststoffe waehlen", "Korrosionsbestaendige Legierungen einsetzen"}, NormReferences: []string{"ISO 12100 — Geometrie und Anordnung"}},
@@ -71,18 +71,18 @@ func getDesignMeasures() []ProtectiveMeasureEntry {
{ID: "M038", ReductionType: "design", SubType: "ergonomics", Name: "Vibrationsarme Konstruktion", Description: "Vibrationen und Koerperschall werden an der Quelle minimiert.", HazardCategory: "noise_vibration", Examples: []string{"Schwingungsdaempfer an Motoren", "Elastische Maschinenlagerung"}, NormReferences: []string{"ISO 5349-1", "EN 1032"}}, {ID: "M038", ReductionType: "design", SubType: "ergonomics", Name: "Vibrationsarme Konstruktion", Description: "Vibrationen und Koerperschall werden an der Quelle minimiert.", HazardCategory: "noise_vibration", Examples: []string{"Schwingungsdaempfer an Motoren", "Elastische Maschinenlagerung"}, NormReferences: []string{"ISO 5349-1", "EN 1032"}},
// ── Control Design (M039-M050) ────────────────────────────────────── // ── Control Design (M039-M050) ──────────────────────────────────────
{ID: "M039", ReductionType: "design", SubType: "control_design", Name: "Sichere Software-Fallbacks", Description: "Steuerungssoftware enthaelt Rueckfallstrategien fuer sichere Zustaende bei Fehlern.", HazardCategory: "software_control", Examples: []string{"Standardwerte bei Sensorausfall", "Sicherer Stopp bei unplausiblen Daten"}, NormReferences: []string{"IEC 62443-4-1", "ISO 13849-1"}}, {ID: "M039", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Sichere Software-Fallbacks", Description: "Steuerungssoftware enthaelt Rueckfallstrategien fuer sichere Zustaende bei Fehlern.", HazardCategory: "software_control", Examples: []string{"Standardwerte bei Sensorausfall", "Sicherer Stopp bei unplausiblen Daten"}, NormReferences: []string{"IEC 62443-4-1", "ISO 13849-1"}},
{ID: "M040", ReductionType: "design", SubType: "control_design", Name: "Deterministische Steuerungslogik", Description: "Steuerungslogik erzeugt bei identischen Eingaben immer identische Ausgaben.", HazardCategory: "software_control", Examples: []string{"Keine Zufallselemente in Sicherheitsfunktionen", "Feste Zykluszeiten fuer Safety-Tasks"}, NormReferences: []string{"IEC 61508-3", "IEC 62443-4-1"}}, {ID: "M040", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Deterministische Steuerungslogik", Description: "Steuerungslogik erzeugt bei identischen Eingaben immer identische Ausgaben.", HazardCategory: "software_control", Examples: []string{"Keine Zufallselemente in Sicherheitsfunktionen", "Feste Zykluszeiten fuer Safety-Tasks"}, NormReferences: []string{"IEC 61508-3", "IEC 62443-4-1"}},
{ID: "M041", ReductionType: "design", SubType: "control_design", Name: "Definierte Zustandsmaschine", Description: "Alle Maschinenzustaende und Uebergaenge sind vollstaendig definiert und abgesichert.", HazardCategory: "software_control", Examples: []string{"Zustandsdiagramm erstellen", "Ungueltige Uebergaenge softwareseitig blockieren"}, NormReferences: []string{"IEC 61508-3", "ISO 13849-1"}}, {ID: "M041", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Definierte Zustandsmaschine", Description: "Alle Maschinenzustaende und Uebergaenge sind vollstaendig definiert und abgesichert.", HazardCategory: "software_control", Examples: []string{"Zustandsdiagramm erstellen", "Ungueltige Uebergaenge softwareseitig blockieren"}, NormReferences: []string{"IEC 61508-3", "ISO 13849-1"}},
{ID: "M042", ReductionType: "design", SubType: "control_design", Name: "Sichere Restart-Logik", Description: "Neustart nur durch bewusste Bedienerhandlung, kein automatischer Wiederanlauf.", HazardCategory: "software_control", Examples: []string{"Automatischen Wiederanlauf nach Netzausfall verhindern", "Quittierungspflicht vor Neustart"}, NormReferences: []string{"ISO 12100 — Stillsetzen im Notfall", "IEC 60204-1"}}, {ID: "M042", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Sichere Restart-Logik", Description: "Neustart nur durch bewusste Bedienerhandlung, kein automatischer Wiederanlauf.", HazardCategory: "software_control", Examples: []string{"Automatischen Wiederanlauf nach Netzausfall verhindern", "Quittierungspflicht vor Neustart"}, NormReferences: []string{"ISO 12100 — Stillsetzen im Notfall", "IEC 60204-1"}},
{ID: "M043", ReductionType: "design", SubType: "control_design", Name: "Sichere Fehlermodi", Description: "Jeder erkannte Fehler fuehrt automatisch in einen vordefinierten sicheren Zustand.", HazardCategory: "software_control", Examples: []string{"Fail-Safe bei Sensorausfall", "Fehlerkatalog mit sicheren Zustaenden"}, NormReferences: []string{"ISO 13849-1", "IEC 62061"}}, {ID: "M043", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Sichere Fehlermodi", Description: "Jeder erkannte Fehler fuehrt automatisch in einen vordefinierten sicheren Zustand.", HazardCategory: "software_control", Examples: []string{"Fail-Safe bei Sensorausfall", "Fehlerkatalog mit sicheren Zustaenden"}, NormReferences: []string{"ISO 13849-1", "IEC 62061"}},
{ID: "M044", ReductionType: "design", SubType: "control_design", Name: "Zweikanalige Steuerung", Description: "Sicherheitsfunktionen werden ueber zwei unabhaengige Kanaele ausgefuehrt.", HazardCategory: "software_control", Examples: []string{"Kategorie-3/4-Architektur nach ISO 13849", "Zwei getrennte Abschaltpfade"}, NormReferences: []string{"ISO 13849-1", "IEC 62061"}}, {ID: "M044", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Zweikanalige Steuerung", Description: "Sicherheitsfunktionen werden ueber zwei unabhaengige Kanaele ausgefuehrt.", HazardCategory: "software_control", Examples: []string{"Kategorie-3/4-Architektur nach ISO 13849", "Zwei getrennte Abschaltpfade"}, NormReferences: []string{"ISO 13849-1", "IEC 62061"}},
{ID: "M045", ReductionType: "design", SubType: "control_design", Name: "Steuerungstechnische Sicherheit", Description: "Steuerungsarchitektur ist auf Fehlererkennung und sichere Reaktion ausgelegt.", HazardCategory: "software_control", Examples: []string{"Cross-Monitoring zwischen Kanaelen", "Diversitaere Signalverarbeitung"}, NormReferences: []string{"ISO 13849-1", "IEC 61508"}}, {ID: "M045", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Steuerungstechnische Sicherheit", Description: "Steuerungsarchitektur ist auf Fehlererkennung und sichere Reaktion ausgelegt.", HazardCategory: "software_control", Examples: []string{"Cross-Monitoring zwischen Kanaelen", "Diversitaere Signalverarbeitung"}, NormReferences: []string{"ISO 13849-1", "IEC 61508"}},
{ID: "M046", ReductionType: "design", SubType: "control_design", Name: "Sichere Energieabschaltung", Description: "Maschine kann jederzeit sicher von allen Energiequellen getrennt werden.", HazardCategory: "electrical", Examples: []string{"Hauptschalter mit Absperrmoeglichkeit", "Pneumatik-Absperrventil am Eingang"}, NormReferences: []string{"IEC 60204-1", "ISO 12100 — Automatisierungstechnik"}}, {ID: "M046", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Sichere Energieabschaltung", Description: "Maschine kann jederzeit sicher von allen Energiequellen getrennt werden.", HazardCategory: "electrical", Examples: []string{"Hauptschalter mit Absperrmoeglichkeit", "Pneumatik-Absperrventil am Eingang"}, NormReferences: []string{"IEC 60204-1", "ISO 12100 — Automatisierungstechnik"}},
{ID: "M047", ReductionType: "design", SubType: "control_design", Name: "Sichere Energieentladung", Description: "Alle gespeicherten Energien werden nach Abschalten kontrolliert abgebaut.", HazardCategory: "electrical", Examples: []string{"Kondensatoren ueber Entladewiderstaende", "Druckspeicher ueber Entlastungsventil"}, NormReferences: []string{"IEC 60204-1 — Trennen und Ausschalten", "ISO 12100 — Automatisierungstechnik"}}, {ID: "M047", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Sichere Energieentladung", Description: "Alle gespeicherten Energien werden nach Abschalten kontrolliert abgebaut.", HazardCategory: "electrical", Examples: []string{"Kondensatoren ueber Entladewiderstaende", "Druckspeicher ueber Entlastungsventil"}, NormReferences: []string{"IEC 60204-1 — Trennen und Ausschalten", "ISO 12100 — Automatisierungstechnik"}},
{ID: "M048", ReductionType: "design", SubType: "control_design", Name: "Sichere Notzustaende", Description: "Fuer alle Notsituationen sind definierte Zustaende festgelegt.", HazardCategory: "general", Examples: []string{"Not-Halt-Zustand mit definierten Positionen", "Evakuierungszustand mit geoeffneten Schutztoren"}, NormReferences: []string{"ISO 13850", "IEC 60204-1 — Not-Halt-Steuerung"}}, {ID: "M048", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Sichere Notzustaende", Description: "Fuer alle Notsituationen sind definierte Zustaende festgelegt.", HazardCategory: "general", Examples: []string{"Not-Halt-Zustand mit definierten Positionen", "Evakuierungszustand mit geoeffneten Schutztoren"}, NormReferences: []string{"ISO 13850", "IEC 60204-1 — Not-Halt-Steuerung"}},
{ID: "M049", ReductionType: "design", SubType: "control_design", Name: "Sichere Betriebsartenwahl", Description: "Umschaltung zwischen Betriebsarten ist abgesichert und nur kontrolliert moeglich.", HazardCategory: "software_control", Examples: []string{"Schluesselschalter fuer Betriebsarten", "Sichere Betriebsartenerkennung in SPS"}, NormReferences: []string{"ISO 12100 — Sicherheitsbezogene Steuerungssysteme0", "IEC 60204-1"}}, {ID: "M049", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Sichere Betriebsartenwahl", Description: "Umschaltung zwischen Betriebsarten ist abgesichert und nur kontrolliert moeglich.", HazardCategory: "software_control", Examples: []string{"Schluesselschalter fuer Betriebsarten", "Sichere Betriebsartenerkennung in SPS"}, NormReferences: []string{"ISO 12100 — Sicherheitsbezogene Steuerungssysteme0", "IEC 60204-1"}},
{ID: "M050", ReductionType: "design", SubType: "control_design", Name: "Sicherer Anlauf nach Stoerung", Description: "Wiederanlauf nach Stoerung folgt definierter Prozedur mit Bedienerfreigabe.", HazardCategory: "software_control", Examples: []string{"Schrittweiser Anlauf nach Fehler", "Pruefsequenz vor Produktionsfreigabe"}, NormReferences: []string{"ISO 12100 — Stillsetzen im Notfall", "IEC 60204-1"}}, {ID: "M050", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "design", SubType: "control_design", Name: "Sicherer Anlauf nach Stoerung", Description: "Wiederanlauf nach Stoerung folgt definierter Prozedur mit Bedienerfreigabe.", HazardCategory: "software_control", Examples: []string{"Schrittweiser Anlauf nach Fehler", "Pruefsequenz vor Produktionsfreigabe"}, NormReferences: []string{"ISO 12100 — Stillsetzen im Notfall", "IEC 60204-1"}},
// ── Fluid Design (M051-M058) ──────────────────────────────────────── // ── Fluid Design (M051-M058) ────────────────────────────────────────
{ID: "M051", ReductionType: "design", SubType: "fluid_design", Name: "Sichere Hydraulikdimensionierung", Description: "Hydrauliksystem so ausgelegt, dass Druckspitzen keine unkontrollierten Bewegungen verursachen.", HazardCategory: "pneumatic_hydraulic", Examples: []string{"Druckspeicher mit Berstscheibe", "Hydraulikleitungen druckfest dimensioniert"}, NormReferences: []string{"ISO 4413", "ISO 12100 — Minimierung Fehlerwahrscheinlichkeit"}}, {ID: "M051", ReductionType: "design", SubType: "fluid_design", Name: "Sichere Hydraulikdimensionierung", Description: "Hydrauliksystem so ausgelegt, dass Druckspitzen keine unkontrollierten Bewegungen verursachen.", HazardCategory: "pneumatic_hydraulic", Examples: []string{"Druckspeicher mit Berstscheibe", "Hydraulikleitungen druckfest dimensioniert"}, NormReferences: []string{"ISO 4413", "ISO 12100 — Minimierung Fehlerwahrscheinlichkeit"}},
@@ -4,29 +4,29 @@ package iace
func getProtectiveMeasures() []ProtectiveMeasureEntry { func getProtectiveMeasures() []ProtectiveMeasureEntry {
return []ProtectiveMeasureEntry{ return []ProtectiveMeasureEntry{
// ── Fixed Guards (M061-M066) ──────────────────────────────────────── // ── Fixed Guards (M061-M066) ────────────────────────────────────────
{ID: "M061", ReductionType: "protection", SubType: "fixed_guard", Name: "Feste trennende Schutzeinrichtung", Description: "Fest montierte Barriere verhindert Zugang zum Gefahrbereich, nur mit Werkzeug entfernbar.", HazardCategory: "mechanical", Examples: []string{"Verschraubte Schutzverkleidung an Antrieben", "Schutzhaube ueber Riementrieb"}, NormReferences: []string{"ISO 14120", "ISO 12100 — Technische Schutzeinrichtungen"}}, {ID: "M061", RiskReduction: &RiskReduction{ExposureDelta: -2}, ReductionType: "protection", SubType: "fixed_guard", Name: "Feste trennende Schutzeinrichtung", Description: "Fest montierte Barriere verhindert Zugang zum Gefahrbereich, nur mit Werkzeug entfernbar.", HazardCategory: "mechanical", Examples: []string{"Verschraubte Schutzverkleidung an Antrieben", "Schutzhaube ueber Riementrieb"}, NormReferences: []string{"ISO 14120", "ISO 12100 — Technische Schutzeinrichtungen"}},
{ID: "M062", ReductionType: "protection", SubType: "fixed_guard", Name: "Schutzzaun", Description: "Feststehender Zaun umgibt den Gefahrbereich vollstaendig.", HazardCategory: "mechanical", Examples: []string{"Stahlgitterzaun um Roboterzelle", "Polycarbonat-Schutzwand an Drehmaschine"}, NormReferences: []string{"ISO 14120", "ISO 13857"}}, {ID: "M062", RiskReduction: &RiskReduction{ExposureDelta: -2}, ReductionType: "protection", SubType: "fixed_guard", Name: "Schutzzaun", Description: "Feststehender Zaun umgibt den Gefahrbereich vollstaendig.", HazardCategory: "mechanical", Examples: []string{"Stahlgitterzaun um Roboterzelle", "Polycarbonat-Schutzwand an Drehmaschine"}, NormReferences: []string{"ISO 14120", "ISO 13857"}},
{ID: "M063", ReductionType: "protection", SubType: "fixed_guard", Name: "Schutzhaube", Description: "Feststehende Haube kapselt rotierende oder sich bewegende Teile ein.", HazardCategory: "mechanical", Examples: []string{"Schutzhaube ueber Riemenantrieb", "Kapselung ueber Kupplungen"}, NormReferences: []string{"ISO 14120"}}, {ID: "M063", RiskReduction: &RiskReduction{ExposureDelta: -2}, ReductionType: "protection", SubType: "fixed_guard", Name: "Schutzhaube", Description: "Feststehende Haube kapselt rotierende oder sich bewegende Teile ein.", HazardCategory: "mechanical", Examples: []string{"Schutzhaube ueber Riemenantrieb", "Kapselung ueber Kupplungen"}, NormReferences: []string{"ISO 14120"}},
{ID: "M064", ReductionType: "protection", SubType: "fixed_guard", Name: "Schutzverkleidung mit Zugangsschlitz", Description: "Feste Verkleidung mit definierten Oeffnungen begrenzt den Zugang auf zul. Masse.", HazardCategory: "mechanical", Examples: []string{"Materialzufuehr-Schlitz an Presse", "Einlegeoeffnung mit Sicherheitsabstand"}, NormReferences: []string{"ISO 13857", "ISO 14120"}}, {ID: "M064", RiskReduction: &RiskReduction{ExposureDelta: -2}, ReductionType: "protection", SubType: "fixed_guard", Name: "Schutzverkleidung mit Zugangsschlitz", Description: "Feste Verkleidung mit definierten Oeffnungen begrenzt den Zugang auf zul. Masse.", HazardCategory: "mechanical", Examples: []string{"Materialzufuehr-Schlitz an Presse", "Einlegeoeffnung mit Sicherheitsabstand"}, NormReferences: []string{"ISO 13857", "ISO 14120"}},
{ID: "M065", ReductionType: "protection", SubType: "fixed_guard", Name: "Schutzgitter fuer Lueftungsoeffnungen", Description: "Gitter an Lueftungsschlitzen verhindert Hindurchgreifen in rotierende Teile.", HazardCategory: "mechanical", Examples: []string{"Fingerschutzgitter an Lueftern", "Schutzgitter an Motorgehaeuse"}, NormReferences: []string{"ISO 13857", "ISO 14120"}}, {ID: "M065", RiskReduction: &RiskReduction{ExposureDelta: -2}, ReductionType: "protection", SubType: "fixed_guard", Name: "Schutzgitter fuer Lueftungsoeffnungen", Description: "Gitter an Lueftungsschlitzen verhindert Hindurchgreifen in rotierende Teile.", HazardCategory: "mechanical", Examples: []string{"Fingerschutzgitter an Lueftern", "Schutzgitter an Motorgehaeuse"}, NormReferences: []string{"ISO 13857", "ISO 14120"}},
{ID: "M066", ReductionType: "protection", SubType: "fixed_guard", Name: "Tunnelfoermige Schutzeinhausung", Description: "Tunnelschutz am Materialein-/auslauf verhindert Zugriff in die Maschine.", HazardCategory: "mechanical", Examples: []string{"Foerderbandtunnel an Uebergabestellen", "Schutztunnel an Stanzenauslauf"}, NormReferences: []string{"ISO 14120", "ISO 13857"}}, {ID: "M066", RiskReduction: &RiskReduction{ExposureDelta: -2}, ReductionType: "protection", SubType: "fixed_guard", Name: "Tunnelfoermige Schutzeinhausung", Description: "Tunnelschutz am Materialein-/auslauf verhindert Zugriff in die Maschine.", HazardCategory: "mechanical", Examples: []string{"Foerderbandtunnel an Uebergabestellen", "Schutztunnel an Stanzenauslauf"}, NormReferences: []string{"ISO 14120", "ISO 13857"}},
// ── Movable Guards (M067-M072) ────────────────────────────────────── // ── Movable Guards (M067-M072) ──────────────────────────────────────
{ID: "M067", ReductionType: "protection", SubType: "movable_guard", Name: "Bewegliche Schutzeinrichtung mit Verriegelung", Description: "Bewegliche Schutzeinrichtung mit Sicherheitsschalter, Maschine stoppt bei Oeffnung.", HazardCategory: "mechanical", Examples: []string{"Schwenkbare Schutzhaube mit Sicherheitsschalter", "Klappbare Schutzabdeckung"}, NormReferences: []string{"ISO 14119", "ISO 14120"}}, {ID: "M067", RiskReduction: &RiskReduction{ExposureDelta: -2, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "movable_guard", Name: "Bewegliche Schutzeinrichtung mit Verriegelung", Description: "Bewegliche Schutzeinrichtung mit Sicherheitsschalter, Maschine stoppt bei Oeffnung.", HazardCategory: "mechanical", Examples: []string{"Schwenkbare Schutzhaube mit Sicherheitsschalter", "Klappbare Schutzabdeckung"}, NormReferences: []string{"ISO 14119", "ISO 14120"}},
{ID: "M068", ReductionType: "protection", SubType: "movable_guard", Name: "Verriegelung mit Zuhaltung", Description: "Schutztuer kann nur bei stillstehender Maschine geoeffnet werden.", HazardCategory: "mechanical", Examples: []string{"Elektromagnetische Zuhaltung", "Bolzenverriegelung mit Positionsueberwachung"}, NormReferences: []string{"ISO 14119", "ISO 14120"}}, {ID: "M068", RiskReduction: &RiskReduction{ExposureDelta: -2, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "movable_guard", Name: "Verriegelung mit Zuhaltung", Description: "Schutztuer kann nur bei stillstehender Maschine geoeffnet werden.", HazardCategory: "mechanical", Examples: []string{"Elektromagnetische Zuhaltung", "Bolzenverriegelung mit Positionsueberwachung"}, NormReferences: []string{"ISO 14119", "ISO 14120"}},
{ID: "M069", ReductionType: "protection", SubType: "movable_guard", Name: "Codierte Sicherheitsschalter", Description: "RFID-codierte Schalter verhindern Umgehung der Schutzeinrichtung.", HazardCategory: "mechanical", Examples: []string{"RFID-Sicherheitsschalter an Schutztuer", "Codierte Schalter mit Manipulationsschutz"}, NormReferences: []string{"ISO 14119", "EN 1088"}}, {ID: "M069", RiskReduction: &RiskReduction{ExposureDelta: -2, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "movable_guard", Name: "Codierte Sicherheitsschalter", Description: "RFID-codierte Schalter verhindern Umgehung der Schutzeinrichtung.", HazardCategory: "mechanical", Examples: []string{"RFID-Sicherheitsschalter an Schutztuer", "Codierte Schalter mit Manipulationsschutz"}, NormReferences: []string{"ISO 14119", "EN 1088"}},
{ID: "M070", ReductionType: "protection", SubType: "movable_guard", Name: "Verriegelungssystem mit Fluchtentriegelung", Description: "Zuhaltung kann von innen ohne Werkzeug geoeffnet werden (Personenschutz).", HazardCategory: "mechanical", Examples: []string{"Fluchtentriegelung an Einhausung", "Innenliegende Notentriegelung"}, NormReferences: []string{"ISO 14119", "ISO 14120"}}, {ID: "M070", RiskReduction: &RiskReduction{ExposureDelta: -2, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "movable_guard", Name: "Verriegelungssystem mit Fluchtentriegelung", Description: "Zuhaltung kann von innen ohne Werkzeug geoeffnet werden (Personenschutz).", HazardCategory: "mechanical", Examples: []string{"Fluchtentriegelung an Einhausung", "Innenliegende Notentriegelung"}, NormReferences: []string{"ISO 14119", "ISO 14120"}},
{ID: "M071", ReductionType: "protection", SubType: "movable_guard", Name: "Startverriegelung", Description: "Maschine startet nur wenn alle Schutzeinrichtungen in Schutzstellung sind.", HazardCategory: "mechanical", Examples: []string{"Start nur bei geschlossener Schutztuer", "Automatische Rueckmeldung aller Schutzpositionen"}, NormReferences: []string{"ISO 14119", "ISO 12100 — Technische Schutzeinrichtungen"}}, {ID: "M071", RiskReduction: &RiskReduction{ExposureDelta: -2, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "movable_guard", Name: "Startverriegelung", Description: "Maschine startet nur wenn alle Schutzeinrichtungen in Schutzstellung sind.", HazardCategory: "mechanical", Examples: []string{"Start nur bei geschlossener Schutztuer", "Automatische Rueckmeldung aller Schutzpositionen"}, NormReferences: []string{"ISO 14119", "ISO 12100 — Technische Schutzeinrichtungen"}},
{ID: "M072", ReductionType: "protection", SubType: "movable_guard", Name: "Zeitverzoegerte Zuhaltung", Description: "Zuhaltung gibt erst nach Auslauf gefaehrlicher Bewegungen frei.", HazardCategory: "mechanical", Examples: []string{"Zeitrelais an Spindelstopp", "Verzoegerte Tuerfreigabe nach Pressstopp"}, NormReferences: []string{"ISO 14119"}}, {ID: "M072", RiskReduction: &RiskReduction{ExposureDelta: -2, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "movable_guard", Name: "Zeitverzoegerte Zuhaltung", Description: "Zuhaltung gibt erst nach Auslauf gefaehrlicher Bewegungen frei.", HazardCategory: "mechanical", Examples: []string{"Zeitrelais an Spindelstopp", "Verzoegerte Tuerfreigabe nach Pressstopp"}, NormReferences: []string{"ISO 14119"}},
// ── Electro-sensitive (M073-M079) ─────────────────────────────────── // ── Electro-sensitive (M073-M079) ───────────────────────────────────
{ID: "M073", ReductionType: "protection", SubType: "electro_sensitive", Name: "Lichtvorhang Typ 2", Description: "Optoelektronischer Schutz mit 30mm Aufloesung fuer Koerpererkennung.", HazardCategory: "mechanical", Examples: []string{"Koerperschutz-Lichtvorhang an Verpackungsmaschine", "Zugangsschutz an Palettieranlage"}, NormReferences: []string{"IEC 61496-1", "IEC 61496-2"}}, {ID: "M073", RiskReduction: &RiskReduction{ExposureDelta: -1, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "electro_sensitive", Name: "Lichtvorhang Typ 2", Description: "Optoelektronischer Schutz mit 30mm Aufloesung fuer Koerpererkennung.", HazardCategory: "mechanical", Examples: []string{"Koerperschutz-Lichtvorhang an Verpackungsmaschine", "Zugangsschutz an Palettieranlage"}, NormReferences: []string{"IEC 61496-1", "IEC 61496-2"}},
{ID: "M074", ReductionType: "protection", SubType: "electro_sensitive", Name: "Lichtvorhang Typ 4", Description: "Optoelektronischer Schutz mit 14mm Aufloesung fuer Handschutz.", HazardCategory: "mechanical", Examples: []string{"Handschutz-Lichtgitter an Pressenzufuehrung", "Fingerschutz an Abkantpresse"}, NormReferences: []string{"IEC 61496-1", "IEC 61496-2"}}, {ID: "M074", RiskReduction: &RiskReduction{ExposureDelta: -1, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "electro_sensitive", Name: "Lichtvorhang Typ 4", Description: "Optoelektronischer Schutz mit 14mm Aufloesung fuer Handschutz.", HazardCategory: "mechanical", Examples: []string{"Handschutz-Lichtgitter an Pressenzufuehrung", "Fingerschutz an Abkantpresse"}, NormReferences: []string{"IEC 61496-1", "IEC 61496-2"}},
{ID: "M075", ReductionType: "protection", SubType: "electro_sensitive", Name: "Laserscanner", Description: "Flaechenscanner ueberwacht Bodenbereich mit Warn- und Schutzfeld.", HazardCategory: "mechanical", Examples: []string{"Sicherheitslaserscanner an mobiler Plattform", "Multizonen-Scanner mit anpassbaren Feldern"}, NormReferences: []string{"IEC 61496-3", "ISO 13855"}}, {ID: "M075", RiskReduction: &RiskReduction{ExposureDelta: -1, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "electro_sensitive", Name: "Laserscanner", Description: "Flaechenscanner ueberwacht Bodenbereich mit Warn- und Schutzfeld.", HazardCategory: "mechanical", Examples: []string{"Sicherheitslaserscanner an mobiler Plattform", "Multizonen-Scanner mit anpassbaren Feldern"}, NormReferences: []string{"IEC 61496-3", "ISO 13855"}},
{ID: "M076", ReductionType: "protection", SubType: "electro_sensitive", Name: "Sicherheitslichtschranke", Description: "Einstrahl-Lichtschranke ueberwacht Zugang und loest Stopp aus.", HazardCategory: "mechanical", Examples: []string{"Einstrahl-Lichtschranke an Maschinenzugang", "Reflex-Lichtschranke an Auswurfoeffnung"}, NormReferences: []string{"IEC 61496-1", "ISO 13855"}}, {ID: "M076", RiskReduction: &RiskReduction{ExposureDelta: -1, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "electro_sensitive", Name: "Sicherheitslichtschranke", Description: "Einstrahl-Lichtschranke ueberwacht Zugang und loest Stopp aus.", HazardCategory: "mechanical", Examples: []string{"Einstrahl-Lichtschranke an Maschinenzugang", "Reflex-Lichtschranke an Auswurfoeffnung"}, NormReferences: []string{"IEC 61496-1", "ISO 13855"}},
{ID: "M077", ReductionType: "protection", SubType: "electro_sensitive", Name: "Kamerabasiertes Schutzsystem", Description: "Bildverarbeitungssystem erkennt Personen im Gefahrbereich dreidimensional.", HazardCategory: "mechanical", Examples: []string{"3D-Kamerasystem an Roboterzelle", "Stereokamera-Absicherung an Portal"}, NormReferences: []string{"IEC 61496-4", "ISO 13855"}}, {ID: "M077", RiskReduction: &RiskReduction{ExposureDelta: -1, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "electro_sensitive", Name: "Kamerabasiertes Schutzsystem", Description: "Bildverarbeitungssystem erkennt Personen im Gefahrbereich dreidimensional.", HazardCategory: "mechanical", Examples: []string{"3D-Kamerasystem an Roboterzelle", "Stereokamera-Absicherung an Portal"}, NormReferences: []string{"IEC 61496-4", "ISO 13855"}},
{ID: "M078", ReductionType: "protection", SubType: "electro_sensitive", Name: "Radarbasiertes Schutzsystem", Description: "Radarsensor erkennt Personen auch bei Staub, Nebel oder Verschmutzung.", HazardCategory: "mechanical", Examples: []string{"Radarsensor an Outdoor-Anlage", "Radarueberwachung bei verschmutzter Umgebung"}, NormReferences: []string{"IEC 61496-1"}}, {ID: "M078", RiskReduction: &RiskReduction{ExposureDelta: -1, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "electro_sensitive", Name: "Radarbasiertes Schutzsystem", Description: "Radarsensor erkennt Personen auch bei Staub, Nebel oder Verschmutzung.", HazardCategory: "mechanical", Examples: []string{"Radarsensor an Outdoor-Anlage", "Radarueberwachung bei verschmutzter Umgebung"}, NormReferences: []string{"IEC 61496-1"}},
{ID: "M079", ReductionType: "protection", SubType: "electro_sensitive", Name: "Ultraschallsensor-Absicherung", Description: "Ultraschallsensoren erkennen Personen anhand reflektierter Schallwellen.", HazardCategory: "mechanical", Examples: []string{"Ultraschallnaeherungssensor an Fahrzeugen", "Kollisionswarnung an FTS"}, NormReferences: []string{"IEC 61496-1"}}, {ID: "M079", RiskReduction: &RiskReduction{ExposureDelta: -1, ProbabilityDelta: -1}, ReductionType: "protection", SubType: "electro_sensitive", Name: "Ultraschallsensor-Absicherung", Description: "Ultraschallsensoren erkennen Personen anhand reflektierter Schallwellen.", HazardCategory: "mechanical", Examples: []string{"Ultraschallnaeherungssensor an Fahrzeugen", "Kollisionswarnung an FTS"}, NormReferences: []string{"IEC 61496-1"}},
// ── Pressure-sensitive (M080-M082) ────────────────────────────────── // ── Pressure-sensitive (M080-M082) ──────────────────────────────────
{ID: "M080", ReductionType: "protection", SubType: "pressure_sensitive", Name: "Schaltmatte", Description: "Druckempfindliche Bodenmatte erkennt Betreten des Gefahrbereichs.", HazardCategory: "mechanical", Examples: []string{"Sicherheitsmatte vor Roboterzelle", "Schaltmatte unter Palettierstation"}, NormReferences: []string{"ISO 13856-1", "ISO 13855"}}, {ID: "M080", ReductionType: "protection", SubType: "pressure_sensitive", Name: "Schaltmatte", Description: "Druckempfindliche Bodenmatte erkennt Betreten des Gefahrbereichs.", HazardCategory: "mechanical", Examples: []string{"Sicherheitsmatte vor Roboterzelle", "Schaltmatte unter Palettierstation"}, NormReferences: []string{"ISO 13856-1", "ISO 13855"}},
@@ -34,10 +34,10 @@ func getProtectiveMeasures() []ProtectiveMeasureEntry {
{ID: "M082", ReductionType: "protection", SubType: "pressure_sensitive", Name: "Schaltpuffer", Description: "Druckempfindliche Pufferelemente an Fahrzeugkanten erkennen Kollisionen.", HazardCategory: "mechanical", Examples: []string{"Schaltpuffer an FTS/AGV", "Bumper an Shuttle-System"}, NormReferences: []string{"ISO 13856-3", "ISO 3691-4"}}, {ID: "M082", ReductionType: "protection", SubType: "pressure_sensitive", Name: "Schaltpuffer", Description: "Druckempfindliche Pufferelemente an Fahrzeugkanten erkennen Kollisionen.", HazardCategory: "mechanical", Examples: []string{"Schaltpuffer an FTS/AGV", "Bumper an Shuttle-System"}, NormReferences: []string{"ISO 13856-3", "ISO 3691-4"}},
// ── Emergency Stop (M083-M086) ────────────────────────────────────── // ── Emergency Stop (M083-M086) ──────────────────────────────────────
{ID: "M083", ReductionType: "protection", SubType: "emergency_stop", Name: "Not-Halt Kategorie 0", Description: "Sofortiges Abschalten aller Aktoren durch Unterbrechung der Energiezufuhr.", HazardCategory: "general", Examples: []string{"Pilztaster an jedem Bedienfeld", "Drahtloser Not-Halt fuer mobile Bedienung"}, NormReferences: []string{"ISO 13850", "IEC 60204-1 — Not-Halt-Steuerung"}}, {ID: "M083", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "emergency_stop", Name: "Not-Halt Kategorie 0", Description: "Sofortiges Abschalten aller Aktoren durch Unterbrechung der Energiezufuhr.", HazardCategory: "general", Examples: []string{"Pilztaster an jedem Bedienfeld", "Drahtloser Not-Halt fuer mobile Bedienung"}, NormReferences: []string{"ISO 13850", "IEC 60204-1 — Not-Halt-Steuerung"}},
{ID: "M084", ReductionType: "protection", SubType: "emergency_stop", Name: "Not-Halt Kategorie 1", Description: "Kontrolliertes Stillsetzen, dann Energietrennung nach Stillstand.", HazardCategory: "general", Examples: []string{"Kontrolliertes Abbremsen vor Abschaltung", "Gesteuerter Stopp mit anschliessender Energietrennung"}, NormReferences: []string{"ISO 13850", "IEC 60204-1 — Not-Halt-Steuerung"}}, {ID: "M084", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "emergency_stop", Name: "Not-Halt Kategorie 1", Description: "Kontrolliertes Stillsetzen, dann Energietrennung nach Stillstand.", HazardCategory: "general", Examples: []string{"Kontrolliertes Abbremsen vor Abschaltung", "Gesteuerter Stopp mit anschliessender Energietrennung"}, NormReferences: []string{"ISO 13850", "IEC 60204-1 — Not-Halt-Steuerung"}},
{ID: "M085", ReductionType: "protection", SubType: "emergency_stop", Name: "Not-Halt-Seilzug", Description: "Reissleine entlang langer Foerderstrecken fuer sofortigen Stopp.", HazardCategory: "general", Examples: []string{"Seilzug-Nothalt an Bandfoerderern", "Reissleine entlang Rollenbahnen"}, NormReferences: []string{"ISO 13850", "EN 620"}}, {ID: "M085", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "emergency_stop", Name: "Not-Halt-Seilzug", Description: "Reissleine entlang langer Foerderstrecken fuer sofortigen Stopp.", HazardCategory: "general", Examples: []string{"Seilzug-Nothalt an Bandfoerderern", "Reissleine entlang Rollenbahnen"}, NormReferences: []string{"ISO 13850", "EN 620"}},
{ID: "M086", ReductionType: "protection", SubType: "emergency_stop", Name: "Notabschaltung", Description: "Sofortige Trennung von der Energieversorgung bei unmittelbarer Lebensgefahr.", HazardCategory: "general", Examples: []string{"Notabschaltung am Hauptschalter", "Schnellablass fuer Hydraulikdruck"}, NormReferences: []string{"IEC 60204-1 — Sicherer Halt", "ISO 12100 — Technische Schutzeinrichtungen"}}, {ID: "M086", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "emergency_stop", Name: "Notabschaltung", Description: "Sofortige Trennung von der Energieversorgung bei unmittelbarer Lebensgefahr.", HazardCategory: "general", Examples: []string{"Notabschaltung am Hauptschalter", "Schnellablass fuer Hydraulikdruck"}, NormReferences: []string{"IEC 60204-1 — Sicherer Halt", "ISO 12100 — Technische Schutzeinrichtungen"}},
// ── Electrical Protection (M087-M094) ─────────────────────────────── // ── Electrical Protection (M087-M094) ───────────────────────────────
{ID: "M087", ReductionType: "protection", SubType: "electrical_protection", Name: "Fehlerstromschutzschalter RCD", Description: "Erkennt Fehlerstromanteile und trennt den Stromkreis zum Schutz vor Stromschlag.", HazardCategory: "electrical", Examples: []string{"RCD 30mA fuer Steckdosenkreise", "RCD Typ B fuer Frequenzumrichter"}, NormReferences: []string{"IEC 60204-1", "DIN VDE 0100-410"}}, {ID: "M087", ReductionType: "protection", SubType: "electrical_protection", Name: "Fehlerstromschutzschalter RCD", Description: "Erkennt Fehlerstromanteile und trennt den Stromkreis zum Schutz vor Stromschlag.", HazardCategory: "electrical", Examples: []string{"RCD 30mA fuer Steckdosenkreise", "RCD Typ B fuer Frequenzumrichter"}, NormReferences: []string{"IEC 60204-1", "DIN VDE 0100-410"}},
@@ -61,41 +61,41 @@ func getProtectiveMeasures() []ProtectiveMeasureEntry {
{ID: "M101", ReductionType: "protection", SubType: "fluid_protection", Name: "Auffangeinrichtung fuer Betriebsfluide", Description: "Auffangwannen verhindern Umweltkontamination und Rutschgefahr bei Leckagen.", HazardCategory: "material_environmental", Examples: []string{"Oelwanne unter Hydraulikaggregat", "Auffangrinne unter Schmierstoffleitungen"}, NormReferences: []string{"ISO 12100 — Technische Schutzeinrichtungen"}}, {ID: "M101", ReductionType: "protection", SubType: "fluid_protection", Name: "Auffangeinrichtung fuer Betriebsfluide", Description: "Auffangwannen verhindern Umweltkontamination und Rutschgefahr bei Leckagen.", HazardCategory: "material_environmental", Examples: []string{"Oelwanne unter Hydraulikaggregat", "Auffangrinne unter Schmierstoffleitungen"}, NormReferences: []string{"ISO 12100 — Technische Schutzeinrichtungen"}},
// ── Extraction (M102-M104) ────────────────────────────────────────── // ── Extraction (M102-M104) ──────────────────────────────────────────
{ID: "M102", ReductionType: "protection", SubType: "extraction", Name: "Absauganlage", Description: "Absaugung entfernt gesundheitsschaedliche Daempfe, Staub und Rauch.", HazardCategory: "material_environmental", Examples: []string{"Schweissrauchabsaugung", "Staubabsaugung an Holzbearbeitungsmaschine"}, NormReferences: []string{"EN 626-1", "EN 1093-1"}}, {ID: "M102", RiskReduction: &RiskReduction{ExposureDelta: -2}, ReductionType: "protection", SubType: "extraction", Name: "Absauganlage", Description: "Absaugung entfernt gesundheitsschaedliche Daempfe, Staub und Rauch.", HazardCategory: "material_environmental", Examples: []string{"Schweissrauchabsaugung", "Staubabsaugung an Holzbearbeitungsmaschine"}, NormReferences: []string{"EN 626-1", "EN 1093-1"}},
{ID: "M103", ReductionType: "protection", SubType: "extraction", Name: "Oelnebelabscheider", Description: "Filtert Oelnebel aus der Maschinenumgebung zum Schutz der Atemwege.", HazardCategory: "material_environmental", Examples: []string{"Oelnebelabscheider an CNC-Maschine", "Aerosolabscheider an Kuehlschmiermittel"}, NormReferences: []string{"EN 1093-1"}}, {ID: "M103", RiskReduction: &RiskReduction{ExposureDelta: -2}, ReductionType: "protection", SubType: "extraction", Name: "Oelnebelabscheider", Description: "Filtert Oelnebel aus der Maschinenumgebung zum Schutz der Atemwege.", HazardCategory: "material_environmental", Examples: []string{"Oelnebelabscheider an CNC-Maschine", "Aerosolabscheider an Kuehlschmiermittel"}, NormReferences: []string{"EN 1093-1"}},
{ID: "M104", ReductionType: "protection", SubType: "extraction", Name: "Spaenesauganlage", Description: "Absaugsystem entfernt Metallspaene und verhindert Verletzungen durch Spaeneflug.", HazardCategory: "mechanical", Examples: []string{"Spaenefoerderer an Drehmaschine", "Spaeneabsaugung an Fraesmaschine"}, NormReferences: []string{"EN 1093-1"}}, {ID: "M104", RiskReduction: &RiskReduction{ExposureDelta: -2}, ReductionType: "protection", SubType: "extraction", Name: "Spaenesauganlage", Description: "Absaugsystem entfernt Metallspaene und verhindert Verletzungen durch Spaeneflug.", HazardCategory: "mechanical", Examples: []string{"Spaenefoerderer an Drehmaschine", "Spaeneabsaugung an Fraesmaschine"}, NormReferences: []string{"EN 1093-1"}},
// ── Safety Control (M105-M113) ────────────────────────────────────── // ── Safety Control (M105-M113) ──────────────────────────────────────
{ID: "M105", ReductionType: "protection", SubType: "safety_control", Name: "Sichere SPS", Description: "Fehlersichere SPS fuehrt sicherheitsrelevante Funktionen redundant aus.", HazardCategory: "software_control", Examples: []string{"Zweikanalige SPS mit Kreuzvergleich", "SIL-3-zertifizierte Safety-SPS"}, NormReferences: []string{"IEC 62061", "ISO 13849-1"}}, {ID: "M105", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "protection", SubType: "safety_control", Name: "Sichere SPS", Description: "Fehlersichere SPS fuehrt sicherheitsrelevante Funktionen redundant aus.", HazardCategory: "software_control", Examples: []string{"Zweikanalige SPS mit Kreuzvergleich", "SIL-3-zertifizierte Safety-SPS"}, NormReferences: []string{"IEC 62061", "ISO 13849-1"}},
{ID: "M106", ReductionType: "protection", SubType: "safety_control", Name: "Watchdog", Description: "Timer ueberwacht Steuerungssoftware und loest sicheren Zustand bei Ausfall aus.", HazardCategory: "software_control", Examples: []string{"Hardware-Watchdog auf Safety-SPS", "Fenster-Watchdog mit engem Zeitfenster"}, NormReferences: []string{"IEC 61508-2", "ISO 13849-1"}}, {ID: "M106", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "protection", SubType: "safety_control", Name: "Watchdog", Description: "Timer ueberwacht Steuerungssoftware und loest sicheren Zustand bei Ausfall aus.", HazardCategory: "software_control", Examples: []string{"Hardware-Watchdog auf Safety-SPS", "Fenster-Watchdog mit engem Zeitfenster"}, NormReferences: []string{"IEC 61508-2", "ISO 13849-1"}},
{ID: "M107", ReductionType: "protection", SubType: "safety_control", Name: "Sichere Fehlerbehandlung", Description: "Jeder erkannte Fehler wird systematisch in definierten sicheren Zustand ueberfuehrt.", HazardCategory: "software_control", Examples: []string{"Exception-Handler fuer kritische Bereiche", "Unbehandelte Fehler loesen sicheren Stopp aus"}, NormReferences: []string{"IEC 61508-3", "IEC 62443-4-1"}}, {ID: "M107", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "protection", SubType: "safety_control", Name: "Sichere Fehlerbehandlung", Description: "Jeder erkannte Fehler wird systematisch in definierten sicheren Zustand ueberfuehrt.", HazardCategory: "software_control", Examples: []string{"Exception-Handler fuer kritische Bereiche", "Unbehandelte Fehler loesen sicheren Stopp aus"}, NormReferences: []string{"IEC 61508-3", "IEC 62443-4-1"}},
{ID: "M108", ReductionType: "protection", SubType: "safety_control", Name: "Sichere Recovery", Description: "Nach Fehler wird Maschine in Ausgangszustand zurueckgesetzt vor Weiterbetrieb.", HazardCategory: "software_control", Examples: []string{"Referenzfahrt nach Steuerungswiederanlauf", "Konfigurationscheck nach Recovery"}, NormReferences: []string{"IEC 62061", "ISO 12100 — Steuerungssicherheit"}}, {ID: "M108", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "protection", SubType: "safety_control", Name: "Sichere Recovery", Description: "Nach Fehler wird Maschine in Ausgangszustand zurueckgesetzt vor Weiterbetrieb.", HazardCategory: "software_control", Examples: []string{"Referenzfahrt nach Steuerungswiederanlauf", "Konfigurationscheck nach Recovery"}, NormReferences: []string{"IEC 62061", "ISO 12100 — Steuerungssicherheit"}},
{ID: "M109", ReductionType: "protection", SubType: "safety_control", Name: "Sichere Degradationsstrategie", Description: "Bei Teilausfaellen Uebergang in Modus mit reduzierter Leistung aber erhaltener Sicherheit.", HazardCategory: "software_control", Examples: []string{"Reduzierte Geschwindigkeit bei Sensorausfall", "Automatischer Wechsel auf Handbetrieb"}, NormReferences: []string{"IEC 62061", "ISO 13849-1"}}, {ID: "M109", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "protection", SubType: "safety_control", Name: "Sichere Degradationsstrategie", Description: "Bei Teilausfaellen Uebergang in Modus mit reduzierter Leistung aber erhaltener Sicherheit.", HazardCategory: "software_control", Examples: []string{"Reduzierte Geschwindigkeit bei Sensorausfall", "Automatischer Wechsel auf Handbetrieb"}, NormReferences: []string{"IEC 62061", "ISO 13849-1"}},
{ID: "M110", ReductionType: "protection", SubType: "safety_control", Name: "Automatische Abschaltung bei Fehler", Description: "Bei schwerwiegenden Fehlern automatische sichere Abschaltung.", HazardCategory: "software_control", Examples: []string{"Stopp-Kategorie 0 bei kritischem Fehler", "Energietrennung bei unbehebbarem Fehler"}, NormReferences: []string{"IEC 60204-1", "ISO 13850"}}, {ID: "M110", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "protection", SubType: "safety_control", Name: "Automatische Abschaltung bei Fehler", Description: "Bei schwerwiegenden Fehlern automatische sichere Abschaltung.", HazardCategory: "software_control", Examples: []string{"Stopp-Kategorie 0 bei kritischem Fehler", "Energietrennung bei unbehebbarem Fehler"}, NormReferences: []string{"IEC 60204-1", "ISO 13850"}},
{ID: "M111", ReductionType: "protection", SubType: "safety_control", Name: "Sichere Speicherverwaltung", Description: "Steuerungssoftware verwendet sichere Speicherverwaltung gegen Datenverlust.", HazardCategory: "software_control", Examples: []string{"Speicherschutz fuer Safety-Bereiche", "Stack-Overflow-Schutz implementieren"}, NormReferences: []string{"IEC 61508-3"}}, {ID: "M111", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "protection", SubType: "safety_control", Name: "Sichere Speicherverwaltung", Description: "Steuerungssoftware verwendet sichere Speicherverwaltung gegen Datenverlust.", HazardCategory: "software_control", Examples: []string{"Speicherschutz fuer Safety-Bereiche", "Stack-Overflow-Schutz implementieren"}, NormReferences: []string{"IEC 61508-3"}},
{ID: "M112", ReductionType: "protection", SubType: "safety_control", Name: "Selbsttest", Description: "Sicherheitsbaugruppen fuehren automatische Selbsttests durch und melden Fehler.", HazardCategory: "software_control", Examples: []string{"Anlauftestung des Lichtgitters", "ROM-CRC-Pruefung bei Steuerungsstart"}, NormReferences: []string{"IEC 61508-2", "ISO 13849-1"}}, {ID: "M112", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "protection", SubType: "safety_control", Name: "Selbsttest", Description: "Sicherheitsbaugruppen fuehren automatische Selbsttests durch und melden Fehler.", HazardCategory: "software_control", Examples: []string{"Anlauftestung des Lichtgitters", "ROM-CRC-Pruefung bei Steuerungsstart"}, NormReferences: []string{"IEC 61508-2", "ISO 13849-1"}},
{ID: "M113", ReductionType: "protection", SubType: "safety_control", Name: "Sichere Kommunikationsprotokolle", Description: "Sichere Industrieprotokolle fuer authentifizierte Steuerungskommunikation.", HazardCategory: "software_control", Examples: []string{"PROFIsafe fuer SPS-Kommunikation", "CIP Safety fuer EtherNet/IP"}, NormReferences: []string{"IEC 61784-3", "IEC 62280"}}, {ID: "M113", RiskReduction: &RiskReduction{ProbabilityDelta: -2}, ReductionType: "protection", SubType: "safety_control", Name: "Sichere Kommunikationsprotokolle", Description: "Sichere Industrieprotokolle fuer authentifizierte Steuerungskommunikation.", HazardCategory: "software_control", Examples: []string{"PROFIsafe fuer SPS-Kommunikation", "CIP Safety fuer EtherNet/IP"}, NormReferences: []string{"IEC 61784-3", "IEC 62280"}},
// ── Monitoring (M114-M120) ────────────────────────────────────────── // ── Monitoring (M114-M120) ──────────────────────────────────────────
{ID: "M114", ReductionType: "protection", SubType: "monitoring", Name: "Sichere Positionsueberwachung", Description: "Redundante Positionserfassung mit Plausibilitaetspruefung an Sicherheitsachsen.", HazardCategory: "mechanical", Examples: []string{"Doppelte Absolutwertgeber an Servoachsen", "Sichere Positionsauswertung ueber Safety-SPS"}, NormReferences: []string{"IEC 61800-5-2", "IEC 62061"}}, {ID: "M114", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "monitoring", Name: "Sichere Positionsueberwachung", Description: "Redundante Positionserfassung mit Plausibilitaetspruefung an Sicherheitsachsen.", HazardCategory: "mechanical", Examples: []string{"Doppelte Absolutwertgeber an Servoachsen", "Sichere Positionsauswertung ueber Safety-SPS"}, NormReferences: []string{"IEC 61800-5-2", "IEC 62061"}},
{ID: "M115", ReductionType: "protection", SubType: "monitoring", Name: "Sichere Geschwindigkeitsueberwachung", Description: "Geschwindigkeit wird sicher ueberwacht mit Stopp bei Ueberschreitung.", HazardCategory: "mechanical", Examples: []string{"Sichere Drehzahlueberwachung an Spindeln", "Geschwindigkeitsbegrenzung im Einrichtbetrieb"}, NormReferences: []string{"IEC 61800-5-2", "IEC 62061"}}, {ID: "M115", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "monitoring", Name: "Sichere Geschwindigkeitsueberwachung", Description: "Geschwindigkeit wird sicher ueberwacht mit Stopp bei Ueberschreitung.", HazardCategory: "mechanical", Examples: []string{"Sichere Drehzahlueberwachung an Spindeln", "Geschwindigkeitsbegrenzung im Einrichtbetrieb"}, NormReferences: []string{"IEC 61800-5-2", "IEC 62061"}},
{ID: "M116", ReductionType: "protection", SubType: "monitoring", Name: "Temperaturueberwachung", Description: "Temperatursensoren loesen Schutzreaktion bei Grenzwertueberschreitung aus.", HazardCategory: "thermal", Examples: []string{"Temperaturfuehler an Motorwicklungen", "Thermoelement an Hydrauliktank"}, NormReferences: []string{"ISO 12100 — Technische Schutzeinrichtungen"}}, {ID: "M116", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "monitoring", Name: "Temperaturueberwachung", Description: "Temperatursensoren loesen Schutzreaktion bei Grenzwertueberschreitung aus.", HazardCategory: "thermal", Examples: []string{"Temperaturfuehler an Motorwicklungen", "Thermoelement an Hydrauliktank"}, NormReferences: []string{"ISO 12100 — Technische Schutzeinrichtungen"}},
{ID: "M117", ReductionType: "protection", SubType: "monitoring", Name: "Vibrationsueberwachung", Description: "Schwingungssensoren warnen vor drohendem Komponentenversagen.", HazardCategory: "noise_vibration", Examples: []string{"Beschleunigungssensoren an Hauptlagern", "Grenzwertbasierte Vibrationswarnung"}, NormReferences: []string{"ISO 10816-1", "ISO 13373-1"}}, {ID: "M117", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "monitoring", Name: "Vibrationsueberwachung", Description: "Schwingungssensoren warnen vor drohendem Komponentenversagen.", HazardCategory: "noise_vibration", Examples: []string{"Beschleunigungssensoren an Hauptlagern", "Grenzwertbasierte Vibrationswarnung"}, NormReferences: []string{"ISO 10816-1", "ISO 13373-1"}},
{ID: "M118", ReductionType: "protection", SubType: "monitoring", Name: "Druckueberwachung", Description: "Druckueberwachung in Hydraulik/Pneumatik mit Schutzreaktion bei Grenzwert.", HazardCategory: "pneumatic_hydraulic", Examples: []string{"Druckschalter in Hydraulik-Hauptleitung", "Differenzdruck-Ueberwachung an Filtern"}, NormReferences: []string{"ISO 4413", "ISO 4414"}}, {ID: "M118", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "monitoring", Name: "Druckueberwachung", Description: "Druckueberwachung in Hydraulik/Pneumatik mit Schutzreaktion bei Grenzwert.", HazardCategory: "pneumatic_hydraulic", Examples: []string{"Druckschalter in Hydraulik-Hauptleitung", "Differenzdruck-Ueberwachung an Filtern"}, NormReferences: []string{"ISO 4413", "ISO 4414"}},
{ID: "M119", ReductionType: "protection", SubType: "monitoring", Name: "Redundante Sensorik", Description: "Sicherheitskritische Messstellen mit zwei unabhaengigen Sensoren und Vergleich.", HazardCategory: "software_control", Examples: []string{"Zweikanalige Positionserfassung", "Diversitaere Druckmessung"}, NormReferences: []string{"ISO 13849-1", "IEC 62061"}}, {ID: "M119", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "monitoring", Name: "Redundante Sensorik", Description: "Sicherheitskritische Messstellen mit zwei unabhaengigen Sensoren und Vergleich.", HazardCategory: "software_control", Examples: []string{"Zweikanalige Positionserfassung", "Diversitaere Druckmessung"}, NormReferences: []string{"ISO 13849-1", "IEC 62061"}},
{ID: "M120", ReductionType: "protection", SubType: "monitoring", Name: "Zustandsueberwachung (Condition Monitoring)", Description: "Kontinuierliche Maschinenzustandsueberwachung fuer fruehzeitige Fehlererkennung.", HazardCategory: "general", Examples: []string{"Condition-Monitoring-System fuer Lager", "Trendanalyse fuer Motorstroeme"}, NormReferences: []string{"ISO 13379-1", "ISO 17359"}}, {ID: "M120", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "monitoring", Name: "Zustandsueberwachung (Condition Monitoring)", Description: "Kontinuierliche Maschinenzustandsueberwachung fuer fruehzeitige Fehlererkennung.", HazardCategory: "general", Examples: []string{"Condition-Monitoring-System fuer Lager", "Trendanalyse fuer Motorstroeme"}, NormReferences: []string{"ISO 13379-1", "ISO 17359"}},
// ── Cybersecurity (M121-M130) ─────────────────────────────────────── // ── Cybersecurity (M121-M130) ───────────────────────────────────────
{ID: "M121", ReductionType: "protection", SubType: "cybersecurity", Name: "Zugangskontrolle", Description: "Physisches/elektronisches Zugangskontrollsystem fuer autorisierte Bedienung.", HazardCategory: "cyber_network", Examples: []string{"RFID-Chipkarten fuer Maschinenzugang", "Schluesselsystem fuer Betriebsartenwahl"}, NormReferences: []string{"IEC 62443-3-3", "ISO 12100 — Steuerungssicherheit"}}, {ID: "M121", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "cybersecurity", Name: "Zugangskontrolle", Description: "Physisches/elektronisches Zugangskontrollsystem fuer autorisierte Bedienung.", HazardCategory: "cyber_network", Examples: []string{"RFID-Chipkarten fuer Maschinenzugang", "Schluesselsystem fuer Betriebsartenwahl"}, NormReferences: []string{"IEC 62443-3-3", "ISO 12100 — Steuerungssicherheit"}},
{ID: "M122", ReductionType: "protection", SubType: "cybersecurity", Name: "Sichere Netzwerksegmentierung", Description: "Maschinennetzwerk von anderen Netzwerken getrennt gegen Uebergreifen von Angriffen.", HazardCategory: "cyber_network", Examples: []string{"OT-Netzwerk per VLAN trennen", "DMZ zwischen Office und Produktion"}, NormReferences: []string{"IEC 62443-3-3", "IEC 62443-2-1"}}, {ID: "M122", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "cybersecurity", Name: "Sichere Netzwerksegmentierung", Description: "Maschinennetzwerk von anderen Netzwerken getrennt gegen Uebergreifen von Angriffen.", HazardCategory: "cyber_network", Examples: []string{"OT-Netzwerk per VLAN trennen", "DMZ zwischen Office und Produktion"}, NormReferences: []string{"IEC 62443-3-3", "IEC 62443-2-1"}},
{ID: "M123", ReductionType: "protection", SubType: "cybersecurity", Name: "Firewall", Description: "Konfigurierte Firewall schuetzt Steuerungsnetzwerk vor unautorisiertem Verkehr.", HazardCategory: "cyber_network", Examples: []string{"Industrie-Firewall vor SPS-Netzwerk", "Deep-Packet-Inspection fuer Industrieprotokolle"}, NormReferences: []string{"IEC 62443-3-3"}}, {ID: "M123", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "cybersecurity", Name: "Firewall", Description: "Konfigurierte Firewall schuetzt Steuerungsnetzwerk vor unautorisiertem Verkehr.", HazardCategory: "cyber_network", Examples: []string{"Industrie-Firewall vor SPS-Netzwerk", "Deep-Packet-Inspection fuer Industrieprotokolle"}, NormReferences: []string{"IEC 62443-3-3"}},
{ID: "M124", ReductionType: "protection", SubType: "cybersecurity", Name: "Sichere Fernwartung", Description: "Fernzugriff nur ueber verschluesselte, authentifizierte, zeitbegrenzte Verbindungen.", HazardCategory: "cyber_network", Examples: []string{"VPN fuer Fernwartung", "Fernzugriff nur nach lokaler Freigabe"}, NormReferences: []string{"IEC 62443-3-3", "VDI/VDE 2182"}}, {ID: "M124", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "cybersecurity", Name: "Sichere Fernwartung", Description: "Fernzugriff nur ueber verschluesselte, authentifizierte, zeitbegrenzte Verbindungen.", HazardCategory: "cyber_network", Examples: []string{"VPN fuer Fernwartung", "Fernzugriff nur nach lokaler Freigabe"}, NormReferences: []string{"IEC 62443-3-3", "VDI/VDE 2182"}},
{ID: "M125", ReductionType: "protection", SubType: "cybersecurity", Name: "Signierte Software-Updates", Description: "Updates werden vor Installation auf Authentizitaet und Integritaet geprueft.", HazardCategory: "cyber_network", Examples: []string{"Code-Signing fuer Steuerungssoftware", "Hash-Pruefung vor Update-Installation"}, NormReferences: []string{"IEC 62443-4-1", "IEC 62443-4-2"}}, {ID: "M125", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "cybersecurity", Name: "Signierte Software-Updates", Description: "Updates werden vor Installation auf Authentizitaet und Integritaet geprueft.", HazardCategory: "cyber_network", Examples: []string{"Code-Signing fuer Steuerungssoftware", "Hash-Pruefung vor Update-Installation"}, NormReferences: []string{"IEC 62443-4-1", "IEC 62443-4-2"}},
{ID: "M126", ReductionType: "protection", SubType: "cybersecurity", Name: "Integritaetspruefung", Description: "Regelmaessige automatische Pruefung der Steuerungssoftware-Integritaet.", HazardCategory: "cyber_network", Examples: []string{"CRC-Pruefung bei jedem Start", "Hash-Verifizierung der Firmware im Betrieb"}, NormReferences: []string{"IEC 62443-4-2"}}, {ID: "M126", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "cybersecurity", Name: "Integritaetspruefung", Description: "Regelmaessige automatische Pruefung der Steuerungssoftware-Integritaet.", HazardCategory: "cyber_network", Examples: []string{"CRC-Pruefung bei jedem Start", "Hash-Verifizierung der Firmware im Betrieb"}, NormReferences: []string{"IEC 62443-4-2"}},
{ID: "M127", ReductionType: "protection", SubType: "cybersecurity", Name: "Sichere Bootkette", Description: "Secure Boot laed nur vertrauenswuerdige Software beim Steuerungsstart.", HazardCategory: "cyber_network", Examples: []string{"Secure Boot im BIOS", "Chain-of-Trust bis zur Applikation"}, NormReferences: []string{"IEC 62443-4-2", "NIST SP 800-147"}}, {ID: "M127", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "cybersecurity", Name: "Sichere Bootkette", Description: "Secure Boot laed nur vertrauenswuerdige Software beim Steuerungsstart.", HazardCategory: "cyber_network", Examples: []string{"Secure Boot im BIOS", "Chain-of-Trust bis zur Applikation"}, NormReferences: []string{"IEC 62443-4-2", "NIST SP 800-147"}},
{ID: "M128", ReductionType: "protection", SubType: "cybersecurity", Name: "Verschluesselte Kommunikation", Description: "Alle sicherheitsrelevanten Kommunikationsverbindungen sind verschluesselt.", HazardCategory: "cyber_network", Examples: []string{"TLS fuer HMI-Kommunikation", "OPC UA mit Sign&Encrypt"}, NormReferences: []string{"IEC 62443-3-3", "IEC 62443-4-2"}}, {ID: "M128", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "cybersecurity", Name: "Verschluesselte Kommunikation", Description: "Alle sicherheitsrelevanten Kommunikationsverbindungen sind verschluesselt.", HazardCategory: "cyber_network", Examples: []string{"TLS fuer HMI-Kommunikation", "OPC UA mit Sign&Encrypt"}, NormReferences: []string{"IEC 62443-3-3", "IEC 62443-4-2"}},
{ID: "M129", ReductionType: "protection", SubType: "cybersecurity", Name: "Audit-Trail", Description: "Alle sicherheitsrelevanten Aktionen unveraenderbar mit Zeitstempel protokolliert.", HazardCategory: "cyber_network", Examples: []string{"Geschuetztes Logfile fuer Sicherheitsereignisse", "Aenderungshistorie fuer Konfiguration"}, NormReferences: []string{"IEC 62443-3-3", "IEC 62443-4-2"}}, {ID: "M129", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "cybersecurity", Name: "Audit-Trail", Description: "Alle sicherheitsrelevanten Aktionen unveraenderbar mit Zeitstempel protokolliert.", HazardCategory: "cyber_network", Examples: []string{"Geschuetztes Logfile fuer Sicherheitsereignisse", "Aenderungshistorie fuer Konfiguration"}, NormReferences: []string{"IEC 62443-3-3", "IEC 62443-4-2"}},
{ID: "M130", ReductionType: "protection", SubType: "cybersecurity", Name: "Sichere Parameteraenderung", Description: "Sicherheitsparameter-Aenderungen erfordern Authentifizierung und Protokollierung.", HazardCategory: "cyber_network", Examples: []string{"Parameterschutz ueber Zugangsstufen", "Vier-Augen-Prinzip bei Safety-Parametern"}, NormReferences: []string{"IEC 62443-3-3", "IEC 62443-4-1"}}, {ID: "M130", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "protection", SubType: "cybersecurity", Name: "Sichere Parameteraenderung", Description: "Sicherheitsparameter-Aenderungen erfordern Authentifizierung und Protokollierung.", HazardCategory: "cyber_network", Examples: []string{"Parameterschutz ueber Zugangsstufen", "Vier-Augen-Prinzip bei Safety-Parametern"}, NormReferences: []string{"IEC 62443-3-3", "IEC 62443-4-1"}},
// ── Alarmierung (M131-M133) ───────────────────────────────────────── // ── Alarmierung (M131-M133) ─────────────────────────────────────────
{ID: "M131", ReductionType: "protection", SubType: "monitoring", Name: "Optische Alarmierung", Description: "Signalleuchten zeigen Betriebszustand und warnen bei Gefahr.", HazardCategory: "general", Examples: []string{"Signalleuchte gelb bei Warnung, rot bei Gefahr", "Blinkende Warnleuchte vor Maschinenstart"}, NormReferences: []string{"IEC 60204-1 — Melde- und Bedienelemente", "IEC 60073"}}, {ID: "M131", ReductionType: "protection", SubType: "monitoring", Name: "Optische Alarmierung", Description: "Signalleuchten zeigen Betriebszustand und warnen bei Gefahr.", HazardCategory: "general", Examples: []string{"Signalleuchte gelb bei Warnung, rot bei Gefahr", "Blinkende Warnleuchte vor Maschinenstart"}, NormReferences: []string{"IEC 60204-1 — Melde- und Bedienelemente", "IEC 60073"}},
@@ -141,23 +141,23 @@ func getInformationMeasures() []ProtectiveMeasureEntry {
{ID: "M160", ReductionType: "information", SubType: "manual", Name: "Entsorgungsanleitung", Description: "Fachgerechte und sichere Entsorgung der Maschine und Betriebsstoffe.", HazardCategory: "material_environmental", Examples: []string{"Gefahrstoffe identifizieren", "Entsorgungsnachweis fuer Fluide"}, NormReferences: []string{"MRL 2006/42/EG — Betriebsanleitung"}}, {ID: "M160", ReductionType: "information", SubType: "manual", Name: "Entsorgungsanleitung", Description: "Fachgerechte und sichere Entsorgung der Maschine und Betriebsstoffe.", HazardCategory: "material_environmental", Examples: []string{"Gefahrstoffe identifizieren", "Entsorgungsnachweis fuer Fluide"}, NormReferences: []string{"MRL 2006/42/EG — Betriebsanleitung"}},
// ── Training (M161-M168) ──────────────────────────────────────────── // ── Training (M161-M168) ────────────────────────────────────────────
{ID: "M161", ReductionType: "information", SubType: "training", Name: "Erstunterweisung Bediener", Description: "Initiale Sicherheitsunterweisung vor erstem Maschinenbetrieb.", HazardCategory: "general", Examples: []string{"Einweisungsprogramm fuer neue Bediener", "Praktische Uebung am Not-Halt"}, NormReferences: []string{"BetrSichV §12", "DGUV Vorschrift 1"}}, {ID: "M161", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "information", SubType: "training", Name: "Erstunterweisung Bediener", Description: "Initiale Sicherheitsunterweisung vor erstem Maschinenbetrieb.", HazardCategory: "general", Examples: []string{"Einweisungsprogramm fuer neue Bediener", "Praktische Uebung am Not-Halt"}, NormReferences: []string{"BetrSichV §12", "DGUV Vorschrift 1"}},
{ID: "M162", ReductionType: "information", SubType: "training", Name: "Jaehrliche Wiederholungsunterweisung", Description: "Regelmaessige Auffrischung der Sicherheitskenntnisse.", HazardCategory: "general", Examples: []string{"Jaehrliche Sicherheitsschulung", "Schulungsnachweise dokumentieren"}, NormReferences: []string{"ArbSchG §12", "DGUV Vorschrift 1"}}, {ID: "M162", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "information", SubType: "training", Name: "Jaehrliche Wiederholungsunterweisung", Description: "Regelmaessige Auffrischung der Sicherheitskenntnisse.", HazardCategory: "general", Examples: []string{"Jaehrliche Sicherheitsschulung", "Schulungsnachweise dokumentieren"}, NormReferences: []string{"ArbSchG §12", "DGUV Vorschrift 1"}},
{ID: "M163", ReductionType: "information", SubType: "training", Name: "LOTO-Schulung", Description: "Schulung zum Lockout-Tagout-Verfahren fuer Wartungspersonal.", HazardCategory: "electrical", Examples: []string{"Praktische LOTO-Uebung an der Maschine", "Zertifizierung fuer LOTO-Berechtigung"}, NormReferences: []string{"ISO 14118", "DGUV Vorschrift 3"}}, {ID: "M163", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "information", SubType: "training", Name: "LOTO-Schulung", Description: "Schulung zum Lockout-Tagout-Verfahren fuer Wartungspersonal.", HazardCategory: "electrical", Examples: []string{"Praktische LOTO-Uebung an der Maschine", "Zertifizierung fuer LOTO-Berechtigung"}, NormReferences: []string{"ISO 14118", "DGUV Vorschrift 3"}},
{ID: "M164", ReductionType: "information", SubType: "training", Name: "Benutzerrollenbeschreibung", Description: "Dokumentation der Aufgaben, Verantwortlichkeiten und Qualifikationen pro Rolle.", HazardCategory: "general", Examples: []string{"Rollenbeschreibung Maschinenbediener", "Qualifikationsanforderungen Instandhalter"}, NormReferences: []string{"BetrSichV", "DGUV Vorschrift 1"}}, {ID: "M164", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "information", SubType: "training", Name: "Benutzerrollenbeschreibung", Description: "Dokumentation der Aufgaben, Verantwortlichkeiten und Qualifikationen pro Rolle.", HazardCategory: "general", Examples: []string{"Rollenbeschreibung Maschinenbediener", "Qualifikationsanforderungen Instandhalter"}, NormReferences: []string{"BetrSichV", "DGUV Vorschrift 1"}},
{ID: "M165", ReductionType: "information", SubType: "training", Name: "Notfalltraining", Description: "Praktische Uebungen fuer Notfallsituationen an der Maschine.", HazardCategory: "general", Examples: []string{"Not-Halt-Uebung mit allen Bedienern", "Erste-Hilfe-Training maschinenspezifisch"}, NormReferences: []string{"ArbSchG §10", "DGUV Vorschrift 1"}}, {ID: "M165", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "information", SubType: "training", Name: "Notfalltraining", Description: "Praktische Uebungen fuer Notfallsituationen an der Maschine.", HazardCategory: "general", Examples: []string{"Not-Halt-Uebung mit allen Bedienern", "Erste-Hilfe-Training maschinenspezifisch"}, NormReferences: []string{"ArbSchG §10", "DGUV Vorschrift 1"}},
{ID: "M166", ReductionType: "information", SubType: "training", Name: "Cybersecurity-Awareness-Training", Description: "Schulung zu IT-Sicherheitsrisiken an Maschinen und Steuerungen.", HazardCategory: "cyber_network", Examples: []string{"Passwortsicherheit an HMI", "Erkennung von Social Engineering"}, NormReferences: []string{"IEC 62443-2-1"}}, {ID: "M166", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "information", SubType: "training", Name: "Cybersecurity-Awareness-Training", Description: "Schulung zu IT-Sicherheitsrisiken an Maschinen und Steuerungen.", HazardCategory: "cyber_network", Examples: []string{"Passwortsicherheit an HMI", "Erkennung von Social Engineering"}, NormReferences: []string{"IEC 62443-2-1"}},
{ID: "M167", ReductionType: "information", SubType: "training", Name: "Schulung Schutzeinrichtungen", Description: "Unterweisung zur korrekten Funktion und Pruefung aller Schutzeinrichtungen.", HazardCategory: "general", Examples: []string{"Funktionstest der Lichtgitter erklaeren", "Pruefung der Schutztuerverriegelung zeigen"}, NormReferences: []string{"BetrSichV §12", "DGUV Vorschrift 1"}}, {ID: "M167", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "information", SubType: "training", Name: "Schulung Schutzeinrichtungen", Description: "Unterweisung zur korrekten Funktion und Pruefung aller Schutzeinrichtungen.", HazardCategory: "general", Examples: []string{"Funktionstest der Lichtgitter erklaeren", "Pruefung der Schutztuerverriegelung zeigen"}, NormReferences: []string{"BetrSichV §12", "DGUV Vorschrift 1"}},
{ID: "M168", ReductionType: "information", SubType: "training", Name: "Gefahrstoffunterweisung", Description: "Schulung zum sicheren Umgang mit Gefahrstoffen an der Maschine.", HazardCategory: "material_environmental", Examples: []string{"Umgang mit Kuehlschmiermitteln", "Verhalten bei Oelleckage"}, NormReferences: []string{"GefStoffV §14", "DGUV Vorschrift 1"}}, {ID: "M168", RiskReduction: &RiskReduction{ProbabilityDelta: -1}, ReductionType: "information", SubType: "training", Name: "Gefahrstoffunterweisung", Description: "Schulung zum sicheren Umgang mit Gefahrstoffen an der Maschine.", HazardCategory: "material_environmental", Examples: []string{"Umgang mit Kuehlschmiermitteln", "Verhalten bei Oelleckage"}, NormReferences: []string{"GefStoffV §14", "DGUV Vorschrift 1"}},
// ── PPE (M169-M175) ───────────────────────────────────────────────── // ── PPE (M169-M175) ─────────────────────────────────────────────────
{ID: "M169", ReductionType: "information", SubType: "ppe", Name: "Schutzbrille", Description: "Augenschutz gegen Spaeneflug, Spritzer und UV-Strahlung.", HazardCategory: "mechanical", Examples: []string{"Schutzbrille bei Schleifarbeiten", "Vollsichtbrille bei chemischen Spritzern"}, NormReferences: []string{"EN 166", "PSA-BV"}}, {ID: "M169", RiskReduction: &RiskReduction{SeverityDelta: -1}, ReductionType: "information", SubType: "ppe", Name: "Schutzbrille", Description: "Augenschutz gegen Spaeneflug, Spritzer und UV-Strahlung.", HazardCategory: "mechanical", Examples: []string{"Schutzbrille bei Schleifarbeiten", "Vollsichtbrille bei chemischen Spritzern"}, NormReferences: []string{"EN 166", "PSA-BV"}},
{ID: "M170", ReductionType: "information", SubType: "ppe", Name: "Gehoerschutz Kapsel", Description: "Kapselgehoerschuetzer bei Laermpegeln ueber 85 dB(A).", HazardCategory: "noise_vibration", Examples: []string{"Kapselgehoerschutz an lauten Maschinen", "Aktiver Gehoerschutz fuer Kommunikation"}, NormReferences: []string{"EN 352-1", "LärmVibrationsArbSchV"}}, {ID: "M170", RiskReduction: &RiskReduction{SeverityDelta: -1}, ReductionType: "information", SubType: "ppe", Name: "Gehoerschutz Kapsel", Description: "Kapselgehoerschuetzer bei Laermpegeln ueber 85 dB(A).", HazardCategory: "noise_vibration", Examples: []string{"Kapselgehoerschutz an lauten Maschinen", "Aktiver Gehoerschutz fuer Kommunikation"}, NormReferences: []string{"EN 352-1", "LärmVibrationsArbSchV"}},
{ID: "M171", ReductionType: "information", SubType: "ppe", Name: "Schutzhandschuhe mechanisch", Description: "Handschuhe gegen Schnitt-, Stich- und Abriebverletzungen.", HazardCategory: "mechanical", Examples: []string{"Schnittschutzhandschuhe Level 5", "Vibrationsschutz-Handschuhe"}, NormReferences: []string{"EN 388", "PSA-BV"}}, {ID: "M171", RiskReduction: &RiskReduction{SeverityDelta: -1}, ReductionType: "information", SubType: "ppe", Name: "Schutzhandschuhe mechanisch", Description: "Handschuhe gegen Schnitt-, Stich- und Abriebverletzungen.", HazardCategory: "mechanical", Examples: []string{"Schnittschutzhandschuhe Level 5", "Vibrationsschutz-Handschuhe"}, NormReferences: []string{"EN 388", "PSA-BV"}},
{ID: "M172", ReductionType: "information", SubType: "ppe", Name: "Sicherheitsschuhe S3", Description: "Sicherheitsschuhe mit Zehenschutzkappe und durchtrittsicherer Sohle.", HazardCategory: "mechanical", Examples: []string{"S3-Schuhe im Produktionsbereich", "S5-Gummistiefel bei Nassreinigung"}, NormReferences: []string{"EN ISO 20345", "PSA-BV"}}, {ID: "M172", RiskReduction: &RiskReduction{SeverityDelta: -1}, ReductionType: "information", SubType: "ppe", Name: "Sicherheitsschuhe S3", Description: "Sicherheitsschuhe mit Zehenschutzkappe und durchtrittsicherer Sohle.", HazardCategory: "mechanical", Examples: []string{"S3-Schuhe im Produktionsbereich", "S5-Gummistiefel bei Nassreinigung"}, NormReferences: []string{"EN ISO 20345", "PSA-BV"}},
{ID: "M173", ReductionType: "information", SubType: "ppe", Name: "Atemschutz FFP2/FFP3", Description: "Atemschutzmaske gegen Staub, Rauch und Aerosole.", HazardCategory: "material_environmental", Examples: []string{"FFP2-Maske bei Schweissrauch", "FFP3-Maske bei Feinstaub"}, NormReferences: []string{"EN 149", "GefStoffV"}}, {ID: "M173", RiskReduction: &RiskReduction{SeverityDelta: -1}, ReductionType: "information", SubType: "ppe", Name: "Atemschutz FFP2/FFP3", Description: "Atemschutzmaske gegen Staub, Rauch und Aerosole.", HazardCategory: "material_environmental", Examples: []string{"FFP2-Maske bei Schweissrauch", "FFP3-Maske bei Feinstaub"}, NormReferences: []string{"EN 149", "GefStoffV"}},
{ID: "M174", ReductionType: "information", SubType: "ppe", Name: "Schutzkleidung chemisch", Description: "Chemikalienschutzkleidung gegen Spritzer und Kontamination.", HazardCategory: "material_environmental", Examples: []string{"Chemikalienschuerze an Galvanikanlage", "Vollschutzanzug bei Reinigungsarbeiten"}, NormReferences: []string{"EN 14605", "GefStoffV"}}, {ID: "M174", RiskReduction: &RiskReduction{SeverityDelta: -1}, ReductionType: "information", SubType: "ppe", Name: "Schutzkleidung chemisch", Description: "Chemikalienschutzkleidung gegen Spritzer und Kontamination.", HazardCategory: "material_environmental", Examples: []string{"Chemikalienschuerze an Galvanikanlage", "Vollschutzanzug bei Reinigungsarbeiten"}, NormReferences: []string{"EN 14605", "GefStoffV"}},
{ID: "M175", ReductionType: "information", SubType: "ppe", Name: "Schutzhelm", Description: "Kopfschutz gegen herabfallende Teile und Anstossen.", HazardCategory: "mechanical", Examples: []string{"Industrieschutzhelm in Montagehalle", "Anstosskappen in niedrigen Bereichen"}, NormReferences: []string{"EN 397", "PSA-BV"}}, {ID: "M175", RiskReduction: &RiskReduction{SeverityDelta: -1}, ReductionType: "information", SubType: "ppe", Name: "Schutzhelm", Description: "Kopfschutz gegen herabfallende Teile und Anstossen.", HazardCategory: "mechanical", Examples: []string{"Industrieschutzhelm in Montagehalle", "Anstosskappen in niedrigen Bereichen"}, NormReferences: []string{"EN 397", "PSA-BV"}},
// ── Organizational (M176-M192) ────────────────────────────────────── // ── Organizational (M176-M192) ──────────────────────────────────────
{ID: "M176", ReductionType: "information", SubType: "organizational", Name: "Zugangsregelung", Description: "Organisatorische Festlegung wer unter welchen Bedingungen Zugang erhaelt.", HazardCategory: "general", Examples: []string{"Zugangsberechtigungsliste fuehren", "Begleitpflicht fuer Besucher"}, NormReferences: []string{"BetrSichV", "DGUV Vorschrift 1"}}, {ID: "M176", ReductionType: "information", SubType: "organizational", Name: "Zugangsregelung", Description: "Organisatorische Festlegung wer unter welchen Bedingungen Zugang erhaelt.", HazardCategory: "general", Examples: []string{"Zugangsberechtigungsliste fuehren", "Begleitpflicht fuer Besucher"}, NormReferences: []string{"BetrSichV", "DGUV Vorschrift 1"}},
+19 -2
View File
@@ -184,8 +184,25 @@ type ProtectiveMeasureEntry struct {
// When true, the measure must be implemented if the referenced norm is applied. // When true, the measure must be implemented if the referenced norm is applied.
// The norm creates a "presumption of conformity" — deviating requires the // The norm creates a "presumption of conformity" — deviating requires the
// manufacturer to independently prove equivalent safety. // manufacturer to independently prove equivalent safety.
Mandatory bool `json:"mandatory,omitempty"` Mandatory bool `json:"mandatory,omitempty"`
MandatoryNorm string `json:"mandatory_norm,omitempty"` // e.g. "EN 1726-1 Kap. 5.3" MandatoryNorm string `json:"mandatory_norm,omitempty"`
// RiskReduction describes the typical risk reduction effect of this measure.
// Used by the Suppression Engine to automatically calculate residual risk
// when measures are assigned to hazards.
RiskReduction *RiskReduction `json:"risk_reduction,omitempty"`
}
// RiskReduction describes how a protective measure reduces risk parameters.
// Deltas are negative integers (e.g. -2 means "reduces by 2 levels").
// The Suppression Engine cumulates deltas across all assigned measures
// and clamps each parameter to a minimum of 1.
type RiskReduction struct {
// SeverityDelta reduces the severity rating (e.g. -1 for PPE, -2 for inherent safe design).
SeverityDelta int `json:"severity_delta,omitempty"`
// ExposureDelta reduces the exposure/frequency rating (e.g. -2 for fixed guard, -1 for interlock).
ExposureDelta int `json:"exposure_delta,omitempty"`
// ProbabilityDelta reduces the probability rating (e.g. -2 for interlock, -1 for training).
ProbabilityDelta int `json:"probability_delta,omitempty"`
} }
// ValidateMitigationHierarchyRequest is the request for hierarchy validation // ValidateMitigationHierarchyRequest is the request for hierarchy validation
@@ -0,0 +1,161 @@
package iace
import "testing"
func TestRiskTrajectory_NoMeasures(t *testing.T) {
engine := NewRiskEngine()
steps := engine.CalculateRiskTrajectory(4, 4, 3, nil)
if len(steps) != 1 {
t.Fatalf("expected 1 step (inherent only), got %d", len(steps))
}
if steps[0].Stage != "inherent" {
t.Errorf("expected stage 'inherent', got %q", steps[0].Stage)
}
if steps[0].RiskScore != 48 {
t.Errorf("expected risk score 48 (4×4×3), got %.1f", steps[0].RiskScore)
}
}
func TestRiskTrajectory_DesignMeasuresReduce(t *testing.T) {
engine := NewRiskEngine()
measures := []ProtectiveMeasureEntry{
{ID: "M001", ReductionType: "design", RiskReduction: &RiskReduction{SeverityDelta: -1, ExposureDelta: -1}},
{ID: "M012", ReductionType: "design", RiskReduction: &RiskReduction{SeverityDelta: -2}},
}
steps := engine.CalculateRiskTrajectory(4, 4, 3, measures)
if len(steps) != 2 {
t.Fatalf("expected 2 steps (inherent + after_design), got %d", len(steps))
}
// After design: S=4+(-1)+(-2)=1, E=4+(-1)=3, P=3 → 1×3×3 = 9
after := steps[1]
if after.Stage != "after_design" {
t.Errorf("expected stage 'after_design', got %q", after.Stage)
}
if after.Severity != 1 {
t.Errorf("expected severity 1, got %d", after.Severity)
}
if after.Exposure != 3 {
t.Errorf("expected exposure 3, got %d", after.Exposure)
}
if after.RiskScore != 9 {
t.Errorf("expected risk score 9, got %.1f", after.RiskScore)
}
}
func TestRiskTrajectory_FullHierarchy(t *testing.T) {
engine := NewRiskEngine()
measures := []ProtectiveMeasureEntry{
{ID: "M001", ReductionType: "design", RiskReduction: &RiskReduction{ExposureDelta: -1}},
{ID: "M067", ReductionType: "protection", RiskReduction: &RiskReduction{ExposureDelta: -2, ProbabilityDelta: -1}},
{ID: "M161", ReductionType: "information", RiskReduction: &RiskReduction{ProbabilityDelta: -1}},
}
// Start: S=4, E=4, P=3 → 48
steps := engine.CalculateRiskTrajectory(4, 4, 3, measures)
if len(steps) != 4 {
t.Fatalf("expected 4 steps, got %d", len(steps))
}
// Inherent: 4×4×3 = 48
if steps[0].RiskScore != 48 {
t.Errorf("inherent: expected 48, got %.1f", steps[0].RiskScore)
}
// After design: S=4, E=3, P=3 → 36
if steps[1].RiskScore != 36 {
t.Errorf("after_design: expected 36, got %.1f", steps[1].RiskScore)
}
// After protection: S=4, E=1, P=2 → 8
if steps[2].RiskScore != 8 {
t.Errorf("after_protection: expected 8, got %.1f", steps[2].RiskScore)
}
// After information: S=4, E=1, P=1 → 4
if steps[3].RiskScore != 4 {
t.Errorf("after_information: expected 4, got %.1f", steps[3].RiskScore)
}
if !steps[3].IsAcceptable {
t.Error("final risk 4 should be acceptable")
}
}
func TestRiskTrajectory_ClampMinimum1(t *testing.T) {
engine := NewRiskEngine()
// Very aggressive reduction that would push below 1
measures := []ProtectiveMeasureEntry{
{ID: "M001", ReductionType: "design", RiskReduction: &RiskReduction{SeverityDelta: -5, ExposureDelta: -5, ProbabilityDelta: -5}},
}
steps := engine.CalculateRiskTrajectory(3, 3, 3, measures)
after := steps[1]
if after.Severity != 1 || after.Exposure != 1 || after.Probability != 1 {
t.Errorf("expected all clamped to 1, got S=%d E=%d P=%d", after.Severity, after.Exposure, after.Probability)
}
if after.RiskScore != 1 {
t.Errorf("expected minimum risk score 1, got %.1f", after.RiskScore)
}
}
func TestRiskTrajectory_OnlyProtectionMeasures(t *testing.T) {
engine := NewRiskEngine()
// No design measures, only protection
measures := []ProtectiveMeasureEntry{
{ID: "M067", ReductionType: "protection", RiskReduction: &RiskReduction{ExposureDelta: -2}},
}
steps := engine.CalculateRiskTrajectory(4, 4, 3, measures)
// Should have 2 steps: inherent + after_protection (no after_design)
if len(steps) != 2 {
t.Fatalf("expected 2 steps, got %d", len(steps))
}
if steps[1].Stage != "after_protection" {
t.Errorf("expected stage after_protection, got %q", steps[1].Stage)
}
// S=4, E=2, P=3 → 24
if steps[1].RiskScore != 24 {
t.Errorf("expected 24, got %.1f", steps[1].RiskScore)
}
}
func TestRiskTrajectory_MeasuresWithoutRiskReduction(t *testing.T) {
engine := NewRiskEngine()
// Measures without RiskReduction should be skipped (no delta)
measures := []ProtectiveMeasureEntry{
{ID: "M151", ReductionType: "information", Name: "Betriebsanleitung"},
}
steps := engine.CalculateRiskTrajectory(3, 3, 3, measures)
if len(steps) != 1 {
t.Fatalf("expected 1 step (measures without RiskReduction have no effect), got %d", len(steps))
}
}
func TestRiskTrajectory_MandatoryMeasuresAsProtective(t *testing.T) {
engine := NewRiskEngine()
// MN measures have ReductionType "protective" — should be grouped with "protection"
measures := []ProtectiveMeasureEntry{
{ID: "MN001", ReductionType: "protective", RiskReduction: &RiskReduction{ProbabilityDelta: -1}},
}
steps := engine.CalculateRiskTrajectory(4, 4, 3, measures)
if len(steps) != 2 {
t.Fatalf("expected 2 steps, got %d", len(steps))
}
if steps[1].Stage != "after_protection" {
t.Errorf("expected after_protection for 'protective' type, got %q", steps[1].Stage)
}
}
func TestRiskReduction_OnMeasureLibrary(t *testing.T) {
// Verify that the library has measures with RiskReduction profiles
measures := GetProtectiveMeasureLibrary()
withReduction := 0
for _, m := range measures {
if m.RiskReduction != nil {
withReduction++
}
}
if withReduction < 80 {
t.Errorf("expected at least 80 measures with RiskReduction profiles, got %d", withReduction)
}
}