--- a/Beremiz_service.py Mon Aug 07 18:17:12 2023 +0200
+++ b/Beremiz_service.py Thu Sep 28 17:56:03 2023 +0200
@@ -558,8 +558,9 @@
# Beremiz IDE detects LOCAL:// runtime is ready by looking
# for self.workdir in the daemon's stdout.
- sys.stdout.write(_("Current working directory :") + WorkingDir + "\n")
- sys.stdout.flush()
+ if sys.stdout:
+ sys.stdout.write(_("Current working directory :") + WorkingDir + "\n")
+ sys.stdout.flush()
runtime.GetPLCObjectSingleton().AutoLoad(autostart)
--- a/exemples/python/plc.xml Mon Aug 07 18:17:12 2023 +0200
+++ b/exemples/python/plc.xml Thu Sep 28 17:56:03 2023 +0200
@@ -1,1678 +1,1678 @@
-<?xml version='1.0' encoding='utf-8'?>
-<project xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
- <fileHeader companyName="" productName="Beremiz" productVersion="0.0" creationDateTime="2008-12-14T16:21:19" contentDescription="This example shows many features in Beremiz: 1. How to implement python extensions. 2. How to implement basic C extension. 3. How to use C code in IEC POUs. 4. How to call C functions from python code. 5. How to avoid race conditions between IEC, C and python code. 6. How to convert betweet different IEC types. "/>
- <contentHeader name="Beremiz Python Support Tests" modificationDateTime="2022-07-03T16:04:31">
- <coordinateInfo>
- <pageSize x="1024" y="1024"/>
- <fbd>
- <scaling x="5" y="5"/>
- </fbd>
- <ld>
- <scaling x="5" y="5"/>
- </ld>
- <sfc>
- <scaling x="5" y="5"/>
- </sfc>
- </coordinateInfo>
- </contentHeader>
- <types>
- <dataTypes>
- <dataType name="CPLX_TYPE">
- <baseType>
- <struct>
- <variable name="FIRSTBYTE">
- <type>
- <SINT/>
- </type>
- </variable>
- <variable name="SECONDBYTE">
- <type>
- <SINT/>
- </type>
- </variable>
- </struct>
- </baseType>
- </dataType>
- <dataType name="StateMachine">
- <baseType>
- <enum>
- <values>
- <value name="STANDBY"/>
- <value name="START"/>
- <value name="STOP"/>
- </values>
- </enum>
- </baseType>
- </dataType>
- <dataType name="datatype0">
- <baseType>
- <BOOL/>
- </baseType>
- </dataType>
- <dataType name="blups">
- <baseType>
- <array>
- <dimension lower="0" upper="31"/>
- <baseType>
- <derived name="CPLX_TYPE"/>
- </baseType>
- </array>
- </baseType>
- </dataType>
- </dataTypes>
- <pous>
- <pou name="main_pytest" pouType="program">
- <interface>
- <localVars>
- <variable name="mux1_sel">
- <type>
- <INT/>
- </type>
- <initialValue>
- <simpleValue value="3"/>
- </initialValue>
- <documentation>
- <xhtml:p><![CDATA[blah]]></xhtml:p>
- </documentation>
- </variable>
- <variable name="mux2_sel">
- <type>
- <INT/>
- </type>
- <initialValue>
- <simpleValue value="3"/>
- </initialValue>
- </variable>
- <variable name="pytest_var1">
- <type>
- <string/>
- </type>
- </variable>
- <variable name="fefvsd">
- <type>
- <derived name="datatype0"/>
- </type>
- </variable>
- <variable name="pytest_var2">
- <type>
- <BOOL/>
- </type>
- </variable>
- <variable name="py1">
- <type>
- <derived name="python_eval"/>
- </type>
- </variable>
- <variable name="Block1">
- <type>
- <derived name="python_eval"/>
- </type>
- </variable>
- <variable name="Block2">
- <type>
- <derived name="python_eval"/>
- </type>
- </variable>
- <variable name="Block3">
- <type>
- <derived name="python_eval"/>
- </type>
- </variable>
- <variable name="pytest_var3">
- <type>
- <BOOL/>
- </type>
- </variable>
- <variable name="FromC">
- <type>
- <SINT/>
- </type>
- </variable>
- <variable name="C_Pragma0">
- <type>
- <derived name="C_Pragma"/>
- </type>
- </variable>
- </localVars>
- <externalVars>
- <variable name="TestInput">
- <type>
- <SINT/>
- </type>
- </variable>
- <variable name="TestOutput">
- <type>
- <SINT/>
- </type>
- </variable>
- </externalVars>
- <localVars>
- <variable name="FromInput">
- <type>
- <SINT/>
- </type>
- </variable>
- <variable name="Test_BCD">
- <type>
- <WORD/>
- </type>
- <initialValue>
- <simpleValue value="151"/>
- </initialValue>
- </variable>
- <variable name="Test_BCD_WRONG">
- <type>
- <WORD/>
- </type>
- <initialValue>
- <simpleValue value="154"/>
- </initialValue>
- </variable>
- <variable name="Test_BCD_CONVERTED">
- <type>
- <BOOL/>
- </type>
- </variable>
- <variable name="Test_BCD_RESULT">
- <type>
- <UINT/>
- </type>
- </variable>
- <variable name="Test_BCD_WRONG_RESULT">
- <type>
- <UINT/>
- </type>
- </variable>
- <variable name="Test_DT">
- <type>
- <DT/>
- </type>
- <initialValue>
- <simpleValue value="DT#2013-02-23-22:35:46"/>
- </initialValue>
- </variable>
- <variable name="Test_TOD">
- <type>
- <TOD/>
- </type>
- </variable>
- <variable name="Test_TOD_STRING">
- <type>
- <string/>
- </type>
- </variable>
- <variable name="Test_Date">
- <type>
- <DATE/>
- </type>
- </variable>
- <variable name="Test_String">
- <type>
- <string/>
- </type>
- <initialValue>
- <simpleValue value="test"/>
- </initialValue>
- </variable>
- <variable name="Test_Bool">
- <type>
- <BOOL/>
- </type>
- </variable>
- </localVars>
- <externalVars>
- <variable name="Global_RS">
- <type>
- <derived name="RS"/>
- </type>
- </variable>
- <variable name="TUTU">
- <type>
- <INT/>
- </type>
- </variable>
- <variable name="TOTO">
- <type>
- <INT/>
- </type>
- </variable>
- <variable name="Test_Python_Var">
- <type>
- <INT/>
- </type>
- </variable>
- <variable name="Second_Python_Var">
- <type>
- <INT/>
- </type>
- </variable>
- <variable name="Grumpf">
- <type>
- <string/>
- </type>
- </variable>
- </externalVars>
- <localVars>
- <variable name="RTC0">
- <type>
- <derived name="RTC"/>
- </type>
- </variable>
- </localVars>
- <externalVars>
- <variable name="SomeVarName">
- <type>
- <DINT/>
- </type>
- </variable>
- </externalVars>
- </interface>
- <body>
- <FBD>
- <inVariable localId="4" height="30" width="315" executionOrderId="0" negated="false">
- <position x="200" y="390"/>
- <connectionPointOut>
- <relPosition x="315" y="15"/>
- </connectionPointOut>
- <expression>'sys.stdout.write("Hello world\n")'</expression>
- </inVariable>
- <block localId="5" width="125" height="80" typeName="python_eval" instanceName="py1" executionOrderId="0">
- <position x="686" y="400"/>
- <inputVariables>
- <variable formalParameter="TRIG">
- <connectionPointIn>
- <relPosition x="0" y="35"/>
- <connection refLocalId="7" formalParameter="OUT">
- <position x="686" y="435"/>
- <position x="285" y="435"/>
- <position x="285" y="480"/>
- <position x="250" y="480"/>
- </connection>
- </connectionPointIn>
- </variable>
- <variable formalParameter="CODE">
- <connectionPointIn>
- <relPosition x="0" y="65"/>
- <connection refLocalId="80" formalParameter="OUT">
- <position x="686" y="465"/>
- <position x="653" y="465"/>
- <position x="653" y="485"/>
- <position x="630" y="485"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="ACK">
- <connectionPointOut>
- <relPosition x="125" y="35"/>
- </connectionPointOut>
- </variable>
- <variable formalParameter="RESULT">
- <connectionPointOut>
- <relPosition x="125" y="65"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <block localId="7" width="70" height="45" typeName="NOT" executionOrderId="0">
- <position x="180" y="450"/>
- <inputVariables>
- <variable formalParameter="IN">
- <connectionPointIn>
- <relPosition x="0" y="30"/>
- <connection refLocalId="3">
- <position x="180" y="480"/>
- <position x="155" y="480"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="OUT">
- <connectionPointOut>
- <relPosition x="70" y="30"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <inOutVariable localId="3" height="30" width="120" executionOrderId="0" negatedOut="false" negatedIn="false">
- <position x="35" y="465"/>
- <connectionPointIn>
- <relPosition x="0" y="15"/>
- <connection refLocalId="7" formalParameter="OUT">
- <position x="35" y="480"/>
- <position x="25" y="480"/>
- <position x="25" y="440"/>
- <position x="270" y="440"/>
- <position x="270" y="480"/>
- <position x="250" y="480"/>
- </connection>
- </connectionPointIn>
- <connectionPointOut>
- <relPosition x="120" y="15"/>
- </connectionPointOut>
- <expression>pytest_var2</expression>
- </inOutVariable>
- <block localId="8" width="125" height="80" typeName="python_eval" instanceName="Block1" executionOrderId="0">
- <position x="686" y="545"/>
- <inputVariables>
- <variable formalParameter="TRIG">
- <connectionPointIn>
- <relPosition x="0" y="35"/>
- <connection refLocalId="7" formalParameter="OUT">
- <position x="686" y="580"/>
- <position x="285" y="580"/>
- <position x="285" y="480"/>
- <position x="250" y="480"/>
- </connection>
- </connectionPointIn>
- </variable>
- <variable formalParameter="CODE">
- <connectionPointIn>
- <relPosition x="0" y="65"/>
- <connection refLocalId="9">
- <position x="686" y="610"/>
- <position x="665" y="610"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="ACK">
- <connectionPointOut>
- <relPosition x="125" y="35"/>
- </connectionPointOut>
- </variable>
- <variable formalParameter="RESULT">
- <connectionPointOut>
- <relPosition x="125" y="65"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <inVariable localId="9" height="30" width="370" executionOrderId="0" negated="false">
- <position x="295" y="595"/>
- <connectionPointOut>
- <relPosition x="370" y="15"/>
- </connectionPointOut>
- <expression>'sys.stdout.write("FBID :"+str(FBID)+"\n")'</expression>
- </inVariable>
- <inVariable localId="11" height="30" width="290" executionOrderId="0" negated="false">
- <position x="295" y="735"/>
- <connectionPointOut>
- <relPosition x="290" y="15"/>
- </connectionPointOut>
- <expression>'PLCBinary.Simple_C_Call(5678)'</expression>
- </inVariable>
- <block localId="12" width="125" height="80" typeName="python_eval" instanceName="Block2" executionOrderId="0">
- <position x="686" y="687"/>
- <inputVariables>
- <variable formalParameter="TRIG">
- <connectionPointIn>
- <relPosition x="0" y="33"/>
- <connection refLocalId="7" formalParameter="OUT">
- <position x="686" y="720"/>
- <position x="285" y="720"/>
- <position x="285" y="480"/>
- <position x="250" y="480"/>
- </connection>
- </connectionPointIn>
- </variable>
- <variable formalParameter="CODE">
- <connectionPointIn>
- <relPosition x="0" y="63"/>
- <connection refLocalId="11">
- <position x="686" y="750"/>
- <position x="585" y="750"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="ACK">
- <connectionPointOut>
- <relPosition x="125" y="33"/>
- </connectionPointOut>
- </variable>
- <variable formalParameter="RESULT">
- <connectionPointOut>
- <relPosition x="125" y="63"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <inVariable localId="14" height="30" width="290" executionOrderId="0" negated="false">
- <position x="290" y="885"/>
- <connectionPointOut>
- <relPosition x="290" y="15"/>
- </connectionPointOut>
- <expression>'MyPythonFunc(42)'</expression>
- </inVariable>
- <block localId="15" width="125" height="80" typeName="python_eval" instanceName="Block3" executionOrderId="0">
- <position x="686" y="837"/>
- <inputVariables>
- <variable formalParameter="TRIG">
- <connectionPointIn>
- <relPosition x="0" y="33"/>
- <connection refLocalId="7" formalParameter="OUT">
- <position x="686" y="870"/>
- <position x="285" y="870"/>
- <position x="285" y="480"/>
- <position x="250" y="480"/>
- </connection>
- </connectionPointIn>
- </variable>
- <variable formalParameter="CODE">
- <connectionPointIn>
- <relPosition x="0" y="63"/>
- <connection refLocalId="14">
- <position x="686" y="900"/>
- <position x="580" y="900"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="ACK">
- <connectionPointOut>
- <relPosition x="125" y="33"/>
- </connectionPointOut>
- </variable>
- <variable formalParameter="RESULT">
- <connectionPointOut>
- <relPosition x="125" y="63"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <comment localId="16" height="90" width="680">
- <position x="35" y="275"/>
- <content>
- <xhtml:p><![CDATA[This part of the example test that, despite of 2T period clock stimulating TRIG pin of pyth_eval blocks, blocks keep executing one after the other, in respect of execution order.]]></xhtml:p>
- </content>
- </comment>
- <block localId="17" width="80" height="120" typeName="MUX" executionOrderId="0">
- <position x="1101" y="790"/>
- <inputVariables>
- <variable formalParameter="K">
- <connectionPointIn>
- <relPosition x="0" y="30"/>
- <connection refLocalId="18">
- <position x="1101" y="820"/>
- <position x="1076" y="820"/>
- <position x="1076" y="810"/>
- <position x="1060" y="810"/>
- </connection>
- </connectionPointIn>
- </variable>
- <variable formalParameter="IN0">
- <connectionPointIn>
- <relPosition x="0" y="50"/>
- <connection refLocalId="5" formalParameter="RESULT">
- <position x="1101" y="840"/>
- <position x="941" y="840"/>
- <position x="941" y="465"/>
- <position x="811" y="465"/>
- </connection>
- </connectionPointIn>
- </variable>
- <variable formalParameter="IN1">
- <connectionPointIn>
- <relPosition x="0" y="70"/>
- <connection refLocalId="8" formalParameter="RESULT">
- <position x="1101" y="860"/>
- <position x="926" y="860"/>
- <position x="926" y="610"/>
- <position x="811" y="610"/>
- </connection>
- </connectionPointIn>
- </variable>
- <variable formalParameter="IN2">
- <connectionPointIn>
- <relPosition x="0" y="90"/>
- <connection refLocalId="12" formalParameter="RESULT">
- <position x="1101" y="880"/>
- <position x="911" y="880"/>
- <position x="911" y="750"/>
- <position x="811" y="750"/>
- </connection>
- </connectionPointIn>
- </variable>
- <variable formalParameter="IN3">
- <connectionPointIn>
- <relPosition x="0" y="110"/>
- <connection refLocalId="15" formalParameter="RESULT">
- <position x="1101" y="900"/>
- <position x="811" y="900"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="OUT">
- <connectionPointOut>
- <relPosition x="80" y="30"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <outVariable localId="19" height="35" width="125" executionOrderId="0" negated="false">
- <position x="1271" y="805"/>
- <connectionPointIn>
- <relPosition x="0" y="15"/>
- <connection refLocalId="17" formalParameter="OUT">
- <position x="1271" y="820"/>
- <position x="1181" y="820"/>
- </connection>
- </connectionPointIn>
- <expression>pytest_var1</expression>
- </outVariable>
- <block localId="21" width="80" height="120" typeName="MUX" executionOrderId="0">
- <position x="1106" y="385"/>
- <inputVariables>
- <variable formalParameter="K">
- <connectionPointIn>
- <relPosition x="0" y="30"/>
- <connection refLocalId="22">
- <position x="1106" y="415"/>
- <position x="1076" y="415"/>
- <position x="1076" y="405"/>
- <position x="1055" y="405"/>
- </connection>
- </connectionPointIn>
- </variable>
- <variable formalParameter="IN0">
- <connectionPointIn>
- <relPosition x="0" y="50"/>
- <connection refLocalId="5" formalParameter="ACK">
- <position x="1106" y="435"/>
- <position x="811" y="435"/>
- </connection>
- </connectionPointIn>
- </variable>
- <variable formalParameter="IN1">
- <connectionPointIn>
- <relPosition x="0" y="70"/>
- <connection refLocalId="8" formalParameter="ACK">
- <position x="1106" y="455"/>
- <position x="841" y="455"/>
- <position x="841" y="580"/>
- <position x="811" y="580"/>
- </connection>
- </connectionPointIn>
- </variable>
- <variable formalParameter="IN2">
- <connectionPointIn>
- <relPosition x="0" y="90"/>
- <connection refLocalId="12" formalParameter="ACK">
- <position x="1106" y="475"/>
- <position x="856" y="475"/>
- <position x="856" y="720"/>
- <position x="811" y="720"/>
- </connection>
- </connectionPointIn>
- </variable>
- <variable formalParameter="IN3">
- <connectionPointIn>
- <relPosition x="0" y="110"/>
- <connection refLocalId="15" formalParameter="ACK">
- <position x="1106" y="495"/>
- <position x="871" y="495"/>
- <position x="871" y="870"/>
- <position x="811" y="870"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="OUT">
- <connectionPointOut>
- <relPosition x="80" y="30"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <inVariable localId="22" height="30" width="74" executionOrderId="0" negated="false">
- <position x="981" y="390"/>
- <connectionPointOut>
- <relPosition x="74" y="15"/>
- </connectionPointOut>
- <expression>mux1_sel</expression>
- </inVariable>
- <outVariable localId="23" height="35" width="125" executionOrderId="0" negated="false">
- <position x="1271" y="400"/>
- <connectionPointIn>
- <relPosition x="0" y="15"/>
- <connection refLocalId="21" formalParameter="OUT">
- <position x="1271" y="415"/>
- <position x="1186" y="415"/>
- </connection>
- </connectionPointIn>
- <expression>pytest_var3</expression>
- </outVariable>
- <outVariable localId="25" height="30" width="60" executionOrderId="0" negated="false">
- <position x="320" y="1075"/>
- <connectionPointIn>
- <relPosition x="0" y="15"/>
- <connection refLocalId="26" formalParameter="OUT">
- <position x="320" y="1090"/>
- <position x="265" y="1090"/>
- </connection>
- </connectionPointIn>
- <expression>FromC</expression>
- </outVariable>
- <inVariable localId="1" height="30" width="30" executionOrderId="0" negated="false">
- <position x="105" y="1075"/>
- <connectionPointOut>
- <relPosition x="30" y="15"/>
- </connectionPointOut>
- <expression>23</expression>
- </inVariable>
- <block localId="26" width="80" height="45" typeName="C_Pragma" instanceName="C_Pragma0" executionOrderId="0">
- <position x="185" y="1060"/>
- <inputVariables>
- <variable formalParameter="IN">
- <connectionPointIn>
- <relPosition x="0" y="30"/>
- <connection refLocalId="1">
- <position x="185" y="1090"/>
- <position x="135" y="1090"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="OUT">
- <connectionPointOut>
- <relPosition x="80" y="30"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <inVariable localId="27" height="30" width="90" executionOrderId="0" negated="false">
- <position x="100" y="1190"/>
- <connectionPointOut>
- <relPosition x="90" y="15"/>
- </connectionPointOut>
- <expression>TestInput</expression>
- </inVariable>
- <outVariable localId="28" height="30" width="105" executionOrderId="0" negated="false">
- <position x="195" y="1125"/>
- <connectionPointIn>
- <relPosition x="0" y="15"/>
- <connection refLocalId="2">
- <position x="195" y="1140"/>
- <position x="140" y="1140"/>
- </connection>
- </connectionPointIn>
- <expression>TestOutput</expression>
- </outVariable>
- <outVariable localId="29" height="30" width="85" executionOrderId="0" negated="false">
- <position x="215" y="1190"/>
- <connectionPointIn>
- <relPosition x="0" y="15"/>
- <connection refLocalId="27">
- <position x="215" y="1205"/>
- <position x="190" y="1205"/>
- </connection>
- </connectionPointIn>
- <expression>FromInput</expression>
- </outVariable>
- <inVariable localId="2" height="30" width="30" executionOrderId="0" negated="false">
- <position x="110" y="1125"/>
- <connectionPointOut>
- <relPosition x="30" y="15"/>
- </connectionPointOut>
- <expression>10</expression>
- </inVariable>
- <comment localId="30" height="105" width="465">
- <position x="50" y="925"/>
- <content>
- <xhtml:p><![CDATA[You will be ready to use beremiz with C and Python when you will understand why "FromInput" is equal to 75.
-Happy hacking! ]]></xhtml:p>
- </content>
- </comment>
- <comment localId="6" height="80" width="345">
- <position x="295" y="630"/>
- <content>
- <xhtml:p><![CDATA[Prints FBID to stdout of PLC runtime. FBID is a unique reference to py_eval instance.]]></xhtml:p>
- </content>
- </comment>
- <comment localId="10" height="85" width="345">
- <position x="295" y="770"/>
- <content>
- <xhtml:p><![CDATA[Simple_C_Call is declared in C_File "1.x:c_code". See python ctypes manual for details on typing.]]></xhtml:p>
- </content>
- </comment>
- <comment localId="32" height="145" width="235">
- <position x="25" y="505"/>
- <content>
- <xhtml:p><![CDATA[Fast clock, at least faster that sleep(1). See what happens when python takes time to answer : PLC continues.]]></xhtml:p>
- </content>
- </comment>
- <outVariable localId="33" height="30" width="133" executionOrderId="0" negated="false">
- <position x="580" y="1564"/>
- <connectionPointIn>
- <relPosition x="0" y="16"/>
- <connection refLocalId="35" formalParameter="OUT">
- <position x="580" y="1580"/>
- <position x="371" y="1580"/>
- </connection>
- </connectionPointIn>
- <expression>Test_BCD_RESULT</expression>
- </outVariable>
- <inVariable localId="34" height="30" width="75" executionOrderId="0" negated="false">
- <position x="60" y="1564"/>
- <connectionPointOut>
- <relPosition x="75" y="16"/>
- </connectionPointOut>
- <expression>Test_BCD</expression>
- </inVariable>
- <block localId="35" width="106" height="60" typeName="BCD_TO_UINT" executionOrderId="0">
- <position x="265" y="1539"/>
- <inputVariables>
- <variable formalParameter="IN">
- <connectionPointIn>
- <relPosition x="0" y="41"/>
- <connection refLocalId="34">
- <position x="265" y="1580"/>
- <position x="135" y="1580"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="OUT">
- <connectionPointOut>
- <relPosition x="106" y="41"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <inVariable localId="36" height="30" width="66" executionOrderId="0" negated="false">
- <position x="60" y="1774"/>
- <connectionPointOut>
- <relPosition x="66" y="16"/>
- </connectionPointOut>
- <expression>Test_DT</expression>
- </inVariable>
- <block localId="37" width="255" height="45" typeName="DATE_AND_TIME_TO_TIME_OF_DAY" executionOrderId="0">
- <position x="265" y="1759"/>
- <inputVariables>
- <variable formalParameter="IN">
- <connectionPointIn>
- <relPosition x="0" y="31"/>
- <connection refLocalId="36">
- <position x="265" y="1790"/>
- <position x="125" y="1790"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="OUT">
- <connectionPointOut>
- <relPosition x="255" y="31"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <block localId="38" width="195" height="45" typeName="DATE_AND_TIME_TO_DATE" executionOrderId="0">
- <position x="265" y="1834"/>
- <inputVariables>
- <variable formalParameter="IN">
- <connectionPointIn>
- <relPosition x="0" y="31"/>
- <connection refLocalId="36">
- <position x="265" y="1865"/>
- <position x="242" y="1865"/>
- <position x="242" y="1790"/>
- <position x="125" y="1790"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="OUT">
- <connectionPointOut>
- <relPosition x="195" y="31"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <outVariable localId="40" height="30" width="82" executionOrderId="0" negated="false">
- <position x="580" y="1849"/>
- <connectionPointIn>
- <relPosition x="0" y="16"/>
- <connection refLocalId="38" formalParameter="OUT">
- <position x="580" y="1865"/>
- <position x="460" y="1865"/>
- </connection>
- </connectionPointIn>
- <expression>Test_Date</expression>
- </outVariable>
- <outVariable localId="42" height="30" width="98" executionOrderId="0" negated="false">
- <position x="465" y="1944"/>
- <connectionPointIn>
- <relPosition x="0" y="16"/>
- <connection refLocalId="46" formalParameter="OUT">
- <position x="465" y="1960"/>
- <position x="395" y="1960"/>
- </connection>
- </connectionPointIn>
- <expression>Test_String</expression>
- </outVariable>
- <outVariable localId="43" height="30" width="82" executionOrderId="0" negated="false">
- <position x="465" y="2014"/>
- <connectionPointIn>
- <relPosition x="0" y="16"/>
- <connection refLocalId="44" formalParameter="OUT">
- <position x="465" y="2030"/>
- <position x="400" y="2030"/>
- </connection>
- </connectionPointIn>
- <expression>Test_Bool</expression>
- </outVariable>
- <block localId="44" width="135" height="45" typeName="STRING_TO_BOOL" executionOrderId="0">
- <position x="265" y="1999"/>
- <inputVariables>
- <variable formalParameter="IN">
- <connectionPointIn>
- <relPosition x="0" y="31"/>
- <connection refLocalId="45">
- <position x="265" y="2030"/>
- <position x="115" y="2030"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="OUT">
- <connectionPointOut>
- <relPosition x="135" y="31"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <inVariable localId="45" height="30" width="58" executionOrderId="0" negated="false">
- <position x="60" y="2014"/>
- <connectionPointOut>
- <relPosition x="58" y="16"/>
- </connectionPointOut>
- <expression>'True'</expression>
- </inVariable>
- <block localId="46" width="130" height="45" typeName="INT_TO_STRING" executionOrderId="0">
- <position x="265" y="1929"/>
- <inputVariables>
- <variable formalParameter="IN">
- <connectionPointIn>
- <relPosition x="0" y="31"/>
- <connection refLocalId="58">
- <position x="265" y="1960"/>
- <position x="205" y="1960"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="OUT">
- <connectionPointOut>
- <relPosition x="130" y="31"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <inVariable localId="50" height="30" width="106" executionOrderId="0" negated="false">
- <position x="75" y="2275"/>
- <connectionPointOut>
- <relPosition x="106" y="15"/>
- </connectionPointOut>
- <expression>Global_RS.Q1</expression>
- </inVariable>
- <block localId="51" width="70" height="85" typeName="AND" executionOrderId="0">
- <position x="240" y="2255"/>
- <inputVariables>
- <variable formalParameter="IN1" negated="true">
- <connectionPointIn>
- <relPosition x="0" y="35"/>
- <connection refLocalId="50">
- <position x="240" y="2290"/>
- <position x="180" y="2290"/>
- </connection>
- </connectionPointIn>
- </variable>
- <variable formalParameter="IN2">
- <connectionPointIn>
- <relPosition x="0" y="70"/>
- <connection refLocalId="52">
- <position x="240" y="2325"/>
- <position x="180" y="2325"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="OUT">
- <connectionPointOut>
- <relPosition x="70" y="35"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <inVariable localId="52" height="30" width="105" executionOrderId="0" negated="false">
- <position x="75" y="2310"/>
- <connectionPointOut>
- <relPosition x="105" y="15"/>
- </connectionPointOut>
- <expression>BOOL#TRUE</expression>
- </inVariable>
- <outVariable localId="13" height="30" width="105" executionOrderId="0" negated="false">
- <position x="385" y="2275"/>
- <connectionPointIn>
- <relPosition x="0" y="15"/>
- <connection refLocalId="51" formalParameter="OUT">
- <position x="385" y="2290"/>
- <position x="310" y="2290"/>
- </connection>
- </connectionPointIn>
- <expression>Global_RS.S</expression>
- </outVariable>
- <outVariable localId="20" height="30" width="106" executionOrderId="0" negated="false">
- <position x="385" y="2390"/>
- <connectionPointIn>
- <relPosition x="0" y="15"/>
- <connection refLocalId="41" formalParameter="OUT">
- <position x="385" y="2405"/>
- <position x="310" y="2405"/>
- </connection>
- </connectionPointIn>
- <expression>Global_RS.R1</expression>
- </outVariable>
- <inVariable localId="24" height="30" width="106" executionOrderId="0" negated="false">
- <position x="75" y="2390"/>
- <connectionPointOut>
- <relPosition x="106" y="15"/>
- </connectionPointOut>
- <expression>Global_RS.Q1</expression>
- </inVariable>
- <block localId="41" width="70" height="85" typeName="OR" executionOrderId="0">
- <position x="240" y="2370"/>
- <inputVariables>
- <variable formalParameter="IN1">
- <connectionPointIn>
- <relPosition x="0" y="35"/>
- <connection refLocalId="24">
- <position x="240" y="2405"/>
- <position x="180" y="2405"/>
- </connection>
- </connectionPointIn>
- </variable>
- <variable formalParameter="IN2">
- <connectionPointIn>
- <relPosition x="0" y="70"/>
- <connection refLocalId="48">
- <position x="240" y="2440"/>
- <position x="180" y="2440"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="OUT">
- <connectionPointOut>
- <relPosition x="70" y="35"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <inVariable localId="48" height="30" width="105" executionOrderId="0" negated="false">
- <position x="75" y="2425"/>
- <connectionPointOut>
- <relPosition x="105" y="15"/>
- </connectionPointOut>
- <expression>BOOL#FALSE</expression>
- </inVariable>
- <outVariable localId="54" height="30" width="135" executionOrderId="0" negated="false">
- <position x="930" y="1774"/>
- <connectionPointIn>
- <relPosition x="0" y="16"/>
- <connection refLocalId="55" formalParameter="OUT">
- <position x="930" y="1790"/>
- <position x="855" y="1790"/>
- </connection>
- </connectionPointIn>
- <expression>Test_TOD_STRING</expression>
- </outVariable>
- <block localId="55" width="125" height="45" typeName="TOD_TO_STRING" executionOrderId="0">
- <position x="730" y="1759"/>
- <inputVariables>
- <variable formalParameter="IN">
- <connectionPointIn>
- <relPosition x="0" y="31"/>
- <connection refLocalId="39">
- <position x="730" y="1790"/>
- <position x="655" y="1790"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="OUT">
- <connectionPointOut>
- <relPosition x="125" y="31"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <inOutVariable localId="39" height="30" width="75" executionOrderId="0" negatedOut="false" negatedIn="false">
- <position x="580" y="1774"/>
- <connectionPointIn>
- <relPosition x="0" y="16"/>
- <connection refLocalId="37" formalParameter="OUT">
- <position x="580" y="1790"/>
- <position x="520" y="1790"/>
- </connection>
- </connectionPointIn>
- <connectionPointOut>
- <relPosition x="75" y="16"/>
- </connectionPointOut>
- <expression>Test_TOD</expression>
- </inOutVariable>
- <inVariable localId="49" height="30" width="30" executionOrderId="0" negated="false">
- <position x="160" y="2510"/>
- <connectionPointOut>
- <relPosition x="30" y="15"/>
- </connectionPointOut>
- <expression>42</expression>
- </inVariable>
- <outVariable localId="57" height="30" width="50" executionOrderId="0" negated="false">
- <position x="240" y="2510"/>
- <connectionPointIn>
- <relPosition x="0" y="15"/>
- <connection refLocalId="49">
- <position x="240" y="2525"/>
- <position x="190" y="2525"/>
- </connection>
- </connectionPointIn>
- <expression>TOTO</expression>
- </outVariable>
- <outVariable localId="56" height="30" width="50" executionOrderId="0" negated="false">
- <position x="240" y="2550"/>
- <connectionPointIn>
- <relPosition x="0" y="15"/>
- <connection refLocalId="49">
- <position x="240" y="2565"/>
- <position x="215" y="2565"/>
- <position x="215" y="2525"/>
- <position x="190" y="2525"/>
- </connection>
- </connectionPointIn>
- <expression>TUTU</expression>
- </outVariable>
- <inVariable localId="58" height="30" width="146" executionOrderId="0" negated="false">
- <position x="60" y="1944"/>
- <connectionPointOut>
- <relPosition x="146" y="16"/>
- </connectionPointOut>
- <expression>Second_Python_Var</expression>
- </inVariable>
- <inVariable localId="59" height="30" width="30" executionOrderId="0" negated="false">
- <position x="100" y="1385"/>
- <connectionPointOut>
- <relPosition x="30" y="15"/>
- </connectionPointOut>
- <expression>1</expression>
- </inVariable>
- <block localId="61" typeName="function0" executionOrderId="0" height="45" width="111">
- <position x="760" y="1170"/>
- <inputVariables>
- <variable formalParameter="LocalVar0">
- <connectionPointIn>
- <relPosition x="0" y="30"/>
- <connection refLocalId="62">
- <position x="760" y="1200"/>
- <position x="723" y="1200"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="OUT">
- <connectionPointOut>
- <relPosition x="111" y="30"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <inVariable localId="62" executionOrderId="0" height="30" width="58" negated="false">
- <position x="665" y="1185"/>
- <connectionPointOut>
- <relPosition x="58" y="15"/>
- </connectionPointOut>
- <expression>fefvsd</expression>
- </inVariable>
- <outVariable localId="63" executionOrderId="0" height="30" width="58" negated="false">
- <position x="905" y="1185"/>
- <connectionPointIn>
- <relPosition x="0" y="15"/>
- <connection refLocalId="61" formalParameter="OUT">
- <position x="905" y="1200"/>
- <position x="871" y="1200"/>
- </connection>
- </connectionPointIn>
- <expression>fefvsd</expression>
- </outVariable>
- <comment localId="53" height="80" width="420">
- <position x="75" y="2160"/>
- <content>
- <xhtml:p><![CDATA[Shows global variables access from resource configuration (res_pytest) and from project's configuration.]]></xhtml:p>
- </content>
- </comment>
- <inVariable localId="18" height="30" width="74" executionOrderId="0" negated="false">
- <position x="986" y="795"/>
- <connectionPointOut>
- <relPosition x="74" y="15"/>
- </connectionPointOut>
- <expression>mux2_sel</expression>
- </inVariable>
- <comment localId="60" height="45" width="930">
- <position x="60" y="1480"/>
- <content>
- <xhtml:p><![CDATA[Here is shown how to convert values between different types (BCD, DT, TOD, STRING and others) using standard functions.]]></xhtml:p>
- </content>
- </comment>
- <comment localId="64" height="55" width="300">
- <position x="665" y="1095"/>
- <content>
- <xhtml:p><![CDATA[Example of usage of user-defined function.]]></xhtml:p>
- </content>
- </comment>
- <comment localId="65" height="45" width="410">
- <position x="55" y="1315"/>
- <content>
- <xhtml:p><![CDATA[Shows access variable defined in python extension. ]]></xhtml:p>
- </content>
- </comment>
- <inVariable localId="66" height="30" width="137" executionOrderId="0" negated="false">
- <position x="60" y="1685"/>
- <connectionPointOut>
- <relPosition x="137" y="15"/>
- </connectionPointOut>
- <expression>Test_BCD_WRONG</expression>
- </inVariable>
- <block localId="67" width="106" height="100" typeName="BCD_TO_UINT" executionOrderId="0">
- <position x="265" y="1620"/>
- <inputVariables>
- <variable formalParameter="EN">
- <connectionPointIn>
- <relPosition x="0" y="40"/>
- </connectionPointIn>
- </variable>
- <variable formalParameter="IN">
- <connectionPointIn>
- <relPosition x="0" y="80"/>
- <connection refLocalId="66">
- <position x="265" y="1700"/>
- <position x="255" y="1700"/>
- <position x="255" y="1700"/>
- <position x="345" y="1700"/>
- <position x="345" y="1700"/>
- <position x="197" y="1700"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="ENO">
- <connectionPointOut>
- <relPosition x="106" y="40"/>
- </connectionPointOut>
- </variable>
- <variable formalParameter="OUT">
- <connectionPointOut>
- <relPosition x="106" y="80"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <outVariable localId="68" height="30" width="196" executionOrderId="0" negated="false">
- <position x="580" y="1685"/>
- <connectionPointIn>
- <relPosition x="0" y="15"/>
- <connection refLocalId="67" formalParameter="OUT">
- <position x="580" y="1700"/>
- <position x="371" y="1700"/>
- </connection>
- </connectionPointIn>
- <expression>Test_BCD_WRONG_RESULT</expression>
- </outVariable>
- <comment localId="69" height="165" width="375">
- <position x="795" y="1590"/>
- <content>
- <xhtml:p><![CDATA[Incorrect BCD number is not converted to UINT.
-
-151 (16#97) is good BCD number , but
-154 (16#9A) is not.
-
-Try this out and look at value of Test_BCD_CONVERTED variable.
-
-
-]]></xhtml:p>
- </content>
- </comment>
- <outVariable localId="70" height="30" width="185" executionOrderId="0" negated="false">
- <position x="580" y="1645"/>
- <connectionPointIn>
- <relPosition x="0" y="15"/>
- <connection refLocalId="67" formalParameter="ENO">
- <position x="580" y="1660"/>
- <position x="370" y="1660"/>
- </connection>
- </connectionPointIn>
- <expression>Test_BCD_CONVERTED</expression>
- </outVariable>
- <comment localId="71" height="215" width="680">
- <position x="35" y="30"/>
- <content>
- <xhtml:p><![CDATA[This example shows many features in Beremiz:
-
- 1. How to implement python extensions.
- 2. How to implement basic C extension.
- 3. How to use C code in IEC POUs.
- 4. How to call C functions from python code.
- 5. How to avoid race conditions between IEC, C and python code.
- 6. How to convert betweet different IEC types.
-]]></xhtml:p>
- </content>
- </comment>
- <outVariable localId="72" executionOrderId="0" height="30" width="60" negated="false">
- <position x="1065" y="1970"/>
- <connectionPointIn>
- <relPosition x="0" y="15"/>
- <connection refLocalId="76" formalParameter="OUT">
- <position x="1065" y="1985"/>
- <position x="1025" y="1985"/>
- <position x="1025" y="1995"/>
- <position x="985" y="1995"/>
- </connection>
- </connectionPointIn>
- <expression>Grumpf</expression>
- </outVariable>
- <inVariable localId="73" executionOrderId="0" height="30" width="85" negated="false">
- <position x="625" y="1940"/>
- <connectionPointOut>
- <relPosition x="85" y="15"/>
- </connectionPointOut>
- <expression>BOOL#TRUE</expression>
- </inVariable>
- <inVariable localId="74" executionOrderId="0" height="30" width="70" negated="false">
- <position x="625" y="1975"/>
- <connectionPointOut>
- <relPosition x="70" y="15"/>
- </connectionPointOut>
- <expression>Test_DT</expression>
- </inVariable>
- <block localId="75" typeName="RTC" instanceName="RTC0" executionOrderId="0" height="90" width="65">
- <position x="760" y="1925"/>
- <inputVariables>
- <variable formalParameter="IN">
- <connectionPointIn>
- <relPosition x="0" y="35"/>
- <connection refLocalId="73">
- <position x="760" y="1960"/>
- <position x="735" y="1960"/>
- <position x="735" y="1955"/>
- <position x="710" y="1955"/>
- </connection>
- </connectionPointIn>
- </variable>
- <variable formalParameter="PDT">
- <connectionPointIn>
- <relPosition x="0" y="70"/>
- <connection refLocalId="74">
- <position x="760" y="1995"/>
- <position x="727" y="1995"/>
- <position x="727" y="1990"/>
- <position x="695" y="1990"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="Q">
- <connectionPointOut>
- <relPosition x="65" y="35"/>
- </connectionPointOut>
- </variable>
- <variable formalParameter="CDT">
- <connectionPointOut>
- <relPosition x="65" y="70"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <block localId="76" typeName="DT_TO_STRING" executionOrderId="0" height="40" width="110">
- <position x="875" y="1965"/>
- <inputVariables>
- <variable formalParameter="IN">
- <connectionPointIn>
- <relPosition x="0" y="30"/>
- <connection refLocalId="75" formalParameter="CDT">
- <position x="875" y="1995"/>
- <position x="825" y="1995"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="OUT">
- <connectionPointOut>
- <relPosition x="110" y="30"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <block localId="77" typeName="ADD" executionOrderId="0" height="60" width="65">
- <position x="170" y="1370"/>
- <inputVariables>
- <variable formalParameter="IN1">
- <connectionPointIn>
- <relPosition x="0" y="30"/>
- <connection refLocalId="59">
- <position x="170" y="1400"/>
- <position x="130" y="1400"/>
- </connection>
- </connectionPointIn>
- </variable>
- <variable formalParameter="IN2">
- <connectionPointIn>
- <relPosition x="0" y="50"/>
- <connection refLocalId="78">
- <position x="170" y="1420"/>
- <position x="160" y="1420"/>
- <position x="160" y="1450"/>
- <position x="390" y="1450"/>
- <position x="390" y="1400"/>
- <position x="380" y="1400"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="OUT">
- <connectionPointOut>
- <relPosition x="65" y="30"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <outVariable localId="47" executionOrderId="0" height="30" width="130" negated="false">
- <position x="625" y="1335"/>
- <connectionPointIn>
- <relPosition x="0" y="15"/>
- <connection refLocalId="79">
- <position x="625" y="1350"/>
- <position x="590" y="1350"/>
- </connection>
- </connectionPointIn>
- <expression>Test_Python_Var</expression>
- </outVariable>
- <inVariable localId="79" executionOrderId="0" height="27" width="30" negated="false">
- <position x="560" y="1340"/>
- <connectionPointOut>
- <relPosition x="30" y="15"/>
- </connectionPointOut>
- <expression>23</expression>
- </inVariable>
- <inOutVariable localId="78" executionOrderId="0" height="30" width="100" negatedOut="false" negatedIn="false">
- <position x="280" y="1385"/>
- <connectionPointIn>
- <relPosition x="0" y="15"/>
- <connection refLocalId="77" formalParameter="OUT">
- <position x="280" y="1400"/>
- <position x="235" y="1400"/>
- </connection>
- </connectionPointIn>
- <connectionPointOut>
- <relPosition x="100" y="15"/>
- </connectionPointOut>
- <expression>SomeVarName</expression>
- </inOutVariable>
- <block localId="80" typeName="MOVE" executionOrderId="0" height="40" width="60">
- <position x="570" y="455"/>
- <inputVariables>
- <variable formalParameter="IN">
- <connectionPointIn>
- <relPosition x="0" y="30"/>
- <connection refLocalId="82">
- <position x="578" y="485"/>
- <position x="532" y="485"/>
- </connection>
- </connectionPointIn>
- </variable>
- </inputVariables>
- <inOutVariables/>
- <outputVariables>
- <variable formalParameter="OUT">
- <connectionPointOut>
- <relPosition x="60" y="30"/>
- </connectionPointOut>
- </variable>
- </outputVariables>
- </block>
- <connector name="Connection0" localId="81" height="30" width="130">
- <position x="545" y="390"/>
- <connectionPointIn>
- <relPosition x="0" y="15"/>
- <connection refLocalId="4">
- <position x="545" y="405"/>
- <position x="515" y="405"/>
- </connection>
- </connectionPointIn>
- </connector>
- <continuation name="Connection0" localId="82" height="30" width="130">
- <position x="410" y="470"/>
- <connectionPointOut>
- <relPosition x="130" y="15"/>
- </connectionPointOut>
- </continuation>
- </FBD>
- </body>
- </pou>
- <pou name="C_Pragma" pouType="functionBlock">
- <interface>
- <outputVars>
- <variable name="OUT">
- <type>
- <SINT/>
- </type>
- </variable>
- </outputVars>
- <inputVars>
- <variable name="IN">
- <type>
- <SINT/>
- </type>
- </variable>
- </inputVars>
- <localVars>
- <variable name="COORDS">
- <type>
- <array>
- <dimension lower="0" upper="5"/>
- <baseType>
- <SINT/>
- </baseType>
- </array>
- </type>
- <initialValue>
- <arrayValue>
- <value>
- <simpleValue value="54"/>
- </value>
- <value>
- <simpleValue value="55"/>
- </value>
- <value>
- <simpleValue value="56"/>
- </value>
- <value>
- <simpleValue value="57"/>
- </value>
- <value>
- <simpleValue value="58"/>
- </value>
- <value>
- <simpleValue value="59"/>
- </value>
- </arrayValue>
- </initialValue>
- </variable>
- <variable name="SMURF">
- <type>
- <derived name="CPLX_TYPE"/>
- </type>
- </variable>
- </localVars>
- <externalVars>
- <variable name="Global_RS">
- <type>
- <derived name="RS"/>
- </type>
- </variable>
- <variable name="Dudiduda">
- <type>
- <derived name="blups"/>
- </type>
- </variable>
- </externalVars>
- </interface>
- <body>
- <ST>
- <xhtml:p><![CDATA[(* hereafter is a C pragma accessing FB interface in a clean way *)
-{{
- char toPLC;
- char fromPLC = GetFbVar(IN);
- extern int PLC_C_Call(char, char *);
- if(PLC_C_Call(fromPLC, &toPLC)){
- SetFbVar(OUT, toPLC);
- }
- if(0){
- /* that code demonstrate C access to complex types */
- char somebyte = GetFbVar(COORDS, .table[3]);
- SetFbVar(SMURF, somebyte, .FIRSTBYTE);
- SetFbVar(COORDS, somebyte, .table[4]);
- }
-}}
-(* If you do not use GetFbVar and SetFbVar macros, expect unexpected behaviour*)
-Global_RS();
-
-(* testing access to global struct array *)
-Dudiduda[2].FIRSTBYTE := 0;
-]]></xhtml:p>
- </ST>
- </body>
- </pou>
- <pou name="norm" pouType="function">
- <interface>
- <returnType>
- <REAL/>
- </returnType>
- <inputVars>
- <variable name="IN1">
- <type>
- <REAL/>
- </type>
- </variable>
- <variable name="IN2">
- <type>
- <REAL/>
- </type>
- </variable>
- </inputVars>
- </interface>
- <body>
- <ST>
- <xhtml:p><![CDATA[NORM := SQRT(IN1 * IN1 + IN2 * IN2);]]></xhtml:p>
- </ST>
- </body>
- </pou>
- <pou name="function0" pouType="function">
- <interface>
- <returnType>
- <derived name="datatype0"/>
- </returnType>
- <inputVars>
- <variable name="LocalVar0">
- <type>
- <derived name="datatype0"/>
- </type>
- </variable>
- </inputVars>
- </interface>
- <body>
- <ST>
- <xhtml:p><![CDATA[function0 := LocalVar0;
-]]></xhtml:p>
- </ST>
- </body>
- </pou>
- </pous>
- </types>
- <instances>
- <configurations>
- <configuration name="config">
- <resource name="res_pytest">
- <task name="pytest_task" priority="0" interval="T#500ms"/>
- <globalVars>
- <variable name="TOTO">
- <type>
- <INT/>
- </type>
- </variable>
- </globalVars>
- <pouInstance name="pytest_instance" typeName="main_pytest"/>
- </resource>
- <globalVars>
- <variable name="Global_RS">
- <type>
- <derived name="RS"/>
- </type>
- </variable>
- <variable name="Dudiduda">
- <type>
- <derived name="blups"/>
- </type>
- </variable>
- <variable name="TUTU">
- <type>
- <INT/>
- </type>
- </variable>
- </globalVars>
- </configuration>
- </configurations>
- </instances>
-</project>
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
+ <fileHeader companyName="" productName="Beremiz" productVersion="0.0" creationDateTime="2008-12-14T16:21:19" contentDescription="This example shows many features in Beremiz: 1. How to implement python extensions. 2. How to implement basic C extension. 3. How to use C code in IEC POUs. 4. How to call C functions from python code. 5. How to avoid race conditions between IEC, C and python code. 6. How to convert betweet different IEC types. "/>
+ <contentHeader name="Beremiz Python Support Tests" modificationDateTime="2023-09-28T17:24:49">
+ <coordinateInfo>
+ <pageSize x="1024" y="1024"/>
+ <fbd>
+ <scaling x="5" y="5"/>
+ </fbd>
+ <ld>
+ <scaling x="5" y="5"/>
+ </ld>
+ <sfc>
+ <scaling x="5" y="5"/>
+ </sfc>
+ </coordinateInfo>
+ </contentHeader>
+ <types>
+ <dataTypes>
+ <dataType name="CPLX_TYPE">
+ <baseType>
+ <struct>
+ <variable name="FIRSTBYTE">
+ <type>
+ <SINT/>
+ </type>
+ </variable>
+ <variable name="SECONDBYTE">
+ <type>
+ <SINT/>
+ </type>
+ </variable>
+ </struct>
+ </baseType>
+ </dataType>
+ <dataType name="StateMachine">
+ <baseType>
+ <enum>
+ <values>
+ <value name="STANDBY"/>
+ <value name="START"/>
+ <value name="STOP"/>
+ </values>
+ </enum>
+ </baseType>
+ </dataType>
+ <dataType name="datatype0">
+ <baseType>
+ <BOOL/>
+ </baseType>
+ </dataType>
+ <dataType name="blups">
+ <baseType>
+ <array>
+ <dimension lower="0" upper="31"/>
+ <baseType>
+ <derived name="CPLX_TYPE"/>
+ </baseType>
+ </array>
+ </baseType>
+ </dataType>
+ </dataTypes>
+ <pous>
+ <pou name="main_pytest" pouType="program">
+ <interface>
+ <localVars>
+ <variable name="mux1_sel">
+ <type>
+ <INT/>
+ </type>
+ <initialValue>
+ <simpleValue value="3"/>
+ </initialValue>
+ <documentation>
+ <xhtml:p><![CDATA[blah]]></xhtml:p>
+ </documentation>
+ </variable>
+ <variable name="mux2_sel">
+ <type>
+ <INT/>
+ </type>
+ <initialValue>
+ <simpleValue value="3"/>
+ </initialValue>
+ </variable>
+ <variable name="pytest_var1">
+ <type>
+ <string/>
+ </type>
+ </variable>
+ <variable name="fefvsd">
+ <type>
+ <derived name="datatype0"/>
+ </type>
+ </variable>
+ <variable name="pytest_var2">
+ <type>
+ <BOOL/>
+ </type>
+ </variable>
+ <variable name="py1">
+ <type>
+ <derived name="python_eval"/>
+ </type>
+ </variable>
+ <variable name="Block1">
+ <type>
+ <derived name="python_eval"/>
+ </type>
+ </variable>
+ <variable name="Block2">
+ <type>
+ <derived name="python_eval"/>
+ </type>
+ </variable>
+ <variable name="Block3">
+ <type>
+ <derived name="python_eval"/>
+ </type>
+ </variable>
+ <variable name="pytest_var3">
+ <type>
+ <BOOL/>
+ </type>
+ </variable>
+ <variable name="FromC">
+ <type>
+ <SINT/>
+ </type>
+ </variable>
+ <variable name="C_Pragma0">
+ <type>
+ <derived name="C_Pragma"/>
+ </type>
+ </variable>
+ </localVars>
+ <externalVars>
+ <variable name="TestInput">
+ <type>
+ <SINT/>
+ </type>
+ </variable>
+ <variable name="TestOutput">
+ <type>
+ <SINT/>
+ </type>
+ </variable>
+ </externalVars>
+ <localVars>
+ <variable name="FromInput">
+ <type>
+ <SINT/>
+ </type>
+ </variable>
+ <variable name="Test_BCD">
+ <type>
+ <WORD/>
+ </type>
+ <initialValue>
+ <simpleValue value="151"/>
+ </initialValue>
+ </variable>
+ <variable name="Test_BCD_WRONG">
+ <type>
+ <WORD/>
+ </type>
+ <initialValue>
+ <simpleValue value="154"/>
+ </initialValue>
+ </variable>
+ <variable name="Test_BCD_CONVERTED">
+ <type>
+ <BOOL/>
+ </type>
+ </variable>
+ <variable name="Test_BCD_RESULT">
+ <type>
+ <UINT/>
+ </type>
+ </variable>
+ <variable name="Test_BCD_WRONG_RESULT">
+ <type>
+ <UINT/>
+ </type>
+ </variable>
+ <variable name="Test_DT">
+ <type>
+ <DT/>
+ </type>
+ <initialValue>
+ <simpleValue value="DT#2013-02-23-22:35:46"/>
+ </initialValue>
+ </variable>
+ <variable name="Test_TOD">
+ <type>
+ <TOD/>
+ </type>
+ </variable>
+ <variable name="Test_TOD_STRING">
+ <type>
+ <string/>
+ </type>
+ </variable>
+ <variable name="Test_Date">
+ <type>
+ <DATE/>
+ </type>
+ </variable>
+ <variable name="Test_String">
+ <type>
+ <string/>
+ </type>
+ <initialValue>
+ <simpleValue value="test"/>
+ </initialValue>
+ </variable>
+ <variable name="Test_Bool">
+ <type>
+ <BOOL/>
+ </type>
+ </variable>
+ </localVars>
+ <externalVars>
+ <variable name="Global_RS">
+ <type>
+ <derived name="RS"/>
+ </type>
+ </variable>
+ <variable name="TUTU">
+ <type>
+ <INT/>
+ </type>
+ </variable>
+ <variable name="TOTO">
+ <type>
+ <INT/>
+ </type>
+ </variable>
+ <variable name="Test_Python_Var">
+ <type>
+ <INT/>
+ </type>
+ </variable>
+ <variable name="Second_Python_Var">
+ <type>
+ <INT/>
+ </type>
+ </variable>
+ <variable name="Grumpf">
+ <type>
+ <string/>
+ </type>
+ </variable>
+ </externalVars>
+ <localVars>
+ <variable name="RTC0">
+ <type>
+ <derived name="RTC"/>
+ </type>
+ </variable>
+ </localVars>
+ <externalVars>
+ <variable name="SomeVarName">
+ <type>
+ <DINT/>
+ </type>
+ </variable>
+ </externalVars>
+ </interface>
+ <body>
+ <FBD>
+ <inVariable localId="4" height="30" width="315" executionOrderId="0" negated="false">
+ <position x="200" y="390"/>
+ <connectionPointOut>
+ <relPosition x="315" y="15"/>
+ </connectionPointOut>
+ <expression>'MyPrintFunction("Hello world\n")'</expression>
+ </inVariable>
+ <block localId="5" width="125" height="80" typeName="python_eval" instanceName="py1" executionOrderId="0">
+ <position x="686" y="400"/>
+ <inputVariables>
+ <variable formalParameter="TRIG">
+ <connectionPointIn>
+ <relPosition x="0" y="35"/>
+ <connection refLocalId="7" formalParameter="OUT">
+ <position x="686" y="435"/>
+ <position x="285" y="435"/>
+ <position x="285" y="480"/>
+ <position x="250" y="480"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="CODE">
+ <connectionPointIn>
+ <relPosition x="0" y="65"/>
+ <connection refLocalId="80" formalParameter="OUT">
+ <position x="686" y="465"/>
+ <position x="653" y="465"/>
+ <position x="653" y="485"/>
+ <position x="630" y="485"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ACK">
+ <connectionPointOut>
+ <relPosition x="125" y="35"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="RESULT">
+ <connectionPointOut>
+ <relPosition x="125" y="65"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <block localId="7" width="70" height="45" typeName="NOT" executionOrderId="0">
+ <position x="180" y="450"/>
+ <inputVariables>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="30"/>
+ <connection refLocalId="3">
+ <position x="180" y="480"/>
+ <position x="155" y="480"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="70" y="30"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inOutVariable localId="3" height="30" width="120" executionOrderId="0" negatedOut="false" negatedIn="false">
+ <position x="35" y="465"/>
+ <connectionPointIn>
+ <relPosition x="0" y="15"/>
+ <connection refLocalId="7" formalParameter="OUT">
+ <position x="35" y="480"/>
+ <position x="25" y="480"/>
+ <position x="25" y="440"/>
+ <position x="270" y="440"/>
+ <position x="270" y="480"/>
+ <position x="250" y="480"/>
+ </connection>
+ </connectionPointIn>
+ <connectionPointOut>
+ <relPosition x="120" y="15"/>
+ </connectionPointOut>
+ <expression>pytest_var2</expression>
+ </inOutVariable>
+ <block localId="8" width="125" height="80" typeName="python_eval" instanceName="Block1" executionOrderId="0">
+ <position x="686" y="545"/>
+ <inputVariables>
+ <variable formalParameter="TRIG">
+ <connectionPointIn>
+ <relPosition x="0" y="35"/>
+ <connection refLocalId="7" formalParameter="OUT">
+ <position x="686" y="580"/>
+ <position x="285" y="580"/>
+ <position x="285" y="480"/>
+ <position x="250" y="480"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="CODE">
+ <connectionPointIn>
+ <relPosition x="0" y="65"/>
+ <connection refLocalId="9">
+ <position x="686" y="610"/>
+ <position x="665" y="610"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ACK">
+ <connectionPointOut>
+ <relPosition x="125" y="35"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="RESULT">
+ <connectionPointOut>
+ <relPosition x="125" y="65"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="9" height="30" width="370" executionOrderId="0" negated="false">
+ <position x="295" y="595"/>
+ <connectionPointOut>
+ <relPosition x="370" y="15"/>
+ </connectionPointOut>
+ <expression>'MyPrintFunction("FBID :"+str(FBID)+"\n")'</expression>
+ </inVariable>
+ <inVariable localId="11" height="30" width="290" executionOrderId="0" negated="false">
+ <position x="295" y="735"/>
+ <connectionPointOut>
+ <relPosition x="290" y="15"/>
+ </connectionPointOut>
+ <expression>'PLCBinary.Simple_C_Call(5678)'</expression>
+ </inVariable>
+ <block localId="12" width="125" height="80" typeName="python_eval" instanceName="Block2" executionOrderId="0">
+ <position x="686" y="687"/>
+ <inputVariables>
+ <variable formalParameter="TRIG">
+ <connectionPointIn>
+ <relPosition x="0" y="33"/>
+ <connection refLocalId="7" formalParameter="OUT">
+ <position x="686" y="720"/>
+ <position x="285" y="720"/>
+ <position x="285" y="480"/>
+ <position x="250" y="480"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="CODE">
+ <connectionPointIn>
+ <relPosition x="0" y="63"/>
+ <connection refLocalId="11">
+ <position x="686" y="750"/>
+ <position x="585" y="750"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ACK">
+ <connectionPointOut>
+ <relPosition x="125" y="33"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="RESULT">
+ <connectionPointOut>
+ <relPosition x="125" y="63"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="14" height="30" width="290" executionOrderId="0" negated="false">
+ <position x="290" y="885"/>
+ <connectionPointOut>
+ <relPosition x="290" y="15"/>
+ </connectionPointOut>
+ <expression>'MyPythonFunc(42)'</expression>
+ </inVariable>
+ <block localId="15" width="125" height="80" typeName="python_eval" instanceName="Block3" executionOrderId="0">
+ <position x="686" y="837"/>
+ <inputVariables>
+ <variable formalParameter="TRIG">
+ <connectionPointIn>
+ <relPosition x="0" y="33"/>
+ <connection refLocalId="7" formalParameter="OUT">
+ <position x="686" y="870"/>
+ <position x="285" y="870"/>
+ <position x="285" y="480"/>
+ <position x="250" y="480"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="CODE">
+ <connectionPointIn>
+ <relPosition x="0" y="63"/>
+ <connection refLocalId="14">
+ <position x="686" y="900"/>
+ <position x="580" y="900"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ACK">
+ <connectionPointOut>
+ <relPosition x="125" y="33"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="RESULT">
+ <connectionPointOut>
+ <relPosition x="125" y="63"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <comment localId="16" height="90" width="680">
+ <position x="35" y="275"/>
+ <content>
+ <xhtml:p><![CDATA[This part of the example test that, despite of 2T period clock stimulating TRIG pin of pyth_eval blocks, blocks keep executing one after the other, in respect of execution order.]]></xhtml:p>
+ </content>
+ </comment>
+ <block localId="17" width="80" height="120" typeName="MUX" executionOrderId="0">
+ <position x="1101" y="790"/>
+ <inputVariables>
+ <variable formalParameter="K">
+ <connectionPointIn>
+ <relPosition x="0" y="30"/>
+ <connection refLocalId="18">
+ <position x="1101" y="820"/>
+ <position x="1076" y="820"/>
+ <position x="1076" y="810"/>
+ <position x="1060" y="810"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN0">
+ <connectionPointIn>
+ <relPosition x="0" y="50"/>
+ <connection refLocalId="5" formalParameter="RESULT">
+ <position x="1101" y="840"/>
+ <position x="941" y="840"/>
+ <position x="941" y="465"/>
+ <position x="811" y="465"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN1">
+ <connectionPointIn>
+ <relPosition x="0" y="70"/>
+ <connection refLocalId="8" formalParameter="RESULT">
+ <position x="1101" y="860"/>
+ <position x="926" y="860"/>
+ <position x="926" y="610"/>
+ <position x="811" y="610"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN2">
+ <connectionPointIn>
+ <relPosition x="0" y="90"/>
+ <connection refLocalId="12" formalParameter="RESULT">
+ <position x="1101" y="880"/>
+ <position x="911" y="880"/>
+ <position x="911" y="750"/>
+ <position x="811" y="750"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN3">
+ <connectionPointIn>
+ <relPosition x="0" y="110"/>
+ <connection refLocalId="15" formalParameter="RESULT">
+ <position x="1101" y="900"/>
+ <position x="811" y="900"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="80" y="30"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <outVariable localId="19" height="35" width="125" executionOrderId="0" negated="false">
+ <position x="1271" y="805"/>
+ <connectionPointIn>
+ <relPosition x="0" y="15"/>
+ <connection refLocalId="17" formalParameter="OUT">
+ <position x="1271" y="820"/>
+ <position x="1181" y="820"/>
+ </connection>
+ </connectionPointIn>
+ <expression>pytest_var1</expression>
+ </outVariable>
+ <block localId="21" width="80" height="120" typeName="MUX" executionOrderId="0">
+ <position x="1106" y="385"/>
+ <inputVariables>
+ <variable formalParameter="K">
+ <connectionPointIn>
+ <relPosition x="0" y="30"/>
+ <connection refLocalId="22">
+ <position x="1106" y="415"/>
+ <position x="1076" y="415"/>
+ <position x="1076" y="405"/>
+ <position x="1055" y="405"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN0">
+ <connectionPointIn>
+ <relPosition x="0" y="50"/>
+ <connection refLocalId="5" formalParameter="ACK">
+ <position x="1106" y="435"/>
+ <position x="811" y="435"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN1">
+ <connectionPointIn>
+ <relPosition x="0" y="70"/>
+ <connection refLocalId="8" formalParameter="ACK">
+ <position x="1106" y="455"/>
+ <position x="841" y="455"/>
+ <position x="841" y="580"/>
+ <position x="811" y="580"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN2">
+ <connectionPointIn>
+ <relPosition x="0" y="90"/>
+ <connection refLocalId="12" formalParameter="ACK">
+ <position x="1106" y="475"/>
+ <position x="856" y="475"/>
+ <position x="856" y="720"/>
+ <position x="811" y="720"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN3">
+ <connectionPointIn>
+ <relPosition x="0" y="110"/>
+ <connection refLocalId="15" formalParameter="ACK">
+ <position x="1106" y="495"/>
+ <position x="871" y="495"/>
+ <position x="871" y="870"/>
+ <position x="811" y="870"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="80" y="30"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="22" height="30" width="74" executionOrderId="0" negated="false">
+ <position x="981" y="390"/>
+ <connectionPointOut>
+ <relPosition x="74" y="15"/>
+ </connectionPointOut>
+ <expression>mux1_sel</expression>
+ </inVariable>
+ <outVariable localId="23" height="35" width="125" executionOrderId="0" negated="false">
+ <position x="1271" y="400"/>
+ <connectionPointIn>
+ <relPosition x="0" y="15"/>
+ <connection refLocalId="21" formalParameter="OUT">
+ <position x="1271" y="415"/>
+ <position x="1186" y="415"/>
+ </connection>
+ </connectionPointIn>
+ <expression>pytest_var3</expression>
+ </outVariable>
+ <outVariable localId="25" height="30" width="60" executionOrderId="0" negated="false">
+ <position x="320" y="1075"/>
+ <connectionPointIn>
+ <relPosition x="0" y="15"/>
+ <connection refLocalId="26" formalParameter="OUT">
+ <position x="320" y="1090"/>
+ <position x="265" y="1090"/>
+ </connection>
+ </connectionPointIn>
+ <expression>FromC</expression>
+ </outVariable>
+ <inVariable localId="1" height="30" width="30" executionOrderId="0" negated="false">
+ <position x="105" y="1075"/>
+ <connectionPointOut>
+ <relPosition x="30" y="15"/>
+ </connectionPointOut>
+ <expression>23</expression>
+ </inVariable>
+ <block localId="26" width="80" height="45" typeName="C_Pragma" instanceName="C_Pragma0" executionOrderId="0">
+ <position x="185" y="1060"/>
+ <inputVariables>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="30"/>
+ <connection refLocalId="1">
+ <position x="185" y="1090"/>
+ <position x="135" y="1090"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="80" y="30"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="27" height="30" width="90" executionOrderId="0" negated="false">
+ <position x="100" y="1190"/>
+ <connectionPointOut>
+ <relPosition x="90" y="15"/>
+ </connectionPointOut>
+ <expression>TestInput</expression>
+ </inVariable>
+ <outVariable localId="28" height="30" width="105" executionOrderId="0" negated="false">
+ <position x="195" y="1125"/>
+ <connectionPointIn>
+ <relPosition x="0" y="15"/>
+ <connection refLocalId="2">
+ <position x="195" y="1140"/>
+ <position x="140" y="1140"/>
+ </connection>
+ </connectionPointIn>
+ <expression>TestOutput</expression>
+ </outVariable>
+ <outVariable localId="29" height="30" width="85" executionOrderId="0" negated="false">
+ <position x="215" y="1190"/>
+ <connectionPointIn>
+ <relPosition x="0" y="15"/>
+ <connection refLocalId="27">
+ <position x="215" y="1205"/>
+ <position x="190" y="1205"/>
+ </connection>
+ </connectionPointIn>
+ <expression>FromInput</expression>
+ </outVariable>
+ <inVariable localId="2" height="30" width="30" executionOrderId="0" negated="false">
+ <position x="110" y="1125"/>
+ <connectionPointOut>
+ <relPosition x="30" y="15"/>
+ </connectionPointOut>
+ <expression>10</expression>
+ </inVariable>
+ <comment localId="30" height="105" width="465">
+ <position x="50" y="925"/>
+ <content>
+ <xhtml:p><![CDATA[You will be ready to use beremiz with C and Python when you will understand why "FromInput" is equal to 75.
+Happy hacking! ]]></xhtml:p>
+ </content>
+ </comment>
+ <comment localId="6" height="80" width="345">
+ <position x="295" y="630"/>
+ <content>
+ <xhtml:p><![CDATA[Prints FBID to stdout of PLC runtime. FBID is a unique reference to py_eval instance.]]></xhtml:p>
+ </content>
+ </comment>
+ <comment localId="10" height="85" width="345">
+ <position x="295" y="770"/>
+ <content>
+ <xhtml:p><![CDATA[Simple_C_Call is declared in C_File "1.x:c_code". See python ctypes manual for details on typing.]]></xhtml:p>
+ </content>
+ </comment>
+ <comment localId="32" height="145" width="235">
+ <position x="25" y="505"/>
+ <content>
+ <xhtml:p><![CDATA[Fast clock, at least faster that sleep(1). See what happens when python takes time to answer : PLC continues.]]></xhtml:p>
+ </content>
+ </comment>
+ <outVariable localId="33" height="30" width="133" executionOrderId="0" negated="false">
+ <position x="580" y="1564"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="35" formalParameter="OUT">
+ <position x="580" y="1580"/>
+ <position x="371" y="1580"/>
+ </connection>
+ </connectionPointIn>
+ <expression>Test_BCD_RESULT</expression>
+ </outVariable>
+ <inVariable localId="34" height="30" width="75" executionOrderId="0" negated="false">
+ <position x="60" y="1564"/>
+ <connectionPointOut>
+ <relPosition x="75" y="16"/>
+ </connectionPointOut>
+ <expression>Test_BCD</expression>
+ </inVariable>
+ <block localId="35" width="106" height="60" typeName="BCD_TO_UINT" executionOrderId="0">
+ <position x="265" y="1539"/>
+ <inputVariables>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="41"/>
+ <connection refLocalId="34">
+ <position x="265" y="1580"/>
+ <position x="135" y="1580"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="106" y="41"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="36" height="30" width="66" executionOrderId="0" negated="false">
+ <position x="60" y="1774"/>
+ <connectionPointOut>
+ <relPosition x="66" y="16"/>
+ </connectionPointOut>
+ <expression>Test_DT</expression>
+ </inVariable>
+ <block localId="37" width="255" height="45" typeName="DATE_AND_TIME_TO_TIME_OF_DAY" executionOrderId="0">
+ <position x="265" y="1759"/>
+ <inputVariables>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="31"/>
+ <connection refLocalId="36">
+ <position x="265" y="1790"/>
+ <position x="125" y="1790"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="255" y="31"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <block localId="38" width="195" height="45" typeName="DATE_AND_TIME_TO_DATE" executionOrderId="0">
+ <position x="265" y="1834"/>
+ <inputVariables>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="31"/>
+ <connection refLocalId="36">
+ <position x="265" y="1865"/>
+ <position x="242" y="1865"/>
+ <position x="242" y="1790"/>
+ <position x="125" y="1790"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="195" y="31"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <outVariable localId="40" height="30" width="82" executionOrderId="0" negated="false">
+ <position x="580" y="1849"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="38" formalParameter="OUT">
+ <position x="580" y="1865"/>
+ <position x="460" y="1865"/>
+ </connection>
+ </connectionPointIn>
+ <expression>Test_Date</expression>
+ </outVariable>
+ <outVariable localId="42" height="30" width="98" executionOrderId="0" negated="false">
+ <position x="465" y="1944"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="46" formalParameter="OUT">
+ <position x="465" y="1960"/>
+ <position x="395" y="1960"/>
+ </connection>
+ </connectionPointIn>
+ <expression>Test_String</expression>
+ </outVariable>
+ <outVariable localId="43" height="30" width="82" executionOrderId="0" negated="false">
+ <position x="465" y="2014"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="44" formalParameter="OUT">
+ <position x="465" y="2030"/>
+ <position x="400" y="2030"/>
+ </connection>
+ </connectionPointIn>
+ <expression>Test_Bool</expression>
+ </outVariable>
+ <block localId="44" width="135" height="45" typeName="STRING_TO_BOOL" executionOrderId="0">
+ <position x="265" y="1999"/>
+ <inputVariables>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="31"/>
+ <connection refLocalId="45">
+ <position x="265" y="2030"/>
+ <position x="115" y="2030"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="135" y="31"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="45" height="30" width="58" executionOrderId="0" negated="false">
+ <position x="60" y="2014"/>
+ <connectionPointOut>
+ <relPosition x="58" y="16"/>
+ </connectionPointOut>
+ <expression>'True'</expression>
+ </inVariable>
+ <block localId="46" width="130" height="45" typeName="INT_TO_STRING" executionOrderId="0">
+ <position x="265" y="1929"/>
+ <inputVariables>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="31"/>
+ <connection refLocalId="58">
+ <position x="265" y="1960"/>
+ <position x="205" y="1960"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="130" y="31"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="50" height="30" width="106" executionOrderId="0" negated="false">
+ <position x="75" y="2275"/>
+ <connectionPointOut>
+ <relPosition x="106" y="15"/>
+ </connectionPointOut>
+ <expression>Global_RS.Q1</expression>
+ </inVariable>
+ <block localId="51" width="70" height="85" typeName="AND" executionOrderId="0">
+ <position x="240" y="2255"/>
+ <inputVariables>
+ <variable formalParameter="IN1" negated="true">
+ <connectionPointIn>
+ <relPosition x="0" y="35"/>
+ <connection refLocalId="50">
+ <position x="240" y="2290"/>
+ <position x="180" y="2290"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN2">
+ <connectionPointIn>
+ <relPosition x="0" y="70"/>
+ <connection refLocalId="52">
+ <position x="240" y="2325"/>
+ <position x="180" y="2325"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="70" y="35"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="52" height="30" width="105" executionOrderId="0" negated="false">
+ <position x="75" y="2310"/>
+ <connectionPointOut>
+ <relPosition x="105" y="15"/>
+ </connectionPointOut>
+ <expression>BOOL#TRUE</expression>
+ </inVariable>
+ <outVariable localId="13" height="30" width="105" executionOrderId="0" negated="false">
+ <position x="385" y="2275"/>
+ <connectionPointIn>
+ <relPosition x="0" y="15"/>
+ <connection refLocalId="51" formalParameter="OUT">
+ <position x="385" y="2290"/>
+ <position x="310" y="2290"/>
+ </connection>
+ </connectionPointIn>
+ <expression>Global_RS.S</expression>
+ </outVariable>
+ <outVariable localId="20" height="30" width="106" executionOrderId="0" negated="false">
+ <position x="385" y="2390"/>
+ <connectionPointIn>
+ <relPosition x="0" y="15"/>
+ <connection refLocalId="41" formalParameter="OUT">
+ <position x="385" y="2405"/>
+ <position x="310" y="2405"/>
+ </connection>
+ </connectionPointIn>
+ <expression>Global_RS.R1</expression>
+ </outVariable>
+ <inVariable localId="24" height="30" width="106" executionOrderId="0" negated="false">
+ <position x="75" y="2390"/>
+ <connectionPointOut>
+ <relPosition x="106" y="15"/>
+ </connectionPointOut>
+ <expression>Global_RS.Q1</expression>
+ </inVariable>
+ <block localId="41" width="70" height="85" typeName="OR" executionOrderId="0">
+ <position x="240" y="2370"/>
+ <inputVariables>
+ <variable formalParameter="IN1">
+ <connectionPointIn>
+ <relPosition x="0" y="35"/>
+ <connection refLocalId="24">
+ <position x="240" y="2405"/>
+ <position x="180" y="2405"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN2">
+ <connectionPointIn>
+ <relPosition x="0" y="70"/>
+ <connection refLocalId="48">
+ <position x="240" y="2440"/>
+ <position x="180" y="2440"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="70" y="35"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="48" height="30" width="105" executionOrderId="0" negated="false">
+ <position x="75" y="2425"/>
+ <connectionPointOut>
+ <relPosition x="105" y="15"/>
+ </connectionPointOut>
+ <expression>BOOL#FALSE</expression>
+ </inVariable>
+ <outVariable localId="54" height="30" width="135" executionOrderId="0" negated="false">
+ <position x="930" y="1774"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="55" formalParameter="OUT">
+ <position x="930" y="1790"/>
+ <position x="855" y="1790"/>
+ </connection>
+ </connectionPointIn>
+ <expression>Test_TOD_STRING</expression>
+ </outVariable>
+ <block localId="55" width="125" height="45" typeName="TOD_TO_STRING" executionOrderId="0">
+ <position x="730" y="1759"/>
+ <inputVariables>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="31"/>
+ <connection refLocalId="39">
+ <position x="730" y="1790"/>
+ <position x="655" y="1790"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="125" y="31"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inOutVariable localId="39" height="30" width="75" executionOrderId="0" negatedOut="false" negatedIn="false">
+ <position x="580" y="1774"/>
+ <connectionPointIn>
+ <relPosition x="0" y="16"/>
+ <connection refLocalId="37" formalParameter="OUT">
+ <position x="580" y="1790"/>
+ <position x="520" y="1790"/>
+ </connection>
+ </connectionPointIn>
+ <connectionPointOut>
+ <relPosition x="75" y="16"/>
+ </connectionPointOut>
+ <expression>Test_TOD</expression>
+ </inOutVariable>
+ <inVariable localId="49" height="30" width="30" executionOrderId="0" negated="false">
+ <position x="160" y="2510"/>
+ <connectionPointOut>
+ <relPosition x="30" y="15"/>
+ </connectionPointOut>
+ <expression>42</expression>
+ </inVariable>
+ <outVariable localId="57" height="30" width="50" executionOrderId="0" negated="false">
+ <position x="240" y="2510"/>
+ <connectionPointIn>
+ <relPosition x="0" y="15"/>
+ <connection refLocalId="49">
+ <position x="240" y="2525"/>
+ <position x="190" y="2525"/>
+ </connection>
+ </connectionPointIn>
+ <expression>TOTO</expression>
+ </outVariable>
+ <outVariable localId="56" height="30" width="50" executionOrderId="0" negated="false">
+ <position x="240" y="2550"/>
+ <connectionPointIn>
+ <relPosition x="0" y="15"/>
+ <connection refLocalId="49">
+ <position x="240" y="2565"/>
+ <position x="215" y="2565"/>
+ <position x="215" y="2525"/>
+ <position x="190" y="2525"/>
+ </connection>
+ </connectionPointIn>
+ <expression>TUTU</expression>
+ </outVariable>
+ <inVariable localId="58" height="30" width="146" executionOrderId="0" negated="false">
+ <position x="60" y="1944"/>
+ <connectionPointOut>
+ <relPosition x="146" y="16"/>
+ </connectionPointOut>
+ <expression>Second_Python_Var</expression>
+ </inVariable>
+ <inVariable localId="59" height="30" width="30" executionOrderId="0" negated="false">
+ <position x="100" y="1385"/>
+ <connectionPointOut>
+ <relPosition x="30" y="15"/>
+ </connectionPointOut>
+ <expression>1</expression>
+ </inVariable>
+ <block localId="61" typeName="function0" executionOrderId="0" height="45" width="111">
+ <position x="760" y="1170"/>
+ <inputVariables>
+ <variable formalParameter="LocalVar0">
+ <connectionPointIn>
+ <relPosition x="0" y="30"/>
+ <connection refLocalId="62">
+ <position x="760" y="1200"/>
+ <position x="723" y="1200"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="111" y="30"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <inVariable localId="62" executionOrderId="0" height="30" width="58" negated="false">
+ <position x="665" y="1185"/>
+ <connectionPointOut>
+ <relPosition x="58" y="15"/>
+ </connectionPointOut>
+ <expression>fefvsd</expression>
+ </inVariable>
+ <outVariable localId="63" executionOrderId="0" height="30" width="58" negated="false">
+ <position x="905" y="1185"/>
+ <connectionPointIn>
+ <relPosition x="0" y="15"/>
+ <connection refLocalId="61" formalParameter="OUT">
+ <position x="905" y="1200"/>
+ <position x="871" y="1200"/>
+ </connection>
+ </connectionPointIn>
+ <expression>fefvsd</expression>
+ </outVariable>
+ <comment localId="53" height="80" width="420">
+ <position x="75" y="2160"/>
+ <content>
+ <xhtml:p><![CDATA[Shows global variables access from resource configuration (res_pytest) and from project's configuration.]]></xhtml:p>
+ </content>
+ </comment>
+ <inVariable localId="18" height="30" width="74" executionOrderId="0" negated="false">
+ <position x="986" y="795"/>
+ <connectionPointOut>
+ <relPosition x="74" y="15"/>
+ </connectionPointOut>
+ <expression>mux2_sel</expression>
+ </inVariable>
+ <comment localId="60" height="45" width="930">
+ <position x="60" y="1480"/>
+ <content>
+ <xhtml:p><![CDATA[Here is shown how to convert values between different types (BCD, DT, TOD, STRING and others) using standard functions.]]></xhtml:p>
+ </content>
+ </comment>
+ <comment localId="64" height="55" width="300">
+ <position x="665" y="1095"/>
+ <content>
+ <xhtml:p><![CDATA[Example of usage of user-defined function.]]></xhtml:p>
+ </content>
+ </comment>
+ <comment localId="65" height="45" width="410">
+ <position x="55" y="1315"/>
+ <content>
+ <xhtml:p><![CDATA[Shows access variable defined in python extension. ]]></xhtml:p>
+ </content>
+ </comment>
+ <inVariable localId="66" height="30" width="137" executionOrderId="0" negated="false">
+ <position x="60" y="1685"/>
+ <connectionPointOut>
+ <relPosition x="137" y="15"/>
+ </connectionPointOut>
+ <expression>Test_BCD_WRONG</expression>
+ </inVariable>
+ <block localId="67" width="106" height="100" typeName="BCD_TO_UINT" executionOrderId="0">
+ <position x="265" y="1620"/>
+ <inputVariables>
+ <variable formalParameter="EN">
+ <connectionPointIn>
+ <relPosition x="0" y="40"/>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="80"/>
+ <connection refLocalId="66">
+ <position x="265" y="1700"/>
+ <position x="255" y="1700"/>
+ <position x="255" y="1700"/>
+ <position x="345" y="1700"/>
+ <position x="345" y="1700"/>
+ <position x="197" y="1700"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="ENO">
+ <connectionPointOut>
+ <relPosition x="106" y="40"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="106" y="80"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <outVariable localId="68" height="30" width="196" executionOrderId="0" negated="false">
+ <position x="580" y="1685"/>
+ <connectionPointIn>
+ <relPosition x="0" y="15"/>
+ <connection refLocalId="67" formalParameter="OUT">
+ <position x="580" y="1700"/>
+ <position x="371" y="1700"/>
+ </connection>
+ </connectionPointIn>
+ <expression>Test_BCD_WRONG_RESULT</expression>
+ </outVariable>
+ <comment localId="69" height="165" width="375">
+ <position x="795" y="1590"/>
+ <content>
+ <xhtml:p><![CDATA[Incorrect BCD number is not converted to UINT.
+
+151 (16#97) is good BCD number , but
+154 (16#9A) is not.
+
+Try this out and look at value of Test_BCD_CONVERTED variable.
+
+
+]]></xhtml:p>
+ </content>
+ </comment>
+ <outVariable localId="70" height="30" width="185" executionOrderId="0" negated="false">
+ <position x="580" y="1645"/>
+ <connectionPointIn>
+ <relPosition x="0" y="15"/>
+ <connection refLocalId="67" formalParameter="ENO">
+ <position x="580" y="1660"/>
+ <position x="370" y="1660"/>
+ </connection>
+ </connectionPointIn>
+ <expression>Test_BCD_CONVERTED</expression>
+ </outVariable>
+ <comment localId="71" height="215" width="680">
+ <position x="35" y="30"/>
+ <content>
+ <xhtml:p><![CDATA[This example shows many features in Beremiz:
+
+ 1. How to implement python extensions.
+ 2. How to implement basic C extension.
+ 3. How to use C code in IEC POUs.
+ 4. How to call C functions from python code.
+ 5. How to avoid race conditions between IEC, C and python code.
+ 6. How to convert betweet different IEC types.
+]]></xhtml:p>
+ </content>
+ </comment>
+ <outVariable localId="72" executionOrderId="0" height="30" width="60" negated="false">
+ <position x="1065" y="1970"/>
+ <connectionPointIn>
+ <relPosition x="0" y="15"/>
+ <connection refLocalId="76" formalParameter="OUT">
+ <position x="1065" y="1985"/>
+ <position x="1025" y="1985"/>
+ <position x="1025" y="1995"/>
+ <position x="985" y="1995"/>
+ </connection>
+ </connectionPointIn>
+ <expression>Grumpf</expression>
+ </outVariable>
+ <inVariable localId="73" executionOrderId="0" height="30" width="85" negated="false">
+ <position x="625" y="1940"/>
+ <connectionPointOut>
+ <relPosition x="85" y="15"/>
+ </connectionPointOut>
+ <expression>BOOL#TRUE</expression>
+ </inVariable>
+ <inVariable localId="74" executionOrderId="0" height="30" width="70" negated="false">
+ <position x="625" y="1975"/>
+ <connectionPointOut>
+ <relPosition x="70" y="15"/>
+ </connectionPointOut>
+ <expression>Test_DT</expression>
+ </inVariable>
+ <block localId="75" typeName="RTC" instanceName="RTC0" executionOrderId="0" height="90" width="65">
+ <position x="760" y="1925"/>
+ <inputVariables>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="35"/>
+ <connection refLocalId="73">
+ <position x="760" y="1960"/>
+ <position x="735" y="1960"/>
+ <position x="735" y="1955"/>
+ <position x="710" y="1955"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="PDT">
+ <connectionPointIn>
+ <relPosition x="0" y="70"/>
+ <connection refLocalId="74">
+ <position x="760" y="1995"/>
+ <position x="727" y="1995"/>
+ <position x="727" y="1990"/>
+ <position x="695" y="1990"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="Q">
+ <connectionPointOut>
+ <relPosition x="65" y="35"/>
+ </connectionPointOut>
+ </variable>
+ <variable formalParameter="CDT">
+ <connectionPointOut>
+ <relPosition x="65" y="70"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <block localId="76" typeName="DT_TO_STRING" executionOrderId="0" height="40" width="110">
+ <position x="875" y="1965"/>
+ <inputVariables>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="30"/>
+ <connection refLocalId="75" formalParameter="CDT">
+ <position x="875" y="1995"/>
+ <position x="825" y="1995"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="110" y="30"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <block localId="77" typeName="ADD" executionOrderId="0" height="60" width="65">
+ <position x="170" y="1370"/>
+ <inputVariables>
+ <variable formalParameter="IN1">
+ <connectionPointIn>
+ <relPosition x="0" y="30"/>
+ <connection refLocalId="59">
+ <position x="170" y="1400"/>
+ <position x="130" y="1400"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ <variable formalParameter="IN2">
+ <connectionPointIn>
+ <relPosition x="0" y="50"/>
+ <connection refLocalId="78">
+ <position x="170" y="1420"/>
+ <position x="160" y="1420"/>
+ <position x="160" y="1450"/>
+ <position x="390" y="1450"/>
+ <position x="390" y="1400"/>
+ <position x="380" y="1400"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="65" y="30"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <outVariable localId="47" executionOrderId="0" height="30" width="130" negated="false">
+ <position x="625" y="1335"/>
+ <connectionPointIn>
+ <relPosition x="0" y="15"/>
+ <connection refLocalId="79">
+ <position x="625" y="1350"/>
+ <position x="590" y="1350"/>
+ </connection>
+ </connectionPointIn>
+ <expression>Test_Python_Var</expression>
+ </outVariable>
+ <inVariable localId="79" executionOrderId="0" height="27" width="30" negated="false">
+ <position x="560" y="1340"/>
+ <connectionPointOut>
+ <relPosition x="30" y="15"/>
+ </connectionPointOut>
+ <expression>23</expression>
+ </inVariable>
+ <inOutVariable localId="78" executionOrderId="0" height="30" width="100" negatedOut="false" negatedIn="false">
+ <position x="280" y="1385"/>
+ <connectionPointIn>
+ <relPosition x="0" y="15"/>
+ <connection refLocalId="77" formalParameter="OUT">
+ <position x="280" y="1400"/>
+ <position x="235" y="1400"/>
+ </connection>
+ </connectionPointIn>
+ <connectionPointOut>
+ <relPosition x="100" y="15"/>
+ </connectionPointOut>
+ <expression>SomeVarName</expression>
+ </inOutVariable>
+ <block localId="80" typeName="MOVE" executionOrderId="0" height="40" width="60">
+ <position x="570" y="455"/>
+ <inputVariables>
+ <variable formalParameter="IN">
+ <connectionPointIn>
+ <relPosition x="0" y="30"/>
+ <connection refLocalId="82">
+ <position x="578" y="485"/>
+ <position x="532" y="485"/>
+ </connection>
+ </connectionPointIn>
+ </variable>
+ </inputVariables>
+ <inOutVariables/>
+ <outputVariables>
+ <variable formalParameter="OUT">
+ <connectionPointOut>
+ <relPosition x="60" y="30"/>
+ </connectionPointOut>
+ </variable>
+ </outputVariables>
+ </block>
+ <connector name="Connection0" localId="81" height="30" width="130">
+ <position x="545" y="390"/>
+ <connectionPointIn>
+ <relPosition x="0" y="15"/>
+ <connection refLocalId="4">
+ <position x="545" y="405"/>
+ <position x="515" y="405"/>
+ </connection>
+ </connectionPointIn>
+ </connector>
+ <continuation name="Connection0" localId="82" height="30" width="130">
+ <position x="410" y="470"/>
+ <connectionPointOut>
+ <relPosition x="130" y="15"/>
+ </connectionPointOut>
+ </continuation>
+ </FBD>
+ </body>
+ </pou>
+ <pou name="C_Pragma" pouType="functionBlock">
+ <interface>
+ <outputVars>
+ <variable name="OUT">
+ <type>
+ <SINT/>
+ </type>
+ </variable>
+ </outputVars>
+ <inputVars>
+ <variable name="IN">
+ <type>
+ <SINT/>
+ </type>
+ </variable>
+ </inputVars>
+ <localVars>
+ <variable name="COORDS">
+ <type>
+ <array>
+ <dimension lower="0" upper="5"/>
+ <baseType>
+ <SINT/>
+ </baseType>
+ </array>
+ </type>
+ <initialValue>
+ <arrayValue>
+ <value>
+ <simpleValue value="54"/>
+ </value>
+ <value>
+ <simpleValue value="55"/>
+ </value>
+ <value>
+ <simpleValue value="56"/>
+ </value>
+ <value>
+ <simpleValue value="57"/>
+ </value>
+ <value>
+ <simpleValue value="58"/>
+ </value>
+ <value>
+ <simpleValue value="59"/>
+ </value>
+ </arrayValue>
+ </initialValue>
+ </variable>
+ <variable name="SMURF">
+ <type>
+ <derived name="CPLX_TYPE"/>
+ </type>
+ </variable>
+ </localVars>
+ <externalVars>
+ <variable name="Global_RS">
+ <type>
+ <derived name="RS"/>
+ </type>
+ </variable>
+ <variable name="Dudiduda">
+ <type>
+ <derived name="blups"/>
+ </type>
+ </variable>
+ </externalVars>
+ </interface>
+ <body>
+ <ST>
+ <xhtml:p><![CDATA[(* hereafter is a C pragma accessing FB interface in a clean way *)
+{{
+ char toPLC;
+ char fromPLC = GetFbVar(IN);
+ extern int PLC_C_Call(char, char *);
+ if(PLC_C_Call(fromPLC, &toPLC)){
+ SetFbVar(OUT, toPLC);
+ }
+ if(0){
+ /* that code demonstrate C access to complex types */
+ char somebyte = GetFbVar(COORDS, .table[3]);
+ SetFbVar(SMURF, somebyte, .FIRSTBYTE);
+ SetFbVar(COORDS, somebyte, .table[4]);
+ }
+}}
+(* If you do not use GetFbVar and SetFbVar macros, expect unexpected behaviour*)
+Global_RS();
+
+(* testing access to global struct array *)
+Dudiduda[2].FIRSTBYTE := 0;
+]]></xhtml:p>
+ </ST>
+ </body>
+ </pou>
+ <pou name="norm" pouType="function">
+ <interface>
+ <returnType>
+ <REAL/>
+ </returnType>
+ <inputVars>
+ <variable name="IN1">
+ <type>
+ <REAL/>
+ </type>
+ </variable>
+ <variable name="IN2">
+ <type>
+ <REAL/>
+ </type>
+ </variable>
+ </inputVars>
+ </interface>
+ <body>
+ <ST>
+ <xhtml:p><![CDATA[NORM := SQRT(IN1 * IN1 + IN2 * IN2);]]></xhtml:p>
+ </ST>
+ </body>
+ </pou>
+ <pou name="function0" pouType="function">
+ <interface>
+ <returnType>
+ <derived name="datatype0"/>
+ </returnType>
+ <inputVars>
+ <variable name="LocalVar0">
+ <type>
+ <derived name="datatype0"/>
+ </type>
+ </variable>
+ </inputVars>
+ </interface>
+ <body>
+ <ST>
+ <xhtml:p><![CDATA[function0 := LocalVar0;
+]]></xhtml:p>
+ </ST>
+ </body>
+ </pou>
+ </pous>
+ </types>
+ <instances>
+ <configurations>
+ <configuration name="config">
+ <resource name="res_pytest">
+ <task name="pytest_task" priority="0" interval="T#500ms"/>
+ <globalVars>
+ <variable name="TOTO">
+ <type>
+ <INT/>
+ </type>
+ </variable>
+ </globalVars>
+ <pouInstance name="pytest_instance" typeName="main_pytest"/>
+ </resource>
+ <globalVars>
+ <variable name="Global_RS">
+ <type>
+ <derived name="RS"/>
+ </type>
+ </variable>
+ <variable name="Dudiduda">
+ <type>
+ <derived name="blups"/>
+ </type>
+ </variable>
+ <variable name="TUTU">
+ <type>
+ <INT/>
+ </type>
+ </variable>
+ </globalVars>
+ </configuration>
+ </configurations>
+ </instances>
+</project>
--- a/exemples/python/python@py_ext/pyfile.xml Mon Aug 07 18:17:12 2023 +0200
+++ b/exemples/python/python@py_ext/pyfile.xml Thu Sep 28 17:56:03 2023 +0200
@@ -1,69 +1,79 @@
-<?xml version='1.0' encoding='utf-8'?>
-<PyFile xmlns:xhtml="http://www.w3.org/1999/xhtml">
- <variables>
- <variable name="Test_Python_Var" type="INT" initial="4"/>
- <variable name="Second_Python_Var" type="INT" initial="5"/>
- </variables>
- <globals>
- <xhtml:p><![CDATA[
-import time,sys,ctypes
-Python_to_C_Call = PLCBinary.Python_to_C_Call
-Python_to_C_Call.restype = ctypes.c_int
-Python_to_C_Call.argtypes = [ctypes.c_int, ctypes.POINTER(ctypes.c_int)]
-
-def MyPythonFunc(arg):
- i = ctypes.c_int()
- if(Python_to_C_Call(arg, i)):
- res = i.value
- print("toC:", arg, "from C:", res, "FBID:", FBID)
- else:
- print("Failed Python_to_C_Call failed")
- res = None
- print("Python read PLC global :",PLCGlobals.Test_Python_Var)
- print("Python read PLC global Grumpf :",PLCGlobals.Grumpf)
- PLCGlobals.Second_Python_Var = 789
- sys.stdout.flush()
- return res
-
-async_error_test_code = """
-def badaboom():
- tuple()[0]
-
-import wx
-def badaboomwx():
- wx.CallAfter(badaboom)
-
-from threading import Timer
-a = Timer(3, badaboom)
-a.start()
-
-b = Timer(6, badaboomwx)
-b.start()
-"""
-]]></xhtml:p>
- </globals>
- <init>
- <xhtml:p><![CDATA[
-global x, y
-x = 2
-y = 5
-print("py_runtime init:", x, ",", y)
-]]></xhtml:p>
- </init>
- <cleanup>
- <xhtml:p><![CDATA[
-print("py_runtime cleanup")
-]]></xhtml:p>
- </cleanup>
- <start>
- <xhtml:p><![CDATA[
-global x, y
-print("py_runtime start", x * x + y * y)
-]]></xhtml:p>
- </start>
- <stop>
- <xhtml:p><![CDATA[
-print("py_runtime stop")
-]]></xhtml:p>
- </stop>
-</PyFile>
+<?xml version='1.0' encoding='utf-8'?>
+<PyFile xmlns:xhtml="http://www.w3.org/1999/xhtml">
+ <variables>
+ <variable name="Test_Python_Var" type="INT" initial="4"/>
+ <variable name="Second_Python_Var" type="INT" initial="5"/>
+ </variables>
+ <globals>
+ <xhtml:p><![CDATA[
+import time,sys,ctypes
+Python_to_C_Call = PLCBinary.Python_to_C_Call
+Python_to_C_Call.restype = ctypes.c_int
+Python_to_C_Call.argtypes = [ctypes.c_int, ctypes.POINTER(ctypes.c_int)]
+
+
+def MyPrintFunction(msg):
+ if sys.stdout:
+ sys.stdout.write(msg)
+ sys.stdout.flush()
+ else:
+ PLCObject.LogMessage(msg)
+
+def MyPythonFunc(arg):
+ i = ctypes.c_int()
+ if(Python_to_C_Call(arg, i)):
+ res = i.value
+ print("toC:", arg, "from C:", res, "FBID:", FBID)
+ else:
+ print("Failed Python_to_C_Call failed")
+ res = None
+ print("Python read PLC global :",PLCGlobals.Test_Python_Var)
+ print("Python read PLC global Grumpf :",PLCGlobals.Grumpf)
+ PLCGlobals.Second_Python_Var = 789
+
+ if sys.stdout:
+ sys.stdout.flush()
+ return res
+
+async_error_test_code = """
+def badaboom():
+ tuple()[0]
+
+import wx
+def badaboomwx():
+ wx.CallAfter(badaboom)
+
+from threading import Timer
+a = Timer(3, badaboom)
+a.start()
+
+b = Timer(6, badaboomwx)
+b.start()
+"""
+]]></xhtml:p>
+ </globals>
+ <init>
+ <xhtml:p><![CDATA[
+global x, y
+x = 2
+y = 5
+print("py_runtime init:", x, ",", y)
+]]></xhtml:p>
+ </init>
+ <cleanup>
+ <xhtml:p><![CDATA[
+print("py_runtime cleanup")
+]]></xhtml:p>
+ </cleanup>
+ <start>
+ <xhtml:p><![CDATA[
+global x, y
+print("py_runtime start", x * x + y * y)
+]]></xhtml:p>
+ </start>
+ <stop>
+ <xhtml:p><![CDATA[
+print("py_runtime stop")
+]]></xhtml:p>
+ </stop>
+</PyFile>
--- a/runtime/PLCObject.py Mon Aug 07 18:17:12 2023 +0200
+++ b/runtime/PLCObject.py Thu Sep 28 17:56:03 2023 +0200
@@ -62,8 +62,9 @@
def PLCprint(message):
- sys.stdout.write("PLCobject : "+message+"\n")
- sys.stdout.flush()
+ if sys.stdout:
+ sys.stdout.write("PLCobject : "+message+"\n")
+ sys.stdout.flush()
def RunInMain(func):
--- a/runtime/PyroServer.py Mon Aug 07 18:17:12 2023 +0200
+++ b/runtime/PyroServer.py Thu Sep 28 17:56:03 2023 +0200
@@ -73,7 +73,8 @@
if self._to_be_published():
print(_("Publishing service on local network"))
- sys.stdout.flush()
+ if sys.stdout:
+ sys.stdout.flush()
def PyroLoop(self, when_ready):
if self._to_be_published():