Accesso sincronizzato alle apparecchiature industriali di rete

1

Ho un equipaggiamento industriale controllato da un software. Il software si connette ad esso tramite prese, e mantiene la connessione sempre attiva, mentre di volta in volta invia comandi all'apparecchiatura. Ora, questa apparecchiatura è rappresentata da una classe che incapsula l'invio e la ricezione di dati.

Successivamente, ho bisogno di creare un'interfaccia utente che mostri lo stato dell'apparecchiatura, indipendente dal software di controllo (il controllo è su una stessa soluzione thread diversa). L'aggiornamento all'interfaccia utente deve essere fatto diciamo ogni secondo, ma può succedere che l'interfaccia utente desideri leggere i dati e il software di controllo desidera scrivere.

Il problema è che l'apparecchiatura potrebbe rispondere da 50 ms a 1 secondo, non lo sappiamo, e durante la risposta nessuno deve interferire!

Come posso sincronizzare al meglio le chiamate con la classe di comunicazione dell'apparecchiatura?

Potrebbero esserci almeno 2 soluzioni:

  1. Uso della semplice istruzione lock(obj) {} in C #, per ogni metodo nel comune. Classe
  2. Uso di eventi e una coda di messaggi con un concetto di sottoscrittore

Mentre il primo potrebbe essere semplice, suppongo che il mio caso sia la soluzione peggiore perché può bloccare tutto.

Il secondo sembra più OK, ma il problema è che ci sarà sicuramente un ritardo nel ricevere i risultati se molti abbonati sono, o non lo so, non ne sono proprio sicuro.

UPDATE: Ho implementato usando il blocco semplice. Il motivo è che alcune apparecchiature non hanno (alcune lo fanno, ma la maggior parte no), dal lato del controller, la possibilità di elaborare più richieste e il loro buffer traboccherà. Quindi, per essere sicuro che non accada nulla di brutto, l'esclusivo blocco READ / WRITE è la soluzione migliore che ho trovato finora e funziona.

    
posta XMight 26.08.2014 - 10:14
fonte

1 risposta

2

Entrambe le soluzioni funzionerebbero. È generalmente una buona idea applicare un lucchetto quando si scrive su tali valori. Se ti stai aspettando un sacco di letture, allora puoi usare ReaderWriterLockSlim per mettere un blocco di scrittura su di esso, che impedirebbe ad altri thread di scrivere il valore, ma potrebbe essere letto senza alcun blocco di sorta. Ciò presuppone che il valore, in qualsiasi momento della tua area critica, mostri accuratamente lo stato dell'apparecchiatura (in altre parole, non impostarlo a zero temporaneamente, poiché un altro thread potrebbe leggerlo in quel momento).

Personalmente preferirei la seconda soluzione poiché disaccoppia il valore che viene modificato da thread / thread che desiderano usarlo per un certo scopo. Io uso la ReaderWriterLockSlim in combinazione, tuttavia, non è necessario mettere l'evento di modifica del valore che pubblica dentro l'area critica in quanto non è possibile formulare alcuna ipotesi su come l'evento sarà gestito dagli abbonati, anche se in questo caso è semplicemente per aggiornare l'interfaccia utente. Se il tuo programma dovesse cambiare in futuro, sarebbe facile adattarlo in seguito per adattarsi ai nuovi usi delle modifiche apportate al valore.

Spero che ti aiuti!

    
risposta data 26.08.2014 - 10:40
fonte

Leggi altre domande sui tag