TSM - Dezvoltarea de aplicații safety-critical în SCADE

Hunor Csomortani - Software Developer


Cerințele impuse de standardele în domeniu fac ca dezvoltarea aplicațiilor critice din punctul de vedere al securității (safety-critical software) să reprezinte o provocare continuă pentru toți participanții în proces. Mediul de dezvoltare SCADE impune rigurozitatea necesară pentru aceste proiecte chiar de la începutul dezvoltării. Bazându-se pe un limbaj sincron, determinist, cu generator de cod C certificat și un set de instrumente care facilitează testarea și verificarea produsului, SCADE permite să ne concentrăm la implementarea cerințelor de nivel înalt, și ne scapă de grija comiterii greșelilor de bază.

Articolul propune să facă o scurtă prezentare a mediului de dezvoltare, prezentând avantajele, dezavantajele și provocările la care programatorul trebuie să facă față.

Mediul de dezvoltare SCADE

Mediul de dezvoltare SCADE se bazează pe limbajul Scade, limbaj sincron conceput pentru dezvoltarea sistemelor reactive. Extensia oferită de SCADE acestui limbaj este un mediu de dezvoltare grafică, care permite modelarea aplicației într-un mod foarte asemănător proiectării circuitelor integrate.

Dezvoltarea în SCADE înseamnă crearea unor operatori, prezentând funcționalitatea acestora pe diagrame, folosind un set de operatori predefiniți. Diagramele pot fi de tip data flow sau control flow (automate finite), fiind posibilă și combinarea acestor două abordări. Prin legarea operatorilor se creează modelul unei aplicații reactive, menit să fie rulat ciclic, la începutul fiecărui ciclu citind valorile de intrare și calculând valorile de ieșire, luând în considerare și stările interioare al sistemului.

Tipurile de date disponibile sunt cele de bază (int, real, char, bool), având posibilitatea de a defini propriile tipuri compuse (șiruri, enumerări, structuri) sau a importa tipuri declarate în C sau C++. La fel este posibil și folosirea unor operatori importați, a căror funcționalitate este implementată în alte limbaje de programare.

Sincronicitatea modelului înseamnă că rezultatele calculate sunt independente de ordinea de execuție, ele având o singură valoare posibilă în cadrul unui ciclu. Astfel concepția de "timp" poate fi omisă - o abstractizare utilă în cazul sistemelor reactive, având ca rezultat un timp finit de execuție a aplicației, care respectă constrângerile mediului de operare.

SCADE impune aceste constrângeri teoretice în timpul modelării, dar și printr-un pas de verificare a modelului creat. Aceasta din urmă asigură corectitudinea designului creat din toate punctele de vedere, având un rol asemănător unui compilator.

La capitolul de verificare putem folosi simulatorul pentru a pune modelul creat în mișcare. Setând valori pentru interfețele de intrare se poate verifica starea celei mai mici părți al acestuia: valorile variabilelor, al fluxurilor de date între operatori și în interiorul acestora, tranzițiile și stările active al automatelor finite.

Exemplu

De exemplu, să modelăm o aplicație care controlează un sistem de închidere. Să fie valoarea de intrare starea unui buton de comandă (apăsat sau nu), iar valoarea de ieșire comanda de închidere sau deschidere.

Primul operator va transforma starea butonului într-o valoare rising edge: true numai în cazul în care starea butonului se schimbă din neapăsat în apăsat. Funcționalitatea poate fi modelată în modul următor:

În celălalt operator modelăm stările sistemului (închis/deschis), și tranzițiile posibile între aceste stări, cu ajutorul unui automat finit. Condiția de activare a tranzițiilor este valuarea true a variabilei command.

În pasul următor putem lega cei doi operatori, creând modelul aplicației.

Generare de cod C

Cu ajutorul generatorului de cod KCG putem transforma modelele create într-un cod C compilabil, lipsit de erori low level de programare. Deoarece precondiția generării este un model valid, codul C păstrează calitățile teoretice - sincronicitate, determinism - al acestuia.

Integrarea codului se realizează prin apelarea funcțiilor C generate. Se poate crea o clasă wrapper, care să reprezinte interfața între funcțiile C și restul aplicației, creând un singur punct de dependență față de codul generat. Această abordare ne permite ca fișierele C să devină obiecte temporare în procesul de build, modelul SCADE preluând rolul de cod sursă.

Generatorul este certificat conform mai multor standarde de securitate din industrie: DO-178B (aplicații din domeniul aeronauticii și apărării), EN 50128 (aplicații din domeniul transportul feroviar), IEC 61508 (aplicații din domeniul industriei și energeticii) ș.a.m.d., lucru care facilitează procesul de acceptanță a sistemelor dezvoltate cu ajutorul SCADE.

Operatorul RisingEdge din exemplul precedent este transformată în următoarea funcție C:

/* Playground::RisingEdge */
void RisingEdge_Playground(
  inC_RisingEdge_Playground *inC,
  outC_RisingEdge_Playground *outC)
{
  kcg_bool tmp;
  
  if (kcg_cond(outC->init)) {
    outC->init = kcg_false;
    tmp = kcg_not(inC->btnPressed);
  }
  else {
    tmp = kcg_not(outC->rem_btnPressed);
  }
  outC->isRising = kcg_and(tmp, inC->btnPressed);
  outC->rem_btnPressed = inC->btnPressed;
}

Avantaje

Prin dezvoltarea în SCADE se poate asigura un nivel de calitate ridicat al aplicației pe tot parcursul procesului de dezvoltare, nefiind necesară folosirea altor instrumente în acest sens. Constrângerile teoretice al sincronicității, aplicate din primul moment, oferă siguranța că rezultatul va face față cerințelor impuse aplicațiilor safety-critical: sistemul va avea o stare bine definită în toate condițiile și va reacționa într-un timp finit, ușor de definit și măsurat. În același timp diagramele sunt suficient de auto-explicative ca să reprezinte un mijloc bun de comunicare între participanții în proiect.

Dezavantaje

Punctele forte uneori însă devin și cele slabe: abordarea grafică cere o atenție mult mai mare în cazul dezvoltării în echipă. În timp ce pentru obiectele textuale avem la dispoziție instrumente mature pentru a îmbina progresul făcut de mai mulți participanți, în cazul diagramelor grafice acest lucru este o provocare continuă, lucru imposibil uneori, și o situație mai bine de evitat.

Din cauza rigurozității limbajului, dependințele dintre fișierele de model sunt mult mai mari: de exemplu, interfețele între operatori trebuie să corespundă în mod exact pentru a avea un model valid, ceea ce necesită o cooperare mult mai strânsă între dezvoltatori.

SCADE ne oferă soluții limitate și de cele mai multe ori foarte greoaie pentru a trata structuri de date foarte mari și complexe. La fel, nu este soluția ideală pentru dezvoltarea aplicațiilor care implică efectuarea unor calcule intensive.

Provocări

Cea mai mare provocare la care programatorul trebuie să facă față este să se obișnuiască cu abordarea sincronă. Foarte multe constrângeri, care în alte limbaje pot fi impuse numai prin tool-uri separate sau o arhitectură vizată, în SCADE constituie o parte integrantă a limbajului de bază și a mediului de dezvoltare, ruperea acestora fiind imposibilă chiar și în cazuri în care acesta ar fi un lucru dorit.

Concluzii

Bazându-se pe un limbaj sincron, SCADE impune ca însușirile cele mai importante ale aplicațiilor reactive - timp finit de execuție și stări bine definite în toate condițiile - să fie respectate pe tot parcursul procesului de dezvoltare. Generatorul de cod certificat facilitează transformarea modelelor create în cod C și integrarea în restul sistemului. Cu toate dezavantajele sale, mediul de dezvoltare SCADE este o soluție matură și potrivită pentru dezvoltarea aplicațiilor safety-critical.