Join us today!
Using any structure as an input to a function block
In this tutorial, we will explain how we can use any structure as an input to a function block so that we can create a more generic function block.
Let's assume you have a struct called 'ST_Part' which contains all the fields of your part information:
TYPE ST_Part : STRUCT sInfo : STRING; fWeight: REAL; fHeight : REAL; sBarcode : STRING; END_STRUCT END_TYPE
You want to store your part data in an xml file. At the time of the developing the xml file writer function block, you don't have any information about the struct yet and you want to be able to pass any struct to your function block. We will examine two methods to achieve this.
Method1 : Using T_Arg
You would need to add the Tc2_Utilities library in your project to be able to declare the variables as T_Arg.
FB_XmlWriter:
Declare your data input as T_Arg.
FUNCTION_BLOCK FB_XmlWriter VAR_INPUT tData : T_Arg; END_VAR VAR_OUTPUT END_VAR VAR END_VAR
Inside the function block body, implement a check to see if this data is a byte buffer:
IF (tData.eType = E_ArgType.ARGTYPE_BIGTYPE) THEN M_Write(); END_IF
In the main program, convert your ST_Part variable to T_Arg and pass it to FB_XmlWriter function block.
PROGRAM MAIN VAR fbXMLWriter : FB_XmlWriter; stPart : ST_Part; tArgPart : T_Arg; END_VAR
tArgPart := F_BIGTYPE(pData:= ADR(stPart),cbLen:=SIZEOF(stPart)); fbXMLWriter(tData:=tArgPart);
Method 2 : Using PVOID
PVOID is a pointer to a memory address, but it doesn't have any information about the data type. You'd need to use MEMCPY in the body of the function block since you'll be dealing with a memory address.
FB_XmlWriter:
FUNCTION_BLOCK FB_XmlWriter VAR_INPUT tData : PVOID; nSize : UDINT; END_VAR VAR_OUTPUT END_VAR VAR END_VAR
In the main program :
PROGRAM MAIN VAR fbXMLWriter : FB_XmlWriter; stPart : ST_Part; END_VAR
fbXMLWriter(tData:= ADR(stPart) , nSize:= SIZEOF(stPart));
In case you want to say thank you !)
We'd be very grateful if you could share this community with your colleagues and friends. You can also buy us a coffee to keep us fueled 😊 This is the best way to say thank you to this project and support your community.
twinControls - https://twincontrols.com/
@twincontrols, I also like using ANY.
Method3 : Using ANY
FB_XmlWriter:
FUNCTION_BLOCK FB_XmlWriter VAR_INPUT tData : ANY; END_VAR VAR_OUTPUT END_VAR VAR END_VAR
Inside the function block the variable tData will be replaced by a structure containing a few useful elements.
tData.typeclass // the type of the actual parameter tData.pvalue // the pointer to the actual parameter tData.diSize // the size of the data, to which the pointer points
In the main program :
PROGRAM MAIN VAR fbXMLWriter : FB_XmlWriter; stPart : ST_Part; END_VAR
fbXMLWriter(tData:=stPart);
I used the same aproach in the tc3-count-structure-elements and tc3-push-pop-stack repos.
My blog: codingbytes
My code: https://github.com/benhar-dev
- 17 Forums
- 268 Topics
- 925 Posts
- 1 Online
- 738 Members