Anvil code
Algemeen
Anvil code laat je toe doorgedreven automatisering toe alsook het gebruik van krachtige functies en het maken van specifieke componenten.
Delen van de Anvil programmeertaal kunnen als instructies gebruikt worden binnen verschillende onderdelen van SimNEC zoals een RUSE blok, het PLOT gebeuren enz.
Echter de D-Blok (daemon blok) is specifiek voorbehouden voor het uitvoeren van Anvil code en wordt op een andere wijze geëvalueerd binnen een SimNEC model.
ℹ️ zie SimNEC Manual Daemon block
Scope
Variabelen binnen Anvil worden zichtbaar in de dialoog menu's wanneer ze niet worden vooraf gegaan door een $ teken.
Een variabele behoort tot een bepaalde klasse en sub klasse, maar is niet bruikbaar in een hoger liggende klasse wanneer ze in een subklasse wordt gedefinieerd, dit is analoog aan andere programmeer talen.
ℹ️ zie Anvil Programming Manual Variables: Declaration and Scope
Timing
In principe wordt de Anvil code die niet binnen een at() operator staat, telkens uitgevoerd wanneer er een evaluatie plaats vind van het model.
In ons voorbeeld zal de instructie f1; een dialoog vak maken waarin de waarde van variabele f1 getoond wordt.
De variabele $x is een interne variabele die bij iedere evaluatie wordt geüpdatet.
De at() operator kan één of meerdere tijdstippen bevatten waarop de instructies die volgen worden uitgevoerd en waardoor de verwerking wordt beperkt tot die momenten.
SimNEC maakt standaard gebruik van volgende sequentie om het model te evalueren.
startOfEval is de eerste evaluatie van Load naar Generator.
Hierop volgt een Generator to Load evaluatie om de waardes te berekenenendOf Eval is dan de laatste evaluatie van Load to Generator voor het berekenen van de definintieve waardes.
Wanneer je gebruik maakt van een sweep, zoals bij een frequentie sweep van de generator zoals in ons voorbeeld , dan zal voorgaande evaluatie voor iedere waarde van de sweep gebeuren.
Om gebruik te maken van specifieke momenten binnen een sweep hebben we volgende parameters:
startOfSweep: is het begin van de sweep
endOfSweep: is het einde van de sweep, dus na de laatste evaluatie
finalValue: dit is het tijdstip waarop de grafieken en dialogen worden ingevuld
/markers
//executed every evaluation
f1; //dialog visible variable
$x=L.Z.X.M; //internal variable
//execution on the start of the sweep
at(startOfSweep,endOfEval){
$lastx =$x;
$i=0;
$arr={};
}
//execution every sweep point
at (inSweep,endOfEval) {
//if x is within 1 ohm
if(($lastx > -5) && ($lastx <5))
{
Add($arr,{G.MHz,L.Z,A.Z});
++$i;
}
$lastx = $x; //get new value from evaluation
}
//execution at the end of the sweep
at (endOfSweep,endOfEval) {
pl $arr; //plot array
}
at(finalValue){
f1=SizeOf($arr); //size of array
}
Code uitgelegd
De interne variabele $x wordt elke evaluatie van het model uitgevoerd.
Tevens voorzien we een dialoog variabele f1, zodat we deze nadien van waarde kunnen voorzien of gebruiken om een parameter aan te passen
In het voorbeeld zie je dat er bij de start van de sweep een initialisatie gebeurt.(startOfSweep).
Door gebruik te maken van de toekenning $lastx=$x ; krijgt de interne variabele $lastx de waarde van $x op dit specifiek moment, de start van de sweep.
$x wordt namelijk iedere evaluatie van het model geüpdatet.
We voegen hier de extra tijdstip voorwaarde endOfEval aan toe om ervoor te zorgen dat de waardes die we als initialisatie gebruiken ook effectief berekend zijn bij de eerste evaluatie van het model.
Pas op het einde van de volledige sweep, plotten we de $arr.
Dit tijdstip wordt gedefinieerd met endOfSweep,endOfEval.
Als laatste kennen we aan de dialoog variabele f1 de lengte van de array toe op het tijdstip finalValue, waardoor deze actie slechts 1 x wordt uitgevoerd.