Funktionsobjekt


Funktionsobjektet är gränssnittet i plc-programmet. Det definierar in och utgångar som kan
kopplas till andra funktionsobjekt i plc-editorn. Till skillnad från ett vanligt
funktionsobjekt jobbar koden i funktionsobjektet för en komponent även mot data i
huvudobjektet.

Man kan skriva koden i plc-kod eller i c-kod.

plc-kod

Om man vill att koden i funktionsobjektet ska vara synlig, och det finns behov av att kunna gå
in och köra PlcTrace i koden, är det lämpligt att använda ett funktionsobjekt med plc-kod.

Skapa ett $ClassDef objekt och sätt namn på objektet. Lämpligen tar man samma namn som
huvudklassen föjt av suffixet 'Fo', t ex MyComponentFo. Aktivera därefter Configure-ConnectedFo
i popupmenyn.

Under RtBody har det skapats ett PlcConnect attribut av typen AttrRef, som kommer att innehålla
länken till huvudobjektet när man har gjort connect i plc-editorn.

Konfigurera in och utgångar med $Input och $Output objekt under RtBody objektet. Man kan även
lägga in $Intern objekt, men vanligtvis lagrar man denna typ av data i huvudobjektet. Observera
att ordningen bland attributobjekten ska var $Input, $Intern, $Output.

Koden skapas genom att öppna plceditorn för Code objektet. I koden hämtar man upp värden från
ingångar genom att välja ut ingångsattributen i template objekete för funktionsobjektet i
navigatören och aktivera connect funktionen. Utgångar sätts på motsvarande sätt. När data ska
hämtas eller sättas i huvud-objektet, väljar man ut attribut i huvudobjektets template-objekt.
Referenser till funktionsobjektet visas i plc-koden med symbolen $PlcFo och referenser till
huvudobjektet med symbolen $PlcMain.

Om objektet innehåller komponenter läggs funktionsobjekten för dessa komponenter in i
plc-koden.

Har man DisableAttr på signaler eller andra attribut måste man hantera detta med villkorlig
exekvering i koden. En signal som är satt Disable för inte sättas eller läsas i koden. Man
använder objektet Disabled under mappen Other, för att hämta upp om ett attribut är satt Disable
eller inte. Detta kan sedan kopplas till ett CArea som står för den villkorliga exekveringen.


Villkorlig exekvering med Disabled och CArea

c-kod

Ett funktionsobjekt med c-kod konfigureras med ett $ClassDef objekt. Sätt namn på objektet
och aktivera därefter Configure-ConnectedCCodeFo i popupmenyn.

Under RtBody har det skapats två attribut, PlcConnect av typen AttrRef och PlcConnectP som
är en pekare. I PlcConnect läggs referensen till huvudobjektet in, när man gör connect på en
instans i plc-editorn. Vid initieringen av plc-programmet i runtime hämtar man, med hjälp av
referensen, en pekare till huvudobjektet. Pekaren läggs i PlcConnectP. Detta görs i c-koden
som är uppdelad i en init funktion som exekveras vid initieringen av plc-programmet, och en
exec function som exekveras varje scan. För funktionsobjektet MyComponentFo med ingångarna
In1 och In2 och utgången Out2 kan koden se ut på följande sätt.

void MyComponentFo_init( pwr_sClass_MyComponentFo *o)
{
   pwr_tDlid dlid;
   pwr_tStatus sts;

   sts = gdh_DLRefObjectInfoAttrref( &o->PlcConnect, (void **)&o->PlcConnectP, &dlid);
   if ( EVEN(sts))
     o->PlcConnectP = 0;
}

void MyComponentFo_exec( plc_sThread *tp,
                          pwr_sClass_MyComponentFo *o)
{
   pwr_sClass_MyComponent *co = (pwr_sClass_MyComponent *) o->PlcConnectP;

   if ( !co)
     return;

   o->Out = co->Value = co->Factor * (*o->In1P + *o->In2P);
}