# HG changeset patch # User Edouard Tisserant # Date 1671194618 -3600 # Node ID 3c60c78dfa5d4af48811a2cf22f230360b7c29a1 # Parent 39ae17a1cabe0e331e782457b5fbcb5463bc81f1 py_ext: add CSV file reading POUs in python extension library diff -r 39ae17a1cabe -r 3c60c78dfa5d py_ext/pous.xml --- 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> diff -r 39ae17a1cabe -r 3c60c78dfa5d py_ext/py_ext.py --- 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):