From 113ec3bc0efd2c411ccd433af491e57bbf40ff42 Mon Sep 17 00:00:00 2001 From: Fredrik Bagge Carlson <cont-frb@ulund.org> Date: Sun, 20 Aug 2017 22:32:07 +0200 Subject: [PATCH] Update readme --- README.md | 62 +++++++++++++++++++++++++++++++++++++++++++++++- src/interface.jl | 1 + 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1c9641c..96ed335 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,63 @@ # 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](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 :) -Under development /Bagge +## 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](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, +```julia +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](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 + 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`](@ref) is +provided. Usage is demonstrated below +```julia +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`](@ref) type from [`ControlSystems.jl`](https://github.com/JuliaControl/ControlSystems.jl). +`TransferFunction` types can easily be converted to a `StateSpace` by `Gss = ss(Gtf)`. diff --git a/src/interface.jl b/src/interface.jl index bff7bd9..065dbd6 100644 --- a/src/interface.jl +++ b/src/interface.jl @@ -16,6 +16,7 @@ abstract type AbstractProcess end abstract type PhysicalProcess <: AbstractProcess end abstract type SimulatedProcess <: AbstractProcess end +## Function definitions ===================================================================== num_outputs(p::AbstractProcess) = error("Function not implemented for $(typeof(p))") num_inputs(p::AbstractProcess) = error("Function not implemented for $(typeof(p))") outputrange(p::AbstractProcess) = error("Function not implemented for $(typeof(p))") -- GitLab