IToolS Blog

Diagnostica dei driver IToolS

by itools@albertoschiassi.it on giovedì 6 agosto 2015 22:59
Il codice riportato di seguito definisce 10 variabili ad indirizzi differenti sul driver modbus ethernet e permette di mettere a confronto operazioni di lettura in funzione del parametro BlockSize, utilizzato in fase di ottimizzazione per raggruppare le richieste di lettura.
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.

TestDriverDiagnostic.zip

Blogs Parent Separator IToolS Blog
Author

Tags