You are on page 1of 14

IToolS basics Iprel Progetti s.r.l.

Version 1.1 31/10/2011

IToolS basics

1
IToolS basics Iprel Progetti s.r.l.
Version 1.1 31/10/2011

Sommario
Configurazione di Visual Studio ..........................................................................................................................................................3
Definizione del sistema di comunicazione ..........................................................................................................................................3
Configurazione ed analisi del sistema di comunicazione ....................................................................................................................3
Utilizzo e caratteristiche del componente Variable ............................................................................................................................7
Variable scaling ..............................................................................................................................................................................7
Variable targets ..............................................................................................................................................................................8
Variable events ............................................................................................................................................................................10
Variable advising ..........................................................................................................................................................................11
Variable threading .......................................................................................................................................................................11
Utilizzo e caratteristiche del componente Client ..............................................................................................................................12
Client events ................................................................................................................................................................................13
Utilizzo e caratteristiche del componente IOServer .........................................................................................................................13
IOServer events ............................................................................................................................................................................13

2
IToolS basics Iprel Progetti s.r.l.
Version 1.1 31/10/2011

Configurazione di Visual Studio

Prima di definire gli oggetti necessari al sistema di comunicazione necessario impostare lambiente di sviluppo per lutilizzo dei
componenti IToolS. Una volta completate queste operazioni preliminari possibile utilizzare tutti i componenti e controlli IToolS in
modo visuale.

Per preparare lambiente di sviluppo procedere con le seguenti operazioni:

1. Aprire VisualStudio e creare un progetto di tipo Windows Forms Application.


2. Spostarsi con il mouse sulla Toolbox, tasto destro e selezionare Add Tab.
3. Nel campo riservato al nome del Tab scrivere IToolS.
4. Tasto destro sul nuovo Tab creato e selezionare dal menu a tendina Choose items.
5. Cliccare su Browse e spostarsi nella directory in cui sono presenti gli assemblies IToolS.
6. Selezionare lassembly IToolS.Components.dll.
7. Ripetere i punti 4,5,6 selezionando lassembly IToolS.Windows.dll.

La toolbox ora popolata con tutti i controlli e componenti esposti dal framework IToolS.

Definizione del sistema di comunicazione

Il sistema di comunicazione IToolS identificato da un insieme di componenti che consentono di instaurare comunicazioni con
dispositivi remoti attraverso protocolli industriali. I componenti che definiscono questo insieme sono:

- Group: rappresenta un contenitore di Variable. Le Variable (IToolS.Components.Communication.Variable) sono gli


oggetti utilizzati per identificare e contenere le informazioni necessarie al sistema per instaurare la comunicazione con i
dispositivi remoti:

Ad esempio nella Variable definito il tipo di dato che si vuole gestire, loffset (indirizzo) del registro remoto che
si vuole leggere o scrivere, ecc

- Clients: rappresenta il contenitore dei Client. I client sono degli oggetti che si preoccupano dei corretto aggiornamento
delle Variable definite, inoltre mettono a disposizione una serie di metodi per eseguire operazioni sul sistema di
comunicazione:

Ad esempio sono presenti metodi per la lettura e scrittura delle Variable.

- IOServer: questo oggetto responsabile della corretta creazione del canale di comunicazione, della definizione del tipo di
protocollo da utilizzare e della gestione delle richieste che vengono inoltrate dai client.

Configurazione ed analisi del sistema di comunicazione

Nel paragrafo precedente sono stati identificati gli oggetti che intervengono nel processo di comunicazione, ora analizziamo in
modo sommario come necessario configurare gli oggetti per instaurare una comunicazione con un dispositivo remoto, pi avanti
saranno presi in considerazione in modo dettagliato anche con un esempio di codice quali sono le propriet che devono essere
impostate per modificare il comportamento del sistema di comunicazione in base alle proprie esigenze.

La prima operazione da eseguire per definire il sistema quello dichiarare quali sono le informazioni che si vogliono leggere o
scrivere dal dispositivo remoto, questo in linea di massima significa aver ben chiaro quali sono i registri del dispositivo remoto a cui
si vuole accedere. In base ai registri remoti a cui si vuole accedere necessario aggiungere al componente Group una serie di
Variable, ognuna delle quali identificata da un indirizzo che porta la variabile ad essere mappata su uno specifico registro del
dispositivo remoto.

3
IToolS basics Iprel Progetti s.r.l.
Version 1.1 31/10/2011

Un esempio pratico di quanto detto pu essere il seguente:

Supponiamo di voler accedere in lettura e


scrittura ad una specifica locazione di un
dispositivo Siemens S7, in particolare al Merker
100 (MB100). Questo significa che vogliamo
accedere al byte contenuto nel registro di
memoria MB100 del dispositivo remoto.
Selezionare un oggetto Group dalla Toolbox e
trascinarlo nella Form, selezionare il
componente group1 spostarsi sulla Properties
Window e cliccare su Items, a questo punto si
apre una finestra che consente di aggiungere e
rimuovere Variable e modificarne le propriet,
premere una volta il bottone Add per
aggiungere una Variable al group1.

Di seguito viene mostrata la finestra di editor delle propriet della Variable:

Nella finestra di editor a lato presente una Variable le cui


propriet sono elencate nella griglia, per aggiungere una
nuova Variable sufficiente premere nuovamente il pulsante
Add. Per mappare la Variable sul registro MB100
necessario modificare il valore di Address della variabile
con 100, nel campo Area inserire M e nel campo
VariableType selezionare Byte, come mostrato
nellimmagine a lato.Le propriet della Variable sono
raggruppate in diverse categorie:
- Address: contiene le propriet relative
allindirizzamento della Variable
- Design: contiene le propriet di progettazione della
Variable.
- IToolS Advanced: In questa categoria comune a
tutti i componenti IToolS sono contenute le
AdvancedProperties. Le propriet avanzate sono
delle associazioni Nome-Valore che consentono di
aggiungere alla Variable delle propriet da utilizzare
in fase di esecuzione o come contenitori di
informazioni.
- Misc: la propriet VariableLink consente di legare il
valore di una Variable a quello di unaltra Variable.
- Scaling: contiene le impostazioni di scalatura della
Variable.
- Targets: categoria che contiene le impostazioni dei
valori obiettivo della Variable (vedi pi avanti).
- Trace: contiene le impostazioni per il tracciamento
delle propriet della Variable in fase di esecuzione
- Variable: contiene il nome della Variable.

4
IToolS basics Iprel Progetti s.r.l.
Version 1.1 31/10/2011

A questo punto necessario inserire un oggetto IOServer alla form, quindi dalla Toolbox selezionare un oggetto IOServer e
trascinarlo sulla form, per completare il sistema di comunicazione inoltre necessario inserire un oggetto Clients:

Nella figura a lato sono presenti i tre oggetti


fondamentali per il sistema di comunicazione:
- Group;
- IOServer;
- Clients;
Questi oggetti opportunamente configurati
consentono di instaurare comunicazioni con
qualsiasi tipo di dispositivo remoto purch sia
presente limplementazione del protocollo
necessario alla comunicazione con il dispositivo
desiderato.
Una volta aggiunti gli oggetti sopracitati
necessario configurarli, per quanto riguarda
lIOServer necessario definire il tipo di protocollo
da utilizzare e impostare le propriet di rete e
comunicazione in base alle proprie esigenze.
Il Clients invece funge da contenitore di oggetti
Client ognuno dei quali contiene una propriet
Group ed IOServer. Alla propriet Group viene
associato loggetto group1 che abbiamo inserito
nella Form, alla propriet IOServer viene associato
loggetto ioServer1 che abbiamo inserito nella
form.

Nella immagine seguente presente la griglia delle propriet dellIOServer:

Per la configurazione dellIOServer necessario definire innanzitutto il


nome del protocollo da utilizzare (propriet Name). Facendo clieck sul
campo Name si apre una finestra di dialogo che consente di selezionare
il protocollo di comunicazione da una lista predefinita.Quindi devono
essere configurati gli oggetti che definiscono le impostazioni di
comunicazione:
- Config: contiene le impostazioni di funzionamento
dellioserver:
1. ChannelDelay: consente di impostare un ritardo
sullaccesso delle operazioni di lettura e scrittura
del canale di comunicazione
2. CyclePeriod: consente di definire il periodo di
tempo tra la gestione di una richiesta e laltra.
3. CycleRequests: consente di definire il numero di
richeste per ciclo
4. ReconnectionDelay: consente di definire un ritardo
sulloperazione di riconnessione in caso di errori sul
canale di comunicazione.
5. SlaveAddress: consente di impostare un indirizzo sul
dispositivo remoto (solo se previsto dal protocollo
utilizzato).
6. ThreadingRequest: True se le richieste inoltrate
allioserver devono essere gestite da thread
separati, False altrimenti.
7. Trace: True se deve essere abilitata la funzionalit
di tracciamento dello stato dellIOServer.
- NetConfig: contiene le impostazioni del canale ethernet:
1. Address: indirizzo ip del dispositivo remoto
2. Port: numero della porta socket da utilizzare.
- SerialConfig: contiene le impostazioni del canale seriale:
1. BaudRate: imposta la velocit di comunicazione.
2. DataBits: imposta il numero dei bit dati da utilizzare
nella comunicazione seriale.
5
IToolS basics Iprel Progetti s.r.l.
Version 1.1 31/10/2011

3. Parity: imposta il bit di parit per il controllo errori di comunicazione.


4. PortName: Imposta il nome della porta seriale da utilizzare.
5. StopBits: imposta il numero di bit di stop per il byte.

La configurazione dellIOServer si completa con una serie di ulteriori propriet utilizzate per estendere la configurabilit di questo
componente:

- BlockSize: consente di definire la dimensione della singola richiesta che pu essere gestita dellioserver.
Pi precisamente le specifiche dei protocolli di comunicazione impongono che la dimensione del pacchetto trasmesso sul
canale di comunicazione rientri entro un certo numero di byte. Questo parametro dettato sia dal tipo di protocollo sia
da limiti funzionali del canale di comunicazione.
- Inverted: consente di impostare lordinamento dei byte allinterno della parola.
- IOServerTraceEvent: consente di definire per quali eventi deve essere eseguito il tracciamento.
- Retries: imposta il numero di tentativi da eseguire per richiesta in caso si esito negativo di una operazione sul canale di
comunicazione.
- Timeout: imposta il tempo massimo di attesa per ricevere la risposta sul canale di comunicazione.
- Trace: abilita la funzionalit di tracciamento dello stato dellIOServer.
- TraceProperties: consente di definire quali propriet devono essere tracciate.

Per la configurazione delloggetto Clients necessario selezionarlo, spostarsi sulla Properties Window e cliccare su Items, a questo
punto si apre una finestra di dialogo che consente di definire e configurare i vari Client che compongono il sistema. Il Client un
oggetto che ha la funzione di collegamento tra il Group e lIOServer, gestisce le richieste di aggiornamento automatico delle
Variable definite mette a disposizione del programmatore una serie di metodi ed eventi per eseguire operazioni sul dispositivo
remoto attraverso lioserver.

Una volta aperta la finestra di editor delloggetto


Clients necessario aggiungere i vari Client di cui si
necessit, occorre tenere presente che:
- Ad ogni client deve essere assegnato un
Group ed un IOServer.
- Il Group assegnato al Client non pu
essere condiviso, ovvero ogni Client deve
avere il proprio Group.
- Lo stesso IOServer pu essere assegnato a
Client differenti.
Aggiunto un client necessario impostare i
parametri di configurazione, nel caso specifico
assegniamo alla propriet Group loggetto group1
ed alla propriet IOServer loggetto ioServer1.
Tra le ulteriori propriet presenti nel client
traviamo:
- UpdateTime: imposta il periodo di tempo
alla scadenza del quale il client depositer
nella coda delle richieste dellIOServer una
richiesta di aggiornamento delle Variable
da esso gestite.
- ClientProperties: contiene informazioni
aggiuntive utili alla corretta configurazione
del processo di comunicazione. Ad
esempio presente lo SlaveId, che
identifica numericamente il dispositivo
con cui si vuole intraprendere un processo
di comunicazione allinterno della rete.
Tipicamente utilizzato nelle
comunicazioni seriali.
- ClientTraceEvent: consente di definire per quali eventi deve essere eseguito il tracciamento.
- Trace: abilita la funzionalit di tracciamento dello stato del Client.
- TraceProperties: consente di definire quali propriet devono essere tracciate.

Come ulteriore nota importante far notare che loggetto Variable pu essere utilizzato anche singolarmente senza il bisogno di
essere inserito in un Group e di conseguenza assegnato ad un Client. Il valore della Variable pu essere impostato manualmente,
6
IToolS basics Iprel Progetti s.r.l.
Version 1.1 31/10/2011

questo consente di utilizzare i meccanismi interni alla Variable in modo autonomo per soddisfare utilizzi personalizzati.
Per impostare il valore della Variable (propriet Value) disponibile il metodo SetExternalValue che accetta in ingresso un Object:

Esempio:

IToolS.Components.Communication.Variable variable1;
...
variable1.SetExternalValue(1234);

Di seguito presente un esempio in cui viene definito un sistema di comunicazione minimo in grado di leggere e scrivere il registro
0 dellarea Holding Register (HR) per un dispositivo che rende disponibile laccesso ai dati attraverso il protocollo Modbus
ethernet:

private IToolS.Components.IOServers.IOServer m_ioServer1 = new IToolS.Components.IOServers.IOServer();


private IToolS.Components.Communication.Clients m_clients1= new IToolS.Components.Communication.Clients();
private IToolS.Components.Communication.Client m_client1= new IToolS.Components.Communication.Client();
private IToolS.Components.Communication.Group m_group1 = new IToolS.Components.Communication.Group();
private IToolS.Components.Communication.Variable m_variable1 =new IToolS.Components.Communication.Variable();
...
m_ioServer1.Name = "ModnetMaster";
m_clients1.Items.Add(m_client1);
m_group1.Items.Add(m_variable1);
m_client1.IOServer = m_ioServer1;
m_client1.Group = m_group1;
m_variable1.Area = "HR";
m_variable1.Address = "0";
m_clients1.Start();

Utilizzo e caratteristiche del componente Variable

Loggetto Variable caratterizzato dal alcuni costrutti in grado di facilitare le funzionalit base che in generale sono richieste per
processi di questo tipo ad esempio rappresentazioni del valore assunto dalla Variable in base a scalature lineari e non, oppure la
notifica mediante eventi del raggiungimento da parte del valore della Variable di valori obiettivo (utilizzati ad esempio per la
gestione di allarmi).

Variable scaling

Nellimmagine a lato evidenziato in rosso sono presenti le


impostazioni per definire le propriet di scalatura che deve
avere loggetto Variable:
- ScalingMode: definisce il tipo di scalature da
applicare:
a. None: nessuna scalatura;
b. Expression: le regole di scalatura sono
definite in base allespressione assegnata
alle propriet Expression ed
InverseExpression;
c. Linear: le regole di scalatura sono definite
da una rappresentazione lineare in cui il
valore minimo definito da MinValue ed il
valore massimo da MaxValue;
d. Factor: al valore della Variable applicato il
fattore di scalatura definito dalla propriet
Factor;
e. MinMax: il valore della variabile limitato
dai valori assegnati alle propriet MinValue
e MaxValue;
- Expression: definisce lespressione da applicare al
valore della Variable nel caso in cui ScalingMode sia
impostato su Expression;
- InverseExpression: definisce lespressione inversa da
applicare al valore della Variable nel caso in cui
ScalingMode sia impostato su Expression;
7
IToolS basics Iprel Progetti s.r.l.
Version 1.1 31/10/2011

- Factor: definisce il fattore moltiplicativo da applicare al valore della Variable nel caso in cui ScalingMode sia impostato su
Factor;
- MaxValue: nel caso in cui ScalingMode sia impostato su Linear definisce lestremo superiore dellespressione lineare che
regola la scalatura, nel caso in cui ScalingMode sia impostato su MinMax definisce il massimo valore che pu assumere la
Variable.
- MinValue: nel caso in cui ScalingMode sia impostato su Linear definisce lestremo inferiore dellespressione lineare che
regola la scalatura, nel caso in cui ScalingMode sia impostato su MinMax definisce il minimo valore che pu assumere la
Variable.

Oltre alle possibili impostazioni di scalatura evidenziate possibile implementare uninterfaccia specifica in grado di definire
scalature complesse e completamente personalizzabili:

Esempio:

class MyScaling : IToolS.Data.IValueScale


{
public object Scale(IToolS.Data.IVariableInternal variable, object value)
{
return Convert.ToInt32(value) * 2;
}

public object Unscale(IToolS.Data.IVariableInternal variable, object value)


{
return Convert.ToInt32(value) / 2;
}
}

...

m_variable1.SetValueScale(new MyScaling());

Variable targets

Attraverso I target possibile gestire stati particolari della Variable come ad esempio il raggiungimento o meno di valori obiettivo.
In base allo stato del target possibile ad esempio definire se una certa condizione del processo deve essere dichiarato come di
allarme e di conseguenza eseguire o meno certe azioni necessarie per la corretta esecuzione.

La propriet CheckTargetMode definisce la modalit di controllo dello


stato del target, questa propriet pu essere impostata come:
a. VariableChange: il controllo dello stato del target viene
eseguito ad ogni variazione del valore della Variable.
b. VariableUpdate: il controllo dello stato del target viene
eseguito ad ogni aggiornamento del valore della Variable.
c. Manually: Il controllo dello stato dei target associati alla
Variable deve essere esplicitamente eseguito invocando in
metodo CheckTargets():
Esempio:
...
m_variable1.CheckTargets();
Selezionando la propriet Targets e cliccando sul bottone che appare alla
destra di (Collection), si apre una finestra di dialogo che consente la
definizione dei target da associare alla Variable. Non vi sono limiti sul
numero di target che possono essere definiti per una singola Variable.
Lunico vincolo piuttosto dettato da un incremento (seppur limitato)
del ciclo di programma.
Lo stato del target regolato da un valore che lo definisce in Reached
(raggiunto) o Failed (fallito).
Ogni qualvolta lo stato del target passa in Reached viene generato un
evento di TargetReached.
Ogni qualvolta lo stato del target passa in Failed viene generato un
evento di TargetFailed.
Per definire quali sono i valori della Variable che provocano o meno lo
8
IToolS basics Iprel Progetti s.r.l.
Version 1.1 31/10/2011

stato di Reached necessario in primo luogo aggiungere un target quindi definirne le caratteristiche. La finestra di dialogo seguente
consente di impostare tutte le propriet principali che definiscono le caratteristiche del target.

- Category: definisce la categoria del


target, si tratta di una stringa che ha
la funzione di raggruppare i target in
categorie utili, ad esempio nel caso
in cui i target siano utilizzati come
allarmi, per definire se un certa
categoria debba essere serializzata o
meno. Pu anche essere utilizzata
per definire il colore che il
visualizzatore degli allarmi deve
assumere per una certa categoria.
- Description: consente di definire una
descrizione per il target, nel caso il
target sia un allarme definisce il
messaggio di allarme.
- Group: consente di raggruppare i
target in gruppi, la sola funzionalit
di questa propriet quella di utilit
per i meccanismi di filtraggio ad
esempio degli allarmi.
- Name: definisce il nome del target, ogni target deve essere identificato da un nome univoco che consente di identificare
in modo inequivocabile ciuscun target.
- Priority: consente di impostare una priorit al target. Se il target utilizzato per gestire degli allarmi, attraverso questa
propriet possibile definire quale target deve essere visualizzato in modo prioritario nel banner degli allarmi.
- LowerValue: definisce il minimo valore del range entro il quale il target si pu considerare raggiunto Reached.
- UpperValue: definisce il massimo valore del range entro il quale il target si pu considerare raggiunto Reached.

Ci sono poi ulteriori propriet che definiscono le caratteristiche ed il comportamento del target :

- CustomProperties: ogni target ha una lista di propriet personalizzate che possono essere definite in fase di
progettazione. Nel caso in cui il target sia utilizzato come allarme, questa lista di oggetto personalizzati sar serializzata
nei dispositivi di archiviazione.
- AdvancedProperties: ogni target ha una lista di propriet avanzate che possono essere definite in fase di progettazione.
Nel caso in cui il target sia utilizzato come allarme, questa lista di oggetto personalizzati non sar serializzata nei
dispositivi di archiviazione.
- ActiveTime: consente di ottenere listante di tempo in cui il target si portato in stato di raggiunto.
- DeActiveTime: consente di ottenere listante di tempo in cui il target si portato in stato di fallito.
- GuidCode: identificativo univoco di ciascun target.
- TargetState: consente di ottenere o impostare lo stato del target.
- VariableTargetCheck: consente di assegnare al target una interfaccia personalizzata in grado di valutare lo stato del
target, normalmente questa propriet ha valore nullo.

Esempio:

class MyTargetCheck : IToolS.Data.IVariableTargetCheck


{
public int GetTargetState(IToolS.Data.IVariableInternal variable, IToolS.Data.VariableTarget
target, object value)
{
if (Convert.ToInt32(value) == 10)
return IToolS.Data.VariableTarget.REACHED;
else
return IToolS.Data.VariableTarget.FAILED;
}
}
...
m_variable1.Targets[0].VariableTargetCheck = new MyTargetCheck();

9
IToolS basics Iprel Progetti s.r.l.
Version 1.1 31/10/2011

Attraverso limplementazione di questa interfaccia possibile definire meccanismi di controllo del valore della Variable
personalizzati e complessi.

La Variable dispone inoltre di un ulteriore caratteristica in grado di rendere personalizzabile la conversione del valore in essa
contenuto. Per fare un esempio concreto si pu pensare al caso in cui il valore contenuto nella variabile definito da un intero a 16
bit ma si vuole gestire solo il byte alto o byte basso di questo valore.

Esempio:

class MyConverter : IToolS.Data.IValueConverter


{
public object Convert(IToolS.Data.IVariableInternal variable, object value)
{
int val = 0;
int l = System.Convert.ToInt32(value);
val = (byte)(l & 0xFF);
if (val > 127)
val = val - 256;
return val;
}

public object Unconvert(IToolS.Data.IVariableInternal variable, object value)


{

int l;
object oRet = 0;
int oldValue = 0;
oldValue = System.Convert.ToInt32(variable.TypeBase.MemoryValue) & 0xFF00;
l = System.Convert.ToInt32(value) & 0xFF;
oRet = (object)((int)(l) | (int)oldValue);
variable.TypeBase.MemoryValue = oRet;
return oRet;
}
}
...
m_variable1.SetValueConverter(new MyConverter());

Variable events

Per semplificare lo sviluppo dellapplicazione, che dovr ad esempio gestire il processo produttivo o monitorare lo stato di un
impianto industriale, loggetto Variable mette a disposizione un serie di eventi e propriet in grado di notificare ad ogni variazione
di stato gli oggetti che la stanno osservando.

Di seguito sono elencati e descritti i vari eventi che caratterizzano loggetto Variable:

- Changed: evento generato ogni qual volta il valore della Variable viene modificato.
- Updated: evento generato ogni qual volta il valore della Variable viene aggiornato.
- PropertyChanged: evento generato come conseguenza della modificata di una qualsiasi propriet della Variable.
- StateChanged: evento generato ad ogni variazione dello stato della Variable. Lo stato della Variable contenuto e pu
essere ottenuto dall propriet State, tra i valori che pu assumere questa propriet troviamo:
a. None: lo stato della Variabile non definito.
b. Error: la Variable si trova in stato di errore.
c. Changed: il valore della Varible stato modificato.
d. Updated: il valore della Variable stato aggiornato.
e. Valid: la definizione della Variable considerata valida.
f. NotValid: la definizione della Variable considerata non valida.
- SynchronizationContextChanged: evento genrato ogni qual volta il contesto di sincronizzazione.
- TargetAdd: evento generato allatto di inserimento di un nuovo target.
- TargetRemove: evento generato allatto di rimozione di un target.
- TargetReached: evento generato ogni qual volta il target viene raggiunto.
- TargetFailed: evento generato ogni qual volta il target viene fallito.
- ValueChanged: evento generato ogni qual volta la propriet Value cambia valore. (vedi evento Changed).
- NotifyEvent: evento generato ogni qual volta la propriet Value cambia valore. (vedi evento Changed).
10
IToolS basics Iprel Progetti s.r.l.
Version 1.1 31/10/2011

Variable advising

Mediante il Variable advising possibile attivare o disattivare la richiesta di notifica del valore di una Variable in base a condizioni
particolari in cui di trova lapplicazione. Normalmente questo meccanismo disattivato in quanto il valore di default della propriet
ActiveAdvise presente nelloggetto Variable impostata a false. Nel caso in cui ladvise della Variabile viene attivato per
richiedere la notifica del valore necessario invocare il metodo AttachAdvise, al contrario per disattivare la notifica del valore
necessario invocare il metodo DetachAdvise.

Esempio:

private Guid guid = Guid.NewGuid();

private IToolS.Components.Communication.Variable m_variable1;

...

// attivazione del meccanismo di advising


m_variable1.ActiveAdvise = true;

...

// la notifica della Variable viene abilitata


m_variable1.AttachAdvise(ref guid);

...

// la notifica della Variable viene disabilitata


m_variable1.DetachAdvise(ref guid);

Questo costrutto risulta particolarmente utile per tutti quei sistemi in cui occorre limitare il traffico dati o in cui il numero
complessivo di dati che vengono scambiati con il dispositivo remoto risulta particolarmente elevato. Un esempio concreto pu
essere costituito da un applicazione in cui le Variable che vengono notificate sono solo quelle presenti nella finestra attualmente
visualizzata.

Le Variable in cui sono stati definiti dei target hanno sempre la notifica attivata, questo vincolo stabilito dal fatto che per
verificare lo stato del target il valore deve costantemente essere aggiornato.

Variable threading

Loggetto Variable nel corso della sua vita viene gestito e modificato da thread differenti, questo consente di poter eseguire un
modo parallelo operazioni differenti e di non bloccare lesecuzione del codice principale nel caso in cui si verifichi lattesa da parte
di una certa operazione il verificarsi ci una certa condizione. Al contrario, questa gestione in multi-threading provoca o pu
provocare problemi di serializzazione degli eventi o nel caso in cui siano essi utilizzati per impostare propriet in controlli grafici,
dare luogo a problemi di cross-threading. Per evitare questi noiosi problemi che devono poi essere gestiti propriamente dal
programmatore presente in ogni componente IToolS e quindi anche nelloggetto Variable un propriet statica
RaiseEventOnMainThread. Se questa propriet impostata a true tutti gli eventi generati dal framework IToolS vengono re
instradati sul thread principale evitando cos di dover gestire a valle i problemi di sincronizzazione evidenziati.
Per far si che gli eventi siano re instradati sul thread corretto disponibile un metodo comune a tutti i componenti che permette di
impostare il contesto di sincronizzazione

Esempio:

m_variable1.SetSynchronizationContext(System.Threading.SynchronizationContext.Current);

Attraverso questo metodo possibile reimpostare il contesto di sincronizzazione nel caso in cui per vari motivi sia esso non
corretto. Il contesto di sincronizzazione normalmente impostato nel momento in cui viene creato loggetto (allinvocazione del
costruttore), sono per presenti casi in cui per varie ragioni loggetto potrebbe essere creato da un thread secondario, in questi casi
possibile modificare il contesto di sincronizzazione attraverso il metodo evidenziato sopra in modo da evitare sincronizzazione
sbagliate che darebbero luogo a risultati non attesi.

11
IToolS basics Iprel Progetti s.r.l.
Version 1.1 31/10/2011

Utilizzo e caratteristiche del componente Client

Loggetto client svolge funzionalit di gestione ed accesso al sistema di comunicazione, in particolare si occupa di mantenere
aggiornate, in base al tempo di aggiornamento impostato, tutte le Variable presenti nel Group ad esso assegnato, inoltre mette a
disposizione diversi metodi per eseguire operazione di accesso ai dati come letture e scritture.
Nel momento in cui viene invocato il metodo Start vengono eseguiti i raggruppamenti delle Variable in modo da ottimizzare il
processo di aggiornamento, un thread viene creato ed attraverso la propria esecuzione deposita una richiesta di aggiornamento
delle Variable, contenute nel Group assegnato, nella coda delle richieste dellIOServer. La frequenza con cui avviene questo
deposito della richiesta dettata dal valore della propriet UpdateTime espressa in millisecondi, se il valore presente nella
propriet UpdateTime maggiore di zero laggiornamento sar periodico, diversamente nel caso in cui il valore di UpdateTime
uguale a zero viene inserita una sola richiesta allatto dellinvocazione del metodo di start, infine se il valore di UpdateTime
minore di zero non viene depositata alcuna richiesta di aggiornamento.

Riassumento:

- UpdateTime > 0: aggiornamento ciclico, deposito di una richiesta di aggiornamento ogni UpdateTime millisecondi.
- UpdateTime = 0: viene depositata una sola richiesta di aggiornamento allinvocazione del metodo di Start.
- UpdateTime < 0: non viene depositata alcuna richiesta di aggiornamento. Laggiornamento delle Variable deve essere
eseguito manualmente.

Loggetto Client dispone di un overload di metodi grazie ai quali possibile leggere e scrivere in modo sincrono o asincrono il valore
di oggetti di tipo Variable:

Operazioni asincrone: sono operazioni che non provocano il blocco dellesecuzione del codice. Attraverso i metodi
asincroni le richieste di accesso ai dati vengono depositate nella coda delle richieste dellioserver, che a sua volta le
soddisfer in base ai parametri di schedulazione in esso definiti:

o void ReadAsync(Variable[] variables, ClientResultEventHandler readCallBack, long deadline);

Permette di leggere un gruppo di Variable in modo asincrono, questo significa che linvocazione di questo
metodo genera una richiesta che viene depositata nellIOServer. possibile indicare un metodo di callback da
richiamare al termine dellesecuzione della richiesta. La deadline indica la scadenza in millisecondi entro cui la
richiesta dovrebbe essere soddisfatta, attraverso questo parametro possibile dare una priorit alla richiesta.

o void WriteAsync(Variable[] variables, object[] values, ClientResultEventHandler


writeCallBack, bool reRead, long deadline);

Attraverso I metodi di scrittura asincrona possibile depositare un richiesta di scrittura di un gruppo di Variable,
specificando i valori che si vogliono impostare (parametro values). Come per il metodo di lettura asincrona
possibile indicare un metodo di callback da richiamare al termine dellesecuzione della richiesta.
Il parametro reRead consente di indicare se prima di eseguire la scrittura le Variable specificate debbono
essere aggiornate. Per la deadline valgono le stesse considerazioni fatte per il metodo di lettura asincrona.

o void UpdateAsync(ClientResultEventHandler callBack, long deadline);

Deposita nella coda delle richieste dellIOServer una richiesta di aggiornamento del Group di Variable assegnato
al Client. Per i parametri di callback e deadline valgono le considerazioni fatte per i due precedenti metodi.

Operazioni sincrone: sono operazioni che provocano il blocco dellesecuzione del codice, ci vale a dire che al ritorno
dallinvocazione dei metodi sincroni loperazione di accesso ai dati stata completamente eseguita.

o ClientResult ReadSync(Variable[] variables);

Esegue la lettura di un gruppo di Variable, il valore di ritorno contiene tutte le informazioni circa le operazioni
che sono state effettuate durante lesecuzione di questo metodo.

o ClientResult WriteSync(Variable[] variables, object[] values, bool reRead);

12
IToolS basics Iprel Progetti s.r.l.
Version 1.1 31/10/2011

Esegue la scrittura di un gruppo di Variable specificando I valori da impostare per ciascuna di esse (parametro
values), il valore di ritorno contiene tutte le informazioni circa le operazioni che sono state effettuate durante
lesecuzione di questo metodo.

o ClientResult UpdateSync();

Esegue laggiornamento in modo sincrono di tutte le Variable presenti nel Group assegnato al Client, il valore di
ritorno contiene tutte le informazioni circa le operazioni che sono state effettuate durante lesecuzione di
questo metodo.

Attraverso i metodi di Start e Stop, gi citati in precedenza, possibile rispettivamente avviare o arrestare il ciclo di esecuzione
in grado di mantenere aggiornate le Variable del Group assegnato in modo automatico.

Client events

Come per loggetto Variable anche il Client possiede una lista di eventi in grado di notificare gli osservatori che si sono registrati
sulle operazioni di accesso ai dati.

Di seguito sono elencati e descritti i vari eventi che caratterizzano loggetto Client:

- EndAsyncRead: Evento generato al termine dellesecuzione di una richiesta di lettura asincrona depositata attraverso il
metodo di ReadAsync.
- EndAsyncWrite: Evento generato al termine dellesecuzione di una richiesta di lettura asincrona depositata attraverso il
metodo di WriteAsync.
- EndAutoUpdate: Evento generato al termine di ogni ciclo di aggiornamento automatico delle Variable presenti nel Group
assegnato al Client.
- EndUpdate: Evento generato al termine di una richiesta di aggiornamento depositata attarverso il metodo di
UpdateAsync.
- EndFirstUpdate: Evento generato al termine del primo aggiornamento automatico delle Variable presenti nel Group
assegnato al Client.
- EndRequest: Evento generato al termine di ogni richiesta completata dallIOServer. I metodi di accesso ai dati che sono
stati menzionat, provocano la generazione di diverse richieste ognuna delle quali contiene le informazioni sulloperazione
da eseguire su una o pi Variable.
- EndSyncRead: Evento generato al completamento di unoperazione di lettura sincrona.
- EndSyncWrite: Evento generato al completamento di unoperazione di scrittura sincrona.
- BeginUpdate: Evento generato ogni qualvolta il processo di aggiornamento di un insieme di Variable sta iniziando.

Utilizzo e caratteristiche del componente IOServer

Loggetto IOServer svolge la funzione di collettore di tutte le richieste di accesso ai dati che devono essere eseguite su un
dispositivo remoto. La gestione delle richieste che vengono depositate dai vari Client avviene attraverso un thread secondario che
estrae ed esegue dalla coda la richiesta pi prioritaria, al termine dellesecuzione della richiesta vengono richiamati i metodi di
callback (se previsti). Differente il caso in cui il Client richiede lesecuzione di unoperazione sincrona, in questa situazione non
viene depositata alcuna richiesta ma viene sincronizzato laccesso al canale di comunicazione con le altre operazioni mediante un
costrutto di accesso concorrente. Se lo stesso oggetto IOServer viene assegnato a Client differenti, questi condividono tra loro
laccesso al dispositivo remoto mediante le regole di sincronizzazione ed i parametri di schedulazione impostati sullIOServer.

IOServer events

Loggetto IOServer consente, ad oggetti osservatori opportunamente registrati, di essere notificati al verificarsi di eventi generati
dalle operazioni eseguite durante il processo di comunicazione con il dispositivo remoto.
13
IToolS basics Iprel Progetti s.r.l.
Version 1.1 31/10/2011

Di seguito sono elencati e descritti i vari eventi che caratterizzano loggetto IOServer:

- Changed: evento generato quando la propriet Name dellIOServer, e quindi il protocollo utilizzato, viene modificata.
- Connected: evento genrato nel momento in cui lIOServer riesce ad instaurare una connessione con il dispositivo remoto.
- Disconnected: evento generato nel momento in cui viene interrotta la comunicazione con il dispositivo remoto.
- EndRequest: evento generato al completamento dellesecuzione di ciascuna richiesta (vedi EndRequest per loggetto
Client).
- Error: errore genrato ogni qual volta si verifica un errore nel processo di comunicazione.
- Exchanged: evento generato ogni qual volta vengono scambiati dati con il dispositivo remoto.
- Running: evento generato nel momento in cui lIOServer passa nello stato di esecuzione e quindi si trova pronto per
prendere in carico le richieste depositate dai Client.
- StateChanged: evento generato nel momento in cui lo stato dellIOServer viene modificato, lo stato che lIOServer pu
assumere sono:

a. Unknow: lIOServer si trova in uno stato non sconosciuto


b. Connecting: lIOServer sta tentando la connessione al dispositivo remoto.
c. Connected: lIOServer riuscito ad instaurare una connessione con il dispositivo remoto.
d. Running: lIOServer pronto a ricevere richieste da parte del Client.
e. Stopped: lIOServer stato arrestato e non in grado di gestire alcuna richiesta.
f. Error: lIOServer di trova in uno stato di errore.

- Stopped: evento generato nel momento in cui lIOServer viene arrestato.


- TraceEvent: evento generato nel momento in cui viene eseguita unoperazione tracciamento sullo stato dellIOServer.

14