QuickServer - How to unpack Bits from a 16bit Register in a FieldServer Configuration
Introduction
What happens if you want to serve some/all of the bits that form a 16 bit register ie. Your client reads a 16bit register but you want to serve those bits as separate binary objects?
Here is an example
- A series of 16 bit numbers
- A series of bits
The way it's interpreted depends on what kind of operation access the Data Array. If it's a 16 bit or analog-number-type operation, then it addresses 16 bit numbers. If the operation is a bit-operation, like for a binary data point, then the operation addresses each bit.
Therefore DA_PACKED[0] is ambiguous.
If you connected a server Map Descriptor to that point and the type is an Analog In/output, then it means it will address the 16bit number found at DA_PACKED[0].
If you connected a server Map Descriptor to that point and the type is an Binary In/output then it means the bit number found at DA_PACKED[0] and DA_PACKED[15] is the 16th bit. DA_PACKED[16] is the 1st bit of the next 16 bit number...
If that seems to complicated then add one more move:
Data_Arrays
Move_Only | DA_PACKED | 0 | DA_BIT | 0 | 16 |
This move moves the 16 bits for DA_PACKED[0] to 16 separate bits with unambiguous offsets and you can use those in the server map descriptors.
Heads Up
Data_Array_Name | Data_Format | Data_Array_Length |
DA_REG | UINT16 | 20 |
DA_PACKED | Packed_Bit | 100 |
DA_BIT | BIT | 1200 |
Preloads
Data_Array_Name | Preload_Data_Index | Preload_Data_Value |
DA_REG | 0 | 33 |
Moves
Function | Source_Data_Array | Source_Offset | Target_Data_Array | Target_Offset | Length |
Move_Only | DA_REG | 0 | DA_PACKED | 0 | 1 |
Move_Only | DA_PACKED | 0 | DA_BIT | 0 | 16 |