Hoe verhoog je de VBA Scripting Performantie

De perfomantie van een VBA script op een SCADA server werkt prima, maar de iFIX clients werken niet zo snel als verwacht.

De performantie van een VBA script op een SCADA server werkt prima, maar de iFIX clients werken niet zo snel als verwacht. Misschien kan de volgende informatie over de scripting dit verschil verklaren.


Het is bekend dat bij het werken met clients acties naar de database meer tijd kunnen kosten dan verwacht. De oorzaak van de vertraging ligt in de manier waarop iFIX over het netwerk communiceert.

U kunt via scripting toegang krijgen tot de database door:
1. ReadValue of WriteValue gebruiken
2. Het Fix32-object gebruiken 
3. Een FindObject uitvoeren op de tagnaam (voor herhaalde acties)
4. Het FixDataSystem-object gebruiken (voor herhaalde acties)
5. Toegang tot geanimeerde objecten 
6. EDA-aanroepen gebruiken


Elk van deze methoden heeft zijn eigen voor- en nadelen.

ReadValue/WriteValue and Fix32
Het ReadValue/WriteValue- en Fix32-object zijn veruit het gemakkelijkst te gebruiken, maar qua prestaties zijn ze duur. Elke keer dat u een coderegel uitvoert die het ReadValue/WriteValue- of Fix32-object gebruikt om waarden op te halen of in te stellen, zal de WorkSpace:

- Instantieer een nieuw gegevensitem. 
- Valideert de verwijzing. 
- Een waarde lezen/schrijven. 
- Vernietig het gegevensitem.

Dit zal vooral langzaam zijn als het proces probeert toegang te krijgen tot een tag die zich op een remote SCADA server bevindt.

In iFIX 5.9 (met de Workspace SIM) en hoger is een extra functie voor het lezen van de tags geïntroduceerd. De ReadiFIXValue. Deze functie is geoptimaliseerd en presteert beter dan de standaard ReadValue functie. 

FindObject
De FindObject-methode retourneert een gegevensitem dat blijft bestaan zolang de variabele waaraan u het toewijst, bestaat. Deze methode is sneller dan het gebruik van het Fix32-object, omdat het object zichzelf alleen valideert wanneer het FindObject wordt uitgevoerd en een gegevensitem retourneert. Zolang de variabele niet wordt vernietigd of geen nieuw object wordt toegewezen, kunt u ernaar lezen en ernaar schrijven zonder dat de WorkSpace deze opnieuw valideert.

Voorbeeld 
In het volgende codevoorbeeld wordt gedemonstreerd hoe u de FindObject-methode gebruikt om toegang te krijgen thisnode:tag.f_cv:

Dim DI as Object
Dim X as Single
set DI = System.FindObject("Fix32.thisnode.tag.f_cv")
X = DI 'Read the value of thisnode:tag.f_cv and assign it 
'to single precision variable x
DI = 1 'Write a 1 to thisnode:tag.f_cv

FixDataSystem
Het FixDataSystem-object is iets moeilijker te configureren, maar is uiteindelijk een meer efficiënte methode om toegang te krijgen tot de database. Deze methode behoudt groepen gegevensitems. Deze methode is sneller dan het gebruik van de FindObject-methode, omdat gegevensitems collectief als groep worden gelezen en geschreven. Met andere woorden: wanneer u de groepsleesmethode van een FixDataSystem-object uitvoert, leest het de gegevens voor alle tags die eraan zijn toegevoegd in één enkele aanroep. Wanneer u de waarde ophaalt uit het gegevensitem in de DataItems-verzameling, wordt deze feitelijk uit een buffer opgehaald in plaats van dat de gegevens uit de database worden opgevraagd. Als u voortdurend leest van of schrijft naar een groot aantal tags, kunt u overwegen het FixDataSystem-object te gebruiken.

Voorbeeld 
Het volgende codevoorbeeld demonstreert het gebruik van het FixDataSystem-object om toegang te krijgen tot thisnode:tag.f_cv:

'Create the Data System OCX 
Dim FDS As Object
Dim Y as single

Set FDS = CreateObject("FixDataSystems.Intellution FD Data System Control")
FDS.Groups.Add ("DataGroup1") 'Add a group to the Groups collection
FDS.Groups.Item("DataGroup1").DataItems.Add("Fix32.thisnode.tag.f_cv") 'Add the item to the group 
FDS.Groups.Item("DataGroup1").Read 'Read all the items in the group 
Y = FDS.Groups.Item("DataGroup1").DataItems.Item(1).Value 'Get the value which was cached in the read 
FDS.Groups.Item("DataGroup1").DataItems.Item(1).Value = 3.0 'Change the cache 
FDS.Groups.Item("DataGroup1").Write 'Write out all the caches in the group (only write those 'items which have changed) 


Geanimeerde objecten  
Een andere methode voor het efficiënt uitvoeren van leesbewerkingen is het verkrijgen van toegang tot de waarde van een object dat al is verbonden met een tag in de database. Wanneer u de eigenschap van een object naar een tag in de database animeert, wordt er een abonnement op de database gemaakt. Telkens wanneer deze tag verandert, wordt die eigenschap gewijzigd in de nieuwe waarde van de tag. Als u deze eigenschap leest, leest u de waarde in de database zonder extra overhead toe te voegen. U kunt elk object in elke afbeelding of op de globale pagina gebruiken, inclusief gebeurtenisobjecten, variabele objecten, rechthoekige objecten, enzovoort.

Voorbeeld
In dit voorbeeld wordt ervan uitgegaan dat er een afbeelding ("Picture") bestaat die een geanimeerde rechthoek ("Rect1") bevat. De horizontale positie van Rect1 wordt geanimeerd naar thisnode.tag.f_cv

Dim AO As Object
Dim Y As Single
Set AO = System.FindObject ("Picture.Rect1.AnimatedHorizontalFillPercentage")
Y = AO.InputValue 'Get the current value of the animated horizontal position input which gets the value of thisnode:tag.f_cv

EDA
Bij gebruik van EDA worden speciale functieaanroepen uit de Easy Database Access toolkit gebruikt. De functies werken niet via de standaard OPC-oproepen (normaal gesproken gebruikt de Workspace OPC-communicatie voor alle tag-informatie), maar gaan rechtstreeks naar het iFIX-systeem. Bij gebruik van EDA-oproepen voor het uitlezen van een groep tags werkt het als volgt:

- Er wordt een tag of een groep tags gemaakt
- De tag of groep is gevalideerd
- De waarde(n) worden gelezen of geschreven.
- De tag of een groep tags wordt verwijdert

Bij het werken met groepen met veel tags wordt door andere klanten een grote prestatieverbetering (tien keer sneller dan de leeswaarde) gerapporteerd omdat de hele groep in één functieaanroep wordt gevalideerd. Niet elke tag die aan de groep wordt toegevoegd hoeft gevalideerd te worden (Dit is anders dan bij het FixDataSystem)

Meer informatie is te vinden in de iFIX Eelektronische help en in de documentatie die bij de EDA/Integration Toolkit wordt geleverd.