<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to Interface as Structure Element?</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/8c0d7de6f2/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/Engineering/thread/8c0d7de6f2/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/Engineering/thread/8c0d7de6f2/</id><updated>2020-02-27T13:47:55.226000Z</updated><subtitle>Recent posts to Interface as Structure Element?</subtitle><entry><title>Interface as Structure Element?</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/8c0d7de6f2/?limit=25#880b" rel="alternate"/><published>2020-02-27T13:47:55.226000Z</published><updated>2020-02-27T13:47:55.226000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.comab8c3e58be682ed9fc4e9d921ac36749ebde7b97</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;em&gt;Originally created by:&lt;/em&gt; scott_cunningham&lt;/p&gt;
&lt;p&gt;I ran into this problem and solved it by using REFERENCE TO  in the property.  Then only define a GET - no SET is needed, even if you do write to the variables.  You will get compile problems if you include the SET.&lt;/p&gt;
&lt;p&gt;Example: A remote IO module has 16 digital inputs and 16 digital outputs.  Each input and output is it's own object (FB) with properties (Invert, State) and methods (TurnOn(), TurnOff(), Toggle()).  The remoteIO object has two properties - 'Input' and 'Output' which access a structure of the 16 input or output objects.  It is then desirable to have those properties and methods available with dot notation for the main remote IO module ('Bank1' in my example):&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;JogMode&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;Bank1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;D00&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;State&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;Bank1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;D00&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;State&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;TRUE&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;Bank1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;D01&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;State&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;Warning&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The trick is in the property 'Output':&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;TYPE&lt;/span&gt; &lt;span class="nt"&gt;T_DI16&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="nt"&gt;STRUCT&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nt"&gt;D00&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;ClassDigitalInput&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nt"&gt;D01&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;ClassDigitalInput&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nt"&gt;D15&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;ClassDigitalInput&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;END_STRUCT&lt;/span&gt;
&lt;span class="nt"&gt;END_TYPE&lt;/span&gt;
&lt;span class="nt"&gt;TYPE&lt;/span&gt; &lt;span class="nt"&gt;T_DO16&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="nt"&gt;STRUCT&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nt"&gt;D00&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;ClassDigitalOutput&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nt"&gt;D01&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;ClassDigitalOutput&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nt"&gt;D15&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;ClassDigitalOutput&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;END_STRUCT&lt;/span&gt;
&lt;span class="nt"&gt;END_TYPE&lt;/span&gt;
&lt;span class="nt"&gt;FUNCTION_BLOCK&lt;/span&gt; &lt;span class="nt"&gt;ClassRemoteIO_DIO16&lt;/span&gt;
&lt;span class="nt"&gt;VAR&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nt"&gt;_Input&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;T_DI16&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nt"&gt;_Output&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;T_DO16&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;END_VAR&lt;/span&gt;
&lt;span class="nt"&gt;PROPERTY&lt;/span&gt; &lt;span class="nt"&gt;Input&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;REFERENCE&lt;/span&gt; &lt;span class="nt"&gt;TO&lt;/span&gt; &lt;span class="nt"&gt;T_DI16&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nt"&gt;GET&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nt"&gt;Input&lt;/span&gt; &lt;span class="nt"&gt;REF&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;_Input&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nt"&gt;END_GET&lt;/span&gt;
&lt;span class="nt"&gt;END_PROPERTY&lt;/span&gt;
&lt;span class="nt"&gt;PROPERTY&lt;/span&gt; &lt;span class="nt"&gt;Output&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;REFERENCE&lt;/span&gt; &lt;span class="nt"&gt;TO&lt;/span&gt; &lt;span class="nt"&gt;T_DO16&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nt"&gt;GET&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nt"&gt;Output&lt;/span&gt; &lt;span class="nt"&gt;REF&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;_Output&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nt"&gt;END_GET&lt;/span&gt;
&lt;span class="nt"&gt;END_PROPERTY&lt;/span&gt;
&lt;span class="nt"&gt;END_FUNCTION_BLOCK&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;It is possible to use REFERENCE TO with any data types like arrays, FBs, simple types, structures.  &lt;/p&gt;
&lt;p&gt;This is very, nearly, exactly, what I have wanted (OK, I'd really like to be able to drop the 'State' property and do 'Bank1.Output.D00:= TRUE;' and 'Bank1.Output.D00.Invert:= TRUE;' but FBs don't just return a BOOL!)&lt;/p&gt;
&lt;p&gt;Please note your access time when using properties - they are really a function call behind the scenes.  So, in my example just using properties adds code calls - may be of importance with some hardware platforms/machines.&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Interface as Structure Element?</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/8c0d7de6f2/?limit=25#5638" rel="alternate"/><published>2020-02-27T13:47:55.118000Z</published><updated>2020-02-27T13:47:55.118000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.comf64e655181950deba7bac1bd0e3413d4f925f799</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;em&gt;Originally created by:&lt;/em&gt; Captive Engineer&lt;/p&gt;
&lt;p&gt;After some more detailed experimentation, my problem shows up if a property is a structure and I attempt to reference the structure element through the property interface.  For example . . . &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c"&gt;(* I make up some structure *)&lt;/span&gt;
&lt;span class="n"&gt;TYPE&lt;/span&gt; &lt;span class="n"&gt;ST_Bespoke&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;STRUCT&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;udi_My_UDINT&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;UDINT&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;END_STRUCT&lt;/span&gt;
&lt;span class="n"&gt;END_TYPE&lt;/span&gt;
&lt;span class="c"&gt;(* Then I make an interface using the ST_Bespoke structure, *)&lt;/span&gt;
&lt;span class="n"&gt;INTERFACE&lt;/span&gt; &lt;span class="n"&gt;ITF_mit_Structure&lt;/span&gt; &lt;span class="n"&gt;EXTENDS&lt;/span&gt; &lt;span class="o"&gt;__&lt;/span&gt;&lt;span class="n"&gt;SYSTEM&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IQueryInterface&lt;/span&gt;
&lt;span class="c"&gt;(* and add a structure property. *)&lt;/span&gt;
&lt;span class="n"&gt;PROPERTY&lt;/span&gt; &lt;span class="n"&gt;Structure_Prop&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;ST_Bespoke&lt;/span&gt;
&lt;span class="c"&gt;(* Now I make a Function Block which implements my new interface, *)&lt;/span&gt;
&lt;span class="n"&gt;FUNCTION_BLOCK&lt;/span&gt; &lt;span class="n"&gt;FB_Test&lt;/span&gt; &lt;span class="n"&gt;IMPLEMENTS&lt;/span&gt; &lt;span class="n"&gt;ITF_mit_Structure&lt;/span&gt;
&lt;span class="c"&gt;(* and for this demonstration, FB variables are optional. *)&lt;/span&gt;
&lt;span class="c"&gt;(* Then in the running program POU, *)&lt;/span&gt;
&lt;span class="n"&gt;PROGRAM&lt;/span&gt; &lt;span class="n"&gt;Main&lt;/span&gt;
&lt;span class="n"&gt;VAR&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;iFB_Try&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;FB_Test&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;st_Try&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;ST_Bespoke&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;udi_Value&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;UDINT&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;END_VAR&lt;/span&gt;
&lt;span class="n"&gt;iFB_Try&lt;/span&gt;&lt;span class="bp"&gt;()&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;udi_Value&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;iFB_Try&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Structure_Prop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;udi_My_UDINT&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="c"&gt;(*This assignment throws a compile error like that in the original post*)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;By experimentation, I have found one way to work around this dot-reference problem.  That is to assign the whole structure property, instead of one of its elements, to a suitable variable.  So the program code becomes . . . &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;iFB_Try&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;st_Try&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;iFB_Try&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Structure_Prop&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;udi_Value&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;st_Try&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;udi_My_UDINT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The issue is not really a problem with structures containing properties as I originally thought.  The problem comes if a property is a structured type and the programmer tries to dot-reference it directly through the property interface.  So now my question is whether there is a particular reason the language should want to discourage dot-referencing through properties, or if instead this is simply an unanticipated access technique that CoDeSys V3 will eventually support.&lt;/p&gt;
&lt;p&gt;Responses are welcome.&lt;/p&gt;
&lt;p&gt;Respectfully submitted,&lt;br/&gt;
The Captive Engineer&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Interface as Structure Element?</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/8c0d7de6f2/?limit=25#3826" rel="alternate"/><published>2020-02-27T13:47:55.037000Z</published><updated>2020-02-27T13:47:55.037000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.comb8a9daeb87326fe25f799445e7356cecb610b417</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;em&gt;Originally created by:&lt;/em&gt; Captive Engineer&lt;/p&gt;
&lt;p&gt;In working with a vendor's library (for SoMachine software which utilizes CoDeSys V3), I've come across a structure which contains an interface or perhaps an interface instance as one of its elements.&lt;/p&gt;
&lt;p&gt;If in my code I attempt to dot-reference a property of the interface inside the structure, something like . . .&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;udi_Number&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;st_Big_Library_Structure&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;st_Smaller_Embedded_Structure&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;i_Embedded_Interface_Type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;st_Address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;udi_Number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;the compiler fails with an error which reads:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Zitat:&lt;/strong&gt;&lt;br/&gt;
&lt;span&gt;[ERROR]&lt;/span&gt;         MyProgram: Action_Initialize_Device &lt;a class="" href="../Line%2022,%20Column%201"&gt;PacDrive3: PLC Logic: Application: Main_Task_Call&lt;/a&gt;: C0185:  It is not possible to perform component access '.', index access '[]', call '()' or dereference '^' on result of function call. Assign result to help variable first.&lt;br/&gt;
                Compile complete -- 1 errors, 0 warnings&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I would like to know how I should properly reference the property data when it is implemented this way.&lt;/p&gt;
&lt;p&gt;The broader question, though, is what would be the programmer's reason for using an interface in a structure?  I see that it is also possible to compile a function block which uses an interface as an input!  Presumably, there are similar reasons for supporting this functionality.  The help files do not seem to cover these possibilities, however, so perhaps some of the experts here might offer an explanation.&lt;/p&gt;
&lt;p&gt;Kind regard,&lt;br/&gt;
The Captive Engineer&lt;/p&gt;&lt;/div&gt;</summary></entry></feed>