Opened 18 years ago

Last modified 12 years ago

#108 closed defect

OMC crashes when plotting — at Version 6

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 Martin Sjölund)

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;

Change History (8)

comment:1 by miguel.prada.sarasola, 18 years ago

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.

by miguel.prada.sarasola, 18 years ago

Attachment: PackagesandExamples.onb added

OMNotebook file with case simulation

comment:2 by miguel.prada.sarasola, 18 years ago

Created an attachment (id=4)
OMNotebook file with case simulation

comment:3 by Peter Aronsson, 18 years ago

The notebook does not contain the DiscreteServoWithGear model. Please send
complete model.

by miguel.prada.sarasola, 18 years ago

Attachment: PackagesandExamples2.onb added

omnotebook file

comment:4 by miguel.prada.sarasola, 18 years ago

Created an attachment (id=6)
omnotebook file

comment:5 by Martin Sjölund, 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 Martin Sjölund, 12 years ago

Component: OMNotebook
Description: modified (diff)
Note: See TracTickets for help on using tickets.