Commit aadb545e authored by Fredrik Bagge Carlson's avatar Fredrik Bagge Carlson
Browse files

Implement beam

parent 41e269d1
......@@ -36,9 +36,9 @@ function run_control_2DOF(P::AbstractProcess,sysFB, sysFF=nothing; duration = 10
y[:,i] = measure(P)
r[:,i] = reference(t)
u[:,i] = calc_control(i) # y,r must be updated before u
control(P, [clamp.(u[j,i], input_range(P)[j]...) for j=1:nu])
control(P, [clamp.(u[j,i], inputrange(P)[j]...) for j=1:nu])
end
end
finalize(P)
y,u,r
y',u',r'
end
# Interface implementation Ball And Beam ====================================================
export BallAndBeam, BallAndBeamSimulator, BallAndBeamType
export Beam, BeamSimulator, BeamType, BallAndBeam, BallAndBeamSimulator, BeamOrBallAndBeam
struct Beam <: PhysicalProcess
h::Float64
bias::Float64
end
Beam() = Beam(0.01, 0.0)
struct BeamSimulator <: SimulatedProcess
h::Float64
state::Vector{Float64} # angle,ω
end
BeamSimulator() = BeamSimulator(0.01, zeros(2))
struct BallAndBeam <: PhysicalProcess
h::Float64
......@@ -14,22 +26,32 @@ struct BallAndBeamSimulator <: SimulatedProcess
end
BallAndBeamSimulator() = BallAndBeamSimulator(0.01, zeros(4))
const BallAndBeamType = Union{BallAndBeam, BallAndBeamSimulator}
const BeamType = Union{Beam, BeamSimulator}
const BallAndBeamType = Union{BallAndBeam, BallAndBeamSimulator}
const BeamOrBallAndBeam = Union{BeamType, BallAndBeamType}
num_outputs(p::BeamType) = 1
num_outputs(p::BallAndBeamType) = 2
num_inputs(p::BallAndBeamType) = 1
num_inputs(p::BeamOrBallAndBeam)= 1
outputrange(p::Beam) = [(-10,10)]
outputrange(p::BallAndBeamType) = [(-10,10),(-1,1)] # Beam angle, Ball position
inputrange(p::BallAndBeamType) = [(-10,10)]
inputrange(p::BeamOrBallAndBeam)= [(-10,10)]
isstable(p::Beam) = true
isstable(p::BallAndBeamType) = false
isasstable(p::BallAndBeamType) = false
sampletime(p::BallAndBeamType) = p.h
bias(p::BallAndBeam) = p.bias
isasstable(p::BeamOrBallAndBeam) = false
sampletime(p::BeamOrBallAndBeam) = p.h
bias(p::BeamOrBallAndBeam) = p.bias
bias(p::BallAndBeamSimulator) = 0
control(p::BallAndBeam, u) = ccall((:comedi_write, comedipath),Int32,
control(p::BeamOrBallAndBeam, u) = ccall((:comedi_write, comedipath),Int32,
(Int32,Int32,Int32,Int32),0,1,1,num2io(u[1]+p.bias))
measure(p::BallAndBeam) = io2num(ccall((:comedi_read,comedipath), Int32,
measure(p::Beam) = io2num(ccall((:comedi_read,comedipath), Int32,
(Int32,Int32,Int32), 0,0,0))
measure(p::BallAndBeam) = [io2num(ccall((:comedi_read,comedipath), Int32,
(Int32,Int32,Int32), 0,0,i)) for i = 0:1]
control(p::BallAndBeamSimulator, u) = error("Not yet implemented")
measure(p::BallAndBeamSimulator) = [p.state[1], p.state[3]]
......@@ -39,7 +61,7 @@ const conversion = 65535/20
io2num(x) = x/conversion -10 # Converts from io to float
num2io(x) = round(Int32,x*100 + 2048) # Converts from regular number to io
initialize(p::BallAndBeam) = ccall((:comedi_start, comedipath),Int32,(Int32,), 0)
finalize(p::BallAndBeam) = (control(p,0);ccall((:comedi_stop, comedipath),Int32,(Int32,), 0))
initialize(p::BeamOrBallAndBeam) = ccall((:comedi_start, comedipath),Int32,(Int32,), 0)
finalize(p::BeamOrBallAndBeam) = (control(p,0);ccall((:comedi_stop, comedipath),Int32,(Int32,), 0))
initialize(p::BallAndBeamSimulator) = nothing
finalize(p::BallAndBeamSimulator) = nothing
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment