Con il rilascio di LogicLab versione 5.22.x.xx è stata aggiunta la gestione del tipo PVOID per identificare un puntatore void. Per accedere ai dati all’indirizzo di questo tipo di puntatore occorre tipizzarlo al tipo dato desiderato. Per semplificarne l’accesso sono fornite funzioni apposite.
Get dati da void pointer
eGetBYTE: Ritorna una variabile intera ad un byte, può essere utilizzata per variabili BOOL, BYTE, SINT, USINT.
BYTE eGetBYTE(PVOID RAddress);
eGetWORD: Ritorna una variabile intera a 2 bytes, può essere utilizzata per variabili WORD, INT, UINT.
WORD eGetWORD(PVOID RAddress);
eGetDWORD: Ritorna una variabile intera a 4 bytes, può essere utilizzata per variabili DWORD, DINT, UDINT.
DWORD eGetDWORD(PVOID RAddress);
eGetREAL: Ritorna una variabile float a 4 bytes, può essere utilizzata per variabili REAL.
REAL eGetREAL(PVOID RAddress);
eGetLWORD: Ritorna una variabile intera a 8 bytes, può essere utilizzata per variabili LWORD, LINT, ULINT.
LWORD eGetLWORD(PVOID RAddress);
eGetLREAL: Ritorna una variabile float a 8 bytes, può essere utilizzata per variabili LREAL.
LREAL eGetLREAL(PVOID RAddress);
Set dati su void pointer
eSetBYTE: Trasferisce variabile intera ad un byte, può essere utilizzata per variabili BOOL, BYTE, SINT, USINT. La funzione ritorna TRUE.
BOOL eSetByte(PVOID WAddress, BYTE WValue);
eSetWORD: Trasferisce variabile intera a 2 bytes, può essere utilizzata per variabili WORD, INT, UINT. La funzione ritorna TRUE.
BOOL eSetWORD(PVOID WAddress, WORD WValue);
eSetDWORD: Trasferisce una variabile intera a 4 bytes, può essere utilizzata per variabili DWORD, DINT, UDINT. La funzione ritorna TRUE.
BOOL eSetDWORD(PVOID WAddress, DWORD WValue);
eSetREAL: Trasferisce una variabile float a 4 bytes, può essere utilizzata per variabili REAL. La funzione ritorna TRUE.
BOOL eSetREAL(PVOID WAddress, REAL WValue);
eSetLWORD: Trasferisce una variabile intera a 8 bytes, può essere utilizzata per variabili LWORD, LINT, ULINT. La funzione ritorna TRUE.
BOOL eSetLWORD(PVOID WAddress, LWORD WValue);
eSetLREAL: Trasferisce una variabile float a 8 bytes, può essere utilizzata per variabili LREAL. La funzione ritorna TRUE.
BOOL eSetREAL(PVOID WAddress, LREAL WValue);
Esempi
Come utilizzare gli esempi.
Nel programma di esempio sono riportati alcuni utilizzi delle funzioni.
LogicLab (Ptp201, ST_GetDataFromPointer)
PROGRAM ST_GetDataFromPointer
VAR
pAV: PVOID; (* Auxiliary void pointer *)
BVar : ARRAY[0..2] OF BYTE; (* Byte variable *)
WVar : ARRAY[0..2] OF WORD; (* Word variable *)
DWVar : ARRAY[0..2] OF DWORD; (* Double word variable *)
RVar : ARRAY[0..2] OF REAL; (* Real variable *)
LWVar : ARRAY[0..2] OF LWORD; (* Long word variable *)
LRVar : ARRAY[0..2] OF LREAL; (* Long real variable *)
BArray : ARRAY[0..1] OF BYTE := [16#12, 16#34]; (* Byte array *)
WArray : ARRAY[0..1] OF WORD := [16#1234, 16#5678]; (* Word array *)
DWArray : ARRAY[0..1] OF DWORD := [16#01234567, 16#89ABCDEF]; (* Double word array *)
RArray : ARRAY[0..1] OF REAL := [1.23, 4.567]; (* Real array *)
LWArray : ARRAY[0..1] OF LWORD := [16#0123456789ABCDEF, 16#FEDCBA9876543210]; (* Long word array *)
LRArray : ARRAY[0..1] OF LREAL := [1.23, 4.567]; (* Long real array *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_GetDataFromPointer"
// *****************************************************************************
// This is an use of "eGetBYTE" function.
pAV:=ADR(BArray); //Auxiliary void pointer
BVar[0]:=eGetBYTE(pAV); //16#12
BVar[1]:=eGetBYTE(pAV+1); //16#34
BVar[2]:=eGetBYTE(ADR(BArray)+1); //16#34
// This is an use of "eGetWORD" function.
pAV:=ADR(WArray); //Void pointer
WVar[0]:=eGetWORD(pAV); //16#1234
WVar[1]:=eGetWORD(pAV+2); //16#5678
WVar[2]:=eGetWORD(ADR(WArray)+2); //16#5678
// This is an use of "eGetDWORD" function.
pAV:=ADR(DWArray); //Void pointer
DWVar[0]:=eGetDWORD(pAV); //16#01234567
DWVar[1]:=eGetDWORD(pAV+4); //16#89ABCDEF
DWVar[2]:=eGetDWORD(ADR(DWArray)+4); //16#89ABCDEF
// This is an use of "eGetREAL" function.
pAV:=ADR(RArray); //Void pointer
RVar[0]:=eGetREAL(pAV); //1.230
RVar[1]:=eGetREAL(pAV+4); //4.567
RVar[2]:=eGetREAL(ADR(RArray)+4); //4.567
// This is an use of "eGetLWORD" function.
pAV:=ADR(LWArray); //Void pointer
LWVar[0]:=eGetLWORD(pAV); //16#0123456789ABCDEF
LWVar[1]:=eGetLWORD(pAV+8); //16#FEDCBA9876543210
LWVar[2]:=eGetLWORD(ADR(LWArray)+8); //16#FEDCBA9876543210
// This is an use of "eGetLREAL" function.
pAV:=ADR(LRArray); //Void pointer
LRVar[0]:=eGetLREAL(pAV); //1.230
LRVar[1]:=eGetLREAL(pAV+8); //4.567
LRVar[2]:=eGetLREAL(ADR(LRArray)+8); //4.567
// [End of file]
LogicLab (Ptp201, ST_SetDataToPointer)
PROGRAM ST_SetDataToPointer
VAR
pAV : PVOID; (* Auxiliary void pointer *)
BArray : ARRAY[0..1] OF BYTE; (* Byte array *)
WArray : ARRAY[0..1] OF WORD; (* Word array *)
DWArray : ARRAY[0..1] OF DWORD; (* Double word array *)
RArray : ARRAY[0..1] OF REAL; (* Real array *)
LWArray : ARRAY[0..1] OF LWORD; (* Long word array *)
LRArray : ARRAY[0..1] OF LREAL; (* Long real array *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_SetDataToPointer"
// *****************************************************************************
// This is an use of "eSetBYTE" function.
pAV:=ADR(BArray); //Auxiliary void pointer
eTO_JUNK(eSetBYTE(pAV, 16#12)); //[16#12, 16#00]
eTO_JUNK(eSetBYTE(pAV+1, 16#34)); //[16#12, 16#34]
eTO_JUNK(eSetBYTE(ADR(BArray)+1, 16#34)); //[16#12, 16#34]
// This is an use of "eSetWORD" function.
pAV:=ADR(WArray); //Auxiliary void pointer
eTO_JUNK(eSetWORD(pAV, 16#1234)); //[16#1234, 16#0000]
eTO_JUNK(eSetWORD(pAV+2, 16#5678)); //[16#1234, 16#5678]
eTO_JUNK(eSetWORD(ADR(WArray)+2, 16#5678)); //[16#1234, 16#5678]
// This is an use of "eSetDWORD" function.
pAV:=ADR(DWArray); //Auxiliary void pointer
eTO_JUNK(eSetDWORD(pAV, 16#01234567)); //[16#01234567, 16#00000000]
eTO_JUNK(eSetDWORD(pAV+4, 16#89ABCDEF)); //[16#01234567, 16#89ABCDEF]
eTO_JUNK(eSetDWORD(ADR(DWArray)+4, 16#89ABCDEF)); //[16#01234567, 16#89ABCDEF]
// This is an use of "eSetREAL" function.
pAV:=ADR(RArray); //Auxiliary void pointer
eTO_JUNK(eSetREAL(pAV, 1.23)); //[1.230, 0.000]
eTO_JUNK(eSetREAL(pAV+4, 4.567)); //[1.230, 4.567]
eTO_JUNK(eSetREAL(ADR(RArray)+4, 4.567)); //[1.230, 4.567]
// This is an use of "eSetLWORD" function.
pAV:=ADR(LWArray); //Auxiliary void pointer
eTO_JUNK(eSetLWORD(pAV, 16#0123456789ABCDEF)); //[16#0123456789ABCDEF, 16#0000000000000000]
eTO_JUNK(eSetLWORD(pAV+8, 16#FEDCBA9876543210)); //[16#0123456789ABCDEF, 16#FEDCBA9876543210]
eTO_JUNK(eSetLWORD(ADR(LWArray)+8, 16#FEDCBA9876543210)); //[16#0123456789ABCDEF, 16#FEDCBA9876543210]
// This is an use of "eSetLREAL" function.
pAV:=ADR(LRArray); //Auxiliary void pointer
eTO_JUNK(eSetLREAL(pAV, LREAL#1.23)); //[1.230, 0.000]
eTO_JUNK(eSetLREAL(pAV+8, LREAL#4.567)); //[1.230, 4.567]
eTO_JUNK(eSetLREAL(ADR(LRArray)+8, LREAL#4.567)); //[1.230, 4.567]
// [End of file]