File log per macchina a stati

di il
9 risposte

File log per macchina a stati

Salve a tutti, ho un sistema che è modellato in un ambiente di sviluppo che sfrutta la rappresentazione UML, ed è possibile anche simulare il sistema creato. Ho rappresentato questo sistema in questo ambiente attraverso dei blocchi (conteneti attributi e funzioni) che rappresentano dei componenti hardware. Ogni blocco è stato modellato tramite una macchina a stato(statechart) che svolge determinati controlli, ovviamente quando il sistema è in funzione, ogni blocco svolge determinate operazioni in parallelo ad altri. Vorrei realizzare un file log che registra tutti gli stati di ogni blocco ed eventuali errori generati dalle funzioni. In un primo momente ho provato a creare un file di testo creato in linguaggio C (fileLog.txt) dove ho scritto Tempo, Stato, Blocco; ossia in ogni stato ho inserito questo codice:
FILE * fileLog;
fileLog = fopen("fileLog.txt","a");
fprintf(fileLog,"|ControlloOra       |LDiSelDelControllore  |     %u-%u-%u     |\n",tm.wMinute,tm.wSecond,tm.wMilliseconds);
fclose (fileLog);
includendo nel blocco l'header <windows.h>.
Però mi sono accorto che non tutti gli stati venivano scritti sul file, perchè ogni stato di ogni macchina essendo eseguito in parallelo ed in tempi molto brevi non riescono a scrivere sullo stesso file.
1)Quindi avete una soluzione per questo problema?
2) per il tempo ho utilizzato la struttura SYSTEMTIME del C, c'è la possibilità di avere un unico numero (Timestamp) senza avere la divisione in anno,mese,giorno,ore,minuti,secondi e millisecondi?(Faccio notare che stò lavorando su un PC con windows XP, Visual studio 2008 e l'ambiente di sviluppo IBM Rational Rhapsody)

Grazie

9 Risposte

  • Re: File log per macchina a stati

    A parte che esistono le api di windows per creare e scrivere i file .log
    Forse sarebbe piu consono aprire il file solo una volta e passare ai vari thread il puntatore al file in modo che possano scrivere direttamente con le stesse priorita.
    Potresti anche redirigere lo stderror su un file e usare tale uscita per gestire i log.
    La tua ultima domanda ti é stata gia risposta nell'altro thread
  • Re: File log per macchina a stati

    Forse la seconda soluzione è più semplice e veloce?
  • Re: File log per macchina a stati

    Cosa sai della sincronizzazione tra i thread?
  • Re: File log per macchina a stati

    Conosco più la teoria che la pratica. Comunque l'ambiente dove stò lavorando è molto restrittivo. Per adesso ho visto che è possibile scrivere il codice solo nei vari stati delle macchine, ovvero mi da la possibilità di eseguire il codice solo quando si trova in un determinato stato. Come ripeto quello che mi serve è riuscire a salvare tutti gli stati, di tutte le macchine in funzione quando vengono simulate, in un unico file di testo con le relative informazioni (Tempo,Stato e Blocco) per poi convertire questo file e portarlo in un programma che mi ordina il tutto per Tempo, per verificare se la sequenza degli stati è giusta secondo i casi d'uso che ho scritto prima, ossia mi deve rispettare la sequenza di eventi e stati. Il problema di far scrivere gli stati direttamente in un file di testo è quello che il file va aperto e chiuso nello stato, ed avendo tanti stati in parallelo mi crea il problema di accesso al file, quindi leggendo in internet ho visto anche che alcuni utilizzano un buffer per poi salvare la sequenza nel file di testo.
    Forse aggiro il problema scrivendo direttamente sul buffer?
    E' possibile aggirare il problema con Stdout e Stderr?
    Come posso implementarli?
    Direttamente all'interno degli stati?
    Non ho capito il funzionamento?

    Grazie
  • Re: File log per macchina a stati

    Fai il file di log esterno ai stati (esempio: Singleton)

    Chiudi il file di stato fuori dagli stati delle macchine nella classe Singleton
  • Re: File log per macchina a stati

    Posso spiegare la soluzione che vorrei adottare, sono venuto a questa conclusione(impost..).
    Invece di fare scrivere su un file i vari stati delle macchine attive, ho creato un nuovo blocco nel diagramma chiamato LOG. Il LOG dovrebbe avere un buffer che riceve una stringa contenente il Tempo,Stato e Blocco dagli stati delle varie macchine. Il compito del LOG è di scrivere il file.
    Immagino che il buffer abbia una allocazione di memoria limitata, quindi ci saranno dei problemi nel momento in cui scarico il buffer per fare stampare il contenuto sul file, ossia riesce a scaricare e nello stesso tempo immagazinare altri dati inviati dagli stati?
    A livello di programmazione C come posso fare?
    Potete indirizzarmi su cosa mi conviene usare?
    Grazie
  • Re: File log per macchina a stati

    Guarda che non fai altro che spostare il problema dal file al buffer.
    Se hai degli stati eseguiti in parallelo, qualsiasi operazione su variabili condivise va inserita in una sezione critica (aka protetta da mutex) e sia il file sia il buffer sono variabili condivise.

    Devi aprire il file una sola volta prima di far partire la macchina a stati, chiuderlo solo dopo che la macchina a stati ha finito e scrivere negli stati usando un mutex intorno alla fwrite() e con il minor scope possibile (acquisire il mutex appena prima la fwrite(), invocare la fwrite(), rilasciare il mutex).

    Ci sono vari modi di fare questo, sia partendo dall'uso brutale di API di sistema fino all'uso raffinato di una classe monitor che gestisca l'accesso sequenziale in scrittura al tuo file di log (tra l'altro più semplice da togliere quando non serve più).
  • Re: File log per macchina a stati

    Sono d'accordo con la tua risposta, però vorrei chiederti attraverso quelle tecniche che hai detto gli stati vengono salvati tutti ed i tempi corrispondono al momento preciso in cui entrano oppure c'è un ritardo nel tempo dovuto all'attesa del buffer che è impegnato? Faccio un esempio:se ho 10 macchine a stati tutte in esecuzione, ogni macchina si trova in uno stato che tenta di salvare la stringa (Tempo,Stato e Blocco) nel buffer. Se però in quel momento è occupato il buffer, all'interno del campo Tempo degli stati delle altre 9 macchine viene salvato il tempo del "primo accesso" oppure c'è un ritardo dovuto all'attesa?
    Un' altra domanda: Il salvataggio su file può essere fatto quando il buffer contiene anche solo un elemento, senza aspettare che si riempi?
    Mi consigli di usare la funzione
    fwrite
    e non
    fprintf
    ?
    Perchè ho usato questa:
    FILE * fileLog;
    fileLog = fopen("fileLogSistema.txt","a");
    [b]fprintf[/b](fileLog,"%d,Standby,LDiSelDelControllore\n",(int)((timeLDSC)/10000));
    fclose (fileLog);
    In una delle prime prove ho provato a togliere la funzione
    fclose (fileLog)
    però non mi stampava più la stringa.

    Ho trovato questa informazione forse potrebbe fare al mio caso:
    http://www.umlforum.de/viewtopic.php?f=12&t=40
  • Re: File log per macchina a stati

    
    :stato1
    // inizio misurazione codice da cronometrare
    ...
    // fine misurazione
    //sezione critica
    // scrittura
    :ripeti stato1
    
    Se il codice che ti interessa misurare è compreso tra inizio e fine misurazione, il resto è ininfluente. La sezione critica serve solo a impedire di avere la corruzione dei dati in uscita.
    Ovvio che ci sarà una lieve latenza all'interno della sezione critica (dovuto ai vari thread che si contendono il mutex), ma dato che hai già acquisito il tempo, tale latenza non è calcolata.

    Il motivo per cui ho messo fwrite() è solo per evidenziare una funzione di scrittura. Puoi usare anche la fprintf() se ti è più comoda. Tuttavia il consiglio generale è di minimizzare il tempo di possesso del mutex, per cui io preformatterei la stringa da scrivere usando sprintf() fuori dalla sezione critica e nella sezione critica metterei solo fwrite(), in modo da evitare le formattazioni interne della fprintf() (parserizzazione della stringa etc.).

    Con un solo file/buffer meglio di così non si può fare.

    Non conoscendo Rhapsody non so dire se abbia dei tool o similari per gestire la sincronizzazione, in alternativa tocca usare le API di Windows.
    In ogni caso quanto detto sulla sincronizzazione in scrittura resta valido sia che si tratti di un unico file sia che si tratti di un unico buffer.
Devi accedere o registrarti per scrivere nel forum
9 risposte