Main Content

Mechanical Component — Spring

The following file, spring.ssc, implements a component called spring.

The declaration section of the component contains:

  • Two rotational nodes, r and c (for rod and case, respectively)

  • Parameter k, with a default value of 10 N*m/rad, specifying the spring rate

  • Through and Across variables, torque t and angular velocity w, to be connected to the rotational domain Through and Across variables later in the file

  • Internal variable theta, with a default value of 0 rad, specifying relative angle, that is, deformation of the spring

The branches section establishes the relationship between the component Through variable and the component nodes (and therefore the domain Through variable). The t : r.t -> c.t statement indicates that the torque through the spring acts from node r to node c.

The equation section starts with an assert construct, which checks that the spring rate is greater than zero. If the block parameter is set incorrectly, the assert triggers a run-time error.

The first equation, w == r.w - c.w, establishes the relationship between the component Across variable and the component nodes (and therefore the domain Across variable). It defines the angular velocity across the spring as the difference between the node angular velocities.

The following two equations define the spring action:

  • t = k * theta, that is, torque equals spring deformation times spring rate

  • w = theta.der, that is, angular velocity equals time derivative of spring deformation

component spring
  nodes
    r = foundation.mechanical.rotational.rotational;
    c = foundation.mechanical.rotational.rotational;
  end
  parameters
    k = { 10, 'N*m/rad' };
  end
  variables
    theta = { 0, 'rad' };
    t = { 0, 'N*m' };        % torque through
    w = { 0, 'rad/s' };      % velocity across
  end
  branches
    t : r.t -> c.t; % torque through from node r to node c
  end
  equations
    assert(k>0)     % spring rate must be greater than zero
    w == r.w - c.w; % velocity across between node r and node c
    t == k * theta;
    w == theta.der;
  end
end