From 7d4d890106ac75b513d84a8eff5733cc46c0fa0d Mon Sep 17 00:00:00 2001 From: Fredrik Bagge Carlson <cont-frb@ulund.org> Date: Wed, 23 Aug 2017 09:52:12 +0200 Subject: [PATCH] No sleep in control loop for simulated process --- src/controllers.jl | 3 ++- src/interface_implementations/ballandbeam.jl | 2 +- src/utilities.jl | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/controllers.jl b/src/controllers.jl index 0d404d7..93a2102 100644 --- a/src/controllers.jl +++ b/src/controllers.jl @@ -30,9 +30,10 @@ function run_control_2DOF(P::AbstractProcess,sysFB, sysFF=nothing; duration = 10 ui + bias(P) end + simulation = isa(P, SimulatedProcess) initialize(P) for (i,t) = enumerate(0:h:duration) - @periodically h begin + @periodically h simulation begin y[:,i] = measure(P) r[:,i] = reference(t) u[:,i] = calc_control(i) # y,r must be updated before u diff --git a/src/interface_implementations/ballandbeam.jl b/src/interface_implementations/ballandbeam.jl index 05543f5..8cee43f 100644 --- a/src/interface_implementations/ballandbeam.jl +++ b/src/interface_implementations/ballandbeam.jl @@ -87,5 +87,5 @@ initialize(p::AbstractBeamOrBallAndBeam) = ccall((:comedi_start, comedipath),Int finalize(p::AbstractBeamOrBallAndBeam) = (control(p,0);ccall((:comedi_stop, comedipath),Int32,(Int32,), 0)) initialize(p::BallAndBeamSimulator) = nothing finalize(p::BallAndBeamSimulator) = nothing -initialize(p::BeamSimulator) = nothing +initialize(p::BeamSimulator) = p.state .*= 0 finalize(p::BeamSimulator) = nothing diff --git a/src/utilities.jl b/src/utilities.jl index 7cff5ca..3dc6230 100644 --- a/src/utilities.jl +++ b/src/utilities.jl @@ -13,6 +13,20 @@ macro periodically(h, body) end end +""" + @periodically(h, simulation::Bool, body) +Ensures that the body is run with an interval of `h >= 0.001` seconds. +If `simulation == false`, no sleep is done +""" +macro periodically(h, simulation, body) + quote + local start_time = time() + $(esc(body)) + local execution_time = time()-start_time + $(esc(simulation)) || sleep(max(0,$(esc(h))-execution_time)) + end +end + """ state = init_sysfilter(sys::StateSpace) Use together with [`sysfilter!`](@ref) -- GitLab