De bedoeling is om met behulp van een speadsheet, een wirelist te maken analoog aan de list die gebruikt wordt in EZnec.
Door verdere programmatie kan je zo de waardes die bepaald zijn in SimNEC ook op een eenvoudige wijze terug overhalen in EZnec ter verificatie.
We gebruiken in deze een N-Block, waardoor de code voor het maken van de antenne niet berust op een RUSE block, maar zuiver teksmatig kan gebeuren.
Vermits de SpreadSheet van SimNEC toe laat om data in te lezen vanuit een CSV file, kan je gebruik maken van Google Sheets, om de eerste data te genereren.
Binnen EZnec werd hiervoor een Excel sheet gebruikt en was de koppeling tussen MS-Office en EZnec nodig.
SimNEC loopt ook op Linux, waardoor de aanmaak platform onafhankelijk kan zijn in combinatie met Google Workspace.
Voor de verdere automatisatie kan je code schrijven die enkel de gegevens in de spreadsheet aanpast, waardoor de fundamentele werking gelijk blijft.
De procedure bevat een aantal stappen:
Aanmaken sheet in Google met de juiste kolomtitels en rij titels.
Exporteren van deze sheet naar CSV.
Maken nieuw project in SimNEC.
Importeren CSV in spreadsheet.
Aanmaken N-Block met code om de Sheet te importeren.
Verder uitbreiding en automatisering maak je in separate blokken code, waardoor je steeds verder kan bouwen aan je project.
In het voorbeeld gebruiken we een routine Calcpositions om aan de hand van een aantal variabelen, de volledige antenne te ontwerpen aan de hand van twee lengtes.
Nadien kan je deze lengtes door een NelderMead optimalisatie laten aanpassen om een optimale antenne te bekomen.
De volgende sheet bevat voor onze antenne de gegevens die we gaan gebruiken (maximaal 20 kolommen)
De Wx: lijnen komen overeen met wat je ook in EZnec zal zien.
Daarbuiten hebben we onderaan een aantal parameters geplaatst voor het verder automatiseren.
Lijn en kolom headers worden als tekst met één dubbelpunt gedefinieerd.
Variabelen, die slechts één cel benoemen worden als tekst met twee dubbele punten gedefineerd, rechts van de tekst voor data die rechts staat van het label en links van de tekst voor data die in een cel links van het label staat.
Eens je tabel aangemaakt kan je een download doen als CSV type.
Binnen SimNEC maken we een nieuw project aan, waarna je de SpreadSheet kan open, via menu View/Spread Sheet.
Na het openen van de file, ga je via load .csv om de .csv file die je vanuit Google Sheet gedownload hebt, te importeren.
De antenne code maakt gebruik van de gegevens die in de Spread Sheet staan om een antenne te maken.
Hiervoor wordt er enkel gebruik gemaakt van de Wx lijnen, de andere parameters zijn voor later.
De N Block draagt ook een aantal instellingen, zoals de SourceWirenr en de maxWireNr.
In ons geval dien je hier de waarde 1 en 13 in te vullen.
Door gebruik te maken van de string / dictionary methode (bedankt Ward Harriman) kan je indirect adresseren en zo alle wires in een lus uit de sheet halen.
Opmerkingen:
De source moet steeds aan w2 geboden worden.
NECSource({w2,gnd},$wire,SS.SOURCEPOS);
De positie van de Source staat in de sheet op 50% van de W1, een 30cm lange draad (buis).
Hierdoor krijg je geen segmentatie fouten.
Indien je de waarde <5 zet, dan zal SimNEC zeggen dat de verbindingen te kort zijn voor deze 160m antenne.
SimNEC gebruikt conductiviteit, wat het omgekeerd evenredige is van de Ohmse weerstand.
$wire.mhos = 1/$w.Rohmm;
//EZnec_SimNEC
P1 w1 gnd;
P2 w2 gnd;
//R0 0 w1 w2;
NECUnits meters,mm;
NECOptions.severelyAcuteAngle = .02; // only VERY PARALLEL WIRES are ‘parallel’, speed optimatization
NECOptions.suppressSegmentShortWarnings = 1;
NECOptions.suppressDRC = 1;
NECOptions.bigDesignWireCount = 5000;
SelectOneOf (NECGrounds) env;
NECGround(env,.005,13);
BodyGraphic(antenna);
sourcewirenr;
maxWireNr;
for (int i=1;i<=maxWireNr;++i) {
// you can use a string to access a dictionary element
// so you can say[“name"] instead of ‘.name’.
// this allows you to construct an element name at run time:
$w = SS["W"+i];
$wire=NECWire({$w.E1X,$w.E1Y,$w.E1Z},{$w.E2X,$w.E2Y,$w.E2Z},$w.Dia);
$wire.mhos = 1/$w.Rohmm;
$wire.insulation={$w.Thk,$w.DielC};
if (i==sourcewirenr) {
NECSource({w2,gnd},$wire,SS.SOURCEPOS);
}
}
Na het maken van dit blok (kan met copy-past uit een editor zoals Notepad++ etc), kan je een mini versie zien van de antenne als blok symbool en kan je dmv de View/Nec2 Display het stralingsdiagram bekijken.
Het optimaliseren kan nu gebeuren op een manuele manier, door het aanpassen van de waardes seg160m en seg80m, maar je kan ook gebruik maken van de optimizer routines in SimNEC, zoals de NeldeMead routine. (zie verder)
Voor het optimaliseren van een antenne kan je verschillende pistes bewandelen:
Laagste SWR als gemiddelde van alle banden.
Laagste mismatch loss als gemiddelde van alle banden
Laagste Imaginaire waarde van de antenne (resonantie afwijking) op alle banden
Beste resonantie....
Het is een utopie te denken dat je een antenne kan maken die op alle banden een perfecte SWR heeft en even efficient werkt.
Het gebruik van een tuner is dus aangewezen.
Hierdoor kunnen we spreken van een optimalisatie van een "antenne systeem", wat bestaat uit een antenne, tuner, transmissielijnen, chokes, radialen, ground system etc en dus veel meer componenten bevat dan enkel een antenne.
Indien je een draadantenne maakt, dan kan deze na de ingave in NEC als een veelvoud van het aantal draden terug te vinden zijn.
Dit komt door de segmentatie.
Om de totale lengte van de draad te bepalen kan je gebruik maken van de berekeningen zoals bovenaan, waarbij je de 3d punten zelf optelt of indien het over één enkele draad is, kan je ook gebruik maken van een lus die de lengte van alle draden binnen het NEC model optelt.
De volgende routine doet dit en kan in een D block geplaatst worden:
$wirestable = A._NECBLOCK.wires; // read NECwires dictionary
Tot=0; //init total length
$i=0; //init index in dictionary, starting at 0
for (dcl $tabel:$wirestable) {
Tot += A._NECBLOCK.wires[$i].length;
$i += 1; //increment to next wire in table $tabel
}
pl Tot;