Merge default wxPython4
authorEdouard Tisserant <edouard.tisserant@gmail.com>
Wed, 02 Feb 2022 20:27:17 +0100
branchwxPython4
changeset 3422 700b39cb4525
parent 3405 fdc12f7d27c8 (current diff)
parent 3416 53c66c4aefa3 (diff)
child 3423 84afcc0ebadd
Merge default
opc_ua/opcua_client_maker.py
--- a/opc_ua/opcua_client_maker.py	Sun Jan 16 17:00:58 2022 +0100
+++ b/opc_ua/opcua_client_maker.py	Wed Feb 02 20:27:17 2022 +0100
@@ -29,7 +29,7 @@
 UA_NODE_ID_types = {
     "int"   : ("UA_NODEID_NUMERIC", "{}"  ),
     "str"   : ("UA_NODEID_STRING" , '"{}"'),
-    "UUIS"  : ("UA_NODEID_UUID"   , '"{}"'),
+    "UUID"  : ("UA_NODEID_UUID"   , '"{}"'),
 }
 
 lstcolnames  = [  "Name", "NSIdx", "IdType", "Id", "Type", "IEC"]
@@ -485,11 +485,11 @@
 #include <open62541/client_highlevel.h>
 #include <open62541/plugin/log_stdout.h>
 
-UA_Client *client;
+static UA_Client *client;
 
 #define DECL_VAR(ua_type, C_type, c_loc_name)                                                       \\
-UA_Variant c_loc_name##_variant;                                                                    \\
-C_type c_loc_name##_buf = 0;                                                                        \\
+static UA_Variant c_loc_name##_variant;                                                             \\
+static C_type c_loc_name##_buf = 0;                                                                 \\
 C_type *c_loc_name = &c_loc_name##_buf;
 
 %(decl)s
@@ -501,7 +501,7 @@
 }
 
 
-#define INIT_READ_VARIANT(ua_type, c_loc_name)                                                          \\
+#define INIT_READ_VARIANT(ua_type, c_loc_name)                                                     \\
     UA_Variant_init(&c_loc_name##_variant);
 
 #define INIT_WRITE_VARIANT(ua_type, ua_type_enum, c_loc_name)       \\
--- a/svghmi/analyse_widget.xslt	Sun Jan 16 17:00:58 2022 +0100
+++ b/svghmi/analyse_widget.xslt	Wed Feb 02 20:27:17 2022 +0100
@@ -18,14 +18,26 @@
         </xsl:otherwise>
       </xsl:choose>
     </xsl:variable>
-    <xsl:variable name="_type" select="substring-before($args,':')"/>
+    <xsl:variable name="_typefreq" select="substring-before($args,':')"/>
+    <xsl:variable name="typefreq">
+      <xsl:choose>
+        <xsl:when test="$_typefreq">
+          <xsl:value-of select="$_typefreq"/>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:value-of select="$args"/>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:variable>
+    <xsl:variable name="freq" select="substring-after($typefreq,'|')"/>
+    <xsl:variable name="_type" select="substring-before($typefreq,'|')"/>
     <xsl:variable name="type">
       <xsl:choose>
         <xsl:when test="$_type">
           <xsl:value-of select="$_type"/>
         </xsl:when>
         <xsl:otherwise>
-          <xsl:value-of select="$args"/>
+          <xsl:value-of select="$typefreq"/>
         </xsl:otherwise>
       </xsl:choose>
     </xsl:variable>
@@ -37,6 +49,11 @@
         <xsl:attribute name="type">
           <xsl:value-of select="$type"/>
         </xsl:attribute>
+        <xsl:if test="$freq">
+          <xsl:attribute name="freq">
+            <xsl:value-of select="$freq"/>
+          </xsl:attribute>
+        </xsl:if>
         <xsl:for-each select="str:split(substring-after($args, ':'), ':')">
           <arg>
             <xsl:attribute name="value">
@@ -204,6 +221,71 @@
       <xsl:text>Boolean variable</xsl:text>
     </path>
   </xsl:template>
+  <xsl:template name="generated_button_class">
+    <xsl:param name="fsm"/>
+    <xsl:text>    frequency = 5;
+</xsl:text>
+    <xsl:text>    display = "inactive";
+</xsl:text>
+    <xsl:text>    state = "init";
+</xsl:text>
+    <xsl:text>    dispatch(value) {
+</xsl:text>
+    <xsl:apply-templates mode="dispatch_transition" select="$fsm"/>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>    onmouseup(evt) {
+</xsl:text>
+    <xsl:text>        svg_root.removeEventListener("pointerup", this.bound_onmouseup, true);
+</xsl:text>
+    <xsl:apply-templates mode="mouse_transition" select="$fsm">
+      <xsl:with-param name="position" select="'up'"/>
+    </xsl:apply-templates>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>    onmousedown(evt) {
+</xsl:text>
+    <xsl:text>        svg_root.addEventListener("pointerup", this.bound_onmouseup, true);
+</xsl:text>
+    <xsl:apply-templates mode="mouse_transition" select="$fsm">
+      <xsl:with-param name="position" select="'down'"/>
+    </xsl:apply-templates>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:apply-templates mode="actions" select="$fsm"/>
+    <xsl:text>    animate(){
+</xsl:text>
+    <xsl:text>        if (this.active_elt &amp;&amp; this.inactive_elt) {
+</xsl:text>
+    <xsl:for-each select="str:split('active inactive')">
+      <xsl:text>            if(this.display == "</xsl:text>
+      <xsl:value-of select="."/>
+      <xsl:text>")
+</xsl:text>
+      <xsl:text>                this.</xsl:text>
+      <xsl:value-of select="."/>
+      <xsl:text>_elt.style.display = "";
+</xsl:text>
+      <xsl:text>            else
+</xsl:text>
+      <xsl:text>                this.</xsl:text>
+      <xsl:value-of select="."/>
+      <xsl:text>_elt.style.display = "none";
+</xsl:text>
+    </xsl:for-each>
+    <xsl:text>        }
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>    init() {
+</xsl:text>
+    <xsl:text>        this.bound_onmouseup = this.onmouseup.bind(this);
+</xsl:text>
+    <xsl:text>        this.element.addEventListener("pointerdown", this.onmousedown.bind(this));
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+  </xsl:template>
   <xsl:template match="widget[@type='CircularBar']" mode="widget_desc">
     <type>
       <xsl:value-of select="@type"/>
--- a/svghmi/gen_dnd_widget_svg.xslt	Sun Jan 16 17:00:58 2022 +0100
+++ b/svghmi/gen_dnd_widget_svg.xslt	Wed Feb 02 20:27:17 2022 +0100
@@ -20,14 +20,26 @@
         </xsl:otherwise>
       </xsl:choose>
     </xsl:variable>
-    <xsl:variable name="_type" select="substring-before($args,':')"/>
+    <xsl:variable name="_typefreq" select="substring-before($args,':')"/>
+    <xsl:variable name="typefreq">
+      <xsl:choose>
+        <xsl:when test="$_typefreq">
+          <xsl:value-of select="$_typefreq"/>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:value-of select="$args"/>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:variable>
+    <xsl:variable name="freq" select="substring-after($typefreq,'|')"/>
+    <xsl:variable name="_type" select="substring-before($typefreq,'|')"/>
     <xsl:variable name="type">
       <xsl:choose>
         <xsl:when test="$_type">
           <xsl:value-of select="$_type"/>
         </xsl:when>
         <xsl:otherwise>
-          <xsl:value-of select="$args"/>
+          <xsl:value-of select="$typefreq"/>
         </xsl:otherwise>
       </xsl:choose>
     </xsl:variable>
@@ -39,6 +51,11 @@
         <xsl:attribute name="type">
           <xsl:value-of select="$type"/>
         </xsl:attribute>
+        <xsl:if test="$freq">
+          <xsl:attribute name="freq">
+            <xsl:value-of select="$freq"/>
+          </xsl:attribute>
+        </xsl:if>
         <xsl:for-each select="str:split(substring-after($args, ':'), ':')">
           <arg>
             <xsl:attribute name="value">
--- a/svghmi/gen_index_xhtml.xslt	Sun Jan 16 17:00:58 2022 +0100
+++ b/svghmi/gen_index_xhtml.xslt	Wed Feb 02 20:27:17 2022 +0100
@@ -175,14 +175,26 @@
         </xsl:otherwise>
       </xsl:choose>
     </xsl:variable>
-    <xsl:variable name="_type" select="substring-before($args,':')"/>
+    <xsl:variable name="_typefreq" select="substring-before($args,':')"/>
+    <xsl:variable name="typefreq">
+      <xsl:choose>
+        <xsl:when test="$_typefreq">
+          <xsl:value-of select="$_typefreq"/>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:value-of select="$args"/>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:variable>
+    <xsl:variable name="freq" select="substring-after($typefreq,'|')"/>
+    <xsl:variable name="_type" select="substring-before($typefreq,'|')"/>
     <xsl:variable name="type">
       <xsl:choose>
         <xsl:when test="$_type">
           <xsl:value-of select="$_type"/>
         </xsl:when>
         <xsl:otherwise>
-          <xsl:value-of select="$args"/>
+          <xsl:value-of select="$typefreq"/>
         </xsl:otherwise>
       </xsl:choose>
     </xsl:variable>
@@ -194,6 +206,11 @@
         <xsl:attribute name="type">
           <xsl:value-of select="$type"/>
         </xsl:attribute>
+        <xsl:if test="$freq">
+          <xsl:attribute name="freq">
+            <xsl:value-of select="$freq"/>
+          </xsl:attribute>
+        </xsl:if>
         <xsl:for-each select="str:split(substring-after($args, ':'), ':')">
           <arg>
             <xsl:attribute name="value">
@@ -998,7 +1015,7 @@
   <xsl:template xmlns="http://www.w3.org/2000/svg" mode="unlink_clone" match="svg:*">
     <xsl:param name="seed"/>
     <xsl:choose>
-      <xsl:when test="@id = $hmi_elements/@id">
+      <xsl:when test="@id = $hmi_widgets/@id">
         <use>
           <xsl:attribute name="xlink:href">
             <xsl:value-of select="concat('#',@id)"/>
@@ -1228,13 +1245,25 @@
         </xsl:if>
       </xsl:for-each>
     </xsl:variable>
+    <xsl:variable name="freq">
+      <xsl:choose>
+        <xsl:when test="$widget/@freq">
+          <xsl:value-of select="$widget/@freq"/>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:text>undefined</xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:variable>
     <xsl:text>  "</xsl:text>
     <xsl:value-of select="@id"/>
     <xsl:text>": new </xsl:text>
     <xsl:value-of select="$widget/@type"/>
     <xsl:text>Widget ("</xsl:text>
     <xsl:value-of select="@id"/>
-    <xsl:text>",[</xsl:text>
+    <xsl:text>",</xsl:text>
+    <xsl:value-of select="$freq"/>
+    <xsl:text>,[</xsl:text>
     <xsl:value-of select="$args"/>
     <xsl:text>],[</xsl:text>
     <xsl:value-of select="$indexes"/>
@@ -1424,12 +1453,14 @@
 </xsl:text>
     <xsl:text>
 </xsl:text>
-    <xsl:text>    constructor(elt_id,args,indexes,minmaxes,members){
+    <xsl:text>    constructor(elt_id, freq, args, indexes, minmaxes, members){
 </xsl:text>
     <xsl:text>        this.element_id = elt_id;
 </xsl:text>
     <xsl:text>        this.element = id(elt_id);
 </xsl:text>
+    <xsl:text>        if(freq !== undefined) this.frequency = freq;
+</xsl:text>
     <xsl:text>        this.args = args;
 </xsl:text>
     <xsl:text>        this.indexes = indexes;
@@ -2183,6 +2214,62 @@
       <xsl:text>Boolean variable</xsl:text>
     </path>
   </xsl:template>
+  <xsl:variable name="_push_button_fsm">
+    <fsm>
+      <state name="init">
+        <on-dispatch value="false">
+          <jump state="reflect_off"/>
+        </on-dispatch>
+        <on-dispatch value="true">
+          <jump state="reflect_on"/>
+        </on-dispatch>
+      </state>
+      <state name="reflect_on">
+        <show eltname="active"/>
+        <on-mouse position="down">
+          <jump state="on"/>
+        </on-mouse>
+        <on-mouse position="up">
+          <jump state="off"/>
+        </on-mouse>
+        <on-dispatch value="false">
+          <jump state="reflect_off"/>
+        </on-dispatch>
+      </state>
+      <state name="on">
+        <hmi-value value="true"/>
+        <show eltname="active"/>
+        <on-mouse position="up">
+          <jump state="off"/>
+        </on-mouse>
+        <on-dispatch value="false">
+          <jump state="reflect_off"/>
+        </on-dispatch>
+      </state>
+      <state name="reflect_off">
+        <show eltname="inactive"/>
+        <on-mouse position="down">
+          <jump state="on"/>
+        </on-mouse>
+        <on-mouse position="up">
+          <jump state="off"/>
+        </on-mouse>
+        <on-dispatch value="true">
+          <jump state="reflect_on"/>
+        </on-dispatch>
+      </state>
+      <state name="off">
+        <hmi-value value="false"/>
+        <show eltname="inactive"/>
+        <on-mouse position="down">
+          <jump state="on"/>
+        </on-mouse>
+        <on-dispatch value="true">
+          <jump state="reflect_on"/>
+        </on-dispatch>
+      </state>
+    </fsm>
+  </xsl:variable>
   <xsl:variable name="_button_fsm">
     <fsm>
       <state name="init">
@@ -2313,6 +2400,10 @@
     <xsl:value-of select="@name"/>
     <xsl:text>_action(){
 </xsl:text>
+    <xsl:text>console.log("Entering state </xsl:text>
+    <xsl:value-of select="@name"/>
+    <xsl:text>");
+</xsl:text>
     <xsl:apply-templates mode="actions" select="*"/>
     <xsl:text>    }
 </xsl:text>
@@ -2331,74 +2422,80 @@
     <xsl:text>);
 </xsl:text>
   </xsl:template>
+  <xsl:template name="generated_button_class">
+    <xsl:param name="fsm"/>
+    <xsl:text>    frequency = 5;
+</xsl:text>
+    <xsl:text>    display = "inactive";
+</xsl:text>
+    <xsl:text>    state = "init";
+</xsl:text>
+    <xsl:text>    dispatch(value) {
+</xsl:text>
+    <xsl:apply-templates mode="dispatch_transition" select="$fsm"/>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>    onmouseup(evt) {
+</xsl:text>
+    <xsl:text>        svg_root.removeEventListener("pointerup", this.bound_onmouseup, true);
+</xsl:text>
+    <xsl:apply-templates mode="mouse_transition" select="$fsm">
+      <xsl:with-param name="position" select="'up'"/>
+    </xsl:apply-templates>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>    onmousedown(evt) {
+</xsl:text>
+    <xsl:text>        svg_root.addEventListener("pointerup", this.bound_onmouseup, true);
+</xsl:text>
+    <xsl:apply-templates mode="mouse_transition" select="$fsm">
+      <xsl:with-param name="position" select="'down'"/>
+    </xsl:apply-templates>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:apply-templates mode="actions" select="$fsm"/>
+    <xsl:text>    animate(){
+</xsl:text>
+    <xsl:text>        if (this.active_elt &amp;&amp; this.inactive_elt) {
+</xsl:text>
+    <xsl:for-each select="str:split('active inactive')">
+      <xsl:text>            if(this.display == "</xsl:text>
+      <xsl:value-of select="."/>
+      <xsl:text>")
+</xsl:text>
+      <xsl:text>                this.</xsl:text>
+      <xsl:value-of select="."/>
+      <xsl:text>_elt.style.display = "";
+</xsl:text>
+      <xsl:text>            else
+</xsl:text>
+      <xsl:text>                this.</xsl:text>
+      <xsl:value-of select="."/>
+      <xsl:text>_elt.style.display = "none";
+</xsl:text>
+    </xsl:for-each>
+    <xsl:text>        }
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>    init() {
+</xsl:text>
+    <xsl:text>        this.bound_onmouseup = this.onmouseup.bind(this);
+</xsl:text>
+    <xsl:text>        this.element.addEventListener("pointerdown", this.onmousedown.bind(this));
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+  </xsl:template>
   <xsl:template match="widget[@type='Button']" mode="widget_class">
     <xsl:text>class </xsl:text>
     <xsl:text>ButtonWidget</xsl:text>
     <xsl:text> extends Widget{
 </xsl:text>
     <xsl:variable name="fsm" select="exsl:node-set($_button_fsm)"/>
-    <xsl:text>    frequency = 5;
-</xsl:text>
-    <xsl:text>    display = "inactive";
-</xsl:text>
-    <xsl:text>    state = "init";
-</xsl:text>
-    <xsl:text>    dispatch(value) {
-</xsl:text>
-    <xsl:apply-templates mode="dispatch_transition" select="$fsm"/>
-    <xsl:text>    }
-</xsl:text>
-    <xsl:text>    onmouseup(evt) {
-</xsl:text>
-    <xsl:text>        svg_root.removeEventListener("pointerup", this.bound_onmouseup, true);
-</xsl:text>
-    <xsl:apply-templates mode="mouse_transition" select="$fsm">
-      <xsl:with-param name="position" select="'up'"/>
-    </xsl:apply-templates>
-    <xsl:text>    }
-</xsl:text>
-    <xsl:text>    onmousedown(evt) {
-</xsl:text>
-    <xsl:text>        svg_root.addEventListener("pointerup", this.bound_onmouseup, true);
-</xsl:text>
-    <xsl:apply-templates mode="mouse_transition" select="$fsm">
-      <xsl:with-param name="position" select="'down'"/>
-    </xsl:apply-templates>
-    <xsl:text>    }
-</xsl:text>
-    <xsl:apply-templates mode="actions" select="$fsm"/>
-    <xsl:text>    animate(){
-</xsl:text>
-    <xsl:text>        if (this.active_elt &amp;&amp; this.inactive_elt) {
-</xsl:text>
-    <xsl:for-each select="str:split('active inactive')">
-      <xsl:text>            if(this.display == "</xsl:text>
-      <xsl:value-of select="."/>
-      <xsl:text>")
-</xsl:text>
-      <xsl:text>                this.</xsl:text>
-      <xsl:value-of select="."/>
-      <xsl:text>_elt.style.display = "";
-</xsl:text>
-      <xsl:text>            else
-</xsl:text>
-      <xsl:text>                this.</xsl:text>
-      <xsl:value-of select="."/>
-      <xsl:text>_elt.style.display = "none";
-</xsl:text>
-    </xsl:for-each>
-    <xsl:text>        }
-</xsl:text>
-    <xsl:text>    }
-</xsl:text>
-    <xsl:text>    init() {
-</xsl:text>
-    <xsl:text>        this.bound_onmouseup = this.onmouseup.bind(this);
-</xsl:text>
-    <xsl:text>        this.element.addEventListener("pointerdown", this.onmousedown.bind(this));
-</xsl:text>
-    <xsl:text>    }
-</xsl:text>
+    <xsl:call-template name="generated_button_class">
+      <xsl:with-param name="fsm" select="$fsm"/>
+    </xsl:call-template>
     <xsl:text>}
 </xsl:text>
   </xsl:template>
@@ -2412,6 +2509,28 @@
       <xsl:with-param name="mandatory" select="'no'"/>
     </xsl:call-template>
   </xsl:template>
+  <xsl:template match="widget[@type='PushButton']" mode="widget_class">
+    <xsl:text>class </xsl:text>
+    <xsl:text>PushButtonWidget</xsl:text>
+    <xsl:text> extends Widget{
+</xsl:text>
+    <xsl:variable name="fsm" select="exsl:node-set($_push_button_fsm)"/>
+    <xsl:call-template name="generated_button_class">
+      <xsl:with-param name="fsm" select="$fsm"/>
+    </xsl:call-template>
+    <xsl:text>}
+</xsl:text>
+  </xsl:template>
+  <xsl:template match="widget[@type='PushButton']" mode="widget_defs">
+    <xsl:param name="hmi_element"/>
+    <xsl:call-template name="defs_by_labels">
+      <xsl:with-param name="hmi_element" select="$hmi_element"/>
+      <xsl:with-param name="labels">
+        <xsl:text>active inactive</xsl:text>
+      </xsl:with-param>
+      <xsl:with-param name="mandatory" select="'no'"/>
+    </xsl:call-template>
+  </xsl:template>
   <xsl:template match="widget[@type='CircularBar']" mode="widget_desc">
     <type>
       <xsl:value-of select="@type"/>
@@ -8682,6 +8801,8 @@
 </xsl:text>
           <xsl:text>function send_hmi_value(index, value) {
 </xsl:text>
+          <xsl:text>    console.log("send_hmi_value("+index+", "+value+")")
+</xsl:text>
           <xsl:text>    if(index &gt; last_remote_index){
 </xsl:text>
           <xsl:text>        updates.set(index, value);
@@ -8730,9 +8851,11 @@
 </xsl:text>
           <xsl:text>function apply_hmi_value(index, new_val) {
 </xsl:text>
-          <xsl:text>    let old_val = cache[index];
-</xsl:text>
-          <xsl:text>    if(new_val != undefined &amp;&amp; old_val != new_val)
+          <xsl:text>    console.log("apply_hmi_value("+index+", "+new_val+")")
+</xsl:text>
+          <xsl:text>    /*let old_val = cache[index];*/
+</xsl:text>
+          <xsl:text>    if(new_val != undefined /*&amp;&amp; old_val != new_val*/)
 </xsl:text>
           <xsl:text>        send_hmi_value(index, new_val);
 </xsl:text>
--- a/svghmi/parse_labels.ysl2	Sun Jan 16 17:00:58 2022 +0100
+++ b/svghmi/parse_labels.ysl2	Wed Feb 02 20:27:17 2022 +0100
@@ -2,7 +2,7 @@
 
 
 //  Parses:
-//  "HMI:WidgetType:param1:param2@path1,path1min,path1max@path2"
+//  "HMI:WidgetType|freq:param1:param2@path1,path1min,path1max@path2"
 //
 //  Into:
 //  widget type="WidgetType" id="blah456" {
@@ -28,15 +28,23 @@
         otherwise value "$description";
     }
 
-    const "_type", "substring-before($args,':')";
-    const "type" choose {
-        when "$_type" value "$_type";
+    const "_typefreq", "substring-before($args,':')";
+    const "typefreq" choose {
+        when "$_typefreq" value "$_typefreq";
         otherwise value "$args";
     }
 
+    const "freq", "substring-after($typefreq,'|')";
+
+    const "_type", "substring-before($typefreq,'|')";
+    const "type" choose {
+        when "$_type" value "$_type";
+        otherwise value "$typefreq";
+    }
     if "$type" widget {
         attrib "id" > «$id»
         attrib "type" > «$type»
+        if "$freq" attrib "freq" > «$freq»
         foreach "str:split(substring-after($args, ':'), ':')" {
             arg {
                 attrib "value" > «.»
--- a/svghmi/svghmi.js	Sun Jan 16 17:00:58 2022 +0100
+++ b/svghmi/svghmi.js	Wed Feb 02 20:27:17 2022 +0100
@@ -332,8 +332,10 @@
 };
 
 function apply_hmi_value(index, new_val) {
-    let old_val = cache[index];
-    if(new_val != undefined && old_val != new_val)
+    // Similarly to previous comment, taking decision to update based 
+    // on cache content is bad and can lead to inconsistency
+    /*let old_val = cache[index];*/
+    if(new_val != undefined /*&& old_val != new_val*/)
         send_hmi_value(index, new_val);
     return new_val;
 }
--- a/svghmi/widget_button.ysl2	Sun Jan 16 17:00:58 2022 +0100
+++ b/svghmi/widget_button.ysl2	Wed Feb 02 20:27:17 2022 +0100
@@ -28,6 +28,41 @@
 
 gen_index_xhtml {
 
+const "_push_button_fsm" fsm {
+    state "init" {
+        on_dispatch "false" jump "reflect_off";
+        on_dispatch "true" jump "reflect_on";
+    }
+
+    state "reflect_on" {
+        show "active";
+        on_mouse "down" jump "on";
+        on_mouse "up" jump "off";
+        on_dispatch "false" jump "reflect_off";
+    }
+
+    state "on" {
+        hmi_value "true";
+        show "active";
+        on_mouse "up" jump "off";
+        on_dispatch "false" jump "reflect_off";
+    }
+
+    state "reflect_off" {
+        show "inactive";
+        on_mouse "down" jump "on";
+        on_mouse "up" jump "off";
+        on_dispatch "true" jump "reflect_on";
+    }
+
+    state "off" {
+        hmi_value "false";
+        show "inactive";
+        on_mouse "down" jump "on";
+        on_dispatch "true" jump "reflect_on";
+    }
+}
+
 // State machine to drive HMI_BOOL on a potentially laggy connection
 const "_button_fsm" fsm {
     state "init" {
@@ -111,7 +146,7 @@
 }
 template "state", mode="actions" {
     |     «@name»_action(){
-    //| console.log("Entering state «@name»");
+    | console.log("Entering state «@name»");
     apply "*", mode="actions";
     |     }
 }
@@ -125,26 +160,24 @@
 
 }
 
-widget_class("Button"){
-    const "fsm","exsl:node-set($_button_fsm)";
+
+function "generated_button_class" {
+    param "fsm";
     |     frequency = 5;
 
     |     display = "inactive";
     |     state = "init";
 
     |     dispatch(value) {
-    // |         console.log("dispatch"+value);
     apply "$fsm", mode="dispatch_transition";
     |     }
 
     |     onmouseup(evt) {
     |         svg_root.removeEventListener("pointerup", this.bound_onmouseup, true);
-    // |         console.log("onmouseup");
     apply "$fsm", mode="mouse_transition" with "position", "'up'";
     |     }
     |     onmousedown(evt) {
     |         svg_root.addEventListener("pointerup", this.bound_onmouseup, true);
-    // |         console.log("onmousedown");
     apply "$fsm", mode="mouse_transition" with "position", "'down'";
     |     }
 
@@ -167,6 +200,22 @@
     |     }
 }
 
+
+widget_class("Button"){
+    const "fsm","exsl:node-set($_button_fsm)";
+    call "generated_button_class" with "fsm", "$fsm";
+}
+
 widget_defs("Button") {
     optional_labels("active inactive");
 }
+
+widget_class("PushButton"){
+    const "fsm","exsl:node-set($_push_button_fsm)";
+    call "generated_button_class" with "fsm", "$fsm";
+}
+
+widget_defs("PushButton") {
+    optional_labels("active inactive");
+}
+
--- a/svghmi/widgets_common.ysl2	Sun Jan 16 17:00:58 2022 +0100
+++ b/svghmi/widgets_common.ysl2	Wed Feb 02 20:27:17 2022 +0100
@@ -83,7 +83,14 @@
         if "position()!=last()" > ,
     }
 
-    |   "«@id»": new «$widget/@type»Widget ("«@id»",[«$args»],[«$indexes»],[«$minmaxes»],{
+    const "freq" choose {
+        when "$widget/@freq"
+            > «$widget/@freq»
+        otherwise
+            > undefined
+    }
+
+    |   "«@id»": new «$widget/@type»Widget ("«@id»",«$freq»,[«$args»],[«$indexes»],[«$minmaxes»],{
     apply "$widget", mode="widget_defs" with "hmi_element",".";
     |   })`if "position()!=last()" > ,`
 }
@@ -164,9 +171,10 @@
         unsubscribable = false;
         pending_animate = false;
 
-        constructor(elt_id,args,indexes,minmaxes,members){
+        constructor(elt_id, freq, args, indexes, minmaxes, members){
             this.element_id = elt_id;
             this.element = id(elt_id);
+            if(freq !== undefined) this.frequency = freq;
             this.args = args;
             this.indexes = indexes;
             this.minmaxes = minmaxes;
--- a/tests/BACnet/bacnet_0@bacnet/bacnet_slave	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,202 +0,0 @@
-(dp0
-S'BV_Obj'
-p1
-(lp2
-sS'AV_Obj'
-p3
-(lp4
-(dp5
-S'loc'
-p6
-S'MD0_2'
-p7
-sS'Description'
-p8
-S''
-p9
-sS'Unit ID'
-p10
-I19
-sS'Object Identifier'
-p11
-I0
-sS'Ctype'
-p12
-S'float'
-p13
-sS'BACnetObjTypeID'
-p14
-I2
-sS'Settable'
-p15
-S'Y'
-p16
-sS'Engineering Units'
-p17
-V(Energy) kilowatt-hours (19)
-p18
-sS'Object Name'
-p19
-VEnergyCounter
-p20
-sasS'AO_Obj'
-p21
-(lp22
-(dp23
-g6
-S'QD0_1'
-p24
-sg8
-V
-p25
-sS'Unit ID'
-p26
-I62
-sS'Object Identifier'
-p27
-V0
-p28
-sg12
-g13
-sg14
-I1
-sg15
-g16
-sS'Object Name'
-p29
-VTemperatureSetPoint
-p30
-sS'Engineering Units'
-p31
-V(Temperature) degrees-celsius (62)
-p32
-sasS'MSI_Obj'
-p33
-(lp34
-sS'BO_Obj'
-p35
-(lp36
-(dp37
-g6
-S'QX0_4'
-p38
-sg8
-g9
-sS'Object Identifier'
-p39
-I2
-sg12
-S'uint8_t'
-p40
-sg14
-I4
-sg15
-g16
-sS'Object Name'
-p41
-VBlockClimateControl
-p42
-sasS'MSO_Obj'
-p43
-(lp44
-sS'EDEfile_parm'
-p45
-(dp46
-S'next_EDE_file_version'
-p47
-I1
-ssS'BI_Obj'
-p48
-(lp49
-(dp50
-g6
-S'IX0_3'
-p51
-sg8
-g9
-sS'Object Identifier'
-p52
-I0
-sg12
-g40
-sg14
-I3
-sg15
-S'N'
-p53
-sS'Object Name'
-p54
-VHeater
-p55
-sa(dp56
-g6
-g51
-sg8
-g9
-sg52
-I1
-sg12
-g40
-sg14
-I3
-sg15
-g53
-sg54
-VCooler
-p57
-sasS'AI_Obj'
-p58
-(lp59
-(dp60
-g6
-S'ID0_0'
-p61
-sg8
-VCurrent termperature in Beremiz lab
-p62
-sS'Unit ID'
-p63
-I62
-sS'Object Identifier'
-p64
-I0
-sg12
-g13
-sg14
-I0
-sg15
-g53
-sS'Engineering Units'
-p65
-V(Temperature) degrees-celsius (62)
-p66
-sS'Object Name'
-p67
-VTemperature
-p68
-sa(dp69
-g6
-g61
-sg8
-VCurrent humidity in Beremiz lab
-p70
-sg63
-I29
-sg64
-I1
-sg12
-g13
-sg14
-I0
-sg15
-g53
-sg67
-VHumidity
-p71
-sg65
-V(Humidity) percent-relative-humidity (29)
-p72
-sasS'MSV_Obj'
-p73
-(lp74
-s.
\ No newline at end of file
--- a/tests/BACnet/bacnet_0@bacnet/baseconfnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="bacnet_0"/>
--- a/tests/BACnet/bacnet_0@bacnet/confnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BACnetServerNode xmlns:xsd="http://www.w3.org/2001/XMLSchema" UDP_Port_Number="47808" BACnet_Device_ID="3" BACnet_Communication_Control_Password=" " BACnet_Device_Location="Beremiz lab" Network_Interface="virbr0"/>
--- a/tests/BACnet/beremiz.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="LOCAL://">
-  <TargetType/>
-</BeremizRoot>
--- a/tests/BACnet/plc.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,601 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201">
-  <fileHeader companyName="Unknown" productName="Unnamed" productVersion="1" creationDateTime="2018-07-28T02:24:08"/>
-  <contentHeader name="BACnet" modificationDateTime="2018-09-26T14:00:21">
-    <coordinateInfo>
-      <fbd>
-        <scaling x="0" y="0"/>
-      </fbd>
-      <ld>
-        <scaling x="0" y="0"/>
-      </ld>
-      <sfc>
-        <scaling x="0" y="0"/>
-      </sfc>
-    </coordinateInfo>
-  </contentHeader>
-  <types>
-    <dataTypes/>
-    <pous>
-      <pou name="program0" pouType="program">
-        <interface>
-          <localVars>
-            <variable name="EnergyCounter" address="%MD0.2.0">
-              <type>
-                <REAL/>
-              </type>
-            </variable>
-            <variable name="Temperature" address="%ID0.0.0">
-              <type>
-                <REAL/>
-              </type>
-            </variable>
-            <variable name="Humidity" address="%ID0.0.1">
-              <type>
-                <REAL/>
-              </type>
-            </variable>
-          </localVars>
-          <localVars>
-            <variable name="TempSimulation">
-              <type>
-                <derived name="Simulator"/>
-              </type>
-            </variable>
-            <variable name="HumiditySimulation">
-              <type>
-                <derived name="Simulator"/>
-              </type>
-            </variable>
-          </localVars>
-          <localVars>
-            <variable name="TemperatureSetPoint" address="%QD0.1.0">
-              <type>
-                <REAL/>
-              </type>
-            </variable>
-            <variable name="ControlDisable" address="%QX0.4.2">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="Heater" address="%IX0.3.0">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="Cooler" address="%IX0.3.1">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-          </localVars>
-        </interface>
-        <body>
-          <FBD>
-            <inVariable localId="1" executionOrderId="0" height="30" width="114" negated="false">
-              <position x="299" y="521"/>
-              <connectionPointOut>
-                <relPosition x="114" y="15"/>
-              </connectionPointOut>
-              <expression>EnergyCounter</expression>
-            </inVariable>
-            <outVariable localId="2" executionOrderId="0" height="30" width="114" negated="false">
-              <position x="654" y="521"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="3" formalParameter="OUT">
-                  <position x="654" y="536"/>
-                  <position x="533" y="536"/>
-                </connection>
-              </connectionPointIn>
-              <expression>EnergyCounter</expression>
-            </outVariable>
-            <block localId="3" typeName="ADD" executionOrderId="0" height="60" width="67">
-              <position x="466" y="506"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="1">
-                      <position x="466" y="536"/>
-                      <position x="404" y="536"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="4">
-                      <position x="466" y="556"/>
-                      <position x="436" y="556"/>
-                      <position x="436" y="585"/>
-                      <position x="401" y="585"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="67" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="4" executionOrderId="0" height="30" width="105" negated="false">
-              <position x="296" y="570"/>
-              <connectionPointOut>
-                <relPosition x="105" y="15"/>
-              </connectionPointOut>
-              <expression>0.00131</expression>
-            </inVariable>
-            <comment localId="5" height="67" width="229">
-              <position x="27" y="525"/>
-              <content>
-                <xhtml:p><![CDATA[Always consume some energy]]></xhtml:p>
-              </content>
-            </comment>
-            <block localId="6" typeName="Simulator" instanceName="TempSimulation" executionOrderId="0" height="128" width="143">
-              <position x="188" y="648"/>
-              <inputVariables>
-                <variable formalParameter="MinVal">
-                  <connectionPointIn>
-                    <relPosition x="0" y="38"/>
-                    <connection refLocalId="8">
-                      <position x="188" y="686"/>
-                      <position x="138" y="686"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="MaxVal">
-                  <connectionPointIn>
-                    <relPosition x="0" y="74"/>
-                    <connection refLocalId="9">
-                      <position x="188" y="722"/>
-                      <position x="138" y="722"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="PeriodSeconds">
-                  <connectionPointIn>
-                    <relPosition x="0" y="110"/>
-                    <connection refLocalId="10">
-                      <position x="188" y="758"/>
-                      <position x="138" y="758"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="Out">
-                  <connectionPointOut>
-                    <relPosition x="143" y="38"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <outVariable localId="7" executionOrderId="0" height="30" width="98" negated="false">
-              <position x="421" y="671"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="6" formalParameter="Out">
-                  <position x="421" y="686"/>
-                  <position x="331" y="686"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Temperature</expression>
-            </outVariable>
-            <inVariable localId="8" executionOrderId="0" height="30" width="105" negated="false">
-              <position x="33" y="671"/>
-              <connectionPointOut>
-                <relPosition x="105" y="15"/>
-              </connectionPointOut>
-              <expression>18.0</expression>
-            </inVariable>
-            <inVariable localId="9" executionOrderId="0" height="30" width="105" negated="false">
-              <position x="33" y="707"/>
-              <connectionPointOut>
-                <relPosition x="105" y="15"/>
-              </connectionPointOut>
-              <expression>30.0</expression>
-            </inVariable>
-            <inVariable localId="10" executionOrderId="0" height="30" width="105" negated="false">
-              <position x="33" y="743"/>
-              <connectionPointOut>
-                <relPosition x="105" y="15"/>
-              </connectionPointOut>
-              <expression>120</expression>
-            </inVariable>
-            <block localId="11" typeName="Simulator" instanceName="HumiditySimulation" executionOrderId="0" height="137" width="143">
-              <position x="185" y="803"/>
-              <inputVariables>
-                <variable formalParameter="MinVal">
-                  <connectionPointIn>
-                    <relPosition x="0" y="39"/>
-                    <connection refLocalId="13">
-                      <position x="185" y="842"/>
-                      <position x="135" y="842"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="MaxVal">
-                  <connectionPointIn>
-                    <relPosition x="0" y="78"/>
-                    <connection refLocalId="14">
-                      <position x="185" y="881"/>
-                      <position x="135" y="881"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="PeriodSeconds">
-                  <connectionPointIn>
-                    <relPosition x="0" y="117"/>
-                    <connection refLocalId="15">
-                      <position x="185" y="920"/>
-                      <position x="135" y="920"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="Out">
-                  <connectionPointOut>
-                    <relPosition x="143" y="39"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <outVariable localId="12" executionOrderId="0" height="30" width="111" negated="false">
-              <position x="418" y="827"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="11" formalParameter="Out">
-                  <position x="418" y="842"/>
-                  <position x="328" y="842"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Humidity</expression>
-            </outVariable>
-            <inVariable localId="13" executionOrderId="0" height="30" width="105" negated="false">
-              <position x="30" y="827"/>
-              <connectionPointOut>
-                <relPosition x="105" y="15"/>
-              </connectionPointOut>
-              <expression>55.0</expression>
-            </inVariable>
-            <inVariable localId="14" executionOrderId="0" height="30" width="105" negated="false">
-              <position x="30" y="866"/>
-              <connectionPointOut>
-                <relPosition x="105" y="15"/>
-              </connectionPointOut>
-              <expression>78.0</expression>
-            </inVariable>
-            <inVariable localId="15" executionOrderId="0" height="30" width="105" negated="false">
-              <position x="30" y="905"/>
-              <connectionPointOut>
-                <relPosition x="105" y="15"/>
-              </connectionPointOut>
-              <expression>58</expression>
-            </inVariable>
-            <block localId="16" typeName="GT" executionOrderId="0" height="60" width="67">
-              <position x="231" y="1103"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="18">
-                      <position x="231" y="1133"/>
-                      <position x="132" y="1133"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="22">
-                      <position x="231" y="1153"/>
-                      <position x="208" y="1153"/>
-                      <position x="208" y="1169"/>
-                      <position x="185" y="1169"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="67" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="18" executionOrderId="0" height="30" width="98" negated="false">
-              <position x="40" y="1118"/>
-              <connectionPointOut>
-                <relPosition x="98" y="15"/>
-              </connectionPointOut>
-              <expression>Temperature</expression>
-            </inVariable>
-            <block localId="19" typeName="AND" executionOrderId="0" height="60" width="67">
-              <position x="347" y="1059"/>
-              <inputVariables>
-                <variable formalParameter="IN1" negated="true">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="20">
-                      <position x="347" y="1089"/>
-                      <position x="263" y="1089"/>
-                      <position x="263" y="1074"/>
-                      <position x="145" y="1074"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="16" formalParameter="OUT">
-                      <position x="347" y="1109"/>
-                      <position x="337" y="1109"/>
-                      <position x="337" y="1133"/>
-                      <position x="298" y="1133"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="67" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="20" executionOrderId="0" height="30" width="122" negated="false">
-              <position x="41" y="1059"/>
-              <connectionPointOut>
-                <relPosition x="122" y="15"/>
-              </connectionPointOut>
-              <expression>ControlDisable</expression>
-            </inVariable>
-            <outVariable localId="21" executionOrderId="0" height="30" width="92" negated="false">
-              <position x="468" y="1074"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="19" formalParameter="OUT">
-                  <position x="468" y="1089"/>
-                  <position x="414" y="1089"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Cooler</expression>
-            </outVariable>
-            <inVariable localId="22" executionOrderId="0" height="30" width="162" negated="false">
-              <position x="39" y="1154"/>
-              <connectionPointOut>
-                <relPosition x="162" y="15"/>
-              </connectionPointOut>
-              <expression>TemperatureSetPoint</expression>
-            </inVariable>
-            <block localId="17" typeName="LT" executionOrderId="0" height="60" width="67">
-              <position x="228" y="1278"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="23">
-                      <position x="228" y="1308"/>
-                      <position x="129" y="1308"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="27">
-                      <position x="228" y="1328"/>
-                      <position x="205" y="1328"/>
-                      <position x="205" y="1344"/>
-                      <position x="182" y="1344"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="67" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="23" executionOrderId="0" height="30" width="98" negated="false">
-              <position x="37" y="1293"/>
-              <connectionPointOut>
-                <relPosition x="98" y="15"/>
-              </connectionPointOut>
-              <expression>Temperature</expression>
-            </inVariable>
-            <block localId="24" typeName="AND" executionOrderId="0" height="60" width="67">
-              <position x="344" y="1234"/>
-              <inputVariables>
-                <variable formalParameter="IN1" negated="true">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="25">
-                      <position x="344" y="1264"/>
-                      <position x="260" y="1264"/>
-                      <position x="260" y="1249"/>
-                      <position x="142" y="1249"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="17" formalParameter="OUT">
-                      <position x="344" y="1284"/>
-                      <position x="334" y="1284"/>
-                      <position x="334" y="1308"/>
-                      <position x="295" y="1308"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="67" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="25" executionOrderId="0" height="30" width="122" negated="false">
-              <position x="38" y="1234"/>
-              <connectionPointOut>
-                <relPosition x="122" y="15"/>
-              </connectionPointOut>
-              <expression>ControlDisable</expression>
-            </inVariable>
-            <outVariable localId="26" executionOrderId="0" height="30" width="92" negated="false">
-              <position x="465" y="1249"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="24" formalParameter="OUT">
-                  <position x="465" y="1264"/>
-                  <position x="411" y="1264"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Heater</expression>
-            </outVariable>
-            <inVariable localId="27" executionOrderId="0" height="30" width="162" negated="false">
-              <position x="36" y="1329"/>
-              <connectionPointOut>
-                <relPosition x="162" y="15"/>
-              </connectionPointOut>
-              <expression>TemperatureSetPoint</expression>
-            </inVariable>
-            <comment localId="28" height="67" width="229">
-              <position x="343" y="734"/>
-              <content>
-                <xhtml:p><![CDATA[Simple sensor simulation]]></xhtml:p>
-              </content>
-            </comment>
-            <comment localId="29" height="67" width="229">
-              <position x="37" y="978"/>
-              <content>
-                <xhtml:p><![CDATA[Climate control]]></xhtml:p>
-              </content>
-            </comment>
-            <comment localId="30" height="464" width="773">
-              <position x="14" y="16"/>
-              <content>
-                <xhtml:p><![CDATA[This examples shows how to work with BACnet extension.
-
-Extensions requires native BACnet stack to be installed nearby Beremiz.
-Following directory structure is expected:
-<Parent directory>
-  "beremiz"
-  "BACnet"
-
-If library is installed elsewhere, then place corresponding paths
-in CFLAGS/LDFLAGS in project settings.
-
-For GNU/Linux to install BACnet library in parent directory run following commands:
-$ svn checkout https://svn.code.sf.net/p/bacnet/code/trunk/bacnet-stack/ BACnet
-$ cd BACnet
-$ make
-
-After that BACnet extension is ready to be used in Beremiz projects.
-BACnet stack implementation contains a lot of test tools. They could be useful during 
-debugging and BACnet investigation. See "BACnet/bin/readme.txt" for more information about them.]]></xhtml:p>
-              </content>
-            </comment>
-          </FBD>
-        </body>
-      </pou>
-      <pou name="Simulator" pouType="functionBlock">
-        <interface>
-          <outputVars>
-            <variable name="Out">
-              <type>
-                <REAL/>
-              </type>
-            </variable>
-          </outputVars>
-          <inputVars>
-            <variable name="MinVal">
-              <type>
-                <REAL/>
-              </type>
-            </variable>
-            <variable name="MaxVal">
-              <type>
-                <REAL/>
-              </type>
-            </variable>
-            <variable name="PeriodSeconds">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </inputVars>
-          <localVars>
-            <variable name="TON0">
-              <type>
-                <derived name="TON"/>
-              </type>
-            </variable>
-            <variable name="seconds">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="BaseVal">
-              <type>
-                <REAL/>
-              </type>
-            </variable>
-            <variable name="VarVal">
-              <type>
-                <REAL/>
-              </type>
-            </variable>
-          </localVars>
-        </interface>
-        <body>
-          <ST>
-            <xhtml:p><![CDATA[(* pseudo-random variations *)
-TON0(IN := TRUE, PT := T#3120s);
-IF TON0.Q THEN
-  TON0(IN := FALSE);
-END_IF;
-seconds := TIME_TO_INT(TON0.ET);
-
-BaseVal := (MaxVal + MinVal)/2.0;
-VarVal  := (MaxVal-MinVal)*INT_TO_REAL((seconds MOD PeriodSeconds) - (PeriodSeconds/2))/INT_TO_REAL(PeriodSeconds);
-
-Out :=  BaseVal + VarVal;]]></xhtml:p>
-          </ST>
-        </body>
-      </pou>
-    </pous>
-  </types>
-  <instances>
-    <configurations>
-      <configuration name="config">
-        <resource name="resource1">
-          <task name="task0" priority="0" interval="T#20ms">
-            <pouInstance name="instance0" typeName="program0"/>
-          </task>
-        </resource>
-      </configuration>
-    </configurations>
-  </instances>
-</project>
--- a/tests/canopen_master/beremiz.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<BeremizRoot URI_location="LOCAL://">
-  <TargetType/>
-</BeremizRoot>
--- a/tests/canopen_master/canopen@canfestival/baseconfnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<BaseParams Name="canopen" IEC_Channel="0"/>
--- a/tests/canopen_master/canopen@canfestival/confnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<CanFestivalInstance/>
--- a/tests/canopen_master/canopen@canfestival/master@CanOpenNode/baseconfnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<BaseParams Name="master" IEC_Channel="0"/>
--- a/tests/canopen_master/canopen@canfestival/master@CanOpenNode/confnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<CanFestivalNode/>
--- a/tests/canopen_master/canopen@canfestival/master@CanOpenNode/eds/Slave_0_0.eds	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1161 +0,0 @@
-[FileInfo]
-FileName=Slave_0_0.eds
-FileVersion=1
-FileRevision=1
-EDSVersion=4.0
-Description=
-CreationTime=06:35PM
-CreationDate=10-07-2009
-CreatedBy=CANFestival
-ModificationTime=06:35PM
-ModificationDate=10-07-2009
-ModifiedBy=CANFestival
-
-[DeviceInfo]
-VendorName=CANFestival
-VendorNumber=0x00000000
-ProductName=OD_0_0
-ProductNumber=0x00000000
-RevisionNumber=0x00000000
-BaudRate_10=1
-BaudRate_20=1
-BaudRate_50=1
-BaudRate_125=1
-BaudRate_250=1
-BaudRate_500=1
-BaudRate_800=1
-BaudRate_1000=1
-SimpleBootUpMaster=0
-SimpleBootUpSlave=1
-Granularity=8
-DynamicChannelsSupported=0
-CompactPDO=0
-GroupMessaging=0
-NrOfRXPDO=4
-NrOfTXPDO=4
-LSS_Supported=0
-
-[DummyUsage]
-Dummy0001=0
-Dummy0002=1
-Dummy0003=1
-Dummy0004=1
-Dummy0005=1
-Dummy0006=1
-Dummy0007=1
-
-[Comments]
-Lines=0
-
-[MandatoryObjects]
-SupportedObjects=3
-1=0x1000
-2=0x1001
-3=0x1018
-
-[1000]
-ParameterName=Device Type
-ObjectType=0x7
-DataType=0x0007
-AccessType=ro
-DefaultValue=0
-PDOMapping=0
-
-[1001]
-ParameterName=Error Register
-ObjectType=0x7
-DataType=0x0005
-AccessType=ro
-DefaultValue=0
-PDOMapping=1
-
-[1018]
-ParameterName=Identity
-ObjectType=0x8
-SubNumber=5
-
-[1018sub0]
-ParameterName=Number of Entries
-ObjectType=0x7
-DataType=0x0005
-AccessType=ro
-DefaultValue=4
-PDOMapping=0
-
-[1018sub1]
-ParameterName=Vendor ID
-ObjectType=0x7
-DataType=0x0007
-AccessType=ro
-DefaultValue=0
-PDOMapping=0
-
-[1018sub2]
-ParameterName=Product Code
-ObjectType=0x7
-DataType=0x0007
-AccessType=ro
-DefaultValue=0
-PDOMapping=0
-
-[1018sub3]
-ParameterName=Revision Number
-ObjectType=0x7
-DataType=0x0007
-AccessType=ro
-DefaultValue=0
-PDOMapping=0
-
-[1018sub4]
-ParameterName=Serial Number
-ObjectType=0x7
-DataType=0x0007
-AccessType=ro
-DefaultValue=0
-PDOMapping=0
-
-[OptionalObjects]
-SupportedObjects=17
-1=0x1200
-2=0x1400
-3=0x1401
-4=0x1402
-5=0x1403
-6=0x1600
-7=0x1601
-8=0x1602
-9=0x1603
-10=0x1800
-11=0x1801
-12=0x1802
-13=0x1803
-14=0x1A00
-15=0x1A01
-16=0x1A02
-17=0x1A03
-
-[1200]
-ParameterName=Server SDO Parameter
-ObjectType=0x8
-SubNumber=3
-
-[1200sub0]
-ParameterName=Number of Entries
-ObjectType=0x7
-DataType=0x0005
-AccessType=ro
-DefaultValue=2
-PDOMapping=0
-
-[1200sub1]
-ParameterName=COB ID Client to Server (Receive SDO)
-ObjectType=0x7
-DataType=0x0007
-AccessType=ro
-DefaultValue=$NODEID+0x600
-PDOMapping=0
-
-[1200sub2]
-ParameterName=COB ID Server to Client (Transmit SDO)
-ObjectType=0x7
-DataType=0x0007
-AccessType=ro
-DefaultValue=$NODEID+0x580
-PDOMapping=0
-
-[1400]
-ParameterName=Receive PDO 1 Parameter
-ObjectType=0x8
-SubNumber=5
-
-[1400sub0]
-ParameterName=Highest SubIndex Supported
-ObjectType=0x7
-DataType=0x0005
-AccessType=ro
-DefaultValue=5
-PDOMapping=0
-
-[1400sub1]
-ParameterName=COB ID used by PDO
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=$NODEID+0x200
-PDOMapping=0
-
-[1400sub2]
-ParameterName=Transmission Type
-ObjectType=0x7
-DataType=0x0005
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1400sub3]
-ParameterName=Inhibit Time
-ObjectType=0x7
-DataType=0x0006
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1400sub5]
-ParameterName=Event Timer
-ObjectType=0x7
-DataType=0x0006
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1401]
-ParameterName=Receive PDO 2 Parameter
-ObjectType=0x8
-SubNumber=5
-
-[1401sub0]
-ParameterName=Highest SubIndex Supported
-ObjectType=0x7
-DataType=0x0005
-AccessType=ro
-DefaultValue=5
-PDOMapping=0
-
-[1401sub1]
-ParameterName=COB ID used by PDO
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=$NODEID+0x300
-PDOMapping=0
-
-[1401sub2]
-ParameterName=Transmission Type
-ObjectType=0x7
-DataType=0x0005
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1401sub3]
-ParameterName=Inhibit Time
-ObjectType=0x7
-DataType=0x0006
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1401sub5]
-ParameterName=Event Timer
-ObjectType=0x7
-DataType=0x0006
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1402]
-ParameterName=Receive PDO 3 Parameter
-ObjectType=0x8
-SubNumber=5
-
-[1402sub0]
-ParameterName=Highest SubIndex Supported
-ObjectType=0x7
-DataType=0x0005
-AccessType=ro
-DefaultValue=5
-PDOMapping=0
-
-[1402sub1]
-ParameterName=COB ID used by PDO
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=$NODEID+0x400
-PDOMapping=0
-
-[1402sub2]
-ParameterName=Transmission Type
-ObjectType=0x7
-DataType=0x0005
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1402sub3]
-ParameterName=Inhibit Time
-ObjectType=0x7
-DataType=0x0006
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1402sub5]
-ParameterName=Event Timer
-ObjectType=0x7
-DataType=0x0006
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1403]
-ParameterName=Receive PDO 4 Parameter
-ObjectType=0x8
-SubNumber=5
-
-[1403sub0]
-ParameterName=Highest SubIndex Supported
-ObjectType=0x7
-DataType=0x0005
-AccessType=ro
-DefaultValue=5
-PDOMapping=0
-
-[1403sub1]
-ParameterName=COB ID used by PDO
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=$NODEID+0x500
-PDOMapping=0
-
-[1403sub2]
-ParameterName=Transmission Type
-ObjectType=0x7
-DataType=0x0005
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1403sub3]
-ParameterName=Inhibit Time
-ObjectType=0x7
-DataType=0x0006
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1403sub5]
-ParameterName=Event Timer
-ObjectType=0x7
-DataType=0x0006
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1600]
-ParameterName=Receive PDO 1 Mapping
-ObjectType=0x9
-SubNumber=9
-
-[1600sub0]
-ParameterName=Number of Entries
-ObjectType=0x7
-DataType=0x0005
-AccessType=rw
-DefaultValue=8
-PDOMapping=0
-
-[1600sub1]
-ParameterName=PDO 1 Mapping for an application object 1
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1600sub2]
-ParameterName=PDO 1 Mapping for an application object 2
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1600sub3]
-ParameterName=PDO 1 Mapping for an application object 3
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1600sub4]
-ParameterName=PDO 1 Mapping for an application object 4
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1600sub5]
-ParameterName=PDO 1 Mapping for an application object 5
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1600sub6]
-ParameterName=PDO 1 Mapping for an application object 6
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1600sub7]
-ParameterName=PDO 1 Mapping for an application object 7
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1600sub8]
-ParameterName=PDO 1 Mapping for an application object 8
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1601]
-ParameterName=Receive PDO 2 Mapping
-ObjectType=0x9
-SubNumber=9
-
-[1601sub0]
-ParameterName=Number of Entries
-ObjectType=0x7
-DataType=0x0005
-AccessType=rw
-DefaultValue=8
-PDOMapping=0
-
-[1601sub1]
-ParameterName=PDO 2 Mapping for an application object 1
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1601sub2]
-ParameterName=PDO 2 Mapping for an application object 2
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1601sub3]
-ParameterName=PDO 2 Mapping for an application object 3
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1601sub4]
-ParameterName=PDO 2 Mapping for an application object 4
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1601sub5]
-ParameterName=PDO 2 Mapping for an application object 5
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1601sub6]
-ParameterName=PDO 2 Mapping for an application object 6
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1601sub7]
-ParameterName=PDO 2 Mapping for an application object 7
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1601sub8]
-ParameterName=PDO 2 Mapping for an application object 8
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1602]
-ParameterName=Receive PDO 3 Mapping
-ObjectType=0x9
-SubNumber=9
-
-[1602sub0]
-ParameterName=Number of Entries
-ObjectType=0x7
-DataType=0x0005
-AccessType=rw
-DefaultValue=8
-PDOMapping=0
-
-[1602sub1]
-ParameterName=PDO 3 Mapping for an application object 1
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1602sub2]
-ParameterName=PDO 3 Mapping for an application object 2
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1602sub3]
-ParameterName=PDO 3 Mapping for an application object 3
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1602sub4]
-ParameterName=PDO 3 Mapping for an application object 4
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1602sub5]
-ParameterName=PDO 3 Mapping for an application object 5
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1602sub6]
-ParameterName=PDO 3 Mapping for an application object 6
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1602sub7]
-ParameterName=PDO 3 Mapping for an application object 7
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1602sub8]
-ParameterName=PDO 3 Mapping for an application object 8
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1603]
-ParameterName=Receive PDO 4 Mapping
-ObjectType=0x9
-SubNumber=9
-
-[1603sub0]
-ParameterName=Number of Entries
-ObjectType=0x7
-DataType=0x0005
-AccessType=rw
-DefaultValue=8
-PDOMapping=0
-
-[1603sub1]
-ParameterName=PDO 4 Mapping for an application object 1
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1603sub2]
-ParameterName=PDO 4 Mapping for an application object 2
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1603sub3]
-ParameterName=PDO 4 Mapping for an application object 3
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1603sub4]
-ParameterName=PDO 4 Mapping for an application object 4
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1603sub5]
-ParameterName=PDO 4 Mapping for an application object 5
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1603sub6]
-ParameterName=PDO 4 Mapping for an application object 6
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1603sub7]
-ParameterName=PDO 4 Mapping for an application object 7
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1603sub8]
-ParameterName=PDO 4 Mapping for an application object 8
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1800]
-ParameterName=Transmit PDO 1 Parameter
-ObjectType=0x8
-SubNumber=5
-
-[1800sub0]
-ParameterName=Highest SubIndex Supported
-ObjectType=0x7
-DataType=0x0005
-AccessType=ro
-DefaultValue=5
-PDOMapping=0
-
-[1800sub1]
-ParameterName=COB ID used by PDO
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=$NODEID+0x180
-PDOMapping=0
-
-[1800sub2]
-ParameterName=Transmission Type
-ObjectType=0x7
-DataType=0x0005
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1800sub3]
-ParameterName=Inhibit Time
-ObjectType=0x7
-DataType=0x0006
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1800sub5]
-ParameterName=Event Timer
-ObjectType=0x7
-DataType=0x0006
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1801]
-ParameterName=Transmit PDO 2 Parameter
-ObjectType=0x8
-SubNumber=5
-
-[1801sub0]
-ParameterName=Highest SubIndex Supported
-ObjectType=0x7
-DataType=0x0005
-AccessType=ro
-DefaultValue=5
-PDOMapping=0
-
-[1801sub1]
-ParameterName=COB ID used by PDO
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=$NODEID+0x280
-PDOMapping=0
-
-[1801sub2]
-ParameterName=Transmission Type
-ObjectType=0x7
-DataType=0x0005
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1801sub3]
-ParameterName=Inhibit Time
-ObjectType=0x7
-DataType=0x0006
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1801sub5]
-ParameterName=Event Timer
-ObjectType=0x7
-DataType=0x0006
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1802]
-ParameterName=Transmit PDO 3 Parameter
-ObjectType=0x8
-SubNumber=5
-
-[1802sub0]
-ParameterName=Highest SubIndex Supported
-ObjectType=0x7
-DataType=0x0005
-AccessType=ro
-DefaultValue=5
-PDOMapping=0
-
-[1802sub1]
-ParameterName=COB ID used by PDO
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=$NODEID+0x380
-PDOMapping=0
-
-[1802sub2]
-ParameterName=Transmission Type
-ObjectType=0x7
-DataType=0x0005
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1802sub3]
-ParameterName=Inhibit Time
-ObjectType=0x7
-DataType=0x0006
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1802sub5]
-ParameterName=Event Timer
-ObjectType=0x7
-DataType=0x0006
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1803]
-ParameterName=Transmit PDO 4 Parameter
-ObjectType=0x8
-SubNumber=5
-
-[1803sub0]
-ParameterName=Highest SubIndex Supported
-ObjectType=0x7
-DataType=0x0005
-AccessType=ro
-DefaultValue=5
-PDOMapping=0
-
-[1803sub1]
-ParameterName=COB ID used by PDO
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=$NODEID+0x480
-PDOMapping=0
-
-[1803sub2]
-ParameterName=Transmission Type
-ObjectType=0x7
-DataType=0x0005
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1803sub3]
-ParameterName=Inhibit Time
-ObjectType=0x7
-DataType=0x0006
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1803sub5]
-ParameterName=Event Timer
-ObjectType=0x7
-DataType=0x0006
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A00]
-ParameterName=Transmit PDO 1 Mapping
-ObjectType=0x9
-SubNumber=9
-
-[1A00sub0]
-ParameterName=Number of Entries
-ObjectType=0x7
-DataType=0x0005
-AccessType=rw
-DefaultValue=8
-PDOMapping=0
-
-[1A00sub1]
-ParameterName=PDO 1 Mapping for a process data variable 1
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A00sub2]
-ParameterName=PDO 1 Mapping for a process data variable 2
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A00sub3]
-ParameterName=PDO 1 Mapping for a process data variable 3
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A00sub4]
-ParameterName=PDO 1 Mapping for a process data variable 4
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A00sub5]
-ParameterName=PDO 1 Mapping for a process data variable 5
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A00sub6]
-ParameterName=PDO 1 Mapping for a process data variable 6
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A00sub7]
-ParameterName=PDO 1 Mapping for a process data variable 7
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A00sub8]
-ParameterName=PDO 1 Mapping for a process data variable 8
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A01]
-ParameterName=Transmit PDO 2 Mapping
-ObjectType=0x9
-SubNumber=9
-
-[1A01sub0]
-ParameterName=Number of Entries
-ObjectType=0x7
-DataType=0x0005
-AccessType=rw
-DefaultValue=8
-PDOMapping=0
-
-[1A01sub1]
-ParameterName=PDO 2 Mapping for a process data variable 1
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A01sub2]
-ParameterName=PDO 2 Mapping for a process data variable 2
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A01sub3]
-ParameterName=PDO 2 Mapping for a process data variable 3
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A01sub4]
-ParameterName=PDO 2 Mapping for a process data variable 4
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A01sub5]
-ParameterName=PDO 2 Mapping for a process data variable 5
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A01sub6]
-ParameterName=PDO 2 Mapping for a process data variable 6
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A01sub7]
-ParameterName=PDO 2 Mapping for a process data variable 7
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A01sub8]
-ParameterName=PDO 2 Mapping for a process data variable 8
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A02]
-ParameterName=Transmit PDO 3 Mapping
-ObjectType=0x9
-SubNumber=9
-
-[1A02sub0]
-ParameterName=Number of Entries
-ObjectType=0x7
-DataType=0x0005
-AccessType=rw
-DefaultValue=8
-PDOMapping=0
-
-[1A02sub1]
-ParameterName=PDO 3 Mapping for a process data variable 1
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A02sub2]
-ParameterName=PDO 3 Mapping for a process data variable 2
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A02sub3]
-ParameterName=PDO 3 Mapping for a process data variable 3
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A02sub4]
-ParameterName=PDO 3 Mapping for a process data variable 4
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A02sub5]
-ParameterName=PDO 3 Mapping for a process data variable 5
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A02sub6]
-ParameterName=PDO 3 Mapping for a process data variable 6
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A02sub7]
-ParameterName=PDO 3 Mapping for a process data variable 7
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A02sub8]
-ParameterName=PDO 3 Mapping for a process data variable 8
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A03]
-ParameterName=Transmit PDO 4 Mapping
-ObjectType=0x9
-SubNumber=9
-
-[1A03sub0]
-ParameterName=Number of Entries
-ObjectType=0x7
-DataType=0x0005
-AccessType=rw
-DefaultValue=8
-PDOMapping=0
-
-[1A03sub1]
-ParameterName=PDO 4 Mapping for a process data variable 1
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A03sub2]
-ParameterName=PDO 4 Mapping for a process data variable 2
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A03sub3]
-ParameterName=PDO 4 Mapping for a process data variable 3
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A03sub4]
-ParameterName=PDO 4 Mapping for a process data variable 4
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A03sub5]
-ParameterName=PDO 4 Mapping for a process data variable 5
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A03sub6]
-ParameterName=PDO 4 Mapping for a process data variable 6
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A03sub7]
-ParameterName=PDO 4 Mapping for a process data variable 7
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[1A03sub8]
-ParameterName=PDO 4 Mapping for a process data variable 8
-ObjectType=0x7
-DataType=0x0007
-AccessType=rw
-DefaultValue=0
-PDOMapping=0
-
-[ManufacturerObjects]
-SupportedObjects=2
-1=0x2000
-2=0x2001
-
-[2000]
-ParameterName=OutVar
-ObjectType=0x7
-DataType=0x0003
-AccessType=rw
-DefaultValue=0
-PDOMapping=1
-
-[2001]
-ParameterName=InVar
-ObjectType=0x7
-DataType=0x0003
-AccessType=rw
-DefaultValue=0
-PDOMapping=1
--- a/tests/canopen_master/canopen@canfestival/master@CanOpenNode/master.od	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,224 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE PyObject SYSTEM "PyObjects.dtd">
-<PyObject module="node" class="Node" id="173548044">
-<attr name="Profile" type="dict" id="173547276" >
-</attr>
-<attr name="Description" type="string" value="" />
-<attr name="Dictionary" type="dict" id="173547004" >
-  <entry>
-    <key type="numeric" value="4096" />
-    <val type="numeric" value="0" />
-  </entry>
-  <entry>
-    <key type="numeric" value="4097" />
-    <val type="numeric" value="0" />
-  </entry>
-  <entry>
-    <key type="numeric" value="4120" />
-    <val type="list" id="172243596" >
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-    </val>
-  </entry>
-</attr>
-<attr name="SpecificMenu" type="list" id="172243852" >
-</attr>
-<attr name="ParamsDictionary" type="dict" id="173551796" >
-</attr>
-<attr name="UserMapping" type="dict" id="173551932" >
-</attr>
-<attr name="DS302" type="dict" id="172206524" >
-  <entry>
-    <key type="numeric" value="7968" />
-    <val type="dict" id="172959508" >
-      <entry>
-        <key type="string" value="need" />
-        <val type="False" value="" />
-      </entry>
-      <entry>
-        <key type="string" value="values" />
-        <val type="list" id="172244812" >
-          <item type="dict" id="173546596" >
-            <entry>
-              <key type="string" value="access" />
-              <val type="string" value="ro" />
-            </entry>
-            <entry>
-              <key type="string" value="pdo" />
-              <val type="False" value="" />
-            </entry>
-            <entry>
-              <key type="string" value="type" />
-              <val type="numeric" value="5" />
-            </entry>
-            <entry>
-              <key type="string" value="name" />
-              <val type="string" value="Number of Entries" />
-            </entry>
-          </item>
-          <item type="dict" id="173552204" >
-            <entry>
-              <key type="string" value="access" />
-              <val type="string" value="rw" />
-            </entry>
-            <entry>
-              <key type="string" value="pdo" />
-              <val type="False" value="" />
-            </entry>
-            <entry>
-              <key type="string" value="type" />
-              <val type="numeric" value="15" />
-            </entry>
-            <entry>
-              <key type="string" value="name" />
-              <val type="string" value="Store DCF for node %d[(sub)]" />
-            </entry>
-            <entry>
-              <key type="string" value="nbmax" />
-              <val type="numeric" value="127" />
-            </entry>
-          </item>
-        </val>
-      </entry>
-      <entry>
-        <key type="string" value="name" />
-        <val type="string" value="Store DCF" />
-      </entry>
-      <entry>
-        <key type="string" value="struct" />
-        <val type="numeric" value="7" />
-      </entry>
-    </val>
-  </entry>
-  <entry>
-    <key type="numeric" value="7969" />
-    <val type="dict" id="173546732" >
-      <entry>
-        <key type="string" value="need" />
-        <val type="False" value="" />
-      </entry>
-      <entry>
-        <key type="string" value="values" />
-        <val type="list" id="172253420" >
-          <item type="dict" id="173552612" >
-            <entry>
-              <key type="string" value="access" />
-              <val type="string" value="ro" />
-            </entry>
-            <entry>
-              <key type="string" value="pdo" />
-              <val type="False" value="" />
-            </entry>
-            <entry>
-              <key type="string" value="type" />
-              <val type="numeric" value="5" />
-            </entry>
-            <entry>
-              <key type="string" value="name" />
-              <val type="string" value="Number of Entries" />
-            </entry>
-          </item>
-          <item type="dict" id="173546324" >
-            <entry>
-              <key type="string" value="access" />
-              <val type="string" value="rw" />
-            </entry>
-            <entry>
-              <key type="string" value="pdo" />
-              <val type="False" value="" />
-            </entry>
-            <entry>
-              <key type="string" value="type" />
-              <val type="numeric" value="2" />
-            </entry>
-            <entry>
-              <key type="string" value="name" />
-              <val type="string" value="Storage Format for Node %d[(sub)]" />
-            </entry>
-            <entry>
-              <key type="string" value="nbmax" />
-              <val type="numeric" value="127" />
-            </entry>
-          </item>
-        </val>
-      </entry>
-      <entry>
-        <key type="string" value="name" />
-        <val type="string" value="Storage Format" />
-      </entry>
-      <entry>
-        <key type="string" value="struct" />
-        <val type="numeric" value="7" />
-      </entry>
-    </val>
-  </entry>
-  <entry>
-    <key type="numeric" value="7970" />
-    <val type="dict" id="173552476" >
-      <entry>
-        <key type="string" value="need" />
-        <val type="False" value="" />
-      </entry>
-      <entry>
-        <key type="string" value="values" />
-        <val type="list" id="172253484" >
-          <item type="dict" id="173552884" >
-            <entry>
-              <key type="string" value="access" />
-              <val type="string" value="ro" />
-            </entry>
-            <entry>
-              <key type="string" value="pdo" />
-              <val type="False" value="" />
-            </entry>
-            <entry>
-              <key type="string" value="type" />
-              <val type="numeric" value="5" />
-            </entry>
-            <entry>
-              <key type="string" value="name" />
-              <val type="string" value="Number of Entries" />
-            </entry>
-          </item>
-          <item type="dict" id="173552748" >
-            <entry>
-              <key type="string" value="access" />
-              <val type="string" value="rw" />
-            </entry>
-            <entry>
-              <key type="string" value="pdo" />
-              <val type="False" value="" />
-            </entry>
-            <entry>
-              <key type="string" value="type" />
-              <val type="numeric" value="15" />
-            </entry>
-            <entry>
-              <key type="string" value="name" />
-              <val type="string" value="Concise DCF for Node %d[(sub)]" />
-            </entry>
-            <entry>
-              <key type="string" value="nbmax" />
-              <val type="numeric" value="127" />
-            </entry>
-          </item>
-        </val>
-      </entry>
-      <entry>
-        <key type="string" value="name" />
-        <val type="string" value="Concise DCF" />
-      </entry>
-      <entry>
-        <key type="string" value="struct" />
-        <val type="numeric" value="7" />
-      </entry>
-    </val>
-  </entry>
-</attr>
-<attr name="ProfileName" type="string" value="None" />
-<attr name="Type" type="string" value="master" />
-<attr name="ID" type="numeric" value="0" />
-<attr name="Name" type="string" value="MasterNode" />
-</PyObject>
--- a/tests/canopen_master/canopen@canfestival/master@CanOpenNode/nodelist.cpj	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-[TOPOLOGY]
-NetName=None
-Nodes=0x01
-Node2Present=0x01
-Node2Name=SlaveNode
-Node2DCFName=Slave_0_0.eds
-EDSBaseName=eds
--- a/tests/canopen_master/plc.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,113 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
-  <fileHeader companyName="beremiz" productName="beremiz" productVersion="1" creationDateTime="2008-06-24T18:44:00"/>
-  <contentHeader name="canopen_master" modificationDateTime="2018-09-26T13:31:52" language="en-US">
-    <coordinateInfo>
-      <fbd>
-        <scaling x="0" y="0"/>
-      </fbd>
-      <ld>
-        <scaling x="0" y="0"/>
-      </ld>
-      <sfc>
-        <scaling x="0" y="0"/>
-      </sfc>
-    </coordinateInfo>
-  </contentHeader>
-  <types>
-    <dataTypes/>
-    <pous>
-      <pou name="test_main" pouType="program">
-        <interface>
-          <localVars>
-            <variable name="PLC_OUT" address="%QW0.0.2.8193.0">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="PLC_IN" address="%IW0.0.2.8192.0">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </localVars>
-        </interface>
-        <body>
-          <FBD>
-            <outVariable localId="1" height="29" width="80" executionOrderId="0" negated="false">
-              <position x="362" y="139"/>
-              <connectionPointIn>
-                <relPosition x="0" y="14"/>
-                <connection refLocalId="4" formalParameter="OUT">
-                  <position x="362" y="153"/>
-                  <position x="299" y="153"/>
-                </connection>
-              </connectionPointIn>
-              <expression>PLC_OUT</expression>
-            </outVariable>
-            <inVariable localId="2" height="29" width="20">
-              <position x="100" y="115"/>
-              <connectionPointOut>
-                <relPosition x="20" y="14"/>
-              </connectionPointOut>
-              <expression>1</expression>
-            </inVariable>
-            <block localId="4" width="75" height="60" typeName="ADD">
-              <position x="224" y="123"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="2">
-                      <position x="224" y="153"/>
-                      <position x="183" y="153"/>
-                      <position x="183" y="129"/>
-                      <position x="120" y="129"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="5">
-                      <position x="224" y="173"/>
-                      <position x="199" y="173"/>
-                      <position x="199" y="201"/>
-                      <position x="174" y="201"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="75" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="5" height="29" width="70">
-              <position x="104" y="187"/>
-              <connectionPointOut>
-                <relPosition x="70" y="14"/>
-              </connectionPointOut>
-              <expression>PLC_IN</expression>
-            </inVariable>
-          </FBD>
-        </body>
-      </pou>
-    </pous>
-  </types>
-  <instances>
-    <configurations>
-      <configuration name="conf">
-        <resource name="res">
-          <task name="tache" interval="t#50ms" priority="0">
-            <pouInstance name="toto" typeName="test_main"/>
-          </task>
-        </resource>
-      </configuration>
-    </configurations>
-  </instances>
-</project>
--- a/tests/canopen_slave/beremiz.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<BeremizRoot URI_location="LOCAL://">
-  <TargetType/>
-</BeremizRoot>
--- a/tests/canopen_slave/canopen@canfestival/baseconfnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<BaseParams Name="canopen" IEC_Channel="0"/>
--- a/tests/canopen_slave/canopen@canfestival/confnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<CanFestivalInstance/>
--- a/tests/canopen_slave/canopen@canfestival/slave@CanOpenSlave/baseconfnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<BaseParams Name="slave" IEC_Channel="0"/>
--- a/tests/canopen_slave/canopen@canfestival/slave@CanOpenSlave/confnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<CanFestivalSlaveNode/>
--- a/tests/canopen_slave/canopen@canfestival/slave@CanOpenSlave/slave.eds	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,169 +0,0 @@
-[FileInfo]
-FileName=slave.eds
-FileVersion=1
-FileRevision=1
-EDSVersion=4.0
-Description=
-CreationTime=09:10AM
-CreationDate=10-27-2008
-CreatedBy=CANFestival
-ModificationTime=09:10AM
-ModificationDate=10-27-2008
-ModifiedBy=CANFestival
-
-[DeviceInfo]
-VendorName=CANFestival
-VendorNumber=0x00000000
-ProductName=SlaveNode
-ProductNumber=0x00000000
-RevisionNumber=0x00000000
-BaudRate_10=1
-BaudRate_20=1
-BaudRate_50=1
-BaudRate_125=1
-BaudRate_250=1
-BaudRate_500=1
-BaudRate_800=1
-BaudRate_1000=1
-SimpleBootUpMaster=0
-SimpleBootUpSlave=1
-Granularity=8
-DynamicChannelsSupported=0
-CompactPDO=0
-GroupMessaging=0
-NrOfRXPDO=4
-NrOfTXPDO=4
-LSS_Supported=0
-
-[DummyUsage]
-Dummy0001=0
-Dummy0002=1
-Dummy0003=1
-Dummy0004=1
-Dummy0005=1
-Dummy0006=1
-Dummy0007=1
-
-[Comments]
-Lines=0
-
-[MandatoryObjects]
-SupportedObjects=3
-1=0x1000
-2=0x1001
-3=0x1018
-
-[1000]
-ParameterName=Device Type
-ObjectType=0x7
-DataType=0x0007
-AccessType=ro
-DefaultValue=0
-PDOMapping=0
-
-[1001]
-ParameterName=Error Register
-ObjectType=0x7
-DataType=0x0005
-AccessType=ro
-DefaultValue=0
-PDOMapping=1
-
-[1018]
-ParameterName=Identity
-ObjectType=0x8
-SubNumber=5
-
-[1018sub0]
-ParameterName=Number of Entries
-ObjectType=0x7
-DataType=0x0005
-AccessType=ro
-DefaultValue=4
-PDOMapping=0
-
-[1018sub1]
-ParameterName=Vendor ID
-ObjectType=0x7
-DataType=0x0007
-AccessType=ro
-DefaultValue=0
-PDOMapping=0
-
-[1018sub2]
-ParameterName=Product Code
-ObjectType=0x7
-DataType=0x0007
-AccessType=ro
-DefaultValue=0
-PDOMapping=0
-
-[1018sub3]
-ParameterName=Revision Number
-ObjectType=0x7
-DataType=0x0007
-AccessType=ro
-DefaultValue=0
-PDOMapping=0
-
-[1018sub4]
-ParameterName=Serial Number
-ObjectType=0x7
-DataType=0x0007
-AccessType=ro
-DefaultValue=0
-PDOMapping=0
-
-[OptionalObjects]
-SupportedObjects=1
-1=0x1200
-
-[1200]
-ParameterName=Server SDO Parameter
-ObjectType=0x8
-SubNumber=3
-
-[1200sub0]
-ParameterName=Number of Entries
-ObjectType=0x7
-DataType=0x0005
-AccessType=ro
-DefaultValue=2
-PDOMapping=0
-
-[1200sub1]
-ParameterName=COB ID Client to Server (Receive SDO)
-ObjectType=0x7
-DataType=0x0007
-AccessType=ro
-DefaultValue=$NODEID+0x600
-PDOMapping=0
-
-[1200sub2]
-ParameterName=COB ID Server to Client (Transmit SDO)
-ObjectType=0x7
-DataType=0x0007
-AccessType=ro
-DefaultValue=$NODEID+0x580
-PDOMapping=0
-
-[ManufacturerObjects]
-SupportedObjects=2
-1=0x2000
-2=0x2001
-
-[2000]
-ParameterName=OutVar
-ObjectType=0x7
-DataType=0x0003
-AccessType=rw
-DefaultValue=0
-PDOMapping=1
-
-[2001]
-ParameterName=InVar
-ObjectType=0x7
-DataType=0x0003
-AccessType=rw
-DefaultValue=0
-PDOMapping=1
--- a/tests/canopen_slave/canopen@canfestival/slave@CanOpenSlave/slave.od	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,317 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE PyObject SYSTEM "PyObjects.dtd">
-<PyObject module="node" class="Node" id="157806348">
-<attr name="Profile" type="dict" id="157588716" >
-</attr>
-<attr name="Description" type="string" value="" />
-<attr name="Dictionary" type="dict" id="157588580" >
-  <entry>
-    <key type="numeric" value="4096" />
-    <val type="numeric" value="0" />
-  </entry>
-  <entry>
-    <key type="numeric" value="4097" />
-    <val type="numeric" value="0" />
-  </entry>
-  <entry>
-    <key type="numeric" value="5122" />
-    <val type="list" id="160478380" >
-      <item type="string" value="{True:&quot;$NODEID+0x%X00&quot;%(base+2),False:0x80000000}[base&lt;4]" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-    </val>
-  </entry>
-  <entry>
-    <key type="numeric" value="5123" />
-    <val type="list" id="158303244" >
-      <item type="string" value="{True:&quot;$NODEID+0x%X00&quot;%(base+2),False:0x80000000}[base&lt;4]" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-    </val>
-  </entry>
-  <entry>
-    <key type="numeric" value="8192" />
-    <val type="numeric" value="0" />
-  </entry>
-  <entry>
-    <key type="numeric" value="8193" />
-    <val type="numeric" value="0" />
-  </entry>
-  <entry>
-    <key type="numeric" value="5634" />
-    <val type="list" id="158305356" >
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-    </val>
-  </entry>
-  <entry>
-    <key type="numeric" value="5635" />
-    <val type="list" id="158305388" >
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-    </val>
-  </entry>
-  <entry>
-    <key type="numeric" value="6146" />
-    <val type="list" id="158305420" >
-      <item type="string" value="{True:&quot;$NODEID+0x%X80&quot;%(base+1),False:0x80000000}[base&lt;4]" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-    </val>
-  </entry>
-  <entry>
-    <key type="numeric" value="6658" />
-    <val type="list" id="158305932" >
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-    </val>
-  </entry>
-  <entry>
-    <key type="numeric" value="6147" />
-    <val type="list" id="158305516" >
-      <item type="string" value="{True:&quot;$NODEID+0x%X80&quot;%(base+1),False:0x80000000}[base&lt;4]" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-    </val>
-  </entry>
-  <entry>
-    <key type="numeric" value="4608" />
-    <val type="list" id="158305068" >
-      <item type="string" value="&quot;$NODEID+0x600&quot;" />
-      <item type="string" value="&quot;$NODEID+0x580&quot;" />
-    </val>
-  </entry>
-  <entry>
-    <key type="numeric" value="4120" />
-    <val type="list" id="158304940" >
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-    </val>
-  </entry>
-  <entry>
-    <key type="numeric" value="5120" />
-    <val type="list" id="158051500" >
-      <item type="string" value="{True:&quot;$NODEID+0x%X00&quot;%(base+2),False:0x80000000}[base&lt;4]" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-    </val>
-  </entry>
-  <entry>
-    <key type="numeric" value="6659" />
-    <val type="list" id="158052300" >
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-    </val>
-  </entry>
-  <entry>
-    <key type="numeric" value="5632" />
-    <val type="list" id="158049740" >
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-    </val>
-  </entry>
-  <entry>
-    <key type="numeric" value="5121" />
-    <val type="list" id="158048716" >
-      <item type="string" value="{True:&quot;$NODEID+0x%X00&quot;%(base+2),False:0x80000000}[base&lt;4]" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-    </val>
-  </entry>
-  <entry>
-    <key type="numeric" value="6144" />
-    <val type="list" id="158048428" >
-      <item type="string" value="{True:&quot;$NODEID+0x%X80&quot;%(base+1),False:0x80000000}[base&lt;4]" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-    </val>
-  </entry>
-  <entry>
-    <key type="numeric" value="5633" />
-    <val type="list" id="158052172" >
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-    </val>
-  </entry>
-  <entry>
-    <key type="numeric" value="6656" />
-    <val type="list" id="158052204" >
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-    </val>
-  </entry>
-  <entry>
-    <key type="numeric" value="6145" />
-    <val type="list" id="158052108" >
-      <item type="string" value="{True:&quot;$NODEID+0x%X80&quot;%(base+1),False:0x80000000}[base&lt;4]" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-    </val>
-  </entry>
-  <entry>
-    <key type="numeric" value="6657" />
-    <val type="list" id="158048588" >
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-      <item type="numeric" value="0" />
-    </val>
-  </entry>
-</attr>
-<attr name="SpecificMenu" type="list" id="158048396" >
-</attr>
-<attr name="ParamsDictionary" type="dict" id="157588308" >
-</attr>
-<attr name="UserMapping" type="dict" id="157588852" >
-  <entry>
-    <key type="numeric" value="8192" />
-    <val type="dict" id="157602516" >
-      <entry>
-        <key type="string" value="need" />
-        <val type="False" value="" />
-      </entry>
-      <entry>
-        <key type="string" value="values" />
-        <val type="list" id="158052332" >
-          <item type="dict" id="157586676" >
-            <entry>
-              <key type="string" value="access" />
-              <val type="string" value="rw" />
-            </entry>
-            <entry>
-              <key type="string" value="pdo" />
-              <val type="True" value="" />
-            </entry>
-            <entry>
-              <key type="string" value="type" />
-              <val type="numeric" value="3" />
-            </entry>
-            <entry>
-              <key type="string" value="name" />
-              <val type="string">OutVar</val>
-            </entry>
-          </item>
-        </val>
-      </entry>
-      <entry>
-        <key type="string" value="name" />
-        <val type="string">OutVar</val>
-      </entry>
-      <entry>
-        <key type="string" value="struct" />
-        <val type="numeric" value="1" />
-      </entry>
-    </val>
-  </entry>
-  <entry>
-    <key type="numeric" value="8193" />
-    <val type="dict" id="157535468" >
-      <entry>
-        <key type="string" value="need" />
-        <val type="False" value="" />
-      </entry>
-      <entry>
-        <key type="string" value="values" />
-        <val type="list" id="158305004" >
-          <item type="dict" id="158343620" >
-            <entry>
-              <key type="string" value="access" />
-              <val type="string" value="rw" />
-            </entry>
-            <entry>
-              <key type="string" value="pdo" />
-              <val type="True" value="" />
-            </entry>
-            <entry>
-              <key type="string" value="type" />
-              <val type="numeric" value="3" />
-            </entry>
-            <entry>
-              <key type="string" value="name" />
-              <val type="string">InVar</val>
-            </entry>
-          </item>
-        </val>
-      </entry>
-      <entry>
-        <key type="string" value="name" />
-        <val type="string">InVar</val>
-      </entry>
-      <entry>
-        <key type="string" value="struct" />
-        <val type="numeric" value="1" />
-      </entry>
-    </val>
-  </entry>
-</attr>
-<attr name="DS302" type="dict" id="158328188" >
-</attr>
-<attr name="ProfileName" type="string" value="None" />
-<attr name="Type" type="string" value="slave" />
-<attr name="ID" type="numeric" value="0" />
-<attr name="Name" type="string" value="SlaveNode" />
-</PyObject>
--- a/tests/canopen_slave/plc.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,113 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
-  <fileHeader companyName="beremiz" productName="beremiz" productVersion="1" creationDateTime="2008-06-24T18:44:00"/>
-  <contentHeader name="canopen_slave" modificationDateTime="2018-09-26T13:32:23" language="en-US">
-    <coordinateInfo>
-      <fbd>
-        <scaling x="0" y="0"/>
-      </fbd>
-      <ld>
-        <scaling x="0" y="0"/>
-      </ld>
-      <sfc>
-        <scaling x="0" y="0"/>
-      </sfc>
-    </coordinateInfo>
-  </contentHeader>
-  <types>
-    <dataTypes/>
-    <pous>
-      <pou name="test_main" pouType="program">
-        <interface>
-          <localVars>
-            <variable name="outvar" address="%QW0.0.8192.0">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="invar" address="%IW0.0.8193.0">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </localVars>
-        </interface>
-        <body>
-          <FBD>
-            <outVariable localId="1" height="29" width="80" executionOrderId="0" negated="false">
-              <position x="362" y="139"/>
-              <connectionPointIn>
-                <relPosition x="0" y="14"/>
-                <connection refLocalId="4" formalParameter="OUT">
-                  <position x="362" y="153"/>
-                  <position x="299" y="153"/>
-                </connection>
-              </connectionPointIn>
-              <expression>outvar</expression>
-            </outVariable>
-            <inVariable localId="2" height="29" width="20">
-              <position x="100" y="115"/>
-              <connectionPointOut>
-                <relPosition x="20" y="14"/>
-              </connectionPointOut>
-              <expression>1</expression>
-            </inVariable>
-            <block localId="4" width="75" height="60" typeName="ADD">
-              <position x="224" y="123"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="2">
-                      <position x="224" y="153"/>
-                      <position x="183" y="153"/>
-                      <position x="183" y="129"/>
-                      <position x="120" y="129"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="5">
-                      <position x="224" y="173"/>
-                      <position x="187" y="173"/>
-                      <position x="187" y="187"/>
-                      <position x="150" y="187"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="75" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="5" height="29" width="60">
-              <position x="90" y="173"/>
-              <connectionPointOut>
-                <relPosition x="60" y="14"/>
-              </connectionPointOut>
-              <expression>invar</expression>
-            </inVariable>
-          </FBD>
-        </body>
-      </pou>
-    </pous>
-  </types>
-  <instances>
-    <configurations>
-      <configuration name="conf">
-        <resource name="res">
-          <task name="tache" interval="T#10ms" priority="0">
-            <pouInstance name="toto" typeName="test_main"/>
-          </task>
-        </resource>
-      </configuration>
-    </configurations>
-  </instances>
-</project>
--- a/tests/genericmake/beremiz.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-  <TargetType>
-    <Generic Command="make -C %(buildpath)s -f ../project_files/Makefile all BEREMIZSRC=%(src)s BEREMIZCFLAGS=%(cflags)s MD5=%(md5)s USE_BEREMIZ=1 FROM_BEREMIZ=1"/>
-  </TargetType>
-  <Libraries Enable_Native_Library="false" Enable_Python_Library="false"/>
-</BeremizRoot>
--- a/tests/genericmake/plc.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,92 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201">
-  <fileHeader companyName="Unknown" productName="Unnamed" productVersion="1" creationDateTime="2014-01-19T11:14:47" contentDescription="This example shows how you can customize build process by using 'make'.&#10;"/>
-  <contentHeader name="Makefile Example" modificationDateTime="2018-08-24T13:12:10">
-    <coordinateInfo>
-      <fbd>
-        <scaling x="0" y="0"/>
-      </fbd>
-      <ld>
-        <scaling x="0" y="0"/>
-      </ld>
-      <sfc>
-        <scaling x="0" y="0"/>
-      </sfc>
-    </coordinateInfo>
-  </contentHeader>
-  <types>
-    <dataTypes/>
-    <pous>
-      <pou name="program0" pouType="program">
-        <interface>
-          <localVars>
-            <variable name="LocalVara">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="LocalVarb">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </localVars>
-        </interface>
-        <body>
-          <FBD>
-            <inVariable localId="1" executionOrderId="0" height="30" width="77" negated="false">
-              <position x="52" y="424"/>
-              <connectionPointOut>
-                <relPosition x="77" y="15"/>
-              </connectionPointOut>
-              <expression>LocalVara</expression>
-            </inVariable>
-            <outVariable localId="2" executionOrderId="0" height="30" width="77" negated="false">
-              <position x="167" y="424"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="1">
-                  <position x="167" y="439"/>
-                  <position x="129" y="439"/>
-                </connection>
-              </connectionPointIn>
-              <expression>LocalVarb</expression>
-            </outVariable>
-            <comment localId="3" height="385" width="760">
-              <position x="32" y="23"/>
-              <content>
-                <xhtml:p><![CDATA[This example shows how you can customize build process by using 'make'.
-
-Sometimes special steps need to be done to build entire project.
-But it's not necessary to create another target in Beremiz every time you need to customize something in build process.  Just use for that 'Generic' target and describe all necessary steps in Makefile. 
-
-For example, you can 
- - preprocess generated by Beremiz C source files, 
- - do some fancy source code transformation using any tools you want, 
- - use any compiler you want,
- - call static analyzers,
- - run integration tests on the project,
- - upload source code to external build server,
- - upload to the target and compile it there,
- - flash/transfer your compiled binary to the target,
- and much much more.
-]]></xhtml:p>
-              </content>
-            </comment>
-          </FBD>
-        </body>
-      </pou>
-    </pous>
-  </types>
-  <instances>
-    <configurations>
-      <configuration name="config">
-        <resource name="resource1">
-          <task name="Tsk" priority="0" interval="T#100ms">
-            <pouInstance name="Inst" typeName="program0"/>
-          </task>
-        </resource>
-      </configuration>
-    </configurations>
-  </instances>
-</project>
--- a/tests/genericmake/project_files/Makefile	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-BEREMIZ_OBJS = $(BEREMIZSRC:.c=.o)
-
-all: warn some_binary
-	@echo "*** all done ***"
-
-warn:
-	@echo "*** Sample Makefile, does nothing ***"
-
-some_binary: $(BEREMIZ_OBJS)
-	@echo "* Would link $^ -> $@"
-
-%.o: %.c
-	@echo "* Would compile $< -> $@"
--- a/tests/logging/beremiz.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BeremizRoot URI_location="LOCAL://">
-  <TargetType/>
-  <Libraries Enable_Native_Library="true"/>
-</BeremizRoot>
--- a/tests/logging/plc.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,350 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<project xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
-  <fileHeader companyName="Unknown" productName="Generic PLC" productVersion="1" creationDateTime="2013-01-29T14:01:00" contentDescription="This example shows logging functionality in Beremiz.&#10;Here are shown two ways of logging:&#10;- from IEC PLC program;&#10;- from python extension.&#10;"/>
-  <contentHeader name="Logging example" modificationDateTime="2018-09-26T13:10:14">
-    <coordinateInfo>
-      <fbd>
-        <scaling x="0" y="0"/>
-      </fbd>
-      <ld>
-        <scaling x="0" y="0"/>
-      </ld>
-      <sfc>
-        <scaling x="0" y="0"/>
-      </sfc>
-    </coordinateInfo>
-  </contentHeader>
-  <types>
-    <dataTypes/>
-    <pous>
-      <pou name="program0" pouType="program">
-        <interface>
-          <localVars>
-            <variable name="beat">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="count">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="LOGGER0">
-              <type>
-                <derived name="LOGGER"/>
-              </type>
-            </variable>
-            <variable name="lvl">
-              <type>
-                <derived name="LOGLEVEL"/>
-              </type>
-              <initialValue>
-                <simpleValue value="INFO"/>
-              </initialValue>
-            </variable>
-            <variable name="Timer">
-              <type>
-                <derived name="TOF"/>
-              </type>
-            </variable>
-          </localVars>
-        </interface>
-        <body>
-          <FBD>
-            <inVariable localId="2" height="30" width="218" executionOrderId="0" negated="false">
-              <position x="459" y="365"/>
-              <connectionPointOut>
-                <relPosition x="218" y="15"/>
-              </connectionPointOut>
-              <expression>'IEC side logging: beat #'</expression>
-            </inVariable>
-            <block localId="3" width="59" height="40" typeName="NOT" executionOrderId="0">
-              <position x="241" y="287"/>
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="14" formalParameter="Q">
-                      <position x="241" y="317"/>
-                      <position x="197" y="317"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="59" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inOutVariable localId="4" height="30" width="60" executionOrderId="0" negatedOut="false" negatedIn="false">
-              <position x="57" y="302"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="3" formalParameter="OUT">
-                  <position x="57" y="317"/>
-                  <position x="37" y="317"/>
-                  <position x="37" y="390"/>
-                  <position x="314" y="390"/>
-                  <position x="314" y="317"/>
-                  <position x="300" y="317"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="60" y="15"/>
-              </connectionPointOut>
-              <expression>beat</expression>
-            </inOutVariable>
-            <block localId="5" width="68" height="98" typeName="ADD" executionOrderId="0">
-              <position x="463" y="403"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="39"/>
-                    <connection refLocalId="10" formalParameter="OUT">
-                      <position x="463" y="442"/>
-                      <position x="452" y="442"/>
-                      <position x="452" y="442"/>
-                      <position x="455" y="442"/>
-                      <position x="455" y="442"/>
-                      <position x="439" y="442"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="78"/>
-                    <connection refLocalId="6">
-                      <position x="463" y="481"/>
-                      <position x="438" y="481"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="68" y="39"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inOutVariable localId="6" height="30" width="103" executionOrderId="0" negatedOut="false" negatedIn="false">
-              <position x="335" y="466"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="5" formalParameter="OUT">
-                  <position x="335" y="481"/>
-                  <position x="320" y="481"/>
-                  <position x="320" y="518"/>
-                  <position x="544" y="518"/>
-                  <position x="544" y="442"/>
-                  <position x="531" y="442"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="103" y="15"/>
-              </connectionPointOut>
-              <expression>count</expression>
-            </inOutVariable>
-            <block localId="8" width="67" height="144" typeName="CONCAT" executionOrderId="0">
-              <position x="727" y="329"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="51"/>
-                    <connection refLocalId="2">
-                      <position x="727" y="380"/>
-                      <position x="717" y="380"/>
-                      <position x="717" y="380"/>
-                      <position x="677" y="380"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="113"/>
-                    <connection refLocalId="9" formalParameter="OUT">
-                      <position x="727" y="442"/>
-                      <position x="680" y="442"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="67" y="51"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <block localId="9" width="119" height="40" typeName="INT_TO_STRING" executionOrderId="0">
-              <position x="561" y="412"/>
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="5" formalParameter="OUT">
-                      <position x="561" y="442"/>
-                      <position x="531" y="442"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="119" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <block localId="10" width="106" height="40" typeName="BOOL_TO_INT" executionOrderId="0">
-              <position x="333" y="412"/>
-              <inputVariables>
-                <variable formalParameter="IN" edge="rising">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="3" formalParameter="OUT">
-                      <position x="333" y="442"/>
-                      <position x="314" y="442"/>
-                      <position x="314" y="317"/>
-                      <position x="300" y="317"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="106" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <block localId="11" width="65" height="209" typeName="LOGGER" instanceName="LOGGER0" executionOrderId="0">
-              <position x="907" y="266"/>
-              <inputVariables>
-                <variable formalParameter="TRIG">
-                  <connectionPointIn>
-                    <relPosition x="0" y="51"/>
-                    <connection refLocalId="3" formalParameter="OUT">
-                      <position x="907" y="317"/>
-                      <position x="300" y="317"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="MSG">
-                  <connectionPointIn>
-                    <relPosition x="0" y="114"/>
-                    <connection refLocalId="8" formalParameter="OUT">
-                      <position x="907" y="380"/>
-                      <position x="794" y="380"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="LEVEL">
-                  <connectionPointIn>
-                    <relPosition x="0" y="177"/>
-                    <connection refLocalId="12">
-                      <position x="907" y="443"/>
-                      <position x="880" y="443"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables/>
-            </block>
-            <inVariable localId="12" height="30" width="79" executionOrderId="0" negated="false">
-              <position x="801" y="428"/>
-              <connectionPointOut>
-                <relPosition x="79" y="15"/>
-              </connectionPointOut>
-              <expression>lvl</expression>
-            </inVariable>
-            <block localId="14" typeName="TOF" instanceName="Timer" executionOrderId="0" height="98" width="47">
-              <position x="150" y="278"/>
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="39"/>
-                    <connection refLocalId="4">
-                      <position x="150" y="317"/>
-                      <position x="117" y="317"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="PT">
-                  <connectionPointIn>
-                    <relPosition x="0" y="78"/>
-                    <connection refLocalId="1">
-                      <position x="150" y="356"/>
-                      <position x="117" y="356"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="Q">
-                  <connectionPointOut>
-                    <relPosition x="47" y="39"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="ET">
-                  <connectionPointOut>
-                    <relPosition x="47" y="78"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="1" executionOrderId="0" height="30" width="61" negated="false">
-              <position x="56" y="341"/>
-              <connectionPointOut>
-                <relPosition x="61" y="15"/>
-              </connectionPointOut>
-              <expression>T#3s</expression>
-            </inVariable>
-            <comment localId="15" height="249" width="682">
-              <position x="19" y="8"/>
-              <content>
-                <xhtml:p><![CDATA[This example shows logging functionality in Beremiz.
-Here are shown two ways of logging:
-- from IEC PLC program;
-- from python extension.
-
-In IEC PLC program every third second (beat) new message is generated and put in PLC log.
-See function blocks below.
-
-Every 15 seconds status of PLC program is put in PLC log from python extension.
-For more information about logging from python look at 0.x: py_ext_0 implementation in project tree. 
-]]></xhtml:p>
-              </content>
-            </comment>
-          </FBD>
-        </body>
-      </pou>
-    </pous>
-  </types>
-  <instances>
-    <configurations>
-      <configuration name="config">
-        <resource name="resource1">
-          <task name="task0" priority="0" interval="T#100ms">
-            <pouInstance name="prg" typeName="program0"/>
-          </task>
-        </resource>
-      </configuration>
-    </configurations>
-  </instances>
-</project>
--- a/tests/logging/py_ext_0@py_ext/baseconfnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<BaseParams Name="py_ext_0" IEC_Channel="0"/>
--- a/tests/logging/py_ext_0@py_ext/pyfile.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<PyFile xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-  <variables/>
-  <globals>
-    <xhtml:p><![CDATA[import threading, time
-
-MyT = None
-Stop = False
-
-def StartLog():
-    global MyT
-    MyT=threading.Thread(target = DoLog)
-    MyT.start()
-
-def DoLog():
-    global Stop
-    while not Stop:
-        PLCObject.LogMessage("Python side Logging (PLC is %s)"%PLCObject.PLCStatus)
-        time.sleep(0.3)
-
-def StopLog():
-    global MyT,Stop
-    Stop=True
-
-_runtime_init.append(StartLog)
-_runtime_cleanup.append(StopLog)
-]]></xhtml:p>
-  </globals>
-  <init>
-    <xhtml:p><![CDATA[]]></xhtml:p>
-  </init>
-  <cleanup>
-    <xhtml:p><![CDATA[]]></xhtml:p>
-  </cleanup>
-  <start>
-    <xhtml:p><![CDATA[]]></xhtml:p>
-  </start>
-  <stop>
-    <xhtml:p><![CDATA[]]></xhtml:p>
-  </stop>
-</PyFile>
--- a/tests/modbus/beremiz.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="LOCAL://">
-  <TargetType>
-    <Linux/>
-  </TargetType>
-</BeremizRoot>
--- a/tests/modbus/modbus_0@modbus/ModbusTCPclient_0@ModbusTCPclient/ModbusRequest_0@ModbusRequest/baseconfnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="ModbusRequest_0"/>
--- a/tests/modbus/modbus_0@modbus/ModbusTCPclient_0@ModbusTCPclient/ModbusRequest_0@ModbusRequest/confnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<ModbusRequest xmlns:xsd="http://www.w3.org/2001/XMLSchema" Function="16 - Write Multiple Registers" SlaveID="0"/>
--- a/tests/modbus/modbus_0@modbus/ModbusTCPclient_0@ModbusTCPclient/ModbusRequest_1@ModbusRequest/baseconfnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="1" Name="ModbusRequest_1"/>
--- a/tests/modbus/modbus_0@modbus/ModbusTCPclient_0@ModbusTCPclient/ModbusRequest_1@ModbusRequest/confnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<ModbusRequest xmlns:xsd="http://www.w3.org/2001/XMLSchema" Function="04 - Read Input Registers" SlaveID="0" Start_Address="0"/>
--- a/tests/modbus/modbus_0@modbus/ModbusTCPclient_0@ModbusTCPclient/baseconfnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="ModbusTCPclient_0"/>
--- a/tests/modbus/modbus_0@modbus/ModbusTCPclient_0@ModbusTCPclient/confnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<ModbusTCPclient xmlns:xsd="http://www.w3.org/2001/XMLSchema" Remote_Port_Number="1502"/>
--- a/tests/modbus/modbus_0@modbus/ModbusTCPserver_0@ModbusTCPserver/HoldingRegs@MemoryArea/baseconfnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="HoldingRegs"/>
--- a/tests/modbus/modbus_0@modbus/ModbusTCPserver_0@ModbusTCPserver/HoldingRegs@MemoryArea/confnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<MemoryArea xmlns:xsd="http://www.w3.org/2001/XMLSchema" MemoryAreaType="03 - Holding Registers" Nr_of_Channels="1"/>
--- a/tests/modbus/modbus_0@modbus/ModbusTCPserver_0@ModbusTCPserver/InputRegs@MemoryArea/baseconfnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="1" Name="InputRegs"/>
--- a/tests/modbus/modbus_0@modbus/ModbusTCPserver_0@ModbusTCPserver/InputRegs@MemoryArea/confnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<MemoryArea xmlns:xsd="http://www.w3.org/2001/XMLSchema" MemoryAreaType="04 - Input Registers"/>
--- a/tests/modbus/modbus_0@modbus/ModbusTCPserver_0@ModbusTCPserver/baseconfnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="1" Name="ModbusTCPserver_0"/>
--- a/tests/modbus/modbus_0@modbus/ModbusTCPserver_0@ModbusTCPserver/confnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<ModbusServerNode xmlns:xsd="http://www.w3.org/2001/XMLSchema" Local_Port_Number="1502" Local_IP_Address="127.0.0.1"/>
--- a/tests/modbus/modbus_0@modbus/baseconfnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="modbus_0"/>
--- a/tests/modbus/modbus_0@modbus/confnode.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<ModbusRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema"/>
--- a/tests/modbus/plc.xml	Sun Jan 16 17:00:58 2022 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,314 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201">
-  <fileHeader companyName="Beremiz" productName="Beremiz" productVersion="1" creationDateTime="2018-07-27T13:19:12"/>
-  <contentHeader name="Modbus" modificationDateTime="2018-07-27T15:43:56">
-    <coordinateInfo>
-      <fbd>
-        <scaling x="0" y="0"/>
-      </fbd>
-      <ld>
-        <scaling x="0" y="0"/>
-      </ld>
-      <sfc>
-        <scaling x="0" y="0"/>
-      </sfc>
-    </coordinateInfo>
-  </contentHeader>
-  <types>
-    <dataTypes/>
-    <pous>
-      <pou name="program0" pouType="program">
-        <interface>
-          <localVars>
-            <variable name="Counter">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="CounterReadBack">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </localVars>
-          <localVars>
-            <variable name="MasterWriteToReg0" address="%QW0.0.0.0">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="MasterReadFromReg1" address="%IW0.0.1.0">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="SlaveHoldReg0" address="%IW0.1.0.0">
-              <type>
-                <WORD/>
-              </type>
-            </variable>
-            <variable name="SlaveInputReg0" address="%QW0.1.1.0">
-              <type>
-                <WORD/>
-              </type>
-            </variable>
-          </localVars>
-          <localVars>
-            <variable name="CTU0">
-              <type>
-                <derived name="CTU"/>
-              </type>
-            </variable>
-            <variable name="Generator0">
-              <type>
-                <derived name="Generator"/>
-              </type>
-            </variable>
-          </localVars>
-        </interface>
-        <body>
-          <FBD>
-            <comment localId="4" height="109" width="350">
-              <position x="102" y="438"/>
-              <content>
-                <xhtml:p><![CDATA[Modbus TCP Master writes counter value to one holding register on Modbus TCP Slave and reads it back from other input register.]]></xhtml:p>
-              </content>
-            </comment>
-            <comment localId="3" height="407" width="680">
-              <position x="21" y="15"/>
-              <content>
-                <xhtml:p><![CDATA[This examples shows how to work with Modbus extension. It uses Modbus TCP, but the same functions are available for Modbus RTU as well. Buth protocols are supported.
-
-Modbus extensions requires native Modbus RTU/TCP library to be installed nearby Beremiz.
-Following directory structure is expected:
-<Parent directory>
-  "beremiz"
-  "Modbus"
-
-If Modbus library is installed elsewhere, then place corresponding paths
-in CFLAGS/LDFLAGS in project settings.
-
-For GNU/Linux to install Modbus library in parent directory run following commands:
-$ hg clone https://bitbucket.org/mjsousa/modbus Modbus
-$ cd Modbus
-$ make
-
-After that Modbus extension is ready to be used in Beremiz projects.]]></xhtml:p>
-              </content>
-            </comment>
-            <block localId="5" typeName="CTU" instanceName="CTU0" executionOrderId="0" height="80" width="52">
-              <position x="346" y="605"/>
-              <inputVariables>
-                <variable formalParameter="CU" edge="rising">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="6" formalParameter="OUT">
-                      <position x="346" y="635"/>
-                      <position x="303" y="635"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="R">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="PV">
-                  <connectionPointIn>
-                    <relPosition x="0" y="70"/>
-                    <connection refLocalId="7">
-                      <position x="346" y="675"/>
-                      <position x="324" y="675"/>
-                      <position x="324" y="703"/>
-                      <position x="302" y="703"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="Q">
-                  <connectionPointOut>
-                    <relPosition x="52" y="30"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="CV">
-                  <connectionPointOut>
-                    <relPosition x="52" y="50"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <block localId="6" typeName="Generator" instanceName="Generator0" executionOrderId="0" height="60" width="79">
-              <position x="224" y="605"/>
-              <inputVariables>
-                <variable formalParameter="PON">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="1">
-                      <position x="224" y="635"/>
-                      <position x="154" y="635"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="POFF">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="1">
-                      <position x="224" y="655"/>
-                      <position x="189" y="655"/>
-                      <position x="189" y="635"/>
-                      <position x="154" y="635"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="79" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="1" executionOrderId="0" height="30" width="138" negated="false">
-              <position x="16" y="620"/>
-              <connectionPointOut>
-                <relPosition x="138" y="15"/>
-              </connectionPointOut>
-              <expression>T#1s</expression>
-            </inVariable>
-            <inVariable localId="7" executionOrderId="0" height="30" width="138" negated="false">
-              <position x="164" y="688"/>
-              <connectionPointOut>
-                <relPosition x="138" y="15"/>
-              </connectionPointOut>
-              <expression>32767</expression>
-            </inVariable>
-            <inOutVariable localId="2" executionOrderId="0" height="30" width="138" negatedOut="false" negatedIn="false">
-              <position x="544" y="640"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="5" formalParameter="CV">
-                  <position x="544" y="655"/>
-                  <position x="398" y="655"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="138" y="15"/>
-              </connectionPointOut>
-              <expression>Counter</expression>
-            </inOutVariable>
-            <outVariable localId="8" executionOrderId="0" height="30" width="138" negated="false">
-              <position x="762" y="640"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="2">
-                  <position x="762" y="655"/>
-                  <position x="682" y="655"/>
-                </connection>
-              </connectionPointIn>
-              <expression>MasterWriteToReg0</expression>
-            </outVariable>
-            <inVariable localId="9" executionOrderId="0" height="30" width="152" negated="false">
-              <position x="81" y="747"/>
-              <connectionPointOut>
-                <relPosition x="152" y="15"/>
-              </connectionPointOut>
-              <expression>MasterReadFromReg1</expression>
-            </inVariable>
-            <outVariable localId="10" executionOrderId="0" height="30" width="137" negated="false">
-              <position x="547" y="747"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="9">
-                  <position x="547" y="762"/>
-                  <position x="233" y="762"/>
-                </connection>
-              </connectionPointIn>
-              <expression>CounterReadBack</expression>
-            </outVariable>
-            <comment localId="11" height="109" width="350">
-              <position x="85" y="825"/>
-              <content>
-                <xhtml:p><![CDATA[Modbus TCP Slave just copies received register value from holding register to input register.]]></xhtml:p>
-              </content>
-            </comment>
-            <inVariable localId="12" executionOrderId="0" height="30" width="152" negated="false">
-              <position x="82" y="970"/>
-              <connectionPointOut>
-                <relPosition x="152" y="15"/>
-              </connectionPointOut>
-              <expression>SlaveHoldReg0</expression>
-            </inVariable>
-            <outVariable localId="13" executionOrderId="0" height="30" width="123" negated="false">
-              <position x="548" y="970"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="12">
-                  <position x="548" y="985"/>
-                  <position x="234" y="985"/>
-                </connection>
-              </connectionPointIn>
-              <expression>SlaveInputReg0</expression>
-            </outVariable>
-          </FBD>
-        </body>
-      </pou>
-      <pou name="Generator" pouType="functionBlock">
-        <interface>
-          <outputVars>
-            <variable name="OUT">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-          </outputVars>
-          <inputVars>
-            <variable name="PON">
-              <type>
-                <TIME/>
-              </type>
-            </variable>
-            <variable name="POFF">
-              <type>
-                <TIME/>
-              </type>
-            </variable>
-          </inputVars>
-          <localVars>
-            <variable name="T1">
-              <type>
-                <derived name="TON"/>
-              </type>
-            </variable>
-            <variable name="T2">
-              <type>
-                <derived name="TOF"/>
-              </type>
-            </variable>
-          </localVars>
-        </interface>
-        <body>
-          <ST>
-            <xhtml:p><![CDATA[T1( IN := NOT T2.Q, PT := POFF);
-T2( IN := T1.Q,     PT := PON);
-OUT := T2.Q;]]></xhtml:p>
-          </ST>
-        </body>
-      </pou>
-    </pous>
-  </types>
-  <instances>
-    <configurations>
-      <configuration name="config">
-        <resource name="resource1">
-          <task name="task0" priority="0" interval="T#20ms">
-            <pouInstance name="instance0" typeName="program0"/>
-          </task>
-        </resource>
-      </configuration>
-    </configurations>
-  </instances>
-</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/BACnet/bacnet_0@bacnet/bacnet_slave	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,202 @@
+(dp0
+S'BV_Obj'
+p1
+(lp2
+sS'AV_Obj'
+p3
+(lp4
+(dp5
+S'loc'
+p6
+S'MD0_2'
+p7
+sS'Description'
+p8
+S''
+p9
+sS'Unit ID'
+p10
+I19
+sS'Object Identifier'
+p11
+I0
+sS'Ctype'
+p12
+S'float'
+p13
+sS'BACnetObjTypeID'
+p14
+I2
+sS'Settable'
+p15
+S'Y'
+p16
+sS'Engineering Units'
+p17
+V(Energy) kilowatt-hours (19)
+p18
+sS'Object Name'
+p19
+VEnergyCounter
+p20
+sasS'AO_Obj'
+p21
+(lp22
+(dp23
+g6
+S'QD0_1'
+p24
+sg8
+V
+p25
+sS'Unit ID'
+p26
+I62
+sS'Object Identifier'
+p27
+V0
+p28
+sg12
+g13
+sg14
+I1
+sg15
+g16
+sS'Object Name'
+p29
+VTemperatureSetPoint
+p30
+sS'Engineering Units'
+p31
+V(Temperature) degrees-celsius (62)
+p32
+sasS'MSI_Obj'
+p33
+(lp34
+sS'BO_Obj'
+p35
+(lp36
+(dp37
+g6
+S'QX0_4'
+p38
+sg8
+g9
+sS'Object Identifier'
+p39
+I2
+sg12
+S'uint8_t'
+p40
+sg14
+I4
+sg15
+g16
+sS'Object Name'
+p41
+VBlockClimateControl
+p42
+sasS'MSO_Obj'
+p43
+(lp44
+sS'EDEfile_parm'
+p45
+(dp46
+S'next_EDE_file_version'
+p47
+I1
+ssS'BI_Obj'
+p48
+(lp49
+(dp50
+g6
+S'IX0_3'
+p51
+sg8
+g9
+sS'Object Identifier'
+p52
+I0
+sg12
+g40
+sg14
+I3
+sg15
+S'N'
+p53
+sS'Object Name'
+p54
+VHeater
+p55
+sa(dp56
+g6
+g51
+sg8
+g9
+sg52
+I1
+sg12
+g40
+sg14
+I3
+sg15
+g53
+sg54
+VCooler
+p57
+sasS'AI_Obj'
+p58
+(lp59
+(dp60
+g6
+S'ID0_0'
+p61
+sg8
+VCurrent termperature in Beremiz lab
+p62
+sS'Unit ID'
+p63
+I62
+sS'Object Identifier'
+p64
+I0
+sg12
+g13
+sg14
+I0
+sg15
+g53
+sS'Engineering Units'
+p65
+V(Temperature) degrees-celsius (62)
+p66
+sS'Object Name'
+p67
+VTemperature
+p68
+sa(dp69
+g6
+g61
+sg8
+VCurrent humidity in Beremiz lab
+p70
+sg63
+I29
+sg64
+I1
+sg12
+g13
+sg14
+I0
+sg15
+g53
+sg67
+VHumidity
+p71
+sg65
+V(Humidity) percent-relative-humidity (29)
+p72
+sasS'MSV_Obj'
+p73
+(lp74
+s.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/BACnet/bacnet_0@bacnet/baseconfnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="bacnet_0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/BACnet/bacnet_0@bacnet/confnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BACnetServerNode xmlns:xsd="http://www.w3.org/2001/XMLSchema" UDP_Port_Number="47808" BACnet_Device_ID="3" BACnet_Communication_Control_Password=" " BACnet_Device_Location="Beremiz lab" Network_Interface="virbr0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/BACnet/beremiz.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,4 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="LOCAL://">
+  <TargetType/>
+</BeremizRoot>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/BACnet/plc.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,601 @@
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201">
+  <fileHeader companyName="Unknown" productName="Unnamed" productVersion="1" creationDateTime="2018-07-28T02:24:08"/>
+  <contentHeader name="BACnet" modificationDateTime="2018-09-26T14:00:21">
+    <coordinateInfo>
+      <fbd>
+        <scaling x="0" y="0"/>
+      </fbd>
+      <ld>
+        <scaling x="0" y="0"/>
+      </ld>
+      <sfc>
+        <scaling x="0" y="0"/>
+      </sfc>
+    </coordinateInfo>
+  </contentHeader>
+  <types>
+    <dataTypes/>
+    <pous>
+      <pou name="program0" pouType="program">
+        <interface>
+          <localVars>
+            <variable name="EnergyCounter" address="%MD0.2.0">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+            <variable name="Temperature" address="%ID0.0.0">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+            <variable name="Humidity" address="%ID0.0.1">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+          </localVars>
+          <localVars>
+            <variable name="TempSimulation">
+              <type>
+                <derived name="Simulator"/>
+              </type>
+            </variable>
+            <variable name="HumiditySimulation">
+              <type>
+                <derived name="Simulator"/>
+              </type>
+            </variable>
+          </localVars>
+          <localVars>
+            <variable name="TemperatureSetPoint" address="%QD0.1.0">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+            <variable name="ControlDisable" address="%QX0.4.2">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="Heater" address="%IX0.3.0">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="Cooler" address="%IX0.3.1">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <inVariable localId="1" executionOrderId="0" height="30" width="114" negated="false">
+              <position x="299" y="521"/>
+              <connectionPointOut>
+                <relPosition x="114" y="15"/>
+              </connectionPointOut>
+              <expression>EnergyCounter</expression>
+            </inVariable>
+            <outVariable localId="2" executionOrderId="0" height="30" width="114" negated="false">
+              <position x="654" y="521"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="3" formalParameter="OUT">
+                  <position x="654" y="536"/>
+                  <position x="533" y="536"/>
+                </connection>
+              </connectionPointIn>
+              <expression>EnergyCounter</expression>
+            </outVariable>
+            <block localId="3" typeName="ADD" executionOrderId="0" height="60" width="67">
+              <position x="466" y="506"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="1">
+                      <position x="466" y="536"/>
+                      <position x="404" y="536"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="4">
+                      <position x="466" y="556"/>
+                      <position x="436" y="556"/>
+                      <position x="436" y="585"/>
+                      <position x="401" y="585"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="67" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="4" executionOrderId="0" height="30" width="105" negated="false">
+              <position x="296" y="570"/>
+              <connectionPointOut>
+                <relPosition x="105" y="15"/>
+              </connectionPointOut>
+              <expression>0.00131</expression>
+            </inVariable>
+            <comment localId="5" height="67" width="229">
+              <position x="27" y="525"/>
+              <content>
+                <xhtml:p><![CDATA[Always consume some energy]]></xhtml:p>
+              </content>
+            </comment>
+            <block localId="6" typeName="Simulator" instanceName="TempSimulation" executionOrderId="0" height="128" width="143">
+              <position x="188" y="648"/>
+              <inputVariables>
+                <variable formalParameter="MinVal">
+                  <connectionPointIn>
+                    <relPosition x="0" y="38"/>
+                    <connection refLocalId="8">
+                      <position x="188" y="686"/>
+                      <position x="138" y="686"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="MaxVal">
+                  <connectionPointIn>
+                    <relPosition x="0" y="74"/>
+                    <connection refLocalId="9">
+                      <position x="188" y="722"/>
+                      <position x="138" y="722"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="PeriodSeconds">
+                  <connectionPointIn>
+                    <relPosition x="0" y="110"/>
+                    <connection refLocalId="10">
+                      <position x="188" y="758"/>
+                      <position x="138" y="758"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Out">
+                  <connectionPointOut>
+                    <relPosition x="143" y="38"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="7" executionOrderId="0" height="30" width="98" negated="false">
+              <position x="421" y="671"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="6" formalParameter="Out">
+                  <position x="421" y="686"/>
+                  <position x="331" y="686"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Temperature</expression>
+            </outVariable>
+            <inVariable localId="8" executionOrderId="0" height="30" width="105" negated="false">
+              <position x="33" y="671"/>
+              <connectionPointOut>
+                <relPosition x="105" y="15"/>
+              </connectionPointOut>
+              <expression>18.0</expression>
+            </inVariable>
+            <inVariable localId="9" executionOrderId="0" height="30" width="105" negated="false">
+              <position x="33" y="707"/>
+              <connectionPointOut>
+                <relPosition x="105" y="15"/>
+              </connectionPointOut>
+              <expression>30.0</expression>
+            </inVariable>
+            <inVariable localId="10" executionOrderId="0" height="30" width="105" negated="false">
+              <position x="33" y="743"/>
+              <connectionPointOut>
+                <relPosition x="105" y="15"/>
+              </connectionPointOut>
+              <expression>120</expression>
+            </inVariable>
+            <block localId="11" typeName="Simulator" instanceName="HumiditySimulation" executionOrderId="0" height="137" width="143">
+              <position x="185" y="803"/>
+              <inputVariables>
+                <variable formalParameter="MinVal">
+                  <connectionPointIn>
+                    <relPosition x="0" y="39"/>
+                    <connection refLocalId="13">
+                      <position x="185" y="842"/>
+                      <position x="135" y="842"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="MaxVal">
+                  <connectionPointIn>
+                    <relPosition x="0" y="78"/>
+                    <connection refLocalId="14">
+                      <position x="185" y="881"/>
+                      <position x="135" y="881"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="PeriodSeconds">
+                  <connectionPointIn>
+                    <relPosition x="0" y="117"/>
+                    <connection refLocalId="15">
+                      <position x="185" y="920"/>
+                      <position x="135" y="920"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Out">
+                  <connectionPointOut>
+                    <relPosition x="143" y="39"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="12" executionOrderId="0" height="30" width="111" negated="false">
+              <position x="418" y="827"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="11" formalParameter="Out">
+                  <position x="418" y="842"/>
+                  <position x="328" y="842"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Humidity</expression>
+            </outVariable>
+            <inVariable localId="13" executionOrderId="0" height="30" width="105" negated="false">
+              <position x="30" y="827"/>
+              <connectionPointOut>
+                <relPosition x="105" y="15"/>
+              </connectionPointOut>
+              <expression>55.0</expression>
+            </inVariable>
+            <inVariable localId="14" executionOrderId="0" height="30" width="105" negated="false">
+              <position x="30" y="866"/>
+              <connectionPointOut>
+                <relPosition x="105" y="15"/>
+              </connectionPointOut>
+              <expression>78.0</expression>
+            </inVariable>
+            <inVariable localId="15" executionOrderId="0" height="30" width="105" negated="false">
+              <position x="30" y="905"/>
+              <connectionPointOut>
+                <relPosition x="105" y="15"/>
+              </connectionPointOut>
+              <expression>58</expression>
+            </inVariable>
+            <block localId="16" typeName="GT" executionOrderId="0" height="60" width="67">
+              <position x="231" y="1103"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="18">
+                      <position x="231" y="1133"/>
+                      <position x="132" y="1133"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="22">
+                      <position x="231" y="1153"/>
+                      <position x="208" y="1153"/>
+                      <position x="208" y="1169"/>
+                      <position x="185" y="1169"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="67" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="18" executionOrderId="0" height="30" width="98" negated="false">
+              <position x="40" y="1118"/>
+              <connectionPointOut>
+                <relPosition x="98" y="15"/>
+              </connectionPointOut>
+              <expression>Temperature</expression>
+            </inVariable>
+            <block localId="19" typeName="AND" executionOrderId="0" height="60" width="67">
+              <position x="347" y="1059"/>
+              <inputVariables>
+                <variable formalParameter="IN1" negated="true">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="20">
+                      <position x="347" y="1089"/>
+                      <position x="263" y="1089"/>
+                      <position x="263" y="1074"/>
+                      <position x="145" y="1074"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="16" formalParameter="OUT">
+                      <position x="347" y="1109"/>
+                      <position x="337" y="1109"/>
+                      <position x="337" y="1133"/>
+                      <position x="298" y="1133"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="67" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="20" executionOrderId="0" height="30" width="122" negated="false">
+              <position x="41" y="1059"/>
+              <connectionPointOut>
+                <relPosition x="122" y="15"/>
+              </connectionPointOut>
+              <expression>ControlDisable</expression>
+            </inVariable>
+            <outVariable localId="21" executionOrderId="0" height="30" width="92" negated="false">
+              <position x="468" y="1074"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="19" formalParameter="OUT">
+                  <position x="468" y="1089"/>
+                  <position x="414" y="1089"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Cooler</expression>
+            </outVariable>
+            <inVariable localId="22" executionOrderId="0" height="30" width="162" negated="false">
+              <position x="39" y="1154"/>
+              <connectionPointOut>
+                <relPosition x="162" y="15"/>
+              </connectionPointOut>
+              <expression>TemperatureSetPoint</expression>
+            </inVariable>
+            <block localId="17" typeName="LT" executionOrderId="0" height="60" width="67">
+              <position x="228" y="1278"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="23">
+                      <position x="228" y="1308"/>
+                      <position x="129" y="1308"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="27">
+                      <position x="228" y="1328"/>
+                      <position x="205" y="1328"/>
+                      <position x="205" y="1344"/>
+                      <position x="182" y="1344"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="67" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="23" executionOrderId="0" height="30" width="98" negated="false">
+              <position x="37" y="1293"/>
+              <connectionPointOut>
+                <relPosition x="98" y="15"/>
+              </connectionPointOut>
+              <expression>Temperature</expression>
+            </inVariable>
+            <block localId="24" typeName="AND" executionOrderId="0" height="60" width="67">
+              <position x="344" y="1234"/>
+              <inputVariables>
+                <variable formalParameter="IN1" negated="true">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="25">
+                      <position x="344" y="1264"/>
+                      <position x="260" y="1264"/>
+                      <position x="260" y="1249"/>
+                      <position x="142" y="1249"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="17" formalParameter="OUT">
+                      <position x="344" y="1284"/>
+                      <position x="334" y="1284"/>
+                      <position x="334" y="1308"/>
+                      <position x="295" y="1308"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="67" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="25" executionOrderId="0" height="30" width="122" negated="false">
+              <position x="38" y="1234"/>
+              <connectionPointOut>
+                <relPosition x="122" y="15"/>
+              </connectionPointOut>
+              <expression>ControlDisable</expression>
+            </inVariable>
+            <outVariable localId="26" executionOrderId="0" height="30" width="92" negated="false">
+              <position x="465" y="1249"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="24" formalParameter="OUT">
+                  <position x="465" y="1264"/>
+                  <position x="411" y="1264"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Heater</expression>
+            </outVariable>
+            <inVariable localId="27" executionOrderId="0" height="30" width="162" negated="false">
+              <position x="36" y="1329"/>
+              <connectionPointOut>
+                <relPosition x="162" y="15"/>
+              </connectionPointOut>
+              <expression>TemperatureSetPoint</expression>
+            </inVariable>
+            <comment localId="28" height="67" width="229">
+              <position x="343" y="734"/>
+              <content>
+                <xhtml:p><![CDATA[Simple sensor simulation]]></xhtml:p>
+              </content>
+            </comment>
+            <comment localId="29" height="67" width="229">
+              <position x="37" y="978"/>
+              <content>
+                <xhtml:p><![CDATA[Climate control]]></xhtml:p>
+              </content>
+            </comment>
+            <comment localId="30" height="464" width="773">
+              <position x="14" y="16"/>
+              <content>
+                <xhtml:p><![CDATA[This examples shows how to work with BACnet extension.
+
+Extensions requires native BACnet stack to be installed nearby Beremiz.
+Following directory structure is expected:
+<Parent directory>
+  "beremiz"
+  "BACnet"
+
+If library is installed elsewhere, then place corresponding paths
+in CFLAGS/LDFLAGS in project settings.
+
+For GNU/Linux to install BACnet library in parent directory run following commands:
+$ svn checkout https://svn.code.sf.net/p/bacnet/code/trunk/bacnet-stack/ BACnet
+$ cd BACnet
+$ make
+
+After that BACnet extension is ready to be used in Beremiz projects.
+BACnet stack implementation contains a lot of test tools. They could be useful during 
+debugging and BACnet investigation. See "BACnet/bin/readme.txt" for more information about them.]]></xhtml:p>
+              </content>
+            </comment>
+          </FBD>
+        </body>
+      </pou>
+      <pou name="Simulator" pouType="functionBlock">
+        <interface>
+          <outputVars>
+            <variable name="Out">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+          </outputVars>
+          <inputVars>
+            <variable name="MinVal">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+            <variable name="MaxVal">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+            <variable name="PeriodSeconds">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </inputVars>
+          <localVars>
+            <variable name="TON0">
+              <type>
+                <derived name="TON"/>
+              </type>
+            </variable>
+            <variable name="seconds">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="BaseVal">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+            <variable name="VarVal">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <ST>
+            <xhtml:p><![CDATA[(* pseudo-random variations *)
+TON0(IN := TRUE, PT := T#3120s);
+IF TON0.Q THEN
+  TON0(IN := FALSE);
+END_IF;
+seconds := TIME_TO_INT(TON0.ET);
+
+BaseVal := (MaxVal + MinVal)/2.0;
+VarVal  := (MaxVal-MinVal)*INT_TO_REAL((seconds MOD PeriodSeconds) - (PeriodSeconds/2))/INT_TO_REAL(PeriodSeconds);
+
+Out :=  BaseVal + VarVal;]]></xhtml:p>
+          </ST>
+        </body>
+      </pou>
+    </pous>
+  </types>
+  <instances>
+    <configurations>
+      <configuration name="config">
+        <resource name="resource1">
+          <task name="task0" priority="0" interval="T#20ms">
+            <pouInstance name="instance0" typeName="program0"/>
+          </task>
+        </resource>
+      </configuration>
+    </configurations>
+  </instances>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/README.md	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,7 @@
+Beremiz projects for non-automated testing
+===
+
+This directory contains unsorted projects used as manually executed test while working on particular topics.
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/canopen_master/beremiz.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<BeremizRoot URI_location="LOCAL://">
+  <TargetType/>
+</BeremizRoot>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/canopen_master/canopen@canfestival/baseconfnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<BaseParams Name="canopen" IEC_Channel="0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/canopen_master/canopen@canfestival/confnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CanFestivalInstance/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/canopen_master/canopen@canfestival/master@CanOpenNode/baseconfnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<BaseParams Name="master" IEC_Channel="0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/canopen_master/canopen@canfestival/master@CanOpenNode/confnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CanFestivalNode/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/canopen_master/canopen@canfestival/master@CanOpenNode/eds/Slave_0_0.eds	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,1161 @@
+[FileInfo]
+FileName=Slave_0_0.eds
+FileVersion=1
+FileRevision=1
+EDSVersion=4.0
+Description=
+CreationTime=06:35PM
+CreationDate=10-07-2009
+CreatedBy=CANFestival
+ModificationTime=06:35PM
+ModificationDate=10-07-2009
+ModifiedBy=CANFestival
+
+[DeviceInfo]
+VendorName=CANFestival
+VendorNumber=0x00000000
+ProductName=OD_0_0
+ProductNumber=0x00000000
+RevisionNumber=0x00000000
+BaudRate_10=1
+BaudRate_20=1
+BaudRate_50=1
+BaudRate_125=1
+BaudRate_250=1
+BaudRate_500=1
+BaudRate_800=1
+BaudRate_1000=1
+SimpleBootUpMaster=0
+SimpleBootUpSlave=1
+Granularity=8
+DynamicChannelsSupported=0
+CompactPDO=0
+GroupMessaging=0
+NrOfRXPDO=4
+NrOfTXPDO=4
+LSS_Supported=0
+
+[DummyUsage]
+Dummy0001=0
+Dummy0002=1
+Dummy0003=1
+Dummy0004=1
+Dummy0005=1
+Dummy0006=1
+Dummy0007=1
+
+[Comments]
+Lines=0
+
+[MandatoryObjects]
+SupportedObjects=3
+1=0x1000
+2=0x1001
+3=0x1018
+
+[1000]
+ParameterName=Device Type
+ObjectType=0x7
+DataType=0x0007
+AccessType=ro
+DefaultValue=0
+PDOMapping=0
+
+[1001]
+ParameterName=Error Register
+ObjectType=0x7
+DataType=0x0005
+AccessType=ro
+DefaultValue=0
+PDOMapping=1
+
+[1018]
+ParameterName=Identity
+ObjectType=0x8
+SubNumber=5
+
+[1018sub0]
+ParameterName=Number of Entries
+ObjectType=0x7
+DataType=0x0005
+AccessType=ro
+DefaultValue=4
+PDOMapping=0
+
+[1018sub1]
+ParameterName=Vendor ID
+ObjectType=0x7
+DataType=0x0007
+AccessType=ro
+DefaultValue=0
+PDOMapping=0
+
+[1018sub2]
+ParameterName=Product Code
+ObjectType=0x7
+DataType=0x0007
+AccessType=ro
+DefaultValue=0
+PDOMapping=0
+
+[1018sub3]
+ParameterName=Revision Number
+ObjectType=0x7
+DataType=0x0007
+AccessType=ro
+DefaultValue=0
+PDOMapping=0
+
+[1018sub4]
+ParameterName=Serial Number
+ObjectType=0x7
+DataType=0x0007
+AccessType=ro
+DefaultValue=0
+PDOMapping=0
+
+[OptionalObjects]
+SupportedObjects=17
+1=0x1200
+2=0x1400
+3=0x1401
+4=0x1402
+5=0x1403
+6=0x1600
+7=0x1601
+8=0x1602
+9=0x1603
+10=0x1800
+11=0x1801
+12=0x1802
+13=0x1803
+14=0x1A00
+15=0x1A01
+16=0x1A02
+17=0x1A03
+
+[1200]
+ParameterName=Server SDO Parameter
+ObjectType=0x8
+SubNumber=3
+
+[1200sub0]
+ParameterName=Number of Entries
+ObjectType=0x7
+DataType=0x0005
+AccessType=ro
+DefaultValue=2
+PDOMapping=0
+
+[1200sub1]
+ParameterName=COB ID Client to Server (Receive SDO)
+ObjectType=0x7
+DataType=0x0007
+AccessType=ro
+DefaultValue=$NODEID+0x600
+PDOMapping=0
+
+[1200sub2]
+ParameterName=COB ID Server to Client (Transmit SDO)
+ObjectType=0x7
+DataType=0x0007
+AccessType=ro
+DefaultValue=$NODEID+0x580
+PDOMapping=0
+
+[1400]
+ParameterName=Receive PDO 1 Parameter
+ObjectType=0x8
+SubNumber=5
+
+[1400sub0]
+ParameterName=Highest SubIndex Supported
+ObjectType=0x7
+DataType=0x0005
+AccessType=ro
+DefaultValue=5
+PDOMapping=0
+
+[1400sub1]
+ParameterName=COB ID used by PDO
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=$NODEID+0x200
+PDOMapping=0
+
+[1400sub2]
+ParameterName=Transmission Type
+ObjectType=0x7
+DataType=0x0005
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1400sub3]
+ParameterName=Inhibit Time
+ObjectType=0x7
+DataType=0x0006
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1400sub5]
+ParameterName=Event Timer
+ObjectType=0x7
+DataType=0x0006
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1401]
+ParameterName=Receive PDO 2 Parameter
+ObjectType=0x8
+SubNumber=5
+
+[1401sub0]
+ParameterName=Highest SubIndex Supported
+ObjectType=0x7
+DataType=0x0005
+AccessType=ro
+DefaultValue=5
+PDOMapping=0
+
+[1401sub1]
+ParameterName=COB ID used by PDO
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=$NODEID+0x300
+PDOMapping=0
+
+[1401sub2]
+ParameterName=Transmission Type
+ObjectType=0x7
+DataType=0x0005
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1401sub3]
+ParameterName=Inhibit Time
+ObjectType=0x7
+DataType=0x0006
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1401sub5]
+ParameterName=Event Timer
+ObjectType=0x7
+DataType=0x0006
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1402]
+ParameterName=Receive PDO 3 Parameter
+ObjectType=0x8
+SubNumber=5
+
+[1402sub0]
+ParameterName=Highest SubIndex Supported
+ObjectType=0x7
+DataType=0x0005
+AccessType=ro
+DefaultValue=5
+PDOMapping=0
+
+[1402sub1]
+ParameterName=COB ID used by PDO
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=$NODEID+0x400
+PDOMapping=0
+
+[1402sub2]
+ParameterName=Transmission Type
+ObjectType=0x7
+DataType=0x0005
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1402sub3]
+ParameterName=Inhibit Time
+ObjectType=0x7
+DataType=0x0006
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1402sub5]
+ParameterName=Event Timer
+ObjectType=0x7
+DataType=0x0006
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1403]
+ParameterName=Receive PDO 4 Parameter
+ObjectType=0x8
+SubNumber=5
+
+[1403sub0]
+ParameterName=Highest SubIndex Supported
+ObjectType=0x7
+DataType=0x0005
+AccessType=ro
+DefaultValue=5
+PDOMapping=0
+
+[1403sub1]
+ParameterName=COB ID used by PDO
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=$NODEID+0x500
+PDOMapping=0
+
+[1403sub2]
+ParameterName=Transmission Type
+ObjectType=0x7
+DataType=0x0005
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1403sub3]
+ParameterName=Inhibit Time
+ObjectType=0x7
+DataType=0x0006
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1403sub5]
+ParameterName=Event Timer
+ObjectType=0x7
+DataType=0x0006
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1600]
+ParameterName=Receive PDO 1 Mapping
+ObjectType=0x9
+SubNumber=9
+
+[1600sub0]
+ParameterName=Number of Entries
+ObjectType=0x7
+DataType=0x0005
+AccessType=rw
+DefaultValue=8
+PDOMapping=0
+
+[1600sub1]
+ParameterName=PDO 1 Mapping for an application object 1
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1600sub2]
+ParameterName=PDO 1 Mapping for an application object 2
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1600sub3]
+ParameterName=PDO 1 Mapping for an application object 3
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1600sub4]
+ParameterName=PDO 1 Mapping for an application object 4
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1600sub5]
+ParameterName=PDO 1 Mapping for an application object 5
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1600sub6]
+ParameterName=PDO 1 Mapping for an application object 6
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1600sub7]
+ParameterName=PDO 1 Mapping for an application object 7
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1600sub8]
+ParameterName=PDO 1 Mapping for an application object 8
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1601]
+ParameterName=Receive PDO 2 Mapping
+ObjectType=0x9
+SubNumber=9
+
+[1601sub0]
+ParameterName=Number of Entries
+ObjectType=0x7
+DataType=0x0005
+AccessType=rw
+DefaultValue=8
+PDOMapping=0
+
+[1601sub1]
+ParameterName=PDO 2 Mapping for an application object 1
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1601sub2]
+ParameterName=PDO 2 Mapping for an application object 2
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1601sub3]
+ParameterName=PDO 2 Mapping for an application object 3
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1601sub4]
+ParameterName=PDO 2 Mapping for an application object 4
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1601sub5]
+ParameterName=PDO 2 Mapping for an application object 5
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1601sub6]
+ParameterName=PDO 2 Mapping for an application object 6
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1601sub7]
+ParameterName=PDO 2 Mapping for an application object 7
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1601sub8]
+ParameterName=PDO 2 Mapping for an application object 8
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1602]
+ParameterName=Receive PDO 3 Mapping
+ObjectType=0x9
+SubNumber=9
+
+[1602sub0]
+ParameterName=Number of Entries
+ObjectType=0x7
+DataType=0x0005
+AccessType=rw
+DefaultValue=8
+PDOMapping=0
+
+[1602sub1]
+ParameterName=PDO 3 Mapping for an application object 1
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1602sub2]
+ParameterName=PDO 3 Mapping for an application object 2
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1602sub3]
+ParameterName=PDO 3 Mapping for an application object 3
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1602sub4]
+ParameterName=PDO 3 Mapping for an application object 4
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1602sub5]
+ParameterName=PDO 3 Mapping for an application object 5
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1602sub6]
+ParameterName=PDO 3 Mapping for an application object 6
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1602sub7]
+ParameterName=PDO 3 Mapping for an application object 7
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1602sub8]
+ParameterName=PDO 3 Mapping for an application object 8
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1603]
+ParameterName=Receive PDO 4 Mapping
+ObjectType=0x9
+SubNumber=9
+
+[1603sub0]
+ParameterName=Number of Entries
+ObjectType=0x7
+DataType=0x0005
+AccessType=rw
+DefaultValue=8
+PDOMapping=0
+
+[1603sub1]
+ParameterName=PDO 4 Mapping for an application object 1
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1603sub2]
+ParameterName=PDO 4 Mapping for an application object 2
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1603sub3]
+ParameterName=PDO 4 Mapping for an application object 3
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1603sub4]
+ParameterName=PDO 4 Mapping for an application object 4
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1603sub5]
+ParameterName=PDO 4 Mapping for an application object 5
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1603sub6]
+ParameterName=PDO 4 Mapping for an application object 6
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1603sub7]
+ParameterName=PDO 4 Mapping for an application object 7
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1603sub8]
+ParameterName=PDO 4 Mapping for an application object 8
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1800]
+ParameterName=Transmit PDO 1 Parameter
+ObjectType=0x8
+SubNumber=5
+
+[1800sub0]
+ParameterName=Highest SubIndex Supported
+ObjectType=0x7
+DataType=0x0005
+AccessType=ro
+DefaultValue=5
+PDOMapping=0
+
+[1800sub1]
+ParameterName=COB ID used by PDO
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=$NODEID+0x180
+PDOMapping=0
+
+[1800sub2]
+ParameterName=Transmission Type
+ObjectType=0x7
+DataType=0x0005
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1800sub3]
+ParameterName=Inhibit Time
+ObjectType=0x7
+DataType=0x0006
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1800sub5]
+ParameterName=Event Timer
+ObjectType=0x7
+DataType=0x0006
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1801]
+ParameterName=Transmit PDO 2 Parameter
+ObjectType=0x8
+SubNumber=5
+
+[1801sub0]
+ParameterName=Highest SubIndex Supported
+ObjectType=0x7
+DataType=0x0005
+AccessType=ro
+DefaultValue=5
+PDOMapping=0
+
+[1801sub1]
+ParameterName=COB ID used by PDO
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=$NODEID+0x280
+PDOMapping=0
+
+[1801sub2]
+ParameterName=Transmission Type
+ObjectType=0x7
+DataType=0x0005
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1801sub3]
+ParameterName=Inhibit Time
+ObjectType=0x7
+DataType=0x0006
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1801sub5]
+ParameterName=Event Timer
+ObjectType=0x7
+DataType=0x0006
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1802]
+ParameterName=Transmit PDO 3 Parameter
+ObjectType=0x8
+SubNumber=5
+
+[1802sub0]
+ParameterName=Highest SubIndex Supported
+ObjectType=0x7
+DataType=0x0005
+AccessType=ro
+DefaultValue=5
+PDOMapping=0
+
+[1802sub1]
+ParameterName=COB ID used by PDO
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=$NODEID+0x380
+PDOMapping=0
+
+[1802sub2]
+ParameterName=Transmission Type
+ObjectType=0x7
+DataType=0x0005
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1802sub3]
+ParameterName=Inhibit Time
+ObjectType=0x7
+DataType=0x0006
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1802sub5]
+ParameterName=Event Timer
+ObjectType=0x7
+DataType=0x0006
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1803]
+ParameterName=Transmit PDO 4 Parameter
+ObjectType=0x8
+SubNumber=5
+
+[1803sub0]
+ParameterName=Highest SubIndex Supported
+ObjectType=0x7
+DataType=0x0005
+AccessType=ro
+DefaultValue=5
+PDOMapping=0
+
+[1803sub1]
+ParameterName=COB ID used by PDO
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=$NODEID+0x480
+PDOMapping=0
+
+[1803sub2]
+ParameterName=Transmission Type
+ObjectType=0x7
+DataType=0x0005
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1803sub3]
+ParameterName=Inhibit Time
+ObjectType=0x7
+DataType=0x0006
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1803sub5]
+ParameterName=Event Timer
+ObjectType=0x7
+DataType=0x0006
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A00]
+ParameterName=Transmit PDO 1 Mapping
+ObjectType=0x9
+SubNumber=9
+
+[1A00sub0]
+ParameterName=Number of Entries
+ObjectType=0x7
+DataType=0x0005
+AccessType=rw
+DefaultValue=8
+PDOMapping=0
+
+[1A00sub1]
+ParameterName=PDO 1 Mapping for a process data variable 1
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A00sub2]
+ParameterName=PDO 1 Mapping for a process data variable 2
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A00sub3]
+ParameterName=PDO 1 Mapping for a process data variable 3
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A00sub4]
+ParameterName=PDO 1 Mapping for a process data variable 4
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A00sub5]
+ParameterName=PDO 1 Mapping for a process data variable 5
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A00sub6]
+ParameterName=PDO 1 Mapping for a process data variable 6
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A00sub7]
+ParameterName=PDO 1 Mapping for a process data variable 7
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A00sub8]
+ParameterName=PDO 1 Mapping for a process data variable 8
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A01]
+ParameterName=Transmit PDO 2 Mapping
+ObjectType=0x9
+SubNumber=9
+
+[1A01sub0]
+ParameterName=Number of Entries
+ObjectType=0x7
+DataType=0x0005
+AccessType=rw
+DefaultValue=8
+PDOMapping=0
+
+[1A01sub1]
+ParameterName=PDO 2 Mapping for a process data variable 1
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A01sub2]
+ParameterName=PDO 2 Mapping for a process data variable 2
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A01sub3]
+ParameterName=PDO 2 Mapping for a process data variable 3
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A01sub4]
+ParameterName=PDO 2 Mapping for a process data variable 4
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A01sub5]
+ParameterName=PDO 2 Mapping for a process data variable 5
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A01sub6]
+ParameterName=PDO 2 Mapping for a process data variable 6
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A01sub7]
+ParameterName=PDO 2 Mapping for a process data variable 7
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A01sub8]
+ParameterName=PDO 2 Mapping for a process data variable 8
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A02]
+ParameterName=Transmit PDO 3 Mapping
+ObjectType=0x9
+SubNumber=9
+
+[1A02sub0]
+ParameterName=Number of Entries
+ObjectType=0x7
+DataType=0x0005
+AccessType=rw
+DefaultValue=8
+PDOMapping=0
+
+[1A02sub1]
+ParameterName=PDO 3 Mapping for a process data variable 1
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A02sub2]
+ParameterName=PDO 3 Mapping for a process data variable 2
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A02sub3]
+ParameterName=PDO 3 Mapping for a process data variable 3
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A02sub4]
+ParameterName=PDO 3 Mapping for a process data variable 4
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A02sub5]
+ParameterName=PDO 3 Mapping for a process data variable 5
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A02sub6]
+ParameterName=PDO 3 Mapping for a process data variable 6
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A02sub7]
+ParameterName=PDO 3 Mapping for a process data variable 7
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A02sub8]
+ParameterName=PDO 3 Mapping for a process data variable 8
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A03]
+ParameterName=Transmit PDO 4 Mapping
+ObjectType=0x9
+SubNumber=9
+
+[1A03sub0]
+ParameterName=Number of Entries
+ObjectType=0x7
+DataType=0x0005
+AccessType=rw
+DefaultValue=8
+PDOMapping=0
+
+[1A03sub1]
+ParameterName=PDO 4 Mapping for a process data variable 1
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A03sub2]
+ParameterName=PDO 4 Mapping for a process data variable 2
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A03sub3]
+ParameterName=PDO 4 Mapping for a process data variable 3
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A03sub4]
+ParameterName=PDO 4 Mapping for a process data variable 4
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A03sub5]
+ParameterName=PDO 4 Mapping for a process data variable 5
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A03sub6]
+ParameterName=PDO 4 Mapping for a process data variable 6
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A03sub7]
+ParameterName=PDO 4 Mapping for a process data variable 7
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[1A03sub8]
+ParameterName=PDO 4 Mapping for a process data variable 8
+ObjectType=0x7
+DataType=0x0007
+AccessType=rw
+DefaultValue=0
+PDOMapping=0
+
+[ManufacturerObjects]
+SupportedObjects=2
+1=0x2000
+2=0x2001
+
+[2000]
+ParameterName=OutVar
+ObjectType=0x7
+DataType=0x0003
+AccessType=rw
+DefaultValue=0
+PDOMapping=1
+
+[2001]
+ParameterName=InVar
+ObjectType=0x7
+DataType=0x0003
+AccessType=rw
+DefaultValue=0
+PDOMapping=1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/canopen_master/canopen@canfestival/master@CanOpenNode/master.od	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,224 @@
+<?xml version="1.0"?>
+<!DOCTYPE PyObject SYSTEM "PyObjects.dtd">
+<PyObject module="node" class="Node" id="173548044">
+<attr name="Profile" type="dict" id="173547276" >
+</attr>
+<attr name="Description" type="string" value="" />
+<attr name="Dictionary" type="dict" id="173547004" >
+  <entry>
+    <key type="numeric" value="4096" />
+    <val type="numeric" value="0" />
+  </entry>
+  <entry>
+    <key type="numeric" value="4097" />
+    <val type="numeric" value="0" />
+  </entry>
+  <entry>
+    <key type="numeric" value="4120" />
+    <val type="list" id="172243596" >
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+</attr>
+<attr name="SpecificMenu" type="list" id="172243852" >
+</attr>
+<attr name="ParamsDictionary" type="dict" id="173551796" >
+</attr>
+<attr name="UserMapping" type="dict" id="173551932" >
+</attr>
+<attr name="DS302" type="dict" id="172206524" >
+  <entry>
+    <key type="numeric" value="7968" />
+    <val type="dict" id="172959508" >
+      <entry>
+        <key type="string" value="need" />
+        <val type="False" value="" />
+      </entry>
+      <entry>
+        <key type="string" value="values" />
+        <val type="list" id="172244812" >
+          <item type="dict" id="173546596" >
+            <entry>
+              <key type="string" value="access" />
+              <val type="string" value="ro" />
+            </entry>
+            <entry>
+              <key type="string" value="pdo" />
+              <val type="False" value="" />
+            </entry>
+            <entry>
+              <key type="string" value="type" />
+              <val type="numeric" value="5" />
+            </entry>
+            <entry>
+              <key type="string" value="name" />
+              <val type="string" value="Number of Entries" />
+            </entry>
+          </item>
+          <item type="dict" id="173552204" >
+            <entry>
+              <key type="string" value="access" />
+              <val type="string" value="rw" />
+            </entry>
+            <entry>
+              <key type="string" value="pdo" />
+              <val type="False" value="" />
+            </entry>
+            <entry>
+              <key type="string" value="type" />
+              <val type="numeric" value="15" />
+            </entry>
+            <entry>
+              <key type="string" value="name" />
+              <val type="string" value="Store DCF for node %d[(sub)]" />
+            </entry>
+            <entry>
+              <key type="string" value="nbmax" />
+              <val type="numeric" value="127" />
+            </entry>
+          </item>
+        </val>
+      </entry>
+      <entry>
+        <key type="string" value="name" />
+        <val type="string" value="Store DCF" />
+      </entry>
+      <entry>
+        <key type="string" value="struct" />
+        <val type="numeric" value="7" />
+      </entry>
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="7969" />
+    <val type="dict" id="173546732" >
+      <entry>
+        <key type="string" value="need" />
+        <val type="False" value="" />
+      </entry>
+      <entry>
+        <key type="string" value="values" />
+        <val type="list" id="172253420" >
+          <item type="dict" id="173552612" >
+            <entry>
+              <key type="string" value="access" />
+              <val type="string" value="ro" />
+            </entry>
+            <entry>
+              <key type="string" value="pdo" />
+              <val type="False" value="" />
+            </entry>
+            <entry>
+              <key type="string" value="type" />
+              <val type="numeric" value="5" />
+            </entry>
+            <entry>
+              <key type="string" value="name" />
+              <val type="string" value="Number of Entries" />
+            </entry>
+          </item>
+          <item type="dict" id="173546324" >
+            <entry>
+              <key type="string" value="access" />
+              <val type="string" value="rw" />
+            </entry>
+            <entry>
+              <key type="string" value="pdo" />
+              <val type="False" value="" />
+            </entry>
+            <entry>
+              <key type="string" value="type" />
+              <val type="numeric" value="2" />
+            </entry>
+            <entry>
+              <key type="string" value="name" />
+              <val type="string" value="Storage Format for Node %d[(sub)]" />
+            </entry>
+            <entry>
+              <key type="string" value="nbmax" />
+              <val type="numeric" value="127" />
+            </entry>
+          </item>
+        </val>
+      </entry>
+      <entry>
+        <key type="string" value="name" />
+        <val type="string" value="Storage Format" />
+      </entry>
+      <entry>
+        <key type="string" value="struct" />
+        <val type="numeric" value="7" />
+      </entry>
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="7970" />
+    <val type="dict" id="173552476" >
+      <entry>
+        <key type="string" value="need" />
+        <val type="False" value="" />
+      </entry>
+      <entry>
+        <key type="string" value="values" />
+        <val type="list" id="172253484" >
+          <item type="dict" id="173552884" >
+            <entry>
+              <key type="string" value="access" />
+              <val type="string" value="ro" />
+            </entry>
+            <entry>
+              <key type="string" value="pdo" />
+              <val type="False" value="" />
+            </entry>
+            <entry>
+              <key type="string" value="type" />
+              <val type="numeric" value="5" />
+            </entry>
+            <entry>
+              <key type="string" value="name" />
+              <val type="string" value="Number of Entries" />
+            </entry>
+          </item>
+          <item type="dict" id="173552748" >
+            <entry>
+              <key type="string" value="access" />
+              <val type="string" value="rw" />
+            </entry>
+            <entry>
+              <key type="string" value="pdo" />
+              <val type="False" value="" />
+            </entry>
+            <entry>
+              <key type="string" value="type" />
+              <val type="numeric" value="15" />
+            </entry>
+            <entry>
+              <key type="string" value="name" />
+              <val type="string" value="Concise DCF for Node %d[(sub)]" />
+            </entry>
+            <entry>
+              <key type="string" value="nbmax" />
+              <val type="numeric" value="127" />
+            </entry>
+          </item>
+        </val>
+      </entry>
+      <entry>
+        <key type="string" value="name" />
+        <val type="string" value="Concise DCF" />
+      </entry>
+      <entry>
+        <key type="string" value="struct" />
+        <val type="numeric" value="7" />
+      </entry>
+    </val>
+  </entry>
+</attr>
+<attr name="ProfileName" type="string" value="None" />
+<attr name="Type" type="string" value="master" />
+<attr name="ID" type="numeric" value="0" />
+<attr name="Name" type="string" value="MasterNode" />
+</PyObject>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/canopen_master/canopen@canfestival/master@CanOpenNode/nodelist.cpj	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,7 @@
+[TOPOLOGY]
+NetName=None
+Nodes=0x01
+Node2Present=0x01
+Node2Name=SlaveNode
+Node2DCFName=Slave_0_0.eds
+EDSBaseName=eds
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/canopen_master/plc.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,113 @@
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
+  <fileHeader companyName="beremiz" productName="beremiz" productVersion="1" creationDateTime="2008-06-24T18:44:00"/>
+  <contentHeader name="canopen_master" modificationDateTime="2018-09-26T13:31:52" language="en-US">
+    <coordinateInfo>
+      <fbd>
+        <scaling x="0" y="0"/>
+      </fbd>
+      <ld>
+        <scaling x="0" y="0"/>
+      </ld>
+      <sfc>
+        <scaling x="0" y="0"/>
+      </sfc>
+    </coordinateInfo>
+  </contentHeader>
+  <types>
+    <dataTypes/>
+    <pous>
+      <pou name="test_main" pouType="program">
+        <interface>
+          <localVars>
+            <variable name="PLC_OUT" address="%QW0.0.2.8193.0">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="PLC_IN" address="%IW0.0.2.8192.0">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <outVariable localId="1" height="29" width="80" executionOrderId="0" negated="false">
+              <position x="362" y="139"/>
+              <connectionPointIn>
+                <relPosition x="0" y="14"/>
+                <connection refLocalId="4" formalParameter="OUT">
+                  <position x="362" y="153"/>
+                  <position x="299" y="153"/>
+                </connection>
+              </connectionPointIn>
+              <expression>PLC_OUT</expression>
+            </outVariable>
+            <inVariable localId="2" height="29" width="20">
+              <position x="100" y="115"/>
+              <connectionPointOut>
+                <relPosition x="20" y="14"/>
+              </connectionPointOut>
+              <expression>1</expression>
+            </inVariable>
+            <block localId="4" width="75" height="60" typeName="ADD">
+              <position x="224" y="123"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="2">
+                      <position x="224" y="153"/>
+                      <position x="183" y="153"/>
+                      <position x="183" y="129"/>
+                      <position x="120" y="129"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="5">
+                      <position x="224" y="173"/>
+                      <position x="199" y="173"/>
+                      <position x="199" y="201"/>
+                      <position x="174" y="201"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="75" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="5" height="29" width="70">
+              <position x="104" y="187"/>
+              <connectionPointOut>
+                <relPosition x="70" y="14"/>
+              </connectionPointOut>
+              <expression>PLC_IN</expression>
+            </inVariable>
+          </FBD>
+        </body>
+      </pou>
+    </pous>
+  </types>
+  <instances>
+    <configurations>
+      <configuration name="conf">
+        <resource name="res">
+          <task name="tache" interval="t#50ms" priority="0">
+            <pouInstance name="toto" typeName="test_main"/>
+          </task>
+        </resource>
+      </configuration>
+    </configurations>
+  </instances>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/canopen_slave/beremiz.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<BeremizRoot URI_location="LOCAL://">
+  <TargetType/>
+</BeremizRoot>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/canopen_slave/canopen@canfestival/baseconfnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<BaseParams Name="canopen" IEC_Channel="0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/canopen_slave/canopen@canfestival/confnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CanFestivalInstance/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/canopen_slave/canopen@canfestival/slave@CanOpenSlave/baseconfnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<BaseParams Name="slave" IEC_Channel="0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/canopen_slave/canopen@canfestival/slave@CanOpenSlave/confnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CanFestivalSlaveNode/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/canopen_slave/canopen@canfestival/slave@CanOpenSlave/slave.eds	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,169 @@
+[FileInfo]
+FileName=slave.eds
+FileVersion=1
+FileRevision=1
+EDSVersion=4.0
+Description=
+CreationTime=09:10AM
+CreationDate=10-27-2008
+CreatedBy=CANFestival
+ModificationTime=09:10AM
+ModificationDate=10-27-2008
+ModifiedBy=CANFestival
+
+[DeviceInfo]
+VendorName=CANFestival
+VendorNumber=0x00000000
+ProductName=SlaveNode
+ProductNumber=0x00000000
+RevisionNumber=0x00000000
+BaudRate_10=1
+BaudRate_20=1
+BaudRate_50=1
+BaudRate_125=1
+BaudRate_250=1
+BaudRate_500=1
+BaudRate_800=1
+BaudRate_1000=1
+SimpleBootUpMaster=0
+SimpleBootUpSlave=1
+Granularity=8
+DynamicChannelsSupported=0
+CompactPDO=0
+GroupMessaging=0
+NrOfRXPDO=4
+NrOfTXPDO=4
+LSS_Supported=0
+
+[DummyUsage]
+Dummy0001=0
+Dummy0002=1
+Dummy0003=1
+Dummy0004=1
+Dummy0005=1
+Dummy0006=1
+Dummy0007=1
+
+[Comments]
+Lines=0
+
+[MandatoryObjects]
+SupportedObjects=3
+1=0x1000
+2=0x1001
+3=0x1018
+
+[1000]
+ParameterName=Device Type
+ObjectType=0x7
+DataType=0x0007
+AccessType=ro
+DefaultValue=0
+PDOMapping=0
+
+[1001]
+ParameterName=Error Register
+ObjectType=0x7
+DataType=0x0005
+AccessType=ro
+DefaultValue=0
+PDOMapping=1
+
+[1018]
+ParameterName=Identity
+ObjectType=0x8
+SubNumber=5
+
+[1018sub0]
+ParameterName=Number of Entries
+ObjectType=0x7
+DataType=0x0005
+AccessType=ro
+DefaultValue=4
+PDOMapping=0
+
+[1018sub1]
+ParameterName=Vendor ID
+ObjectType=0x7
+DataType=0x0007
+AccessType=ro
+DefaultValue=0
+PDOMapping=0
+
+[1018sub2]
+ParameterName=Product Code
+ObjectType=0x7
+DataType=0x0007
+AccessType=ro
+DefaultValue=0
+PDOMapping=0
+
+[1018sub3]
+ParameterName=Revision Number
+ObjectType=0x7
+DataType=0x0007
+AccessType=ro
+DefaultValue=0
+PDOMapping=0
+
+[1018sub4]
+ParameterName=Serial Number
+ObjectType=0x7
+DataType=0x0007
+AccessType=ro
+DefaultValue=0
+PDOMapping=0
+
+[OptionalObjects]
+SupportedObjects=1
+1=0x1200
+
+[1200]
+ParameterName=Server SDO Parameter
+ObjectType=0x8
+SubNumber=3
+
+[1200sub0]
+ParameterName=Number of Entries
+ObjectType=0x7
+DataType=0x0005
+AccessType=ro
+DefaultValue=2
+PDOMapping=0
+
+[1200sub1]
+ParameterName=COB ID Client to Server (Receive SDO)
+ObjectType=0x7
+DataType=0x0007
+AccessType=ro
+DefaultValue=$NODEID+0x600
+PDOMapping=0
+
+[1200sub2]
+ParameterName=COB ID Server to Client (Transmit SDO)
+ObjectType=0x7
+DataType=0x0007
+AccessType=ro
+DefaultValue=$NODEID+0x580
+PDOMapping=0
+
+[ManufacturerObjects]
+SupportedObjects=2
+1=0x2000
+2=0x2001
+
+[2000]
+ParameterName=OutVar
+ObjectType=0x7
+DataType=0x0003
+AccessType=rw
+DefaultValue=0
+PDOMapping=1
+
+[2001]
+ParameterName=InVar
+ObjectType=0x7
+DataType=0x0003
+AccessType=rw
+DefaultValue=0
+PDOMapping=1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/canopen_slave/canopen@canfestival/slave@CanOpenSlave/slave.od	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,317 @@
+<?xml version="1.0"?>
+<!DOCTYPE PyObject SYSTEM "PyObjects.dtd">
+<PyObject module="node" class="Node" id="157806348">
+<attr name="Profile" type="dict" id="157588716" >
+</attr>
+<attr name="Description" type="string" value="" />
+<attr name="Dictionary" type="dict" id="157588580" >
+  <entry>
+    <key type="numeric" value="4096" />
+    <val type="numeric" value="0" />
+  </entry>
+  <entry>
+    <key type="numeric" value="4097" />
+    <val type="numeric" value="0" />
+  </entry>
+  <entry>
+    <key type="numeric" value="5122" />
+    <val type="list" id="160478380" >
+      <item type="string" value="{True:&quot;$NODEID+0x%X00&quot;%(base+2),False:0x80000000}[base&lt;4]" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="5123" />
+    <val type="list" id="158303244" >
+      <item type="string" value="{True:&quot;$NODEID+0x%X00&quot;%(base+2),False:0x80000000}[base&lt;4]" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="8192" />
+    <val type="numeric" value="0" />
+  </entry>
+  <entry>
+    <key type="numeric" value="8193" />
+    <val type="numeric" value="0" />
+  </entry>
+  <entry>
+    <key type="numeric" value="5634" />
+    <val type="list" id="158305356" >
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="5635" />
+    <val type="list" id="158305388" >
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="6146" />
+    <val type="list" id="158305420" >
+      <item type="string" value="{True:&quot;$NODEID+0x%X80&quot;%(base+1),False:0x80000000}[base&lt;4]" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="6658" />
+    <val type="list" id="158305932" >
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="6147" />
+    <val type="list" id="158305516" >
+      <item type="string" value="{True:&quot;$NODEID+0x%X80&quot;%(base+1),False:0x80000000}[base&lt;4]" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="4608" />
+    <val type="list" id="158305068" >
+      <item type="string" value="&quot;$NODEID+0x600&quot;" />
+      <item type="string" value="&quot;$NODEID+0x580&quot;" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="4120" />
+    <val type="list" id="158304940" >
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="5120" />
+    <val type="list" id="158051500" >
+      <item type="string" value="{True:&quot;$NODEID+0x%X00&quot;%(base+2),False:0x80000000}[base&lt;4]" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="6659" />
+    <val type="list" id="158052300" >
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="5632" />
+    <val type="list" id="158049740" >
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="5121" />
+    <val type="list" id="158048716" >
+      <item type="string" value="{True:&quot;$NODEID+0x%X00&quot;%(base+2),False:0x80000000}[base&lt;4]" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="6144" />
+    <val type="list" id="158048428" >
+      <item type="string" value="{True:&quot;$NODEID+0x%X80&quot;%(base+1),False:0x80000000}[base&lt;4]" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="5633" />
+    <val type="list" id="158052172" >
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="6656" />
+    <val type="list" id="158052204" >
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="6145" />
+    <val type="list" id="158052108" >
+      <item type="string" value="{True:&quot;$NODEID+0x%X80&quot;%(base+1),False:0x80000000}[base&lt;4]" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="6657" />
+    <val type="list" id="158048588" >
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+      <item type="numeric" value="0" />
+    </val>
+  </entry>
+</attr>
+<attr name="SpecificMenu" type="list" id="158048396" >
+</attr>
+<attr name="ParamsDictionary" type="dict" id="157588308" >
+</attr>
+<attr name="UserMapping" type="dict" id="157588852" >
+  <entry>
+    <key type="numeric" value="8192" />
+    <val type="dict" id="157602516" >
+      <entry>
+        <key type="string" value="need" />
+        <val type="False" value="" />
+      </entry>
+      <entry>
+        <key type="string" value="values" />
+        <val type="list" id="158052332" >
+          <item type="dict" id="157586676" >
+            <entry>
+              <key type="string" value="access" />
+              <val type="string" value="rw" />
+            </entry>
+            <entry>
+              <key type="string" value="pdo" />
+              <val type="True" value="" />
+            </entry>
+            <entry>
+              <key type="string" value="type" />
+              <val type="numeric" value="3" />
+            </entry>
+            <entry>
+              <key type="string" value="name" />
+              <val type="string">OutVar</val>
+            </entry>
+          </item>
+        </val>
+      </entry>
+      <entry>
+        <key type="string" value="name" />
+        <val type="string">OutVar</val>
+      </entry>
+      <entry>
+        <key type="string" value="struct" />
+        <val type="numeric" value="1" />
+      </entry>
+    </val>
+  </entry>
+  <entry>
+    <key type="numeric" value="8193" />
+    <val type="dict" id="157535468" >
+      <entry>
+        <key type="string" value="need" />
+        <val type="False" value="" />
+      </entry>
+      <entry>
+        <key type="string" value="values" />
+        <val type="list" id="158305004" >
+          <item type="dict" id="158343620" >
+            <entry>
+              <key type="string" value="access" />
+              <val type="string" value="rw" />
+            </entry>
+            <entry>
+              <key type="string" value="pdo" />
+              <val type="True" value="" />
+            </entry>
+            <entry>
+              <key type="string" value="type" />
+              <val type="numeric" value="3" />
+            </entry>
+            <entry>
+              <key type="string" value="name" />
+              <val type="string">InVar</val>
+            </entry>
+          </item>
+        </val>
+      </entry>
+      <entry>
+        <key type="string" value="name" />
+        <val type="string">InVar</val>
+      </entry>
+      <entry>
+        <key type="string" value="struct" />
+        <val type="numeric" value="1" />
+      </entry>
+    </val>
+  </entry>
+</attr>
+<attr name="DS302" type="dict" id="158328188" >
+</attr>
+<attr name="ProfileName" type="string" value="None" />
+<attr name="Type" type="string" value="slave" />
+<attr name="ID" type="numeric" value="0" />
+<attr name="Name" type="string" value="SlaveNode" />
+</PyObject>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/canopen_slave/plc.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,113 @@
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
+  <fileHeader companyName="beremiz" productName="beremiz" productVersion="1" creationDateTime="2008-06-24T18:44:00"/>
+  <contentHeader name="canopen_slave" modificationDateTime="2018-09-26T13:32:23" language="en-US">
+    <coordinateInfo>
+      <fbd>
+        <scaling x="0" y="0"/>
+      </fbd>
+      <ld>
+        <scaling x="0" y="0"/>
+      </ld>
+      <sfc>
+        <scaling x="0" y="0"/>
+      </sfc>
+    </coordinateInfo>
+  </contentHeader>
+  <types>
+    <dataTypes/>
+    <pous>
+      <pou name="test_main" pouType="program">
+        <interface>
+          <localVars>
+            <variable name="outvar" address="%QW0.0.8192.0">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="invar" address="%IW0.0.8193.0">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <outVariable localId="1" height="29" width="80" executionOrderId="0" negated="false">
+              <position x="362" y="139"/>
+              <connectionPointIn>
+                <relPosition x="0" y="14"/>
+                <connection refLocalId="4" formalParameter="OUT">
+                  <position x="362" y="153"/>
+                  <position x="299" y="153"/>
+                </connection>
+              </connectionPointIn>
+              <expression>outvar</expression>
+            </outVariable>
+            <inVariable localId="2" height="29" width="20">
+              <position x="100" y="115"/>
+              <connectionPointOut>
+                <relPosition x="20" y="14"/>
+              </connectionPointOut>
+              <expression>1</expression>
+            </inVariable>
+            <block localId="4" width="75" height="60" typeName="ADD">
+              <position x="224" y="123"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="2">
+                      <position x="224" y="153"/>
+                      <position x="183" y="153"/>
+                      <position x="183" y="129"/>
+                      <position x="120" y="129"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="5">
+                      <position x="224" y="173"/>
+                      <position x="187" y="173"/>
+                      <position x="187" y="187"/>
+                      <position x="150" y="187"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="75" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="5" height="29" width="60">
+              <position x="90" y="173"/>
+              <connectionPointOut>
+                <relPosition x="60" y="14"/>
+              </connectionPointOut>
+              <expression>invar</expression>
+            </inVariable>
+          </FBD>
+        </body>
+      </pou>
+    </pous>
+  </types>
+  <instances>
+    <configurations>
+      <configuration name="conf">
+        <resource name="res">
+          <task name="tache" interval="T#10ms" priority="0">
+            <pouInstance name="toto" typeName="test_main"/>
+          </task>
+        </resource>
+      </configuration>
+    </configurations>
+  </instances>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/genericmake/beremiz.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <TargetType>
+    <Generic Command="make -C %(buildpath)s -f ../project_files/Makefile all BEREMIZSRC=%(src)s BEREMIZCFLAGS=%(cflags)s MD5=%(md5)s USE_BEREMIZ=1 FROM_BEREMIZ=1"/>
+  </TargetType>
+  <Libraries Enable_Native_Library="false" Enable_Python_Library="false"/>
+</BeremizRoot>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/genericmake/plc.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,92 @@
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201">
+  <fileHeader companyName="Unknown" productName="Unnamed" productVersion="1" creationDateTime="2014-01-19T11:14:47" contentDescription="This example shows how you can customize build process by using 'make'.&#10;"/>
+  <contentHeader name="Makefile Example" modificationDateTime="2018-08-24T13:12:10">
+    <coordinateInfo>
+      <fbd>
+        <scaling x="0" y="0"/>
+      </fbd>
+      <ld>
+        <scaling x="0" y="0"/>
+      </ld>
+      <sfc>
+        <scaling x="0" y="0"/>
+      </sfc>
+    </coordinateInfo>
+  </contentHeader>
+  <types>
+    <dataTypes/>
+    <pous>
+      <pou name="program0" pouType="program">
+        <interface>
+          <localVars>
+            <variable name="LocalVara">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="LocalVarb">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <inVariable localId="1" executionOrderId="0" height="30" width="77" negated="false">
+              <position x="52" y="424"/>
+              <connectionPointOut>
+                <relPosition x="77" y="15"/>
+              </connectionPointOut>
+              <expression>LocalVara</expression>
+            </inVariable>
+            <outVariable localId="2" executionOrderId="0" height="30" width="77" negated="false">
+              <position x="167" y="424"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="1">
+                  <position x="167" y="439"/>
+                  <position x="129" y="439"/>
+                </connection>
+              </connectionPointIn>
+              <expression>LocalVarb</expression>
+            </outVariable>
+            <comment localId="3" height="385" width="760">
+              <position x="32" y="23"/>
+              <content>
+                <xhtml:p><![CDATA[This example shows how you can customize build process by using 'make'.
+
+Sometimes special steps need to be done to build entire project.
+But it's not necessary to create another target in Beremiz every time you need to customize something in build process.  Just use for that 'Generic' target and describe all necessary steps in Makefile. 
+
+For example, you can 
+ - preprocess generated by Beremiz C source files, 
+ - do some fancy source code transformation using any tools you want, 
+ - use any compiler you want,
+ - call static analyzers,
+ - run integration tests on the project,
+ - upload source code to external build server,
+ - upload to the target and compile it there,
+ - flash/transfer your compiled binary to the target,
+ and much much more.
+]]></xhtml:p>
+              </content>
+            </comment>
+          </FBD>
+        </body>
+      </pou>
+    </pous>
+  </types>
+  <instances>
+    <configurations>
+      <configuration name="config">
+        <resource name="resource1">
+          <task name="Tsk" priority="0" interval="T#100ms">
+            <pouInstance name="Inst" typeName="program0"/>
+          </task>
+        </resource>
+      </configuration>
+    </configurations>
+  </instances>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/genericmake/project_files/Makefile	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,13 @@
+BEREMIZ_OBJS = $(BEREMIZSRC:.c=.o)
+
+all: warn some_binary
+	@echo "*** all done ***"
+
+warn:
+	@echo "*** Sample Makefile, does nothing ***"
+
+some_binary: $(BEREMIZ_OBJS)
+	@echo "* Would link $^ -> $@"
+
+%.o: %.c
+	@echo "* Would compile $< -> $@"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/logging/beremiz.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,5 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BeremizRoot URI_location="LOCAL://">
+  <TargetType/>
+  <Libraries Enable_Native_Library="true"/>
+</BeremizRoot>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/logging/plc.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,350 @@
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
+  <fileHeader companyName="Unknown" productName="Generic PLC" productVersion="1" creationDateTime="2013-01-29T14:01:00" contentDescription="This example shows logging functionality in Beremiz.&#10;Here are shown two ways of logging:&#10;- from IEC PLC program;&#10;- from python extension.&#10;"/>
+  <contentHeader name="Logging example" modificationDateTime="2018-09-26T13:10:14">
+    <coordinateInfo>
+      <fbd>
+        <scaling x="0" y="0"/>
+      </fbd>
+      <ld>
+        <scaling x="0" y="0"/>
+      </ld>
+      <sfc>
+        <scaling x="0" y="0"/>
+      </sfc>
+    </coordinateInfo>
+  </contentHeader>
+  <types>
+    <dataTypes/>
+    <pous>
+      <pou name="program0" pouType="program">
+        <interface>
+          <localVars>
+            <variable name="beat">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="count">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="LOGGER0">
+              <type>
+                <derived name="LOGGER"/>
+              </type>
+            </variable>
+            <variable name="lvl">
+              <type>
+                <derived name="LOGLEVEL"/>
+              </type>
+              <initialValue>
+                <simpleValue value="INFO"/>
+              </initialValue>
+            </variable>
+            <variable name="Timer">
+              <type>
+                <derived name="TOF"/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <inVariable localId="2" height="30" width="218" executionOrderId="0" negated="false">
+              <position x="459" y="365"/>
+              <connectionPointOut>
+                <relPosition x="218" y="15"/>
+              </connectionPointOut>
+              <expression>'IEC side logging: beat #'</expression>
+            </inVariable>
+            <block localId="3" width="59" height="40" typeName="NOT" executionOrderId="0">
+              <position x="241" y="287"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="14" formalParameter="Q">
+                      <position x="241" y="317"/>
+                      <position x="197" y="317"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="59" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inOutVariable localId="4" height="30" width="60" executionOrderId="0" negatedOut="false" negatedIn="false">
+              <position x="57" y="302"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="3" formalParameter="OUT">
+                  <position x="57" y="317"/>
+                  <position x="37" y="317"/>
+                  <position x="37" y="390"/>
+                  <position x="314" y="390"/>
+                  <position x="314" y="317"/>
+                  <position x="300" y="317"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="60" y="15"/>
+              </connectionPointOut>
+              <expression>beat</expression>
+            </inOutVariable>
+            <block localId="5" width="68" height="98" typeName="ADD" executionOrderId="0">
+              <position x="463" y="403"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="39"/>
+                    <connection refLocalId="10" formalParameter="OUT">
+                      <position x="463" y="442"/>
+                      <position x="452" y="442"/>
+                      <position x="452" y="442"/>
+                      <position x="455" y="442"/>
+                      <position x="455" y="442"/>
+                      <position x="439" y="442"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="78"/>
+                    <connection refLocalId="6">
+                      <position x="463" y="481"/>
+                      <position x="438" y="481"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="68" y="39"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inOutVariable localId="6" height="30" width="103" executionOrderId="0" negatedOut="false" negatedIn="false">
+              <position x="335" y="466"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="5" formalParameter="OUT">
+                  <position x="335" y="481"/>
+                  <position x="320" y="481"/>
+                  <position x="320" y="518"/>
+                  <position x="544" y="518"/>
+                  <position x="544" y="442"/>
+                  <position x="531" y="442"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="103" y="15"/>
+              </connectionPointOut>
+              <expression>count</expression>
+            </inOutVariable>
+            <block localId="8" width="67" height="144" typeName="CONCAT" executionOrderId="0">
+              <position x="727" y="329"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="51"/>
+                    <connection refLocalId="2">
+                      <position x="727" y="380"/>
+                      <position x="717" y="380"/>
+                      <position x="717" y="380"/>
+                      <position x="677" y="380"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="113"/>
+                    <connection refLocalId="9" formalParameter="OUT">
+                      <position x="727" y="442"/>
+                      <position x="680" y="442"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="67" y="51"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="9" width="119" height="40" typeName="INT_TO_STRING" executionOrderId="0">
+              <position x="561" y="412"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="5" formalParameter="OUT">
+                      <position x="561" y="442"/>
+                      <position x="531" y="442"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="119" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="10" width="106" height="40" typeName="BOOL_TO_INT" executionOrderId="0">
+              <position x="333" y="412"/>
+              <inputVariables>
+                <variable formalParameter="IN" edge="rising">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="3" formalParameter="OUT">
+                      <position x="333" y="442"/>
+                      <position x="314" y="442"/>
+                      <position x="314" y="317"/>
+                      <position x="300" y="317"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="106" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="11" width="65" height="209" typeName="LOGGER" instanceName="LOGGER0" executionOrderId="0">
+              <position x="907" y="266"/>
+              <inputVariables>
+                <variable formalParameter="TRIG">
+                  <connectionPointIn>
+                    <relPosition x="0" y="51"/>
+                    <connection refLocalId="3" formalParameter="OUT">
+                      <position x="907" y="317"/>
+                      <position x="300" y="317"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="MSG">
+                  <connectionPointIn>
+                    <relPosition x="0" y="114"/>
+                    <connection refLocalId="8" formalParameter="OUT">
+                      <position x="907" y="380"/>
+                      <position x="794" y="380"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="LEVEL">
+                  <connectionPointIn>
+                    <relPosition x="0" y="177"/>
+                    <connection refLocalId="12">
+                      <position x="907" y="443"/>
+                      <position x="880" y="443"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables/>
+            </block>
+            <inVariable localId="12" height="30" width="79" executionOrderId="0" negated="false">
+              <position x="801" y="428"/>
+              <connectionPointOut>
+                <relPosition x="79" y="15"/>
+              </connectionPointOut>
+              <expression>lvl</expression>
+            </inVariable>
+            <block localId="14" typeName="TOF" instanceName="Timer" executionOrderId="0" height="98" width="47">
+              <position x="150" y="278"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="39"/>
+                    <connection refLocalId="4">
+                      <position x="150" y="317"/>
+                      <position x="117" y="317"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="PT">
+                  <connectionPointIn>
+                    <relPosition x="0" y="78"/>
+                    <connection refLocalId="1">
+                      <position x="150" y="356"/>
+                      <position x="117" y="356"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q">
+                  <connectionPointOut>
+                    <relPosition x="47" y="39"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="ET">
+                  <connectionPointOut>
+                    <relPosition x="47" y="78"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="1" executionOrderId="0" height="30" width="61" negated="false">
+              <position x="56" y="341"/>
+              <connectionPointOut>
+                <relPosition x="61" y="15"/>
+              </connectionPointOut>
+              <expression>T#3s</expression>
+            </inVariable>
+            <comment localId="15" height="249" width="682">
+              <position x="19" y="8"/>
+              <content>
+                <xhtml:p><![CDATA[This example shows logging functionality in Beremiz.
+Here are shown two ways of logging:
+- from IEC PLC program;
+- from python extension.
+
+In IEC PLC program every third second (beat) new message is generated and put in PLC log.
+See function blocks below.
+
+Every 15 seconds status of PLC program is put in PLC log from python extension.
+For more information about logging from python look at 0.x: py_ext_0 implementation in project tree. 
+]]></xhtml:p>
+              </content>
+            </comment>
+          </FBD>
+        </body>
+      </pou>
+    </pous>
+  </types>
+  <instances>
+    <configurations>
+      <configuration name="config">
+        <resource name="resource1">
+          <task name="task0" priority="0" interval="T#100ms">
+            <pouInstance name="prg" typeName="program0"/>
+          </task>
+        </resource>
+      </configuration>
+    </configurations>
+  </instances>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/logging/py_ext_0@py_ext/baseconfnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<BaseParams Name="py_ext_0" IEC_Channel="0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/logging/py_ext_0@py_ext/pyfile.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,41 @@
+<?xml version='1.0' encoding='utf-8'?>
+<PyFile xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <variables/>
+  <globals>
+    <xhtml:p><![CDATA[import threading, time
+
+MyT = None
+Stop = False
+
+def StartLog():
+    global MyT
+    MyT=threading.Thread(target = DoLog)
+    MyT.start()
+
+def DoLog():
+    global Stop
+    while not Stop:
+        PLCObject.LogMessage("Python side Logging (PLC is %s)"%PLCObject.PLCStatus)
+        time.sleep(0.3)
+
+def StopLog():
+    global MyT,Stop
+    Stop=True
+
+_runtime_init.append(StartLog)
+_runtime_cleanup.append(StopLog)
+]]></xhtml:p>
+  </globals>
+  <init>
+    <xhtml:p><![CDATA[]]></xhtml:p>
+  </init>
+  <cleanup>
+    <xhtml:p><![CDATA[]]></xhtml:p>
+  </cleanup>
+  <start>
+    <xhtml:p><![CDATA[]]></xhtml:p>
+  </start>
+  <stop>
+    <xhtml:p><![CDATA[]]></xhtml:p>
+  </stop>
+</PyFile>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/modbus/beremiz.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="LOCAL://">
+  <TargetType>
+    <Linux/>
+  </TargetType>
+</BeremizRoot>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/modbus/modbus_0@modbus/ModbusTCPclient_0@ModbusTCPclient/ModbusRequest_0@ModbusRequest/baseconfnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="ModbusRequest_0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/modbus/modbus_0@modbus/ModbusTCPclient_0@ModbusTCPclient/ModbusRequest_0@ModbusRequest/confnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<ModbusRequest xmlns:xsd="http://www.w3.org/2001/XMLSchema" Function="16 - Write Multiple Registers" SlaveID="0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/modbus/modbus_0@modbus/ModbusTCPclient_0@ModbusTCPclient/ModbusRequest_1@ModbusRequest/baseconfnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="1" Name="ModbusRequest_1"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/modbus/modbus_0@modbus/ModbusTCPclient_0@ModbusTCPclient/ModbusRequest_1@ModbusRequest/confnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<ModbusRequest xmlns:xsd="http://www.w3.org/2001/XMLSchema" Function="04 - Read Input Registers" SlaveID="0" Start_Address="0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/modbus/modbus_0@modbus/ModbusTCPclient_0@ModbusTCPclient/baseconfnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="ModbusTCPclient_0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/modbus/modbus_0@modbus/ModbusTCPclient_0@ModbusTCPclient/confnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<ModbusTCPclient xmlns:xsd="http://www.w3.org/2001/XMLSchema" Remote_Port_Number="1502"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/modbus/modbus_0@modbus/ModbusTCPserver_0@ModbusTCPserver/HoldingRegs@MemoryArea/baseconfnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="HoldingRegs"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/modbus/modbus_0@modbus/ModbusTCPserver_0@ModbusTCPserver/HoldingRegs@MemoryArea/confnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<MemoryArea xmlns:xsd="http://www.w3.org/2001/XMLSchema" MemoryAreaType="03 - Holding Registers" Nr_of_Channels="1"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/modbus/modbus_0@modbus/ModbusTCPserver_0@ModbusTCPserver/InputRegs@MemoryArea/baseconfnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="1" Name="InputRegs"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/modbus/modbus_0@modbus/ModbusTCPserver_0@ModbusTCPserver/InputRegs@MemoryArea/confnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<MemoryArea xmlns:xsd="http://www.w3.org/2001/XMLSchema" MemoryAreaType="04 - Input Registers"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/modbus/modbus_0@modbus/ModbusTCPserver_0@ModbusTCPserver/baseconfnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="1" Name="ModbusTCPserver_0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/modbus/modbus_0@modbus/ModbusTCPserver_0@ModbusTCPserver/confnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<ModbusServerNode xmlns:xsd="http://www.w3.org/2001/XMLSchema" Local_Port_Number="1502" Local_IP_Address="127.0.0.1"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/modbus/modbus_0@modbus/baseconfnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="modbus_0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/modbus/modbus_0@modbus/confnode.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<ModbusRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/modbus/plc.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,314 @@
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201">
+  <fileHeader companyName="Beremiz" productName="Beremiz" productVersion="1" creationDateTime="2018-07-27T13:19:12"/>
+  <contentHeader name="Modbus" modificationDateTime="2018-07-27T15:43:56">
+    <coordinateInfo>
+      <fbd>
+        <scaling x="0" y="0"/>
+      </fbd>
+      <ld>
+        <scaling x="0" y="0"/>
+      </ld>
+      <sfc>
+        <scaling x="0" y="0"/>
+      </sfc>
+    </coordinateInfo>
+  </contentHeader>
+  <types>
+    <dataTypes/>
+    <pous>
+      <pou name="program0" pouType="program">
+        <interface>
+          <localVars>
+            <variable name="Counter">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="CounterReadBack">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </localVars>
+          <localVars>
+            <variable name="MasterWriteToReg0" address="%QW0.0.0.0">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="MasterReadFromReg1" address="%IW0.0.1.0">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="SlaveHoldReg0" address="%IW0.1.0.0">
+              <type>
+                <WORD/>
+              </type>
+            </variable>
+            <variable name="SlaveInputReg0" address="%QW0.1.1.0">
+              <type>
+                <WORD/>
+              </type>
+            </variable>
+          </localVars>
+          <localVars>
+            <variable name="CTU0">
+              <type>
+                <derived name="CTU"/>
+              </type>
+            </variable>
+            <variable name="Generator0">
+              <type>
+                <derived name="Generator"/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <comment localId="4" height="109" width="350">
+              <position x="102" y="438"/>
+              <content>
+                <xhtml:p><![CDATA[Modbus TCP Master writes counter value to one holding register on Modbus TCP Slave and reads it back from other input register.]]></xhtml:p>
+              </content>
+            </comment>
+            <comment localId="3" height="407" width="680">
+              <position x="21" y="15"/>
+              <content>
+                <xhtml:p><![CDATA[This examples shows how to work with Modbus extension. It uses Modbus TCP, but the same functions are available for Modbus RTU as well. Buth protocols are supported.
+
+Modbus extensions requires native Modbus RTU/TCP library to be installed nearby Beremiz.
+Following directory structure is expected:
+<Parent directory>
+  "beremiz"
+  "Modbus"
+
+If Modbus library is installed elsewhere, then place corresponding paths
+in CFLAGS/LDFLAGS in project settings.
+
+For GNU/Linux to install Modbus library in parent directory run following commands:
+$ hg clone https://bitbucket.org/mjsousa/modbus Modbus
+$ cd Modbus
+$ make
+
+After that Modbus extension is ready to be used in Beremiz projects.]]></xhtml:p>
+              </content>
+            </comment>
+            <block localId="5" typeName="CTU" instanceName="CTU0" executionOrderId="0" height="80" width="52">
+              <position x="346" y="605"/>
+              <inputVariables>
+                <variable formalParameter="CU" edge="rising">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="6" formalParameter="OUT">
+                      <position x="346" y="635"/>
+                      <position x="303" y="635"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="R">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="PV">
+                  <connectionPointIn>
+                    <relPosition x="0" y="70"/>
+                    <connection refLocalId="7">
+                      <position x="346" y="675"/>
+                      <position x="324" y="675"/>
+                      <position x="324" y="703"/>
+                      <position x="302" y="703"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q">
+                  <connectionPointOut>
+                    <relPosition x="52" y="30"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="CV">
+                  <connectionPointOut>
+                    <relPosition x="52" y="50"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="6" typeName="Generator" instanceName="Generator0" executionOrderId="0" height="60" width="79">
+              <position x="224" y="605"/>
+              <inputVariables>
+                <variable formalParameter="PON">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="1">
+                      <position x="224" y="635"/>
+                      <position x="154" y="635"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="POFF">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="1">
+                      <position x="224" y="655"/>
+                      <position x="189" y="655"/>
+                      <position x="189" y="635"/>
+                      <position x="154" y="635"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="79" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="1" executionOrderId="0" height="30" width="138" negated="false">
+              <position x="16" y="620"/>
+              <connectionPointOut>
+                <relPosition x="138" y="15"/>
+              </connectionPointOut>
+              <expression>T#1s</expression>
+            </inVariable>
+            <inVariable localId="7" executionOrderId="0" height="30" width="138" negated="false">
+              <position x="164" y="688"/>
+              <connectionPointOut>
+                <relPosition x="138" y="15"/>
+              </connectionPointOut>
+              <expression>32767</expression>
+            </inVariable>
+            <inOutVariable localId="2" executionOrderId="0" height="30" width="138" negatedOut="false" negatedIn="false">
+              <position x="544" y="640"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="5" formalParameter="CV">
+                  <position x="544" y="655"/>
+                  <position x="398" y="655"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="138" y="15"/>
+              </connectionPointOut>
+              <expression>Counter</expression>
+            </inOutVariable>
+            <outVariable localId="8" executionOrderId="0" height="30" width="138" negated="false">
+              <position x="762" y="640"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="2">
+                  <position x="762" y="655"/>
+                  <position x="682" y="655"/>
+                </connection>
+              </connectionPointIn>
+              <expression>MasterWriteToReg0</expression>
+            </outVariable>
+            <inVariable localId="9" executionOrderId="0" height="30" width="152" negated="false">
+              <position x="81" y="747"/>
+              <connectionPointOut>
+                <relPosition x="152" y="15"/>
+              </connectionPointOut>
+              <expression>MasterReadFromReg1</expression>
+            </inVariable>
+            <outVariable localId="10" executionOrderId="0" height="30" width="137" negated="false">
+              <position x="547" y="747"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="9">
+                  <position x="547" y="762"/>
+                  <position x="233" y="762"/>
+                </connection>
+              </connectionPointIn>
+              <expression>CounterReadBack</expression>
+            </outVariable>
+            <comment localId="11" height="109" width="350">
+              <position x="85" y="825"/>
+              <content>
+                <xhtml:p><![CDATA[Modbus TCP Slave just copies received register value from holding register to input register.]]></xhtml:p>
+              </content>
+            </comment>
+            <inVariable localId="12" executionOrderId="0" height="30" width="152" negated="false">
+              <position x="82" y="970"/>
+              <connectionPointOut>
+                <relPosition x="152" y="15"/>
+              </connectionPointOut>
+              <expression>SlaveHoldReg0</expression>
+            </inVariable>
+            <outVariable localId="13" executionOrderId="0" height="30" width="123" negated="false">
+              <position x="548" y="970"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="12">
+                  <position x="548" y="985"/>
+                  <position x="234" y="985"/>
+                </connection>
+              </connectionPointIn>
+              <expression>SlaveInputReg0</expression>
+            </outVariable>
+          </FBD>
+        </body>
+      </pou>
+      <pou name="Generator" pouType="functionBlock">
+        <interface>
+          <outputVars>
+            <variable name="OUT">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </outputVars>
+          <inputVars>
+            <variable name="PON">
+              <type>
+                <TIME/>
+              </type>
+            </variable>
+            <variable name="POFF">
+              <type>
+                <TIME/>
+              </type>
+            </variable>
+          </inputVars>
+          <localVars>
+            <variable name="T1">
+              <type>
+                <derived name="TON"/>
+              </type>
+            </variable>
+            <variable name="T2">
+              <type>
+                <derived name="TOF"/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <ST>
+            <xhtml:p><![CDATA[T1( IN := NOT T2.Q, PT := POFF);
+T2( IN := T1.Q,     PT := PON);
+OUT := T2.Q;]]></xhtml:p>
+          </ST>
+        </body>
+      </pou>
+    </pous>
+  </types>
+  <instances>
+    <configurations>
+      <configuration name="config">
+        <resource name="resource1">
+          <task name="task0" priority="0" interval="T#20ms">
+            <pouInstance name="instance0" typeName="program0"/>
+          </task>
+        </resource>
+      </configuration>
+    </configurations>
+  </instances>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/svghmi/beremiz.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,5 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="PYRO://127.0.0.1:61427">
+  <TargetType/>
+  <Libraries Enable_SVGHMI_Library="true"/>
+</BeremizRoot>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/projects/svghmi/plc.xml	Wed Feb 02 20:27:17 2022 +0100
@@ -0,0 +1,1104 @@
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201">
+  <fileHeader companyName="Unknown" productName="Unnamed" productVersion="1" creationDateTime="2019-08-06T14:23:42"/>
+  <contentHeader name="Unnamed" modificationDateTime="2022-01-18T11:38:21">
+    <coordinateInfo>
+      <fbd>
+        <scaling x="5" y="5"/>
+      </fbd>
+      <ld>
+        <scaling x="0" y="0"/>
+      </ld>
+      <sfc>
+        <scaling x="0" y="0"/>
+      </sfc>
+    </coordinateInfo>
+  </contentHeader>
+  <types>
+    <dataTypes/>
+    <pous>
+      <pou name="MainStuff" pouType="program">
+        <interface>
+          <localVars>
+            <variable name="TargetPressure">
+              <type>
+                <derived name="HMI_INT"/>
+              </type>
+            </variable>
+            <variable name="selection">
+              <type>
+                <derived name="HMI_INT"/>
+              </type>
+            </variable>
+            <variable name="Pump0">
+              <type>
+                <derived name="PumpControl"/>
+              </type>
+            </variable>
+            <variable name="Pump1">
+              <type>
+                <derived name="PumpControl"/>
+              </type>
+            </variable>
+            <variable name="Pump2">
+              <type>
+                <derived name="PumpControl"/>
+              </type>
+            </variable>
+            <variable name="Pump3">
+              <type>
+                <derived name="PumpControl"/>
+              </type>
+            </variable>
+            <variable name="Pump4">
+              <type>
+                <derived name="PumpControl"/>
+              </type>
+            </variable>
+            <variable name="Pump5">
+              <type>
+                <derived name="PumpControl"/>
+              </type>
+            </variable>
+            <variable name="Pump6">
+              <type>
+                <derived name="PumpControl"/>
+              </type>
+            </variable>
+            <variable name="Pump7">
+              <type>
+                <derived name="PumpControl"/>
+              </type>
+            </variable>
+          </localVars>
+          <externalVars>
+            <variable name="CURRENT_PAGE_0">
+              <type>
+                <derived name="HMI_STRING"/>
+              </type>
+            </variable>
+          </externalVars>
+          <localVars>
+            <variable name="PAGESWITCH">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="R_TRIG0">
+              <type>
+                <derived name="R_TRIG"/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <block localId="4" typeName="PumpControl" instanceName="Pump0" executionOrderId="0" height="60" width="127">
+              <position x="595" y="50"/>
+              <inputVariables>
+                <variable formalParameter="Pump">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="TargetPressure">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="5">
+                      <position x="595" y="100"/>
+                      <position x="582" y="100"/>
+                      <position x="582" y="80"/>
+                      <position x="570" y="80"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables/>
+            </block>
+            <inVariable localId="5" executionOrderId="0" height="30" width="125" negated="false">
+              <position x="445" y="65"/>
+              <connectionPointOut>
+                <relPosition x="125" y="15"/>
+              </connectionPointOut>
+              <expression>TargetPressure</expression>
+            </inVariable>
+            <block localId="1" typeName="PumpControl" instanceName="Pump1" executionOrderId="0" height="60" width="127">
+              <position x="595" y="280"/>
+              <inputVariables>
+                <variable formalParameter="Pump">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="TargetPressure">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="5">
+                      <position x="595" y="330"/>
+                      <position x="582" y="330"/>
+                      <position x="582" y="80"/>
+                      <position x="570" y="80"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables/>
+            </block>
+            <block localId="2" typeName="PumpControl" instanceName="Pump2" executionOrderId="0" height="60" width="127">
+              <position x="595" y="160"/>
+              <inputVariables>
+                <variable formalParameter="Pump">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="TargetPressure">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="5">
+                      <position x="595" y="210"/>
+                      <position x="582" y="210"/>
+                      <position x="582" y="80"/>
+                      <position x="570" y="80"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables/>
+            </block>
+            <block localId="3" typeName="PumpControl" instanceName="Pump3" executionOrderId="0" height="60" width="127">
+              <position x="595" y="395"/>
+              <inputVariables>
+                <variable formalParameter="Pump">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="TargetPressure">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="5">
+                      <position x="595" y="445"/>
+                      <position x="582" y="445"/>
+                      <position x="582" y="80"/>
+                      <position x="570" y="80"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables/>
+            </block>
+            <block localId="6" typeName="PumpControl" instanceName="Pump4" executionOrderId="0" height="60" width="127">
+              <position x="595" y="515"/>
+              <inputVariables>
+                <variable formalParameter="Pump">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="TargetPressure">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="5">
+                      <position x="595" y="565"/>
+                      <position x="582" y="565"/>
+                      <position x="582" y="80"/>
+                      <position x="570" y="80"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables/>
+            </block>
+            <block localId="7" typeName="PumpControl" instanceName="Pump5" executionOrderId="0" height="60" width="127">
+              <position x="595" y="645"/>
+              <inputVariables>
+                <variable formalParameter="Pump">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="11">
+                      <position x="595" y="675"/>
+                      <position x="570" y="675"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="TargetPressure">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="5">
+                      <position x="595" y="695"/>
+                      <position x="582" y="695"/>
+                      <position x="582" y="80"/>
+                      <position x="570" y="80"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables/>
+            </block>
+            <block localId="8" typeName="PumpControl" instanceName="Pump6" executionOrderId="0" height="60" width="127">
+              <position x="595" y="775"/>
+              <inputVariables>
+                <variable formalParameter="Pump">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="TargetPressure">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="5">
+                      <position x="595" y="825"/>
+                      <position x="582" y="825"/>
+                      <position x="582" y="80"/>
+                      <position x="570" y="80"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables/>
+            </block>
+            <block localId="9" typeName="PumpControl" instanceName="Pump7" executionOrderId="0" height="60" width="127">
+              <position x="595" y="895"/>
+              <inputVariables>
+                <variable formalParameter="Pump">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="10">
+                      <position x="595" y="925"/>
+                      <position x="560" y="925"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="TargetPressure">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="5">
+                      <position x="595" y="945"/>
+                      <position x="582" y="945"/>
+                      <position x="582" y="80"/>
+                      <position x="570" y="80"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables/>
+            </block>
+            <inVariable localId="10" executionOrderId="0" height="25" width="20" negated="false">
+              <position x="540" y="915"/>
+              <connectionPointOut>
+                <relPosition x="20" y="10"/>
+              </connectionPointOut>
+              <expression>0</expression>
+            </inVariable>
+            <inVariable localId="11" executionOrderId="0" height="25" width="20" negated="false">
+              <position x="550" y="665"/>
+              <connectionPointOut>
+                <relPosition x="20" y="10"/>
+              </connectionPointOut>
+              <expression>0</expression>
+            </inVariable>
+            <inOutVariable localId="12" executionOrderId="0" height="25" width="125" negatedOut="false" negatedIn="false">
+              <position x="410" y="205"/>
+              <connectionPointIn>
+                <relPosition x="0" y="10"/>
+                <connection refLocalId="13" formalParameter="OUT">
+                  <position x="410" y="215"/>
+                  <position x="385" y="215"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="125" y="10"/>
+              </connectionPointOut>
+              <expression>CURRENT_PAGE_0</expression>
+            </inOutVariable>
+            <block localId="13" typeName="SEL" executionOrderId="0" height="80" width="65">
+              <position x="320" y="185"/>
+              <inputVariables>
+                <variable formalParameter="G">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="17" formalParameter="Q">
+                      <position x="320" y="215"/>
+                      <position x="280" y="215"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN0">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="12">
+                      <position x="320" y="235"/>
+                      <position x="60" y="235"/>
+                      <position x="60" y="155"/>
+                      <position x="550" y="155"/>
+                      <position x="550" y="215"/>
+                      <position x="535" y="215"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="70"/>
+                    <connection refLocalId="16">
+                      <position x="320" y="255"/>
+                      <position x="290" y="255"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="65" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="15" executionOrderId="0" height="25" width="90" negated="false">
+              <position x="100" y="205"/>
+              <connectionPointOut>
+                <relPosition x="90" y="10"/>
+              </connectionPointOut>
+              <expression>PAGESWITCH</expression>
+            </inVariable>
+            <inVariable localId="16" executionOrderId="0" height="25" width="220" negated="false">
+              <position x="70" y="245"/>
+              <connectionPointOut>
+                <relPosition x="220" y="10"/>
+              </connectionPointOut>
+              <expression>'!RelativePageTest@/PUMP2'</expression>
+            </inVariable>
+            <block localId="17" typeName="R_TRIG" instanceName="R_TRIG0" executionOrderId="0" height="40" width="60">
+              <position x="220" y="185"/>
+              <inputVariables>
+                <variable formalParameter="CLK">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="15">
+                      <position x="220" y="215"/>
+                      <position x="190" y="215"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q">
+                  <connectionPointOut>
+                    <relPosition x="60" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+          </FBD>
+        </body>
+      </pou>
+      <pou name="PumpControl" pouType="functionBlock">
+        <interface>
+          <inputVars>
+            <variable name="Pump">
+              <type>
+                <derived name="HMI_NODE"/>
+              </type>
+              <initialValue>
+                <simpleValue value="1"/>
+              </initialValue>
+            </variable>
+          </inputVars>
+          <localVars>
+            <variable name="Pressure">
+              <type>
+                <derived name="HMI_INT"/>
+              </type>
+            </variable>
+          </localVars>
+          <inputVars>
+            <variable name="TargetPressure">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </inputVars>
+          <localVars>
+            <variable name="Sloth">
+              <type>
+                <derived name="HMI_INT"/>
+              </type>
+            </variable>
+            <variable name="boolout">
+              <type>
+                <derived name="HMI_BOOL"/>
+              </type>
+            </variable>
+            <variable name="boolin">
+              <type>
+                <derived name="HMI_BOOL"/>
+              </type>
+              <initialValue>
+                <simpleValue value="True"/>
+              </initialValue>
+            </variable>
+            <variable name="strout">
+              <type>
+                <derived name="HMI_STRING"/>
+              </type>
+            </variable>
+            <variable name="strin">
+              <type>
+                <derived name="HMI_STRING"/>
+              </type>
+              <initialValue>
+                <simpleValue value="blup"/>
+              </initialValue>
+            </variable>
+            <variable name="floating">
+              <type>
+                <derived name="HMI_REAL"/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <inVariable localId="5" executionOrderId="0" height="30" width="125" negated="false">
+              <position x="150" y="100"/>
+              <connectionPointOut>
+                <relPosition x="125" y="15"/>
+              </connectionPointOut>
+              <expression>TargetPressure</expression>
+            </inVariable>
+            <inOutVariable localId="4" executionOrderId="0" height="30" width="60" negatedOut="false" negatedIn="false">
+              <position x="510" y="80"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="6" formalParameter="OUT">
+                  <position x="510" y="95"/>
+                  <position x="470" y="95"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="60" y="15"/>
+              </connectionPointOut>
+              <expression>Sloth</expression>
+            </inOutVariable>
+            <block localId="6" typeName="ADD" executionOrderId="0" height="60" width="65">
+              <position x="405" y="65"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="4">
+                      <position x="405" y="95"/>
+                      <position x="385" y="95"/>
+                      <position x="385" y="50"/>
+                      <position x="580" y="50"/>
+                      <position x="580" y="95"/>
+                      <position x="570" y="95"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="7" formalParameter="OUT">
+                      <position x="405" y="115"/>
+                      <position x="360" y="115"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="65" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="1" executionOrderId="0" height="30" width="75" negated="false">
+              <position x="150" y="135"/>
+              <connectionPointOut>
+                <relPosition x="75" y="15"/>
+              </connectionPointOut>
+              <expression>Pressure</expression>
+            </inVariable>
+            <block localId="7" typeName="SUB" executionOrderId="0" height="60" width="65">
+              <position x="295" y="85"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="5">
+                      <position x="295" y="115"/>
+                      <position x="275" y="115"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="1">
+                      <position x="295" y="135"/>
+                      <position x="285" y="135"/>
+                      <position x="285" y="150"/>
+                      <position x="225" y="150"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="65" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="2" executionOrderId="0" height="30" width="60" negated="false">
+              <position x="240" y="190"/>
+              <connectionPointOut>
+                <relPosition x="60" y="15"/>
+              </connectionPointOut>
+              <expression>Sloth</expression>
+            </inVariable>
+            <outVariable localId="3" executionOrderId="0" height="30" width="75" negated="false">
+              <position x="435" y="205"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="8" formalParameter="OUT">
+                  <position x="435" y="220"/>
+                  <position x="410" y="220"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Pressure</expression>
+            </outVariable>
+            <block localId="8" typeName="DIV" executionOrderId="0" height="60" width="65">
+              <position x="345" y="190"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="2">
+                      <position x="345" y="220"/>
+                      <position x="335" y="220"/>
+                      <position x="335" y="205"/>
+                      <position x="300" y="205"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="9">
+                      <position x="345" y="240"/>
+                      <position x="300" y="240"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="65" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="9" executionOrderId="0" height="30" width="60" negated="false">
+              <position x="240" y="225"/>
+              <connectionPointOut>
+                <relPosition x="60" y="15"/>
+              </connectionPointOut>
+              <expression>100</expression>
+            </inVariable>
+            <block localId="10" typeName="CONCAT" executionOrderId="0" height="60" width="65">
+              <position x="360" y="345"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="13" formalParameter="OUT">
+                      <position x="360" y="375"/>
+                      <position x="330" y="375"/>
+                      <position x="330" y="332"/>
+                      <position x="440" y="332"/>
+                      <position x="440" y="300"/>
+                      <position x="430" y="300"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="14">
+                      <position x="360" y="395"/>
+                      <position x="322" y="395"/>
+                      <position x="322" y="400"/>
+                      <position x="285" y="400"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="65" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="11" executionOrderId="0" height="30" width="58" negated="false">
+              <position x="495" y="355"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="10" formalParameter="OUT">
+                  <position x="495" y="370"/>
+                  <position x="450" y="370"/>
+                  <position x="450" y="375"/>
+                  <position x="425" y="375"/>
+                </connection>
+              </connectionPointIn>
+              <expression>strout</expression>
+            </outVariable>
+            <inVariable localId="12" executionOrderId="0" height="30" width="125" negated="false">
+              <position x="145" y="285"/>
+              <connectionPointOut>
+                <relPosition x="125" y="15"/>
+              </connectionPointOut>
+              <expression>TargetPressure</expression>
+            </inVariable>
+            <block localId="13" typeName="INT_TO_STRING" executionOrderId="0" height="40" width="115">
+              <position x="315" y="270"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="12">
+                      <position x="315" y="300"/>
+                      <position x="270" y="300"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="115" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="14" executionOrderId="0" height="30" width="50" negated="false">
+              <position x="235" y="385"/>
+              <connectionPointOut>
+                <relPosition x="50" y="15"/>
+              </connectionPointOut>
+              <expression>strin</expression>
+            </inVariable>
+            <inVariable localId="15" executionOrderId="0" height="30" width="60" negated="false">
+              <position x="690" y="210"/>
+              <connectionPointOut>
+                <relPosition x="60" y="15"/>
+              </connectionPointOut>
+              <expression>boolin</expression>
+            </inVariable>
+            <outVariable localId="16" executionOrderId="0" height="30" width="70" negated="false">
+              <position x="915" y="240"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="17" formalParameter="OUT">
+                  <position x="915" y="255"/>
+                  <position x="880" y="255"/>
+                </connection>
+              </connectionPointIn>
+              <expression>boolout</expression>
+            </outVariable>
+            <block localId="17" typeName="AND" executionOrderId="0" height="60" width="65">
+              <position x="815" y="225"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="15">
+                      <position x="815" y="255"/>
+                      <position x="762" y="255"/>
+                      <position x="762" y="225"/>
+                      <position x="750" y="225"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="21" formalParameter="OUT">
+                      <position x="815" y="275"/>
+                      <position x="750" y="275"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="65" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="18" executionOrderId="0" height="30" width="75" negated="false">
+              <position x="455" y="260"/>
+              <connectionPointOut>
+                <relPosition x="75" y="15"/>
+              </connectionPointOut>
+              <expression>Pressure</expression>
+            </inVariable>
+            <block localId="19" typeName="MOD" executionOrderId="0" height="60" width="65">
+              <position x="585" y="245"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="18">
+                      <position x="585" y="275"/>
+                      <position x="530" y="275"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="20">
+                      <position x="585" y="295"/>
+                      <position x="555" y="295"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="65" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="20" executionOrderId="0" height="30" width="20" negated="false">
+              <position x="535" y="280"/>
+              <connectionPointOut>
+                <relPosition x="20" y="15"/>
+              </connectionPointOut>
+              <expression>2</expression>
+            </inVariable>
+            <block localId="21" typeName="EQ" executionOrderId="0" height="60" width="65">
+              <position x="685" y="245"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="19" formalParameter="OUT">
+                      <position x="685" y="275"/>
+                      <position x="650" y="275"/>
+                    </connection>
+                  </connectionPointIn>