# HG changeset patch # User Andrey Skvortsov <andrej.skvortzov@gmail.com> # Date 1532818803 -10800 # Node ID 3145dcffc6ed46e9e639201f01e9fa2c8cc9fcc8 # Parent b0418bb135278a0f267bf9c5be886d9672359fcd Add BACnet example diff -r b0418bb13527 -r 3145dcffc6ed tests/BACnet/bacnet_0@bacnet/bacnet_slave --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/BACnet/bacnet_0@bacnet/bacnet_slave Sun Jul 29 02:00:03 2018 +0300 @@ -0,0 +1,202 @@ +(dp0 +S'BV_Obj' +p1 +(lp2 +sS'AV_Obj' +p3 +(lp4 +(dp5 +S'loc' +p6 +S'MD0_2' +p7 +sS'Description' +p8 +S'' +p9 +sS'Unit ID' +p10 +I19 +sS'Object Identifier' +p11 +I0 +sS'Ctype' +p12 +S'float' +p13 +sS'BACnetObjTypeID' +p14 +I2 +sS'Settable' +p15 +S'Y' +p16 +sS'Engineering Units' +p17 +V(Energy) kilowatt-hours (19) +p18 +sS'Object Name' +p19 +VEnergyCounter +p20 +sasS'AO_Obj' +p21 +(lp22 +(dp23 +g6 +S'QD0_1' +p24 +sg8 +V +p25 +sS'Unit ID' +p26 +I62 +sS'Object Identifier' +p27 +V0 +p28 +sg12 +g13 +sg14 +I1 +sg15 +g16 +sS'Object Name' +p29 +VTemperatureSetPoint +p30 +sS'Engineering Units' +p31 +V(Temperature) degrees-celsius (62) +p32 +sasS'MSI_Obj' +p33 +(lp34 +sS'BO_Obj' +p35 +(lp36 +(dp37 +g6 +S'QX0_4' +p38 +sg8 +g9 +sS'Object Identifier' +p39 +I2 +sg12 +S'uint8_t' +p40 +sg14 +I4 +sg15 +g16 +sS'Object Name' +p41 +VBlockClimateControl +p42 +sasS'MSO_Obj' +p43 +(lp44 +sS'EDEfile_parm' +p45 +(dp46 +S'next_EDE_file_version' +p47 +I1 +ssS'BI_Obj' +p48 +(lp49 +(dp50 +g6 +S'IX0_3' +p51 +sg8 +g9 +sS'Object Identifier' +p52 +I0 +sg12 +g40 +sg14 +I3 +sg15 +S'N' +p53 +sS'Object Name' +p54 +VHeater +p55 +sa(dp56 +g6 +g51 +sg8 +g9 +sg52 +I1 +sg12 +g40 +sg14 +I3 +sg15 +g53 +sg54 +VCooler +p57 +sasS'AI_Obj' +p58 +(lp59 +(dp60 +g6 +S'ID0_0' +p61 +sg8 +VCurrent termperature in Beremiz lab +p62 +sS'Unit ID' +p63 +I62 +sS'Object Identifier' +p64 +I0 +sg12 +g13 +sg14 +I0 +sg15 +g53 +sS'Engineering Units' +p65 +V(Temperature) degrees-celsius (62) +p66 +sS'Object Name' +p67 +VTemperature +p68 +sa(dp69 +g6 +g61 +sg8 +VCurrent humidity in Beremiz lab +p70 +sg63 +I29 +sg64 +I1 +sg12 +g13 +sg14 +I0 +sg15 +g53 +sg67 +VHumidity +p71 +sg65 +V(Humidity) percent-relative-humidity (29) +p72 +sasS'MSV_Obj' +p73 +(lp74 +s. \ No newline at end of file diff -r b0418bb13527 -r 3145dcffc6ed tests/BACnet/bacnet_0@bacnet/baseconfnode.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/BACnet/bacnet_0@bacnet/baseconfnode.xml Sun Jul 29 02:00:03 2018 +0300 @@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="bacnet_0"/> diff -r b0418bb13527 -r 3145dcffc6ed tests/BACnet/bacnet_0@bacnet/confnode.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/BACnet/bacnet_0@bacnet/confnode.xml Sun Jul 29 02:00:03 2018 +0300 @@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<BACnetServerNode xmlns:xsd="http://www.w3.org/2001/XMLSchema" UDP_Port_Number="47808" BACnet_Device_ID="3" BACnet_Communication_Control_Password=" " BACnet_Device_Location="Beremiz lab" Network_Interface="virbr0"/> diff -r b0418bb13527 -r 3145dcffc6ed tests/BACnet/beremiz.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/BACnet/beremiz.xml Sun Jul 29 02:00:03 2018 +0300 @@ -0,0 +1,4 @@ +<?xml version='1.0' encoding='utf-8'?> +<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="LOCAL://"> + <TargetType/> +</BeremizRoot> diff -r b0418bb13527 -r 3145dcffc6ed tests/BACnet/plc.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/BACnet/plc.xml Sun Jul 29 02:00:03 2018 +0300 @@ -0,0 +1,601 @@ +<?xml version='1.0' encoding='utf-8'?> +<project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201"> + <fileHeader companyName="Unknown" productName="Unnamed" productVersion="1" creationDateTime="2018-07-28T02:24:08"/> + <contentHeader name="BACnet" modificationDateTime="2018-07-29T01:54:59"> + <coordinateInfo> + <fbd> + <scaling x="0" y="0"/> + </fbd> + <ld> + <scaling x="0" y="0"/> + </ld> + <sfc> + <scaling x="0" y="0"/> + </sfc> + </coordinateInfo> + </contentHeader> + <types> + <dataTypes/> + <pous> + <pou name="program0" pouType="program"> + <interface> + <localVars> + <variable name="EnergyCounter" address="%MD0.2.0"> + <type> + <REAL/> + </type> + </variable> + <variable name="Temperature" address="%ID0.0.0"> + <type> + <REAL/> + </type> + </variable> + <variable name="Humidity" address="%ID0.0.1"> + <type> + <REAL/> + </type> + </variable> + </localVars> + <localVars> + <variable name="TempSimulation"> + <type> + <derived name="Simulator"/> + </type> + </variable> + <variable name="HumiditySimulation"> + <type> + <derived name="Simulator"/> + </type> + </variable> + </localVars> + <localVars> + <variable name="TemperatureSetPoint" address="%QD0.1.0"> + <type> + <REAL/> + </type> + </variable> + <variable name="ControlDisable" address="%QX0.4.2"> + <type> + <BOOL/> + </type> + </variable> + <variable name="Heater" address="%IX0.3.0"> + <type> + <BOOL/> + </type> + </variable> + <variable name="Cooler" address="%IX0.3.1"> + <type> + <BOOL/> + </type> + </variable> + </localVars> + </interface> + <body> + <FBD> + <inVariable localId="1" executionOrderId="0" height="30" width="105" negated="false"> + <position x="299" y="521"/> + <connectionPointOut> + <relPosition x="105" y="15"/> + </connectionPointOut> + <expression>EnergyCounter</expression> + </inVariable> + <outVariable localId="2" executionOrderId="0" height="30" width="105" negated="false"> + <position x="654" y="521"/> + <connectionPointIn> + <relPosition x="0" y="15"/> + <connection refLocalId="3" formalParameter="OUT"> + <position x="654" y="536"/> + <position x="533" y="536"/> + </connection> + </connectionPointIn> + <expression>EnergyCounter</expression> + </outVariable> + <block localId="3" typeName="ADD" executionOrderId="0" height="60" width="67"> + <position x="466" y="506"/> + <inputVariables> + <variable formalParameter="IN1"> + <connectionPointIn> + <relPosition x="0" y="30"/> + <connection refLocalId="1"> + <position x="466" y="536"/> + <position x="404" y="536"/> + </connection> + </connectionPointIn> + </variable> + <variable formalParameter="IN2"> + <connectionPointIn> + <relPosition x="0" y="50"/> + <connection refLocalId="4"> + <position x="466" y="556"/> + <position x="436" y="556"/> + <position x="436" y="585"/> + <position x="401" y="585"/> + </connection> + </connectionPointIn> + </variable> + </inputVariables> + <inOutVariables/> + <outputVariables> + <variable formalParameter="OUT"> + <connectionPointOut> + <relPosition x="67" y="30"/> + </connectionPointOut> + </variable> + </outputVariables> + </block> + <inVariable localId="4" executionOrderId="0" height="30" width="105" negated="false"> + <position x="296" y="570"/> + <connectionPointOut> + <relPosition x="105" y="15"/> + </connectionPointOut> + <expression>0.00131</expression> + </inVariable> + <comment localId="5" height="67" width="229"> + <position x="27" y="525"/> + <content> + <xhtml:p><![CDATA[Always consume some energy]]></xhtml:p> + </content> + </comment> + <block localId="6" typeName="Simulator" instanceName="TempSimulation" executionOrderId="0" height="115" width="134"> + <position x="188" y="661"/> + <inputVariables> + <variable formalParameter="MinVal"> + <connectionPointIn> + <relPosition x="0" y="35"/> + <connection refLocalId="8"> + <position x="188" y="696"/> + <position x="138" y="696"/> + </connection> + </connectionPointIn> + </variable> + <variable formalParameter="MaxVal"> + <connectionPointIn> + <relPosition x="0" y="66"/> + <connection refLocalId="9"> + <position x="188" y="727"/> + <position x="138" y="727"/> + </connection> + </connectionPointIn> + </variable> + <variable formalParameter="PeriodSeconds"> + <connectionPointIn> + <relPosition x="0" y="97"/> + <connection refLocalId="10"> + <position x="188" y="758"/> + <position x="138" y="758"/> + </connection> + </connectionPointIn> + </variable> + </inputVariables> + <inOutVariables/> + <outputVariables> + <variable formalParameter="Out"> + <connectionPointOut> + <relPosition x="134" y="35"/> + </connectionPointOut> + </variable> + </outputVariables> + </block> + <outVariable localId="7" executionOrderId="0" height="30" width="92" negated="false"> + <position x="421" y="681"/> + <connectionPointIn> + <relPosition x="0" y="15"/> + <connection refLocalId="6" formalParameter="Out"> + <position x="421" y="696"/> + <position x="322" y="696"/> + </connection> + </connectionPointIn> + <expression>Temperature</expression> + </outVariable> + <inVariable localId="8" executionOrderId="0" height="30" width="105" negated="false"> + <position x="33" y="681"/> + <connectionPointOut> + <relPosition x="105" y="15"/> + </connectionPointOut> + <expression>18.0</expression> + </inVariable> + <inVariable localId="9" executionOrderId="0" height="30" width="105" negated="false"> + <position x="33" y="712"/> + <connectionPointOut> + <relPosition x="105" y="15"/> + </connectionPointOut> + <expression>30.0</expression> + </inVariable> + <inVariable localId="10" executionOrderId="0" height="30" width="105" negated="false"> + <position x="33" y="743"/> + <connectionPointOut> + <relPosition x="105" y="15"/> + </connectionPointOut> + <expression>120</expression> + </inVariable> + <block localId="11" typeName="Simulator" instanceName="HumiditySimulation" executionOrderId="0" height="115" width="134"> + <position x="185" y="803"/> + <inputVariables> + <variable formalParameter="MinVal"> + <connectionPointIn> + <relPosition x="0" y="35"/> + <connection refLocalId="13"> + <position x="185" y="838"/> + <position x="135" y="838"/> + </connection> + </connectionPointIn> + </variable> + <variable formalParameter="MaxVal"> + <connectionPointIn> + <relPosition x="0" y="66"/> + <connection refLocalId="14"> + <position x="185" y="869"/> + <position x="135" y="869"/> + </connection> + </connectionPointIn> + </variable> + <variable formalParameter="PeriodSeconds"> + <connectionPointIn> + <relPosition x="0" y="97"/> + <connection refLocalId="15"> + <position x="185" y="900"/> + <position x="135" y="900"/> + </connection> + </connectionPointIn> + </variable> + </inputVariables> + <inOutVariables/> + <outputVariables> + <variable formalParameter="Out"> + <connectionPointOut> + <relPosition x="134" y="35"/> + </connectionPointOut> + </variable> + </outputVariables> + </block> + <outVariable localId="12" executionOrderId="0" height="30" width="92" negated="false"> + <position x="418" y="823"/> + <connectionPointIn> + <relPosition x="0" y="15"/> + <connection refLocalId="11" formalParameter="Out"> + <position x="418" y="838"/> + <position x="319" y="838"/> + </connection> + </connectionPointIn> + <expression>Humidity</expression> + </outVariable> + <inVariable localId="13" executionOrderId="0" height="30" width="105" negated="false"> + <position x="30" y="823"/> + <connectionPointOut> + <relPosition x="105" y="15"/> + </connectionPointOut> + <expression>55.0</expression> + </inVariable> + <inVariable localId="14" executionOrderId="0" height="30" width="105" negated="false"> + <position x="30" y="854"/> + <connectionPointOut> + <relPosition x="105" y="15"/> + </connectionPointOut> + <expression>78.0</expression> + </inVariable> + <inVariable localId="15" executionOrderId="0" height="30" width="105" negated="false"> + <position x="30" y="885"/> + <connectionPointOut> + <relPosition x="105" y="15"/> + </connectionPointOut> + <expression>58</expression> + </inVariable> + <block localId="16" typeName="GT" executionOrderId="0" height="60" width="67"> + <position x="231" y="1103"/> + <inputVariables> + <variable formalParameter="IN1"> + <connectionPointIn> + <relPosition x="0" y="30"/> + <connection refLocalId="18"> + <position x="231" y="1133"/> + <position x="132" y="1133"/> + </connection> + </connectionPointIn> + </variable> + <variable formalParameter="IN2"> + <connectionPointIn> + <relPosition x="0" y="50"/> + <connection refLocalId="22"> + <position x="231" y="1153"/> + <position x="208" y="1153"/> + <position x="208" y="1169"/> + <position x="185" y="1169"/> + </connection> + </connectionPointIn> + </variable> + </inputVariables> + <inOutVariables/> + <outputVariables> + <variable formalParameter="OUT"> + <connectionPointOut> + <relPosition x="67" y="30"/> + </connectionPointOut> + </variable> + </outputVariables> + </block> + <inVariable localId="18" executionOrderId="0" height="30" width="92" negated="false"> + <position x="40" y="1118"/> + <connectionPointOut> + <relPosition x="92" y="15"/> + </connectionPointOut> + <expression>Temperature</expression> + </inVariable> + <block localId="19" typeName="AND" executionOrderId="0" height="60" width="67"> + <position x="347" y="1059"/> + <inputVariables> + <variable formalParameter="IN1" negated="true"> + <connectionPointIn> + <relPosition x="0" y="30"/> + <connection refLocalId="20"> + <position x="347" y="1089"/> + <position x="263" y="1089"/> + <position x="263" y="1074"/> + <position x="145" y="1074"/> + </connection> + </connectionPointIn> + </variable> + <variable formalParameter="IN2"> + <connectionPointIn> + <relPosition x="0" y="50"/> + <connection refLocalId="16" formalParameter="OUT"> + <position x="347" y="1109"/> + <position x="337" y="1109"/> + <position x="337" y="1133"/> + <position x="298" y="1133"/> + </connection> + </connectionPointIn> + </variable> + </inputVariables> + <inOutVariables/> + <outputVariables> + <variable formalParameter="OUT"> + <connectionPointOut> + <relPosition x="67" y="30"/> + </connectionPointOut> + </variable> + </outputVariables> + </block> + <inVariable localId="20" executionOrderId="0" height="30" width="104" negated="false"> + <position x="41" y="1059"/> + <connectionPointOut> + <relPosition x="104" y="15"/> + </connectionPointOut> + <expression>ControlDisable</expression> + </inVariable> + <outVariable localId="21" executionOrderId="0" height="30" width="92" negated="false"> + <position x="468" y="1074"/> + <connectionPointIn> + <relPosition x="0" y="15"/> + <connection refLocalId="19" formalParameter="OUT"> + <position x="468" y="1089"/> + <position x="414" y="1089"/> + </connection> + </connectionPointIn> + <expression>Cooler</expression> + </outVariable> + <inVariable localId="22" executionOrderId="0" height="30" width="146" negated="false"> + <position x="39" y="1154"/> + <connectionPointOut> + <relPosition x="146" y="15"/> + </connectionPointOut> + <expression>TemperatureSetPoint</expression> + </inVariable> + <block localId="17" typeName="LT" executionOrderId="0" height="60" width="67"> + <position x="228" y="1278"/> + <inputVariables> + <variable formalParameter="IN1"> + <connectionPointIn> + <relPosition x="0" y="30"/> + <connection refLocalId="23"> + <position x="228" y="1308"/> + <position x="129" y="1308"/> + </connection> + </connectionPointIn> + </variable> + <variable formalParameter="IN2"> + <connectionPointIn> + <relPosition x="0" y="50"/> + <connection refLocalId="27"> + <position x="228" y="1328"/> + <position x="205" y="1328"/> + <position x="205" y="1344"/> + <position x="182" y="1344"/> + </connection> + </connectionPointIn> + </variable> + </inputVariables> + <inOutVariables/> + <outputVariables> + <variable formalParameter="OUT"> + <connectionPointOut> + <relPosition x="67" y="30"/> + </connectionPointOut> + </variable> + </outputVariables> + </block> + <inVariable localId="23" executionOrderId="0" height="30" width="92" negated="false"> + <position x="37" y="1293"/> + <connectionPointOut> + <relPosition x="92" y="15"/> + </connectionPointOut> + <expression>Temperature</expression> + </inVariable> + <block localId="24" typeName="AND" executionOrderId="0" height="60" width="67"> + <position x="344" y="1234"/> + <inputVariables> + <variable formalParameter="IN1" negated="true"> + <connectionPointIn> + <relPosition x="0" y="30"/> + <connection refLocalId="25"> + <position x="344" y="1264"/> + <position x="260" y="1264"/> + <position x="260" y="1249"/> + <position x="142" y="1249"/> + </connection> + </connectionPointIn> + </variable> + <variable formalParameter="IN2"> + <connectionPointIn> + <relPosition x="0" y="50"/> + <connection refLocalId="17" formalParameter="OUT"> + <position x="344" y="1284"/> + <position x="334" y="1284"/> + <position x="334" y="1308"/> + <position x="295" y="1308"/> + </connection> + </connectionPointIn> + </variable> + </inputVariables> + <inOutVariables/> + <outputVariables> + <variable formalParameter="OUT"> + <connectionPointOut> + <relPosition x="67" y="30"/> + </connectionPointOut> + </variable> + </outputVariables> + </block> + <inVariable localId="25" executionOrderId="0" height="30" width="104" negated="false"> + <position x="38" y="1234"/> + <connectionPointOut> + <relPosition x="104" y="15"/> + </connectionPointOut> + <expression>ControlDisable</expression> + </inVariable> + <outVariable localId="26" executionOrderId="0" height="30" width="92" negated="false"> + <position x="465" y="1249"/> + <connectionPointIn> + <relPosition x="0" y="15"/> + <connection refLocalId="24" formalParameter="OUT"> + <position x="465" y="1264"/> + <position x="411" y="1264"/> + </connection> + </connectionPointIn> + <expression>Heater</expression> + </outVariable> + <inVariable localId="27" executionOrderId="0" height="30" width="146" negated="false"> + <position x="36" y="1329"/> + <connectionPointOut> + <relPosition x="146" y="15"/> + </connectionPointOut> + <expression>TemperatureSetPoint</expression> + </inVariable> + <comment localId="28" height="67" width="229"> + <position x="343" y="734"/> + <content> + <xhtml:p><![CDATA[Simple sensor simulation]]></xhtml:p> + </content> + </comment> + <comment localId="29" height="67" width="229"> + <position x="37" y="978"/> + <content> + <xhtml:p><![CDATA[Climate control]]></xhtml:p> + </content> + </comment> + <comment localId="30" height="464" width="773"> + <position x="14" y="16"/> + <content> + <xhtml:p><![CDATA[This examples shows how to work with BACnet extension. + +Extensions requires native BACnet stack to be installed nearby Beremiz. +Following directory structure is expected: +<Parent directory> + "beremiz" + "BACnet" + +If library is installed elsewhere, then place corresponding paths +in CFLAGS/LDFLAGS in project settings. + +For GNU/Linux to install BACnet library in parent directory run following commands: +$ svn checkout https://svn.code.sf.net/p/bacnet/code/trunk/bacnet-stack/ BACnet +$ cd BACnet +$ make + +After that BACnet extension is ready to be used in Beremiz projects. +BACnet stack implementation contains a lot of test tools. They could be useful during +debugging and BACnet investigation. See "BACnet/bin/readme.txt" for more information about them.]]></xhtml:p> + </content> + </comment> + </FBD> + </body> + </pou> + <pou name="Simulator" pouType="functionBlock"> + <interface> + <outputVars> + <variable name="Out"> + <type> + <REAL/> + </type> + </variable> + </outputVars> + <inputVars> + <variable name="MinVal"> + <type> + <REAL/> + </type> + </variable> + <variable name="MaxVal"> + <type> + <REAL/> + </type> + </variable> + <variable name="PeriodSeconds"> + <type> + <INT/> + </type> + </variable> + </inputVars> + <localVars> + <variable name="TON0"> + <type> + <derived name="TON"/> + </type> + </variable> + <variable name="seconds"> + <type> + <INT/> + </type> + </variable> + <variable name="BaseVal"> + <type> + <REAL/> + </type> + </variable> + <variable name="VarVal"> + <type> + <REAL/> + </type> + </variable> + </localVars> + </interface> + <body> + <ST> + <xhtml:p><![CDATA[(* pseudo-random variations *) +TON0(IN := TRUE, PT := T#3120s); +IF TON0.Q THEN + TON0(IN := FALSE); +END_IF; +seconds := TIME_TO_INT(TON0.ET); + +BaseVal := (MaxVal + MinVal)/2.0; +VarVal := (MaxVal-MinVal)*INT_TO_REAL((seconds MOD PeriodSeconds) - (PeriodSeconds/2))/INT_TO_REAL(PeriodSeconds); + +Out := BaseVal + VarVal;]]></xhtml:p> + </ST> + </body> + </pou> + </pous> + </types> + <instances> + <configurations> + <configuration name="config"> + <resource name="resource1"> + <task name="task0" priority="0" interval="T#20ms"> + <pouInstance name="instance0" typeName="program0"/> + </task> + </resource> + </configuration> + </configurations> + </instances> +</project>