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 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; |
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. |
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). |
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; |
Variantná časť, nesúca vlastnú hodnotu objektu:
Stav alarmu | Index |
Alarm | 0 |
NoKvit | 1 |
Kvit | 2 |
Norm | 3 |
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).
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é !!!