<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Recent changes to Home</title><link>https://forge.codesys.com/lib/colist/home/Home/</link><description>Recent changes to Home</description><language>en</language><lastBuildDate>Sat, 06 Jul 2024 21:02:32 -0000</lastBuildDate><atom:link href="https://forge.codesys.com/lib/colist/home/Home/feed" rel="self" type="application/rss+xml"></atom:link><item><title>Home modified by hermsen</title><link>https://forge.codesys.com/lib/colist/home/Home/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v48
+++ v49
@@ -128,21 +128,18 @@


 // Program
-PROGRAM Main
-VAR
     i : __UXINT;
     BuildList : BOOL := TRUE;
     RemoveElem: BOOL;
     List : LinkedList.List;
+    ListSize : UDINT;
     El1: FB_MyElement;
     El2: FB_MyElement;
     El3: FB_MyElement;
     El4: FB_MyElement;     
-    ListSize : UDINT := 0;
     itfElement : LinkedList.IElement;
     itfCurElement : IElement2;
-    CurCount : UINT;
-END_VAR
+    HasNext : BOOL;


 // Body
@@ -153,6 +150,7 @@
    List.AppendElem( El2 );
    List.AppendElem( El3 );
    List.AppendElem( El4 );
+   itfElement := List.HeadElem;
    BuildList := FALSE;       
 END_IF

@@ -166,22 +164,15 @@
     RemoveElem := FALSE;
 END_IF;

-ListSize := List.ListSize;
-IF ListSize &amp;lt;&amp;gt; 0 THEN // not empty
-    itfElement := List.HeadElem;
-    IF __QUERYINTERFACE( itfElement, itfCurElement ) THEN 
-        WHILE itfCurElement &amp;lt;&amp;gt; 0 DO
-            FOR i := 1 TO 10 DO
-            // Count gets tallied up
-                itfCurElement.Count();
-            END_FOR;
-            CurCount := itfCurElement.GetCount;
-            // Get the next element by using the pointer stored in the element itself (we can also use PrevElem to get the previous element)
-            itfElement := itfCurElement.NextElem;
-            __QUERYINTERFACE( itfElement, itfCurElement );
-        END_WHILE
-    END_IF;
-END_IF
+List.ItterateRestart( HasNext =&amp;gt; HasNext );
+WHILE HasNext DO
+    List.ItterateNext( itfElement =&amp;gt; itfElement, HasNext =&amp;gt; HasNext );
+    IF __QUERYINTERFACE( itfElement, itfCurElement ) THEN
+        itfCurElement.Count();
+        // get next element
+        CurCount := itfCurElement.GetCount;
+    END_IF
+END_WHILE


 ~~~
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">hermsen</dc:creator><pubDate>Sat, 06 Jul 2024 21:02:32 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.comb2917bca1c428510bec79f78a3a24867ce127344</guid></item><item><title>Home modified by hermsen</title><link>https://forge.codesys.com/lib/colist/home/Home/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v47
+++ v48
@@ -31,6 +31,7 @@


 INTERFACE IElement2 EXTENDS LinkedList.IElement
+METHOD ReturnInstance : POINTER TO FB_MyElement;
 METHOD Count : UINT;
 PROPERTY GetCount : UINT
 // Get only
@@ -124,8 +125,13 @@
 * Declare an instance of LIST
 * Declare an instance of FB_MyElement;
 ~~~
+
+
+// Program
+PROGRAM Main
 VAR
-    BuildList : BOOL;
+    i : __UXINT;
+    BuildList : BOOL := TRUE;
     RemoveElem: BOOL;
     List : LinkedList.List;
     El1: FB_MyElement;
@@ -133,46 +139,51 @@
     El3: FB_MyElement;
     El4: FB_MyElement;     
     ListSize : UDINT := 0;
+    itfElement : LinkedList.IElement;
     itfCurElement : IElement2;
+    CurCount : UINT;
 END_VAR
-  
-// Body
+
+
+// Body
+i := i + 1;
+
 IF BuildList THEN // Add all elements
    List.AppendElem( El1 );
    List.AppendElem( El2 );
    List.AppendElem( El3 );
    List.AppendElem( El4 );
-   BuildList := FALSE;  
-   CurCount : UINT;   
+   BuildList := FALSE;       
 END_IF

 IF RemoveElem THEN // Removes the latest valid accessed element
-   IF itfCurElement &amp;lt;&amp;gt; 0 THEN
-      List.RemoveElem( itfCurElement );
-   END_IF
-   RemoveElem := FALSE;
+    IF itfCurElement &amp;lt;&amp;gt; 0 THEN
+        //__QUERYINTERFACE(&amp;lt;itf_source&amp;gt;,&amp;lt;itf_dest&amp;gt;);
+        IF __QUERYINTERFACE( itfElement, itfCurElement ) THEN 
+            List.RemoveElem( itfElement );
+        END_IF;
+    END_IF
+    RemoveElem := FALSE;
 END_IF;

 ListSize := List.ListSize;
-
 IF ListSize &amp;lt;&amp;gt; 0 THEN // not empty
-
-    itfCurElement := List.HeadElem;
-
-    WHILE itfCurElement &amp;lt;&amp;gt; 0 DO
-        
-        FOR i := 1 TO 10 DO
-        // Count gets tallied up
-            itfCurElement.Count();
-        END_FOR;
-        CurCount := itfCurElement.GetCount;
-        
-        // Get the next element by using the pointer stored in the element itself (we can also use PrevElem to get the previous element)
-        itfCurElement := itfCurElement.NextElem;
-        
-    END_WHILE
-    
+    itfElement := List.HeadElem;
+    IF __QUERYINTERFACE( itfElement, itfCurElement ) THEN 
+        WHILE itfCurElement &amp;lt;&amp;gt; 0 DO
+            FOR i := 1 TO 10 DO
+            // Count gets tallied up
+                itfCurElement.Count();
+            END_FOR;
+            CurCount := itfCurElement.GetCount;
+            // Get the next element by using the pointer stored in the element itself (we can also use PrevElem to get the previous element)
+            itfElement := itfCurElement.NextElem;
+            __QUERYINTERFACE( itfElement, itfCurElement );
+        END_WHILE
+    END_IF;
 END_IF
+
+
 ~~~


&amp;lt;/itf_dest&amp;gt;&amp;lt;/itf_source&amp;gt;&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">hermsen</dc:creator><pubDate>Sat, 06 Jul 2024 20:17:58 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com5c99a9d7031242cd69a01490bac619e09dd76e2b</guid></item><item><title>Home modified by hermsen</title><link>https://forge.codesys.com/lib/colist/home/Home/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v46
+++ v47
@@ -18,16 +18,25 @@
 * Insert the Library Reference in your program's library manager.
 * Declare a new FB named FB_ExtendedElement
 * We need to either to
-    * 1) extend ~FB_Element~ since it has been decorated as ~~~ ABSTRACT ~~~ or 
-    * 2) implement interface ~~~ LinkedList.IElement ~~~
-
-
- &amp;gt; **Pro Tip**
-   Any new FB that will be a part of the List should *preferably* use method 2) implement interface. This way FB_ExtendElement will act as a baseclass for your Element without being itself of type "FB_ELEMENT". EXTENDS means "IS OF CLASS .. ", while IMPLEMENTS means "MAKES USE OF INTERFACE .. ". 
-   If you use encapsulation and composition for the appropriate interface, as a bonus you gain more freedom and more flexibility, it isn't a CLASS of! However, the penalty is that it will demand more programming effort since the Interface needs to be implemented.
-
-~~~
-FUNCTION_BLOCK FB_MyElement IMPLEMENTS LinkedList.IElement // We choose implement interface here
+    * A) extend ~FB_Element~ since it has been decorated as ~~~ ABSTRACT ~~~ or 
+    * B) implement interface ~~~ LinkedList.IElement ~~~
+
+
+ &amp;gt; **Tip**
+   Any  FB that will be a part of the List should *preferably* use method B) implement interface. 
+   This way FB_ExtendElement will act as a baseclass for your Element without being itself of type "FB_ELEMENT". EXTENDS means "IS OF CLASS .. ", while IMPLEMENTS means "MAKES USE OF INTERFACE .. ". 
+   If you use encapsulation and composition for the appropriate interface,you gain more freedom and more flexibility as the FB is not a CLASS of. However, the penalty taken is that this will demand more programming effort since the Interface(s) need to be implemented.
+
+~~~
+
+
+INTERFACE IElement2 EXTENDS LinkedList.IElement
+METHOD Count : UINT;
+PROPERTY GetCount : UINT
+// Get only
+
+
+FUNCTION_BLOCK FB_MyElement IMPLEMENTS IElement2
 VAR
     _itfPrev : IElement;
     _itfNext : IElement;
@@ -38,7 +47,7 @@
 // Body


-METHOD IsListMemberOf : BOOL // xMember
+METHOD IsListMemberOf : BOOL
 VAR_INPUT
    itfList : IList;
 END_VAR
@@ -124,21 +133,22 @@
     El3: FB_MyElement;
     El4: FB_MyElement;     
     ListSize : UDINT := 0;
-    itfCurElement : IElement;
+    itfCurElement : IElement2;
 END_VAR

 // Body
 IF BuildList THEN // Add all elements
-   List.AppendElement( El1 );
-   List.AppendElement( El2 );
-   List.AppendElement( El3 );
-   List.AppendElement( El4 );
-   BuildList := FALSE;       
+   List.AppendElem( El1 );
+   List.AppendElem( El2 );
+   List.AppendElem( El3 );
+   List.AppendElem( El4 );
+   BuildList := FALSE;  
+   CurCount : UINT;   
 END_IF

 IF RemoveElem THEN // Removes the latest valid accessed element
    IF itfCurElement &amp;lt;&amp;gt; 0 THEN
-      List.RemoveElement( itfCurElement );
+      List.RemoveElem( itfCurElement );
    END_IF
    RemoveElem := FALSE;
 END_IF;
@@ -166,11 +176,12 @@
 ~~~


-&amp;gt; PRO TIPS
+&amp;gt; TIPS
   Always obtain access to elements via the functionblock instance of List.
   Element require some burnerplate-code when compared to array's but they also more flexible due to their dynamic nature.
-  You can even claim dynamic Elements on the fly through use of the pre claimed dynamic memory pool factory class. This factory reserves a pre-defined number of elements for you which you can claim or release during runtime. Just check if a new element can be claimed (is there a free lement available from the pool?), claim it, add to the list with AddElement( .. ), ready.
- 
+  You could opt to implement dynamic Elements 'on the fly' through use of a pre-claimed dynamic memory pool factory class. This factory reserves a pre-defined number of elements for you which you can claim or release during runtime. Just check if a new element can be claimed (is there a free lement available from the pool?), claim it, add to the list with AddElement( .. ), done.
+  Advantage of this type of pool is that the compiler still needs reserve the pool memory during compile phase and thus the controller does not assign dynamic memory during runtime. 
+  
 # Download
 **By downloading and using our software you abide by the [MIT License](https://forge.codesys.com/lib/cobolt/code/HEAD/tree/license.txt?format=raw)**

@@ -179,9 +190,9 @@
 # Requirements
 System requirements and restrictions | Info 
 ---------- | ---------- 
-Programming System      | CODESYS Development System Version 3.5.9.0 or higher
-Runtime System      | CODESYS Control Version 3.5.9.0 or higher
-Licensing   | -
+Programming System      | CODESYS Development System Version &amp;gt;= 3.5.9.0
+Runtime System      | CODESYS Control Version &amp;gt;= 3.5.9.0
+Licensing   | open source
 Required Accessories | -


&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">hermsen</dc:creator><pubDate>Sat, 06 Jul 2024 20:05:27 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com59a08b879560a28faeaa27b692ea3c6c7bab89c0</guid></item><item><title>Home modified by h-hermsen</title><link>https://forge.codesys.com/lib/colist/home/Home/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v45
+++ v46
@@ -18,7 +18,7 @@
 * Insert the Library Reference in your program's library manager.
 * Declare a new FB named FB_ExtendedElement
 * We need to either to
-    * 1) extend ~~~ FB_Element ~~~ since it has been decorated as ~~~ ABSTRACT ~~~ or 
+    * 1) extend ~FB_Element~ since it has been decorated as ~~~ ABSTRACT ~~~ or 
     * 2) implement interface ~~~ LinkedList.IElement ~~~

&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">h-hermsen</dc:creator><pubDate>Sun, 17 Apr 2022 23:01:42 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com5993a2a5cd22949404ca866933d69f4486d1cc95</guid></item><item><title>Home modified by h-hermsen</title><link>https://forge.codesys.com/lib/colist/home/Home/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v44
+++ v45
@@ -17,11 +17,14 @@
 # Usage
 * Insert the Library Reference in your program's library manager.
 * Declare a new FB named FB_ExtendedElement
-* We need to either 1) extend at least one FB_Element since it has been decorated as ABSTRACT.
-                 or 2) implement interface: LinkedList.IElement. 
+* We need to either to
+    * 1) extend ~~~ FB_Element ~~~ since it has been decorated as ~~~ ABSTRACT ~~~ or 
+    * 2) implement interface ~~~ LinkedList.IElement ~~~
+

  &amp;gt; **Pro Tip**
-   Any new FB that will be a part of the List should *preferably* use method 2) implement interface. This way FB_ExtendElement will act as a baseclass for your Element without being itself of type "FB_ELEMENT" (EXTENDS means "IS OF CLASS .. ", while IMPLEMENTS means "MAKES USE OF INTERFACE .. "). If you use encapsulation and composition for the appropriate interface, as a bonus it will provide you with more freedom and more flexibility as your FB is not inflicted with the dependancy inversion principle. However, as a penalty it will demand more programming effort since all methods and properties need to be implemented for the interface need to be implemented. 
+   Any new FB that will be a part of the List should *preferably* use method 2) implement interface. This way FB_ExtendElement will act as a baseclass for your Element without being itself of type "FB_ELEMENT". EXTENDS means "IS OF CLASS .. ", while IMPLEMENTS means "MAKES USE OF INTERFACE .. ". 
+   If you use encapsulation and composition for the appropriate interface, as a bonus you gain more freedom and more flexibility, it isn't a CLASS of! However, the penalty is that it will demand more programming effort since the Interface needs to be implemented.

 ~~~
 FUNCTION_BLOCK FB_MyElement IMPLEMENTS LinkedList.IElement // We choose implement interface here
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">h-hermsen</dc:creator><pubDate>Fri, 18 Feb 2022 00:48:36 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com91d9e69483d0277a89af9c0536474edd373df355</guid></item><item><title>Home modified by h-hermsen</title><link>https://forge.codesys.com/lib/colist/home/Home/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v43
+++ v44
@@ -1,6 +1,6 @@
 [[startpage]]
 [[members]]
-[[section bgcolor=darkgrey color=white align=right]]
+[[section bgcolor=white color=black align=right]]
 [[img src=https://forge.codesys.com/svn/lib,counit,code/trunk/www/logo_codesys_forge.png height=96p align=left]][[img src=https://forge.codesys.com/lib/colist/screenshot/coLink%20logo%20round%20blue%20inverted.png height=96p align=left]]
 [[section bgcolor=darkgrey color=white align=center]]
 # co🔗e: Linked List
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">h-hermsen</dc:creator><pubDate>Fri, 18 Feb 2022 00:41:55 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.comab8a2f12cb0ade25f4d815e934b41c6ce9a907df</guid></item><item><title>Home modified by h-hermsen</title><link>https://forge.codesys.com/lib/colist/home/Home/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v42
+++ v43
@@ -1,9 +1,7 @@
 [[startpage]]
 [[members]]
-[[section bgcolor=white color=white align=right]]
+[[section bgcolor=darkgrey color=white align=right]]
 [[img src=https://forge.codesys.com/svn/lib,counit,code/trunk/www/logo_codesys_forge.png height=96p align=left]][[img src=https://forge.codesys.com/lib/colist/screenshot/coLink%20logo%20round%20blue%20inverted.png height=96p align=left]]
-An opensource LinkedList Solution
-
 [[section bgcolor=darkgrey color=white align=center]]
 # co🔗e: Linked List
 **This Page**
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">h-hermsen</dc:creator><pubDate>Fri, 18 Feb 2022 00:41:19 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.coma1a44c985c491863492fe97c4acd0b72d5ea96f4</guid></item><item><title>Home modified by h-hermsen</title><link>https://forge.codesys.com/lib/colist/home/Home/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v41
+++ v42
@@ -1,6 +1,6 @@
 [[startpage]]
 [[members]]
-[[section bgcolor=darkgrey color=black align=right]]
+[[section bgcolor=white color=white align=right]]
 [[img src=https://forge.codesys.com/svn/lib,counit,code/trunk/www/logo_codesys_forge.png height=96p align=left]][[img src=https://forge.codesys.com/lib/colist/screenshot/coLink%20logo%20round%20blue%20inverted.png height=96p align=left]]
 An opensource LinkedList Solution

&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">h-hermsen</dc:creator><pubDate>Fri, 18 Feb 2022 00:40:44 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.come9dc5511d2787b0588b5e6f2841860b7ab5f27d8</guid></item><item><title>Home modified by h-hermsen</title><link>https://forge.codesys.com/lib/colist/home/Home/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v40
+++ v41
@@ -1,9 +1,10 @@
 [[startpage]]
 [[members]]
-[[section bgcolor=white color=black align=right]]
+[[section bgcolor=darkgrey color=black align=right]]
 [[img src=https://forge.codesys.com/svn/lib,counit,code/trunk/www/logo_codesys_forge.png height=96p align=left]][[img src=https://forge.codesys.com/lib/colist/screenshot/coLink%20logo%20round%20blue%20inverted.png height=96p align=left]]
+An opensource LinkedList Solution

-[[section bgcolor=grey color=white align=center]]
+[[section bgcolor=darkgrey color=white align=center]]
 # co🔗e: Linked List
 **This Page**
 [Introduction](#introduction) | [Usage](#usage) | [Download](#download) | [Requirements](#requirements) | [Acknowledgements](#acknowledgements)
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">h-hermsen</dc:creator><pubDate>Fri, 18 Feb 2022 00:40:08 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com10591376250d79147d50b3ca52eaaaf51a7003d2</guid></item><item><title>Home modified by h-hermsen</title><link>https://forge.codesys.com/lib/colist/home/Home/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v39
+++ v40
@@ -25,7 +25,7 @@
    Any new FB that will be a part of the List should *preferably* use method 2) implement interface. This way FB_ExtendElement will act as a baseclass for your Element without being itself of type "FB_ELEMENT" (EXTENDS means "IS OF CLASS .. ", while IMPLEMENTS means "MAKES USE OF INTERFACE .. "). If you use encapsulation and composition for the appropriate interface, as a bonus it will provide you with more freedom and more flexibility as your FB is not inflicted with the dependancy inversion principle. However, as a penalty it will demand more programming effort since all methods and properties need to be implemented for the interface need to be implemented.

 ~~~
-FUNCTION_BLOCK FB_ExtendedElement EXTENDS Element // Element is decorated with ABSTRACT!
+FUNCTION_BLOCK FB_MyElement IMPLEMENTS LinkedList.IElement // We choose implement interface here
 VAR
     _itfPrev : IElement;
     _itfNext : IElement;
@@ -34,7 +34,6 @@
 END_VAR

 // Body
-SUPER^();


 METHOD IsListMemberOf : BOOL // xMember
@@ -92,7 +91,7 @@
 _itfPrev := PrevElem;


-METHOD ReturnInstance : POINTER TO FB_ExtendedElement
+METHOD ReturnInstance : POINTER TO FB_MyElement

 // Body
 ReturnInstance := THIS;
@@ -112,32 +111,41 @@
 ~~~

 * Declare an instance of LIST
-* Declare an instance of FB_ExtendedElement;
+* Declare an instance of FB_MyElement;
 ~~~
 VAR
-    BuildList : Bool;
+    BuildList : BOOL;
+    RemoveElem: BOOL;
     List : LinkedList.List;
-    Extended1: FB_ExtendedElement;
-    Extended2: FB_ExtendedElement;
-    Extended3: FB_ExtendedElement;
-    Extended4: FB_ExtendedElement;     
+    El1: FB_MyElement;
+    El2: FB_MyElement;
+    El3: FB_MyElement;
+    El4: FB_MyElement;     
     ListSize : UDINT := 0;
     itfCurElement : IElement;
 END_VAR

 // Body
-IF BuildList THEN
-   List.AppendElement( Extended1 );
-   List.AppendElement( Extended2 );
-   List.AppendElement( Extended3 );
-   List.AppendElement( Extended4 );
+IF BuildList THEN // Add all elements
+   List.AppendElement( El1 );
+   List.AppendElement( El2 );
+   List.AppendElement( El3 );
+   List.AppendElement( El4 );
    BuildList := FALSE;       
 END_IF

-ListSize := List.ListSize;            
+IF RemoveElem THEN // Removes the latest valid accessed element
+   IF itfCurElement &amp;lt;&amp;gt; 0 THEN
+      List.RemoveElement( itfCurElement );
+   END_IF
+   RemoveElem := FALSE;
+END_IF;
+
+ListSize := List.ListSize;
+
 IF ListSize &amp;lt;&amp;gt; 0 THEN // not empty

-    itfCurElement := List.HeadElem; // Point itfCurElement to the first element the list was initialised with
+    itfCurElement := List.HeadElem;

     WHILE itfCurElement &amp;lt;&amp;gt; 0 DO

@@ -153,15 +161,14 @@
     END_WHILE

 END_IF
-
-
 ~~~


 &amp;gt; PRO TIPS
   Always obtain access to elements via the functionblock instance of List.
-  Element require more burnerplate-code when compared to array's but are also more flexible due to their dynamic nature. 
-
+  Element require some burnerplate-code when compared to array's but they also more flexible due to their dynamic nature.
+  You can even claim dynamic Elements on the fly through use of the pre claimed dynamic memory pool factory class. This factory reserves a pre-defined number of elements for you which you can claim or release during runtime. Just check if a new element can be claimed (is there a free lement available from the pool?), claim it, add to the list with AddElement( .. ), ready.
+ 
 # Download
 **By downloading and using our software you abide by the [MIT License](https://forge.codesys.com/lib/cobolt/code/HEAD/tree/license.txt?format=raw)**

&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">h-hermsen</dc:creator><pubDate>Tue, 15 Feb 2022 22:53:47 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com64038c4a1ae06dbf6eb1dec0827cce5a0fb7b0ea</guid></item></channel></rss>