Grafisk PLC programmering
Det här avsnittet beskriver hur man skapar PLC program.
Editorn
Man startar editorn från ett PlcPgm objekt i anläggningshierarkin. Välj ut objektet och
aktivera 'Functions/Open Program' i menyn. Den första gången programmet öppnas, finns där
ett tomt dokument objekt. Programmet består av funktionsobjekt och Grafcet sekvenser.
Programmering med funktionsblock görs i ett horisontellt nät av noder och förbindningar, från
vänster till höger i dokumentet. Värden på signaler och attribut hämtas upp på den vänstra
sidan av nätet, och värden överförs med förbindningar från utgångspinnar till ingångs-
pinnar på funktionsblocken. Funktionsblocken opererar på signalvärdena och i den högra
sidan av nätet lagras värdena i signaler eller attribut.
Grafcet sekvenser består av ett vertikalt nät av noder och förbindningar. Ett tillstånd
överförs mellan stegen i sekvensen via förbindningarna. Nät av Grafcet och funktionsblock
kan samverka med varandra och kombineras till ett nät.
Editera funktionsobjekt
PLCeditorn består av
- en arbetsarea.
- en palett med Grafcet objekt och funktionsblock, och en palett med förbindningar.
- ett navigationsfönster, från vilket arbetsarean kan skrollas och zoomas.

Fig Plc editorn
Ett funktionsobjekt skapas genom att man väljer en klass i paletten, och klickar med MB2
(mittenknappen) i arbetsarean.
Modifiera ett objekt
Ett objekt kan modifieras från objektseditorn. Denna öppnas genom att välja ut objektet
och aktivera 'Functions/Open Object' i menyn. Värden på objektets attribut kan ändras med
'Functions/Change value' i objekteditorns meny, eller trycka på tangenten Pil Vänster. Om
en in- eller ut-gångspinne inte används kan den tas bort med en checkbox. Det finns också
en checkbox som avgör om en digital ingång ska vara inverterad.
Koppla ihop funktionsobjekt
En utgångspinne och en ingångspinne kopplas ihop genom att
- placera markören på pinnen, eller på ett område i funktionsobjektet nära pinnen, och
tryck ned MB2.
- drag markören till den andra pinnen, eller till ett område i funktionsobjektet nära pinnen,
och släpp MB2.
En förbindning skapas nu mellan funktionsobjekten.
Hämta värdet på en signal
Värdet på en Di signal hämtas med ett GetDi objekt. GetDi objektet måste peka på Di objektet
och detta görs genom att välja ut signalen i konfiguratören, och sedan trycka ned Ctrl
tangenten och dubbelklicka med MB1 på GetDi objektet. Signalnamnet visas nu i objektet. Dv
signaler, Do signaler och attribut hämtas på samma sätt med GetDv, GetDo resp GetDp objekt.
Enklaste sättat att skapa ett Get objekt är att rita en koppling från den kopplingspunkt som
Get-objektet ska vara kopplat till, och släppa den på ett tomt ställe i arbetsarean. Nu skapas
ett generiskt Get-objekt som omvandlas till ett Get-objekt av rätt typ när signalen specificeras
Signalen specificeras som tidigare genom att välja ut signalen i anläggnings-hierarkin och
klicka med Ctrl/dubbelklick på Get-objektet.
Lagra ett värde i en signal
Värdet från en utgång på ett funktionsobjekt lagras i en Do signal med ett StoDo objekt.
StoDo objektet kopplas till Do signalen på samma sätt som Get objekt. Dv signaler och
attribut lagras med StoDv resp StoDp objekt.
Grafcet
Den här sektionen ger en första introduktion till Grafcet. För en mer detaljerad beskrivning,
läs referensmanualen för Grafcet. Grafcet är en internationell standard för
sekvensstyrningar.
Grafcet består av ett antal steg, och till varje steg är ett eller flera order kopplade,
som kommer att exekveras när steget är aktivt. Från början är initsteget aktivt, och
aktiviteten flyttas till nästa steg med ett övergångsvillkor. En förflyttning görs när
villkoret för ett övergångsvillkoret är uppfyllt.
Enkel rak sekvens
Vi tittar på den enkla sekvensen nedan och antar att initsteget (Start) är aktivt, vilket
betyder att ordern som är kopplad till initsteget (Order1) kommer att utföras. Ordern kommer
att utföras ända tills initsteget blir inaktivt. Steg 1 (Step1) blir aktivt, när
övergångsvillkoret T1 är uppfyllt. Initsteget blir då inaktivt.
En Grafcet sekvens är alltid en sluten sekvens.

Fig En enkel rak Grafcet sekvens
Förgrenad sekvens
En rak sekvens är den enklaste varianten av sekvenser. Ibland behöver man alternativa grenar
i programmet, till exempel om man har en maskin som kan tillverka tre olika produkter. På de
ställen som produktionen skiljer sig åt, lägger man in alternativa grenar.

Fig Aternativ förgrening
Exemplet ovan visar sekvensen för en maskin som kan producera tre produkter, röd, grön och
blå. Vid förgreningen, punkt 1 i figuren, väljer man önskad gren beroende på den produkt
som ska tillverkas. Alternativa grenar utgår från ett steg, som följs av ett
övergångsvillkor i varje gren. Det är konstruktörens uppgift att se till att endast ett
av övergångsvillkoren är uppfyllt. Om flera skulle vara uppfyllda avgör slumpen vilken gren
som väljs. Vid punkt 2 i figuren går grenarna ihop till ett gemensamt steg.
Parallella sekvenser
Ibland behöver man starta flera parallella arbetsmoment samtidigt. Det ska vara möjlig för de
olika momenten att kunna arbeta oberoende av varandra. För att åstadkomma detta, använder man
parallella sekvenser.

Fig Parallell sekvens
Exemplet i figuren ovan visar sekvensen för två maskiner som borrar två hål samtidigt,
oberoende av varandra. När övergångsvillkoret före parallellförgreningen (punkt 1 i figuren),
är uppfyllt, flyttas aktiviteten över till båda grenarna, och de två maskinerna börjar
borra. Borrningen sker oberoende av varandra.
Grenarna sammanförs till ett övergångsvillkor (punkt 2 i figuren), och när borrningen är
klar i båda maskinerna, dvs både S12 och S13 är aktiva, och övergångsvillkoret T17 är
uppfyllt, flyttas aktiviteten vidare till initsteget IS2.
Steg - Step

Ett Step objekt (steg) används för att beskriva ett tillstånd i processen. Följande gäller
för ett steg:
- Ett steg kan vara aktivt eller inaktivt. Attributet Order[0] innehåller aktiviteten.
- Man kan koppla en eller flera order till ett steg.
- Steget kan ges ett godtyckligt namn.
- Steget blir inaktivt om resetsignalen sätts.
Initsteg - InitStep

I varje sekvens måste det finnas ett initsteg (InitStep) som skiljer sig från vanliga steg
på följande punkter
- Man bör endast ha ett initsteg i en sekvens.
- När programmet startar, är initsteget aktivt.
- Initsteget blir aktivt om resetsignalen sätts.
Övergångsvillkor - Trans
Ett övergångsvillkor används för att överföra aktiviteten mellan två steg. Aktiviteten
överförs från det övre till det undre steget (se figur nedan). Ett logiskt villkor, t ex
en digital signal, som kopplas till Trans objektet, avgör när överföringen sker.

Fig Exempel på övergångsvillkor
Order
Det är möjlig att koppla en eller flera order till varje steg.

Fig Exempel på order
Normalt är orderns utgång aktiv när ingången är aktiv, men för varje order finns ett antal
attribut, som påverkar utgångens funktion:
- D Fördröjning (delay)
- L Tidsbegränsning (limit)
- P Puls (pulse)
- C Villkorlig (conditional)
- S Lagrad (stored)
Dessa funktioner beskrivs i detalj i ProviewR Objekt handbok. Principen är att man anger
namnet på attributet (stor bokstav) och eventuell tid i objektseditorn. I figuren nedan
visas hur man fördröjer orderns aktivitet i 10 sekunder.

Fig Attribut för DOrder
De valda attributen skriv ut i ordersymbolen.
Figuren nedan visar hur man kan använda en order med fördröjning för att göra ett steg
aktivt en viss tid.

Fig Fördröjd övergång
Notera att man måste använda en feedback förbindning för att ansluta den fördröjda ordern
till övergångsvillkoret. Annars blir exekveringsordningen tvetydig.
Se feedback koppling
Subsekvens - SubStep
När man skapar komplexa Grafcet program, är det ofta en fördel att använda underfönster,
och i dessa placera subsekvenser. På det här sättet får man en bättre layout på programmet.

Fig Subsekvens
I figuren ovan visas subsekvensen för ett SubStep. En subsekvens startar alltid med ett
SsBegin objekt och slutar med ett SsEnd objekt. En subsekvens kan i sin tur innehålla
subsekvenser.
Att bygga Grafcet sekvenser
Grafcet sekvenser byggs enkelt genom att starta med ett Step eller InitStep objekt.
Genom att dra ut en koppling från den nedre kopplingspunkten, och släppa den i ett tomt
område i arbetsarean, skapas ett förbundet Trans objekt. På samma sätt skapas Order objekt
från den högra kopplingspunkten, och från Trans objektets övre och undre kopplingspunkter
skapas nya Step objekt.
Introduktion till funktionsblocks programmering
Block för att hämta och lagra värden
Hämtnings- och lagringsblock används för att läsa och skriva värden. Det finns hämtnings-
och lagringsblock för varje typ av signal. I figuren nedan visas ett antal av dessa block.
De återfinns under 'Signal' mappen i paletten.

Fig Block för att hämta och lagra värden
För att läsa signalvärden används block som GetAi, GetIi, GetDi eller GetAo. När man vill
sätta ett värde i en signal, används block som StoAv, StoDo, SetDv eller ResDo.
Digitala värden kan skrivas på två sätt:
- 'Sto' lagrar ingångsvärdet, dvs om ingången är 1 blir signalen 1, och om ingången är 0 blir
signalen 0.
- 'Set' sätter signalen till 1 om ingången är sann, 'Res' sätter ingången till 0 om ingången
är sann. Om man, t ex, sätter en digital utgång med ett SetDo objekt, förblir den satt
tills man återställer den med ett ResDo objekt.
För att läsa resp. tilldela värden på attribut (andra än ActualValue) använder man följande:
- GetAp och StoAp för analoga attribut.
- GetIp och StoIp för heltals attribut.
- GetDp och StoDp, SetDp eller ResDp för digitala attribut.
- GetSp för strängattribut.
- GetAtp och GetDtp for tidsattribut.
Logiska block
Det finns ett antal block tillgängliga för logisk programmering. t ex och-grind (And),
eller-grind (Or), inverterare och timer. För logisk programmering används digitala signaler.
Objekten är placerade under mappen 'Logic' i paletten.

Fig Logiska block
I figuren ovan ses en och-grind (And1). För objektet gäller följande:
- Ingångar till vänster
- Utgångar till höger
- Klassnamnet utskrivet överst.
- Objektsnamnet utskrivet underst (kan ändras av konstuktören).
- Man kan använda ett variabelt antal ingångar, default är 2 st.
- Ingångarna kan inverteras, vilket markeras med en cirkel på ingången.
Och-grind

Och-grindens attribut ändras från objektseditorn.

Fig Och-grindens attribut
De andra objekten under 'Logic' mappen har liknande attribut, se ProviewR Objekt handbok.
Beräkningsblock
Mappen 'Analog' i paletten innehåller ett antal objekt för att hantera analoga signaler,
t ex filter, additionsblock och integratorer.

Fig Aritmetiskt beräkningsblock
Här beskrivs inte funktionen hos objekten, men det kan vara lämpligt att kommentera
användningen av aritmetiska block. Blocken används för beräkning av användardefinierade
uttryck, som skrivs i programmeringsspråket C.
I figuren ovan kommer blocket att beräkna värdet (A1 + A2 * A3) och lägga detta på utgången.
A1, A2 och A3 representerar analoga värden, t ex signaler som antas vara kopplade till
ingångarna på objektet.
Uttrycken kan innehålla avancerad C kod med arrayer och pekare. När man skriver dessa bör
man medveten om att indexering utanför arrayer, eller felaktiga pekare kan gör att
exekveringen av plcprogrammet stoppas.
Larmövervakning
I ProviewR är det möjligt att övervaka analoga och digitala signaler. Övervakningen av analoga
signaler sker mot ett gränsvärde. Om gränsvärdet överskrids, skickas ett larm till 'event
monitorn' som i sin tur skickar det vidare till en utenhet, t ex ett larmfönster.
Se ProviewR Objekt handbok beträffande objektens attribut.
Övervakning av digitala signaler
För att övervaka digitala signaler eller attribut, använder man DSup objekt (Digital
Supervisory), som finns under mappen 'Logic' i paletten.
Signal eller ett attributet som ska övervakas, hämtas med ett Get-objekt som förbinds med
DSup objektet. Utgångar på logiska block kan kopplas direkt till DSup objektet.

Fig Digital övervakning
Figuren ovan visar övervakningen av en Dv signal.
Attributet 'CtrlPosition' i DSup objektet indikerar om larmet ska aktiveras när den
övervakade signalen blir sann eller falsk.
Övervakning av analoga signaler
För att övervaka analog signaler eller attribut, använder man ASup objekt (Analog
Supervisory), som finns under mappen 'Analog' i paletten.
Övervakningen sker på liknande sätt som för en DSup, med undantaget att man kan välja om
larmet ska utlösas om gränsvärdet underskrids eller överskrids.
Exekveringsordning
Exekveringsordningen bestäms normalt efter hur funktionsobjekten är sammankopplade. Ett
objekt vars utgång är kopplad till en ingång på ett annat objekt, exekverar före det objekt
det är kopplat till. Man kan se exekveringordningen genom att aktivera 'View/Show
Execute Order' i plc-editorns meny. För objekt och nät som inte är sammankopplade exekveras
bestämmer koordinaterna exekveringsordningen. Objekt som ligger högre upp exekveras först.
Om man vill påverka exekveringsordningen mellan två objekt kan man koppla en speciell
exekveringsordnings koppling mellan objekten. Denna väljs i kopplings-paletten och har en
pil i ena ändan. Den fungerar så att objektet som kopplingen pekar på exekverar efter objektet
som kopplingen utgår från.
Om ett nät innehåller en återkoppling, kan exekeveringordningen inte bestämmas och man får
felet 'Ambigous execute order'. Man måste då byta ut en koppling mot en feedback koppling, dvs
en koppling som inte bestämmer exekveringsordningen, så att exekveringsordningen blir
entydigt bestämd. Feedback-kopplingen är sträckad och väljs i verktygs-panelen eller i
kopplings-paletten.
I/O kopiering
Om en signal används på flera ställen i ett nät av funktions-objekt, och det finns risk att
signalens värde ändras under exekveringen kan man få låsningar och andra fenomen som är
svåra att förutse. Därför används en mekanism som kallas I/O kopiering. Signalvärdena för
signaler av typen Ai, Ao, Av, Di, Do, Dv, Ii, Io, Iv, Co, Bo och Bi, är samlade i speciella
area-objekt. Innan en plc-tråd börjar exekvera tar man en kopia av areaobjekten, och under
exekveringen görs alla läsningar från kopian, medan skrivningar görs i area-objekten.
Det innebär dels att man undviker den här typen av fenomen, men också att man kan få
fördröjningar. Om man sätter värdet på en signal, och sedan läser det i samma plc-tråd, kommer
förändringen inte att registreras förrän i nästa skan.
Kompilera plcprogrammet
Innan man börjar kompilera, måste man ange vilken platform (eller vilka plattformar) som
plcprogrammets volym ska exekvera på. Öppna volymsattribut-editorn från konfiguratören,
'File/Volume Attributes' i menyn, och ange operativsystem. Notera att mer än ett
operativsystem kan väljas. Volymen kan samtidigt köras i produktions-systemet, på ett
simulerings-system och i ett utbildnings-system, och alla kan ha olika plattform.
Nu kompileras plcprogrammet genom att välja 'File/Build' i plceditorns meny. Eventuella
fel och varningar visas i meddelandefönstret. Även när man bygger noden, kommer alla
nya eller modifierade plcpgm att kompileras.