beremiz

merge

16 months ago, Edouard Tisserant
2fb97bc2158a
merge
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/csv_by_string/beremiz.xml Fri Feb 07 18:42:43 2025 +0100
@@ -0,0 +1,5 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="LOCAL://">
+ <TargetType/>
+ <Libraries Enable_SVGHMI_Library="true"/>
+</BeremizRoot>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/csv_by_string/plc.xml Fri Feb 07 18:42:43 2025 +0100
@@ -0,0 +1,2931 @@
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:ns1="http://www.plcopen.org/xml/tc6_0201">
+ <fileHeader companyName="Unknown" productName="Unnamed" productVersion="1" creationDateTime="2025-02-04T11:16:08"/>
+ <contentHeader name="Unnamed" modificationDateTime="2025-02-05T14:31:39">
+ <coordinateInfo>
+ <fbd>
+ <scaling x="8" y="8"/>
+ </fbd>
+ <ld>
+ <scaling x="8" y="8"/>
+ </ld>
+ <sfc>
+ <scaling x="8" y="8"/>
+ </sfc>
+ </coordinateInfo>
+ </contentHeader>
+ <types>
+ <dataTypes/>
+ <pous>
+ <pou name="move_A" pouType="functionBlock">
+ <interface>
+ <inOutVars>
+ <variable name="Product_Name">
+ <type>
+ <string/>
+ </type>
+ </variable>
+ <variable name="Product_Image">
+ <type>
+ <INT/>
+ </type>
+ </variable>
+ <variable name="Step_1_Bake_Time">
+ <type>
+ <DINT/>
+ </type>
+ </variable>
+ <variable name="Step_1_Bake_Temp">
+ <type>
+ <DINT/>
+ </type>
+ </variable>
+ <variable name="Step_2_Bake_Time">
+ <type>
+ <DINT/>
+ </type>
+ </variable>
+ <variable name="Step_2_Bake_Temp">
+ <type>
+ <DINT/>
+ </type>
+ </variable>
+ </inOutVars>
+ </interface>
+ <body>
+ <ST>
+ <xhtml:p><![CDATA[(* Nothing to do here *)
+RETURN;
+]]></xhtml:p>
+ </ST>
+ </body>
+ <documentation>
+ <xhtml:p><![CDATA[Copy type A parameters from input to output]]></xhtml:p>
+ </documentation>
+ </pou>
+ <pou name="machine_A" pouType="functionBlock">
+ <interface>
+ <inputVars>
+ <variable name="Step_1_Bake_Time">
+ <type>
+ <DINT/>
+ </type>
+ </variable>
+ <variable name="Step_1_Bake_Temp">
+ <type>
+ <DINT/>
+ </type>
+ </variable>
+ <variable name="Step_2_Bake_Time">
+ <type>
+ <DINT/>
+ </type>
+ </variable>
+ <variable name="Step_2_Bake_Temp">
+ <type>
+ <DINT/>
+ </type>
+ </variable>
+ </inputVars>
+ <localVars>
+ <variable name="local_dint">
+ <type>
+ <DINT/>
+ </type>
+ </variable>
+ </localVars>
+ </interface>
+ <body>
+ <FBD>
+ <inVariable localId="2" executionOrderId="0" width="144" height="32" negated="false">
+ <position x="232" y="168"/>
+ <connectionPointOut>
+ <relPosition x="144" y="16"/>
+ </connectionPointOut>
+ <expression>Step_2_Bake_Temp</expression>
+ </inVariable>
+ <outVariable localId="1" executionOrderId="0" width="96" height="32" negated="false">
+ <position x="424" y="168"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="2">
+ <position x="424" y="184"/>
+ <position x="376" y="184"/>
+ </connection>
+ </connectionPointIn>
+ <expression>local_dint</expression>
+ </outVariable>
+ <comment localId="3" height="100" width="332">
+ <position x="200" y="48"/>
+ <content>
+ <xhtml:p><![CDATA[TODO]]></xhtml:p>
+ </content>
+ </comment>
+ </FBD>
+ </body>
+ <documentation>
+ <xhtml:p><![CDATA[]]></xhtml:p>
+ </documentation>
+ </pou>
+ <pou name="write_csv_A" pouType="functionBlock">
+ <interface>
+ <inputVars>
+ <variable name="CSV_NAME">
+ <type>
+ <string/>
+ </type>
+ <documentation>
+ <xhtml:p><![CDATA[ CSV file name]]></xhtml:p>
+ </documentation>
+ </variable>
+ <variable name="SAVE">
+ <type>
+ <BOOL/>
+ </type>
+ <documentation>
+ <xhtml:p><![CDATA[Triggers CSV file read on rising edge]]></xhtml:p>
+ </documentation>
+ </variable>
+ </inputVars>
+ <outputVars>
+ <variable name="ERROR">
+ <type>
+ <BOOL/>
+ </type>
+ <documentation>
+ <xhtml:p><![CDATA[Write operation failed]]></xhtml:p>
+ </documentation>
+ </variable>
+ <variable name="ACK">
+ <type>
+ <BOOL/>
+ </type>
+ <documentation>
+ <xhtml:p><![CDATA[Output is valid]]></xhtml:p>
+ </documentation>
+ </variable>
+ </outputVars>
+ <inputVars>
+ <variable name="Product_Name">
+ <type>
+ <string/>
+ </type>
+ </variable>
+ <variable name="Product_Image">
+ <type>
+ <INT/>
+ </type>
+ </variable>
+ <variable name="Step_1_Bake_Time">
+ <type>
+ <DINT/>
+ </type>
+ </variable>
+ <variable name="Step_1_Bake_Temp">
+ <type>
+ <DINT/>
+ </type>
+ </variable>
+ <variable name="Step_2_Bake_Time">
+ <type>
+ <DINT/>
+ </type>
+ </variable>
+ <variable name="Step_2_Bake_Temp">
+ <type>
+ <DINT/>
+ </type>
+ </variable>
+ </inputVars>
+ <localVars>
+ <variable name="csv_write_by_string0">
+ <type>
+ <derived name="csv_write_by_string"/>
+ </type>
+ </variable>
+ <variable name="csv_write_by_string1">
+ <type>
+ <derived name="csv_write_by_string"/>
+ </type>
+ </variable>
+ <variable name="csv_write_by_string2">
+ <type>
+ <derived name="csv_write_by_string"/>
+ </type>
+ </variable>
+ <variable name="csv_write_by_string3">
+ <type>
+ <derived name="csv_write_by_string"/>
+ </type>
+ </variable>
+ <variable name="csv_write_by_string4">
+ <type>
+ <derived name="csv_write_by_string"/>
+ </type>
+ </variable>
+ <variable name="csv_write_by_string5">
+ <type>
+ <derived name="csv_write_by_string"/>
+ </type>
+ </variable>
+ </localVars>
+ </interface>
+ <body>
+ <FBD>
+ <block localId="2" typeName="csv_write_by_string" instanceName="csv_write_by_string0" executionOrderId="0" width="165" height="176">
+ <position x="632" y="168"/>
+ <inputVariables>
+ <variable formalParameter="FILE_NAME">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="3">
+ <position x="632" y="200"/>
+ <position x="592" y="200"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="ROW">
+ <connectionPointIn>
+ <relPosition x="0" y="64"/>
+ <connection refLocalId="4">
+ <position x="632" y="232"/>
+ <position x="592" y="232"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="COLUMN">
+ <connectionPointIn>
+ <relPosition x="0" y="96"/>
+ <connection refLocalId="1">
+ <position x="632" y="264"/>
+ <position x="592" y="264"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="CONTENT">
+ <connectionPointIn>
+ <relPosition x="0" y="128"/>
+ <connection refLocalId="5">
+ <position x="632" y="296"/>
+ <position x="240" y="296"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="SAVE">
+ <connectionPointIn>
+ <relPosition x="0" y="160"/>
+ <connection refLocalId="56">
+ <position x="632" y="328"/>
+ <position x="592" y="328"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ACK">
+ <connectionPointOut>
+ <relPosition x="165" y="32"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="ERROR">
+ <connectionPointOut>
+ <relPosition x="165" y="64"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="RESULT">
+ <connectionPointOut>
+ <relPosition x="165" y="96"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="3" executionOrderId="0" width="88" height="32" negated="false">
+ <position x="504" y="184"/>
+ <connectionPointOut>
+ <relPosition x="88" y="16"/>
+ </connectionPointOut>
+ <expression>CSV_NAME</expression>
+ </inVariable>
+ <inVariable localId="4" executionOrderId="0" width="128" height="32" negated="false">
+ <position x="464" y="216"/>
+ <connectionPointOut>
+ <relPosition x="128" y="16"/>
+ </connectionPointOut>
+ <expression>'Product_Name'</expression>
+ </inVariable>
+ <inVariable localId="1" executionOrderId="0" width="152" height="32" negated="false">
+ <position x="440" y="248"/>
+ <connectionPointOut>
+ <relPosition x="152" y="16"/>
+ </connectionPointOut>
+ <expression>'Parameter_Value'</expression>
+ </inVariable>
+ <inVariable localId="7" executionOrderId="0" width="88" height="32" negated="false">
+ <position x="504" y="424"/>
+ <connectionPointOut>
+ <relPosition x="88" y="16"/>
+ </connectionPointOut>
+ <expression>CSV_NAME</expression>
+ </inVariable>
+ <inVariable localId="8" executionOrderId="0" width="136" height="32" negated="false">
+ <position x="456" y="456"/>
+ <connectionPointOut>
+ <relPosition x="136" y="16"/>
+ </connectionPointOut>
+ <expression>'Product_Image'</expression>
+ </inVariable>
+ <inVariable localId="9" executionOrderId="0" width="152" height="32" negated="false">
+ <position x="440" y="488"/>
+ <connectionPointOut>
+ <relPosition x="152" y="16"/>
+ </connectionPointOut>
+ <expression>'Parameter_Value'</expression>
+ </inVariable>
+ <inVariable localId="13" executionOrderId="0" width="88" height="32" negated="false">
+ <position x="504" y="664"/>
+ <connectionPointOut>
+ <relPosition x="88" y="16"/>
+ </connectionPointOut>
+ <expression>CSV_NAME</expression>
+ </inVariable>
+ <inVariable localId="14" executionOrderId="0" width="160" height="32" negated="false">
+ <position x="432" y="696"/>
+ <connectionPointOut>
+ <relPosition x="160" y="16"/>
+ </connectionPointOut>
+ <expression>'Step_1_Bake_Time'</expression>
+ </inVariable>
+ <inVariable localId="15" executionOrderId="0" width="152" height="32" negated="false">
+ <position x="440" y="728"/>
+ <connectionPointOut>
+ <relPosition x="152" y="16"/>
+ </connectionPointOut>
+ <expression>'Parameter_Value'</expression>
+ </inVariable>
+ <inVariable localId="19" executionOrderId="0" width="88" height="32" negated="false">
+ <position x="504" y="912"/>
+ <connectionPointOut>
+ <relPosition x="88" y="16"/>
+ </connectionPointOut>
+ <expression>CSV_NAME</expression>
+ </inVariable>
+ <inVariable localId="20" executionOrderId="0" width="160" height="32" negated="false">
+ <position x="432" y="944"/>
+ <connectionPointOut>
+ <relPosition x="160" y="16"/>
+ </connectionPointOut>
+ <expression>'Step_1_Bake_Temp'</expression>
+ </inVariable>
+ <inVariable localId="21" executionOrderId="0" width="152" height="32" negated="false">
+ <position x="440" y="976"/>
+ <connectionPointOut>
+ <relPosition x="152" y="16"/>
+ </connectionPointOut>
+ <expression>'Parameter_Value'</expression>
+ </inVariable>
+ <inVariable localId="25" executionOrderId="0" width="88" height="32" negated="false">
+ <position x="504" y="1160"/>
+ <connectionPointOut>
+ <relPosition x="88" y="16"/>
+ </connectionPointOut>
+ <expression>CSV_NAME</expression>
+ </inVariable>
+ <inVariable localId="26" executionOrderId="0" width="160" height="32" negated="false">
+ <position x="432" y="1192"/>
+ <connectionPointOut>
+ <relPosition x="160" y="16"/>
+ </connectionPointOut>
+ <expression>'Step_2_Bake_Time'</expression>
+ </inVariable>
+ <inVariable localId="27" executionOrderId="0" width="152" height="32" negated="false">
+ <position x="440" y="1224"/>
+ <connectionPointOut>
+ <relPosition x="152" y="16"/>
+ </connectionPointOut>
+ <expression>'Parameter_Value'</expression>
+ </inVariable>
+ <inVariable localId="31" executionOrderId="0" width="88" height="32" negated="false">
+ <position x="504" y="1408"/>
+ <connectionPointOut>
+ <relPosition x="88" y="16"/>
+ </connectionPointOut>
+ <expression>CSV_NAME</expression>
+ </inVariable>
+ <inVariable localId="32" executionOrderId="0" width="160" height="32" negated="false">
+ <position x="432" y="1440"/>
+ <connectionPointOut>
+ <relPosition x="160" y="16"/>
+ </connectionPointOut>
+ <expression>'Step_2_Bake_Temp'</expression>
+ </inVariable>
+ <inVariable localId="33" executionOrderId="0" width="152" height="32" negated="false">
+ <position x="440" y="1472"/>
+ <connectionPointOut>
+ <relPosition x="152" y="16"/>
+ </connectionPointOut>
+ <expression>'Parameter_Value'</expression>
+ </inVariable>
+ <outVariable localId="42" executionOrderId="0" width="72" height="32" negated="false">
+ <position x="1424" y="384"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="43" formalParameter="OUT">
+ <position x="1424" y="400"/>
+ <position x="1392" y="400"/>
+ </connection>
+ </connectionPointIn>
+ <expression>ERROR</expression>
+ </outVariable>
+ <block localId="43" typeName="OR" executionOrderId="0" width="72" height="168">
+ <position x="1320" y="368"/>
+ <inputVariables>
+ <variable formalParameter="IN1">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="45">
+ <position x="1320" y="400"/>
+ <position x="1290" y="400"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN2">
+ <connectionPointIn>
+ <relPosition x="0" y="56"/>
+ <connection refLocalId="47">
+ <position x="1320" y="424"/>
+ <position x="1290" y="424"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN3">
+ <connectionPointIn>
+ <relPosition x="0" y="80"/>
+ <connection refLocalId="49">
+ <position x="1320" y="448"/>
+ <position x="1290" y="448"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN4">
+ <connectionPointIn>
+ <relPosition x="0" y="104"/>
+ <connection refLocalId="51">
+ <position x="1320" y="472"/>
+ <position x="1290" y="472"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN5">
+ <connectionPointIn>
+ <relPosition x="0" y="128"/>
+ <connection refLocalId="53">
+ <position x="1320" y="496"/>
+ <position x="1290" y="496"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN6">
+ <connectionPointIn>
+ <relPosition x="0" y="152"/>
+ <connection refLocalId="55">
+ <position x="1320" y="520"/>
+ <position x="1290" y="520"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="72" y="32"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <connector name="Connection0" localId="44" width="125" height="27">
+ <position x="875" y="216"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="2" formalParameter="ERROR">
+ <position x="875" y="232"/>
+ <position x="797" y="232"/>
+ </connection>
+ </connectionPointIn>
+ </connector>
+ <continuation name="Connection0" localId="45" width="125" height="27">
+ <position x="1165" y="384"/>
+ <connectionPointOut>
+ <relPosition x="125" y="16"/>
+ </connectionPointOut>
+ </continuation>
+ <connector name="Connection1" localId="46" width="125" height="27">
+ <position x="875" y="456"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="11" formalParameter="ERROR">
+ <position x="875" y="472"/>
+ <position x="797" y="472"/>
+ </connection>
+ </connectionPointIn>
+ </connector>
+ <continuation name="Connection1" localId="47" width="125" height="27">
+ <position x="1165" y="408"/>
+ <connectionPointOut>
+ <relPosition x="125" y="16"/>
+ </connectionPointOut>
+ </continuation>
+ <connector name="Connection2" localId="48" width="125" height="27">
+ <position x="875" y="696"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="12" formalParameter="ERROR">
+ <position x="875" y="712"/>
+ <position x="797" y="712"/>
+ </connection>
+ </connectionPointIn>
+ </connector>
+ <continuation name="Connection2" localId="49" width="125" height="27">
+ <position x="1165" y="432"/>
+ <connectionPointOut>
+ <relPosition x="125" y="16"/>
+ </connectionPointOut>
+ </continuation>
+ <connector name="Connection3" localId="50" width="125" height="27">
+ <position x="875" y="944"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="18" formalParameter="ERROR">
+ <position x="875" y="960"/>
+ <position x="797" y="960"/>
+ </connection>
+ </connectionPointIn>
+ </connector>
+ <continuation name="Connection3" localId="51" width="125" height="27">
+ <position x="1165" y="456"/>
+ <connectionPointOut>
+ <relPosition x="125" y="16"/>
+ </connectionPointOut>
+ </continuation>
+ <connector name="Connection4" localId="52" width="125" height="27">
+ <position x="875" y="1192"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="24" formalParameter="ERROR">
+ <position x="875" y="1208"/>
+ <position x="797" y="1208"/>
+ </connection>
+ </connectionPointIn>
+ </connector>
+ <continuation name="Connection4" localId="53" width="125" height="27">
+ <position x="1165" y="480"/>
+ <connectionPointOut>
+ <relPosition x="125" y="16"/>
+ </connectionPointOut>
+ </continuation>
+ <connector name="Connection5" localId="54" width="125" height="27">
+ <position x="875" y="1440"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="30" formalParameter="ERROR">
+ <position x="875" y="1456"/>
+ <position x="797" y="1456"/>
+ </connection>
+ </connectionPointIn>
+ </connector>
+ <continuation name="Connection5" localId="55" width="125" height="27">
+ <position x="1165" y="504"/>
+ <connectionPointOut>
+ <relPosition x="125" y="16"/>
+ </connectionPointOut>
+ </continuation>
+ <inVariable localId="5" executionOrderId="0" width="112" height="32" negated="false">
+ <position x="128" y="280"/>
+ <connectionPointOut>
+ <relPosition x="112" y="16"/>
+ </connectionPointOut>
+ <expression>Product_Name</expression>
+ </inVariable>
+ <inVariable localId="56" executionOrderId="0" width="48" height="32" negated="false">
+ <position x="544" y="312"/>
+ <connectionPointOut>
+ <relPosition x="48" y="16"/>
+ </connectionPointOut>
+ <expression>SAVE</expression>
+ </inVariable>
+ <inVariable localId="34" executionOrderId="0" width="152" height="48" negated="false">
+ <position x="120" y="1496"/>
+ <connectionPointOut>
+ <relPosition x="152" y="24"/>
+ </connectionPointOut>
+ <expression>Step_2_Bake_Temp</expression>
+ </inVariable>
+ <inVariable localId="28" executionOrderId="0" width="152" height="32" negated="false">
+ <position x="120" y="1256"/>
+ <connectionPointOut>
+ <relPosition x="152" y="16"/>
+ </connectionPointOut>
+ <expression>Step_2_Bake_Time</expression>
+ </inVariable>
+ <inVariable localId="22" executionOrderId="0" width="144" height="38" negated="false">
+ <position x="128" y="1008"/>
+ <connectionPointOut>
+ <relPosition x="144" y="16"/>
+ </connectionPointOut>
+ <expression>Step_1_Bake_Temp</expression>
+ </inVariable>
+ <inVariable localId="16" executionOrderId="0" width="144" height="40" negated="false">
+ <position x="128" y="760"/>
+ <connectionPointOut>
+ <relPosition x="144" y="16"/>
+ </connectionPointOut>
+ <expression>Step_1_Bake_Time</expression>
+ </inVariable>
+ <inVariable localId="10" executionOrderId="0" width="120" height="32" negated="false">
+ <position x="128" y="520"/>
+ <connectionPointOut>
+ <relPosition x="120" y="16"/>
+ </connectionPointOut>
+ <expression>Product_Image</expression>
+ </inVariable>
+ <inVariable localId="6" executionOrderId="0" width="48" height="32" negated="false">
+ <position x="544" y="552"/>
+ <connectionPointOut>
+ <relPosition x="48" y="16"/>
+ </connectionPointOut>
+ <expression>SAVE</expression>
+ </inVariable>
+ <block localId="11" typeName="csv_write_by_string" instanceName="csv_write_by_string1" executionOrderId="0" width="165" height="176">
+ <position x="632" y="408"/>
+ <inputVariables>
+ <variable formalParameter="FILE_NAME">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="7">
+ <position x="632" y="440"/>
+ <position x="592" y="440"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="ROW">
+ <connectionPointIn>
+ <relPosition x="0" y="64"/>
+ <connection refLocalId="8">
+ <position x="632" y="472"/>
+ <position x="592" y="472"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="COLUMN">
+ <connectionPointIn>
+ <relPosition x="0" y="96"/>
+ <connection refLocalId="9">
+ <position x="632" y="504"/>
+ <position x="592" y="504"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="CONTENT">
+ <connectionPointIn>
+ <relPosition x="0" y="128"/>
+ <connection refLocalId="57" formalParameter="OUT">
+ <position x="632" y="536"/>
+ <position x="421" y="536"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="SAVE">
+ <connectionPointIn>
+ <relPosition x="0" y="160"/>
+ <connection refLocalId="6">
+ <position x="632" y="568"/>
+ <position x="592" y="568"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ACK">
+ <connectionPointOut>
+ <relPosition x="165" y="32"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="ERROR">
+ <connectionPointOut>
+ <relPosition x="165" y="64"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="RESULT">
+ <connectionPointOut>
+ <relPosition x="165" y="96"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <block localId="12" typeName="csv_write_by_string" instanceName="csv_write_by_string2" executionOrderId="0" width="165" height="176">
+ <position x="632" y="648"/>
+ <inputVariables>
+ <variable formalParameter="FILE_NAME">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="13">
+ <position x="632" y="680"/>
+ <position x="592" y="680"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="ROW">
+ <connectionPointIn>
+ <relPosition x="0" y="64"/>
+ <connection refLocalId="14">
+ <position x="632" y="712"/>
+ <position x="592" y="712"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="COLUMN">
+ <connectionPointIn>
+ <relPosition x="0" y="96"/>
+ <connection refLocalId="15">
+ <position x="632" y="744"/>
+ <position x="592" y="744"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="CONTENT">
+ <connectionPointIn>
+ <relPosition x="0" y="128"/>
+ <connection refLocalId="58" formalParameter="OUT">
+ <position x="632" y="776"/>
+ <position x="432" y="776"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="SAVE">
+ <connectionPointIn>
+ <relPosition x="0" y="160"/>
+ <connection refLocalId="17">
+ <position x="632" y="808"/>
+ <position x="592" y="808"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ACK">
+ <connectionPointOut>
+ <relPosition x="165" y="32"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="ERROR">
+ <connectionPointOut>
+ <relPosition x="165" y="64"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="RESULT">
+ <connectionPointOut>
+ <relPosition x="165" y="96"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="17" executionOrderId="0" width="48" height="32" negated="false">
+ <position x="544" y="792"/>
+ <connectionPointOut>
+ <relPosition x="48" y="16"/>
+ </connectionPointOut>
+ <expression>SAVE</expression>
+ </inVariable>
+ <block localId="18" typeName="csv_write_by_string" instanceName="csv_write_by_string3" executionOrderId="0" width="165" height="176">
+ <position x="632" y="896"/>
+ <inputVariables>
+ <variable formalParameter="FILE_NAME">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="19">
+ <position x="632" y="928"/>
+ <position x="592" y="928"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="ROW">
+ <connectionPointIn>
+ <relPosition x="0" y="64"/>
+ <connection refLocalId="20">
+ <position x="632" y="960"/>
+ <position x="592" y="960"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="COLUMN">
+ <connectionPointIn>
+ <relPosition x="0" y="96"/>
+ <connection refLocalId="21">
+ <position x="632" y="992"/>
+ <position x="592" y="992"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="CONTENT">
+ <connectionPointIn>
+ <relPosition x="0" y="128"/>
+ <connection refLocalId="36" formalParameter="OUT">
+ <position x="632" y="1024"/>
+ <position x="432" y="1024"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="SAVE">
+ <connectionPointIn>
+ <relPosition x="0" y="160"/>
+ <connection refLocalId="23">
+ <position x="632" y="1056"/>
+ <position x="592" y="1056"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ACK">
+ <connectionPointOut>
+ <relPosition x="165" y="32"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="ERROR">
+ <connectionPointOut>
+ <relPosition x="165" y="64"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="RESULT">
+ <connectionPointOut>
+ <relPosition x="165" y="96"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="23" executionOrderId="0" width="48" height="32" negated="false">
+ <position x="544" y="1040"/>
+ <connectionPointOut>
+ <relPosition x="48" y="16"/>
+ </connectionPointOut>
+ <expression>SAVE</expression>
+ </inVariable>
+ <block localId="24" typeName="csv_write_by_string" instanceName="csv_write_by_string4" executionOrderId="0" width="165" height="176">
+ <position x="632" y="1144"/>
+ <inputVariables>
+ <variable formalParameter="FILE_NAME">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="25">
+ <position x="632" y="1176"/>
+ <position x="592" y="1176"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="ROW">
+ <connectionPointIn>
+ <relPosition x="0" y="64"/>
+ <connection refLocalId="26">
+ <position x="632" y="1208"/>
+ <position x="592" y="1208"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="COLUMN">
+ <connectionPointIn>
+ <relPosition x="0" y="96"/>
+ <connection refLocalId="27">
+ <position x="632" y="1240"/>
+ <position x="592" y="1240"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="CONTENT">
+ <connectionPointIn>
+ <relPosition x="0" y="128"/>
+ <connection refLocalId="37" formalParameter="OUT">
+ <position x="632" y="1272"/>
+ <position x="432" y="1272"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="SAVE">
+ <connectionPointIn>
+ <relPosition x="0" y="160"/>
+ <connection refLocalId="29">
+ <position x="632" y="1304"/>
+ <position x="592" y="1304"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ACK">
+ <connectionPointOut>
+ <relPosition x="165" y="32"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="ERROR">
+ <connectionPointOut>
+ <relPosition x="165" y="64"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="RESULT">
+ <connectionPointOut>
+ <relPosition x="165" y="96"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="29" executionOrderId="0" width="48" height="32" negated="false">
+ <position x="544" y="1288"/>
+ <connectionPointOut>
+ <relPosition x="48" y="16"/>
+ </connectionPointOut>
+ <expression>SAVE</expression>
+ </inVariable>
+ <block localId="30" typeName="csv_write_by_string" instanceName="csv_write_by_string5" executionOrderId="0" width="165" height="176">
+ <position x="632" y="1392"/>
+ <inputVariables>
+ <variable formalParameter="FILE_NAME">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="31">
+ <position x="632" y="1424"/>
+ <position x="592" y="1424"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="ROW">
+ <connectionPointIn>
+ <relPosition x="0" y="64"/>
+ <connection refLocalId="32">
+ <position x="632" y="1456"/>
+ <position x="592" y="1456"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="COLUMN">
+ <connectionPointIn>
+ <relPosition x="0" y="96"/>
+ <connection refLocalId="33">
+ <position x="632" y="1488"/>
+ <position x="592" y="1488"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="CONTENT">
+ <connectionPointIn>
+ <relPosition x="0" y="128"/>
+ <connection refLocalId="38" formalParameter="OUT">
+ <position x="632" y="1520"/>
+ <position x="432" y="1520"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="SAVE">
+ <connectionPointIn>
+ <relPosition x="0" y="160"/>
+ <connection refLocalId="35">
+ <position x="632" y="1552"/>
+ <position x="592" y="1552"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ACK">
+ <connectionPointOut>
+ <relPosition x="165" y="32"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="ERROR">
+ <connectionPointOut>
+ <relPosition x="165" y="64"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="RESULT">
+ <connectionPointOut>
+ <relPosition x="165" y="96"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="35" executionOrderId="0" width="48" height="32" negated="false">
+ <position x="544" y="1536"/>
+ <connectionPointOut>
+ <relPosition x="48" y="16"/>
+ </connectionPointOut>
+ <expression>SAVE</expression>
+ </inVariable>
+ <block localId="57" typeName="INT_TO_STRING" executionOrderId="0" width="117" height="43">
+ <position x="304" y="504"/>
+ <inputVariables>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="10">
+ <position x="304" y="536"/>
+ <position x="248" y="536"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="117" y="32"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <block localId="58" typeName="DINT_TO_STRING" executionOrderId="0" width="128" height="48">
+ <position x="304" y="744"/>
+ <inputVariables>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="16">
+ <position x="304" y="776"/>
+ <position x="272" y="776"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="128" y="32"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <block localId="36" typeName="DINT_TO_STRING" executionOrderId="0" width="128" height="48">
+ <position x="304" y="992"/>
+ <inputVariables>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="22">
+ <position x="304" y="1024"/>
+ <position x="272" y="1024"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="128" y="32"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <block localId="37" typeName="DINT_TO_STRING" executionOrderId="0" width="128" height="48">
+ <position x="304" y="1240"/>
+ <inputVariables>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="28">
+ <position x="304" y="1272"/>
+ <position x="272" y="1272"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="128" y="32"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <block localId="38" typeName="DINT_TO_STRING" executionOrderId="0" width="128" height="48">
+ <position x="304" y="1488"/>
+ <inputVariables>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="34">
+ <position x="304" y="1520"/>
+ <position x="272" y="1520"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="128" y="32"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <outVariable localId="39" executionOrderId="0" width="75" height="35" negated="false">
+ <position x="1427" y="184"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="40" formalParameter="OUT">
+ <position x="1427" y="200"/>
+ <position x="1400" y="200"/>
+ </connection>
+ </connectionPointIn>
+ <expression>ACK</expression>
+ </outVariable>
+ <block localId="40" typeName="AND" executionOrderId="0" width="80" height="168">
+ <position x="1320" y="168"/>
+ <inputVariables>
+ <variable formalParameter="IN1">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="66">
+ <position x="1320" y="200"/>
+ <position x="1290" y="200"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN2">
+ <connectionPointIn>
+ <relPosition x="0" y="56"/>
+ <connection refLocalId="68">
+ <position x="1320" y="224"/>
+ <position x="1290" y="224"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN3">
+ <connectionPointIn>
+ <relPosition x="0" y="80"/>
+ <connection refLocalId="70">
+ <position x="1320" y="248"/>
+ <position x="1290" y="248"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN4">
+ <connectionPointIn>
+ <relPosition x="0" y="104"/>
+ <connection refLocalId="72">
+ <position x="1320" y="272"/>
+ <position x="1290" y="272"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN5">
+ <connectionPointIn>
+ <relPosition x="0" y="128"/>
+ <connection refLocalId="74">
+ <position x="1320" y="296"/>
+ <position x="1290" y="296"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN6">
+ <connectionPointIn>
+ <relPosition x="0" y="152"/>
+ <connection refLocalId="76">
+ <position x="1320" y="320"/>
+ <position x="1290" y="320"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="80" y="32"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <connector name="Connection6" localId="65" width="125" height="27">
+ <position x="875" y="184"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="2" formalParameter="ACK">
+ <position x="875" y="200"/>
+ <position x="797" y="200"/>
+ </connection>
+ </connectionPointIn>
+ </connector>
+ <continuation name="Connection6" localId="66" width="125" height="27">
+ <position x="1165" y="184"/>
+ <connectionPointOut>
+ <relPosition x="125" y="16"/>
+ </connectionPointOut>
+ </continuation>
+ <connector name="Connection7" localId="67" width="125" height="27">
+ <position x="875" y="424"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="11" formalParameter="ACK">
+ <position x="875" y="440"/>
+ <position x="797" y="440"/>
+ </connection>
+ </connectionPointIn>
+ </connector>
+ <continuation name="Connection7" localId="68" width="125" height="27">
+ <position x="1165" y="208"/>
+ <connectionPointOut>
+ <relPosition x="125" y="16"/>
+ </connectionPointOut>
+ </continuation>
+ <connector name="Connection8" localId="69" width="125" height="27">
+ <position x="875" y="664"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="12" formalParameter="ACK">
+ <position x="875" y="680"/>
+ <position x="797" y="680"/>
+ </connection>
+ </connectionPointIn>
+ </connector>
+ <continuation name="Connection8" localId="70" width="125" height="27">
+ <position x="1165" y="232"/>
+ <connectionPointOut>
+ <relPosition x="125" y="16"/>
+ </connectionPointOut>
+ </continuation>
+ <connector name="Connection9" localId="71" width="125" height="27">
+ <position x="875" y="912"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="18" formalParameter="ACK">
+ <position x="875" y="928"/>
+ <position x="797" y="928"/>
+ </connection>
+ </connectionPointIn>
+ </connector>
+ <continuation name="Connection9" localId="72" width="125" height="27">
+ <position x="1165" y="256"/>
+ <connectionPointOut>
+ <relPosition x="125" y="16"/>
+ </connectionPointOut>
+ </continuation>
+ <connector name="Connection10" localId="73" width="133" height="27">
+ <position x="875" y="1160"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="24" formalParameter="ACK">
+ <position x="875" y="1176"/>
+ <position x="797" y="1176"/>
+ </connection>
+ </connectionPointIn>
+ </connector>
+ <continuation name="Connection10" localId="74" width="133" height="27">
+ <position x="1157" y="280"/>
+ <connectionPointOut>
+ <relPosition x="133" y="16"/>
+ </connectionPointOut>
+ </continuation>
+ <connector name="Connection11" localId="75" width="133" height="27">
+ <position x="827" y="1408"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="30" formalParameter="ACK">
+ <position x="827" y="1424"/>
+ <position x="797" y="1424"/>
+ </connection>
+ </connectionPointIn>
+ </connector>
+ <continuation name="Connection11" localId="76" width="133" height="27">
+ <position x="1157" y="304"/>
+ <connectionPointOut>
+ <relPosition x="133" y="16"/>
+ </connectionPointOut>
+ </continuation>
+ </FBD>
+ </body>
+ <documentation>
+ <xhtml:p><![CDATA[Read CSV file of type A]]></xhtml:p>
+ </documentation>
+ </pou>
+ <pou name="program0" pouType="program">
+ <interface>
+ <localVars>
+ <variable name="SAVE_BT">
+ <type>
+ <derived name="HMI_BOOL"/>
+ </type>
+ </variable>
+ <variable name="SAVE_AS_BT">
+ <type>
+ <derived name="HMI_BOOL"/>
+ </type>
+ </variable>
+ <variable name="RD_SUCCESS">
+ <type>
+ <derived name="HMI_BOOL"/>
+ </type>
+ </variable>
+ <variable name="SAVE_ACK">
+ <type>
+ <derived name="HMI_BOOL"/>
+ </type>
+ </variable>
+ <variable name="SAVE_SUCCESS">
+ <type>
+ <derived name="HMI_BOOL"/>
+ </type>
+ </variable>
+ <variable name="CURRENT_CSV">
+ <type>
+ <derived name="HMI_STRING"/>
+ </type>
+ <initialValue>
+ <simpleValue value="test.csv"/>
+ </initialValue>
+ </variable>
+ <variable name="SAVE_AS_CSV">
+ <type>
+ <derived name="HMI_STRING"/>
+ </type>
+ <initialValue>
+ <simpleValue value="test2.csv"/>
+ </initialValue>
+ </variable>
+ <variable name="Product_Name">
+ <type>
+ <derived name="HMI_STRING"/>
+ </type>
+ <initialValue>
+ <simpleValue value="'unknown'"/>
+ </initialValue>
+ </variable>
+ <variable name="Product_Image">
+ <type>
+ <derived name="HMI_INT"/>
+ </type>
+ <initialValue>
+ <simpleValue value="0"/>
+ </initialValue>
+ </variable>
+ <variable name="Step_1_Bake_Time">
+ <type>
+ <derived name="HMI_DINT"/>
+ </type>
+ <initialValue>
+ <simpleValue value="60"/>
+ </initialValue>
+ </variable>
+ <variable name="Step_1_Bake_Temp">
+ <type>
+ <derived name="HMI_DINT"/>
+ </type>
+ <initialValue>
+ <simpleValue value="120"/>
+ </initialValue>
+ </variable>
+ <variable name="Step_2_Bake_Time">
+ <type>
+ <derived name="HMI_DINT"/>
+ </type>
+ <initialValue>
+ <simpleValue value="90"/>
+ </initialValue>
+ </variable>
+ <variable name="Step_2_Bake_Temp">
+ <type>
+ <derived name="HMI_DINT"/>
+ </type>
+ <initialValue>
+ <simpleValue value="180"/>
+ </initialValue>
+ </variable>
+ <variable name="read_csv_A0">
+ <type>
+ <derived name="read_csv_A"/>
+ </type>
+ </variable>
+ <variable name="write_csv_A0">
+ <type>
+ <derived name="write_csv_A"/>
+ </type>
+ </variable>
+ <variable name="machine_A0">
+ <type>
+ <derived name="machine_A"/>
+ </type>
+ </variable>
+ <variable name="move_A0">
+ <type>
+ <derived name="move_A"/>
+ </type>
+ </variable>
+ </localVars>
+ </interface>
+ <body>
+ <FBD>
+ <block localId="1" typeName="read_csv_A" instanceName="read_csv_A0" executionOrderId="0" width="208" height="416">
+ <position x="272" y="232"/>
+ <inputVariables>
+ <variable formalParameter="CSV_NAME">
+ <connectionPointIn>
+ <relPosition x="0" y="48"/>
+ <connection refLocalId="10">
+ <position x="272" y="280"/>
+ <position x="200" y="280"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="SUCCESS">
+ <connectionPointOut>
+ <relPosition x="208" y="48"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="Product_Name">
+ <connectionPointOut>
+ <relPosition x="208" y="104"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="Product_Image">
+ <connectionPointOut>
+ <relPosition x="208" y="160"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="Step_1_Bake_Time">
+ <connectionPointOut>
+ <relPosition x="208" y="216"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="Step_1_Bake_Temp">
+ <connectionPointOut>
+ <relPosition x="208" y="272"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="Step_2_Bake_Time">
+ <connectionPointOut>
+ <relPosition x="208" y="328"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="Step_2_Bake_Temp">
+ <connectionPointOut>
+ <relPosition x="208" y="384"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <block localId="2" typeName="write_csv_A" instanceName="write_csv_A0" executionOrderId="0" width="184" height="472">
+ <position x="1216" y="176"/>
+ <inputVariables>
+ <variable formalParameter="CSV_NAME">
+ <connectionPointIn>
+ <relPosition x="0" y="48"/>
+ <connection refLocalId="12" formalParameter="OUT">
+ <position x="1216" y="224"/>
+ <position x="1184" y="224"/>
+ <position x="1184" y="136"/>
+ <position x="1138" y="136"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="SAVE">
+ <connectionPointIn>
+ <relPosition x="0" y="104"/>
+ <connection refLocalId="16" formalParameter="OUT">
+ <position x="1216" y="280"/>
+ <position x="1164" y="280"/>
+ <position x="1164" y="256"/>
+ <position x="1138" y="256"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="Product_Name">
+ <connectionPointIn>
+ <relPosition x="0" y="160"/>
+ <connection refLocalId="3">
+ <position x="1216" y="336"/>
+ <position x="1064" y="336"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="Product_Image">
+ <connectionPointIn>
+ <relPosition x="0" y="216"/>
+ <connection refLocalId="4">
+ <position x="1216" y="392"/>
+ <position x="1072" y="392"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="Step_1_Bake_Time">
+ <connectionPointIn>
+ <relPosition x="0" y="272"/>
+ <connection refLocalId="5">
+ <position x="1216" y="448"/>
+ <position x="1088" y="448"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="Step_1_Bake_Temp">
+ <connectionPointIn>
+ <relPosition x="0" y="328"/>
+ <connection refLocalId="6">
+ <position x="1216" y="504"/>
+ <position x="1088" y="504"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="Step_2_Bake_Time">
+ <connectionPointIn>
+ <relPosition x="0" y="384"/>
+ <connection refLocalId="7">
+ <position x="1216" y="560"/>
+ <position x="1088" y="560"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="Step_2_Bake_Temp">
+ <connectionPointIn>
+ <relPosition x="0" y="440"/>
+ <connection refLocalId="8">
+ <position x="1216" y="616"/>
+ <position x="1088" y="616"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ERROR" negated="true">
+ <connectionPointOut>
+ <relPosition x="184" y="48"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="ACK">
+ <connectionPointOut>
+ <relPosition x="184" y="104"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inOutVariable localId="3" executionOrderId="0" width="112" height="32" negatedOut="false" negatedIn="false">
+ <position x="952" y="320"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="23" formalParameter="Product_Name">
+ <position x="952" y="336"/>
+ <position x="842" y="336"/>
+ </connection>
+ </connectionPointIn>
+ <connectionPointOut>
+ <relPosition x="112" y="16"/>
+ </connectionPointOut>
+ <expression>Product_Name</expression>
+ </inOutVariable>
+ <inOutVariable localId="4" executionOrderId="0" width="120" height="32" negatedOut="false" negatedIn="false">
+ <position x="952" y="376"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="23" formalParameter="Product_Image">
+ <position x="952" y="392"/>
+ <position x="842" y="392"/>
+ </connection>
+ </connectionPointIn>
+ <connectionPointOut>
+ <relPosition x="120" y="16"/>
+ </connectionPointOut>
+ <expression>Product_Image</expression>
+ </inOutVariable>
+ <inOutVariable localId="5" executionOrderId="0" width="144" height="32" negatedOut="false" negatedIn="false">
+ <position x="944" y="432"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="23" formalParameter="Step_1_Bake_Time">
+ <position x="944" y="448"/>
+ <position x="842" y="448"/>
+ </connection>
+ </connectionPointIn>
+ <connectionPointOut>
+ <relPosition x="144" y="16"/>
+ </connectionPointOut>
+ <expression>Step_1_Bake_Time</expression>
+ </inOutVariable>
+ <inOutVariable localId="6" executionOrderId="0" width="144" height="32" negatedOut="false" negatedIn="false">
+ <position x="944" y="488"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="23" formalParameter="Step_1_Bake_Temp">
+ <position x="944" y="504"/>
+ <position x="842" y="504"/>
+ </connection>
+ </connectionPointIn>
+ <connectionPointOut>
+ <relPosition x="144" y="16"/>
+ </connectionPointOut>
+ <expression>Step_1_Bake_Temp</expression>
+ </inOutVariable>
+ <inOutVariable localId="7" executionOrderId="0" width="144" height="32" negatedOut="false" negatedIn="false">
+ <position x="944" y="544"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="23" formalParameter="Step_2_Bake_Time">
+ <position x="944" y="560"/>
+ <position x="842" y="560"/>
+ </connection>
+ </connectionPointIn>
+ <connectionPointOut>
+ <relPosition x="144" y="16"/>
+ </connectionPointOut>
+ <expression>Step_2_Bake_Time</expression>
+ </inOutVariable>
+ <inOutVariable localId="8" executionOrderId="0" width="144" height="32" negatedOut="false" negatedIn="false">
+ <position x="944" y="600"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="23" formalParameter="Step_2_Bake_Temp">
+ <position x="944" y="616"/>
+ <position x="842" y="616"/>
+ </connection>
+ </connectionPointIn>
+ <connectionPointOut>
+ <relPosition x="144" y="16"/>
+ </connectionPointOut>
+ <expression>Step_2_Bake_Temp</expression>
+ </inOutVariable>
+ <inVariable localId="9" executionOrderId="0" width="104" height="32" negated="false">
+ <position x="920" y="240"/>
+ <connectionPointOut>
+ <relPosition x="104" y="16"/>
+ </connectionPointOut>
+ <expression>SAVE_BT</expression>
+ </inVariable>
+ <inVariable localId="10" executionOrderId="0" width="104" height="32" negated="false">
+ <position x="96" y="264"/>
+ <connectionPointOut>
+ <relPosition x="104" y="16"/>
+ </connectionPointOut>
+ <expression>CURRENT_CSV</expression>
+ </inVariable>
+ <inVariable localId="11" executionOrderId="0" width="128" height="32" negated="false">
+ <position x="896" y="120"/>
+ <connectionPointOut>
+ <relPosition x="128" y="16"/>
+ </connectionPointOut>
+ <expression>SAVE_AS_BT</expression>
+ </inVariable>
+ <block localId="12" typeName="SEL" executionOrderId="0" width="66" height="120">
+ <position x="1072" y="99"/>
+ <inputVariables>
+ <variable formalParameter="G">
+ <connectionPointIn>
+ <relPosition x="0" y="37"/>
+ <connection refLocalId="11">
+ <position x="1072" y="136"/>
+ <position x="1024" y="136"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN0">
+ <connectionPointIn>
+ <relPosition x="0" y="69"/>
+ <connection refLocalId="13">
+ <position x="1072" y="168"/>
+ <position x="1024" y="168"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN1">
+ <connectionPointIn>
+ <relPosition x="0" y="101"/>
+ <connection refLocalId="14">
+ <position x="1072" y="200"/>
+ <position x="1024" y="200"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="66" y="37"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="13" executionOrderId="0" width="104" height="32" negated="false">
+ <position x="920" y="152"/>
+ <connectionPointOut>
+ <relPosition x="104" y="16"/>
+ </connectionPointOut>
+ <expression>CURRENT_CSV</expression>
+ </inVariable>
+ <inVariable localId="14" executionOrderId="0" width="104" height="32" negated="false">
+ <position x="920" y="184"/>
+ <connectionPointOut>
+ <relPosition x="104" y="16"/>
+ </connectionPointOut>
+ <expression>SAVE_AS_CSV</expression>
+ </inVariable>
+ <inVariable localId="15" executionOrderId="0" width="128" height="32" negated="false">
+ <position x="896" y="272"/>
+ <connectionPointOut>
+ <relPosition x="128" y="16"/>
+ </connectionPointOut>
+ <expression>SAVE_AS_BT</expression>
+ </inVariable>
+ <block localId="16" typeName="OR" executionOrderId="0" width="66" height="80">
+ <position x="1072" y="223"/>
+ <inputVariables>
+ <variable formalParameter="IN1">
+ <connectionPointIn>
+ <relPosition x="0" y="33"/>
+ <connection refLocalId="9">
+ <position x="1072" y="256"/>
+ <position x="1024" y="256"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN2">
+ <connectionPointIn>
+ <relPosition x="0" y="65"/>
+ <connection refLocalId="15">
+ <position x="1072" y="288"/>
+ <position x="1024" y="288"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="66" y="33"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="17" executionOrderId="0" width="144" height="32" negated="false">
+ <position x="656" y="768"/>
+ <connectionPointOut>
+ <relPosition x="144" y="16"/>
+ </connectionPointOut>
+ <expression>Step_1_Bake_Time</expression>
+ </inVariable>
+ <inVariable localId="18" executionOrderId="0" width="144" height="32" negated="false">
+ <position x="656" y="824"/>
+ <connectionPointOut>
+ <relPosition x="144" y="16"/>
+ </connectionPointOut>
+ <expression>Step_1_Bake_Temp</expression>
+ </inVariable>
+ <inVariable localId="19" executionOrderId="0" width="144" height="32" negated="false">
+ <position x="656" y="880"/>
+ <connectionPointOut>
+ <relPosition x="144" y="16"/>
+ </connectionPointOut>
+ <expression>Step_2_Bake_Time</expression>
+ </inVariable>
+ <inVariable localId="20" executionOrderId="0" width="144" height="32" negated="false">
+ <position x="656" y="936"/>
+ <connectionPointOut>
+ <relPosition x="144" y="16"/>
+ </connectionPointOut>
+ <expression>Step_2_Bake_Temp</expression>
+ </inVariable>
+ <block localId="21" typeName="machine_A" instanceName="machine_A0" executionOrderId="0" width="146" height="248">
+ <position x="864" y="736"/>
+ <inputVariables>
+ <variable formalParameter="Step_1_Bake_Time">
+ <connectionPointIn>
+ <relPosition x="0" y="48"/>
+ <connection refLocalId="17">
+ <position x="864" y="784"/>
+ <position x="800" y="784"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="Step_1_Bake_Temp">
+ <connectionPointIn>
+ <relPosition x="0" y="104"/>
+ <connection refLocalId="18">
+ <position x="864" y="840"/>
+ <position x="800" y="840"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="Step_2_Bake_Time">
+ <connectionPointIn>
+ <relPosition x="0" y="160"/>
+ <connection refLocalId="19">
+ <position x="864" y="896"/>
+ <position x="800" y="896"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="Step_2_Bake_Temp">
+ <connectionPointIn>
+ <relPosition x="0" y="216"/>
+ <connection refLocalId="20">
+ <position x="864" y="952"/>
+ <position x="800" y="952"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables/>
+ </block>
+ <outVariable localId="22" executionOrderId="0" width="96" height="32" negated="false">
+ <position x="568" y="168"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="1" formalParameter="SUCCESS">
+ <position x="568" y="184"/>
+ <position x="528" y="184"/>
+ <position x="528" y="280"/>
+ <position x="480" y="280"/>
+ </connection>
+ </connectionPointIn>
+ <expression>RD_SUCCESS</expression>
+ </outVariable>
+ <block localId="23" typeName="move_A" instanceName="move_A0" executionOrderId="0" width="274" height="416">
+ <position x="568" y="232"/>
+ <inputVariables>
+ <variable formalParameter="EN" edge="rising">
+ <connectionPointIn>
+ <relPosition x="0" y="48"/>
+ <connection refLocalId="1" formalParameter="SUCCESS">
+ <position x="568" y="280"/>
+ <position x="480" y="280"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="Product_Name">
+ <connectionPointIn>
+ <relPosition x="0" y="104"/>
+ <connection refLocalId="1" formalParameter="Product_Name">
+ <position x="568" y="336"/>
+ <position x="480" y="336"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="Product_Image">
+ <connectionPointIn>
+ <relPosition x="0" y="160"/>
+ <connection refLocalId="1" formalParameter="Product_Image">
+ <position x="568" y="392"/>
+ <position x="480" y="392"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="Step_1_Bake_Time">
+ <connectionPointIn>
+ <relPosition x="0" y="216"/>
+ <connection refLocalId="1" formalParameter="Step_1_Bake_Time">
+ <position x="568" y="448"/>
+ <position x="480" y="448"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="Step_1_Bake_Temp">
+ <connectionPointIn>
+ <relPosition x="0" y="272"/>
+ <connection refLocalId="1" formalParameter="Step_1_Bake_Temp">
+ <position x="568" y="504"/>
+ <position x="480" y="504"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="Step_2_Bake_Time">
+ <connectionPointIn>
+ <relPosition x="0" y="328"/>
+ <connection refLocalId="1" formalParameter="Step_2_Bake_Time">
+ <position x="568" y="560"/>
+ <position x="480" y="560"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="Step_2_Bake_Temp">
+ <connectionPointIn>
+ <relPosition x="0" y="384"/>
+ <connection refLocalId="1" formalParameter="Step_2_Bake_Temp">
+ <position x="568" y="616"/>
+ <position x="480" y="616"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ENO">
+ <connectionPointOut>
+ <relPosition x="274" y="48"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="Product_Name">
+ <connectionPointOut>
+ <relPosition x="274" y="104"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="Product_Image">
+ <connectionPointOut>
+ <relPosition x="274" y="160"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="Step_1_Bake_Time">
+ <connectionPointOut>
+ <relPosition x="274" y="216"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="Step_1_Bake_Temp">
+ <connectionPointOut>
+ <relPosition x="274" y="272"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="Step_2_Bake_Time">
+ <connectionPointOut>
+ <relPosition x="274" y="328"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="Step_2_Bake_Temp">
+ <connectionPointOut>
+ <relPosition x="274" y="384"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <outVariable localId="24" executionOrderId="0" width="112" height="32" negated="false">
+ <position x="1456" y="208"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="2" formalParameter="ERROR">
+ <position x="1456" y="224"/>
+ <position x="1400" y="224"/>
+ </connection>
+ </connectionPointIn>
+ <expression>SAVE_SUCCESS</expression>
+ </outVariable>
+ <outVariable localId="25" executionOrderId="0" width="80" height="32" negated="false">
+ <position x="1456" y="264"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="2" formalParameter="ACK">
+ <position x="1456" y="280"/>
+ <position x="1400" y="280"/>
+ </connection>
+ </connectionPointIn>
+ <expression>SAVE_ACK</expression>
+ </outVariable>
+ </FBD>
+ </body>
+ </pou>
+ <pou name="read_csv_A" pouType="functionBlock">
+ <interface>
+ <inputVars>
+ <variable name="CSV_NAME">
+ <type>
+ <string/>
+ </type>
+ <documentation>
+ <xhtml:p><![CDATA[ CSV file name]]></xhtml:p>
+ </documentation>
+ </variable>
+ </inputVars>
+ <outputVars>
+ <variable name="SUCCESS">
+ <type>
+ <BOOL/>
+ </type>
+ <documentation>
+ <xhtml:p><![CDATA[TRUE if data comes from file FALSE if default values]]></xhtml:p>
+ </documentation>
+ </variable>
+ <variable name="Product_Name">
+ <type>
+ <string/>
+ </type>
+ <initialValue>
+ <simpleValue value="'unknown'"/>
+ </initialValue>
+ </variable>
+ <variable name="Product_Image">
+ <type>
+ <INT/>
+ </type>
+ <initialValue>
+ <simpleValue value="0"/>
+ </initialValue>
+ </variable>
+ <variable name="Step_1_Bake_Time">
+ <type>
+ <DINT/>
+ </type>
+ <initialValue>
+ <simpleValue value="60"/>
+ </initialValue>
+ </variable>
+ <variable name="Step_1_Bake_Temp">
+ <type>
+ <DINT/>
+ </type>
+ <initialValue>
+ <simpleValue value="120"/>
+ </initialValue>
+ </variable>
+ <variable name="Step_2_Bake_Time">
+ <type>
+ <DINT/>
+ </type>
+ <initialValue>
+ <simpleValue value="90"/>
+ </initialValue>
+ </variable>
+ <variable name="Step_2_Bake_Temp">
+ <type>
+ <DINT/>
+ </type>
+ <initialValue>
+ <simpleValue value="180"/>
+ </initialValue>
+ </variable>
+ </outputVars>
+ <localVars>
+ <variable name="csv_read_by_string0">
+ <type>
+ <derived name="csv_read_by_string"/>
+ </type>
+ </variable>
+ <variable name="csv_read_by_string1">
+ <type>
+ <derived name="csv_read_by_string"/>
+ </type>
+ </variable>
+ <variable name="csv_read_by_string2">
+ <type>
+ <derived name="csv_read_by_string"/>
+ </type>
+ </variable>
+ <variable name="csv_read_by_string3">
+ <type>
+ <derived name="csv_read_by_string"/>
+ </type>
+ </variable>
+ <variable name="csv_read_by_string4">
+ <type>
+ <derived name="csv_read_by_string"/>
+ </type>
+ </variable>
+ <variable name="csv_read_by_string5">
+ <type>
+ <derived name="csv_read_by_string"/>
+ </type>
+ </variable>
+ </localVars>
+ </interface>
+ <body>
+ <FBD>
+ <block localId="2" typeName="csv_read_by_string" instanceName="csv_read_by_string0" executionOrderId="0" width="160" height="112">
+ <position x="312" y="88"/>
+ <inputVariables>
+ <variable formalParameter="FILE_NAME">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="3">
+ <position x="312" y="120"/>
+ <position x="272" y="120"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="ROW">
+ <connectionPointIn>
+ <relPosition x="0" y="64"/>
+ <connection refLocalId="4">
+ <position x="312" y="152"/>
+ <position x="272" y="152"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="COLUMN">
+ <connectionPointIn>
+ <relPosition x="0" y="96"/>
+ <connection refLocalId="1">
+ <position x="312" y="184"/>
+ <position x="272" y="184"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ACK">
+ <connectionPointOut>
+ <relPosition x="160" y="32"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="RESULT">
+ <connectionPointOut>
+ <relPosition x="160" y="64"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="3" executionOrderId="0" width="88" height="32" negated="false">
+ <position x="184" y="104"/>
+ <connectionPointOut>
+ <relPosition x="88" y="16"/>
+ </connectionPointOut>
+ <expression>CSV_NAME</expression>
+ </inVariable>
+ <inVariable localId="4" executionOrderId="0" width="128" height="32" negated="false">
+ <position x="144" y="136"/>
+ <connectionPointOut>
+ <relPosition x="128" y="16"/>
+ </connectionPointOut>
+ <expression>'Product_Name'</expression>
+ </inVariable>
+ <inVariable localId="1" executionOrderId="0" width="152" height="32" negated="false">
+ <position x="120" y="168"/>
+ <connectionPointOut>
+ <relPosition x="152" y="16"/>
+ </connectionPointOut>
+ <expression>'Parameter_Value'</expression>
+ </inVariable>
+ <outVariable localId="5" executionOrderId="0" width="123" height="35" negated="false">
+ <position x="720" y="136"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="2" formalParameter="RESULT">
+ <position x="720" y="152"/>
+ <position x="472" y="152"/>
+ </connection>
+ </connectionPointIn>
+ <expression>Product_Name</expression>
+ </outVariable>
+ <block localId="6" typeName="csv_read_by_string" instanceName="csv_read_by_string1" executionOrderId="0" width="160" height="112">
+ <position x="312" y="248"/>
+ <inputVariables>
+ <variable formalParameter="FILE_NAME">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="7">
+ <position x="312" y="280"/>
+ <position x="272" y="280"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="ROW">
+ <connectionPointIn>
+ <relPosition x="0" y="64"/>
+ <connection refLocalId="8">
+ <position x="312" y="312"/>
+ <position x="272" y="312"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="COLUMN">
+ <connectionPointIn>
+ <relPosition x="0" y="96"/>
+ <connection refLocalId="9">
+ <position x="312" y="344"/>
+ <position x="272" y="344"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ACK">
+ <connectionPointOut>
+ <relPosition x="160" y="32"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="RESULT">
+ <connectionPointOut>
+ <relPosition x="160" y="64"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="7" executionOrderId="0" width="88" height="32" negated="false">
+ <position x="184" y="264"/>
+ <connectionPointOut>
+ <relPosition x="88" y="16"/>
+ </connectionPointOut>
+ <expression>CSV_NAME</expression>
+ </inVariable>
+ <inVariable localId="8" executionOrderId="0" width="136" height="32" negated="false">
+ <position x="136" y="296"/>
+ <connectionPointOut>
+ <relPosition x="136" y="16"/>
+ </connectionPointOut>
+ <expression>'Product_Image'</expression>
+ </inVariable>
+ <inVariable localId="9" executionOrderId="0" width="152" height="32" negated="false">
+ <position x="120" y="328"/>
+ <connectionPointOut>
+ <relPosition x="152" y="16"/>
+ </connectionPointOut>
+ <expression>'Parameter_Value'</expression>
+ </inVariable>
+ <outVariable localId="10" executionOrderId="0" width="120" height="32" negated="false">
+ <position x="720" y="296"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="11" formalParameter="OUT">
+ <position x="720" y="312"/>
+ <position x="651" y="312"/>
+ </connection>
+ </connectionPointIn>
+ <expression>Product_Image</expression>
+ </outVariable>
+ <block localId="11" typeName="STRING_TO_INT" executionOrderId="0" width="123" height="80">
+ <position x="528" y="247"/>
+ <inputVariables>
+ <variable formalParameter="EN">
+ <connectionPointIn>
+ <relPosition x="0" y="33"/>
+ <connection refLocalId="6" formalParameter="ACK">
+ <position x="528" y="280"/>
+ <position x="472" y="280"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="65"/>
+ <connection refLocalId="6" formalParameter="RESULT">
+ <position x="528" y="312"/>
+ <position x="472" y="312"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ENO">
+ <connectionPointOut>
+ <relPosition x="123" y="33"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="123" y="65"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <block localId="12" typeName="csv_read_by_string" instanceName="csv_read_by_string2" executionOrderId="0" width="160" height="112">
+ <position x="312" y="408"/>
+ <inputVariables>
+ <variable formalParameter="FILE_NAME">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="13">
+ <position x="312" y="440"/>
+ <position x="272" y="440"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="ROW">
+ <connectionPointIn>
+ <relPosition x="0" y="64"/>
+ <connection refLocalId="14">
+ <position x="312" y="472"/>
+ <position x="272" y="472"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="COLUMN">
+ <connectionPointIn>
+ <relPosition x="0" y="96"/>
+ <connection refLocalId="15">
+ <position x="312" y="504"/>
+ <position x="272" y="504"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ACK">
+ <connectionPointOut>
+ <relPosition x="160" y="32"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="RESULT">
+ <connectionPointOut>
+ <relPosition x="160" y="64"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="13" executionOrderId="0" width="88" height="32" negated="false">
+ <position x="184" y="424"/>
+ <connectionPointOut>
+ <relPosition x="88" y="16"/>
+ </connectionPointOut>
+ <expression>CSV_NAME</expression>
+ </inVariable>
+ <inVariable localId="14" executionOrderId="0" width="160" height="32" negated="false">
+ <position x="112" y="456"/>
+ <connectionPointOut>
+ <relPosition x="160" y="16"/>
+ </connectionPointOut>
+ <expression>'Step_1_Bake_Time'</expression>
+ </inVariable>
+ <inVariable localId="15" executionOrderId="0" width="152" height="32" negated="false">
+ <position x="120" y="488"/>
+ <connectionPointOut>
+ <relPosition x="152" y="16"/>
+ </connectionPointOut>
+ <expression>'Parameter_Value'</expression>
+ </inVariable>
+ <outVariable localId="16" executionOrderId="0" width="141" height="35" negated="false">
+ <position x="720" y="456"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="17" formalParameter="OUT">
+ <position x="720" y="472"/>
+ <position x="656" y="472"/>
+ </connection>
+ </connectionPointIn>
+ <expression>Step_1_Bake_Time</expression>
+ </outVariable>
+ <block localId="17" typeName="STRING_TO_DINT" executionOrderId="0" width="128" height="80">
+ <position x="528" y="407"/>
+ <inputVariables>
+ <variable formalParameter="EN">
+ <connectionPointIn>
+ <relPosition x="0" y="33"/>
+ <connection refLocalId="12" formalParameter="ACK">
+ <position x="528" y="440"/>
+ <position x="472" y="440"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="65"/>
+ <connection refLocalId="12" formalParameter="RESULT">
+ <position x="528" y="472"/>
+ <position x="472" y="472"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ENO">
+ <connectionPointOut>
+ <relPosition x="128" y="33"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="128" y="65"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <block localId="18" typeName="csv_read_by_string" instanceName="csv_read_by_string3" executionOrderId="0" width="160" height="112">
+ <position x="312" y="576"/>
+ <inputVariables>
+ <variable formalParameter="FILE_NAME">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="19">
+ <position x="312" y="608"/>
+ <position x="272" y="608"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="ROW">
+ <connectionPointIn>
+ <relPosition x="0" y="64"/>
+ <connection refLocalId="20">
+ <position x="312" y="640"/>
+ <position x="272" y="640"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="COLUMN">
+ <connectionPointIn>
+ <relPosition x="0" y="96"/>
+ <connection refLocalId="21">
+ <position x="312" y="672"/>
+ <position x="272" y="672"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ACK">
+ <connectionPointOut>
+ <relPosition x="160" y="32"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="RESULT">
+ <connectionPointOut>
+ <relPosition x="160" y="64"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="19" executionOrderId="0" width="88" height="32" negated="false">
+ <position x="184" y="592"/>
+ <connectionPointOut>
+ <relPosition x="88" y="16"/>
+ </connectionPointOut>
+ <expression>CSV_NAME</expression>
+ </inVariable>
+ <inVariable localId="20" executionOrderId="0" width="160" height="32" negated="false">
+ <position x="112" y="624"/>
+ <connectionPointOut>
+ <relPosition x="160" y="16"/>
+ </connectionPointOut>
+ <expression>'Step_1_Bake_Temp'</expression>
+ </inVariable>
+ <inVariable localId="21" executionOrderId="0" width="152" height="32" negated="false">
+ <position x="120" y="656"/>
+ <connectionPointOut>
+ <relPosition x="152" y="16"/>
+ </connectionPointOut>
+ <expression>'Parameter_Value'</expression>
+ </inVariable>
+ <outVariable localId="22" executionOrderId="0" width="144" height="38" negated="false">
+ <position x="720" y="624"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="23" formalParameter="OUT">
+ <position x="720" y="640"/>
+ <position x="656" y="640"/>
+ </connection>
+ </connectionPointIn>
+ <expression>Step_1_Bake_Temp</expression>
+ </outVariable>
+ <block localId="24" typeName="csv_read_by_string" instanceName="csv_read_by_string4" executionOrderId="0" width="160" height="112">
+ <position x="312" y="744"/>
+ <inputVariables>
+ <variable formalParameter="FILE_NAME">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="25">
+ <position x="312" y="776"/>
+ <position x="272" y="776"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="ROW">
+ <connectionPointIn>
+ <relPosition x="0" y="64"/>
+ <connection refLocalId="26">
+ <position x="312" y="808"/>
+ <position x="272" y="808"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="COLUMN">
+ <connectionPointIn>
+ <relPosition x="0" y="96"/>
+ <connection refLocalId="27">
+ <position x="312" y="840"/>
+ <position x="272" y="840"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ACK">
+ <connectionPointOut>
+ <relPosition x="160" y="32"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="RESULT">
+ <connectionPointOut>
+ <relPosition x="160" y="64"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="25" executionOrderId="0" width="88" height="32" negated="false">
+ <position x="184" y="760"/>
+ <connectionPointOut>
+ <relPosition x="88" y="16"/>
+ </connectionPointOut>
+ <expression>CSV_NAME</expression>
+ </inVariable>
+ <inVariable localId="26" executionOrderId="0" width="160" height="32" negated="false">
+ <position x="112" y="792"/>
+ <connectionPointOut>
+ <relPosition x="160" y="16"/>
+ </connectionPointOut>
+ <expression>'Step_2_Bake_Time'</expression>
+ </inVariable>
+ <inVariable localId="27" executionOrderId="0" width="152" height="32" negated="false">
+ <position x="120" y="824"/>
+ <connectionPointOut>
+ <relPosition x="152" y="16"/>
+ </connectionPointOut>
+ <expression>'Parameter_Value'</expression>
+ </inVariable>
+ <outVariable localId="28" executionOrderId="0" width="150" height="44" negated="false">
+ <position x="720" y="784"/>
+ <connectionPointIn>
+ <relPosition x="0" y="24"/>
+ <connection refLocalId="29" formalParameter="OUT">
+ <position x="720" y="808"/>
+ <position x="656" y="808"/>
+ </connection>
+ </connectionPointIn>
+ <expression>Step_2_Bake_Time</expression>
+ </outVariable>
+ <block localId="30" typeName="csv_read_by_string" instanceName="csv_read_by_string5" executionOrderId="0" width="160" height="112">
+ <position x="312" y="912"/>
+ <inputVariables>
+ <variable formalParameter="FILE_NAME">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="31">
+ <position x="312" y="944"/>
+ <position x="272" y="944"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="ROW">
+ <connectionPointIn>
+ <relPosition x="0" y="64"/>
+ <connection refLocalId="32">
+ <position x="312" y="976"/>
+ <position x="272" y="976"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="COLUMN">
+ <connectionPointIn>
+ <relPosition x="0" y="96"/>
+ <connection refLocalId="33">
+ <position x="312" y="1008"/>
+ <position x="272" y="1008"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ACK">
+ <connectionPointOut>
+ <relPosition x="160" y="32"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="RESULT">
+ <connectionPointOut>
+ <relPosition x="160" y="64"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="31" executionOrderId="0" width="88" height="32" negated="false">
+ <position x="184" y="928"/>
+ <connectionPointOut>
+ <relPosition x="88" y="16"/>
+ </connectionPointOut>
+ <expression>CSV_NAME</expression>
+ </inVariable>
+ <inVariable localId="32" executionOrderId="0" width="160" height="32" negated="false">
+ <position x="112" y="960"/>
+ <connectionPointOut>
+ <relPosition x="160" y="16"/>
+ </connectionPointOut>
+ <expression>'Step_2_Bake_Temp'</expression>
+ </inVariable>
+ <inVariable localId="33" executionOrderId="0" width="152" height="32" negated="false">
+ <position x="120" y="992"/>
+ <connectionPointOut>
+ <relPosition x="152" y="16"/>
+ </connectionPointOut>
+ <expression>'Parameter_Value'</expression>
+ </inVariable>
+ <outVariable localId="34" executionOrderId="0" width="147" height="41" negated="false">
+ <position x="720" y="960"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="35" formalParameter="OUT">
+ <position x="720" y="976"/>
+ <position x="656" y="976"/>
+ </connection>
+ </connectionPointIn>
+ <expression>Step_2_Bake_Temp</expression>
+ </outVariable>
+ <block localId="23" typeName="STRING_TO_DINT" executionOrderId="0" width="128" height="80">
+ <position x="528" y="576"/>
+ <inputVariables>
+ <variable formalParameter="EN">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="18" formalParameter="ACK">
+ <position x="528" y="608"/>
+ <position x="472" y="608"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="64"/>
+ <connection refLocalId="18" formalParameter="RESULT">
+ <position x="528" y="640"/>
+ <position x="472" y="640"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ENO">
+ <connectionPointOut>
+ <relPosition x="128" y="32"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="128" y="64"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <block localId="29" typeName="STRING_TO_DINT" executionOrderId="0" width="128" height="80">
+ <position x="528" y="744"/>
+ <inputVariables>
+ <variable formalParameter="EN">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="24" formalParameter="ACK">
+ <position x="528" y="776"/>
+ <position x="472" y="776"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="64"/>
+ <connection refLocalId="24" formalParameter="RESULT">
+ <position x="528" y="808"/>
+ <position x="472" y="808"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ENO">
+ <connectionPointOut>
+ <relPosition x="128" y="32"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="128" y="64"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <block localId="35" typeName="STRING_TO_DINT" executionOrderId="0" width="128" height="80">
+ <position x="528" y="913"/>
+ <inputVariables>
+ <variable formalParameter="EN">
+ <connectionPointIn>
+ <relPosition x="0" y="31"/>
+ <connection refLocalId="30" formalParameter="ACK">
+ <position x="528" y="944"/>
+ <position x="472" y="944"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="63"/>
+ <connection refLocalId="30" formalParameter="RESULT">
+ <position x="528" y="976"/>
+ <position x="472" y="976"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ENO">
+ <connectionPointOut>
+ <relPosition x="128" y="31"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="128" y="63"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <outVariable localId="42" executionOrderId="0" width="72" height="32" negated="false">
+ <position x="1264" y="104"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="43" formalParameter="OUT">
+ <position x="1264" y="120"/>
+ <position x="1229" y="120"/>
+ </connection>
+ </connectionPointIn>
+ <expression>SUCCESS</expression>
+ </outVariable>
+ <block localId="43" typeName="AND" executionOrderId="0" width="69" height="168">
+ <position x="1160" y="88"/>
+ <inputVariables>
+ <variable formalParameter="IN1">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="45">
+ <position x="1160" y="120"/>
+ <position x="1130" y="120"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN2">
+ <connectionPointIn>
+ <relPosition x="0" y="56"/>
+ <connection refLocalId="47">
+ <position x="1160" y="144"/>
+ <position x="1130" y="144"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN3">
+ <connectionPointIn>
+ <relPosition x="0" y="80"/>
+ <connection refLocalId="49">
+ <position x="1160" y="168"/>
+ <position x="1130" y="168"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN4">
+ <connectionPointIn>
+ <relPosition x="0" y="104"/>
+ <connection refLocalId="51">
+ <position x="1160" y="192"/>
+ <position x="1130" y="192"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN5">
+ <connectionPointIn>
+ <relPosition x="0" y="128"/>
+ <connection refLocalId="53">
+ <position x="1160" y="216"/>
+ <position x="1130" y="216"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN6">
+ <connectionPointIn>
+ <relPosition x="0" y="152"/>
+ <connection refLocalId="55">
+ <position x="1160" y="240"/>
+ <position x="1130" y="240"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="69" y="32"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <connector name="Connection0" localId="44" width="125" height="27">
+ <position x="715" y="104"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="2" formalParameter="ACK">
+ <position x="715" y="120"/>
+ <position x="472" y="120"/>
+ </connection>
+ </connectionPointIn>
+ </connector>
+ <continuation name="Connection0" localId="45" width="125" height="27">
+ <position x="1005" y="104"/>
+ <connectionPointOut>
+ <relPosition x="125" y="16"/>
+ </connectionPointOut>
+ </continuation>
+ <connector name="Connection1" localId="46" width="125" height="27">
+ <position x="715" y="264"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="11" formalParameter="ENO">
+ <position x="715" y="280"/>
+ <position x="651" y="280"/>
+ </connection>
+ </connectionPointIn>
+ </connector>
+ <continuation name="Connection1" localId="47" width="125" height="27">
+ <position x="1005" y="128"/>
+ <connectionPointOut>
+ <relPosition x="125" y="16"/>
+ </connectionPointOut>
+ </continuation>
+ <connector name="Connection2" localId="48" width="125" height="27">
+ <position x="715" y="424"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="17" formalParameter="ENO">
+ <position x="715" y="440"/>
+ <position x="656" y="440"/>
+ </connection>
+ </connectionPointIn>
+ </connector>
+ <continuation name="Connection2" localId="49" width="125" height="27">
+ <position x="1005" y="152"/>
+ <connectionPointOut>
+ <relPosition x="125" y="16"/>
+ </connectionPointOut>
+ </continuation>
+ <connector name="Connection3" localId="50" width="125" height="27">
+ <position x="715" y="592"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="23" formalParameter="ENO">
+ <position x="715" y="608"/>
+ <position x="656" y="608"/>
+ </connection>
+ </connectionPointIn>
+ </connector>
+ <continuation name="Connection3" localId="51" width="125" height="27">
+ <position x="1005" y="176"/>
+ <connectionPointOut>
+ <relPosition x="125" y="16"/>
+ </connectionPointOut>
+ </continuation>
+ <connector name="Connection4" localId="52" width="125" height="27">
+ <position x="715" y="760"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="29" formalParameter="ENO">
+ <position x="715" y="776"/>
+ <position x="656" y="776"/>
+ </connection>
+ </connectionPointIn>
+ </connector>
+ <continuation name="Connection4" localId="53" width="125" height="27">
+ <position x="1005" y="200"/>
+ <connectionPointOut>
+ <relPosition x="125" y="16"/>
+ </connectionPointOut>
+ </continuation>
+ <connector name="Connection5" localId="54" width="125" height="27">
+ <position x="715" y="928"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="35" formalParameter="ENO">
+ <position x="715" y="944"/>
+ <position x="656" y="944"/>
+ </connection>
+ </connectionPointIn>
+ </connector>
+ <continuation name="Connection5" localId="55" width="125" height="27">
+ <position x="1005" y="224"/>
+ <connectionPointOut>
+ <relPosition x="125" y="16"/>
+ </connectionPointOut>
+ </continuation>
+ </FBD>
+ </body>
+ <documentation>
+ <xhtml:p><![CDATA[Read CSV file of type A]]></xhtml:p>
+ </documentation>
+ </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/exemples/csv_by_string/svghmi_0@svghmi/baseconfnode.xml Fri Feb 07 18:42:43 2025 +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="svghmi_0"/>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/csv_by_string/svghmi_0@svghmi/confnode.xml Fri Feb 07 18:42:43 2025 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SVGHMI xmlns:xsd="http://www.w3.org/2001/XMLSchema"/>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/csv_by_string/svghmi_0@svghmi/svghmi.svg Fri Feb 07 18:42:43 2025 +0100
@@ -0,0 +1,1814 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
+ sodipodi:docname="svghmi.svg"
+ id="hmi0"
+ version="1.1"
+ viewBox="0 0 1280 720"
+ height="720"
+ width="1280">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6">
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3492"
+ id="radialGradient3514"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.4681866,-0.02473347,0.01595521,0.5306128,3839.5399,691.78474)"
+ cx="958.08276"
+ cy="613.50269"
+ fx="958.08276"
+ fy="613.50269"
+ r="163.49561" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3492">
+ <stop
+ style="stop-color:#ffe7c7;stop-opacity:1"
+ offset="0"
+ id="stop3488" />
+ <stop
+ style="stop-color:#ffa32a;stop-opacity:1"
+ offset="1"
+ id="stop3490" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3492"
+ id="radialGradient10028"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.4681866,-0.02473347,0.01595521,0.5306128,3839.5399,1115.9357)"
+ cx="958.08276"
+ cy="613.50269"
+ fx="958.08276"
+ fy="613.50269"
+ r="163.49561" />
+ </defs>
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1850"
+ inkscape:window-height="909"
+ id="namedview4"
+ showgrid="false"
+ inkscape:zoom="0.32777778"
+ inkscape:cx="-330.62448"
+ inkscape:cy="-900.61006"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="hmi0"
+ inkscape:pagecheckerboard="0" />
+ <rect
+ inkscape:label="HMI:Page:Home"
+ y="0"
+ x="0"
+ height="720"
+ width="1280"
+ id="rect1016"
+ style="color:#000000;opacity:1;fill:#d6d6d6;fill-opacity:1" />
+ <g
+ style="stroke-width:0.377115"
+ inkscape:label="HMI:Input@/CURRENT_CSV"
+ transform="matrix(0.75813069,0,0,0.75813069,298.48618,17.66828)"
+ id="g112">
+ <text
+ inkscape:label="value"
+ id="text102"
+ y="192.18758"
+ x="-257.78806"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:62.1669px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff8c00;fill-opacity:1;stroke:none;stroke-width:0.377115px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:62.1669px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff8c00;stroke-width:0.377115px"
+ y="192.18758"
+ x="-257.78806"
+ id="tspan100"
+ sodipodi:role="line">file.csv</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:1.88558;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="rect106"
+ width="456.29868"
+ height="128"
+ x="-359.35144"
+ y="95.40741"
+ onclick=""
+ inkscape:label="edit" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="196.74792"
+ y="81.446617"
+ id="text116"><tspan
+ sodipodi:role="line"
+ id="tspan114"
+ x="196.74792"
+ y="81.446617">Current CSV name</tspan></text>
+ <g
+ id="g4278"
+ style="fill-rule:evenodd;stroke-width:0.47631353"
+ transform="matrix(3.3549332,0,0,3.14525,-181.87457,1036.0198)"
+ inkscape:label="HMI:Keypad:HMI_STRING:HMI_LOCAL:PAGE_LOCAL">
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:label="Background"
+ inkscape:connector-curvature="0"
+ id="rect1006-3"
+ d="M 54.211084,1.2654702 H 435.7388 V 230.18209 H 54.211084 Z"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.16776976;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="Space"
+ inkscape:connector-curvature="0"
+ d="m 162,197 h -11 c -2,0 -3,1 -3,3 v 18 c 0,2 1,3 3,3 h 11 168 18 c 0,0 1,-1 1,-3 v -18 c 0,-2 -1,-3 -1,-3 h -18 z"
+ id="path185"
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <g
+ transform="translate(0,-19.076386)"
+ style="stroke-width:0.47631353"
+ inkscape:label="Keys"
+ id="g4380">
+ <g
+ transform="translate(0,-9.5381931)"
+ style="stroke-width:0.47631353"
+ inkscape:label="q Q"
+ id="g4283">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 95,121 h 19 c 2,0 3,1 3,3 v 18 c 0,1 -1,3 -3,3 H 95 c -1,0 -3,-2 -3,-3 v -18 c 0,-2 2,-3 3,-3 z"
+ id="path41"
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826"
+ id="text203"
+ y="138.28395"
+ x="99.378708">Q</text>
+ </g>
+ <g
+ transform="translate(0,-9.5381931)"
+ style="stroke-width:0.47631353"
+ inkscape:label="w W"
+ id="g4337">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 124,121 h 20 c 2,0 3,1 3,3 v 18 c 0,1 -1,3 -3,3 h -20 c -1,0 -3,-2 -3,-3 v -18 c 0,-2 2,-3 3,-3 z"
+ id="path43"
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826"
+ id="text207"
+ y="138.28395"
+ x="127.0709">W</text>
+ </g>
+ <g
+ transform="translate(0,-9.5381931)"
+ style="stroke-width:0.47631353"
+ inkscape:label="e E"
+ id="g4332">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 154,121 h 20 c 2,0 3,1 3,3 v 18 c 0,1 -1,3 -3,3 h -20 c -1,0 -3,-2 -3,-3 v -18 c 0,-2 2,-3 3,-3 z"
+ id="path45"
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826"
+ id="text211"
+ y="138.28395"
+ x="159.70854">E</text>
+ </g>
+ <g
+ transform="translate(0,-9.5381931)"
+ style="stroke-width:0.47631353"
+ inkscape:label="r R"
+ id="g4326">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 184,121 h 19 c 2,0 3,1 3,3 v 18 c 0,1 -1,3 -3,3 h -19 c -1,0 -3,-2 -3,-3 v -18 c 0,-2 2,-3 3,-3 z"
+ id="path47"
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826"
+ id="text215"
+ y="138.28395"
+ x="188.39003">R</text>
+ </g>
+ <g
+ transform="translate(0,-9.5381931)"
+ style="stroke-width:0.47631353"
+ inkscape:label="t T"
+ id="g4321">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 213,121 h 20 c 2,0 3,1 3,3 v 18 c 0,1 -1,3 -3,3 h -20 c -1,0 -2,-2 -2,-3 v -18 c 0,-2 1,-3 2,-3 z"
+ id="path49"
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826"
+ id="text219"
+ y="138.28395"
+ x="219.04961">T</text>
+ </g>
+ <g
+ transform="translate(0,-9.5381931)"
+ style="stroke-width:0.47631353"
+ inkscape:label="y Y"
+ id="g4316">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 243,121 h 20 c 2,0 3,1 3,3 v 18 c 0,1 -1,3 -3,3 h -20 c -1,0 -2,-2 -2,-3 v -18 c 0,-2 1,-3 2,-3 z"
+ id="path51"
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826"
+ id="text223"
+ y="138.28395"
+ x="248.72017">Y</text>
+ </g>
+ <g
+ transform="translate(0,-9.5381931)"
+ style="stroke-width:0.47631353"
+ inkscape:label="u U"
+ id="g4311">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 273,121 h 20 c 2,0 3,1 3,3 v 18 c 0,1 -1,3 -3,3 h -20 c -1,0 -2,-2 -2,-3 v -18 c 0,-2 1,-3 2,-3 z"
+ id="path53"
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826"
+ id="text227"
+ y="138.28395"
+ x="278.39075">U</text>
+ </g>
+ <g
+ transform="translate(0,-9.5381931)"
+ style="stroke-width:0.47631353"
+ inkscape:label="i I"
+ id="g4306">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 302,121 h 20 c 2,0 3,1 3,3 v 18 c 0,1 -1,3 -3,3 h -20 c -1,0 -2,-2 -2,-3 v -18 c 0,-2 1,-3 2,-3 z"
+ id="path55"
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826"
+ id="text231"
+ y="138.28395"
+ x="311.02859">I</text>
+ </g>
+ <g
+ transform="translate(0,-9.5381931)"
+ style="stroke-width:0.47631353"
+ inkscape:label="o O"
+ id="g4301">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 332,121 h 20 c 2,0 3,1 3,3 v 18 c 0,1 -1,3 -3,3 h -20 c -1,0 -2,-2 -2,-3 v -18 c 0,-2 1,-3 2,-3 z"
+ id="path57"
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826"
+ id="text235"
+ y="138.28395"
+ x="336.74319">O</text>
+ </g>
+ <g
+ transform="translate(0,-9.5381931)"
+ style="stroke-width:0.47631353"
+ inkscape:label="p P"
+ id="g4296">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 362,121 h 20 c 2,0 3,1 3,3 v 18 c 0,1 -1,3 -3,3 h -20 c -1,0 -2,-2 -2,-3 v -18 c 0,-2 1,-3 2,-3 z"
+ id="path59"
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826"
+ id="text239"
+ y="138.28395"
+ x="367.40256">P</text>
+ </g>
+ <g
+ inkscape:label="a A"
+ id="g4511"
+ style="fill-rule:evenodd;stroke-width:0.47631353">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path65"
+ d="m 103,147 h 19 c 1,0 3,1 3,2 v 19 c 0,1 -2,2 -3,2 h -19 c -2,0 -3,-1 -3,-2 v -19 c 0,-1 1,-2 3,-2 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="107.29005"
+ y="163.99854"
+ id="text243"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">A</text>
+ </g>
+ <g
+ inkscape:label="s S"
+ id="g4516"
+ style="fill-rule:evenodd;stroke-width:0.47631353">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path67"
+ d="m 132,147 h 20 c 1,0 3,1 3,2 v 19 c 0,1 -2,2 -3,2 h -20 c -2,0 -3,-1 -3,-2 v -19 c 0,-1 1,-2 3,-2 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="137.95012"
+ y="163.99854"
+ id="text247"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">S</text>
+ </g>
+ <g
+ inkscape:label="d D"
+ id="g4521"
+ style="fill-rule:evenodd;stroke-width:0.47631353">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path69"
+ d="m 162,147 h 20 c 2,0 3,1 3,2 v 19 c 0,1 -1,2 -3,2 h -20 c -2,0 -3,-1 -3,-2 v -19 c 0,-1 1,-2 3,-2 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="166.63159"
+ y="163.99854"
+ id="text251"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">D</text>
+ </g>
+ <g
+ inkscape:label="f F"
+ id="g4526"
+ style="fill-rule:evenodd;stroke-width:0.47631353">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path71"
+ d="m 192,147 h 19 c 2,0 3,1 3,2 v 19 c 0,1 -1,2 -3,2 h -19 c -2,0 -3,-1 -3,-2 v -19 c 0,-1 1,-2 3,-2 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="197.29166"
+ y="163.99854"
+ id="text255"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">F</text>
+ </g>
+ <g
+ inkscape:label="g G"
+ id="g4531"
+ style="fill-rule:evenodd;stroke-width:0.47631353">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path73"
+ d="m 221,147 h 20 c 2,0 3,1 3,2 v 19 c 0,1 -1,2 -3,2 h -20 c -2,0 -3,-1 -3,-2 v -19 c 0,-1 1,-2 3,-2 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="225.97284"
+ y="163.99854"
+ id="text259"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">G</text>
+ </g>
+ <g
+ inkscape:label="h H"
+ id="g4536"
+ style="fill-rule:evenodd;stroke-width:0.47631353">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path75"
+ d="m 251,147 h 20 c 2,0 3,1 3,2 v 19 c 0,1 -1,2 -3,2 h -20 c -1,0 -3,-1 -3,-2 v -19 c 0,-1 2,-2 3,-2 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="255.64342"
+ y="163.99854"
+ id="text263"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">H</text>
+ </g>
+ <g
+ inkscape:label="j J"
+ id="g4541"
+ style="fill-rule:evenodd;stroke-width:0.47631353">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path77"
+ d="m 281,147 h 19 c 2,0 3,1 3,2 v 19 c 0,1 -1,2 -3,2 h -19 c -1,0 -3,-1 -3,-2 v -19 c 0,-1 2,-2 3,-2 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="287.29208"
+ y="163.99854"
+ id="text267"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">J</text>
+ </g>
+ <g
+ inkscape:label="k K"
+ id="g4546"
+ style="fill-rule:evenodd;stroke-width:0.47631353">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path79"
+ d="m 310,147 h 20 c 2,0 3,1 3,2 v 19 c 0,1 -1,2 -3,2 h -20 c -1,0 -3,-1 -3,-2 v -19 c 0,-1 2,-2 3,-2 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="314.98465"
+ y="163.99854"
+ id="text271"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">K</text>
+ </g>
+ <g
+ inkscape:label="l L"
+ id="g4551"
+ style="fill-rule:evenodd;stroke-width:0.47631353">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path81"
+ d="m 340,147 h 20 c 2,0 3,1 3,2 v 19 c 0,1 -1,2 -3,2 h -20 c -1,0 -3,-1 -3,-2 v -19 c 0,-1 2,-2 3,-2 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="345.64444"
+ y="163.99854"
+ id="text275"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">L</text>
+ </g>
+ <g
+ transform="translate(0,9.5381929)"
+ inkscape:label="z Z"
+ id="g4586"
+ style="fill-rule:evenodd;stroke-width:0.47631353">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path87-3"
+ d="m 113,172 h 21 c 1,0 2,2 2,3 v 17 c 0,2 -1,3 -2,3 h -21 c -1,0 -2,-1 -2,-3 v -17 c 0,-1 1,-3 2,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="119.15855"
+ y="188.72411"
+ id="text279"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">Z</text>
+ </g>
+ <g
+ transform="translate(0,9.5381929)"
+ inkscape:label="x X"
+ id="g4581"
+ style="fill-rule:evenodd;stroke-width:0.47631353">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path89-6"
+ d="m 143,172 h 21 c 1,0 2,2 2,3 v 17 c 0,2 -1,3 -2,3 h -21 c -1,0 -2,-1 -2,-3 v -17 c 0,-1 1,-3 2,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="148.82933"
+ y="188.72411"
+ id="text283"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">X</text>
+ </g>
+ <g
+ transform="translate(0,9.5381929)"
+ inkscape:label="c C"
+ id="g4576"
+ style="fill-rule:evenodd;stroke-width:0.47631353">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path91-7"
+ d="m 173,172 h 21 c 1,0 2,2 2,3 v 17 c 0,2 -1,3 -2,3 h -21 c -1,0 -2,-1 -2,-3 v -17 c 0,-1 1,-3 2,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="178.50011"
+ y="188.72411"
+ id="text287"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">C</text>
+ </g>
+ <g
+ transform="translate(0,9.5381929)"
+ inkscape:label="v V"
+ id="g4571"
+ style="fill-rule:evenodd;stroke-width:0.47631353">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path195"
+ d="m 202,172 h 21 c 1,0 2,2 2,3 v 17 c 0,2 -1,3 -2,3 h -21 c 0,0 -1,-1 -1,-3 v -17 c 0,-1 1,-3 1,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="208.16988"
+ y="188.72411"
+ id="text291"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">V</text>
+ </g>
+ <g
+ transform="translate(0,9.5381929)"
+ inkscape:label="b B"
+ id="g4566"
+ style="fill-rule:evenodd;stroke-width:0.47631353">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path93"
+ d="m 233,172 h 20 c 1,0 2,2 2,3 v 17 c 0,2 -1,3 -2,3 h -20 c -2,0 -3,-1 -3,-3 v -17 c 0,-1 1,-3 3,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="237.84096"
+ y="188.72411"
+ id="text295"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">B</text>
+ </g>
+ <g
+ transform="translate(0,9.5381929)"
+ inkscape:label="n N"
+ id="g4561"
+ style="fill-rule:evenodd;stroke-width:0.47631353">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path95"
+ d="m 263,172 h 20 c 1,0 2,2 2,3 v 17 c 0,2 -1,3 -2,3 h -20 c -2,0 -3,-1 -3,-3 v -17 c 0,-1 1,-3 3,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="267.51193"
+ y="188.72411"
+ id="text299"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">N</text>
+ </g>
+ <g
+ transform="translate(0,9.5381929)"
+ inkscape:label="m M"
+ id="g4556"
+ style="fill-rule:evenodd;stroke-width:0.47631353">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path97"
+ d="m 293,172 h 19 c 1,0 2,2 2,3 v 17 c 0,2 -1,3 -2,3 h -19 c -2,0 -3,-1 -3,-3 v -17 c 0,-1 1,-3 3,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="296.1933"
+ y="188.72411"
+ id="text303"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">M</text>
+ </g>
+ <g
+ transform="translate(0,9.5381929)"
+ style="stroke-width:0.47631353"
+ inkscape:label=". :"
+ id="g4818">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path101"
+ d="m 352,172 h 20 c 1,0 2,2 2,3 v 17 c 0,2 -1,3 -2,3 h -20 c -2,0 -3,-1 -3,-3 v -17 c 0,-1 1,-3 3,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ x="359.58276"
+ y="189.66107"
+ id="text719"
+ style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;fill-rule:evenodd;stroke-width:0.36866826"
+ transform="scale(1.0007154,0.99928513)">.</text>
+ <text
+ transform="scale(1.0007154,0.99928512)"
+ style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;fill-rule:evenodd;stroke-width:0.36866826"
+ id="text4834"
+ y="181.64532"
+ x="359.58276">:</text>
+ </g>
+ <g
+ transform="translate(0,9.5381929)"
+ style="stroke-width:0.47631353"
+ inkscape:label=", ;"
+ id="g4813">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path99"
+ d="m 322,172 h 20 c 1,0 2,2 2,3 v 17 c 0,2 -1,3 -2,3 h -20 c -2,0 -3,-1 -3,-3 v -17 c 0,-1 1,-3 3,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928512)"
+ x="330.00806"
+ y="181.64532"
+ id="text727"
+ style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;fill-rule:evenodd;stroke-width:0.36866826">;</text>
+ <text
+ id="text4826"
+ transform="scale(1.0007154,0.99928512)"
+ x="330.00806"
+ y="189.66107"
+ style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;fill-rule:evenodd;stroke-width:0.36866826">,</text>
+ </g>
+ <g
+ transform="translate(-13.353469,-45.783327)"
+ id="g2845"
+ inkscape:label="1"
+ style="stroke-width:0.47631353">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path2839"
+ d="m 95,121 h 19 c 2,0 3,1 3,3 v 18 c 0,1 -1,3 -3,3 H 95 c -1,0 -3,-2 -3,-3 v -18 c 0,-2 2,-3 3,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928513)"
+ x="101.07153"
+ y="138.28395"
+ id="text2841"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">1</text>
+ </g>
+ <g
+ transform="translate(-13.353469,-45.783327)"
+ id="g2853"
+ inkscape:label="2"
+ style="stroke-width:0.47631353">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path2847"
+ d="m 124,121 h 20 c 2,0 3,1 3,3 v 18 c 0,1 -1,3 -3,3 h -20 c -1,0 -3,-2 -3,-3 v -18 c 0,-2 2,-3 3,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928513)"
+ x="130.18704"
+ y="138.28395"
+ id="text2849"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">2</text>
+ </g>
+ <g
+ transform="translate(-13.353469,-45.783327)"
+ style="stroke-width:0.47631353"
+ id="g2861"
+ inkscape:label="3">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path2855"
+ d="m 154,121 h 20 c 2,0 3,1 3,3 v 18 c 0,1 -1,3 -3,3 h -20 c -1,0 -3,-2 -3,-3 v -18 c 0,-2 2,-3 3,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="159.70854"
+ y="138.28395"
+ id="text2857"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">3</text>
+ </g>
+ <g
+ transform="translate(0,-19.076386)"
+ inkscape:label="4"
+ id="g2957">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path2865"
+ d="m 170.64653,94.293059 h 19 c 2,0 3,1 3,3 v 18.000001 c 0,1 -1,3 -3,3 h -19 c -1,0 -3,-2 -3,-3 V 97.293059 c 0,-2 2,-3 3,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="176.39188"
+ y="111.55791"
+ id="text2867"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">4</text>
+ </g>
+ <g
+ transform="translate(0,-19.076386)"
+ inkscape:label="5"
+ id="g2962">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path2873"
+ d="m 199.64653,94.293059 h 20 c 2,0 3,1 3,3 v 18.000001 c 0,1 -1,3 -3,3 h -20 c -1,0 -2,-2 -2,-3 V 97.293059 c 0,-2 1,-3 2,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="205.70567"
+ y="111.55791"
+ id="text2875"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">5</text>
+ </g>
+ <g
+ transform="translate(0,-19.076386)"
+ inkscape:label="6"
+ id="g2967">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path2881"
+ d="m 229.64653,94.293059 h 20 c 2,0 3,1 3,3 v 18.000001 c 0,1 -1,3 -3,3 h -20 c -1,0 -2,-2 -2,-3 V 97.293059 c 0,-2 1,-3 2,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="236.15851"
+ y="111.55791"
+ id="text2883"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">6</text>
+ </g>
+ <g
+ transform="translate(0,-19.076386)"
+ inkscape:label="7"
+ id="g2972">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path2889"
+ d="m 259.64653,94.293059 h 20 c 2,0 3,1 3,3 v 18.000001 c 0,1 -1,3 -3,3 h -20 c -1,0 -2,-2 -2,-3 V 97.293059 c 0,-2 1,-3 2,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="266.06564"
+ y="111.55791"
+ id="text2891"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">7</text>
+ </g>
+ <g
+ transform="translate(0,-19.076386)"
+ inkscape:label="8"
+ id="g2977">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path2897"
+ d="m 288.64653,94.293059 h 20 c 2,0 3,1 3,3 v 18.000001 c 0,1 -1,3 -3,3 h -20 c -1,0 -2,-2 -2,-3 V 97.293059 c 0,-2 1,-3 2,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="295.08231"
+ y="111.55791"
+ id="text2899"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">8</text>
+ </g>
+ <g
+ transform="translate(0,-19.076386)"
+ inkscape:label="9 -"
+ id="g2982">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path2905"
+ d="m 318.64653,94.293059 h 20 c 2,0 3,1 3,3 v 18.000001 c 0,1 -1,3 -3,3 h -20 c -1,0 -2,-2 -2,-3 V 97.293059 c 0,-2 1,-3 2,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="325.05408"
+ y="111.55791"
+ id="text2907"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">9</text>
+ <text
+ style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;fill-rule:evenodd;stroke-width:0.36866826"
+ id="text806"
+ y="102.42173"
+ x="335.72681"
+ transform="scale(1.0007154,0.99928511)">-</text>
+ </g>
+ <g
+ transform="translate(0,-19.076386)"
+ inkscape:label="0 +"
+ id="g2987">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path2913"
+ d="m 348.64653,94.293059 h 20 c 2,0 3,1 3,3 v 18.000001 c 0,1 -1,3 -3,3 h -20 c -1,0 -2,-2 -2,-3 V 97.293059 c 0,-2 1,-3 2,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="355.05984"
+ y="111.55791"
+ id="text2915"
+ style="font-weight:normal;font-size:13.93205929px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">0</text>
+ <text
+ x="365.30151"
+ y="102.42173"
+ id="text804"
+ style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;fill-rule:evenodd;stroke-width:0.36866826"
+ transform="scale(1.0007154,0.99928511)">+</text>
+ </g>
+ </g>
+ <g
+ style="stroke-width:0.47631353"
+ inkscape:label="Esc"
+ id="g3544"
+ transform="translate(335.89988,-58.934803)">
+ <path
+ sodipodi:nodetypes="sssssssss"
+ inkscape:connector-curvature="0"
+ d="m 47.948645,115.07509 h 39.076386 c 1,0 3,1 3,3 v 18 c 0,1 -2,3 -3,3 H 47.948645 c -2,0 -3,-2 -3,-3 v -18 c 0,-2 1,-3 3,-3 z"
+ id="path105"
+ style="opacity:1;vector-effect:none;fill:#4f4c4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.16824313;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <text
+ x="59.288635"
+ y="130.02028"
+ id="text469"
+ style="font-weight:normal;font-size:9.37966251px;font-family:Arial;fill:#ffffff;fill-rule:evenodd;stroke-width:0.36866826"
+ transform="scale(1.0007154,0.99928512)">Esc</text>
+ </g>
+ <g
+ transform="translate(0,-19.076386)"
+ style="stroke-width:0.47631353"
+ id="g4291"
+ inkscape:label="Enter">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 368.68274,170 c -1,0 -2,-1 -2,-3 v -17 c 0,-1 1,-3 2,-3 h 54.24217 c 2,0 3,2 3,3 v 17 c 0,2 -1,3 -3,3 z"
+ id="path3616"
+ style="opacity:1;vector-effect:none;fill:#4f4c4d;fill-opacity:1;stroke:none;stroke-width:0.16824313;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="sssssssss" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path6545"
+ transform="matrix(0.47690966,0,0,0.47690966,531.12074,-361.18588)"
+ d="m -260.23633,1080.8125 v 15.7949 h -38.68555 v -3 l -6.91992,4 6.91992,4 v -3.0019 h 40.6836 v -17.793 z"
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;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:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+ <g
+ transform="translate(2.3648311e-6,-28.614579)"
+ style="fill-rule:evenodd;stroke-width:0.47631353"
+ id="g4287"
+ inkscape:label="BackSpace">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 391.97749,144 c -1,0 -2,-1 -2,-3 v -17 c 0,-1 1,-3 2,-3 h 30.94742 c 2,0 3,2 3,3 v 17 c 0,2 -1,3 -3,3 z"
+ id="path3624"
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="sssssssss" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path11623-1-0"
+ transform="matrix(0.47690966,0,0,0.47690966,531.12074,-351.64769)"
+ d="m -268.72656,1011.1777 -6.91992,4 6.91992,4 v -3.0019 h 29.18945 v -1.9981 h -29.18945 z"
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;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:#2b2828;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+ <g
+ inkscape:label="CapsLock"
+ id="g934">
+ <g
+ transform="translate(0,-19.076386)"
+ style="display:inline;fill-rule:evenodd;stroke-width:0.47631353"
+ id="g942"
+ inkscape:label="inactive">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 67.025031,170 c -1,0 -3,-1 -3,-2 v -19 c 0,-1 2,-2 3,-2 H 92 c 2,0 4,1 4,2 v 19 c 0,1 -2,2 -4,2 z"
+ id="path936"
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="sssssssss" />
+ <text
+ transform="scale(1.0007154,0.99928515)"
+ style="font-weight:normal;font-size:8.66233635px;font-family:Arial;fill:#2b2828;stroke-width:0.36866823"
+ id="text938-5"
+ y="156.71973"
+ x="69.789322">Caps</text>
+ <text
+ transform="scale(1.0007154,0.99928515)"
+ style="font-weight:normal;font-size:8.66233635px;font-family:Arial;fill:#2b2828;stroke-width:0.36866823"
+ id="text940"
+ y="166.5585"
+ x="69.789322">Lock</text>
+ </g>
+ <g
+ inkscape:label="active"
+ id="g4429"
+ style="fill-rule:evenodd;stroke-width:0.47631353"
+ transform="translate(0,-19.076386)">
+ <path
+ sodipodi:nodetypes="sssssssss"
+ style="opacity:1;vector-effect:none;fill:#4f4c4d;fill-opacity:1;stroke:none;stroke-width:0.16824313;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path199"
+ d="m 67.025031,170 c -1,0 -3,-1 -3,-2 v -19 c 0,-1 2,-2 3,-2 H 92 c 2,0 4,1 4,2 v 19 c 0,1 -2,2 -4,2 z"
+ inkscape:connector-curvature="0" />
+ <text
+ x="69.789322"
+ y="156.71973"
+ id="text647"
+ style="font-weight:normal;font-size:8.66233635px;font-family:Arial;fill:#ffffff;stroke-width:0.36866823"
+ transform="scale(1.0007154,0.99928515)">Caps</text>
+ <text
+ x="69.789322"
+ y="166.5585"
+ id="text651"
+ style="font-weight:normal;font-size:8.66233635px;font-family:Arial;fill:#ffffff;stroke-width:0.36866823"
+ transform="scale(1.0007154,0.99928515)">Lock</text>
+ </g>
+ </g>
+ <rect
+ inkscape:label="Field"
+ ry="3.8152773"
+ rx="3.8152773"
+ y="15.771065"
+ x="64.024956"
+ height="30.150299"
+ width="361.89996"
+ id="rect2130"
+ 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:#fffff5;fill-opacity:1;fill-rule:nonzero;stroke:#202326;stroke-width:0;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
+ inkscape:label="Value"
+ id="text1309"
+ y="38.296417"
+ x="72.50132"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:19.0763855px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.47690967px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="text-align:start;text-anchor:start;stroke-width:0.47690967px"
+ y="38.296417"
+ x="72.50132"
+ id="tspan1307"
+ sodipodi:role="line">text</tspan></text>
+ <g
+ inkscape:label="Shift"
+ id="g437">
+ <g
+ inkscape:label="inactive"
+ id="g421">
+ <path
+ sodipodi:nodetypes="sssssssss"
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path910"
+ d="m 379.96247,185.46181 c -1,0 -2,-1 -2,-3 v -17 c 0,-1 1,-3 2,-3 h 42.96244 c 2,0 3,2 3,3 v 17 c 0,2 -1,3 -3,3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928513)"
+ x="392.55679"
+ y="177.90059"
+ id="text912"
+ style="font-weight:normal;font-size:8.92098808px;font-family:Arial;fill:#2b2828;stroke-width:0.36866826">Shift</text>
+ <path
+ inkscape:connector-curvature="0"
+ d="m 67.025031,185.46181 c -1,0 -3,-1 -3,-3 v -17 c 0,-1 2,-3 3,-3 H 104 c 1,0 2,2 2,3 v 17 c 0,2 -1,3 -2,3 z"
+ id="path856"
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="sssssssss" />
+ <text
+ transform="scale(1.0007154,0.99928513)"
+ style="font-weight:normal;font-size:8.92098808px;font-family:Arial;fill:#2b2828;fill-rule:evenodd;stroke-width:0.36866826"
+ id="text858"
+ y="177.90059"
+ x="75.85218">Shift</text>
+ </g>
+ <g
+ inkscape:label="active"
+ id="g413">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 379.96247,185.46181 c -1,0 -2,-1 -2,-3 v -17 c 0,-1 1,-3 2,-3 h 42.96244 c 2,0 3,2 3,3 v 17 c 0,2 -1,3 -3,3 z"
+ id="path551"
+ style="opacity:1;vector-effect:none;fill:#4f4c4d;fill-opacity:1;stroke:none;stroke-width:0.16824313;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="sssssssss" />
+ <text
+ style="font-weight:normal;font-size:8.92098808px;font-family:Arial;fill:#ffffff;stroke-width:0.36866826"
+ id="text629"
+ y="177.90059"
+ x="392.55679"
+ transform="scale(1.0007154,0.99928513)">Shift</text>
+ <path
+ sodipodi:nodetypes="sssssssss"
+ style="opacity:1;vector-effect:none;fill:#4f4c4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.16824313;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path879"
+ d="m 67.025031,185.46181 c -1,0 -3,-1 -3,-3 v -17 c 0,-1 2,-3 3,-3 H 104 c 1,0 2,2 2,3 v 17 c 0,2 -1,3 -2,3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ x="75.85218"
+ y="177.90059"
+ id="text881"
+ style="font-weight:normal;font-size:8.92098808px;font-family:Arial;fill:#ffffff;fill-rule:evenodd;stroke-width:0.36866826"
+ transform="scale(1.0007154,0.99928513)">Shift</text>
+ </g>
+ </g>
+ <text
+ inkscape:label="Info"
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.31375408px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.30784383px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="252.9579"
+ y="12.333657"
+ id="text471"
+ transform="scale(0.96824588,1.0327955)"><tspan
+ sodipodi:role="line"
+ id="tspan469"
+ x="252.9579"
+ y="12.333657"
+ style="stroke-width:0.30784383px">information</tspan></text>
+ </g>
+ <g
+ transform="matrix(3.3549332,0,0,3.14525,-181.87461,1836.0198)"
+ style="fill-rule:evenodd;stroke-width:0.47631353"
+ id="g2432"
+ inkscape:label="HMI:Keypad:HMI_INT:HMI_REAL:HMI_DINT">
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.16776976;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 54.211099,1.2654702 H 435.73881 V 230.18209 H 54.211099 Z"
+ id="path2136"
+ inkscape:connector-curvature="0"
+ inkscape:label="Background"
+ sodipodi:nodetypes="ccccc" />
+ <rect
+ inkscape:label="Field"
+ 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:#fffff5;fill-opacity:1;fill-rule:nonzero;stroke:#202326;stroke-width:0;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="rect2426"
+ width="361.89996"
+ height="30.150299"
+ x="64.024963"
+ y="15.77106"
+ rx="3.8152773"
+ ry="3.8152773" />
+ <text
+ inkscape:label="Value"
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:19.0763855px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.47690967px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="72.50132"
+ y="37.408375"
+ id="text2430"><tspan
+ sodipodi:role="line"
+ id="tspan2428"
+ x="72.50132"
+ y="37.408375"
+ style="text-align:start;text-anchor:start;stroke-width:0.47690967px">number</tspan></text>
+ <g
+ transform="matrix(1.6700128,0,0,1.6700128,-826.83854,-145.60855)"
+ id="g4947"
+ inkscape:label="Enter"
+ style="fill-rule:evenodd;stroke-width:0.13585199">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 750,175 c 0,-2 -1,-3 -3,-3 h -20 c -1,0 -3,1 -3,3 v 43 c 0,1 2,2 3,2 h 20 c 2,0 3,-1 3,-2 z"
+ id="path193"
+ style="opacity:1;vector-effect:none;fill:#4f4c4d;fill-opacity:1;stroke:none;stroke-width:0.10074362;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path6545-4"
+ transform="matrix(0.28557246,0,0,0.28557246,1098.7155,-140.51013)"
+ d="m -1244.2949,1166.5938 v 15.791 h -38.6875 v -2.9981 l -6.9199,4 6.9199,4 v -2.998 h 40.6836 v -17.7949 z"
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;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:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+ <g
+ transform="matrix(1.6700128,0,0,1.6700128,-826.83854,-145.60855)"
+ id="g4993"
+ inkscape:label="Keys"
+ style="fill-rule:evenodd;stroke-width:0.13585199">
+ <g
+ id="g4892"
+ inkscape:label="7"
+ style="stroke-width:0.13585199">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path163"
+ d="m 638,120 h 20 c 2,0 3,2 3,3 v 18 c 0,2 -1,3 -3,3 h -20 c -1,0 -3,-1 -3,-3 v -18 c 0,-1 2,-3 3,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="636.4165"
+ y="129.38269"
+ id="text331"
+ style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989">7</text>
+ </g>
+ <g
+ id="g4907"
+ inkscape:label="4"
+ style="stroke-width:0.13585199">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path169"
+ d="m 638,146 h 20 c 2,0 3,1 3,3 v 18 c 0,2 -1,3 -3,3 h -20 c -1,0 -3,-1 -3,-3 v -18 c 0,-2 2,-3 3,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="636.4165"
+ y="154.10822"
+ id="text335"
+ style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989">4</text>
+ </g>
+ <g
+ id="g4922"
+ inkscape:label="1"
+ style="stroke-width:0.13585199">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path175"
+ d="m 638,172 h 20 c 2,0 3,1 3,3 v 17 c 0,1 -1,3 -3,3 h -20 c -1,0 -3,-2 -3,-3 v -17 c 0,-2 2,-3 3,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="636.4165"
+ y="179.82285"
+ id="text339"
+ style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989">1</text>
+ </g>
+ <g
+ id="g4897"
+ inkscape:label="8"
+ style="stroke-width:0.13585199">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path165"
+ d="m 668,120 h 19 c 2,0 3,2 3,3 v 18 c 0,2 -1,3 -3,3 h -19 c -1,0 -3,-1 -3,-3 v -18 c 0,-1 2,-3 3,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="667.07562"
+ y="129.38269"
+ id="text347"
+ style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989">8</text>
+ </g>
+ <g
+ id="g4912"
+ inkscape:label="5"
+ style="stroke-width:0.13585199">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path171"
+ d="m 668,146 h 19 c 2,0 3,1 3,3 v 18 c 0,2 -1,3 -3,3 h -19 c -1,0 -3,-1 -3,-3 v -18 c 0,-2 2,-3 3,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="667.07562"
+ y="154.10822"
+ id="text351"
+ style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989">5</text>
+ </g>
+ <g
+ id="g4927"
+ inkscape:label="2"
+ style="stroke-width:0.13585199">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path177"
+ d="m 668,172 h 19 c 2,0 3,1 3,3 v 17 c 0,1 -1,3 -3,3 h -19 c -1,0 -3,-2 -3,-3 v -17 c 0,-2 2,-3 3,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="667.07562"
+ y="179.82285"
+ id="text355"
+ style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989">2</text>
+ </g>
+ <g
+ id="g4902"
+ inkscape:label="9"
+ style="stroke-width:0.13585199">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path167"
+ d="m 697,120 h 20 c 2,0 3,2 3,3 v 18 c 0,2 -1,3 -3,3 h -20 c -1,0 -3,-1 -3,-3 v -18 c 0,-1 2,-3 3,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="695.75708"
+ y="129.38269"
+ id="text363"
+ style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989">9</text>
+ </g>
+ <g
+ id="g4917"
+ inkscape:label="6"
+ style="stroke-width:0.13585199">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path173"
+ d="m 697,146 h 20 c 2,0 3,1 3,3 v 18 c 0,2 -1,3 -3,3 h -20 c -1,0 -3,-1 -3,-3 v -18 c 0,-2 2,-3 3,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="695.75708"
+ y="154.10822"
+ id="text367"
+ style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989">6</text>
+ </g>
+ <g
+ id="g4932"
+ inkscape:label="3"
+ style="stroke-width:0.13585199">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path179"
+ d="m 697,172 h 20 c 2,0 3,1 3,3 v 17 c 0,1 -1,3 -3,3 h -20 c -1,0 -3,-2 -3,-3 v -17 c 0,-2 2,-3 3,-3 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="695.75708"
+ y="179.82285"
+ id="text371"
+ style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989">3</text>
+ </g>
+ <g
+ id="g4937"
+ inkscape:label="0"
+ style="stroke-width:0.13585199">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path373"
+ d="m 638,220 c -1,0 -3,-1 -3,-2 v -19 c 0,-1 2,-2 3,-2 h 49 c 2,0 3,1 3,2 v 19 c 0,1 -1,2 -3,2 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="636.4165"
+ y="205.53712"
+ id="text377"
+ style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989">0</text>
+ </g>
+ </g>
+ <g
+ transform="translate(-318.22576)"
+ inkscape:label="Esc"
+ id="g3113">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 387.26079,54.792986 h 33.40019 c 3.34,0 5.01006,3.34003 5.01006,5.010045 v 30.060225 c 0,3.340029 -1.67006,5.010032 -5.01006,5.010032 h -33.40019 c -1.67006,0 -5.01007,-1.670003 -5.01007,-5.010032 V 59.803031 c 0,-1.670015 3.34001,-5.010045 5.01007,-5.010045 z"
+ id="path167-3"
+ style="opacity:1;vector-effect:none;fill:#4f4c4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.16824313;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <text
+ transform="scale(1.0007154,0.99928511)"
+ style="font-weight:normal;font-size:10.63882256px;font-family:Arial;fill:#ffffff;fill-rule:evenodd;stroke-width:0.36866826"
+ id="text469-4"
+ y="78.632088"
+ x="394.42801">Esc</text>
+ </g>
+ <g
+ transform="translate(0,-43.420332)"
+ inkscape:label="BackSpace"
+ id="g3109">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 387.26079,98.213318 h 33.40019 c 3.34,0 5.01006,1.670013 5.01006,5.010032 v 30.06024 c 0,3.34002 -1.67006,5.01003 -5.01006,5.01003 h -33.40019 c -1.67006,0 -5.01007,-1.67001 -5.01007,-5.01003 v -30.06024 c 0,-3.340019 3.34001,-5.010032 5.01007,-5.010032 z"
+ id="path173-1"
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path11623-1-0-2"
+ transform="matrix(0.47690966,0,0,0.47690966,1008.0304,-380.26227)"
+ d="m -1278.9668,1041.3047 -6.9199,4 6.9199,4 v -3 h 33.416 v -1.9981 h -33.416 z"
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;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:#2b2828;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+ <g
+ transform="matrix(1.6700128,0,0,1.6700128,-678.20742,-102.18822)"
+ style="fill-rule:evenodd;stroke-width:0.13585199"
+ inkscape:label="Sign"
+ id="g787">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 638,120 h 20 c 2,0 3,2 3,3 v 18 c 0,2 -1,3 -3,3 h -20 c -1,0 -3,-1 -3,-3 v -18 c 0,-1 2,-3 3,-3 z"
+ id="path781"
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989"
+ id="text783"
+ y="135.09822"
+ x="642.1239">+/-</text>
+ </g>
+ <text
+ inkscape:label="Info"
+ transform="scale(0.96824589,1.0327955)"
+ id="text509"
+ y="12.333653"
+ x="252.9579"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.31375408px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.30784383px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.30784383px"
+ y="12.333653"
+ x="252.9579"
+ id="tspan507"
+ sodipodi:role="line">information</tspan></text>
+ <g
+ inkscape:label="NumDot"
+ id="g4942"
+ style="fill-rule:evenodd;stroke-width:0.13585199"
+ transform="matrix(1.6700128,0,0,1.6700128,-826.83854,-145.60856)">
+ <path
+ style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path181"
+ d="m 697,197 h 20 c 2,0 3,1 3,2 v 19 c 0,1 -1,2 -3,2 h -20 c -1,0 -3,-1 -3,-2 v -19 c 0,-1 2,-2 3,-2 z"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="scale(1.0007154,0.99928514)"
+ x="696.7464"
+ y="204.54802"
+ id="text771"
+ style="font-weight:normal;font-size:6.96602964px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989">.</text>
+ </g>
+ </g>
+ <g
+ style="stroke-width:0.377115"
+ inkscape:label="HMI:Input@/PRODUCT_NAME"
+ transform="matrix(0.75813069,0,0,0.75813069,598.48618,37.66828)"
+ id="g1226">
+ <text
+ inkscape:label="value"
+ id="text1216"
+ y="181.75911"
+ x="67.884193"
+ style="font-style:normal;font-weight:normal;font-size:93.4523px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ff8c00;fill-opacity:1;stroke:none;stroke-width:0.377115px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-size:49.2439px;text-align:center;text-anchor:middle;fill:#ff8c00;stroke-width:0.377115px"
+ y="181.75911"
+ x="67.884201"
+ id="tspan1214"
+ sodipodi:role="line">XXX</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:1.88558;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="rect1220"
+ width="333.56146"
+ height="128"
+ x="-100.79848"
+ y="95.40741"
+ onclick=""
+ inkscape:label="edit" />
+ </g>
+ <g
+ style="stroke-width:0.377115"
+ inkscape:label="HMI:Input@/PRODUCT_IMAGE"
+ transform="matrix(0.75813069,0,0,0.75813069,974.6282,37.66828)"
+ id="g1240">
+ <text
+ inkscape:label="value"
+ id="text1230"
+ y="186.09921"
+ x="115.21943"
+ style="font-style:normal;font-weight:normal;font-size:160px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ff8c00;fill-opacity:1;stroke:none;stroke-width:0.377115px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-size:49.2439px;text-align:center;text-anchor:middle;fill:#ff8c00;stroke-width:0.377115px"
+ y="186.09921"
+ x="115.21944"
+ id="tspan1228"
+ sodipodi:role="line">XXX</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:1.88558;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="rect1234"
+ width="311.42853"
+ height="128"
+ x="-78.665535"
+ y="95.40741"
+ onclick=""
+ inkscape:label="edit" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="629.58868"
+ y="115.44662"
+ id="text1258"><tspan
+ sodipodi:role="line"
+ id="tspan1256"
+ x="629.58868"
+ y="115.44662">Product Name</tspan></text>
+ <text
+ id="text1262"
+ y="115.44662"
+ x="1051.5886"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ y="115.44662"
+ x="1051.5886"
+ id="tspan1260"
+ sodipodi:role="line">Product Image</tspan></text>
+ <g
+ id="g1270"
+ transform="matrix(0.75813069,0,0,0.75813069,298.48618,317.66828)"
+ inkscape:label="HMI:Input@/SAVE_AS_CSV"
+ style="stroke-width:0.377115">
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:62.1669px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff8c00;fill-opacity:1;stroke:none;stroke-width:0.377115px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="-257.78806"
+ y="192.18758"
+ id="text1266"
+ inkscape:label="value"><tspan
+ sodipodi:role="line"
+ id="tspan1264"
+ x="-257.78806"
+ y="192.18758"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:62.1669px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff8c00;stroke-width:0.377115px">file.csv</tspan></text>
+ <rect
+ inkscape:label="edit"
+ onclick=""
+ y="111.23583"
+ x="-359.35144"
+ height="128"
+ width="465.35306"
+ id="rect1268"
+ 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:1.88558;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>
+ <text
+ id="text1274"
+ y="395.44662"
+ x="196.74792"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ y="395.44662"
+ x="196.74792"
+ id="tspan1272"
+ sodipodi:role="line">Save As CSV name</tspan></text>
+ <g
+ inkscape:label="HMI:Switch@/SAVE_SUCCESS"
+ id="g2101"
+ transform="matrix(9.928748,0,0,9.9287551,-28.29598,-139.30786)"
+ style="stroke-width:0.380665">
+ <text
+ id="text2095"
+ y="83.254463"
+ x="112.6369"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#008000;fill-opacity:1;stroke:none;stroke-width:0.100718px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"
+ inkscape:label="true"><tspan
+ style="fill:#008000;stroke-width:0.100718px"
+ y="83.254463"
+ x="112.6369"
+ id="tspan2093"
+ sodipodi:role="line">✔</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.100718px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="112.6369"
+ y="83.254463"
+ id="text2099"
+ inkscape:label="false"><tspan
+ sodipodi:role="line"
+ id="tspan2097"
+ x="112.6369"
+ y="83.254463"
+ style="fill:#ff0000;stroke-width:0.100718px">✕</tspan></text>
+ </g>
+ <g
+ style="stroke-width:1.42987"
+ inkscape:label="HMI:Button@/SAVE_AS_BT"
+ id="g3512"
+ transform="translate(-481.11028,195.52394)">
+ <g
+ id="g3500"
+ inkscape:label="active"
+ transform="matrix(1,0,0,0.75444798,-380,-152.4469)"
+ style="stroke-width:1.6462">
+ <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:url(#radialGradient3514);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:6.90775;stroke-linecap:round;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="rect3496"
+ width="320.99121"
+ height="125.00497"
+ x="518.36066"
+ y="618.00537"
+ ry="28.3067"
+ rx="21.355932" />
+ <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:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.15129;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.45388, 3.45388;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect3498"
+ width="320.99121"
+ height="125.00497"
+ x="518.36066"
+ y="618.00537"
+ inkscape:label="frame" />
+ </g>
+ <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:#ffa32a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.77953;stroke-linecap:round;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="rect3502"
+ width="320.99121"
+ height="94.309746"
+ x="518.36066"
+ y="318.00534"
+ ry="21.355932"
+ rx="21.355932"
+ inkscape:label="inactive" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="677.57697"
+ y="379.98633"
+ id="text3508"><tspan
+ sodipodi:role="line"
+ x="677.57697"
+ y="379.98633"
+ id="tspan3506">Save As</tspan></text>
+ <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:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect3510"
+ width="320.99121"
+ height="94.309746"
+ x="518.36066"
+ y="318.00534"
+ inkscape:label="reference" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="62.560974"
+ y="676.85449"
+ id="text292"><tspan
+ sodipodi:role="line"
+ id="tspan290"
+ x="62.560974"
+ y="712.24512" /></text>
+ <g
+ style="stroke-width:1.42987"
+ inkscape:label="HMI:Button@/SAVE_BT"
+ id="g10026"
+ transform="translate(-481.11028,-124.47606)">
+ <g
+ id="g10016"
+ inkscape:label="active"
+ transform="matrix(1,0,0,0.75444798,-380,-152.4469)"
+ style="stroke-width:1.6462">
+ <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:url(#radialGradient10028);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:6.90775;stroke-linecap:round;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="rect10012"
+ width="320.99121"
+ height="125.00497"
+ x="518.36066"
+ y="618.00537"
+ ry="28.3067"
+ rx="21.355932" />
+ <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:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.15129;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.45388, 3.45388;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect10014"
+ width="320.99121"
+ height="125.00497"
+ x="518.36066"
+ y="618.00537"
+ inkscape:label="frame" />
+ </g>
+ <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:#ffa32a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.77953;stroke-linecap:round;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="rect10018"
+ width="320.99121"
+ height="94.309746"
+ x="518.36066"
+ y="318.00534"
+ ry="21.355932"
+ rx="21.355932"
+ inkscape:label="inactive" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="677.57697"
+ y="379.98633"
+ id="text10022"><tspan
+ sodipodi:role="line"
+ x="677.57697"
+ y="379.98633"
+ id="tspan10020">Save</tspan></text>
+ <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:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect10024"
+ width="320.99121"
+ height="94.309746"
+ x="518.36066"
+ y="318.00534"
+ inkscape:label="reference" />
+ </g>
+ <g
+ style="stroke-width:0.377115"
+ inkscape:label="HMI:Input@/STEP_1_BAKE_TIME"
+ transform="matrix(0.75813069,0,0,0.75813069,598.48618,177.66828)"
+ id="g15089">
+ <text
+ inkscape:label="value"
+ id="text15085"
+ y="181.75911"
+ x="67.884193"
+ style="font-style:normal;font-weight:normal;font-size:93.4523px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ff8c00;fill-opacity:1;stroke:none;stroke-width:0.377115px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-size:49.2439px;text-align:center;text-anchor:middle;fill:#ff8c00;stroke-width:0.377115px"
+ y="181.75911"
+ x="67.884201"
+ id="tspan15083"
+ sodipodi:role="line">XXX</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:1.88558;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="rect15087"
+ width="333.56146"
+ height="128"
+ x="-100.79848"
+ y="95.40741"
+ onclick=""
+ inkscape:label="edit" />
+ </g>
+ <g
+ style="stroke-width:0.377115"
+ inkscape:label="HMI:Input@/STEP_1_BAKE_TEMP"
+ transform="matrix(0.75813069,0,0,0.75813069,974.6282,177.66828)"
+ id="g15097">
+ <text
+ inkscape:label="value"
+ id="text15093"
+ y="186.09921"
+ x="115.21943"
+ style="font-style:normal;font-weight:normal;font-size:160px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ff8c00;fill-opacity:1;stroke:none;stroke-width:0.377115px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-size:49.2439px;text-align:center;text-anchor:middle;fill:#ff8c00;stroke-width:0.377115px"
+ y="186.09921"
+ x="115.21944"
+ id="tspan15091"
+ sodipodi:role="line">XXX</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:1.88558;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="rect15095"
+ width="311.42853"
+ height="128"
+ x="-78.665535"
+ y="95.40741"
+ onclick=""
+ inkscape:label="edit" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="629.58868"
+ y="255.44662"
+ id="text15101"><tspan
+ sodipodi:role="line"
+ id="tspan15099"
+ x="629.58868"
+ y="255.44662">Step 1 Bake Time</tspan></text>
+ <text
+ id="text15105"
+ y="255.44662"
+ x="1051.5886"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ y="255.44662"
+ x="1051.5886"
+ id="tspan15103"
+ sodipodi:role="line">Step 1 Bake Temp</tspan></text>
+ <g
+ style="stroke-width:0.377115"
+ inkscape:label="HMI:Input@/STEP_2_BAKE_TIME"
+ transform="matrix(0.75813069,0,0,0.75813069,598.48618,317.66828)"
+ id="g20945">
+ <text
+ inkscape:label="value"
+ id="text20941"
+ y="181.75911"
+ x="67.884193"
+ style="font-style:normal;font-weight:normal;font-size:93.4523px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ff8c00;fill-opacity:1;stroke:none;stroke-width:0.377115px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-size:49.2439px;text-align:center;text-anchor:middle;fill:#ff8c00;stroke-width:0.377115px"
+ y="181.75911"
+ x="67.884201"
+ id="tspan20939"
+ sodipodi:role="line">XXX</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:1.88558;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="rect20943"
+ width="333.56146"
+ height="128"
+ x="-100.79848"
+ y="95.40741"
+ onclick=""
+ inkscape:label="edit" />
+ </g>
+ <g
+ style="stroke-width:0.377115"
+ inkscape:label="HMI:Input@/STEP_2_BAKE_TEMP"
+ transform="matrix(0.75813069,0,0,0.75813069,974.6282,317.66828)"
+ id="g20953">
+ <text
+ inkscape:label="value"
+ id="text20949"
+ y="186.09921"
+ x="115.21943"
+ style="font-style:normal;font-weight:normal;font-size:160px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ff8c00;fill-opacity:1;stroke:none;stroke-width:0.377115px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-size:49.2439px;text-align:center;text-anchor:middle;fill:#ff8c00;stroke-width:0.377115px"
+ y="186.09921"
+ x="115.21944"
+ id="tspan20947"
+ sodipodi:role="line">XXX</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:1.88558;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="rect20951"
+ width="311.42853"
+ height="128"
+ x="-78.665535"
+ y="95.40741"
+ onclick=""
+ inkscape:label="edit" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="629.58868"
+ y="395.44662"
+ id="text20957"><tspan
+ sodipodi:role="line"
+ id="tspan20955"
+ x="629.58868"
+ y="395.44662">Step 2 Bake Time</tspan></text>
+ <text
+ id="text20961"
+ y="395.44662"
+ x="1051.5886"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ y="395.44662"
+ x="1051.5886"
+ id="tspan20959"
+ sodipodi:role="line">Step 2 Bake Temp</tspan></text>
+ <text
+ id="text26523"
+ y="661.44666"
+ x="1025.7683"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ y="661.44666"
+ x="1025.7683"
+ id="tspan26521"
+ sodipodi:role="line">Save Status</tspan></text>
+ <g
+ inkscape:label="HMI:Switch@/RD_SUCCESS"
+ id="g1117"
+ transform="matrix(9.928748,0,0,9.9287551,-28.29598,-247.30786)"
+ style="stroke-width:0.380665">
+ <text
+ id="text1111"
+ y="83.254463"
+ x="112.6369"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#008000;fill-opacity:1;stroke:none;stroke-width:0.100718px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"
+ inkscape:label="true"><tspan
+ style="fill:#008000;stroke-width:0.100718px"
+ y="83.254463"
+ x="112.6369"
+ id="tspan1109"
+ sodipodi:role="line">✔</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.100718px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="112.6369"
+ y="83.254463"
+ id="text1115"
+ inkscape:label="false"><tspan
+ sodipodi:role="line"
+ id="tspan1113"
+ x="112.6369"
+ y="83.254463"
+ style="fill:#ff0000;stroke-width:0.100718px">✕</tspan></text>
+ </g>
+ <text
+ id="text1121"
+ y="553.44666"
+ x="1025.7683"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ y="553.44666"
+ x="1025.7683"
+ id="tspan1119"
+ sodipodi:role="line">Read Success</tspan></text>
+ <g
+ inkscape:label="HMI:Switch@/SAVE_ACK"
+ id="g1131"
+ transform="matrix(9.928748,0,0,9.9287551,-388.29598,-139.30786)"
+ style="stroke-width:0.380665">
+ <text
+ id="text1125"
+ y="83.254463"
+ x="112.6369"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#008000;fill-opacity:1;stroke:none;stroke-width:0.100718px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"
+ inkscape:label="true"><tspan
+ style="fill:#008000;stroke-width:0.100718px"
+ y="83.254463"
+ x="112.6369"
+ id="tspan1123"
+ sodipodi:role="line">✔</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.100718px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="112.6369"
+ y="83.254463"
+ id="text1129"
+ inkscape:label="false"><tspan
+ sodipodi:role="line"
+ id="tspan1127"
+ x="112.6369"
+ y="83.254463"
+ style="fill:#ff0000;stroke-width:0.100718px">✕</tspan></text>
+ </g>
+ <text
+ id="text1135"
+ y="661.44666"
+ x="665.76831"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ y="661.44666"
+ x="665.76831"
+ id="tspan1133"
+ sodipodi:role="line">Save Done</tspan></text>
+</svg>
--- a/py_ext/plc_python.c Sun Jan 26 14:58:13 2025 +0100
+++ b/py_ext/plc_python.c Fri Feb 07 18:42:43 2025 +0100
@@ -156,7 +156,7 @@
}
}
-char* PythonIterator(char* result, void** id)
+char* PythonIterator(char* result, void** id, int* is_last)
{
char* next_command;
PYTHON_EVAL* data__;
@@ -213,6 +213,8 @@
/* next command is BUFFER */
next_command = (char*)__GET_VAR(data__->BUFFER, .body);
*id=data__;
+ /*check if last command in the queue */
+ *is_last = EvalFBs[(Current_Python_EvalFB + 1) %% %(python_eval_fb_count)d] == NULL;
/* free python mutex */
UnLockPython();
/* return the next command to eval */
--- a/py_ext/pous.xml Sun Jan 26 14:58:13 2025 +0100
+++ b/py_ext/pous.xml Fri Feb 07 18:42:43 2025 +0100
@@ -1,7 +1,7 @@
<?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="0.0" creationDateTime="2008-12-14T16:53:26"/>
- <contentHeader name="Beremiz non-standard POUs library" modificationDateTime="2024-12-06T15:13:47">
+ <contentHeader name="Beremiz non-standard POUs library" modificationDateTime="2025-02-03T14:57:54">
<coordinateInfo>
<fbd>
<scaling x="8" y="8"/>
@@ -17,6 +17,512 @@
<types>
<dataTypes/>
<pous>
+ <pou name="csv_write_by_string" pouType="functionBlock">
+ <interface>
+ <outputVars>
+ <variable name="ACK">
+ <type>
+ <BOOL/>
+ </type>
+ </variable>
+ <variable name="ERROR">
+ <type>
+ <BOOL/>
+ </type>
+ </variable>
+ <variable name="RESULT">
+ <type>
+ <string/>
+ </type>
+ </variable>
+ </outputVars>
+ <inputVars>
+ <variable name="FILE_NAME">
+ <type>
+ <string/>
+ </type>
+ </variable>
+ <variable name="ROW">
+ <type>
+ <string/>
+ </type>
+ </variable>
+ <variable name="COLUMN">
+ <type>
+ <string/>
+ </type>
+ </variable>
+ <variable name="CONTENT">
+ <type>
+ <string/>
+ </type>
+ </variable>
+ <variable name="SAVE">
+ <type>
+ <BOOL/>
+ </type>
+ </variable>
+ </inputVars>
+ <localVars>
+ <variable name="py_eval0">
+ <type>
+ <derived name="python_eval"/>
+ </type>
+ </variable>
+ <variable name="R_TRIG1">
+ <type>
+ <derived name="R_TRIG"/>
+ </type>
+ </variable>
+ <variable name="R_TRIG2">
+ <type>
+ <derived name="R_TRIG"/>
+ </type>
+ </variable>
+ <variable name="csv_refresh0">
+ <type>
+ <derived name="csv_refresh"/>
+ </type>
+ </variable>
+ </localVars>
+ </interface>
+ <body>
+ <FBD>
+ <inVariable localId="8" executionOrderId="0" height="27" width="112" negated="false">
+ <position x="384" y="128"/>
+ <connectionPointOut>
+ <relPosition x="112" y="16"/>
+ </connectionPointOut>
+ <expression>'CSVWrStr("'</expression>
+ </inVariable>
+ <inVariable localId="52" executionOrderId="0" height="32" width="112" negated="false">
+ <position x="216" y="296"/>
+ <connectionPointOut>
+ <relPosition x="112" y="16"/>
+ </connectionPointOut>
+ <expression>CONTENT</expression>
+ </inVariable>
+ <comment localId="29" height="40" width="232">
+ <position x="64" y="32"/>
+ <content>
+ <xhtml:p><![CDATA[Generate python code line]]></xhtml:p>
+ </content>
+ </comment>
+ <block localId="40" width="104" height="80" typeName="python_eval" instanceName="py_eval0" executionOrderId="0">
+ <position x="552" y="480"/>
+ <inputVariables>
+ <variable formalParameter="TRIG">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="46" formalParameter="Q">
+ <position x="552" y="512"/>
+ <position x="360" y="512"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="CODE">
+ <connectionPointIn>
+ <relPosition x="0" y="64"/>
+ <connection refLocalId="41">
+ <position x="552" y="544"/>
+ <position x="520" y="544"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ACK">
+ <connectionPointOut>
+ <relPosition x="104" y="32"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="RESULT">
+ <connectionPointOut>
+ <relPosition x="104" y="64"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <continuation name="Code" localId="41" height="24" width="128">
+ <position x="392" y="528"/>
+ <connectionPointOut>
+ <relPosition x="128" y="16"/>
+ </connectionPointOut>
+ </continuation>
+ <inVariable localId="42" height="24" width="64" executionOrderId="0" negated="false">
+ <position x="208" y="496"/>
+ <connectionPointOut>
+ <relPosition x="64" y="16"/>
+ </connectionPointOut>
+ <expression>SAVE</expression>
+ </inVariable>
+ <outVariable localId="43" height="32" width="40" executionOrderId="0" negated="false">
+ <position x="736" y="400"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="40" formalParameter="ACK">
+ <position x="736" y="416"/>
+ <position x="688" y="416"/>
+ <position x="688" y="512"/>
+ <position x="656" y="512"/>
+ </connection>
+ </connectionPointIn>
+ <expression>ACK</expression>
+ </outVariable>
+ <outVariable localId="44" height="24" width="64" executionOrderId="0" negated="false">
+ <position x="688" y="584"/>
+ <connectionPointIn>
+ <relPosition x="0" y="8"/>
+ <connection refLocalId="40" formalParameter="RESULT">
+ <position x="688" y="592"/>
+ <position x="672" y="592"/>
+ <position x="672" y="544"/>
+ <position x="656" y="544"/>
+ </connection>
+ </connectionPointIn>
+ <expression>RESULT</expression>
+ </outVariable>
+ <block localId="46" typeName="R_TRIG" instanceName="R_TRIG1" executionOrderId="0" height="48" width="64">
+ <position x="296" y="480"/>
+ <inputVariables>
+ <variable formalParameter="CLK">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="42">
+ <position x="296" y="512"/>
+ <position x="272" y="512"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="Q">
+ <connectionPointOut>
+ <relPosition x="64" y="32"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <block localId="33" typeName="LEFT" executionOrderId="0" height="64" width="56">
+ <position x="736" y="512"/>
+ <inputVariables>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="40" formalParameter="RESULT">
+ <position x="736" y="544"/>
+ <position x="656" y="544"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="L">
+ <connectionPointIn>
+ <relPosition x="0" y="56"/>
+ <connection refLocalId="35">
+ <position x="736" y="568"/>
+ <position x="724" y="568"/>
+ <position x="724" y="560"/>
+ <position x="712" y="560"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="56" y="32"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <block localId="34" typeName="EQ" executionOrderId="0" height="72" width="64">
+ <position x="880" y="512"/>
+ <inputVariables>
+ <variable formalParameter="IN1">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="33" formalParameter="OUT">
+ <position x="880" y="544"/>
+ <position x="792" y="544"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN2">
+ <connectionPointIn>
+ <relPosition x="0" y="56"/>
+ <connection refLocalId="36">
+ <position x="880" y="568"/>
+ <position x="848" y="568"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="64" y="32"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="35" executionOrderId="0" height="24" width="24" negated="false">
+ <position x="688" y="552"/>
+ <connectionPointOut>
+ <relPosition x="24" y="8"/>
+ </connectionPointOut>
+ <expression>1</expression>
+ </inVariable>
+ <inVariable localId="36" executionOrderId="0" height="32" width="40" negated="false">
+ <position x="808" y="552"/>
+ <connectionPointOut>
+ <relPosition x="40" y="16"/>
+ </connectionPointOut>
+ <expression>'#'</expression>
+ </inVariable>
+ <block localId="37" typeName="R_TRIG" instanceName="R_TRIG2" executionOrderId="0" height="48" width="64">
+ <position x="736" y="456"/>
+ <inputVariables>
+ <variable formalParameter="CLK">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="40" formalParameter="ACK">
+ <position x="736" y="488"/>
+ <position x="688" y="488"/>
+ <position x="688" y="512"/>
+ <position x="656" y="512"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="Q">
+ <connectionPointOut>
+ <relPosition x="64" y="32"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <block localId="39" typeName="AND" executionOrderId="0" height="72" width="64">
+ <position x="984" y="456"/>
+ <inputVariables>
+ <variable formalParameter="IN1">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="37" formalParameter="Q">
+ <position x="984" y="488"/>
+ <position x="800" y="488"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN2" negated="true">
+ <connectionPointIn>
+ <relPosition x="0" y="56"/>
+ <connection refLocalId="34" formalParameter="OUT">
+ <position x="984" y="512"/>
+ <position x="974" y="512"/>
+ <position x="974" y="544"/>
+ <position x="944" y="544"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="64" y="32"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <block localId="53" typeName="csv_refresh" instanceName="csv_refresh0" executionOrderId="0" width="104" height="48">
+ <position x="1112" y="456"/>
+ <inputVariables>
+ <variable formalParameter="TRIG">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="39" formalParameter="OUT">
+ <position x="1112" y="488"/>
+ <position x="1048" y="488"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables/>
+ </block>
+ <outVariable localId="54" executionOrderId="0" width="56" height="32" negated="false">
+ <position x="1096" y="528"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="34" formalParameter="OUT">
+ <position x="1096" y="544"/>
+ <position x="944" y="544"/>
+ </connection>
+ </connectionPointIn>
+ <expression>ERROR</expression>
+ </outVariable>
+ <block localId="7" typeName="CONCAT" executionOrderId="0" height="240" width="67">
+ <position x="536" y="112"/>
+ <inputVariables>
+ <variable formalParameter="IN1">
+ <connectionPointIn>
+ <relPosition x="0" y="32"/>
+ <connection refLocalId="8">
+ <position x="536" y="144"/>
+ <position x="496" y="144"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN2">
+ <connectionPointIn>
+ <relPosition x="0" y="56"/>
+ <connection refLocalId="2">
+ <position x="536" y="168"/>
+ <position x="328" y="168"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN3">
+ <connectionPointIn>
+ <relPosition x="0" y="80"/>
+ <connection refLocalId="10">
+ <position x="536" y="192"/>
+ <position x="496" y="192"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN4">
+ <connectionPointIn>
+ <relPosition x="0" y="104"/>
+ <connection refLocalId="3">
+ <position x="536" y="216"/>
+ <position x="328" y="216"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN5">
+ <connectionPointIn>
+ <relPosition x="0" y="128"/>
+ <connection refLocalId="12">
+ <position x="536" y="240"/>
+ <position x="496" y="240"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN6">
+ <connectionPointIn>
+ <relPosition x="0" y="152"/>
+ <connection refLocalId="4">
+ <position x="536" y="264"/>
+ <position x="328" y="264"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN7">
+ <connectionPointIn>
+ <relPosition x="0" y="176"/>
+ <connection refLocalId="1">
+ <position x="536" y="288"/>
+ <position x="496" y="288"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN8">
+ <connectionPointIn>
+ <relPosition x="0" y="200"/>
+ <connection refLocalId="52">
+ <position x="536" y="312"/>
+ <position x="328" y="312"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN9">
+ <connectionPointIn>
+ <relPosition x="0" y="224"/>
+ <connection refLocalId="14">
+ <position x="536" y="336"/>
+ <position x="496" y="336"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="67" y="32"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="2" executionOrderId="0" height="32" width="112" negated="false">
+ <position x="216" y="152"/>
+ <connectionPointOut>
+ <relPosition x="112" y="16"/>
+ </connectionPointOut>
+ <expression>FILE_NAME</expression>
+ </inVariable>
+ <inVariable localId="10" executionOrderId="0" height="24" width="112" negated="false">
+ <position x="384" y="184"/>
+ <connectionPointOut>
+ <relPosition x="112" y="8"/>
+ </connectionPointOut>
+ <expression>'","'</expression>
+ </inVariable>
+ <inVariable localId="3" executionOrderId="0" height="32" width="112" negated="false">
+ <position x="216" y="200"/>
+ <connectionPointOut>
+ <relPosition x="112" y="16"/>
+ </connectionPointOut>
+ <expression>ROW</expression>
+ </inVariable>
+ <inVariable localId="12" executionOrderId="0" height="24" width="112" negated="false">
+ <position x="384" y="224"/>
+ <connectionPointOut>
+ <relPosition x="112" y="16"/>
+ </connectionPointOut>
+ <expression>'","'</expression>
+ </inVariable>
+ <inVariable localId="4" executionOrderId="0" height="32" width="112" negated="false">
+ <position x="216" y="248"/>
+ <connectionPointOut>
+ <relPosition x="112" y="16"/>
+ </connectionPointOut>
+ <expression>COLUMN</expression>
+ </inVariable>
+ <inVariable localId="14" executionOrderId="0" height="24" width="112" negated="false">
+ <position x="384" y="320"/>
+ <connectionPointOut>
+ <relPosition x="112" y="16"/>
+ </connectionPointOut>
+ <expression>'")'</expression>
+ </inVariable>
+ <connector name="Code" localId="19" height="24" width="128">
+ <position x="656" y="136"/>
+ <connectionPointIn>
+ <relPosition x="0" y="8"/>
+ <connection refLocalId="7" formalParameter="OUT">
+ <position x="656" y="144"/>
+ <position x="603" y="144"/>
+ </connection>
+ </connectionPointIn>
+ </connector>
+ <inVariable localId="1" executionOrderId="0" height="24" width="112" negated="false">
+ <position x="384" y="272"/>
+ <connectionPointOut>
+ <relPosition x="112" y="16"/>
+ </connectionPointOut>
+ <expression>'","'</expression>
+ </inVariable>
+ </FBD>
+ </body>
+ </pou>
<pou name="_csv_update" pouType="functionBlock">
<interface>
<externalVars>
@@ -1058,7 +1564,7 @@
<connectionPointOut>
<relPosition x="176" y="16"/>
</connectionPointOut>
- <expression>'pyext_csv_reload()'</expression>
+ <expression>'CSVReload()'</expression>
</inVariable>
<block localId="15" typeName="csv_refresh" instanceName="csv_refresh0" executionOrderId="0" width="104" height="64">
<position x="568" y="32"/>
@@ -1930,9 +2436,9 @@
</outputVariables>
</block>
<inVariable localId="8" executionOrderId="0" height="24" width="160" negated="false">
- <position x="352" y="112"/>
+ <position x="352" y="104"/>
<connectionPointOut>
- <relPosition x="160" y="8"/>
+ <relPosition x="160" y="16"/>
</connectionPointOut>
<expression>'CSVWrInt("'</expression>
</inVariable>
@@ -1944,9 +2450,9 @@
<expression>FILE_NAME</expression>
</inVariable>
<inVariable localId="10" executionOrderId="0" height="24" width="112" negated="false">
- <position x="504" y="152"/>
+ <position x="504" y="160"/>
<connectionPointOut>
- <relPosition x="112" y="16"/>
+ <relPosition x="112" y="8"/>
</connectionPointOut>
<expression>'",'</expression>
</inVariable>
@@ -1958,9 +2464,9 @@
<expression>ROW</expression>
</inVariable>
<inVariable localId="12" executionOrderId="0" height="24" width="112" negated="false">
- <position x="504" y="208"/>
+ <position x="504" y="200"/>
<connectionPointOut>
- <relPosition x="112" y="8"/>
+ <relPosition x="112" y="16"/>
</connectionPointOut>
<expression>','</expression>
</inVariable>
@@ -1972,9 +2478,9 @@
<expression>COLUMN</expression>
</inVariable>
<inVariable localId="51" executionOrderId="0" height="24" width="112" negated="false">
- <position x="504" y="256"/>
+ <position x="504" y="248"/>
<connectionPointOut>
- <relPosition x="112" y="8"/>
+ <relPosition x="112" y="16"/>
</connectionPointOut>
<expression>',"'</expression>
</inVariable>
@@ -1986,18 +2492,12 @@
<expression>CONTENT</expression>
</inVariable>
<inVariable localId="14" executionOrderId="0" height="24" width="112" negated="false">
- <position x="504" y="304"/>
+ <position x="504" y="296"/>
<connectionPointOut>
<relPosition x="112" y="16"/>
</connectionPointOut>
<expression>'")'</expression>
</inVariable>
- <comment localId="28" height="48" width="520">
- <position x="48" y="400"/>
- <content>
- <xhtml:p><![CDATA[Execute python code on change or globally when CSV is updated]]></xhtml:p>
- </content>
- </comment>
<comment localId="29" height="40" width="232">
<position x="64" y="32"/>
<content>
@@ -2005,9 +2505,9 @@
</content>
</comment>
<connector name="Code" localId="30" height="24" width="128">
- <position x="856" y="112"/>
+ <position x="856" y="104"/>
<connectionPointIn>
- <relPosition x="0" y="8"/>
+ <relPosition x="0" y="16"/>
<connection refLocalId="7" formalParameter="OUT">
<position x="856" y="120"/>
<position x="752" y="120"/>
--- a/py_ext/py_ext.py Sun Jan 26 14:58:13 2025 +0100
+++ b/py_ext/py_ext.py Fri Feb 07 18:42:43 2025 +0100
@@ -1,186 +1,21 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+# This file is part of Beremiz IDE
#
-# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2013: Laurent BESSARD
# Copyright (C) 2017: Andrey Skvortsov
+# Copyright (C) 2025: Edouard TISSERANT
#
# See COPYING file for copyrights details.
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
import os
from POULibrary import POULibrary
from py_ext.PythonFileCTNMixin import PythonFileCTNMixin
import util.paths as paths
-pyext_python_lib_code = """
-import csv
-from collections import OrderedDict
-
-csv_int_files = {}
-def CSVRdInt(fname, rowidx, colidx):
- \"\"\"
- Return value at row/column pointed by integer indexes
- Assumes data starts at first row and first column, no headers.
- \"\"\"
- global csv_int_files
- data = csv_int_files.get(fname, None)
- if data is None:
- data = list()
- try:
- csvfile = open(fname, 'rt', encoding='utf-8')
- except IOError:
- return "#FILE_NOT_FOUND"
- try:
- dialect = csv.Sniffer().sniff(csvfile.read(1024))
- csvfile.seek(0)
- reader = csv.reader(csvfile, dialect)
- for row in reader:
- data.append(row)
- except csv.Error as e:
- return "#CSV_ERROR"
- finally:
- csvfile.close()
- csv_int_files[fname] = data
-
- try:
- row = data[rowidx]
- if not row and rowidx == len(data)-1:
- raise IndexError
- except IndexError:
- return "#ROW_NOT_FOUND"
-
- try:
- return row[colidx]
- except IndexError:
- return "#COL_NOT_FOUND"
-
-
-csv_str_files = {}
-def CSVRdStr(fname, rowname, colname):
- \"\"\"
- Return value at row/column pointed by a pair of names as string
- Assumes first row is column headers and first column is row name.
- \"\"\"
- global csv_str_files
- entry = csv_str_files.get(fname, None)
- if entry is None:
- data = dict()
- try:
- csvfile = open(fname, 'rt', encoding='utf-8')
- except IOError:
- return "#FILE_NOT_FOUND"
- try:
- dialect = csv.Sniffer().sniff(csvfile.read(1024))
- csvfile.seek(0)
- reader = csv.reader(csvfile, dialect)
- headers = dict([(name, index) for index, name in enumerate(reader.__next__()[1:])])
- for row in reader:
- data[row[0]] = row[1:]
- except csv.Error:
- return "#CSV_ERROR"
- finally:
- csvfile.close()
- csv_str_files[fname] = (headers, data)
- else:
- headers, data = entry
-
- try:
- row = data[rowname]
- except KeyError:
- return "#ROW_NOT_FOUND"
-
- try:
- colidx = headers[colname]
- except KeyError:
- return "#COL_NOT_FOUND"
-
- try:
- return row[colidx]
- except IndexError:
- return "#COL_NOT_FOUND"
-
-
-def CSVWrInt(fname, rowidx, colidx, content):
- \"\"\"
- Update value at row/column pointed by integer indexes
- Assumes data starts at first row and first column, no headers.
- \"\"\"
-
- global csv_int_files
- dialect = None
- data = csv_int_files.get(fname, None)
- if data is None:
- data = list()
- try:
- csvfile = open(fname, 'rt', encoding='utf-8')
- except IOError:
- return "#FILE_NOT_FOUND"
- try:
- dialect = csv.Sniffer().sniff(csvfile.read(1024))
- csvfile.seek(0)
- reader = csv.reader(csvfile, dialect)
- for row in reader:
- data.append(row)
- except csv.Error as e:
- return "#CSV_ERROR"
- finally:
- csvfile.close()
- csv_int_files[fname] = data
-
- try:
- if rowidx == len(data):
- row = []
- data.append(row)
- else:
- row = data[rowidx]
- except IndexError:
- return "#ROW_NOT_FOUND"
-
- try:
- if rowidx > 0 and colidx >= len(data[0]):
- raise IndexError
- if colidx >= len(row):
- row.extend([""] * (colidx - len(row)) + [content])
- else:
- row[colidx] = content
- except IndexError:
- return "#COL_NOT_FOUND"
-
- try:
- wfile = open(fname, 'wt')
- writer = csv.writer(wfile) if not(dialect) else csv.writer(wfile, dialect)
- for row in data:
- writer.writerow(row)
- finally:
- wfile.close()
-
- return "OK"
-
-
-def pyext_csv_reload():
- global csv_int_files, csv_str_files
- csv_int_files.clear()
- csv_str_files.clear()
-
-"""
+pyext_python_lib_code = open(paths.AbsNeighbourFile(__file__, "py_ext_rt.py"), "r").read()
class PythonLibrary(POULibrary):
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/py_ext/py_ext_rt.py Fri Feb 07 18:42:43 2025 +0100
@@ -0,0 +1,297 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz Runtime
+#
+# Copyright (C) 2013: Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
+# Copyright (C) 2025: Edouard Tisserant
+#
+# See COPYING file for copyrights details.
+
+import csv
+from collections import OrderedDict
+
+csv_int_files = {}
+cvs_int_changed = set()
+csv_str_files = {}
+cvs_str_changed = set()
+
+class Entry():
+ def __init__(self, *args):
+ self.args = args
+ def __call__(self):
+ return self.args
+
+def _CSV_int_Load(fname):
+ global csv_int_files
+ entry = csv_int_files.get(fname, None)
+ if entry is None:
+ data = list()
+ csvfile = open(fname, 'rt', encoding='utf-8')
+
+ try:
+ dialect = csv.Sniffer().sniff(csvfile.read(1024))
+ csvfile.seek(0)
+ reader = csv.reader(csvfile, dialect)
+ for row in reader:
+ data.append(row)
+ finally:
+ csvfile.close()
+ entry = Entry(fname, dialect, data)
+ csv_int_files[fname] = entry
+ return entry
+
+
+def _CSV_str_Load(fname):
+ global csv_str_files
+ entry = csv_str_files.get(fname, None)
+ if entry is None:
+ data = []
+ csvfile = open(fname, 'rt', encoding='utf-8')
+
+ try:
+ dialect = csv.Sniffer().sniff(csvfile.read(1024))
+ csvfile.seek(0)
+ reader = csv.reader(csvfile, dialect)
+ first_row = reader.__next__()
+ data.append(first_row)
+ col_headers = OrderedDict([(name, index+1) for index, name
+ in enumerate(first_row[1:])])
+ max_row_len = len(first_row)
+ row_headers = OrderedDict()
+ for index, row in enumerate(reader):
+ row_headers[row[0]] = index+1
+ data.append(row)
+ max_row_len = max(max_row_len, len(row))
+ finally:
+ csvfile.close()
+ entry = Entry(fname, dialect, col_headers, row_headers, max_row_len, data)
+ csv_str_files[fname] = entry
+ return entry
+
+
+def _CSV_str_Create(fname):
+ global csv_str_files
+ data = [[]] # start with an empty row, acounting for header row
+ dialect = None
+ col_headers = OrderedDict()
+ row_headers = OrderedDict()
+ max_row_len = 1 # set to one initialy, accounting for header column
+ entry = Entry(fname, dialect, col_headers, row_headers, max_row_len, data)
+ csv_str_files[fname] = entry
+ return entry
+
+
+def _CSV_Save_data(fname, dialect, data):
+ try:
+ wfile = open(fname, 'wt')
+ writer = csv.writer(wfile) if not(dialect) else csv.writer(wfile, dialect)
+ for row in data:
+ writer.writerow(row)
+ finally:
+ wfile.close()
+
+def _CSV_int_Save(entry):
+ fname, dialect, data = entry()
+ _CSV_Save_data(fname, dialect, data)
+
+
+def _CSV_str_Save(entry):
+ fname, dialect, col_headers, row_headers, max_row_len, data = entry()
+ _CSV_Save_data(fname, dialect, data)
+
+
+_already_registered_cb = False
+def _CSV_OnIdle_callback():
+ global _already_registered_cb, cvs_int_changed, cvs_str_changed
+ _already_registered_cb = False
+ while len(cvs_int_changed):
+ entry = cvs_int_changed.pop()
+ _CSV_int_Save(entry)
+
+ while len(cvs_str_changed):
+ entry = cvs_str_changed.pop()
+ _CSV_str_Save(entry)
+
+
+def _CSV_register_OnIdle_callback():
+ global _already_registered_cb
+ if not _already_registered_cb:
+ OnIdle.append(_CSV_OnIdle_callback)
+ _already_registered_cb = True
+
+
+def _CSV_int_modified(entry):
+ global cvs_int_changed
+ cvs_int_changed.add(entry)
+ _CSV_register_OnIdle_callback()
+
+
+def _CSV_str_modified(entry):
+ global cvs_str_changed
+ cvs_str_changed.add(entry)
+ _CSV_register_OnIdle_callback()
+
+
+def CSVRdInt(fname, rowidx, colidx):
+ """
+ Return value at row/column pointed by integer indexes
+ Assumes data starts at first row and first column, no headers.
+ """
+
+ try:
+ _fname, _dialect, data = _CSV_int_Load(fname)()
+ except IOError:
+ return "#FILE_NOT_FOUND"
+ except csv.Error as e:
+ return "#CSV_ERROR"
+
+ try:
+ row = data[rowidx]
+ if not row and rowidx == len(data)-1:
+ raise IndexError
+ except IndexError:
+ return "#ROW_NOT_FOUND"
+
+ try:
+ return row[colidx]
+ except IndexError:
+ return "#COL_NOT_FOUND"
+
+
+def CSVRdStr(fname, rowname, colname):
+ """
+ Return value at row/column pointed by a pair of names as string
+ Assumes first row is column headers and first column is row name.
+ """
+
+ if not rowname:
+ return "#INVALID_ROW"
+ if not colname:
+ return "#INVALID_COLUMN"
+
+ try:
+ fname, dialect, col_headers, row_headers, max_row_len, data = _CSV_str_Load(fname)()
+ except IOError:
+ return "#FILE_NOT_FOUND"
+ except csv.Error:
+ return "#CSV_ERROR"
+
+ try:
+ rowidx = row_headers[rowname]
+ except KeyError:
+ return "#ROW_NOT_FOUND"
+
+ try:
+ colidx = col_headers[colname]
+ except KeyError:
+ return "#COL_NOT_FOUND"
+
+ try:
+ return data[rowidx][colidx]
+ except IndexError:
+ return "#COL_NOT_FOUND"
+
+
+def CSVWrInt(fname, rowidx, colidx, content):
+ """
+ Update value at row/column pointed by integer indexes
+ Assumes data starts at first row and first column, no headers.
+ """
+
+ try:
+ entry = _CSV_int_Load(fname)
+ except IOError:
+ return "#FILE_NOT_FOUND"
+ except csv.Error as e:
+ return "#CSV_ERROR"
+
+ fname, dialect, data = entry()
+ try:
+ if rowidx == len(data):
+ row = []
+ data.append(row)
+ else:
+ row = data[rowidx]
+ except IndexError:
+ return "#ROW_NOT_FOUND"
+
+ try:
+ if rowidx > 0 and colidx >= len(data[0]):
+ raise IndexError
+ if colidx >= len(row):
+ row.extend([""] * (colidx - len(row)) + [content])
+ else:
+ row[colidx] = content
+ except IndexError:
+ return "#COL_NOT_FOUND"
+
+ _CSV_int_modified(entry)
+
+ return "OK"
+
+
+def CSVWrStr(fname, rowname, colname, content):
+ """
+ Update value at row/column pointed by a pair of names as string.
+ Assumes first row is column headers and first column is row name.
+ """
+
+ if not rowname:
+ return "#INVALID_ROW"
+ if not colname:
+ return "#INVALID_COLUMN"
+
+ try:
+ entry = _CSV_str_Load(fname)
+ except IOError:
+ entry = _CSV_str_Create(fname)
+ except csv.Error:
+ return "#CSV_ERROR"
+
+ fname, dialect, col_headers, row_headers, max_row_len, data = entry()
+ try:
+ rowidx = row_headers[rowname]
+ row = data[rowidx]
+ except KeyError:
+ # create a new row with appropriate header
+ row = [rowname]
+ # put it at the end
+ rowidx = len(data)
+ data.append(row)
+ row_headers[rowname] = rowidx
+
+ try:
+ colidx = col_headers[colname]
+ except KeyError:
+ # adjust col headers content
+ first_row = data[0]
+ first_row += [""]*(max_row_len - len(first_row)) + [colname]
+ # create a new column
+ colidx = col_headers[colname] = max_row_len
+ max_row_len = max_row_len + 1
+
+ try:
+ row[colidx] = content
+ except IndexError:
+ # create a new cell
+ row += [""]*(colidx - len(row)) + [content]
+
+ _CSV_str_modified(entry)
+
+ return "OK"
+
+
+def CSVReload():
+ global csv_int_files, csv_str_files, cvs_int_changed, cvs_str_changed
+
+ # Force saving modified CSV files
+ _CSV_OnIdle_callback()
+
+ # Wipe data model
+ csv_int_files.clear()
+ csv_str_files.clear()
+ cvs_int_changed.clear()
+ cvs_str_changed.clear()
+
--- a/runtime/PLCObject.py Sun Jan 26 14:58:13 2025 +0100
+++ b/runtime/PLCObject.py Fri Feb 07 18:42:43 2025 +0100
@@ -207,7 +207,7 @@
self._PythonIterator = getattr(self.PLClibraryHandle, "PythonIterator", None)
if self._PythonIterator is not None:
self._PythonIterator.restype = ctypes.c_char_p
- self._PythonIterator.argtypes = [ctypes.c_char_p, ctypes.POINTER(ctypes.c_void_p)]
+ self._PythonIterator.argtypes = [ctypes.c_char_p, ctypes.POINTER(ctypes.c_void_p), ctypes.POINTER(ctypes.c_int)]
self._stopPLC = self._stopPLC_real
else:
@@ -215,7 +215,7 @@
# as a call that block pythonthread until StopPLC
self.PlcStopping = Event()
- def PythonIterator(res, blkid):
+ def PythonIterator(res, blkid, is_last):
self.PlcStopping.clear()
self.PlcStopping.wait()
return None
@@ -307,7 +307,7 @@
self._GetDebugData = lambda: -1
self._suspendDebug = lambda x: -1
self._resumeDebug = lambda: None
- self._PythonIterator = lambda: ""
+ self._PythonIterator = lambda *a: ""
self._GetLogCount = None
self._LogMessage = None
self._GetLogMessage = None
@@ -389,7 +389,8 @@
"WorkingDir": self.workingdir,
"PLCObject": self,
"PLCBinary": self.PLClibraryHandle,
- "PLCGlobalsDesc": []})
+ "PLCGlobalsDesc": [],
+ "OnIdle": []})
for methodname in MethodNames:
self.python_runtime_vars["_runtime_%s" % methodname] = []
@@ -429,11 +430,12 @@
self.python_runtime_vars = None
def PythonThreadLoop(self):
- res, cmd, blkid = "None", "None", ctypes.c_void_p()
+ res, cmd, blkid, is_last = "None", "None", ctypes.c_void_p(), ctypes.c_int()
compile_cache = {}
while True:
- cmd = self._PythonIterator(res.encode(), blkid)
+ cmd = self._PythonIterator(res.encode(), blkid, ctypes.byref(is_last))
FBID = blkid.value
+ GOING_IDLE = is_last.value != 0
if cmd is None:
break
cmd = cmd.decode()
@@ -455,6 +457,11 @@
res = "#EXCEPTION : "+str(e)
self.LogMessage(1, ('PyEval@0x%x(Code="%s") Exception "%s"') % (FBID, cmd, str(e)))
+ if GOING_IDLE:
+ todo = self.python_runtime_vars["OnIdle"]
+ while todo:
+ todo.pop(0)()
+
def PythonThreadProc(self):
while True:
self.PythonThreadCondLock.acquire()