Huvudobjekt


Huvudobjektet innehåller alla data som behövs för att konfigurera och göra beräkningar.
Objektet läggs i planthierarkin, som ett individuellt objekt eller som en del av ett
aggregat.

Ofta använder man BaseComponent:Component som superklass till komponentobjekt och för då med
ett antal attribut, som Description, Specification, DataSheet etc.

Alla in- och utgångsignaler som finns på komponenten ska finnas i huvudobjektet. Di, Ii, Ai,
Do, Io, Ao eller Co objekt läggs som attributobjekt. När man skapar instanser av komponenten
måste signalerna kopplas till kanalobjekt. För t ex Profibus, kan man skapa ett modulobjekt
som innehåller kanalerna, och, i klasseditorn, förkoppla signalerna i huvudobjektet till dessa
kanaler. För varje instans behöver man då inte koppla varje signal för sig, utan kan göra en
koppling mellan huvudobjekt och modulobjekt.

Speciella attribut

PlcConnect
Om det finns någon kod för objektet som ska exekveras av plc-programmet, skapar man ett
funktionsobjekt för klassen. Detta måste kopplas till huvudobjektet, och denna koppling ska
ligga i ett attribut med namnet 'PlcConnect' av typen pwrs:Type-$AttrRef.

SimConnect
Om det finns ett simulerings objekt så kopplas det till huvudobjektet med 'SimConnect'
attribute av typen pwrs:Type-AttrRef.

IoConnect
Om det finns ett I/O-modul objekt kopplas detta med ett attribut, 'IoConnect' av typen
pwrs:Type-AttrRef. Attributet hanteras av IoConnect metoden.

IoStatus
Om man vill hämta upp status från I/O-modul objektet skapar man attributet 'IoStatus' av
typen pwrs:Type-$Status, och sätter Pointer biten i Flags.

Attributet kommer att tilldelas en pekare till I/O modulens Status attribut i runtime vid
initieringen av I/O hanteringen. Status-attributet är av typen Status och kan t ex visas i en
objektsbild med dynamiktypen StatusColor. Om man vill använda IoStatus i plc-koden för
objektet, måste man tänka på att attributet är en pekare och hämta upp värdet upp med
GetIpPtr.

SequenceReset
Det är möjligt att använda Grafcet sekvenser i en komponent. En skillnad från en ordinär
sekvens är att resetobjektet ska vara definierat med ett attribut av klass Dv med namnet
'SequenceReset'i huvudobjektet. SubStep kan inte användas if sekvensen.

GraphConfiguration
GraphConfiguration är av typ Enum och används för att bestämma vilken objektsbild som ska
öppnas för den aktuella instansen. Används av 'ConfigureComponent' metoden (se nedan).

DisableAttr

DisableAttr funktionen gör att möjligt att göra Disable på ett attribut i en instans. Om man
har gjort Disable på ett attribut, visas attributet inte i navigatorn eller objekts editorn.
Är attributet en signal, kommer den att ignoreras av I/O-hanteringen.

Funktionen används för komponenter som kan förekomma i olika varianter och konfigurationer.
En magnetventil, till exempel, kan ha ett gränsläge som indikerar att ventilen är öppen, och
ett som indikerar att ventilen är stängd. Totalt blir det fyra varianter av magnetventilen:

- inga gränslägen.
- gränsläge öppen.
- gränsläge stängd.
- både gränsläge öppen och gränsläge stängd.

Man skulle kunna göra fyra olika magnetventilsklasser, man problemen uppstår när man bygger
aggregat av ventil objekten. Ett aggregat som innehåller ett ventilobjekt måste även det
finnas i fyra olika varianter, och skulle aggregatet innehålla två ventilobjekt måste det
finnas i 16 varianter. Genom att använda DisableAttr funktionen på gränslägesattributen kan
man göra en magnetventilklass som täcker in alla fyra varianterna, och som även kan användas
i aggregat-klasser.

DisableAttr för ett attribut läggs in på följande sätt.
- DisableAttr biten i Flags sätts för attributet.
- före attributet läggs ett attribut av typen pwrs:Type-$DisableAttr, med samma namn som
attributet men med prefixet 'Disable'. Invisible biten i Flags ska sättas för DisableAttr
attributet.

Exempel
I Magnetventilsklassen ovan representeras gränsläge stängd av attributet SwitchClosed som är
en digital signal av type pwrb:Class-Di. Omedelbart före attributet läggs ett attribut med
namnet 'DisableSwitchClosed' av typen pwrs:Type-$DisableAttr. För detta attribut sätts
Invisible biten i Flags, och för SwitchClosed attributet sätts DisableAttr biten i Flags.


Attribut med disable funktion

Cast

Komponent-klasser byggs ofta relativt flexibla för att minimera antalet varianter. Ofta gör
man en basklass som använder sig av DisableAttr funktionen för att kunna användas i ett
antal olika konfigurationer. I exemplet ovan kan en klass för en magnetventil täcka in fyra
olika konfigurationer av gränslägen genom att sätta DisableAttr på gränslägessignalerna. Man
skapar även subklasser som är anpassade till en speciell ventil. En Durholt 100.103 till
exempel har inga gränslägen, och man skapar då en subklass till magnetventilklassen, sätter
Disable på båda gränslägena i template-objektet för subklassen, och lägger även in en länk
till datablad och gör en del andra anpassingar. Resultatet blir en subklass som man kan
använda för Durholt 100.103 ventiler utan att behöva konfigurera varje enskild instans.

Om vi nu bygger ett generellt aggregat som innehåller en magnetventil, och vill kunna
utnyttja de subklasser som finns för magnetventilen, använder man Cast funktionen.
Cast-funktionen innebär att ett attributobjekt kan castas som en subklass av dess ursprungliga
klass, om subklassen har samma storlek. När ett attributobjekt castas hämtas defaultvärden,
och därmed konfigureringar från subklassen. Även klassnamn och metoder hämtas från subklassen.

Cast funktionen för ett attribut läggs in på följande sätt:
- CastAttr biten sätt i Flags för attributet.
- Före attributet läggs ett attribut av typen pwrs:Type-$CastId med samma namn som attributet
men med prefixet 'Cast'. Invisible biten i Flags ska sättas för cast attributet.


Kontaktor med cast attribut

Castningen av en instans utförs genom att aktivera 'Cast' metoden i popupmenyn för attributet.
En lista med basklassen och samtliga subklasser visas, där man kan välja den klass
attributobjektet ska castas som.

Om ett attribut har både cast och disable attribut ska castattributet placeras före disable
attributet.


Castning av en instans




Metoder

Metoden ConfigureComponent

Ofta finns det många varianter på en komponent. I exemplet med magnetventilen ovan, hittade
vi fyra olika varianter beroende på konfigurationen av gränslägen. För att förenkla
konfigureringen av komponenten för användaren, kan man definiera metoden 'ConfigureComponent'.

ConfigureComponent metoden gör det möjligt att utifrån ett menyalternativ i popupmenyn sätta
Disable på ett eller ett antal attribut, samt att välja en objektbild som är anpassad för den
aktuella konfigurationen.

Meny
Menyalternativen för ConfigureComponent defineras med meny-objekt. Under $ClassDef objektet
läggs ett $Menu objekt med namnet 'ConfiguratorPosos', vilket medför att menyn är synlig i
editeringsmod när objektet är utpekat och utvalt. Under detta läggs ytterligare ett $Menu
objekt med namnet 'Pointed', och under detta ett $MenuCascade objekt med namnet
'ConfigureComponent'. Attributet ButtonName sätts till 'ConfigureComponent' för detta objekt.
Under detta läggs slutligen ett $MenuButton objekt för varje konfigureringsalternativ.
Namnet sätt lämpligen till namnet på konfigureringsalternativet, och läggs också in i
attributet ButtonName. I attributet MethodName anges '$Object-ConfigureComponent' och i
attributet FilterName '$Object-ConfigureComponentFilter'. Man ska även fylla i argument till
metoden i MethodArguments. MethodArguments[0] innehåller en bitmask som avgör vilka attribut
som ska göras Disable på i det aktuella menualternativet. Varje attribut som det är möjligt
att göra Disable på representeras av en bit, och bitordningen motsvarar attributens ordning i
objektet. MethodArguments[1] innehåller den grafiska representationen, se nedan.

Om vi tittar på magnetventilen, har den två attribut som kan göras Disable på, SwitchClosed
och SwitchOpen. I bitmasken i MethodArguments[0] motsvarar SwitchClosed första biten, och
SwichOpen andra biten, dvs om första biten är satt, görs Disable på SwitchClosed, och om
andra biten är satt görs Disable på SwitchOpen. De fyra konfigureringsalternativen TwoSwitches,
SwitchClosed, SwichOpen och NoSwitches motsvaras av följande masker

TwoSwitches 0 (både SwitchOpen och SwitchClosed är närvarande)
SwitchClosed 2 (Disable på SwitchOpen)
SwitchOpen 1 (Disable på SwitchClosed)
NoSwitches 3 (Disable på både SwitchOpen och SwitchClosed)



Konfigurering av komponent-attribut
Om man gör disable på ett attribut som är en komponent som i sin tur innehåller signaler, måste
man göra disable även på signalerna i komponenten. I/O hanteringen tittar enbart på om den
individuella signalen är satt Disable, och letar inte uppåt i attribut-nivåerna. För att göra
Disable på en signal i ett komponent-attribut adderar man ett kommatecken samt namnet på
komponenten följt av den Disable mask som gäller för komponenten i MethodArguments[0]. I ett
objekt där man till exempel har gjort Disable på komponenterna Contactor och CircuitBreaker kan
MethodArguments[0] se ut på följande sätt

3, Contactor 1, CircuitBreaker 1

där '3' är objektets Disable mask (som gör Disable på attributen Contactor och CircuitBreaker),
och 'Contactor 1' medför att Disable sätts på ett signalattribut i Contactor, och
'CircuitBreaker 1' gör Disable på en signal i CircuitBreaker.

Det finns även en annan syntax med parenteser som tillåter mer än två nivåer. I det här
exemplet är objektet ovan, Motor, del av ett större aggregat.

(5 (Motor 3 (Contactor 1, CircuitBreaker 1), Temp 1))

Komponent-attribut med individuell konfigurering
När ConfigureComponent metoden aktiveras tas Disable bort i alla komponentattribut för att
återställa den tidigare konfigureringen. Ibland har man komponenter-attribut som inte ingår
i objektets konfigurering, utan som ska konfigureras individuellt. Dessa komponenter ska inte
återställas av ConfigureComponent metoden, och måste anges i MethodArguments[2], separerade
med komma-tecken. I följande exempel ska komponent-attributen Motor och Contactor konfigureras
med sina egna ConfigureComponent metoder och inte påverkas av objektets ConfigureComponent
metod. I MethodArguments[2] skrivs

Motor, Contactor


Objektbild

När man ritar objektsbilden för komponenten måste man ta hänsyn till vilken konfigurering som
gäller. Om skillnaderna är små kan man använda Invisible dynamiken. Om skillnaden är större
kan det vara smidigare att rita separata bilder för olika konfigurationer. Man lägger då in
ett attribut i objektet med namnet GraphConfiguration av typen Enum. Lämpligen skapar man en
speciell enum-typ med aktuella alternativ. Om GraphConfiguration är 0 används standard grafen,
annars sätts de numeriska värdet i GraphConfiguration som suffix på graf-namnet.

För exemplet med magnetventilen, MValve, gör vi en enum-typ, MValveGCEnum, och definerar
värdena

TwoSwitches 0
SwitchClosed 1
SwitchOpen 2
NoSwitches 3

För konfigurationen TwoSwitches, med värdet 0, ritar vi en objektsgraf med namnet mvalve.pwg.
För SwitchClosed, med värdet 1, namnger vi grafen mvalve1.pwg, för SwitchOpen mvalve2.pwg och
för NoSwitches mvalve3.pwg.

Vi lägger även in enum-värdet i MethodArguments[1] i $MenuButton objektet för den aktuella
konfigurationen. Det kommer att medföra att GraphConfiguration sätts till detta värde när detta
menyalternativ aktiveras.


Enumeration typ för GraphConfiguration