py_ext: add CSV file reading POUs in python extension library
authorEdouard Tisserant
Fri, 16 Dec 2022 13:43:38 +0100
changeset 3707 3c60c78dfa5d
parent 3706 39ae17a1cabe
child 3708 2299f25779ce
py_ext: add CSV file reading POUs in python extension library
py_ext/pous.xml
py_ext/py_ext.py
--- a/py_ext/pous.xml	Fri Dec 16 13:41:03 2022 +0100
+++ b/py_ext/pous.xml	Fri Dec 16 13:43:38 2022 +0100
@@ -1,10 +1,10 @@
 <?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="2014-03-17T08:07:24">
+  <contentHeader name="Beremiz non-standard POUs library" modificationDateTime="2022-12-16T11:59:30">
     <coordinateInfo>
       <fbd>
-        <scaling x="0" y="0"/>
+        <scaling x="8" y="8"/>
       </fbd>
       <ld>
         <scaling x="0" y="0"/>
@@ -17,6 +17,1646 @@
   <types>
     <dataTypes/>
     <pous>
+      <pou name="csv_read_by_string" pouType="functionBlock">
+        <interface>
+          <externalVars>
+            <variable name="pyext_csv_update">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </externalVars>
+          <outputVars>
+            <variable name="ACK">
+              <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>
+          </inputVars>
+          <localVars>
+            <variable name="OLDCODE">
+              <type>
+                <string/>
+              </type>
+            </variable>
+            <variable name="py_eval">
+              <type>
+                <derived name="python_eval"/>
+              </type>
+            </variable>
+            <variable name="R_TRIG0">
+              <type>
+                <derived name="R_TRIG"/>
+              </type>
+            </variable>
+            <variable name="R_TRIG1">
+              <type>
+                <derived name="R_TRIG"/>
+              </type>
+            </variable>
+            <variable name="SR0">
+              <type>
+                <derived name="SR"/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <block localId="7" typeName="CONCAT" executionOrderId="0" height="192" width="64">
+              <position x="360" y="112"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="8">
+                      <position x="360" y="144"/>
+                      <position x="320" y="144"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="56"/>
+                    <connection refLocalId="9">
+                      <position x="360" y="168"/>
+                      <position x="152" y="168"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN3">
+                  <connectionPointIn>
+                    <relPosition x="0" y="80"/>
+                    <connection refLocalId="10">
+                      <position x="360" y="192"/>
+                      <position x="320" y="192"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN4">
+                  <connectionPointIn>
+                    <relPosition x="0" y="104"/>
+                    <connection refLocalId="11">
+                      <position x="360" y="216"/>
+                      <position x="152" y="216"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN5">
+                  <connectionPointIn>
+                    <relPosition x="0" y="128"/>
+                    <connection refLocalId="12">
+                      <position x="360" y="240"/>
+                      <position x="320" y="240"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN6">
+                  <connectionPointIn>
+                    <relPosition x="0" y="152"/>
+                    <connection refLocalId="13">
+                      <position x="360" y="264"/>
+                      <position x="152" y="264"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN7">
+                  <connectionPointIn>
+                    <relPosition x="0" y="176"/>
+                    <connection refLocalId="14">
+                      <position x="360" y="288"/>
+                      <position x="320" y="288"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="64" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="8" executionOrderId="0" height="24" width="160" negated="false">
+              <position x="160" y="128"/>
+              <connectionPointOut>
+                <relPosition x="160" y="16"/>
+              </connectionPointOut>
+              <expression>'CSVRdStr("'</expression>
+            </inVariable>
+            <inVariable localId="9" executionOrderId="0" height="32" width="112" negated="false">
+              <position x="40" 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="208" y="184"/>
+              <connectionPointOut>
+                <relPosition x="112" y="8"/>
+              </connectionPointOut>
+              <expression>'","'</expression>
+            </inVariable>
+            <inVariable localId="11" executionOrderId="0" height="32" width="112" negated="false">
+              <position x="40" 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="208" y="224"/>
+              <connectionPointOut>
+                <relPosition x="112" y="16"/>
+              </connectionPointOut>
+              <expression>'","'</expression>
+            </inVariable>
+            <inVariable localId="13" executionOrderId="0" height="32" width="112" negated="false">
+              <position x="40" 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="208" y="272"/>
+              <connectionPointOut>
+                <relPosition x="112" y="16"/>
+              </connectionPointOut>
+              <expression>'")'</expression>
+            </inVariable>
+            <block localId="16" typeName="NE" executionOrderId="0" height="64" width="64">
+              <position x="208" y="408"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="22">
+                      <position x="208" y="440"/>
+                      <position x="168" y="440"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="56"/>
+                    <connection refLocalId="21">
+                      <position x="208" y="464"/>
+                      <position x="168" y="464"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="64" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="18" typeName="SEL" executionOrderId="0" height="96" width="64">
+              <position x="680" y="376"/>
+              <inputVariables>
+                <variable formalParameter="G">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="25">
+                      <position x="680" y="408"/>
+                      <position x="624" y="408"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN0">
+                  <connectionPointIn>
+                    <relPosition x="0" y="56"/>
+                    <connection refLocalId="20">
+                      <position x="680" y="432"/>
+                      <position x="632" y="432"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="80"/>
+                    <connection refLocalId="4">
+                      <position x="680" y="456"/>
+                      <position x="632" y="456"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="64" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <connector name="Code" localId="19" height="24" width="128">
+              <position x="480" y="136"/>
+              <connectionPointIn>
+                <relPosition x="0" y="8"/>
+                <connection refLocalId="7" formalParameter="OUT">
+                  <position x="480" y="144"/>
+                  <position x="424" y="144"/>
+                </connection>
+              </connectionPointIn>
+            </connector>
+            <outVariable localId="17" executionOrderId="0" height="32" width="66" negated="false">
+              <position x="784" y="392"/>
+              <connectionPointIn>
+                <relPosition x="0" y="16"/>
+                <connection refLocalId="18" formalParameter="OUT">
+                  <position x="784" y="408"/>
+                  <position x="744" y="408"/>
+                </connection>
+              </connectionPointIn>
+              <expression>OLDCODE</expression>
+            </outVariable>
+            <inVariable localId="20" executionOrderId="0" height="32" width="72" negated="false">
+              <position x="560" y="416"/>
+              <connectionPointOut>
+                <relPosition x="72" y="16"/>
+              </connectionPointOut>
+              <expression>OLDCODE</expression>
+            </inVariable>
+            <inVariable localId="21" executionOrderId="0" height="32" width="72" negated="false">
+              <position x="96" y="448"/>
+              <connectionPointOut>
+                <relPosition x="72" y="16"/>
+              </connectionPointOut>
+              <expression>OLDCODE</expression>
+            </inVariable>
+            <continuation name="Code" localId="4" height="24" width="128">
+              <position x="504" y="448"/>
+              <connectionPointOut>
+                <relPosition x="128" y="8"/>
+              </connectionPointOut>
+            </continuation>
+            <continuation name="Code" localId="22" height="24" width="128">
+              <position x="40" y="424"/>
+              <connectionPointOut>
+                <relPosition x="128" y="16"/>
+              </connectionPointOut>
+            </continuation>
+            <connector name="CodeChange" localId="23" height="24" width="120">
+              <position x="328" y="432"/>
+              <connectionPointIn>
+                <relPosition x="0" y="8"/>
+                <connection refLocalId="16" formalParameter="OUT">
+                  <position x="328" y="440"/>
+                  <position x="272" y="440"/>
+                </connection>
+              </connectionPointIn>
+            </connector>
+            <continuation name="CodeChange" localId="25" height="24" width="120">
+              <position x="504" y="392"/>
+              <connectionPointOut>
+                <relPosition x="120" y="16"/>
+              </connectionPointOut>
+            </continuation>
+            <comment localId="26" height="40" width="232">
+              <position x="48" y="40"/>
+              <content>
+                <xhtml:p><![CDATA[Generate python code line]]></xhtml:p>
+              </content>
+            </comment>
+            <comment localId="27" height="48" width="312">
+              <position x="40" y="328"/>
+              <content>
+                <xhtml:p><![CDATA[Detect changes in generated code line]]></xhtml:p>
+              </content>
+            </comment>
+            <comment localId="28" height="48" width="520">
+              <position x="48" y="512"/>
+              <content>
+                <xhtml:p><![CDATA[Execute python code on change or globally when CSV is updated]]></xhtml:p>
+              </content>
+            </comment>
+            <block localId="1" width="104" height="80" typeName="python_eval" instanceName="py_eval" executionOrderId="0">
+              <position x="552" y="600"/>
+              <inputVariables>
+                <variable formalParameter="TRIG">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="15" formalParameter="OUT">
+                      <position x="552" y="632"/>
+                      <position x="360" y="632"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="CODE">
+                  <connectionPointIn>
+                    <relPosition x="0" y="64"/>
+                    <connection refLocalId="2">
+                      <position x="552" y="664"/>
+                      <position x="528" y="664"/>
+                    </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>
+            <inVariable localId="3" height="24" width="152" executionOrderId="0" negated="false">
+              <position x="32" y="616"/>
+              <connectionPointOut>
+                <relPosition x="152" y="16"/>
+              </connectionPointOut>
+              <expression>pyext_csv_update</expression>
+            </inVariable>
+            <outVariable localId="5" height="24" width="40" executionOrderId="0" negated="false">
+              <position x="1216" y="632"/>
+              <connectionPointIn>
+                <relPosition x="0" y="8"/>
+                <connection refLocalId="38" formalParameter="Q1">
+                  <position x="1216" y="640"/>
+                  <position x="1168" y="640"/>
+                </connection>
+              </connectionPointIn>
+              <expression>ACK</expression>
+            </outVariable>
+            <outVariable localId="6" height="24" width="64" executionOrderId="0" negated="false">
+              <position x="688" y="704"/>
+              <connectionPointIn>
+                <relPosition x="0" y="8"/>
+                <connection refLocalId="1" formalParameter="RESULT">
+                  <position x="688" y="712"/>
+                  <position x="672" y="712"/>
+                  <position x="672" y="664"/>
+                  <position x="656" y="664"/>
+                </connection>
+              </connectionPointIn>
+              <expression>RESULT</expression>
+            </outVariable>
+            <continuation name="Code" localId="2" height="24" width="128">
+              <position x="400" y="648"/>
+              <connectionPointOut>
+                <relPosition x="128" y="16"/>
+              </connectionPointOut>
+            </continuation>
+            <continuation name="CodeChange" localId="24" height="24" width="120">
+              <position x="64" y="648"/>
+              <connectionPointOut>
+                <relPosition x="120" y="16"/>
+              </connectionPointOut>
+            </continuation>
+            <block localId="15" typeName="OR" executionOrderId="0" height="64" width="64">
+              <position x="296" y="600"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="32" formalParameter="Q">
+                      <position x="296" y="632"/>
+                      <position x="272" y="632"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="56"/>
+                    <connection refLocalId="24">
+                      <position x="296" y="656"/>
+                      <position x="184" y="656"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="64" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="32" typeName="R_TRIG" instanceName="R_TRIG0" executionOrderId="0" height="48" width="64">
+              <position x="208" y="600"/>
+              <inputVariables>
+                <variable formalParameter="CLK">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="3">
+                      <position x="208" y="632"/>
+                      <position x="184" y="632"/>
+                    </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="632"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="1" formalParameter="RESULT">
+                      <position x="736" y="664"/>
+                      <position x="656" y="664"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="L">
+                  <connectionPointIn>
+                    <relPosition x="0" y="56"/>
+                    <connection refLocalId="35">
+                      <position x="736" y="688"/>
+                      <position x="712" y="688"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="56" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="34" typeName="NE" executionOrderId="0" height="64" width="64">
+              <position x="880" y="632"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="33" formalParameter="OUT">
+                      <position x="880" y="664"/>
+                      <position x="792" y="664"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="56"/>
+                    <connection refLocalId="36">
+                      <position x="880" y="688"/>
+                      <position x="856" y="688"/>
+                    </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="672"/>
+              <connectionPointOut>
+                <relPosition x="24" y="16"/>
+              </connectionPointOut>
+              <expression>1</expression>
+            </inVariable>
+            <inVariable localId="36" executionOrderId="0" height="24" width="40" negated="false">
+              <position x="816" y="672"/>
+              <connectionPointOut>
+                <relPosition x="40" y="16"/>
+              </connectionPointOut>
+              <expression>'#'</expression>
+            </inVariable>
+            <block localId="37" typeName="R_TRIG" instanceName="R_TRIG1" executionOrderId="0" height="48" width="64">
+              <position x="880" y="576"/>
+              <inputVariables>
+                <variable formalParameter="CLK">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="1" formalParameter="ACK">
+                      <position x="880" y="608"/>
+                      <position x="688" y="608"/>
+                      <position x="688" y="632"/>
+                      <position x="656" y="632"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q">
+                  <connectionPointOut>
+                    <relPosition x="64" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="38" typeName="SR" instanceName="SR0" executionOrderId="0" height="64" width="48">
+              <position x="1120" y="608"/>
+              <inputVariables>
+                <variable formalParameter="S1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="39" formalParameter="OUT">
+                      <position x="1120" y="640"/>
+                      <position x="1056" y="640"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="R" edge="rising">
+                  <connectionPointIn>
+                    <relPosition x="0" y="56"/>
+                    <connection refLocalId="15" formalParameter="OUT">
+                      <position x="1120" y="664"/>
+                      <position x="1088" y="664"/>
+                      <position x="1088" y="736"/>
+                      <position x="376" y="736"/>
+                      <position x="376" y="632"/>
+                      <position x="360" y="632"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q1">
+                  <connectionPointOut>
+                    <relPosition x="48" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="39" typeName="AND" executionOrderId="0" height="64" width="64">
+              <position x="992" y="608"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="37" formalParameter="Q">
+                      <position x="992" y="640"/>
+                      <position x="976" y="640"/>
+                      <position x="976" y="608"/>
+                      <position x="944" y="608"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="56"/>
+                    <connection refLocalId="34" formalParameter="OUT">
+                      <position x="992" y="664"/>
+                      <position x="944" y="664"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="64" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+          </FBD>
+        </body>
+      </pou>
+      <pou name="csv_reload" pouType="functionBlock">
+        <interface>
+          <externalVars>
+            <variable name="pyext_csv_update">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </externalVars>
+          <outputVars>
+            <variable name="ACK">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="RESULT">
+              <type>
+                <string/>
+              </type>
+            </variable>
+          </outputVars>
+          <localVars>
+            <variable name="py_eval">
+              <type>
+                <derived name="python_eval"/>
+              </type>
+            </variable>
+          </localVars>
+          <inputVars>
+            <variable name="TRIG">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </inputVars>
+          <localVars>
+            <variable name="R_TRIG0">
+              <type>
+                <derived name="R_TRIG"/>
+              </type>
+            </variable>
+            <variable name="F_TRIG0">
+              <type>
+                <derived name="F_TRIG"/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <block localId="1" width="104" height="80" typeName="python_eval" instanceName="py_eval" executionOrderId="0">
+              <position x="232" y="328"/>
+              <inputVariables>
+                <variable formalParameter="TRIG">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="3">
+                      <position x="232" y="360"/>
+                      <position x="200" y="360"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="CODE">
+                  <connectionPointIn>
+                    <relPosition x="0" y="64"/>
+                    <connection refLocalId="8">
+                      <position x="232" y="392"/>
+                      <position x="200" y="392"/>
+                    </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>
+            <inVariable localId="3" height="24" width="152" executionOrderId="0" negated="false">
+              <position x="48" y="352"/>
+              <connectionPointOut>
+                <relPosition x="152" y="8"/>
+              </connectionPointOut>
+              <expression>TRIG</expression>
+            </inVariable>
+            <outVariable localId="5" height="24" width="40" executionOrderId="0" negated="false">
+              <position x="384" y="344"/>
+              <connectionPointIn>
+                <relPosition x="0" y="16"/>
+                <connection refLocalId="1" formalParameter="ACK">
+                  <position x="384" y="360"/>
+                  <position x="336" y="360"/>
+                </connection>
+              </connectionPointIn>
+              <expression>ACK</expression>
+            </outVariable>
+            <outVariable localId="6" height="24" width="64" executionOrderId="0" negated="false">
+              <position x="384" y="376"/>
+              <connectionPointIn>
+                <relPosition x="0" y="16"/>
+                <connection refLocalId="1" formalParameter="RESULT">
+                  <position x="384" y="392"/>
+                  <position x="336" y="392"/>
+                </connection>
+              </connectionPointIn>
+              <expression>RESULT</expression>
+            </outVariable>
+            <inVariable localId="8" executionOrderId="0" height="24" width="176" negated="false">
+              <position x="24" y="384"/>
+              <connectionPointOut>
+                <relPosition x="176" y="16"/>
+              </connectionPointOut>
+              <expression>'pyext_csv_reload()'</expression>
+            </inVariable>
+            <outVariable localId="2" executionOrderId="0" height="24" width="146" negated="false">
+              <position x="864" y="320"/>
+              <connectionPointIn>
+                <relPosition x="0" y="8"/>
+                <connection refLocalId="12" formalParameter="OUT">
+                  <position x="864" y="328"/>
+                  <position x="816" y="328"/>
+                </connection>
+              </connectionPointIn>
+              <expression>pyext_csv_update</expression>
+            </outVariable>
+            <block localId="9" typeName="R_TRIG" instanceName="R_TRIG0" executionOrderId="0" height="48" width="64">
+              <position x="472" y="224"/>
+              <inputVariables>
+                <variable formalParameter="CLK">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="1" formalParameter="ACK">
+                      <position x="472" y="256"/>
+                      <position x="368" y="256"/>
+                      <position x="368" y="360"/>
+                      <position x="336" y="360"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q">
+                  <connectionPointOut>
+                    <relPosition x="64" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="10" typeName="F_TRIG" instanceName="F_TRIG0" executionOrderId="0" height="48" width="64">
+              <position x="472" y="296"/>
+              <inputVariables>
+                <variable formalParameter="CLK">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="1" formalParameter="ACK">
+                      <position x="472" y="328"/>
+                      <position x="368" y="328"/>
+                      <position x="368" y="360"/>
+                      <position x="336" y="360"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q">
+                  <connectionPointOut>
+                    <relPosition x="64" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="11" typeName="OR" executionOrderId="0" height="64" width="64">
+              <position x="584" y="272"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="9" formalParameter="Q">
+                      <position x="584" y="304"/>
+                      <position x="560" y="304"/>
+                      <position x="560" y="256"/>
+                      <position x="536" y="256"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="56"/>
+                    <connection refLocalId="10" formalParameter="Q">
+                      <position x="584" y="328"/>
+                      <position x="536" y="328"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="64" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="12" typeName="MOVE" executionOrderId="0" height="64" width="56">
+              <position x="760" y="272"/>
+              <inputVariables>
+                <variable formalParameter="EN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="11" formalParameter="OUT">
+                      <position x="760" y="304"/>
+                      <position x="648" y="304"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="56"/>
+                    <connection refLocalId="13" formalParameter="OUT">
+                      <position x="760" y="328"/>
+                      <position x="724" y="328"/>
+                      <position x="724" y="256"/>
+                      <position x="712" y="256"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="ENO">
+                  <connectionPointOut>
+                    <relPosition x="56" y="32"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="56" y="56"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="13" typeName="NOT" executionOrderId="0" height="48" width="56">
+              <position x="656" y="224"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="9" formalParameter="Q">
+                      <position x="656" y="256"/>
+                      <position x="536" y="256"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="56" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <comment localId="14" height="72" width="664">
+              <position x="368" y="136"/>
+              <content>
+                <xhtml:p><![CDATA[pyext_csv_update initial value is True so that all CSV blocks get at least updated once at start. 
+When calling csv_reload, return from python pyext_csv_reload makes a pulse on pyext_csv_update]]></xhtml:p>
+              </content>
+            </comment>
+          </FBD>
+        </body>
+      </pou>
+      <pou name="csv_read_by_int" pouType="functionBlock">
+        <interface>
+          <externalVars>
+            <variable name="pyext_csv_update">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </externalVars>
+          <outputVars>
+            <variable name="ACK">
+              <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>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="COLUMN">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </inputVars>
+          <localVars>
+            <variable name="OLDCODE">
+              <type>
+                <string/>
+              </type>
+            </variable>
+            <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="SR0">
+              <type>
+                <derived name="SR"/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <block localId="7" typeName="CONCAT" executionOrderId="0" height="192" width="64">
+              <position x="520" y="112"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="8">
+                      <position x="520" y="144"/>
+                      <position x="480" y="144"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="56"/>
+                    <connection refLocalId="9">
+                      <position x="520" y="168"/>
+                      <position x="312" y="168"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN3">
+                  <connectionPointIn>
+                    <relPosition x="0" y="80"/>
+                    <connection refLocalId="10">
+                      <position x="520" y="192"/>
+                      <position x="480" y="192"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN4">
+                  <connectionPointIn>
+                    <relPosition x="0" y="104"/>
+                    <connection refLocalId="31" formalParameter="OUT">
+                      <position x="520" y="216"/>
+                      <position x="320" y="216"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN5">
+                  <connectionPointIn>
+                    <relPosition x="0" y="128"/>
+                    <connection refLocalId="12">
+                      <position x="520" y="240"/>
+                      <position x="480" y="240"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN6">
+                  <connectionPointIn>
+                    <relPosition x="0" y="152"/>
+                    <connection refLocalId="2" formalParameter="OUT">
+                      <position x="520" y="264"/>
+                      <position x="320" y="264"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN7">
+                  <connectionPointIn>
+                    <relPosition x="0" y="176"/>
+                    <connection refLocalId="14">
+                      <position x="520" y="288"/>
+                      <position x="480" y="288"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="64" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="8" executionOrderId="0" height="24" width="160" negated="false">
+              <position x="320" y="128"/>
+              <connectionPointOut>
+                <relPosition x="160" y="16"/>
+              </connectionPointOut>
+              <expression>'CSVRdInt("'</expression>
+            </inVariable>
+            <inVariable localId="9" executionOrderId="0" height="32" width="112" negated="false">
+              <position x="200" 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="368" y="184"/>
+              <connectionPointOut>
+                <relPosition x="112" y="8"/>
+              </connectionPointOut>
+              <expression>'",'</expression>
+            </inVariable>
+            <inVariable localId="11" executionOrderId="0" height="32" width="112" negated="false">
+              <position x="40" 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="368" y="224"/>
+              <connectionPointOut>
+                <relPosition x="112" y="16"/>
+              </connectionPointOut>
+              <expression>','</expression>
+            </inVariable>
+            <inVariable localId="13" executionOrderId="0" height="32" width="112" negated="false">
+              <position x="40" 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="368" y="272"/>
+              <connectionPointOut>
+                <relPosition x="112" y="16"/>
+              </connectionPointOut>
+              <expression>')'</expression>
+            </inVariable>
+            <continuation name="Code" localId="4" height="24" width="128">
+              <position x="504" y="496"/>
+              <connectionPointOut>
+                <relPosition x="128" y="16"/>
+              </connectionPointOut>
+            </continuation>
+            <block localId="16" typeName="NE" executionOrderId="0" height="64" width="64">
+              <position x="208" y="456"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="22">
+                      <position x="208" y="488"/>
+                      <position x="188" y="488"/>
+                      <position x="188" y="480"/>
+                      <position x="168" y="480"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="56"/>
+                    <connection refLocalId="21">
+                      <position x="208" y="512"/>
+                      <position x="168" y="512"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="64" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="17" executionOrderId="0" height="32" width="66" negated="false">
+              <position x="784" y="440"/>
+              <connectionPointIn>
+                <relPosition x="0" y="16"/>
+                <connection refLocalId="18" formalParameter="OUT">
+                  <position x="784" y="456"/>
+                  <position x="744" y="456"/>
+                </connection>
+              </connectionPointIn>
+              <expression>OLDCODE</expression>
+            </outVariable>
+            <block localId="18" typeName="SEL" executionOrderId="0" height="96" width="64">
+              <position x="680" y="424"/>
+              <inputVariables>
+                <variable formalParameter="G">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="25">
+                      <position x="680" y="456"/>
+                      <position x="652" y="456"/>
+                      <position x="652" y="448"/>
+                      <position x="624" y="448"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN0">
+                  <connectionPointIn>
+                    <relPosition x="0" y="56"/>
+                    <connection refLocalId="20">
+                      <position x="680" y="480"/>
+                      <position x="632" y="480"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="80"/>
+                    <connection refLocalId="4">
+                      <position x="680" y="504"/>
+                      <position x="656" y="504"/>
+                      <position x="656" y="512"/>
+                      <position x="632" y="512"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="64" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="20" executionOrderId="0" height="32" width="72" negated="false">
+              <position x="560" y="464"/>
+              <connectionPointOut>
+                <relPosition x="72" y="16"/>
+              </connectionPointOut>
+              <expression>OLDCODE</expression>
+            </inVariable>
+            <inVariable localId="21" executionOrderId="0" height="32" width="72" negated="false">
+              <position x="96" y="496"/>
+              <connectionPointOut>
+                <relPosition x="72" y="16"/>
+              </connectionPointOut>
+              <expression>OLDCODE</expression>
+            </inVariable>
+            <continuation name="Code" localId="22" height="24" width="128">
+              <position x="40" y="472"/>
+              <connectionPointOut>
+                <relPosition x="128" y="8"/>
+              </connectionPointOut>
+            </continuation>
+            <connector name="CodeChange" localId="23" height="24" width="120">
+              <position x="328" y="480"/>
+              <connectionPointIn>
+                <relPosition x="0" y="16"/>
+                <connection refLocalId="16" formalParameter="OUT">
+                  <position x="328" y="496"/>
+                  <position x="300" y="496"/>
+                  <position x="300" y="488"/>
+                  <position x="272" y="488"/>
+                </connection>
+              </connectionPointIn>
+            </connector>
+            <continuation name="CodeChange" localId="25" height="24" width="120">
+              <position x="504" y="440"/>
+              <connectionPointOut>
+                <relPosition x="120" y="8"/>
+              </connectionPointOut>
+            </continuation>
+            <comment localId="27" height="48" width="312">
+              <position x="40" y="376"/>
+              <content>
+                <xhtml:p><![CDATA[Detect changes in generated code line]]></xhtml:p>
+              </content>
+            </comment>
+            <comment localId="28" height="48" width="520">
+              <position x="48" y="560"/>
+              <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>
+                <xhtml:p><![CDATA[Generate python code line]]></xhtml:p>
+              </content>
+            </comment>
+            <connector name="Code" localId="30" height="24" width="128">
+              <position x="632" y="128"/>
+              <connectionPointIn>
+                <relPosition x="0" y="16"/>
+                <connection refLocalId="7" formalParameter="OUT">
+                  <position x="632" y="144"/>
+                  <position x="584" y="144"/>
+                </connection>
+              </connectionPointIn>
+            </connector>
+            <block localId="31" typeName="INT_TO_STRING" executionOrderId="0" height="48" width="120">
+              <position x="200" y="184"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="11">
+                      <position x="200" y="216"/>
+                      <position x="152" y="216"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="120" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="2" typeName="INT_TO_STRING" executionOrderId="0" height="48" width="120">
+              <position x="200" y="232"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="13">
+                      <position x="200" y="264"/>
+                      <position x="152" y="264"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="120" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="40" width="104" height="80" typeName="python_eval" instanceName="py_eval0" executionOrderId="0">
+              <position x="552" y="640"/>
+              <inputVariables>
+                <variable formalParameter="TRIG">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="15" formalParameter="OUT">
+                      <position x="552" y="672"/>
+                      <position x="360" y="672"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="CODE">
+                  <connectionPointIn>
+                    <relPosition x="0" y="64"/>
+                    <connection refLocalId="41">
+                      <position x="552" y="704"/>
+                      <position x="528" y="704"/>
+                    </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="400" y="688"/>
+              <connectionPointOut>
+                <relPosition x="128" y="16"/>
+              </connectionPointOut>
+            </continuation>
+            <inVariable localId="42" height="24" width="152" executionOrderId="0" negated="false">
+              <position x="32" y="656"/>
+              <connectionPointOut>
+                <relPosition x="152" y="16"/>
+              </connectionPointOut>
+              <expression>pyext_csv_update</expression>
+            </inVariable>
+            <outVariable localId="43" height="24" width="40" executionOrderId="0" negated="false">
+              <position x="1216" y="672"/>
+              <connectionPointIn>
+                <relPosition x="0" y="16"/>
+                <connection refLocalId="38" formalParameter="Q1">
+                  <position x="1216" y="688"/>
+                  <position x="1192" y="688"/>
+                  <position x="1192" y="680"/>
+                  <position x="1168" y="680"/>
+                </connection>
+              </connectionPointIn>
+              <expression>ACK</expression>
+            </outVariable>
+            <outVariable localId="44" height="24" width="64" executionOrderId="0" negated="false">
+              <position x="688" y="744"/>
+              <connectionPointIn>
+                <relPosition x="0" y="8"/>
+                <connection refLocalId="40" formalParameter="RESULT">
+                  <position x="688" y="752"/>
+                  <position x="672" y="752"/>
+                  <position x="672" y="704"/>
+                  <position x="656" y="704"/>
+                </connection>
+              </connectionPointIn>
+              <expression>RESULT</expression>
+            </outVariable>
+            <block localId="15" typeName="OR" executionOrderId="0" height="64" width="64">
+              <position x="296" y="640"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="46" formalParameter="Q">
+                      <position x="296" y="672"/>
+                      <position x="272" y="672"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="56"/>
+                    <connection refLocalId="45">
+                      <position x="296" y="696"/>
+                      <position x="240" y="696"/>
+                      <position x="240" y="704"/>
+                      <position x="184" y="704"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="64" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <continuation name="CodeChange" localId="45" height="24" width="120">
+              <position x="64" y="688"/>
+              <connectionPointOut>
+                <relPosition x="120" y="16"/>
+              </connectionPointOut>
+            </continuation>
+            <block localId="46" typeName="R_TRIG" instanceName="R_TRIG1" executionOrderId="0" height="48" width="64">
+              <position x="208" y="640"/>
+              <inputVariables>
+                <variable formalParameter="CLK">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="42">
+                      <position x="208" y="672"/>
+                      <position x="184" y="672"/>
+                    </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="672"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="40" formalParameter="RESULT">
+                      <position x="736" y="704"/>
+                      <position x="656" y="704"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="L">
+                  <connectionPointIn>
+                    <relPosition x="0" y="56"/>
+                    <connection refLocalId="35">
+                      <position x="736" y="728"/>
+                      <position x="724" y="728"/>
+                      <position x="724" y="720"/>
+                      <position x="712" y="720"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="56" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="34" typeName="NE" executionOrderId="0" height="64" width="64">
+              <position x="880" y="672"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="33" formalParameter="OUT">
+                      <position x="880" y="704"/>
+                      <position x="792" y="704"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="56"/>
+                    <connection refLocalId="36">
+                      <position x="880" y="728"/>
+                      <position x="868" y="728"/>
+                      <position x="868" y="720"/>
+                      <position x="856" y="720"/>
+                    </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="712"/>
+              <connectionPointOut>
+                <relPosition x="24" y="8"/>
+              </connectionPointOut>
+              <expression>1</expression>
+            </inVariable>
+            <inVariable localId="36" executionOrderId="0" height="24" width="40" negated="false">
+              <position x="816" y="712"/>
+              <connectionPointOut>
+                <relPosition x="40" y="8"/>
+              </connectionPointOut>
+              <expression>'#'</expression>
+            </inVariable>
+            <block localId="37" typeName="R_TRIG" instanceName="R_TRIG2" executionOrderId="0" height="48" width="64">
+              <position x="880" y="616"/>
+              <inputVariables>
+                <variable formalParameter="CLK">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="40" formalParameter="ACK">
+                      <position x="880" y="648"/>
+                      <position x="688" y="648"/>
+                      <position x="688" y="672"/>
+                      <position x="656" y="672"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q">
+                  <connectionPointOut>
+                    <relPosition x="64" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="38" typeName="SR" instanceName="SR0" executionOrderId="0" height="64" width="48">
+              <position x="1120" y="648"/>
+              <inputVariables>
+                <variable formalParameter="S1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="39" formalParameter="OUT">
+                      <position x="1120" y="680"/>
+                      <position x="1056" y="680"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="R" edge="rising">
+                  <connectionPointIn>
+                    <relPosition x="0" y="56"/>
+                    <connection refLocalId="15" formalParameter="OUT">
+                      <position x="1120" y="704"/>
+                      <position x="1088" y="704"/>
+                      <position x="1088" y="776"/>
+                      <position x="376" y="776"/>
+                      <position x="376" y="672"/>
+                      <position x="360" y="672"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q1">
+                  <connectionPointOut>
+                    <relPosition x="48" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="39" typeName="AND" executionOrderId="0" height="64" width="64">
+              <position x="992" y="648"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="32"/>
+                    <connection refLocalId="37" formalParameter="Q">
+                      <position x="992" y="680"/>
+                      <position x="976" y="680"/>
+                      <position x="976" y="648"/>
+                      <position x="944" y="648"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="56"/>
+                    <connection refLocalId="34" formalParameter="OUT">
+                      <position x="992" y="704"/>
+                      <position x="944" y="704"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="64" y="32"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+          </FBD>
+        </body>
+      </pou>
       <pou name="python_eval" pouType="functionBlock">
         <interface>
           <inputVars>
@@ -445,6 +2085,19 @@
     </pous>
   </types>
   <instances>
-    <configurations/>
+    <configurations>
+      <configuration name="configuration0">
+        <globalVars>
+          <variable name="pyext_csv_update">
+            <type>
+              <BOOL/>
+            </type>
+            <initialValue>
+              <simpleValue value="TRUE"/>
+            </initialValue>
+          </variable>
+        </globalVars>
+      </configuration>
+    </configurations>
   </instances>
 </project>
--- a/py_ext/py_ext.py	Fri Dec 16 13:41:03 2022 +0100
+++ b/py_ext/py_ext.py	Fri Dec 16 13:43:38 2022 +0100
@@ -30,6 +30,98 @@
 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, 'rb')
+        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:
+            return "#CSV_ERROR"
+        finally:
+            csvfile.close()
+        csv_int_files[fname] = data
+    
+    try:
+        row = data[rowidx]
+    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, 'rb')
+        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 pyext_csv_reload():
+    global csv_int_files, csv_str_files
+    csv_int_files.clear()
+    csv_str_files.clear()
+
+"""
 
 class PythonLibrary(POULibrary):
     def GetLibraryPath(self):
@@ -57,7 +149,13 @@
         pythonfile.write(plc_python_code)
         pythonfile.close()
 
-        return (["py_ext"], [(Gen_Pythonfile_path, IECCFLAGS)], True), ""
+        runtimefile_path = os.path.join(buildpath, "runtime_00_pyext.py")
+        runtimefile = open(runtimefile_path, 'w')
+        runtimefile.write(pyext_python_lib_code)
+        runtimefile.close()
+        return ((["py_ext"], [(Gen_Pythonfile_path, IECCFLAGS)], True), "",
+                ("runtime_00_pyext.py", open(runtimefile_path, "rb")))
+
 
 
 class PythonFile(PythonFileCTNMixin):