# HG changeset patch # User Edouard Tisserant <edouard.tisserant@gmail.com> # Date 1596894808 -7200 # Node ID 15e2df3e5610e5c73245ae4c8f78530ffd4fc80c # Parent dabad70db1bfec5b4afdeef1ee821d974f1d0163 SVGHMI: Intermediate state while implementing local HMI variables. Now write to cache only (no send), still need to implement dispatch on change. diff -r dabad70db1bf -r 15e2df3e5610 svghmi/gen_index_xhtml.xslt --- a/svghmi/gen_index_xhtml.xslt Thu Aug 06 15:01:01 2020 +0200 +++ b/svghmi/gen_index_xhtml.xslt Sat Aug 08 15:53:28 2020 +0200 @@ -169,14 +169,30 @@ </xsl:attribute> <xsl:variable name="path" select="."/> <xsl:variable name="item" select="$indexed_hmitree/*[@hmipath = $path]"/> - <xsl:if test="count($item) = 1"> - <xsl:attribute name="index"> - <xsl:value-of select="$item/@index"/> - </xsl:attribute> - <xsl:attribute name="type"> - <xsl:value-of select="local-name($item)"/> - </xsl:attribute> - </xsl:if> + <xsl:choose> + <xsl:when test="count($item) = 1"> + <xsl:attribute name="index"> + <xsl:value-of select="$item/@index"/> + </xsl:attribute> + <xsl:attribute name="type"> + <xsl:value-of select="local-name($item)"/> + </xsl:attribute> + </xsl:when> + <xsl:otherwise> + <xsl:choose> + <xsl:when test="regexp:test($path,'^\.[a-zA-Z0-9_]+')"> + <xsl:attribute name="type"> + <xsl:text>PAGE_LOCAL</xsl:text> + </xsl:attribute> + </xsl:when> + <xsl:when test="regexp:test($path,'^[a-zA-Z0-9_]+')"> + <xsl:attribute name="type"> + <xsl:text>HMI_LOCAL</xsl:text> + </xsl:attribute> + </xsl:when> + </xsl:choose> + </xsl:otherwise> + </xsl:choose> </path> </xsl:if> </xsl:for-each> @@ -845,15 +861,35 @@ <xsl:for-each select="$widget/path"> <xsl:choose> <xsl:when test="not(@index)"> - <xsl:message terminate="no"> - <xsl:text>Widget </xsl:text> - <xsl:value-of select="$widget/@type"/> - <xsl:text> id="</xsl:text> - <xsl:value-of select="$eltid"/> - <xsl:text>" : No match for path "</xsl:text> - <xsl:value-of select="@value"/> - <xsl:text>" in HMI tree</xsl:text> - </xsl:message> + <xsl:choose> + <xsl:when test="not(@type)"> + <xsl:message terminate="yes"> + <xsl:text>Widget </xsl:text> + <xsl:value-of select="$widget/@type"/> + <xsl:text> id="</xsl:text> + <xsl:value-of select="$eltid"/> + <xsl:text>" : No match for path "</xsl:text> + <xsl:value-of select="@value"/> + <xsl:text>" in HMI tree</xsl:text> + </xsl:message> + </xsl:when> + <xsl:when test="@type = 'PAGE_LOCAL'"> + <xsl:text>"</xsl:text> + <xsl:value-of select="substring(1,@value)"/> + <xsl:text>"</xsl:text> + <xsl:if test="position()!=last()"> + <xsl:text>,</xsl:text> + </xsl:if> + </xsl:when> + <xsl:when test="@type = 'HMI_LOCAL'"> + <xsl:text>hmi_local_index("</xsl:text> + <xsl:value-of select="@value"/> + <xsl:text>")</xsl:text> + <xsl:if test="position()!=last()"> + <xsl:text>,</xsl:text> + </xsl:if> + </xsl:when> + </xsl:choose> </xsl:when> <xsl:otherwise> <xsl:value-of select="@index"/> @@ -905,8 +941,8 @@ </xsl:otherwise> </xsl:choose> </func:function> - <preamble:widget-base-class/> - <xsl:template match="preamble:widget-base-class"> + <preamble:local-variable-indexes/> + <xsl:template match="preamble:local-variable-indexes"> <xsl:text> </xsl:text> <xsl:text>/* </xsl:text> @@ -915,6 +951,67 @@ </xsl:text> <xsl:text> </xsl:text> + <xsl:text>let hmi_locals = {}; +</xsl:text> + <xsl:text>var last_remote_index = hmitree_types.length - 1; +</xsl:text> + <xsl:text>var next_available_index = hmitree_types.length; +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text>function page_local_index(varname, pagename){ +</xsl:text> + <xsl:text> let pagevars = hmi_locals[pagename]; +</xsl:text> + <xsl:text> if(pagevars == undefined){ +</xsl:text> + <xsl:text> let new_index = next_available_index++; +</xsl:text> + <xsl:text> hmi_locals[pagename] = {varname:new_index} +</xsl:text> + <xsl:text> return new_index; +</xsl:text> + <xsl:text> } else { +</xsl:text> + <xsl:text> let result = pagevars[varname]; +</xsl:text> + <xsl:text> if(result==undefined){ +</xsl:text> + <xsl:text> let new_index = next_available_index++; +</xsl:text> + <xsl:text> pagevars[varname] = new_index; +</xsl:text> + <xsl:text> return new_index; +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> return result; +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text>} +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text>function hmi_local_index(varname){ +</xsl:text> + <xsl:text> return page_local_index(varname, "HMI_LOCAL"); +</xsl:text> + <xsl:text>} +</xsl:text> + <xsl:text> +</xsl:text> + </xsl:template> + <preamble:widget-base-class/> + <xsl:template match="preamble:widget-base-class"> + <xsl:text> +</xsl:text> + <xsl:text>/* </xsl:text> + <xsl:value-of select="local-name()"/> + <xsl:text> */ +</xsl:text> + <xsl:text> +</xsl:text> <xsl:text>class Widget { </xsl:text> <xsl:text> offset = 0; @@ -965,23 +1062,23 @@ </xsl:text> <xsl:text> </xsl:text> - <xsl:text> sub(new_offset=0, relativeness){ + <xsl:text> sub(new_offset=0, relativeness, container_id){ </xsl:text> <xsl:text> this.offset = new_offset; </xsl:text> <xsl:text> this.relativeness = relativeness; </xsl:text> + <xsl:text> this.container_id = container_id ; +</xsl:text> <xsl:text> /* add this's subsribers */ </xsl:text> <xsl:text> if(!this.unsubscribable) </xsl:text> <xsl:text> for(let i = 0; i < this.indexes.length; i++) { </xsl:text> - <xsl:text> let index = this.indexes[i]; -</xsl:text> - <xsl:text> if(relativeness[i]) -</xsl:text> - <xsl:text> index += new_offset; + <xsl:text> let index = this.get_variable_index(i); +</xsl:text> + <xsl:text> if(index > last_remote_index) return; </xsl:text> <xsl:text> subscribers[index].add(this); </xsl:text> @@ -995,11 +1092,11 @@ </xsl:text> <xsl:text> apply_cache() { </xsl:text> - <xsl:text> if(!this.unsubscribable) for(let index of this.indexes){ + <xsl:text> if(!this.unsubscribable) for(let i = 0; i < this.indexes.length; i++) { </xsl:text> <xsl:text> /* dispatch current cache in newly opened page widgets */ </xsl:text> - <xsl:text> let realindex = index+this.offset; + <xsl:text> let realindex = this.get_variable_index(i); </xsl:text> <xsl:text> let cached_val = cache[realindex]; </xsl:text> @@ -1013,17 +1110,33 @@ </xsl:text> <xsl:text> </xsl:text> - <xsl:text> get_idx(index) { -</xsl:text> - <xsl:text> let orig = this.indexes[index]; -</xsl:text> - <xsl:text> return this.relativeness[index] ? orig + this.offset : orig; + <xsl:text> get_variable_index(varnum) { +</xsl:text> + <xsl:text> let index = this.indexes[varnum]; +</xsl:text> + <xsl:text> if(typeof(index) == "string"){ +</xsl:text> + <xsl:text> let page = this.relativeness[varnum]; +</xsl:text> + <xsl:text> index = page_local_index(index, this.container_id); +</xsl:text> + <xsl:text> } else { +</xsl:text> + <xsl:text> if(this.relativeness[varnum]){ +</xsl:text> + <xsl:text> index += this.offset; +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> return index; </xsl:text> <xsl:text> } </xsl:text> <xsl:text> change_hmi_value(index,opstr) { </xsl:text> - <xsl:text> return change_hmi_value(this.get_idx(index), opstr); + <xsl:text> return change_hmi_value(this.get_variable_index(index), opstr); </xsl:text> <xsl:text> } </xsl:text> @@ -1031,7 +1144,7 @@ </xsl:text> <xsl:text> apply_hmi_value(index, new_val) { </xsl:text> - <xsl:text> return apply_hmi_value(this.get_idx(0), new_val); + <xsl:text> return apply_hmi_value(this.get_variable_index(0), new_val); </xsl:text> <xsl:text> } </xsl:text> @@ -1045,11 +1158,7 @@ </xsl:text> <xsl:text> for(let i = 0; i < this.indexes.length; i++) { </xsl:text> - <xsl:text> let refindex = this.indexes[i]; -</xsl:text> - <xsl:text> if(this.relativeness[i]) -</xsl:text> - <xsl:text> refindex += this.offset; + <xsl:text> let refindex = this.get_variable_index(i); </xsl:text> <xsl:text> </xsl:text> @@ -4056,6 +4165,20 @@ </xsl:text> <xsl:text>function send_hmi_value(index, value) { </xsl:text> + <xsl:text> if(index > last_remote_index){ +</xsl:text> + <xsl:text> cache[index] = value; +</xsl:text> + <xsl:text> console.log("updated local variable ",index,value); +</xsl:text> + <xsl:text> /* TODO : dispatch value ASAP */ +</xsl:text> + <xsl:text> return; +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> +</xsl:text> <xsl:text> let iectype = hmitree_types[index]; </xsl:text> <xsl:text> let tobinary = typedarray_types[iectype]; @@ -4250,7 +4373,13 @@ </xsl:text> <xsl:text> var new_offset = page_index == undefined ? 0 : page_index - new_desc.page_index; </xsl:text> - <xsl:text> new_desc.widgets.map(([widget,relativeness])=>widget.sub(new_offset,relativeness)); + <xsl:text> +</xsl:text> + <xsl:text> container_id = String([page_name, page_index]); +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> new_desc.widgets.map(([widget,relativeness])=>widget.sub(new_offset,relativeness,container_id)); </xsl:text> <xsl:text> </xsl:text> diff -r dabad70db1bf -r 15e2df3e5610 svghmi/hmi_tree.ysl2 --- a/svghmi/hmi_tree.ysl2 Thu Aug 06 15:01:01 2020 +0200 +++ b/svghmi/hmi_tree.ysl2 Sat Aug 08 15:53:28 2020 +0200 @@ -107,9 +107,21 @@ attrib "value" > «.» const "path", "."; const "item", "$indexed_hmitree/*[@hmipath = $path]"; - if "count($item) = 1" { - attrib "index" > «$item/@index» - attrib "type" > «local-name($item)» + choose { + when "count($item) = 1" { + attrib "index" > «$item/@index» + attrib "type" > «local-name($item)» + } + otherwise { + choose { + when "regexp:test($path,'^\.[a-zA-Z0-9_]+')" { + attrib "type" > PAGE_LOCAL + } + when "regexp:test($path,'^[a-zA-Z0-9_]+')" { + attrib "type" > HMI_LOCAL + } + } + } } } } diff -r dabad70db1bf -r 15e2df3e5610 svghmi/svghmi.js --- a/svghmi/svghmi.js Thu Aug 06 15:01:01 2020 +0200 +++ b/svghmi/svghmi.js Sat Aug 08 15:53:28 2020 +0200 @@ -210,6 +210,13 @@ }; function send_hmi_value(index, value) { + if(index > last_remote_index){ + cache[index] = value; + console.log("updated local variable ",index,value); + /* TODO : dispatch value ASAP */ + return; + } + let iectype = hmitree_types[index]; let tobinary = typedarray_types[iectype]; send_blob([ @@ -307,7 +314,10 @@ old_desc.widgets.map(([widget,relativeness])=>widget.unsub()); } var new_offset = page_index == undefined ? 0 : page_index - new_desc.page_index; - new_desc.widgets.map(([widget,relativeness])=>widget.sub(new_offset,relativeness)); + + container_id = String([page_name, page_index]); + + new_desc.widgets.map(([widget,relativeness])=>widget.sub(new_offset,relativeness,container_id)); update_subscriptions(); diff -r dabad70db1bf -r 15e2df3e5610 svghmi/widgets_common.ysl2 --- a/svghmi/widgets_common.ysl2 Thu Aug 06 15:01:01 2020 +0200 +++ b/svghmi/widgets_common.ysl2 Sat Aug 08 15:53:28 2020 +0200 @@ -28,7 +28,14 @@ const "indexes" foreach "$widget/path" { choose { when "not(@index)" { - warning > Widget «$widget/@type» id="«$eltid»" : No match for path "«@value»" in HMI tree + choose { + when "not(@type)" + error > Widget «$widget/@type» id="«$eltid»" : No match for path "«@value»" in HMI tree + when "@type = 'PAGE_LOCAL'" + > "«substring(1,@value)»"`if "position()!=last()" > ,` + when "@type = 'HMI_LOCAL'" + > hmi_local_index("«@value»")`if "position()!=last()" > ,` + } } otherwise { > «@index»`if "position()!=last()" > ,` @@ -62,8 +69,37 @@ } } +emit "preamble:local-variable-indexes" { + || + let hmi_locals = {}; + var last_remote_index = hmitree_types.length - 1; + var next_available_index = hmitree_types.length; + + function page_local_index(varname, pagename){ + let pagevars = hmi_locals[pagename]; + if(pagevars == undefined){ + let new_index = next_available_index++; + hmi_locals[pagename] = {varname:new_index} + return new_index; + } else { + let result = pagevars[varname]; + if(result==undefined){ + let new_index = next_available_index++; + pagevars[varname] = new_index; + return new_index; + } + return result; + } + } + + function hmi_local_index(varname){ + return page_local_index(varname, "HMI_LOCAL"); + } + || +} + emit "preamble:widget-base-class" { - || + || class Widget { offset = 0; frequency = 10; /* FIXME arbitrary default max freq. Obtain from config ? */ @@ -89,49 +125,55 @@ this.relativeness = undefined; } - sub(new_offset=0, relativeness){ + sub(new_offset=0, relativeness, container_id){ this.offset = new_offset; this.relativeness = relativeness; + this.container_id = container_id ; /* add this's subsribers */ if(!this.unsubscribable) for(let i = 0; i < this.indexes.length; i++) { - let index = this.indexes[i]; - if(relativeness[i]) - index += new_offset; + let index = this.get_variable_index(i); + if(index > last_remote_index) return; subscribers[index].add(this); } need_cache_apply.push(this); } apply_cache() { - if(!this.unsubscribable) for(let index of this.indexes){ + if(!this.unsubscribable) for(let i = 0; i < this.indexes.length; i++) { /* dispatch current cache in newly opened page widgets */ - let realindex = index+this.offset; + let realindex = this.get_variable_index(i); let cached_val = cache[realindex]; if(cached_val != undefined) this.new_hmi_value(realindex, cached_val, cached_val); } } - get_idx(index) { - let orig = this.indexes[index]; - return this.relativeness[index] ? orig + this.offset : orig; + get_variable_index(varnum) { + let index = this.indexes[varnum]; + if(typeof(index) == "string"){ + let page = this.relativeness[varnum]; + index = page_local_index(index, this.container_id); + } else { + if(this.relativeness[varnum]){ + index += this.offset; + } + } + return index; } change_hmi_value(index,opstr) { - return change_hmi_value(this.get_idx(index), opstr); + return change_hmi_value(this.get_variable_index(index), opstr); } apply_hmi_value(index, new_val) { - return apply_hmi_value(this.get_idx(0), new_val); + return apply_hmi_value(this.get_variable_index(0), new_val); } new_hmi_value(index, value, oldval) { try { // TODO avoid searching, store index at sub() for(let i = 0; i < this.indexes.length; i++) { - let refindex = this.indexes[i]; - if(this.relativeness[i]) - refindex += this.offset; + let refindex = this.get_variable_index(i); if(index == refindex) { let d = this.dispatch; diff -r dabad70db1bf -r 15e2df3e5610 tests/svghmi/svghmi_0@svghmi/svghmi.svg --- a/tests/svghmi/svghmi_0@svghmi/svghmi.svg Thu Aug 06 15:01:01 2020 +0200 +++ b/tests/svghmi/svghmi_0@svghmi/svghmi.svg Sat Aug 08 15:53:28 2020 +0200 @@ -170,13 +170,13 @@ inkscape:current-layer="hmi0" showgrid="false" units="px" - inkscape:zoom="0.7071068" - inkscape:cx="543.82641" - inkscape:cy="218.7845" - inkscape:window-width="2419" + inkscape:zoom="1" + inkscape:cx="864.70245" + inkscape:cy="281.30768" + inkscape:window-width="2693" inkscape:window-height="1266" - inkscape:window-x="1405" - inkscape:window-y="37" + inkscape:window-x="31" + inkscape:window-y="828" inkscape:window-maximized="0" showguides="true" inkscape:guide-bbox="true" /> @@ -266,7 +266,7 @@ <g id="g84" inkscape:label="HMI:Input@/TARGETPRESSURE" - transform="matrix(0.63690435,0,0,0.63690435,12.496106,18.355376)"> + transform="matrix(0.35865594,0,0,0.35865594,22.072155,63.074421)"> <text inkscape:label="value" id="text5151" @@ -379,13 +379,13 @@ <text inkscape:label="HMI:Display@/PUMP0/PRESSURE" id="text823" - y="157.35477" - x="494.20477" - style="font-style:normal;font-weight:normal;font-size:101.9046936px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.63690436px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + y="141.34827" + x="293.33374" + style="font-style:normal;font-weight:normal;font-size:57.38494873px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.35865593px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" xml:space="preserve"><tspan - style="fill:#ffffff;fill-opacity:1;stroke-width:0.63690436px" - y="157.35477" - x="494.20477" + style="fill:#ffffff;fill-opacity:1;stroke-width:0.35865593px" + y="141.34827" + x="293.33374" id="tspan821" sodipodi:role="line">8888</tspan></text> <g @@ -463,28 +463,28 @@ </g> <text xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:25.4761734px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.63690436px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="175.94542" - y="67.487991" + style="font-style:normal;font-weight:normal;font-size:14.34623718px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.35865593px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="114.11434" + y="90.742165" id="text827" inkscape:label="setpoint_label"><tspan sodipodi:role="line" id="tspan825" - x="175.94542" - y="67.487991" - style="stroke-width:0.63690436px">SetPoint</tspan></text> + x="114.11434" + y="90.742165" + style="stroke-width:0.35865593px">SetPoint</tspan></text> <text id="text831" - y="67.487991" - x="585.08185" - style="font-style:normal;font-weight:normal;font-size:25.4761734px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#008000;fill-opacity:1;stroke:none;stroke-width:0.63690436px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + y="90.742165" + x="344.50876" + style="font-style:normal;font-weight:normal;font-size:14.34623718px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#008000;fill-opacity:1;stroke:none;stroke-width:0.35865593px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" xml:space="preserve" inkscape:label="actual_label"><tspan - y="67.487991" - x="585.08185" + y="90.742165" + x="344.50876" id="tspan829" sodipodi:role="line" - style="stroke-width:0.63690436px">Actual</tspan></text> + style="stroke-width:0.35865593px">Actual</tspan></text> <text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:22.87221527px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.57180536px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" @@ -2809,31 +2809,8 @@ </g> <g id="g1289" - inkscape:label="HMI:JsonTable:/alarms@/ALARMCOUNT"> - <rect - inkscape:label="cursor" - ry="14" - rx="12.247418" - y="68.515991" - x="1192.0886" - height="165.68298" - width="68.255615" - id="rect1264" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bc8f8f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - <path - inkscape:label="backward" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bc8f8f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - d="m 1226.2165,18.9847 34.1278,34.74552 h -68.2556 z" - id="path1266" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cccc" /> - <path - inkscape:label="forward" - sodipodi:nodetypes="cccc" - inkscape:connector-curvature="0" - id="path1268" - d="m 1226.2165,283.7301 34.1278,-34.7453 h -68.2556 z" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bc8f8f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + inkscape:label="HMI:JsonTable:/alarms@/ALARMCOUNT" + transform="matrix(0.5,0,0,0.5,635.30409,71.500438)"> <g id="g5231" inkscape:label="data"> @@ -3147,7 +3124,7 @@ sodipodi:role="line">information</tspan></text> </g> <g - transform="matrix(0.31845218,0,0,0.31845218,701.53368,169.53582)" + transform="matrix(0.2527605,0,0,0.2527605,1089.2831,6.7725187)" inkscape:label="HMI:Input@/ALARMCOUNT" id="g5222"> <text @@ -4224,4 +4201,460 @@ id="tspan829-7" sodipodi:role="line" style="stroke-width:0.63690436px">Multiple variables</tspan></text> + <text + inkscape:label="HMI:Display@paff" + id="text1457" + y="108.60184" + x="902.83728" + style="font-style:normal;font-weight:normal;font-size:45.74443054px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.28590268px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="fill:#ffffff;fill-opacity:1;stroke-width:0.28590268px" + y="108.60184" + x="902.83728" + id="tspan1455" + sodipodi:role="line">8888</tspan></text> + <g + style="stroke-width:2" + inkscape:label="HMI:Input@paff" + id="g1505" + transform="matrix(0.28590269,0,0,0.28590269,700.70444,46.1427)"> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:160px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="136.32812" + y="218.24219" + id="text1461" + inkscape:label="value"><tspan + sodipodi:role="line" + id="tspan1459" + x="136.32812" + y="218.24219" + style="stroke-width:2px">8888</tspan></text> + <rect + inkscape:label="edit" + onclick="" + y="95.40741" + x="139.85185" + height="128" + width="407.7037" + id="rect1463" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff00ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + <g + style="stroke-width:2" + id="g1471" + inkscape:label="+"dhu"" + transform="translate(-416.52022,170.47452)"> + <path + inkscape:connector-curvature="0" + id="path1465" + d="m 797.19546,145.18619 -80.62929,0.60214 -0.60215,-80.629288 80.6293,-0.60214 z" + inkscape:transform-center-y="-14.956361" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + <text + id="text1469" + y="111.05016" + x="733.58197" + style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="stroke-width:1px" + y="111.05016" + x="733.58197" + id="tspan1467" + sodipodi:role="line">dhu</tspan></text> + </g> + <g + style="stroke-width:2" + id="g1479" + inkscape:label="="plop"" + transform="translate(-416.52022,170.47452)"> + <path + inkscape:transform-center-x="14.956371" + inkscape:transform-center-y="-3.6154501e-05" + d="m 622.6459,-170.03172 -51.81035,0 25.90517,-44.86908 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="true" + sodipodi:arg2="1.5707963" + sodipodi:arg1="0.52359878" + sodipodi:r2="14.956361" + sodipodi:r1="29.912722" + sodipodi:cy="-184.98808" + sodipodi:cx="596.74072" + sodipodi:sides="3" + id="path1473" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + sodipodi:type="star" + transform="matrix(0,-2.0000001,1.9999999,0,1034.195,1298.6541)" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="633.09552" + y="111.05016" + id="text1477"><tspan + sodipodi:role="line" + id="tspan1475" + x="633.09552" + y="111.05016" + style="stroke-width:1px">plop</tspan></text> + </g> + <g + style="stroke-width:2" + id="g1487" + inkscape:label="="mhoo"" + transform="translate(-416.52022,170.47452)"> + <path + inkscape:transform-center-x="14.956364" + transform="rotate(-90,746.45698,-44.543641)" + sodipodi:type="star" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="path1481" + sodipodi:sides="3" + sodipodi:cx="596.74072" + sodipodi:cy="-216.2599" + sodipodi:r1="59.825443" + sodipodi:r2="29.912722" + sodipodi:arg1="0.52359878" + sodipodi:arg2="1.5707963" + inkscape:flatsided="true" + inkscape:rounded="0" + inkscape:randomized="0" + d="m 648.55108,-186.34718 -103.62071,0 51.81035,-89.73817 z" + inkscape:transform-center-y="-5.9989963e-06" /> + <text + id="text1485" + y="111.05016" + x="537.25018" + style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="stroke-width:1px" + y="111.05016" + x="537.25018" + id="tspan1483" + sodipodi:role="line">mhoo</tspan></text> + </g> + <g + style="stroke-width:2" + id="g1495" + inkscape:label="="yodl"" + transform="translate(-416.52022,170.47452)"> + <path + inkscape:transform-center-x="-14.956365" + transform="matrix(0,-1,-1,0,1043.9134,701.91334)" + inkscape:transform-center-y="-5.5023185e-06" + d="m 648.55108,135.08534 -103.62071,0 51.81035,-89.738161 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="true" + sodipodi:arg2="1.5707963" + sodipodi:arg1="0.52359878" + sodipodi:r2="29.912722" + sodipodi:r1="59.825443" + sodipodi:cy="105.17262" + sodipodi:cx="596.74072" + sodipodi:sides="3" + id="path1489" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + sodipodi:type="star" /> + <text + id="text1493" + y="111.05016" + x="925.82605" + style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="stroke-width:1px" + y="111.05016" + x="925.82605" + id="tspan1491" + sodipodi:role="line">yodl</tspan></text> + </g> + <g + style="stroke-width:2" + id="g1503" + inkscape:label="="mhe"" + transform="translate(-416.52022,170.47452)"> + <path + inkscape:transform-center-x="-14.956349" + transform="matrix(0,-2.0000001,-1.9999999,0,1122.1514,1298.6541)" + sodipodi:type="star" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="path1497" + sodipodi:sides="3" + sodipodi:cx="596.74072" + sodipodi:cy="136.44444" + sodipodi:r1="29.912722" + sodipodi:r2="14.956361" + sodipodi:arg1="0.52359878" + sodipodi:arg2="1.5707963" + inkscape:flatsided="true" + inkscape:rounded="0" + inkscape:randomized="0" + d="m 622.6459,151.4008 -51.81035,0 25.90517,-44.86908 z" + inkscape:transform-center-y="-3.3040441e-05" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="842.71497" + y="111.05016" + id="text1501"><tspan + sodipodi:role="line" + id="tspan1499" + x="842.71497" + y="111.05016" + style="stroke-width:1px">mhe</tspan></text> + </g> + </g> + <text + inkscape:label="actual_label" + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:25.4761734px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#008000;fill-opacity:1;stroke:none;stroke-width:0.63690436px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="741.62634" + y="57.767578" + id="text1527"><tspan + style="stroke-width:0.63690436px" + sodipodi:role="line" + id="tspan1525" + x="741.62634" + y="57.767578">HMI_LOCAL variables</tspan></text> + <g + id="g1553" + transform="matrix(0.5,0,0,0.5,645.20358,-103.15494)"> + <rect + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bc8f8f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="rect1264" + width="68.255615" + height="165.68298" + x="1141.0836" + y="420.78394" + rx="12.247418" + ry="14" + inkscape:label="cursor" /> + <path + sodipodi:nodetypes="cccc" + inkscape:connector-curvature="0" + id="path1266" + d="m 1175.2115,371.25263 34.1278,34.74552 h -68.2556 z" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bc8f8f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + inkscape:label="backward" /> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bc8f8f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 1175.2115,635.99803 34.1278,-34.7453 h -68.2556 z" + id="path1268" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" + inkscape:label="forward" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:45.74443054px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.28590268px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="902.83728" + y="228.60184" + id="text1557" + inkscape:label="HMI:Display@.piff"><tspan + sodipodi:role="line" + id="tspan1555" + x="902.83728" + y="228.60184" + style="fill:#ffffff;fill-opacity:1;stroke-width:0.28590268px">8888</tspan></text> + <g + transform="matrix(0.28590269,0,0,0.28590269,700.70444,166.1427)" + id="g1605" + inkscape:label="HMI:Input@.piff" + style="stroke-width:2"> + <text + inkscape:label="value" + id="text1561" + y="218.24219" + x="136.32812" + style="font-style:normal;font-weight:normal;font-size:160px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="stroke-width:2px" + y="218.24219" + x="136.32812" + id="tspan1559" + sodipodi:role="line">8888</tspan></text> + <rect + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff00ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="rect1563" + width="407.7037" + height="128" + x="139.85185" + y="95.40741" + onclick="" + inkscape:label="edit" /> + <g + transform="translate(-416.52022,170.47452)" + inkscape:label="+"dhu"" + id="g1571" + style="stroke-width:2"> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + inkscape:transform-center-y="-14.956361" + d="m 797.19546,145.18619 -80.62929,0.60214 -0.60215,-80.629288 80.6293,-0.60214 z" + id="path1565" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="733.58197" + y="111.05016" + id="text1569"><tspan + sodipodi:role="line" + id="tspan1567" + x="733.58197" + y="111.05016" + style="stroke-width:1px">dhu</tspan></text> + </g> + <g + transform="translate(-416.52022,170.47452)" + inkscape:label="="plop"" + id="g1579" + style="stroke-width:2"> + <path + transform="matrix(0,-2.0000001,1.9999999,0,1034.195,1298.6541)" + sodipodi:type="star" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="path1573" + sodipodi:sides="3" + sodipodi:cx="596.74072" + sodipodi:cy="-184.98808" + sodipodi:r1="29.912722" + sodipodi:r2="14.956361" + sodipodi:arg1="0.52359878" + sodipodi:arg2="1.5707963" + inkscape:flatsided="true" + inkscape:rounded="0" + inkscape:randomized="0" + d="m 622.6459,-170.03172 -51.81035,0 25.90517,-44.86908 z" + inkscape:transform-center-y="-3.6154501e-05" + inkscape:transform-center-x="14.956371" /> + <text + id="text1577" + y="111.05016" + x="633.09552" + style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="stroke-width:1px" + y="111.05016" + x="633.09552" + id="tspan1575" + sodipodi:role="line">plop</tspan></text> + </g> + <g + transform="translate(-416.52022,170.47452)" + inkscape:label="="mhoo"" + id="g1587" + style="stroke-width:2"> + <path + inkscape:transform-center-y="-5.9989963e-06" + d="m 648.55108,-186.34718 -103.62071,0 51.81035,-89.73817 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="true" + sodipodi:arg2="1.5707963" + sodipodi:arg1="0.52359878" + sodipodi:r2="29.912722" + sodipodi:r1="59.825443" + sodipodi:cy="-216.2599" + sodipodi:cx="596.74072" + sodipodi:sides="3" + id="path1581" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + sodipodi:type="star" + transform="rotate(-90,746.45698,-44.543641)" + inkscape:transform-center-x="14.956364" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="537.25018" + y="111.05016" + id="text1585"><tspan + sodipodi:role="line" + id="tspan1583" + x="537.25018" + y="111.05016" + style="stroke-width:1px">mhoo</tspan></text> + </g> + <g + transform="translate(-416.52022,170.47452)" + inkscape:label="="yodl"" + id="g1595" + style="stroke-width:2"> + <path + sodipodi:type="star" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="path1589" + sodipodi:sides="3" + sodipodi:cx="596.74072" + sodipodi:cy="105.17262" + sodipodi:r1="59.825443" + sodipodi:r2="29.912722" + sodipodi:arg1="0.52359878" + sodipodi:arg2="1.5707963" + inkscape:flatsided="true" + inkscape:rounded="0" + inkscape:randomized="0" + d="m 648.55108,135.08534 -103.62071,0 51.81035,-89.738161 z" + inkscape:transform-center-y="-5.5023185e-06" + transform="matrix(0,-1,-1,0,1043.9134,701.91334)" + inkscape:transform-center-x="-14.956365" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="925.82605" + y="111.05016" + id="text1593"><tspan + sodipodi:role="line" + id="tspan1591" + x="925.82605" + y="111.05016" + style="stroke-width:1px">yodl</tspan></text> + </g> + <g + transform="translate(-416.52022,170.47452)" + inkscape:label="="mhe"" + id="g1603" + style="stroke-width:2"> + <path + inkscape:transform-center-y="-3.3040441e-05" + d="m 622.6459,151.4008 -51.81035,0 25.90517,-44.86908 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="true" + sodipodi:arg2="1.5707963" + sodipodi:arg1="0.52359878" + sodipodi:r2="14.956361" + sodipodi:r1="29.912722" + sodipodi:cy="136.44444" + sodipodi:cx="596.74072" + sodipodi:sides="3" + id="path1597" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + sodipodi:type="star" + transform="matrix(0,-2.0000001,-1.9999999,0,1122.1514,1298.6541)" + inkscape:transform-center-x="-14.956349" /> + <text + id="text1601" + y="111.05016" + x="842.71497" + style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="stroke-width:1px" + y="111.05016" + x="842.71497" + id="tspan1599" + sodipodi:role="line">mhe</tspan></text> + </g> + </g> + <text + id="text1609" + y="177.76758" + x="741.62634" + style="font-style:normal;font-weight:normal;font-size:25.4761734px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#008000;fill-opacity:1;stroke:none;stroke-width:0.63690436px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="actual_label"><tspan + y="177.76758" + x="741.62634" + sodipodi:role="line" + style="stroke-width:0.63690436px" + id="tspan1611">PAGE_LOCAL variables</tspan></text> </svg>