Skip to content
Snippets Groups Projects
Commit aadb545e authored by Fredrik Bagge Carlson's avatar Fredrik Bagge Carlson
Browse files

Implement beam

parent 41e269d1
No related branches found
No related tags found
No related merge requests found
......@@ -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 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment