#8 Interface to manage mappings of "ANY" datatype

Unlicensed
nobody
None
2020-09-25
2020-09-25
Ingo
No

There is a nice article, called The wonders o ANY. While I learnt how to use this datatype, I wanted to share an example interface with you.

The idea is, that I want to pass a list of variable mappings, containing informations about the variables, to a function block, that can process them.

use-cases:

  • communication protocols
  • parsers or generators for data exchange formats (XML, JSON, YAML, ...)
FUNCTION_BLOCK mappingEntry
VAR
    // the type of the actual parameter
    typeclass : __SYSTEM.TYPE_CLASS ;
    // the pointer to the actual parameter
    pvalue : POINTER TO BYTE;
    // the size of the data, to which the pointer points
    diSize : DINT;
END_VAR

METHOD FB_Init: BOOL
VAR_INPUT
    bInitRetains: BOOL; // TRUE: the retain variables are initialized (reset warm / reset cold)
    bInCopyCode: BOOL;  // TRUE: the instance will be copied to the copy code afterward (online change)   
    map : ANY;
END_VAR

typeClass := map.TypeClass;
pValue := map.pValue;
diSize := map.diSize;
FUNCTION_BLOCK MyMappingFB
METHOD FB_Init: BOOL
VAR_INPUT
    bInitRetains: BOOL; // TRUE: the retain variables are initialized (reset warm / reset cold)
    bInCopyCode: BOOL;  // TRUE: the instance will be copied to the copy code afterward (online change)   
    mapping : POINTER TO ARRAY [1..0] OF mappingEntry;
    size : DWORD;
END_VAR

And the usage can then be:

VAR_GLOBAL
    hugo : DWORD;
    egon : BYTE;
    balder : STRING;
END_VAR
PROGRAM PLC_PRG
VAR
    mappingList : ARRAY [0..2] OF mappingEntry[
        (GVL.hugo),
        (GVL.egon),
        (GVL.balder)
    ];
    myMappingInst : MyMappingFB(ADR(mappingList), SIZEOF(mappingList) / SIZEOF(mappingEntry));
END_VAR

myMappingInst();

What you get in your "MyMappingFB" is:

  • A list of ANY variables (type: mappingEntry)
  • Each member contains info about:
    • Variable Type
    • Size
    • Pointer to the variable

Discussion


Log in to post a comment.