2 messaggi dal 21 luglio 2017
Salve a tutti.
Prima di fare la domanda faccio una premessa in modo che possa farmi capire di cosa ho bisogno.
Sono fondamentalmente un firmwarista/hardwarista e creo principalmente apparecchiature di test che non usano il PC.
Tramite microcontrollori di diversi tipi/marche (LPC con architettura ARM7 o CORTEX M3 atmel ATmega e microchip PIC) ho creatuo un sistema stand alone che esegue test funzionali di misure, componenti e sistemi di comunicazione.
Con l'aumentare della complessità delle schede che andavo a testare, il sistema cominciava a diventare troppo chiuso e limitato. Per risolvere il problema ho deciso di acquistare un libro su Visual Studio e C# e usare delle applicazioni windows form che facessero da "servizio" al mio sistema. Era il 2011 e da allora ne ho fatte di applicazioni. Dall'interfacciamento su strumenti National instruments fino al collegamento al database SAP tramite web service.
Il PC con tali applicazioni rimaneva sempre un servizio e il mio sistema comunicava (e comunica tutt'oggi)tramite porta USB per le richieste di funzioni speciali.

A oggi ho deciso di riprogettare tutto e cambiare filosofia. Vorrei fosse il PC il cuore di tutto e il mio sistema gli fa da "servizio" potendo eseguire tutti i tipi di misura a oggi conosciuti.
Ho già autocostruito tutte le schede di misura di cui ho bisogno per il mio progetto e ho sviluppato il sistema di comunicazione che le pilota classi comprese.
Ho già iniziato a sviluppare le varie GUI che mi servono come finestre per la creazione di ordini di produzione, generazioni di file di log ecc...
Mi sono fermato su un muro che per ora è invalicabile. Segno che la mia autoistruzione è ancora insufficiente.
E ora vi spiego.

Quello che mi serve è un'idea, o uno spunto per creare la sequenza di test su visual C#.
In ANSI C (Lo uso per i microcontrollori) è semplice perchè usando il linguaggio strutturato si fanno le varie funzioni per le misure e si abilitano dei timer che tramite le interruzioni controllano le sicurezze delle macchine e i tasti di input. Quì però è object oriented e non esiste il program counter.
Cerco di fare un esempio descrivendo una sequenza a blocchi:
Start_test()
Misura1()
Misura2()
Programmazione_EEPROM()
Misura3()
TestComunicazione1()
TestComunicazione2()
Esito()

In ciascun test la struttura a blocchi che uso è questa:
Misura1()
{
Serie di stimoli con dei delay
do
{
Eseguo il test
Controllo se esito positivo
Se negativo serie di stimoli in caso di fail prima di ritentare
}while (retuch>0) //Una variabile che uso per indicare il numero di tentativi prima di dichiarare prova scarta
Serie di stimoli post test
}

Le serie di stimoli sono fondamentalmente dei relè da attivare tramite il sistema.
Tali attivazioni sono multiple e seguite da dei delay.
Quindi... sempre a blocchi, una serie di stimoli sarebbe:
Relè1 ON
delay 200ms
Relè2 ON
delay 1300ms
Relè2 e Relè1 OFF
delay 1300ms

Questo è tutto e non so se ho spiegato chiaramente ciò che devo fare, ma se sono riuscito, Vi chiedo:

Quale strada può essere giusta per realizzare una cosa del genere in C# sapendo che i delay non possono essere thread.sleap() perchè se no il thread non può ricevere altri input

Ho provato con una serie di delegate e timer ma mi sono letteralmente perso nel codice.

Avete qualche idea?
Vi ringrazio in anticipo.
135 messaggi dal 01 febbraio 2017
Ciao Arago, mi ha sempre appassionato il mondo a "basso livello" e specie la parte comunnicazioni e microcontroller, hai fatto un ottimo lavoro, oramai hai fatto quasi tutto.

Da quello che ho capito ti manca l'elaborazione asincrona, poichè il "contoller" deve essere sempre libero e continuare a fare il poll o testare le altre "porte".

Se è così le soluzioni sono diverse, a tuo giusto e preferenza.

Un sistema MVC fa tutto lui, ma ti toglie il controllo.

Potresti dividere in due la tua applicazione, da un lato la parte che comunica a basso livello, implementata come servizio da interrogare in maniera asincrona, e dall'altra la parte utente che interroga e restituisce i risultati visivamente. Tipo un WCF (che è molto programmabile) e dall'altra una UI di tipo grafico con WPF o Win Form.

Oppure lasciando tutto come è granitico, in una unica applicazione potresti usare ASYNC/AWAIT per lanciare l'interrogazione e continuare il flusso del programma, senza bloccarsi.

La documentazione on line è molto vasta.

Il mio consiglio (se è questo il tuo problema) è di usare la seconda soluzione (WCF), perchè ti permette di separare la logica communication dalla logica espositiva all'utente. In questo modo l'applicazione può scalare all'aumentare delle funzioni (basta aggiungere il pezzetto di codice che ti serve nel WCF), e manutenibilità, se devi cambiare una sub, metti mano solo sul WCF, senza toccare l'applicazione grafica.

Spero di esserti stato utile.
Facci sapere.
Gino.

UNSTRING identifier-1 id-2 id-3
DELIMITED BY [ALL] OR [ALL] literal-1 lit-2
INTO {id-4 [DELIMITER IN id-5]
[COUNT IN id-6]}
[WITH POINTER id-7]
[TALLYING IN id-8]
[ON OVERFLOW imperative-statement-1]
[NOT ON OVERFLOW imper-2]
[END-UNSTRING]
2 messaggi dal 21 luglio 2017
Ti ringrazio molto.
Ora vedo la soluzione WCF.
Non conoscevo.
Mi documento e proverò poi saprò dire.
Oggi ho sperimentato il multitrading.
Ho lanciato thread diversi che gestivano le schede di misura. Ho ottenuto qualche traguardo ma la vedo ancora una strada tortuosa.
Seguirò il tuo consiglio Gino e poi vedrò che succede.
Sto iniziando a leggere e vedo la cosa interessante.
Grazie mille.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.