module 2 Experiment-automatisering voor MNW1
1
2
Inhoudsopgave
Inhoudsopgave 3 Over deze module 7 Doel van de module 7 De onderdelen van de module 7 Opzet van de handleiding 8 Beschikbaarheid LabVIEW files op het net Verslaglegging 9 Beoordeling 9 Tijdschema 9
1
9
Introductie van LabVIEW 11 1.1 Overzicht van LabVIEW 12 1.1.1 Virtuele Instrumenten 12 1.1.2 De taal ‘G’ 12 1.1.3 Front panel en diagram. 12
1.2 Een eerste kennismaking 13 1.3 Het maken van een front panel 14 1.3.1 Je VI bewaren
17
3
Inhoudsopgave
1.4 Het diagram achter het front panel
18
1.4.1 Tooltips en Terminals 20 1.4.2 Zien hoe een VI werkt 21
1.5 Bugs en insekticide 22 1.5.1 Typen fouten 22 1.5.2 Het Opsporen van Syntactische Fouten 22 1.5.3 Het Opsporen van Semantische Fouten 23
1.6 Een VI als subVI gebruiken 24 1.6.1 Finishing Touches
1.7 Tips & Tricks
2
26
26
Programmeren in G 29 2.1 De While- en For-structuur 30 2.1.1 De while-loop 30 2.1.2 De for-loop 31 2.1.3 Samenvatting van de for-loop 33 2.1.4 Herhaalstructuren: auto-indexing 33 2.1.5 Herhaalstructuren: shift registers 34
2.2 Arrays 35 2.2.1 Een array op het front-panel 35 2.2.2 Programmatische arrays 35 2.2.3 Polymorfie 37
2.3 Korte Cursus Logica 37 2.4 Beslissingen 39 2.4.1 Resultaten van een case-structuur 2.4.2 Eenvoudige selectie 41 2.4.3 Meer cases… 42
2.5 De volgorde van acties 42 2.5.1 De Sequence
43
2.6 Tips & Tricks
44
2.6.1 Context Help 45 2.6.2 On-line reference 45 2.6.3 De officiële handleidingen
3
45
Verder in G 47 3.1 Clusters
48
3.1.1 Het error cluster
50
3.2 Grafieken 50 3.3 Strings 55 3.4 Bestanden 55 3.4.1 Spreadsheet Tekst Bestanden
4
56
40
3.5 Lokale variabelen en property nodes
57
3.5.1 Lokale variabelen 57 3.5.2 Property Nodes 58
3.6 VI Opties en VI Libraries 60 3.6.1 Een VI als Popup VI 3.6.2 VI libraries 62
3.7 Tips & Tricks
62
64
3.7.1 Bestaande code naar een subVI
4
64
De echte wereld 65 4.1 Een meetsysteem 65 4.2 De interface 68 4.2.1 Verschillende Interfaces
68
4.3 Het gebruik van drivers 69 4.3.1 Algemene Driver Zaken 69 4.3.2 Volgorde van driver VI’s 70
4.4 Computer Uitbreidingskaarten 70 4.4.1 DAQ kaarten
5
71
Het opzetten van een project 73 5.1 Het Stappenplan 74 5.2 Het stroomschema 75 5.2.1 Blokken in het stroomschema
75
5.3 Het probleem en de uitwerking
76
5.3.1 Het gebruikersinterview 77 5.3.2 Maken van het front-panel 77 5.3.3 Kiezen van de meetapparatuur 77 5.3.4 Het Stroomschema 78 5.3.5 Handige hulponderdelen 78 5.3.6 Testen en controleren 80 5.3.7 Check-list 80
6
Eindopdracht 83 6.1 De opdrachten 84 6.1.1 Een hoortest programma 84 6.1.2 Het aantonen van Tartini-tonen 6.1.3 Algemene eisen 85
6.2 Voorbeeldverslag 6.2.1 Titel 85 6.2.2 Inhoudsopgave
84
85 86
5
Inhoudsopgave
6.2.3 Eisen waaraan het programma moet voldoen 86 6.2.4 Onderdelen die nodig zijn om aan alle eisen te voldoen 86 6.2.5 De userinterface 86 6.2.6 Het stroomdiagram 86 6.2.7 Uitvoer van het programma 87 6.2.8 Conclusies 87
6.3 Inleveren eindopdracht 87 6.3.1 Wat moet je inleveren en hoe 87 6.3.2 Bespreking met assistent 88 6.3.3 Afronden module 88 6.3.4 Info assistent 88
6.4 En verder… 88
A
Debugging 89 A.1 Gebroken run-arrow 89 A.2 Ongewenste resultaten 90 A.2.1 Het lokaliseren van het probleem 90 A.2.2 Het oplossen van problemen 91
A.3 Overige problemen 91
B
Data-types 93 B.1 Getallen 93 B.1.1 Floating Point Getallen 94 B.1.2 Integers (signed en unsigned) 95 B.1.3 Complexe Getallen 95
B.2 Booleans 96 B.3 Tekst 96 B.4 Samengestelde Types 97 B.5 Referentie Types 97
C
D
Format String Codes 99 LabVIEW instellingen 101 D.1 Instellingen t.b.v. de cursus Programmeren en Simuleren (module LabVIEW en Experiment-automatisering)
E
6
Tijdschema 107
101
Over deze module
Doel van de module
In deze module leren jullie om een eenvoudig experiment met een computer te besturen. Een computer alleen kan dit niet. Om een experiment met een computer te besturen, moet er een geschikte verbinding tussen de computer en het experiment worden gemaakt. Verder moet de computer geprogrammeerd worden om het experiment te besturen. Het programma dat daarvoor nodig is, leren jullie zelf te schrijven. Uiteindelijk moeten jullie de opgedane kennis tijdens de verschillende practicum series kunnen toepassen en daarmee bestaande programma’s aanpassen aan jullie eigen wensen. We kunnen jullie daar niet toe dwingen, we proberen echter deze
module zo leuk te maken dat jullie dat uit eigen beweging gaan doen. De onderdelen van de module
In deze module maak je kennis met de volgende onderdelen: De programmeeromgeving waarmee het programma voor de besturing van het experiment wordt geschreven. Deze omgeving, LabVIEW, heeft een grafische taal. Voordat we een experiment gaan besturen, zullen we kennismaken met deze taal en de programmeeromgeving. De elementaire onderdelen van een geautomatiseerd meetsysteem. Dit onderdeel behandelt hoe je een grootheid omzet in een voor de compu-
7
Over deze module
ter meetbare grootheid en hoe dit signaal vervolgens in de computer belandt. Het opzetten en beheersen van een uitgebreider project. Om een experiment succesvol te automatiseren, moet je het project zorgvuldig opzetten. Om dat goed te doen zijn een aantal stappen en procedures noodzakelijk. Deze worden aan de hand van een voorbeeld uitgelegd. Een afsluitende opdracht waarin de voorgaande onderdelen aan de orde komen.
tekstblokken en/of ballonnen steeds aandachtig door. Een luidsprekericoon boven een tekstblok geeft aan dat extra informatie te horen is. Een voorbeeld van een movie staat op pagina 17. Onder de grafische videoblokken kun je gemarkeerde tekstblokken vinden, aangegeven met een dikke lijn aan de linkerzijde. Deze tekstblokken bevatten vervangende uitleg van de instructievideo en kunnen dus overgeslagen worden als je de video begrepen hebt. De video’s zijn in het Engels.
Opzet van de handleiding
De module wordt gegeven in een practicum en een aantal plenaire college-uren. Deze handleiding bevat vele opdrachten, voorbeelden en korte instructievideo’s (swf-bestanden) die je kunt afspelen in een macromedia flash player. Bij het schrijven van de module is er vanuit gegaan dat je eerst, indien aanwezig, de instructie video’s bekijkt, daarna de voorbeelden en vervolgens de opdrachten maakt. De video’s, voorbeelden en opdrachten bouwen op elkaar voort en dus moet je ze in die volgorde afwerken. Om de verschillende onderdelen gemakkelijk te herkennen, zijn er kleine grafische elementen aan toegevoegd.
Opdracht Een opdracht Een opdracht die je moet uitvoeren herken je aan het bovenstaande plaatje. Verval niet in de fout om je alleen te beperken tot het oplossen van de opdrachten. De tussenliggende tekst bevat zeer veel essentiële informatie. Een voorbeeld van een opdracht staat op pagina 24. Een opdracht eindigt met een blokje en een horizontale lijn.
X
TRA
Video Een instructievideo Een instructievideo bekijk je m.b.v. macromedia flash player in de web browser te vinden op http:// www.few.vu.nl/~janm/timnw/. Lees alle
8
Extra Een opmerking
Belangrijke concepten en begrippen worden benadrukt in een extra. Een voorbeeld van een extra staat op pagina 16.
Voorbeeld Een voorbeeld Uitgewerkte opdrachten tref je aan in een voorbeeld. Een voorbeeld hiervan staat op pagina 13.
die in de handleiding aan de orde komen kun je downloaden vanaf webpagina www.few.vu.nl/~janm/timnw/. Deze link kun je ook vinden op BlackBoard. De beschikbare files staan per hoofdstuk opgeslagen in een folder ‘LabVIEW Module Files’, Pak de zip-file uit en sla deze in je eigen home-directory op. Verslaglegging
Waarschuwing Gevaar! Een waarschuwing wijst je op zaken die schade aan de computer of verlies van gegevens kunnen veroorzaken. Lees deze waarschuwingen zorgvuldig en neem ze in acht. Een voorbeeld van een waarschuwing vind je op pagina 36.
Je dient de opdrachten uit te werken en te bewaren in je eigen home-directory. Over de eindopdracht moet je een verslag schrijven. Beoordeling
De beoordeling van de module vindt plaats op grond van je werkhouding en prestaties tijdens de cursus, het verslag over de eindopdracht en het programma. Beoordeling kan alleen dan plaatsvinden als alle opdrachten uitgewerkt zijn. Tijdschema
Beschikbaarheid LabVIEW files op het net
Het voorlopige tijdschema van de module is te vinden in appendix E
LabVIEW files betreffende een groot aantal van de voorbeelden en de opdrachten,
9
Over deze module
10
Introductie van LabVIEW
In de natuurkunde wil je verschijnselen meten om vervolgens conclusies te kunnen trekken over de geldigheid dan wel ongeldigheid van een theorie. Vele metingen zijn met eenvoudige middelen uit te voeren, maar voor andere metingen moet er meer uit de kast worden gehaald. Tegenwoordig wordt al snel een computer gebruikt voor de registratie van meetgegevens en de besturing van een experiment. Een kale computer kan echter niets meten, want deze heeft geen sensoren. Om een computer met de buitenwereld, in ons geval een meetopstelling, te verbinden is extra apparatuur noodzakelijk. Het besturen van deze extra hardware moet door speciale software gebeuren. Het schrijven van deze software in traditionele talen is lastig en tijdrovend. Dit betekent
1
dat een geschreven programma ook moeilijk is te veranderen om aan de wensen van een gebruiker of experimentator tegemoet te komen. Dit is een ongewenste situatie. We zouden graag zien dat jullie zelf een computer kunnen programmeren voor de besturing van een experiment, zodat jullie beslissen wat er gemeten wordt. Met de traditionele programmeertalen is dat nauwelijks mogelijk, omdat deze niet zo gebruiksvriendelijk zijn. Daarom gebruiken we de programmeeromgeving LabVIEW, die veel gebruiksvriendelijker is en in feite is ontwikkeld om computers aan meetopstellingen te koppelen. LabVIEW is zeer uitgebreid en niet alles kan in deze module aan bod komen. We zullen ons steeds beperken tot de noodzakelijke onderdelen.
11
Introductie van LabVIEW
1.1 Overzicht van LabVIEW Er is een aantal onderdelen van LabVIEW die het gebruik voor het practicum interessant maken. We bespreken ze hier kort, tijdens de rest van de module zal je ze uitgebreider leren kennen.
‘schrijven’ we in G:
1.1.1 Virtuele Instrumenten
LabVIEW is een afkorting van ‘Laboratory Virtual Instrument Engineering Workbench’. Centrale gedachte achter LabVIEW is het gebruik van ‘virtuele instrumenten’ (VI’s): stukken van een programma die binnen een ander programma gebruikt kunnen worden. Voor de (echte) apparaten die op het practicum beschikbaar zijn, zijn al VI’s geschreven die de verbindingen met die apparaten leggen. Hierdoor zijn deze apparaten op eenvoudige wijze te gebruiken in een LabVIEW programma. Elk programma dat gemaakt is in LabVIEW is een VI, en kan ook weer gebruikt worden binnen een ander programma; het wordt dan een subVI genoemd. Door deze gelaagde structuur zijn LabVIEW programma’s gemakkelijk aan te passen aan de wensen van de gebruiker, en is het mogelijk om details weg te stoppen, wat de overzichtelijkheid van programma’s ten goede komt. 1.1.2 De taal ‘G’
Een ander belangrijk onderdeel van LabVIEW is de programmeertaal, ‘G’. Deze is niet gebaseerd op tekst, zoals de meeste traditionele talen, maar op grafische elementen. Dus in plaats van vergelijking 1.1: t = 4 sin x + 3 cos 2y
12
(1.1)
De gegevens gaan van het ene element via de ‘draadjes’ naar het volgende. Als een element alle gegevens heeft ontvangen, dan voert het z’n berekening uit en wordt het resultaat aan de andere kant gezet. Omdat je nauwelijks tekst in hoeft te typen, zijn fouten als gevolg van een typefout een zeldzaamheid. Bovendien zijn de symbolen gemakkelijk te herkennen waardoor het leren van de taal snel en eenvoudig gaat. Voor sommige taken, bijvoorbeeld op het gebied van de numerieke analyse, kan een traditionele taal toch de voorkeur verdienen. G is een echte programmeertaal die ook wordt omgezet in machinecode voor de computer. Dit maakt de taal voldoende snel voor de meeste toepassingen, al is C meestal sneller. Bij een taal als C moet je echter ook rekening houden met de tijd die het kost om het programma te schrijven en te debuggen. Dit maakt het vaak voordeliger om LabVIEW te kiezen voor het koppelen van een meetapparaat aan een computer, zeker tijdens een kort practicum. 1.1.3 Front panel en diagram.
Naast het verbinden van verschillende programma’s, is het maken van een user interface een onderdeel dat in traditionele programmeertalen snel in de verdrukking komt.
Een eerste kennismaking
In LabVIEW ontwerp je eerst een user interface. Deze user interface maak je op het front panel. Je kunt dit front-panel vergelijken met het bedieningspaneel van een apparaat. Als je het front panel hebt gemaakt, kun je testen of deze voldoet aan je eisen.
Je kunt deze tests al uitvoeren vóórdat je het eigenlijke programma hebt geschreven. Het programma zelf schrijf je in de taal G. Dit programma wordt geschreven op het block diagram. Je kunt dit venster vergelijken met de elektronica in een apparaat.
1.2 Een eerste kennismaking Voor we starten met het programmeren in LabVIEW, bekijken we eerst een VI om wat gevoel voor de omgeving te krijgen.
Voorbeeld Een VI gebruiken In de folder
1 in de folder tref je een document aan met de naam ‘Temperature Measurement Demo.llb’. Dubbelklik op deze file. LabVIEW wordt nu gestart en het programma dat in ‘Temperature Measurement Demo.llb’ staat wordt geopend. Om het programma te starten, moet je op de run-knop klikken. De run-knop bevindt zich linksboven in het venster. Je kunt nu de verschillende onderdelen op het front panel manipuleren. Het programma dat nu actief is, meet1 een temperatuur en maakt enkele grafieken met een analyse van wat er gemeten is. Hoofdstuk
‘LabVIEW Module Files’
1. Dit programma meet niets, maar gebruikt een simulatie van een temperatuurmeting.
Door de schakelaar met de naam ‘Acquisition’ over te halen, stopt het programma. De volgende deelopdracht heeft het risico dat jullie je overdonderd voelen: we gaan de G-code bekijken die het programma bestuurt. Alles wat je hier ziet zal je begrijpen aan het einde van de module. Kies Show Block Diagram uit het Windows menu, of druk ctrl-E. Er verschijnt nu een nieuw venster met daarin het diagram.
Figuur 1.1 Het diagram
De onderdelen die je ziet zijn de ‘touwtjes’, de subVI’s, operaties en structuren. Getallen stromen van het ene object naar het volgende via de touwtjes. De structuren bepalen hoe vaak een actie herhaald wordt en of een actie wordt uitgevoerd. De subVI’s zijn programma’s die hier worden gebruikt om een bepaalde berekening uit te voeren. Als je genoeg hebt gezien, kun je beide vensters sluiten.
13
Introductie van LabVIEW
1.3 Het maken van een front panel Je hebt nu gezien hoe een LabVIEW programma gebruikt kan worden. In de volgende paar opdrachten schrijf je een eigen programma. We beginnen eenvoudig: je eerste LabVIEW programma berekent het gemiddelde van twee getallen. Voordat we beginnen met het schrijven van het VI dat een gemiddelde van twee getallen berekent, laten we eerst een paar verborgen vensters van LabVIEW zien. Maak een nieuw, leeg VI door New te kiezen uit het File menu en vervolgens de default instelling Blank VI te kiezen door op OK te klikken. Voordat we verder gaan eerst een korte instructie.
LabVIEW heeft een algemeen tools palet. Gereedschappen die je nodig hebt om je VI te bouwen, tref je hier aan. Je kunt het tools palet tevoorschijn halen via het View menu, met de keuze Tools Palette. Het venster uit figuur 1.2 verschijnt.
Figuur 1.2 Het Tools Palet automatische tools selectie positioning operating
edit text
wiring
scrolling
pop-up menu
kleur sample
breakpoint
Video LabVIEW Palettes Start de instructie Palettes op de webpagina van Experiment-automatisering. De instructievideo laat je zien hoe je met de drie grafische LabVIEW Palettes je eigen programma kunt maken.
probe
voor achter
kleur
Als je de verschillende tools selecteert, dan zie je dat de muis-cursor aangeeft welk gereedschap is geselecteerd2. 2. Kijk uit met het breakpoint gereedschap. Als je met dat tool in een leeg venster klikt, dan kan het betreffende programma niet worden uitgevoerd. Nogmaals klikken, zodat de rode rand verdwijnt, heft dit effect weer op.
14
Het maken van een front panel
Als het front panel het actieve venster is, dan is er een item in het View menu met de naam Controls Palette. Dit is een palet voor het bouwen van een gebruikersinterface. Het controls palet staat afgebeeld in figuur 1.3.3.
Figuur 1.3 Het Controls Palet
Als het diagram echter het actieve venster is, dan verandert het View menuitem Controls Palette in Functions Palette. In dit palet vind je functies voor het bouwen van je programma, zoals optellen, aftrekken, vermenigvuldigen, sinus, maar ook functies voor het gebruik van een seriële poort, etc. Het functies palet staat afgebeeld in figuur 1.4.
Figuur 1.4 Het Functions Palet
De onderdelen zijn gegroepeerd in logische verbanden, zoals getallen, schakelaars, tekst, menu’s, grafieken, etc. Omdat je elementen van een gebruikersinterface alleen op het front panel kunt plaatsen, is dit venster alleen beschikbaar als het front panel het actieve venster is.
3. Indien voor de palette view ‘Category (Standard)’ is geselecteerd, zoals in bijlage D.1 is gedaan.
15
Introductie van LabVIEW
Figuur 1.5 Het numeric sub-palet De Controls Palette en de Functions Palette kun je als een default instelling kiezen. Zie Bijlage D.
Opdracht 1.1 Een front-panel maken
Met New uit het File menu heb je zojuist een leeg VI gemaakt. We gaan nu voor ons Gemiddelde (2).vi een gebruikers-interface ontwerpen. Om dit goed te kunnen doen, bepalen we eerst wat we moeten weten om het gemiddelde van de twee getallen te kunnen bepalen. Uiteraard moeten we de twee getallen kennen die we willen middelen. Het aantal getallen staat vast en hoeft dus niet apart te worden ingevoerd. Verder moeten we ook bepalen wat we de gebruiker willen vertellen. Deze is benieuwd naar de uitkomst van de berekening, en die zullen we dus moeten afbeelden. Zorg dat het controls palet op het scherm staat. We willen twee getallen invoeren. Het invoeren van een getal gebeurt met een ‘Numeric Control’. Door op het vakje in het controls palet te klikken verschijnt het numeric sub-palet van figuur 1.5.
16
Je kunt van het sub-palet eventueel weer terug door op ‘Numeric’ te klikken. Je hebt nu een venster met de LabVIEW manieren om getallen in te voeren en weer te geven.
X
TRA
Extra Controls en Indicators
Een Control bepaalt getallen in een programma. Een control wordt dus gebruikt om getallen in te voeren. Een Indicator bevat de waarde van een getal. Een indicator wordt dus gebruikt voor het weergeven van getallen, de uitvoer dus.
Het maken van een front panel
Voor de invoer van de twee getallen, moeten we twee controls op het front-panel plaatsen. Nu worden controls in allerlei formaten gemaakt: voor getallen zijn er al 12 verschillende controls, en dan heb je ook nog controls voor tekst, boolse variabelen4, etc. Voor ons programma gebruiken we het ‘Numeric Control’ dat linksboven in het numeric sub-palet te vinden is. Sleep het control van het palet naar je front-panel. Boven het control zie je nu een plaats waar je tekst kunt intypen. In dit label typ je de naam ‘Getal 1’. Als de naam boven het control staat, kun je het typen afsluiten door naast het control te klikken. Als je al naast het control hebt geklikt, dan is het label verdwenen. Later komen we een manier tegen om het label weer te voorschijn te halen, maar nu zal je het control eerst moeten verwijderen: selecteer het control met het positioning gereedschap en druk op de backspace of delete toets op je toetsenbord. Nu kun je het control opnieuw plaatsen en de naam intypen. Plaats een tweede ‘Numeric Control’ op je front-panel en noem dat ‘Getal 2’. Om de uitkomst van deze berekening aan de gebruiker te laten zien, plaatsen we ook een ‘Numeric Indicator’ op het front-panel. Deze staat naast de ‘Numeric Control’ op het numeric subpalet. Noem deze indicator ‘Gemiddelde’. Als alles volgens plan is verlopen, heb je nu een gebruikers interface gemaakt. De 4. Boolse variabelen zijn ‘waar’ of ‘niet waar’: schakelaars dus.
interface moet er ongeveer uitzien als in figuur 1.6.
Figuur 1.6 Het front-panel
Dit virtuele instrument voert nog niets uit, er is immers nog geen programma geschreven. 1.3.1 Je VI bewaren
Omdat we in de volgende opdracht het programma verder werken met dit frontpanel, moet je het bewaren. Kies Save uit het File-menu en bewaar je VI als ‘Gemiddelde (2).vi’ op een geschikte plaats op je harde schijf.
Video Front panel Front panel laat je aan de hand van een voorbeeld opdracht 1.1 zien.
17
Introductie van LabVIEW
1.4 Het diagram achter het front panel Het diagram van een VI is het programma dat wordt uitgevoerd met de waarden uit het front-panel. LabVIEW gebruikt een taal die gebaseerd is op dataflow. De gegevens stromen van het frontpanel via controls door het diagram naar de indicatoren die hun waarde weer weergeven op het front panel. We zullen steeds ingewikkelder diagrammen maken, maar de volgende opdracht is relatief eenvoudig, om de principes te leren kennen.
X
TRA
Extra Data-flow
Data-flow programmeren is een centraal begrip binnen LabVIEW. De volgorde waarin de opdrachten worden uitgevoerd, wordt bepaald door de beschikbaarheid van de gegevens: een opdracht wordt pas uitgevoerd als alle invoergegevens voor deze opdracht aanwezig zijn.
eerst wordt uitgevoerd. Een voorbeeld
hiervan staat in bovenstaand schema. Bij dit voorbeeld is de volgorde van uitvoeren onbelangrijk: in beide gevallen zijn de resultaten hetzelfde. Er zijn echter gevallen waar de volgorde van uitvoeren zeer belangrijk is. Operaties in LabVIEW hebben één of meer ingangen en één of meer uitgangen, respectievelijk input- en output terminals genaamd. Via touwtjes verbind je de terminals met elkaar, om het programma te maken. Controls en indicators worden in het diagram ook gerepresenteerd door terminals, zoals in de voorgaande voorbeeldfiguren.
X
TRA
In het bovenstaande voorbeeld betekent dit dat de optelling wordt uitgevoerd als Getal 1 en Getal 2 via de touwtjes de optel-opdracht hebben bereikt. Als twee opdrachten tegelijkertijd alle invoergegevens kunnen ontvangen, dan is het onduidelijk welk van de opdrachten het
18
Extra Terminals
Terminals waar je gegevens uit haalt, hebben een dikke rand. Deze terminals corresponderen met controls op het front-panel. Terminals waar je gegevens in stopt hebben een dunne rand. Deze corresponderen met indicators op het front panel. Gewapend met deze voorkennis programmeren we nu de gemiddelde berekening. Deze opdracht bouwt voort op opdracht 1.1.
Het diagram achter het front panel
Figuur 1.8 Het numeric sub-palet Opdracht 1.2 Het Diagram Om het gemiddelde van twee getallen te bepalen, moet je ze optellen en het resultaat delen door twee. Zorg ervoor dat het VI ‘gemiddelde (2).vi’ geopend is. Maak het diagramvenster actief via het Windows menu Show Block Diagram. Je ziet dat daar drie voorwerpen staan die dezelfde namen hebben als de controls en indicatoren op het front-panel, figuur 1.7.
Figuur 1.7 Het lege diagram
Het is een handige conventie om control terminals links in het venster te plaatsen en indicator terminals rechts. Dit betekent dat de stroom van gegevens van links naar rechts loopt, hetzelfde als je gewone leesrichting5. Tussen deze terminals moet nu het programma worden geschreven. Zet het functie palet op het scherm, View, Functions Palette. Ook hier zijn de verschillende functies gegroepeerd in samenhangende groepen. Klik op het icoon met als tooltip Numeric. Dan opent zich een sub-palet met aritmetische bewerkingen (zie figuur 1.8).
Sleep de optel-operatie (Add) naar het diagram, ergens rechts van Getal 1 en Getal 2, zie figuur 1.9. Het plaatsen van een functie of een subVI in het diagram werkt hetzelfde als het plaatsen van een control of indicator op het front-panel.
Figuur 1.9 De Add functie geplaatst
5. Voor LabVIEW is deze richting echter geheel onbelangrijk.
19
Introductie van LabVIEW
Nu moeten we een verbinding aanbrengen tussen de getallen en de Add functie. Dit doen we met het wiring gereedschap. Het wiring gereedschap van het tools palet wordt automatisch geselecteerd wanneer je de cursor naar de rechterzijde van Getal 1 verplaatst. Nu volgt een aantal stappen, met plaatjes, die je Getal 1 met de optel-functie laten verbinden. 1. Klik, met de wiring tool, op Getal 1.
2. Verplaats de muis naar de linkerbovenhoek van de optel-functie. Je ziet een gestippelde lijn die aangeeft hoe de draad gaat lopen.
1.4.1 Tooltips en Terminals
Zoals je inmiddels gezien hebt, verschijnen er tooltips onder de operatie als je met de wiring tool op een input of een output terminal van een operatie gaat staan. Dit is erg handig als je wilt weten wat, waar moet. Voor een optelling maakt het uiteraard niet uit welk touwtje je met x of y verbindt. Bij een deling is het echter wel prettig te weten dat je de juiste connecties maakt. LabVIEW heeft ook nog verschillende help-systemen. Eén daarvan bespreken we hier, omdat deze het leggen van verbindingen sterk vereenvoudigt. Als je Show Context Help uit het Help-menu kiest (ctrl-H) verschijnt het venster uit figuur 1.10.
Figuur 1.10 Het help-venster
3. Klik op de linkerbovenhoek om de draad te plaatsen. Als je muis goed staat, dan verschijnt onder de optelfunctie een tool-tip met de naam x: de naam van de input terminal.
Input(s)
Output(s)
Op het moment dat je met het wiring gereedschap over een icon beweegt, zie je een bepaalde terminal knipperen. Omdat de namen van alle terminals in dit venster zichtbaar zijn, weet je meteen welke terminals je moet verbinden. In dit venster staan de namen van de input terminals links, en de output terminals rechts. Zo weet je ook meteen de richting van de data-flow.
20
Het diagram achter het front panel
Het moet nu niet zo moeilijk zijn om de rest van het diagram te maken, zeker met de volgende aanwijzingen: De quotiënt-operatie vind je op het numeric sub-palet. Het teken dat op de operatie staat is: ÷. Een constant getal kun je invoegen door het icon dat links onder in het numeric sub-palet staat in het diagram te plaatsen en vervolgens met het edit text-tool hierin een getal te typen. Veel succes!
Video Dataflow programming Instructie Dataflow programming visualiseert de dataflow in een LabVIEW VI. Als je getallen hebt ingevuld op het front panel, kun je in het diagram volgen wat er gebeurt. In de gereedschappenstrip van het diagram-venster zie je een gloeilamp staan, zie figuur 1.12.
Figuur 1.12 Execution Highlights
Video Block diagram In instructie Block Diagram wordt opdracht 1.2 aan de hand van een ander voorbeeld gedetailleerd voorgedaan. 1.4.2 Zien hoe een VI werkt
Je hebt nu een VI geschreven. Je zult een diagram gemaakt hebben dat ongeveer lijkt op het diagram in figuur 1.11. Je kunt een paar getallen invullen op het front panel en zien of de resultaten kloppen door het VI uit te voeren.
Klik op deze knop, zodat het lampje aangaat (geel wordt). Bij het uitvoeren van het VI, zie je nu dat er bolletjes over de draden bewegen. Ook zijn er velden te zien die de waarden die de getallen tijdens de uitvoer van het VI aannemen weergeven. Een snapshot van de uitvoer van het gemiddelde (2).vi zie je in figuur 1.13.
Figuur 1.13 Run met highlights
Figuur 1.11 Het complete diagram
Je ziet dat de deelopdracht pas wordt uitgevoerd als alle invoerwaarden de opdracht hebben bereikt, geheel volgens de principes van data-flow programmeren.
21
Introductie van LabVIEW
Deze highlight-methode is één van de manieren om programmeerfouten uit
een VI te halen, maar er zijn er nog meer.
1.5 Bugs en insekticide Programmeerfouten worden ‘bugs’ genoemd. De term is al oud, en stamt nog uit de tijd dat computers met radio-buizen werkten. Als er een bug, een wandluis dus, tussen de hete radio-lampen terecht kwam, dan ging een aantal lampen kapot, wat resulteerde in een foute uitvoer van het programma. De term is blijven hangen en betekent nog steeds dat er fouten in de logische opbouw van een programma aanwezig zijn. Het opsporen van deze fouten is een belangrijke vaardigheid.
Video Debugging techniques Instructie Debugging techniques laat zien hoe je met verschillende tools fouten in je programma kunt opsporen.
1.5.1 Typen fouten
Er zijn verschillende typen fouten die in een programma aanwezig kunnen zijn: Syntactische fouten of Typo’s: Je kunt dit type fout vergelijken met spelfouten of grammaticale fouten. Een voorbeeld is een touwtje dat niet aan beide kanten ergens aan vast zit of verkeerd vast zit. Dit heet een ‘Bad Wire’. Semantische fouten: Dit zijn fouten die lastiger op te sporen zijn. De taal staat dit soort fouten toe, maar er staat onzin, voor zover het gaat om de oplossing van je opdracht. Een voorbeeld van een dergelijke fout zou het verkeerd-om aansluiten van de deling in de gemiddelde (2).vi zijn. Hoewel er dan onzin staat, is het programma (voor LabVIEW) correct, en kan het worden uitgevoerd.
22
1.5.2 Het Opsporen van Syntactische Fouten
Omdat dit type fout door LabVIEW gevonden kan worden, is het opsporen van deze fouten erg eenvoudig. De run-knop ‘breekt’ als LabVIEW een dergelijke fout heeft gevonden. Als je nu op de run-knop drukt, dan krijg je een lijst met de fouten die LabVIEW heeft gevonden. Door dubbel te klikken op een foutmelding, laat LabVIEW zien waar het misgaat. Eén van meest voorkomende fouten is het optreden van een ‘Bad Wire’. Je kunt alle ‘Bad Wires’ verwijderen door Remove Broken Wires te kiezen uit het Edit menu, of door op ctrl-B te drukken. Vaak zal dit je probleem oplossen. (Pas op!)
Bugs en insekticide
Een andere oorzaak van dit type fout is het niet aansluiten van een ‘verplichte’ input terminal van een subVI. De programmeur van een VI kan stellen dat een bepaalde input verplicht is, en het een fout is als je hem niet aansluit. Dit zijn eigenlijk fouten van het tweede type, maar nu zichtbaar gemaakt voor LabVIEW. 1.5.3 Het Opsporen van Semantische Fouten
Zoals je al kon vermoeden is het opsporen van semantische fouten veel moeilijker. Je zult nu het programma moeten volgen terwijl het wordt uitgevoerd. Een eenvoudige manier om dat te doen, heb je al gezien: uitvoeren met highlights. Vaak is de uitvoer dan echter nog te snel. Om dat probleem op te lossen, bestaan er andere methoden. Nu kunnen de gevolgen van een semantische fout zeer verschillend zijn: er kan een foute uitkomst optreden, of het programma kan blijven hangen. Als je een vermoeden hebt waar het programma een fout maakt, dan kun je daar een breakpoint zetten. Bij een breakpoint pauzeert het programma, zodat je kunt bekijken welke waarden de variabelen hebben. Je zet een breakpoint (en verwijdert het weer) met het breakpoint gereedschap. Een breakpoint is te herkennen aan de rode rand die om voorwerpen verschijnt, of de rode stip die op een touwtje staat. De insekticiden die LabVIEW levert, de debugging tools, zijn te vinden in de balk boven het diagram venster. Een afbeelding van deze knoppen vind je in figuur 1.14.
Als het programma in de pauzestand staat, dan kun je met de ‘Doe stap’ knoppen een stapje maken tot de volgende operatie om vervolgens te kijken of er al een fout is opgetreden. Als je ontdekt hebt waar de fout zit kun je de rest van het programma uitvoeren door de pauzestand uit te schakelen of het programma uitschakelen met de stopknop.
Figuur 1.14 Insekticide Pauzeer programma
Doe stap (ga verder in subVI) Voer rest VI uit
Highlight de uitvoer
Stop programma
bewaar uitvoer
Doe stap (stap over subVI)
Als je weet dat de fout niet in een subVI zit, dan kun je die subVI in één stap uitvoeren door de ‘stap over’ te gebruiken. Als je ook in een sub-VI wilt kijken, dan gebruik je de andere stap-knop. Er zijn nog een paar andere gereedschappen die je kunnen helpen bij het vinden van fouten. Met het “probe” gereedschap uit het Tools Palet kun je een probe plaatsen (een generic of een conditional): er verschijnt dan een venster die o.a. de waarde van een touwtje weergeeft. Het effect van dit insekticide zie je in figuur 1.15.
23
Introductie van LabVIEW
Figuur 1.15 Het probe gereedschap
Dit is slechts een zeer korte inleiding in het debuggen van een computer programma. In veel gevallen kan je hiermee uit de voeten. Voor grote programma’s kan het zijn dat je gebruik wilt maken van uitgebreidere technieken. Deze staan beschreven in appendix A.
Het rechthoekje met het nummer 3 erin geeft aan welke probe bij welke plaats hoort. Voor eenvoudige gegevens, zoals de getallen hier, is een probe minder handig dan de getallen met highlighting. Voor gegevens die we verderop nog tegenkomen is een probe echter veel handiger.
1.6 Een VI als subVI gebruiken Als je een VI als subVI wilt gebruiken, dan moet je aangeven hoe je icon eruit gaat zien en hoe de verschillende velden van het icon zijn verbonden met de controls en indicatoren op het front-panel. Een icon is een symbool waarmee het VI wordt weergegeven als het gebruikt wordt als subVI. Het icon dient in dat geval ook om de verschillende controls en indicatoren van het subVI te verbinden met elementen uit het aanroepende VI. Dit wordt ook de connector genoemd.
Video Creating SubVI’s Instructie Creating subVI laat zien hoe je van een VI een subVI kan maken.
24
Maak van je VI uit opdracht 1.2 een subVI of maak opdracht 1.3 en 1.4.
Opdracht 1.3 Het Icon Rechtsboven het front-panel zie je een standaard icon. Dit kun je aanpassen om je eigen VI herkenbaarder te maken. Zoals de optel-operatie een driehoek met een plusteken gebruikt, kun je voor het gemiddelde (2).vi ook een icon verzinnen. Dubbelklik op het icon, rechtsboven het front-panel. Het venster uit figuur 1.16 verschijnt.
Een VI als subVI gebruiken
Figuur 1.16 De Icon-editor
Met de gereedschappen links in het venster kun je vervolgens je fantasie de vrije loop laten. Hier volgen een paar opmerkingen: Zorg ervoor dat het plaatje herkenbaar is. Zorg ervoor dat het plaatje in kleur en zwart-wit op elkaar lijkt. Besteed niet te veel tijd aan dit onderdeel. Vaak is het al voldoende als je wat tekst in het icon zet. Veel succes!
Opdracht 1.4 De connector
boven. Je krijgt nu een popup menu te zien met drie actieve opties: VI Properties…, Edit Icon… en Show Connector. Met VI Setup kun je allerlei geavanceerde eigenschappen instellen van een VI. Omdat dat nu te ver voert, gaan we hier verder niet op in. Edit Icon heb je in opdracht 1.3 al gebruikt. Met Show Connector kun je de connector, de velden van het icon, instellen. Als je deze optie hebt gekozen, dan zie je een leeg connector icon, met default 12 velden. Meestal zal de connector die LabVIEW uitzoekt geschikt zijn, maar soms wil je een andere optie. De andere mogelijkheden kun je bekijken door opnieuw rechts-klikken op de connector. Een van de opties is nu een sub-menu Patterns. Uit dit menu kun je een geschikt patroon kiezen bijvoorbeeld een connector icon met drie velden. Houd er rekening mee dat je input terminals links wilt hebben, en output terminals rechts. Andere mogelijkheden om connectoren te veranderen, zie je in het centrale popup menu staan. Om nu de verbinding tot stand te brengen, moet je met het wiring gereedschap op één van de velden van de connector klikken.
We moeten de velden van het icon nog maken en de controls en indicators verbinden met deze velden. Dit levert een icon voor het VI met input- en output terminals. Klik met de rechter muisknop (voortaan kortweg aangeduid als rechts-klikken) op het icon op het front-panel rechts
25
Introductie van LabVIEW
Vervolgens verplaats je de muis naar de control of de indicator die je met dit veld wilt verbinden.
Klik op deze indicator: je verbinding is gelegd.
Doe dit met alle velden, zodat ze op een logische plaats belanden. Je connector heeft nu twee input terminals en één output terminal.
1.6.1 Finishing Touches
Klik in het File menu op het item VI Properties. Selecteer de categorie ‘Documentation’. Onder ’VI Description’ kun je een korte beschrijving van de VI geven. Deze beschrijving wordt weergegeven in het help venster, waar je ook ziet welke connecties je met dit VI kunt maken. Als je dit hebt ingevuld, dan ziet “de help voor gemiddelde (2).vi” er uit als in figuur 1.17, hoewel je tekst en je icon heel anders kunnen zijn.
Figuur 1.17 De complete help
Dit maakt het VI gemiddelde (2).vi geschikt om gebruikt te worden als subVI. Bewaar je VI en kies New VI uit het File menu. Plaats twee Numeric Controls en een Numeric Indicator op het frontpanel. Open het diagram van dit nieuwe VI. Uit het Functions-palet kies je Select a VI…..(onderaan de lijst van het FunctionsPalet) In het dialoogvenster dat nu verschijnt kies je gemiddelde (2).vi. Met de hulp die hierboven staat, moet je het geheel zeer snel kunnen aansluiten.
1.7 Tips & Tricks Elk hoofdstuk zullen we besluiten met het onderdeel Tips & Tricks. Hier staan
26
methoden om handelingen sneller of eenvoudiger uit te voeren.
Tips & Tricks
Figuur 1.18 Het Control popup menu Video Toolbars, buttons and menus Toolbar, buttons and menus is een kleine samenvatting van het voorgaande met enkele handige tips en tricks. (Tijdsduur 10 minuten).
Je kunt het functions palet of het controls palet tevoorschijn halen door rechts-klikken in het diagram- resp. front-panel venster. Rechts-klikken is een belangrijke bezigheid. Je kunt door rechts-klikken op een control of een indicator een popup-menu tevoorschijn halen. Met dit menu kun je allerlei zaken instellen van labels, commentaar, etc. In figuur 1.18 tref je een afbeelding van een dergelijk menu aan. Deze popup menu’s tref je aan op alle
LabVIEW objecten: VI’s, terminals, touwtjes, controls en indicatoren
27
Introductie van LabVIEW
28
Programmeren in G
In de introductie van LabVIEW heb je geleerd wat een front panel is en hoe je een eenvoudig front panel kunt maken. Je hebt ook geleerd hoe je een diagram moet maken zodat het front panel ook nog iets doet. Het laatste onderdeel dat je hebt gemaakt is het icon en de connector. Hiermee is het VI dat je hebt geschreven bruikbaar als subVI. Als afsluiter van het hoofdstuk zag je in de instructie hoe je door rechts-klikken gemakkelijk bepaalde opties kunt bereiken. In dit hoofdstuk gaan we verder in op het programmeren in LabVIEW. Je zult wer-
2
ken met programmastructuren, zoals de while- en de for-loop, en je zult leren wat arrays zijn. Tot slot volgen nog de case en de sequence structuur. Dit hoofdstuk bevat het grootste deel van de programmeertaal G. Bij verschillende opdrachten is het handig om de resultaten van een berekening in een grafiek weer te geven. Omdat het maken van een grafiek iets is dat we in het volgende hoofdstuk pas behandelen, gebruiken we hier een VI dat wij speciaal voor dit doel hebben gemaakt. Je hoeft alleen je gegevens erin te stoppen, die vervolgens automatisch in een grafiek worden weergegeven.
29
Programmeren in G
2.1 De While- en For-structuur Er zijn twee verschillende herhaalstructuren in LabVIEW: de while-loop en de forloop.
Figuur 2.2 De while-loop plaatsen
2.1.1 De while-loop
Een while-loop is een constructie die steeds opnieuw een serie opdrachten uitvoert totdat je het programma wilt laten stoppen door op een stopknop te drukken of wanneer aan een bepaalde voorwaarde is voldaan.
Video while-loops While loops instructie laat duidelijk zien hoe je een while-loop toepast in je LabVIEW programma (Tijdsduur 3 minuten). Klik
In figuur 2.1 tref je een begeleidende afbeelding aan van een while-loop.
Figuur 2.1 Een while-loop
Iteratie Terminal
Het
Conditie Terminal
symbool voor de while-loop bevindt zich onder de structures in het function palet, zie figuur 2.2.
30
op het while-loop symbool. Je muis-cursor verandert in een miniatuur versie van het symbool van de whileloop. Plaats de while-loop in het diagram. Je kunt nu het gebied van de while-loop afbakenen door aan één van de hoekpunten of zijden te trekken. Het resulterende plaatje zie je in figuur 2.1. De while-loop wordt uitgevoerd totdat de conditie-terminal TRUE krijgt aangeleverd. Deze conditie terminal is een voorbeeld van een boolse variabele. In paragraaf 2.3 behandelen we dit type gegevens. In het Comparison sub-palet vind je vergelijkingen, zoals x > y . De iteratie-terminal geeft aan hoe vaak de while-loop al is uitgevoerd
De While- en For-structuur
Figuur 2.3 Een for-loop in G De
opdrachten in de while-loop worden eerst uitgevoerd, pas daarna wordt getest of de volgende herhaling moet worden gestart. Als je een getal uitvoert uit een whileloop, dan wordt er geen array gemaakt. De waarde bij de laatste iteratie wordt doorgegeven. Als je een array invoert in een whileloop, gebruik je standaard binnen de while-loop ook het gehele array.
2.1.2 De for-loop
Een for-loop is een structuur die een serie opdrachten een vast aantal keren uitvoert. Hierbij wordt een teller bijgehouden die aangeeft hoe vaak de opdracht is uitgevoerd. Alle programmeertalen kunnen een dergelijke opdracht uitvoeren, zo ook G.
Aantal Herhalingen
Teller, begint bij 0
Alle opdrachten die in het kader worden geplaatst, worden herhaald. Het aantal keren dat de opdracht moet worden herhaald, koppel je aan de N. Tijdens de uitvoer van het programma, kun je de teller gebruiken om te weten hoe vaak de for-loop al is uitgevoerd. Let erop dat deze teller bij nul begint en tot N – 1 doorloopt. De acties die je binnen de for-loop uitvoert, moeten getallen gevoerd krijgen. Je kunt getallen en andere gegevenstouwtjes (wires) met de rand van de forloop verbinden om die getallen in te voeren.
Video For-loops
Open Simpel For Loop.vi in folder hoofstuk2/voorbeelden/. Figuur 2.4 laat het diagram van deze VI zien.
For loops instructie toont het gebruik van for-loops en de verschillen tussen Whileen For-loops (Tijdsduur 4 minuten).
Figuur 2.4 Een for-loop met een actie
Je vindt het symbool voor de for-loopnaast de while-loop onder de structures in het functions palet, zie figuur 2.2. Het plaatsen gaat op een manier die vergelijkbaar is met het plaatsen van een while-loop. Het resulterende plaatje zie je in figuur 2.3.
31
Programmeren in G
Je ziet dat het aantal stappen wordt doorgevoerd in de N, en dat twee getallen, offset en stepsize worden doorgegeven aan de for-loop. Bij de uitvoer worden de getallen in een lijst geplaatst. De getallen in de lijst zijn dus: X [ i ] = Offset + i ⋅ Stepsize
(2.1)
Ieder getal dat in de for-loop is uitgerekend staat in deze lijst, en kan worden gevonden met de index-getallen i = 0…N – 1 . Merk op dat dit precies de getallen zijn die i heeft tijdens het uitvoeren van een for-loop. Een dergelijke lijst wordt een array genoemd. Je ziet dat het touwtje van een array dikker is dan het touwtje van een enkel getal: er gaan ook meer getallen doorheen. De terminals van een array hebben rechte haken rond de inhoud: [dbl].
X
TRA
Extra Arrays
Je hoeft hier nog niet alles met arrays te kunnen doen, dat is voor een latere paragraaf. Onthoud echter dat als je een getal uit een for-loop uitvoert, je automatisch een array krijgt. Wat ook opvalt is dat er meerdere typen gegevens bestaan, elk met een eigen kleur en naam1. De getallen die je tot nu toe hebt gebruikt zijn van het type Floating Point: geschikt om met niet-gehele getallen te werken. Nu is het veertienen-een-half maal uitvoeren van een forloop onzinnig, en kunnen we beter een ander type gebruiken: een geheel getal.
Door rechts-klikken op het control dat het aantal herhalingen aangeeft, kun je het Representation sub-menu bereiken. In het representation menu kun je kiezen welk type je het betreffende control wilt laten zijn, zie figuur 2.5.
Figuur 2.5 Het type van getallen
Kies nu voor het type I32 (Signed Integer), omdat dat het type is dat LabVIEW verwacht aan het aantal iteraties van een for-loop. In de instructie for-loop spraken we over verschillende typen gegevens. Een overzicht van de types die LabVIEW kent vind je in appendix B.
Voorbeeld Een For-loop In dit voorbeeld maken we een grafiek van een sinus. We doen dit over één periode. Op het front panel bevindt zich één control: het aantal punten waarin we de sinus 1. Zie ‘Simpel For Loop.vi’.
32
De While- en For-structuur
uitrekenen. Figuur 2.6 laat alleen het diagram zien.
Figuur 2.6 Een grafiek van een sinus
De volgende zaken worden berekend: Buiten de for-loop wordt de Δx bepaald. Dit is uiteraard 2π gedeeld door het aantal punten. Zoals de meeste programmeertalen, verwacht ook LabVIEW radialen als argument voor zijn goniometrische functies. Vervolgens wordt met behulp van i de huidige x-waarde berekend. Met de sinus functie wordt sin x berekend. Zowel het array met de x -waarden als het array met de waarden van sin x worden uit de for-loop geleid en in het grafieken VI gestopt. Dit laatste VI heeft de naam Display Results.vi. Je kunt onze versie van dit VI vinden in Voorbeeld For-loop.vi.
2.1.3 Samenvatting van de for-loop
Met een for-loop kun je het volgende: Een reeks opdrachten een van tevoren bepaald aantal malen uitvoeren. De uitkomsten van de berekeningen in een getallen-reeks, een array, plaatsen.
2.1.4 Herhaalstructuren: auto-indexing
Je bent het gebruik van auto-indexing al tegen gekomen: als je een enkel getal uit een for-loop leidt, dan worden de resultaten opgeslagen in een array. Bij een whileloop is deze optie uitgezet: daar wordt de laatste uitkomst doorgegeven. Het is ook mogelijk om bij een for-loop de auto-indexing uit te schakelen. De doorgang van een getal wordt aangegeven met een gevuld blokje. Door rechts-klikken op dit blokje, kun je Disable Indexing uit het popup menu kiezen. Als je deze optie in hebt gesteld, wordt uitsluitend het laatste getal doorgegeven. Bij een while-loop kan je de auto-indexing aanzetten door uit hetzelfde menu Enable Indexing te kiezen. Deze opties staan op dezelfde plaats en veranderen al naar gelang de huidige instelling2. Bij het invoeren van een array in een forloop, werkt de auto-indexing precies andersom: het array wordt opgesplitst in de losse elementen. Als je van deze mogelijkheid gebruik maakt, is het niet noodzakelijk om het aantal herhalingen op te geven. De lengte van het array bepaalt het aantal herhalingen. Uiteraard kun je de auto-indexing hier op precies dezelfde manier uitschakelen als bij het uitvoeren vanuit een for-loop. Je hebt binnen de forloop dan de beschikking over het gehele array. Bij een while-loop staat auto-indexing standaard uit, ook bij het invoeren van een array. Als je de auto-indexing bij een whileloop aanzet, dan moet je er zelf voor zorgen dat de while-loop niet te vaak wordt uitgevoerd: als het array ‘op’ is, dan worden uitsluitend nullen doorgegeven, maar de while-loop blijft doorlopen. 2. Let op: als er Enable Indexing staat, dan is de auto-indexing op dit moment nog uitgeschakeld!
33
Programmeren in G
2.1.5 Herhaalstructuren: shift registers
Shift registers zijn beschikbaar op de foren op de while-loop. We noemen echter alleen de for-loop, om het geheel overzichtelijker te houden. Getallen die je aan een for-loop toevoert, blijven gedurende alle iteraties hetzelfde. Soms wil je echter de uitkomst van een berekening in iteratie i doorgeven aan stap i + 1 . In LabVIEW doe je dit door gebruik te maken van het shift-register. Een shift-register bewaart aan het einde van een iteratie de uitkomst van een berekening, om die aan het begin van de volgende iteratie weer te gebruiken. Een shift-register kan worden gemaakt door rechts-klikken op de rand van de forloop. Het popup-menu uit figuur 2.7 verschijnt.
Figuur 2.7 Een shift-register toevoegen
Voorbeeld Shift-registers Het diagram uit figuur 2.8 berekent de som van de elementen van het ingevoerde array. We maken hier gebruik van autoindexing.
Figuur 2.8 De som van een array
We beginnen uiteraard met de waarde nul in het shift-register. Vervolgens tellen we steeds één element op bij de som die tot dan toe is berekend. Je kunt een versie van dit VI vinden in Voorbeeld Shift Register.vi. Er volgen nu nog een paar opdrachten (2.3 en 2.4) om vertrouwd te geraken met het gebruik for- en while-loop in verschillende situaties.
Door nu Add Shift Register te kiezen, wordt er een shift-register gemaakt. De waarde die het shift register moet hebben bij de eerste keer dat de for-loop wordt uitgevoerd, koppel je links aan het register. We behandelen een eenvoudig voorbeeld: het berekenen van de som van de getallen in een array.
Opdracht 2.1 faculteit Schrijf een VI dat n ! berekent. Als geheugensteuntje: n! = 1 ⋅ 2 ⋅ 3 ⋅ … ⋅ n
34
(2.2)
Arrays
Als bijzonder geval geldt dat 0! = 1
Voor het oplossen van deze opdracht, moet je gebruik maken van een for-loop en een shift-register.
2.2 Arrays In de vorige paragraaf ben je een aantal keren het begrip array tegengekomen. We gaan nu wat dieper in op het begrip ‘array’. Een lijst met getallen wordt meestal een array genoemd. Deze lijsten met getallen zijn essentieel voor de opslag van een grotere hoeveelheid meetresultaten in een programma. 2.2.1 Een array op het front-panel
Je zult een array liever niet met de hand willen vullen. Toch worden arrays vaak op een front-panel geplaatst. Dat is nodig als het VI gebruikt wordt als een subVI, en een array als invoer of uitvoer heeft.
Video Arrays In instructie Arrays wordt het begrip array duidelijk uitgelegd (14 minuten). Een array maak je met het Array Control item uit het Array & Cluster sub-palet in het Controls palet. Er verschijnt nu een leeg array zonder type. Het is immers mogelijk om arrays van boolse variabelen, arrays van getallen of arrays van andere typen te maken.
Om te bepalen wat voor een array het array moet zijn, plaats je een control van het gewenste type in het lege array. In figuur 2.9 zie je de hele volgorde van de acties.
Figuur 2.9 Een leeg array Leeg Array zonder type Toevoegen van een type
Leeg Array met type
Als je een control in een leeg array plaatst, dan wordt het array zelf een control, dus een invoer. Als je echter een indicator in het array plaatst, dan wordt het array ook een indicator, een uitvoer dus. Door rechts-klikken zijn ook hier weer verschillende popup-menu’s te bereiken. Een andere vorm van arrays op het front-panel zijn grafieken. Meer informatie over grafieken staat in het volgende hoofdstuk. 2.2.2 Programmatische arrays
Naast het maken van arrays op het front-panel, is het ook mogelijk om arrays te maken in je programma.
35
Programmeren in G
Eén van die mogelijkheden ben je al tegengekomen: auto-indexing bij een for- of while-loop. Met de array tools uit figuur 2.10 kun je in een programma arrays maken. Je vindt deze gereedschappen op het Arrays sub-palet op het Functions palet.
Zoals altijd biedt de help uitkomst bij het vinden van de juiste connecties. De array gereedschappen kunnen ook arrays doorzoeken om een bepaalde waarde te vinden, de volgorde van elementen in een array te veranderen, een array te sorteren en nog vele andere opties.
Figuur 2.10 De array functies
Waarschuwing Indices De index van een array in LabVIEW begint te tellen bij nul. Het eerste element heeft dus index nul, het tweede element heeft index één, etcetera. Het laatste element in een array heeft als index het aantal elementen minus één. Bij een array van 10 elementen, horen dus de indices 0 tot en met 9.
Voorbeeld Doorzoeken van een array Met initialize array kun je een nieuw array van een gewenste lengte maken, en alle getallen een vaste waarde geven. Met de andere functies kun je onder andere het aantal elementen in een array opvragen, specifieke elementen uit het array opvragen, de waarde van elementen vervangen door een nieuwe waarde, de grootte van het array veranderen, elementen en arrays samenvoegen tot een nieuw array.
36
Bij een experiment waar we een bak zand verwarmen, willen we, na afloop, bepalen op welk tijdstip een bepaalde temperatuur bereikt werd. Omdat we weten wat het interval tussen de metingen is geweest, hoeven we alleen te zoeken naar de plaats in het array waar deze waarde wordt overschreden. We zouden zo’n VI zelf kunnen schrijven, maar er is een array functie die dit precies voor je uitzoekt. Met de functie Threshold 1D Array, kun je de geinterpoleerde index van de eerste doorgang bepalen. In figuur
Korte Cursus Logica
2.11 zie je het stukje code die de berekening voor je uitvoert.
Figuur 2.11 Temperatuur overschreden
ten gebruiken. Veel van deze technieken zullen overigens al in een LabVIEW functie te vinden zijn. 2.2.3 Polymorfie
We kunnen deze functie gebruiken, omdat we weten dat de temperatuur uitsluitend stijgt. Als we alle doorgangen van een bepaalde waarde in een array willen vinden, dan zullen we andere technieken moe-
Polymorfie, letterlijk veelvormigheid, houdt in dat operaties meerdere gegevenstypen kunnen verwerken. Een voorbeeld hiervan is dat je met één actie een constante bij elk element van een array kunt optellen, of twee arrays paarsgewijs kunt optellen. Figuur 2.12 laat zien wat enkele van de verschillende mogelijkheden zijn.
Figuur 2.12 Polymorfie Scalar Scalar Scalar Array
Scalar
Array
Array Array Array Array Array Array
Het laatste voorbeeld laat zien wat er gebeurt als je twee arrays van ongelijke lengte probeert op te tellen.
Het aantal punten in het resultaat is gelijk aan het aantal punten in het kortste array.
2.3 Korte Cursus Logica Bij een while-loop kreeg je te maken met een nieuw type variabele: de logische- of boolse variabele. Het touwtje dat je aan de conditie terminal koppelt, is een logische
variabele. Het correct werken met dit type vergt enige voorkennis. Het is eenvoudig om de uitvoering van een while-loop te stoppen als er slechts aan één voorwaarde voldaan moet zijn.
37
Programmeren in G
Als je een experiment met een verwarmingselement wilt stoppen als een bepaalde temperatuur wordt overschreden, dan kun je de test uit figuur 2.13 inbouwen:
Figuur 2.14 De boolse operatoren
Figuur 2.13 Stop bij hoge temperatuur
De vergelijkende operatoren vind je op het functions palet achter het comparisons sub-palet dat hiernaast weergegeven is. Moet er aan meer dan één voorwaarde voldaan worden, dan moeten logische variabelen gecombineerd worden. Hiervoor gebruik je boolse operatoren. Om de boolse operatoren te kunnen gebruiken, moet je een waarheidstabel kunnen lezen. In de context help (Ctrl+H) van LabVIEW is voor alle Boolse operatoren een beschrijving te vinden. Aan de hand van deze beschrijvingen kunnen we een waarheidstabel opstellen.
Voor de AND operatie geldt dus dat deze waar is als beide argumenten waar zijn. In alle andere gevallen is het resultaat niet waar. Er volgen nu enkele afsluitende opdrachten om te leren werken met logische variabelen en met de while-loop.
Tabel 2.1 Waarheidstabel AND Argument α
Argument β
α∧β
False False True True
False True False True
False False False True
We bespreken nu slechts één voorbeeld: de AND operator, linksboven in figuur 2.14.
38
Opdracht 2.2 Waarheidstabel In tabel 2.1 staat een waarheidstabel van een AND operatie. Maak zelf, op papier, de waarheidstabel van de OR operatie. Deze operatie (in het nederlands: de OF operatie) is waar als tenminste één van de argumenten waar is.
Beslissingen
2.4 Beslissingen Je hebt al kennis gemaakt met eenvoudige beslissingen: moet de while-loop nog een keer worden uitgevoerd of niet. Je kunt ook besluiten om bepaalde code over te slaan. Dit gebeurt met een Case structuur. Deze vind je ook onder structures op het functionspalet. Deze structuur heeft verschillende onderdelen. Afhankelijk van de waarde van een verbinding aan de rand van deze structuur, wordt één van de cases uitgevoerd.
Video Case structure Case structure laat aan de hand van een voorbeeld zien hoe je een Case structuur kan gebruiken in je programma. Figuur 2.15 geeft een overzicht van de onderdelen van een case structuur.
Op je diagram zie je echter maar één, omdat beide cases precies over elkaar geplaatst zijn. Met de pijltjes in het label kun je van de één naar de ander schakelen.
Voorbeeld Een Case-structuur Van twee getallen willen we de logaritmen optellen. Dit is uiteraard alleen mogelijk als beide getallen positief zijn. Als beide getallen positief zijn, dan berekenen we de logaritmen, en tellen ze op. Als één van de getallen negatief is, dan doen we niets. Figuren 2.16 en 2.17 laten het diagram zien dat dit kan uitvoeren.
Figuur 2.16 Simple Case: True
Figuur 2.15 De Case structuur Label
Conditie-terminal
Figuur 2.17 Simple Case: False
De waarde die je aan de conditie terminal koppelt, bepaalt welk van de cases (True of False) wordt uitgevoerd. In figuur 2.15 zie je twee conditieterminals.
39
Programmeren in G
Dit voorbeeld kun je vinden onder de naam Voorbeeld Case 1.vi. Wat er gebeurt met de indicator ln(X) + ln(Y) als X of Y negatief is, is onduidelijk; daarover in de volgende paragraaf meer.
nu buiten het case-statement plaatsen. Het resultaat kun je zien in figuren 2.18 en 2.19.
Figuur 2.18 Case met uitvoer – True
2.4.1 Resultaten van een casestructuur
Getallen kunnen op eenvoudige wijze in een case-statement worden ingevoerd. Dit werkt hetzelfde als bij een for- of while-loop. Bij het uitvoeren van getallen uit een case-structuur, gelden echter een paar bijzondere regels. Bij een case-structuur wordt slechts één van de cases uitgevoerd. De opdrachten die buiten de case-structuur staan, moeten echter ook worden uitgevoerd, onafhankelijk van welke case is uitgevoerd. Dit betekent dat als je een getal wilt uitvoeren, je dat in iedere case moet doen. Het kan zijn dat je slechts in één case een zinnig getal uitvoert, maar dan moet je in de andere case ook een getal uitvoeren, in dat geval dus onzinnig! In LabVIEW 7 is het nu mogelijk voor de uitvoer “Use default if unwired” te kiezen.
Figuur 2.19 Case met Uitvoer – False
Voorbeeld Een Case-structuur
Dit voorbeeld is te vinden onder de naam Voorbeeld Case 2.vi.
2 We gaan verder met het eerder behandelde voorbeeld. We willen de indicator
40
Je ziet dat er in het geval dat X of Y negatief zijn, toch een waarde wordt gegenereerd. Mathematisch is dit niet correct, het getal bestaat niet en er wordt ‘NaN’ (not a number) gegenereerd. Als we vergeten om het tweede getal door te geven, dan krijgen we de foutmelding: “Select Tunnel: missing assignment to tunnel” en komt er een open blokje op de rand te staan. In LabVIEW 7 is dit probleem ook op te lossen met de optie “Use default if unwired”.
Beslissingen
Opdracht 2.3 Een zaak vol willekeur
Schrijf een VI dat een piep laat horen als een willekeurig getal groter is dan een bepaalde grenswaarde. Je kunt hiervoor de volgende hulpmiddelen gebruiken: Het VI met de naam Beep PC.vi. Dit VI geeft een piep met een duur van 0,05 seconde op een frequentie van 1,5 kHz. Je kunt Beep PC.vi het vinden in de folder ‘LabVIEW Module Files’/ Hoofdstuk 2/Hulp VI's. Een willekeurig getal kun je maken met Random Number (0-1), dat je kunt vinden op het numeric functions palet. Omdat er enige tijd tussen de piepjes moet zitten, willen we dat de while-loop met een bepaalde regelmaat wordt uitgevoerd. Dit kan bereikt worden met Wait (ms). Je vindt deze functie in het Time & Dialog sub-palet. De waarde die dit VI wil ontvangen is de wachttijd in milliseconden. Gebruik een wachttijd van ongeveer 0,50 seconden. Veel succes!
herhaalstructuur (paragraaf 2.1.1), shift registers (paragraaf 2.1.5) en case-structuur, dit kunt realiseren. Als de boolse variabele ‘voeg element toe’ true wordt een random number als element toegevoegd aan Array. Je kunt dit voorbeeld bestuderen in ‘Array bewerkingnen.vi’ in de LabVIEW module files folder.
Figuur 2.20 Array bewerkingen
2.4.2 Eenvoudige selectie
Soms is de beslissing die je neemt zeer eenvoudig, zoals je in figuur 2.21 kunt zien.
Figuur 2.21 Eenvoudige beslissing (1)
Voorbeeld Een Case-structuur 3 Met een case-structuur kan je ook eenvoudig gecontroleerd elementen toevoegen aan een array van elementen. In figuur 2.20 zie je hoe je, m.b.v. de eerder behandelde
Bij deze eenvoudige beslissingen, kan het voordelig zijn om een andere structuur te
41
Programmeren in G
kiezen, die overzichtelijker methode zie je in figuur 2.22.
is.
Deze
Figuur 2.22 Eenvoudige beslissing (2)
De select functie vind je op het comparison sub-palet. Afhankelijk van de boolean aan het vraagteken, wordt het getal aan de T of de F doorgegeven aan de uitgang.
Voorbeeld Meer Cases Meerdere velden zijn handig bij het verwerken van veel knoppen op een frontpanel. Je plaatst de waarden van alle knoppen in een array, zoekt met de search 1D array functie welke knop TRUE is, en voert het bijbehorende veld uit. In figuur 2.23 zie je een voorbeeld van deze methode. De structuur die hier gebruikt wordt, wordt ook wel een which button structuur genoemd.
Figuur 2.23 Which Button?
2.4.3 Meer cases…
In plaats van een boolse variabele kun je ook een geheel getal aan een case-structuur koppelen. In plaats van twee mogelijke cases, True en False, zijn er dan veel meer cases. Afhankelijk van de waarde die je aan de conditie terminal koppelt, wordt een veld uitgevoerd.
Uiteraard wordt deze methode pas echt handig als er in elk van de cases veel acties moeten worden uitgevoerd. Je kunt dit voorbeeld bekijken in Which Button.vi in de LabVIEW module files folder.
2.5 De volgorde van acties Bij het uitvoeren van een meting is de volgorde van de acties vaak zeer belangrijk. Vaak zal je eerst een stimulus willen geven om vervolgens een respons te meten. Als we echter naar de twee diagrammen uit figuur 2.24 kijken, dan zien we dat het niet duidelijk is wanneer de stimulus en wanneer de respons wordt uitgevoerd.
42
Figuur 2.24 Respons-Stimulus?
De volgorde van acties
Omdat er geen verbinding bestaat tussen beide VI’s, kan LabVIEW voor beide volgorden kiezen, ongeacht de plaats van de VI’s in het diagram. Een oplossing is om een kunstmatige verbinding aan te brengen tussen de stimulus en de respons, waardoor de meting van de respons moet wachten op het geven van de stimulus. Helaas is het niet altijd mogelijk om een dergelijke verbinding aan te brengen. Als je een bepaalde tijd wilt wachten tussen het toedienen van de stimulus en het meten van de respons, dan heb je een probleem.
Een stacked sequence ziet eruit als een plaatje uit een video. Door te rechtsklikken op de rand van het frame, kun je frames toevoegen, die net als bij een case-structuur achter het voorste frame worden geplaatst. Je kunt het stimulus-respons probleem nu op twee manieren oplossen: 1.Maak een stacked sequence met drie frames: stimulus, wachttijd en responsmeting. Deze methode staat afgebeeld in figuur 2.26.
Figuur 2.26 Oplossing 1
2.5.1 De Sequence
Dit probleem leidt tot de introductie van de sequence. Ook deze vind je onder structures op het function palet.
Video Sequence Instructie Sequence geeft je een introductie hoe je sequence stucturen kunt gebruiken. (10 minuten)
2.Maak een flat sequence met drie frames: stimulus, wachttijd en responsmetingen. Deze methode staat afgebeeld in figuur 2.27.
Figuur 2.27 Oplossing 2
Een voorbeeld van een zogeheten stacked (gestapelde) sequence zie je in figuur 2.25.
Figuur 2.25 Een stacked sequence
Omdat bij de tweede methode geen verborgen frames aanwezig zijn is deze methode overzichtelijker en verdient daarom de voorkeur. (Tenzij de flat sequence te lang wordt.)
43
Programmeren in G
Opdracht 2.4 Geluidsmeting In deze opdracht komen alle elementen terug die je eerder in dit hoofdstuk hebt leren kennen. Schrijf een programma dat het volgende voor je uitvoert: Het programma meet de geluidssterkte; als deze groter was dan een in te stellen drempelwaarde, dient deze waarde, en de tijd waarop deze plaatsvond, elk in een afzonderlijk array opgeslagen te worden. Het programma moet ook tussentijds gestopt kunnen worden met een stopknop. Als het programma gestopt is, dan laat je de meetwaarden die de drempel overschreden en hun tijdstip in een grafiek zien. Op het frontpanel is te zien wat de laatst gemeten geluidssterkte is. Kies hiervoor een mooie indicator, bijvoorbeeld de Meter van het digital controls palet. Uiteraard gooien we je niet geheel in het diepe. Je kunt gebruik maken van de volgende hulpmiddelen: Met het VI Geluidssterktemeter.vi (in folder LabVIEW Module Files/Hoofdstuk 2/
2.6 Tips & Tricks We geven hier een overzicht van de verschillende on-line helpsystemen die LabVIEW te bieden heeft.
44
Hulp VI's Hoofdstuk 2) kun je de geluidssterkte bepalen. Je hebt ook een microfoon nodig. Deze VI geeft een relatieve geluidssterkte. De maximale waarde van deze sterkte is 1. Het tijdstip dat je opslaat in het tijden array, is het aantal seconden na 1 januari 1904, 12 uur ’s middags, universal time. Dit is een verschrikkelijk vreemde manier om tijden op te slaan, maar het is nu eenmaal de manier die de computer gebruikt. Gelukkig hoef je zelf niet uit te rekenen wat de huidige waarde is, er is een VI dat dit voor je doet. Je vindt het onder het Time & Dialog palet, onder de naam Get Date/Time in Seconds. De uitvoer van deze VI geconverteerd naar dbl (double) geeft de tijd in seconden. (zie bovenstaand figuur). Om de meting van het geluidsniveau iedere seconde te laten plaatsvinden kun je gebruikmaken van de metronoom, Wait Until Next ms Multiple. Voor de grafiek gebruik je Geluidsgrafiek.vi.
Veel succes!
Tips & Tricks
Als je een wiring tool op een draad plaatst geeft dit informatie over de data type van de draad.
Video Context Help 2.6.2 On-line reference
Context Help instructie laat alles zien van de verschillende on-line helpsystemen in LabVIEW.
2.6.1 Context Help
Met de toets-combinatie Ctrl+H kan je het helpwindow tevoorschijn halen. Hierin wordt beschreven wat elk van de objecten doet of voorstelt. Deze help is kort en bondig. Als je de cursor op het VI-icon rechtsboven in het front panel van een VI plaatst verschijnt, indien beschikbaar een korte beschrijving van het VI in het helpwindow. Met VI Properties uit het File menu kun je informatie toevoegen aan je eigen VI’s. Dit is aanbevelenswaardig: deze korte beschrijvingen maken het eenvoudiger om VI’s te vinden die doen wat je wilt.
Functies en VI’s uit de LabVIEW library hebben een beschrijving in het programma LabVIEW Help. Je kunt deze help openen door rechtsklikken op het betreffende VI of de functie en Help te kiezen uit het popup menu. De hulp die je op deze manier krijgt, is een beknopte versie van de beschrijvingen in de officiële LabVIEW handleidingen. Bovendien hoef je niet te zoeken naar een bepaald VI. 2.6.3 De officiële handleidingen
De boeken die National Instruments levert bij het LabVIEW pakket zijn een volledige beschrijving van de mogelijkheden van LabVIEW. We hebben een aantal sets handleidingen, maar ze zijn ook elektronisch beschikbaar. Je vindt ze onder Search the LabVIEW bookshelf... uit het Help menu.
45
Programmeren in G
46
Verder in G
In het vorige hoofdstuk heb je de basisonderdelen van de programmeertaal G leren kennen. Je kunt nu werken met de while-loop, de for-loop, case statements en sequences. Je weet wanneer je shift-registers moet gebruiken en je hebt met boolse variabelen gewerkt. Er is echter nog een groot aantal eigenschappen van LabVIEW die we niet behandeld hebben. We zullen ze ook niet allemaal kunnen behandelen: De meer volledige behandeling van de mogelijkheden van LabVIEW heeft al vele boeken gevuld.
3
In dit hoofdstuk vind je de volgende onderwerpen: Clusters, wat zijn het en hoe gebruik je ze? Grafieken, in allerlei soorten en maten. Het werken met strings. Een kort overzicht van het werken met files. Lokale variabelen en property nodes. VI opties en VI libraries.
47
Verder in G
3.1 Clusters Een cluster is een groep gegevens. Zoals een telefoondraad 4 elektrische geleiders bevat, zo kan een cluster meerdere LabVIEW touwtjes samenbinden en weer loshalen. Waarom zou je meerdere touwtjes willen samenbinden tot één touwtje? Daarvoor zijn verschillende redenen te verzinnen: Gerelateerde gegevens worden gezamenlijk verzonden. Denk hierbij aan coördinaten, foutmeldingen met de plaats waar de fout optrad of een beschrijving van de meetgegevens tezamen met de meetgegevens zelf. Het aantal connectoren op een icon is beperkt: Er mogen maximaal 20 controls en indicatoren verbonden zijn met een icon. Als je meer verbindingen nodig hebt, dan zul je moeten combineren. Als je meer gegevens in één terminal wilt laten verdwijnen, zijn clusters de aangewezen methode: Grafieken zijn hier een voorbeeld van.
Voorbeeld Een Cluster Je kunt clusters op het front panel maken op een manier die vergelijkbaar is met het maken van een array. Je plaatst eerst een leeg cluster, uit het Array & Cluster palet, op het front-panel. Vervolgens zet je de elementen die je in het cluster wilt hebben in het vakje. Figuur 3.1 laat zien hoe dit in z’n werk gaat.
48
Figuur 3.1 Cluster op het Front-panel Een leeg cluster
Eén element Twee elementen, etc.
Je kunt elk van de elementen in je cluster een eigen naam geven. Dat dit een handige eigenschap is, zien we als we een cluster weer uiteenrafelen.
Voorbeeld Het Ontrafelen Om de elementen van een cluster te gebruiken, moet je het cluster uiteenrafelen. Hiervoor zijn twee methoden beschikbaar: Op volgorde of op naam van het element. De volgorde van de elementen in een cluster wordt bepaald door de volgorde waarin je ze in het cluster plaatst. We hebben het cluster uit het vorige voorbeeld uitgebreid met nog een derde element: C. In figuur 3.2 zie je hoe het ontrafelen – unbundle – op volgorde werkt.
Figuur 3.2 Unbundle
Clusters
Het is hier lastig te zien welk van de elementen op welke plaats is beland. Omdat we weten dat we eerst A, vervolgens B en tenslotte C hebben geplaatst, weten we dat we van boven naar beneden A, B en C aantreffen. Bij het unbundelen van een cluster op deze manier, moet het aantal elementen dat wordt opgevraagd ook altijd even groot zijn als het aantal elementen in het cluster. De tweede manier is interessanter: In figuur 3.3 zie je een afbeelding van deze methode.
Figuur 3.3 Unbundle By Name
Figuur 3.4 Bundle
De werking is eenvoudig: De elementen die je in het cluster wilt plaatsen, zet je van boven naar beneden in het bundle blokje. Het bundelen op naam is iets ingewikkelder, en eigenlijk alleen geschikt voor het veranderen van de waarde van een element in een bestaand cluster. In figuur 3.5 zie je hoe het veranderen van de waarde van element A in een cluster werkt.
Figuur 3.5 Bundle By Name Hier is duidelijk te zien welk element op welke plaats is beland. Je hoeft hier ook niet alle elementen uit te pakken, alleen de elementen die je nodig hebt. Als je voor duidelijke namen gekozen hebt, dan is deze manier erg geschikt voor het uitpakken van een cluster. Door rechts-klikken op het unbundle of unbundle by name blokje, kun je elementen toevoegen en selecteren welk element uit de betreffende uitgang moet komen.
Voorbeeld Bundelen Uiteraard kunnen we ook clusters maken in het diagram. Net als bij het ontrafelen zijn hier twee manieren beschikbaar: Op volgorde en op naam. In figuur 3.4 zie je het samenvoegen van twee elementen “op volgorde”.
Omdat de Bundle By Name functie moet weten welke elementen zich in het cluster bevinden, moet je in het midden een bestaand cluster invoegen waarvan je één of meer elementen wilt vervangen. Nu je in verschillende voorbeelden hebt gezien hoe je met clusters kunt werken, wordt het tijd om zelf een cluster te maken.
Opdracht 3.1 Clusters Maak een VI met drie controls en drie indicatoren. Bundel de controls in een cluster, en unbundel het cluster weer om de gegevens in de indicatoren te plaatsen.
49
Verder in G
Maak ook een cluster met 4 elementen (van willekeurige types), unbundel dit cluster en plaats de resultaten in 4 indicatoren.
Figuur 3.6 Het Error Cluster
3.1.1 Het error cluster
Een cluster dat je vaak zult tegenkomen is het error cluster. In dit cluster wordt aangegeven òf er een fout is opgetreden, en zo ja, waar en welke fout. In figuur 3.6 zie je een afbeelding van het error cluster staan. Het error cluster bevat de volgende onderdelen: Status. Dit is een boolse variabele. Als er geen fout is opgetreden, dan heeft status de waarde FALSE. Code. Dit getal geeft aan welke fout is opgetreden. Door te rechtsklikken op de rand van het cluster, of een van de elementen, kun je Explain Error kiezen. Dit geeft een iets helderder beschrijving van de fout. Source. Dit is een string (tekst zie verderop) die beschrijft waar de fout is opgetreden. Hiermee kun je de plaats van de fout opzoeken om het programma te veranderen en daarmee te voorkomen dat de fout opnieuw optreedt.
Het wordt aangeraden om in alle VI’s die je schrijft een error in en een error out op te nemen. Voordat je een actie uitvoert, controleer je of er al een fout is opgetreden. Is dat het geval, dan doe je niets en geef je de fout door. Als alles in orde is, dan ga je verder en voer je je code uit, door deze code in het No Error veld van een case-statement te plaatsen. In figuur 3.7 zie je hoe dit werkt.
Figuur 3.7 Error Afhandeling
3.2 Grafieken Een leuk onderdeel van LabVIEW is de mogelijkheid om metingen direct in een grafiek weer te geven. Er zijn verschillende
50
typen grafieken. Zie figuur 3.8 voor een overzicht.
Grafieken
Figuur 3.8 Grafieken Chart
Waveform
XY
Express XY
We zullen steeds eerst een voorbeeld bespreken en vervolgens de voor en nadelen van het betreffende type grafiek laten zien.
Voorbeeld Een chart
In de module gebruiken we alleen de bovenste rij (met uitzondering van de Express XY): Een chart is een grafiek waar steeds één punt per keer aan wordt toegevoegd. Een waveform graph is een grafiek waarbij de x-coördinaten van de punten worden berekend via een offset en een delta x. Alle punten die je hier wilt afbeelden, worden in één keer doorgegeven. Een XY-graph is de meest algemene grafiek. Hier kan je twee arrays tegen elkaar uitzetten.
Video Charts Charts instructie is een introductie in Charts. (tijdsduur 8 minuten)
We maken een VI die het meetresultaat van een gesimuleerde thermometer in een chart plaatst. Met een stop-knop op het front-panel kunnen we het programma stoppen. In figuur 3.9 zie je het diagram van het programma. Het klokje is geplaatst om de grafiek niet al te snel te laten langsflitsen.
Figuur 3.9 De thermometer – Chart
Op het front-panel hebben we de y-as geschaald van 25 tot 35, omdat dat de minimale en maximale waarden zijn die de thermometer ‘meet’1. Het VI is nu klaar om te gebruiken. Je kunt het vinden onder de naam ChartDemo.vi.
51
Verder in G
In het voorbeeld zie je dat LabVIEW bij een chart langs de x-as een meting-nummer uitzet. Met property nodes kan dit eventueel gewijzigd worden, maar deze techniek bespreken we verderop. LabVIEW kan verschillende methoden gebruiken om een chart te verversen. In ChartUpdates.vi zie je de drie methoden. Je kunt de update-methode kiezen in het Update Mode menu in het Advanced menu als je rechts-klikt op de chart. Speel met de update modes en kijk welke je het best bevalt. Bij een chart wordt ieder gemeten punt direct in de grafiek geplaatst. De punten worden toegevoegd aan een buffer die standaard 1024 punten kan bevatten. Als deze buffer vol is worden de oudste punten verwijderd en vervangen door de nieuwe metingen. Het kan bij het gebruik van een chart dus voorkomen dat je een meting niet vanaf het begin kunt bekijken.
Voorbeeld Een waveform grafiek We voeren nu weer een meting uit met de gesimuleerde temperatuursensor. Met de metronoom ‘meten’ we iedere 250 ms een temperatuur. Vervolgens maken we een nette grafiek van de meting. Het belangrijke verschil met een chart is dat we hier eerst alle metingen uitvoeren en pas na afloop de grafiek vullen. Figuur 3.10 laat een mogelijke oplossing zien van de bovenstaande opdracht.
Figuur 3.10 De Thermometer – Graph
Video Waveform- and XY - graphs Waveform - XY graphs instructie is een introductie in waveform- en XY-grafieken. (tijdsduur 5 minuten)
1. Je kunt een as schalen door het eerste en het laatste getal langs de as te veranderen met het tekst-gereedschap.
52
Je maakt eerst een array met je meetgegevens. Vervolgens maak je een cluster met x 0 , Δx en de meetgegevens. Als geheugensteuntje voor de volgorde kun je het help-venster tevoorschijn halen (Ctrl+H). Zoals je ziet worden alle gegevens pas na afloop in een grafiek geplaatst. Als we tijdens een meting al een nette grafiek van de resultaten willen maken, dan moeten we een truc uithalen. In figuur 3.11 zie je hoe dat zou kunnen.
Grafieken
Figuur 3.11 Dynamische Grafiek
De meest flexibele grafiek is de XYgraph. Dit type grafiek laat je twee arrays tegen elkaar uitzetten.
Voorbeeld Een XY-grafiek Het nadeel van deze methode is dat je iedere keer een volledig array kopiëert. Dit kan, zeker bij grote arrays veel tijd kosten. Deze voorbeelden zijn te vinden onder WaveformDemo.vi en WaveFormDemo2.vi.
We meten weer de temperatuur, maar nu op meer willekeurige tijden. Het meetinterval kan nu tijdens de meting worden aangepast. De code in figuur 3.12 laat zien hoe dit kan.
Figuur 3.12 Een XY-grafiek x-gegevens 4
2
6
1 y-gegevens 3
4
7 5
Omdat er in dit voorbeeld nogal veel gebeurt, zijn er nummertjes geplaatst om een wat duidelijker beschrijving te kunnen geven.
53
Verder in G
1. Het tijdstip waarop de meting begonnen is, wordt opgenomen. Deze timer met een resolutie van milliseconden kan niet zomaar worden omgerekend in een echte tijd 2. De huidige tijd en de begintijd bepalen het tijdsverschil in milliseconden. Delen door duizend levert een tijd vanaf het begin in seconden. 3. De meting van de temperatuur. 4. De gemeten waarden worden aan de gegevens-arrays toegevoegd. 5. Het control dat het interval tussen twee metingen bepaalt, een draaiknop, wordt omgewerkt tot milliseconden en aan de metronoom gevoerd. 6. De twee arrays met x- en y-gegevens worden geclusterd en aan de grafiek gegeven. Zie ook weer de help (Ctrl+H). 7. De stop-knop stopt het programma. Dit voorbeeld kun je vinden in Demo.vi.
XY-
Met grafieken en charts kan je nog veel meer doen dan hier in de module behandeld wordt. In de context help wordt een aantal malen verwezen naar voorbeelden. Je kunt deze vinden in de folder graphs, in de folder general, in de folder examples, in de folder waar ook het LabVIEW programma staat. Uiteraard zijn er in de examples folder meer voorbeelden te vinden, sommige van deze voorbeelden gaan echter veel verder dan deze module.
54
Opdracht 3.2 Geluid in een Chart Schrijf een programma dat het volgende voor je uitvoert: Het programma meet continu een gemiddelde geluidssterkte. De samplefrequentie en het aantal geluidssterktemetingen waarover ik middel, moeten instelbaar zijn. De uitkomsten dienen weergegeven te worden in een chart waarin maximaal de laatste 50 gemiddelde metingen te zien zijn. Deze waarde kan je instellen m.b.v de “Chart History Length”, (Te vinden door Rechts-klikken op de Chart en uit het popup menu “Chart History Length” te kiezen). Het programma moet gestopt kunnen worden met een stopknop. Maak voor het bepalen van de geluidssterkte net als bij opdracht 2.4 gebruik van het VI Geluidsterktemeter.vi.
Strings
3.3 Strings LabVIEW kan ook met teksten werken. Deze teksten zijn reeksen van karakters. Een reeks karakters wordt in het Engels ook wel een string genoemd. LabVIEW behandelt een string als een array van bytes, omdat een byte precies één karakter kan bevatten. Omdat een string bepaalde eigenschappen heeft die anders zijn dan een gewoon array, zijn er speciale gereedschappen voor strings gemaakt. Je vindt ze op het String sub-palet op het Functions palet. Strings worden onder andere gebruikt om opdrachten te sturen aan meetinstrumenten. In hoofdstuk 4 vind je meer informatie over dit onderwerp. Je komt strings ook tegen bij het schrijven van een tekst-bestand voor het uitvoeren van meetgegevens.
Voorbeeld Een getal in een string We behandelen hier hoe je een getal in een string kunt plaatsen, zodat je de volgende tekst op het scherm krijgt: “De huidige temperatuur is 28.6 °C”.
In figuur 3.13 zie je hoe dat gedaan kan worden. Je kunt het voorbeeld vinden onder de naam String.vi.
Figuur 3.13 Een getal in een string
LabVIEW gebruikt een zogenaamde format string en de getallen om een dergelijke string samen te stellen. In figuur 3.13 is “De huidige temperatuur is %.1g °C” de format string. In een format string kun je gewone tekst typen die je in je string wilt hebben, en speciale codes om aan te geven welke andere elementen je nog wilt invoegen. Door rechts-klikken op de Format into string functie, kun je het Edit Format String menu-item kiezen. Je krijgt dan een dialoogvenster waarin je kunt opgeven welke onderdelen je in de format string wilt plaatsen. In appendix C vind je een tabel met de beschrijving van de codes.
3.4 Bestanden Bestanden of files zijn de belangrijkste manier om meetresultaten van LabVIEW over te brengen naar andere programma’s. LabVIEW heeft de beschikking over functies om allerlei gegevens, op allerlei manieren naar een bestand te schrijven. In de
meeste programma’s hebben wij de uitvoer naar een bestand al geregeld. Voor je eigen programma’s is er een aantal VI’s die je meetresultaten op een aantal standaard methoden kunnen opslaan.
55
Verder in G
3.4.1 Spreadsheet Tekst Bestanden
Alle data-analyse programma’s, ook Origin, kunnen dit type gegevensbestanden lezen.
Video Read and write speadsheets Spreadsheet instructie laat zien hoe je met de highlevel file I/O VI’s spreadsheet bestanden kunt lezen of schrijven (Tijdsduur 4 minuten). Met de functie
Write
Figuur 3.15 Meer in één bestand
To
(Functions palet sub-palet File I/O) kun je een array naar een bestand schrijven. Omdat deze functie gebruik maakt van een aantal minder bekende onderdelen, laat het volgende voorbeeld zien hoe je dit VI kunt gebruiken. Spreadsheet
De 1D data is het array met de gegevens die je wilt opslaan. De format string is een string die aangeeft hoe het getal moet worden omgezet in tekst. De manier waarop deze string moet worden samengesteld is dezelfde als in paragraaf 3.3. Nu is het meestal niet zinvol om slechts één array tegelijkertijd op te slaan, vaak zal je meerdere gelijktijdig gemeten grootheden willen opslaan in één bestand. Dit is gelukkig goed mogelijk. In figuur 3.15 zie je hoe dat moet.
File.vi,
Voorbeeld Een Spreadsheet File In figuur 3.14 zie je de code die je nodig hebt om een array naar een spreadsheet bestand te schrijven.
Figuur 3.14 Spreadsheet bestand
De format string heeft nog dezelfde functie als in het vorige voorbeeld. We gebruiken nu echter niet de 1D data om de gegevens over te sturen, maar de 2D data. De arrays met meetgegevens kunnen met de Build Array functie aan elkaar gekoppeld worden. Om nu te zorgen dat het eerste array in de eerste kolom van het bestand verschijnt, moeten we de boolse variabele transpose? op TRUE zetten. Als we dat niet doen, dan zijn de kolommen en rijen van plaats verwisseld, en lezen de meeste programma’s iets anders dan we wensen. Je kunt beide voorbeelden vinden onder WriteSpreadsheetSimple.vi en WriteSpreadsheetMultiCol.vi.
56
Lokale variabelen en property nodes
Waarschuwing Kijk uit dat je geen files overschrijft die je nog nodig hebt.
3.5 Lokale variabelen en property nodes 3.5.1 Lokale variabelen
Met lokale variabelen kan je de waarde van een control of indicator op meerdere plaatsen lezen of schrijven. Als je een variabele in meerdere frames van een sequence wilt gebruiken, en ook tussendoor wilt updaten, dan ontkom je niet aan het gebruik van lokale variabelen. Hoewel het gebruik van lokale variabelen in sommige gevallen noodzakelijk is, verdient het de voorkeur om zoveel mogelijk te werken met doorverbonden touwtjes. We geven hier de beschrijving van het gebruik van lokale variabelen. Je maakt een lokale variabele door rechts-klikken op de terminal en uit het popup menu te kiezen zoals dat in het onderstaande plaatje staat. Uit het rechts-klik menu van de lokale variabele kan je kiezen of je de variabele wilt lezen of schrijven.
Uit hetzelfde menu kun je kiezen met welke terminal de lokale variabele geassocieerd is. Het plaatje hiernaast kan veel verduidelijken.
Dit is eigenlijk alles wat er over lokale variabelen te vertellen is. In het voorbeeld Lokale Variabelen Demo.vi zie je hoe lokale variabelen gebruikt kunnen worden.
57
Verder in G
Uit het rechts-klik menu van een property node, kun je instellen of een element wordt gelezen of dat het element wordt geschreven. Je kunt dit zien aan het kleine driehoekje (links: geschreven en rechts: gelezen). In hetzelfde menu, tref je een sub-menu aan met de naam Properties. Hier zijn alle opties van de betreffende terminal samengevat. Als je één van de opties geselecteerd hebt, dan geeft de Context Help (Ctrl+H) aan wat je er mee kunt doen.
3.5.2 Property Nodes
Met property nodes is het mogelijk om bepaalde eigenschappen van controls en indicatoren vanuit het programma te veranderen. Omdat elk van de controls en indicatoren andere opties heeft, laten we hier zien hoe property nodes werken aan de hand van een voorbeeld. Je maakt een property node door rechts-klikken op een terminal en uit het popup-menu te kiezen zoals dat in het onderstaande plaatje staat.
58
Je kunt meerdere opties tegelijkertijd instellen of lezen door het blokje van de property node te vergroten. Hierbij worden de onderdelen van boven naar beneden afgewerkt.
Voorbeeld Property Node We gebruiken hier een property node om de horizontale as van een chart een correcte schaling te geven. Het VI waar we van uitgaan is Property Node Start.vi. In dit VI wordt wederom de geluidssterkte gemeten en weergegeven in een chart. De meting van het geluid duurt ongeveer 90 ms. Om ook tijd over te houden voor de overige berekeningen doen we iedere 150 ms een meting. Met behulp van property nodes gaan we de x-as corrigeren, zodat er daadwerkelijk seconden komen te staan. Tevens maken we de plot rood zodra het geluidsniveau boven een bepaald niveau uitkomt. De eerste actie, het instellen van de x-as, hoeft slechts eenmalig te worden uitgevoerd. We maken een property node van de chart. Door te rechtsklikken op de property node, kunnen we met Properties kiezen wat we willen veranderen. We kiezen hier Multiplier, zoals in figuur 3.16 is aangegeven.
Lokale variabelen en property nodes
Figuur 3.16 Selecteren van Delta X
Door aan dit property node de waarde 0.15 te koppelen, maken we een Δx tussen twee meetpunten die hetzelfde is als het meetinterval. Het totale interval dat wordt weergegeven kan je veranderen door een beginwaarde en een eindwaarde op te geven. Gebruik het tekst-gereedschap om de eerste en laatste waarde te veranderen. In figuur 3.17 zie je hoe het eindresultaat eruit ziet.
Figuur 3.17 X-as van een Chart
Je moet er wel voor zorgen dat deze actie wordt uitgevoerd vóórdat de while-loop gestart wordt. Je kunt dit doen door de property node in een sequence te plaatsen en een variabele (bv de constante 0.15) vanuit de sequence te verbinden met de rand van de while-loop. Door de dataflow zal nu eerst de sequence en vervolgens pas de while loop uitgevoerd worden. De tweede actie, het veranderen van de kleur van de grafiek als het geluidniveau te sterk is, doen we eveneens met behulp van een property node. Het niveau dat we kiezen voor het laten verkleuren van de grafiek, stellen we in met
59
Verder in G
een Vertical Pointer Slide, van het numerics control palet. Met wat schalen van dit control, en het kiezen van een logaritmische schaalverdeling2, kunnen we dit control zo instellen dat het pijltje dezelfde waarde aangeeft als de plot in de chart. Maak een nieuwe property node van de chart. Kies uit het Plot sub-menu in het Properties sub-menu, het item Plot Color. Het property node met Plot Color geselecteerd, verwacht een kleur. Nu is een kleur in een computer niets anders dan een getal dat aangeeft hoeveel rood, groen en blauw in het eindresultaat aanwezig moet zijn. Het is mogelijk om zelf een dergelijk getal samen te stellen, maar gelukkig bestaat er een gemakkelijker manier om kleuren op te geven. Op het Numeric sub-palet van het Functions palet, tref je het Additional Numeric Constants sub-palet aan. Op dit palet bevindt zich een constante met de naam Color Box Constant. Door
met het operating gereedschap op deze constante te klikken, kun je de gewenste kleur kiezen, in ons geval wit en in een andere constante rood. Het laatste wat we moeten doen voor het verkleuren van de grafiek, is het selecteren van de kleur na een meting en de gewenste kleur doorgeven aan de property node. We doen dit met de Select functie, die je in paragraaf 2.4.2 al bent tegengekomen. Als we deze stappen combineren, dan krijgen we de code uit figuur 3.18.
Figuur 3.18 Kleurweergave
Het eindresultaat van deze stappen kun je vinden in Property Node Demo.vi.
2. rechts-klik menu, Scale, Mapping, Logarithmic.
3.6 VI Opties en VI Libraries Bij het uitvoeren van een VI is het mogelijk om bepaalde opties in te stellen, zodat een VI zich op een bepaalde manier gedraagt. Zo kan je het front panel weergeven zodra een VI wordt opgeroepen. Dit is handig als je een dialoogvenster op het scherm wilt zetten. Het VI waarmee je in hoofdstuk 2 een grafiek hebt gemaakt, was op een dergelijke manier ingesteld. Je kunt de VI opties veranderen door rechts-klikken op het icon op het frontpanel en uit het menu VI Properties te kiezen. In figuur 3.19 zie je het venster dat vervolgens verschijnt.
60
Figuur 3.19 VI Properties: General
Onder Category kun je nog veel meer mogelijkheden selecteren. We bespreken er hier een aantal.
VI Opties en VI Libraries
Selecteer Execution. Vervolgens verschijnt dan het venster van figuur 3.20.
Figuur 3.20 VI properties: Execution
Een korte uitleg van figuur 3.20: Priority en Preferred execution system Als er meer dan één VI op computertijd wacht, welke heeft dan voorrang? Met deze opties kan je dat instellen. Reentrant execution Het VI kan meer dan één keer tegelijkertijd worden uitgevoerd. Lees eerst de handleidingen van National Instruments voordat je dit aankruist. Run when opened Je hoeft dan na het openen van het VI niet meer op de run-knop te drukken. Suspend when called Kan handig zijn voor het vinden van bugs. Als het VI wordt aangeroepen, dan stopt het uitvoeren van het programma, totdat je op de stap-knop klikt. Allow debugging Als dit niet aanstaat, dan is het niet mogelijk om tijdens het executeren van een VI door de code te stappen. Clear indicators when called Zorgt er voor dat een indicator, zoals een grafiek, iedere keer gewist wordt als de VI waarin de indicator voorkomt aangeroepen wordt.
Selecteer Window Appearance en vervolgens Custom en klik op Customize. Nu verschijnt het venster van figuur 3.21: Window has title bar Wel of geen titel boven het venster Show menu bar, scroll bars, toolbar when running, Abort button, Run button, Continuously run Button Dit spreekt voor zich zelf. Show front panel when called Laat het front-panel zien als het VI wordt aangeroepen. Close afterwards when originally closed Als het VI klaar is, dan wordt het venster weer verwijderd als het voor het aanroepen niet aanwezig was. Show front panel when loaded Het front-panel wordt getoond zodra het VI wordt geladen. In het algemeen niet zo handig voor sub-VI’s, omdat je deze meestal pas wilt laten zien als ze actief zijn. Window Behavior Hiermee kun je het ‘type’ van het scherm tijdens uitvoering wijzigen: Default is zoals je gewend bent; Floating brengt het scherm op de voorgrond van alle LabVIEW windows en Modal maakt het zelfs onmogelijk om naar een ander LabVIEW window te gaan zolang deze open is (net als bij een file dialog). Window runs transparently Het front-panel wordt transparant en achtergrond wordt zichtbaar. Allow user to close window Gebruiker mag het venster sluiten. Allow user to resize window Gebruiker mag het venster vergroten of verkleinen? Meestal wil je dit niet. Allow user to minimize window Gebruiker mag de grootte van het window minimaliseren?
61
Verder in G
Allow run-time shortcut menus Gebruiker kan rechtsklikken bepaalde instellingen te wijzigen?
om
Highlight <Enter> Boolean Highlight een boolean parameter die geassocieerd is met de
of <enter> toets.
Figuur 3.21 VI Properties: Customize Window Appearance
3.6.1 Een VI als Popup VI
Als je van een subVI een popup VI wilt maken, dan moet je in de eerder behandelde VI Properties de volgende Properties aan vinken: Show front panel when called Close afterwards when originally closed Door in deze subVI een while-loop met een OK button als een boolse control te gebruiken, bepaal je zelf wanneer het front paneel van de popup VI sluit.
Opdracht 3.3 Popup VI Aan het eind van opdracht 1.4 heb je gemiddelde(2).vi in een nieuwe VI geplaatst samen met twee Numeric Controls en een Numeric indicator. Herhaal deze handeling of gebruik het resultaat uit opdracht 1.4 en maak nu van de subVI een popup VI. Vergeet niet in je gemiddelde(2).vi een while-loop structuur met een boolse control toe te passen.
3.6.2 VI libraries
LabVIEW bewaart ieder VI in een apart bestand. Het is echter ook mogelijk om de
62
VI Opties en VI Libraries
LabVIEW bewaart ieder VI in een apart bestand. Het is echter ook mogelijk om de VI’s van een programma te groeperen in bibliotheken ofwel libraries. Deze bibliotheken zijn erg praktisch voor het verspreiden en opslaan van grotere programma’s of om een set met gerelateerde VI’s gezamenlijk te houden. Je maakt een VI library met de volgende stappen: 1. Bewaar je VI door Save uit het File menu te kiezen. 2. In het dialoogvenster klik je op de knop New LLB. 3. Geef de naam van de library die je wilt maken, en klik op Create.
4. Geef de naam van de VI die je in de VI library wilt bewaren en klik Save. Een VI library werkt voor LabVIEW net als een gewone folder, en je kunt vanuit het gewone bewaarvenster de library openen om er VI’s aan toe te voegen. Als je al een programma hebt, dan kan je dit programma bewaren als een VI library door Save as ... uit het File menu te kiezen. Het venster uit figuur 3.22 verschijnt. Selecteer Duplicate hierarchy to new location en via Continue... kom je weer uit bij stap 2. Selecteer New LLB etc.
Figuur 3.22 Bewaren met opties
In het Tools menu tref je een item aan met de naam LLB Manager.... Hiermee kun je een VI library openen en VI’s verwijderen of top-level maken. Verwijderen spreekt voor zich, maar top-level niet. Als je in de finder dubbel-
klikt op een VI library, dan word alleen de toplevel VI geopend. Voor een programma met subVI’s is dat precies wat je wilt met het hoofdprogramma.
63
Verder in G
3.7 Tips & Tricks 3.7.1 Bestaande code naar een subVI
Om een gedeelte van de code van een VI te veranderen in een subVI, volg je de volgende stappen: 1. Selecteer de code die je in een subVI wilt stoppen. 2. Kies Create SubVI uit het Edit menu. 3. Dubbelklik het nieuwe icon en breng wijzigingen aan: Maak een icon. Verplaats enkele onderdelen om het geheel overzichtelijker te maken. Geef de controls en indicatoren op het front-panel een duidelijke naam, zodat ze herkenbaar in de help verschijnen.3
Verander eventueel de connector, zodat de aansluitingen op een logische plaats zitten. Maak sommige van de connector elementen optioneel of juist required, door te rechts-klikken op de connector en vervolgens de geschikte optie te kiezen uit het submenu This Connection Is. 4. Bewaar het nieuwe VI.
Als je de connector hebt gewijzigd, dan moet je rechts-klikken op het gedimde icon en Relink to subVI uit het menu kiezen. 3. Voor elke wire die de selectie verlaat wordt een control of een indicator gemaakt.
64
De echte wereld
LabVIEW is gemaakt om met een computer experimenten te besturen. Nu je de basiskennis hebt om in LabVIEW te programmeren, kunnen we de computer met
4
een experiment verbinden. Voor we dit doen, bespreken we eerst in algemene termen hoe het meten met een computer werkt.
4.1 Een meetsysteem Voordat we met een computer kunnen meten, moeten we eerst op een rijtje zetten welke stappen we nemen als we een gewone meting uitvoeren. Als voorbeeld gebruiken we hier het meten van de temperatuur in een kop thee. De eenvoudigste manier om de temperatuur van een kop thee te bepalen is het gebruik van een vloeistof thermometer.
Deze simpele methode laat echter al een aantal van de essentiële onderdelen van een meetsysteem zien. Het belangrijkste onderdeel is het fysische verschijnsel, in dit geval de temperatuur van de thee. Omdat je een temperatuur niet direct kunt waarnemen, moet je met een sensor de temperatuur omzetten in een waar-
65
De echte wereld
neembare grootheid, in dit geval de uitzetting van een vloeistof. De verplaatsing van het vloeistofoppervlak is met een schaalverdeling te vergelijken en geeft op die manier de waarde van de temperatuur. In figuur 4.1 zie je een overzicht van dit meetsysteem.
Figuur 4.1 De klassieke methode Fysisch verschijnsel Sensor
Aflezing
Als we met een computer de temperatuur van een kop thee willen meten, dan is een klassieke thermometer nutteloos: het is niet goed mogelijk om de verplaatsing van het vloeistofoppervlak met een computer af te lezen. Het is uiteraard wel mogelijk om een temperatuur met een computer te meten. Daarvoor zijn echter andere technieken nodig. We gebruiken de temperatuursmeting slechts als voorbeeld, de genoemde onderdelen zijn voor elke meting met een computer belangrijk. Een overzicht van het hele systeem tref je aan in figuur 4.2. Om een meting met een computer te kunnen verrichten, moet de fysische grootheid die je wilt meten, omgezet worden in een elektrisch te meten grootheid. Meestal zijn er sensoren beschikbaar die dit direct kunnen, maar soms moeten er meerdere stappen worden verricht. Voor de temperatuurmeting zijn verschillende directe methoden beschikbaar:
66
Thermokoppels: Deze geven een temperatuursafhankelijke spanning. NTC of PTC weerstanden: van deze materialen neemt de elektrische weerstand af (Negatieve Temperatuur Coëfficiënt) respectievelijk toe (Positieve Temperatuur Coëfficiënt) bij stijgende temperatuur.
In het voorbeeld uit figuur 4.2 hebben we gekozen voor een NTC-weerstand. Nadat de te meten grootheid is omgezet in een elektrisch meetbare grootheid, zal het signaal nog moeten worden aangepast. Een thermokoppel levert signalen in de orde van millivolts. Om dit goed te kunnen meten, moet er een versterker worden gebruikt. Soms zijn ook filters nodig om bepaalde – ongewenste – signalen te verzwakken. Deze methoden vallen onder het kopje signaal conditionering. Afhankelijk van de sensor en de toepassing kan er nog meer signaal conditionering nodig zijn. Na de signaal conditionering is het meetsignaal geschikt om te worden omgezet in een digitaal signaal: een getal. Deze digitalisatie gebeurt met een ADC, een analoog naar digitaal converter. In het voorbeeld van de temperatuurmeting bestaat de signaal conditionering uit het gelijktijdig meten van de spanning en de stroom. Moderne multimeters hebben een dergelijke voorziening ingebouwd, samen met de digitalisatie van het meetsignaal. Na de digitalisatie van het signaal, moet deze waarde naar de computer verzonden worden. Deze verbinding, de interface, heeft meestal de vorm van een computer kabel met bijbehorende elektronica. In de computer wordt deze interface bestuurd door een programma, in ons geval een LabVIEW programma. De interface is tweerichtingsverkeer: de computer geeft de opdracht aan het meetapparaat wanneer
Een meetsysteem
er gemeten moet worden. Het meetapparaat doet een meting en geeft de meetwaarde via de interface aan de computer door. Vervolgens wordt in het programma de gemeten weerstand omgerekend naar een
temperatuur. Dit is uiteraard alleen mogelijk als het verband tussen weerstand en temperatuur bekend is. Verder verzorgt het programma ook de weergave van de resultaten, bijvoorbeeld in een grafiek.
Figuur 4.2 Een compleet meetsysteem
?
?
?
011001
?
?
f1
Fysisch verschijnsel
Sensor
Signaal conditionering
We geven een samenvatting van een algemeen meetsysteem: Gebruik een sensor die de te meten grootheid omzet in een elektrisch meetbare grootheid. Versterk en bewerk het signaal dat uit de sensor komt zodanig dat het geschikt wordt om te digitaliseren. Dit heet signaal conditionering. Digitaliseer het signaal met een ADC. Stuur het gedigitaliseerde signaal via een interface naar de computer. De computer verzorgt de eindberekeningen en de verdere verwerking.
Digitalisatie
Interface
Verwerken en weergeven
het oversturen van het signaal naar het geheugen van de computer). In deze module behandelen we niet waar je op moet letten bij het kiezen van een sensor, hoe de signaal conditionering werkt of hoe een ADC werkt. (digitalisatie). We leggen wel iets uit hoe een interface gebruikt kan worden, en hoe je de gegevens uit een meetapparaat in je computer krijgt. Wat je vervolgens met die gegevens kunt doen, heb je al geleerd in eerdere delen van deze module.
De signaal conditionering en de digitalisatie worden vaak door hetzelfde apparaat, bijvoorbeeld een multimeter, uitgevoerd. Soms lijkt de signaal conditionering, digitalisatie en interface geheel in de computer te zijn ingebouwd. Een geluidsingang of uitgang op de computer is hiervan een voorbeeld. Bij nadere beschouwing blijkt echter dat ook hier sprake is van vier afzonderlijke onderdelen (een versterker, een filter, een ADC en een interface voor
67
De echte wereld
4.2 De interface In hoofdstuk 5 ga je met de geluidskaart een meetsysteem bouwen. De geluidskaart is een data-acquisitie systeem direct in de computer, die via een PCIinterface de gemeten signalen naar het geheugen van de computer stuurt. De besturing van deze kaart wordt geregeld door een apart driver programma. Meetinstrumenten zoals multimeters, oscilloscoop of andere externe data-acquisitie apparatuur worden via een kabel door de computer aangestuurd. De exacte opdrachten die je kunt geven, verschillen per apparaat. Meestal bestaan de opdrachten uit ASCII strings waarin op enigszins leesbare wijze de opdracht is verpakt. Bijvoorbeeld: *IDN?
verstuurt een verzoek aan het apparaat om een identificatie string terug te sturen, zodat het programma kan bepalen of het juiste apparaat wel aan de interface gekoppeld is. De opdracht *IDN? is een opdracht die veel, maar helaas niet alle apparaten begrijpen. De opdracht: :MEASURE:VOLTAGE:DC?
doet wat je denkt dat het doet: het voert een meting uit, en wel een gelijkspanningsmeting. Helaas zijn er ook apparaten die veel onduidelijker opdrachten verwachten. Een ander apparaat verwacht voor het lezen van een gelijkspanning bijvoorbeeld de volgende opdrachten: F0R0S1T5B0G0X
Het mag duidelijk zijn dat dit tweede apparaat lastiger te programmeren is.
68
4.2.1 Verschillende Interfaces
Er zijn vele typen interfaces. Enkele van de veel gebruikte typen zijn: Serieel – RS-232, RS-422, RS-485 General Purpose Interface Bus – GPIB, HPIB of IEEE 488 Parallelle poort (PC) Universal Serial Bus – USB FireWire – IEEE 1394 Peripheral Component Interconnect – PCI Personal Computer Memory Card International Association – PCMCIA Deze interfaces, behalve de laatste twee, zijn bedoeld om externe apparaten te besturen. Ze zijn grofweg te verdelen in twee groepen: serieel en parallel. Bij een seriële bus worden de enen en nullen van de gegevens na elkaar verstuurd. Bij de ontvanger worden ze weer achter elkaar geplakt zodat de originele bytes ontstaan. De RS-232, RS-422, RS-485, USB en FireWire interfaces zijn van dit type. Bij een parallelle bus worden de verschillende bits naast elkaar door meerdere draden verstuurd. De GPIB en Centronics interfaces zijn van dit type. De PCI is een parallelle interface en bedoeld voor insteekkaarten (data-acquisitie kaarten). PCMCIA lijkt op PCI maar is meer ontwikkeld voor mobiele toepassingen (in laptops e.d.). De transport snelheid van de interfaces verschillen nogal, tabel 4.1 geeft een overzicht van de snelheden.
Het gebruik van drivers
Tabel 4.1 Bussnelheid Interface
Snelheid
Serieel (RS-232) Parallelle poort GPIB USB USB2.0 FireWire PCI PCMCIA
≤ 4.8 kB/s ≤ 1 MB/s 1.3 – 3.7 MB/s ≤ 1.5 MB/s ≤ 60 MB/s ≤ 50 MB/s ≤ 132 MB/s ≤ 2.5 MB/s
goedkopere kabels kunnen allerlei crosstalk effecten optreden, waardoor het signaal verminkt overkomt. Meestal zal je weinig keuze hebben bij het kiezen van een interface: het apparaat dat je wilt gebruiken voor een meting zal één of misschien twee van de interfaces hebben en dus voor jouw het type interface bepalen.
Het behalen van deze doorvoersnelheden vereist het gebruik van goede kabels: bij
4.3 Het gebruik van drivers Deze module gaat niet in op het programmeren van de drivers zelf. Bovendien is het schrijven van een goede driver een hels karwei. Wel gaat deze module in op het gebruik van drivers.
Als je hierna LabVIEW opnieuw opstart vind je op het Functions palet onder Instrument I/O een item Instrument Drivers met de Sound input en output drivers. In een redelijk logische structuur zijn onder deze items alle noodzakelijke drivers voor deze module geplaatst.
4.3.1 Algemene Driver Zaken
Om drivers correct te gebruiken, moet je een aantal zaken weten, bijvoorbeeld hoe je ze vindt. De drivers die je voor de eindopdracht gaat gebruiken staan in de ‘intr.lib’ folder. Deze folder kun je downloaden vanaf de instructievideo webpagina (http://www.few.vu.nl/ ~janm/timnw/. Plaats de ‘intr.lib’ folder in de folder ‘C:\program ments\LabVIEW
bestaande.
files\National 8.2’
Figuur 4.3 Structuur driver palets.
Instru-
en vervangt de
In dit hoofdstuk gaan we met de geluidskaart als voorbeeld verder.
69
De echte wereld
4.3.2 Volgorde van driver VI’s
De acties die je uitvoert met een instrument hebben een bepaalde volgorde. 1. Je opent eerst de verbinding met een bepaald instrument (Hier de in- of uitgang van de geluidskaart). Het VI in de driver set die deze actie uitvoert is de SI- of SO-Initialize.vi. en is te vinden onder het Initialize Palet. (zie figuur 4.3). Dit VI initialiseert de input van de geluidskaart. 2. Je configureert het instrument voor je meting (Data acquisitie snelheid en buffer grootte). De configuratie VI’s zijn gegroepeerd onder het Configuration Palet van het betreffende instrument. Afhankelijk van het instrument kunnen dit er veel of weinig zijn. 3. Je voert de metingen uit. De VI’s die gegevens lezen zijn te vinden onder het Data Palet van de betreffende driver. 4. Je sluit de verbinding met het instrument. Dit VI wordt het Close VI genoemd en staat in het Close Palet. Een driver heeft nog meer VI’s, zoals VI’s die berekeningen kunnen uitvoeren en algemene utilities. Er is nog één ander belangrijk onderdeel van een driver: het application VI. Dit VI bootst het volledige instrument na, met alle opties die je vanuit de software kunt instellen.
Opdracht 4.1 Een ingangssignaal meten
Schrijf een programma dat de ingangsspanning van de geluidskaart leest. Gebruik hiervoor een microfoon en de nieuwe Sound input driver VI’s (Zie paragraaf 4.3.1) en niet de eerder gebruikte Geluidsterktemeter.vi. De stappen die je moet uitvoeren zijn: 1. Open de verbinding met het ingangskanaal van de kaart. 2. Configureer de kaart met de volgende opties: Data acquisitie snelheid (“sample rate”) en Buffer grootte (“Number of samples/channel”). 3. Voer de metingen uit totdat er op een stopknop wordt gedrukt. Zet het resultaat van de metingen in een waveform graph. 4. Na het stoppen van het programma moet de verbinding met de geluidskaart afgesloten worden (Close.vi). Veel succes.
4.4 Computer Uitbreidingskaarten Een extern meetinstrument in combinatie met een interface is vaak niet verschikkelijk snel. Hoewel een GPIB interface de gegevens met een behoorlijke snelheid kan transporteren, zijn er allerlei oorzaken aan te wijzen waarom deze snelheid niet volle-
70
dig wordt benut. Als je meer dan 20 metingen per seconde wilt uitvoeren, heb je bij de meeste meetinstrumenten al een probleem. Sommige meters hebben een eigen intern geheugen waar een aantal metingen kan worden opgeslagen. De vertragende
Computer Uitbreidingskaarten
werking van de opdracht tot het doen van een meting, het opvragen van het resultaat en vervolgens het overzenden van dat resultaat wordt dan verminderd, omdat deze serie acties slecht éénmaal voor het hele geheugen hoeft te worden uitgevoerd. Op deze manier zijn snelheden tot ongeveer 100 metingen per seconde te bereiken. De beperking van het aantal metingen per seconde wordt mede veroorzaakt door de relatief grote nauwkeurigheid waarmee de metingen door een multimeter worden verricht. Door de nauwkeurigheid te verminderen, is het mogelijk om sneller te meten. Een oscilloscoop met geheugen maakt hier gebruik van. Een digitale geheugen oscilloscoop (DSO) heeft meestal een 8-bits ADC, en dus een nauwkeurigheid van 1 ⁄ 256 ste van de range. Daar staat tegenover dat de snelheid zeer groot kan zijn, tot 10 9 samples per seconde of meer. Het is mogelijk om een hogere snelheid en/of resolutie te halen. Dit is uiteraard (veel) duurder. Ook de hoeveelheid samples kan een beperking zijn. Voor continu doormeten van een snel variërend signaal is een DSO echter niet geschikt, omdat de meting tijdens het trage overzenden naar de computer wordt gestopt. Computers kunnen echter ook uitbreidingskaarten herbergen die met een veel grotere snelheid gegevens naar het geheugen kunnen sturen. Moderne kaarten zijn van het type PCI en halen een snelheid van meer dan 100 MB per seconde.
4.4.1 DAQ kaarten
Een zeer geschikt type kaart voor het uitvoeren van metingen zijn de zogenaamde Data Acquisitie kaarten. Deze kaarten digitaliseren met grote snelheid een spanning. Signaal conditionering moet echter buiten de kaart worden uitgevoerd. Omdat deze kaarten met grote snelheid kunnen communiceren met de rest van de computer, zijn op deze manier zeer snelle metingen mogelijk. Er zijn verschillende typen DAQ kaarten, die verschillen in het aantal meetkanalen, gelijktijdige digitalisatie of een gemultiplext systeem, sample snelheid en digitale in- en uitgangen. Uiteraard geldt dat het aantal mogelijkheden de prijs sterk beïnvloedt. Voor dit practicum worden de DAQ kaarten niet gebruikt. We geven wel enkele aanwijzingen over het gebruik van deze kaarten. De kaarten worden bediend met een andere collectie VI’s en staan in de standaard LabVIEW bibliotheek voor het gebruik van deze uitbreidingskaarten. De signaal conditionering vindt plaats buiten de kaart. Dat wil ook zeggen dat het mogelijk is om met te grote spanningen grote schade te veroorzaken aan de kaart en de computer. Voor een uitgebreide discussie over signaal conditionering, de keuze van de juiste data-acquisitie kaart en het programmeren van deze kaart in LabVIEW, verwijzen we naar de handleiding van LabVIEW of een van de vele boeken die over dit onderwerp zijn geschreven.
71
De echte wereld
72
Het opzetten van een project
Voor het succesvol schrijven van een groter programma moet je – voordat je begint – een goede analyse verrichten van het probleem dat moet worden opgelost. Als je na deze analyse gestructureerd verder gaat, bespaar je jezelf veel tijd en energie. Het motto is: “Eerst denken, dan doen”. Dit hoofdstuk beschrijft hoe je een probleem kunt analyseren en vervolgens op een gestructureerde manier kunt oplossen. We hebben de methode hier toegespitst op LabVIEW, maar met enige aanpassingen is deze methode ook toe te passen op andere
5
projecten, zoals een practicumopdracht of een programmeeropdracht in een andere taal. In dit hoofdstuk gebruiken we het voorbeeld dat in het begin van hoofdstuk 4 ook is gebruikt: de temperatuurmeting. Het is verstandig om de stappen uit het voorbeeld ook zelf uit te voeren: Het is een goede oefening voor de eindopdracht. Bij de eindopdracht moet je laten zien dat je de stappen uit dit hoofdstuk hebt uitgevoerd.
73
Het opzetten van een project
5.1 Het Stappenplan Om een project tot een succesvol einde te brengen, moet je gestructureerd te werk gaan. Voor de meeste projecten geldt een vergelijkbaar stappenplan, maar deze versie is specifiek voor LabVIEW gemaakt. 1. Overleg met de gebruiker wat van het programma verwacht wordt. Maak vervolgens een lijst met eisen.1 2. Overleg met de gebruiker welke variabelen gecontroleerd en welke weergegeven moeten worden. Ontwerp op grond hiervan een user interface (in LabVIEW: een front-panel). 3. Maak het front-panel en test dit. Controleer of alle onderdelen aanwezig zijn en of er misschien tijdens de voorbespreking iets over het hoofd is gezien. Voeg deze onderdelen, in overleg met de gebruiker, toe aan je front-panel. 4. Als meetapparatuur gebruik je de in- en uitgangen van de geluidskaart. Let op meetsnelheid, signaalsterkte en buffer grootte. Schrijf duidelijk op waarom voor een bepaalde configuratie gekozen is, en waarom daarmee de eisen van de gebruiker gehaald kunnen worden. 5. Teken – op papier – een stroomschema van het hoofdprogramma. Hierin geef je aan welke logische blokken je nodig hebt. Vaak zullen deze blokken overeenkomen met de VI’s die je in het programma zult gebruiken. Probeer deze blokken zo algemeen mogelijk te definiëren. Als je dit goed doet, zijn de blokken later in andere deelprogramma’s opnieuw te gebruiken.
1. Het project doe je in koppels. Deze discussie voer je met je medestudent(e). Maak notities van dit ‘overleg’: de afwegingen die ten grondslag liggen aan de keuzes die je voor de opzet van je programma maakt.
74
In paragraaf 5.2 wordt meer in detail in gegaan op het stroomschema. 6. Maak voor de in punt 5 genoemde blokken ‘lege’ VI’s. Deze VI’s hebben alleen een front-panel met de relevante controls en indicators en een connector-icon. 7. Maak het hoofdgedeelte van je programma. Plaats hierin de in 6 gemaakte VI’s. 8. Programmeer vervolgens de nu nog ‘lege’ VI’s uit punt 6. Het is heel goed mogelijk dat enkele van de sub-VI’s zo groot worden dat ook voor deze VI’s de stappen 5 tot en met 8 opnieuw uitgevoerd moeten worden. 9. Tijdens het schrijven van je programma kom je ongetwijfeld delen tegen waar je tijdens de voorbereiding niet aan had gedacht. Het kan zijn dat een bepaald stuk code vaak wordt herhaald op verschillende plaatsen of dat het uitvoeren van een taak zoveel plaats inneemt, dat het overzichtelijker is om die code in een subVI te plaatsen. Hoe dit kan, werd al beschreven in paragraaf 3.7.1. 10.Probeer de blokken van je programma zoveel mogelijk afzonderlijk te testen. Een hoeveelheid code die op één scherm, zonder scrollen kan worden bekeken, is eenvoudig te debuggen. Als je echter moet scrollen, dan wordt het vinden van fouten al veel lastiger. Zorg er in ieder geval voor dat je alleen horizontaal hoeft te scrollen. 11.Test het gehele programma op de aanwezigheid van fouten. Controleer ook of alle wensen van de gebruiker zijn vervuld. Het mag duidelijk zijn dat je deze stappen in eerste instantie in deze volgorde uit-
Het stroomschema
voert. Gedurende het gehele project moet je controleren of het programma aan de eisen voldoet. Ook moet je steeds controleren of er bij de eerste bespreking geen functionaliteit over het hoofd is gezien. Als dat naar de mening van de programmeur het geval is, dan moet weer worden teruggegaan naar stap 1 of 2. Als je de verschillende taken van het programma goed hebt geanalyseerd en geabstraheerd, zijn de blokken die je voor de verschillende taken hebt geschreven
algemeen inzetbaar. Zeker als je bij het verzinnen van taken voor een blok hergebruik in gedachten houdt, kun je VI’s in vele programma’s opnieuw gebruiken. Hergebruik is de grote kracht van het gebruik van VI’s. Je bent al voorbeelden tegengekomen van VI’s die ook in andere programma’s zijn gebruikt: drivers. Ook in het voorbeeldprogramma dat we in dit hoofdstuk maken, zijn gedeelten uit andere programma’s verwerkt.
5.2 Het stroomschema Bij het opzetten van een project moet je een ontwerp van je programma maken2. Er zijn verschillende manieren waarop je dit kunt doen. In deze paragraaf leggen we een methode uit, waarbij gebruik wordt gemaakt van een stroomschema. In een dergelijk schema zijn op duidelijke wijze de afzonderlijke taken (acties) die het programma uit moet voeren, de volgorde waarin dat dient te gebeuren en allerlei structuren, zoals for- en while-loops te zien. Het sterke van deze methode is dat ze toepasbaar is bij het schrijven van de meeste computerprogramma’s, ongeacht de taal waarin dat gebeurt.
Om stroomschema’s ook goed leesbaar te maken voor anderen, moeten we eerst afspreken hoe we bepaalde blokken gaan tekenen. We beginnen met het hoofdblok. een voorbeeld is schematisch weergegeven in figuur 5.1.
Figuur 5.1 Voorbeeld hoofdblok start titel: auteur: omschrijving: in: uit
som
Maarten berekent de som van twee getallen a, b som
som= a + b
5.2.1 Blokken in het stroomschema
Een programma, zeker een groter programma, is op te delen in kleinere blokken, waarbij ieder afzonderlijk blok vaak weer is onder te verdelen in subblokken (vergelijk VI’s en subVI’s). 2. Je maakt het ontwerp van je programma op papier in je waarnemingenboek. Dus niet op de computer. Kost veel te veel tijd.
eind Het kopje is een verplicht onderdeel van ieder blok. Alleen als de titel voor zich spreekt mag je de omschrijving weglaten. In en uit zijn respectievelijk de input- en outputparameters. De body is het eigenlijke programma. Hierin staan alle uit te voeren acties. Een actie kan ook weer een
75
Het opzetten van een project
aanroep van een subblok zijn. In figuur 5.2 is aangegeven hoe je een subblok aanroept.
Figuur 5.4 Blok voor for-loop herhaal met i=0......N-1.
Figuur 5.2 Aanroep subblok gebruik:
dit blok wordt herhaald einde herhaal
In figuur 5.3 is te zien hoe je een keuze maakt.
Figuur 5.5 Blok voor while-loop
Figuur 5.3 Blok voor maken keuze
herhaal
vraag
dit blok wordt herhaald
a>b ja als waar
c = 10
nee c = -10
totdat (of zolang als) aan een bepaalde voorwaarde is voldaan
als niet waar
In figuur 5.4 is het blok voor de for-loop weer gegeven en in figuur 5.5 het blok voor de while-loop
Om je schema overzichtelijk te houden is het zinvol om niet te veel in één blok te willen proppen. Het gebruik van subblokken met duidelijke titels kan daarbij zeer behulpzaam zijn3. De subblokken moet je weer op dezelfde manier tekenen als het hoofdblok, net zoals je subVI’s op dezelfde manier maakt als VI’s. 3. In feite geldt een zelfde uitspraak voor VI’s en subVI’s.
5.3 Het probleem en de uitwerking We kunnen verschillende experimenten verzinnen die met een temperatuurmeting kunnen worden uitgevoerd. Enkele voorbeelden zijn: Het bijhouden van je lichaamstemperatuur. De afkoeling van een kop koffie of thee meten.
76
Meten hoe effectief de isolatie van een een thermostaat-fles is? …
In deze paragraaf zullen we als voorbeeld een project geheel behandelen. Het is de bedoeling dat je de eindopdracht op een
Het probleem en de uitwerking
soortgelijke manier uitvoert, en in je waarnemingenboek de tussenstappen laat zien. Het doel van het voorbeeldproject is het volgen van de temperatuur van een theepot onder een theemuts in de tijd. 5.3.1 Het gebruikersinterview
Het doel van het gebruikersinterview is inzicht te verwerven over het doel van het programma en wel zo gedetailleerd mogelijk. Tevens wil je te weten komen wat er tijdens de uitvoer op het scherm zichtbaar moet zijn. Hoofddoel van het programma: Het volgen van de temperatuur van een hoeveelheid water in de tijd. Details van de in te stellen variabelen en weer te geven resultaten: De temperatuur van het water is tussen de 0 °C en 100 °C. Meetfrequentie: Instelbaar, ≥ eenmaal per 5 seconden. Meetperiode: Er moet worden doorgemeten totdat een bepaalde, instelbare temperatuur bereikt is. Dit kan zowel bij opwarming als bij afkoeling. Het programma moet zelf detecteren of de temperatuur stijgt of daalt. Om een eindige meettijd te garanderen, moet er wel een maximum meetduur worden ingebouwd, bijvoorbeeld 3 uur. Weergave van de meest recente meetwaarde. Weergave van de meetresultaten in een grafiek. Een manier om het programma handmatig te stoppen. Een manier om de metingen te starten, nadat de experiment-parameters zijn ingesteld.
De mogelijkheid om de resultaten als spreadsheet-file op te slaan. De kolomnamen kunnen worden ingesteld. Ook is het mogelijk om commentaar toe te voegen aan dit bestand, bijvoorbeeld om informatie over de hoeveelheid water of het type isolatiemateriaal bij te houden.
5.3.2 Maken van het front-panel
Maak een front-panel met de genoemde elementen en groepeer ze op een logische manier. In figuur 5.6 zie je een afbeelding van het voorbeeld dat wij hebben gemaakt. Je kunt dit voorbeeld zelf bekijken in het VI Front-panel.vi in de folder Temperatuurmeting.
Figuur 5.6 Het front-panel
5.3.3 Kiezen van de meetapparatuur
Het meetsysteem dat we gebruiken, staat beschreven in figuur 4.2. We geven hier een korte samenvatting: De sensor is een NTC weerstand. Omdat we met water werken, moet deze sensor op een geschikte manier worden ingepakt. De signaal conditionering en de digitalisatie vinden plaats in een multimeter. De interface is GPIB of serieel. We hebben dus een multimeter met een interface nodig. Indien beschikbaar, heb-
77
Het opzetten van een project
ben we de voorkeur voor een GPIB interface. 5.3.4 Het Stroomschema
In deze paragraaf laten we in figuur 5.7 alleen het hoofdblok van het stroomschema zien.
Figuur 5.7 Hoofdblok voorbeeldprogramma temperatuurmeting
start titel: auteur: omschrijving:
thee -temperatuur meter Maarten Meten van de temperatuur van een hoeveelheid water totdat een van te voren ingestelde temperatuur is bereikt.
input: output: gebruik:
open verbinding met het meetinstrument initialisatie user interface
gebruik: herhaal: gebruik: totdat:
doe metingen en verwerk geklikte knoppen
gebruik: stopcondities
gebruik:
verbreek verbinding
gebruik:
opslaan meetgegevens
gebruik:
verwerk foutmeldingen
eind
5.3.5 Handige hulponderdelen
In de voorafgaande paragraaf is de structuur van het programma al uitgebreid besproken. In deze paragraaf zullen we enkele van de door ons geschreven bouwstenen behandelen, alsmede enkele van de standaard VI’s om taken voor ons programma uit te voeren4.
78
In het VI Main Blocks.vi tref je het front-panel aan met de structuren voor de hoofdblokken. In Temperatuurmeting.vi tref je het uiteindelijke programma aan. In dit programma hebben we uiteraard drivers voor een specifiek instrument gebruikt, in ons geval de drivers voor de Keithley 192. In het initialisatie blok tref je VUDS Initialize.vi aan. Dit VI maakt deel uit van het VUDS, ofwel het Vrije Universiteit Data-storage Systeem. Deze set VI’s zorgt voor een efficiente opslag van de meetresultaten. Het gebruik behelst de volgende stappen: VUDS Initialize.vi initialiseert het gebruik. Je moet dit VI precies éénmaal aanroepen bij het uitvoeren van je programma. Je moet opgeven hoeveel kanalen je wilt gebruiken. Een kanaal komt overeen met een array. In ons geval reserveren we één kanaal: alleen voor de temperaturen. VUDS Store.vi voegt één meetpunt toe aan het gespecificeerde kanaal. Net als bij arrays, beginnen de kanaal nummers te tellen bij 0. Het eerste kanaal heeft dus nummer 0, het tweede 1 tot en met het aantal kanalen min één. VUDS Read.vi leest het gehele kanaal en slaat dat op in een gewoon array. Je hebt twee mogelijkheden: het hele array, of alleen het gedeelte dat zich nog in het geheugen bevindt.5 VUDS (Save &) Kill.vi sluit de sessie weer af. Omdat na het gebruik van dit VI de gegevens niet meer beschikbaar zijn in het programma, moet je dit VI pas gebruiken aan het eind van het pro4. Een aantal van de hier beschreven VI’s zijn veel algemener van toepassing dan alleen voor dit voorbeeld. 5. De VUDS slaat de gegevens op de harde schijf. Er is echter een buffer-geheugen. Als je alleen deze buffer opvraagt, versnelt dit de procedure.
Het probleem en de uitwerking
gramma, als je de gegevens niet meer nodig hebt. Dit VI heeft tevens de mogelijkheid om de gegevens op een andere plaats op de harde schijf op te slaan, zodat ze later met een data-analyse pakket gelezen kunnen worden. Het VUDS kan je vinden in VUDS.llb. In deze library vind je nog meer VI’s, al zijn de belangrijkste hier genoemd. Lees de help voor informatie over de verschillende VI’s. In het hoofdprogramma vind je het codefragment uit figuur 5.8. Dit is de which button structuur (eerder behandeld in figuur 2.23 op pagina 42).
Figuur 5.8 Which Button?
instelt voor een weerstandsmeting en de weerstand vervolgens meet. De gemeten waarde wordt omgezet van kΩ naar Ω. In combinatie met dit VI tref je OhmCelsius (NTC).vi aan. Dit VI voert de omrekening van de weerstand in een temperatuur uit. Hierbij wordt ervan uitgegaan dat de sensor een NTC-weerstand is. De weerstand van een NTC-weerstand is gerelateerd aan de temperatuur volgens vergelijking 5.1. R(T) = R 0°C e –αT
(5.1)
In deze vergelijking is de temperatuur T gegeven in °C. Deze vergelijking kan geïnverteerd worden. Voor de uiteindelijke omrekening moeten de materiaal constanten R 0°C en α bekend zijn. Via een apart dialoogvenster kun je deze constanten invullen. Dit dialoogvenster wordt afgehandeld door Parameters van Weerstand.vi. Wij hebben al uitgezocht welke parameters bij deze weerstanden horen. Voor een meer officieel programma moet je een kalibratie-routine inbouwen. Het VI Terminatie.vi bepaalt uit de verschillende meetwaarden, de error en de meettijd of het programma gestopt moet worden. is een VI dat een zoeken-vervang operatie op een string kan uitvoeren. In dit programma wordt het VI gebruikt om nieuwe regels te voorzien van een ‘#’ aan het begin. Het is echter geschikt voor algemener gebruik. Je kunt er willekeurige strings mee doorzoeken en veranderen. Dit is een voorbeeld van een VI dat al eerder in een ander programma is gebruikt. Nadat de regelovergangen voorzien zijn van hekjes, wordt het kopje voor de spreadsheet-file geschreven. Dit doen we Clean String.vi
Met de which-button structuur kan je op eenvoudige wijze uitvinden welke knop door de gebruiker op het front panel is ingedrukt. Bovendien kun je op deze manier een status bijhouden. Het getal dat uit de zoek-functie tevoorschijn komt, sluit je aan op de conditie terminal van een case-statement. In de verschillende velden kun je dan op de knoppen reageren. is een collectie van VI’s die een Keithley 192 correct
K192 Meet Weerstand.vi
79
Het opzetten van een project
met de LabVIEW functie Write Characters to File.vi. Na de kop volgen de meetresultaten. Deze worden geschreven volgens de methode uit paragraaf 3.4.1, figuur 3.15 op pagina 56. Met de standaard LabVIEW tijd functies is het mogelijk om een meting met een regelmatig tijdsinterval te laten plaatsvinden, zoals we eerder hebben gedaan. Als een dergelijke wacht-lus actief is, dan reageren knoppen op het front-panel niet. Er is echter ook een andere timer-functie beschikbaar binnen LabVIEW (Wait For Front Panel Activity.vi), die wacht tot een bepaalde tijd verstreken is òf totdat een activiteit op het front panel (een knop, een getal, ...) plaatsvindt. Hiermee voorkom je onnodig wachten. Kijk hier echter mee uit wanneer je met data-acquisitie bezig bent om timing fouten te voorkomen. De LabVIEW functie Simple Error Handler.vi zorgt voor het meedelen van eventuele fouten aan de gebruiker. Dit is een standaard LabVIEW functie. In het programma hebben we nog een aantal eigenschappen van LabVIEW gebruikt die niet eerder behandeld zijn. De belangrijkste is het gebruik van shift-registers die geen begin-waarde hebben gekregen. Zolang het VI zich in het geheugen van de computer bevindt, onthouden deze shift-registers de waarde die ze hadden tijdens de laatste keer dat je het VI uitvoerde6. 5.3.6 Testen en controleren
Als je alle blokken hebt geschreven en afzonderlijk getest, is het tijd om de blokken samen te voegen. 6. Een VI blijft in het geheugen zolang het hoofdprogramma met dit VI geopend is.
80
Probeer of het programma goed werkt. Als je geen problemen tegenkomt, kan je testen of het programma goed reageert op fouten (De Error cluster). Je kunt nu de lijst met eisen nalopen om te zien of je geen eisen hebt overgeslagen. Waarschijnlijk kom je tot de ontdekking dat je extra mogelijkheden hebt ingebouwd, omdat die het gebruik van het programma vereenvoudigen. Als deze veranderingen zeer ingrijpend zijn, dan moet je vooraf overleggen met de gebruiker of deze wijzigingen werkelijk noodzakelijk zijn. Als het programma niet goed werkt, dan moet je eerst uitzoeken welk van de blokken niet goed werkt. Vervolgens kan je met de technieken die beschreven zijn in appendix A de fouten opsporen. Hierna moet je weer testen of er nog fouten in het programma zitten. 5.3.7 Check-list
Tot slot nog een paar kleine puntjes. De lijst met stappen die aan het begin van dit hoofdstuk staat, is algemeen geldig. De punten die hier volgen, zijn specifiek gericht op LabVIEW. Zorg ervoor dat alle connectoren goed verbonden zijn, zodat je de VI’s kunt gebruiken als subVI. In paragraaf 1.6 “Een VI als subVI gebruiken” op pagina 24 kan je vinden hoe je dit moet doen. Documenteer je VI’s. Klik op VI Properties (ctrl+I) in het File-menu en selecteer de categorie ‘Documentation’. Hier kun je een korte beschrijving toevoegen aan je VI. Als je deze beschrijvingen toevoegt, dan wordt het veel eenvoudiger om een bepaald VI te vinden als je het later opnieuw wilt gebruiken.
Het probleem en de uitwerking
De documentatie is nog veel belangrijker als je wilt dat anderen jouw VI’s gebruiken. Een goede naam van het VI en goede documentatie zijn dan onontbeerlijk. Maak het leven van jezelf en je
medestudenten gemakkelijker: Documenteer! 7 7. De documentatie is een verplicht onderdeel van de eindopdracht.
81
Het opzetten van een project
82
Eindopdracht
De laatste opdracht van de module is het zelf schrijven van een programma om een experiment te besturen. In het experiment maak je gebruik van een geluidskaart, microfoon en/of koptelefoon. Je voert deze opdracht in paren uit. Bij de beoordeling van deze opdracht zal worden gelet op de volgende zaken: Het uitvoeren van de stappen zoals die zijn uitgelegd in hoofdstuk 5, “Het opzetten van een project”. Extra nadruk wordt gelegd op het kiezen van de juiste meetprocedures: worden er bijvoorbeeld niet te weinig of juist te veel samples genomen? De documentatie van je werk: de commentaren in de ‘Documention’ vensters in de VI Properties moeten helder zijn,
6
zodat een ander je SubVI’s direct kan gebruiken. Ook je icons moeten een relatie hebben met de taak die ze uitvoeren. De beoordeling geschiedt aan de hand van een verslag en het geschreven programma. Het verslag is een uitgewerkt logboek van de discussie met de gebruiker, de motivatie van de keuze van de meetinstrumenten en het uitgewerkte stroomschema. In het verslag moet ook een grafiek van je uiteindelijke meetgegevens staan. Een voorbeeldverslag tref je aan in paragraaf 6.2. Lees dit goed door! Hierin staan belangrijke aanwijzingen waar zowel het verslag als het te schrijven programma aan moeten voldoen!
83
Eindopdracht
Voordat je met het daadwerkelijk programmeren begint, moet je het voorbereidende werk met een assistent bespreken.
Op dat moment hebben we de mogelijkheid om je te waarschuwen als je te veel, of erger, juist te weinig probeert te doen.
6.1 De opdrachten Je kunt kiezen tussen twee eindopdrachten. 6.1.1 Een hoortest programma
Maak een hoortest programma waarmee een willekeurig persoon kan controleren of zijn gehoor nog goed functioneert. Dit kan bijvoorbeeld met tonen bestaande uit een enkele frequentie, waarbij je het volume van laag naar hoog (automatisch) regelt of met frequenties of spraak in combinatie met een ruistoon. Maak hiermee een audiogram van het linkeroor en/of het rechteroor. 6.1.2 Het aantonen van Tartini-tonen
Maak een programma waarmee de gebruiker m.b.v. verschillende instelbare frequenties Tartini-tonen kan ‘horen’. Geef ook de mogelijkheid te testen op de aanwezigheid van Tartini-tonen, door het genereren van een derde toon met instelbare frequentie. Deze toon kan samen met een Tartinitoon zwevingen maken die dan alleen in je hersenen hoorbaar zijn. Zorg voor een gebruikersvriendelijke user interface (front panel), zodat een iemand anders dit verschijnsel zelf kan onderzoeken. Toelichting: Twee tonen met verschillende frequenties ( f 1 en f 2 )en gelijke intensiteit veroorzaken zwevingen met een frequentie van
84
f zweving = f 2 – f 1 . Als deze frequenties weinig van elkaar verschillen, dan is de langzame zwevingsfrequentie goed hoorbaar en met bijvoorbeeld een microfoon te meten. Daarnaast worden in je hersenen tonen aangemaakt die voldoen aan f tartini = f 1 – k × ( f 2 – f 1 ) met k een geheel positief getal. Deze frequenties worden Tartini-tonen genoemd. Bijvoorbeeld met tonen van 1000 en 1100 Hz kun je Tartini-toon in je hersenen horen bij 900 Hz, 800 Hz etc. .. .In tegenstelling tot de zwevingen zijn de Tartini-tonen niet meetbaar met een microfoon. Het bestaan van de Tartini-tonen kun je toch aantonen door een toon met een andere frequentie te genereren die dichtbij de frequentie van de Tartini-toon ligt (in dit voorbeeld bij 902 Hz of 802 Hz.). Omdat de tartini-tonen in je hersenen worden gemaakt kan je deze zwevingen horen maar niet meten met een microfoon. (Hoe zwevingen ontstaan wordt beschreven in de laatste onderstaande weblink). Voor meer informatie zie bijvoorbeeld: http://www.s3.kth.se/sip/courses/ 2E1390/2004/Norvell_Olsson/sp/ eng.html www.phys.unsw.edu.au/jw/beats.html.
Voorbeeldverslag
6.1.3 Algemene eisen
Om de kwaliteit en inhoud van de verschillende programma’s gelijkwaardig te houden moeten de volgende elementen in je eindopdracht voorkomen. Het genereren van een uitgangssignaal via de geluidskaart. (Gebruik van een koptelefoon). Meetresultaten worden weergegeven in een grafiek (bv. audiogram), of bij het waarnemen van de Tartini-tonen worden de ingestelde frequenties waarmee tartini-tonen goed hoorbaar zijn weergeven in een tabel. Het uitgangssignaal moet stopgezet kunnen worden en/of een instelbare tijdsduur aan kunnen staan Het opslaan van de meetresultaten in een spreadsheet bestand. Het programma moet tussentijds gestopt kunnen worden. Het programma moet fouten (LabVIEW errors) afvangen, zodat het programma op een juiste manier stopt.
X
TRA
Extra Eigen bijdrage
Alhoewel de eindopdracht in koppels wordt uitgevoerd, is het uitdrukkelijk de bedoeling dat iedere student tenminste een subVI zelf maakt en documenteert.
6.2 Voorbeeldverslag Onderstaand tref je een voorbeeldverslag aan, waarbij cursief extra uitleg wordt gegeven wat we in bepaalde onderdelen van je verlangen. 6.2.1 Titel
Verzin een passende titel en vul onderstaande lijst in met je eigen gegevens. Doe dit op een apart blaadje voorop je verslag Naam: Je naam. Samengewerkt met: De naam van je partner.
85
Eindopdracht
6.2.2 Inhoudsopgave
Hierin komen de kopjes (eventueel ook subkopjes) van de diverse onderdelen van je verslag met het bijbehorende paginanummer. Het verslag dient minimaal uit de volgende onderdelen te bestaan: Eisen waaraan het programma moet voldoen Onderdelen die nodig zijn om aan alle eisen te voldoen De userinterface Uitvoer van het programma Conclusies Bijlage Stroomdiagram 6.2.3 Eisen waaraan het programma moet voldoen
Dit zijn de minimale eisen, waaraan je uiteindelijke programma moet voldoen. Als je jezelf extra eisen stelt die passen bij jouw experiment, dan is dat natuurlijk uitstekend. Zie paragraaf algemene eisen 6.1.3. 6.2.4 Onderdelen die nodig zijn om aan alle eisen te voldoen
Hier moet je een analyse geven van wat er nodig is om aan de eisen te voldoen. Is de signaalsterkte aangepast bij verschillende tonen en hoe is de afhankelijkheid van deze aanpassing. 6.2.5 De userinterface
Een afbeelding van het front panel van je programma, samen met eventuele opmerkingen. Hier hoort ook een lijst met daarin de gebruikte apparatuur (Bijvoorbeeld de geluidsklaart, etc.). 6.2.6 Het stroomdiagram
Wij raden sterk aan om het stroomdiagram te maken vóór/tijdens het schrijven van het programma. Doe het ook niet op de computer (kost meer tijd dan je denkt), maar met potlood op papier. Voor alle duidelijkheid: elke student levert één volledig stroomdiagram van zijn eigen geschreven subVI. Het stroomdiagram van het hoofdprogramma mogen jullie samen doen. Voeg deze bladen aan het einde van je verslag toe als bijlagen. In deze paragraaf geef je alleen aanvullend commentaar op het stroomdiagram en voor het stroomdiagram zelf moet je dus verwijzen naar de bijlage.
86
Inleveren eindopdracht
6.2.7 Uitvoer van het programma
Uiteraard moet je je programma goed testen. Niet alleen op eventuele programmeerfouten, maar je moet vooral ook nagaan of het programma voldoet aan de eisen die je van tevoren gesteld hebt. Na een testmeting met behulp van het programma kun je de resultaten bijvoorbeeld in een audiogram afbeelden. Opmerking: de grafiek moet voldoen aan de eisen zoals je die in het MNW 2 practicum geleerd hebt. Zorg ervoor dat de assen een label en een eenheid hebben en dat er bij de grafiek staat wat er gemeten is.
6.2.8 Conclusies
Het is de bedoeling dat je hier je eigen programma bespreekt, of aan alle eisen is voldaan, aan welke eisen niet is voldaan in het programma -- en vooral: waarom niet. Geef een waarde-oordeel. Wees kritisch! Je kunt hier ook bespreken welke eigenschappen handig zouden zijn om aan een volgende versie toe te voegen. Aarzel niet om hier ook te vermelden welke ‘features’ je bij een volgende versie weg zou laten en waarom.
6.3 Inleveren eindopdracht 6.3.1 Wat moet je inleveren en hoe
1. Je verslag, gemaakt volgens de instructies uit de vorige paragraaf. Dit mag op één van de volgende manieren: Op papier in het postvakje van de assistent. Per e-mail aan de assistent. 2. Je programma. Bewaar je programma in een VI-library (§3.6.2) en mail deze file. In deze mail moet dezelfde informatie
staan die je ook op de voorkant van je verslag hebt staan. Vermeld ook de naam van het VI waarmee begonnen moet worden om het programma te testen, met andere woorden: de naam van je hoofd of toplevel-VI. 3. De aantekeningen die je tijdens het maken van het programma hebt gemaakt en de papieren van de bespreking die heeft plaatsgevonden tijdens de eindopdracht (via postvak). Deze papieren krijg je terug.
87
Eindopdracht
6.3.2 Bespreking met assistent
Zoals in het tijdschema van Appendix E is te zien vindt de nabespreking ongeveer binnen één a twee weken na inlevering plaats. Tijdens het uitvoeren van de eindopdracht worden door de assistent individuele afspraken voor de nabespreking gemaakt. Mocht het niet lukken om één en ander op tijd in te leveren, dan dien je zo spoedig mogelijk en voor de inleverdatum, hierover contact op te nemen met de assistent. 6.3.3 Afronden module
verslag moet verbeteren. De gewijzigde versie moet binnen twee weken besproken zijn. Alleen in zeer speciale gevallen kan hier na voorgaand overleg met de assistent van worden afgeweken. In geval zonder overleg en acceptabele reden de deadline van dinsdag 2 juni wordt overschreden zal dit leiden tot puntenaftrek of tot het geheel over moeten doen van de module. 6.3.4 Info assistent
naam e-mail kamer
Joris Snellenburg [email protected] T 1.12
De nabespreking kan opleveren dat je nog het één en ander aan je programma of je
6.4 En verder… Nadat je de eindopdracht hebt afgerond, hopen we dat je voldoende van LabVIEW weet om zelfstandig verder te werken aan het opbouwen van experimenten in het MNW 2 en 3 practicum. LabVIEW is een uitgebreid pakket, en deze module is dan ook niet meer dan een begin. Het natuurkunde practicum heeft verschillende boeken die je verder kunnen helpen met LabVIEW:
88
De handleidingen van National Instruments. Deze boeken bevatten alle formele omschrijvingen van alle functies van LabVIEW. LabVIEW Graphical Programming van Gary W. Johnson. Dit boek bevat vele handige technieken voor het schrijven van programma’s, zoals which-button structuren, state-machines, ...
Debugging
Dit is een stap-voor-stap handleiding voor het opsporen van bugs. Eerst een opmerking vooraf: Het vinden van bugs vereist veel concentratie. Als je op het moment dat je wilt beginnen met het opsporen van bugs al moe bent, kan het zeer lang duren voordat je de fout vindt. Als je echter op een ander moment gaat zoeken, heb je de fout vaak snel gevonden. Zorg ervoor dat je goed uitgerust ben als je wilt beginnen met het opsporen van fouten.
A
Het vinden van fouten wordt sterk vereenvoudigd als je tijdens het schrijven zinvol commentaar hebt toegevoegd aan je VI’s. Er zijn twee problemen te onderscheiden bij het programmeren in LabVIEW: u Fouten die een gebroken run-arrow opleveren. u Fouten die leiden tot een verkeerd resultaat, bijvoorbeeld een programma dat spontaan stopt.
A.1 Gebroken run-arrow Dit zijn syntactische fouten. Hiervoor is een eenvoudige remedie te vinden.
1. Klik op de run-knop.
89
Debugging
2. Lees de beschrijving van de fout. Dit geeft je al enige indicatie over het probleem. 3. Dubbel-klik op de foutmelding. De plaats van het probleem wordt nu geopend.
De indicatie van de fout, tezamen met de plaats waar deze fout optreedt, moet voldoende informatie geven om het probleem op te lossen. Mocht je de mededeling niet begrijpen, vraag dan aan de assistent wat het probleem is.
A.2 Ongewenste resultaten Ongewenste resultaten kunnen variëren van een programma dat helemaal stopt, tot iets subtiels als wel een antwoord, maar net niet correct. In het eerste geval is het duidelijk dat er een fout in het systeem aanwezig is, in het tweede geval vergt het opsporen veel meer tijd en kan je nooit garanderen dat een dergelijke fout afwezig is. A.2.1 Het lokaliseren van het probleem
Het eerste probleem is het vinden waar het mis gaat. Hiervoor zijn verschillende strategieën: u Gebruik het programma totdat je ziet dat de bug optreedt. Als je op een bepaalde knop klikt en het programma loopt vervolgens vast, dan weet je dat in de actie achter die knop het probleem schuilt. u Zet execution highlighting aan. Volg het programma totdat je het probleem hebt gezien. u Bij harde problemen kan je met een halfstep refinement methode werken. plaats halverwege het programma een breakpoint met het break-point gereedschap. Als het programma vastloopt
90
voordat het breakpoint is bereikt, dan weet je dat de fout voor de breakpoint optreedt, anders ligt de fout na het breakpoint. Op deze manier kan je doorgaan totdat je de fout hebt ge-vonden. u Subtielere problemen zal je moeten ‘steppen’. Door met de ‘doe stap’ knoppen het VI uit te voeren, kan je alle uitkomsten narekenen en controleren. Wees hierbij kritisch, denk niet dat een bepaald onderdeel wel correct zal zijn. Omdat subtielere problemen vaak over het hoofd worden gezien, zou je eigenlijk het gehele programma moeten controleren. Dit is vaak ondoenlijk. Controleer in ieder geval de VI’s waarin veel gerekend wordt. Dit zijn VI’s waar je gemakkelijk kleine foutjes maakt. u Als je slechts een vaag vermoeden hebt waar de bug zit, zet dan voor de fout een breakpoint en stap vanaf dat moment door het VI. Als een fout slechts optreedt bij een bepaalde waarde van een variabele, dan kan je een test inbouwen of die waarde optreedt. Zodra dat gebeurt, kan je het VI laten stoppen. Figuur A.1 laat zien hoe je dit zou kunnen doen.
Overige problemen
Figuur A.1 Conditional Breakpoint
Vergeet niet om deze (conditionele) breakpoints weer te verwijderen. Je kunt hiervoor de zoekfunctie gebruiken. In het project menu bevindt zich het item Find, en dat doet wat het belooft. Het zoeken naar breakpoints vind je in de objects mode, onder het popup-menu item Others. A.2.2 Het oplossen van problemen
Als je weet waar de bug zit, is het vaak niet zo moeilijk om het probleem op te lossen. Er zijn verschillende mogelijkheden: u De fout zit in een driver van het data acquisitie instrument. Vraag de assistent hoe dit probleem moet worden opgelost. Ga nooit zelf aan een driver knutselen!
Zorg ervoor dat je de driver op de correcte manier gebruikt. u De fout zit in een VI dat je niet zelf hebt geschreven. Lees de documentatie of je het VI op de juiste manier gebruikt. Als je ervan overtuigd bent dat je het VI op de juiste manier hebt aangesloten, vraag dan de schrijver of dit een bekend probleem is. u Je hebt zelf een fout gemaakt, bijvoorbeeld in een berekening. Schrijf deze berekening uit als een mathematische formule. Splits deze formule in eenvoudige brokken. Maak op papier een tekening hoe de code van het VI moet werken. Vergelijk deze oplossing met de code die je al hebt geschreven en verwijder de verschillen. Sommige bugs zijn moeilijk op te lossen omdat de code lijkt op spaghetti: een wirwar van touwtjes. Ook kan het voorkomen dat er te veel gebeurt in een VI om het overzicht nog te bewaren. In dat geval moet je het VI splitsen in meerdere subVI’s. Een enkele keer kan het verstandig zijn om geheel opnieuw te beginnen. Aarzel niet te lang voordat je die stap neemt.
A.3 Overige problemen Als een programma onder LabVIEW stopt met een foutmelding die zegt Memory Full, dan is er een probleem met het geheugen. Je probeert met teveel gegevens tegelijkertijd te werken. Indien mogelijk moet je je gegevens in kleinere brokken verwerken. Timeout problemen zijn nog veel lastiger op te sporen. Als je aan het debuggen bent, gaat alles veel langzamer en is de
timing meestal geen probleem. Bij normale uitvoer van het programma, volgen de acties elkaar veel sneller op en kunnen er problemen ontstaan. Omdat dit soort problemen zich meestal op driver niveau afspelen, zal je deze problemen tijdens de module niet tegenkomen. Een ander probleem treedt op als acties te lang duren. Dit kan ook veroorzaakt worden door een ander programma dat in
91
Debugging
de achtergrond draait, zoals bijvoorbeeld Internet Explorer.
92
Data-types
LabVIEW kent verschillende data-types. Er zijn grofweg vijf types te onderscheiden: getallen, booleans, tekst, samenge-
B
stelde en referentie types. Elk van de types wordt hieronder behandeld, inclusief Do’s and Don’ts.
B.1 Getallen LabVIEW kent een serie types getallen. Je kunt het type van een getal of een array aanpassen door te rechtsklikken op het
control of de terminal en uit het representation menu het gewenste type te kiezen.
93
Data-types
Figuur B.1 Numerieke data-types
Figuur B.2 Floating point getallen teken-bit
Floating Point Signed Integer Unsigned Integer Complex Floating Point
getal
exponent
In plaats van ons decimale systeem wordt in de computer een binair systeem gebruikt; verder werkt het systeem vergelijkbaar met het decimale systeem waar je aan gewend bent. Het bereik van de getallen is weergegeven in figuur B.3.
Figuur B.3 Bereik van Floating Point B.1.1 Floating Point Getallen
Floating Point getallen zijn getallen die bedoeld zijn voor het weergeven van niet gehele getallen. Dit kan niet exact gebeuren in een computer, en daarom moet je uitkijken met de resultaten van deze berekeningen. Ze worden opgeslagen volgens het systeem uit figuur B.2
94
–max
–min 0 +min
Geldige getallen
+max
Geldige getallen Geldig getal
Zoals je ziet is er een gebied rond nul waar getallen niet kunnen worden weergegeven en is het bereik eindig. Door verschillende aantallen bits voor de verschillende velden te gebruiken, ontstaan de verschillende varianten uit tabel B.1.
Getallen
Tabel B.1 De eigenschappen van Floating Point getallen Eigenschap
Single
Double
Extended
Afkorting Aantal decimale cijfers
SGL 8
DBL 16
EXT 19
Epsilona
1.2 ×10
Maximumb
3.4 ×10
Minimumc
1.4 ×10
Aantal bits voor geheel Aantal bits voor getal
32 23 8
Aantal bits voor exponentd
–7
2.2 ×10
38
1.8 ×10
– 45
4.9 ×10
– 16
2.2 ×10
308
1.18 × 10
– 328
9.8 ×10
64 52 11
– 16 4932
– 324
128 113 15
a. Kleinste waarde waarvoor geldt: 1 + ε ≠ 1 . b. Absoluut grootste getal. c. Absoluut kleinste getal. d. Blijft over: één teken-bit.
B.1.2 Integers (signed en unsigned)
Gehele getallen (integers) worden gebruikt voor tellers en dergelijke. De computer
kan zeer goed overweg met dit type getallen. Er is één veld waarin het getal staat. Er zijn twee smaken: met teken (zowel positief als negatief) en zonder (alleen positief, maar met groter bereik).
Tabel B.2 De eigenschappen van integer getallen Eigenschap
Quad
Quad
Long
ULong
Int
UInt
Byte
UByte
Signed
Un-
Signed
Un-
Signed
Un-
Un-
signed
Signed
signed Aantal Bits
Afkorting Minimum Minimum Maximum Maximum
64 I64 – 1 × 10
19
– 2 63 1 × 10
64 U64 0
32 I32
0 19
2 63 – 1
signed
2 × 10
19
2 64 – 1
signed
–2147483648
32 U32 0
16 I16 – 32768
16 U16 0
8 I8 –128
8 U8 0
– 2 31
0
– 2 15
0
–27
0
2147483647
429496729 5
32767
65535
127
255
2 31 – 1
2 32 – 1
2 15 – 1 2 16 – 1 2 7 – 1 2 8 – 1
B.1.3 Complexe Getallen
Precisie zijn hetzelfde als bij de gewone floating point getallen.
Twee floating point getallen kunnen worden gecombineerd tot één complex getal.
95
Data-types
B.2 Booleans Booleans kunnen twee waarden hebben: True of False. Een control of een indicator heeft de waarde False als ze op het frontpanel wordt geplaatst. Omdat het bereik van een Boolean niet groot is, volgen er nu geen tabellen met minimale en maximale waarden. Een Boolean control heeft verschillende uitlees-mogelijkheden, zie figuur B.4:
Figuur B.4 De mechanische acties Switch when released Switch when pressed Latch when pressed
Switch until released Latch until released Latch when released
Switch when pressed. De waarde van de boolean verandert meteen zodra je op de knop hebt geklikt. De waarde van de Boolean blijft op de ingestelde waarde staan, ongeacht het aantal keren dat LabVIEW de boolean leest. Switch when released. De waarde van de boolean verandert zodra je de muisknop binnen het control loslaat. Dit is vergelijkbaar met de reactie van checkboxes in een dialoogvenster.
Switch until released. De waarde van het control wordt veranderd, zolang je de knop ingedrukt houdt. Je kunt dit vergelijken met een deurbel1. Latch when pressed. De boolean wordt éénmaal uitgelezen, nadat je hem hebt ingedrukt. Daarna gaat de knop weer terug naar zijn begin-waarde, ongeacht of je hem nog ingedrukt houdt. Latch when released. Als je het control loslaat, leest LabVIEW de waarde van de knop éénmaal uit en zet de waarde van de boolean weer terug. Dit is het gedrag van een normale button in een dialoogvenster. Latch until released. Vergelijkbaar met switch until released, alleen heb je de zekerheid dat de waarde van het control tenminste éénmaal wordt gezien door LabVIEW2.
Nu je weet welke acties beschikbaar zijn, is het misschien aardig te weten hoe je dit kunt instellen. Zoals gewoonlijk via het rechts-klikken op de Boolean control. Je vindt daar een sub-menu met de naam Mechanical Action, waar het gewenste effect kan worden ingesteld. 1. Mits niet van het ding-dong type 2. In tegenstelling tot switch until released waar het indrukken tussen twee lees-acties van LabVIEW kan vallen.
B.3 Tekst Tekst in een computer wordt opgeslagen als een array van bytes. Iedere waarde van een byte wordt omgezet in een bepaalde
96
letter. Er is een aantal opties voor de weergave van strings. Zie de context help voor details.
Samengestelde Types
B.4 Samengestelde Types Samengestelde types of clusters zijn een groepering van gegevens die gezamenlijk door één touwtje vervoerd worden. Elk type kan in een cluster worden geplaatst, zelfs andere clusters. Er zijn echter geheugenproblemen verbonden met het gebruik van zeer complexe types in een cluster. Als je een array van een cluster met daarin weer een array (of een string) maakt, dan kan LabVIEW niet goed bijhouden wanneer er iets gewijzigd is. Dit heeft tot gevolg dat er mogelijkerwijze onnodige
kopieën worden gemaakt. Dat dit gevolgen heeft voor de snelheid en het geheugengebruik behoeft geen betoog. Met de cluster-tools kun je de onderdelen van een cluster samenstellen en weer uiteenrafelen.Zie paragraaf 3.1 Een standaard cluster is het Error-cluster. Dit geeft aan of er een fout is opgetreden, en zo ja welke en waar. Dit is uiteraard een uitstekend hulpmiddel bij het oplossen van storingen.
B.5 Referentie Types Het laatste type van LabVIEW is een referentie. Dit kan een nummer zijn dat verwijst naar een file op de harde schijf, een nummer dat verwijst naar een meetinstrument of weer iets anders. De nummers zijn verwijzingen naar tabellen in LabVIEW waar de daadwerkelijke gegevens zijn opgeslagen. Enkele voorbeelden van dergelijke nummers zoals je die zou kunnen tegenkomen in programma’s die wij hebben geschreven vind je in tabel B.3.
Tabel B.3 Referentie types Type
Omschrijving
File
Een verwijzing naar een open bestand Een verwijzing naar een meetinstrument
VISA Control
Een verwijzing naar een conrol die configuratie-informatie kan bijhouden
97
Data-types
98
Format String Codes
De format specifiers van de string functies beginnen met het %-teken en eindigen met een letter. In tabel C.1 vind je een beknopte uitleg van het gebruik van deze codes. Een conversieopdracht heeft altijd de volgende vorm: %[opties][breedte][.precisie]letter
Tabel C.1 De format string Teken % – +
Betekenis Plaats waar je een getal invoegt. Links uitlijnen binnen de veldbreedte. [optioneel] Voor getallen wordt het teken altijd geplaatst, ook als getal positief is. [optioneel]
C
Tabel C.1 De format string (Continued) Teken ^
Betekenis Als er een exponent wordt gebruikt, dan is de exponent altijd een veelvoud van 3 (1000x). [optioneel] 0 Als er links van een getal ruimte over is, dan worden er nullen ingevoegd, in plaats van spaties. [optioneel] breedte De totale ruimte die het getal mag innemen. [optioneel] precisie De ruimte die de getallen achter de komma mogen innemen. [optioneel] letter Dit bepaalt hoe het getal in de string wordt geplaatst. De mogelijkheden zijn:
99
Format String Codes
Tabel C.1 De format string (Continued) Teken
Betekenis d decimale integer x hexadecimale integer o octale integer b binaire integer f
floating point, zonder exponentiële notatie e floating point, altijd met exponentiële notatie p floating point, in SI notatie g floating point, indien nodig met exponentiële notatie s een string c een character
Tabel C.2 Speciale karakters Code Betekenis \r carriage return \t tab \s space \n \b \f \’ \xx \\ %lf %%
newline backspace formfeed single quote hexadecimal ASCII number \ double precision input %
Er zijn ook speciale, niet afdrukbare karakters. Hieronder vallen tabs, regelovergangen en het procent-teken. In tabel C.2 vind je een overzicht van deze karakters en hun codes
Movie Strings Instructie Strings geeft je een inleiding in het manipuleren van teksten in LabVIEW.n
100
LabVIEW instellingen
D
D.1 Instellingen
t.b.v. de cursus Programmeren en Simuleren (module LabVIEW en Experiment-automatisering) Een aantal instructievideo’s in hoofdstuk 1 gaan uit van de standaard instellingen in LabVIEW 7.1. Dit betekent o.a. dat de Controls Palette en de Functions Palette in de Express view staan. Figuren in de handleiding LabVIEW en Experiment-automatisering en in instructievideo’s uit hoofdstuk 2 en 3 laten de Palettes zien in een ‘Category (standard) view. Het is aan jou met welke LabVIEW instellingen je verder wilt gaan. Wil je de standaardinstellingen wijzigen dan zul je de volgende instructies moeten opvolgen.
Aangezien veel standaardinstellingen met versie 8.2.1 veranderd zijn en voor verwarring kunnen zorgen, zul je een aantal instellingen in LabVIEW moeten aanpassen. Je zult misschien niet alles direct begrijpen, maar we adviseren je de anders zo broodnodige kritische studiehouding even opzij te zetten en eenvoudigweg de aanwijzingen op te volgen...
Stap 1: Start LabVIEW. Ga naar het Start menu en kies 'National Instruments LabVIEW 8.2.1' uit het Programs menu. Ga
101
LabVIEW instellingen
naar menu Tools en kies Options. Zie figuur D.1. Je krijgt nu een scherm als in figuur D.2.
Figuur D.1 Het options menu item
Figuur D.2 Start window Options
102
Instellingen t.b.v. de cursus Programmeren en Simuleren (module LabVIEW en Experiment-autom-
Stap 2: Kies uit de category Block Diagram. Verander de instelling. Figuur D.3 geeft aan hoe dit scherm eruit moet zien.
Wees zorgvuldig: alle instellingen moeten correct zijn om problemen te voorkomen!
Figuur D.3 Instellingen Block Diagram aanpassen
Stap 3: Er zijn nog twee van zulke schermen die wat aanpassingen behoeven. Verander de instellingen. Selecteer daartoe eerst category 'Alignment Grid'. Verander de instellingen zoals aangegeven in
figuur D.4: 'Show front panel grid' moet uitgeschakeld worden.
103
LabVIEW instellingen
Figuur D.4 Alignment Grid uitzetten
Stap 4: Kies tenslotte category 'Controls/Functions Palettes'. Verander daar de Format van 'Category (Icons
Figuur D.5 Palette View aanpassen
104
and text)' in 'Category (Standard)'. Het scherm ziet er dan uit zoals in figuur D.5.
Instellingen t.b.v. de cursus Programmeren en Simuleren (module LabVIEW en Experiment-autom-
Het zorgvuldig doorvoeren van bovenstaande wijzigingen gaat je een hoop kopzorgen verderop in de module schelen. Als je zeker bent dat je de wijzigingen succes-
vol hebt toegepast, kies dan Ok. Sluit het LabVIEW programma af Je bent nu klaar om met de module te beginnen!
105
LabVIEW instellingen
106
Tijdschema
E
Tabel E.1
Tijdschema Toegepaste Informatica MNW 2010/2011, module 2 Experiment-automatisering
dag
datum
maandag
28 maart
- Inleiding;
9.00 - 12.45
- Hfdst 1 en 2
maandag
4 april 9.00 - 12.45
- Hfdst 2 en 3
maandag
11 april
- Introductie in hfdst 4 en 5
9.00 - 12.45
- Start eindopdracht
18 april
- Eindopdracht en bespreken stappenplan
maandag
omschrijving
9.00 - 12.45 maandag
2 mei
- Eindopdracht
9.00 - 12.45 maandag
9 mei
- Eindopdracht
9.00 - 12.45 maandag
16 mei 9.00 - 12.45
- Eindopdracht
dinsdag
17 mei 17.00 uur
- Inleveren verslag en geschreven programma’s
week 20
- Bespreking eindopdracht
107
A ADC 66 afronden cursus 88 analoog-digitaal converter, zie ADC array 29, 32, 33, 35–37, 52, 55 array tools 36 leeg array 35 assistent 88 attribute node 47, 52, 57 auto-indexing 33 B bad wire 22 bestanden, zie files bewaren 17 booleans 96 boolse operatoren 38 breakpoint 23 breakpoint tool 14, 23 bugs 22 bundle 49 bundle by name 49 C C 12 case statement 29, ??–41, ??–42 chart 51 cluster 47, 48, 52 error cluster 50 code 13 conditie terminal 30, 39 connector 24, 25, 29 connector icon 25 control 16 controls palet 15 D data type 93 data-flow 18, 21 debuggen 12, 22 debugging tools 23 diagram 12, 13, 15, 18, 19, 21, 29 dialoogvenster 60 digitalisatie 67 draadje 12 driver application VI 70 configuration palet 70 data palet 70
initialize.vi 70 E error code 50 error cluster 50 status 50 execution hilighting 21 F files 47, 55 spreadsheet text files 56 filter 66, 67 floating point 32, 94 for-loop 29, 30–??, 47 auto-indexing 33 shift register 34 format string 55, 99, 107 front panel 12, 13, 14, 29 functions palet 15 fysisch verschijnsel 67 fysische grootheid 66 G G 12, 13, 29 gebruikersinterface 15 gebruikersinterview 77 GPIB 68 grafieken 47, 50 chart 51 chart buffer 52 logaritmische as 60 waveform grafiek 52 waveform graph 51 x-as chart 59 x-as delta 52 x-as offset 51, 52 XY-grafiek 53 XY-graph 51 grafieken x-as delta 51 H help 20, 45 highlight execution 21 I icon 24, 29 indicator 16 input terminal 18 integers signed 95
108
unsigned 95 interface 66, 67, 68–?? DAQ kaart 71 FireWire 68 GPIB 68 HPIB 68 IEEE 1394 68 IEEE 488 68 parallelle interface 68 PCI 68, 71 RS-232 68 RS-422 68 RS-485 68 seriële interface 68 USB interface 68 iteratie terminal 30, 31 K kleur 59 L label 17, 39 LabVIEW 11–13 lokale variabele 47, 57 M machinecode 12 meetsysteem 65 N NaN 40 not a number 40 O operating tool 14 output terminal 18 P parallelle interface 68 PCI 68, 71 polymorfie 37 popup menu 27 positioning tool 14 probe 14, 23 programmeerfouten 22 programmeertaal C 12 programmeertaal G 12, 13, 29 programmeren 11, 29 punaise 16 R referentie types 97 representation menu 32
109
run-knop 13 gebroken 22, 89 S save 17 select functie 42 semantische fouten 22–24 sequence 29, 43, 59 seriële interface 68 shift register 34 signaal conditionering 66, 67, 71 stappenplan 74 step step into 23 step out 23 step over 23 string 47, 55, 68 edit format string 55 format string 55, 99, 107 stroomschema 74, 75, 78 structuren auto-indexing 33 case statement 29, ??–41, ??–42 for-loop 29, 30–??, 47 sequence 29, 59 shift register 34 while-loop 29, 31 subVI 12, 13, 23, 24, 29 create subVI 64 select a VI… 26 syntactische fouten 22 T teller 31 terminal conditie terminal 30, 39 input 18 input terminal 25 iteratie terminal 30, 31 output 18 output terminal 25 tijdschema 101, 107 tools palet 14 breakpoint 14, 23 operating 14 positioning 14 probe 14, 23 wiring 14, 20, 25
tooltips 20 touwtje 12 U unbundle 48 unbundle by name 49 Universal Serial Bus 68 userinterface 12–13, 74 V verslaglegging bespreking verslag 88 voorbeeld verslag 85 VI 12, 13, 14, 21, 24, 29 application VI 70 initialize VI 70 VI library 47, 60, 62
VI opties 47, 60 VI Setup 60 virtuele instrumenten 12, 21, 24 volgorde van uitvoeren 18, 42 W waveform graph 51 which button structuur 42, 79 while-loop 29, 31 auto-indexing 33 shift register 34 wire 12, 20 bad wire 22 wiring tool 14, 20, 25 X XY-graph 51
110