Dubbi modellazione fsm

di il
5 risposte

Dubbi modellazione fsm

Salve a tutti,
ho un dubbio sulla progettazione con le macchine a stati finiti. In particolare, non riesco a capire quale livello di astrazione adottare in modo da ottenere componenti riusabili e modulari.
Mi spiego meglio con un esempio: se volessi realizzare un sistema di climatizzazione/deumidifcazione, è più opportuno modellare gli stati del sistema (cooling, heating, humidifying, ecc) o modellare gli stati di ogni singola funzionalità (ad esempio heaterOn, heaterOff per il riscaldamento)?
Vorrei astrarre dall'hw con cui il sistema verrà realizzato per garantire la riusabilità.
Scusate se vi pongo tale quesito, forse banale ma mi sfugge qualcosa.

5 Risposte

  • Re: Dubbi modellazione fsm

    Suppongo che la riusabilità sia tanto migliore quanto più sei vicino a implementare il minimo comune multiplo di tutti i dispositivi; quindi da un lato penso che la seconda alternativa sia forse quella più produttiva. Non so come funzionano le macchine che vuoi comandare ma mi chiedo se ne possa esistere qualcuna in cui è possibile contemporaneamente scaldare e raffreddare per esempio per deumidificare un ambiente freddo. Se fosse così è ovvio che è meglio scendere a basso livello il più possibile e avrai un codice forse più voluminoso ma con chiamate a meno funzioni base che si suppone siano disponibili su tutti i dispositivi.

    Però mi sfugge la relazione con la FSM; forse sei su qualche controllore e vuoi gestire anche l'interfaccia utente; se fosse così non cambierebbe niente, la tua domanda è indipendente dall'implementazione e anche se avessi un vero multitasking il tuo problema di progetto resterebbe identico.
  • Re: Dubbi modellazione fsm

    Il problema, in realtà, non si pone. E' prassi assolutamente normale (contemplata anche da normative e metodologie, es. Boeing-Hatley o FDM/SSM) modellare per macrostati, ciascuno dei quali a sua volta contiene una o più FSM di dettaglio.

    La maggior parte degli ambienti evoluti in grado di generare codice da FSM (es. Statemate) supporta questo genere di funzionalità gerarchica per livelli di astrazione crescenti.
  • Re: Dubbi modellazione fsm

    Innanzitutto vi ringrazio per la vostra disponibilità.

    Alan_Reloaded ha scritto:


    Suppongo che la riusabilità sia tanto migliore quanto più sei vicino a implementare il minimo comune multiplo di tutti i dispositivi; quindi da un lato penso che la seconda alternativa sia forse quella più produttiva. Non so come funzionano le macchine che vuoi comandare ma mi chiedo se ne possa esistere qualcuna in cui è possibile contemporaneamente scaldare e raffreddare per esempio per deumidificare un ambiente freddo. Se fosse così è ovvio che è meglio scendere a basso livello il più possibile e avrai un codice forse più voluminoso ma con chiamate a meno funzioni base che si suppone siano disponibili su tutti i dispositivi.
    Sinceramente non so se esistano tali macchine. Personalmente, devo realizzare una miniserra, in cui il controllo e il condizionamento del clima viene effettuato tramite un microprocessore, per esattezza Arduino uno. Quindi devo programmare il micro in modo da riscaldare la serra azionando un asciugacapelli e "raffreddarla" tramite aerazione.

    Alan_Reloaded ha scritto:


    Però mi sfugge la relazione con la FSM; forse sei su qualche controllore e vuoi gestire anche l'interfaccia utente; se fosse così non cambierebbe niente, la tua domanda è indipendente dall'implementazione e anche se avessi un vero multitasking il tuo problema di progetto resterebbe identico.
    La programmazione del micro deve essere fatta ad alto livello, difatti utilizzo il C++, adottando i principi di riusabilità, modularità ed estendibilità.
    Dato che utilizzo un'architettura a task, le FSM mi servono per modellare il comportamento dei singoli task. Non ho alcuna interfaccia grafica.

    M.A.W. 1968 ha scritto:


    Il problema, in realtà, non si pone. E' prassi assolutamente normale (contemplata anche da normative e metodologie, es. Boeing-Hatley o FDM/SSM) modellare per macrostati, ciascuno dei quali a sua volta contiene una o più FSM di dettaglio.

    La maggior parte degli ambienti evoluti in grado di generare codice da FSM (es. Statemate) supporta questo genere di funzionalità gerarchica per livelli di astrazione crescenti.
    Della modellazione per macrostati ho visto qualcosa, ma non approfonditamente quindi perdonami se dico cavolate xD
    Applicando tale metodologia al mio contesto sembra introdurre della ridondanza, in quanto la condizione di guardia [temperatura < temperaturaMinima] permette sia la trasinzione dal macrostato "Cooling" al macrostato "Heating" sia quella dallo stato "HeaterOff" allo stato "HeaterOn" all'interno del macrostato "Heating", come è possibile vedere dai link:

    FSM del sistema: https://drive.google.com/open?id=0B5zhsz4HkGwAWkNpbjMzNzBYS1E
    FSM del macrostato "Heating": https://drive.google.com/open?id=0B5zhsz4HkGwAdjMxaC1kanVFbWM

    Non so, forse non ho ben compreso la modellazione tramite macrostati o forse dovrei modellare separatamente il comportamento dei singoli componenti (ad es heater) tramite fsm senza modellare il comportamento dell'intero sistema?!
  • Re: Dubbi modellazione fsm

    Alan_Reloaded ha scritto:


    Però mi sfugge la relazione con la FSM; forse sei su qualche controllore e vuoi gestire anche l'interfaccia utente; se fosse così non cambierebbe niente, la tua domanda è indipendente dall'implementazione e anche se avessi un vero multitasking il tuo problema di progetto resterebbe identico.
    La programmazione del micro deve essere fatta ad alto livello, difatti utilizzo il C++, adottando i principi di riusabilità, modularità ed estendibilità.
    Dato che utilizzo un'architettura a task, le FSM mi servono per modellare il comportamento dei singoli task. Non ho alcuna interfaccia grafica.
    Infatti ho accuratamente evitato di aggiungere "grafica", lo scenario cui pensavo era proprio un microcontrollore però i MC possono avere interfacce, Arduino per primo. La FSM sarebbe indicata per evitare che l'utente trovi la pulsantiera/display poco reattivi, ma per il resto su un microcontrollore che non ha un suo SO con relativo schedulatore di processi, che tu implementi come FSM o nel modo tradizionale non fa differenza: in ogni caso stai portando avanti a rotazione tutti i processi, ciascuno un passo per volta tanto che - non serve dirlo - non ci sono problemi di accesso condiviso e così via.

    Se ti serve la modularità + riusabilità, una FSM secondo me potrebbe anche essere un ostacolo perché ti spezzetta la leggibilità del flusso. Certamente in pratica ci si dovrà/potrà ricorrere perché non si sa dove si riutilizzerà il codice e in questo senso la FSM potrebbe essere un vantaggio. Ma non so dirlo dato che ho avuto un solo incarico professionale in vita mia dove ho peraltro solo sfiorato queste problematiche mentre occorrerebbe avere una certa esperienza per dire cose sensate.
  • Re: Dubbi modellazione fsm

    Arduino è solo un balocco e la relativa generazione di codice da FSM è anni luce lontana dai livelli di complessità di Statemate e simili, software che costano decine di migliaia di dollari.

    In tal caso sarebbe perfino controproducente pensare di modellare l'intero sistema con una unica complessa FSM. Modellare i singoli elementi è di gran lunga più semplice, facile da verificare anche in modo intuitivo ed informale, facile da riusare e soprattutto adatto alle limitate capacità dell'ambiente scelto.

    Alan_Reloaded ha scritto:


    Infatti ho accuratamente evitato di aggiungere "grafica", lo scenario cui pensavo era proprio un microcontrollore però i MC possono avere interfacce, Arduino per primo. La FSM sarebbe indicata per evitare che l'utente trovi la pulsantiera/display poco reattivi, ma per il resto su un microcontrollore che non ha un suo SO con relativo schedulatore di processi, che tu implementi come FSM o nel modo tradizionale non fa differenza: in ogni caso stai portando avanti a rotazione tutti i processi, ciascuno un passo per volta tanto che - non serve dirlo - non ci sono problemi di accesso condiviso e così via.

    Se ti serve la modularità + riusabilità, una FSM secondo me potrebbe anche essere un ostacolo perché ti spezzetta la leggibilità del flusso. Certamente in pratica ci si dovrà/potrà ricorrere perché non si sa dove si riutilizzerà il codice e in questo senso la FSM potrebbe essere un vantaggio. Ma non so dirlo dato che ho avuto un solo incarico professionale in vita mia dove ho peraltro solo sfiorato queste problematiche mentre occorrerebbe avere una certa esperienza per dire cose sensate.
    In effetti, meglio evitare di sbilanciarsi su questi argomenti in assenza di una solida preparazione specifica e di una vasta esperienza. Personalmente ho programmato il mio primo microcontroller nel 1984 e negli ultimi 20 anni ho lavorato a livello multinazionale sui sistemi embedded più grandi, complessi e critici previsti dalle normative.

    Ebbene, esistono sistemi altamente reattivi, in hard realtime certificato, basati su accurate combinazioni di hardware apposito, layering degli interrupt ed un banale "big loop" sequenziale, totalmente systemless... esistono perfino system on chip che incorporano core multipli gestiti da uno scheduler RR o EDF implementato su silicio, gestiti da firmware altamente semplificato e totalmente deterministico, nonostante la presenza di numerose risorse hardware condivise!

    L'uso di FSM coordinate e gerarchiche, lungi dall'essere un ostacolo alla "leggibilità", è praticamente obbligatorio in casi dove si gestiscono spazi degli stati dell'ordine di 10^21 con garanzie di raggiungibilità e copertura, calcolate su supercomputer con metodi simbolici (BDD e derivate, logiche temporali) e riscontrate puntualmente nel codice generato tramite full code coverage e interpretazione astratta.

    Naturalmente parliamo di livelli a distanze siderali dai sistemi di sviluppo altamente semplificati come Arduino.
Devi accedere o registrarti per scrivere nel forum
5 risposte