D2000 OBJApi - Štruktúry rozhrania

Od verzie D2000 V9.02.034 je dostupná 32 aj 64-bitová verzia s upraveným hlavičkovým súborom pre použitie v projektoch s interpretáciou textových reťazcov v 8-bitovej forme (ANSI) alebo v 16-bitovej forme (wide character UNICODE), podľa nastavenia parametra projektu "Character Set" v prostredí MS Visual Studio.

Štruktúra UniVal


Štruktúra UniVal obsahuje všetky informácie o hodnote a stave objektu systému D2000.

Deklarácia v jazyku C:

typedef struct _UniVal
 {
     GenValueType gvaltyp;
     unsigned int status;
     tLimitStatus limitStatus;
     tProcAlarmType procAlarmStatus;
     ValueType type;
     double valtime;
     double procAlarmTime;
     unsigned int Flags;
     VOBJ Indirect;
     union
     {
         tBVal Boval;
         int Intval;
         double Realval;
         StVal Stval;
         struct
         {
             AlVal Alval;
             double AlTimes[4];
         } a;
         PrVal Prval;
         double TmAval;
         double TmRval;
         tQValue QVal;
         char *TxtVal;
         ArrayRecPtr ArrayValPtr;
         struct
         {
             ArrayRecPtr recordValPtr;
             HOBJ StructTypId;
             int ColsNr;
         } r;
     } v;
 } UniVal;

Popis jednotlivých častí štruktúry:

Variantná časť, nesúca vlastnú hodnotu objektu:

Upozornenie pre niektoré typy hodnôt:
Štruktúra UniVal obsahuje pre objekty typu text a pole iba odkazy na hodnoty. Vlastné hodnoty sú vytvorené dynamicky a treba ich po použití uvoľniť volaním funkcie FreeData. Výnimku tvorí asynchrónne volanie obsluhy novej hodnoty NewValueProc (po návrate z obsluhy je uvoľnenie pamäti hodnôt vykonané v réžií ObjAPI) a funkcia ListOfObjects (hodnoty sú uvoľnené pri uvoľnení štruktúr typu ListObjData volaním funkcie FreeData).

Reprezentácia polí a štruktúr:


Polia a štruktúry sú reprezentované poľom hodnôt typu UniVal pred ktorým sú dolný (lowIndex) a horný (hiIndex) index. Položky poľa sú indexované od 1. Za položkou hiIndex nasledujú postupne jednotlivé hodnoty po riadkoch.

typedef struct _ArrayRec
 {
     int lowIndex;
     int hiIndex;
 } ArrayRec;
 typedef ArrayRec * ArrayRecPtr;

Prístup k položke štruktúry (riadok, stĺpec) znázorňuje nasledovná funkcia:

UniValPtr GetRecordItem(UniVal value, int row, int col)
 {
     UniValPtr uni_Ptr;
     int valueIdx;
     valueIdx = (row-1)*value.v.r.ColsNr+col - 1;
     // adresa prvej hodnoty
     uni_Ptr = (UniValPtr)((char *)value.v.r.recordValPtr +
               sizeof(*value.v.r.recordValPtr));
     uni_Ptr = &(uni_Ptr[valueIdx]);
     return uni_Ptr;
 }

Pri volaní procedúr rozhrania je dôležité, aby boli indexy korektne vyplnené !!!