using System; using System.Collections.Generic; using System.Text; namespace TestDriverDiagnostic { class Program { static void Main(string[] args) { IToolS.Components.Communication.Variable variable1 = new IToolS.Components.Communication.Variable() { VariableName = "variable1", Address = "1", Area = "HR" }; IToolS.Components.Communication.Variable variable2 = new IToolS.Components.Communication.Variable() { VariableName = "variable2", Address = "2", Area = "HR" }; IToolS.Components.Communication.Variable variable3 = new IToolS.Components.Communication.Variable() { VariableName = "variable3", Address = "3", Area = "HR" }; IToolS.Components.Communication.Variable variable4 = new IToolS.Components.Communication.Variable() { VariableName = "variable4", Address = "4", Area = "HR" }; IToolS.Components.Communication.Variable variable5 = new IToolS.Components.Communication.Variable() { VariableName = "variable5", Address = "5", Area = "HR" }; IToolS.Components.Communication.Variable variable6 = new IToolS.Components.Communication.Variable() { VariableName = "variable6", Address = "6", Area = "HR" }; IToolS.Components.Communication.Variable variable7 = new IToolS.Components.Communication.Variable() { VariableName = "variable7", Address = "7", Area = "HR" }; IToolS.Components.Communication.Variable variable8 = new IToolS.Components.Communication.Variable() { VariableName = "variable8", Address = "8", Area = "HR" }; IToolS.Components.Communication.Variable variable9 = new IToolS.Components.Communication.Variable() { VariableName = "variable9", Address = "9", Area = "HR" }; IToolS.Components.Communication.Variable variable10 = new IToolS.Components.Communication.Variable() { VariableName = "variable10", Address = "10", Area = "HR" }; IToolS.Components.Communication.Group group = new IToolS.Components.Communication.Group(); group.Items.AddRange(new IToolS.Components.Communication.Variable[] { variable1, variable2, variable3, variable4, variable5, variable6, variable7, variable8, variable9, variable10 }); IToolS.Components.IOServers.IOServer ioServer = new IToolS.Components.IOServers.IOServer(); ioServer.Name = "ModnetMaster"; IToolS.Components.Communication.Client client = new IToolS.Components.Communication.Client(); client.UpdateTime = -1; //ciclo di lettura disabilitato client.Group = group; client.IOServer = ioServer; client.StartSync(); ioServer.BlockSize = 10;//numero di indirizzi gestibili con un'unica richiesta Console.WriteLine("BlockSize: {0}", ioServer.BlockSize); for (int i = 0; i < 5; ++i) { Console.WriteLine("Cycle: {0}", i); DateTime time = DateTime.Now; IToolS.Data.ClientResult result = client.ReadSync(new IToolS.Components.Communication.Variable[] { variable1, variable2, variable3, variable4, variable5, variable6, variable7, variable8, variable9, variable10 }); Console.WriteLine("Time: {0}", (DateTime.Now - time).TotalMilliseconds); foreach (IToolS.IOServers.IORequest request in result.Requests) { Console.WriteLine("Request: {0}", request.Result.ToString()); } } Console.WriteLine(("Press ENTER to exit")); Console.ReadLine(); client.Stop(); client.StopIOServer(); } } }
Il ciclo di 5 richieste con BlockSize uguale a 2 produce il risultato mostrato sotto, da cui si evince che il numero di richieste necessario per soddisfare l'operazione di lettura delle variabili è dato del numero totale di indirizzi da leggere diviso il numero massimo di indirizzi leggibili da una richiesta (10/2=5):
BlockSize: 2 Cycle: 0 Time: 47,0027 Request: Ok Request: Ok Request: Ok Request: Ok Request: Ok Cycle: 1 Time: 11,0006 Request: Ok Request: Ok Request: Ok Request: Ok Request: Ok Cycle: 2 Time: 10,0006 Request: Ok Request: Ok Request: Ok Request: Ok Request: Ok Cycle: 3 Time: 11,0006 Request: Ok Request: Ok Request: Ok Request: Ok Request: Ok Cycle: 4 Time: 10,0006 Request: Ok Request: Ok Request: Ok Request: Ok Request: Ok Press ENTER to exit
Ciclo di 5 richieste con BlockSize uguale a 10:
BlockSize: 10 Cycle: 0 Time: 40,0023 Request: Ok Cycle: 1 Time: 3,0002 Request: Ok Cycle: 2 Time: 2,0002 Request: Ok Cycle: 3 Time: 2,0001 Request: Ok Cycle: 4 Time: 2,0001 Request: Ok Press ENTER to exit
Rispetto al caso con BlockSize uguale a 2, la prima cosa che si nota è che il numero di richieste per gestire l'operazione di lettura è uno ed il tempo totale per gestire l'operazione di lettura è notevolmente più basso (2 millisecondi contro 10 millisecondi).
Come si vede dati risultati ottenuti dalla lettura di 10 variabili prima con dimensione del blocco uguale a 2, poi con dimensione uguale a 10 si può dedurre che il tempo necessario a gestire le richieste di lettura è notevolmente più basso se la dimensione del blocco è impostato ad un valore tale da poter raggruppare le operazioni.
In aggiunta si può dire che l'aumento di calcolo necessario raggruppare le richieste è ampiamente compensato da un tempo inferiore per ottenere le informazioni attraverso il canale di comunicazione.
IToolS Blog