<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to OOP: Programmatical finding all objects for __QUERYINTERFACE</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/726cde3c21/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/Engineering/thread/726cde3c21/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/Engineering/thread/726cde3c21/</id><updated>2020-02-27T14:12:52.297000Z</updated><subtitle>Recent posts to OOP: Programmatical finding all objects for __QUERYINTERFACE</subtitle><entry><title>OOP: Programmatical finding all objects for __QUERYINTERFACE</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/726cde3c21/?limit=25#612f" rel="alternate"/><published>2020-02-27T14:12:52.297000Z</published><updated>2020-02-27T14:12:52.297000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.com06eba7d3f292c0d051c9c124d6d118f33af139bc</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;Sorry, the project code is not allowed to be shared.  Here is finally how I used the __QUERYINTERFACE to add a qualified object (only showing collection specific info):&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;FUNCTION_BLOCK&lt;/span&gt; &lt;span class="nv"&gt;FINAL&lt;/span&gt; &lt;span class="nv"&gt;ClassFaultObjectsCollection&lt;/span&gt;
&lt;span class="nv"&gt;VAR&lt;/span&gt;
   &lt;span class="nv"&gt;Collection&lt;/span&gt;   : &lt;span class="nv"&gt;ARRAY&lt;/span&gt;[&lt;span class="mi"&gt;1&lt;/span&gt;..&lt;span class="nv"&gt;GVL_COLLECT&lt;/span&gt;.&lt;span class="nv"&gt;MAX_OBJECTS&lt;/span&gt;] &lt;span class="nv"&gt;OF&lt;/span&gt; &lt;span class="nv"&gt;IFault&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;ObjNames&lt;/span&gt;   : &lt;span class="nv"&gt;ARRAY&lt;/span&gt;[&lt;span class="mi"&gt;1&lt;/span&gt;..&lt;span class="nv"&gt;GVL_COLLECT&lt;/span&gt;.&lt;span class="nv"&gt;MAX_OBJECTS&lt;/span&gt;] &lt;span class="nv"&gt;OF&lt;/span&gt; &lt;span class="nv"&gt;STRING&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;_ArrayOver&lt;/span&gt;   : &lt;span class="nv"&gt;BOOL&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;_BadObj&lt;/span&gt;      : &lt;span class="nv"&gt;INT&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;_DupeObj&lt;/span&gt;   : &lt;span class="nv"&gt;INT&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;_OverObj&lt;/span&gt;   : &lt;span class="nv"&gt;INT&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;_TotalObj&lt;/span&gt;   : &lt;span class="nv"&gt;INT&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;Add&lt;/span&gt; &lt;span class="nv"&gt;object&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;collection&lt;/span&gt;.
&lt;span class="o"&gt;-----------------------------------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;Call&lt;/span&gt; &lt;span class="nl"&gt;this&lt;/span&gt; &lt;span class="nv"&gt;method&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;add&lt;/span&gt; &lt;span class="nv"&gt;an&lt;/span&gt; &lt;span class="nv"&gt;object&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;collection&lt;/span&gt; &lt;span class="nv"&gt;array&lt;/span&gt;:
   &lt;span class="nv"&gt;AddObject&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;THIS&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;Found&lt;/span&gt; &lt;span class="nv"&gt;below&lt;/span&gt; &lt;span class="nv"&gt;is&lt;/span&gt; &lt;span class="nv"&gt;typical&lt;/span&gt; &lt;span class="nv"&gt;code&lt;/span&gt; &lt;span class="nv"&gt;required&lt;/span&gt;.  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Obj&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt; &lt;span class="nv"&gt;must&lt;/span&gt; &lt;span class="nv"&gt;be&lt;/span&gt; &lt;span class="nv"&gt;converted&lt;/span&gt; &lt;span class="nv"&gt;from&lt;/span&gt; &lt;span class="nv"&gt;an&lt;/span&gt;
&lt;span class="nv"&gt;IAll&lt;/span&gt; &lt;span class="nv"&gt;type&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;interface&lt;/span&gt; &lt;span class="nv"&gt;type&lt;/span&gt; &lt;span class="nv"&gt;specific&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;collection&lt;/span&gt; &lt;span class="nv"&gt;you&lt;/span&gt; &lt;span class="nv"&gt;are&lt;/span&gt;
&lt;span class="nv"&gt;implementing&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;METHOD&lt;/span&gt; &lt;span class="nv"&gt;FINAL&lt;/span&gt; &lt;span class="nv"&gt;AddObject&lt;/span&gt;
&lt;span class="nv"&gt;VAR_INPUT&lt;/span&gt;
   &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;object&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
   &lt;span class="nv"&gt;Obj&lt;/span&gt;   : &lt;span class="nv"&gt;IAll&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="nv"&gt;VAR&lt;/span&gt;
   &lt;span class="nv"&gt;Cast&lt;/span&gt;: &lt;span class="nv"&gt;IFault&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;J&lt;/span&gt;   : &lt;span class="nv"&gt;INT&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;__QUERYINTERFACE&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Obj&lt;/span&gt;, &lt;span class="nv"&gt;Cast&lt;/span&gt;&lt;span class="ss"&gt;))&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
   &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;make&lt;/span&gt; &lt;span class="nv"&gt;sure&lt;/span&gt; &lt;span class="nv"&gt;haven&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t already added this object&lt;/span&gt;
   &lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="nv"&gt;J&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;TO&lt;/span&gt; &lt;span class="nv"&gt;_TotalObj&lt;/span&gt; &lt;span class="k"&gt;DO&lt;/span&gt;
      &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="nv"&gt;Collection&lt;/span&gt;[&lt;span class="nv"&gt;J&lt;/span&gt;] &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Cast&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
         &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;object&lt;/span&gt; &lt;span class="nv"&gt;pointer&lt;/span&gt; &lt;span class="nv"&gt;matches&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;dupe&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
         &lt;span class="nv"&gt;_DupeObj&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_DupeObj&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="k"&gt;RETURN&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;END_IF&lt;/span&gt;
   &lt;span class="nv"&gt;END_FOR&lt;/span&gt;
   
   &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="nv"&gt;_TotalObj&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nv"&gt;GVL_COLLECT&lt;/span&gt;.&lt;span class="nv"&gt;MAX_OBJECTS&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
      &lt;span class="nv"&gt;_TotalObj&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_TotalObj&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;Collection&lt;/span&gt;[&lt;span class="nv"&gt;_TotalObj&lt;/span&gt;]:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Cast&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;ObjNames&lt;/span&gt;[&lt;span class="nv"&gt;_TotalObj&lt;/span&gt;]:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Obj&lt;/span&gt;.&lt;span class="nv"&gt;Instance&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="k"&gt;ELSE&lt;/span&gt;
      &lt;span class="nv"&gt;_ArrayOver&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;TRUE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;_OverObj&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_OverObj&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;END_IF&lt;/span&gt;
   
&lt;span class="k"&gt;ELSE&lt;/span&gt;
   &lt;span class="nv"&gt;_BadObj&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;_BadObj&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_IF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So if you have a FB that should be added to the collection, it can do it in the FB_INIT of itself (but it must implement the matching interface - or it's a bad object...):&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;FUNCTION_BLOCK&lt;/span&gt; &lt;span class="n"&gt;WantToFault&lt;/span&gt; &lt;span class="n"&gt;IMPLEMENTS&lt;/span&gt; &lt;span class="n"&gt;IFault&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;some&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;METHOD&lt;/span&gt; &lt;span class="n"&gt;FB_init&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bool&lt;/span&gt;
&lt;span class="n"&gt;VAR_INPUT&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;bInitRetains&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BOOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Initialization&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;retain&lt;/span&gt; &lt;span class="n"&gt;variables&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;bInCopyCode&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BOOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Instance&lt;/span&gt; &lt;span class="n"&gt;moved&lt;/span&gt; &lt;span class="k"&gt;into&lt;/span&gt; &lt;span class="k"&gt;copy&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;FaultCollector&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;REFERENCE&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="n"&gt;ClassFaultObjectsCollection&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;END_VAR&lt;/span&gt;
&lt;span class="n"&gt;FaultCollector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;THIS&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;END_FUNCTION_BLOCK&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;On instantiation, the instance of WantToFault will call the collector's AddObject() method and pass itself to it.  The collector will verify it should be an IFault member, and add's it, if necessary.&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>OOP: Programmatical finding all objects for __QUERYINTERFACE</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/726cde3c21/?limit=250#c8f9" rel="alternate"/><published>2020-02-27T14:12:51.954000Z</published><updated>2020-02-27T14:12:51.954000Z</updated><author><name>Hermsen</name><uri>https://forge.codesys.com/u/hermsen/</uri></author><id>https://forge.codesys.com43ef618855334eb30d796e1f6a8d26c922f69ef3</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;@Scott, &lt;br/&gt;
Would you be kind enough and post us an archived project?&lt;/p&gt;
&lt;p&gt;Thanks in advance!&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>OOP: Programmatical finding all objects for __QUERYINTERFACE</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/726cde3c21/?limit=25#0b51" rel="alternate"/><published>2020-02-27T14:12:50.883000Z</published><updated>2020-02-27T14:12:50.883000Z</updated><author><name>josepmariarams</name><uri>https://forge.codesys.com/u/josepmariarams/</uri></author><id>https://forge.codesys.com5440c4ba23c8f75d446c0ebc9e02ffb8f9509cf5</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;I have an ObjectPool too,  You can add {attribute 'global_init_slot' := '49995'} at program or GVL init, it ensures that the intialization of the element which has this attribute will be instantiated before all others (The default init slot is 50000).&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>OOP: Programmatical finding all objects for __QUERYINTERFACE</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/726cde3c21/?limit=25#11ef" rel="alternate"/><published>2020-02-27T14:12:50.537000Z</published><updated>2020-02-27T14:12:50.537000Z</updated><author><name>Kim</name><uri>https://forge.codesys.com/u/kim/</uri></author><id>https://forge.codesys.comc2686546f6802765ff1f09cea865978f90e95367</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Thanks Scott, I do have one more question because I noticed something strange.&lt;/p&gt;
&lt;p&gt;If I declare the InterfaceHandler in one GVL and Drive1in another GVL, it doesn't work.&lt;br/&gt;
The program runs but it's like the InterfaceHandler code never executes.&lt;/p&gt;
&lt;p&gt;If they are put in the same GVL, it works.&lt;br/&gt;
It also works if Drive1 is declared in a POU (as in your example code).&lt;/p&gt;
&lt;p&gt;I can only assume that this has something to do with the order that Codesys creates the variables and/or initialises them internally.&lt;br/&gt;
Do you have any insight to this matter?&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>OOP: Programmatical finding all objects for __QUERYINTERFACE</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/726cde3c21/?limit=25#52d9" rel="alternate"/><published>2020-02-27T14:12:50.123000Z</published><updated>2020-02-27T14:12:50.123000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.comb4cac4f305038ecf4b9f0018492734654c09505f</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;Online change has not been a problem when changing the logic. Adding or removing objects is a different story. I never use online change when I add or remove variables/objects.&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>OOP: Programmatical finding all objects for __QUERYINTERFACE</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/726cde3c21/?limit=25#f27d" rel="alternate"/><published>2020-02-27T14:12:49.090000Z</published><updated>2020-02-27T14:12:49.090000Z</updated><author><name>Kim</name><uri>https://forge.codesys.com/u/kim/</uri></author><id>https://forge.codesys.comf2e649bb07c865b4a40dcc5dbb0b9261d8a9a65c</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Scott, it's been some years but I would like to know how you handle online changes.&lt;br/&gt;
As I understand it, FB_init only executes after a cold reset.&lt;br/&gt;
Doesn't this mean your arrays can be corrupted by online changes? If so, could you make use of fb_exit and fb_reinit somehow?&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>OOP: Programmatical finding all objects for __QUERYINTERFACE</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/726cde3c21/?limit=25#751c" rel="alternate"/><published>2020-02-27T14:12:48.550000Z</published><updated>2020-02-27T14:12:48.550000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.comc384ba7cc6d6c372ba98e7e435b4a5db58a462d4</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;Posting solution for those who can use it.  Solution requires usage of FB_init() for each Class type.  In this way, the arrays of objects are already filled at program start:&lt;/p&gt;
&lt;p&gt;...define some interfaces...&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;INTERFACE&lt;/span&gt; &lt;span class="n"&gt;IAllObjects&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="k"&gt;absolute&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;METHOD&lt;/span&gt; &lt;span class="n"&gt;Fb_init&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BOOL&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;VAR_INPUT&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="n"&gt;bInitRetains&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BOOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Initialization&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;retain&lt;/span&gt; &lt;span class="n"&gt;variables&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="n"&gt;bInCopyCode&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BOOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Instance&lt;/span&gt; &lt;span class="n"&gt;moved&lt;/span&gt; &lt;span class="k"&gt;into&lt;/span&gt; &lt;span class="k"&gt;copy&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;END_VAR&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;INTERFACE&lt;/span&gt; &lt;span class="nv"&gt;IConveyor&lt;/span&gt; &lt;span class="nv"&gt;EXTENDS&lt;/span&gt; &lt;span class="nv"&gt;IAllObjects&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;interface&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;conveyors&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;INTERFACE&lt;/span&gt; &lt;span class="nv"&gt;IDrive&lt;/span&gt; &lt;span class="nv"&gt;EXTENDS&lt;/span&gt; &lt;span class="nv"&gt;IAllObjects&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;interface&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;drives&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;...define global collection arrays...&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;GVL_OBJECTS&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nt"&gt;VAR_GLOBAL&lt;/span&gt; &lt;span class="nt"&gt;CONSTANT&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;MAX_OBJECTS&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;INT&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;10&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_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;VAR_GLOBAL&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;CollectionAllObjects&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;CollectionHandlerAll&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;maintains&lt;/span&gt; &lt;span class="nt"&gt;array&lt;/span&gt; &lt;span class="nt"&gt;of&lt;/span&gt; &lt;span class="nt"&gt;all&lt;/span&gt; &lt;span class="nt"&gt;objects&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;CollectionDrives&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;CollectionHandlerDrives&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;maintains&lt;/span&gt; &lt;span class="nt"&gt;array&lt;/span&gt; &lt;span class="nt"&gt;of&lt;/span&gt; &lt;span class="nt"&gt;drives&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;CollectionConveyors&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;CollectionHandlerConveyors&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;maintains&lt;/span&gt; &lt;span class="nt"&gt;array&lt;/span&gt; &lt;span class="nt"&gt;of&lt;/span&gt; &lt;span class="nt"&gt;conveyors&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_VAR&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;...define FB to handle array collections...&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;FUNCTION_BLOCK&lt;/span&gt; &lt;span class="nv"&gt;CollectionHandlerAll&lt;/span&gt;
&lt;span class="nv"&gt;VAR_INPUT&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="nv"&gt;VAR_OUTPUT&lt;/span&gt;
   &lt;span class="nv"&gt;TotalObjects&lt;/span&gt;: &lt;span class="nv"&gt;INT&lt;/span&gt;&lt;span class="c1"&gt;; // total objects found - use for FOR/NEXT loop iterations of methods&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="nv"&gt;VAR&lt;/span&gt;
   &lt;span class="nv"&gt;Collection&lt;/span&gt;: &lt;span class="nv"&gt;ARRAY&lt;/span&gt;[&lt;span class="mi"&gt;1&lt;/span&gt;..&lt;span class="nv"&gt;GVL_OBJECTS&lt;/span&gt;.&lt;span class="nv"&gt;MAX_OBJECTS&lt;/span&gt;] &lt;span class="nv"&gt;OF&lt;/span&gt; &lt;span class="nv"&gt;IAllObjects&lt;/span&gt;&lt;span class="c1"&gt;; // object array&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
   &lt;span class="nv"&gt;METHOD&lt;/span&gt; &lt;span class="nv"&gt;AddObject&lt;/span&gt;
   &lt;span class="nv"&gt;VAR_INPUT&lt;/span&gt;
      &lt;span class="nv"&gt;Obj&lt;/span&gt;   : &lt;span class="nv"&gt;IAllObjects&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;END_VAR&lt;/span&gt;
   &lt;span class="nv"&gt;TotalObjects&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;TotalObjects&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;Collection&lt;/span&gt;[&lt;span class="nv"&gt;TotalObjects&lt;/span&gt;]:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Obj&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;FUNCTION_BLOCK&lt;/span&gt; &lt;span class="nv"&gt;CollectionHandlerConveyor&lt;/span&gt;
&lt;span class="nv"&gt;VAR_INPUT&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="nv"&gt;VAR_OUTPUT&lt;/span&gt;
   &lt;span class="nv"&gt;TotalObjects&lt;/span&gt;: &lt;span class="nv"&gt;INT&lt;/span&gt;&lt;span class="c1"&gt;; // total objects found - use for FOR/NEXT loop iterations of methods&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="nv"&gt;VAR&lt;/span&gt;
   &lt;span class="nv"&gt;Collection&lt;/span&gt;: &lt;span class="nv"&gt;ARRAY&lt;/span&gt;[&lt;span class="mi"&gt;1&lt;/span&gt;..&lt;span class="nv"&gt;GVL_OBJECTS&lt;/span&gt;.&lt;span class="nv"&gt;MAX_OBJECTS&lt;/span&gt;] &lt;span class="nv"&gt;OF&lt;/span&gt; &lt;span class="nv"&gt;IConveyor&lt;/span&gt;&lt;span class="c1"&gt;; // object array&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
   &lt;span class="nv"&gt;METHOD&lt;/span&gt; &lt;span class="nv"&gt;AddObject&lt;/span&gt;
   &lt;span class="nv"&gt;VAR_INPUT&lt;/span&gt;
      &lt;span class="nv"&gt;Obj&lt;/span&gt;   : &lt;span class="nv"&gt;IConveyor&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;END_VAR&lt;/span&gt;
   &lt;span class="nv"&gt;TotalObjects&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;TotalObjects&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;Collection&lt;/span&gt;[&lt;span class="nv"&gt;TotalObjects&lt;/span&gt;]:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Obj&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;FUNCTION_BLOCK&lt;/span&gt; &lt;span class="nv"&gt;CollectionHandlerDrive&lt;/span&gt;
&lt;span class="nv"&gt;VAR_INPUT&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="nv"&gt;VAR_OUTPUT&lt;/span&gt;
   &lt;span class="nv"&gt;TotalObjects&lt;/span&gt;: &lt;span class="nv"&gt;INT&lt;/span&gt;&lt;span class="c1"&gt;; // total objects found - use for FOR/NEXT loop iterations of methods&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="nv"&gt;VAR&lt;/span&gt;
   &lt;span class="nv"&gt;Collection&lt;/span&gt;: &lt;span class="nv"&gt;ARRAY&lt;/span&gt;[&lt;span class="mi"&gt;1&lt;/span&gt;..&lt;span class="nv"&gt;GVL_OBJECTS&lt;/span&gt;.&lt;span class="nv"&gt;MAX_OBJECTS&lt;/span&gt;] &lt;span class="nv"&gt;OF&lt;/span&gt; &lt;span class="nv"&gt;IDrive&lt;/span&gt;&lt;span class="c1"&gt;; // object array&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
   &lt;span class="nv"&gt;METHOD&lt;/span&gt; &lt;span class="nv"&gt;AddObject&lt;/span&gt;
   &lt;span class="nv"&gt;VAR_INPUT&lt;/span&gt;
      &lt;span class="nv"&gt;Obj&lt;/span&gt;   : &lt;span class="nv"&gt;IDrive&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;END_VAR&lt;/span&gt;
   &lt;span class="nv"&gt;TotalObjects&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;TotalObjects&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;Collection&lt;/span&gt;[&lt;span class="nv"&gt;TotalObjects&lt;/span&gt;]:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Obj&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;...define device FBs...&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;FUNCTION_BLOCK&lt;/span&gt; &lt;span class="n"&gt;ClassConveyor&lt;/span&gt; &lt;span class="n"&gt;IMPLEMENTS&lt;/span&gt; &lt;span class="n"&gt;IConveyor&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;conveyor&lt;/span&gt; &lt;span class="n"&gt;FB&lt;/span&gt;
&lt;span class="n"&gt;VAR_INPUT&lt;/span&gt;
&lt;span class="n"&gt;END_VAR&lt;/span&gt;
&lt;span class="n"&gt;VAR_OUTPUT&lt;/span&gt;
&lt;span class="n"&gt;END_VAR&lt;/span&gt;
&lt;span class="n"&gt;VAR&lt;/span&gt;
&lt;span class="n"&gt;END_VAR&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;METHOD&lt;/span&gt; &lt;span class="n"&gt;Fb_init&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BOOL&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;VAR_INPUT&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="n"&gt;bInitRetains&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BOOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Initialization&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;retain&lt;/span&gt; &lt;span class="n"&gt;variables&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="n"&gt;bInCopyCode&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BOOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Instance&lt;/span&gt; &lt;span class="n"&gt;moved&lt;/span&gt; &lt;span class="k"&gt;into&lt;/span&gt; &lt;span class="k"&gt;copy&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;END_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;GVL_OBJECTS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CollectionAllObjects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;THIS&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&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="k"&gt;add&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="k"&gt;all&lt;/span&gt; &lt;span class="n"&gt;objects&lt;/span&gt; &lt;span class="n"&gt;collection&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;GVL_OBJECTS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CollectionConveyors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;THIS&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&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="k"&gt;add&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="n"&gt;conveyor&lt;/span&gt; &lt;span class="n"&gt;collection&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;FUNCTION_BLOCK&lt;/span&gt; &lt;span class="n"&gt;ClassDrive&lt;/span&gt; &lt;span class="n"&gt;IMPLEMENTS&lt;/span&gt; &lt;span class="n"&gt;IDrive&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;drive&lt;/span&gt; &lt;span class="n"&gt;FB&lt;/span&gt;
&lt;span class="n"&gt;VAR_INPUT&lt;/span&gt;
&lt;span class="n"&gt;END_VAR&lt;/span&gt;
&lt;span class="n"&gt;VAR_OUTPUT&lt;/span&gt;
&lt;span class="n"&gt;END_VAR&lt;/span&gt;
&lt;span class="n"&gt;VAR&lt;/span&gt;
&lt;span class="n"&gt;END_VAR&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;METHOD&lt;/span&gt; &lt;span class="n"&gt;Fb_init&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BOOL&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;VAR_INPUT&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="n"&gt;bInitRetains&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BOOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Initialization&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;retain&lt;/span&gt; &lt;span class="n"&gt;variables&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="n"&gt;bInCopyCode&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BOOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Instance&lt;/span&gt; &lt;span class="n"&gt;moved&lt;/span&gt; &lt;span class="k"&gt;into&lt;/span&gt; &lt;span class="k"&gt;copy&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;END_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;GVL_OBJECTS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CollectionAllObjects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;THIS&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&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="k"&gt;add&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="k"&gt;all&lt;/span&gt; &lt;span class="n"&gt;objects&lt;/span&gt; &lt;span class="n"&gt;collection&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;GVL_OBJECTS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CollectionDrives&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;THIS&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&gt;);&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="o"&gt;//&lt;/span&gt; &lt;span class="k"&gt;add&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="n"&gt;drives&lt;/span&gt; &lt;span class="n"&gt;collection&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;...now main program...&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;PROGRAM&lt;/span&gt; &lt;span class="nt"&gt;PLC_PRG&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;Drive1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;Drive2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;ClassDrive&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;Conv1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;Conv2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;ClassConveyor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;END_VAR&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;On program start, arrays for all objects, conveyors and drives are automatically built.  You must manually code into the ClassXXX.FB_init() which collection arrays you want to have the object, but this is logical.  Now it is easy to handle collection method calls as needed.  If each drive has a Home() method, a simple FOR loop through the drives collection will call all drives.  If all objects have a Reset() method, then a FOR loop through the all objects collection will call all objects.  If I add another Conveyor (Conv3) or drive (Drive3) - no change is necessary - automatic object inclusion at project start.  All without the slow __QUERYINTERFACE() call during runtime (penalty is RAM usage for holding arrays).&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>OOP: Programmatical finding all objects for __QUERYINTERFACE</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/726cde3c21/?limit=25#967b" rel="alternate"/><published>2020-02-27T14:12:48.162000Z</published><updated>2020-02-27T14:12:48.162000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.comeb9673c172286375e465d0a9eb682ef36be4c315</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;If I put all of the objects into one large array, then it is quite easy to progmatically generate the smaller, specific arrays for each interface (some objects will belong to multiple interfaces due to their functionality):&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;... &lt;span class="nv"&gt;main&lt;/span&gt; &lt;span class="nv"&gt;object&lt;/span&gt; &lt;span class="nv"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;already&lt;/span&gt; &lt;span class="nv"&gt;populated&lt;/span&gt;....
&lt;span class="o"&gt;//&lt;/span&gt;... &lt;span class="nv"&gt;now&lt;/span&gt; &lt;span class="nv"&gt;build&lt;/span&gt; &lt;span class="nv"&gt;array&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;IDrive&lt;/span&gt; &lt;span class="nv"&gt;objects&lt;/span&gt;....
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;learn&lt;/span&gt; &lt;span class="nv"&gt;drive&lt;/span&gt; &lt;span class="nv"&gt;objects&lt;/span&gt;
&lt;span class="nv"&gt;ObjIndex&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="nv"&gt;J&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="nv"&gt;TO&lt;/span&gt; &lt;span class="nv"&gt;MAX_OBJ&lt;/span&gt; &lt;span class="k"&gt;DO&lt;/span&gt;
   &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="nv"&gt;__QUERYINTERFACE&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;AllObjects&lt;/span&gt;[&lt;span class="nv"&gt;J&lt;/span&gt;], &lt;span class="nv"&gt;IDriveClass&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
      &lt;span class="nv"&gt;DriveObjects&lt;/span&gt;[&lt;span class="nv"&gt;ObjIndex&lt;/span&gt;]:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;IDriveClass&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;ObjIndex&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;ObjIndex&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;END_IF&lt;/span&gt;
&lt;span class="nv"&gt;END_FOR&lt;/span&gt;
&lt;span class="nv"&gt;TotalDriveObjects&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;ObjIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt;... &lt;span class="nv"&gt;now&lt;/span&gt; &lt;span class="nv"&gt;build&lt;/span&gt; &lt;span class="nv"&gt;array&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;IPinch&lt;/span&gt; &lt;span class="nv"&gt;objects&lt;/span&gt;....
&lt;span class="nv"&gt;ObjIndex&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="nv"&gt;J&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="nv"&gt;TO&lt;/span&gt; &lt;span class="nv"&gt;MAX_OBJ&lt;/span&gt; &lt;span class="k"&gt;DO&lt;/span&gt;
   &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="nv"&gt;__QUERYINTERFACE&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;AllObjects&lt;/span&gt;[&lt;span class="nv"&gt;J&lt;/span&gt;], &lt;span class="nv"&gt;IPinchClass&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
      &lt;span class="nv"&gt;PinchObjects&lt;/span&gt;[&lt;span class="nv"&gt;ObjIndex&lt;/span&gt;]:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;IPinchClass&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;ObjIndex&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;ObjIndex&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;END_IF&lt;/span&gt;
&lt;span class="nv"&gt;END_FOR&lt;/span&gt;
&lt;span class="nv"&gt;TotalPinchObjects&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;ObjIndex&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt;... &lt;span class="nv"&gt;now&lt;/span&gt; &lt;span class="nv"&gt;build&lt;/span&gt; &lt;span class="nv"&gt;array&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;Ixxxx&lt;/span&gt; &lt;span class="nv"&gt;objects&lt;/span&gt;....
&lt;span class="o"&gt;//&lt;/span&gt;... &lt;span class="nv"&gt;etc&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This, of course, takes some time, but no problem at machine power on.  Just trying to avoid manually building the main array - but so far, it looks like I will have too!&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>OOP: Programmatical finding all objects for __QUERYINTERFACE</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/726cde3c21/?limit=25#d02b" rel="alternate"/><published>2020-02-27T14:12:47.161000Z</published><updated>2020-02-27T14:12:47.161000Z</updated><author><name>singleton</name><uri>https://forge.codesys.com/u/singleton/</uri></author><id>https://forge.codesys.combc220d5627be803b2d170b6c9bd0c9f4a1bfedb7</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;scott_cunningham hat geschrieben:&lt;/strong&gt;&lt;br/&gt;
There is also the possibility that there will be some methods/properties that all objects may have to implement.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this case I understand the generic interface, but I do not know a good solution for your problem.&lt;/p&gt;
&lt;p&gt;The only thing I could imagine is to have a range inside the array for each specific type, e.g. 1-10 are drives, 11-20 the next type,....&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>OOP: Programmatical finding all objects for __QUERYINTERFACE</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/726cde3c21/?limit=25#0c30" rel="alternate"/><published>2020-02-27T14:12:46.816000Z</published><updated>2020-02-27T14:12:46.816000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.comf80c031c28a942068eb4daf22559feaafdb1c5cc</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;There will be quite a number of interfaces - at least 20 (I left all of these out of my sample code) and a large number of objects (many hundreds).  To avoid using __QUERYINTERFACE during the actual machine operation (too slow doing this with nearly 1000 objects - results in about 2mS of execution time), I must build ahead of time, specific lookup arrays for each interface.  Therefore, I create one single large array of all objects, and then build individual arrays from there (FOR loops for each interface compare against the whole list).&lt;/p&gt;
&lt;p&gt;Additionally, by having IAllObjClass extend __System.IQueryInterface and requiring all objects to extend IAllObjClass, __QUERYINTERFACE is working.&lt;/p&gt;
&lt;p&gt;There is also the possibility that there will be some methods/properties that all objects may have to implement.&lt;/p&gt;&lt;/div&gt;</summary></entry></feed>