From 5c4f62d187d105adf4f4186d85448ec75ba1d2b3 Mon Sep 17 00:00:00 2001 From: Jacob Wikmark <jacob@wikmark.se> Date: Fri, 9 Mar 2018 12:35:15 +0100 Subject: [PATCH] formatting --- src/DoubleTank.jl | 80 +++++++++++++++++++++++++---------------------- src/tankdemo.jl | 6 ++-- src/tanklabgui.jl | 12 +++---- 3 files changed, 52 insertions(+), 46 deletions(-) diff --git a/src/DoubleTank.jl b/src/DoubleTank.jl index 307aae8..4747d7c 100644 --- a/src/DoubleTank.jl +++ b/src/DoubleTank.jl @@ -12,7 +12,7 @@ using Parameters #struct BC - #ar::Array{Float64, 1} +#ar::Array{Float64, 1} #end #bc = BC([]) @@ -55,7 +55,7 @@ end function (p::PID)(r, y, onv=(1,1,1)) #The PID should operate entirely on normalized values @unpack b, K, h, Ti, Td, N, y_old, P, I, D, Tot = p - + ad = Td/(N*h+Td) bd = N*K*Td/(N*h+Td) @@ -99,13 +99,13 @@ end mutable struct Pump <: PhysicalProcess h::Float64 stream::LabStream - u::Float64 - v::Float64 + u::Float64 + v::Float64 pid::PID venturirange::Array{Float64, 1} #venturimax::Float64 measure::AnalogInput10V - control::Union{AnalogOutput10V, Void} + control::Union{AnalogOutput10V, Void} end function Pump(stream) @@ -122,22 +122,22 @@ inputrange(p::Pump) = [(0.,1.)] function control(p::Pump, yref) #In the java program this controller runs 5 times faster than the regular one, how do we accomplish this? Do we need to? - p.u = yref + p.u = yref end function initialize(p::Pump) - @async while true - @periodically p.h begin + @async while true + @periodically p.h begin #normalized venturi - #push!(bc.ar, time()) + #push!(bc.ar, time()) venturi = (read(p.measure)-p.venturirange[1])/(p.venturirange[2]-p.venturirange[1]) - flow = sqrt(max(venturi,0.0)) + flow = sqrt(max(venturi,0.0)) p.v = p.pid(p.u, flow, (1,1,0)) - send(p.control, 10*clamp(p.v, 0.0, 1.0)) - end - end + send(p.control, 10*clamp(p.v, 0.0, 1.0)) + end + end end - + measure(p::Pump) = read(p.measure) struct DoubleTank <: PhysicalProcess @@ -150,15 +150,15 @@ struct DoubleTank <: PhysicalProcess end function DoubleTank(; - h::Float64 = 0.05, - stream::LabStream = ComediStream(), - measure = [AnalogInput10V(0), AnalogInput10V(1)], - uprange = [uppertankempty, uppertankfull], - lowrange = [lowertankempty, lowertankfull], - pump::Pump = Pump(stream)) #Change + h::Float64 = 0.05, + stream::LabStream = ComediStream(), + measure = [AnalogInput10V(0), AnalogInput10V(1)], + uprange = [uppertankempty, uppertankfull], + lowrange = [lowertankempty, lowertankfull], + pump::Pump = Pump(stream)) #Change p = DoubleTank(Float64(h),stream,measure, uprange, lowrange, pump) init_devices!(p.stream, p.measure..., pump.measure, pump.control) - initialize(pump) + initialize(pump) p end @@ -171,9 +171,9 @@ end Calibrates the tanks. Sets the pump to max for filltime seconds, during which the flow is measured calpts times. The tank voltage is then measured, when they are presumably full. The pump is then set to min for emptytime and the flow is again measured calpts time. The tank voltage is then again measured, when they're presumably empty. These values are then used to set the parameters for the DoubleTank measure function and the DoubleTank.pump controller. """ function calibrate(p::DoubleTank) - print("Calibrating...\n") + print("Calibrating...\n") filltime = 40 - emptytime = 30 + emptytime = 30 calpts = 20 #Override pump control @@ -190,8 +190,8 @@ function calibrate(p::DoubleTank) fulltanks = read.(p.measure) venturimax = mean(measurements) - print("Upper Full Voltage: $(fulltanks[1])\n") - print("Lower Full Voltage: $(fulltanks[2])\n") + print("Upper Full Voltage: $(fulltanks[1])\n") + print("Lower Full Voltage: $(fulltanks[2])\n") print("Venturi Avg max: $venturimax\n") send(c, 0.0) @@ -201,9 +201,9 @@ function calibrate(p::DoubleTank) end emptytanks = read.(p.measure) venturimin = mean(measurements) - - print("Upper Empty Voltage: $(emptytanks[1])\n") - print("Lower Empty Voltage: $(emptytanks[2])\n") + + print("Upper Empty Voltage: $(emptytanks[1])\n") + print("Lower Empty Voltage: $(emptytanks[2])\n") print("Venturi Avg min: $venturimin\n") p.uprange[1] = emptytanks[1] @@ -214,8 +214,8 @@ function calibrate(p::DoubleTank) #Return pump control p.pump.control = c - print("Finished calibration\n") - nothing + print("Finished calibration\n") + nothing end function calibrate(p::DoubleTankSimulator) @@ -223,13 +223,13 @@ function calibrate(p::DoubleTankSimulator) end function measure(p::DoubleTank) - #This should give an array of two values in the range [0,1] - minv = [p.uprange[1], p.lowrange[1]] - maxv = [p.uprange[2], p.lowrange[2]] + #This should give an array of two values in the range [0,1] + minv = [p.uprange[1], p.lowrange[1]] + maxv = [p.uprange[2], p.lowrange[2]] clamp.((read.(p.measure)-minv)./(maxv-minv), 0.0, 1.0) end - + const AbstractDoubleTank = Union{DoubleTank, DoubleTankSimulator} @@ -246,9 +246,10 @@ function qu(p, u) end function control(p::DoubleTankSimulator, u::Number) - #The simulator should operate on physical values but u should be in [0,1] @unpack a1, a2, g, x, A, h, scale = p x *= scale + #The simulator should operate on physical values but u should be in [0,1] + u = clamp(u, inputrange(p)[1]...) qut = a1*sqrt(2*g*x[1]) #m^3/s @@ -265,8 +266,8 @@ function control(p::DoubleTankSimulator, u::Number) if(-dA2*h>x[2]*A) dA2 = -x[2]*A/h end - x[1] += (dA1*h)/A #m change later - x[2] += (dA2*h)/A #m change later + x[1] += (dA1*h)/A + x[2] += (dA2*h)/A x /= scale @pack p = a1, a2, g, x, A, h @@ -277,5 +278,8 @@ measure(p::DoubleTankSimulator) = p.x + p.σ*p.scale*randn(2) LabProcesses.initialize(p::DoubleTankSimulator) = nothing -#finalize(p::DoubleTankSimulator) = nothing +LabProcesses.finalize(p::DoubleTankSimulator) = nothing + +LabProcesses.initialize(p::DoubleTank) = nothing #change later +LabProcesses.finalize(p::DoubleTank) = nothing #change later diff --git a/src/tankdemo.jl b/src/tankdemo.jl index 58787ef..bbbc219 100644 --- a/src/tankdemo.jl +++ b/src/tankdemo.jl @@ -3,7 +3,7 @@ include("tankgraphic.jl") include("DoubleTank.jl") include("tanklabgui.jl") -const simulated = false +const simulated = true const webservice = true #Just for testing @@ -22,8 +22,10 @@ else end if simulated + print("Running simulated process\n") R = DoubleTankSimulator(σ = 0.001) else + print("Running physical process\n") using LabConnections R = DoubleTank() end @@ -35,7 +37,7 @@ function prbs_experiment(P, gui, pidcontroller, ;amplitude = 1, duration = 10000 y = zeros(0:P.h:duration) u = zeros(0:P.h:duration) n = 1 - #LabProcesses.initialize(P) + LabProcesses.initialize(P) #initialize(P) for (i,t) = enumerate(0:P.h:duration) @periodically P.h begin diff --git a/src/tanklabgui.jl b/src/tanklabgui.jl index 48e9cdd..5557e1d 100644 --- a/src/tanklabgui.jl +++ b/src/tanklabgui.jl @@ -4,7 +4,7 @@ function makegui(P, plottingframerate = 10, guiframerate = 10) boundslower = (-2,2) maxplotlength = 800 gui = GUI() - ptfr = 3.8 #pump to flow ratio, approximate + ptfr = 3.8 #pump to flow ratio, approximate #This allows external access to the r value, the rbox string is parsed into this value rcont, dummygraphic1 = @construct for @@ -28,11 +28,11 @@ function makegui(P, plottingframerate = 10, guiframerate = 10) rbox in textbox(" r "), expcsv in button("Export Data") - rv = obs(r)[] + rv = obs(r)[] if !endswith(rbox, ".") && rbox != "0" try #obs(r).val = parse(Float64, rbox) - rv = parse(Float64, rbox) + rv = parse(Float64, rbox) end if 0.0<rv<1.0 obs(r).val = rv @@ -96,7 +96,7 @@ function makegui(P, plottingframerate = 10, guiframerate = 10) [gui.data[1] gui.data[2] gui.data[3] gui.data[4] gui.data[5] gui.data[6]]) print("Data exported to datatanklab.csv\n") end - + LabGUI.set!(gui, widgets) add!(gui, rcont) add!(gui, w0) @@ -129,7 +129,7 @@ function makegui(P, plottingframerate = 10, guiframerate = 10) gui.widgets[:run], gui.widgets[:cali], gui.widgets[:expcsv]) - + corner_element = setindex_(corner_element, settings_element, 1, 1) corner_element = setindex_(corner_element, p_element, 1, 2) corner_element = setindex_(corner_element, i_element, 1, 3) @@ -139,7 +139,7 @@ function makegui(P, plottingframerate = 10, guiframerate = 10) left_element = setindex_(left_element, graphic2, 2, 1) layout = setindex_(layout, left_element, 1, 1) layout = setindex_(layout, Node(:div, graphic1, dummygraphic1, dummygraphic2, io_element, - attributes = tankattr), 1, 2) + attributes = tankattr), 1, 2) #This makes it look a bit nicer, reducing the width of the right column layout[1][2].props[:style][:width] = "25%" -- GitLab