Ejemplo n.º 1
0
    def __init__(self,
                 Kp=1,
                 Ti=0,
                 Td=0,
                 dt=1,
                 N=float('inf'),
                 alpha=None,
                 beta=None,
                 **opt):
        """
        Arguments:
        ----------
        Kp : `float`
            Proportional gain.
            Default ``Kp``=1.
        Ti :  `float`
            Integral time constant.
            Default ``Ti``=0.
        Td : `float`
            Derivative time constant.
            Default ``Td``=0.
        dt : `float`
            Sampling period.
            Default ``dt``=1
        N : `float`
            Derivative filter coefficient
            Default ``N``=float('inf')
        alpha : `float`
            Alpha coefficient for two-degree of freedom controller.
            Default ``alpha``=None
        beta : `float`
            Alpha coefficient for two-degree of freedom controller.
            Default ``alpha``=None
        """
        self.P_block = Models.Gain(Kp=Kp, dt=dt, **opt) if Kp else None
        self.I_block = Models.Integral(Ki=Kp /
                                       Ti, dt=dt, **opt) if Ti else None
        self.D_block = None
        self.P2_block = None
        self.D2_block = None
        if Td:
            self.D_block = Models.Derivative(Kd=Td * Kp, dt=dt, **opt) if N == float('inf') \
                else Models.StateSpace(ABCD=[[[-N / Td]], [[1]], [[- N ** 2 / Td]], [[N]]], dt=dt, K=Kp, **opt)

            if alpha: self.P2_block = Models.Gain(Kp=Kp * alpha, **opt)
            if beta:
                self.D2_block = Models.Derivative(Kd=Kp * Td * beta, dt=dt, **opt) if N == float('inf') \
                    else Models.StateSpace(ABCD=[[[-N / Td]], [[1]], [[- N ** 2 / Td]], [[N]]], dt=dt, K=Kp * beta, **opt)

        super().__init__(in_len=1, name='PID_Parallel', **opt)
Ejemplo n.º 2
0
    def __init__(self, Kp=0, Ti=0, Td=0, dt=1, N=float('inf'), **opt):
        """
       Arguments:
       ----------
       Kp : `float`
           Proportional gain.
           Default ``Kp``=1.
       Ti :  `float`
           Integral time constant.
           Default ``Ti``=0.
       Td : `float`
           Derivative time constant.
           Default ``Td``=0.
       dt : `float`
           Sampling period.
           Default ``dt``=1
       N : `float`
           Derivative filter coefficient
           Default ``N``=float('inf')
       """
        self.P_block = Models.Gain(Kp=Kp, dt=dt, **opt) if Kp else None
        self.I_block = Models.Integral(Ki=1 / Ti, dt=dt, **opt) if Ti else None
        self.D_block = None
        if Td:
            self.D_block = Models.Derivative(Kd=Td, dt=dt, **opt) if N == float('inf') \
                else Models.StateSpace(ABCD=[[[-N / Td]], [[1]], [[- N ** 2 / Td]], [[N]]], dt=dt, **opt)

        super().__init__(in_len=1, name='PID_Serial', **opt)
Ejemplo n.º 3
0
import matplotlib.pyplot as plt
from smacontrol import PID, Models
"""Simulation parameters"""
N = 100  # Simulation time's end
dt = 0.01  # Sampling time
max_len = int(N / dt)  # Simulation's vectors' length
time = np.arange(0, N, dt)  # Time vector
u = np.ones((1, max_len))  # Input vector u=1
input_on_time = 10  # Start time of input
u[0, :int(input_on_time / dt)] = 0  # Input u = 0 if t < input_on_time
"""State-Space model of inertia P(s) = 2/(50s+1)"""
A = [[-1 / 50]]
B = [[1]]
C = [[2 / 50]]
D = [[0]]
Plant_parallel = Models.StateSpace(ABCD=[A, B, C, D], dt=dt, len=max_len)
Plant_serial = Models.StateSpace(ABCD=[A, B, C, D], dt=dt, len=max_len)
Plant_open = Models.StateSpace(ABCD=[A, B, C, D], dt=dt, len=max_len)
"""Parallel and serial PID objects"""
Kp = 10
Ti = 2
Td = 0.2
Reg_PID_parallel = PID.PID(Kp=Kp, Ti=Ti, Td=Td, dt=dt, len=max_len)

Kps = Kp / 2 * np.sqrt(1 + 4 * Td / Ti)
Tis = Ti / 2 * np.sqrt(1 + 4 * Td / Ti)
Tds = Ti / 2 * np.sqrt(1 - 4 * Td / Ti)
Reg_PID_serial = PID.SerialPID(Kp=Kps, Ti=Tis, Td=Tds, dt=dt, len=max_len)
"""Simulation"""
for it in range(0, max_len):
    t = time[it]
Ejemplo n.º 4
0
import matplotlib.pyplot as plt
"""Simulation parameters"""
N = 100  # Simulation time's end
dt = 0.01  # Sampling time
max_len = int(N / dt)  # Simulation's vectors' length
time = np.arange(0, N, dt)  # Time vector
u = np.ones((1, max_len))  # Input vector u=1
input_on_time = 20  # Start time of input
u[0, 0:int(input_on_time / dt)] = 0  # Input u = 0 if t < input_on_time
"""
Open loop - step response
"""
# Process P(s) = 12/(12s+1)e^-2 to state-space
A, B, C, D = [[-1 / 12]], [[1]], [[1]], [[0]]
d = int(2 / dt)
Plant_openloop0 = Models.StateSpace(ABCD=[A, B, C, D], dt=dt, len=max_len)
Delay_openloop0 = Models.Delay(d=d, dt=dt, len=max_len)
"""
******
*** IMC 1 - model with delay
******
"""
# Process P(s) = 12/(12s+1)e^-2s to state-space
Plant1 = Models.StateSpace(ABCD=[A, B, C, D], dt=dt, len=max_len)

Delay1 = Models.Delay(d=d, dt=dt, len=max_len)
# Model Pm(s) = 12/(12s+1)e^-2s
Plant_model1 = Models.StateSpace(ABCD=[A, B, C, D], dt=dt, len=max_len)
# Regulator Q(s) = 12s+1/6s+12
Ar1, Br1, Cr1, Dr1 = [[-2]], [[1]], [[-23 / 6]], [[2]]
Reg1 = Models.StateSpace(ABCD=[Ar1, Br1, Cr1, Dr1], dt=dt, len=max_len)
Ejemplo n.º 5
0
"""Simulation parameters"""
N = 50  # Simulation time's end
dt = 0.1  # Sampling time
max_len = int(N / dt)  # Simulation's vectors' length
time = np.arange(0, N, dt)  # Time vector
u = np.ones((1, max_len))  # Input vector u=1
v = -1*np.ones((1, max_len))  # Disturbance vector v=-1, for t>=20
v_start = int(20 / dt)
v[0, :v_start] = 0

"""Open loop - step response"""
# Process model P(s) =  1/(1s+1)e^-5 to state-space
A, B, C, D = [[-1]], [[1]], [[1]], [[0]]
d = int(5 / dt)
Plant_openloop = Models.StateSpace(ABCD=[A, B, C, D], dt=dt, len=max_len)
Delay_openloop = Models.Delay(d=d, dt=dt, len=max_len)

"""Smith Predictor"""
# Process model P(s) = 1/(1s+1)e^-5 to state-space
Plant = Models.StateSpace(ABCD=[A, B, C, D], dt=dt, len=max_len)
Delay = Models.Delay(d=d, dt=dt, len=max_len)
# Model Pmo(s) = 1/(1s+1)
Model = Models.StateSpace(ABCD=[A, B, C, D], dt=dt, len=max_len)
# Regulator C(s) = (1s + 1)/(0.5s)
Ar, Br, Cr, Dr = [[0]], [[1]], [[2]], [[2]]
Reg = Models.StateSpace(ABCD=[Ar, Br, Cr, Dr], dt=dt, len=max_len)
# Output memory
Mem = Models.Memory(in_len=1, dt=dt, len=max_len)
# SmithPredictor structure
SmithPred = SP.SmithPredictor(reg=Reg, model=Model, delay=d, len=max_len)