# HG changeset patch # User Edouard Tisserant # Date 1339680252 -7200 # Node ID 7a09e12267a939dc0a968a4388836f90c1055c06 # Parent 169d552a345cccae65b21ed5b38b1ed26ce7cf82# Parent e8a0af6b89d9c59193ff0162ac81721f72090de6 merge diff -r 169d552a345c -r 7a09e12267a9 LPCManager.py --- a/LPCManager.py Thu Jun 14 15:04:08 2012 +0200 +++ b/LPCManager.py Thu Jun 14 15:24:12 2012 +0200 @@ -72,7 +72,7 @@ import targets from LPCtarget import LPC_target targets.targets["LPC"] = {"xsd": os.path.join(_base_path, "LPCtarget", "XSD"), - "class": lambda:LPC_target, + "class": lambda: LPC_target, "code": os.path.join(_base_path,"LPCtarget","plc_LPC_main.c")} targets.toolchains["makefile"] = os.path.join(_base_path, "LPCtarget", "XSD_toolchain_makefile") @@ -81,6 +81,17 @@ misc.opjimg = lambda imgname: os.path.join(_base_folder, "beremiz", "images", imgname+".png") from Beremiz import * + +import features +from POULibrary import POULibrary + +class PLCLibrary(POULibrary): + def GetLibraryPath(self): + return os.path.join(_base_path, "pous.xml") + +features.libraries.append( + ('LPC', lambda: PLCLibrary)) + from ProjectController import ProjectController from ConfigTreeNode import ConfigTreeNode from ProjectNodeEditor import ProjectNodeEditor @@ -585,12 +596,12 @@ if self.GetChildByName("Master") is None: master = self.CTNAddChild("Master", "CanOpenNode", 0) - master.BaseParams.setEnabled(False) + #master.BaseParams.setEnabled(False) master.CTNRequestSave() if self.GetChildByName("Slave") is None: slave = self.CTNAddChild("Slave", "CanOpenSlave", 1) - slave.BaseParams.setEnabled(False) + #slave.BaseParams.setEnabled(False) slave.CTNRequestSave() @@ -605,7 +616,7 @@ @param dst: destination directory """ for i in os.listdir(src): - if not i.startswith('.') and i != "pous.xml": + if not i.startswith('.'): srcpath = os.path.join(src,i) dstpath = os.path.join(dst,i) if os.path.isdir(srcpath): @@ -688,12 +699,6 @@ infos["values"].append(resources) return infos - def ConfNodeLibraryFilePath(self): - if self.OrigBuildPath is not None: - return os.path.join(self.OrigBuildPath, "pous.xml") - else: - return ProjectController.ConfNodeLibraryFilePath(self) - def GetProjectName(self): return self.Project.getname() @@ -856,7 +861,7 @@ if havecanfestival and self.GetChildByName("CanOpen") is None: canopen = self.CTNAddChild("CanOpen", "CanOpen", 0) - canopen.BaseParams.setEnabled(False) + #canopen.BaseParams.setEnabled(False) canopen.LoadChildren() canopen.CTNRequestSave() @@ -1491,12 +1496,12 @@ leftwindowsizer = wx.BoxSizer(wx.HORIZONTAL) leftwindowvsizer.AddSizer(leftwindowsizer, 0, border=0, flag=0) - self.GenerateEnableButton(leftwindow, leftwindowsizer, confnode) + #self.GenerateEnableButton(leftwindow, leftwindowsizer, confnode) st = wx.StaticText(leftwindow, -1) st.SetFont(wx.Font(faces["size"], wx.DEFAULT, wx.NORMAL, wx.BOLD, faceName = faces["helv"])) st.SetLabel(confnode.GetFullIEC_Channel()) - leftwindowsizer.AddWindow(st, 0, border=5, flag=wx.RIGHT) + leftwindowsizer.AddWindow(st, 0, border=5, flag=wx.LEFT|wx.RIGHT) expandbutton_id = wx.NewId() expandbutton = wx.lib.buttons.GenBitmapToggleButton(id=expandbutton_id, bitmap=wx.Bitmap(Bpath( 'images', 'plus.png')), diff -r 169d552a345c -r 7a09e12267a9 pous.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pous.xml Thu Jun 14 15:24:12 2012 +0200 @@ -0,0 +1,551 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns="http://www.plcopen.org/xml/tc6.xsd" + xmlns:xhtml="http://www.w3.org/1999/xhtml" + xsi:schemaLocation="http://www.plcopen.org/xml/tc6.xsd"> + <fileHeader companyName="Beremiz" + productName="Beremiz" + productVersion="0.0" + creationDateTime="2008-12-14T16:53:26"/> + <contentHeader name="LPC POUs" + modificationDateTime="2012-01-20T13:35:46"> + <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="DEW_POINT" pouType="functionBlock"> + <interface> + <inputVars> + <variable name="RH"> + <type> + <REAL/> + </type> + </variable> + <variable name="TEMP"> + <type> + <REAL/> + </type> + </variable> + </inputVars> + <outputVars> + <variable name="DEW_POINT"> + <type> + <REAL/> + </type> + </variable> + </outputVars> + </interface> + <body> + <ST> + <![CDATA[if RH < 0.0 then + RH := 0.0; + end_if; + if RH > 100.0 then + RH := 100.0; + end_if; + DEW_POINT:=sqrt(sqrt(sqrt(RH/100.0)))*(112.0+(0.9*TEMP))+(0.1*TEMP)-112.0;]]> + </ST> + </body> + </pou> + <pou name="GET_RETAIN_DATA" pouType="functionBlock"> + <interface> + <inputVars> + <variable name="INDEX"> + <type> + <UINT/> + </type> + <initialValue> + <simpleValue value="0"/> + </initialValue> + <documentation> +<![CDATA[Index (row) of the retain array.]]> + </documentation> + </variable> + <variable name="READ"> + <type> + <BOOL/> + </type> + <initialValue> + <simpleValue value="FALSE"/> + </initialValue> + </variable> + </inputVars> + <outputVars> + <variable name="WORD1"> + <type> + <UINT/> + </type> + <documentation> +<![CDATA[Data - first column.]]> + </documentation> + </variable> + <variable name="WORD2"> + <type> + <UINT/> + </type> + </variable> + <variable name="WORD3"> + <type> + <UINT/> + </type> + </variable> + <variable name="RD_OK"> + <type> + <BOOL/> + </type> + <initialValue> + <simpleValue value="FALSE"/> + </initialValue> + </variable> + </outputVars> + </interface> + <body> + <ST> +<![CDATA[{ +extern IEC_UINT __GetRetainData(BOOL, IEC_UINT, IEC_UINT); +extern BOOL __GetReadStatus(BOOL); +__SET_VAR(data__->,WORD1,__GetRetainData(__GET_VAR(data__->READ),__GET_VAR(data__->INDEX),0)); +__SET_VAR(data__->,WORD2,__GetRetainData(__GET_VAR(data__->READ),__GET_VAR(data__->INDEX),1)); +__SET_VAR(data__->,WORD3,__GetRetainData(__GET_VAR(data__->READ),__GET_VAR(data__->INDEX),2)); +__SET_VAR(data__->,RD_OK,__GetReadStatus(0)); +}]]> + </ST> + </body> + </pou> + <pou name="SET_RETAIN_DATA" pouType="functionBlock"> + <interface> + <inputVars> + <variable name="INDEX"> + <type> + <UINT/> + </type> + <initialValue> + <simpleValue value="0"/> + </initialValue> + </variable> + <variable name="WRITE"> + <type> + <BOOL/> + </type> + <initialValue> + <simpleValue value="FALSE"/> + </initialValue> + </variable> + <variable name="WORD1"> + <type> + <UINT/> + </type> + </variable> + <variable name="WORD2"> + <type> + <UINT/> + </type> + </variable> + <variable name="WORD3"> + <type> + <UINT/> + </type> + </variable> + </inputVars> + <outputVars> + <variable name="WR_OK"> + <type> + <BOOL/> + </type> + <initialValue> + <simpleValue value="FALSE"/> + </initialValue> + </variable> + </outputVars> + </interface> + <body> + <ST> +<![CDATA[{ +extern BOOL __SetRetainData(BOOL, IEC_UINT, IEC_UINT, IEC_UINT, IEC_UINT); +__SET_VAR(data__->,WR_OK,__SetRetainData(__GET_VAR(data__->WRITE),__GET_VAR(data__->INDEX),__GET_VAR(data__->WORD1),__GET_VAR(data__->WORD2),__GET_VAR(data__->WORD3))); +}]]> + </ST> + </body> + </pou> + <pou name="FIND_RETAIN_DATA" pouType="functionBlock"> + <interface> + <outputVars> + <variable name="FOUND"> + <type> + <BOOL/> + </type> + <initialValue> + <simpleValue value="False"/> + </initialValue> + </variable> + <variable name="INDEX"> + <type> + <UINT/> + </type> + </variable> + </outputVars> + <inputVars> + <variable name="START_IDX"> + <type> + <UINT/> + </type> + <initialValue> + <simpleValue value="0"/> + </initialValue> + </variable> + <variable name="END_IDX"> + <type> + <UINT/> + </type> + <initialValue> + <simpleValue value="0"/> + </initialValue> + </variable> + <variable name="SEARCH"> + <type> + <BOOL/> + </type> + <initialValue> + <simpleValue value="False"/> + </initialValue> + </variable> + <variable name="WORD1"> + <type> + <UINT/> + </type> + </variable> + <variable name="WORD2"> + <type> + <UINT/> + </type> + </variable> + <variable name="WORD3"> + <type> + <UINT/> + </type> + </variable> + </inputVars> + </interface> + <body> + <ST> +<![CDATA[{ +extern BOOL __FindRetainData(BOOL, IEC_UINT, IEC_UINT, IEC_UINT, IEC_UINT, IEC_UINT); +extern IEC_UINT __GetFoundIndex(BOOL); +__SET_VAR(data__->,FOUND,__FindRetainData(__GET_VAR(data__->SEARCH),__GET_VAR(data__->START_IDX),__GET_VAR(data__->END_IDX),__GET_VAR(data__->WORD1),__GET_VAR(data__->WORD2),__GET_VAR(data__->WORD3))); +__SET_VAR(data__->,INDEX,__GetFoundIndex(0)); +}]]> + </ST> + </body> + </pou> + <pou name="PID_A" pouType="functionBlock"> + <interface> + <inputVars> + <variable name="SET_POINT"> + <type> + <REAL/> + </type> + </variable> + </inputVars> + <localVars> + <variable name="ena"> + <type> + <INT/> + </type> + <initialValue> + <simpleValue value="1"/> + </initialValue> + </variable> + </localVars> + <inputVars> + <variable name="ACTUAL_VALUE"> + <type> + <REAL/> + </type> + </variable> + <variable name="REVERSE"> + <type> + <BOOL/> + </type> + </variable> + <variable name="HOLD"> + <type> + <BOOL/> + </type> + </variable> + <variable name="MANUAL"> + <type> + <BOOL/> + </type> + </variable> + <variable name="MANUAL_REF"> + <type> + <REAL/> + </type> + </variable> + <variable name="Kp_GAIN"> + <type> + <REAL/> + </type> + </variable> + <variable name="Ki_GAIN"> + <type> + <REAL/> + </type> + </variable> + <variable name="Kd_GAIN"> + <type> + <REAL/> + </type> + </variable> + <variable name="Td_FADEOUT"> + <type> + <TIME/> + </type> + <initialValue> + <simpleValue value="t#1s"/> + </initialValue> + </variable> + <variable name="DEAD_BAND"> + <type> + <REAL/> + </type> + </variable> + <variable name="OUT_MAX"> + <type> + <REAL/> + </type> + </variable> + <variable name="OUT_MIN"> + <type> + <REAL/> + </type> + </variable> + <variable name="CYCLE_TIME"> + <type> + <TIME/> + </type> + <initialValue> + <simpleValue value="t#0.1s"/> + </initialValue> + </variable> + </inputVars> + <outputVars> + <variable name="OUT"> + <type> + <REAL/> + </type> + </variable> + </outputVars> + <localVars> + <variable name="D_fadeout"> + <type> + <REAL/> + </type> + </variable> + <variable name="Error_n"> + <type> + <REAL/> + </type> + <initialValue> + <simpleValue value="0.0"/> + </initialValue> + </variable> + <variable name="Error_n1"> + <type> + <REAL/> + </type> + <initialValue> + <simpleValue value="0.0"/> + </initialValue> + </variable> + <variable name="Error_n2"> + <type> + <REAL/> + </type> + <initialValue> + <simpleValue value="0.0"/> + </initialValue> + </variable> + <variable name="Dout_n"> + <type> + <REAL/> + </type> + <initialValue> + <simpleValue value="0.0"/> + </initialValue> + </variable> + <variable name="Dout"> + <type> + <REAL/> + </type> + <initialValue> + <simpleValue value="0.0"/> + </initialValue> + </variable> + <variable name="Dout_1"> + <type> + <REAL/> + </type> + <initialValue> + <simpleValue value="0.0"/> + </initialValue> + </variable> + <variable name="TON_1"> + <type> + <derived name="TON"/> + </type> + </variable> + <variable name="TON_1_Q"> + <type> + <BOOL/> + </type> + </variable> + <variable name="ET1"> + <type> + <TIME/> + </type> + </variable> + <variable name="CTr"> + <type> + <REAL/> + </type> + </variable> + <variable name="FTr"> + <type> + <REAL/> + </type> + </variable> + <variable name="power"> + <type> + <REAL/> + </type> + </variable> + <variable name="OUTchk"> + <type> + <REAL/> + </type> + </variable> + <variable name="Dout_int"> + <type> + <REAL/> + </type> + </variable> + <variable name="Reverse_1"> + <type> + <BOOL/> + </type> + </variable> + <variable name="Soft_t"> + <type> + <BOOL/> + </type> + </variable> + <variable name="R_chk"> + <type> + <INT/> + </type> + </variable> + </localVars> + </interface> + <body> + <ST> +<![CDATA[TON_1( + IN := NOT TON_1_Q, + PT := CYCLE_TIME, + Q => TON_1_Q, + ET => ET1 + ); +if TON_1_Q then + if REVERSE then + Error_n := SET_POINT - ACTUAL_VALUE; + else + Error_n := ACTUAL_VALUE - SET_POINT; + end_if; + if Td_FADEOUT <= T#0.05s then + Td_FADEOUT := t#0.05s; + end_if; + CTr := TIME_TO_REAL (CYCLE_TIME); + FTr := TIME_TO_REAL (Td_FADEOUT); + power := CTr / FTr; + D_Fadeout := EXPT( 0.04979 , power ); (*time to reach 5% = e^(-3) *) + Dout := Kd_GAIN * (Error_n - 2.0 * Error_n1 + Error_n2); + Dout_n := Dout + Dout_1 * D_Fadeout; + Dout_int := Dout_int + Dout_n; + OUTchk := OUTchk + Kp_GAIN * (Error_n - Error_n1) + Ki_GAIN * Error_n * CTr; + R_chk:= bool_to_int(REVERSE) + bool_to_int(Reverse_1); + if (Soft_t or R_chk=1) then + Dout_int := 0.0; + Dout_n := 0.0; + Dout_1:= 0.0; + Dout:= 0.0; + OUTchk:= OUT; + Error_n1:=Error_n; + Error_n2:=Error_n; + Soft_t := 0; + end_if; + if R_chk =1 then + Error_n:=0.0; + Soft_t := True; + end_if; + + if OUTchk > OUT_MAX then + OUTchk := OUT_MAX; + end_if; + + if OUTchk < OUT_MIN then + OUTchk := OUT_MIN; + end_if; + + if MANUAL then + OUT := MANUAL_REF; + OUTchk:= OUT; + Dout_int := 0.0; + Dout_n := 0.0; + Dout_1:= 0.0; + else + if abs(Error_n) < DEAD_BAND or HOLD then + OUT := OUT; + OUTchk:= OUT; + Dout_int := 0.0; + Dout_n := 0.0; + Dout_1:= 0.0; + else + OUT := OUTchk + Dout_int; + end_if; + end_if; + + if OUT > OUT_MAX then + OUT := OUT_MAX; + end_if; + + if OUT < OUT_MIN then + OUT := OUT_MIN; + end_if; + + Error_n2 := Error_n1; + Error_n1 := Error_n; + Dout_1:=Dout_n; + Reverse_1 := REVERSE; +else + OUT:=OUT; +end_if;]]> + </ST> + </body> + </pou> + </pous> + </types> + <instances> + <configurations/> + </instances> +</project>