{"id":28455,"date":"2026-08-27T09:27:48","date_gmt":"2026-08-27T09:27:48","guid":{"rendered":"https:\/\/quickbirdmedical.com\/?page_id=28455"},"modified":"2026-08-31T06:59:38","modified_gmt":"2026-08-31T06:59:38","slug":"tool-iec-62304-software-safety-class-a-b-c","status":"publish","type":"page","link":"https:\/\/quickbirdmedical.com\/en\/tool-iec-62304-software-safety-class-a-b-c\/","title":{"rendered":"Determine your software safety class under IEC 62304 in five minutes"},"content":{"rendered":"<p>[et_pb_section fb_built=&#8221;1&#8243; custom_padding_last_edited=&#8221;on|phone&#8221; _builder_version=&#8221;4.16&#8243; background_color=&#8221;#345168&#8243; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_stops=&#8221;#41B6E6 5%|#298FC2 100%&#8221; background_color_gradient_overlays_image=&#8221;on&#8221; background_color_gradient_start=&#8221;#41B6E6&#8243; background_color_gradient_start_position=&#8221;5%&#8221; background_color_gradient_end=&#8221;#298FC2&#8243; custom_padding=&#8221;10px|0px|55px|0px|false|false&#8221; custom_padding_tablet=&#8221;120px|0px|120px|0px|false|false&#8221; custom_padding_phone=&#8221;100px|0px|100px|0px|false|false&#8221; bottom_divider_style=&#8221;slant2&#8243; bottom_divider_color=&#8221;#FFFFFF&#8221; bottom_divider_flip=&#8221;horizontal&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_row _builder_version=&#8221;4.21.0&#8243; custom_padding=&#8221;15px|0px|15px|0px|false|false&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.16&#8243; custom_padding=&#8221;|||&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.21.0&#8243; text_font=&#8221;||||||||&#8221; text_text_color=&#8221;#FFFFFF&#8221; text_font_size=&#8221;18px&#8221; text_line_height=&#8221;1.8em&#8221; header_font=&#8221;|700|||||||&#8221; header_font_size=&#8221;40px&#8221; header_letter_spacing=&#8221;2px&#8221; header_line_height=&#8221;1.5em&#8221; header_2_font=&#8221;|700|||||||&#8221; header_2_font_size=&#8221;40px&#8221; header_2_letter_spacing=&#8221;2px&#8221; header_2_line_height=&#8221;1.5em&#8221; custom_padding=&#8221;|100px||100px|false|false&#8221; custom_padding_tablet=&#8221;&#8221; custom_padding_phone=&#8221;|0px||0px|false|false&#8221; custom_padding_last_edited=&#8221;on|phone&#8221; animation_style=&#8221;slide&#8221; animation_direction=&#8221;bottom&#8221; animation_intensity_slide=&#8221;5%&#8221; header_font_size_tablet=&#8221;&#8221; header_font_size_phone=&#8221;22px&#8221; header_font_size_last_edited=&#8221;on|phone&#8221; header_2_font_size_tablet=&#8221;&#8221; header_2_font_size_phone=&#8221;22px&#8221; header_2_font_size_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<h1 style=\"text-align: left;\"><span style=\"color: #ffffff; font-family: overpass-extralight;\">Determine your software safety class under IEC 62304 in five minutes<\/span><\/h1>\n<p style=\"text-align: left;\">Our interactive tool for Software as a Medical Device (SaMD) and embedded software as part of a medical device. A first assessment in 5 minutes.<\/p>\n<p style=\"text-align: left;\">Does your software fall under safety class A, B or C of IEC 62304? This classification decides how much effort you have to put into development, verification and maintenance of your software medical device. You will find more on the topic <span style=\"text-decoration: underline;\"><a href=\"https:\/\/quickbirdmedical.com\/en\/iec-62304-medical-device-software-app\/\"><span style=\"color: #ffffff; text-decoration: underline;\">in our guide<\/span><\/a><\/span>.<\/p>\n<p style=\"text-align: left;\"><strong><a href=\"#tool\"><span style=\"color: #ffffff; text-decoration: underline;\">\u2193 Scroll down to the tool \u2193<\/span><\/a><\/strong><\/p>\n<p style=\"text-align: left;\">\n<p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=&#8221;1&#8243; custom_padding_last_edited=&#8221;on|phone&#8221; admin_label=&#8221;Interactive: tool&#8221; module_id=&#8221;tool&#8221; _builder_version=&#8221;4.16&#8243; custom_padding=&#8221;0px|0px|0px|0px|false|false&#8221; custom_padding_tablet=&#8221;0px|0px|0px|0px|false|false&#8221; custom_padding_phone=&#8221;0px|0px|0px|0px|false|false&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_row _builder_version=&#8221;4.21.0&#8243; width=&#8221;90%&#8221; max_width=&#8221;1200px&#8221; custom_padding=&#8221;15px|0px|0px|0px|false|false&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.16&#8243; custom_padding=&#8221;|||&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_code _builder_version=&#8221;4.27.6&#8243; custom_margin=&#8221;0px||0px||false|false&#8221; custom_padding=&#8221;0px||0px||false|false&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<style>\/* Alles unter .scn gescoped, damit es in Divi\/WordPress nichts ueberschreibt. *\/ .scn{--blau:#0f6ba8;--blau-hell:#e3f0fa;--blau-dunkel:#0a5182;--gruen:#1e8e5a;--gruen-hell:#e4f5ec;--amber:#c07c0a;--amber-hell:#fdf2dd;--rot:#c0392b;--rot-hell:#fbe8e5;--amber-text:#8a5900;--weg:#e2620f;--weg-hell:#fde3cd;--weg-text:#c2540b;--gruen-text:#15693f;--rot-text:#a52f22; \/* Gemessen an den Blogartikeln 25269, 2690 und 4417: Flie\u00dftext 16px, Zeilenh\u00f6he 23,8px. Gilt dort auch auf dem Telefon unver\u00e4ndert. *\/ --t-text:16px; \/* jeder Flie\u00dftext, jede Liste, jede Abschnitts\u00fcberschrift *\/ --t-meta:14px; \/* Quellenangaben, Untertitel, Kleingedrucktes *\/ --t-label:13px; \/* Bereichsbezeichnungen in Gro\u00dfbuchstaben *\/--tinte:#15212b;--grau:#5d6b78;--linie:#d8e6f0;--flaeche:#f2f8fc; box-sizing:border-box;font-family:inherit;color:var(--tinte);line-height:1.55;max-width:1280px;margin:0 auto;padding:24px 18px 38px;-webkit-font-smoothing:antialiased} .scn *,.scn *::before,.scn *::after{box-sizing:border-box} .scn h1,.scn h2,.scn h3,.scn h4,.scn p,.scn ul,.scn li{margin:0} .scn h1,.scn h2,.scn h3,.scn h4{font-family:inherit!important;color:var(--tinte);text-transform:none;text-align:left; padding:0!important;line-height:1.25} .scn ul,.scn ol{padding:0 0 0 18px!important;line-height:inherit!important;margin:0} .scn li{line-height:inherit} .scn p,.scn ul,.scn li,.scn summary,.scn button{text-align:left} .scn p,.scn li{font-family:inherit} .scn p{margin:0!important} .scn.scn-breit,.scn.scn-mitte{max-width:none} .scn.scn-nackt{max-width:none;padding-left:0;padding-right:0} .scn-kopf{margin-bottom:22px} .scn-kicker{display:inline-block;font-size:var(--t-label)!important;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--blau);background:var(--blau-hell);border-radius:999px;padding:5px 12px;margin-bottom:12px} .scn-kopf .scn-titel{font-size:clamp(23px,3.1vw,32px);line-height:1.2;font-weight:700;letter-spacing:-.015em} .scn .scn-kopf p{margin-top:9px!important;color:var(--grau);font-size:var(--t-text)!important;max-width:70ch} .scn-raster{display:grid;grid-template-columns:minmax(0,min(720px,58%)) minmax(0,1fr);gap:26px;align-items:start} .scn-schmal{display:none;border:1px solid var(--linie);border-left:4px solid var(--blau);border-radius:12px;background:var(--flaeche);padding:20px 22px} .scn-schmal .scn-schmal-titel{font-size:17px!important;font-weight:700;color:var(--tinte);margin-bottom:10px;line-height:1.3} .scn .scn-schmal p{font-size:var(--t-text)!important;color:#485663} .scn .scn-schmal p + p{margin-top:10px!important} \/* Zu schmal fuer zwei Spalten: das Werkzeug wird durch den Hinweis ersetzt. Zwei Kriterien, damit es auch in einer schmalen Gastspalte greift: die Fensterbreite als Grundlage und die gemessene eigene Breite ueber scn-eng. *\/ @media (max-width:900px){.scn-raster{display:none}.scn-schmal{display:block}.scn-kopf p{display:none}} .scn.scn-eng .scn-raster{display:none} .scn.scn-eng .scn-schmal{display:block} .scn.scn-eng .scn-kopf p{display:none} \/* ---------- linke Spalte: Originalgrafik ---------- *\/ .scn-grafik{min-width:0;position:sticky;top:16px;border:1px solid #cfe2f0;border-radius:16px;background:#fff;padding:14px 14px 10px;box-shadow:0 5px 18px rgba(16,62,96,.08)} @media (max-width:900px){.scn-grafik{position:static}} .scn-buehne{overflow-x:auto} .scn .scn-platzhalter{font-size:var(--t-meta)!important;color:var(--grau);padding:18px 2px} .scn-buehne svg.fig{display:block;width:100%;height:auto;max-height:80vh} .scn-grafik-fuss{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:space-between;margin-top:10px;padding-top:9px;border-top:1px solid var(--linie)} .scn .scn-quellzeile{font-size:var(--t-meta)!important;color:var(--grau)} .scn-grafik-fuss .scn-mini{font-size:var(--t-label)!important;padding:4px 11px} .scn-lb{display:none;position:fixed;inset:0;width:100%;max-width:100%;height:100%;max-height:100%;margin:0;border:0;padding:14px;background:#151f28;color:#fff;overflow:hidden;z-index:99999} .scn-lb[open]{display:flex;flex-direction:column} .scn-lb::backdrop{background:rgba(10,16,21,.97)} .scn-lb-kopf{display:flex;flex-wrap:wrap;gap:8px;align-items:center;color:#fff;font-size:var(--t-meta)!important;margin-bottom:12px} .scn-lb-kopf .scn-lb-rechts{margin-left:auto;display:flex;gap:8px} .scn-lb-buehne{flex:1;min-height:0;background:#fff;border-radius:12px;padding:16px;display:flex;align-items:center;justify-content:flex-start;overflow:auto} .scn-lb-buehne svg.fig{height:100%;width:auto;max-width:100%;max-height:100%;min-width:0;margin:auto} @media (max-width:900px){.scn-lb-buehne{align-items:flex-start} .scn-lb-buehne svg.fig{height:auto;width:auto;min-width:520px;max-width:none;max-height:none}} .scn .fig g.node.klickbar:focus-visible .kn{stroke:var(--weg-text);stroke-width:2.6;outline:none} \/* ---------- Figure 3, Normoptik ---------- *\/ \/* Der Graph ist in Markenblau gezeichnet, Anordnung und Wortlaut bleiben die der Norm. Entscheidung Malte 24.08.2026, vorher die Graustufen des Originals. *\/ .scn .fig .fl{fill:none;stroke:#2a6f9e;stroke-width:1.1;marker-end:url(#pfeil-u)} .scn .fig .fl.links{marker-end:url(#pfeil-l)} .scn .fig .fl.blank{marker-end:none} .scn .fig .kn{fill:#fff;stroke:#2a6f9e;stroke-width:1.1} .scn .fig .kn.grau{fill:#fff} .scn .fig text{font-family:inherit;fill:#123b56;font-size:8.5px;text-anchor:middle} .scn .fig text.kap{font-size:7.4px;letter-spacing:.02em} .scn .fig .kante-lbl{font-size:8px} .scn .fig text.anker-ende{text-anchor:end} .scn .fig text.anker-start{text-anchor:start} .scn .fig .notiz{fill:#fff;stroke:#b9c0c6;stroke-width:.8} .scn .fig .notiz-txt{font-size:7.3px;font-style:italic;text-anchor:start;fill:#123b56} .scn .fig .notiz-txt .kap{font-size:6.5px} .scn .fig .iec{font-size:8px;font-style:italic;text-anchor:end} \/* Zustaende *\/ .scn .fig g.node{cursor:default;transition:opacity .18s} \/* Orange ist der zurueckgelegte Weg, Blau der Punkt an dem man steht. *\/ .scn .fig g.node.pfad .kn{fill:var(--weg-hell);stroke:var(--weg);stroke-width:1.7} .scn .fig g.node.aktiv .kn{fill:#fbc78f;stroke:var(--weg);stroke-width:2.8} .scn .fig g.node.aktiv{filter:drop-shadow(0 0 6px rgba(226,98,15,.45))} .scn .fig g.node.klickbar{cursor:pointer} .scn .fig g.node.klickbar:hover .kn{stroke:var(--weg-text);stroke-width:2.2} .scn .fig g.node.res-a.aktiv .kn{fill:#c8ecd9;stroke:var(--gruen);stroke-width:2.6} .scn .fig g.node.res-a.aktiv{filter:drop-shadow(0 0 7px rgba(30,142,90,.5))} .scn .fig g.node.res-b.aktiv .kn{fill:#fbe4b6;stroke:var(--amber);stroke-width:2.6} .scn .fig g.node.res-b.aktiv{filter:drop-shadow(0 0 7px rgba(192,124,10,.5))} .scn .fig g.node.res-c.aktiv .kn{fill:#f8cdc7;stroke:var(--rot);stroke-width:2.6} .scn .fig g.node.res-c.aktiv{filter:drop-shadow(0 0 7px rgba(192,57,43,.5))} .scn .fig .fl.pfad{stroke:var(--weg);stroke-width:2.2;marker-end:url(#pfeil-u-a)} .scn .fig .fl.pfad.links{marker-end:url(#pfeil-l-a)} .scn .fig .fl.pfad.blank{marker-end:none} .scn .fig text.pfad-lbl{fill:var(--weg-text);font-weight:700} @keyframes scn-puls{0%,100%{opacity:1}50%{opacity:.55}} .scn .fig g.node.aktiv .kn{animation:scn-puls 1.9s ease-in-out infinite} @media (prefers-reduced-motion:reduce){.scn .fig g.node.aktiv .kn{animation:none!important}} \/* ---------- rechte Spalte: Assistent ---------- *\/ .scn-panel{min-width:0;border:1px solid #cfe2f0;border-radius:16px;background:#fff;box-shadow:0 5px 18px rgba(16,62,96,.08);overflow:hidden} .scn-fortschritt{display:flex;align-items:center;gap:10px;padding:12px 18px;background:var(--flaeche);border-bottom:1px solid var(--linie)} .scn-punkte{display:flex;gap:5px;flex:1} .scn-punkte i{height:5px;flex:1;border-radius:3px;background:#dbe2e8;transition:background .2s} .scn-punkte i.an{background:#8fc3e6} \/* Der Strich, in dem man gerade steht, ist der dunkelste. *\/ .scn-punkte i.an.jetzt{background:var(--blau)} .scn-schrittzahl{font-size:var(--t-label)!important;font-weight:650;color:var(--grau);white-space:nowrap} .scn-inhalt{padding:20px 18px;scroll-margin-top:100px} .scn-frage{font-size:21px!important;font-weight:700;line-height:1.32;letter-spacing:-.01em} .scn .scn-original{margin:9px 0 18px!important;font-size:var(--t-meta)!important;color:var(--grau);font-style:italic; border-left:3px solid #c2d8ea;padding-left:12px} .scn-original b{font-style:normal;font-weight:650;color:#7a8792;display:block;font-size:11px!important;letter-spacing:.07em;text-transform:uppercase;margin-bottom:1px} .scn .scn-erklaerung{margin-top:0!important;font-size:var(--t-text)!important} .scn-karten{display:grid;gap:16px;margin-top:16px} .scn-karte h4{font-size:var(--t-text)!important;font-weight:700;color:var(--blau-dunkel);margin-bottom:5px} .scn-karte ul{font-size:var(--t-text)!important;color:#374754;display:grid;gap:3px} .scn-hinweis{margin-top:16px;font-size:var(--t-text)!important;color:#374754} .scn-hinweis b{display:block;font-size:var(--t-text)!important;font-weight:700;color:var(--blau-dunkel);margin-bottom:5px} .scn-hinweis .scn-hinweis-liste{margin-top:8px;display:grid;gap:5px;list-style:decimal;padding-left:20px!important} .scn-aktionen{display:grid;gap:10px;margin-top:0} @media (min-width:520px){.scn-aktionen.zwei{grid-template-columns:1fr 1fr}} .scn-btn{appearance:none;font:inherit;text-align:left;border:2px solid #a8cbe6;background:#fff;border-radius:11px;padding:12px 14px;cursor:pointer;transition:.14s;display:flex;flex-direction:column;gap:2px;width:100%; box-shadow:0 1px 2px rgba(11,111,184,.08)} .scn-btn .kopf{display:flex;align-items:center;gap:10px;width:100%} .scn-btn .pfeil{margin-left:auto;font-size:17px;line-height:1;color:var(--blau);transition:.14s} .scn-btn:hover{border-color:var(--blau);background:var(--blau);transform:translateY(-1px);box-shadow:0 4px 10px rgba(11,111,184,.28)} .scn-btn:hover .t{color:#fff} .scn-btn:hover .s{color:rgba(255,255,255,.85)} .scn-btn:hover .z,.scn-btn.harm:hover .z,.scn-btn.krit:hover .z,.scn-btn.schwer:hover .z{color:#fff} .scn-btn:hover .pfeil{color:#fff;transform:translateX(3px)} .scn-btn:focus-visible{outline:3px solid rgba(11,111,184,.35);outline-offset:2px} .scn-btn .t{font-size:var(--t-text)!important;font-weight:700;color:var(--blau-dunkel)} .scn-btn .s{font-size:var(--t-meta)!important;color:var(--grau)} .scn-btn .z{font-size:var(--t-label)!important;font-weight:700;letter-spacing:.04em;text-transform:uppercase;margin-top:4px} .scn-btn.harm .z{color:var(--gruen-text)}.scn-btn.krit .z{color:var(--amber-text)}.scn-btn.schwer .z{color:var(--rot-text)} .scn-btn.primaer{border-color:var(--blau);background:var(--blau);color:#fff} .scn-btn.primaer .t{color:#fff} .scn-btn.primaer .s{color:rgba(255,255,255,.85)} .scn-btn.primaer .pfeil{color:rgba(255,255,255,.9)} .scn-btn.primaer:hover{background:var(--blau-dunkel);border-color:var(--blau-dunkel)} .scn-btn.primaer:hover .pfeil{color:#fff} .scn-fuss{border-top:1px solid var(--linie);background:var(--flaeche)} .scn-entscheidung{padding:15px 18px 4px} .scn-entscheidung:empty{display:none} .scn-entscheidung .lbl{font-size:var(--t-label)!important;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--grau);margin-bottom:9px} .scn-nav{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:12px 18px} .scn-fuss.ohne-nav .scn-nav{display:none} .scn-fuss.ohne-nav .scn-entscheidung{padding-bottom:20px} .scn-tbtn{appearance:none;font:inherit;font-size:var(--t-meta)!important;border:1px solid var(--linie);background:#fff;border-radius:8px;padding:6px 12px;cursor:pointer;color:var(--grau);transition:.14s} .scn-tbtn:hover:not(:disabled){border-color:var(--blau);color:var(--blau)} .scn-tbtn:disabled{opacity:.4;cursor:not-allowed} .scn-tbtn.stark{color:var(--tinte);font-weight:600} \/* Ergebnis *\/ .scn-erg-kopf{padding:20px 18px;color:#fff} .scn-erg-kopf.a{background:linear-gradient(135deg,#1e8e5a,#166f46)} .scn-erg-kopf.b{background:linear-gradient(135deg,#d18a12,#a86707)} .scn-erg-kopf.c{background:linear-gradient(135deg,#cf4436,#9e2d21)} .scn-erg-kopf .lbl{font-size:var(--t-label)!important;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:rgba(255,255,255,.88)} .scn-erg-kopf .scn-erg-name{font-size:31px!important;font-weight:800;line-height:1.15;margin-top:3px;letter-spacing:-.02em;color:#fff;text-transform:none} .scn .scn-erg-kopf p{margin-top:7px!important;font-size:var(--t-text)!important;color:rgba(255,255,255,.95)} .scn .scn-erg-kopf .scn-erg-fuss{margin-top:12px!important;font-size:var(--t-meta)!important;color:rgba(255,255,255,.8)} .scn .scn-erg-text{margin-top:20px!important;font-size:var(--t-text)!important;color:#374754} .scn .scn-erg-text + .scn-erg-text{margin-top:10px!important} .scn-erg-text a{color:var(--blau-dunkel);text-decoration:underline} .scn-erg-text a:hover{color:var(--blau)} .scn-cta{margin-top:20px;border-top:1px solid var(--linie);padding-top:14px} .scn-cta h3{font-size:var(--t-text)!important;font-weight:700;color:var(--blau-dunkel);margin-bottom:5px;text-transform:none;letter-spacing:0} .scn-cta p{font-size:var(--t-text)!important;color:#374754} .scn-cta p + p{margin-top:10px!important} .scn-cta .scn-cta-frage{margin-top:14px!important;font-weight:700;color:var(--tinte)} .scn-cta a{display:inline-block;margin-top:11px;background:var(--blau);color:#fff;text-decoration:none;font-size:var(--t-text)!important;font-weight:650;padding:9px 17px;border-radius:9px;transition:.14s} .scn-cta a:hover{background:var(--blau-dunkel)} .scn .scn-disclaimer{margin-top:18px!important;font-size:var(--t-meta)!important;color:#69747f;line-height:1.5} .scn-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}<\/style>\n<div data-lang=\"en\" class=\"scn scn-nackt\" id=\"scn\">\n<div class=\"scn-schmal\"> <pee class=\"scn-schmal-titel\">This assistant needs a larger screen<\/pee> <pee>The decision tree of IEC 62304 and the explanations sit side by side. On a phone display the diagram becomes so small that the wording of the standard is no longer legible.<\/pee> <pee>Please open this page on a desktop computer or on a tablet in landscape orientation.<\/pee> <\/div>\n<div class=\"scn-raster\">\n<div class=\"scn-grafik\">\n<div class=\"scn-buehne\"><pee class=\"scn-platzhalter\">The decision tree from Figure 3 of IEC 62304 is loading.<\/pee> <\/div>\n<div class=\"scn-grafik-fuss\"> <pee class=\"scn-quellzeile\">Official diagram from IEC 62304:2006+AMD1:2015 (Figure 3)<\/pee> <button class=\"scn-tbtn scn-mini\" id=\"scn-vollbild\" type=\"button\">View diagram full screen<\/button> <\/div>\n<\/p><\/div>\n<div class=\"scn-panel\">\n<div class=\"scn-fortschritt\">\n<div class=\"scn-punkte\" id=\"scn-punkte\" aria-hidden=\"true\"><\/div>\n<div class=\"scn-schrittzahl\" id=\"scn-schrittzahl\"><\/div>\n<\/p><\/div>\n<div class=\"scn-inhalt\" id=\"scn-inhalt\" role=\"region\" aria-live=\"polite\"><\/div>\n<div class=\"scn-fuss\">\n<div class=\"scn-entscheidung\" id=\"scn-entscheidung\"><\/div>\n<div class=\"scn-nav\"> <button class=\"scn-tbtn\" id=\"scn-zurueck\" type=\"button\">\u2190 Back<\/button> <button class=\"scn-tbtn\" id=\"scn-neu\" type=\"button\">Start over<\/button> <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p><script><!-- [et_pb_line_break_holder] --> function SCN_MARKUP(w){ var b = w.querySelector(\".scn-buehne\"); if(b) b.innerHTML = '\\x3Csvg class=\"fig\" viewBox=\"0 0 372 472\" role=\"img\" aria-labelledby=\"figtitel\"> \\x3Ctitle id=\"figtitel\">Figure 3 \u2013 Assigning software safety classification\\x3C\/title> \\x3Cdefs> \\x3Cmarker id=\"pfeil-u\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"5.5\" markerHeight=\"5.5\" orient=\"auto-start-reverse\">\\x3Cpath d=\"M0 0 L10 5 L0 10 z\" fill=\"#2a6f9e\"\/>\\x3C\/marker> \\x3Cmarker id=\"pfeil-l\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"5.5\" markerHeight=\"5.5\" orient=\"auto-start-reverse\">\\x3Cpath d=\"M0 0 L10 5 L0 10 z\" fill=\"#2a6f9e\"\/>\\x3C\/marker> \\x3Cmarker id=\"pfeil-u-a\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"5\" markerHeight=\"5\" orient=\"auto-start-reverse\">\\x3Cpath d=\"M0 0 L10 5 L0 10 z\" fill=\"#e2620f\"\/>\\x3C\/marker> \\x3Cmarker id=\"pfeil-l-a\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"5\" markerHeight=\"5\" orient=\"auto-start-reverse\">\\x3Cpath d=\"M0 0 L10 5 L0 10 z\" fill=\"#e2620f\"\/>\\x3C\/marker> \\x3C\/defs> \\x3Cpath id=\"e-start\" class=\"fl\" d=\"M120 25 H180 V57.6\"\/> \\x3Cpath id=\"e-q1-yes\" class=\"fl\" d=\"M180 139.6 V163.2\"\/> \\x3Cpath id=\"e-eval\" class=\"fl\" d=\"M180 217.2 V234.8\"\/> \\x3Cpath id=\"e-q2-yes\" class=\"fl\" d=\"M180 320.8 V344.4\"\/> \\x3Cpath id=\"e-q1-no\" class=\"fl links\" d=\"M102 101.6 H56\"\/> \\x3Cpath id=\"e-q2-no\" class=\"fl links\" d=\"M102 280.8 H56\"\/> \\x3Cpath id=\"e-va\" class=\"fl blank\" d=\"M50 101.6 V280.8\"\/> \\x3Cpath id=\"e-va2\" class=\"fl\" d=\"M50 280.8 V438\"\/> \\x3Cpath id=\"e-q3-b\" class=\"fl\" d=\"M180 414.4 V438\"\/> \\x3Cpath id=\"e-q3-c\" class=\"fl\" d=\"M248 382.4 H312 V438\"\/> \\x3Cg id=\"n-start\" class=\"node\" data-step=\"basis\" data-cx=\"64\" data-cy=\"25\" data-lh=\"9\"> \\x3Crect class=\"kn\" x=\"8\" y=\"10\" width=\"112\" height=\"30\" rx=\"15\"\/> \\x3C\/g> \\x3Cg id=\"n-q1\" class=\"node\" data-step=\"q1\" data-cx=\"180\" data-cy=\"103.6\" data-lh=\"9\"> \\x3Cpath class=\"kn\" d=\"M180 57.6 L258 101.6 L180 145.6 L102 101.6 Z\"\/> \\x3C\/g> \\x3Cg id=\"n-eval\" class=\"node\" data-step=\"eval\" data-cx=\"180\" data-cy=\"193.2\" data-lh=\"13\"> \\x3Crect class=\"kn grau\" x=\"104\" y=\"163.2\" width=\"152\" height=\"54\"\/> \\x3C\/g> \\x3Cg id=\"n-q2\" class=\"node\" data-step=\"q2\" data-cx=\"180\" data-cy=\"281.8\" data-lh=\"11\"> \\x3Cpath class=\"kn\" d=\"M180 234.8 L258 280.8 L180 326.8 L102 280.8 Z\"\/> \\x3C\/g> \\x3Cg id=\"n-q3\" class=\"node\" data-step=\"q3\" data-cx=\"180\" data-cy=\"384.4\" data-lh=\"11\"> \\x3Cpath class=\"kn\" d=\"M180 344.4 L248 382.4 L180 420.4 L112 382.4 Z\"\/> \\x3C\/g> \\x3Cg id=\"n-A\" class=\"node res-a\" data-step=\"A\" data-cx=\"50\" data-cy=\"452\" data-lh=\"10\"> \\x3Crect class=\"kn\" x=\"8\" y=\"438\" width=\"84\" height=\"22\" rx=\"11\"\/> \\x3C\/g> \\x3Cg id=\"n-B\" class=\"node res-b\" data-step=\"B\" data-cx=\"180\" data-cy=\"452\" data-lh=\"10\"> \\x3Crect class=\"kn\" x=\"138\" y=\"438\" width=\"84\" height=\"22\" rx=\"11\"\/> \\x3C\/g> \\x3Cg id=\"n-C\" class=\"node res-c\" data-step=\"C\" data-cx=\"312\" data-cy=\"452\" data-lh=\"10\"> \\x3Crect class=\"kn\" x=\"270\" y=\"438\" width=\"84\" height=\"22\" rx=\"11\"\/> \\x3C\/g> \\x3Ctext id=\"lbl-q1-no\" class=\"kante-lbl\" x=\"79\" y=\"97.6\" data-lh=\"9\">\\x3C\/text> \\x3Ctext id=\"lbl-q2-no\" class=\"kante-lbl\" x=\"79\" y=\"276.8\" data-lh=\"9\">\\x3C\/text> \\x3Ctext id=\"lbl-q1-yes\" class=\"kante-lbl anker-ende\" x=\"172\" y=\"156.6\" data-lh=\"9\">\\x3C\/text> \\x3Ctext id=\"lbl-q3-b\" class=\"kante-lbl anker-ende\" x=\"174\" y=\"429.2\" data-lh=\"9\">\\x3C\/text> \\x3Ctext id=\"lbl-q3-c\" class=\"kante-lbl anker-start\" x=\"254\" y=\"366.4\" data-lh=\"9\">\\x3C\/text> \\x3C\/svg>'; w.insertAdjacentHTML(\"beforeend\", '\\x3Cdialog class=\"scn-lb\" id=\"scn-lb\" aria-label=\"Figure 3 enlarged\"> \\x3Cdiv class=\"scn-lb-kopf\"> \\x3Cspan>Figure 3 from IEC 62304, your path is highlighted. You can keep clicking here.\\x3C\/span> \\x3Cspan class=\"scn-lb-rechts\"> \\x3Cbutton class=\"scn-tbtn\" id=\"scn-lb-zu\" type=\"button\">Close (Esc)\\x3C\/button> \\x3C\/span> \\x3C\/div> \\x3Cdiv class=\"scn-lb-buehne\" id=\"scn-lb-buehne\">\\x3C\/div> \\x3C\/dialog>'); } (function(){ \"use strict\"; function initScn(wurzel){ if(!wurzel || wurzel.dataset.init === '1') return; wurzel.dataset.init = '1'; \/* Der klassische WordPress-Editor entfernt beim Speichern jedes SVG-Tag und das dialog-Element. Deshalb traegt die WordPress-Fassung beides hier per Skript nach. Ohne diesen Haken steht das Markup direkt im HTML. *\/ if(typeof SCN_MARKUP === \"function\") SCN_MARKUP(wurzel); \/* Der Platzhalter haelt nur den Container fuer den Editor offen. Sobald das Skript laeuft, wird er nicht mehr gebraucht. *\/ var platz = wurzel.querySelector(\".scn-platzhalter\"); if(platz){ if(platz.parentNode) platz.parentNode.removeChild(platz); } \/* Nie ueber document suchen: sonst greift eine zweite Instanz auf die erste zu *\/ function el(id){ return wurzel.querySelector('#' + id); } \/* ---------------- Beschriftung des Graphen ---------------- *\/ var SPRACHE = wurzel.getAttribute(\"data-lang\") === \"en\" ? \"en\" : \"de\"; var GRAPH = { de: { \"n-start\": [\"Software ist Klasse C\", \"(default)\"], \"n-q1\": [\"Kann eine\", \"Gef\u00e4hrdungssituation\", \"durch einen\", \"Softwarefehler\", \"entstehen?\"], \"n-eval\": [\"Die Wirksamkeit von\", \"Ma\u00dfnahmen zur\", \"Risikokontrolle bewerten\"], \"n-q2\": [\"Kann ein Softwarefehler\", \"zu inakzeptablen\", \"Risiken f\u00fchren?\"], \"n-q3\": [\"Welcher Schweregrad\", \"ist m\u00f6glich?\"], \"n-A\": [\"Klasse A\"], \"n-B\": [\"Klasse B\"], \"n-C\": [\"Klasse C\"], \"lbl-q1-no\": [\"Nein\"], \"lbl-q2-no\": [\"Nein\"], \"lbl-q1-yes\": [\"Ja\"], \"lbl-q3-b\": [\"kein schwerer Schaden\"], \"lbl-q3-c\": [\"Schwerer Schaden\", \"oder Tod\"] }, en: { \"n-start\": [\"Class C (by default)\"], \"n-q1\": [\"Can a\", \"*HAZARDOUS SITUATION*\", \"arise from a failure of\", \"the software?\"], \"n-eval\": [\"Evaluate effectiveness of *RISK*\", \"*CONTROL* measures external to\", \"the software\"], \"n-q2\": [\"Does\", \"failure of the software\", \"result in unacceptable\", \"*RISK?*\"], \"n-q3\": [\"What severity\", \"of injury is\", \"possible?\"], \"n-A\": [\"Class A\"], \"n-B\": [\"Class B\"], \"n-C\": [\"Class C\"], \"lbl-q1-no\": [\"No\"], \"lbl-q2-no\": [\"No\"], \"lbl-q1-yes\": [\"Yes\"], \"lbl-q3-b\": [\"Non *SERIOUS INJURY*\"], \"lbl-q3-c\": [\"*SERIOUS INJURY*\/death\"] } }; var SVGNS = \"http:\/\/www.w3.org\/2000\/svg\"; \/* Baut eine Zeile, Sternchen werden zu Kapitaelchen *\/ function zeileBauen(text, x, y, klasse){ var t = wurzel.ownerDocument.createElementNS(SVGNS, \"text\"); t.setAttribute(\"x\", x); t.setAttribute(\"y\", y); if(klasse) t.setAttribute(\"class\", klasse); text.split(\"*\").forEach(function(teil, i){ if(!teil) return; if(i % 2 === 1){ var span = wurzel.ownerDocument.createElementNS(SVGNS, \"tspan\"); span.setAttribute(\"class\", \"kap\"); span.textContent = teil; t.appendChild(span); } else { t.appendChild(wurzel.ownerDocument.createTextNode(teil)); } }); return t; } \/* Schreibt alle Knoten und Kantenbeschriftungen in der gewaehlten Sprache *\/ function graphBeschriften(){ var texte = GRAPH[SPRACHE] || GRAPH.de; Object.keys(texte).forEach(function(id){ var el = el2(id); if(!el) return; var zeilen = texte[id]; var lh = parseFloat(el.getAttribute(\"data-lh\")) || 10; if(el.tagName.toLowerCase() === \"text\"){ \/* Kantenbeschriftung: erste Zeile bleibt im Element, weitere darunter *\/ while(el.firstChild) el.removeChild(el.firstChild); var x0 = el.getAttribute(\"x\"), y0 = parseFloat(el.getAttribute(\"y\")); zeilen.forEach(function(z, i){ var span = wurzel.ownerDocument.createElementNS(SVGNS, \"tspan\"); span.setAttribute(\"x\", x0); span.setAttribute(\"y\", y0 + i * lh); z.split(\"*\").forEach(function(teil, k){ if(!teil) return; if(k % 2 === 1){ var kap = wurzel.ownerDocument.createElementNS(SVGNS, \"tspan\"); kap.setAttribute(\"class\", \"kap\"); kap.textContent = teil; span.appendChild(kap); } else { span.appendChild(wurzel.ownerDocument.createTextNode(teil)); } }); el.appendChild(span); }); return; } \/* Knoten: alte Zeilen weg, neue um den Mittelpunkt herum *\/ var alt = el.querySelectorAll(\"text\"); for(var i = 0; i < alt.length; i++) el.removeChild(alt[i]); var cx = parseFloat(el.getAttribute(\"data-cx\")); var cy = parseFloat(el.getAttribute(\"data-cy\")); var start = cy - (zeilen.length - 1) * lh \/ 2; zeilen.forEach(function(z, k){ el.appendChild(zeileBauen(z, cx, Math.round((start + k * lh) * 10) \/ 10)); }); senkrechtZentrieren(el); }); } \/* Schiebt den Textblock so, dass seine gemessene Mitte auf der Mitte der Form liegt. Ohne das sitzt der Text sichtbar zu hoch, am staerksten in flachen Formen wie der Startpille. *\/ function senkrechtZentrieren(el){ var form = el.querySelector(\"path, rect\"); var texte = el.querySelectorAll(\"text\"); if(!form) return; if(!texte.length) return; var fb = null; try { fb = form.getBBox(); } catch(e){ fb = null; } var verschieben = function(d){ for(var i = 0; i < texte.length; i++){ texte[i].setAttribute(\"y\", (parseFloat(texte[i].getAttribute(\"y\")) + d).toFixed(2)); } }; \/* Unsichtbar, etwa wenn das Raster ausgeblendet ist: dann ist nichts messbar. Die Grundlinie liegt bei dieser Schriftgroesse rund drei Einheiten unter der Textmitte, das ist die brauchbare Naeherung. *\/ if(!fb){ verschieben(3); return; } if(!fb.width){ verschieben(3); return; } var oben = Infinity, unten = -Infinity; for(var k = 0; k < texte.length; k++){ var tb = texte[k].getBBox(); if(tb.y < oben) oben = tb.y; if(tb.y + tb.height > unten) unten = tb.y + tb.height; } if(oben === Infinity) return; var diff = (fb.y + fb.height \/ 2) - ((oben + unten) \/ 2); if(Math.abs(diff) < 0.05) return; verschieben(diff); } \/* Findet ein Element auch dann, wenn das SVG im Vollbild haengt *\/ function el2(id){ var e = wurzel.querySelector(\"#\" + id); if(e) return e; var lbx = wurzel.querySelector(\"#scn-lb\"); return lbx ? lbx.querySelector(\"#\" + id) : null; } \/* ---------------- Inhalte ---------------- *\/ var SCHRITTE = { start: { nr: 0, knoten: \"n-start\", titel: \"In f\u00fcnf Minuten zur Sicherheitsklasse\", text: \"Klicken Sie sich durch den offiziellen Entscheidungsbaum der IEC 62304 und Sie bekommen eine erste Einsch\u00e4tzung: Klasse A, B oder C. Jeder Schritt ist kurz erkl\u00e4rt, mit Beispielen aus echten Produkten.\", aktionen: [ { t: \"Klassifizierung starten\", ziel: \"basis\", stil: \"primaer\" } ] }, basis: { nr: 1, knoten: \"n-start\", titel: \"Jede Software startet in Klasse C\", original: \"Class C (by default)\", text: \"Die Norm dreht die Beweislast um. Ihr Software-System gilt zun\u00e4chst als die gef\u00e4hrlichste Kategorie. Sie arbeiten sich mit drei Fragen nach unten, und jede Herabstufung m\u00fcssen Sie begr\u00fcnden k\u00f6nnen.\", hinweisTitel: \"Rahmen f\u00fcr alle folgenden Schritte\", hinweis: \"Zwei Annahmen m\u00fcssen Sie laut IEC 62304 f\u00fcr die Analyse festlegen:\", hinweisPunkte: [\"Ein Softwarefehler tritt mit einer Wahrscheinlichkeit von 100 Prozent ein. Auch ein extrem seltener Fall z\u00e4hlt damit voll, etwa ein Rechenfehler, der nur bei einer bestimmten Zeitumstellung auftritt.\", \"Nur Risikokontrollma\u00dfnahmen au\u00dferhalb dieses Software-Systems senken die Klasse. Eine Plausibilit\u00e4tspr\u00fcfung im selben Code z\u00e4hlt nicht, eine verbindliche Freigabe des Werts durch den Arzt dagegen schon.\"], aktionen: [ { t: \"Gelesen, weiter\", s: \"Zur ersten Frage der Norm\", ziel: \"q1\", stil: \"primaer\", antwort: \"gelesen\" } ] }, q1: { nr: 2, knoten: \"n-q1\", titel: \"Kann aus einem Fehler der Software eine gef\u00e4hrliche Situation entstehen?\", pfadTitel: \"Gef\u00e4hrliche Situation durch Softwarefehler m\u00f6glich?\", original: \"Can a HAZARDOUS SITUATION arise from a failure of the software?\", text: \"Eine gef\u00e4hrliche Situation ist ein Umstand, in dem ein Mensch einem Schaden ausgesetzt ist. Stellen Sie sich vor, Ihre Software f\u00e4llt aus, h\u00e4ngt, oder liefert einen falschen Wert. Kann daraus \u00fcberhaupt eine Lage entstehen, in der jemand zu Schaden kommen k\u00f6nnte?\", hinweis: \"Im Zweifel sollten Sie diese Frage mit \\\"Ja\\\" beantworten. Das Argument, ein Softwarefehler sei zu unwahrscheinlich, z\u00e4hlt nicht: Die IEC 62304 fordert, dass man zur Analyse eine Fehlerwahrscheinlichkeit von 100% annehmen muss.\", karten: [ { kopf: \"Typische Beispiele f\u00fcr Ja\", punkte: [\"Der Bolusrechner einer Diabetes-App rechnet zu viel Insulin: schwere Unterzuckerung\", \"Ein Radiologie-Viewer spiegelt das Bild: Eingriff an der falschen K\u00f6rperseite\", \"Eine Monitoring-App leitet den Alarm bei Arrhythmie nicht weiter: Behandlung kommt zu sp\u00e4t\"] } ], aktionen: [ { t: \"Ja\", s: \"Ein Schaden ist denkbar\", z: \"weiter im Baum\", ziel: \"eval\", stil: \"krit\", antwort: \"Ja\" }, { t: \"Nein\", s: \"Ein Schaden ist ausgeschlossen\", z: \"f\u00fchrt zu Klasse A\", ziel: \"A\", stil: \"harm\", antwort: \"Nein\" } ] }, eval: { nr: 3, knoten: \"n-eval\", titel: \"Was h\u00e4lt den Schaden auf, ohne dass die Software beteiligt ist?\", pfadTitel: \"Wirksamkeit der softwareexternen Risk-Control-Ma\u00dfnahmen bewertet\", original: \"Evaluate effectiveness of RISK CONTROL measures external to the software\", text: \"Bevor Sie weiterklicken, z\u00e4hlen Sie zusammen, welche Schutzma\u00dfnahmen greifen, wenn die Software komplett versagt. Alles, was innerhalb desselben Software-Systems l\u00e4uft, z\u00e4hlt hier nicht, denn es kann mit ausfallen.\", karten: [ { kopf: \"Bespiele: Was Sie anrechnen d\u00fcrfen\", punkte: [\"Hardware, etwa ein Watchdog, der das Ger\u00e4t abschaltet, oder ein mechanischer Anschlag, der die Dosis begrenzt\", \"Ein unabh\u00e4ngiges Software-System (gesondert nach IEC 62304 klassifiziert)\", \"Dokumentierte menschliche Arbeitsabl\u00e4ufe (z.B. ein Doktor pr\u00fcft das Ergebnis der Software jedes mal)\", \"Andere Mittel, die verhindern, dass die Software zu einer gef\u00e4hrlichen Situation beitr\u00e4gt\"] } ], aktionen: [ { t: \"Bewertet, weiter\", s: \"Zur n\u00e4chsten Frage der Norm\", ziel: \"q2\", stil: \"primaer\", antwort: \"bewertet\" } ] }, q2: { nr: 4, knoten: \"n-q2\", titel: \"Bleibt danach ein nicht akzeptables Risiko?\", pfadTitel: \"Nicht akzeptables Restrisiko nach externen Ma\u00dfnahmen?\", original: \"Does failure of the software result in unacceptable RISK?\", text: \"Ziehen Sie die eben bewerteten externen Ma\u00dfnahmen ab. Bleibt ein Restrisiko \u00fcbrig, das nach Ihren eigenen Akzeptanzkriterien aus dem Risikomanagement nach ISO 14971 nicht mehr akzeptabel ist?\", karten: [ { kopf: \"Typische Beispiele f\u00fcr Ja\", punkte: [\"Es gibt keine wirksame Ma\u00dfnahme au\u00dferhalb der Software\", \"Der Nutzer kann den Fehler nicht erkennen\", \"Die Ma\u00dfnahme greift zu sp\u00e4t oder nur manchmal\"] } ], aktionen: [ { t: \"Ja\", s: \"Restrisiko nicht akzeptabel\", z: \"weiter im Baum\", ziel: \"q3\", stil: \"krit\", antwort: \"Ja\" }, { t: \"Nein\", s: \"Restrisiko akzeptabel\", z: \"f\u00fchrt zu Klasse A\", ziel: \"A\", stil: \"harm\", antwort: \"Nein\" } ] }, q3: { nr: 5, knoten: \"n-q3\", titel: \"Wie schwer kann die Verletzung ausfallen?\", pfadTitel: \"M\u00f6gliche Schwere der Verletzung\", original: \"What severity of injury is possible?\", text: \"Ma\u00dfgeblich ist der schlimmste plausible Ausgang, nicht der wahrscheinlichste. Die Norm kennt hier nur zwei Stufen.\", hinweis: \"Schwer hei\u00dft laut IEC 62304 eine Verletzung oder Erkrankung, die lebensbedrohlich ist, die zu einer bleibenden Beeintr\u00e4chtigung einer K\u00f6rperfunktion oder K\u00f6rperstruktur f\u00fchrt, oder die einen medizinischen oder chirurgischen Eingriff n\u00f6tig macht, um genau das zu verhindern. Bleibend hei\u00dft irreversibel, geringf\u00fcgige Beeintr\u00e4chtigungen z\u00e4hlen nicht.\", aktionen: [ { t: \"Nicht schwere Verletzung\", s: \"z.B. vor\u00fcbergehende Beschwerden, ambulant korrigierbar\", z: \"f\u00fchrt zu Klasse B\", ziel: \"B\", stil: \"krit\", antwort: \"Nicht schwere Verletzung\" }, { t: \"Schwere Verletzung oder Tod\", s: \"Lebensbedrohlich oder bleibender Schaden\", z: \"f\u00fchrt zu Klasse C\", ziel: \"C\", stil: \"schwer\", antwort: \"Schwere Verletzung oder Tod\" } ] } }; \/* Englische Fassung. Struktur identisch, nur die sichtbaren Texte sind uebersetzt. Strukturfelder (nr, knoten, ziel, stil, antwort) muessen gleich bleiben. *\/ var SCHRITTE_EN = { start: { nr: 0, knoten: \"n-start\", titel: \"Your safety class in five minutes\", text: \"Click through the official decision tree of IEC 62304 and you get a first assessment: class A, B or C. Every step is explained briefly, with examples from real products.\", aktionen: [ { t: \"Start classification\", ziel: \"basis\", stil: \"primaer\" } ] }, basis: { nr: 1, knoten: \"n-start\", titel: \"Every software system starts in class C\", original: \"Class C (by default)\", text: \"The standard reverses the burden of proof. Your software system counts as the most hazardous category until you argue otherwise. You work your way down through three questions, and every downgrade needs a justification you can defend.\", hinweisTitel: \"The frame for every step that follows\", hinweis: \"IEC 62304 requires you to fix two assumptions for the analysis:\", hinweisPunkte: [\"The probability of a software failure shall be assumed to be 1, that is 100 percent. Even an extremely rare case therefore counts in full, for example a calculation error that only shows up at a particular daylight saving change.\", \"Only risk control measures not implemented within the software system, that is external to it, shall be considered. A plausibility check in the same code does not count, a mandatory review of the value by a physician does.\"], aktionen: [ { t: \"Read it, continue\", s: \"To the first question of the standard\", ziel: \"q1\", stil: \"primaer\", antwort: \"read\" } ] }, q1: { nr: 2, knoten: \"n-q1\", titel: \"Can a failure of the software lead to a hazardous situation?\", pfadTitel: \"Hazardous situation from a software failure possible?\", original: \"Can a HAZARDOUS SITUATION arise from a failure of the software?\", text: \"A hazardous situation is a circumstance in which a person is exposed to harm. Picture your software failing, freezing, or returning a wrong value. Can that create a situation in which someone could come to harm at all?\", hinweis: \"When in doubt, answer this question with \\\"Yes\\\". The argument that a software failure is too unlikely does not count: IEC 62304 requires the probability of a software failure to be assumed to be 1.\", karten: [ { kopf: \"Typical examples for Yes\", punkte: [\"The bolus calculator of a diabetes app computes too much insulin: severe hypoglycaemia\", \"A radiology viewer mirrors the image: surgery on the wrong side of the body\", \"A monitoring app fails to forward the arrhythmia alarm: treatment comes too late\"] } ], aktionen: [ { t: \"Yes\", s: \"Harm is conceivable\", z: \"continue down the tree\", ziel: \"eval\", stil: \"krit\", antwort: \"Yes\" }, { t: \"No\", s: \"Harm is ruled out\", z: \"leads to class A\", ziel: \"A\", stil: \"harm\", antwort: \"No\" } ] }, eval: { nr: 3, knoten: \"n-eval\", titel: \"What stops the harm without the software being involved?\", pfadTitel: \"Effectiveness of risk control measures external to the software evaluated\", original: \"Evaluate effectiveness of RISK CONTROL measures external to the software\", text: \"Before you click on, add up which protective measures take effect if the software fails completely. Anything running inside the same software system does not count here, because it can fail along with it.\", karten: [ { kopf: \"Examples: what you may count\", punkte: [\"Hardware, for example a watchdog that shuts the device down, or a mechanical stop that limits the dose\", \"An independent software system, classified separately under IEC 62304\", \"Health care procedures, for example a physician checks the software result every time\", \"Other means that prevent the software from contributing to a hazardous situation\"] } ], aktionen: [ { t: \"Evaluated, continue\", s: \"To the next question of the standard\", ziel: \"q2\", stil: \"primaer\", antwort: \"evaluated\" } ] }, q2: { nr: 4, knoten: \"n-q2\", titel: \"Does an unacceptable risk remain after that?\", pfadTitel: \"Unacceptable residual risk after external measures?\", original: \"Does failure of the software result in unacceptable RISK?\", text: \"Subtract the external measures you have just evaluated. Is there a residual risk left that is no longer acceptable under your own acceptance criteria from risk management according to ISO 14971?\", karten: [ { kopf: \"Typical examples for Yes\", punkte: [\"There is no effective measure outside the software\", \"The user cannot detect the error\", \"The measure takes effect too late or only sometimes\"] } ], aktionen: [ { t: \"Yes\", s: \"Residual risk not acceptable\", z: \"continue down the tree\", ziel: \"q3\", stil: \"krit\", antwort: \"Yes\" }, { t: \"No\", s: \"Residual risk acceptable\", z: \"leads to class A\", ziel: \"A\", stil: \"harm\", antwort: \"No\" } ] }, q3: { nr: 5, knoten: \"n-q3\", titel: \"How severe can the injury be?\", pfadTitel: \"Possible severity of injury\", original: \"What severity of injury is possible?\", text: \"What counts is the worst plausible outcome, not the most likely one. The standard knows only two levels here.\", hinweis: \"IEC 62304 defines a serious injury as an injury or illness that is life threatening, that results in permanent impairment of a body function or permanent damage to a body structure, or that necessitates medical or surgical intervention to prevent such permanent impairment or damage. Permanent impairment means an irreversible impairment or damage, excluding trivial impairment or damage.\", aktionen: [ { t: \"Non-serious injury\", s: \"for example temporary discomfort, correctable on an outpatient basis\", z: \"leads to class B\", ziel: \"B\", stil: \"krit\", antwort: \"Non-serious injury\" }, { t: \"Serious injury or death\", s: \"Life threatening or permanent damage\", z: \"leads to class C\", ziel: \"C\", stil: \"schwer\", antwort: \"Serious injury or death\" } ] } }; if(SPRACHE === \"en\") SCHRITTE = SCHRITTE_EN; var ERGEBNISSE = { A: { knoten: \"n-A\", klasse: \"a\", name: \"Klasse A\", kurz: \"Entweder kann die Software nicht zu einer gef\u00e4hrlichen Situation beitragen, oder das Risiko ist nach den Ma\u00dfnahmen au\u00dferhalb des Software-Systems akzeptabel.\", text: \"F\u00fcr Klasse A verlangt die IEC 62304 den geringsten Umfang. Architektur, detailliertes Design, Unit-Verifikation und Integrationstests entfallen zum Beispiel.\" }, B: { knoten: \"n-B\", klasse: \"b\", name: \"Klasse B\", kurz: \"Nach den Ma\u00dfnahmen au\u00dferhalb des Software-Systems bleibt ein nicht akzeptables Risiko. Der m\u00f6gliche Schaden ist eine nicht schwere Verletzung.\", text: \"Ab Klasse B fordert die Norm zus\u00e4tzlich z.B. eine Software-Architektur, Integrationstests, Akzeptanzkriterien f\u00fcr Software-Einheiten etc.\" }, C: { knoten: \"n-C\", klasse: \"c\", name: \"Klasse C\", kurz: \"Nach den Ma\u00dfnahmen au\u00dferhalb des Software-Systems bleibt ein nicht akzeptables Risiko. Der m\u00f6gliche Schaden ist Tod oder eine schwere Verletzung.\", text: \"F\u00fcr Klasse C fordert die Norm den vollen Umfang, z.B. einen detailliertes Software-Design (bzw. Architektur auf Detailebene), zus\u00e4tzliche Akzeptanzkriterien f\u00fcr Software-Einheiten etc.\", hinweis: \"Die Norm erlaubt ausdr\u00fccklich, weitere Ma\u00dfnahmen au\u00dferhalb des Software-Systems einzuf\u00fchren, auch durch \u00c4nderung der Systemarchitektur, und danach neu zu klassifizieren.\" } }; var ERGEBNISSE_EN = { A: { knoten: \"n-A\", klasse: \"a\", name: \"Class A\", kurz: \"Either the software system cannot contribute to a hazardous situation, or it does not result in unacceptable risk after consideration of risk control measures external to the software system.\", text: \"For class A, IEC 62304 requires the smallest scope. Architecture, detailed design, unit verification and integration testing are not required, for example.\" }, B: { knoten: \"n-B\", klasse: \"b\", name: \"Class B\", kurz: \"After consideration of risk control measures external to the software system an unacceptable risk remains. The resulting possible harm is a non-serious injury.\", text: \"From class B onwards the standard additionally requires a software architecture, integration testing, acceptance criteria for software units and more.\" }, C: { knoten: \"n-C\", klasse: \"c\", name: \"Class C\", kurz: \"After consideration of risk control measures external to the software system an unacceptable risk remains. The resulting possible harm is death or serious injury.\", text: \"For class C the standard requires the full scope, for example a detailed software design, meaning architecture at detail level, plus additional acceptance criteria for software units.\", hinweis: \"The standard explicitly allows you to introduce further measures outside the software system, including changes to the system architecture, and to reclassify afterwards.\" } }; if(SPRACHE === \"en\") ERGEBNISSE = ERGEBNISSE_EN; var TEXTE = { schrittzahl: \"Schritt {nr} von {gesamt}\", labelStart: \"Start\", labelErgebnis: \"Ergebnis\", labelEntscheidung: \"Ihre Entscheidung\", labelWeiter: \"Weiter\", hinweisTitel: \"Hinweis\", ergebnisLabel: \"Ergebnis\", ergebnisFuss: \"(Grobe Orientierungshilfe, ersetzt keine Rechtsberatung.)\", ergebnisLink: \"Was {klasse} f\u00fcr Ihre Entwicklung bedeutet, erkl\u00e4rt unser Artikel zur IEC 62304.\", ctaTitel: \"\u00dcber QuickBird Medical\", ctaAbsatz1: \"Wir entwickeln Software-Medizinprodukte auf Auftragsbasis: mobile Health-Apps, Webanwendungen, Desktop-Software und Embedded Software f\u00fcr Medizinger\u00e4te.\", ctaAbsatz2: \"Dazu geh\u00f6ren zum Beispiel DiGA, Decision-Support-Systeme f\u00fcr \u00c4rzte oder komplexe Gesundheitsplattformen.\", ctaFrage: \"Sie planen die Umsetzung eines Software-Medizinprodukts?\", ctaKnopf: \"Kontakt aufnehmen\", artikelUrl: \"https:\/\/quickbirdmedical.com\/iec-62304-medizinprodukt-software-app\/\", kontaktUrl: \"https:\/\/quickbirdmedical.com\/kontakt\/\" }; var TEXTE_EN = { schrittzahl: \"Step {nr} of {gesamt}\", labelStart: \"Start\", labelErgebnis: \"Result\", labelEntscheidung: \"Your decision\", labelWeiter: \"Next\", hinweisTitel: \"Note\", ergebnisLabel: \"Result\", ergebnisFuss: \"(Rough orientation only, not a substitute for legal advice.)\", ergebnisLink: \"Our article on IEC 62304 explains what {klasse} means for your development.\", ctaTitel: \"About QuickBird Medical\", ctaAbsatz1: \"We build medical device software on a contract basis: mobile health apps, web applications, desktop software and embedded software for medical devices.\", ctaAbsatz2: \"That includes prescription health apps, clinical decision support systems for physicians and complex healthcare platforms.\", ctaFrage: \"Planning a software medical device?\", ctaKnopf: \"Get in touch\", artikelUrl: \"https:\/\/quickbirdmedical.com\/en\/iec-62304-medical-device-software-app\/\", kontaktUrl: \"https:\/\/quickbirdmedical.com\/en\/kontakt\/\" }; if(SPRACHE === \"en\") TEXTE = TEXTE_EN; var REIHENFOLGE = ['start','basis','q1','eval','q2','q3']; var ALLE_KNOTEN = ['n-start','n-q1','n-eval','n-q2','n-q3','n-A','n-B','n-C']; var ALLE_KANTEN = ['e-start','e-q1-yes','e-eval','e-q2-yes','e-q1-no','e-q2-no','e-va','e-va2','e-q3-b','e-q3-c']; var ALLE_LABELS = ['lbl-q1-no','lbl-q2-no','lbl-q1-yes','lbl-q3-b','lbl-q3-c']; \/* Welche Kanten und Labels leuchten, wenn manvonX nach Y geht. Als Tabelle, damit im Skript kein kaufmaennisches Und stehen muss. *\/ var KANTEN = { 'basis': { k: ['e-start'], l: [] }, 'eval': { k: ['e-eval'], l: [] }, 'q1>eval': { k: ['e-q1-yes'], l: ['lbl-q1-yes'] }, 'q1>A': { k: ['e-q1-no', 'e-va', 'e-va2'], l: ['lbl-q1-no'] }, 'q2>q3': { k: ['e-q2-yes'], l: [] }, 'q2>A': { k: ['e-q2-no', 'e-va2'], l: ['lbl-q2-no'] }, 'q3>B': { k: ['e-q3-b'], l: ['lbl-q3-b'] }, 'q3>C': { k: ['e-q3-c'], l: ['lbl-q3-c'] } }; function kantenFuer(von, nach){ return KANTEN[von + '>' + nach] || KANTEN[von] || { k: [], l: [] }; } \/* ---------------- Zustand ---------------- *\/ var verlauf = []; \/* [{schritt:'q1', antwort:'Ja', ziel:'eval'}] *\/ var aktuell = 'start'; var elInhalt = el('scn-inhalt'); var elEntscheidung = el('scn-entscheidung'); var elPunkte = el('scn-punkte'); var elZahl = el('scn-schrittzahl'); var btnZurueck = el('scn-zurueck'); var btnNeu = el('scn-neu'); var UND = String.fromCharCode(38); var NAMEN = { '<': 'lt', '>': 'gt', '\"': 'quot' }; NAMEN[UND] = 'amp'; var RE_MASK = new RegExp('[' + UND + '<>\"]', 'g'); function esc(s){ return String(s).replace(RE_MASK, function(c){ return UND + NAMEN[c] + ';'; }); } function istErgebnis(id){ return !!ERGEBNISSE[id]; } \/* ---------------- Grafik zeichnen ---------------- *\/ function grafikAktualisieren(){ ALLE_KNOTEN.forEach(function(id){ var g = el(id); if(g) g.classList.remove('aktiv','pfad','klickbar'); }); ALLE_KANTEN.forEach(function(id){ var p = el(id); if(p) p.classList.remove('pfad'); }); ALLE_LABELS.forEach(function(id){ var t = el(id); if(t) t.classList.remove('pfad-lbl'); }); verlauf.forEach(function(e){ var g = el(SCHRITTE[e.schritt].knoten); if(g){ g.classList.add('pfad','klickbar'); } var kf = kantenFuer(e.schritt, e.ziel); kf.k.forEach(function(id){ var p = el(id); if(p) p.classList.add('pfad'); }); kf.l.forEach(function(id){ var t = el(id); if(t) t.classList.add('pfad-lbl'); }); }); var aktKnoten = istErgebnis(aktuell) ? ERGEBNISSE[aktuell].knoten : SCHRITTE[aktuell].knoten; var ga = el(aktKnoten); if(ga){ ga.classList.remove('pfad'); ga.classList.add('aktiv'); } ALLE_KNOTEN.forEach(function(id){ var g = el(id); if(!g) return; if(g.classList.contains('klickbar')){ g.setAttribute('tabindex', '0'); g.setAttribute('role', 'button'); g.setAttribute('aria-label', 'Zur\u00fcck zu diesem Schritt'); } else { g.removeAttribute('tabindex'); g.removeAttribute('role'); g.removeAttribute('aria-label'); } }); } \/* ---------------- Fortschritt ---------------- *\/ function fortschrittAktualisieren(){ var gesamt = 5; \/* basis, q1, eval, q2, q3 *\/ var erledigt = verlauf.filter(function(e){ return e.schritt !== 'start'; }).length; \/* Der Balken zaehlt den Schritt mit, in dem man steht, sonst haengt er gegenueber der Beschriftung immer einen zurueck: bei \"Schritt 1 von 5\" waere kein einziger Strich markiert. Auf dem Einstieg ist noch keiner an, der zaehlt nicht mit, und am Ergebnis sind alle an. *\/ var stand = istErgebnis(aktuell) ? gesamt : (aktuell === 'start' ? 0 : erledigt + 1); var html = ''; for(var i = 0; i < gesamt; i++){ var klasse = i < stand - 1 ? 'an' : (i === stand - 1 ? 'an jetzt' : ''); html += '\\x3Ci class=\"' + klasse + '\">\\x3C\/i>'; } elPunkte.innerHTML = html; if(istErgebnis(aktuell)){ elZahl.textContent = TEXTE.labelErgebnis; } else if(aktuell === 'start'){ elZahl.textContent = TEXTE.labelStart; } else { elZahl.textContent = TEXTE.schrittzahl.replace(\"{nr}\", stand).replace(\"{gesamt}\", gesamt); } \/* Auf dem Einstieg und im ersten Schritt gibt es noch nichts zurueckzunehmen. Beide Knoepfe erscheinen erst, sobald eine Antwort hinter einem liegt. *\/ btnZurueck.disabled = verlauf.length === 0; var fuss = btnZurueck.parentNode ? btnZurueck.parentNode.parentNode : null; if(fuss) fuss.classList.toggle('ohne-nav', erledigt === 0); } \/* ---------------- Rendern ---------------- *\/ function kartenHtml(karten){ if(!karten) return ''; var h = '\\x3Cdiv class=\"scn-karten\">'; karten.forEach(function(k){ h += '\\x3Cdiv class=\"scn-karte\">\\x3Ch4>' + esc(k.kopf) + '\\x3C\/h4>\\x3Cul>'; k.punkte.forEach(function(p){ h += '\\x3Cli>' + esc(p) + '\\x3C\/li>'; }); h += '\\x3C\/ul>\\x3C\/div>'; }); return h + '\\x3C\/div>'; } function schrittRendern(id){ var s = SCHRITTE[id]; var h = '\\x3Cdiv class=\"scn-frage\">' + esc(s.titel) + '\\x3C\/div>'; if(s.original) h += '\\x3Cdiv class=\"scn-original\">\\x3Cb>Originalwortlaut der Norm\\x3C\/b>' + esc(s.original) + '\\x3C\/div>'; h += '\\x3Cp class=\"scn-erklaerung\">' + esc(s.text) + '\\x3C\/p>'; h += kartenHtml(s.karten); if(s.hinweis){ h += '\\x3Cdiv class=\"scn-hinweis\">\\x3Cb>' + esc(s.hinweisTitel || TEXTE.hinweisTitel) + '\\x3C\/b>' + esc(s.hinweis); if(s.hinweisPunkte){ h += '\\x3Col class=\"scn-hinweis-liste\">'; s.hinweisPunkte.forEach(function(p){ h += '\\x3Cli>' + esc(p) + '\\x3C\/li>'; }); h += '\\x3C\/ol>'; } h += '\\x3C\/div>'; } elInhalt.innerHTML = h; elEntscheidung.innerHTML = aktionenHtml(s.aktionen); } \/* Immer an derselben Stelle, im abgesetzten Bereich unten: hier geht es weiter *\/ function aktionenHtml(aktionen){ var h = '\\x3Cdiv class=\"lbl\">' + (aktionen.length > 1 ? TEXTE.labelEntscheidung : TEXTE.labelWeiter) + '\\x3C\/div>'; h += '\\x3Cdiv class=\"scn-aktionen ' + (aktionen.length > 1 ? 'zwei' : '') + '\">'; aktionen.forEach(function(a){ h += '\\x3Cbutton class=\"scn-btn ' + (a.stil || '') + '\" type=\"button\" data-ziel=\"' + a.ziel + '\" data-antwort=\"' + esc(a.antwort || '') + '\">' + '\\x3Cspan class=\"kopf\">\\x3Cspan class=\"t\">' + esc(a.t) + '\\x3C\/span>\\x3Cspan class=\"pfeil\" aria-hidden=\"true\">\\u2192\\x3C\/span>\\x3C\/span>' + (a.s ? '\\x3Cspan class=\"s\">' + esc(a.s) + '\\x3C\/span>' : '') + (a.z ? '\\x3Cspan class=\"z\">' + esc(a.z) + '\\x3C\/span>' : '') + '\\x3C\/button>'; }); return h + '\\x3C\/div>'; } function ergebnisRendern(id){ var e = ERGEBNISSE[id]; var h = '\\x3Cdiv class=\"scn-erg-kopf ' + e.klasse + '\" style=\"margin:-20px -18px 0\">' + '\\x3Cdiv class=\"lbl\">' + esc(TEXTE.ergebnisLabel) + '\\x3C\/div>\\x3Ch3 class=\"scn-erg-name\">' + esc(e.name) + '\\x3C\/h3>' + '\\x3Cp>' + esc(e.kurz) + '\\x3C\/p>' + '\\x3Cp class=\"scn-erg-fuss\">' + esc(TEXTE.ergebnisFuss) + '\\x3C\/p>\\x3C\/div>'; h += '\\x3Cp class=\"scn-erg-text\">' + esc(e.text) + '\\x3C\/p>'; if(e.hinweis) h += '\\x3Cp class=\"scn-erg-text\">' + esc(e.hinweis) + '\\x3C\/p>'; h += '\\x3Cp class=\"scn-erg-text\">\\x3Ca href=\"' + TEXTE.artikelUrl + '\" target=\"_blank\" rel=\"noopener\">' + esc(TEXTE.ergebnisLink.replace(\"{klasse}\", e.name)) + '\\x3C\/a>\\x3C\/p>'; h += '\\x3Cdiv class=\"scn-cta\">\\x3Ch3>' + esc(TEXTE.ctaTitel) + '\\x3C\/h3>' + '\\x3Cp>' + esc(TEXTE.ctaAbsatz1) + '\\x3C\/p>' + '\\x3Cp>' + esc(TEXTE.ctaAbsatz2) + '\\x3C\/p>' + '\\x3Cp class=\"scn-cta-frage\">' + esc(TEXTE.ctaFrage) + '\\x3C\/p>' + '\\x3Ca href=\"' + TEXTE.kontaktUrl + '\" target=\"_blank\" rel=\"noopener\">' + esc(TEXTE.ctaKnopf) + '\\x3C\/a>\\x3C\/div>'; elInhalt.innerHTML = h; elEntscheidung.innerHTML = ''; } function zeichnen(){ if(istErgebnis(aktuell)) ergebnisRendern(aktuell); else schrittRendern(aktuell); grafikAktualisieren(); fortschrittAktualisieren(); } \/* Erst nach der ersten Eingabe fuehren, damit die Seite beim Laden nicht springt *\/ function fokusSetzen(){ var b = elEntscheidung.querySelector(\".scn-btn\"); if(b) b.focus({ preventScroll: true }); } function fuehren(){ if(window.matchMedia(\"(max-width:900px)\").matches){ elInhalt.scrollIntoView({ behavior: \"smooth\", block: \"start\" }); } fokusSetzen(); } \/* ---------------- Navigation ---------------- *\/ var gesperrtBis = 0; function gehe(ziel, antwort){ if(istErgebnis(aktuell)) return; var jetzt = new Date().getTime(); if(jetzt < gesperrtBis){ fokusSetzen(); return; } \/* Doppelklick landet sonst auf dem Knopf des naechsten Schritts *\/ gesperrtBis = jetzt + 220; verlauf.push({ schritt: aktuell, antwort: antwort || 'weiter', ziel: ziel }); aktuell = ziel; zeichnen(); fuehren(); } function zurueck(){ if(!verlauf.length) return; var letzter = verlauf.pop(); aktuell = letzter.schritt; zeichnen(); fuehren(); } function neu(){ verlauf = []; aktuell = 'start'; zeichnen(); fuehren(); } \/* ---------------- Ereignisse ---------------- *\/ elEntscheidung.addEventListener('click', function(ev){ var b = ev.target.closest('button'); if(!b || !b.dataset.ziel) return; gehe(b.dataset.ziel, b.dataset.antwort || 'weiter'); }); btnZurueck.addEventListener('click', zurueck); btnNeu.addEventListener('click', neu); \/* Klick oder Eingabetaste auf einem bereits durchlaufenen Knoten springt dorthin zurueck *\/ function knotenSprung(g){ if(!g.classList.contains('klickbar')) return; var ziel = g.dataset.step; var idx = -1; verlauf.forEach(function(v, i){ if(idx === -1){ if(v.schritt === ziel) idx = i; } }); if(idx === -1) return; verlauf = verlauf.slice(0, idx); aktuell = ziel; zeichnen(); fuehren(); } wurzel.querySelectorAll('svg.fig g.node').forEach(function(g){ g.addEventListener('click', function(){ knotenSprung(g); }); g.addEventListener('keydown', function(ev){ if(ev.key === 'Enter' || ev.key === ' '){ ev.preventDefault(); knotenSprung(g); } }); }); var svgFig = wurzel.querySelector(\"svg.fig\"); \/* Vollbild als dialog: rendert im Top-Layer und ist damit unabhaengig davon, ob eine Divi-Sektion einen transform-Kontext aufspannt. Das echte SVG wandert hinein und behaelt Zustand und Klickverhalten. *\/ var lb = el(\"scn-lb\"); var lbBuehne = el(\"scn-lb-buehne\"); var buehne = wurzel.querySelector(\".scn-buehne\"); var btnVoll = el(\"scn-vollbild\"); var btnVollZu = el(\"scn-lb-zu\"); function vollbildAuf(){ if(lb.open) return; lbBuehne.appendChild(svgFig); if(typeof lb.showModal === \"function\") lb.showModal(); else lb.setAttribute(\"open\", \"\"); btnVollZu.focus(); var akt = svgFig.querySelector(\"g.node.aktiv\"); if(akt){ if(akt.scrollIntoView) akt.scrollIntoView({ block: \"center\", inline: \"center\" }); } } function vollbildZu(){ buehne.appendChild(svgFig); if(lb.open){ if(typeof lb.close === \"function\") lb.close(); else lb.removeAttribute(\"open\"); } btnVoll.focus(); } btnVoll.addEventListener(\"click\", vollbildAuf); \/* ===== Ausbruch aus einer schmalen Spalte, selbst gemessen ===== Eine reine CSS-Regel schafft das nicht: Sie kennt weder den linken Rand der Gastspalte noch die fest positionierte Seitenspalte rechts. Zentriert man auf die Spalte, rutscht das Werkzeug darunter, und dort war ein Antwortknopf nicht klickbar. Es waechst deshalb nur nach links, hoechstens bis 20 Pixel vor den Fensterrand, und die rechte Kante bleibt an der Spalte. *\/ var GRENZE = 1180; var ENG = 980; \/* darunter passen zwei Spalten nicht mehr sinnvoll nebeneinander *\/ function breiteAnpassen(){ var breit = wurzel.classList.contains(\"scn-breit\"); var mitte = wurzel.classList.contains(\"scn-mitte\"); if(breit || mitte){ wurzel.style.width = \"\"; wurzel.style.marginLeft = \"\"; if(!window.matchMedia(\"(max-width:900px)\").matches){ var r = wurzel.getBoundingClientRect(); var sicht = wurzel.ownerDocument.documentElement.clientWidth; var ziel, linksSoll; if(mitte){ \/* Im Fenster zentrieren. Fuer Seiten ohne feste Seitenspalte. *\/ ziel = Math.min(GRENZE, sicht - 40); linksSoll = Math.round((sicht - ziel) \/ 2); } else { \/* Rechte Kante an der Gastspalte lassen, nach links wachsen. Nur so kollidiert es nicht mit einer fest positionierten Spalte. *\/ ziel = Math.min(GRENZE, r.right - 20); linksSoll = Math.round(r.right - ziel); } if(ziel > r.width + 1){ wurzel.style.width = Math.round(ziel) + \"px\"; wurzel.style.marginLeft = Math.round(linksSoll - r.left) + \"px\"; } } } \/* Danach messen: die Klasse haengt an der eigenen Breite, nicht am Fenster *\/ wurzel.classList.toggle(\"scn-eng\", wurzel.getBoundingClientRect().width < ENG); } breiteAnpassen(); if(window.ResizeObserver){ new window.ResizeObserver(function(){ breiteAnpassen(); }).observe(wurzel.ownerDocument.body); } else { wurzel.ownerDocument.defaultView.addEventListener(\"resize\", breiteAnpassen); } btnVollZu.addEventListener(\"click\", vollbildZu); \/* Escape loest bei einem dialog cancel aus, das SVG muss vorher zurueckwandern *\/ lb.addEventListener(\"cancel\", function(ev){ ev.preventDefault(); vollbildZu(); }); lb.addEventListener(\"click\", function(ev){ if(ev.target === lb) vollbildZu(); }); graphBeschriften(); zeichnen(); } var alle = document.querySelectorAll(\".scn\"); for(var i = 0; i < alle.length; i++) initScn(alle[i]); })(); <!-- [et_pb_line_break_holder] --><\/script>[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=&#8221;1&#8243; next_background_color=&#8221;#ffffff&#8221; disabled_on=&#8221;off|off|off&#8221; admin_label=&#8221;CTA&#8221; _builder_version=&#8221;4.21.0&#8243; background_color=&#8221;#ffbe6b&#8221; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_stops=&#8221;rgba(65,182,230,0.59) 0%|rgba(65,182,230,0.76) 70%&#8221; background_color_gradient_overlays_image=&#8221;on&#8221; background_color_gradient_start=&#8221;rgba(65,182,230,0.59)&#8221; background_color_gradient_end=&#8221;rgba(65,182,230,0.76)&#8221; background_color_gradient_end_position=&#8221;70%&#8221; background_image=&#8221;https:\/\/quickbirdmedical.com\/wp-content\/uploads\/2025\/05\/QBM_69-1_V1-1_35.webp&#8221; custom_margin=&#8221;-1px||||false|false&#8221; custom_padding=&#8221;||0px||false&#8221; top_divider_style=&#8221;slant2&#8243; top_divider_color=&#8221;#FFFFFF&#8221; top_divider_flip=&#8221;horizontal&#8221; bottom_divider_style=&#8221;slant2&#8243; bottom_divider_flip=&#8221;horizontal&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_row column_structure=&#8221;1_2,1_2&#8243; use_custom_gutter=&#8221;on&#8221; gutter_width=&#8221;1&#8243; make_equal=&#8221;on&#8221; custom_padding_last_edited=&#8221;on|phone&#8221; padding_top_bottom_link_1=&#8221;false&#8221; padding_top_bottom_link_2=&#8221;false&#8221; padding_left_right_link_1=&#8221;true&#8221; padding_left_right_link_2=&#8221;true&#8221; module_class=&#8221; et_pb_row_fullwidth&#8221; _builder_version=&#8221;4.21.0&#8243; width=&#8221;100%&#8221; width_tablet=&#8221;100%&#8221; width_phone=&#8221;&#8221; width_last_edited=&#8221;on|desktop&#8221; max_width=&#8221;100%&#8221; max_width_tablet=&#8221;100%&#8221; max_width_phone=&#8221;&#8221; max_width_last_edited=&#8221;on|desktop&#8221; custom_padding=&#8221;0px|0|0px|0|true|false&#8221; custom_padding_tablet=&#8221;0px|0|0px|0|true|false&#8221; custom_padding_phone=&#8221;20px|0|0px|0|false|false&#8221; make_fullwidth=&#8221;on&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;1_2&#8243; _builder_version=&#8221;4.16&#8243; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_stops=&#8221;rgba(255,255,255,0) 0%|rgba(255,255,255,0.18) 100%&#8221; background_color_gradient_start=&#8221;rgba(255,255,255,0)&#8221; background_color_gradient_end=&#8221;rgba(255,255,255,0.18)&#8221; custom_padding=&#8221;5%|6%|10%|6%&#8221; custom_padding_tablet=&#8221;&#8221; custom_padding_phone=&#8221;&#8221; custom_padding_last_edited=&#8221;on|desktop&#8221; global_colors_info=&#8221;{}&#8221; padding_last_edited=&#8221;on|desktop&#8221; custom_padding__hover=&#8221;|||&#8221;][et_pb_text admin_label=&#8221;Title&#8221; _builder_version=&#8221;4.27.6&#8243; text_font=&#8221;||||||||&#8221; text_font_size=&#8221;18px&#8221; text_line_height=&#8221;1.8em&#8221; link_font=&#8221;||||||||&#8221; ul_font=&#8221;||||||||&#8221; ol_font=&#8221;||||||||&#8221; quote_font=&#8221;||||||||&#8221; header_font=&#8221;||||||||&#8221; header_2_font=&#8221;||||||||&#8221; header_2_font_size=&#8221;40px&#8221; header_2_letter_spacing=&#8221;2px&#8221; header_2_line_height=&#8221;1.5em&#8221; header_3_font=&#8221;||||||||&#8221; header_4_font=&#8221;||||||||&#8221; header_5_font=&#8221;||||||||&#8221; header_6_font=&#8221;Lato|700|||||||&#8221; header_6_font_size=&#8221;18px&#8221; header_6_letter_spacing=&#8221;1px&#8221; header_6_line_height=&#8221;1.8em&#8221; text_orientation=&#8221;right&#8221; background_layout=&#8221;dark&#8221; max_width=&#8221;600px&#8221; module_alignment=&#8221;right&#8221; animation_style=&#8221;slide&#8221; animation_direction=&#8221;bottom&#8221; animation_intensity_slide=&#8221;5%&#8221; hover_enabled=&#8221;0&#8243; header_2_font_size_tablet=&#8221;&#8221; header_2_font_size_phone=&#8221;22px&#8221; header_2_font_size_last_edited=&#8221;on|phone&#8221; text_orientation_tablet=&#8221;left&#8221; text_orientation_phone=&#8221;left&#8221; text_orientation_last_edited=&#8221;on|tablet&#8221; inline_fonts=&#8221;overpass-extralight&#8221; global_colors_info=&#8221;{}&#8221; sticky_enabled=&#8221;0&#8243;]<\/p>\n<h2>Are you planning to implement medical software?<\/h2>\n<p>[\/et_pb_text][\/et_pb_column][et_pb_column type=&#8221;1_2&#8243; _builder_version=&#8221;4.16&#8243; custom_padding=&#8221;5%|6%|10%|6%&#8221; custom_padding_tablet=&#8221;||150px|&#8221; custom_padding_phone=&#8221;&#8221; custom_padding_last_edited=&#8221;on|desktop&#8221; global_colors_info=&#8221;{}&#8221; padding_tablet=&#8221;||150px|&#8221; padding_last_edited=&#8221;on|desktop&#8221; custom_padding__hover=&#8221;|||&#8221; padding_phone=&#8221;||150px|&#8221;][et_pb_text _builder_version=&#8221;4.21.0&#8243; text_font=&#8221;Lato||||||||&#8221; text_font_size=&#8221;18px&#8221; text_line_height=&#8221;1.8em&#8221; background_layout=&#8221;dark&#8221; max_width=&#8221;600px&#8221; animation_style=&#8221;slide&#8221; animation_direction=&#8221;bottom&#8221; animation_intensity_slide=&#8221;5%&#8221; text_font_size_tablet=&#8221;&#8221; text_font_size_phone=&#8221;&#8221; text_font_size_last_edited=&#8221;on|tablet&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p>Contact us for a free initial consultation. We will give you an estimate of the effort and timeframe required to implement your project. We will also examine the regulatory and strategic framework conditions for your product.<\/p>\n<p>[\/et_pb_text][et_pb_button button_url=&#8221;https:\/\/quickbirdmedical.com\/en\/kontakt\/&#8221; button_text=&#8221;Contact us&#8221; button_alignment=&#8221;left&#8221; _builder_version=&#8221;4.16&#8243; custom_button=&#8221;on&#8221; button_text_size=&#8221;14px&#8221; button_text_color=&#8221;#41B6E6&#8243; button_bg_color=&#8221;#ffffff&#8221; button_border_width=&#8221;12px&#8221; button_border_color=&#8221;#ffffff&#8221; button_border_radius=&#8221;0px&#8221; button_letter_spacing=&#8221;1px&#8221; button_font=&#8221;|900||on|||||&#8221; button_use_icon=&#8221;off&#8221; custom_margin=&#8221;20px|||&#8221; custom_margin_tablet=&#8221;|0px||&#8221; custom_margin_last_edited=&#8221;off|desktop&#8221; custom_padding=&#8221;|40px||40px||true&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; button_text_size__hover_enabled=&#8221;off&#8221; button_one_text_size__hover_enabled=&#8221;off&#8221; button_two_text_size__hover_enabled=&#8221;off&#8221; button_text_color__hover_enabled=&#8221;off&#8221; button_one_text_color__hover_enabled=&#8221;off&#8221; button_two_text_color__hover_enabled=&#8221;off&#8221; button_border_width__hover_enabled=&#8221;off&#8221; button_one_border_width__hover_enabled=&#8221;off&#8221; button_two_border_width__hover_enabled=&#8221;off&#8221; button_border_color__hover_enabled=&#8221;off&#8221; button_one_border_color__hover_enabled=&#8221;off&#8221; button_two_border_color__hover_enabled=&#8221;off&#8221; button_border_radius__hover_enabled=&#8221;off&#8221; button_one_border_radius__hover_enabled=&#8221;off&#8221; button_two_border_radius__hover_enabled=&#8221;off&#8221; button_letter_spacing__hover_enabled=&#8221;on&#8221; button_one_letter_spacing__hover_enabled=&#8221;off&#8221; button_two_letter_spacing__hover_enabled=&#8221;off&#8221; button_bg_color__hover_enabled=&#8221;off&#8221; button_one_bg_color__hover_enabled=&#8221;off&#8221; button_two_bg_color__hover_enabled=&#8221;off&#8221; button_letter_spacing__hover=&#8221;2px&#8221;][\/et_pb_button][\/et_pb_column][\/et_pb_row][\/et_pb_section]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Determine your software safety class under IEC 62304 in five minutes Our interactive tool for Software as a Medical Device (SaMD) and embedded software as part of a medical device. A first assessment in 5 minutes. Does your software fall under safety class A, B or C of IEC 62304? This classification decides how much [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"","inline_featured_image":false,"footnotes":""},"class_list":["post-28455","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Determine your software safety class under IEC 62304 in five minutes - QuickBird Medical<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/quickbirdmedical.com\/en\/tool-iec-62304-software-safety-class-a-b-c\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Determine your software safety class under IEC 62304 in five minutes - QuickBird Medical\" \/>\n<meta property=\"og:description\" content=\"Determine your software safety class under IEC 62304 in five minutes Our interactive tool for Software as a Medical Device (SaMD) and embedded software as part of a medical device. A first assessment in 5 minutes. Does your software fall under safety class A, B or C of IEC 62304? This classification decides how much [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/quickbirdmedical.com\/en\/tool-iec-62304-software-safety-class-a-b-c\/\" \/>\n<meta property=\"og:site_name\" content=\"QuickBird Medical\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-31T06:59:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/quickbirdmedical.com\/wp-content\/uploads\/2026\/08\/Social-Preview-Fallback-Image.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"3749\" \/>\n\t<meta property=\"og:image:height\" content=\"2109\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/quickbirdmedical.com\\\/en\\\/tool-iec-62304-software-safety-class-a-b-c\\\/\",\"url\":\"https:\\\/\\\/quickbirdmedical.com\\\/en\\\/tool-iec-62304-software-safety-class-a-b-c\\\/\",\"name\":\"Determine your software safety class under IEC 62304 in five minutes - QuickBird Medical\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/quickbirdmedical.com\\\/en\\\/#website\"},\"datePublished\":\"2026-08-27T09:27:48+00:00\",\"dateModified\":\"2026-08-31T06:59:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/quickbirdmedical.com\\\/en\\\/tool-iec-62304-software-safety-class-a-b-c\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/quickbirdmedical.com\\\/en\\\/tool-iec-62304-software-safety-class-a-b-c\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/quickbirdmedical.com\\\/en\\\/tool-iec-62304-software-safety-class-a-b-c\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/quickbirdmedical.com\\\/en\\\/home-neu\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Determine your software safety class under IEC 62304 in five minutes\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/quickbirdmedical.com\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/quickbirdmedical.com\\\/en\\\/\",\"name\":\"QuickBird Medical\",\"description\":\"Entwicklung von medizinischer Software und DiGA\",\"publisher\":{\"@id\":\"https:\\\/\\\/quickbirdmedical.com\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/quickbirdmedical.com\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/quickbirdmedical.com\\\/en\\\/#organization\",\"name\":\"QuickBird Medical\",\"url\":\"https:\\\/\\\/quickbirdmedical.com\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/quickbirdmedical.com\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/quickbirdmedical.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/QBM_Logo_web-01-1.webp\",\"contentUrl\":\"https:\\\/\\\/quickbirdmedical.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/QBM_Logo_web-01-1.webp\",\"width\":875,\"height\":255,\"caption\":\"QuickBird Medical\"},\"image\":{\"@id\":\"https:\\\/\\\/quickbirdmedical.com\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/de.linkedin.com\\\/showcase\\\/quickbird-medical\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Determine your software safety class under IEC 62304 in five minutes - QuickBird Medical","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/quickbirdmedical.com\/en\/tool-iec-62304-software-safety-class-a-b-c\/","og_locale":"en_US","og_type":"article","og_title":"Determine your software safety class under IEC 62304 in five minutes - QuickBird Medical","og_description":"Determine your software safety class under IEC 62304 in five minutes Our interactive tool for Software as a Medical Device (SaMD) and embedded software as part of a medical device. A first assessment in 5 minutes. Does your software fall under safety class A, B or C of IEC 62304? This classification decides how much [&hellip;]","og_url":"https:\/\/quickbirdmedical.com\/en\/tool-iec-62304-software-safety-class-a-b-c\/","og_site_name":"QuickBird Medical","article_modified_time":"2026-08-31T06:59:38+00:00","og_image":[{"width":3749,"height":2109,"url":"https:\/\/quickbirdmedical.com\/wp-content\/uploads\/2026\/08\/Social-Preview-Fallback-Image.webp","type":"image\/webp"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/quickbirdmedical.com\/en\/tool-iec-62304-software-safety-class-a-b-c\/","url":"https:\/\/quickbirdmedical.com\/en\/tool-iec-62304-software-safety-class-a-b-c\/","name":"Determine your software safety class under IEC 62304 in five minutes - QuickBird Medical","isPartOf":{"@id":"https:\/\/quickbirdmedical.com\/en\/#website"},"datePublished":"2026-08-27T09:27:48+00:00","dateModified":"2026-08-31T06:59:38+00:00","breadcrumb":{"@id":"https:\/\/quickbirdmedical.com\/en\/tool-iec-62304-software-safety-class-a-b-c\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/quickbirdmedical.com\/en\/tool-iec-62304-software-safety-class-a-b-c\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/quickbirdmedical.com\/en\/tool-iec-62304-software-safety-class-a-b-c\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/quickbirdmedical.com\/en\/home-neu\/"},{"@type":"ListItem","position":2,"name":"Determine your software safety class under IEC 62304 in five minutes"}]},{"@type":"WebSite","@id":"https:\/\/quickbirdmedical.com\/en\/#website","url":"https:\/\/quickbirdmedical.com\/en\/","name":"QuickBird Medical","description":"Entwicklung von medizinischer Software und DiGA","publisher":{"@id":"https:\/\/quickbirdmedical.com\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/quickbirdmedical.com\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/quickbirdmedical.com\/en\/#organization","name":"QuickBird Medical","url":"https:\/\/quickbirdmedical.com\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/quickbirdmedical.com\/en\/#\/schema\/logo\/image\/","url":"https:\/\/quickbirdmedical.com\/wp-content\/uploads\/2022\/06\/QBM_Logo_web-01-1.webp","contentUrl":"https:\/\/quickbirdmedical.com\/wp-content\/uploads\/2022\/06\/QBM_Logo_web-01-1.webp","width":875,"height":255,"caption":"QuickBird Medical"},"image":{"@id":"https:\/\/quickbirdmedical.com\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/de.linkedin.com\/showcase\/quickbird-medical\/"]}]}},"_links":{"self":[{"href":"https:\/\/quickbirdmedical.com\/en\/wp-json\/wp\/v2\/pages\/28455","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/quickbirdmedical.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/quickbirdmedical.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/quickbirdmedical.com\/en\/wp-json\/wp\/v2\/users\/29"}],"replies":[{"embeddable":true,"href":"https:\/\/quickbirdmedical.com\/en\/wp-json\/wp\/v2\/comments?post=28455"}],"version-history":[{"count":4,"href":"https:\/\/quickbirdmedical.com\/en\/wp-json\/wp\/v2\/pages\/28455\/revisions"}],"predecessor-version":[{"id":28521,"href":"https:\/\/quickbirdmedical.com\/en\/wp-json\/wp\/v2\/pages\/28455\/revisions\/28521"}],"wp:attachment":[{"href":"https:\/\/quickbirdmedical.com\/en\/wp-json\/wp\/v2\/media?parent=28455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}