Opened 18 years ago
Closed 12 years ago
#108 closed defect (fixed)
OMC crashes when plotting
Reported by: | miguel.prada.sarasola | Owned by: | miguel.prada.sarasola |
---|---|---|---|
Priority: | critical | Milestone: | |
Component: | OMNotebook | Version: | |
Keywords: | Cc: | miguel.prada.sarasola, Adrian Pop |
Description (last modified by )
package MediaPath package Interfaces connector PaperCut Modelica.SIunits.Position pos; flow Modelica.SIunits.Force F; end PaperCut; partial model Paper PaperCut cut_a,cut_b; Modelica.SIunits.Force F; Modelica.SIunits.Length pos_rel; equation pos_rel=cut_a.pos - cut_b.pos; cut_a.F=F; cut_b.F=-F; end Paper; partial model Roller extends Modelica.Mechanics.Rotational.Interfaces.Rigid(phi(start=0)); parameter Modelica.SIunits.Inertia J=1; parameter Modelica.SIunits.Radius r=1; Modelica.SIunits.AngularVelocity w(start=0); Modelica.SIunits.AngularAcceleration a; Modelica.SIunits.Position tanPos; Modelica.SIunits.Velocity tanVel; equation w=der(phi); a=der(w); tanPos=phi*r; tanVel=w*r; end Roller; end Interfaces; model DriveRoller extends Interfaces.Roller; Interfaces.PaperCut cut_a,cut_b; equation cut_a.pos=phi*r; cut_b.pos=phi*r; J*a=flange_a.tau + flange_b.tau + cut_a.F*r + cut_b.F*r; end DriveRoller; model PaperRoll extends Interfaces.Roller; Interfaces.PaperCut cut_b; equation cut_b.pos=phi*r; J*a=flange_a.tau + flange_b.tau + cut_b.F*r; end PaperRoll; model Cardboard extends Interfaces.Paper; equation pos_rel=0; end Cardboard; model RealPaper extends Interfaces.Paper; parameter Real k=1; equation F=if pos_rel > 0 then 0 else pos_rel*k; end RealPaper; end MediaPath; package Control block PID extends Modelica.Blocks.Interfaces.SISO; parameter Real Kp=1,Kd=1; Modelica.Blocks.Math.Gain proportional(k=Kp),derivative(k=Kd); Modelica.Blocks.Continuous.Der derivator; Modelica.Blocks.Math.Add sum; equation connect(u,derivator.u); connect(u,proportional.u); connect(derivator.y,derivative.u); connect(proportional.y,sum.u1); connect(derivative.y,sum.u2); connect(sum.y,y); end PID; block DiscretePID extends Modelica.Blocks.Interfaces.DiscreteSISO; parameter Real Kp=1,Kd=1; Real verr; equation verr=der(u); when {sampleTrigger,initial()} then y=(Kp*u + Kd*verr)/128; end when; end DiscretePID; model PWMGenerator Modelica.Blocks.Interfaces.RealInput u; Modelica.Electrical.Analog.Interfaces.Pin p,n; parameter Real gain=1; equation p.v - n.v=u*gain; p.i + n.i=0; end PWMGenerator; model PWMSaturation Modelica.Blocks.Interfaces.RealInput u; Modelica.Electrical.Analog.Interfaces.Pin p,n; parameter Real gain=1; parameter Real saturation=42; equation p.v - n.v=if u*gain > saturation then saturation else if u*gain < -saturation then -saturation else u*gain; p.i + n.i=0; end PWMSaturation; model LowPassFilter parameter Real T=1; Modelica.Blocks.Interfaces.RealInput u; Modelica.Blocks.Interfaces.RealOutput y; equation T*der(y) + y=u; end LowPassFilter; model Servo parameter Real KP=1800,KD=6000; parameter Real MotorJ=0.0001,MotorTorqueK=0.078,MotorResistance=7.1,MotorInductance=0.1; Modelica.Mechanics.Rotational.Interfaces.Flange_b flange_b; Modelica.Blocks.Interfaces.RealInput u; Modelica.Blocks.Math.Add comparator(k2=-1); PID pid(Kp=KP,Kd=KD); PWMSaturation pwm; Modelica.Electrical.Analog.Basic.Ground ground; DCMotor motor(load.J=MotorJ,emf1.k=MotorTorqueK,r1.R=MotorResistance,i1.L=MotorInductance); Modelica.Mechanics.Rotational.Sensors.AngleSensor encoder; equation connect(u,comparator.u1); connect(comparator.y,pid.u); connect(pid.y,pwm.u); connect(pwm.p,motor.p); connect(pwm.n,motor.n); connect(motor.n,ground.p); connect(motor.flange_b,encoder.flange_a); connect(encoder.phi,comparator.u2); connect(motor.flange_b,flange_b); end Servo; model ServoWithIdealGear parameter Real KP=1800,KD=6000; parameter Real MotorJ=0.0001,MotorTorqueK=0.078,MotorResistance=7.1,MotorInductance=0.1; parameter Real GearRatio=40; Modelica.Mechanics.Rotational.Interfaces.Flange_b flange_b; Modelica.Blocks.Interfaces.RealInput u; Modelica.Blocks.Math.Add comparator(k2=-1); PID pid(Kp=KP,Kd=KD); PWMSaturation pwm; Modelica.Electrical.Analog.Basic.Ground ground; DCMotor motor(load.J=MotorJ,emf1.k=MotorTorqueK,r1.R=MotorResistance,i1.L=MotorInductance); Modelica.Mechanics.Rotational.IdealGear gear(ratio=GearRatio); Modelica.Mechanics.Rotational.Sensors.AngleSensor encoder; equation connect(u,comparator.u1); connect(comparator.y,pid.u); connect(pid.y,pwm.u); connect(pwm.p,motor.p); connect(pwm.n,motor.n); connect(motor.n,ground.p); connect(motor.flange_b,gear.flange_a); connect(gear.flange_b,encoder.flange_a); connect(encoder.phi,comparator.u2); connect(gear.flange_b,flange_b); end ServoWithIdealGear; model ServoWithGear parameter Real KP=1800,KD=6000; parameter Real MotorJ=0.0001,MotorTorqueK=0.078,MotorResistance=7.1,MotorInductance=0.1; parameter Real GearRatio=40; parameter Real BacklashAmplitude=0.01,BacklashDamping=10; Modelica.Mechanics.Rotational.Interfaces.Flange_b flange_b; Modelica.Blocks.Interfaces.RealInput u; Modelica.Blocks.Math.Add comparator(k2=-1); PID pid(Kp=KP,Kd=KD); PWMSaturation pwm; Modelica.Electrical.Analog.Basic.Ground ground; DCMotor motor(load.J=MotorJ,emf1.k=MotorTorqueK,r1.R=MotorResistance,i1.L=MotorInductance); Modelica.Mechanics.Rotational.IdealGear gear(ratio=GearRatio); Modelica.Mechanics.Rotational.ElastoBacklash backlash(b=BacklashAmplitude,d=BacklashDamping); Modelica.Mechanics.Rotational.Sensors.AngleSensor encoder; equation connect(u,comparator.u1); connect(comparator.y,pid.u); connect(pid.y,pwm.u); connect(pwm.p,motor.p); connect(pwm.n,motor.n); connect(motor.n,ground.p); connect(motor.flange_b,gear.flange_a); connect(gear.flange_b,backlash.flange_a); connect(backlash.flange_b,encoder.flange_a); connect(encoder.phi,comparator.u2); connect(backlash.flange_b,flange_b); end ServoWithGear; model DiscreteServoWithGear parameter Real KP=1800,KD=6000; parameter Real MotorJ=0.0001,MotorTorqueK=0.078,MotorResistance=7.1,MotorInductance=0.1; parameter Real GearRatio=40; parameter Real BacklashAmplitude=0.01,BacklashDamping=10; parameter Real SamplerPeriod=0.0012; Modelica.Mechanics.Rotational.Interfaces.Flange_b flange_b; Modelica.Blocks.Interfaces.RealInput u; Modelica.Blocks.Math.Add comparator(k2=-1); DiscretePID pid(Kp=KP,Kd=KD,samplePeriod=SamplerPeriod); PWMSaturation pwm; Modelica.Electrical.Analog.Basic.Ground ground; DCMotor motor(load.J=MotorJ,emf1.k=MotorTorqueK,r1.R=MotorResistance,i1.L=MotorInductance); Modelica.Mechanics.Rotational.IdealGear gear(ratio=GearRatio); Modelica.Mechanics.Rotational.ElastoBacklash backlash(b=BacklashAmplitude,d=BacklashDamping); Modelica.Mechanics.Rotational.Sensors.AngleSensor encoder; equation connect(u,comparator.u1); connect(comparator.y,pid.u); connect(pid.y,pwm.u); connect(pwm.p,motor.p); connect(pwm.n,motor.n); connect(motor.n,ground.p); connect(motor.flange_b,gear.flange_a); connect(gear.flange_b,backlash.flange_a); connect(backlash.flange_b,encoder.flange_a); connect(encoder.phi,comparator.u2); connect(backlash.flange_b,flange_b); end DiscreteServoWithGear; model ServoWithFilter parameter Real KP=1800,KD=6000; parameter Real MotorJ=0.0001,MotorTorqueK=0.078,MotorResistance=7.1,MotorInductance=0.1; Modelica.Mechanics.Rotational.Interfaces.Flange_b flange_b; Modelica.Blocks.Interfaces.RealInput u; Modelica.Blocks.Math.Add comparator(k2=-1); PID pid(Kp=KP,Kd=KD); LowPassFilter filter; PWMSaturation pwm; Modelica.Electrical.Analog.Basic.Ground ground; DCMotor motor(load.J=MotorJ,emf1.k=MotorTorqueK,r1.R=MotorResistance,i1.L=MotorInductance); Modelica.Mechanics.Rotational.Sensors.AngleSensor encoder; equation connect(u,comparator.u1); connect(comparator.y,pid.u); connect(pid.y,filter.u); connect(filter.y,pwm.u); connect(pwm.p,motor.p); connect(pwm.n,motor.n); connect(motor.n,ground.p); connect(motor.flange_b,encoder.flange_a); connect(encoder.phi,comparator.u2); connect(motor.flange_b,flange_b); end ServoWithFilter; model SpeedTrapezium import SI = Modelica.SIunits; extends Modelica.Blocks.Interfaces.SO; parameter Real acc=1,dec=1; parameter SI.Length adv=1; parameter SI.Velocity vel=1; parameter SI.Time startTime=0; SI.Time tAcc,tSlew,tDec; equation tAcc=vel/acc; tDec=vel/dec; tSlew=if ((tAcc + tDec)*vel)/2 >= adv then 0 else (adv - ((tAcc + tDec)*vel)/2)/vel; y=if time <= startTime then 0 else if time <= startTime + tAcc then (time - startTime)*acc else if time <= startTime + tAcc + tSlew then vel else if time <= startTime + tAcc + tSlew + tDec then vel - (time - startTime - tAcc + tSlew)*dec else 0; end SpeedTrapezium; end Control; model DCMotor Modelica.Electrical.Analog.Interfaces.Pin p,n; Modelica.Mechanics.Rotational.Interfaces.Flange_b flange_b; Modelica.Electrical.Analog.Basic.Resistor r1(R=10); Modelica.Electrical.Analog.Basic.Inductor i1; Modelica.Electrical.Analog.Basic.EMF emf1; Modelica.Mechanics.Rotational.Inertia load; equation connect(p,r1.p); connect(r1.n,i1.p); connect(i1.n,emf1.p); connect(emf1.n,n); connect(emf1.flange_b,load.flange_a); connect(load.flange_b,flange_b); end DCMotor; model Test1 Control.SpeedTrapezium trapezium(adv=0.1016,vel=0.100228); Control.DiscreteServoWithGear servo(KD=1000); MediaPath.DriveRoller driveRoller(J=0.00365); equation connect(trapezium.y,servo.u); connect(servo.flange_b,driveRoller.flange_a); end Test1;
Attachments (2)
Change History (9)
comment:1 by , 18 years ago
comment:3 by , 18 years ago
The notebook does not contain the DiscreteServoWithGear model. Please send
complete model.
comment:5 by , 14 years ago
The result file is only 12MB, but my OMNotebook started using 7GB of RAM after executing the simulate command on this model...
comment:6 by , 12 years ago
Component: | → OMNotebook |
---|---|
Description: | modified (diff) |
comment:7 by , 12 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
You need to load Modelica 2.2 in order to make this code work.
A lot of things has changed now. The now plotting is available in OMNotebook which handles this issue without any problem.
Note:
See TracTickets
for help on using tickets.
When I simulate a discrete time system during 2 seconds with 20,000 intervals (I
do this because the servo sampling period is of 0.0012s and I thought simulation
intervals should be shorter) the simulation goes fine -or so it seems-, but when
I try to plot results, a message appears on OMNotebook saying that the
connection with OMC is lost. In fact I can see on the windows task manager that
omc.exe process exits when I try to plot.