Sample Data Groups — Modbus Only
The following are sample Modbus data groups. Your needs determine exactly how the data groups are defined.
See the following subsections for details:
Default Data Group — Non-ordinalized
Default data groups can be defined in a device template file.
Example
<defDataGroups>
<Version/>
<BasicPoll/>
<AnlgScale/>
<PlungerCtl/>
</defDataGroups>
Default Data Group — Ordinalized
Default data groups can be defined in a device template file.
Example
<defDataGroups>
<Gas ordinal="1" niceName="Gas Analysis Run #1"/>
<Gas ordinal="2" niceName="Gas Analysis Run #2"/>
<Gas ordinal="3" niceName="Gas Analysis Run #3"/>
<Gas ordinal="4" niceName="Gas Analysis Run #4"/>
</defDataGroups>
Data Group — Contiguous Registers
Register numbers are contiguous, so all data can be returned in a single read block.
Example
Data is a read-only group.
<AnlgInput niceName="Analog Inputs">
<dgElements byteOrder="bigEndian" secLev="4" type="r4">
<AI1 desc="Analog #1" regNum="9501"/>
<AI2 desc="Analog #2" regNum="9502"/>
<AI3 desc="Analog #3" regNum="9503"/>
<AI4 desc="Analog #4" regNum="9504"/>
<AI5 desc="Analog #5" regNum="9505"/>
</dgElements>
<modbusReadBlocks>
<block1 regNum="9501" regCnt="5" funcCode="3" regOff="0" regByteLen="4"/>
</modbusReadBlocks>
</AnlgInput>
Data Group — Multiple Read Blocks
Multiple read blocks are required for two reasons: 1) the byte count exceeds 250; or 2) multiple function codes are required.
Example
<Inst niceName="Instant Data" baseOrd="1" maxCnt="4" forceSave="true">
<dgElements byteOrder="bigEndian" secLev="4" type="r4">
<DayFlRt desc="Daily Flow Rate" regDef="1:0"/>
<BattVolt desc="Battery Voltage" regNum="6102"/>
<DP desc="Differential Pressure" regDef="3:0"/>
<SP desc="Static Pressure" regDef="3:1"/>
<Temp desc="Temperature" regDef="3:2"/>
<InstRate desc="Instantaneous Flow Rate" regDef="3:3"/>
<ToFlow desc="Today's Flow" regDef="3:4"/>
<ToEner desc="Today's Energy" regDef="3:5"/>
<Totaliz desc="Totalizer" regDef="3:6"/>
<YestFlow desc="Yesterday's Flow" regDef="3:7"/>
<UncTot desc="Uncorrected Total" regDef="3:8"/>
<SqrtExt desc="Square Root Ext" regDef="3:9"/>
<Beta desc="Beta" regDef="3:10"/>
<FPV desc="FPV" regDef="3:11"/>
<FnFr desc="Fn/Fr" regDef="3:12"/>
<FslFr desc="Fsl/Fr E/d" regDef="3:13"/>
<FcFr desc="Fc/Fr K" regDef="3:14"/>
<Red desc="ReD/Fb" regDef="3:15"/>
<Fg desc="Fg" regDef="3:16"/>
<Y1 desc="Y1/Fa" regDef="3:17"/>
<Ftf desc="Ftf" regDef="3:18"/>
<Fpb desc="Fpb" regDef="3:19"/>
<Ftb desc="Ftb" regDef="3:20"/>
<SpExpY desc="Spare/EXP Y" regDef="3:21"/>
<SpY desc="Spare/Y Sub" regDef="3:22"/>
<Zb desc="Zb" regDef="3:23"/>
<Zf desc="Zf/GAMMA" regDef="3:24"/>
<Zs desc="Zs/SIGMA3" regDef="3:25"/>
<SpEps desc="Spare/Epsilon" regDef="3:26"/>
<DayEnRt desc="Daily Energy Rate" regDef="1:1"/>
</dgElements>
<modbusReadBlocks regByteLen="4">
<block1 regNum_ord1="21003" regNum_ord2="21015" regNum_ord3="21027" regNum_ord4="21039" regCnt="2" funcCode="3"/>
<block2 regNum="6102" regCnt="1" funcCode="3"/>
<block3 regNum_ord1="8001" regNum_ord2="8101" regNum_ord3="8201" regNum_ord4="8301" regCnt="27" funcCode="3"/>
</modbusReadBlocks>
</Inst>
Data Group — Single Element Read/Write Group
Data group with a single element.
Example
Group is a read/write group.
<TankLvl niceName="Tank Level" udcCat="UDCALL" maxCnt="1" canSend="true" uccSend="true">
<dgElements byteOrder="bigEndian" secLev="4" type="boolean">
<di3 desc="Tank Level High" regNum="99"/>
</dgElements>
<modbusReadBlocks regOff="-1">
<block1 regNum="99" regCnt="1" funcCode="1" regBitLen="1"/>
</modbusReadBlocks>
<modbusWriteBlocks regOff="-1">
<block1 regNum="99" regCnt="1" funcCode="5" regBitLen="1"/>
</modbusWriteBlocks>
</TankLvl>
Data Group — Reference
One data group element contains a reference to another data group element.
Example
The element ClkTm references ClkTimRaw for its value.
<ClkTmRaw desc="Click Time Raw" regNum="40001"/>
<ClkTm desc="Click Time" type="r4" ref="ClkTmRaw" scaleFactor="0.1"/>
Data Group — Enumerated Data
Enumerated data.
Example
The data is retrieved for the element TapLocRaw. This element is hidden. The element TapLoc references TapLocRaw for the data. The mapVal attribute defines the element that contains the conversion values, which in this example is TapLocOptions.
<TapLocRaw desc="Tap Location Raw Data" regNum="99" hidden="true"/>
<TapLoc desc="Tap Location" ref="TapLocRaw" mapVal="TapLocOptions">
<TapLocOptions>
<e0 value="Downstream"/>
<e1 value="Upstream"/>
</TapLocOptions>
</TapLoc>
Data Group — Bit Position
Bit position.
Example
The elements derive their data from the bits of register 40100.
<TrndARaw desc="Trend Analogs" regNum="40100" dMask="0x%08X"/>
<TaCp desc="Trend CP" type="boolean" ref="TrndARaw" bPos="0"/>
<TaTp desc="Trend TP" type="boolean" ref="TrndARaw" bPos="1"/>
<TaIp desc="Trend IP" type="boolean" ref="TrndARaw" bPos="2"/>
<TaDp desc="Trend DP" type="boolean" ref="TrndARaw" bPos="3"/>
<TaLp desc="Trend LP" type="boolean" ref="TrndARaw" bPos="4"/>
<TaLt desc="Trend LT" type="boolean" ref="TrndARaw" bPos="5"/>
<TaUt desc="Trend ST" type="boolean" ref="TrndARaw" bPos="6"/>
<TaAl desc="Trend AL" type="boolean" ref="TrndARaw" bPos="7"/>
The elements derive their data from the bits of register 40223.
<StatusBits desc="StatusBits" regNum="40223" type="r4"/>
<bCutOff desc="Meter Below Cutoff flag" type="boolean" bPos="0" ref="StatusBits"/>
<bCalcOn desc="Calc Enabled Flag" type="boolean" bPos="4" ref="StatusBits"/>
<bAGAErr desc="AGA 8 Error flag" type="boolean" bPos="6" ref="StatusBits"/>
Data Group — Ordinalized
The regDef attribute of the data group element defines the read block and the offset to the starting register (Block#:RegisterOffset#).
Example
The read block attribute regNum_ord# defines the starting register for the # instance of the group.
<FlowVals niceName="Flow Values" devDG="true" maxCnt="2" baseOrd="1">
<dgElements byteOrder="BigEndian" secLev="4" type="i2">
<SP desc="Static Pressure" regDef="1:00"/>
<DP desc="Diff Pressure" regDef="1:01"/>
<Temp desc="Gas Temp" regDef="1:02"/>
<FlowRate desc="Flow Rate" regDef="1:03"/>
</dgElements>
<modbusReadBlocks>
<block1 regCnt="4" funcCode="3" regNum_ord1="710" regNum_ord2="910" regOff="0" regByteLen="2"/>
</modbusReadBlocks>
</FlowVals>
Multiple read blocks can be defined, if necessary.
<FlowVals niceName="Flow Values" devDG="true" maxCnt="2" baseOrd="1">
<dgElements byteOrder="BigEndian" secLev="4" type="i2">
<SP desc="Static Pressure" regDef="1:00"/>
<DP desc="Diff Pressure" regDef="1:01"/>
<Temp desc="Gas Temp" regDef="1:02"/>
<FlowRate desc="Flow Rate" regDef="1:03"/>
<EnRate desc="Energy Rate" regDef="2:00"/>
<FlowTdy desc="Flow Time Today" regDef="3:00"/>
</dgElements>
<modbusReadBlocks>
<block1 regCnt="4" funcCode="3" regNum_ord1="710" regNum_ord2="910" regOff="0" regByteLen="2"/>
<block2 regCnt="1" funcCode="3" regNum_ord1="751" regNum_ord2="951" regOff="0" regByteLen="2"/>
<block3 regCnt="1" funcCode="3" regNum_ord1="803" regNum_ord2="1003" regOff="0" regByteLen="2"/>
</modbusReadBlocks>
</FlowVals>
Alternatively, use regNum + ordIncrement to define ordinalized data groups.
<FlowVals niceName="Flow Values" devDG="true" maxCnt="2" baseOrd="1">
<dgElements byteOrder="BigEndian" secLev="4" type="i2">
<SP desc="Static Pressure" regDef="1:00"/>
<DP desc="Diff Pressure" regDef="1:01"/>
<Temp desc="Gas Temp" regDef="1:02"/>
<FlowRate desc="Flow Rate" regDef="1:03"/>
</dgElements>
<modbusReadBlocks regByteLen="2"/>
<block1 regNum="11001" ordIncrement="4" regCnt="4" funcCode="3"/>
</modbusReadBlocks>
</FlowVals>


