K16F887 interface met Profilab Expert

Afdrukken

Gepost door Jeroen Vreuls op zaterdag 1 april 2023

Lambiek presenteert een zelfgemaakte interface voor Profilab Expert 4.0, gebaseerd op een PIC16F887 microcontroller.

De hardware

Wie wel eens met Profilab Expert 4.0 gewerkt heeft, weet dat er verschillende interfaces te koop zijn. Denk aan de Velleman interfaces, Kolter, Hygrosens, BMC, ELV, enzovoort. De Velleman interfaces zijn wel de bekendste, zoals de K8055, K8056, K8061 en de K8000. Die kaarten werken op zich goed, maar je gebruikt vaak niet alles wat er mee kan.

Nu kunnen we zelf ook zoiets maken en dan helemaal naar eigen wens, dus wat je het vaakst gebruikt. Ik ga hier een voorbeeld geven hoe je zoiets kunt doen.

We gaan de interface via de USB-poort bedienen, serieel dus. Als controller gaan we een PIC16F887 gebruiken samen met een USB-serieel adapter met FTDI chipset. Andere types willen nog wel eens problemen geven met de communicatie tussen PC en controller. Tussen de USB-serieel adapter gebruik ik altijd een interface printje met optocouplers voor de galvanische scheiding.

Hieronder zie je het schema plus de print van het geheel. Als optocoupler heb ik twee maal de PC817 gebruikt en dat werkt goed met de standaard 9600 baud instelling, veel hoger heb ik niet nodig voor dit doeleinde.

Seriële galvanische scheiding

Print seriële galvanische scheiding

Je kunt uiteraard ook het printje weg laten en de USB-serieel adapter direct op de TX en RX pinnen aansluiten van de gebruikte controller. Maar persoonlijk heb ik het liever galvanisch gescheiden.

De controller staat op een print met allemaal Molex connectoren, zodat je makkelijk van alles en nog wat aan kunt sluiten op de print. Ook zit er een ICSP connector op, zodat je de controller makkelijk kunt programmeren.

Er zit ook een aansluiting op speciaal voor een display en dat is best makkelijk, ook om eventueel data te bekijken wat ontvangen wordt vanuit Profilab. Zo kun je goed controleren of de verzonden data klopt.

Hieronder het gebruikte controllerboard.

Het K16F887 controllerboard

Je kunt zien dat alle poorten apart naar buiten komen via de drie polige Molex stekkers, maar dat de poorten A, E, C, D en B ook gecombineerd op een meerpolige stekker zitten. Alleen de C-poort heeft een 5-polige stekker, die wordt speciaal gebruikt om bijvoorbeeld een motorcontroller mee aan te sturen. Op de C-poort zitten namelijk twee PWM-poorten, de andere C-poorten zitten apart op driepolige Molex stekkers.

Op iedere stekker zit een 5 V DC en een 0 V DC aansluiting, plus een in- of een uitgang naar keuze. De 0 en 5 V DC is met name makkelijk voor het aansluiten van sensoren, schakelaars en bijvoorbeeld drukknoppen. Ik gebruik deze print als interface, maar je kunt er ook een speciale print voor ontwerpen natuurlijk.

Een print vergelijkbaar met bijvoorbeeld de K8055, met daarop bijvoorbeeld een ULN2803 voor de uitgangen. De ingangen zou je via optocouplers kunnen doen en via de PWM-uitgangen zou je met een TLV271 opamp een analoge uitgang kunnen maken.

Analoge uitgang

Hier een voorbeeld hoe je dat kunt doen.

PWM naar analoog converter

Hier wordt van een 5 V PWM-signaal een analoog signaal gemaakt van 0 tot 10 V. De versterkingsfactor is hier twee maal. De versterkingsfactor wordt bepaald door R2 en R3. Als je meer versterking nodig hebt dan moeten R2 en R3 aangepast worden.

Als je bijvoorbeeld een analoog signaal van 0 tot 12 V nodig hebt, dan wordt de waarde van R2 18 kΩ en de waarde van R3 wordt 13 kΩ. De versterkingsfactor wordt dan 2,385 maal. De uitgangsspanning van de opamp zit dan tussen de 0 en 11.9 V.

Als je geen versterking nodig hebt, dan kun je pin 2 en pin 6 doorverbinden. Dan wordt de opamp een spanningsvolger. Als je zoiets wil maken heb je wel een rail-to-rail opamp nodig, anders kom je niet aan de maximale uitgangsspanning die je wil hebben.

De combinatie R1 en C1 vormt hier een low-pass filter, dit zorgt ervoor dat er een constante spanning op pin 3 van de opamp komt.

Relaiskaarten

Als je meer vermogen aan de uitgang van de opamp wil hebben, kun je daar ook nog een transistor achter zetten. Zelf gebruik ik deze schakeling nog al eens om bijvoorbeeld een frequentie regelaar aan te sturen via een microcontroller of voor andere zaken die een analoog signaal nodig hebben.

Als uitgangen maak ik gebruik van een relaiskaart, die kun je kopen van heel veel merken en in alle prijsklassen. Ik heb er een paar van Conta-Clip, dat zijn behoorlijk dure relaiskaarten. Je stuurt de relais aan met een 5 V DC signaal en de spoelspanning van de relais is 24 V DC. Je hebt daarbij dus twee spanningen nodig.

Er zijn ook veel goedkopere kaarten, den bijvoorbeeld aan de relaiskaarten die je voor een Arduino kunt krijgen. Zo'n kaart heb je al voor ongeveer € 20,-. Je moet wel oppassen wat je er mee gaat schakelen, als dat bijvoorbeeld de netspanning (230 V AC) is, moet je wel kijken of dat de relais daar geschikt voor zijn. Dit geldt ook voor de relaiskaart zelf, denk hier dan aan de kruipweg van de sporen op de print.

Hier een plaatje van zo'n print voor een Arduino.

Een relaiskaart

Als je hier bijvoorbeeld 12 of 24 V mee moet schakelen, kun je zoiets prima gebruiken. Houd er ook rekening mee dat je kijkt hoeveel stroom de relais mogen schakelen, zorg er voor dat je daar niet overheen gaat.

Ingangen

Voor de ingangen gebruik ik gewoon standaard schakelaars, die zonder optocoupler op de ingangspinnen aan worden gesloten. Wel twist ik altijd de bedrading en mocht er lange bedrading tussen de schakelaar nodig zijn, dan wordt er een optocoupler voor gezet met een filter. Op deze manier dus:

Ingang voor de controller

Door de waardes van R1 en R2 aan te passen krijg je een ander filter waarde. Op deze manier krijg je een storingsvrij signaal op de ingang van je controller. Maar voor huis tuin en keuken dingen is dit uiteraard niet nodig. Hieronder nog een paar plaatjes van de vertraging via het filter. Hier is ook de condensatorwaarde aangepast. Hier is de condensator 10 nF. De vertraging is hier ongeveer 21 µs.

Vertraging met een 10 nF condensator

En hier is de condensatorwaarde 100 nF. De vertraging is hier ± 0,12 ms.

Vertraging met een 100 nF condensator

Je ziet hier dus duidelijk het verschil in signaal, door nu een beetje te spelen met de weerstandswaarde en condensatorwaarde kun je het ingangssignaal beïnvloeden. Maar de combinatie met de 100 nF condensator met één van de weerstand combinaties, type-1, type-2 of type-3 is ruim voldoende voor een storingsvrije werking.

Profilab Expert 4.0

We gaan nu naar het programma kijken wat gemaakt is in Profilab. Hieronder een stukje van het zend gedeelte.

Het zend gedeelte

Op de bovenste twee ingangen zie je twee potmeters zitten, deze potmeters bedienen de C1 en de C2 poort van de controller. Via een MW module (gemiddelde waarde) en de potmeter wordt er een waarde op de vergelijker gezet. Als de potmeter niet verdraaid wordt gebeurt er niets, als de potmeter nu verdraait wordt naar een hogere waarde dan wordt de pin A > B hoog. De OR-poort in combinatie met de AND-poort zorgt er nu voor dat de data verzonden wordt door de seriële module CS1. Dit gebeurt 10 maal per seconde door de G1 module.

Als de potmeter nu naar een lagere waarde wordt gedraaid, dan wordt de pin A < B hoog en wordt de waarde weer verzonden.

Onder eigenschappen kun je de seriële module benaderen om bepaalde waarden te veranderen. Je kunt hier zien dat de standaard waarde gebruikt worden voor de COM-poort.

De seriële verzendmodule

Onder kader zie je dat de waarde 1// ingevuld is, die waarde wordt als eerste verzonden. Deze waarde gebruik ik als adres, iedere module (CS1 tot CS 12) heeft dus een adres van 1 tot en met 12. Op deze manier kun je uitfilteren welke module er uit gelezen moet worden door de controller, later daarover meer.

Het hele zend gedeelte bestaat dus uit 12 CS1 modules, je kunt dus 12 modules in serie zetten. Later laat ik het complete programma zien.

We gaan nu naar het ontvang gedeelte kijken.

Het ontvang gedeelte

De CRB module is een acht bit seriële module waar de data uit de controller binnen komt. Achter deze module staat een acht bit D/A-converter die de waardes doorstuurt naar twintig vergelijkers. Achter de vergelijkers staat een RS flipflop. Bij de vergelijkers zie je een FW module (vaste waarde) staan, daar staan de waardes in die door de controller verzonden worden. Als de ingangen op de controller laag zijn, dan worden de waardes 10, 20, 30, 40, enzovoort verzonden. Dit zorgt ervoor dat de flipflops continu gereset worden en de uitgang in Profilab niet hoog wordt.

Dit signaal wordt 200 maal per seconde ingelezen door Profilab. Als bijvoorbeeld nu ingang A.0 op de controller hoog gemaakt wordt, dan wordt de waarde vijf verzonden door de controller en door de vergelijker vergeleken. Als de vergelijker de waarde vijf ziet zal de flipflop RS1 hoog worden.

In totaal worden er twintig waardes vergeleken en verwerkt door Profilab. Er zijn dus tien uitgangen ter beschikking in Profilab.

Onder eigenschappen van de CRB module kun je weer het een en ander aanpassen.

De seriële ontvangstmodule

Hier staan dezelfde gegevens in, alleen hier kun je geen adres in vullen. En dat is ook niet nodig, want je kunt hier 255 lijnen uitlezen als je dat zou willen. Ik heb er nu iedere keer een waarde van vijf tussen gehouden, omdat ik genoeg heb aan tien uitgangen in Profilab.

Nu is er een mogelijkheid om binnen Profilab een macro te maken, hier kun je dus je eigen IC's mee maken. Met een pin-macro kun je een naam aan de pin geven van het IC.

Om een macro te maken hebben we de totale schakeling nodig die we gemaakt hebben in Profilab.

De totale schakeling in Profilab

Je ziet dat er ook nog een OR-poort staat in de totale schakeling, hiermee wordt gekeken of er data wordt verstuurd naar de controller. Het is een twaalf bit OR-poort, omdat er twaalf signalen uitgelezen moeten worden, dit kun je onder eigenschappen van de OR-poort instellen. Je kunt tot zestien bit instellen.

Er zit ook een reset ingang op, daar sluiten we het Profilab programma mee af. Ook worden dan alle pinnen die nog hoog zijn op de controller laag gezet. Als Profilab weer opgestart wordt, zijn alle pinnen van de controller dus laag.

We halen nu de potmeters, schakelaars en de ledjes los. Daarvoor in de plaats zetten we een zogenaamde pin macro. Hieronder zie je een pin macro als ingang staan.

Pin macro als ingang

Hier ga je dus alle gebruikte pinnen een naam mee geven, hier is dat digitale ingang B1. Hier komen dus de Profilab componenten aan zoals de potmeters en de schakelaars of drukknoppen. Hieronder een pin macro als uitgang.

Pin macro als uitgang

Hier komen dan de ledjes aan of ander Profilab componenten, zoals een schrijver of een tabel.

Hier zie je het macro IC met alle benamingen van de pinnen.

Het macro IC

Linksboven de twee aansluitingen voor de potmeters, DI-C1 en DI-C2 met daaronder de digitale ingangen DI-B0 tot en met DI-C5.

De uitgangen zijn DO-A0 tot en met DO-C3. De pinnen BSY1 en BSY2 zijn de busy pinnen, daar aan kun je zien of er data verzonden en ontvangen wordt. RESET is een ingang en RUN is een uitgang om te zien of het programma loopt.

Op deze manier maak je dus zelf een IC, in principe kan dat met iedere schakeling gedaan worden.

We gaan nu kijken hoe we hier een schakeling mee op kunnen zetten.

Test schakeling met de K16F887

Hier kun je zien hoe dat gedaan is, de twee potmeters bedienen de twee PWM-kanalen op de controller (HPWM-1 en HPWM-2), daaronder zie je tien schakelaars staan die de poorten B0 tot en met C5 bedienen. Deze pinnen staan als uitgang geconfigureerd op de controller.

Dan zie je LED-1 tot en met LED-10, dat zijn uitgangen binnen Profilab. Deze worden bediend door schakelaars die op de controller aangesloten zijn. Dan hebben we nog de RESET ingang en de twee BUSY uitgangen binnen Profilab.

We gaan nu naar de frontplaat kijken van de interface.

Het bedieningspaneel

Op de frontplaat zie je de tien uitgang ledjes, waarvan DO-A0 en DO-A3 bediend zijn, dit zijn schakelaars aangesloten en bediend op de controller. Je ziet dat de meest rechtse drukknop bedient is, die zet pin DI-B0 op de controller aan. Die uitgang is nu dus hoog op de controller.

De twee schuifpotmeters zijn ook bediend, die sturen de PWM-pinnen DI-C1 en DI-C2 aan op de controller. De waarde van het PWM-signaal wordt ook op het display getoond van beide PWM-signalen. Het display zit aangesloten op de controller. Rechtsboven op de frontplaat zie je het teken van de USB-poort staan, als je daar op drukt kom je in een scherm waar je de COM-poort mee in kunt stellen. Er staan in het totaal veertien COM-poort modules binnen de macro en daar kun je niet meer bij. Dus het is wel handig dat het op deze manier wel benaderd kan worden.

Tot zover het gedeelte over Profilab.

De software voor de controller

We gaan nu naar de software voor de controller kijken.

'*  Name    : K16F887 - INTERFACE VIA PROFILAB.                                     
'*  Author  : H. van Zwieten                                    
'*  Notice  : Copyright (c) 2023 H.v.Z.                         
'*          : All Rights Reserved                               
'*  Date    : 23-2-2023                                         
'*  Version : 1.0                                                                                                 
'*  Notes   : POORT C.7 = RX EN POORT C.6 = TX BIJ GEBRUIK HSERIAL.
'*  Notes   : POORT B.0 = RX EN POORT B.1 = TX BIJ GEBRUIK RSIN.
                                                  
Device 16F887                               ; Processor type

Xtal 10                                     ; Crystal 10Mhz

Asm                                         ; Config settings
CONFIG_REQ            
__CONFIG _CONFIG1, HS_OSC & WDT_OFF & DEBUG_OFF & FCMEN_OFF & LVP_OFF & IESO_OFF & BOR_OFF & CPD_OFF & CP_OFF & MCLRE_OFF & PWRTE_ON 
__CONFIG _CONFIG2, WRT_OFF & BOR40V 
EndAsm
   
All_Digital true                            ; Alle poorten digitaal

Declare LCD_RSPin PORTD.2                   ; Reset display poort D.2
Declare LCD_ENPin PORTD.3                   ; Enable display poort D.3
Declare LCD_DTPin PORTD.4                   ; Data display D.4 t/m D.7
Declare LCD_Lines 2                         ; Twee lijns display

Declare Hserial_Baud 9600                   ; Set baudrate op 9600
Declare Hserial_RCSTA  %10010000            ; Register instelling
Declare Hserial_TXSTA  %10100110            ; Register instelling 
Declare Hserial_Clear = On                  ; Reset buffer bij een overflow 

Declare CCP1_Pin PORTC.2                    ; HPWM 1 op poort C.2
Declare CCP2_Pin PORTC.1                    ; HPWM 2 op poort C.1

Symbol FREQUENTIE = 10000                   ; PWM frequentie is 10KHz

Symbol IN1  = PORTA.0                       ; Ingang 1
Symbol IN2  = PORTA.1                       ; Ingang 2
Symbol IN3  = PORTA.2                       ; Ingang 3
Symbol IN4  = PORTA.3                       ; Ingang 4
Symbol IN5  = PORTA.5                       ; Ingang 5
Symbol IN6  = PORTE.0                       ; Ingang 6
Symbol IN7  = PORTE.1                       ; Ingang 7
Symbol IN8  = PORTE.2                       ; Ingang 8
Symbol IN9  = PORTC.0                       ; Ingang 9
Symbol IN10 = PORTC.3                       ; Ingang 10

Symbol LED1  = PORTB.0                      ; Uitgang 1
Symbol LED2  = PORTB.1                      ; Uitgang 2
Symbol LED3  = PORTB.2                      ; Uitgang 3
Symbol LED4  = PORTB.3                      ; Uitgang 4
Symbol LED5  = PORTB.4                      ; Uitgang 5
Symbol LED6  = PORTB.5                      ; Uitgang 6
Symbol LED7  = PORTD.0                      ; Uitgang 7
Symbol LED8  = PORTD.1                      ; Uitgang 8
Symbol LED9  = PORTC.5                      ; Uitgang 9
Symbol LED10 = PORTC.4                      ; Uitgang 1

Dim ADRES As Byte                           ; Variabele adres
Dim DATA_IN As Byte                         ; Data in compoort

Cls                                         ; Wis display

DelayMS 1000                                ; Pauze 1 sec 

Clear                                       ; Wis geheugen

         ;543210                            ; Hulpregel poort A
PORTA  = %000000                            ; Maak poort A laag
TRISA  = %111111                            ; Poort_A I/O

         ;543210                            ; Hulpregel poort B
PORTB  = %000000                            ; Maak poort B laag
TRISB  = %000000                            ; Poort_B I/O

         ;76543210                          ; Hulpregel poort C
PORTC  = %00000000                          ; Maak poort C laag
TRISC  = %00001001                          ; Poort_C I/O

         ;76543210                          ; Hulpregel poort D
PORTD  = %00000000                          ; Maak poort D laag
TRISD  = %00000000                          ; Poort_D I/O

         ;210                               ; Hulpregel poort E 
PORTE  = %111                               ; Maak poort E laag
TRISE  = %111                               ; Poort_E I/O

;---------------------------
; ALLE UITGANGEN ZIJN LAAG.
;---------------------------

LED1  = 0
LED2  = 0
LED3  = 0
LED4  = 0
LED5  = 0
LED6  = 0
LED7  = 0
LED8  = 0
LED9  = 0
LED10 = 0

;-------------------------------------------------
; DATA IN ADRES VAN PROFILAB.
; SPRING NAAR ADRES.
; ALS HET LANGER DUURT DAN 100MS SPRING NAAR UIT.
;-------------------------------------------------

RUN:


    HSerIn 100, UIT, [ADRES] 
    DelayMS 1
    
    If ADRES = 1 Then
       GoSub ADRES_1
    EndIf
    
    If ADRES = 2 Then
       GoSub ADRES_2
    EndIf
    
    If ADRES = 3 Then
       GoSub ADRES_3
    EndIf
    
    If ADRES = 4 Then
       GoSub ADRES_4
    EndIf
    
    If ADRES = 5 Then
       GoSub ADRES_5
    EndIf
    
    If ADRES = 6 Then
       GoSub ADRES_6
    EndIf
    
    If ADRES = 7 Then
       GoSub ADRES_7
    EndIf
    
    If ADRES = 8 Then
       GoSub ADRES_8
    EndIf
    
    If ADRES = 9 Then
       GoSub ADRES_9
    EndIf
    
    If ADRES = 10 Then
       GoSub ADRES_10
    EndIf
    
    If ADRES = 11 Then
       GoSub ADRES_11
    EndIf
    
    If ADRES = 12 Then
       GoSub ADRES_12
    EndIf
    
    If ADRES = 13 Then 
       GoSub ADRES_13
    EndIf
    
;-------------------------
; DATA UIT NAAR PROFILAB. 
;-------------------------
  
UIT:


    If IN1 = 1 Then   
       HSerOut [5]
       Else HSerOut [10] 
    EndIf

    If IN2 = 1 Then
       HSerOut [15]
       Else HSerOut [20] 
    EndIf 
    
    If IN3 = 1 Then   
       HSerOut [25]
       Else HSerOut [30] 
    EndIf

    If IN4 = 1 Then
       HSerOut [35]
       Else HSerOut [40] 
    EndIf
    
    If IN5 = 1 Then   
       HSerOut [45]
       Else HSerOut [50] 
    EndIf

    If IN6 = 1 Then
       HSerOut [55]
       Else HSerOut [60] 
    EndIf 
    
    If IN7 = 1 Then   
       HSerOut [65]
       Else HSerOut [70] 
    EndIf

    If IN8 = 1 Then
       HSerOut [75]
       Else HSerOut [80] 
    EndIf  
    
    If IN9 = 1 Then
       HSerOut [85]
       Else HSerOut [90] 
    EndIf  
    
    If IN10 = 1 Then
       HSerOut [95]
       Else HSerOut [100] 
    EndIf  

GoTo RUN

;----------------------------------------------------
; DATA STUURT PWM_2 AAN VANUIT PROFILAB VIA POTMETER.
;----------------------------------------------------
       
ADRES_1:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    Print At 1,1,Dec3, DATA_IN
    
    HPWM 2,DATA_IN,FREQUENTIE
    
    Return
    
;----------------------------------------------------
; DATA STUURT PWM_1 AAN VANUIT PROFILAB VIA POTMETER.
;----------------------------------------------------
    
ADRES_2:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    Print At 2,1,Dec3, DATA_IN
    
    HPWM 1,DATA_IN,FREQUENTIE
    
    Return
    
;------------------------------------------------------------
; DATA STUURT UITGANG B.0 AAN VANUIT PROFILAB VIA SCHAKELAAR.
;------------------------------------------------------------
    
ADRES_3:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       LED1 = 1
       Else LED1 = 0
    EndIf
    
    Return
    
;------------------------------------------------------------
; DATA STUURT UITGANG B.1 AAN VANUIT PROFILAB VIA SCHAKELAAR.
;------------------------------------------------------------
    
ADRES_4:


    HSerIn [DATA_IN] 
    DelayMS 1

    If DATA_IN > 2 Then
       LED2 = 1
       Else LED2 = 0
    EndIf
    
    Return
    
;------------------------------------------------------------
; DATA STUURT UITGANG B.2 AAN VANUIT PROFILAB VIA SCHAKELAAR.
;------------------------------------------------------------
    
ADRES_5:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       LED3 = 1
       Else LED3 = 0
    EndIf
    
    Return
    
;------------------------------------------------------------
; DATA STUURT UITGANG B.3 AAN VANUIT PROFILAB VIA SCHAKELAAR.
;------------------------------------------------------------
    
ADRES_6:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       LED4 = 1
       Else LED4 = 0
    EndIf
    
    Return
    
;------------------------------------------------------------
; DATA STUURT UITGANG B.4 AAN VANUIT PROFILAB VIA SCHAKELAAR.
;------------------------------------------------------------
    
ADRES_7:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       LED5 = 1
       Else LED5 = 0
    EndIf
    
    Return
    
;------------------------------------------------------------
; DATA STUURT UITGANG B.5 AAN VANUIT PROFILAB VIA SCHAKELAAR.
;------------------------------------------------------------
    
ADRES_8:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       LED6 = 1
       Else LED6 = 0
    EndIf
    
    Return
    
;------------------------------------------------------------
; DATA STUURT UITGANG D.0 AAN VANUIT PROFILAB VIA SCHAKELAAR.
;------------------------------------------------------------
    
ADRES_9:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       LED7 = 1
       Else LED7 = 0
    EndIf
    
    Return
    
;------------------------------------------------------------
; DATA STUURT UITGANG D.1 AAN VANUIT PROFILAB VIA SCHAKELAAR.
;------------------------------------------------------------
    
ADRES_10:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       LED8 = 1
       Else LED8 = 0
    EndIf
    
    Return
    
;------------------------------------------------------------
; DATA STUURT UITGANG C.4 AAN VANUIT PROFILAB VIA SCHAKELAAR.
;------------------------------------------------------------
    
ADRES_11:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       LED9 = 1
       Else LED9 = 0
    EndIf
    
    Return
    
;------------------------------------------------------------
; DATA STUURT UITGANG C.5 AAN VANUIT PROFILAB VIA SCHAKELAAR.
;------------------------------------------------------------
    
ADRES_12:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       LED10 = 1
       Else LED10 = 0
    EndIf
    
    Return
    
;--------------------------------------------------------------------
; HIER WORDEN ALLE UITGANGSPINNEN LAAG GEZET, PLUS DE TWEE PWM PINNEN.
; DIT GEBEURT DOOR DE RESET PIN BINNEN PROFILAB.
;--------------------------------------------------------------------
    
ADRES_13:


     HSerIn [DATA_IN]
     DelayMS 1
     
     If DATA_IN > 2 Then
        LED1  = 0
        LED2  = 0
        LED3  = 0
        LED4  = 0
        LED5  = 0
        LED6  = 0
        LED7  = 0
        LED8  = 0
        LED9  = 0
        LED10 = 0
        
        HPWM 1,0,FREQUENTIE
        
        HPWM 2,0,FREQUENTIE
     EndIf
     
     Return
             
End

Zoals je kunt zien valt het programma wel mee qua grootte, helemaal bovenin zie je de declaratie van het display, COM/USB-poort en de PWM-poort. Daaronder de benaming en de verwijzing naar de poort pinnen. Daaronder de variabele en de instelling van de poortpinnen.

Voordat het programma de lus RUN in gaat worden alle uitgangspinnen laag gezet, LED1 tot en met LED10.

In de RUN lus wordt er gekeken welk adres er binnen komt (verzonden door Profilab) en daar wordt dan naar gehandeld door naar het adres te springen en daar een opdracht uit te voeren.

Als er geen data binnen komt vanuit Profilab wordt er iedere 100 ms naar UIT gesprongen en kijkt daar of er eventueel een schakelaar bediend wordt. Is dat het geval, dan wordt er data naar Profilab gezonden en zet daar de desbetreffende uitgang hoog. Is er geen schakelaar bediend dan wordt er toch data verzonden, maar die vertelt Profilab dat er niets hoeft te gebeuren.

Dan hebben we nog de reset functie binnen Profilab, ADRES_13. Daar worden alle uitgangen op de controller mee uit gezet. Dit gebeurt als het programma uitgezet wordt, op deze manier blijft er nooit een uitgang hoog op de controller.

Tot slot

Op deze manier kun je dus zelf een interface maken, helemaal naar eigen wens. Ik heb er nu een gemaakt met twaalf ingangen en tien uitgangen, maar dat kunnen er ook meer of minder zijn natuurlijk.

Dit was het wel zo'n beetje, hoop dat het allemaal begrijpelijk is zo.

Als er nog personen zijn die nog nooit met Profilab gewerkt hebben of het totaal niet kennen, ik heb een aantal jaar geleden een boek geschreven over het werken met Profilab. Dat kun je hier downloaden.

Dit artikel is geschreven door Lambiek.