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:
- gvaltyp
Určuje typ hodnoty objektu pre variantnú časť štruktúry UniVal. - status
Stav hodnoty, nadobúda kombináciu hodnôt:
Definícia konštanty Popis #define VAL_Valid 1U Hodnota objektu je platná. #define VAL_ProcAlarm 2U Objekt má aktívny procesný alarm. #define VAL_NoAckPAlarm 4U Objekt mal aktívny procesný alarm, ktorý nebol potvrdený. #define VAL_PrAlSilent 8U Procesné alarmy objektu sa nevyhodnocujú. #define VAL_Weak 16U Hodnota objektu je podozrivá – "weak". #define VAL_NoAckValue 32U Objekt zmenil hodnotu a táto nebola potvrdená. #define VAL_Transient 64U Hodnota objektu je v prechodnom stave pri zápise. #define VAL_Default 128U Hodnota je v implicitnom stave. #define VAL_Manual 256U Hodnota objektu bola zmenená ručne. #define VAL_PrAlCrit 512U Objekt má aktívny kritický procesný alarm. - limitStatus
Stav hodnoty objektu vzhľadom ku konfigurovaným medziam hodnoty:
typedef enum {InLimit,VL_Limit,L_Limit,H_Limit,VH_Limit,LimitsProblem} tLimitStatus;
Stav hodnoty Popis stavu InLimit Hodnota objektu je v rozsahu platných medzí. L_Limit Hodnota objektu klesla pod dolnú medzu. VL_Limit Hodnota objektu klesla pod najnižšiu medzu. H_Limit Hodnota objektu prekročila hornú medzu. VH_Limit Hodnota objektu prekročila najvyššiu medzu. LimitsProblem Objekt má problém s vyhodnotením medzí (neznáma hodnota aktívnej medze, aktívne medze prekrížili svoje hodnoty). - procAlarmStatus
Typ aktívneho procesného alarmu.
typedef enum {NoAlarm,ToOn,ToOff,On,Off,Err,Oscillate,ErrCmdOn,ErrCmdOff, SwToTrans,SwToOff,SwToOn,SwToErr,SwTrans,SwOff,SwOn,SwErr,ErrZalCmdOff, HL,VHL,LL,VLL,ToHL,ToVHL,ToLL,ToVLL,ErrWriteCmd,A28,A29,A30,A31,A32} tProcAlarmType; - type
Typ objektu systému D2000.
- valtime
Čas poslednej zmeny hodnoty objektu.
- procAlarmTime
Čas poslednej zmeny procesného alarmu objektu. - Flags
Bitové pole: Príznaky hodnoty objektu (A až P). - Indirect
Ak hodnota pochádza z položky štruktúry typu Object, je tu zdroj hodnoty (id objektu a row, col).
Variantná časť, nesúca vlastnú hodnotu objektu:
- Boval
Hodnota objektu typu Boolean (type : Bo, Di, Do, De, Li) - Intval
Hodnota objektu celočíselného typu (type : Int, Ci, Co, Ce) - Realval
Hodnota objektu reálno-číselného typu (type : Re, Ai, Ao, Ae) - Stval
Hodnota objektu typu stanica (type : St) - a.Alval
Hodnota objektu typu alarm (type : Al) - a.AlTimes
Časy jednotlivých stavov alarmov indexované:
Stav alarmu Index Alarm 0 NoKvit 1 Kvit 2 Norm 3 - Prval
Hodnota objektu typu proces (type : Pr) - TmAval
Hodnota objektu absolútnych časových typov (type : TmA, TiA, ToA). - TmRval
Hodnota objektu relatívnych časových typov (type : TmR, TiR, ToR). - Qval
Hodnota štvorstavového vstupu (type : Qi). - TxtVal
Hodnota objektu typu text (type : Txt, TxtI, TxtO). - ArrayValPtr
Hodnota objektu typu pole (type : Arr). - r.recordValPtr
Odkaz na hodnotu štruktúry (type : Rec). - r.StructTypId
Id objektu typu Definícia štruktúry, ktorá definuje typ hodnoty. - r.ColsNr
Počet stĺpcov v štruktúre.
!!! UPOZORNENIE !!!
Od verzie 7.0 sa položka a.AlTimes nepoužíva a preto bola premenovaná na a.AlTimes_Unused. Prvky poľa sú plnené hodnotou 0.0.
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é !!!
Pridať komentár