31 lines
1.4 KiB
Markdown
31 lines
1.4 KiB
Markdown
|
|
||
|
```pascal
|
||
|
#t_Address := #InVar; // Open the ANY pointer so we can work
|
||
|
IF #t_Any_UDT.Source_DataType = 16#01 THEN // Work only with bools
|
||
|
#t_Byte := DWORD_TO_INT(SHR(IN := #t_Any_UDT.Source_Byte_Pointer, N := 3)); // Get the byte
|
||
|
#t_Bit := DWORD_TO_BYTE(#t_Any_UDT.Source_Byte_Pointer) AND 15; // Get the bit
|
||
|
#Alarm := PEEK_BOOL(area := #cDB, dbNumber := #t_Any_UDT.Source_DB_Number, byteOffset := #t_Byte, bitOffset := #t_Bit); // Ask the state of the bit
|
||
|
|
||
|
IF #Alarm THEN
|
||
|
// First we calculate the max magnitude we need, the number of 0 to use to pack all numbers so DB[XXX] + Byte[BBB] + Bits[b] => XXXBBb
|
||
|
IF #t_Byte = 0 THEN
|
||
|
#t_Magnitude_Byte := 1; // In case Byte is 0 LN(0) is undefined so we use 1 to get the space for the byte
|
||
|
ELSE
|
||
|
#t_Magnitude_Byte := #t_Byte;
|
||
|
END_IF;
|
||
|
#t_Magnitude := REAL_TO_DINT(EXP(LN(10) * TRUNC(LN(WORD_TO_INT(#t_Any_UDT.Source_DB_Number)) / LN(10)) + TRUNC(LN(WORD_TO_INT(#t_Magnitude_Byte)) / LN(10))));
|
||
|
#Value := WORD_TO_DINT(#t_Any_UDT.Source_DB_Number) * #t_Magnitude + #t_Byte * 10 + #t_Bit;
|
||
|
END_IF;
|
||
|
END_IF;
|
||
|
```
|
||
|
|
||
|
|
||
|
Esempio di chiamata:
|
||
|
```pascal
|
||
|
CALL "FC Any To Dint on Alarm"
|
||
|
Address :="DB Pack Alarm".A471_39_4
|
||
|
Num_Alarm :=#T_Warning_Zone
|
||
|
```
|
||
|
|
||
|
Se questo bit `"DB Pack Alarm".A471_39_4` e true ritorna 471394 su `#T_Warning_Zone`
|