diff --git a/VirtualFCS/Control/BatteryManagementSystem.mo b/VirtualFCS/Control/BatteryManagementSystem.mo
index b24f9d2..ceaa588 100644
--- a/VirtualFCS/Control/BatteryManagementSystem.mo
+++ b/VirtualFCS/Control/BatteryManagementSystem.mo
@@ -1,14 +1,11 @@
within VirtualFCS.Control;
model BatteryManagementSystem "Implement algorithms for the control of battery systems."
-
parameter Real N_s "Number of Cells in Series";
parameter Real lowerVoltageLimit = N_s * 2;
parameter Real upperVoltageLimit = N_s * 3.6;
-
VirtualFCS.Control.ChargeCounter chargeCounter annotation(
Placement(visible = true, transformation(origin = {25, -1}, extent = {{25, -25}, {-25, 25}}, rotation = 0)));
-
Modelica.Electrical.Analog.Interfaces.NegativePin pin_n_battery annotation(
Placement(visible = true, transformation(origin = {-116, -96}, extent = {{10, -10}, {-10, 10}}, rotation = 0), iconTransformation(origin = {-50, -90}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
Modelica.Electrical.Analog.Interfaces.NegativePin pin_n_load annotation(
@@ -49,5 +46,5 @@ equation
annotation(
Icon(graphics = {Rectangle(fillColor = {50, 50, 50}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {100, -100}}), Text(origin = {2, 72}, lineColor = {255, 255, 255}, extent = {{-26, 22}, {26, -22}}, textString = "Load"), Text(origin = {0, -52}, lineColor = {255, 255, 255}, extent = {{-44, 34}, {48, -36}}, textString = "Battery"), Text(origin = {104, 146}, lineColor = {0, 0, 255}, extent = {{-26, 22}, {84, -80}}, textString = "%name"), Text(origin = {62, 24}, lineColor = {255, 255, 255}, extent = {{-44, 34}, {26, -24}}, textString = "SOC_init"), Text(origin = {106, -52}, lineColor = {255, 255, 255}, extent = {{-44, 34}, {-8, 10}}, textString = "Q")}, coordinateSystem(extent = {{-150, -100}, {150, 100}}, initialScale = 0.1)),
Diagram(coordinateSystem(extent = {{-150, -100}, {150, 100}})),
- Documentation(info = "
The BatteryManagementSystem component is responsible for protecting the battery pack. It ensures that the pack is not overcharged or overdischarged to dangerous state-of-charge levels. It also limits the maximum charging and discharging current the battery pack can support."));
-end BatteryManagementSystem;
+ Documentation(info = "The BatteryManagementSystem component is responsible for protecting the battery pack. It ensures that the pack is not overcharged or overdischarged to dangerous state-of-charge levels. It also limits the maximum charging and discharging current the battery pack can support."));
+end BatteryManagementSystem;
\ No newline at end of file
diff --git a/VirtualFCS/Control/ChargeCounter.mo b/VirtualFCS/Control/ChargeCounter.mo
index 629f898..3acd71d 100644
--- a/VirtualFCS/Control/ChargeCounter.mo
+++ b/VirtualFCS/Control/ChargeCounter.mo
@@ -15,7 +15,7 @@ block ChargeCounter "Determine the state-of-charge of a battery using a charge c
Placement(visible = true, transformation(origin = {-10, -30}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.Blocks.Math.Division division annotation(
Placement(visible = true, transformation(origin = {-40, -30}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
- Modelica.Blocks.Nonlinear.Limiter limiter(limitsAtInit = true, uMax = 1 - 1e-6, uMin = 1e-6) annotation(
+ Modelica.Blocks.Nonlinear.Limiter limiter(uMax = 1 - 1e-6, uMin = 1e-6) annotation(
Placement(visible = true, transformation(origin = {76, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
equation
connect(integrator.y, add.u2) annotation(
@@ -35,11 +35,11 @@ equation
annotation(
Diagram,
Icon(graphics = {Rectangle(fillColor = {50, 50, 50}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {100, -100}}), Text(origin = {-38, 149}, lineColor = {0, 0, 255}, extent = {{-34, 19}, {106, -71}}, textString = "%name"), Text(origin = {-56, 85}, lineColor = {255, 255, 255}, extent = {{-34, 19}, {30, -25}}, textString = "SOC_init"), Text(origin = {-58, 5}, lineColor = {255, 255, 255}, extent = {{-34, 19}, {30, -25}}, textString = "Current"), Text(origin = {-60, -73}, lineColor = {255, 255, 255}, extent = {{-34, 19}, {38, -31}}, textString = "Capacity"), Text(origin = {88, -7}, lineColor = {255, 255, 255}, extent = {{-34, 19}, {2, -5}}, textString = "SOC")}, coordinateSystem(initialScale = 0.1)),
- Documentation(info = "What it does
The ChargeCounter model is designed to calculate the state-of-charge of a battery using a simple charge counting algorithm.
Description
The ChargeCounter model can be used together with a battery model (e.g. VirtualFCS.Electrochemical.Battery.LiIonBatteryPack_Lumped). It may be implement either on its own or as a component in a larger battery management system (BMS) block (e.g. VirtualFCS.Control.BatteryManagementSystem). ChargeCounter builds on components from the Modelica Standard Library.
Assumptions
The inital version assumes a faradaic efficiency of 100%.
Formula
+ Documentation(info = "
What it does
The ChargeCounter model is designed to calculate the state-of-charge of a battery using a simple charge counting algorithm.
Description
The ChargeCounter model can be used together with a battery model (e.g. VirtualFCS.Electrochemical.Battery.LiIonBatteryPack_Lumped). It may be implement either on its own or as a component in a larger battery management system (BMS) block (e.g. VirtualFCS.Control.BatteryManagementSystem). ChargeCounter builds on components from the Modelica Standard Library.
Assumptions
The inital version assumes a faradaic efficiency of 100%.
Formula
SOC = SOC_init - int_0^t{i/C dt}
Operation
Main Authors
List of Updates
30.06.2021 Initial Version
", __OpenModelica_infoHeader = "
"));
-end ChargeCounter;
+end ChargeCounter;
\ No newline at end of file
diff --git a/VirtualFCS/Control/DCMotorControl.mo b/VirtualFCS/Control/DCMotorControl.mo
index 5d1b29d..0a62555 100644
--- a/VirtualFCS/Control/DCMotorControl.mo
+++ b/VirtualFCS/Control/DCMotorControl.mo
@@ -1,97 +1,60 @@
within VirtualFCS.Control;
+
model DCMotorControl "Control the speed of a DC motor"
- //*** DEFINE REPLACEABLE PACKAGES ***//
+ //*** DEFINE REPLACEABLE PACKAGES ***//
replaceable parameter VirtualFCS.Utilities.ParameterRecords.DriveDataDcPm driveData annotation(
- Placement(visible = true, transformation(extent = {{-248, 44}, {-228, 64}}, rotation = 0))) constrainedby
- Modelica.Electrical.Machines.Examples.ControlledDCDrives.Utilities.DriveDataDCPM
- annotation (Placement(transformation(extent={{20,-80},{40,-60}})));
-
-//*** INSTANTIATE COMPONENTS ***//
- Modelica.Electrical.Machines.Examples.ControlledDCDrives.Utilities.DcdcInverter armatureInverter(
- fS=driveData.fS,
- Td=driveData.Td,
- Tmf=driveData.Tmf,
- VMax=driveData.VaMax)
- annotation (Placement(visible = true, transformation(extent = {{30, -10}, {50, 10}}, rotation = 0)));
-
- Modelica.Electrical.Machines.Examples.ControlledDCDrives.Utilities.LimitedPI currentController(
-
- Ti=driveData.TiI,constantLimits=false,
- initType=Modelica.Blocks.Types.Init.InitialOutput,
- k=driveData.kpI,
- useFF= true)
- annotation (Placement(visible = true, transformation(extent = {{-22, -10}, {-2, 10}}, rotation = 0)));
-
- Modelica.Blocks.Math.Gain tau2i(
- k=1/driveData.kPhi)
- annotation (Placement(
- visible = true, transformation(origin = {-42, 0}, extent = {{10, -10}, {-10, 10}}, rotation = 180)));
-
- Modelica.Electrical.Machines.Examples.ControlledDCDrives.Utilities.LimitedPI speedController(
- initType=Modelica.Blocks.Types.Init.InitialOutput,
- k=driveData.kpw,
- Ti=driveData.Tiw,
- constantLimits=true,
- yMax=driveData.tauMax)
- annotation (Placement(visible = true, transformation(extent = {{-92, -10}, {-72, 10}}, rotation = 0)));
-
- Modelica.Blocks.Continuous.FirstOrder preFilter(
- k=1,
- T=driveData.Tfw,
- initType=Modelica.Blocks.Types.Init.InitialOutput)
- annotation (Placement(visible = true, transformation(extent = {{-132, -10}, {-112, 10}}, rotation = 0)));
-
- Modelica.Blocks.Interfaces.RealInput setSpeedInput
- annotation(
+ Placement(visible = true, transformation(extent = {{-248, 44}, {-228, 64}}, rotation = 0))) constrainedby Modelica.Electrical.Machines.Examples.ControlledDCDrives.Utilities.DriveDataDCPM annotation(
+ Placement(transformation(extent = {{20, -80}, {40, -60}})));
+ //*** INSTANTIATE COMPONENTS ***//
+ Modelica.Electrical.Machines.Examples.ControlledDCDrives.Utilities.DcdcInverter armatureInverter(fS = driveData.fS, Td = driveData.Td, Tmf = driveData.Tmf, VMax = driveData.VaMax) annotation(
+ Placement(visible = true, transformation(extent = {{30, -10}, {50, 10}}, rotation = 0)));
+ Modelica.Electrical.Machines.Examples.ControlledDCDrives.Utilities.LimitedPI currentController(Ti = driveData.TiI, constantLimits = false, initType = Modelica.Blocks.Types.Init.InitialOutput, k = driveData.kpI, useFF = true) annotation(
+ Placement(visible = true, transformation(extent = {{-22, -10}, {-2, 10}}, rotation = 0)));
+ Modelica.Blocks.Math.Gain tau2i(k = 1 / driveData.kPhi) annotation(
+ Placement(visible = true, transformation(origin = {-42, 0}, extent = {{10, -10}, {-10, 10}}, rotation = 180)));
+ Modelica.Electrical.Machines.Examples.ControlledDCDrives.Utilities.LimitedPI speedController(initType = Modelica.Blocks.Types.Init.InitialOutput, k = driveData.kpw, Ti = driveData.Tiw, constantLimits = true, yMax = driveData.tauMax) annotation(
+ Placement(visible = true, transformation(extent = {{-92, -10}, {-72, 10}}, rotation = 0)));
+ Modelica.Blocks.Continuous.FirstOrder preFilter(k = 1, T = driveData.Tfw, initType = Modelica.Blocks.Types.Init.InitialOutput) annotation(
+ Placement(visible = true, transformation(extent = {{-132, -10}, {-112, 10}}, rotation = 0)));
+ Modelica.Blocks.Interfaces.RealInput setSpeedInput annotation(
Placement(visible = true, transformation(origin = {-164, 0}, extent = {{-20, -20}, {20, 20}}, rotation = 0), iconTransformation(origin = {-120, 0}, extent = {{-20, -20}, {20, 20}}, rotation = 0)));
-
- Modelica.Blocks.Interfaces.RealInput measuredSpeedInput
- annotation(
+ Modelica.Blocks.Interfaces.RealInput measuredSpeedInput annotation(
Placement(visible = true, transformation(origin = {-88, -64}, extent = {{-20, -20}, {20, 20}}, rotation = 90), iconTransformation(origin = {120, 0}, extent = {{20, -20}, {-20, 20}}, rotation = 0)));
-
- Modelica.Electrical.Analog.Interfaces.PositivePin pin_p
- annotation(
+ Modelica.Electrical.Analog.Interfaces.PositivePin pin_p annotation(
Placement(visible = true, transformation(origin = {60, -72}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {30, -90}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
-
- Modelica.Electrical.Analog.Interfaces.NegativePin pin_n
- annotation(
+ Modelica.Electrical.Analog.Interfaces.NegativePin pin_n annotation(
Placement(visible = true, transformation(origin = {20, -72}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {-30, -90}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
-
- Modelica.Electrical.Analog.Interfaces.PositivePin pwr_pin_p
- annotation(
+ Modelica.Electrical.Analog.Interfaces.PositivePin pwr_pin_p annotation(
Placement(visible = true, transformation(origin = {60, 52}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {30, 90}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
-
- Modelica.Electrical.Analog.Interfaces.NegativePin pwr_pin_n
- annotation(
+ Modelica.Electrical.Analog.Interfaces.NegativePin pwr_pin_n annotation(
Placement(visible = true, transformation(origin = {20, 52}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {-30, 90}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
-
equation
//*** DEFINE CONNECTIONS ***//
connect(armatureInverter.vDC, currentController.yMaxVar) annotation(
Line(points = {{29, 6}, {0, 6}}, color = {0, 0, 127}));
- connect(armatureInverter.vRef, currentController.y) annotation(
+ connect(armatureInverter.vRef, currentController.y) annotation(
Line(points = {{28, 0}, {-1, 0}}, color = {0, 0, 127}));
- connect(armatureInverter.iMot, currentController.u_m) annotation(
+ connect(armatureInverter.iMot, currentController.u_m) annotation(
Line(points = {{29, -6}, {10, -6}, {10, -30}, {-18, -30}, {-18, -12}}, color = {0, 0, 127}));
- connect(tau2i.y, currentController.u) annotation(
+ connect(tau2i.y, currentController.u) annotation(
Line(points = {{-31, 0}, {-24, 0}}, color = {0, 0, 127}));
- connect(preFilter.y, speedController.u) annotation(
+ connect(preFilter.y, speedController.u) annotation(
Line(points = {{-111, 0}, {-94, 0}}, color = {0, 0, 127}));
- connect(speedController.y, tau2i.u) annotation(
+ connect(speedController.y, tau2i.u) annotation(
Line(points = {{-71, 0}, {-54, 0}}, color = {0, 0, 127}));
- connect(setSpeedInput, preFilter.u) annotation(
+ connect(setSpeedInput, preFilter.u) annotation(
Line(points = {{-164, 0}, {-134, 0}}, color = {0, 0, 127}));
- connect(armatureInverter.pin_nMot, pin_n) annotation(
+ connect(armatureInverter.pin_nMot, pin_n) annotation(
Line(points = {{34, -10}, {20, -10}, {20, -72}}, color = {0, 0, 255}));
- connect(armatureInverter.pin_pMot, pin_p) annotation(
+ connect(armatureInverter.pin_pMot, pin_p) annotation(
Line(points = {{46, -10}, {60, -10}, {60, -72}}, color = {0, 0, 255}));
- connect(pwr_pin_n, armatureInverter.pin_nBat) annotation(
+ connect(pwr_pin_n, armatureInverter.pin_nBat) annotation(
Line(points = {{20, 52}, {20, 10}, {34, 10}}, color = {0, 0, 255}));
- connect(pwr_pin_p, armatureInverter.pin_pBat) annotation(
+ connect(pwr_pin_p, armatureInverter.pin_pBat) annotation(
Line(points = {{60, 52}, {60, 10}, {46, 10}}, color = {0, 0, 255}));
- connect(measuredSpeedInput, speedController.u_m) annotation(
+ connect(measuredSpeedInput, speedController.u_m) annotation(
Line(points = {{-88, -64}, {-88, -12}}, color = {0, 0, 127}));
- connect(currentController.feedForward, measuredSpeedInput) annotation(
+ connect(currentController.feedForward, measuredSpeedInput) annotation(
Line(points = {{-12, -12}, {-12, -36}, {-88, -36}, {-88, -64}}, color = {0, 0, 127}));
annotation(
Documentation(info = "
This is a partial model of a controlled DC PM drive.
@@ -107,7 +70,5 @@ Further reading:
This model is adapted from the DC PM drive control model used in the Modelica Standard Library.
"),
Diagram(coordinateSystem(extent = {{-200, -100}, {100, 100}})),
- Icon(coordinateSystem(initialScale = 0.1), graphics = {Rectangle(fillColor = {50, 50, 50}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {100, -100}}), Text(origin = {-87, 9}, lineColor = {255, 255, 255}, extent = {{-19, 11}, {27, -21}}, textString = "s"), Text(origin = {-3, 73}, lineColor = {255, 255, 255}, extent = {{-19, 11}, {27, -17}}, textString = "pwr"), Text(origin = {73, 9}, lineColor = {255, 255, 255}, extent = {{-19, 11}, {35, -23}}, textString = "m"), Text(origin = {-5, -57}, lineColor = {255, 255, 255}, extent = {{-19, 11}, {27, -19}}, textString = "out"), Text(origin = {161, 84}, lineColor = {0, 0, 255}, extent = {{-55, 18}, {55, -18}}, textString = "%name")}),
- uses(Modelica(version = "3.2.3")));
-
-end DCMotorControl;
+ Icon(coordinateSystem(initialScale = 0.1), graphics = {Rectangle(fillColor = {50, 50, 50}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {100, -100}}), Text(origin = {-87, 9}, lineColor = {255, 255, 255}, extent = {{-19, 11}, {27, -21}}, textString = "s"), Text(origin = {-3, 73}, lineColor = {255, 255, 255}, extent = {{-19, 11}, {27, -17}}, textString = "pwr"), Text(origin = {73, 9}, lineColor = {255, 255, 255}, extent = {{-19, 11}, {35, -23}}, textString = "m"), Text(origin = {-5, -57}, lineColor = {255, 255, 255}, extent = {{-19, 11}, {27, -19}}, textString = "out"), Text(origin = {161, 84}, lineColor = {0, 0, 255}, extent = {{-55, 18}, {55, -18}}, textString = "%name")}));
+end DCMotorControl;
\ No newline at end of file
diff --git a/VirtualFCS/Control/EMS_FC.mo b/VirtualFCS/Control/EMS_FC.mo
index 78ca5ab..3c6f722 100644
--- a/VirtualFCS/Control/EMS_FC.mo
+++ b/VirtualFCS/Control/EMS_FC.mo
@@ -1,10 +1,7 @@
within VirtualFCS.Control;
block EMS_FC
-
parameter Real ramp_up(unit = "1/s") = 20 "FC stack current ramp up rate";
-
-
Modelica.Blocks.Math.Abs abs1 annotation(
Placement(visible = true, transformation(origin = {70, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.Blocks.Sources.Constant OFF(k = 0) annotation(
@@ -36,6 +33,6 @@ equation
Line(points = {{2, 0}, {16, 0}, {16, 0}, {18, 0}}, color = {0, 0, 127}));
connect(ON.y, switch1.u3) annotation(
Line(points = {{-58, -40}, {-40, -40}, {-40, -8}, {-22, -8}, {-22, -8}}, color = {0, 0, 127}));
-annotation(
+ annotation(
Icon(graphics = {Bitmap(origin = {-5, 6}, extent = {{-95, 94}, {105, -106}}, imageSource = "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X6CNOzudc5uu54SXPtqhGwDMCjs+2v+rUnXbr7VpZ68zFum6Jm9u1q0ADrvNe59lkSw6Qxt2dpt/s65v8ux7/CUXs8C2957Vlkxunq/NOvudcoOus3lhHX/KxWG1dZ2eRetuOEUbtR3mLrhHV9wsW73xW90u4JD6duPq/Xc5TLhnwVxt0hY5eeGDuvpu+bubeE1cHFLfb3p3/93gyYMLT9b2bJ0zrntcN0JWvL/lB91OYKx+2PK+znO81+N/b8edDjlzfhPv3DOr3v5w83ae/ISx2bl984dv+2s7B4suHu9rWhwSx11xu25OtOy1NRu28nsUGvXt1g1rXpv0G5LcfsVx2o6td8SZC/eeBHayZ1a+8da7a9et/2TT59u2f7PjJ60JMJSfdnyzfdvnmz5Zv27tu2+9sfIZbavJFi888whtxK448pyr79OtAw6R+64+50htwK456vxr9z+2HBir+689/yhtvK469vTLrlm0VLcXGIOli6657PRjteG6b8688666fvEjuvFAIx5ZfP1V583rwL12o5g7/+wLL738D9f87aZb71iy9OHHtCbAUB57eOmSO2696a9X//7ySy88e/5hfWjDYPD/AWVvEgJ09vv6AAAAAElFTkSuQmCC")}));
-end EMS_FC;
+end EMS_FC;
\ No newline at end of file
diff --git a/VirtualFCS/Control/EnergyManagementSystem.mo b/VirtualFCS/Control/EnergyManagementSystem.mo
index e5a1a6f..985c07c 100644
--- a/VirtualFCS/Control/EnergyManagementSystem.mo
+++ b/VirtualFCS/Control/EnergyManagementSystem.mo
@@ -1,7 +1,6 @@
within VirtualFCS.Control;
block EnergyManagementSystem "Implement algorithms to control the energy and power distribution in a hybrid system."
-
parameter Real I_nom_FC_stack(unit = "A") = 100 "FC stack nominal operating current";
parameter Real ramp_up(unit = "1/s") = 20 "FC stack current ramp up rate";
Modelica.Blocks.Sources.Constant shut_down(k = 0) annotation(
@@ -38,4 +37,4 @@ equation
annotation(
Icon(graphics = {Rectangle(fillColor = {50, 50, 50}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {100, -100}}), Text(origin = {-8, 121}, lineColor = {0, 0, 255}, extent = {{-54, 17}, {54, -17}}, textString = "%name")}, coordinateSystem(initialScale = 0.1)),
Documentation(info = "
The EnergyManagementSystem component is designed to manage the flow of power between the fuel cell stack, battery, vehicle load, and balance-of-plant load. It splits the load according to pre-defined energy management rules, which are implemented within the bounds of the battery management system and the fuel cell control unit.
This model implements a simple energy management algorithm for a hybrid fuel cell & battery system. The model reads the state-of-charge (SOC) of the battery. If it is less than a lower threshold value, then a signal is sent to activate the fuel cell with a given electric current. The rate at which current can be demanded from the fuel cell is limited by a slew rate. "));
-end EnergyManagementSystem;
+end EnergyManagementSystem;
\ No newline at end of file
diff --git a/VirtualFCS/Control/FuelCellSystemControl.mo b/VirtualFCS/Control/FuelCellSystemControl.mo
index 7c9af51..8444472 100644
--- a/VirtualFCS/Control/FuelCellSystemControl.mo
+++ b/VirtualFCS/Control/FuelCellSystemControl.mo
@@ -29,5 +29,5 @@ equation
annotation(
Diagram(coordinateSystem(extent = {{-200, -300}, {200, 300}}, initialScale = 0.1)),
Icon(coordinateSystem(extent = {{-200, -300}, {200, 300}}, initialScale = 0.1), graphics = {Rectangle(origin = {-100, 0}, fillColor = {50, 50, 50}, fillPattern = FillPattern.Solid, extent = {{-300, 300}, {300, -300}}), Text(origin = {15, -200}, lineColor = {255, 255, 255}, extent = {{-63, 28}, {151, -92}}, textString = "Cooling Control"), Text(origin = {-313, -220}, lineColor = {255, 255, 255}, extent = {{-63, 28}, {111, -60}}, textString = "FC Sensors"), Text(origin = {-319, -60}, lineColor = {255, 255, 255}, extent = {{-63, 28}, {111, -60}}, textString = "H2 Sensors"), Text(origin = {75, -60}, lineColor = {255, 255, 255}, extent = {{-63, 28}, {93, -60}}, textString = "H2 Control"), Text(origin = {67, 112}, lineColor = {255, 255, 255}, extent = {{-63, 28}, {101, -64}}, textString = "Air Control"), Text(origin = {-319, 112}, lineColor = {255, 255, 255}, extent = {{-63, 28}, {119, -62}}, textString = "Air Sensors"), Text(origin = {-195, 410}, lineColor = {0, 0, 255}, extent = {{-55, 18}, {213, -120}}, textString = "%name")}),
- Documentation(info = "The FuelCellSystemControl manages all aspects related to the performance of the fuel cell stack and its related sub-systems. Most notably, the fuel cell control unit regulates the stack temperature by the flow of coolant and ensures sufficient flow of hydrogen and air to maintain the electrochemical reactions in the stack."));
-end FuelCellSystemControl;
+ Documentation(info = "The FuelCellSystemControl manages all aspects related to the performance of the fuel cell stack and its related sub-systems. Most notably, the fuel cell control unit regulates the stack temperature by the flow of coolant and ensures sufficient flow of hydrogen and air to maintain the electrochemical reactions in the stack."));
+end FuelCellSystemControl;
\ No newline at end of file
diff --git a/VirtualFCS/Control/PumpSpeedControl.mo b/VirtualFCS/Control/PumpSpeedControl.mo
index 4192d0c..e42ca39 100644
--- a/VirtualFCS/Control/PumpSpeedControl.mo
+++ b/VirtualFCS/Control/PumpSpeedControl.mo
@@ -1,11 +1,9 @@
within VirtualFCS.Control;
-block PumpSpeedControl
-
+block PumpSpeedControl
parameter Real k = 1 "Control Gain";
parameter Real Td = 0.1 "Time Constant of Derivative Block";
-
- Modelica.Blocks.Continuous.LimPID limPID( Td = Td,initType = Modelica.Blocks.Types.InitPID.InitialOutput, k = k, limitsAtInit = true, yMax = 1, yMin = 0, y_start = 0) annotation(
+ Modelica.Blocks.Continuous.LimPID limPID(Td = hydrogenData.PumpSpeed_Td, initType = Modelica.Blocks.Types.Init.InitialOutput, k = hydrogenData.PumpSpeed_k, yMax = 1, yMin = 0, y_start = 0) annotation(
Placement(visible = true, transformation(origin = {-30, 30}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.Blocks.Interfaces.RealInput setMassFlow annotation(
Placement(visible = true, transformation(origin = {-100, 40}, extent = {{-20, -20}, {20, 20}}, rotation = 0), iconTransformation(origin = {-110, 50}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
@@ -13,6 +11,7 @@ block PumpSpeedControl
Placement(visible = true, transformation(origin = {-100, -20}, extent = {{-20, -20}, {20, 20}}, rotation = 0), iconTransformation(origin = {-110, -50}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.Blocks.Interfaces.RealOutput setPumpSpeed annotation(
Placement(visible = true, transformation(origin = {110, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {110, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
+ outer VirtualFCS.Utilities.SystemRecords.HydrogenData hydrogenData annotation(Placement(visible = true, transformation(origin = {-90, 90}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
equation
connect(setMassFlow, limPID.u_s) annotation(
Line(points = {{-100, 40}, {-60, 40}, {-60, 30}, {-42, 30}, {-42, 30}}, color = {0, 0, 127}));
@@ -23,4 +22,4 @@ equation
annotation(
Icon(graphics = {Rectangle(fillColor = {50, 50, 50}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {100, -100}}), Text(origin = {-3, 126}, lineColor = {0, 0, 255}, extent = {{-55, 18}, {55, -18}}, textString = "%name")}, coordinateSystem(initialScale = 0.1)),
Documentation(info = "
Description
This block uses a simple
PID control to set pump speed as a function of mass flow.
The block requires that a sensor be placed to measure the mass flow through the pump in question. The measured value for the mass flow is taken in the getMassFlow interface, while the desired mass flow is set in the setMassFlowInterface. Properties of the
PID control can be adjusted in the limPID block, and the resulting control signal is sent to the setPumpSpeed interface.
"));
-end PumpSpeedControl;
+end PumpSpeedControl;
\ No newline at end of file
diff --git a/VirtualFCS/Control/PurgeValveControl.mo b/VirtualFCS/Control/PurgeValveControl.mo
index a350381..f09c66a 100644
--- a/VirtualFCS/Control/PurgeValveControl.mo
+++ b/VirtualFCS/Control/PurgeValveControl.mo
@@ -1,6 +1,6 @@
within VirtualFCS.Control;
-block PurgeValveControl
+block PurgeValveControl
Modelica.Blocks.Logical.Switch switch annotation(
Placement(visible = true, transformation(origin = {54, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.Blocks.Sources.Trapezoid setPurgeValveState(amplitude = 0.01, falling = 0.05, period = 40, rising = 0.05, width = 0.350) annotation(
@@ -28,9 +28,8 @@ equation
Line(points = {{-100, 0}, {-72, 0}, {-72, 0}, {-70, 0}}, color = {0, 0, 127}));
connect(abs1.y, greaterThreshold.u) annotation(
Line(points = {{-46, 0}, {-32, 0}, {-32, 0}, {-32, 0}}, color = {0, 0, 127}));
-
-annotation(
+ annotation(
Icon(graphics = {Rectangle(fillColor = {50, 50, 50}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {100, -100}}), Text(origin = {-3, 126}, lineColor = {0, 0, 255}, extent = {{-55, 18}, {55, -18}}, textString = "%name")}, coordinateSystem(initialScale = 0.1)),
Documentation(info = "
Control the state of the Purge Valve in a hydrogen fuel cell system
Description
Fuel cell systems often contain a Purge Valve in the Hydrogen SubSystem that is designed to purge impurities from the hydrogen line. There are different strategies for controlling this behaviour. Some systems open the Purge Valve at regular intervals during Fuel Cell Stack operation. Others employ a charge counting algorithm to open the valve for every X Ah that passes through the Fuel Cell Stack.
In this implementation, the block first determines if the Fuel Cell Stack is on (i.e. abs(i_FC > 1)). If it is not on, then the Purge Valve is closed. If it is on, then the Purge Valve is opened at regular intervals defined by the setPurgeValveState block. The control signal is then sent to the valve.
Further update
Future development of this block will include alternative algorithms for determining the purging behaviour.
"));
-end PurgeValveControl;
+end PurgeValveControl;
\ No newline at end of file
diff --git a/VirtualFCS/Control/UsersGuide/package.mo b/VirtualFCS/Control/UsersGuide/package.mo
index 874a9e0..57e5cd1 100644
--- a/VirtualFCS/Control/UsersGuide/package.mo
+++ b/VirtualFCS/Control/UsersGuide/package.mo
@@ -4,4 +4,4 @@ package UsersGuide "User information for the Control sub-library"
extends Modelica.Icons.Information;
annotation(
Documentation(info = "The package VirtualFCS.Control contains models for the control of hybrid fuel cell systems and their components.
The models read the state of the component under control, apply some algorithm(s) to process the state variables, and send a control signal back to the component. Signals from sensors and to controls typically use real number interfaces. In some cases, electrical connections are used to directly control electrical components using voltage or current.
"));
-end UsersGuide;
+end UsersGuide;
\ No newline at end of file
diff --git a/VirtualFCS/Control/VoltageLimiter.mo b/VirtualFCS/Control/VoltageLimiter.mo
index 8d1049d..8893aae 100644
--- a/VirtualFCS/Control/VoltageLimiter.mo
+++ b/VirtualFCS/Control/VoltageLimiter.mo
@@ -1,19 +1,17 @@
within VirtualFCS.Control;
model VoltageLimiter "Enforce voltage limits on battery cells."
-
parameter Real upperVoltageLimit(unit = "V") = 3.6 "Upper Voltage Limit";
parameter Real lowerVoltageLimit(unit = "V") = 2.0 "Lower Voltage Limit";
-
Modelica.Electrical.Analog.Interfaces.PositivePin pin_p_battery annotation(
Placement(visible = true, transformation(origin = {196, 0}, extent = {{10, -10}, {-10, 10}}, rotation = 0), iconTransformation(origin = {110, 190}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
Modelica.Electrical.Analog.Interfaces.NegativePin pin_n_battery annotation(
Placement(visible = true, transformation(origin = {-196, 0}, extent = {{10, -10}, {-10, 10}}, rotation = 0), iconTransformation(origin = {-128, 190}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
Modelica.Electrical.Analog.Sensors.VoltageSensor voltageSensor annotation(
Placement(visible = true, transformation(origin = {0, 80}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
- Modelica.Blocks.Logical.GreaterThreshold greaterThreshold(threshold = lowerVoltageLimit) annotation(
+ Modelica.Blocks.Logical.GreaterThreshold greaterThreshold(threshold = lowerVoltageLimit) annotation(
Placement(visible = true, transformation(origin = {20, 28}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
- Modelica.Blocks.Logical.LessThreshold lessThreshold(threshold = upperVoltageLimit) annotation(
+ Modelica.Blocks.Logical.LessThreshold lessThreshold(threshold = upperVoltageLimit) annotation(
Placement(visible = true, transformation(origin = {56, 28}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
Modelica.Blocks.Logical.And and1 annotation(
Placement(visible = true, transformation(origin = {42, -8}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
@@ -21,13 +19,13 @@ model VoltageLimiter "Enforce voltage limits on battery cells."
Placement(visible = true, transformation(origin = {-78, -140}, extent = {{10, -10}, {-10, 10}}, rotation = 0), iconTransformation(origin = {-130, -190}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
Modelica.Electrical.Analog.Interfaces.PositivePin pin_p_load annotation(
Placement(visible = true, transformation(origin = {80, -140}, extent = {{10, -10}, {-10, 10}}, rotation = 0), iconTransformation(origin = {130, -190}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
- Modelica.Electrical.Analog.Ideal.IdealCommutingSwitch switchVotageSource annotation(
+ Modelica.Electrical.Analog.Ideal.IdealTwoWaySwitch switchVotageSource annotation(
Placement(visible = true, transformation(origin = {114, -54}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
Modelica.Electrical.Analog.Sources.ConstantVoltage upperVoltageSource(V = upperVoltageLimit) annotation(
Placement(visible = true, transformation(origin = {-140, 0}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
Modelica.Electrical.Analog.Sources.ConstantVoltage constantVoltage(V = lowerVoltageLimit) annotation(
Placement(visible = true, transformation(origin = {-142, -80}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
- Modelica.Electrical.Analog.Ideal.IdealCommutingSwitch idealCommutingSwitch annotation(
+ Modelica.Electrical.Analog.Ideal.IdealTwoWaySwitch idealCommutingSwitch annotation(
Placement(visible = true, transformation(origin = {-50, -50}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
Modelica.Blocks.Logical.LessThreshold lessThreshold1(threshold = lowerVoltageLimit) annotation(
Placement(visible = true, transformation(origin = {-50, 30}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
@@ -69,5 +67,5 @@ equation
annotation(
Icon(graphics = {Rectangle(origin = {-100, 100}, fillColor = {50, 50, 50}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {300, -300}}), Text(origin = {2, 137}, lineColor = {255, 255, 255}, extent = {{-74, 31}, {74, -31}}, textString = "Battery"), Text(origin = {-4, -101}, lineColor = {255, 255, 255}, extent = {{-74, 31}, {74, -31}}, textString = "Load"), Text(origin = {-7, 253}, lineColor = {0, 0, 255}, extent = {{-181, 45}, {181, -45}}, textString = "%name")}, coordinateSystem(extent = {{-200, -200}, {200, 200}}, initialScale = 0.1)),
Diagram(coordinateSystem(extent = {{-200, -200}, {200, 200}})),
- Documentation(info = "The voltage limiter block enforces user-defined upper and lower voltage limits for battery cells and packs. "));
-end VoltageLimiter;
+ Documentation(info = "The voltage limiter block enforces user-defined upper and lower voltage limits for battery cells and packs. "));
+end VoltageLimiter;
\ No newline at end of file
diff --git a/VirtualFCS/Control/package.mo b/VirtualFCS/Control/package.mo
index 8e2796e..bd9b052 100644
--- a/VirtualFCS/Control/package.mo
+++ b/VirtualFCS/Control/package.mo
@@ -2,4 +2,4 @@ within VirtualFCS;
package Control "Control algorithms for hybrid fuel cell & battery systems."
extends Modelica.Icons.Package;
-end Control;
+end Control;
\ No newline at end of file
diff --git a/VirtualFCS/Electrical/DCConverter.mo b/VirtualFCS/Electrical/DCConverter.mo
index d78351c..0468173 100644
--- a/VirtualFCS/Electrical/DCConverter.mo
+++ b/VirtualFCS/Electrical/DCConverter.mo
@@ -4,8 +4,8 @@ model DCConverter "DC controlled single phase DC/AC converter"
extends Modelica.Electrical.PowerConverters.Interfaces.DCDC.DCtwoPin1;
extends Modelica.Electrical.PowerConverters.Interfaces.DCDC.DCtwoPin2;
// extends .PhotoVoltaics.Icons.Converter;
- parameter Modelica.SIunits.Voltage vDCref = 48 "Reference DC source voltage";
- parameter Modelica.SIunits.Time Ti = 1E-6 "Internal integration time constant";
+ parameter Modelica.Units.SI.Voltage vDCref = 48 "Reference DC source voltage";
+ parameter Modelica.Units.SI.Time Ti = 1E-6 "Internal integration time constant";
Modelica.Electrical.Analog.Sources.SignalVoltage signalVoltage annotation(
Placement(visible = true, transformation(origin = {-90, 14}, extent = {{-10, -10}, {10, 10}}, rotation = 270)));
Modelica.Electrical.Analog.Sensors.CurrentSensor currentSensor annotation(
@@ -79,4 +79,4 @@ The DC/DC converter is characterized by:
where underlined voltages and currents represent complex phasors
"));
-end DCConverter;
+end DCConverter;
\ No newline at end of file
diff --git a/VirtualFCS/Electrical/DCConverterSwitch.mo b/VirtualFCS/Electrical/DCConverterSwitch.mo
index 0e3cf71..48657bf 100644
--- a/VirtualFCS/Electrical/DCConverterSwitch.mo
+++ b/VirtualFCS/Electrical/DCConverterSwitch.mo
@@ -4,8 +4,8 @@ model DCConverterSwitch "DC controlled single phase DC/AC converter"
extends Modelica.Electrical.PowerConverters.Interfaces.DCDC.DCtwoPin1;
extends Modelica.Electrical.PowerConverters.Interfaces.DCDC.DCtwoPin2;
// extends .PhotoVoltaics.Icons.Converter;
- parameter Modelica.SIunits.Voltage vDCref = 48 "Reference DC source voltage";
- parameter Modelica.SIunits.Time Ti = 1E-6 "Internal integration time constant";
+ parameter Modelica.Units.SI.Voltage vDCref = 48 "Reference DC source voltage";
+ parameter Modelica.Units.SI.Time Ti = 1E-6 "Internal integration time constant";
Modelica.Electrical.Analog.Sources.SignalVoltage signalVoltage annotation(
Placement(visible = true, transformation(origin = {-90, 14}, extent = {{-10, -10}, {10, 10}}, rotation = 270)));
Modelica.Electrical.Analog.Sensors.CurrentSensor currentSensor annotation(
@@ -28,13 +28,13 @@ model DCConverterSwitch "DC controlled single phase DC/AC converter"
Placement(visible = true, transformation(origin = {80, 32}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
Modelica.Blocks.Logical.Switch switch1 annotation(
Placement(visible = true, transformation(origin = {36, -48}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
- Modelica.Blocks.Sources.Constant const(k = 0) annotation(
+ Modelica.Blocks.Sources.Constant const(k = 0) annotation(
Placement(visible = true, transformation(origin = {-10, -72}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.Blocks.Interfaces.BooleanInput u annotation(
Placement(visible = true, transformation(origin = {16, -120}, extent = {{-20, -20}, {20, 20}}, rotation = 90), iconTransformation(origin = {16, -120}, extent = {{-20, -20}, {20, 20}}, rotation = 90)));
Modelica.Electrical.Analog.Ideal.IdealClosingSwitch switch annotation(
Placement(visible = true, transformation(origin = {-90, -40}, extent = {{10, 10}, {-10, -10}}, rotation = 90)));
- Modelica.Blocks.Sources.RealExpression realExpression(y = vDCref) annotation(
+ Modelica.Blocks.Sources.RealExpression realExpression(y = vDCref) annotation(
Placement(visible = true, transformation(origin = {-60, -80}, extent = {{-10, -10}, {10, 10}}, rotation = 90)));
equation
connect(currentSensor.n, signalVoltage.p) annotation(
@@ -101,4 +101,4 @@ The DC/DC converter is characterized by:
where underlined voltages and currents represent complex phasors
"));
-end DCConverterSwitch;
+end DCConverterSwitch;
\ No newline at end of file
diff --git a/VirtualFCS/Electrical/DC_DC_Converter.mo b/VirtualFCS/Electrical/DC_DC_Converter.mo
index 4878ad4..480920a 100644
--- a/VirtualFCS/Electrical/DC_DC_Converter.mo
+++ b/VirtualFCS/Electrical/DC_DC_Converter.mo
@@ -3,8 +3,8 @@ within VirtualFCS.Electrical;
model DC_DC_Converter "DC controlled single phase DC/AC converter"
extends Modelica.Electrical.PowerConverters.Interfaces.DCDC.DCtwoPin1;
extends Modelica.Electrical.PowerConverters.Interfaces.DCDC.DCtwoPin2;
- parameter Modelica.SIunits.Voltage VRef = 48 "Reference DC source voltage";
- parameter Modelica.SIunits.Time Ti = 1E-6 "Internal integration time constant";
+ parameter Modelica.Units.SI.Voltage VRef = 48 "Reference DC source voltage";
+ parameter Modelica.Units.SI.Time Ti = 1E-6 "Internal integration time constant";
Modelica.Blocks.Interfaces.RealInput vDCRef(final unit = "V") "DC voltage" annotation(
Placement(transformation(extent = {{-20, -20}, {20, 20}}, rotation = 90, origin = {-60, -120}), iconTransformation(extent = {{-20, -20}, {20, 20}}, rotation = 90, origin = {-60, -120})));
Modelica.Electrical.Analog.Sources.SignalVoltage signalVoltage annotation(
@@ -23,9 +23,9 @@ model DC_DC_Converter "DC controlled single phase DC/AC converter"
Placement(visible = true, transformation(extent = {{-2, -50}, {18, -30}}, rotation = 0)));
Modelica.Blocks.Math.Gain gain(final k = -1) annotation(
Placement(transformation(extent = {{-10, -10}, {10, 10}}, rotation = 180, origin = {0, 0})));
- Modelica.Electrical.Analog.Basic.Resistor resistor(R = 0.001) annotation(
+ Modelica.Electrical.Analog.Basic.Resistor resistor(R = 0.001) annotation(
Placement(visible = true, transformation(origin = {-90, -32}, extent = {{10, -10}, {-10, 10}}, rotation = 90)));
- Modelica.Electrical.Analog.Basic.Resistor resistor1(R = 0.001) annotation(
+ Modelica.Electrical.Analog.Basic.Resistor resistor1(R = 0.001) annotation(
Placement(visible = true, transformation(origin = {80, 36}, extent = {{10, -10}, {-10, 10}}, rotation = 90)));
equation
connect(currentSensor.n, signalVoltage.p) annotation(
@@ -82,4 +82,4 @@ The DC/DC converter is characterized by:
where underlined voltages and currents represent complex phasors