LabProcesses
This package contains an (programming- as well as connection-) interface to serve
as a base for the implementation of lab-process software. The first exampel of
an implementaiton of this interface is for the ball-and-beam process, which is
used in Lab1 FRTN35: frequency response analysis of the beam. The lab is implemented
in BallAndBeam.jl, a
package that makes use of LabProcesses.jl
to handle the communication with
the lab process and/or a simulated version thereof. This way, the code written
for frequency response analysis of the beam can be run on another process
implementing the same interface (or a simulated version) by changeing a single
line of code :)
Installation
- Start julia
- Install LabProcesses.jl using command Pkg.clone("https://gitlab.control.lth.se/processes/LabProcesses.jl.git") Lots of packages will now be installed, this will take some time.
How to implement a new process
- Locate the file interface.jl
- Copy all function definitions.
- Create a new file under
/interface_implementations
where you paste all the copied definitions and implement them. See/interface_implementations/ballandbeam.jl
for an example. - Above all function implementations you must define the process type, e.g,
struct BallAndBeam <: PhysicalProcess
h::Float64
end
BallAndBeam() = BallAndBeam(0.01) # Constructor with default value of sample time
Make sure you inherit from PhysicalProcess
or SimulatedProcess
as appropriate.
5. Documentation of all interface functions is available in the file interface_documentation.jl
Control a process
The interface AbstractProcess
defines the functions control(P, u)
and measure(P)
.
These functions can be used to implement your own control loops. A common loop
with a feedback controller and a feedforward filter on the reference is implemented
in the function run_control_2DOF
.
The macro @periodically
might come in handy if you want to implement your own loop.
Consider the following example, in which the loop body will be run periodically
with a sample time of h
seconds.
for (i,t) = enumerate(0:h:duration)
@periodically h begin
y[i] = measure(P)
r[i] = reference(t)
u[i] = control(i)
control(P, u[i])
end
end
Often one finds the need to implement a stateful controller, i.e., a function
that has a memory or state. To this end, the function sysfilter
is
provided. Usage is demonstrated below
stateC = init_sysfilter(C)
function control(i)
e = r[i]-y[i]
ui = sysfilter!(stateC, C, e)
end
C
must here be represented by a StateSpace
type from ControlSystems.jl
.
TransferFunction
types can easily be converted to a StateSpace
by Gss = ss(Gtf)
.