1
EINDWERK: Ontwerp van een SCADA applicatie voor machinediagnose met Visual Studio .NET Studiegebied Industriële Wetenschappen en Technologie Opleiding Elektromechanica Optie Automatisering Academiejaar 2005-2006
Dieter Verhellen 2
Voorwoord Een eindwerk kan uitaard niet zonder de hulp en steun van anderen worden tot stand gebracht. Daarom zou ik iedereen willen bedanken die mij in het voorbije jaar gesteund en geholpen heeft. Vooraleerst wil ik de firma Balta bedanken voor de mogelijkheden die zij mij gegeven hebben om dit eindwerk te kunnen realiseren. Een bijzonder woord van dank gaat uit naar mijn externe promotor Etienne Witdouck die dit werk opgevolgd en begeleid heeft. Ook wil ik Dieter Vandenhoeke, mijn interne promotor, bedanken, die altijd klaar stond om te helpen met Visual Studio . NET. Verder wil ik nog alle docenten bedanken voor mijn degelijke opleiding tijdens mijn studies aan de Hogeschool West-Vlaanderen, departement PIH.
Dieter Verhellen (juni 2006)
3
Inhoudsopgave Voorwoord Inhoudstabel Inleiding 1. Beschrijving van het project…………………………………………………………….7 2. OPC……………………………………………………………………………………….9 2.1 Wat is OPC ? …………………………………………………………….………9 2.2 Hoe werkt OPC? ……………….………………………………………………...9 2.3 Hoe OPC configuratie aanmaken? ………………...……………………………10 2.4 OPC test client ………………………………………………………………….16 2.5 OPC in Visual Studio .NET……………………………………………………..19 3. Visual Studio. NET ……………………………………………………………………..23 3.1 Nieuw project aanmaken ……...……….…………………………….………….23 3.2 Componenten …………………………………………………………………...26 3.3 Databases ……………………………………………………………………….30 3.3.1 Wat is een database? ………….……………………………………….31 3.3.2 Database maken ………….……………………………………………31 3.3.3 Query’s ………………………………………………………....….….32 3.3.4 Een query aanmaken …………………..……………………….……...33 3.3.5 Wat is SQL?.…………...……………………………………….….…..35 3.3.6 Databases in .NET…….……....….…………………………………….38 3.4 Schermen……….…………………………....………………………………….39 3.5 Functie .…….……..…………………………………………………………….40 3.6 . NET applicaties in gebruik nemen…….………………………………………41 3.6.1 Inleiding………………...……………………………………..……….41 3.6.2 Het maken van een deploymentproject………………………………....41 4
4. Realisatie van het project………………………………………………………………53 4.1 Principe ………………………………………………………………………...53 4.2 Serverprogramma………...……………………………………………………..54 4.2.1 Huidig en historiek……………………………………………………..55 4.2.2 Grafiek………………………………………………………………….58 4.2.3 Productie………….…………………………………………………….64 4.2.4 Instellingen…………...…………………………………………………68 4.3 Clientprogramma……………..…………………………………………………70 4.3.1 Hoofdmenu………..…………………………………………………….72 4.3.1.1 Inloggen……………………………………………………72 4.3.1.2 Kiezen uit de verschillende afdelingen……………...……..74 4.3.1.3 Instellingen…………………………………………………75 4.3.2 Submenu……………………………………………………...…………78 4.3.2.1 Huidige alarmen………………………...………………….78 4.3.2.2 Historiek van de alarmen………….………………………..81 4.3.2.3 Trending……….………………..………………………….85 4.3.2.4 Machine-info…………...…………………………………..93 4.3.2.5 Productie…………………………….……………………105
5. Toekomst van het project……………………………………………………………..106 6. Besluit…………………………………………………………………………………..107 7. Bijlage…………………………………………………………………………………..108 8. Literatuurlijst …………...…………………………………………………………….109
5
Inleiding Mijn eindwerk heb ik uitgevoerd in Balta te St-Baafs-Vijve. Balta is snel geëvolueerd van een klein familiebedrijf tot de huidige Balta Group. Balta Group is één van de belangrijkste producenten in Europa op het vlak van vloer -en muurbekleding. Producten zijn karpetten, kamerbreed tapijt, laminaat parket en behang. Het motto van de Balta Group is : nooit op je lauweren rusten. Permanent zoekt Balta om hun technologie te vernieuwen en hoe het nog beter kan. Op dit principe wordt ook ingespeeld met dit eindwerk. Wat betreft het technisch gedeelte van de firma moet er mee worden geëvolueerd. Machine controle, productieopvolging en machinediagnose zijn zeer belangrijk om zo snel mogelijk in te spelen op iedere wijziging, vraag of probleem wat zich voordoet. Iedere afdeling kan zijn eigen SCADA programma ontwikkelen of zijn diagnoseprogramma’s opstellen, doch is er vraag naar een universeel programma dat voor iedere afdeling op dezelfde manier toegankelijk is. Altijd bereikbaar en analyseerbaar voor iedere technieker die op dat ogenblik het probleem moet oplossen of ieder productiehoofd dat wil weten wat er momenteel in zijn afdeling gebeurt. Daartoe dient iets ontwikkeld te worden dat universeel toepasbaar is en toch strookt met het bestaande systeem van allerlei machines met hun eigen programma’s, PLC’s en eigenaardigheden. Het programma zal worden gemaakt in Visual Studio .NET. Deze software is overal te vinden, informatie over deze software is wereldwijd verspreid en het toepassingsgebied is zeer uitgebreid wat de mogelijkheden tot een SCADA applicatie verruimt.
6
1. Beschrijving van het project Bij een groot bedrijf als Balta is machinediagnose heel belangrijk. Men wil immers, als een probleem zich voordoet dit zo vlug mogelijk verhelpen en verhinderen dat dit probleem zich blijft herhalen. Er wordt veel tijd verloren door het ontbreken aan standaarden en gebrek aan communicatie. SCADA programma’s die een oplossing bieden tot deze problematiek zijn vaak niet goedkoop, zijn beperkt in I/O en hebben ook hun beperkingen naar mogelijke output. Daarom werd dit project gelanceerd. Het idee was om met Visual Studio. NET de mogelijkheden af te tasten om een eigen SCADA applicatie te ontwikkelen. Het te schrijven programma moet aan de hand van de bestaande systemen die in Balta aanwezig zijn (PLC, netwerken, PC’s, …) toelaten om op een eenvoudige manier, de toestand van de machine te bekijken, te analyseren en dit voor alle verschillende afdelingen. Dus kortom een standaard, gebruiksvriendelijk programma om de toestanden van alle productielijnen te bekijken en te analyseren vanop gelijk welke plaats binnen Balta.
Concreet werd het project onderverdeeld in fases: Fase 1: Huidige alarmen bekijken Actuele alarmen worden serieel doorgestuurd met OPC en zullen vanuit Visual Studio. NET moeten worden opgeslagen in een database als volgt: Alarmnr
Afdeling
Alarmnaam
Tijd
Datum
Deze alarmen moeten worden gevisualiseerd enkel en alleen als ze actief zijn.
Fase 2: Historiek van alarmen bekijken Deze worden analoog als de huidige alarmen opgeslagen in een database, maar nu als volgt: Alarmnr
Afdeling
Alarmnaam
Inschakeltijd
Uitschakeltijd
Datum
Bij het opkomen wordt het alarm opgeslagen met zijn inschakeltijd, bij het afvallen van het alarm wordt de uitschakeltijd toegevoegd. Er moet mogelijkheid zijn om deze gegevens op een gemakkelijke manier te filteren: -
Rangschikken op tijd, datum, …
-
Filteren op tijd, datum, alarmnaam, periode van tijd, …
7
Fase 3: Trending van variabelen uit het proces Variabelen moeten gemakkelijk kunnen worden toegevoegd om grafisch uit te zetten: -
Naam OPC variabele Hoe lang deze moet gelogd worden Periodiek
De grafiek moet aangepast kunnen worden om de gegevens gemakkelijker te bekijken of opgesplitst in meerdere grafieken.
Fase 4: Productiegegevens Productie moet een overzicht geven van wat geproduceerd wordt en wanneer.
Fase 5: Machineoverzicht Een overzicht van de afdeling en mogelijkheden om een tekening, notitie, foto te bekijken van die afdeling.
Extra functies •
Wachtwoord bij het starten van het programma waarbij aan de hand van de gebruiker enkel de afdelingen zichtbaar worden waarvoor deze bevoegd is.
•
Printen en opslaan van de gefilterde tabellen.
•
Aanpassingen naarmate het project vordert en er testen worden gedaan.
8
2. OPC 2.1 Wat is OPC? Het belangrijkste onderdeel uit dit eindwerk is de OPC technologie die ervoor zorgt dat het mogelijk is een connectie te maken tussen de . NET applicatie en een PLC. Zo kan de .NET applicatie gemakkelijk gegevens lezen of wegschrijven van/naar de PLC. OPC staat voor OLE for Process Control. OPC technologie zorgt ervoor dat verschillende componenten van verschillende leveranciers met elkaar gekoppeld kunnen worden via een standaard. Of het nu een Hitachi, Siemens, B&R of Phoenix Contact PLC is, de data kan op dezelfde manier benaderd worden. Vroeger moest er voor elke verschillende connectie een andere driver worden geschreven. Nu geldt de OPC standaard waardoor dit allemaal overbodig is.
2.2 Hoe werkt OPC? OPC werkt volgens het client/server principe. OPC Server: Dit programma wordt geleverd door de PLC producent. De PC waarop dit programma staat moet een directe verbinding hebben met de PLC en zal de OPC variabelen updaten in een buffer om deze door te geven aan de client wanneer deze die wenst. Deze OPC Server moet worden geconfigureerd (zie verder: Hoe OPC Configuratie aanmaken?)
OPC Client: Dit is een softwareapplicatie die via de OPC interface communiceert met de OPC Server. Dit kan eender wat zijn zoals in dit geval de . NET applicatie. Deze softwareapplicatie kan zich bevinden op dezelfde PC als de OPC Server, maar kan zich evengoed op een andere PC bevinden die via het netwerk verbonden is. Via die OPC interface kan verbinding worden gemaakt met de OPC Server en kunnen lees en schrijfopdrachten verstuurd worden naar de OPC Server. (zie verder: OPC in Visual Studio. NET) Het is mogelijk om verschillende OPC Clients te verbinden met één OPC Server. Daarnaast kan men ook één OPC Client verbinden op meerdere OPC Servers.
9
2.3 OPC configuratie aanmaken In PC Worx: Eerst moeten de variabelen die nodig zijn voor OPC, aangeduid te worden als OPC variabelen in de lijst van de variabelen.
Daarna wordt het programma gecompileerd en gedownload naar de PLC. Als dit zonder fouten gebeurt, mag een visualisatiefile aangemaakt worden. Dit bestand is een lijst met de adressen van alle toekomstige OPC variabelen.
OPC Configurator: Hier moet de OPC Server worden ingesteld. Als OPC Configurator start, wordt volgend venster getoond:
10
Door rechts te klikken op “Unnamed” kan een nieuw project worden toegevoegd. Dit gebeurt aan de hand van een wizard:
Hier moet het PC Worx project geselecteerd worden waarmee gewerkt wordt. 11
Uit dit project gebruikt OPC Configurator de visualisatiefile en is zo automatisch op de hoogte van alle gegevens omtrent de RFC waaruit deze zijn variabelen moet halen.
Nu is het project geladen in het venster van OPC Configurator. Om de instellingen te vervolledigen moeten de 4 tabbladen nog doorlopen worden. 12
Het eerste tabblad ‘General’ bevat de path naar van het PC Worx project. Hier kan men ook een prefix instellen voor de verschillende OPC variabelen. Dit is vooral handig wanneer er in verschillende projecten dezelfde variabelen voorkomen. In het geval van dit project wordt dit een specifieke prefix voor de lijn vb. kleeflijn of compressoren
Het tweede tabblad ‘Communication’ is gelijkaardig aan een tabblad uit PC Worx. Hier wordt ingesteld op welke manier de PC fysisch moet communiceren met de RFC. Dit kan zowel serieel als via TCP/IP. In dit project is dit via TCP/IP. In zo’n geval dient het IP-adres van de RFC ingegeven te worden. Bij een RFC is dit terug te vinden op de RFC zelf onder MODE > OPT > ADDRESS. Normaal worden deze instellingen al weer gegeven van toen ze gemaakt werden in PC Worx. Met de TEST knop kan gecontroleerd worden of er al dan niet verbinding is met de RFC. Na het drukken op APPLY zijn de instellingen vastgelegd.
13
Bij het volgende tabblad ‘Variables’ kunnen verschillende groepen variabelen aangevinkt worden. In dit project zijn dit enkel de ‘Program variables’. Ook kan de scantijd veranderd worden waarbij deze variabelen opgehaald worden uit de RFC.
Het laatste tabblad ‘OPC items’ toont de OPC variabelen met hun specifiek naam en type onder de structuur van het RFC project. 14
Alle nodige instellingen zijn gemaakt. Na het klikken op het project in de linkerkolom (In dit voorbeeld ‘Compressoren450.clr’) wordt gevraagd om dit project te bewaren. Na het project te hebben bewaard, kan de OPC Server geactiveerd worden via ‘Activate’.
15
2.4 OPC Test Client Om te controleren of de OPC Server werkt, kan voor de start van de programmatie van een custom programma eerst de OPC connectie getest worden met de OPC Test Client. Dit programma wordt standaard meegeleverd met de OPC Server.
Na het opstarten wordt direct gevraagd om connectie te maken met een OPC Server. ‘PhoenixContact.Interbus.2’ is de naam van een Phoenix OPC Server. Bij een Hitachi PLC is dit ‘HitachiOPC.DA2’. Deze naam werd gekozen door de fabrikant en daar dient niets aan verandert te worden. In de tweede textbox moet de naam of IP adres van de PC met de OPC Server worden ingegeven. Indien dit dezelfde PC is, mag de textbox leeg worden gelaten. Na het al dan niet veranderen van de gegevens, kan geconnecteerd worden via ‘Connect’. Let op: dit heeft niets te maken met de connectie naar de RFC. Dit is enkel een software connectie (tenzij de OPC Server zich op een andere PC bevindt, dan is er ook nog sprake van een fysische connectie) .
16
Belangrijk hier is de standaard structuur die wordt gebruikt om een OPC element te benaderen.
De structuur is als volgt: -
Connectie maken met de OPC Server Aanmaken van een groep. Dit kan gezien worden als een map waaronder OPC variabelen zitten die op dezelfde manier benaderd kunnen worden. Het toevoegen van OPC variabelen Het lezen of schrijven van een bepaalde OPC variabele
Na het connecteren dient dus een groep aangemaakt te worden. Na rechts te klikken op ‘Private Groups’ verschijnt er een dialoogvenster waarin een zelf gekozen naam kan worden ingevuld.
17
Na het rechts klikken op het nieuw verschenen element uit de structuur, verschijnt een contextmenu met een heleboel functies. Via ‘Add all Items’ worden alle bestaande items aangesproken.
Indien alle gewenste items te zien zijn, is de OPC Server juist geconfigureerd. Zijn dit variabelen van een vorig project dat in de OPC Server zat, dan zal waarschijnlijk de PC heropgestart moeten worden. Verschijnen geen variabelen, dan is de OPC Server niet actief. Vanaf nu kunnen variabelen op onderstaande manier gelezen worden.
Na de lees actie verschijnt onderaan in de textbox de responsie vanuit de OPC Server met alle gegevens. 18
‘ftTimeStamp’ is het tijdstip waarop de leesactie is gebeurd. ‘wQuality’ is de kwaliteit van de connectie, indien deze Bad is zoals in deze figuur, dan is er geen connectie met de RFC. Indien alles in orde is zal er Good verschijnen. ‘vDataValue[0]’ toont de waarde van de variabele op het tijdstip van de leesactie. Na het controleren van de connectie kan gestart worden met het programmeren van een eigen OPC Client.
2.5 OPC in Visual Studio .NET Belangrijk is hier terug de structuur om een OPC variabele te benaderen.
In .NET zullen deze stappen gevolgd worden om tot een OPC connectie te komen. 1 ) Toevoegen van de reference in .NET om de OPC bibliotheek te kunnen aanspreken 2 ) Declareren van de objecten 3 ) Volgens deze structuur de OPC connectie maken 4 ) Lees- of schrijfacties uitvoeren 5 ) De connectie terug afbreken volgens de omgekeerde structuur
1) Toevoegen van de reference 19
Er wordt gebruik gemaakt van een wrapper die communiceert tussen VB en de OPC Server. Deze dient toegevoegd te worden bij Projects > Add Reference. Onder het tabblad COM is de OPC DA Automation Wrapper 2.02 terug te vinden.
Na het toevoegen kan deze referentie worden teruggevonden in de solution explorer.
20
2) Declareren van de objecten Er zijn 3 soorten objecten nodig voor de connectie : OPC Server, OPC Group en OPC Item. Public objServer As OPCAutomation.OPCServer Public objGroup As OPCAutomation.OPCGroup Public objItem As OPCAutomation.OPCItem Public objItem2 As OPCAutomation.OPCItem
3) De OPC connectie maken Er wordt een nieuwe connectie gemaakt met dezelfde gegevens als bij de OPC Test Client. Indien de client en server zich op dezelfde PC bevinden, mag het IP adres weggelaten worden. objServer = New OPCAutomation.OPCServer Call objServer.Connect("PhoenixContact.Interbus.2",”172.16.60.48”)
Ook dient terug een groep worden aangemaakt met een naam naar keuze. objGroup = objServer.OPCGroups.Add("Test")
Daarna moet een item worden toegevoegd met de correcte OPC naam en een nummer naar keuze. Let op: indien een prefix werd gedefenieert in de OPC Server, dient deze ook hier voor te komen. objItem = objGroupOpk.OPCItems.AddItem("voorbeeldOPC", 1) objItem2 = objGroupOpk.OPCItems.AddItem("voorbeeldOPC2", 2)
4) Lees of schrijfacties uitvoeren A) Lezen Er zijn verschillende manieren om een leesactie uit te voeren, maar voorlopig wordt gewerkt aan de hand van de eenvoudigste: Call objItem.Read(OPCAutomation.OPCDataSource.OPCCache) Test.text = objItem.Value
Hier wordt de opdracht gegeven om de waarde van een variabele uit de OPC buffer te halen. De waarde van de OPC variabele kan dan bijvoorbeeld worden toegewezen aan een textbox.
B) Schrijven Het schrijven gebeurt bijna op dezelfde manier: objItem2.Write(True)
21
5) De OPC connectie terug afbreken Om alles terug correct af te sluiten dient de OPC connectie afgebroken worden op de omgekeerde manier van het opzetten. De link van de objecten die aanmaakt zijn, moet worden teniet gedaan. Daarom wordt elk object gelijk gesteld aan Nothing. objItem = Nothing objItem2 = Nothing
De groep dient terug verwijderd te worden. Call objServerOpk.OPCGroups.Remove("GROEP") objGroupOpk = Nothing
De OPC connectie wordt vergebroken. Call objServerOpk.Disconnect() objServerOpk = Nothing
22
3. Visual Studio. NET In dit hoofdstuk wordt er dieper ingegaan op het werken met Visual Studio. NET . Het is niet mogelijk om hier een complexe programmeercursus te schrijven dus werd er beperkt tot een algemene uitleg en een overzicht van de componenten en methoden die gebruikt zijn in het eindwerk. 3.1 Aanmaken van een nieuw project in .NET Na het opstarten van het programma verschijnt volgend startscherm.
In het startscherm verschijnen de meest recent geopende projecten. Via ‘New Project’ wordt een wizard getoond.
23
In dit dialoogvenster kan links de programmeertaal worden gekozen.
Rechts kan het type applicatie worden vastgelegd : een Windows applicatie, webapplicatie, smart applicatie, … Hier wordt gekozen voor een Windows applicatie.
Na het geven van een naam en locatie wordt de programmeeromgeving geopend.
24
1) Tabbladen, zo kan gemakkelijk van het ene venster naar het andere gegaan worden of van design naar code. 2) De form, het visuele venster dat naar wens kan worden aangepast door het toevoegen van componenten en aanpassen van opties. 3) Dit is een overzicht van de verschillende forms, modules en/of classes uit het project. Ook is het mogelijk mappen aan te maken om bepaalde elementen te groeperen en zo het project nog overzichtelijker te maken. 4) Dit zijn de opties van de actieve form, module of component. Die opties kunnen hier worden aangepast, alsook via code.
5 ) Debug toolbar: om het project te testen en zo te controleren op fouten. Ook F5 kan gebruikt worden om het project te starten. 6 ) Toolbox: Hier staan de componenten die gebruikt kunnen worden in een Windows applicatie. Deze worden later besproken. Componenten die niet zichtbaar zijn zoals een timer of een dataset zullen onderaan het venster worden geplaatst. 7 ) Als men debug wilt starten, wordt de code eerst gecontroleerd op fouten. Die fouten verschijnen in dit debugvenster.
25
3.2 Componenten In dit deel volgt een korte handleiding van de verschillende controls uit het eindwerk De controls zijn steeds te gebruiken door ze op het venster te slepen. Na dubbelklik op de control kan code worden toegevoegd. Eén enkele klik op de tool en rechts kunnen de opties van de knop worden aangepast (naam, kleur, lettertype, …).
Na dubbelklik op de knop kan code worden toevoegd In het voorbeeld: Na het klikken op Button1 verandert zijn tekst naar Test Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Button1.Text = "Test" End Sub
In runtime, na het klikken op deze checkbox gebeurt het “vinkje” plaatsen/verwijderen automatisch. Daarna kan de TRUE/FALSE status van Checkbox.checked gebruikt worden in de code. In het voorbeeld: Als de CheckBox1 verandert zal deze bij een TRUE de Button1 zichtbaar maken, indien FALSE wordt deze onzichtbaar. Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged If (CheckBox1.Checked) Then Button1.Visible = True Else Button1.Visible = False End If End Sub
Dit is een lijst van checkboxen. Items kunnen aan de lijst worden toegevoegd via : Properties > Items > Collection of via code: 26
CheckedListBox1.Items.Add("een", True) checkbox en True de status van het item.
waarvan “een” de commentaar is bij de
Als men nu de status van een welbepaald element wilt afvragen kan dit op deze manier: CheckedListBox1.GetItemCheckState(1)
zal een TRUE of FALSE geven.
Let op: 1 is hier de index van de elementen. In dit voorbeeld zal dit dus van item “twee” zijn want de index begint met 0. Wil men de lijst helemaal wissen dan kan dit via : CheckedListBox1.Items.Clear()
Dit is een dropdown lijst. Elementen kunnen op analoge manier worden toegevoegd als bij de vorige control. ComboBox1.Items.Add("test")
Daarna kan tijdens het programma een item worden geselecteerd en gebruikt. ComboBox1.SelectedItem
Met deze tool kan een database gevisualiseerd worden, Meer uitleg volgt in het hoofdstuk 3.3.6
Met deze tool kan een bepaalde datum worden geselecteerd en gebruikt. DateTimePicker2.Value.ToString("dd/mm/YYYY")
27
Hier kunnen gemakkelijk afbeeldingen toevoegd worden die dan later makkelijk te selecteren zijn voor andere controls. Ook via code aan te spreken: Button1.ImageList = ImageList1 Button1.ImageIndex = 1
Weer analoog aan de Checkedlistbox. Om elementen toe te voegen, te selecteren en te gebruiken. Om toe te voegen: ListBox1.Items.Add("test")
Om het geselecteerde element te gebruiken: ListBox1.SelectedItem
Deze tool die zich niet standaard in de toolbox bevindt, dient om vanuit databases grafieken te maken. Meer uitleg hierover in hoofdstuk 4.2.2.
Met deze tool kan gemakkelijk een keuze gemaakt worden uit verschillende opties. Op dezelfde manier kan de status worden afgevraagd: RadioButton1.Checked
Hoeveel radiobuttons er ook aanwezig zijn op de form, er kan steeds maar 1 geselecteerd worden. Om meerdere keuzeschermen te maken op 1 form, dienen de radiobuttons in een groupbox te komen.
Met de TabControl kunnen tabbladen gecreërd worden.
28
Het instellen van de tabbladen gebeurt bij de opties van Tabcontrol > Tabpages
Hier kunnen nieuwe tabbladen aangemaakt worden met “Add”. Daarna kunnen de opties van het tabblad aangepast worden naar wens. Text is wat als naam te zien zal zijn op de tabbladen. Naam kan aan een tabblad worden geven om het later via code aan te spreken: TabControl1.SelectedTab = Tabblad1
Elementen op een ander tabblad kunnen worden aangesproken net zoals ze zich in dezelfde form bevinden.
Met een textbox kan gemakkelijk een variabele gevisualiseerd worden. Het tekstvak is gemakkelijk te veranderen via code: TextBox1.Text = "Test"
De timer wordt ingeschakeld met: Timer1.Enabled = True
Vanaf dan zal de code die in de timer staat doorlopen worden met de tijd die ingesteld staat bij interval. 29
3.3 Databases Een belangrijk onderdeel van het eindwerk de ACCESS databases. Met zowel het server als het client programma zal het nodig zijn informatie toe te voegen, te manipuleren of/en uit te lezen. 3.3.1 Wat is een database? Een database is een gestructureerde verzameling van informatie die opgeslagen is in een bestand. In Access is dit een tabel met de gegevens.
3.3.2 Database maken Bij het opstarten van Access wordt via Nieuw > Lege database een nieuwe database gemaakt.
30
Een nieuwe database ziet er als volgt uit:
Nieuwe tabellen worden best aangemaakt in ontwerpweergave:
Hier kunnen alle nodige velden worden toegevoegd.
31
De verschillende gegevenstypes die voorkomen zijn: Autonummering: Naarmate er informatie toegevoegd wordt aan de database, zal deze kolom automatisch een nummer toekennen. Bij het wissen van rijen gaat het nummeren gewoon verder. Het nummer is dus geen garantie voor de plaats van een welbepaald element in de database of van het aantal elementen in de databases. Numeriek: Dit veld kan alleen maar numerieke informatie bevatten. Tekst: Dit veld kan zowel tekst als numerieke informatie bevatten van maximaal 50 karakters (zie onderaan bij de eigenschappen: Veldlengte). Wanneer er meer dan 50 karakters wordt geschreven in de tabel, zal er een foutmelding worden gegeven. Datum/Tijd: Hier kan een datum komen onder gelijk welke vorm. Het voordeel van een datum/tijd vak te gebruiken in plaats van een gewone tekstkolom, wordt duidelijk bij sorteeracties. Ja/neen: Met dit type wordt een keuzevak gemaakt. Indien bij Opzoeken > Weergave het Selectievakje geactiveerd is, wordt dit een checkbox die alles overzichtelijker maakt.
Bij het sluiten van de tabeleditor wordt de tabel opgeslaan onder een naam.
3.3.3 Query’s Een query is een soort opdracht voor de tabel. (To query = ondervragen) Er zijn twee soorten query’s : -
Selectiequery: Deze query is een filter voor één of meerdere tabellen. Er zijn diverse mogelijkheden om te filteren, men kan zowel filteren op het aantal velden als op de inhoud van de records.(denk aan datum, tijd, alarmnr, …).
-
Actiequery: Dit is een aanpassing op de data in de tabel. Verdere onderverdeling is van toepassing:
Toevoegquery Verwijderquery Bijwerkquery Maaktabelquery
32
3.3.4 Een query aanmaken In de linkerkolom dient naar het tabblad Query’s te worden gegaan.
Ook hier is het wenselijk om te beginnen in de ontwerpweergave. Zo kunnen eerst de gewenste tabellen geselecteerd worden.
33
Na de tabellen te hebben toegevoegd, komt men in de werkomgeving van de query terecht.
Bovenaan staan de toegevoegde tabellen. Onderaan kunnen de filterinstellingen gemaakt worden. Velden kunnen geselecteerd worden door ze in het instelkader te slepen. In dit voorbeeld Nr uit Tabel1. Een sorteervolgorde kan meegegeven worden: oplopend of aflopend. Bij Criteria komen de filtervoorwaarden: bvb. als alleen Nr = 5 mag weergeven worden, dan komt in het vak criteria =’5’ Als men bij de verschillende velden de voorwaarden op dezelfde lijn zet, dan spreekt men van een logische AND. Plaatst men de voorwaarden op verschillende lijnen dan spreekt men van een logische OR. Na het opslaan worden de instellingen bewaard bij query en kan het resultaat geopend worden door erop te dubbelklikken. Afhankelijk van de filterinstellingen wordt een bepaald deel van een tabel getoond.
In dit voorbeeld staan de records van de tabel historiek met als filter “Alarmnr = 55” De voorwaarden voor het filteren werden nu ingesteld in een gemakkelijke interface, maar kunnen ook via SQL code aangemaakt worden.
34
3.3.5 Wat is SQL? SQL staat voor Structured Query Language. Het is een standaard taal om databases aan te spreken. SQL is geen systeem of programmeertaal, maar een toepassingstaal om query’s (zoals hierboven besproken) uit te voeren bij relationele databases. SQL biedt geen mogelijkheden om programmastructuren zoals lussen, beslissingen, … te maken. Alle SQL instructies worden door de database engine verwerkt en die levert dan op zijn beurt een antwoord in de vorm van een recordset. In een SQL instructie zijn altijd grote delen te herkennen: Sleutelwoord waarmee een commando begint: SELECT: Om de database te ondervragen op records die voldoen aan specifieke criteria. INSERT: Om blokken gegevens in één keer in een database in te voeren. UPDATE: Om de waarden van specifieke velden en records bij te werken. DELETE: Om records uit een tabel weg te nemen Sleutelwoord waarmee een clausule binnen een commando begint: FROM: Om de tabel aan te spreken waaruit records worden geselecteerd. WHERE: Om de voorwaarden weer te geven waaronder records kunnen geselecteerd worden.
Andere sleutelwoorden voor opties in een clausule: ORDER BY: Om de records in een specifiek volgorde te sorteren. Clausules zijn de veranderlijke omstandigheden die gebruikt worden om de gegevens te definiëren die geselecteerd of gemanipuleerd moeten worden. Om een SQL instructie op te bouwen heeft men ook nood aan een aantal expressies. Let op: Expressies moeten van het zelfde type zijn.
35
Type
Operator
Relationeel
Betekenis =
Gelijk aan
<>
Verschillend van
<
Kleiner dan
>
Groter dan
<=
Kleiner of gelijk aan
>=
Groter of gelijk aan
Like
Gelijk aan met jokertekens (SQL) * (of %): onbepaald aantal karakters ? : onbepaald karakter
Between
Logische
Gelegen tussen 2 waarden: gescheiden door AND
Not
Omschakelen van een boolean
And
En
Or
Of
Xor
Exclusieve of
Zoals eerder gezien in punt 3.3.3 bestaan er twee soorten query’s: de selectiequery en de actiequery. Selectiequery Om informatie uit de tabel te halen, te filteren en te tonen aan de gebruiker. Deze query wordt uitgevoerd met het sleutelwoord SELECT. De instructie haalt records op en plaatst de informatie in een recordset zodat de toepassing de gegevens verder kan verwerken. Afhankelijk van wat uit de tabel moet gehaald worden, zijn er variaties op deze instructie:
Alles uit de tabel halen SELECT * FROM Tabel1 Verschillende velden (kolommen) selecteren SELECT veld1, veld2 FROM Tabel1
36
Enkel een rij selecteren waar die gelijk is aan een bepaalde waarde: SELECT veld1, veld2 FROM Tabel1 WHERE veld1 = ‘waarde1’ OR veld2 = ‘waarde2’ Hier in dit voorbeeld zullen nu de rijen geselecteerd worden waarvan de waarde1 in veld1 voorkomt OF waarde2 in veld2. Rijen selecteren tussen 2 bepaalde waarden SELECT * FROM Tabel1 WHERE veld1 BETWEEN ‘waarde1’ AND ‘waarde2’ De gegevens sorteren door bepaalde velden oplopend of aflopend te laten sorteren SELECT * FROM Tabel1 ORDER BY veld1 Om aflopend te sorteren voegt men volgende instructie toe: SELECT * FROM Tabel 1 ORDER BY veld1 DESC Om op meerdere velden te sorteren: SELECT * FROM Tabel1 ORDER BY veld1 DESC,veld2 Actiequery Zoals gezien in punt 3.3.3 zijn er verschillende soorten actiequery’s. •
Toevoegquery
Heel belangrijk is dat toegevoegde data van hetzelfde type is dan ingesteld bij het maken van de tabel en dat de data de veldlengte niet overschrijdt. (Herinner u het aanmaken van de tabel in puntje 3.3.2) Om bepaalde waarden in de tabel in te voegen INSERT INTO Tabel1 (veld1, veld2) VALUES (‘C’,’D’) •
Verwijderquery
Om een bepaalde rij te verwijderen DELETE Tabel1 WHERE veld1= ’waarde’ •
Bijwerkquery
Om een bepaalde rij bij te werken UPDATE Tabel1 SET veld1 = ‘waarde1’ WHERE veld2 = ‘waarde2’
37
3.3.6 Databases in . NET In het eindwerk is gebruik gemaakt van een klasse om de databasefuncties uit te voeren. De klasse ‘Database’ bestaat uit 3 delen: -
Connectie maken met een database Lezen uit een database Schrijven in een database
Connectie maken met een database Er moet connectie worden gemaakt met de juiste database. De databaselocatie wordt aan de variabele ‘DBlocatie’ toegewezen. Erna wordt de functie Database.Maakconnectie gestart die de connectie zal maken. Lezen uit een database Dit gebeurt in verschillende stappen: -
Connectie maken als dit nog niet is gebeurd. Een commando aanmaken met de SQL instructie en de connectie. ( in de variabele sSQL wordt de SQL instructie meegegeven ) Een data adapter wordt aangemaakt die de gegevens zal ophalen in de database. Een dataset of datatabel wordt aangemaakt, dit is een gegevensverzameling waar de database gegevens kunnen worden ingeschreven. De gegevens die de data adapter heeft opgehaald worden in de dataset of datatabel geschreven.
De datatabel kan dan later toegewezen worden aan een datagrid component. Schrijven in een database Hier wordt weer een commando aangemaakt met een SQL instructie en dit wordt dan uitgevoerd op de database in kwestie. Public Class Database Private Shared DbConnectie As OleDb.OleDbConnection '********************************* ' In database selecteren of lezen '********************************* Public Shared Function DBLezen(ByVal sSQL As String) As DataTable Try If DbConnectie Is Nothing Then Maakconnectie() Dim DbCommand As New OleDb.OleDbCommand(sSQL, DbConnectie) Dim DA As New OleDb.OleDbDataAdapter(DbCommand) Dim DT As New DataTable DA.Fill(DT) Return DT 'Als er een fout voorkomt, verschijnt er een dialoogvenster
38
Catch ex As Exception MessageBox.Show("DBLezen(" & sSQL & ") fout : " & ex.Message) End Try End Function '************************************** ' Connectie maken met de databouwsteen '************************************** Public Shared Sub Maakconnectie() DbConnectie = New OleDb.OleDbConnection("file name=" & DBlocatie) End Sub '********************************* ' Schrijven in de databouwsteen '********************************* Public Shared Sub DBschrijven(ByVal sSQL As String) Try If DbConnectie Is Nothing Then Maakconnectie() Dim DbCommand As New OleDb.OleDbCommand(sSQL, DbConnectie) Dim DA As New OleDb.OleDbDataAdapter(DbCommand) DbConnectie.Open() DbCommand.ExecuteNonQuery() DbConnectie.Close() 'Als er een fout voorkomt, verschijnt er een dialoogvenster Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub End Class
3.4 Schermen
Er zijn verschillende schermen in het programma. Om van het ene scherm over te gaan naar het andere werd gebruik gemaakt van ‘Show’ en ‘Hide’.
39
Bij het overgaan van het ene scherm naar het andere wordt het ene scherm dus verborgen en het andere scherm getoond. frmHoofdmenu.Hide() frmSubmenu.Show()
Om dit te kunnen doen moeten de schermen gedeclareerd worden als volgt: Public Public Public Public Public Public
frmHoofdmenu As New Hoofdmenu frmSubmenu As New Submenu frmSubKlGrafiek As New SubmenuKLGrafiek frmSubOPCkiezen As New Submenu_OPCkiezen frmSubmenu_Voorkeur As New Submenu_Voorkeur frmSubmenu_Visio As New Submenu_VISIO
3.5 Functies Naast schermen kunnen ook functies worden aangemaakt. Als er een bepaalde actie veel voorkomt, kan dit in een functie worden geschreven. Deze functie kan dan in het hele project worden gebruikt, maar kan ook geïmporteerd worden in een ander project.
Een functie aanmaken gebeurt door het toevoegen van een module of klasse. Hierin kan de code voor de functie worden geschreven. In het voorbeeld is dit nu een functie voor het opslaan van een TXT bestand. Function Opslaan(ByVal Text As String)
Parameter die kan worden meegegeven
Dim SaveBestand As New SaveFileDialog SaveBestand.Filter = "Text files (*.txt)|*.txt" SaveBestand.ShowDialog() Code van de functie
If SaveBestand.FileName <> "" Then FileOpen(1, SaveBestand.FileName, OpenMode.Output) PrintLine(1, Text) FileClose(1) Return SaveBestand.FileName End If
Het resultaat van de functie
End Function
40
3.6 . NET applicaties in gebruik nemen 3.6.1 Inleiding Als de .NET applicatie is voltooid, is het de bedoeling om de applicatie te gebruiken op één of op verschillende computers. Wie ervaring heeft met Visual Basic 6.0, weet dat van een project een EXE file kan gemaakt worden. In .NET is dit niet zo simpel. Er moet een setup aangemaakt worden voor het project met diverse instellingen. Wat zijn de grote voordelen van zo een setup ? -
-
De applicatie wordt geregistreerd in het Windows systeem register. De applicatie kan daardoor gemakkelijk worden verwijderd bij Software. Alle opties voor het programma kunnen worden ingesteld zoals bijvoorbeeld:een snelkoppeling in start of op het bureaublad, de locatie waar de applicatie geïnstalleerd wordt,… Het is mogelijk verschillende setups te maken, van een gewone setup tot een websetup.
3.6.2 Het maken van een deployementproject •
Open het project waarvan er een setup moet gemaakt worden.
•
Nadat het project geladen is, klik op File > New > Project.
Daarna komt men in een volgend scherm. Rechts klikken op Setup and Deployement Projects. 41
Deze optie presenteert vier sjablonen en een wizard die kan gebruikt worden om het deploymentproject te maken. De 4 sjablonen kunnen veel van de instellingen in het deployementproject configureren. Cab Project: configureert het deploymentproject om een of meerdere cabinetbestanden voor het project te maken (de grootte van de bestanden zelf bepalen). Deze optie is voor het geval men wil dat gebruikers de solution downloaden van het internet. Merge Module Project: een algemeen deployementproject maken dat door verschillende Visual Basic applicaties kan worden gebruikt (de sjabloon maakt een msm-bestand dat in andere solutions kan worden opgenomen). Setup Project: een setupprogramma maken dat de Windows Installer voor installatie gebruikt. Web Setup Project: een setupprogramma maken dat de Windows Installer en een webserver gebruikt voor installatie via Internet. Setup Wizard: dit is een wizard die een deployementproject bouwt, gebaseerd op hoe men verschillende vragen beantwoordt over installatiemedia, voorkeuren, … De Setup Wizard kan gebruikt worden om een cabinetproject, een samenvoegingsmoduleproject, een Windows Installeerproject of een Windows Installeerproject voor het web te maken. •
Er wordt gekozen voor de Setup Wizard en geven een bepaalde naam aan het project. ( let op: dit zal de naam zijn die terug te vinden is bij Software na het uitvoeren van de gemaakte setup). Daarnaast wordt ook Add Solution geselecteerd, dit wil zeggen dat de Setup toevoegd wordt aan het huidige project. Hierdoor weet de Wizard direct over welk project het gaat.Er wordt dan bevestigd met OK.
•
Daarna verschijnt het eerste scherm van de wizard. Hier wordt er uitleg gegeven wat er allemaal gaat gebeuren met deze wizard.
42
•
Bij het tweede scherm kiest men voor een setup voor een Windows applicatie. Hier kan ziet met deze wizard de 4 verschillende sjablonen gekozen worden.Daarna bevestigen met Next >
43
•
Het derde venster wordt gebruikt om de bestanden aan te geven die opgenomen worden in de systemen die de applicatie zullen uitvoeren. De optie Primary Output is verplicht. Als deze optie geselecteerd wordt, zal het EXE bestand voor het project opgenomen worden. Met de andere opties kan men informatie opnemen die nuttig kan zijn in applicaties die internationaal in gebruik worden genomen (Localized resources) en programma’s die nog meer debugging (Debug symbols) of ontwikkelwerk (Content Files of Source Files ) vereisen.
•
Nu verschijnt het vierde venster waar bestanden gekozen worden om toe te voegen aan de installatie. Deze bestanden zijn vb. Readme.txt, tips om problemen op te lossen, een handleiding voor het programma, …
44
•
Daarna komt de laatste stap, waar een kleine samenvatting wordt gemaakt van de keuzes die reeds voorbij zijn. Als alles correct is, wordt afgesloten met Finish
•
In de solution explorer staan nu alle elementen die bijgevoegd zijn. 45
•
Als men dubbelklikt op Primary output from ... komt men in volgende omgeving terecht:
•
Na éénmaal klikken op Application Folder staat in het midden te zien wat de applicatie allemaal bevat. Nu is dit alleen Primary output. Indien het project references gebruikt of speciale objecten dan kan dit een hele lijst worden. Bij de properties van Application Folder kan gespecifieerd worden waar het project geïnstalleerd moet worden.
Dit staat nu standaard ingesteld op ProgramFilesFolder\Manufacturer\ProductName waarvan Manufacturer en ProductName nog aangepast worden (zie later) maar hiervoor dit kan ook gewoon een vaste locatie worden vb. “C:\Balta\Voorbeeldprogramma”
46
Door rechts te klikken op het middenveld van Application Folder, kunnen gemakkelijk folders, files of zelfs een andere project output toegevoegd worden.
Ook hier kan de snelkoppeling gemaakt worden die men wil zien in start of op het bureaublad. Dit kan door rechts te klikken op Primary output en te kiezen voor Create Shortcut. Hierna verschijnt een snelkoppeling. De naam kan aangepast worden en bij de opties van deze snelkoppeling kan een icoon gekozen worden.
47
Na twee maal klikken op Browse, komt een volgend scherm tevoorschijn:
Hier wordt bovenaan voor “Application Folder” en dan voor “Add File” gekozen. Na het toevoegen van het gekozen icoon klikt men op “OK”.
Daarna ziet men het icoon en dient men nog een keer op “OK” te drukken. Vanaf nu is het bestand van het gekozen icoon toevoegd aan de Application folder.
48
Nu kan de snelkoppeling die gemaakt werd geknipt en geplakt worden in ofwel de User’s Desktop map of de User’s Programs Menu. Het eerstgenoemde zal zoals de naam al doet vermoeden een snelkoppeling op het bureaublad voorzien. Het User’s Programs Menu zal een snelkoppeling voorzien in Start.
Er is ook een mogelijkheid om een map te voorzien met daarin de snelkoppeling. Het resultaat ziet men verder bij de installatie van het project.
Het project is in principe klaar. Optioneel kunnen nog een paar dingen ingesteld worden. •
Het project instellen voor RELEASE
In het menu Build kan gekozen worden voor Configuration Manager. Daar moet zowel het project als de setup aangekruisd worden voor Build en ingesteld als Release. Als Build niet is aangekruist, zal Visual Studio dat project niet compileren als de opdracht Build Solution in het menu Build geselecteerd is. Het verwijderen van het vinkje bij het Setupproject kan handig zijn als er nog veel werk is aan het project zelf. Op die manier kan tijd uitgespaard worden bij het compileren, want het is niet nodig om steeds het Setupproject mee te compileren.
49
•
Eigenschappen van deployment aanpassen
Bij rechts klikken op het setupproject in de solution explorer, worden hier deze eigenschappen weergegeven.
In het dialoogvenster krijgt men de mogelijkheid om eventueel de Output file name, dus de naam van het Setup bestand, aan te passen. Hier is ook de link naar de Configuration Manager en zal ook . NET dit project aanmaken in de Release map van het project. In het gewone venster Properties kunnen nog volgende zaken gebeuren: -
een auteur toevoegen laten detecteren of er al een versie van het programma is geïnstalleerd taal instellen van het project ontwikkelaar instellen de naam van het project nogmaals aanpassen verwijderen van vorige versie aan of uitzetten telefoon/webpaginatoevoegen
De meeste van deze instellingen zijn te zien wanneer bij Software de eigenschappen van dit programma opgevraagd worden.
•
Het project is klaar voor gebruik. Om een installatiebestand aan te maken klikt men op het project in de solution explorer en daarna op Build. Bij de eerste keer is de optie Install/Uninstall gedeactiveerd. Dit is logisch want er is nog geen nooit een installatiebestand aangemaakt. Afhankelijk van de grootte van het project zal het een tijdje duren vooraleer het MSI bestand aangemaakt is.
50
Als de plaats waar het setupproject komt niet bekend is, kan dit gemakkelijk opgezocht worden in de Output waar deze het bestand heeft aangemaakt. Op deze locatie is het MSI bestand terug te vinden dat men kan gebruiken om de installatie op eender welke PC uit te voeren. Testen van deze setup geeft volgende beelden:
Het tweede scherm duidt de standaardlocatie aan die ingesteld werd.
51
Bij nazicht in Start > Programma’s staat de snelkoppeling die voorzien werd.
Bij nazicht in Configuratiescherm > Software kan het project teruggevonden worden onder de naam die meegegeven werd en ziet men de gegevens die ingesteld werden.
52
4. Realisatie van het project Er werd gewerkt volgens de verschillende fases besproken in hoofdstuk 2: -
Huidige alarmen kunnen bekijken Historiek van de alarmen kunnen bekijken Trending van variabelen in het proces Productiegegevens Machineoverzicht
Reeds aanwezig: -
Alarmteksten van verschillende afdelingen PLC programma om de alarmen te bufferen en serieel door te sturen
4.1 Principe Dit is het principeschema van het eindwerk. Een alarm wordt gedetecteerd in de RFC. Via OPC wordt dit uitgelezen in een PC en gestockeerd in een database. Daarna wordt deze database uitgelezen via een andere PC op het netwerk. Dus voor elke afdeling zal een programma moeten worden gemaakt die de alarmen en data zal loggen, dit zal het serverprogramma. Met het clientprogramma zal met de keuze van een bepaalde afdeling, de juiste gegevens moeten worden binnengelezen. Ook kan er met dit clientprogramma in de databases worden geschreven. Dit zal dan bijvoorbeeld gebruikt worden om variabelen toe te voegen of om te loggen. Via een selectie in het clientprogramma, kan er gekozen worden tussen de verschillende afdelingen en kan dus de juiste database uitgelezen worden.
53
4.2 Serverprogramma Het serverprogramma is onderverdeeld in 5 tabbladen: -
Huidig Historiek Grafiek Productie Instellingen
Het serverprogramma maakt gebruik van 5 databases:
In volgende punten zullen de verschillende tabbladen besproken worden en zullen deze databases aan bod komen.
54
4.2.1 Huidig en historiek
Alarm
Bijna alle productielijnen van Balta Group werken met een RFC van Phoenix Contact. Al deze PLC’s zijn verbonden met het Balta LAN netwerk. Als een bepaald alarm opkomt, een sensor boven zijn kritieke waarde gaat of een noodstop bekrachtigd wordt, zal dit gedetecteerd worden in de RFC. Het alarm is een variabele die gekoppeld is aan een bepaalde ingang. Dit alarm wordt aan een array toegewezen. Zo krijgt het alarm zijn nummer. Vb. Alarm[56] := EindcontactSlede
Deze array wordt in een buffer gestoken: Buffer IN
Buffer UIT
65 34 90 56
78 6 87 99
AlarmOpkomend
AlarmAfvallend
De buffer wordt één voor één afgelopen en wordt gekoppeld aan een variabele “AlarmOpkomend”. Dus aan de variabele AlarmOpkomend wordt de waarde 56 toegekend en via OPC beschikbaar gemaakt. Deze variabele blijft die waarde behouden voor 1 seconde. Na 1 seconde wordt AlarmOpkomend = 90 tot zo de buffer helemaal is doorlopen. Dit wat betreft het opkomen van de alarmen en het afvallen van de alarmen. Als men weet dat er per machine meestal honderden alarmen zijn is het begrijpelijk dat dit een enorme besparing van de door te sturen variabelen met zich mee brengt. Verschillende machines samen hebben een server staan die in verbinding staat met de RFC’s. Deze kan al die variabelen binnenlezen. Het serverprogramma maakt gebruikt van de OPC Server die deze waarde binnenleest. Dit serverprogramma werkt als OPC Client die de twee waarden, wanneer ze veranderen, telkens opnieuw zal binnenlezen.
55
Vb. AlarmOpkomend = 67
Tekst en afdeling van het alarmnr opzoeken
Tijd en datum worden bijgevoegd
Op het moment dat deze OPC variabele verschillend is van 0 en nog niet weggeschreven is, wordt de bijhorende tekst van het alarm opgezocht en samen met tijd en datum terug weggeschreven. Dit zowel in de tabel huidig als in de tabel historiek.Verschil is dat de tabel huidig alleen actuele alarms zal bevatten, dus enkel als ze actief zijn zullen ze aanwezig zijn in de tabel. In de tabel Historiek is alles te zien, wanneer een alarm is opgekomen en wanneer een alarm is afgevallen.
Tabel Huidig
AlarmAfvallend = 4
56
Bij het veranderen van AlarmAfvallend wordt de tabel overlopen en waar de waarde voorkomt, wordt deze record gewist.
Tabel Historiek
AlarmAfvallend = 33
Bij het veranderen van AlarmAfvallend wordt de tabel overlopen en waar de waarde voorkomt, wordt een Uitschakeltijd bij geschreven. In Visual Studio .NET wordt dit gehele principe verwerkt met twee timers:
Bij het opstarten wordt de OPC connectie gemaakt. Daarna zal deze timer de 2 variabelen (AlarmOpkomend en AlarmAfvallend) opvragen en hun waarden naar locale variabelen schrijven. Deze timer kan worden aan en uitgeschakeld in het tabblad ‘Instellingen”
In de schrijftimer wordt er gekeken of er een verandering is in de 2 OPC variabelen. Indien deze van waarde zijn veranderd, wordt er geschreven in de databases.
57
4.2.2 Grafiek
Om een grafiek te kunnen maken van variabelen moet er natuurlijk eerst data gelogd worden. Niet alle variabelen kunnen worden gelogd. Het idee is eigenlijk dat men als gebruiker bij een bepaalde afdeling variabelen kan toevoegen om te loggen. Ook moet een datum meegegeven worden tot wanneer deze variabele moet gelogd worden en het interval voor het loggen.
58
Clientprogramma wordt weggeschreven onder deze vorm
Serverprogramma
Dit zijn de belangrijkste gegevens nodig om de variabele op te vragen. Stappen om deze tabel te kunnen loggen zijn: Door opvragen van het aantal rijen in de database kan er bepaald worden hoeveel variabelen er moeten worden overlopen. Zo worden alle variabelen overlopen aan de hand van het Nr -
Er wordt gecheckt of de datum van vandaag de stopdatum niet overschrijdt
-
Er wordt gekeken om de hoeveel seconde of minuten er moet worden gelogd
-
OPC variabele van die rij wordt binnengelezen en via deze naam wordt er connectie gemaakt met OPC
-
De waarde van de OPC wordt opgevraagd en weggeschreven samen met de tijd en datum in de database in een tabel Var_... en het nummer van die variabele
-
Updaten van de tabel zodat het ook mogelijk is, visueel de laatste waarden in de tabel te zien.
Dit gebeurt cyclisch in een timer, één voor de seconden en één voor de minuten. Met de kleuren wordt op de volgende pagina’s de code weergegeven die bij de verschillende stappen wordt gebruikt.
59
Hieronder staat nog eens de code om dit te verduidelijken. Dit is de code van de secondetimer. If OPCstatus Then DBlocatie = txtDBGrafiek.Text Database.Maakconnectie() Dim sSQL As String = "SELECT * FROM Variabelen" Dim DT As DataTable = Database.DBLezen(sSQL) If teller10s < 9 Then teller10s = teller10s + 1 Else teller10s = 0 End If If teller30s < 29 Then teller30s = teller30s + 1 Else teller30s = 0
60
End If If teller60s < 59 Then teller60s = teller60s + 1 Else teller60s = 0 End If i = 0 Do While i < (DT.Rows.Count) If DT.Rows(i).Item("Stopdatum") > Now.ToString("dd/MM/yyyy") Then ' OPC variabele afvragen Select Case DT.Rows(i).Item("Periodiek") Case "1 s" Dim Nr As Integer = DT.Rows(i).Item("Nr") objItemGrafiek = OPCGroupOpk.OPCItems.AddItem("" & DT.Rows(i).Item("OPCnaam") & "", 1) Call objItemGrafiek.Read(OPCAutomation.OPCDataSource.OPCCache) Dim sSQL2 As String = "INSERT INTO Var_" & Nr & "(Waarde,Tijdstip,Datum) VALUES ('" & objItemGrafiek.Value & "','" & TimeString & "','" & DateString & "')" Database.DBschrijven(sSQL2) Dim sSQL3 As String = "UPDATE Variabelen SET Waarde = '" & objItemGrafiek.Value & "' WHERE Nr =" & Nr Database.DBschrijven(sSQL3) Case "10 s" If teller10s = 0 Then Dim Nr As Integer = DT.Rows(i).Item("Nr") objItemGrafiek = OPCGroupOpk.OPCItems.AddItem("" & DT.Rows(i).Item("OPCnaam") & "", 1) Call objItemGrafiek.Read(OPCAutomation.OPCDataSource.OPCCache) Dim sSQL2 As String = "INSERT INTO Var_" & Nr & "(Waarde,Tijdstip) VALUES ('" & objItemGrafiek.Value & "','" & TimeString & "')" Database.DBschrijven(sSQL2)
61
Dim sSQL3 As String = "UPDATE Variabelen SET Waarde = '" & objItemGrafiek.Value & "' WHERE Nr =" & Nr Database.DBschrijven(sSQL3) End If Case "30 s" If teller30s = 0 Then Dim Nr As Integer = DT.Rows(i).Item("Nr") objItemGrafiek = OPCGroupOpk.OPCItems.AddItem("" & DT.Rows(i).Item("OPCnaam") & "", 1) Call objItemGrafiek.Read(OPCAutomation.OPCDataSource.OPCCache) Dim sSQL2 As String = "INSERT INTO Var_" & Nr & "(Waarde,Tijdstip) VALUES ('" & objItemGrafiek.Value & "','" & TimeString & "')" Database.DBschrijven(sSQL2) Dim sSQL3 As String = "UPDATE Variabelen SET Waarde = '" & objItemGrafiek.Value & "' WHERE Nr =" & Nr Database.DBschrijven(sSQL3) End If Case "60 s" If teller60s = 0 Then Dim Nr As Integer = DT.Rows(i).Item("Nr") objItemGrafiek = OPCGroupOpk.OPCItems.AddItem("" & DT.Rows(i).Item("OPCnaam") & "", 1) Call objItemGrafiek.Read(OPCAutomation.OPCDataSource.OPCCache) Dim sSQL2 As String = "INSERT INTO Var_" & Nr & "(Waarde,Tijdstip) VALUES ('" & objItemGrafiek.Value & "','" & TimeString & "')" Database.DBschrijven(sSQL2) Dim sSQL3 As String = "UPDATE Variabelen SET Waarde = '" & objItemGrafiek.Value & "' WHERE Nr =" & Nr Database.DBschrijven(sSQL3) End If End Select End If i = i + 1
62
Loop
If i = (DT.Rows.Count) Then i = 0 End If DBlocatie = txtDBGrafiek.Text Dim sSQL4 As String = "SELECT * FROM Variabelen ORDER BY Nr" Dim Data = Database.DBLezen(sSQL4) GrafiekDG.DataSource = Data Dim DS As DataSet = Database.DBLezenXML(sSQL4) End If
63
4.2.3 Productie
Het tabblad productie is voor iedere afdeling verschillend. Hier is de productie van de robot van de spinnerij genomen omdat juist nood was aan duidelijke gegevens omtrent deze productie. De robot stapelt lege of volle rollen op in verschillende containers. Probleem was dat men daar niet kon traceren welk product nu in welke container zat. Men moest handmatig beginnen zoeken als er zich een probleem had voorgedaan. Een PLC programma hiervoor is gemaakt door mijn interne promotor. Er zijn 5 verschillende OPC variabelen: -
-
pmn_opcContainer1Laag pms_opcContainer1PartijNr pmn_opcContainer1LijnNr pmn_opcContainer1Status pmn_opcContainer1Gewijzigd
64
Deze worden herhaald voor de 6 containers. (1 tot 6) Het PLC programma zorgt ervoor dat als de laag, partijnr, lijnnr of status gewijzigd worden ,de variabele‘pmn_opcContainer1Gewijzigd’ op ‘TRUE’ geplaatst wordt. In .NET moet dus nog het volgende gebeuren: -
Status controleren van pmn_opcContainer1Gewijzigd, pmn_opcContainer2Gewijzigd,…(tot 6)
-
Dan moeten de waarden van Laag, PartijNr, LijnNr en Status van die container worden opgevraagd.
-
De waarden van Laag en Status worden opgezocht in een tabel en hebben naarmate hun waarde een bepaalde tekst die bij deze waarde past.
-
Nadat deze twee teksten gevonden zijn wordt alles in de tabel geschreven samen met tijd en datum.
-
De tabel wordt heropgevraagd om visueel de veranderingen in de tabel te zien.
-
Erna wordt de variabele ‘Wijziging geschreven’ op TRUE geplaatst om te vermijden dat de variabele meerdere keren in de tabel geschreven wordt.
Hieronder staat de code die via een timer controleert of één van de containers gewijzigd is. If OPCstatus Then ' OPC variabelen van de productie Dim i As Integer i = 1 Do While i < 7 Call OPCItemContGewijzigd(i).Read(OPCAutomation.OPCDataSource.OP CCache) ContainerGewijzigd(i) = OPCItemContGewijzigd(i).Value i = i + 1 Loop Else End If
65
66
Dit is de code die constant doorlopen wordt om de data van de productie te controleren. Deze code staat onder een timer. Dim i As Integer i = 1 Do While (i < 7) If ContainerGewijzigd(i) And Not (WijzigingGeschreven(i)) Then ContainerNr = i Call OPCItemLaagNr(i).Read(OPCAutomation.OPCDataSource.OPCCache) LaagNr(1) = OPCItemLaagNr(i).Value Call OPCItemLijnNr(i).Read(OPCAutomation.OPCDataSource.OPCCache) LijnNr(i) = OPCItemLijnNr(i).Value Call OPCItemPartijNr(i).Read(OPCAutomation.OPCDataSource.OPCCache) PartijNr(i) = OPCItemPartijNr(i).Value Call OPCItemStatus(i).Read(OPCAutomation.OPCDataSource.OPCCache) Status(i) = OPCItemStatus(i).Value DBlocatie = txtDBProductie.Text Database.Maakconnectie() Dim sSQL As String = "SELECT Naam FROM Namen WHERE Nr =" & Status(i) StatusNaam = Database.DBLezen(sSQL).Rows(0).Item(0) sSQL = "SELECT Naam FROM Lagen WHERE Nr =" & LaagNr(i) Database.DBLezen(sSQL) LaagNaam = Database.DBLezen(sSQL).Rows(0).Item(0) sSQL = "INSERT INTO Productie(ContainerNr,LaagNr,LaagNaam,PartijNr,LijnNr,Status,Tekst,Dag,Tijd ) VALUES('" & ContainerNr & "','" & LaagNr(i) & "','" & LaagNaam & "','" & PartijNr(i) & "','" & LijnNr(i) & "','" & Status(i) & "','" & StatusNaam & "','" & Now.ToString("dd/MM/yyyy") & "','" & TimeString() & "')" Database.DBschrijven(sSQL) sSQL = "SELECT * FROM Productie ORDER by RecNr DESC" ProductieDG.DataSource = Database.DBLezen(sSQL) WijzigingGeschreven(i) = True ElseIf Not (ContainerGewijzigd(i)) Then WijzigingGeschreven(i) = False
67
End If i = i + 1 Loop
4.2.4 Instellingen
Het tabblad instellingen is ontstaan na talloos testen en moet ervoor zorgen dat er zo weinig mogelijk code moet veranderd worden bij het aanmaken van een nieuwe server. Bij een andere server zullen de 2 OPC variabelen veranderen die nodig zijn om de alarmen op te vragen. Er zal namelijk een andere prefix voor de OPC variabelen staan of de OPC variabelen zullen een iets andere naam hebben. Soms is er ook het probleem dat de OPC connectie niet kan worden gemaakt door één of andere fout. Met de bovenste knoppen kan de OPC communicatie worden getest en handmatig worden aangemaakt.
68
Ook kan het zijn dat door PC instellingen de database niet bereikbaar is vanuit het clientprogramma. In Balta moet iedereen aanloggen onder een bepaalde naam om die bepaalde PC te kunnen gebruiken. Bij een andere persoon horen andere instellingen. Die instellingen zorgen ervoor dat soms de database van buitenaf niet meer bereikbaar is. Door het kopiëren in te schakelen, kan de database gekopieerd worden naar een netwerklocatie zodat deze database wel bereikbaar is. Ook kunnen de databases onder XML formaat worden doorgestuurd naar een Pocket PC. Deze zal dan als er verbinding is tussen de Pocket PC en de PC, real time de veranderingen kunnen volgen. Dit wordt hier niet uitvoerig besproken, het programma en de uitleg staan in bijlage. Onderaan is ook een testbalk zichtbaar. Hiermee kan het schrijven naar de database worden getest maar vooral belangrijk is de functie ‘Alarm opvragen’. Deze knop zorgt ervoor dat de PLC zijn laatste alarmen in zijn buffer, opnieuw zal doorsturen. Voor dit wordt gedaan zal de huidige tabel volledig worden gewist. If Opvragen = False Then DBlocatie = txtDBHuidig.Text Database.Maakconnectie() Dim sSQL As String = "DELETE FROM Huidig" Database.DBschrijven(sSQL) sSQL = "SELECT Alarmnr,Afdeling,Alarm,Inschakeltijd FROM Huidig ORDER by RecNr" HuidigDG.DataSource = Database.DBLezen(sSQL) Try objItemOpvragen.Write(True) Opvragen = True Catch ex As Exception MsgBox("Kan alarmen niet opnieuw opvragen") End Try
Else objItemOpvragen.Write(False) Opvragen = False End If
69
4.3 Clientprogramma
Het serverprogramma staat op de verschillende server PC’s die bij de afdelingen van Balta horen. Via het LAN netwerk is alles verbonden met elkaar en kan elke PC bereikt worden. Zo kan iedere PC op het netwerk de databases bereiken. Via een clientprogramma wordt een selectie gemaakt in het hoofdmenu voor een bepaalde afdeling. Na selectie wordt de juiste database geselecteerd en zullen de juiste gegevens aan de gebruiker getoond worden.
70
Indeling van het programma
Verschillende vensters van het programma
Functies die verscheidene keren worden gebruikt
Het clientprogramma bestaat uit 2 grote delen: -
het hoofdmenu het submenu
Het hoofdmenu bestaat uit: -
inloggen kiezen uit de verschillende afdelingen instellingen
Het submenu bestaat uit de verschillende functies van het eindwerk: -
huidige alarmen historiek van de alarmen grafiek machine-info productie
71
4.3.1 Hoofdmenu 4.3.1.1 Inloggen
Bij het inloggen moet een gebruikersnaam en een wachtwoord worden opgegeven. Dit dient om elke persoon toelating te geven tot de afdelingen waarvoor hij bevoegd is. Hoe gaat dit in zijn werk? Het hoofdmenu bestaat uit verschillende tabbladen. Deze tabbladen zullen er voor zorgen dat er kan worden verwisseld tussen de verschillende overzichten van de afdelingen. Bij het opstarten van het project wordt de tabpagina van het loggen getoond. Alle knoppen aan de linkerkant zijn nog onzichtbaar gemaakt. Als er op ‘Bevestigen’ is geklikt: -
wordt er gecontroleerd of de naam en wachtwoord voorkomen in de tabel
-
indien dit voorkomt worden van die rij alle verschillende afdelingen opgevraagd of deze persoon toelating heeft tot deze afdelingen
-
daardoor wordt iedere keer de knop voor die afdeling zichtbaar gemaakt
-
persoon wordt aan een variabele ‘gebruiker’ toegekend om later opnieuw te gebruiken.
72
Hier onder staat de code van de knop ‘Bevestigen’. DBlocatie = "C:\Program Files\BaltaDiagnosticCenter\Database\Gebruikers.udl" Database.Maakconnectie() Try Dim sSQL As String = "SELECT * FROM Leden WHERE Naam = '" & txtGebruiker.Text & "' AND Wachtwoord = '" & txtWachtwoord.Text & "'" Dim DT As DataTable = Database.DBLezen(sSQL) If DT.Rows.Count <> 0 Then grbLogin.Visible = False lblAfdeling.Text = "Welkom " & txtGebruiker.Text lblAfdeling.Visible = True If DT.Rows(0).Item(2) Then cmdKleeflijn1.Visible = True cmdKleeflijn2.Visible = True cmdKleeflijn3.Visible = True End If If DT.Rows(0).Item(3) Then cmdBobinage.Visible = True End If If DT.Rows(0).Item(4) Then cmdSpinnerij.Visible = True End If If DT.Rows(0).Item(5) Then cmdCompressoren.Visible = True End If If DT.Rows(0).Item(6) Then cmdInstellingen.Visible = True End If Gebruiker = txtGebruiker.Text Else MsgBox("Inloggen mislukt : Probeer opnieuw") End If Catch ex As Exception MsgBox("Fout : kan gebruikersdatabase niet vinden" End Try
73
4.3.1.2 Kiezen uit de verschillende afdelingen
Zoals hierboven ook al vermeld bestaat het venster ‘hoofdmenu’ uit verschillende tabbladen. Bij het drukken op een bepaalde knop aan de linkerzijde zal er een tekening van een bepaalde afdeling worden getoond. Daarna kan afhankelijk van de afdeling nog een onderverdeling gekozen worden. Bij alle afdelingen moeten dezelfde functies beschikbaar zijn in het submenu: huidige alarmen, historiek, … Het is dus logisch dat deze schermen niet telkens opnieuw worden gemaakt. Volgend schema verduidelijkt de manier van werken:
TCMenu.SelectedTab = Kleeflijn1Pag lblAfdeling.Text = "Kleeflijn 1"
Situatie = 2 frmSubmenu.Show() Selecteren()
Select Case Situatie Case 2 Titel = "Kleeflijn 1 : DWS Links" DBHuidig = "C:\Kleeflijn_Huidig.udl" DBHistoriek = "C:\Kleeflijn_Historiek.udl" DBGrafiek = "C:\Kleeflijn_Grafiek.udl" DBBestanden = "C:\Bestanden.udl" IPadres = DT.Rows(0).Item(1)
74
Telkens als er dus een keuze wordt gemaakt in het hoofdmenu wordt de functie ‘selecteren’ opgeroepen en zal een keuze gemaakt worden. Dit voor 16 verschillende situaties. In het submenu wordt dan telkens met de globale variabelen DBHuidig, DBHistoriek, … gewerkt. Zo kunnen telkens uit een andere database gegevens worden gelezen. 4.3.1.3 Instellingen
Het tabblad ‘Instellingen’ bestaat normaal uit 2 tabbladen: -
Gebruikers IP adressen
Gebruikers Hier kunnen gebruikers toevoegd of verwijderd worden. Een vereiste hiervoor is dat de database ‘Gebruikers’, punt 4.3.1.1 op een server staat die iedereen kan bereiken. Toevoegen van gebruikers
Bij het toevoegen worden naam, wachtwoord en de status van de checkboxes weggeschreven in de database ‘Gebruikers’.
75
Verwijderen van gebruikers
Bij het selecteren van een bepaalde rij zal de prullenbak kleur krijgen. (cmdGebruikerVerwijderen.Enabled = True)
Dim sSQL As String = "SELECT * FROM Leden" Dim DT As DataTable = Database.DBLezen(sSQL) Try 'Hier wordt de gebruiker die u hebt geselecteerd in de datagrid gezocht Dim Gebruiker As String = DT.Rows(DGLeden.CurrentRowIndex).Item(0) 'Hier wordt de rij waar de gebruiker wordt terug gevonden gewist sSQL = "DELETE FROM Leden WHERE Naam = '" & Gebruiker & "'" Database.DBschrijven(sSQL) 'Hierna wordt de lijst verfrist sSQL = "SELECT * FROM Leden" DGLeden.DataSource = Database.DBLezen(sSQL) cmdGebruikerVerwijderen.Enabled = False MsgBox("" & Gebruiker & " is uit lijst verwijderd") Catch ex As Exception MsgBox("Kan gebruiker niet verwijderen : " & ex.ToString) End Try
76
IP-adressen
In dit tabblad kan het IP adres of de computernaam ingesteld worden van elke afdeling. Dit IP is nodig voor enkele functies in het submenu, zoals het opvragen van de lijst variabelen van die afdeling, het kopiëren van files naar een bepaalde PC,… Er is een mogelijkheid bijgeplaatst om de connectie te testen. Zo kan er gemakkelijk worden achterhaald of er een connectieprobleem is. Deze test van connectie gebeurt met het standaardprogramma ‘ping.exe’. Met . NET kan dit programma worden gestart, samen met een optionele parameter. Deze parameter is het ingevulde IP adres. If txtIP1.Text <> "" Then System.Diagnostics.Process.Start("ping", txtIP1.Text) End If
Ook is er een mogelijkheid voorzien om de OPC connectie te testen. Dim OPCserver As New OPCAutomation.OPCServer Try OPCserver.Connect("PhoenixContact.Interbus.2", txtIP6.Text) OPCserver.Disconnect() MsgBox("OPC connectietest is geslaagd.") Catch ex As Exception MsgBox("OPC connectie kan niet worden gemaakt.") End Try
77
4.3.2 Submenu Het submenu bestaat zoals eerder vermeld uit 5 verschillende tabbladen. Er wordt terug gewerkt met hetzelfde principe als bij ‘Hoofdmenu’ voor het tonen van de tabbladen. Bij het laden van dit venster zal afhankelijk van welke afdeling er werd geselecteerd, een andere database worden geladen in de datagrids van huidige alarmen, historiek, … 4.3.2.1 Huidige alarmen
Het tabblad huidige alarmen toont de huidige alarmen van de geselecteerde afdeling. Bij het laden van het venster ‘Submenu’ wordt dus de juiste database geladen in de datagrid ‘HuidigDG’. Laden van gegevens in de datagrid '****************************** ' Laden van de Huidige alarmen '****************************** DBlocatie = DBHuidig Database.Maakconnectie() Dim sSQL As String = "SELECT * FROM Huidig ORDER By RecNr DESC" HuidigDG.DataSource = Database.DBLezen(sSQL) HuidigAantalRijen = Database.DBLezen(sSQL).Rows.Count
De variabele HuidigAantalRijen is nodig om te kunnen printen.
78
Printen Een datagrid is geen eenvoudig iets in Visual Studio .NET. Daar komt nog bij dat de datagrid telkens een andere lengte heeft net zoals de teksten van de alarmen die zich bevinden in de datagrid. Volgende mogelijkheden zijn uitgetest: -
standaard functie in .NET voor printen werkte niet met een datagrid tenzij een screenshot openen van Access via code en zo printen werkte niet openen van Excel via code, daarin de database importeren werkte maar alleen op een bepaalde versie van Excel
Uiteindelijke oplossing was het schrijven van elk item van de datagrid in Excel, dit sorteren en dan printen. Daarom is de variabele HuidigAantalRijen nodig, om te weten hoeveel rijen deze moet kopiëren naar het Excelblad. Dim i As Integer i = 0 Excel_laden() xclSheet.Cells(1, xclSheet.Cells(1, xclSheet.Cells(1, xclSheet.Cells(1,
1).value 2).value 3).value 4).value
= = = =
"Alarmnr" "Machine" "Alarm" "Inschakeltijd"
Do While i < HuidigAantalRijen
xclSheet.Cells(i xclSheet.Cells(i xclSheet.Cells(i xclSheet.Cells(i
+ + + +
3, 3, 3, 3,
1).value 2).value 3).value 4).value
= = = =
HuidigDG.Item(i, HuidigDG.Item(i, HuidigDG.Item(i, HuidigDG.Item(i,
1) 2) 3) 4)
i = i + 1 Loop Try xclSheet.Cells.Select() xclExcel.Selection.font.size = "8" xclSheet.Columns("A").Select() xclExcel.Selection.horizontalAlignment = -4108 xclSheet.Columns("A:A").EntireColumn.AutoFit() xclSheet.Columns("B:B").EntireColumn.AutoFit() xclSheet.Columns("C:C").EntireColumn.AutoFit() xclSheet.Columns("D:D").EntireColumn.AutoFit()
79
Catch ex As Exception MsgBox("Kan een deel van de paginainstellingen niet toepassen") End Try xclExcel.ActiveWindow.SelectedSheets.PrintOut(, , 1)
Na het installeren op verschillende computers bleek dat bij bepaalde versies van Microsoft Office er nog steeds een probleem was met het printen. Normaal om Excel aan te spreken vanuit . NET moet een referentie worden toegevoegd. Door deze referentie toe te voegen wordt je een bepaalde versie van Excel. Als bij een andere computer een andere versie van Office is geïnstalleerd, treedt er een probleem op. Daarom is er een andere manier om zonder referentie Excel toch aan te spreken en dit versie onafhankelijk. De functies hiervoor zijn terug te vinden op de bijlage CD onder Excelfunctie en Excelfunctie_zonderRef. Opslaan: De functie opslaan verschilt weinig van de functie printen. Alleen moet bij het drukken op de knop ‘Opslaan’ een dialoogvenster worden weergegeven waar een naam kan worden gekozen. Er is gebruik gemaakt van de tool ‘SaveFileDialog.’ De tool toont een standaard Windowsvenster om een file op te slaan. Dim FB As New SaveFileDialog FB.Filter = "Excel file (*.xls|*.xls" FB.ShowDialog()
Na het schrijven van de datagrid in het Excelblad, wordt de file bewaard onder de gekozen naam en locatie : xclWerkblad.SaveAs(FB.FileName)
80
4.3.2.2 Historiek van de alarmen
Omdat in historiek alle alarmen worden gelogd is het nodig om te kunnen filteren en te sorteren om de juiste gegevens gemakkelijk terug te vinden. Sorteren kan door op de kolommen te klikken die gesorteerd moeten worden. Daarom is ook de kolom RecNr toegevoegd (een autonummering kolom) om terug te kunnen sorteren op de laatste gegevens. Filteren kan op: -
alarmnummer alarmnaam datum periode
Alarmnummer: If chkNr.Checked = True Then If txtFilterNr.Text <> "" Then Dim sSQL As String = "SELECT RecNr,Alarmnr, Afdeling, Alarm, Inschakeltijd, Uitschakeltijd, Datum FROM Historiek WHERE Alarmnr= " & txtFilterNr.Text & " ORDER By RecNr DESC" HistoriekDG.DataSource = Database.DBLezen(sSQL) HistoriekAantalRijen = Database.DBLezen(sSQL).Rows.Count End If
81
Als de optie Alarmnummer ingeschakeld is en er iets in de tekstbox staat dan wordt met een selectie SQL de database gefilterd op het alarmnummer. Ook wordt de variabele ‘HistoriekAantalRijen’ opgefrist want het aantal rijen zal verminderen. Dit is nodig om correct te kunnen printen.
Alarmnaam Zelfde als alarmnummer, maar de SQL string verandert: Dim sSQL As String = "SELECT RecNr,Alarmnr, Afdeling, Alarm, Inschakeltijd, Uitschakeltijd, Datum FROM Historiek WHERE Alarm LIKE '%" & txtFilterNaam.Text & "%'" & " ORDER By RecNr DESC"
Er wordt gewerkt met de LIKE operator en de % tekens om op een bepaald stuk van de tekst te kunnen zoeken.
Datum Hier moet een bepaalde datum worden gezocht, wat bepaalde problemen met zich meebrengt. Er zijn namelijk verschillende notaties om een datum weer te geven. Als de notatie verkeerd is, zal een verkeerde datum worden weergegeven. Het type waarmee Access werkt is niet standaard beschikbaar in .NET en werd dus noodzakelijkerwijs handmatig samengesteld: strDag = dtpHistoriekDatum.Value.Date.Day strMaand = dtpHistoriekDatum.Value.Date.Month strJaar = dtpHistoriekDatum.Value.Date.Year strDatum = strMaand & "/" & strDag & "/" & strJaar Dim sSQL As String = "SELECT RecNr,Alarmnr, Afdeling, Alarm, Inschakeltijd, Uitschakeltijd, Datum FROM Historiek WHERE (Datum = #" & strDatum & "#)" & " ORDER By RecNr DESC"
Periode Er wordt gewerkt met een BETWEEN selectie query. Dim sSQL As String = "SELECT RecNr,Alarmnr, Afdeling, Alarm, Inschakeltijd, Uitschakeltijd, Datum FROM Historiek WHERE Datum BETWEEN #" & dtpPeriodeVan.Value & "# And #" & dtpPeriodeTot.Value & "#"
Voorkeur Er zijn meer dan honderden alarmen per afdeling. Niet alle alarms zijn voor iedere persoon belangrijk. Daarom kan via voorkeur gekozen worden welke alarmen er worden getoond en welke niet. Bij het indrukken van de knop” Voorkeur” wordt het venster ‘Submenu_Voorkeur’ geladen. Hier wordt de lijst van de alarmnamen geladen in een checked listbox.
82
CLBVoorkeur.Items.Clear() DBlocatie = DBHuidig Database.Maakconnectie() Dim sSQL As String = "SELECT * FROM Alarmteksten" Dim DT As DataTable = Database.DBLezen(sSQL) Dim i As Integer Dim j As Integer i = 0 j = DT.Rows.Count() Do While (i < j) If DT.Rows(i).Item("Loggen") = 1 Then CLBVoorkeur.Items.Add(DT.Rows(i).Item(1) & " DT.Rows(i).Item(2), True)
" &
CLBVoorkeur.Items.Add(DT.Rows(i).Item(1) & " DT.Rows(i).Item(2), False)
" &
Else
End If i = i + 1 Loop
83
Hier is het mogelijk om aanpassingen te maken. Als er wordt gedrukt op toepassen worden de veranderingen weggeschreven in de tabel.
DBlocatie = DBHuidig Database.Maakconnectie() Dim i As Integer Dim j As Integer i = 0 j = CLBVoorkeur.Items.Count() Do While (i < j) Dim sSQL As String = "UPDATE Alarmteksten SET Filter=" & CLBVoorkeur.GetItemCheckState(i) & " WHERE RecNr = " & (i + 1) Database.DBschrijven(sSQL) i = i + 1 Loop frmSubmenu_Voorkeur.Hide()
Alleen als de filter de waarde 1 naast zijn naam bezit, zal deze worden getoond in de tabel historiek.
84
4.3.2.3 Trending
Het tabblad ‘Grafiek’ bestaat op zijn beurt uit 3 tabbladen: -
1 Grafiek Instellingen Meerdere grafieken
1 Grafiek Hier is het mogelijk om tot 4 variabelen te selecteren om weer te geven in de grafiek. De variabelen worden gevisualiseerd in een tool van . NET: Microsoft Office Chart 10.0 Deze tool maakt het mogelijk om uit een database gegevens te visualiseren in een grafiek.
85
In de tool kan er handmatig data worden toegevoerd als volgt: -
rechts klikken op de grafiek.
-
na klikken op data kan ‘Data from a database table or query’ worden geselecteerd
-
In het tweede tabblad kan de database en de selectiequery ingegeven worden
-
86
In het laatste tabblad wordt het type grafiek geselecteerd.
-
In de grafiek kan dan met de Waarden naar de X-as en Tijdstippen naar de Y-as worden gesleept.
87
Via code moet de data ook eerst worden geladen. Een voorbeeld hiervan staat in de helpfunctie die standaard bij de toolbox zit. categories = "" values = "" DBlocatie = DBGrafiek Database.Maakconnectie() Dim sSQL = "SELECT * FROM Var_" & (cmbVar1.SelectedIndex + 1) & " ORDER BY Tijdstip" Dim DT As DataTable = Database.DBLezen(sSQL) i = 0 Do While i < (DT.Rows.Count) categories = categories & DT.Rows(i).Item(0) & Chr(9) values = values & DT.Rows(i).Item(1) & Chr(9) i = i + 1 Loop sSQL = "SELECT Eenheid FROM Variabelen WHERE Naam = '" & cmbVar1.Text & "'" DT = Database.DBLezen(sSQL) Dim strEenheid As String = DT.Rows(0).Item(0) GrGrafiek.Clear() GrGrafiek.Charts.Add() GrGrafiek.Charts(0).SeriesCollection.Add() GrGrafiek.Charts(0).SeriesCollection(0).Caption = cmbVar1.Text & " (" & strEenheid & ")"
c = GrGrafiek.Constants GrGrafiek.Charts(0).SeriesCollection(0).SetData(c.chDimValues, c.chDataLiteral, categories) GrGrafiek.Charts(0).SeriesCollection(0).SetData(c.chDimCategories, c.chDataLiteral, values) GrGrafiek.Charts(0).Type = OWC10.ChartChartTypeEnum.chChartTypeLine
Dit gebeurt voor 4 variabelen, 4 maal zal deze code herhaald worden, maar dan met een ander nummer en een andere cmbVar (de combobox waar men de keuze van de variabele maakt) Om de namen van de variabelen die in de database zitten te zien in de comboboxen, is volgende code nodig: DBlocatie = DBGrafiek Database.Maakconnectie() sSQL = "SELECT
Naam FROM Variabelen"
88
cmbVar1.DataSource = Database.DBLezen(sSQL) cmbVar1.DisplayMember = "Naam"
Als de checkbox ‘Automatisch’ wordt afgevinkt is er nog een mogelijkheid om te filteren op tijdstip en/of waarde. Het filteren op tijdstip is met de SQL instructie te veranderen. Met het commando BETWEEN kan de data worden gefilterd tussen 2 bepaalde waarden. Het filteren op waarde (het veranderen van de schaal van de Y-as) gebeurt met de grafiek tool: If Not (chkYasAutom.Checked) Then GrGrafiek.Charts(0).Axes(1).Scaling.Minimum = txtYmin.Text GrGrafiek.Charts(0).Axes(1).Scaling.Maximum = txtYmax.Text End If
89
Instellingen
Hier kan de gebruiker een variabele toevoegen om op te volgen. De variabele wordt toegevoegd als volgt: naam naam OPC variabele eenheid periodiek volgen tot
Deze gegevens worden geschreven in de tabel ‘Variabelen’ die door het serverprogramma wordt doorlopen.
Het serverprogramma zal het aantal rijen van zijn database opvragen en de nieuwe variabele zal worden gelogd.
90
Omdat het moeilijk is om de exacte naam van de OPC variabele te vinden werd gezocht naar een mogelijkheid om de lijst van de beschikbare OPC variabelen weer te geven. Zo werd een oplossing gevonden die de lijst van de variabelen rechtstreeks uit de PLC uitleest.
Dit venster met een Listbox wordt weergeven als op de knop
wordt gedrukt.
Code om alle OPC variabelen toe te voegen: Try ' Hier wordt de OPC connectie gemaakt met het IPadres dat bij ' het laden van het submenu werd aangepast naar de ' afdeling die werd geselecteerd. OPCserver.Connect("PhoenixContact.Interbus.2", IPadres) ' Een group wordt toegevoegd OPCgroup = OPCserver.OPCGroups.Add("Test") ' Een OPC browser wordt aangemaakt ' ( van het type OPCAutomation.OPCBrowser ) OPCbrowser = OPCserver.CreateBrowser ' De onderverdelingen van de OPCbrowser worden ' weergeven. OPCbrowser.ShowBranches() OPCbrowser.ShowLeafs() ' Het aantal items in de OPC browser worden
91
' weergegeven in een label. lblAantal.Text = OPCbrowser.Count ' Elk item van de OPCbrowser wordt toegevoegd ' aan de Treeview ( TVOPCLijst ) For Each OPCnaam In OPCbrowser OPCitem = OPCgroup.OPCItems.AddItem(OPCnaam, 1) Call OPCitem.Read(OPCAutomation.OPCDataSource.OPCCache) TVOPCLijst.Nodes.Add(OPCnaam) Next OPCnaam Catch ex As Exception ' Als de OPC variabelen niet kunnen worden geladen dan ' wordt volgend dialoogvenster weergegeven. MsgBox("Kan OPC variabelen niet laden, fout : " & ex.ToString) End Try
Als een item geselecteerd wordt en men bevestigt de keuze, dan wordt het geselecteerde item gelijk gesteld aan de tekstbox in het submenu. frmSubmenu.txtVarOpcNaam.Text = TVOPCLijst.SelectedNode.Text
Meerdere grafieken
In meerdere grafieken is het mogelijk om 4 variabelen naast elkaar te plaatsen. Als men op de knop klikt boven de grafiek, verschijnt er een venster met exact dezelfde mogelijkheden als bij het tabblad ‘1 Grafiek’. Ook kan een bepaalde variabele in de combobox gekozen worden, en de assen van de grafiek kunnen worden aangepast. Na het selecteren van de variabele en eventuele opties worden de instellingen toegepast op de grafiek in kwestie. 92
4.3.2.4 Machine-info
De bedoeling van machine-info is dat er bij een bepaalde afdeling notities, flowcharts, tekeningen, handleidingen, … kunnen worden toegevoegd. In het eindwerk van vorig jaar werd ook al zoiets gedaan maar daar moest bij het toevoegen van een tekening telkens terug in de code een link worden gemaakt naar het bestand. Er werd een oplossing gezocht om dit niet echt flexibel systeem te verbeteren. Nu gebeurt het toevoegen van data aan een bepaald deel van de afdeling met databases.
Afhankelijk van het afdelingnummer (situatie bij het selecteren van de afdeling zie 4.3.1.2) worden de subafdelingen (onderverdelingen in die afdeling) uit de database ‘Overzicht’ geladen in de listbox bovenaan.
93
' connectie wordt gemaakt met de database Bestanden DBlocatie = DBBestanden Database.Maakconnectie() ' de subafdelingen worden geladen met de selectiequery Dim sSQL As String = "SELECT * FROM Overzicht WHERE Afdelingnr =" & Situatie Dim Data As New DataTable Dim i As Integer Data = Database.DBLezen(sSQL) ' Lijst ledigen indien ze nog elementen bevatte MILijstOverzicht.Items.Clear() 'In lijst steken Do While i < Data.Rows.Count MILijstOverzicht.Items.Add(Data.Rows(i).Item(1) & " Data.Rows(i).Item(2))
" &
i = i + 1 Loop MILijstOverzicht.Items.Add("...")
Bij het selecteren van een onderverdeling zullen de gegevens worden geladen die passen bij die afdeling aan de hand van dit afdelingnummer EN van het subafdelingnnummer. Er wordt nogmaals onderverdeeld aan de hand van het type. Zo worden alle nota’s samen gezet, alle visio tekeningen, alle CAD tekeningen,… DBlocatie = DBBestanden Database.Maakconnectie() Dim sSQL As String = "SELECT * FROM Bestanden WHERE SubAfdelingnr=" & (MILijstOverzicht.SelectedIndex + 1) & " AND Afdelingnr=" & Situatie & " AND Type ='NOTA'" Dim Data As New DataTable Dim i As Integer Data = Database.DBLezen(sSQL) 'In lijst steken TVBestanden.Nodes.Clear() Do While i < Data.Rows.Count TVBestanden.Nodes.Add(Data.Rows(i).Item(4)) i = i + 1 Loop
94
TVBestanden.Nodes.Add("(nieuw)")
Zowel bij de lijst van de subafdeling als de bestanden krijgt het laatste item dat er aan toegevoegd wordt, de waarde ‘…’ of ‘(nieuw)’. Dit om nieuwe subafdelingen toe te kunnen toevoegen of bestanden onder een bepaalde subafdeling te plaatsen. Wanneer het geselecteerde item de naam ‘(nieuw)’ heeft, start de procedure om die bepaalde file toe te voegen. Dit is bij elk type verschillend. Subafdeling toevoegen
If MILijstOverzicht.SelectedItem = "..." Then GrpMILijst.Visible = True MILijstOverzicht.SetBounds(MILijstOverzicht.Location.X, _ MILijstOverzicht.Location.Y, 328, 210) Else GrpMILijst.Visible = False MILijstOverzicht.SetBounds(MILijstOverzicht.Location.X, _ MILijstOverzicht.Location.Y, 328, 314) End If
De listbox wordt ingekort en grpMIlijst wordt zichtbaar gemaakt. Met deze twee tekstboxen kan men een subafdeling bij maken. Bij het bevestigen wordt er een rij toegevoegd in de lijst Overzicht database.
95
Nota toevoegen Als op ‘(nieuw)’ wordt geklikt in de lijst met nota’s wordt het tabblad ‘Nota maken’ zichtbaar gemaakt. If TVBestanden.SelectedNode.Text = "(nieuw)" Then TCMachineInfo.SelectedTab = PagNotaMaken End If
Hier kan een onderwerp meegegeven worden en de tekst van de nota. Als er via ‘Opslaan’ wordt bevestigd, verschijnt een dialoogvenster met de vraag onder welke naam deze nota moet worden opgeslagen. Erna wordt de notitie in de database toegevoegd met zijn afdeling, subafdeling, type (NOTA), locatie, tijd en datum, de gebruiker ( naam aangelogde persoon ) en het onderwerp. Dim Locatie As String = Notitie.Opslaan(txtNotitieMaken.Text) DBlocatie = DBBestanden Database.Maakconnectie() Dim sSQL As String = "INSERT INTO Bestanden (Afdelingnr,Subafdelingnr,Type,Locatie,Datum,Auteur,Onderwerp) VALUES ('" & Situatie & "','" & MILijstOverzicht.SelectedIndex + 1 & "','NOTA','" & Locatie & "','" & TimeString & " " & Now.ToLongDateString() & "','" & Gebruiker & "','" & txtNotitieOnderwerp.Text & "')" Database.DBschrijven(sSQL)
Notitie.Opslaan is een functie die ervoor zorgt dat een dialoogvenster verschijnt waarmee men een locatie kan kiezen om de notitie op te slaan.
96
Eenmaal de nota is toegevoegd aan de database kan iedereen die dit clientprogramma heeft deze nota lezen. Nota bekijken
Bij het selecteren van een bepaalde nota, die getoond wordt (met de tijd en datum waarop hij werd gemaakt) verschijnt het tabblad ‘Nota bekijken’. TCMachineInfo.SelectedTab = PagNotities DBlocatie = DBBestanden Database.Maakconnectie() Dim sSQL As String = "SELECT * FROM Bestanden WHERE Datum ='" & TVBestanden.SelectedNode.Text & "'" Dim DT As DataTable = Database.DBLezen(sSQL) lblAuteur.Text = DT.Rows(0).Item(5) lblOnderwerp.Text = DT.Rows(0).Item(6) txtNotitie.Text = Notitie.Openen(DT.Rows(0).Item(3))
Bij het selecteren van het item wordt gezocht naar de rij waar in deze exacte geselecteerde tijd voorkomt. Erna worden alle gegevens (gebruiker, onderwerp, tekst) geladen in het tabblad. Om de tekst in de Richtextbox te laden is weer gebruik gemaakt van de functie ‘Notitie.Openen’, waarvan het argument de locatie van de notitie is. Autocad, PDF en andere toevoegen 97
Deze 3 zijn samengenomen omdat ze steunen op hetzelfde principe. Bij het selecteren van ‘(nieuw)’ wordt een dialoogvenster getoond (FileOpenDialog) en een Inputbox met de naam die men de tekening/PDF wil geven. Erna wordt alles terug in de Bestanden database geschreven. If TVCAD.SelectedNode.Text = "(nieuw)" Then File_Openen.Openen("dwg") Dim Naam As String = InputBox("Geef een naam voor deze tekening : ") DBlocatie = DBBestanden Database.Maakconnectie() Dim sSQL As String = "INSERT INTO Bestanden (Afdelingnr,Subafdelingnr,Type,Locatie,Onderwerp) VALUES (" & Situatie & "," & MILijstOverzicht.SelectedIndex + 1 & ",'CAD','" & FileLocatie & "','" & Naam & "')" Database.DBschrijven(sSQL)
Het enige dat zal verschillen bij PDF en andere files is het geel aangeduide in de code hierboven. Autocad, pdf en andere bekijken Als een Autocad tekening, PDF document of een ander type file is toegevoegd, zal het automatisch toegevoegd worden aan de lijst. Wanneer erop wordt geklikt, zal de locatie opgezocht worden van de desbetreffende tekening in de database en wordt de file geopend.
Hier wordt gebruik gemaakt van de functie ’Bestand.openen’ om een bestand te openen, met als argument opnieuw de locatie van het bestand dat moet worden geopend.
98
DBlocatie = DBBestanden Database.Maakconnectie() Dim sSQL As String = "SELECT Locatie FROM Bestanden WHERE Onderwerp ='" & TVPDF.SelectedNode.Text & "'" Dim dt As DataTable = Database.DBLezen(sSQL) Bestand.openen(dt.Rows(0).Item(0))
Onder de functie Bestand.openen staat volgende code die om het even welk type bestand opent. Try System.Diagnostics.Process.Start(Locatie) Catch ex As Exception MessageBox.Show("Kan " & Locatie & " niet openen, controleer of het bestand nog bestaat.") End Try
Visio tekening toevoegen en bekijken. Bij het drukken op ‘(nieuw)’ kan op dezelfde manier een Visio tekening toegevoegd worden als CAD tekeningen, pdf,… Bij de Visio tekeningen werd een extra functie voorzien. Van alle PLC programma’s in Balta is een flowchart gemaakt met de verschillende stappen en grote lijnen van het programma voor iedere productielijn. Het idee was om de stap waarin de PLC zich bevond, door te geven via OPC en te visualiseren in deze flowchart. Zo kan om het even op welke plaats in Balta om het even welke productielijn real-time gevolgd worden. Als er zich een probleem voordoet, ziet men meteen in welke stap deze vastzit, waardoor de fout heel wat makkelijker op te sporen is. Principe is als volgt: -
de flowchart moet vooraf worden aangepast
Elk component in de visio tekening kan een specifieke naam krijgen, die later met . NET kan worden opgevraagd. Zo kan bij het kader dat past bij een bepaalde stap (in de figuur stap 0) een specifieke naam worden gegeven. Deze naam wordt Stap1.0. 1 staat voor het eerste cyclusprogramma op de pagina 0 staat voor het stapnummer
99
Deze naam kan worden binnengelezen in .NET. Er wordt eerst connectie gemaakt met de juiste tekening en deze wordt geladen: Module VisioFuncties Public VisApplicatie As Object Public VisDocumenten As Object Public VisPagina As Object
100
Function Openen(ByVal Locatie As String) VisApplicatie = CreateObject("visio.application") VisPagina = VisApplicatie.Documents.Open(Locatie) End Function
Erna kan de component worden opgezocht: VisPagina.Pages(1).Shapes("Stap" & FlowchartNr & "." & StapNr).FillStyle = "Basic Shadow"
In dit voorbeeld zal FlowchartNr gelijk zijn aan 1 en StapNr gelijk aan 0. Zo kunnen de eigenschappen van deze component worden aangepast. Hier wordt de component grijs gekleurd. Stapnummer kan worden gelijk gesteld aan een OPC variabele en zo kan de stap waarin deze zit grijs gekleurd worden. Natuurlijk zal de vorige stap terug zijn defaultwaarden moeten krijgen zodat alleen de huidige stap gekleurd blijft. Try VisPagina.Pages(1).Shapes("Stap" & FlowchartNr & "." & StapNr).FillStyle = "Basic Shadow" Catch ex As Exception
End Try Try VisPagina.Pages(1).Shapes("Stap" & FlowchartNr & "." & StapNrVorig).FillStyle = "Basic" Catch ex As Exception End Try
En dit voor al de verschillende flowcharts aanwezig in de pagina. Afhankelijk van de taal van Visio moet het component anders worden aangesproken. ‘Basic Shadow’ wordt Basisschaduw. Daarom zal ook de taal moeten worden geselecteerd voor de tekening te openen.
101
Terug naar de lijst met Visiotekeningen. Indien een item wordt geselecteerd, verschijnt er een dialoogvenster:
Hier is het mogelijk verschillende stapnummers in te stellen, afhankelijk van hoeveel cyclusprogramma’s zich in de Visio tekening bevinden. Ook moet een keuze worden gemaakt van taal (zoals reeds besproken). Bij het invullen van de stapnummers kan men op de knop drukken en bekomt men de lijst van OPC variabelen van de PLC die ook werd gebruikt in ‘Grafiek’ tevoorschijn.
Zo kunnen de stapnummers geselecteerd worden in een lijst. Naargelang de checkboxes aangevinkt zijn, zal het programma weten hoeveel cyclusprogramma’s zich bevinden in de Visio tekening. Na het drukken op ‘OK’ wordt de visio-tekening weergegeven en zullen de stapnummers gevisualiseerd worden. 102
De OPC connectie van deze stapnummers gebeurt via het IP adres van de geselecteerde afdeling. (zie 4.3.1.2)
-
connectie maken met de OPC Server in kwestie Function Connecteren(ByVal IP As String) ' Voor opkomende alarms objServer = New OPCAutomation.OPCServer Call objServer.Connect("PhoenixContact.Interbus.2", IP) objGroup = objServer.OPCGroups.Add("GROEP") End Function
-
toevoegen van de nodige variabelen: Function Toevoegen(ByVal Var1 As String, ByVal Var2 As String, ByVal Var3 As String, ByVal Var4 As String, ByVal Var5 As String, ByVal Var6 As String) If Var1 <> "" Then objStapnummer1 = objGroup.OPCItems.AddItem(Var1, 1) End If If Var2 <> "" Then objStapnummer2 = objGroup.OPCItems.AddItem(Var2, 2) End If If Var3 <> "" Then objStapnummer3 = objGroup.OPCItems.AddItem(Var3, 3) End If If Var4 <> "" Then objStapnummer4 = objGroup.OPCItems.AddItem(Var4, 4) End If If Var5 <> "" Then objStapnummer5 = objGroup.OPCItems.AddItem(Var5, 5) End If If Var6 <> "" Then objStapnummer6 = objGroup.OPCItems.AddItem(Var6, 6) End If End Function
103
-
afvragen van de verschillende variabelen:
Function Afvragen(ByVal EEN As Boolean, ByVal TWEE As Boolean, ByVal DRIE As Boolean, ByVal VIER As Boolean, ByVal VIJF As Boolean, ByVal ZES As Boolean) If EEN Then Call objStapnummer1.Read(OPCAutomation.OPCDataSource.OPCCache) End If If TWEE Then Call objStapnummer2.Read(OPCAutomation.OPCDataSource.OPCCache) End If If DRIE Then Call objStapnummer3.Read(OPCAutomation.OPCDataSource.OPCCache) End If If VIER Then Call objStapnummer4.Read(OPCAutomation.OPCDataSource.OPCCache) End If If VIJF Then Call objStapnummer5.Read(OPCAutomation.OPCDataSource.OPCCache) End If If ZES Then Call objStapnummer6.Read(OPCAutomation.OPCDataSource.OPCCache) End If End Function
-
OPC variabelen gelijk stellen aan locale variabelen:
-
OPC connectie terug verbreken bij het afsluiten van de Visio tekening:
Function Verbreken() If objServer.ServerState = OPCAutomation.OPCServerState.OPCRunning Then objStapnummer1 objStapnummer2 objStapnummer3 objStapnummer4 objStapnummer5 objStapnummer6
= = = = = =
Nothing Nothing Nothing Nothing Nothing Nothing
Call objServer.OPCGroups.Remove("GROEP")
104
objGroup = Nothing Call objServer.Disconnect() objServer = Nothing End If End Function
4.3.2.5 Productie
Hier wordt de database ‘Productie’ ingelezen en gevisualiseerd. Het grootste werk is hier al gebeurd in de server. Er is ook mogelijkheid tot printen of bewaren van deze tabel. Dit gebeurt op dezelfde manier als bij het tabblad ‘Huidig’ en ‘Historiek’.
105
5. Toekomst van het project Er zijn al veel mogelijkheden aan het licht gekomen met Visual Studio .NET die met standaard SCADA pakketten niet mogelijk zijn. Het programma heeft tal van functionaliteiten gekregen die in alle afdelingen van Balta mogelijk zijn. Alles is namelijk zo flexibel mogelijk geprogrammeerd en er is een structuur waarop kan worden verder gewerkt. Er zijn twee serverprogramma’s gemaakt, één voor compressoren en één voor de afdeling spinnerij. Zowel het server- als het client-programma werden uitvoerig getest. Er zijn tal van functionaliteiten toegevoegd om het gebruik van dit programma te vergemakkelijken en om problemen gemakkelijk op te lossen. In de toekomst kan nog een serverprogramma worden gemaakt voor de kleeflijnen en bobinage. De structuur is hiervoor reeds voorzien, zowel in het client- als het serverprogramma. Het serverprogramma moet naar code toe enkele aanpassingen krijgen en het programma kan voor een andere afdeling werken. Zo zullen alle afdelingen kunnen worden bereikt. Ook de functionaliteiten kunnen nog worden uitgebreid.
106
6. Besluit Dit eindwerk was toch wel een tast in het duister naar de mogelijkheden van een volledige SCADA applicatie in Visual Studio .NET. Het was een lange weg om tot de juiste oplossingen te komen en het geheel aan te passen voor toepassing op een algemene basis. Niettegenstaande deze kronkels werd het doel bereikt, de basisprogramma’s werden op verschillende afdelingen geïnstalleerd en uitvoerig getest. Het universeel karakter van dit SCADA programma laat toe om ieder type gebruiker zijn gegevens op te vragen om zo een duidelijk beeld te krijgen hoe alles reilt en zeilt in een bepaalde afdeling en dit vanuit iedere PC binnen Balta. Tal van mogelijkheden zijn toegevoegd om het gebruik van dit programma te vergemakkelijken. Ook nieuwe ideeën naar machinediagnose werden toegevoegd aan het programma, Eén van die ideeën wordt zelfs nu gebruikt in de laminaatafdeling in Vielsalm. Uitbreiding en verbetering zijn de volgende stap, waar ik hoop met dit eindwerk de basis te hebben gelegd voor een nuttige ontwikkeling in dienst van een toekomstgerichte firma.
107
7. Bijlage Bijlagen zijn te vinden op deze CD. Op deze CD staan er installatiebestanden, code en schermen van: - Serverprogramma compressoren - Serverprogramma spinnerij - Clientprogramma - Pocket PC programma
108
8. Literatuurlijst Capoen, Henk, Vandenhoeke, Dieter, OPC technologie, cursus gedoceerd in kader van het vak Geïntegreerde automatisering, Hogeschool West-Vlaanderen, departement Provinciale Industriële hogeschool, Kortrijk Vandenhoeke, Dieter, Visual Basic 6.0, cursus gedoceerd in kader van het vak Geïntegreerde automatisering, Hogeschool West-Vlaanderen, departement Provinciale Industriële hogeschool, Kortrijk Halvorson, Michael, Programmeercursus Microsoft Visual Basic .NET, boek uitgegeven door Academic Service, Den Haag en sinds dit jaar een standaard leerboek in Hogeschool WestVlaanderen, departement Provinciale Industriële hogeschool, Kortrijk. Putman Gregory, Opleidingscentrum Balta, Vervangen van een TP door een TPPC, Kortrijk, Hogeschool West-Vlaanderen, departement Provinciale Industriële Hogeschool, 2005, Eindwerk tot het behalen van de graad industrieel ingenieur elektromechanica, optie automatisering.
109