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é !!!