LabVIEW uppgift 4 Erik Andersson och Johan Schött 22 februari 2010 Sammanfattning Vår uppgift gick ut på att skapa ett system vars syfte låg i att mäta vattennivån och hålla den inom givna gränser i en tank med konstant dränering. Till vår hjälp använde vi programvaran LabVIEW för att utveckla ett användargränssnitt, bakomliggande logik och kommunikation med hårdvara. Abstract Our task was to create a system which purpose was to measure the water level and keep it within prescribed limits in a tank with constant drainage. To our help we used the software LabVIEW to develop a user interface, underlying logic and communication with hardware. 2
Innehåll 1 Introduktion 4 2 Experiment 5 2.1 Uppkoppling............................ 5 2.2 Programkod............................ 5 2.3 Genomförande........................... 9 3 Resultat 10 4 Diskussion 10 5 Referenser 11 6 Bilagor 11 3
1 Introduktion Figur 1: Uppställning Huvudsyftet med labben var att vi skulle bli bekanta med programvaran LabVIEW som vi kommer använda i framtida kurser. Det är en utvecklingsmiljö som är bra på att sköta kommunikation mellan dator och hårdvara. Problemet bestod av en läckande tank vars vattennivå skulle justeras så att den höll sig inom vissa gränser med hjälp av en pump, se Figur 1. Vi skulle även använda en tryckgivare för att mäta vattennivån. Både tryckmätaren och pumpen skulle styras från LabVIEW, som också skulle innehålla all logik angående när pumpen skulle vara aktiv och så vidare. Resultatet blev i form av ett diagram som visade hur vattennivån hade förändrats och dels med en indikator som visade aktuell vattennivå, se Figur 2. I extrauppgiften skrev vi dessutom kod för att rita upp tanken och dess vattennivå med hjälp av en Pen plotter. Det intressanta med uppgiften var att upprätthålla en kommunikation mellan datorn och hårdvaran som fortskred utan interagering med användaren. 4
2 Experiment 2.1 Uppkoppling Det centrala i uppgiften var att skapa logiken. När den väl fanns där var det i princip bara att koppla in apparaturen enligt uppställningen i Figur 1. Tanken, reservoaren, tryckgivaren och pumpen var ihopkopplade till en enhet på följande sätt. Tanken var belägen på en högre punkt än reservoaren av den enkla anledningen att avrinningen skulle fungera. Ner i tanken stack tryckgivaren, vilken i sin tur var kopplad till multimetern, Agilent 34401A Multimeter. Givaren omvandlade nämligen uppmätt tryck till spänning. Under reservoaren satt det en pump som, när den var igång, pumpade upp vätskan till tanken. Pumpens strömtillförsel kom från ett tillkopplat nätaggregat, Agilent E3640A DC Power supply. 2.2 Programkod Innan vi började att koppla upp var det, som sagt, dock nödvändigt att logiken fanns där. För effektiv programmering skapade vi oss först en bild av vad som önskades. Frontpanelen för vårt program ses i Figur 2. När vattennivån understeg ett bestämt minimum skulle pumpen sätta igång. Den skulle vara påslagen tills vattennivån nådde ett visst maximum då den skulle slås av. Ytterligare funktionalitet hos programmet skulle vara att gränserna för vattennivån manuellt skulle kunna matas in med två rattar. Två lampor skulle indikera huruvida man över- eller underskred nivåerna. En indikator skulle finnas som visade aktuell vattennivå. Ett diagram skulle finnas som skulle visa hur nivån varierat i tiden. Slutligen skulle det, när mätningen avslutades, skrivas ut en bild med tanken och dess innehåll med hjälp av en penplotter. Bilden skulle visa tanken och dess innehåll, västskenivån i klartext och datum. Vi lade på eget bevåg även till en extra funktionalitet, som för övrigt är önskvärt i en verklig situation. Nämligen att pumpens effekt skulle vara justerbar för användaren. Det här löstes enkelt genom att vi lade till en ratt på frontpanelen där vi kunde ändra vilken spänning som kom från nätaggregatet. En vy över programkoden syns i Figur 3. Det första som händer när programmet körs är att en while-loop startas. I början av varje loop hämtas data först in från givaren och de tre rattarna. Spänningen från givaren omvandlas till vattennivå genom att spänningen divideras med 4.25 10 3, vilket vi fick fram genom att registrera vätskenivå och värden från multimetern genom vilka vi sedan fick fram ett linjärt samband. Värdet från multimetern får vi med kommandot MEAS:VOLT:DC?. Eftersom vi matar in önska- 5
Figur 2: Frontpanel 6
Figur 3: Programkoden. Anledningen till att vi klippte upp bilden var för synbarhetens skull 7
Figur 4: Ritar tanken de maximum- och minimumgränser i procent, men i resten av programmet använder oss av liter, omvandlar vi med hjälp enkel matematik och vetskap om tankens volym, från procent till liter. Vidare skickas informationen från givaren direkt till indikatorn och diagrammet. Parallellt jämförs vätskenivån med gränserna. Är nivån under min skall lampan TOM lysa och när den är över max skall lampan FULL lysa. För att sedan kontrollera om pumpen skall stängas av eller sättas på kommer case-satser till användning. Först kollar vi om nätaggregatet levererar någon spänning genom kommandot VOLT?. Om så är fallet kontrolleras det om vätskenivån är högre än den maximalt tillåtna. Är den det skall nätaggregatet slås av. I annat fall låter vi nätaggregatet vara igång. Om det från början är så att det inte levereras någon spänning kollar vi om vätskenivån är under eller över miniminivån. Är den under slår vi på aggregatet med en spänning som hämtas in från en av rattarna i början av loopen. Exempelvis skickas kommandot APPL 5 till nätaggregatet. Annars låter vi dess status vara oförändrad. När knappen STOP trycks avbryts loopen och värdet på vätskenivån, samt hur många pixlar det motsvarar i höjd på en utritad tank, skickas till penplottern som med modifiering av given mallkod ritar upp den önskade bilden. Vilka kommandon som exakt skickas till plottern syns i Figur 4. Hur kommunikationen mellan programmet och hårdvaran fungerar står beskrivet i Bengtsson/Hellberg: Programmera i LabVIEW. Vilka kommandon som går att skicka till hårdvaran finns beskrivet i respektive användarmanual. I Figur 5 visas hur vi fick spänningen från tryckgivaren som vi sammanfattade 8
Figur 5: Mäter spänningen från tryckgivaren i en subvi. 2.3 Genomförande När vi var på plats började vi med att upprätta kommuniktionen mellan LabVIEW och nätaggregatet, som styr pumpen, och multimetern, som mäter från tryckgivaren. Detta var ett kritiskt moment som dock fungerade bra direkt. Efter det implementerade vi koden som skulle reglera pumpen och användargränssnittet. Proportionalitetskonstanten mellan tryckgivaren och vattennivån bestämde vi sedan genom att läsa av tryckgivarens spänning för några olika vattennivåer. Vi bestämde att då vattennivån var 400 ml skulle tanken vara full. Valet grundades på att vi då såg att vi hade vatten kvar i reservoar så att pumpen inte kunde gå torr. Vi såg att pumpens maxspänning var 12 V och valde att kunna reglera pumphastigheten därefter, se avsnittet Programkod. När vi började testköra hade vi inte med koden som ritade. Detta för att lättare kunna felsöka om något inte stämde. Vi hade vissa problem med att få Sweep chart -grafen att uppdateras sig kontinuerligt och samtidigt behålla historisk data. Det här löste vi genom att välja Fixed på y-axeln och Auto på x-axeln. Efter lunch började vi med uppritandet. Det gick bra när vi körde mallkoden som man fick givet men när vi själva skrev koden tolkade den även kod-instruktioner som text som skulle skrivas ut. Efter felsökning förstod vi att felet var kopplat till strängen \03. När vi kopierade in mallkoden och ändrade den istället för att börja om från början fungerade det. Efter det var extrauppgiften löst och med några testutskrifter var vi nöjda med resulatet. En kortfattad summering över problem och funderingar som uppstod under experimentet finns i labbloggen som vi bifogat 9
1.8 Determination of the relation between water level and voltage 1.6 y = 0.00425*x + 3.04e 16 1.4 1.2 Voltage [V] 1 0.8 0.6 0.4 Measured values 0.2 Linearising 0 0 50 100 150 200 250 300 350 400 Water level [ml] Figur 6: Bestämmandet av förhållandet mellan vattennivå och tryckgivarens spänning i rapporten, se Bilaga 1. 3 Resultat Det tydligaste resultatet för hur väl vi lyckats är att visuellt se hur pumpens styrning fungerar. Men vi såg också hur pumpindikatorn på skärmen varierade och hur grafen över vattennivån historiskt sett uppdaterades kontinuerligt. Dessa indikatorer stämde väl överens med verkliga värden. Uppritandet med hjälp av Pen plotter resulterade i Bilaga 2. Konstanten mellan tryckgivarens spänning och vattennivån bestämde vi ur Figur 6. Den fick vi till 4.25 10 3. 4 Diskussion Vår uppgift var relativt kul att utföra, dels för att man så tydligt kan se kopplingen mellan laboration och verklighet. Det är verkligen lätt att hitta användningsområden för den färdiga produkten. Exempelvis en badbassäng, 10
som måste hålla en någorlunda konstant nivå. Något vi hade problem med var att få fram funktionaliteten hos det önskade Sweep chart. Efter en tid löste vi dock problemet, men en reflektion är att vi kunde ha undivikit förlorade timmar på grund av det genom att ha ägnat det mer tid under förstudien. En annan sak som gav oss huvudbry var att Pen plottern först inte skrev ut vad vi ville. Vad vi senare fick erfara var att man skulle har högerklickat på rutan med \03 och markerat Code display. Det här stod för all del i mallkoden för skrivaren, men vi tolkade det inte som att man var tvungen att högerklicka, utan blott som att det var en förklaring på vad \03 betydde. Annars en mycket trevlig laboration. 5 Referenser Manualer IV: Agilent 34401A Multimeter Manualer XII: HP7475A PEN PLOTTER Interface and Programming Manual Manualer XIV: Agilent E3640A DC Power supply Bengtsson/Hellberg: Programmera i LabVIEW 6 Bilagor Bilaga 1: Labbloggen Bilaga 2: Utskrift från HP7475A PEN PLOTTER 11