Due eseguibili che utilizzano la stessa risorsa HW

Discussioni generali sulla programmazione in LabVIEW, domande, problemi e soluzioni.

Moderatore: ILVG mod

  • Advertisement

Due eseguibili che utilizzano la stessa risorsa HW

Messaggioda gepponline » ven feb 22, 2019 9:13 am

...ma ciao!
ho due eseguibili differenti ma che vengono eseguiti in contemporanea che utilizzano la stessa risorsa HW, una shceda I/O integrata nel PC.
Qual'e' secondo voi la soluzione migliore per fare in modo che questi processi concorrenti non cerchino di scrivere in contemporanea sulla scheda?
..ma ciao!
Immagine
Avatar utente
gepponline
Moderatore
 
Messaggi: 2117
Iscritto il: ven gen 28, 2005 11:27 am
Località: Monticello Brianza

Re: Due eseguibili che utilizzano la stessa risorsa HW

Messaggioda paracarro » ven feb 22, 2019 10:09 am

La soluzione, a mio avviso, unica è che solo uno degli eseguibili deve avere accesso alla risorsa, mentre il secondo deve accedere alla risorsa attraverso il primo.

In alternativa un terzo programma dovrebbe avere l'accesso esclusivo alla risorsa e gli altri due sw devono accedere alla risorsa comunicando con questo terzo sw.

bye
Mai dire Mai
paracarro
Moderatore
 
Messaggi: 875
Iscritto il: lun ago 18, 2003 3:04 pm
Località: MILANO

Re: Due eseguibili che utilizzano la stessa risorsa HW

Messaggioda aris » ven feb 22, 2019 1:59 pm

Concordo con paracarro, a meno che la risorsa non abbia una una qualche sorta di semaforo.
Se puoi interrogare o vedere se la risorsa è in uso, ed attendere che venga liberata, puoi gestire questo processo a livello delle tue funzioni.

Aris
E' sempre colpa di una massa.....e se non è quella è un if!
Avatar utente
aris
Super Utente ++
Super Utente ++
 
Messaggi: 643
Iscritto il: ven lug 30, 2004 10:49 am
Località: Medolla -MO-

Re: Due eseguibili che utilizzano la stessa risorsa HW

Messaggioda gepponline » ven feb 22, 2019 4:31 pm

Perfetto, anche io propendevo per la soluzione Terzo eseguibile esterno che gestisce la risorsa.
Anche perchè i due eseguibili possono essere lanciati singolarmente
Al momento tutti e due utilizzano la risorsa senza nessun tipo di controllo, quindi, anche se è un caso raro, se tutti e due nello stesso momento andassero a scrivere, avrei un comportamento ignoto o basterebbe uno poco dopo dell'altro per annullare l'azione del primo.
Quindi, assodato che è meglio fare questo controllo attraverso un eseguibile terzo, la via migliore per comunicare dei dati tra due eseguibili qual'e'?
File? Shared variable?altro?
..ma ciao!
Immagine
Avatar utente
gepponline
Moderatore
 
Messaggi: 2117
Iscritto il: ven gen 28, 2005 11:27 am
Località: Monticello Brianza

Re: Due eseguibili che utilizzano la stessa risorsa HW

Messaggioda paracarro » ven feb 22, 2019 6:45 pm

gepponline ha scritto:...
Quindi, assodato che è meglio fare questo controllo attraverso un eseguibile terzo, la via migliore per comunicare dei dati tra due eseguibili qual'e'?
File? Shared variable?altro?



TCP/IP.

Tra l'altro questo ti permette di far girare i due eseguibili concorrenti su PC diversi da quello dove la risorsa condivisa è presente.

Potresti usare le VISA

bye
Mai dire Mai
paracarro
Moderatore
 
Messaggi: 875
Iscritto il: lun ago 18, 2003 3:04 pm
Località: MILANO

Re: Due eseguibili che utilizzano la stessa risorsa HW

Messaggioda gepponline » lun feb 25, 2019 2:53 pm

mmhh.. ok.

Ho dato un occhiata all'esempio TCP multiple connections.
Ora quindi direi che:
1) realizzo un server che aspetta le chiamate dei vari client ed esegue l'azione che deve eseguire (nel mio caso lancia il VI rientrante che abbiamo visto nell'altro post http://www.ilvg.it/forum/viewtopic.php?f=1&t=6341)
2) realizzo un VI client che effettua la connessione dall'eseguibile che lo contiene.

Direi che ho un solo dubbio.
Nel client, è meglio aprire e chiudere la connessione ogni volta che viene generato l'evento o meglio aprirla al lancio e chiuderla alla chiusura dell'eseguibile?
..ma ciao!
Immagine
Avatar utente
gepponline
Moderatore
 
Messaggi: 2117
Iscritto il: ven gen 28, 2005 11:27 am
Località: Monticello Brianza

Re: Due eseguibili che utilizzano la stessa risorsa HW

Messaggioda paracarro » mer feb 27, 2019 10:35 am

gepponline ha scritto:...
Nel client, è meglio aprire e chiudere la connessione ogni volta che viene generato l'evento o meglio aprirla al lancio e chiuderla alla chiusura dell'eseguibile?


Io preferisco la prima opzione cioè connessione e disconnessione ad ogni scambio di messaggi, ma volendo si può usare anche la seconda, in base alla necessità di prestazioni.

La seconda opzione va gestita nel client con una macchina a stati che esegue automaticamente la riconnessione nel caso in cui la connessione non sia più valida.

bye
Mai dire Mai
paracarro
Moderatore
 
Messaggi: 875
Iscritto il: lun ago 18, 2003 3:04 pm
Località: MILANO

Re: Due eseguibili che utilizzano la stessa risorsa HW

Messaggioda gepponline » gio feb 28, 2019 10:40 am

Ma c'e' effettivamente il rischio che cada la connessione lavorando sempre sullo stesso PC e non in rete?
Perchè non vorrei complicarmi la vita per niente.
Adesso ho implementato il tutto cosi':
Client:
1) Apre la connessione e la tiene aperta
2) Allo scatenarsi di un evento scrive qualcosa al server
3) Solo alla chiusura del programma chiude la connessione

Server:
(Macchina a stati, Tenendo buono il VI di esempio presente in labiew pe rle multiconnessioni)
1) Verifica se ci sono nuove connessioni
2) Se la lettura va in timeout, tiene buone le connessioni presenti
2a) Se va in errore di connessione chiusa o un altro errore, elimina la connessione dalla lista delle connessioni
2b) Se legge qualcosa, lancia il VI rientrante che fa la sua attesa e poi esegue l'azione
3) Torna alla fase 1

Potrei in alternativa mettere la parte di client nel vi rientrante.
Il dubbio che ho è che aprendo e chiudendo subito la connessione, il server non riesca ad intercettarla e perda il messaggio.
C'e' questa possibilità visto che il server ha un 50ms di timeout tra la lettura di una nuova connessione e la successiva?
In alternativa avevo pensato ad uno scambio di messaggi di conferma.
Quindi, il client apre la connessione e manda un messaggio e solo dopo che è stato letto, il server manda una conferma.
Alla lettura della conferma, il client chiude la connessione.
Questo mi pass aper la testa ma ho il dubbio di stare implementando una cosa già compresa nelal comunicazione TCP
..ma ciao!
Immagine
Avatar utente
gepponline
Moderatore
 
Messaggi: 2117
Iscritto il: ven gen 28, 2005 11:27 am
Località: Monticello Brianza

Re: Due eseguibili che utilizzano la stessa risorsa HW

Messaggioda paracarro » mar mar 05, 2019 2:51 pm

gepponline ha scritto:...
Il dubbio che ho è che aprendo e chiudendo subito la connessione, il server non riesca ad intercettarla e perda il messaggio.
C'e' questa possibilità visto che il server ha un 50ms di timeout tra la lettura di una nuova connessione e la successiva?
In alternativa avevo pensato ad uno scambio di messaggi di conferma.
...


La comunicazione dovrebbe, secondo me, seguire queste linee guida:

1) Connessione di tipo TCP/IP.
TCP garantisce, in qualche modo, la ricezione del pacchetto se la connessione è attiva. Nel caso di collisione di pacchetti, viene gestita automaticamente la ritrasmissione.
UDP è maggiormante performante proprio perchè vengono effettuati un numero inferiore di controlli e, una volta trasmesso il pacchetto non ne viene garantita la ricezione.
2) il Client è Master mentre il Server è Slave. A fronte dell'invio di un messaggio (MASTER --> SLAVE) il master deve sempre ricevere una risposta (MASTER <-- SLAVE).
Se è un messaggio di interrogazione (query), deve ricevere la risposta alla domanda.
Se è un messaggio di comando deve ricevere in risposta un messaggio di riconoscimento (acknowledge).
3) la sequenza lato client deve essere:
- apertura connessione
- invio comando/query
- ricezione risposta
- chiusura connessione

bye
Mai dire Mai
paracarro
Moderatore
 
Messaggi: 875
Iscritto il: lun ago 18, 2003 3:04 pm
Località: MILANO

Re: Due eseguibili che utilizzano la stessa risorsa HW

Messaggioda nicola » dom mar 10, 2019 1:47 pm

Dovresti gestire gli errori e sia dal server che dal client dovresti ripristinare la linea in caso ci sia un errore del tipo 1 e 66 (non me li ricordo a memoria) comunque in questo caso ripritini la connessione.
Comunque la lista puoi trovarla qui http://zone.ni.com/reference/en-XX/help ... ror_codes/

ALtro caso è il timeout es. 56 che puoi decidere di ignorarlo oppure inviare sulla rete un messaggio ping cosi controlli che tutto stia andando bene.

Poi il controllo Aknowledge se non sai ancora come fare un metodo molto semplice ed efficace (ma non velocissimo) è inviare un doppio messaggio il primo di lunghezza fissa invia il numero di byte del messaggio successivo il secondo legge il messaggio conoscendone già la lunghezza ed evitandoti errori.

Prova a vedere anche Simple SMTP su Package Manager.
Nicola |ILVG STAFF

Bytelabs.it
Avatar utente
nicola
Moderatore
 
Messaggi: 1519
Iscritto il: gio gen 08, 2004 3:30 pm
Località: Ferrara



  • Advertisement

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron

Pannello di Controllo Utente

Login

Advertisement

Chi c’è in linea

In totale c’è 1 utente connesso :: 0 iscritti, 0 nascosti e 1 ospite (basato sugli utenti attivi negli ultimi 5 minuti)
Record di utenti connessi: 119 registrato il dom mar 31, 2013 11:39 pm

Visitano il forum: Nessuno e 1 ospite