コード例 #1
0
ファイル: electrical.py プロジェクト: itamarNov/BMSpy
    def PartialDynamicSystem(self,ieq,variable):
        """
        returns dynamical system blocks associated to output variable
        """
#        print(ieq,variable.name)
        if ieq==0:
            # U1-U2=R(i1)
            if variable==self.physical_nodes[0].variable:
                # U1 is output
                # U1=R(i1)+U2
                return [WeightedSum([self.physical_nodes[1].variable,self.variables[0]],variable,[1,self.R])]
            elif variable==self.physical_nodes[1].variable:
                # U2 is output
                # U2=-R(i1)+U2
                return [WeightedSum([self.physical_nodes[0].variable,self.variables[0]],variable,[1,-self.R])]
            elif variable==self.variables[0]:
                # i1 is output
                # i1=(U1-U2)/R
                return [WeightedSum([self.physical_nodes[0].variable,self.physical_nodes[1].variable],variable,[1/self.R,-1/self.R])]
        elif ieq==1:
            # i1=-i2
            if variable==self.variables[0]:
                #i1 as output
                return [Gain(self.variables[1],self.variables[0],-1)]
            elif variable==self.variables[1]:
                #i2 as output
                return [Gain(self.variables[0],self.variables[1],-1)]
コード例 #2
0
ファイル: mechanical.py プロジェクト: rowhit/BMSpy
 def ConservativeLaw(self, flux_variables, output_variable):
     if output_variable == self.variable:
         v1 = Variable(hidden='True')
         b1 = WeightedSum(flux_variables, v1, [1] * len(flux_variables),
                          -self.friction)
         b2 = ODE(v1, self.variable, [1], [self.SCx, self.mass])
         return [b1, b2]
     else:
         v1 = Variable(hidden='True')
         b1 = ODE(self.variable, v1, [self.SCx, self.mass], [1])
         b2 = WeightedSum([v1] + flux_variables, output_variable,
                          [1] + [-1] * len(flux_variables), self.friction)
         return [b1, b2]
コード例 #3
0
ファイル: electrical.py プロジェクト: itamarNov/BMSpy
 def PartialDynamicSystem(self,ieq,variable):
     """
     returns dynamical system blocks associated to output variable
     """
     if ieq==0:
         # U2-U1=signal
         if variable==self.physical_nodes[0].variable:
             # U1 is output
             # U1=U2-signal
             return [WeightedSum([self.physical_nodes[1].variable,self.voltage_signal],variable,[1,-1])]
         elif variable==self.physical_nodes[1].variable:
             # U2 is output
             # U2=U1+signal
             return [WeightedSum([self.physical_nodes[0].variable,self.voltage_signal],variable,[1,1])]
コード例 #4
0
    def partial_dynamic_system(self, ieq, variable):
        """
        returns dynamical system blocks associated to output variable
        """
        if ieq == 0:
            # Soc determination
            # soc=1-UI/CP
            v1 = Variable('UI', hidden=True)  # UI
            v2 = Variable('UI/CP', hidden=True)  # UI/CP
            v3 = Variable('soc0-UI/CP', hidden=True)  # soc0-UI/CP
            b1 = Product(self.u, self.variables[0], v1)
            b2 = ODE(v1, v2, [1], [1, self.c])
            b3 = WeightedSum([v2], v3, [-1], self.initial_soc)
            b4 = Saturation(v3, self.soc, 0, 1)
            b5 = WeightedSum([self.soc], self.u, [self.u_max - self.u_min],
                             self.u_min)
            blocks = [b1, b2, b3, b4, b5]
        # U2-U1=U+Ri1
        # U=soc(Umax-Umin)+Umin
        if variable == self.physical_nodes[0].variable:
            print('Bat0#1')
            # U1 is output
            # U1=-U-Ri1+U2
            blocks.append(
                WeightedSum([
                    self.u, self.variables[0], self.physical_nodes[1].variable
                ], variable, [-1, -self.r, 1]))
        elif variable == self.physical_nodes[1].variable:
            print('Bat0#2')
            # U2 is output
            # U2=U1+Ri1+U
            blocks.append(
                WeightedSum([
                    self.physical_nodes[0].variable, self.variables[0], self.u
                ], variable, [1, self.r, 1]))

        elif variable == self.variables[0]:
            print('Bat0#3')
            # i1 is output
            # i1=(-U1+U2-U)/R
            blocks.append(
                WeightedSum([
                    self.physical_nodes[0].variable,
                    self.physical_nodes[1].variable, self.u
                ], variable, [-1 / self.r, 1 / self.r, -1 / self.r]))

        return blocks
コード例 #5
0
ファイル: mechanical.py プロジェクト: rowhit/BMSpy
 def PartialDynamicSystem(self, ieq, variable):
     """
     returns dynamical system blocks associated to output variable
     """
     if ieq == 0:
         # C1=-f*Tmax*sign(w1-w2)
         if variable == self.variables[0]:
             ut = Variable('unsigned clutch friction torque', hidden=True)
             b1 = Gain(self.commands[0], ut, self.Tmax)
             dw = Variable('Delta rotationnal speed', hidden=True)
             sdw = Variable('Sign of delta rotationnal speed')
             b2 = WeightedSum([
                 self.physical_nodes[0].variable,
                 self.physical_nodes[1].variable
             ], dw, [-1, 1])
             b3 = Sign(dw, sdw)
             b4 = Product(ut, sdw, variable)
             return [b1, b2, b3, b4]
     elif ieq == 1:
         # C1=-C2
         if variable == self.variables[0]:
             return [Gain(self.variables[1], variable, -1)]
         if variable == self.variables[1]:
             return [Gain(self.variables[0], variable, -1)]
コード例 #6
0
ファイル: electrical.py プロジェクト: itamarNov/BMSpy
 def ConservativeLaw(self,flux_variables,output_variable):
     return [WeightedSum(flux_variables,output_variable,[-1]*len(flux_variables))]
コード例 #7
0
ファイル: derivative.py プロジェクト: rowhit/BMSpy
#I2=Sinus(('input','i'),100.)
#O2=bms.Variable(('Output','O'))#
#b=ODE(I2,O2,[0,1],[1])
#ds2=bms.DynamicSystem(15,3000,[b])
#ds2.Simulate()
#ds2.PlotVariables()

#print(b.Mi,b.Mo)
#print()

#==============================================================================
#  Feedback with derivative for stability test
#==============================================================================

I = Step(('input', 'i'), 100.)
AI = bms.Variable(('adapted input', 'ai'), [100.])
dI = bms.Variable(('error', 'dI'))
O = bms.Variable(('Output', 'O'))  #
F = bms.Variable(('Feedback', 'F'))  #

b1 = Gain(I, AI, Ka)
b2 = WeightedSum([AI, dI], F, [1, -1])
b3 = ODE(O, dI, [1, tau], [Kb])
b4 = Gain(F, O, 1 / Kc)
#
#ds.
ds = bms.DynamicSystem(0.1, 20, [b1, b2, b3, b4])
ds.Simulate()
ds.PlotVariables([[I, O, dI, F]])
コード例 #8
0
 def conservative_law(flux_variables, output_variable):
     return [
         WeightedSum(flux_variables, output_variable,
                     [-1] * len(flux_variables))
     ]
コード例 #9
0
fv2 = 0.01
#e=bmsp.Step(1.,'e')

cc = Sinus(('Brake command', 'cc'), 0.5, 0.1, 0, 0.5)
it = Step(('Input torque', 'it'), 100)
rt = Step(('Resistant torque', 'rt'), -80)

tc = bms.Variable(('brake Torque capacity', 'Tc'))
bt = bms.Variable(('brake torque', 'bt'))
w1 = bms.Variable(('Rotational speed shaft 1', 'w1'))
#dw12=bms.Variable(('Clutch differential speed','dw12'))
st1 = bms.Variable(('Sum torques on 1', 'st1'))
et1 = bms.Variable(('Sum of ext torques on 1', 'et1'))

b1 = Gain(cc, tc, Cmax)
b2 = WeightedSum([it, rt], et1, [1, 1])
b3 = CoulombVariableValue(et1, w1, tc, bt, 0.1)
#b3=Coulomb(it,dw12,ct,150)

b4 = ODE(st1, w1, [1], [fv1, I1])
#b5=ODE(st2,w2,[1],[fv2,I2])
b6 = WeightedSum([it, rt, bt], st1, [1, 1, 1])
#b7=WeightedSum([it,rt],et1,[1,1])

ds = bms.DynamicSystem(100, 400, [b1, b2, b3, b4, b6])

#ds.DrawModel()
r = ds.Simulate()
ds.PlotVariables([[w1], [tc, bt, rt, it, st1, et1]])
import matplotlib.pyplot as plt
plt.figure()
コード例 #10
0
Vb = 0.3  # Speed error at beginning of braking
r1 = 0.05

crankshaft = RotationalNode(Ic, friction_c, 'crankshaft')
shaft_gb1 = RotationalNode(Igb1, friction_c, 'shaft gb1')
shaft_gb2 = RotationalNode(Igb2, friction_c, 'shaft gb2')
vehicle = TranslationalNode(mass, SCx, friction_v, 'vehicle')

engine = ThermalEngine(crankshaft, wmin, wmax, Tmax, fuel_flow)
clutch = Clutch(crankshaft, shaft_gb1, Tmax_c)
gr1 = GearRatio(shaft_gb1, shaft_gb2, 0.05)
brake = Brake(shaft_gb2, Tmax_b)
wheels = Wheel(shaft_gb2, vehicle, r)

# Commands
subs1 = WeightedSum([Vt, vehicle.variable], engine.commands[0], [Ge, -Ge])
v1 = bms.Variable('', hidden=True)
subs2 = WeightedSum([Vt, vehicle.variable], v1, [-Gb, Gb], -Vb)
sat1 = Saturation(v1, brake.commands[0], 0, 1)

# clutch
cc = bms.Variable('Clutch command')
gc = Gain(crankshaft.variable, cc, 1/(wrc-wec), wec/(wec-wrc))
satc = Saturation(cc, clutch.commands[0], 0, 1)

ps = bms.PhysicalSystem(600, 600, [engine, gr1, clutch, wheels, brake], [
                        subs1, subs2, sat1, gc, satc])
ds = ps.dynamic_system

# ds._ResolutionOrder2()
ds.Simulate()
コード例 #11
0
# e=bmsp.Step(1.,'e')

cc = Sinus(('Clutch command', 'cc'), 0.5, 0.1, 0, 0.5)
it = Step(('Input torque', 'it'), 200)
rt = Step(('Resistant torque', 'rt'), -180)

tc = bms.Variable(('Clutch Torque capacity', 'Tc'))
ct = bms.Variable(('clutch torque', 'ct'))
w1 = bms.Variable(('Rotational speed shaft 1', 'w1'))
w2 = bms.Variable(('Rotational speed shaft 2', 'w2'))
dw12 = bms.Variable(('Clutch differential speed', 'dw12'))
st1 = bms.Variable(('Sum torques on 1', 'st1'))
st2 = bms.Variable(('Sum torques on 2', 'st2'))

b1 = Gain(cc, tc, Cmax)
b2 = WeightedSum([w1, w2], dw12, [1, -1])
b3 = CoulombVariableValue(it, dw12, tc, ct, 1)
# b3=Coulomb(it,dw12,ct,150)

b4 = ODE(st1, w1, [1], [fv1, I1])
b5 = ODE(st2, w2, [1], [fv2, I2])
b6 = WeightedSum([it, ct], st1, [1, 1])
b7 = WeightedSum([rt, ct], st2, [1, -1])

ds = bms.DynamicSystem(50, 150, [b1, b2, b3, b4, b5, b6, b7])

# ds.DrawModel()
r = ds.Simulate()
ds.PlotVariables([[dw12, w1, w2], [tc, ct, rt, it]])
# ds.PlotVariables([[cc]])