Skip to content
Snippets Groups Projects
Select Git revision
  • 60e18a665b5b9fa1cc33ef2c2bad3d303d840c65
  • master default protected
  • julia1
  • v0.2.0
  • v0.1.0
5 results

LabProcesses.jl

Forked from processes / LabProcesses.jl
52 commits behind the upstream repository.

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 example 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

  1. Start julia
  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.

How to implement a new process

  1. Locate the file 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 for an example.
  4. 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. 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

stateC = init_sysfilter(C)
function control(i)
    e = r[i]-y[i]
    u = 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).