README.md 3.36 KB
Newer Older
1
# LabProcesses
Fredrik Bagge Carlson's avatar
Fredrik Bagge Carlson committed
2
This package contains an (programming- as well as connection-) interface to serve
Fredrik Bagge Carlson's avatar
Fredrik Bagge Carlson committed
3
as a base for the implementation of lab-process software. The first example of
Fredrik Bagge Carlson's avatar
Fredrik Bagge Carlson committed
4
5
6
7
8
9
10
11
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](https://gitlab.control.lth.se/processes/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 :)
12

Fredrik Bagge Carlson's avatar
Fredrik Bagge Carlson committed
13
14
## Installation
1. Start julia
Fredrik Bagge Carlson's avatar
Fredrik Bagge Carlson committed
15
2. 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.
Fredrik Bagge Carlson's avatar
Fredrik Bagge Carlson committed
16
17
18
19
20
21
22

## How to implement a new process
1. Locate the file [interface.jl](https://gitlab.control.lth.se/processes/LabProcesses.jl/blob/master/src/interface.jl)
2. Copy all function definitions.
3. Create a new file under `/interface_implementations` where you paste all the
copied definitions and implement them. See [`/interface_implementations/ballandbeam.jl`](https://gitlab.control.lth.se/processes/LabProcesses.jl/blob/master/src/interface_implementations/ballandbeam.jl) for an example.
4. Above all function implementations you must define the process type, e.g,
Fredrik Bagge Carlson's avatar
Fredrik Bagge Carlson committed
23
24
25
26
27
28
    ```julia
    struct BallAndBeam <: PhysicalProcess
        h::Float64
    end
    BallAndBeam() = BallAndBeam(0.01) # Constructor with default value of sample time
    ```
Fredrik Bagge Carlson's avatar
Fredrik Bagge Carlson committed
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Make sure you inherit from `PhysicalProcess` or `SimulatedProcess` as appropriate.
5. Documentation of all interface functions is available in the file [interface_documentation.jl](https://gitlab.control.lth.se/processes/LabProcesses.jl/blob/master/src/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`](@ref).

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.
```julia
for (i,t) = enumerate(0:h:duration)
    @periodically h begin
Fredrik Bagge Carlson's avatar
Fredrik Bagge Carlson committed
44
45
46
        y[i] = measure(P)
        r[i] = reference(t)
        u[i] = control(i)
Fredrik Bagge Carlson's avatar
Fredrik Bagge Carlson committed
47
48
49
50
51
52
53
        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`](@ref) is
Fredrik Bagge Carlson's avatar
Fredrik Bagge Carlson committed
54
55
56
provided. This function is used to implement control loops where a signal is
filtered through a dynamical system, i.e., `U(z) = C(z)E(z)`.
Usage is demonstrated below
Fredrik Bagge Carlson's avatar
Fredrik Bagge Carlson committed
57
58
59
```julia
stateC = init_sysfilter(C)
function control(i)
Fredrik Bagge Carlson's avatar
Fredrik Bagge Carlson committed
60
61
    e = r[i]-y[i]
    u = sysfilter!(stateC, C, e)
Fredrik Bagge Carlson's avatar
Fredrik Bagge Carlson committed
62
63
end
```
Fredrik Bagge Carlson's avatar
Fredrik Bagge Carlson committed
64
`C` must here be represented by a [`StateSpace`](http://juliacontrol.github.io/ControlSystems.jl/latest/lib/constructors/#ControlSystems.ss) type from [`ControlSystems.jl`](https://github.com/JuliaControl/ControlSystems.jl).
Fredrik Bagge Carlson's avatar
Fredrik Bagge Carlson committed
65
`TransferFunction` types can easily be converted to a `StateSpace` by `Gss = ss(Gtf)`.