OutstationDataModelExample (FB)¶
FUNCTION_BLOCK OutstationDataModelExample
This function block provides an example data model for Outstation, including simulated application data.
It provides: - 8 x AnalogInput - 4 x AnalogOutput - 4 x BinaryCounter - 4 x BinaryInput - 4 x BinaryOutput - 4 x DoubleBitInput - 4 x OctetString
all points with consecutive point number starting at 0. The method ModifyApplicationData() can be used to simulate volatile application data.
- InOut:
Scope
Name
Type
Initial
Comment
Input
anlgInsARRAY [0..7] OF AnalogInput
[STRUCT(Description := ‘MyAnlgIn_1’, EventClass := Constants.TMWDEFS_CLASS_MASK_ONE, EnableFreeze := TRUE, EnableMasterAccessDeadband := TRUE, udiLogOptions := OutstationLoggingOptions.Freeze, value := STRUCT(baseType := AnyNumberType.TYPE_LREAL, isPtr := TRUE, u := STRUCT(p := STRUCT(pLREAL := ADR(anlgInData1)))), deadband := STRUCT(baseType := AnyNumberType.TYPE_LREAL, isPtr := FALSE, u := STRUCT(val := STRUCT(valLREAL := 0.1))), enableWriteDeadband := TRUE), STRUCT(Description := ‘MyAnlgIn_2’, number := 2, EventClass := Constants.TMWDEFS_CLASS_MASK_TWO, EnableFreeze := FALSE, EnableMasterAccessDeadband := TRUE, value := STRUCT(baseType := AnyNumberType.TYPE_REAL, isPtr := TRUE, u := STRUCT(p := STRUCT(pREAL := ADR(anlgInData2)))), deadband := STRUCT(baseType := AnyNumberType.TYPE_REAL, isPtr := FALSE, u := STRUCT(val := STRUCT(valREAL := 0.2))), enableWriteDeadband := TRUE), STRUCT(Description := ‘MyAnlgIn_3’, EventClass := Constants.TMWDEFS_CLASS_MASK_THREE, EnableFreeze := TRUE, EnableMasterAccessDeadband := FALSE, value := STRUCT(baseType := AnyNumberType.TYPE_UDINT, isPtr := TRUE, u := STRUCT(p := STRUCT(pUDINT := ADR(anlgInData3)))), deadband := STRUCT(baseType := AnyNumberType.TYPE_UDINT, isPtr := FALSE, u := STRUCT(val := STRUCT(valUDINT := 1)))), STRUCT(Description := ‘MyAnlgIn_4’, number := 10, EventClass := Constants.TMWDEFS_CLASS_MASK_ONE, value := STRUCT(baseType := AnyNumberType.TYPE_DINT, isPtr := TRUE, u := STRUCT(p := STRUCT(pDINT := ADR(anlgInData4)))), deadband := STRUCT(baseType := AnyNumberType.TYPE_DINT, isPtr := FALSE, u := STRUCT(val := STRUCT(valDINT := 1)))), STRUCT(Description := ‘MyAnlgIn_5’, EventClass := Constants.TMWDEFS_CLASS_MASK_ONE, value := STRUCT(baseType := AnyNumberType.TYPE_UINT, isPtr := TRUE, u := STRUCT(p := STRUCT(pUINT := ADR(anlgInData5)))), deadband := STRUCT(baseType := AnyNumberType.TYPE_UINT, isPtr := FALSE, u := STRUCT(val := STRUCT(valUINT := 1)))), STRUCT(Description := ‘MyAnlgIn_6’, EventClass := Constants.TMWDEFS_CLASS_MASK_ONE, value := STRUCT(baseType := AnyNumberType.TYPE_INT, isPtr := TRUE, u := STRUCT(p := STRUCT(pINT := ADR(anlgInData6)))), deadband := STRUCT(baseType := AnyNumberType.TYPE_INT, isPtr := FALSE, u := STRUCT(val := STRUCT(valINT := 1)))), STRUCT(Description := ‘MyAnlgIn_7’, EventClass := Constants.TMWDEFS_CLASS_MASK_ONE, value := STRUCT(baseType := AnyNumberType.TYPE_USINT, isPtr := TRUE, u := STRUCT(p := STRUCT(pUSINT := ADR(anlgInData7)))), deadband := STRUCT(baseType := AnyNumberType.TYPE_USINT, isPtr := FALSE, u := STRUCT(val := STRUCT(valUSINT := 1)))), STRUCT(Description := ‘MyAnlgIn_8’, EventClass := Constants.TMWDEFS_CLASS_MASK_ONE, value := STRUCT(baseType := AnyNumberType.TYPE_SINT, isPtr := TRUE, u := STRUCT(p := STRUCT(pSINT := ADR(anlgInData8)))), deadband := STRUCT(baseType := AnyNumberType.TYPE_SINT, isPtr := FALSE, u := STRUCT(val := STRUCT(valSINT := 1))))]
All my AnalogInput
numAnlgInsUINT(SIZEOF(anlgIns) / SIZEOF(anlgIns[0]))
Number of AnalogInputs
grpAnlgInsSTRUCT(aPoints := ADR(anlgIns), numPoints := numAnlgIns)
The “Group” containing all the AnalogInputs
anlgOutsARRAY [0..3] OF AnalogOutput
[STRUCT(Description := ‘MyAnlgOut_1’, EventClass := Constants.TMWDEFS_CLASS_MASK_ONE, EnableCommand := TRUE, rejectCommand := FALSE, value := STRUCT(baseType := AnyNumberType.TYPE_REAL, isPtr := TRUE, u := STRUCT(p := STRUCT(pREAL := ADR(anlgOutData[0]))))), STRUCT(Description := ‘MyAnlgOut_2’, EventClass := Constants.TMWDEFS_CLASS_MASK_TWO, value := STRUCT(baseType := AnyNumberType.TYPE_REAL, isPtr := TRUE, u := STRUCT(p := STRUCT(pREAL := ADR(anlgOutData[1]))))), STRUCT(Description := ‘MyAnlgOut_3’, EventClass := Constants.TMWDEFS_CLASS_MASK_THREE, EnableCommand := TRUE, rejectCommand := FALSE, value := STRUCT(baseType := AnyNumberType.TYPE_REAL, isPtr := TRUE, u := STRUCT(p := STRUCT(pREAL := ADR(anlgOutData[2]))))), STRUCT(Description := ‘MyAnlgOut_4’, EventClass := Constants.TMWDEFS_CLASS_MASK_TWO, value := STRUCT(baseType := AnyNumberType.TYPE_REAL, isPtr := TRUE, u := STRUCT(p := STRUCT(pREAL := ADR(anlgOutData[3])))))]
Now the same boilerplate for other Point types used in this “data model” …
numAnlgOutsUINT(SIZEOF(anlgOuts) / SIZEOF(anlgOuts[0]))
grpAnlgOutsSTRUCT(aPoints := ADR(anlgOuts), numPoints := numAnlgOuts)
binCntrARRAY [0..3] OF BinaryCounter
[STRUCT(Description := ‘MyBinCntr_1’, EventClass := Constants.TMWDEFS_CLASS_MASK_ONE, EnableFreeze := TRUE, udiLogOptions := OutstationLoggingOptions.Freeze, value := STRUCT(baseType := AnyNumberType.TYPE_UDINT, isPtr := TRUE, u := STRUCT(p := STRUCT(pUDINT := ADR(binCntrData[0]))))), STRUCT(Description := ‘MyBinCntr_2’, EventClass := Constants.TMWDEFS_CLASS_MASK_TWO, value := STRUCT(baseType := AnyNumberType.TYPE_UDINT, isPtr := TRUE, u := STRUCT(p := STRUCT(pUDINT := ADR(binCntrData[1]))))), STRUCT(Description := ‘MyBinCntr_3’, EventClass := Constants.TMWDEFS_CLASS_MASK_ONE, EnableFreeze := TRUE, value := STRUCT(baseType := AnyNumberType.TYPE_UDINT, isPtr := TRUE, u := STRUCT(p := STRUCT(pUDINT := ADR(binCntrData[2]))))), STRUCT(Description := ‘MyBinCntr_4’, EventClass := Constants.TMWDEFS_CLASS_MASK_TWO, value := STRUCT(baseType := AnyNumberType.TYPE_UDINT, isPtr := TRUE, u := STRUCT(p := STRUCT(pUDINT := ADR(binCntrData[3])))))]
numBinCntrUINT(SIZEOF(binCntr) / SIZEOF(binCntr[0]))
grpBinCntrsSTRUCT(aPoints := ADR(binCntr), numPoints := numBinCntr)
binInsARRAY [0..3] OF BinaryInput
[STRUCT(Description := ‘MyBinIn_1’, number := 10, EventClass := Constants.TMWDEFS_CLASS_MASK_ONE, pValue := ADR(binInData[0])), STRUCT(Description := ‘MyBinIn_2’, EventClass := Constants.TMWDEFS_CLASS_MASK_TWO, pValue := ADR(binInData[1])), STRUCT(Description := ‘MyBinIn_3’, number := 20, EventClass := Constants.TMWDEFS_CLASS_MASK_THREE, pValue := ADR(binInData[2])), STRUCT(Description := ‘MyBinIn_4’, EventClass := Constants.TMWDEFS_CLASS_MASK_TWO, pValue := ADR(binInData[3]))]
numBinInsUINT(SIZEOF(binIns) / SIZEOF(binIns[0]))
grpBinInsSTRUCT(aPoints := ADR(binIns), numPoints := numBinIns)
binOutsARRAY [0..3] OF BinaryOutput
[STRUCT(Description := ‘MyBinOut_1’, EventClass := Constants.TMWDEFS_CLASS_MASK_ONE, EnableCommand := TRUE, rejectCommand := FALSE, pValue := ADR(binOutData[0])), STRUCT(Description := ‘MyBinOut_2’, EventClass := Constants.TMWDEFS_CLASS_MASK_TWO, pValue := ADR(binOutData[1])), STRUCT(Description := ‘MyBinOut_3’, EventClass := Constants.TMWDEFS_CLASS_MASK_ONE, EnableCommand := TRUE, rejectCommand := FALSE, pValue := ADR(binOutData[2])), STRUCT(Description := ‘MyBinOut_4’, EventClass := Constants.TMWDEFS_CLASS_MASK_TWO, pValue := ADR(binOutData[3]))]
numBinOutsUINT(SIZEOF(binOuts) / SIZEOF(binOuts[0]))
grpBinOutsSTRUCT(aPoints := ADR(binOuts), numPoints := numBinOuts)
dblInsARRAY [0..3] OF DoubleBitInput
[STRUCT(Description := ‘MyDblIn_1’, EventClass := Constants.TMWDEFS_CLASS_MASK_ONE, pValue := ADR(dblInData[0])), STRUCT(Description := ‘MyDblIn_2’, EventClass := Constants.TMWDEFS_CLASS_MASK_TWO, pValue := ADR(dblInData[1])), STRUCT(Description := ‘MyDblIn_3’, EventClass := Constants.TMWDEFS_CLASS_MASK_ONE, pValue := ADR(dblInData[2])), STRUCT(Description := ‘MyDblIn_4’, EventClass := Constants.TMWDEFS_CLASS_MASK_TWO, pValue := ADR(dblInData[3]))]
numDblInsUINT(SIZEOF(dblIns) / SIZEOF(dblIns[0]))
grpDblInsSTRUCT(aPoints := ADR(dblIns), numPoints := numDblIns)
octStrsARRAY [0..3] OF OctetString
[STRUCT(Description := ‘MyOctStr_1’, EventClass := Constants.TMWDEFS_CLASS_MASK_ONE, pBufIn := ADR(octetStringData[0]), maxLengthIn := ANY_TO_USINT((SIZEOF(octetStringData[0]) / SIZEOF(octetStringData[0][0]))), lengthIn := 4), STRUCT(Description := ‘MyOctStr_2’, EventClass := Constants.TMWDEFS_CLASS_MASK_TWO, pBufIn := ADR(octetStringData[1]), maxLengthIn := ANY_TO_USINT((SIZEOF(octetStringData[1]) / SIZEOF(octetStringData[1][0]))), lengthIn := 8), STRUCT(Description := ‘MyOctStr_3’, EventClass := Constants.TMWDEFS_CLASS_MASK_TWO, pBufIn := ADR(octetStringData[2]), maxLengthIn := ANY_TO_USINT((SIZEOF(octetStringData[2]) / SIZEOF(octetStringData[2][0]))), lengthIn := 4), STRUCT(Description := ‘MyOctStr_4’, EventClass := Constants.TMWDEFS_CLASS_MASK_TWO, pBufIn := ADR(octetStringData[3]), maxLengthIn := ANY_TO_USINT((SIZEOF(octetStringData[3]) / SIZEOF(octetStringData[3][0]))), lengthIn := 8)]
numOctStrsUINT(SIZEOF(octStrs) / SIZEOF(octStrs[0]))
grpOctStrsSTRUCT(aPoints := ADR(octStrs), numPoints := numOctStrs)
outstationDatamodelSTRUCT(groupAnalogInputs := grpAnlgIns, groupAnalogOutputs := grpAnlgOuts, groupBinaryCounters := grpBinCntrs, groupBinaryInputs := grpBinIns, groupBinaryOutputs := grpBinOuts, groupDoubleBitInputs := grpDblIns, groupOctetStrings := grpOctStrs)
Thats the final result we’re aiming here for - the Outstation “data model”. Please note: some groups may not be set, in this case the Outstation simply doesnt provide Points related to this group.
Methods:
Structure: