Python Example - Dynamic with GUI

From SysCAD Documentation
Jump to navigation Jump to search

Navigation: User Guide ➔ COM Automation ➔ Python Automation ➔ Example - Dynamic with GUI

Python Setup Python Examples
Installation &
Troubleshooting
Python
Utilities
Basic Usage & Scenarios Constrained FEM
(numpy|scipy|matplotlib)
Optimisation
(COM | scipy tools)
Model Testing
Framework
Dynamic
with GUI
Dynamic
External DLL
Programmatic
Model Generation
Importing data
to SysCAD

Overview

Most of the COM commands are the same for both Steady State and Dynamic. However instead of Probal.Run() we have commands like Dynamic.Start() and Dynamic.Stop().

Here is an example of using Tk (the default python GUI) to create a simple control panel for a Dynamic model.

DynamicTk.png

Running this script will create a Tk window with a slider control which can be used to adjust the capacity of the outflow from the tank. Interaction with a Dynamic model where you are opening and closing valves and turning pumps on and off is much easier with a dedicated GUI interface, and this can be done easily with python.

This example shows a number of features of Tk which is the default GUI for python. The variable Capacity is a Tk DoubleVar, which represents a real number but has other useful features.

  • We can attach a callback function to the variable, so when the variable is changed the function is executed. In this case, the callback function sets the SysCAD tag to the (changed) value of Capacity.
  • Capacity is hooked to to the Scale widget as a variable - so when the scale is moved by dragging with the mouse, the value is changed (and the callback to write the SysCAD tag is initiated.
Capacity = DoubleVar(value = 0)

def capCallback(*args):
    sc[ctrlTag] = Capacity.get()

Capacity.trace("w", capCallback) ## The trace method of a DoubleVar executes the callback argument when the variable is written

Scale(root, orient = HORIZONTAL, variable = Capacity).pack(side=TOP)
  • We also use Capacity in the controller method CtrlLevel, to set the value to either 200 (when the level goes over 90%, or 5, when the level drops to 30% (not a very good level control strategy)
  • When this method is called and control is active, it reads the level and changes the Capacity accordingly. The last thing it does is to schedule another call of itsself after 200ms and thus is repeatedly called.
    root.after(200, CtrlLevel) ## Schedule to call the function again after 200ms
Python Code      
## Example Automation Using python for Dynamic model with GUI.

import syscadif
from tkinter import *
ScdDir = r'C:\SysCAD139'
ScdPrj = r'\ExamplesDynamic\Dynamic Plant Example.spf\Project.spj'

sc = syscadif.SysCADCom()  ## Fire up SysCAD
sc.OpenProject(ScdDir+ScdPrj)  ## Open project 
sc["PID_Lvl.Cfg.[1].On"] = 0  ## Turn of level control
ctrlTag = "Output.FC.Qm.Capacity (t/h)"    ## We will do this by hand...

##  Tk Graphical Interface...
root = Tk()
Capacity = DoubleVar(value = 0)
Auto = BooleanVar(value = False)
pid = None


def capCallback(*args):
    sc[ctrlTag] = Capacity.get()

def Stop():
    sc.Dynamic.Stop()

def Done():
    if pid is not None:
        root.after_cancel(pid)   ## Delete scheduled after command
    sc.Dynamic.Stop()
    sc.Close()
    root.destroy()

def Ctrl():
    global pid
    if Auto.get():
        lvl = sc["REACTION_TANK.Lvl (%)"]
        if lvl>90:
            Capacity.set(200)
        elif lvl<30:
            Capacity.set(5)
    pid = root.after(200, Ctrl)  ## reschedule call in 200ms 
    
    
Capacity.trace("w", capCallback) ## The trace method of a DoubleVar executes the callback argument when the variable is written
 
Label(root, text =  "Capacity Control").pack(side=TOP)
Scale(root, orient = HORIZONTAL, variable = Capacity).pack(side=TOP)
f = Frame(root)
Button(f, text="Run", command = sc.run).pack(side=LEFT, anchor=NW)
Button(f, text="Stop", command = Stop).pack(side=LEFT,anchor=NW)
Button(f, text="Quit", command = Done).pack(side=LEFT,anchor=NW)
Checkbutton(f, text="Auto", variable = Auto).pack(side=LEFT,anchor=NW)
f.pack(side=TOP)
Ctrl()  ## Start control loop
root.mainloop()

Since we turned off the SysCAD level control, you can try doing this manually by adjusting the slider. Alternatively, click the Auto Checkbutton to enable a simple control strategy in the python code. (Bang-Bang Control (see Wikipedia) is not a particularly good control strategy.)

DynamicTk01.png

More

Using python and Tk, you can create elaborate control panels with plotting and many other graphical features. You can even create a button for the machine that goes "ping". (Mandatory Monty Python reference from Meaning of Life)

Dashboard04.png