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:
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:
more posts ...
Hello Ingo, nice example, thank you.
I don't understand the point of this. Isn't just better to use __SYSTEM.AnyType instead of making your own type?
Also if you wanted to make it an object, shouldn't you just wrap a FB around __SYSTEM.AnyType and then have some conversion Methods?
Maybe I am missing the purpose of this code. Maybe add more details on how you would use MyMappingFB
Last edit: bnewman 2024-02-05