Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • furuta
  • julia1
  • master
  • v0.1.0
  • v0.2.0
5 results

Target

Select target project
  • processes/LabProcesses.jl
  • martinheyden/LabProcesses.jl
2 results
Select Git revision
  • julia1
  • master
  • v0.1.0
  • v0.2.0
4 results
Show changes
Commits on Source (5)
## News
2018-12-07: Updated to julia v1.0, see commit eac09291 for last julia v0.6 version
[![pipeline status](https://gitlab.control.lth.se/processes/LabProcesses.jl/badges/master/pipeline.svg)](https://gitlab.control.lth.se/processes/LabProcesses.jl/commits/master) [![pipeline status](https://gitlab.control.lth.se/processes/LabProcesses.jl/badges/master/pipeline.svg)](https://gitlab.control.lth.se/processes/LabProcesses.jl/commits/master)
[![coverage report](https://gitlab.control.lth.se/processes/LabProcesses.jl/badges/master/coverage.svg)](https://gitlab.control.lth.se/processes/LabProcesses.jl/commits/master) [![coverage report](https://gitlab.control.lth.se/processes/LabProcesses.jl/badges/master/coverage.svg)](https://gitlab.control.lth.se/processes/LabProcesses.jl/commits/master)
......
julia 0.6 julia 0.7
ControlSystems ControlSystems
Parameters Parameters
DSP
# __precompile__() # __precompile__()
using Pkg
installed_packages = Pkg.installed() installed_packages = Pkg.installed()
if "LabConnections" keys(installed_packages) if "LabConnections" keys(installed_packages)
Pkg.clone("https://gitlab.control.lth.se/cont-frb/LabConnections.jl") Pkg.clone("https://gitlab.control.lth.se/cont-frb/LabConnections.jl")
...@@ -8,7 +9,7 @@ end ...@@ -8,7 +9,7 @@ end
module LabProcesses module LabProcesses
using ControlSystems, LabConnections.Computer, Parameters using ControlSystems, LabConnections.Computer, Parameters, DSP, LinearAlgebra
include("utilities.jl") include("utilities.jl")
......
...@@ -27,16 +27,16 @@ function run_control_2DOF(P::AbstractProcess,sysFB, sysFF=nothing; duration = 10 ...@@ -27,16 +27,16 @@ function run_control_2DOF(P::AbstractProcess,sysFB, sysFF=nothing; duration = 10
rf = sysFF == nothing ? r[:,i] : Gff(r[:,i]) rf = sysFF == nothing ? r[:,i] : Gff(r[:,i])
e = rf-y[:,i] e = rf-y[:,i]
ui = Gfb(e) ui = Gfb(e)
ui + bias(P) ui .+ bias(P)
end end
simulation = isa(P, SimulatedProcess) simulation = isa(P, SimulatedProcess)
initialize(P) initialize(P)
for (i,t) = enumerate(0:h:duration) for (i,t) = enumerate(0:h:duration)
@periodically h simulation begin @periodically h simulation begin
y[:,i] = measure(P) y[:,i] .= measure(P)
r[:,i] = reference(t) r[:,i] .= reference(t)
u[:,i] = calc_control(i) # y,r must be updated before u u[:,i] .= calc_control(i) # y,r must be updated before u
control(P, [clamp.(u[j,i], inputrange(P)[j]...) for j=1:nu]) control(P, [clamp.(u[j,i], inputrange(P)[j]...) for j=1:nu])
end end
end end
......
...@@ -48,7 +48,7 @@ const beam_system, nice_beam_controller = define_beam_system() ...@@ -48,7 +48,7 @@ const beam_system, nice_beam_controller = define_beam_system()
struct BeamSimulator <: SimulatedProcess struct BeamSimulator <: SimulatedProcess
h::Float64 h::Float64
s::SysFilter s::SysFilter
BeamSimulator(;h::Real = 0.01) = new(Float64(h), SysFilter(beam_system, h)) BeamSimulator(;h::Real = 0.01, bias=0) = new(Float64(h), SysFilter(beam_system, h))
end end
struct BallAndBeam <: PhysicalProcess struct BallAndBeam <: PhysicalProcess
...@@ -96,7 +96,7 @@ bias(p::BallAndBeamSimulator) = 0 ...@@ -96,7 +96,7 @@ bias(p::BallAndBeamSimulator) = 0
function control(p::AbstractBeamOrBallAndBeam, u::AbstractArray) function control(p::AbstractBeamOrBallAndBeam, u::AbstractArray)
length(u) == 1 || error("Process $(typeof(p)) only accepts one control signal, tried to send u=$u.") length(u) == 1 || error("Process $(typeof(p)) only accepts one control signal, tried to send u=$u.")
send(p.control,u[1]) control(p,u[1])
end end
control(p::AbstractBeamOrBallAndBeam, u::Number) = send(p.control,u) control(p::AbstractBeamOrBallAndBeam, u::Number) = send(p.control,u)
control(p::BeamSimulator, u::Number) = p.s(u) control(p::BeamSimulator, u::Number) = p.s(u)
...@@ -104,7 +104,7 @@ control(p::BallAndBeamSimulator, u::Number) = error("Not yet implemented") ...@@ -104,7 +104,7 @@ control(p::BallAndBeamSimulator, u::Number) = error("Not yet implemented")
measure(p::Beam) = read(p.measure) measure(p::Beam) = read(p.measure)
measure(p::BallAndBeam) = [read(p.measure1), read(p.measure2)] measure(p::BallAndBeam) = [read(p.measure1), read(p.measure2)]
measure(p::BeamSimulator) = vecdot(p.s.sys.C,p.s.state) measure(p::BeamSimulator) = dot(p.s.sys.C,p.s.state)
measure(p::BallAndBeamSimulator) = error("Not yet implemented") measure(p::BallAndBeamSimulator) = error("Not yet implemented")
......
using ControlSystems using ControlSystems, DSP
""" """
beammodel, beamcontroller = define_beam_system(;doplot=false) beammodel, beamcontroller = define_beam_system(;doplot=false)
......
...@@ -9,7 +9,7 @@ macro periodically(h, body) ...@@ -9,7 +9,7 @@ macro periodically(h, body)
local start_time = time() local start_time = time()
$(esc(body)) $(esc(body))
local execution_time = time()-start_time local execution_time = time()-start_time
sleep(max(0,$(esc(h))-execution_time)) Libc.systemsleep(max(0,$(esc(h))-execution_time))
end end
end end
...@@ -37,22 +37,22 @@ Create a SysFilter object that can be used to implement control loops and simula ...@@ -37,22 +37,22 @@ Create a SysFilter object that can be used to implement control loops and simula
with LTI systems, i.e., `U(z) = C(z)E(z)`. To filter a signal `u` through the filter, with LTI systems, i.e., `U(z) = C(z)E(z)`. To filter a signal `u` through the filter,
call like `y = Csf(u)`. Calculates the filtered output `y` in `y = Cx+Du, x'=Ax+Bu` call like `y = Csf(u)`. Calculates the filtered output `y` in `y = Cx+Du, x'=Ax+Bu`
""" """
struct SysFilter struct SysFilter{T<:StateSpace}
sys::StateSpace sys::T
state::Vector{Float64} state::Vector{Float64}
function SysFilter(sys::StateSpace, state::AbstractVector) function SysFilter(sys::StateSpace, state::AbstractVector)
@assert !ControlSystems.iscontinuous(sys) "Can not filter using continuous time model." @assert !ControlSystems.iscontinuous(sys) "Can not filter using continuous time model."
@assert length(state) == sys.nx "length(state) != sys.nx" @assert length(state) == sys.nx "length(state) != sys.nx"
new(sys, state) new{typeof(sys)}(sys, state)
end end
function SysFilter(sys::StateSpace) function SysFilter(sys::StateSpace)
@assert !ControlSystems.iscontinuous(sys) "Can not filter using continuous time model. Supply sample time." @assert !ControlSystems.iscontinuous(sys) "Can not filter using continuous time model. Supply sample time."
new(sys, init_sysfilter(sys)) new{typeof(sys)}(sys, init_sysfilter(sys))
end end
function SysFilter(sys::StateSpace, h::Real) function SysFilter(sys::StateSpace, h::Real)
@assert ControlSystems.iscontinuous(sys) "Sample time supplied byt system model is already in discrete time." @assert ControlSystems.iscontinuous(sys) "Sample time supplied byt system model is already in discrete time."
sysd = c2d(sys, h)[1] sysd = c2d(sys, h)[1]
new(sysd, init_sysfilter(sysd)) new{typeof(sysd)}(sysd, init_sysfilter(sysd))
end end
end end
(s::SysFilter)(input) = sysfilter!(s.state, s.sys, input) (s::SysFilter)(input) = sysfilter!(s.state, s.sys, input)
......
using LabProcesses, ControlSystems using LabProcesses, ControlSystems, DSP
using Base.Test using Test
# Reference generators # Reference generators
r = PRBSGenerator(Int(4)) r = PRBSGenerator(Int(4))
......