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.

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:

/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.