///|
pub(all) struct SafetyAuditReport {
total_safety_zones : Int
unprotected_machines : Array[String]
sil_compliant : Bool
estop_coverage_percent : Double
audit_status : String
} derive(Debug, Eq)
///|
pub fn audit_plant_safety_systems(
graph : @graph.FactoryGraph,
) -> SafetyAuditReport {
let safety_zones = graph.get_all_safety_zones()
let nodes = graph.get_all_nodes()
let mut high_risk_count = 0
let mut protected_count = 0
let unprotected = []
for node in nodes {
let nt = node.node_type()
if nt == @types.NodeType::RobotArm ||
nt == @types.NodeType::Machine ||
nt == @types.NodeType::Workstation {
high_risk_count = high_risk_count + 1
let sz = node.safety_zone_id()
if sz.length() > 0 && sz != "SZ-0" {
protected_count = protected_count + 1
} else {
unprotected.push(node.id() + " (" + node.name() + ")")
}
}
}
let coverage = if high_risk_count > 0 {
protected_count.to_double() / high_risk_count.to_double() * 100.0
} else {
100.0
}
let is_sil = unprotected.length() == 0
let status = if is_sil {
"PASSED - Full SIL3 / PL_d Safety Compliance"
} else {
"FAILED - Unprotected Machinery Found in Plant"
}
{
total_safety_zones: safety_zones.length(),
unprotected_machines: unprotected,
sil_compliant: is_sil,
estop_coverage_percent: coverage,
audit_status: status,
}
}