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
Dr. Simon Clark

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 = "
Control the speed of a Electric Pump DC or Recirculation Blower

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 ")); -end DC_DC_Converter; +end DC_DC_Converter; \ No newline at end of file diff --git a/VirtualFCS/Electrical/DC_converter.mo b/VirtualFCS/Electrical/DC_converter.mo index 42b7c03..68f480b 100644 --- a/VirtualFCS/Electrical/DC_converter.mo +++ b/VirtualFCS/Electrical/DC_converter.mo @@ -1,37 +1,30 @@ within VirtualFCS.Electrical; class DC_converter "An ideal DC-DC converter" - parameter Modelica.SIunits.Time Td=1e-2 "Dead time"; - parameter Modelica.SIunits.Time Ti=1e-6 "Time constant of integral power controller"; - Modelica.Electrical.Analog.Sources.SignalCurrent signalCurrent_FC annotation ( - Placement(visible = true, transformation(origin = {-38, 60}, extent = {{-10, -10}, {10, 10}}, rotation = 180))); - Modelica.Electrical.Analog.Sensors.PowerSensor power_FC - annotation (Placement(visible = true, transformation(extent = {{40, 70}, {20, 50}}, rotation = 0))); - Modelica.Electrical.Analog.Sensors.PowerSensor power_DCbus annotation (Placement( - visible = true, transformation(origin = {29, -51}, extent = {{11, 11}, {-11, -11}}, rotation = 180))); - Modelica.Blocks.Continuous.FirstOrder deadTime( - k=1, - initType=Modelica.Blocks.Types.Init.InitialOutput, - y_start=0, - T=Td) annotation (Placement(visible = true, transformation(extent = {{-70, -10}, {-50, 10}}, rotation = 0))); - Modelica.Blocks.Math.Feedback feedback annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - rotation=90, - origin={50,0}))); - Modelica.Blocks.Continuous.Integrator powerController( - initType=Modelica.Blocks.Types.Init.InitialOutput, k = 1 / Ti, - y_start=0) annotation (Placement(transformation(extent={{30,10},{10,30}}))); - Modelica.Electrical.Analog.Interfaces.NegativePin pin_nFC annotation ( - Placement(visible = true,transformation(origin = {-80, 80}, extent = {{-10, -10}, {10, 10}}, rotation = 0), - iconTransformation(origin = {-100, 100}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - Modelica.Electrical.Analog.Interfaces.PositivePin pin_pFC - annotation (Placement(visible = true, transformation(origin = {80, 80}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {100, 100}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - Modelica.Electrical.Analog.Interfaces.NegativePin pin_nBus - annotation (Placement(visible = true, transformation(origin = {-80, -72}, extent = {{-10, 10}, {10, -10}}, rotation = 0), iconTransformation(origin = {-100, -100}, extent = {{-10, 10}, {10, -10}}, rotation = 0))); - Modelica.Electrical.Analog.Interfaces.PositivePin pin_pBus - annotation (Placement(visible = true, transformation(origin = {80, -72}, extent = {{-10, 10}, {10, -10}}, rotation = 0), iconTransformation(origin = {100, -100}, extent = {{-10, 10}, {10, -10}}, rotation = 0))); - Modelica.Blocks.Interfaces.RealInput I_Ref - annotation (Placement(visible = true, transformation(extent = {{-138, -20}, {-98, 20}}, rotation = 0), iconTransformation(origin = {115, 1}, extent = {{15, -15}, {-15, 15}}, rotation = 0))); + parameter Modelica.Units.SI.Time Td = 1e-2 "Dead time"; + parameter Modelica.Units.SI.Time Ti = 1e-6 "Time constant of integral power controller"; + Modelica.Electrical.Analog.Sources.SignalCurrent signalCurrent_FC annotation( + Placement(visible = true, transformation(origin = {-38, 60}, extent = {{-10, -10}, {10, 10}}, rotation = 180))); + Modelica.Electrical.Analog.Sensors.PowerSensor power_FC annotation( + Placement(visible = true, transformation(extent = {{40, 70}, {20, 50}}, rotation = 0))); + Modelica.Electrical.Analog.Sensors.PowerSensor power_DCbus annotation( + Placement(visible = true, transformation(origin = {29, -51}, extent = {{11, 11}, {-11, -11}}, rotation = 180))); + Modelica.Blocks.Continuous.FirstOrder deadTime(k = 1, initType = Modelica.Blocks.Types.Init.InitialOutput, y_start = 0, T = Td) annotation( + Placement(visible = true, transformation(extent = {{-70, -10}, {-50, 10}}, rotation = 0))); + Modelica.Blocks.Math.Feedback feedback annotation( + Placement(transformation(extent = {{-10, -10}, {10, 10}}, rotation = 90, origin = {50, 0}))); + Modelica.Blocks.Continuous.Integrator powerController(initType = Modelica.Blocks.Types.Init.InitialOutput, k = 1 / Ti, y_start = 0) annotation( + Placement(transformation(extent = {{30, 10}, {10, 30}}))); + Modelica.Electrical.Analog.Interfaces.NegativePin pin_nFC annotation( + Placement(visible = true, transformation(origin = {-80, 80}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {-100, 100}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); + Modelica.Electrical.Analog.Interfaces.PositivePin pin_pFC annotation( + Placement(visible = true, transformation(origin = {80, 80}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {100, 100}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); + Modelica.Electrical.Analog.Interfaces.NegativePin pin_nBus annotation( + Placement(visible = true, transformation(origin = {-80, -72}, extent = {{-10, 10}, {10, -10}}, rotation = 0), iconTransformation(origin = {-100, -100}, extent = {{-10, 10}, {10, -10}}, rotation = 0))); + Modelica.Electrical.Analog.Interfaces.PositivePin pin_pBus annotation( + Placement(visible = true, transformation(origin = {80, -72}, extent = {{-10, 10}, {10, -10}}, rotation = 0), iconTransformation(origin = {100, -100}, extent = {{-10, 10}, {10, -10}}, rotation = 0))); + Modelica.Blocks.Interfaces.RealInput I_Ref annotation( + Placement(visible = true, transformation(extent = {{-138, -20}, {-98, 20}}, rotation = 0), iconTransformation(origin = {115, 1}, extent = {{15, -15}, {-15, 15}}, rotation = 0))); Modelica.Electrical.Analog.Sources.SignalCurrent signalCurrent_DCbus annotation( Placement(visible = true, transformation(origin = {-10, -50}, extent = {{10, -10}, {-10, 10}}, rotation = 0))); equation @@ -67,10 +60,10 @@ equation Line(points = {{0, -50}, {16, -50}, {16, -50}, {18, -50}}, color = {0, 0, 255})); connect(signalCurrent_DCbus.n, pin_nBus) annotation( Line(points = {{-20, -50}, {-80, -50}, {-80, -72}, {-80, -72}}, color = {0, 0, 255})); - annotation (Icon(coordinateSystem(preserveAspectRatio = false, initialScale = 0.1), graphics={Rectangle(lineColor = {0, 0, 255}, fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {100, -100}}), Line(points = {{100, 100}, {20, 20}}, color = {0, 0, 255}), Line(points = {{-20, -20}, {-100, -100}}, color = {0, 0, 255}), Text(origin = {-2, -142},lineColor = {128, 128, 128}, extent = {{-40, 80}, {40, 60}}, textString = "DC bus"), Text(lineColor = {0, 0, 255}, extent = {{-100, 20}, {100, -20}}, textString = "%name"), Text(origin = {0, 146},lineColor = {128, 128, 128}, extent = {{-40, -60}, {40, -80}}, textString = "Fuel cell")}), Diagram( - coordinateSystem(preserveAspectRatio=false)), - Documentation(info=" + annotation( + Icon(coordinateSystem(preserveAspectRatio = false, initialScale = 0.1), graphics = {Rectangle(lineColor = {0, 0, 255}, fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {100, -100}}), Line(points = {{100, 100}, {20, 20}}, color = {0, 0, 255}), Line(points = {{-20, -20}, {-100, -100}}, color = {0, 0, 255}), Text(origin = {-2, -142}, lineColor = {128, 128, 128}, extent = {{-40, 80}, {40, 60}}, textString = "DC bus"), Text(lineColor = {0, 0, 255}, extent = {{-100, 20}, {100, -20}}, textString = "%name"), Text(origin = {0, 146}, lineColor = {128, 128, 128}, extent = {{-40, -60}, {40, -80}}, textString = "Fuel cell")}), + Diagram(coordinateSystem(preserveAspectRatio = false)), + Documentation(info = "

This is a model of an ideal DC-DC inverter based on a power balance achieved by an integral controller.

")); - -end DC_converter; +end DC_converter; \ No newline at end of file diff --git a/VirtualFCS/Electrical/SpeedControlledDCMotor.mo b/VirtualFCS/Electrical/SpeedControlledDCMotor.mo index 579bf96..a3e05f4 100644 --- a/VirtualFCS/Electrical/SpeedControlledDCMotor.mo +++ b/VirtualFCS/Electrical/SpeedControlledDCMotor.mo @@ -18,7 +18,7 @@ model SpeedControlledDCMotor Modelica.Blocks.Continuous.FirstOrder preFilter(T = driveData.Tfw, initType = Modelica.Blocks.Types.Init.InitialOutput, k = 1) annotation( Placement(visible = true, transformation(extent = {{-90, 28}, {-70, 48}}, rotation = 0))); Modelica.Blocks.Math.Gain tau2i(k = 1 / driveData.kPhi) annotation( - Placement(visible = true, transformation(origin = { 0, 38}, extent = {{10, -10}, {-10, 10}}, rotation = 180))); + Placement(visible = true, transformation(origin = {0, 38}, extent = {{10, -10}, {-10, 10}}, rotation = 180))); Modelica.Electrical.Machines.Examples.ControlledDCDrives.Utilities.DcdcInverter armatureInverter(Td = driveData.Td, Tmf = driveData.Tmf, VMax = driveData.VaMax, fS = driveData.fS) annotation( Placement(visible = true, transformation(extent = {{72, 28}, {92, 48}}, rotation = 0))); Modelica.Electrical.Machines.Examples.ControlledDCDrives.Utilities.LimitedPI speedController(Ti = driveData.Tiw, constantLimits = true, initType = Modelica.Blocks.Types.Init.InitialOutput, k = driveData.kpw, yMax = driveData.tauMax) annotation( @@ -56,4 +56,4 @@ equation Line(points = {{76, 28}, {76, 28}, {76, 0}, {-10, 0}, {-10, -16}, {-10, -16}}, color = {0, 0, 255})); connect(armatureInverter.pin_pMot, dcpm.pin_ap) annotation( Line(points = {{88, 28}, {88, 28}, {88, -6}, {6, -6}, {6, -16}, {6, -16}}, color = {0, 0, 255})); -end SpeedControlledDCMotor; +end SpeedControlledDCMotor; \ No newline at end of file diff --git a/VirtualFCS/Electrical/UsersGuide/package.mo b/VirtualFCS/Electrical/UsersGuide/package.mo index 63ad224..a986ac0 100644 --- a/VirtualFCS/Electrical/UsersGuide/package.mo +++ b/VirtualFCS/Electrical/UsersGuide/package.mo @@ -2,4 +2,4 @@ within VirtualFCS.Electrical; package UsersGuide "User information for the Electrical sub-library" extends Modelica.Icons.Information; -end UsersGuide; +end UsersGuide; \ No newline at end of file diff --git a/VirtualFCS/Electrical/package.mo b/VirtualFCS/Electrical/package.mo index a53bfa9..0dd4ebc 100644 --- a/VirtualFCS/Electrical/package.mo +++ b/VirtualFCS/Electrical/package.mo @@ -2,11 +2,6 @@ within VirtualFCS; package Electrical "Electrical components supplementing the Modelica Standard Library." extends Modelica.Icons.Package; - - - - - annotation( Documentation(info = "Electrical components")); -end Electrical; +end Electrical; \ No newline at end of file diff --git a/VirtualFCS/Electrochemical/Battery/BatterySystem.mo b/VirtualFCS/Electrochemical/Battery/BatterySystem.mo index 8fe5b92..ef5e80a 100644 --- a/VirtualFCS/Electrochemical/Battery/BatterySystem.mo +++ b/VirtualFCS/Electrochemical/Battery/BatterySystem.mo @@ -12,10 +12,9 @@ model BatterySystem parameter Real V_max_bat_pack(unit = "V") = 403.2 "Battery pack maximum voltage"; parameter Real C_bat_pack(unit = "A.h") = 200 "Battery pack nominal capacity"; parameter Real SOC_init = 0.5 "Battery pack initial state of charge"; - - VirtualFCS.Electrochemical.Battery.LiIonBatteryPack_Lumped batteryPack(C_bat_pack = C_bat_pack, Cp_bat_pack = Cp_bat_pack, H_bat_pack = H_bat_pack, L_bat_pack = L_bat_pack, SOC_init = SOC_init, V_max_bat_pack = V_max_bat_pack, V_min_bat_pack = V_min_bat_pack, V_nom_bat_pack = V_nom_bat_pack, W_bat_pack = W_bat_pack, m_bat_pack = m_bat_pack) annotation( + VirtualFCS.Electrochemical.Battery.LiIonBatteryPack_Lumped batteryPack(C_bat_pack = C_bat_pack, Cp_bat_pack = Cp_bat_pack, H_bat_pack = H_bat_pack, L_bat_pack = L_bat_pack, SOC_init = SOC_init, V_max_bat_pack = V_max_bat_pack, V_min_bat_pack = V_min_bat_pack, V_nom_bat_pack = V_nom_bat_pack, W_bat_pack = W_bat_pack, m_bat_pack = m_bat_pack) annotation( Placement(visible = true, transformation(origin = {0.369106, -30.5794}, extent = {{-24.8691, -14.9215}, {24.8691, 16.5794}}, rotation = 0))); - VirtualFCS.Control.BatteryManagementSystem batteryManagementSystem(N_s = batteryPack.N_s) annotation( + VirtualFCS.Control.BatteryManagementSystem batteryManagementSystem(N_s = batteryPack.N_s) annotation( Placement(visible = true, transformation(origin = {0, 30}, extent = {{-30, -20}, {30, 20}}, rotation = 0))); Modelica.Electrical.Analog.Interfaces.PositivePin pin_p annotation( Placement(visible = true, transformation(origin = {44, 96}, extent = {{10, -10}, {-10, 10}}, rotation = 0), iconTransformation(origin = {44, 96}, extent = {{10, -10}, {-10, 10}}, rotation = 0))); @@ -48,7 +47,7 @@ equation Line(points = {{8, -44}, {8, -44}, {8, -70}, {60, -70}, {60, -70}}, color = {191, 0, 0})); connect(batteryManagementSystem.sensorInterface, sensorOutput) annotation( Line(points = {{-22, 30}, {-60, 30}, {-60, 0}, {-110, 0}, {-110, 0}}, color = {0, 0, 127})); -annotation( + annotation( Icon(graphics = {Bitmap(origin = {-2, 2}, extent = {{-98, 98}, {102, -102}}, imageSource = "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"), Text(origin = {-6, -250}, lineColor = {0, 0, 255}, extent = {{-150, 120}, {150, 150}}, textString = "%name")}), Documentation(info = " @@ -721,4 +720,4 @@ annotation(

Related packages:

Default Parameters
Parameter nameValueUnit
m_bat_pack=100kg
L_bat_pack=0.6m
W_bat_pack=0.45m
H_bat_pack=0.1m
Cp=1000J/(kg.K)
V_min_bat_pack=240V
V_nom_bat_pack=336V
V_max_bat_pack=403.2V
C_bat_pack=200Ah
SOC_init=0.5-
")); -end BatterySystem; +end BatterySystem; \ No newline at end of file diff --git a/VirtualFCS/Electrochemical/Battery/LiIonBatteryPack_Composite.mo b/VirtualFCS/Electrochemical/Battery/LiIonBatteryPack_Composite.mo index 12ee39d..2bbdb10 100644 --- a/VirtualFCS/Electrochemical/Battery/LiIonBatteryPack_Composite.mo +++ b/VirtualFCS/Electrochemical/Battery/LiIonBatteryPack_Composite.mo @@ -2,23 +2,20 @@ within VirtualFCS.Electrochemical.Battery; model LiIonBatteryPack_Composite "A Li-ion battery pack comprised of individual Li-ion cell models." // DECLARE PARAMETERS // - // Pack design parameters parameter Real SOC_init(unit = "1") = 0.5 "Initial State of Charge"; parameter Integer p = 5 "Number of Cells in Parallel"; parameter Integer s = 10 "Number of Cells in Series"; - parameter Real coolingArea = p * s * liIonCell[1].coolingArea "Cooling Area"; - parameter Real heatTransferCoefficient(unit="W/(m2.K)") = 7.8 * 10 ^ 0.78; + parameter Real heatTransferCoefficient(unit = "W/(m2.K)") = 7.8 * 10 ^ 0.78; Real chargeCapacity; - VirtualFCS.Electrochemical.Battery.LiIonCell liIonCell[s * p](each SOC_init = SOC_init) annotation( Placement(visible = true, transformation(origin = {0, 50.3333}, extent = {{-37, -24.6667}, {37, 24.6667}}, rotation = 0))); Modelica.Electrical.Analog.Interfaces.PositivePin pin_p annotation( Placement(visible = true, transformation(origin = {90, 90}, extent = {{10, -10}, {-10, 10}}, rotation = 0), iconTransformation(origin = {90, 90}, extent = {{10, -10}, {-10, 10}}, rotation = 0))); Modelica.Electrical.Analog.Interfaces.NegativePin pin_n annotation( Placement(visible = true, transformation(origin = {-90, 92}, extent = {{10, -10}, {-10, 10}}, rotation = 0), iconTransformation(origin = {-90, 90}, extent = {{10, -10}, {-10, 10}}, rotation = 0))); - Modelica.Thermal.HeatTransfer.Components.ThermalCollector thermalCollector(m = s * p) annotation( + Modelica.Thermal.HeatTransfer.Components.ThermalCollector thermalCollector(m = s * p) annotation( Placement(visible = true, transformation(origin = {0, 10}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatPort annotation( Placement(visible = true, transformation(origin = {0, -20}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {0, -80}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); @@ -35,7 +32,6 @@ model LiIonBatteryPack_Composite "A Li-ion battery pack comprised of individual equation // ***DEFINE EQUATIONS ***// chargeCapacity = p * liIonCell[1].chargeCapacity; - // ***DEFINE CONNECTIONS ***// for i in 1:p loop connect(pin_n, liIonCell[s * (i - 1) + 1].pin_n); @@ -65,10 +61,8 @@ equation protected annotation( Icon(graphics = {Rectangle(origin = {0, -15}, fillColor = {200, 200, 200}, fillPattern = FillPattern.Solid, extent = {{-130, 85}, {130, -75}}), Rectangle(origin = {0, 85}, fillColor = {85, 170, 255}, fillPattern = FillPattern.Solid, extent = {{-150, 15}, {150, -15}}), Text(origin = {68, 93}, lineColor = {255, 255, 255}, extent = {{-22, 15}, {10, -19}}, textString = "+"), Text(origin = {-74, 105}, lineColor = {255, 255, 255}, extent = {{-22, 15}, {52, -41}}, textString = "-"), Text(origin = {-34, -103}, lineColor = {0, 0, 255}, extent = {{-22, 15}, {86, -41}}, textString = "%name")}, coordinateSystem(initialScale = 0.05, extent = {{-150, -90}, {150, 100}})), - uses(Modelica(version = "3.2.3")), Diagram(coordinateSystem(initialScale = 0.05, extent = {{-150, -90}, {150, 100}})), - version = "", - Documentation(info = "
This model describes a lithium-ion battery pack as a composite of several separate instances of the LiIonCell model. This setup has the advantage of being able to consider the performance of each individual cell, which may be useful for some investigations such as cell-balancing. However, it can also lead to a very large system of equations for complex models with many cells causing high computational cost. 
+ Documentation(info = "
This model describes a lithium-ion battery pack as a composite of several separate instances of the LiIonCell model. This setup has the advantage of being able to consider the performance of each individual cell, which may be useful for some investigations such as cell-balancing. However, it can also lead to a very large system of equations for complex models with many cells causing high computational cost. 

This class automatically generates instances of the LiIonCell model based on the user's input. The user must determine how many cells are in parallel (parameter p) and in series (parameter s). A series of for loops then connects the cells in series or in parallel based on the requested architecture. The stack voltage is accessible by pin_p and pin_n.

The thermalCollector class automatically gathers all the heatPort outputs from each instance of LiIonCell and connects them to parallel convective and radiative heat transfer blocks. The effective cooling area for the blocks is the same and is assumed equal to the surface area of each cell multiplied by the number of cells in the pack. The ambient temperature T0 is determined by connection to the heatBoundary.

@@ -101,4 +95,4 @@ This class automatically generates instances of the LiIonCell model based on the
Convective Heat Transfer
Qconv = hAcool(T  T0)

Radiative Heat Transfer
Qrad = 0.95Acoolσ(T4  (T0)4)
")); -end LiIonBatteryPack_Composite; +end LiIonBatteryPack_Composite; \ No newline at end of file diff --git a/VirtualFCS/Electrochemical/Battery/LiIonBatteryPack_Lumped.mo b/VirtualFCS/Electrochemical/Battery/LiIonBatteryPack_Lumped.mo index 683dbf8..864887c 100644 --- a/VirtualFCS/Electrochemical/Battery/LiIonBatteryPack_Lumped.mo +++ b/VirtualFCS/Electrochemical/Battery/LiIonBatteryPack_Lumped.mo @@ -13,11 +13,10 @@ model LiIonBatteryPack_Lumped "A Li-ion battery pack model comprising a single l parameter Real V_max_bat_pack(unit = "V") = 54.75 "Battery pack maximum voltage"; parameter Real C_bat_pack(unit = "A.h") = 200 "Battery pack nominal capacity"; parameter Real SOC_init = 0.5 "Battery pack initial state of charge"; - parameter Real heatTransferCoefficient(unit="W/(m2.K)") = 7.8 * 10 ^ 0.78; + parameter Real heatTransferCoefficient(unit = "W/(m2.K)") = 7.8 * 10 ^ 0.78; parameter Real N_s = ceil(V_max_bat_pack / V_chem_max); Real vol_bat_pack = L_bat_pack * W_bat_pack * H_bat_pack; - -// ADD dropdown menu for selecting chemistry type + // ADD dropdown menu for selecting chemistry type // Coefficients for open-circuit voltage calculation // LFP parameter Real V_chem_max = 3.65; @@ -30,9 +29,6 @@ model LiIonBatteryPack_Lumped "A Li-ion battery pack model comprising a single l Real g1 = -0.06; Real h1 = -0.02; Real i1 = -0.002; - - - Modelica.Electrical.Analog.Interfaces.PositivePin pin_p annotation( Placement(visible = true, transformation(origin = {146, 50}, extent = {{10, -10}, {-10, 10}}, rotation = 0), iconTransformation(origin = {90, 90}, extent = {{10, -10}, {-10, 10}}, rotation = 0))); Modelica.Electrical.Analog.Interfaces.NegativePin pin_n annotation( @@ -73,7 +69,6 @@ model LiIonBatteryPack_Lumped "A Li-ion battery pack model comprising a single l Placement(visible = true, transformation(origin = {-70, -80}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {50, -80}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); Modelica.Thermal.HeatTransfer.Components.BodyRadiation bodyRadiation(Gr = 0.95 * A_cool_bat_pack) annotation( Placement(visible = true, transformation(origin = {-90, -50}, extent = {{-10, -10}, {10, 10}}, rotation = -90))); - protected parameter Real Rohm_0(unit = "Ohm") = 0.02 "Ohmic Resistance"; parameter Real R1_0(unit = "Ohm") = 0.01 "First RC Resistance"; @@ -81,7 +76,6 @@ protected parameter Real C1_0(unit = "F") = 5000 "First RC Capacitance"; parameter Real C2_0(unit = "F") = 20000 "Second RC Capacitance"; parameter Real A_cool_bat_pack = L_bat_pack * W_bat_pack; - equation // ***DEFINE EQUATIONS ***// // Calculate the open-circuit voltage at given temperature and state of charge @@ -134,10 +128,9 @@ equation protected annotation( Icon(graphics = {Rectangle(origin = {0, -15}, fillColor = {200, 200, 200}, fillPattern = FillPattern.Solid, extent = {{-130, 85}, {130, -75}}), Rectangle(origin = {0, 85}, fillColor = {85, 170, 255}, fillPattern = FillPattern.Solid, extent = {{-150, 15}, {150, -15}}), Text(origin = {68, 93}, lineColor = {255, 255, 255}, extent = {{-22, 15}, {10, -19}}, textString = "+"), Text(origin = {-74, 105}, lineColor = {255, 255, 255}, extent = {{-22, 15}, {52, -41}}, textString = "-"), Text(origin = {-34, -103}, lineColor = {0, 0, 255}, extent = {{-22, 15}, {86, -41}}, textString = "%name")}, coordinateSystem(initialScale = 0.05, extent = {{-150, -90}, {150, 100}})), - uses(Modelica(version = "3.2.3")), Diagram(coordinateSystem(initialScale = 0.05, extent = {{-150, -90}, {150, 100}})), version = "", - Documentation(info = "
This model describes a lithium-ion battery pack as a lumped version of the LiIonCell model. The primary difference is that the open-circuit voltage (OCV) is scaled by the number of cells in series in the stack, estimated as the battery pack maximum voltage divided by the maximum voltage of a single cell (Vmax,bat pack/Vchem,max).

The model includes a ChargeCounter block to keep track of the state of charge (SOC) of the battery.
+ Documentation(info = "
This model describes a lithium-ion battery pack as a lumped version of the LiIonCell model. The primary difference is that the open-circuit voltage (OCV) is scaled by the number of cells in series in the stack, estimated as the battery pack maximum voltage divided by the maximum voltage of a single cell (Vmax,bat pack/Vchem,max).

The model includes a ChargeCounter block to keep track of the state of charge (SOC) of the battery.
@@ -206,5 +199,4 @@ The equation for open-circuit voltage as a function of temperature and state of V

Default Equivalent Circuit Parameters
Parameter nameValueUnit
R_0=0.02Ohm
R_1=0.01Ohm
R_2=0.005Ohm
C_1=5000F
C_2=20000F

Default Thermal Parameters
Parameter nameValueUnit
Cp=1000J/(kg*K)
A_cool_bat_pack =L_bat_pack*W_bat_packm2
heatTransferCoefficient =7.8*10^0.78W/(m2*K)

Equations
Open-Circuit Voltage
OCV = [A1 + B1*(20 ° T  °C)/SOC + C1/sqrt(SOC) + D1*SOC + E1*ln(SOC) + F1*ln(1.01  SOC) + G1*ln(1.001  SOC) + H1*exp(I1*(T °C))]*(Vmax,bat pack/Vchem,max)

The coefficients for A1 through I1 are taken from [1] for LFP batteries.

Battery Temperature
m*Cp dT/dt = Qflow + Qconv + Qrad

Heat Generation
Qflow = (OCV  Vpin,p)*I

Convective Heat Transfer
Qconv = hAcool(T  T0); h = 47 W m2 K1

Radiative Heat Transfer
Qrad = 0.95Acoolσ(T4  (T0)4)


References
1.
Vichard, L. et al. A method to estimate battery SOH indicators based on vehicle operating data only. Energy 225, 120235 (2021).
")); - -end LiIonBatteryPack_Lumped; +end LiIonBatteryPack_Lumped; \ No newline at end of file diff --git a/VirtualFCS/Electrochemical/Battery/LiIonCell.mo b/VirtualFCS/Electrochemical/Battery/LiIonCell.mo index 4e298ca..546ae1d 100644 --- a/VirtualFCS/Electrochemical/Battery/LiIonCell.mo +++ b/VirtualFCS/Electrochemical/Battery/LiIonCell.mo @@ -54,7 +54,7 @@ model LiIonCell "An equivalent circuit model for a Li-ion battery cell." Placement(visible = true, transformation(origin = {20, 52}, extent = {{11, 11}, {-11, -11}}, rotation = 180))); Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow heatSource annotation( Placement(visible = true, transformation(origin = {-130, -40}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - Modelica.Thermal.HeatTransfer.Components.HeatCapacitor heatCapacitor(C = specificHeatCapacity * mass) annotation( + Modelica.Thermal.HeatTransfer.Components.HeatCapacitor heatCapacitor(C = specificHeatCapacity * mass) annotation( Placement(visible = true, transformation(origin = {-50, -28}, extent = {{-12, -12}, {12, 12}}, rotation = 0))); Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatPort annotation( Placement(visible = true, transformation(origin = {-50, -94}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {0, -30}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); @@ -193,4 +193,4 @@ equation
")); -end LiIonCell; +end LiIonCell; \ No newline at end of file diff --git a/VirtualFCS/Electrochemical/Battery/Parameters.mo b/VirtualFCS/Electrochemical/Battery/Parameters.mo index d00ce1b..2184ede 100644 --- a/VirtualFCS/Electrochemical/Battery/Parameters.mo +++ b/VirtualFCS/Electrochemical/Battery/Parameters.mo @@ -9,7 +9,7 @@ package Parameters "Parameters for battery models" function getOCP_NMC extends Modelica.Icons.Function; input Real SOC "State of Charge"; - output SI.ElectricPotential OCP "Open-Circuit Potential"; + output Modelica.Units.SI.ElectricPotential OCP "Open-Circuit Potential"; // Coefficients for open-circuit voltage calculation // NMC Real A0 = 2.951; @@ -23,4 +23,4 @@ package Parameters "Parameters for battery models" end Functions; annotation( Documentation(info = "This package includes functions to calculate the battery's open-circuit potential for various chemistries based on state of charge, SOC. 

As of February 2022, it is not used in any other Virtual-FCS model or component, but is included in the releases anyway as a placeholder for future development. Ideally, this framework can be used to select between different battery chemistries in a vehicle model.
")); -end Parameters; +end Parameters; \ No newline at end of file diff --git a/VirtualFCS/Electrochemical/Battery/package.mo b/VirtualFCS/Electrochemical/Battery/package.mo index 67ea10d..e2aaf40 100644 --- a/VirtualFCS/Electrochemical/Battery/package.mo +++ b/VirtualFCS/Electrochemical/Battery/package.mo @@ -2,16 +2,6 @@ within VirtualFCS.Electrochemical; package Battery "Models for battery cells and packs." extends Modelica.Icons.VariantsPackage; - - - - - - - - - - annotation( Documentation(info = "This sub-package includes models for simulating the performance of lithium-ion cells and packs.

@@ -35,4 +25,4 @@ package Battery "Models for battery cells and packs." ")); -end Battery; +end Battery; \ No newline at end of file diff --git a/VirtualFCS/Electrochemical/Hydrogen/FuelCell.mo b/VirtualFCS/Electrochemical/Hydrogen/FuelCell.mo index fb4b611..907047b 100644 --- a/VirtualFCS/Electrochemical/Hydrogen/FuelCell.mo +++ b/VirtualFCS/Electrochemical/Hydrogen/FuelCell.mo @@ -69,7 +69,7 @@ model FuelCell "Model for a single PEM fuel cell" Placement(visible = true, transformation(origin = {60, 150}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {60, 150}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); Modelica.Electrical.Analog.Interfaces.NegativePin pin_n annotation( Placement(visible = true, transformation(origin = {-60, 150}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {-60, 150}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - Modelica.Electrical.Analog.Basic.Resistor R_ohmic(R = R_0) annotation( + Modelica.Electrical.Analog.Basic.Resistor R_ohmic(R = R_0) annotation( Placement(visible = true, transformation(origin = {60, 120}, extent = {{-10, -10}, {10, 10}}, rotation = 90))); Modelica.Electrical.Analog.Sources.SignalVoltage potentialSource annotation( Placement(visible = true, transformation(origin = {-60, 120}, extent = {{-10, -10}, {10, 10}}, rotation = 90))); @@ -146,8 +146,6 @@ equation annotation( Diagram(coordinateSystem(extent = {{-150, -150}, {150, 150}}, initialScale = 0.1)), Icon(coordinateSystem(extent = {{-150, -150}, {150, 150}}, initialScale = 0.1), graphics = {Line(origin = {20.1754, 1.92106}, points = {{0, 78}, {0, -80}, {0, -82}}), Rectangle(origin = {80, 0}, fillColor = {0, 178, 227}, pattern = LinePattern.None, fillPattern = FillPattern.Solid, extent = {{-20, 100}, {20, -100}}), Line(origin = {40.1315, 2}, points = {{0, 78}, {0, -80}, {0, -82}}), Line(origin = {0.219199, 1.92106}, points = {{0, 78}, {0, -80}, {0, -82}}), Line(origin = {-40.0001, 1.61404}, points = {{0, 78}, {0, -80}, {0, -82}}), Rectangle(origin = {-80, 0}, fillColor = {170, 0, 0}, pattern = LinePattern.None, fillPattern = FillPattern.Solid, extent = {{-20, 100}, {20, -100}}), Text(origin = {10, -54}, lineColor = {255, 0, 0}, extent = {{-11, 6}, {11, -6}}, textString = "K"), Line(origin = {-20.0439, -0.307018}, points = {{0, 80}, {0, -80}, {0, -80}}), Rectangle(origin = {35, 54}, fillColor = {177, 177, 177}, fillPattern = FillPattern.Vertical, extent = {{-95, 26}, {25, -134}}), Text(origin = {-80, 6}, extent = {{-26, 24}, {26, -24}}, textString = "A"), Text(origin = {80, 6}, extent = {{-26, 24}, {26, -24}}, textString = "C")}), - version = "", - uses(Modelica(version = "3.2.3")), Documentation(info = "This model describes the dynamic behaviour of a proton exchange membrane fuel cell (PEMFC). The model includes components describing the electrical, fluidic, and thermal properties of the cell.

The electrical performance is modelled using a simple 1RC equivalent circuit. 

The fluidic performance is modelled using simple ideal flow components for the air and hydrogen gas lines, connected to mass sink boundary conditions. The magnitude of the mass sink is coupled to the electrical current in the cell using Faraday's law. 

The thermal performance is considered by coupling a model describing the flow of liquid coolant to a thermal heat source. The magnitude of the heat source is calculated using the higher heating value of hydrogen and the calculated electrical voltage of the cell. 

@@ -235,4 +233,4 @@ equation
Name Description
")); -end FuelCell; +end FuelCell; \ No newline at end of file diff --git a/VirtualFCS/Electrochemical/Hydrogen/FuelCellStack.mo b/VirtualFCS/Electrochemical/Hydrogen/FuelCellStack.mo index 21b0a1c..1cb3319 100644 --- a/VirtualFCS/Electrochemical/Hydrogen/FuelCellStack.mo +++ b/VirtualFCS/Electrochemical/Hydrogen/FuelCellStack.mo @@ -1,7 +1,7 @@ within VirtualFCS.Electrochemical.Hydrogen; -model FuelCellStack -//*** DEFINE REPLACEABLE PACKAGES ***// +model FuelCellStack + //*** DEFINE REPLACEABLE PACKAGES ***// // Medium models replaceable package Cathode_Medium = Modelica.Media.Air.MoistAir; replaceable package Anode_Medium = Modelica.Media.IdealGases.SingleGases.H2; @@ -14,7 +14,7 @@ model FuelCellStack parameter Real W_FC_stack(unit = "m") = 0.582 "FC stack width"; parameter Real H_FC_stack(unit = "m") = 0.156 "FC stack height"; parameter Real vol_FC_stack(unit = "m3") = L_FC_stack * W_FC_stack * H_FC_stack "FC stack volume"; - parameter Real I_rated_FC_stack(unit="A") = 450 "FC stack rated current"; + parameter Real I_rated_FC_stack(unit = "A") = 450 "FC stack rated current"; parameter Real i_L_FC_stack(unit = "A") = 760 "FC stack cell maximum limiting current"; parameter Real N_FC_stack(unit = "1") = 455 "FC stack number of cells"; parameter Real A_FC_surf(unit = "m2") = 2 * (L_FC_stack * W_FC_stack) + 2 * (L_FC_stack * H_FC_stack) + 2 * (W_FC_stack * H_FC_stack) "FC stack surface area"; @@ -23,9 +23,8 @@ model FuelCellStack parameter Real i_x_FC_stack(unit = "A") = 0.001 "FC stack cell cross-over current"; parameter Real b_1_FC_stack(unit = "V/dec") = 0.0985 "FC stack cell Tafel slope"; parameter Real b_2_FC_stack(unit = "V/dec") = 0.0985 "FC stack cell trasport limitation factor"; - parameter Real R_0_FC_stack(unit = "Ohm") = 0.00022*N_FC_stack "FC stack cell ohmic resistance"; - -// Thermal parameters + parameter Real R_0_FC_stack(unit = "Ohm") = 0.00022 * N_FC_stack "FC stack cell ohmic resistance"; + // Thermal parameters parameter Real Cp_FC_stack(unit = "J/(kg.K)") = 1100 "FC stack specific heat capacity"; //*** DECLARE VARIABLES ***// // Physical constants @@ -157,8 +156,6 @@ equation annotation( Diagram(coordinateSystem(extent = {{-150, -150}, {150, 150}}, initialScale = 0.1)), Icon(coordinateSystem(extent = {{-150, -150}, {150, 150}}, initialScale = 0.1), graphics = {Line(origin = {20.1754, 1.92106}, points = {{0, 78}, {0, -80}, {0, -82}}), Rectangle(origin = {80, 0}, fillColor = {0, 178, 227}, pattern = LinePattern.None, fillPattern = FillPattern.Solid, extent = {{-20, 100}, {20, -100}}), Line(origin = {40.1315, 2}, points = {{0, 78}, {0, -80}, {0, -82}}), Line(origin = {0.219199, 1.92106}, points = {{0, 78}, {0, -80}, {0, -82}}), Line(origin = {-40.0001, 1.61404}, points = {{0, 78}, {0, -80}, {0, -82}}), Rectangle(origin = {-80, 0}, fillColor = {170, 0, 0}, pattern = LinePattern.None, fillPattern = FillPattern.Solid, extent = {{-20, 100}, {20, -100}}), Text(origin = {10, -54}, lineColor = {255, 0, 0}, extent = {{-11, 6}, {11, -6}}, textString = "K"), Line(origin = {-20.0439, -0.307018}, points = {{0, 80}, {0, -80}, {0, -80}}), Rectangle(origin = {35, 54}, fillColor = {177, 177, 177}, fillPattern = FillPattern.Vertical, extent = {{-95, 26}, {25, -134}}), Text(origin = {-80, 6}, extent = {{-26, 24}, {26, -24}}, textString = "A"), Text(origin = {80, 6}, extent = {{-26, 24}, {26, -24}}, textString = "C")}), - version = "", - uses(Modelica(version = "3.2.3")), Documentation(info = "This model describes the dynamic behaviour of a proton exchange membrane fuel cell (PEMFC) stack. The model includes components describing the electrical, fluidic, and thermal properties of the stack. 

The electrical performance is modelled using a 0-D polarization curve model , which incorporates Nernstian thermodynamic effects due to hydrogen and oxygen pressure changes, Tafel kinetics to calculate activation overpotentials, and an empirical relationship to calculate mass-transport overpotentials. These effects are combined in potentialSource.v,which calculates the open-circuit voltage for a single cell, adjusts for hydrogen and oxygen partial pressures, subtracts the activation and mass-transport overpotentials, and finally multiplies by the number of cells in the stack. A simple resistor is included after the potential source to cover all Ohmic resistive losses in the fuel cell. Default parameters fit the polarization curve given by Powercell in their Powercellution data sheet, available here.

The fluidic performance is modelled using simple ideal flow components for the air and hydrogen gas lines, connected to mass sink boundary conditions. The magnitude of the mass sink is coupled to the electrical current in the stack using Faraday's law.  

The thermal performance is considered by coupling a model describing the flow of liquid coolant to a thermal heat source. The magnitude of the heat source is calculated using the higher heating value of hydrogen and the calculated electrical voltage of the cell.

The hydrogen, air, and coolant ports can be connected to their respective subsystems, either by using the FuelCellSubSystems block, or individual SubSystemHydrogen, SubSystemAir, and SubSystemCooling blocks.
  @@ -257,4 +254,4 @@ equation
")); -end FuelCellStack; +end FuelCellStack; \ No newline at end of file diff --git a/VirtualFCS/Electrochemical/Hydrogen/FuelCellSystem.mo b/VirtualFCS/Electrochemical/Hydrogen/FuelCellSystem.mo index 8cb1591..0c3c813 100644 --- a/VirtualFCS/Electrochemical/Hydrogen/FuelCellSystem.mo +++ b/VirtualFCS/Electrochemical/Hydrogen/FuelCellSystem.mo @@ -1,31 +1,27 @@ within VirtualFCS.Electrochemical.Hydrogen; model FuelCellSystem - parameter Real m_FC_system(unit = "kg") = fuelCellStack.m_FC_stack + fuelCellSubSystems.m_FC_subsystems; - -// Fuel Cell Stack Paramters + // Fuel Cell Stack Paramters parameter Real m_FC_stack(unit = "kg") = 42 "FC stack mass"; parameter Real L_FC_stack(unit = "m") = 0.420 "FC stack length"; parameter Real W_FC_stack(unit = "m") = 0.582 "FC stack width"; parameter Real H_FC_stack(unit = "m") = 0.156 "FC stack height"; parameter Real vol_FC_stack(unit = "m3") = L_FC_stack * W_FC_stack * H_FC_stack "FC stack volume"; // parameter Real V_rated_FC_stack(unit="V") = 57.9 "Maximum stack operating voltage"; - parameter Real I_rated_FC_stack(unit="A") = 450 "FC stack rated current"; + parameter Real I_rated_FC_stack(unit = "A") = 450 "FC stack rated current"; parameter Real i_L_FC_stack(unit = "A") = 760 "FC stack cell maximum limiting current"; parameter Real N_FC_stack(unit = "1") = 455 "FC stack number of cells"; // H2 Subsystem Paramters - parameter Real V_tank_H2(unit="m3") = 0.13 "H2 tank volume"; - parameter Real p_tank_H2(unit="Pa") = 35000000 "H2 tank initial pressure"; - - - VirtualFCS.Electrochemical.Hydrogen.FuelCellStack fuelCellStack( H_FC_stack = H_FC_stack, I_rated_FC_stack = I_rated_FC_stack, L_FC_stack = L_FC_stack, W_FC_stack = W_FC_stack, m_FC_stack = m_FC_stack, vol_FC_stack = vol_FC_stack) annotation( + parameter Real V_tank_H2(unit = "m3") = 0.13 "H2 tank volume"; + parameter Real p_tank_H2(unit = "Pa") = 35000000 "H2 tank initial pressure"; + VirtualFCS.Electrochemical.Hydrogen.FuelCellStack fuelCellStack(H_FC_stack = H_FC_stack, I_rated_FC_stack = I_rated_FC_stack, L_FC_stack = L_FC_stack, W_FC_stack = W_FC_stack, m_FC_stack = m_FC_stack, vol_FC_stack = vol_FC_stack) annotation( Placement(visible = true, transformation(origin = {-1, 10}, extent = {{-26, -26}, {26, 26}}, rotation = 0))); Modelica.Electrical.Analog.Interfaces.PositivePin pin_p annotation( Placement(visible = true, transformation(origin = {20, 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 annotation( Placement(visible = true, transformation(origin = {-40, 96}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {-50, 90}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - VirtualFCS.SubSystems.FuelCellSubSystems fuelCellSubSystems(V_tank_H2 = V_tank_H2, p_tank_H2 = p_tank_H2) annotation( + VirtualFCS.SubSystems.FuelCellSubSystems fuelCellSubSystems(V_tank_H2 = V_tank_H2, p_tank_H2 = p_tank_H2) annotation( Placement(visible = true, transformation(origin = {-1, -60}, extent = {{-25, -25}, {25, 25}}, rotation = 0))); Modelica.Blocks.Routing.Multiplex2 multiplex2 annotation( Placement(visible = true, transformation(origin = {-54, -60}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); @@ -41,9 +37,9 @@ model FuelCellSystem Placement(visible = true, transformation(origin = {132, 42}, extent = {{15, -10}, {-15, 10}}, rotation = 0))); Modelica.Thermal.HeatTransfer.Components.BodyRadiation bodyRadiation(Gr = 0.95 * fuelCellStack.A_FC_surf) annotation( Placement(visible = true, transformation(origin = {52, 42}, extent = {{10, -10}, {-10, 10}}, rotation = -90))); - Modelica.Thermal.HeatTransfer.Sources.FixedTemperature fixedTemperature(T = 293.15) annotation( + Modelica.Thermal.HeatTransfer.Sources.FixedTemperature fixedTemperature(T = 293.15) annotation( Placement(visible = true, transformation(origin = {70, 86}, extent = {{10, -10}, {-10, 10}}, rotation = 90))); - Modelica.Blocks.Nonlinear.Limiter limiter(limitsAtInit = true, uMax = i_L_FC_stack, uMin = 0) annotation( + Modelica.Blocks.Nonlinear.Limiter limiter(uMax = i_L_FC_stack, uMin = 0) annotation( Placement(visible = true, transformation(origin = {-80, 0}, extent = {{-10, -10}, {10, 10}}, rotation = -90))); equation connect(pin_p, fuelCellStack.pin_p) annotation( @@ -88,4 +84,4 @@ protected annotation( Icon(graphics = {Bitmap(origin = {-5, 4}, extent = {{-95, 96}, {105, -104}}, imageSource = "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Up7ibH6mu47F2RfsW2vBF+pU7upwfpYnj8GbzFtr0ZvGrTzZ4fwMdxrffnatdWsturaO5U5O56c9cXzzG4xbazfgDeNanuh0fsodx7eefdq2tXYDPl3nckfH85MeN77xtaattRv02nEvj3M8P+FW49vOPmHZWrtBn6iDuZXz+XH15b1ebdhauxGvHhfzs7/s1zPHN/XvBN3aearfN/qZzufH3GF8y9nX7VprN+LrdTJ3cEDX94jxDf11J1s7b/UVKR/hgK7v+eMb+neQae28fWzczPMd0PXsPy3vO1attRv1nTqan/4JevUVkd9l1Fo7D+8aV/PHTuhHbvaSkT9n01o7D58bV/OSmzmiH/qNUV9h0lo7L68Yd/OTv2d0/eKL91u01s7L+8fd/MQvxLjtaP11VFq7MPtXVrmtM9o9dKTXGbTWztPrxuU81BntnjrSNb69tXaerhmX81RnVG4+Sn9RotYu1P5lim7ukIa7jfAa39xaO2+vGbdzN4c01M/Le69vba2dt/eO27n+z897xgif8a2ttfP2mXE71/varrcY//nsm761tXbevlnHcwun5Isi9xd/aO0i1JeCuKdTOnfukeM/vs+3tdYuwPvG9TzSKZ079+zxH/trT7Z2EeqrUT7bKZ275fhPZ9/yba21C/CtOp9bOqb7jP/wet/UWrsgrx/3cx/H9OjxHz7oW1prF+SD434e7Zjq91f/vG9prV2Qz4/78Xuv32b8+dl3fUtr7YJ8tw7oNnVMdxl/+kbf0Fq7QG8cF3SXOqYHjT99j95au0DvGRf0oDqmR40/7V/L1NpFql/T9Kg6pvryD/2vbFu7SPWvbfcvBPG88adf01trF+hr44KeN27pZuPPzr6vt9Yu0PfrhMZXz7v9+JP+bZlau2j1GzXdfjume48/eZvaWrtgbxs3dO/tmB4+/qR/MlFrF61+QtHDt2N67PiTj6uttQv28XFDj92Oqb7+w5fV1toF+/K4ofF1IF44/qS//kNrF62+DsQLz5271fjjy8XW2kV4+biiW5270/jDG7TW2kV4w7iiO527x/jDO7XW2kV457iie5y73/jDu7XW2kV497ii+5174PhDf5mv1i5BfbmvB557yPjDh7XW2kX48Liih5z7nfGH/tVMrV2C+hVNv73/0sCPaq21i/DRcUWPPPdH4w+f0lprF+FT44r+8NwTxh/619m2dgnq19o+4dyTxh++qLXWLsIXxxU96dzTxh+u01prF+G6cUVPO/ec8Yf+ChCtXYL6KhDP2b+cyje01tpF+Ma4ouede8H4w7e11tpF+Pa4ohece/H4w/e01tpF+N64ohefG//vmdRauyh1Rn1MrV26OqM+ptYuXZ1RH1Nrl67OqI+ptUtXZ9TH1NqlqzPqY2rt0tUZ9TG1dunqjPqYWrt0dUZ9TK1dujqjPqbWLl2dUR9Ta5euzqiPqbVLV2fUx9Tapasz6mNq7dLVGfUxtXbp6oz6mFq7dHVGfUytXbo6oz6m1i5dnVEfU2uXrs6oj6m1S1dn1MfU2qWrM+pjau3S1Rldlsf0/03kyXb58JGZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZwpPL1Rn1MbVT85GZ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"), Text(origin = {-6, -250}, lineColor = {0, 0, 255}, extent = {{-150, 120}, {150, 150}}, textString = "%name")}, coordinateSystem(initialScale = 0.1)), Documentation(info = "The FuelCellSystem class packages together a FuelCellStack module and a FuelCellSubSystems module for controlling hydrogen, air, and coolant feeds into and out of the fuel cell.

The hydrogen, air, and coolant ports can be connected to their respective subsystems, either by using theblock, or individual SubSystemHydrogenSubSystemAir, and SubSystemCooling blocks.

In addition to the coolant subsystem, it is assumed that the fuel cell stack exchanges heat with its surroundings by convection and radiation.

Default parameters fit the polarization curve given by Powercell in their Powercellution data sheet, available here.
 
Default Parameters
Parameter nameValueUnit
m_FC_stack=42kg
L_FC_stack=0.42m
W_FC_stack=0.582m
H_FC_stack=0.156m
I_rated_FC_stack=450A
i_L_FC_stack=760A
N_FC_stack=455-
V_tank_H2=0.13m3
p_tank_H2=35000000Pa

Equations


Convective Heat Transfer
Qconv = hAcool(T  298 K); h = 12 W m2 K1

Radiative Heat Transfer
Qrad = 0.95Acoolσ(T4  (298 K)4)
")); -end FuelCellSystem; +end FuelCellSystem; \ No newline at end of file diff --git a/VirtualFCS/Electrochemical/Hydrogen/package.mo b/VirtualFCS/Electrochemical/Hydrogen/package.mo index 87f3491..b5aff7f 100644 --- a/VirtualFCS/Electrochemical/Hydrogen/package.mo +++ b/VirtualFCS/Electrochemical/Hydrogen/package.mo @@ -2,10 +2,6 @@ within VirtualFCS.Electrochemical; package Hydrogen "Models for hydrogen fuel cell devices." extends Modelica.Icons.VariantsPackage; - - - - annotation( Documentation(info = "This sub-package includes 

@@ -21,4 +17,4 @@ package Hydrogen "Models for hydrogen fuel cell devices." ")); -end Hydrogen; +end Hydrogen; \ No newline at end of file diff --git a/VirtualFCS/Electrochemical/UsersGuide/package.mo b/VirtualFCS/Electrochemical/UsersGuide/package.mo index 563a191..52c9f37 100644 --- a/VirtualFCS/Electrochemical/UsersGuide/package.mo +++ b/VirtualFCS/Electrochemical/UsersGuide/package.mo @@ -27,4 +27,4 @@ package UsersGuide "User information for the Electrochemical sub-library" ")); -end UsersGuide; +end UsersGuide; \ No newline at end of file diff --git a/VirtualFCS/Electrochemical/package.mo b/VirtualFCS/Electrochemical/package.mo index 5b5be8b..900240f 100644 --- a/VirtualFCS/Electrochemical/package.mo +++ b/VirtualFCS/Electrochemical/package.mo @@ -2,9 +2,6 @@ within VirtualFCS; package Electrochemical "Electrochemical energy storage and conversion devices." extends Modelica.Icons.Package; - - - annotation( Documentation); -end Electrochemical; +end Electrochemical; \ No newline at end of file diff --git a/VirtualFCS/Examples/ElectrochemicalComponents/CycleBatterPack_Lumped.mo b/VirtualFCS/Examples/ElectrochemicalComponents/CycleBatterPack_Lumped.mo index c22d119..cf4acb8 100644 --- a/VirtualFCS/Examples/ElectrochemicalComponents/CycleBatterPack_Lumped.mo +++ b/VirtualFCS/Examples/ElectrochemicalComponents/CycleBatterPack_Lumped.mo @@ -32,4 +32,4 @@ equation annotation( Documentation(info = "This example demonstrates a single charge-discharge cycle for a Li-ion battery pack. The battery is charged at 1C to its upper voltage limit and held as the current drops. Likewise, the cell is discharged at 1C until it reaches its lower voltage limit. 

The pack considered in this example is a lumped model considering the summed performance of all the cells in the pack. For investigations where cell-level resolution is necessary (e.g. cell balancing), please see LiIonBatteryPack_Composite.
"), experiment(StartTime = 0, StopTime = 7200, Tolerance = 1e-06, Interval = 1)); -end CycleBatterPack_Lumped; +end CycleBatterPack_Lumped; \ No newline at end of file diff --git a/VirtualFCS/Examples/ElectrochemicalComponents/CycleBatteryCell.mo b/VirtualFCS/Examples/ElectrochemicalComponents/CycleBatteryCell.mo index e8c40c8..d7c2103 100644 --- a/VirtualFCS/Examples/ElectrochemicalComponents/CycleBatteryCell.mo +++ b/VirtualFCS/Examples/ElectrochemicalComponents/CycleBatteryCell.mo @@ -50,4 +50,4 @@ equation annotation( Documentation(info = "This example demonstrates a single charge-discharge cycle for a Li-ion battery cell. The battery is charged at 1C to its upper voltage limit and held as the current drops. Likewise, the cell is discharged at 1C until it reaches its lower voltage limit. "), experiment(StartTime = 0, StopTime = 7200, Tolerance = 1e-06, Interval = 1)); -end CycleBatteryCell; +end CycleBatteryCell; \ No newline at end of file diff --git a/VirtualFCS/Examples/ElectrochemicalComponents/CycleBatteryPack_Composite.mo b/VirtualFCS/Examples/ElectrochemicalComponents/CycleBatteryPack_Composite.mo index 3b34fd7..4235ad8 100644 --- a/VirtualFCS/Examples/ElectrochemicalComponents/CycleBatteryPack_Composite.mo +++ b/VirtualFCS/Examples/ElectrochemicalComponents/CycleBatteryPack_Composite.mo @@ -12,7 +12,7 @@ model CycleBatteryPack_Composite "Example demonstrating constant-current constan Placement(visible = true, transformation(origin = {76, 10}, extent = {{14, -10}, {-14, 10}}, rotation = 0))); Modelica.Thermal.HeatTransfer.Sources.FixedTemperature fixedTemperature(T = 298.15) annotation( Placement(visible = true, transformation(origin = {50, -50}, extent = {{10, -10}, {-10, 10}}, rotation = 0))); - VirtualFCS.Electrochemical.Battery.LiIonBatteryPack_Composite liIonBatteryPack_Composite(p = 3, s = 3) annotation( + VirtualFCS.Electrochemical.Battery.LiIonBatteryPack_Composite liIonBatteryPack_Composite(p = 3, s = 3) annotation( Placement(visible = true, transformation(origin = {1.17517, -22.1168}, extent = {{-16.6752, -10.0051}, {16.6752, 11.1168}}, rotation = 0))); equation connect(BMS.chargeCapacity, getChargeCapacity.y) annotation( @@ -32,4 +32,4 @@ equation annotation( Documentation(info = "This example demonstrates a single charge-discharge cycle for a Li-ion battery pack using the LiIonBatteryPack_Composite class. The example is set up to contain nine lithium-ion batteries, with three parallel sets of three batteries in series. The battery pack is charged at 1C to its upper voltage limit and held as the current drops. Likewise, the cell is discharged at 1C until it reaches its lower voltage limit. 

The pack considered in this example is a composite model with a separate instance of LiIonCell for each cell in the pack. For investigations where cell-level resolution is not necessary and faster runtime required, please see LiIonBatteryPack_Lumped.
"), experiment(StartTime = 0, StopTime = 7200, Tolerance = 1e-06, Interval = 1)); -end CycleBatteryPack_Composite; +end CycleBatteryPack_Composite; \ No newline at end of file diff --git a/VirtualFCS/Examples/ElectrochemicalComponents/PolarizeFuelCellStack.mo b/VirtualFCS/Examples/ElectrochemicalComponents/PolarizeFuelCellStack.mo index ea4b088..4fbac46 100644 --- a/VirtualFCS/Examples/ElectrochemicalComponents/PolarizeFuelCellStack.mo +++ b/VirtualFCS/Examples/ElectrochemicalComponents/PolarizeFuelCellStack.mo @@ -21,4 +21,4 @@ equation Icon, Documentation(info = "This example demonstrates the setup for a fuel cell system to generate a polarization curve. The fuel cell stack is connected to subsystems for hydrogen, air, and cooling. The electrical load is provided by a ramp voltage source that sweeps the current domain over a period of 500 seconds. "), experiment(StartTime = 0, StopTime = 600, Tolerance = 1e-06, Interval = 1)); -end PolarizeFuelCellStack; +end PolarizeFuelCellStack; \ No newline at end of file diff --git a/VirtualFCS/Examples/ElectrochemicalComponents/package.mo b/VirtualFCS/Examples/ElectrochemicalComponents/package.mo index 8e10b3f..c885a3e 100644 --- a/VirtualFCS/Examples/ElectrochemicalComponents/package.mo +++ b/VirtualFCS/Examples/ElectrochemicalComponents/package.mo @@ -2,4 +2,4 @@ within VirtualFCS.Examples; package ElectrochemicalComponents extends Modelica.Icons.ExamplesPackage; -end ElectrochemicalComponents; +end ElectrochemicalComponents; \ No newline at end of file diff --git a/VirtualFCS/Examples/RealTimeExamples/CycleBatteryCell_RealTime.mo b/VirtualFCS/Examples/RealTimeExamples/CycleBatteryCell_RealTime.mo index a896b5b..94af149 100644 --- a/VirtualFCS/Examples/RealTimeExamples/CycleBatteryCell_RealTime.mo +++ b/VirtualFCS/Examples/RealTimeExamples/CycleBatteryCell_RealTime.mo @@ -52,4 +52,4 @@ equation annotation( Documentation(info = "This example demonstrates the galvanostatic operation of a Li-ion battery cell in real time. The battery is set to discharge and charge at a 1C rate in 30 second intervals over a 2 minute period. 

Requires that the user load the library: Modelica_DeviceDrivers
"), experiment(StartTime = 0, StopTime = 120, Tolerance = 1e-06, Interval = 1)); -end CycleBatteryCell_RealTime; +end CycleBatteryCell_RealTime; \ No newline at end of file diff --git a/VirtualFCS/Examples/RealTimeExamples/CycleBatteryCell_UserControl.mo b/VirtualFCS/Examples/RealTimeExamples/CycleBatteryCell_UserControl.mo index fcf2cf0..022bdfe 100644 --- a/VirtualFCS/Examples/RealTimeExamples/CycleBatteryCell_UserControl.mo +++ b/VirtualFCS/Examples/RealTimeExamples/CycleBatteryCell_UserControl.mo @@ -24,7 +24,7 @@ model CycleBatteryCell_UserControl "Example demonstrating real time user control Placement(visible = true, transformation(origin = {0, 72}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); VirtualFCS.XInTheLoop.UserInTheLoop.ThrottleKeys throttleKeys annotation( Placement(visible = true, transformation(origin = {-78, 80}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - Modelica.Blocks.Nonlinear.Limiter limiter(limitsAtInit = true, uMax = 4.4, uMin = -4.4) annotation( + Modelica.Blocks.Nonlinear.Limiter limiter(uMax = 4.4, uMin = -4.4) annotation( Placement(visible = true, transformation(origin = {-38, 84}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); equation connect(getSOC_init.y, BMS.SOC_init) annotation( @@ -58,4 +58,4 @@ equation annotation( Documentation(info = "This example demonstrates the galvanostatic operation of a Li-ion battery cell in real time over a period of 30 seconds with the current set by the user via the up and down arrows on the keyboard. 

Requires that the user load the library: Modelica_DeviceDrivers
"), experiment(StartTime = 0, StopTime = 30, Tolerance = 1e-06, Interval = 1)); -end CycleBatteryCell_UserControl; +end CycleBatteryCell_UserControl; \ No newline at end of file diff --git a/VirtualFCS/Examples/RealTimeExamples/TestThrottleKeys.mo b/VirtualFCS/Examples/RealTimeExamples/TestThrottleKeys.mo index 568deda..6d44822 100644 --- a/VirtualFCS/Examples/RealTimeExamples/TestThrottleKeys.mo +++ b/VirtualFCS/Examples/RealTimeExamples/TestThrottleKeys.mo @@ -6,6 +6,6 @@ model TestThrottleKeys Placement(visible = true, transformation(origin = {0, 2}, extent = {{-24, -24}, {24, 24}}, rotation = 0))); equation -annotation( + annotation( Documentation(info = "This example reads the state of the up and down arrows on the keyboard in real time. 

Requires the user to load the library: Modelica_DeviceDrivers
")); -end TestThrottleKeys; +end TestThrottleKeys; \ No newline at end of file diff --git a/VirtualFCS/Examples/RealTimeExamples/package.mo b/VirtualFCS/Examples/RealTimeExamples/package.mo index 990b09e..1b72826 100644 --- a/VirtualFCS/Examples/RealTimeExamples/package.mo +++ b/VirtualFCS/Examples/RealTimeExamples/package.mo @@ -2,9 +2,6 @@ within VirtualFCS.Examples; package RealTimeExamples extends Modelica.Icons.ExamplesPackage; - - - annotation( Documentation(info = "Examples demonstrating real time simulation functionality of the library.

Requires the user to load the library: Modelica_DeviceDrivers
")); -end RealTimeExamples; +end RealTimeExamples; \ No newline at end of file diff --git a/VirtualFCS/Examples/SubsystemExamples/TestAirSubsystem.mo b/VirtualFCS/Examples/SubsystemExamples/TestAirSubsystem.mo index 59648a6..e47d61c 100644 --- a/VirtualFCS/Examples/SubsystemExamples/TestAirSubsystem.mo +++ b/VirtualFCS/Examples/SubsystemExamples/TestAirSubsystem.mo @@ -2,7 +2,6 @@ within VirtualFCS.Examples.SubsystemExamples; model TestAirSubsystem "Example to evaluate the performance of the air subsystem." extends Modelica.Icons.Example; - replaceable package Medium = Modelica.Media.Air.MoistAir; Modelica.Fluid.Sources.MassFlowSource_T boundary(redeclare package Medium = Medium, nPorts = 1, use_m_flow_in = true) annotation( Placement(visible = true, transformation(origin = {0, 76}, extent = {{10, -10}, {-10, 10}}, rotation = 90))); @@ -36,10 +35,10 @@ equation annotation( Diagram, Icon, - Documentation(info = "This example is intended as a means to evaluate the performance of the air subsystem both for optimization and troubleshooting purposes.


Description

The model has three parts (1) Input (includes fuel cell current and its conversion to air mass flow rate), (2) Air Sub System (includes Air Tank, pressure regulator, CompressorThrottle Valve and Air SubSystem Control), and (3) Power supply (Battery System). The model simulates influence of fuel cell current on air flow rate.


References to base model/related packages

 Air Sub System and Battery System

+ Documentation(info = "This example is intended as a means to evaluate the performance of the air subsystem both for optimization and troubleshooting purposes.


Description

The model has three parts (1) Input (includes fuel cell current and its conversion to air mass flow rate), (2) Air Sub System (includes Air Tank, pressure regulator, CompressorThrottle Valve and Air SubSystem Control), and (3) Power supply (Battery System). The model simulates influence of fuel cell current on air flow rate.


References to base model/related packages

 Air Sub System and Battery System

 

"), - experiment(StartTime = 0, StopTime = 600, Tolerance = 1e-6, Interval = 1)); -end TestAirSubsystem; + experiment(StartTime = 0, StopTime = 600, Tolerance = 1e-6, Interval = 1)); +end TestAirSubsystem; \ No newline at end of file diff --git a/VirtualFCS/Examples/SubsystemExamples/TestCoolingSubsystem.mo b/VirtualFCS/Examples/SubsystemExamples/TestCoolingSubsystem.mo index a697920..514c988 100644 --- a/VirtualFCS/Examples/SubsystemExamples/TestCoolingSubsystem.mo +++ b/VirtualFCS/Examples/SubsystemExamples/TestCoolingSubsystem.mo @@ -2,12 +2,10 @@ within VirtualFCS.Examples.SubsystemExamples; model TestCoolingSubsystem "Example to evaluate the performance of the cooling subsystem." extends Modelica.Icons.Example; - replaceable package Medium = Modelica.Media.Water.ConstantPropertyLiquidWater; - - VirtualFCS.SubSystems.Cooling.SubSystemCooling subSystemCooling annotation( + VirtualFCS.SubSystems.Cooling.SubSystemCooling subSystemCooling(redeclare VirtualFCS.Utilities.SystemRecords.HydrogenDataPlantC hydrogenData) annotation( Placement(visible = true, transformation(origin = {0, 0}, extent = {{-20, -20}, {20, 20}}, rotation = 0))); - Modelica.Blocks.Sources.Constant getTermperature(k = 273.15 +80) annotation( + Modelica.Blocks.Sources.Constant getTermperature(k = 273.15 + 80) annotation( Placement(visible = true, transformation(origin = {-60, 10}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); Modelica.Fluid.Pipes.DynamicPipe pipe1(redeclare package Medium = Medium, diameter = 0.01, length = 0.2, nParallel = 5, p_a_start = 102502, use_HeatTransfer = true) annotation( Placement(visible = true, transformation(origin = {-12, 50}, extent = {{10, 10}, {-10, -10}}, rotation = 270))); @@ -15,7 +13,7 @@ model TestCoolingSubsystem "Example to evaluate the performance of the cooling s Placement(visible = true, transformation(origin = {12, 50}, extent = {{-10, 10}, {10, -10}}, rotation = 270))); inner Modelica.Fluid.System system annotation( Placement(visible = true, transformation(origin = {-90, 90}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - VirtualFCS.Electrochemical.Battery.BatterySystem batterySystem(C_bat_pack = 10,SOC_init = 0.9,V_max_bat_pack = 54, V_min_bat_pack = 42, V_nom_bat_pack = 48, m_bat_pack = 1) annotation( + VirtualFCS.Electrochemical.Battery.BatterySystem batterySystem(C_bat_pack = 10, SOC_init = 0.9, V_max_bat_pack = 54, V_min_bat_pack = 42, V_nom_bat_pack = 48, m_bat_pack = 1) annotation( Placement(visible = true, transformation(origin = {-3.55271e-15, -60}, extent = {{-20, -20}, {20, 20}}, rotation = 0))); equation connect(getTermperature.y, subSystemCooling.controlInterface) annotation( @@ -33,8 +31,8 @@ equation annotation( Diagram, Icon, - __OpenModelica_commandLineOptions = "--matchingAlgorithm=PFPlusExt --indexReductionMethod=dynamicStateSelection -d=initialization,NLSanalyticJacobian,newInst aliasConflicts", - Documentation(info = "This example is intended as a means to evaluate the performance of the cooling subsystem both for optimization and troubleshooting purposes.

+ __OpenModelica_commandLineOptions = "--matchingAlgorithm=PFPlusExt --indexReductionMethod=dynamicStateSelection -d=initialization,NLSanalyticJacobian,newInst aliasConflicts", + Documentation(info = "This example is intended as a means to evaluate the performance of the cooling subsystem both for optimization and troubleshooting purposes.

@@ -1388,5 +1386,5 @@ graph

 

Future work

The selection of fan, blower, or pump depends on the required cooling rate, overcoming any pressure drop in the coolant channels, and meeting overall system electrical efficiency, weight, and volume requirements. 

"), - experiment(StartTime = 0, StopTime = 600, Tolerance = 1e-6, Interval = 1)); -end TestCoolingSubsystem; + experiment(StartTime = 0, StopTime = 600, Tolerance = 1e-6, Interval = 1)); +end TestCoolingSubsystem; \ No newline at end of file diff --git a/VirtualFCS/Examples/SubsystemExamples/TestHydrogenSubsystem.mo b/VirtualFCS/Examples/SubsystemExamples/TestHydrogenSubsystem.mo index cbfce84..494e202 100644 --- a/VirtualFCS/Examples/SubsystemExamples/TestHydrogenSubsystem.mo +++ b/VirtualFCS/Examples/SubsystemExamples/TestHydrogenSubsystem.mo @@ -7,7 +7,7 @@ model TestHydrogenSubsystem "Example to evaluate the performance of the hydrogen Placement(visible = true, transformation(origin = {0, 40}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); Modelica.Fluid.Sources.MassFlowSource_T boundary(redeclare package Medium = Anode_Medium, nPorts = 1, use_m_flow_in = true) annotation( Placement(visible = true, transformation(origin = {0, 72}, extent = {{10, -10}, {-10, 10}}, rotation = 90))); - VirtualFCS.SubSystems.Hydrogen.SubSystemHydrogen subSystemHydrogen annotation( + VirtualFCS.SubSystems.Hydrogen.SubSystemHydrogen subSystemHydrogen(redeclare VirtualFCS.Utilities.SystemRecords.HydrogenDataPlantD hydrogenData) annotation( Placement(visible = true, transformation(origin = {-0.999964, -0.666637}, extent = {{-30, -20}, {30, 20}}, rotation = 0))); Modelica.Blocks.Math.Gain gain(k = -0.00202 * 1 / (96485 * 2)) annotation( Placement(visible = true, transformation(origin = {-34, 80}, extent = {{-8, -8}, {8, 8}}, rotation = 0))); @@ -17,6 +17,8 @@ model TestHydrogenSubsystem "Example to evaluate the performance of the hydrogen Placement(visible = true, transformation(origin = {-3.55271e-15, -60}, extent = {{-20, -20}, {20, 20}}, rotation = 0))); inner Modelica.Fluid.System system annotation( Placement(visible = true, transformation(origin = {-90, -90}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); + inner VirtualFCS.Utilities.SystemRecords.HydrogenDataPlantA hydrogenData annotation( + Placement(visible = true, transformation(origin = {90, 90}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); equation connect(setFuelCellCurrent.y, gain.u) annotation( Line(points = {{-63, 80}, {-44, 80}}, color = {0, 0, 127})); @@ -762,4 +764,4 @@ text-indent:-18.0pt;mso-list:l0 level2 lfo1\">

"), experiment(StartTime = 0, StopTime = 600, Tolerance = 1e-06, Interval = 1)); -end TestHydrogenSubsystem; +end TestHydrogenSubsystem; \ No newline at end of file diff --git a/VirtualFCS/Examples/SubsystemExamples/package.mo b/VirtualFCS/Examples/SubsystemExamples/package.mo index 8714ef8..405f4e6 100644 --- a/VirtualFCS/Examples/SubsystemExamples/package.mo +++ b/VirtualFCS/Examples/SubsystemExamples/package.mo @@ -2,4 +2,4 @@ within VirtualFCS.Examples; package SubsystemExamples extends Modelica.Icons.ExamplesPackage; -end SubsystemExamples; +end SubsystemExamples; \ No newline at end of file diff --git a/VirtualFCS/Examples/VehicleExamples/BatteryElectricVehicle.mo b/VirtualFCS/Examples/VehicleExamples/BatteryElectricVehicle.mo index 250d6fd..21fbef1 100644 --- a/VirtualFCS/Examples/VehicleExamples/BatteryElectricVehicle.mo +++ b/VirtualFCS/Examples/VehicleExamples/BatteryElectricVehicle.mo @@ -4,9 +4,9 @@ model BatteryElectricVehicle extends Modelica.Icons.Example; inner Modelica.Fluid.System system annotation( Placement(visible = true, transformation(origin = {-90, 90}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - VirtualFCS.Vehicles.DriveCycle driveCycle(v = VirtualFCS.Vehicles.DriveCycle.speed_profile.NEDC) annotation( + VirtualFCS.Vehicles.DriveCycle driveCycle(v = VirtualFCS.Vehicles.DriveCycle.speed_profile.NEDC) annotation( Placement(visible = true, transformation(origin = {-60, -3.55271e-15}, extent = {{-21, -21}, {21, 21}}, rotation = 0))); - VirtualFCS.Powertrains.BatteryPowerTrain batteryPowerTrain(C_bat_pack = 200, SOC_init = 0.9, V_max_bat_pack = 360, V_min_bat_pack = 300, V_nom_bat_pack = 320) annotation( + VirtualFCS.Powertrains.BatteryPowerTrain batteryPowerTrain(C_bat_pack = 200, SOC_init = 0.9, V_max_bat_pack = 360, V_min_bat_pack = 300, V_nom_bat_pack = 320) annotation( Placement(visible = true, transformation(origin = {60, -3.55271e-15}, extent = {{-20, -20}, {20, 20}}, rotation = 0))); Vehicles.VehicleProfile vehicleProfile(VN = VirtualFCS.Vehicles.VehicleProfile.vehicle_name.Mirai) annotation( Placement(visible = true, transformation(origin = {4.44089e-16, -7.54952e-15}, extent = {{-21, -21}, {21, 21}}, rotation = 0))); @@ -20,4 +20,4 @@ equation protected annotation( experiment(StartTime = 0, StopTime = 60000, Tolerance = 1e-6, Interval = 1)); -end BatteryElectricVehicle; +end BatteryElectricVehicle; \ No newline at end of file diff --git a/VirtualFCS/Examples/VehicleExamples/BatteryElectricVehicle_JoystickControl.mo b/VirtualFCS/Examples/VehicleExamples/BatteryElectricVehicle_JoystickControl.mo index 4e3faba..69d905e 100644 --- a/VirtualFCS/Examples/VehicleExamples/BatteryElectricVehicle_JoystickControl.mo +++ b/VirtualFCS/Examples/VehicleExamples/BatteryElectricVehicle_JoystickControl.mo @@ -20,4 +20,4 @@ equation protected annotation( experiment(StartTime = 0, StopTime = 30, Tolerance = 1e-06, Interval = 0.1)); -end BatteryElectricVehicle_JoystickControl; +end BatteryElectricVehicle_JoystickControl; \ No newline at end of file diff --git a/VirtualFCS/Examples/VehicleExamples/RangeExtenderHybridVehicle.mo b/VirtualFCS/Examples/VehicleExamples/RangeExtenderHybridVehicle.mo index 6087ec3..a83fa80 100644 --- a/VirtualFCS/Examples/VehicleExamples/RangeExtenderHybridVehicle.mo +++ b/VirtualFCS/Examples/VehicleExamples/RangeExtenderHybridVehicle.mo @@ -20,4 +20,4 @@ equation protected annotation( experiment(StartTime = 0, StopTime = 25000, Tolerance = 1e-06, Interval = 1)); -end RangeExtenderHybridVehicle; +end RangeExtenderHybridVehicle; \ No newline at end of file diff --git a/VirtualFCS/Examples/VehicleExamples/package.mo b/VirtualFCS/Examples/VehicleExamples/package.mo index d8c4fe7..dad43b6 100644 --- a/VirtualFCS/Examples/VehicleExamples/package.mo +++ b/VirtualFCS/Examples/VehicleExamples/package.mo @@ -2,4 +2,4 @@ within VirtualFCS.Examples; package VehicleExamples extends Modelica.Icons.ExamplesPackage; -end VehicleExamples; +end VehicleExamples; \ No newline at end of file diff --git a/VirtualFCS/Examples/package.mo b/VirtualFCS/Examples/package.mo index 8c15ba9..bbabec2 100644 --- a/VirtualFCS/Examples/package.mo +++ b/VirtualFCS/Examples/package.mo @@ -2,15 +2,6 @@ within VirtualFCS; package Examples "Examples of the VirtualFCS library in action!" extends Modelica.Icons.ExamplesPackage; - - - - - - - - - annotation( Documentation(info = "
These examples are intended to demonstrate the functionality of certain VirtualFCS models and provide a means to test components and subsystems to support troubleshooting during the development process.

Examples include:

CycleBatteryCell
CycleBatteryPack_Composite
CycleBatteryPack_Lumped
PolarizeFuelCellStack
TestAirSubsystem
TestCoolingSubsystem
TestHydrogenSubsystem
VehicleRangeExtender
")); -end Examples; +end Examples; \ No newline at end of file diff --git a/VirtualFCS/Fluid/Compressor.mo b/VirtualFCS/Fluid/Compressor.mo index 16bb11a..b843f18 100644 --- a/VirtualFCS/Fluid/Compressor.mo +++ b/VirtualFCS/Fluid/Compressor.mo @@ -1,41 +1,26 @@ within VirtualFCS.Fluid; model Compressor - -//*** DEFINE REPLACEABLE PACKAGES ***// + parameter Modelica.Units.NonSI.AngularVelocity_rpm Pump_N_nominal = 365 "Nominal speed of the pump"; + //*** DEFINE REPLACEABLE PACKAGES ***// // Medium models replaceable package Medium = Modelica.Media.Air.MoistAir; //*** INSTANTIATE COMPONENTS ***// Modelica.Electrical.Machines.BasicMachines.DCMachines.DC_PermanentMagnet dcpm(IaNominal = driveData.motorData.IaNominal, Jr = driveData.motorData.Jr, Js = driveData.motorData.Js, La = driveData.motorData.La, Ra = driveData.motorData.Ra, TaNominal = driveData.motorData.TaNominal, TaOperational = driveData.motorData.TaNominal, TaRef = driveData.motorData.TaRef, VaNominal = driveData.motorData.VaNominal, alpha20a = driveData.motorData.alpha20a, brushParameters = driveData.motorData.brushParameters, coreParameters = driveData.motorData.coreParameters, frictionParameters = driveData.motorData.frictionParameters, ia(fixed = true), phiMechanical(fixed = true), strayLoadParameters = driveData.motorData.strayLoadParameters, wMechanical(fixed = true, start = 0.10472), wNominal = driveData.motorData.wNominal) annotation( Placement(visible = true, transformation(extent = {{-62, -26}, {-42, -6}}, rotation = 0))); - Modelica.Mechanics.Rotational.Components.Inertia inertia(J = 0.15) annotation( Placement(visible = true, transformation(origin = {-20, -16}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - parameter VirtualFCS.Utilities.ParameterRecords.DriveDataDcPm driveData annotation( Placement(visible = true, transformation(extent = {{-90, -24}, {-70, -4}}, rotation = 0))); - Modelica.Fluid.Interfaces.FluidPort_a Input(redeclare package Medium = Medium) annotation( Placement(visible = true, transformation(origin = {-78, -60}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {-110, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - Modelica.Fluid.Interfaces.FluidPort_b Output(redeclare package Medium = Medium) annotation( Placement(visible = true, transformation(origin = {84, -60}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {110, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); Modelica.Blocks.Math.Gain gain(k = 9.5493) annotation( Placement(visible = true, transformation(origin = {67, -16}, extent = {{-6, -6}, {6, 6}}, rotation = 0))); Modelica.Mechanics.Rotational.Sensors.SpeedSensor speedSensor annotation( Placement(visible = true, transformation(origin = {24, 6}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - Modelica.Fluid.Machines.PrescribedPump pump( - redeclare package Medium = Medium, - redeclare function flowCharacteristic = Modelica.Fluid.Machines.BaseClasses.PumpCharacteristics.linearFlow(V_flow_nominal = {0, 0.00365}, head_nominal = {15 * 10000, 10 * 10000}), - N_nominal = 365, - V(displayUnit = "l") = 1e-05, - checkValve = true, - energyDynamics = Modelica.Fluid.Types.Dynamics.FixedInitial, - massDynamics = Modelica.Fluid.Types.Dynamics.FixedInitial, - nParallel = 1, - p_a_start = 150000, - use_N_in = true) - annotation( + Modelica.Fluid.Machines.PrescribedPump pump(redeclare package Medium = Medium, N_nominal = Pump_N_nominal, V(displayUnit = "l") = 1e-05, checkValve = true, energyDynamics = Modelica.Fluid.Types.Dynamics.FixedInitial, redeclare function flowCharacteristic = Modelica.Fluid.Machines.BaseClasses.PumpCharacteristics.linearFlow(V_flow_nominal = {0, 0.00365}, head_nominal = {15*10000, 10*10000}), massDynamics = Modelica.Fluid.Types.Dynamics.FixedInitial, nParallel = 1, p_a_start = 150000, use_N_in = true) annotation( Placement(visible = true, transformation(origin = {0, -60}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); Modelica.Mechanics.Rotational.Sources.Torque torque annotation( Placement(visible = true, transformation(origin = {8, -16}, extent = {{10, -10}, {-10, 10}}, rotation = 0))); @@ -86,4 +71,4 @@ equation annotation( Icon(graphics = {Polygon(visible = false, lineColor = {255, 255, 255}, fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, points = {{20, -75}, {50, -85}, {20, -95}, {20, -75}}), Line(visible = false, points = {{55, -85}, {-60, -85}}, color = {0, 128, 255}), Polygon(visible = false, lineColor = {0, 128, 255}, fillColor = {0, 128, 255}, fillPattern = FillPattern.Solid, points = {{20, -70}, {60, -85}, {20, -100}, {20, -70}}), Polygon(origin = {15, 0}, fillColor = {208, 208, 208}, pattern = LinePattern.None, fillPattern = FillPattern.Solid, points = {{-115, 80}, {-115, -80}, {85, -50}, {85, 50}, {85, 50}, {-115, 80}}), Line(origin = {5.2, 0.61}, points = {{-57, 0}, {47, 0}}, thickness = 1.5, arrow = {Arrow.None, Arrow.Filled}, arrowSize = 20, smooth = Smooth.Bezier)}, coordinateSystem(initialScale = 0.1)), Documentation(info = "The Compressor model is designed to compress air from the ambient environment to the desired pressure and maintain a sufficient mass flow rate to support the needs of the Fuel Cell Stack

Description

The model features 5 interfaces: fluid ports in and out, electrical ports for positive and negative pins, and a control port. The fluid ports provide the upstream and downstream connections for the compressor, the electrical ports connect to the low-voltage power supply for the BoP components and the control port sets the rpm of the compressor. A DC Motor drives the compressor and is connected to an inertia and torque source, which is linked to the resistance of the Pump.
")); -end Compressor; +end Compressor; \ No newline at end of file diff --git a/VirtualFCS/Fluid/PressureRegulator.mo b/VirtualFCS/Fluid/PressureRegulator.mo index 64e534a..5d46e59 100644 --- a/VirtualFCS/Fluid/PressureRegulator.mo +++ b/VirtualFCS/Fluid/PressureRegulator.mo @@ -1,64 +1,41 @@ within VirtualFCS.Fluid; -block PressureRegulator -//*** DEFINE REPLACEABLE PACKAGES ***// +block PressureRegulator + //*** DEFINE REPLACEABLE PACKAGES ***// // Medium models replaceable package Medium = Modelica.Media.IdealGases.SingleGases.H2; //*** INSTANTIATE COMPONENTS ***// // Interfaces - Modelica.Fluid.Interfaces.FluidPort_a Input( - redeclare package Medium = Medium) - annotation( + Modelica.Fluid.Interfaces.FluidPort_a Input(redeclare package Medium = Medium) annotation( Placement(visible = true, transformation(origin = {-84, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {-100, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - - Modelica.Fluid.Interfaces.FluidPort_b Output( - redeclare package Medium = Medium) - annotation( + Modelica.Fluid.Interfaces.FluidPort_b Output(redeclare package Medium = Medium) annotation( Placement(visible = true, transformation(origin = {54, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {100, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); // Valves - Modelica.Fluid.Valves.ValveCompressible valveCompressible( - redeclare package Medium = Medium, - checkValve = true, - dp_nominal(displayUnit = "Pa") = 10000, - m_flow_nominal = 0.01, - p_nominal = 5 * 101325) - annotation( - Placement(visible = true, transformation(origin = {-35, 0}, extent = {{-10, 10}, {10, -10}}, rotation = 0))); - // Other - Modelica.Blocks.Interfaces.RealInput setDownstreamPressure - annotation( - Placement(visible = true, transformation(origin = {43, -44}, extent = {{13, -13}, {-13, 13}}, rotation = 0), iconTransformation(origin = {41, 74}, extent = {{-13, -13}, {13, 13}}, rotation = -90))); - - Modelica.Fluid.Sensors.Pressure pressure_sensor( - redeclare package Medium = Medium) - annotation( - Placement(visible = true, transformation(origin = {14, -10}, extent = {{10, 10}, {-10, -10}}, rotation = 0))); - - Modelica.Blocks.Continuous.LimPID pid( - Td = 1e-3, - k = 1e-6, - limitsAtInit = true, - yMax = 1, - yMin = 0) - annotation( - Placement(visible = true, transformation(origin = {-10, -44}, extent = {{-10, -10}, {10, 10}}, rotation = 180))); - + Modelica.Fluid.Valves.ValveCompressible valveCompressible(redeclare package Medium = Medium, checkValve = true, dp_nominal(displayUnit = "Pa") = 10000, m_flow_nominal = 0.01, p_nominal = 5 * 101325) annotation( + Placement(visible = true, transformation(origin = {-35, 0}, extent = {{-10, 10}, {10, -10}}, rotation = 0))); + // Other + Modelica.Blocks.Interfaces.RealInput setDownstreamPressure annotation( + Placement(visible = true, transformation(origin = {43, -44}, extent = {{13, -13}, {-13, 13}}, rotation = 0), iconTransformation(origin = {41, 74}, extent = {{-13, -13}, {13, 13}}, rotation = -90))); + Modelica.Fluid.Sensors.Pressure pressure_sensor(redeclare package Medium = Medium) annotation( + Placement(visible = true, transformation(origin = {14, -10}, extent = {{10, 10}, {-10, -10}}, rotation = 0))); + Modelica.Blocks.Continuous.LimPID pid(Td = 1e-3, k = 1e-6, yMax = 1, yMin = 0) annotation( + Placement(visible = true, transformation(origin = {-10, -44}, extent = {{-10, -10}, {10, 10}}, rotation = 180))); equation //*** DEFINE CONNECTIONS ***// connect(valveCompressible.port_b, Output) annotation( Line(points = {{-25, 0}, {54, 0}}, color = {0, 127, 255})); - connect(pressure_sensor.port, valveCompressible.port_b) annotation( + connect(pressure_sensor.port, valveCompressible.port_b) annotation( Line(points = {{14, 0}, {-25, 0}}, color = {0, 127, 255})); - connect(Input, valveCompressible.port_a) annotation( + connect(Input, valveCompressible.port_a) annotation( Line(points = {{-84, 0}, {-45, 0}})); - connect(setDownstreamPressure, pid.u_s) annotation( + connect(setDownstreamPressure, pid.u_s) annotation( Line(points = {{43, -44}, {2, -44}}, color = {0, 0, 127})); - connect(pid.u_m, pressure_sensor.p) annotation( + connect(pid.u_m, pressure_sensor.p) annotation( Line(points = {{-10, -32}, {-10, -10}, {3, -10}}, color = {0, 0, 127})); - connect(pid.y, valveCompressible.opening) annotation( - Line(points = {{-21, -44}, {-35, -44}, {-35, -8}}, color = {0, 0, 127})); protected - annotation( - uses(Modelica(version = "3.2.3")), + connect(pid.y, valveCompressible.opening) annotation( + Line(points = {{-21, -44}, {-35, -44}, {-35, -8}}, color = {0, 0, 127})); +protected + annotation( Icon(graphics = {Polygon(origin = {-50, 0}, points = {{-10, 40}, {-10, -40}, {50, 0}, {-10, 40}}), Polygon(origin = {50, 0}, points = {{10, 40}, {10, -40}, {-50, 0}, {10, 40}}), Line(origin = {0, 30}, points = {{0, -30}, {0, 30}}), Line(origin = {-80, 0}, points = {{-20, 0}, {20, 0}, {20, 0}}), Line(origin = {80, 0}, points = {{20, 0}, {-20, 0}}), Line(origin = {40, 29}, points = {{-40, 31}, {40, 31}, {40, -31}})}, coordinateSystem(initialScale = 0.1)), - Documentation(info = "The PressureRegulator model is designed to reduce the pressure from a high-pressure source on the upstream side to a lower pressure on the downstream side by regulating the opening in a compressible fluid valve. Regulation of the valve opening is managed using a PID controller.")); -end PressureRegulator; + Documentation(info = "The PressureRegulator model is designed to reduce the pressure from a high-pressure source on the upstream side to a lower pressure on the downstream side by regulating the opening in a compressible fluid valve. Regulation of the valve opening is managed using a PID controller.")); +end PressureRegulator; \ No newline at end of file diff --git a/VirtualFCS/Fluid/PumpElectricDC.mo b/VirtualFCS/Fluid/PumpElectricDC.mo index bfece80..b840786 100644 --- a/VirtualFCS/Fluid/PumpElectricDC.mo +++ b/VirtualFCS/Fluid/PumpElectricDC.mo @@ -86,7 +86,7 @@ protected uses(Modelica(version = "3.2.3")), Icon(coordinateSystem(initialScale = 0.1), graphics = {Ellipse(origin = {-2, -15}, fillColor = {208, 208, 208}, fillPattern = FillPattern.Solid, lineThickness = 3, extent = {{-78, 95}, {82, -65}}, endAngle = 360), Line(origin = {40, 40}, points = {{-40, 40}, {40, -40}, {40, -40}}, thickness = 3), Line(origin = {40, -40}, points = {{-40, -40}, {40, 40}, {40, 40}}, thickness = 3)}), Diagram, - Documentation(info = "Models a DC pump

+ Documentation(info = "Models a DC pump

@@ -763,4 +763,4 @@ protected

 



")); -end PumpElectricDC; +end PumpElectricDC; \ No newline at end of file diff --git a/VirtualFCS/Fluid/RecirculationBlower.mo b/VirtualFCS/Fluid/RecirculationBlower.mo index 53aff65..8e563e9 100644 --- a/VirtualFCS/Fluid/RecirculationBlower.mo +++ b/VirtualFCS/Fluid/RecirculationBlower.mo @@ -19,7 +19,7 @@ model RecirculationBlower Placement(visible = true, transformation(extent = {{-90, -14}, {-70, 6}}, rotation = 0))); Modelica.Mechanics.Rotational.Sensors.SpeedSensor speedSensor annotation( Placement(visible = true, transformation(origin = {0, 22}, extent = {{-10, -10}, {10, 10}}, rotation = 90))); - Modelica.Blocks.Math.Gain gain(k = 9.5493) annotation( + Modelica.Blocks.Math.Gain gain(k = 9.5493) annotation( Placement(visible = true, transformation(origin = {67, 41}, extent = {{-5, -5}, {5, 5}}, rotation = 0))); Modelica.Mechanics.Rotational.Sources.Torque torque annotation( Placement(visible = true, transformation(origin = {20, -6}, extent = {{10, -10}, {-10, 10}}, rotation = 0))); @@ -70,4 +70,4 @@ equation annotation( Icon(graphics = {Ellipse(origin = {-26, 26}, fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, lineThickness = 1, extent = {{-54, 54}, {106, -106}}, endAngle = 360), Polygon(origin = {70, -5}, rotation = -90, lineThickness = 1, points = {{-6, 9}, {-18, -9}, {6, -9}, {6, -9}, {-6, 9}})}, coordinateSystem(initialScale = 0.1)), Documentation(info = "The RecirculationBlower model is designed to maintain hydrogen gas circulation within the hydrogen subsystem. 

Description

The model features 5 interfaces: fluid ports in and out, electrical ports for positive and negative pins, and a control port. The fluid ports provide the upstream and downstream connections for the Recirculation Blower, the electrical ports connect to the low-voltage power supply for the BoP components and the control port sets the rpm of the blower. A DC motor drives the recirculation blower and is connected to an inertia and torque source, which is linked to the resistance of the pump.
")); -end RecirculationBlower; +end RecirculationBlower; \ No newline at end of file diff --git a/VirtualFCS/Fluid/ThrottleValve.mo b/VirtualFCS/Fluid/ThrottleValve.mo index abf0b64..dc134bf 100644 --- a/VirtualFCS/Fluid/ThrottleValve.mo +++ b/VirtualFCS/Fluid/ThrottleValve.mo @@ -1,51 +1,26 @@ within VirtualFCS.Fluid; + model ThrottleValve //*** DEFINE REPLACEABLE PACKAGES ***// // Medium models replaceable package Medium = Modelica.Media.Air.MoistAir; - -//*** INSTANTIATE COMPONENTS ***// + //*** INSTANTIATE COMPONENTS ***// // Interfaces - Modelica.Fluid.Interfaces.FluidPort_a port_a( - redeclare package Medium = Medium) - annotation( + Modelica.Fluid.Interfaces.FluidPort_a port_a(redeclare package Medium = Medium) annotation( Placement(visible = true, transformation(origin = {-100, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {-100, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - - Modelica.Fluid.Interfaces.FluidPort_b port_b( - redeclare package Medium = Medium) - annotation( + Modelica.Fluid.Interfaces.FluidPort_b port_b(redeclare package Medium = Medium) annotation( Placement(visible = true, transformation(origin = {100, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {100, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); // Valves - Modelica.Fluid.Valves.ValveCompressible valveDownstream( - redeclare package Medium = Medium, - dp_nominal(displayUnit = "Pa") = 10000, - m_flow_nominal = 0.01, opening(start = 0), - p_nominal = 5 * 101325) - annotation( + Modelica.Fluid.Valves.ValveCompressible valveDownstream(redeclare package Medium = Medium, dp_nominal(displayUnit = "Pa") = 10000, m_flow_nominal = 0.01, opening(start = 0), p_nominal = 5 * 101325) annotation( Placement(visible = true, transformation(origin = {0, 0}, extent = {{10, 10}, {-10, -10}}, rotation = 180))); - // Other - Modelica.Blocks.Sources.Constant constant3( - k = 1) - annotation( + // Other + Modelica.Blocks.Sources.Constant constant3(k = 1) annotation( Placement(visible = true, transformation(origin = {49.5, 72.5}, extent = {{-7.5, -7.5}, {7.5, 7.5}}, rotation = 180))); - - Modelica.Blocks.Continuous.LimPID pid( - k = 1e-3, - limitsAtInit = true, - yMax = 1, - yMin = 0, - y_start = 0.99) - annotation( + Modelica.Blocks.Continuous.LimPID pid(k = 1e-3, yMax = 1, yMin = 0, y_start = 0.99) annotation( Placement(visible = true, transformation(origin = {-30, 70}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - - Modelica.Fluid.Sensors.Pressure pressureGageDownstream( - redeclare package Medium = Medium) - annotation( + Modelica.Fluid.Sensors.Pressure pressureGageDownstream(redeclare package Medium = Medium) annotation( Placement(visible = true, transformation(origin = {-24, 20}, extent = {{10, -10}, {-10, 10}}, rotation = 0))); - - Modelica.Blocks.Math.Add add( - k1 = -1) - annotation( + Modelica.Blocks.Math.Add add(k1 = -1) annotation( Placement(visible = true, transformation(origin = {0, 36}, extent = {{10, -10}, {-10, 10}}, rotation = 90))); Modelica.Blocks.Interfaces.RealInput FC_pAirOut_P annotation( Placement(visible = true, transformation(origin = {-81, 69}, extent = {{-13, -13}, {13, 13}}, rotation = 0), iconTransformation(origin = {0, -14}, extent = {{-13, -13}, {13, 13}}, rotation = 90))); @@ -72,5 +47,5 @@ equation annotation( uses(Modelica(version = "3.2.3")), Icon(graphics = {Polygon(origin = {-50, 0}, fillColor = {211, 211, 211}, pattern = LinePattern.None, fillPattern = FillPattern.Solid, points = {{-50, 60}, {-50, -60}, {50, 0}, {-50, 60}, {-50, 60}}), Polygon(origin = {50, 0}, rotation = 180, fillColor = {211, 211, 211}, pattern = LinePattern.None, fillPattern = FillPattern.Solid, points = {{-50, 60}, {-50, -60}, {50, 0}, {-50, 60}, {-50, 60}})}, coordinateSystem(initialScale = 0.1)), - Documentation(info = "The ThrottleValve model is designed to maintain a set higher pressure on the upstream side relative to a lower pressure on the downstream side.

Description

The model maintains a low pressure on downstream by regulating the opening in a Compressible Fluid Valve. Regulation of the valve opening is managed using a PID controller.
")); -end ThrottleValve; + Documentation(info = "The ThrottleValve model is designed to maintain a set higher pressure on the upstream side relative to a lower pressure on the downstream side.

Description

The model maintains a low pressure on downstream by regulating the opening in a Compressible Fluid Valve. Regulation of the valve opening is managed using a PID controller.
")); +end ThrottleValve; \ No newline at end of file diff --git a/VirtualFCS/Fluid/UsersGuide/package.mo b/VirtualFCS/Fluid/UsersGuide/package.mo index 3e64100..bcfda18 100644 --- a/VirtualFCS/Fluid/UsersGuide/package.mo +++ b/VirtualFCS/Fluid/UsersGuide/package.mo @@ -33,4 +33,4 @@ package UsersGuide "User information for the Fluid sub-library"
")); -end UsersGuide; +end UsersGuide; \ No newline at end of file diff --git a/VirtualFCS/Fluid/package.mo b/VirtualFCS/Fluid/package.mo index dcb307c..91fd33d 100644 --- a/VirtualFCS/Fluid/package.mo +++ b/VirtualFCS/Fluid/package.mo @@ -2,15 +2,6 @@ within VirtualFCS; package Fluid "Fluid components supplementing the Modelica Standard Library." extends Modelica.Icons.Package; - - - - - - - - - annotation( Documentation); -end Fluid; +end Fluid; \ No newline at end of file diff --git a/VirtualFCS/Powertrains/BatteryPowerTrain.mo b/VirtualFCS/Powertrains/BatteryPowerTrain.mo index 85a465b..4ce0ae9 100644 --- a/VirtualFCS/Powertrains/BatteryPowerTrain.mo +++ b/VirtualFCS/Powertrains/BatteryPowerTrain.mo @@ -1,28 +1,23 @@ within VirtualFCS.Powertrains; model BatteryPowerTrain - - parameter Real m_powertrain(unit = "kg") = 100+ 50; - - parameter Real V_HV_Bus(unit="V") = 343 "Voltage of the HV Bus"; - -// H2 Subsystem Paramters - parameter Real V_tank_H2(unit="m3") = 0.13 "H2 tank volume"; - parameter Real p_tank_H2(unit="Pa") = 3500000 "H2 tank initial pressure"; - -// Fuel Cell Stack Paramters + parameter Real m_powertrain(unit = "kg") = 100 + 50; + parameter Real V_HV_Bus(unit = "V") = 343 "Voltage of the HV Bus"; + // H2 Subsystem Paramters + parameter Real V_tank_H2(unit = "m3") = 0.13 "H2 tank volume"; + parameter Real p_tank_H2(unit = "Pa") = 3500000 "H2 tank initial pressure"; + // Fuel Cell Stack Paramters parameter Real m_FC_stack(unit = "kg") = 14.3 "FC stack mass"; parameter Real L_FC_stack(unit = "m") = 0.255 "FC stack length"; parameter Real W_FC_stack(unit = "m") = 0.760 "FC stack length"; parameter Real H_FC_stack(unit = "m") = 0.060 "FC stack length"; parameter Real vol_FC_stack(unit = "m3") = L_FC_stack * W_FC_stack * H_FC_stack "FC stack volume"; - parameter Real V_rated_FC_stack(unit="V") = 57.9 "FC stack maximum operating voltage"; - parameter Real I_rated_FC_stack(unit="A") = 300 "FC stack minimum operating voltage"; + parameter Real V_rated_FC_stack(unit = "V") = 57.9 "FC stack maximum operating voltage"; + parameter Real I_rated_FC_stack(unit = "A") = 300 "FC stack minimum operating voltage"; parameter Real i_L_FC_stack(unit = "A") = 3 * I_rated_FC_stack "FC stack maximum limiting current"; parameter Real I_nom_FC_stack(unit = "A") = 0.25 * I_rated_FC_stack "FC stack maximum limiting current"; - parameter Real N_FC_stack(unit = "1") = floor(V_rated_FC_stack/0.6433) "FC stack number of cells"; - -// Battery Pack Parameters + parameter Real N_FC_stack(unit = "1") = floor(V_rated_FC_stack / 0.6433) "FC stack number of cells"; + // Battery Pack Parameters parameter Real m_bat_pack(unit = "kg") = 100 "Mass of the pack"; parameter Real L_bat_pack(unit = "m") = 0.6 "Battery pack length"; parameter Real W_bat_pack(unit = "m") = 0.45 "Battery pack width"; @@ -41,9 +36,9 @@ model BatteryPowerTrain Placement(visible = true, transformation(origin = {-94, 94}, extent = {{-6, -6}, {6, 6}}, rotation = 0))); Modelica.Electrical.Analog.Basic.Ground ground annotation( Placement(visible = true, transformation(origin = {-68, 4}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - VirtualFCS.Electrochemical.Battery.BatterySystem batterySystem(C_bat_pack = 200, SOC_init = 0.99,V_max_bat_pack = 300, V_min_bat_pack = 0) annotation( + VirtualFCS.Electrochemical.Battery.BatterySystem batterySystem(C_bat_pack = 200, SOC_init = 0.99, V_max_bat_pack = 300, V_min_bat_pack = 0) annotation( Placement(visible = true, transformation(origin = {0, -70}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - VirtualFCS.Electrical.DCConverter converter(vDCref = V_HV_Bus) annotation( + VirtualFCS.Electrical.DCConverter converter(vDCref = V_HV_Bus) annotation( Placement(visible = true, transformation(origin = {0, 8}, extent = {{-10, -10}, {10, 10}}, rotation = -90))); equation connect(pin_n, ground.p) annotation( @@ -59,4 +54,4 @@ equation protected annotation( Icon(graphics = {Text(origin = {-4, -12}, lineColor = {0, 0, 255}, extent = {{-150, 120}, {150, 150}}, textString = "%name"), Bitmap(origin = {-4, 3}, extent = {{-96, 97}, {104, -103}}, imageSource = "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"), Text(origin = {17, 123}, extent = {{3, 5}, {-3, -5}}, textString = "text")}, coordinateSystem(initialScale = 0.1))); -end BatteryPowerTrain; +end BatteryPowerTrain; \ No newline at end of file diff --git a/VirtualFCS/Powertrains/ParallelHybridPowerTrain.mo b/VirtualFCS/Powertrains/ParallelHybridPowerTrain.mo index c3926c1..f14fcd8 100644 --- a/VirtualFCS/Powertrains/ParallelHybridPowerTrain.mo +++ b/VirtualFCS/Powertrains/ParallelHybridPowerTrain.mo @@ -1,28 +1,23 @@ within VirtualFCS.Powertrains; model ParallelHybridPowerTrain - - parameter Real m_powertrain(unit = "kg") = 100+ 50; - - parameter Real V_HV_Bus(unit="V") = 343 "Voltage of the HV Bus"; - -// H2 Subsystem Paramters - parameter Real V_tank_H2(unit="m3") = 0.13 "H2 tank volume"; - parameter Real p_tank_H2(unit="Pa") = 3500000 "H2 tank initial pressure"; - -// Fuel Cell Stack Paramters + parameter Real m_powertrain(unit = "kg") = 100 + 50; + parameter Real V_HV_Bus(unit = "V") = 343 "Voltage of the HV Bus"; + // H2 Subsystem Paramters + parameter Real V_tank_H2(unit = "m3") = 0.13 "H2 tank volume"; + parameter Real p_tank_H2(unit = "Pa") = 3500000 "H2 tank initial pressure"; + // Fuel Cell Stack Paramters parameter Real m_FC_stack(unit = "kg") = 14.3 "FC stack mass"; parameter Real L_FC_stack(unit = "m") = 0.255 "FC stack length"; parameter Real W_FC_stack(unit = "m") = 0.760 "FC stack length"; parameter Real H_FC_stack(unit = "m") = 0.060 "FC stack length"; parameter Real vol_FC_stack(unit = "m3") = L_FC_stack * W_FC_stack * H_FC_stack "FC stack volume"; - parameter Real V_rated_FC_stack(unit="V") = 57.9 "FC stack maximum operating voltage"; - parameter Real I_rated_FC_stack(unit="A") = 300 "FC stack minimum operating voltage"; + parameter Real V_rated_FC_stack(unit = "V") = 57.9 "FC stack maximum operating voltage"; + parameter Real I_rated_FC_stack(unit = "A") = 300 "FC stack minimum operating voltage"; parameter Real i_L_FC_stack(unit = "A") = 3 * I_rated_FC_stack "FC stack maximum limiting current"; parameter Real I_nom_FC_stack(unit = "A") = 0.25 * I_rated_FC_stack "FC stack maximum limiting current"; - parameter Real N_FC_stack(unit = "1") = floor(V_rated_FC_stack/0.6433) "FC stack number of cells"; - -// Battery Pack Parameters + parameter Real N_FC_stack(unit = "1") = floor(V_rated_FC_stack / 0.6433) "FC stack number of cells"; + // Battery Pack Parameters parameter Real m_bat_pack(unit = "kg") = 100 "Mass of the pack"; parameter Real L_bat_pack(unit = "m") = 0.6 "Battery pack length"; parameter Real W_bat_pack(unit = "m") = 0.45 "Battery pack width"; @@ -45,16 +40,16 @@ model ParallelHybridPowerTrain Placement(visible = true, transformation(origin = {72, -72}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); VirtualFCS.Electrochemical.Battery.BatterySystem batterySystem annotation( Placement(visible = true, transformation(origin = {-28, -72}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - VirtualFCS.Electrical.DCConverter converter(vDCref = V_HV_Bus) annotation( - Placement(visible = true, transformation(origin = { -28, 28}, extent = {{-10, -10}, {10, 10}}, rotation = -90))); - VirtualFCS.Electrical.DCConverterSwitch converter1(vDCref = V_HV_Bus) annotation( + VirtualFCS.Electrical.DCConverter converter(vDCref = V_HV_Bus) annotation( + Placement(visible = true, transformation(origin = {-28, 28}, extent = {{-10, -10}, {10, 10}}, rotation = -90))); + VirtualFCS.Electrical.DCConverterSwitch converter1(vDCref = V_HV_Bus) annotation( Placement(visible = true, transformation(origin = {72, 34}, extent = {{-10, -10}, {10, 10}}, rotation = -90))); VirtualFCS.Electrical.DC_converter dC_converter annotation( Placement(visible = true, transformation(origin = {22, -44}, extent = {{10, 10}, {-10, -10}}, rotation = -90))); - VirtualFCS.Control.EnergyManagementSystem energyManagementSystem(ramp_up = 1) annotation( + VirtualFCS.Control.EnergyManagementSystem energyManagementSystem(ramp_up = 1) annotation( Placement(visible = true, transformation(origin = {-68, -72}, extent = {{10, -10}, {-10, 10}}, rotation = 0))); Modelica.Blocks.Sources.BooleanConstant booleanConstant annotation( - Placement(visible = true, transformation(origin = { 36, 32}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); + Placement(visible = true, transformation(origin = {36, 32}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); equation connect(pin_n, ground.p) annotation( Line(points = {{-40, 96}, {-68, 96}, {-68, 14}}, color = {0, 0, 255})); @@ -91,4 +86,4 @@ equation protected annotation( Icon(graphics = {Text(origin = {-4, -12}, lineColor = {0, 0, 255}, extent = {{-150, 120}, {150, 150}}, textString = "%name"), Bitmap(origin = {-4, 3}, extent = {{-96, 97}, {104, -103}}, imageSource = "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"), Text(origin = {17, 123}, extent = {{3, 5}, {-3, -5}}, textString = "text")}, coordinateSystem(initialScale = 0.1))); -end ParallelHybridPowerTrain; +end ParallelHybridPowerTrain; \ No newline at end of file diff --git a/VirtualFCS/Powertrains/RangeExtenderPowerTrain.mo b/VirtualFCS/Powertrains/RangeExtenderPowerTrain.mo index 1928af5..41bbd8c 100644 --- a/VirtualFCS/Powertrains/RangeExtenderPowerTrain.mo +++ b/VirtualFCS/Powertrains/RangeExtenderPowerTrain.mo @@ -1,28 +1,23 @@ within VirtualFCS.Powertrains; model RangeExtenderPowerTrain - parameter Real m_powertrain(unit = "kg") = fuelCellSystem.m_FC_system + batterySystem.m_bat_pack; - - parameter Real V_HV_Bus(unit="V") = 343 "Voltage of the HV Bus"; - -// H2 Subsystem Paramters - parameter Real V_tank_H2(unit="m3") = 0.13 "H2 tank volume"; - parameter Real p_tank_H2(unit="Pa") = 35000000 "H2 tank initial pressure"; - -// Fuel Cell Stack Paramters + parameter Real V_HV_Bus(unit = "V") = 343 "Voltage of the HV Bus"; + // H2 Subsystem Paramters + parameter Real V_tank_H2(unit = "m3") = 0.13 "H2 tank volume"; + parameter Real p_tank_H2(unit = "Pa") = 35000000 "H2 tank initial pressure"; + // Fuel Cell Stack Paramters parameter Real m_FC_stack(unit = "kg") = 14.3 "FC stack mass"; parameter Real L_FC_stack(unit = "m") = 0.255 "FC stack length"; parameter Real W_FC_stack(unit = "m") = 0.760 "FC stack width"; parameter Real H_FC_stack(unit = "m") = 0.060 "FC stack height"; parameter Real vol_FC_stack(unit = "m3") = L_FC_stack * W_FC_stack * H_FC_stack "FC stack volume"; - parameter Real V_rated_FC_stack(unit="V") = 57.9 "FC stack maximum operating voltage"; - parameter Real I_rated_FC_stack(unit="A") = 300 "FC stack minimum operating current"; + parameter Real V_rated_FC_stack(unit = "V") = 57.9 "FC stack maximum operating voltage"; + parameter Real I_rated_FC_stack(unit = "A") = 300 "FC stack minimum operating current"; parameter Real i_L_FC_stack(unit = "A") = 1.7 * I_rated_FC_stack "FC stack limiting current (max)"; parameter Real I_nom_FC_stack(unit = "A") = 0.25 * I_rated_FC_stack "FC stack nominal current"; - parameter Real N_FC_stack(unit = "1") = floor(V_rated_FC_stack/0.6433) "FC stack number of cells"; - -// Battery Pack Parameters + parameter Real N_FC_stack(unit = "1") = floor(V_rated_FC_stack / 0.6433) "FC stack number of cells"; + // Battery Pack Parameters parameter Real m_bat_pack(unit = "kg") = 100 "Mass of the pack"; parameter Real L_bat_pack(unit = "m") = 0.6 "Battery pack length"; parameter Real W_bat_pack(unit = "m") = 0.45 "Battery pack width"; @@ -41,11 +36,11 @@ model RangeExtenderPowerTrain Placement(visible = true, transformation(origin = {-94, 94}, extent = {{-6, -6}, {6, 6}}, rotation = 0))); Modelica.Electrical.Analog.Basic.Ground ground annotation( Placement(visible = true, transformation(origin = {-68, 4}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - VirtualFCS.Electrochemical.Hydrogen.FuelCellSystem fuelCellSystem(H_FC_stack = H_FC_stack, I_rated_FC_stack = I_rated_FC_stack, L_FC_stack = L_FC_stack, V_tank_H2 = V_tank_H2, W_FC_stack = W_FC_stack, m_FC_stack = m_FC_stack, p_tank_H2 = p_tank_H2) annotation( + VirtualFCS.Electrochemical.Hydrogen.FuelCellSystem fuelCellSystem(H_FC_stack = H_FC_stack, I_rated_FC_stack = I_rated_FC_stack, L_FC_stack = L_FC_stack, V_tank_H2 = V_tank_H2, W_FC_stack = W_FC_stack, m_FC_stack = m_FC_stack, p_tank_H2 = p_tank_H2) annotation( Placement(visible = true, transformation(origin = {72, -72}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - VirtualFCS.Electrochemical.Battery.BatterySystem batterySystem(C_bat_pack = C_bat_pack, Cp_bat_pack = Cp_bat_pack, H_bat_pack = H_bat_pack, L_bat_pack = L_bat_pack, SOC_init = SOC_init, V_max_bat_pack = V_max_bat_pack, V_min_bat_pack = V_min_bat_pack, V_nom_bat_pack = V_nom_bat_pack, W_bat_pack = W_bat_pack) annotation( + VirtualFCS.Electrochemical.Battery.BatterySystem batterySystem(C_bat_pack = C_bat_pack, Cp_bat_pack = Cp_bat_pack, H_bat_pack = H_bat_pack, L_bat_pack = L_bat_pack, SOC_init = SOC_init, V_max_bat_pack = V_max_bat_pack, V_min_bat_pack = V_min_bat_pack, V_nom_bat_pack = V_nom_bat_pack, W_bat_pack = W_bat_pack) annotation( Placement(visible = true, transformation(origin = {-28, -72}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - VirtualFCS.Electrical.DCConverter converter(vDCref = V_HV_Bus) annotation( + VirtualFCS.Electrical.DCConverter converter(vDCref = V_HV_Bus) annotation( Placement(visible = true, transformation(origin = {0, 30}, extent = {{-10, -10}, {10, 10}}, rotation = -90))); VirtualFCS.Electrical.DC_converter dC_converter annotation( Placement(visible = true, transformation(origin = {22, -44}, extent = {{10, 10}, {-10, -10}}, rotation = -90))); @@ -77,4 +72,4 @@ equation protected annotation( Icon(graphics = {Text(origin = {-4, -12}, lineColor = {0, 0, 255}, extent = {{-150, 120}, {150, 150}}, textString = "%name"), Bitmap(origin = {-4, 3}, extent = {{-96, 97}, {104, -103}}, imageSource = "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"), Text(origin = {17, 123}, extent = {{3, 5}, {-3, -5}}, textString = "text")}, coordinateSystem(initialScale = 0.1))); -end RangeExtenderPowerTrain; +end RangeExtenderPowerTrain; \ No newline at end of file diff --git a/VirtualFCS/Powertrains/package.mo b/VirtualFCS/Powertrains/package.mo index aa05c9a..7d6ff5b 100644 --- a/VirtualFCS/Powertrains/package.mo +++ b/VirtualFCS/Powertrains/package.mo @@ -2,4 +2,4 @@ within VirtualFCS; package Powertrains extends Modelica.Icons.Package; -end Powertrains; +end Powertrains; \ No newline at end of file diff --git a/VirtualFCS/Resources/images/imgHydrogenVehicle.jpg b/VirtualFCS/Resources/images/imgHydrogenVehicle.jpg new file mode 100644 index 0000000..e8e15e7 Binary files /dev/null and b/VirtualFCS/Resources/images/imgHydrogenVehicle.jpg differ diff --git a/VirtualFCS/SubSystems/Air/SubSystemAir.mo b/VirtualFCS/SubSystems/Air/SubSystemAir.mo index cb738b1..b3a973d 100644 --- a/VirtualFCS/SubSystems/Air/SubSystemAir.mo +++ b/VirtualFCS/SubSystems/Air/SubSystemAir.mo @@ -1,11 +1,16 @@ within VirtualFCS.SubSystems.Air; class SubSystemAir + parameter Real PumpSpeed_K = 1 "Gain for the pump speed controller" + annotation(Dialog(group = "Speed controller")); + parameter Real PumpSpeed_Td = 0.1 "Time constant for the pump speed controller" + annotation(Dialog(group = "Speed controller")); + parameter Modelica.Units.NonSI.AngularVelocity_rpm Pump_N_nominal = 365 "Nominal speed of the pump" + annotation(Dialog(group = "Pump")); // Other //*** DEFINE REPLACEABLE PACKAGES ***// // Medium models replaceable package Medium = Modelica.Media.Air.MoistAir; - parameter Real m_system_air(unit = "kg") = 61 "Air system mass"; //*** INSTANTIATE COMPONENTS ***// //System @@ -19,7 +24,7 @@ class SubSystemAir Modelica.Fluid.Interfaces.FluidPort_b Output(redeclare package Medium = Medium) annotation( Placement(visible = true, transformation(origin = {88, 18}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {-60, 121}, extent = {{-20, -19}, {20, 19}}, rotation = 0))); // Machines - VirtualFCS.Fluid.Compressor compressor annotation( + VirtualFCS.Fluid.Compressor compressor(Pump_N_nominal = Pump_N_nominal) annotation( Placement(visible = true, transformation(origin = {12, 18}, extent = {{-16, -16}, {16, 16}}, rotation = 0))); // Valves Modelica.Electrical.Analog.Interfaces.PositivePin pin_p annotation( @@ -40,7 +45,7 @@ class SubSystemAir Placement(visible = true, transformation(origin = {-38, 46}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); VirtualFCS.Fluid.ThrottleValve throttleValve(redeclare package Medium = Medium) annotation( Placement(visible = true, transformation(origin = {15, -35}, extent = {{15, -15}, {-15, 15}}, rotation = 0))); - VirtualFCS.SubSystems.Air.SubSystemAirControl subSystemAirControl annotation( + VirtualFCS.SubSystems.Air.SubSystemAirControl subSystemAirControl(PumpSpeed_K = PumpSpeed_K, PumpSpeed_Td = PumpSpeed_Td) annotation( Placement(visible = true, transformation(origin = {-45, 79}, extent = {{-15, -15}, {15, 15}}, rotation = 0))); equation //*** DEFINE CONNECTIONS ***// @@ -74,9 +79,7 @@ equation Line(points = {{-30, 80}, {-20, 80}, {-20, 78}, {-18, 78}}, color = {0, 0, 127}, thickness = 0.5)); protected annotation( - Icon(coordinateSystem(initialScale = 0.1), graphics = {Bitmap(origin = { -8, 6}, extent = {{-92, 94}, {108, -106}}, imageSource = "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"), Text(origin = {-44, 70}, lineColor = {255, 255, 255}, extent = {{-22, 12}, {112, -142}}, textString = "Air")}), - uses(Modelica(version = "3.2.3")), + Icon(coordinateSystem(initialScale = 0.1), graphics = {Bitmap(origin = {-8, 6}, extent = {{-92, 94}, {108, -106}}, imageSource = "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"), Text(origin = {-44, 70}, lineColor = {255, 255, 255}, extent = {{-22, 12}, {112, -142}}, textString = "Air")}), Diagram(coordinateSystem(initialScale = 0.1), graphics = {Text(origin = {23, -3}, extent = {{-7, 3}, {29, -3}}, textString = "Air compressor speed")}), - version = "", - Documentation(info = "An air sub-system template is provided in the example model SubSystemAir. 

Description

The model consists of an Air Compressor and Throttle Valve connected to a fixed boundary condition reflecting the ambient conditions. 

The subsystem model contains 5 interface connections: fluid ports in and out, electrical ports for positive and negative pins, and a control port. The fluid ports provide the connection to the Fuel Cell Stack. The electrical ports interface with the low-voltage DC power-supply to power the BoP components (in this case, the Air Compressor). The control port provides an interface to the Fuel Cell Control Unit, which controls the Air Compressor. A Throttle Valve is connected downstream from the Fuel Cell Stack to maintain the set pressure in the air line. Air SubSystem Control compares the set value of air mass flow rate with the actual mass flow rate and controls the speed of Air Compressor.  It also sets the air pressure.


Reference/Base packages

Air SubSystem ControlAir Compressor and Throttle Valve 


Further updates

Future expansions on the air subsystem will include options for humidification and temperature control.
")); -end SubSystemAir; + Documentation(info = "An air sub-system template is provided in the example model SubSystemAir. 

Description

The model consists of an Air Compressor and Throttle Valve connected to a fixed boundary condition reflecting the ambient conditions. 

The subsystem model contains 5 interface connections: fluid ports in and out, electrical ports for positive and negative pins, and a control port. The fluid ports provide the connection to the Fuel Cell Stack. The electrical ports interface with the low-voltage DC power-supply to power the BoP components (in this case, the Air Compressor). The control port provides an interface to the Fuel Cell Control Unit, which controls the Air Compressor. A Throttle Valve is connected downstream from the Fuel Cell Stack to maintain the set pressure in the air line. Air SubSystem Control compares the set value of air mass flow rate with the actual mass flow rate and controls the speed of Air Compressor.  It also sets the air pressure.


Reference/Base packages

Air SubSystem ControlAir Compressor and Throttle Valve 


Further updates

Future expansions on the air subsystem will include options for humidification and temperature control.
")); +end SubSystemAir; \ No newline at end of file diff --git a/VirtualFCS/SubSystems/Air/SubSystemAirControl.mo b/VirtualFCS/SubSystems/Air/SubSystemAirControl.mo index fdc3f0d..f9bbf6f 100644 --- a/VirtualFCS/SubSystems/Air/SubSystemAirControl.mo +++ b/VirtualFCS/SubSystems/Air/SubSystemAirControl.mo @@ -1,18 +1,16 @@ within VirtualFCS.SubSystems.Air; block SubSystemAirControl - parameter Real pressure_Air_set(unit = "Pa") = 150000 "Set H2 Pressure"; parameter Real massFlow_Air_set(unit = "kg/s") = 4e-3 "Set H2 Recirculation Mass Flow"; - - VirtualFCS.Control.PumpSpeedControl pumpSpeedControl annotation( + parameter Real PumpSpeed_K = 1 "Gain for the pump speed controller"; + parameter Real PumpSpeed_Td = 0.1 "Time constant for the pump speed controller"; + VirtualFCS.Control.PumpSpeedControl pumpSpeedControl(Td = PumpSpeed_Td, k = PumpSpeed_K) annotation( Placement(visible = true, transformation(origin = {0, -7.10543e-15}, extent = {{-58, -58}, {58, 58}}, rotation = 0))); Modelica.Blocks.Sources.Constant setAirPressure(k = pressure_Air_set) annotation( Placement(visible = true, transformation(origin = {1, 145}, extent = {{-15, -15}, {15, 15}}, rotation = 0))); Modelica.Blocks.Sources.Constant setAirMassFlow(k = massFlow_Air_set) annotation( Placement(visible = true, transformation(origin = {-144, 28}, extent = {{-14, -14}, {14, 14}}, rotation = 0))); - - Modelica.Blocks.Routing.Multiplex2 multiplex2 annotation( Placement(visible = true, transformation(origin = {140, 0}, extent = {{-18, -18}, {18, 18}}, rotation = 0))); Modelica.Blocks.Interfaces.RealOutput controlInterface[2] annotation( @@ -39,5 +37,5 @@ equation annotation( Diagram(coordinateSystem(extent = {{-200, -200}, {200, 200}})), Icon(coordinateSystem(extent = {{-200, -200}, {200, 200}}, initialScale = 0.1), graphics = {Rectangle(fillColor = {50, 50, 50}, fillPattern = FillPattern.Solid, extent = {{-200, 200}, {200, -200}}), Text(origin = {-25, 244}, lineColor = {0, 0, 255}, extent = {{-53, 28}, {91, -54}}, textString = "%name")}), - Documentation(info = "The air sub system control governs the flow and pressure of air, based on fuel cell current. 


Description

The sensor interface (mass flow rate set value) signals are inputs to the Pump Speed Control block. Other inputs include air feed pressure (from air tank to the fuel cell) and mass flow rate and are set to a constant value. The output signal is concatenated with two values, (1) Air Feed Pressure input to Throttle Valve, and (2) Set Speed to Air Compressor. The Pump Speed Control blocks uses simple PID control to set Air Compressor speed as a function of mass flow. 


List of components

The model comprises Pump Speed ControlDeMultipex2Multiplex3. The subsystem features multiple interface connections all of them are control port. 

")); -end SubSystemAirControl; + Documentation(info = "The air sub system control governs the flow and pressure of air, based on fuel cell current. 


Description

The sensor interface (mass flow rate set value) signals are inputs to the Pump Speed Control block. Other inputs include air feed pressure (from air tank to the fuel cell) and mass flow rate and are set to a constant value. The output signal is concatenated with two values, (1) Air Feed Pressure input to Throttle Valve, and (2) Set Speed to Air Compressor. The Pump Speed Control blocks uses simple PID control to set Air Compressor speed as a function of mass flow. 


List of components

The model comprises Pump Speed ControlDeMultipex2Multiplex3. The subsystem features multiple interface connections all of them are control port. 

")); +end SubSystemAirControl; \ No newline at end of file diff --git a/VirtualFCS/SubSystems/Air/package.mo b/VirtualFCS/SubSystems/Air/package.mo index 0e15850..4444124 100644 --- a/VirtualFCS/SubSystems/Air/package.mo +++ b/VirtualFCS/SubSystems/Air/package.mo @@ -2,4 +2,4 @@ within VirtualFCS.SubSystems; package Air "Subsystems related to the air line." extends Modelica.Icons.VariantsPackage; -end Air; +end Air; \ No newline at end of file diff --git a/VirtualFCS/SubSystems/Cooling/SubSystemCooling.mo b/VirtualFCS/SubSystems/Cooling/SubSystemCooling.mo index 528363d..848734d 100644 --- a/VirtualFCS/SubSystems/Cooling/SubSystemCooling.mo +++ b/VirtualFCS/SubSystems/Cooling/SubSystemCooling.mo @@ -4,7 +4,6 @@ model SubSystemCooling //*** DEFINE REPLACEABLE PACKAGES ***// // Medium models replaceable package Coolant_Medium = Modelica.Media.Water.ConstantPropertyLiquidWater; - parameter Real m_system_coolant(unit = "kg") = 44 "Coolant system mass"; //*** INSTANTIATE COMPONENTS ***// // System @@ -43,6 +42,8 @@ model SubSystemCooling Placement(visible = true, transformation(origin = {68, 16}, extent = {{-10, 10}, {10, -10}}, rotation = 0))); VirtualFCS.Thermal.HeatSink heatSink(redeclare package Medium = Coolant_Medium) annotation( Placement(visible = true, transformation(origin = {-20, -26}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); + inner replaceable VirtualFCS.Utilities.SystemRecords.HydrogenData hydrogenData annotation(choicesAllMatching = true, + Placement(visible = true, transformation(origin = {90, 90}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); equation //*** DEFINE CONNECTIONS ***// connect(tankCoolant.ports[1], teeJunctionTankCoolant.port_3) annotation( @@ -85,7 +86,6 @@ equation

 

"), - uses(Modelica(version = "3.2.3")), Icon(graphics = {Bitmap(origin = {-6, 20}, extent = {{-94, 80}, {106, -120}}, imageSource = "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"), Text(origin = {9, -11}, lineColor = {255, 255, 255}, extent = {{-81, 89}, {65, -55}}, textString = "Cool")}, coordinateSystem(initialScale = 0.1)), Diagram(graphics = {Text(origin = {35, 0}, extent = {{-19, 4}, {15, -2}}, textString = "Pump")}, coordinateSystem(initialScale = 0.1))); -end SubSystemCooling; +end SubSystemCooling; \ No newline at end of file diff --git a/VirtualFCS/SubSystems/Cooling/SubSystemCoolingControl.mo b/VirtualFCS/SubSystems/Cooling/SubSystemCoolingControl.mo index dfc8d80..4504b41 100644 --- a/VirtualFCS/SubSystems/Cooling/SubSystemCoolingControl.mo +++ b/VirtualFCS/SubSystems/Cooling/SubSystemCoolingControl.mo @@ -1,10 +1,8 @@ within VirtualFCS.SubSystems.Cooling; class SubSystemCoolingControl - - parameter Real temperature_Cooling_set(unit = "K") = 80+273.15 "Set Fuel cell Temperature"; - - VirtualFCS.Control.PumpSpeedControl pumpSpeedControl(Td = 1e-3, k = 1e-6) annotation( + parameter Real temperature_Cooling_set(unit = "K") = 80 + 273.15 "Set Fuel cell Temperature"; + VirtualFCS.Control.PumpSpeedControl pumpSpeedControl(Td = 1e-3, k = 1e-6) annotation( Placement(visible = true, transformation(origin = {-54, -7.10543e-15}, extent = {{-58, -58}, {58, 58}}, rotation = 0))); Modelica.Blocks.Interfaces.RealInput sensorInterface annotation( Placement(visible = true, transformation(origin = {-220, 0}, extent = {{-20, -20}, {20, 20}}, rotation = 0), iconTransformation(origin = {-220, 0}, extent = {{-20, -20}, {20, 20}}, rotation = 0))); @@ -22,5 +20,5 @@ equation annotation( Diagram(coordinateSystem(extent = {{-200, -200}, {200, 200}})), Icon(coordinateSystem(extent = {{-200, -200}, {200, 200}}, initialScale = 0.1), graphics = {Rectangle(fillColor = {50, 50, 50}, fillPattern = FillPattern.Solid, extent = {{-200, 200}, {200, -200}}), Text(origin = {-7, 242}, lineColor = {0, 0, 255}, extent = {{-103, 34}, {103, -34}}, textString = "%name")}), - Documentation(info = "

Model (components and controls. If package, then what it contains with references)

 

 

What it does

References to base model/related packages

Standard component/protocol (any specific commercial)

 

 

Description

Purpose/where to use

List of components

 

 

Assumptions

 

 

Formula

 

 

Operation

Explain with diagram view

Operating range

Initial/default inputs

Output-Explain with graph

")); -end SubSystemCoolingControl; + Documentation(info = "

Model (components and controls. If package, then what it contains with references)

 

 

What it does

References to base model/related packages

Standard component/protocol (any specific commercial)

 

 

Description

Purpose/where to use

List of components

 

 

Assumptions

 

 

Formula

 

 

Operation

Explain with diagram view

Operating range

Initial/default inputs

Output-Explain with graph

")); +end SubSystemCoolingControl; \ No newline at end of file diff --git a/VirtualFCS/SubSystems/Cooling/package.mo b/VirtualFCS/SubSystems/Cooling/package.mo index 975b9a5..e7e2d3a 100644 --- a/VirtualFCS/SubSystems/Cooling/package.mo +++ b/VirtualFCS/SubSystems/Cooling/package.mo @@ -2,4 +2,4 @@ within VirtualFCS.SubSystems; package Cooling "Subsystems related to the cooling line." extends Modelica.Icons.VariantsPackage; -end Cooling; +end Cooling; \ No newline at end of file diff --git a/VirtualFCS/SubSystems/FuelCellSubSystems.mo b/VirtualFCS/SubSystems/FuelCellSubSystems.mo index 6846d87..f599c3f 100644 --- a/VirtualFCS/SubSystems/FuelCellSubSystems.mo +++ b/VirtualFCS/SubSystems/FuelCellSubSystems.mo @@ -1,17 +1,13 @@ within VirtualFCS.SubSystems; model FuelCellSubSystems - replaceable package Cathode_Medium = Modelica.Media.Air.MoistAir; replaceable package Anode_Medium = Modelica.Media.IdealGases.SingleGases.H2; replaceable package Coolant_Medium = Modelica.Media.Water.ConstantPropertyLiquidWater; - -// H2 Subsystem Paramters + // H2 Subsystem Paramters parameter Real m_FC_subsystems(unit = "kg") = subSystemHydrogen.m_system_H2 + subSystemAir.m_system_air + subSystemCooling.m_system_coolant + batterySystem.m_bat_pack; - parameter Real V_tank_H2(unit="m3") = 0.13 "H2 tank volume"; - parameter Real p_tank_H2(unit="Pa") = 35000000 "H2 tank initial pressure"; - - + parameter Real V_tank_H2(unit = "m3") = 0.13 "H2 tank volume"; + parameter Real p_tank_H2(unit = "Pa") = 35000000 "H2 tank initial pressure"; VirtualFCS.SubSystems.Hydrogen.SubSystemHydrogen subSystemHydrogen annotation( Placement(visible = true, transformation(origin = {-60, 0}, extent = {{-15, -10}, {15, 10}}, rotation = 0))); Modelica.Fluid.Interfaces.FluidPort_a H2_port_a(redeclare package Medium = Anode_Medium) annotation( @@ -34,7 +30,7 @@ model FuelCellSubSystems Placement(visible = true, transformation(origin = {0, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); inner Modelica.Fluid.System system annotation( Placement(visible = true, transformation(origin = {-94, 94}, extent = {{-6, -6}, {6, 6}}, rotation = 0))); - VirtualFCS.Electrochemical.Battery.BatterySystem batterySystem(C_bat_pack = 5, SOC_init = 0.9, m_bat_pack = 1) annotation( + VirtualFCS.Electrochemical.Battery.BatterySystem batterySystem(C_bat_pack = 5, SOC_init = 0.9, m_bat_pack = 1) annotation( Placement(visible = true, transformation(origin = {0, -70}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); equation connect(subSystemHydrogen.port_H2ToStack, H2_port_a) annotation( @@ -67,4 +63,4 @@ equation Line(points = {{6, 60}, {6, 60}, {6, 32}, {0, 32}, {0, 20}, {-6, 20}, {-6, 12}, {-6, 12}})); annotation( Icon(graphics = {Text(origin = {-31, -100}, lineColor = {0, 0, 255}, extent = {{-105, 8}, {167, -40}}, textString = "%name"), Rectangle(extent = {{-100, 100}, {100, -100}}), Bitmap(origin = {-1, 1}, extent = {{-99, 99}, {101, -101}}, imageSource = "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"), Text(origin = {-82, 60}, lineColor = {255, 255, 255}, extent = {{-22, 10}, {22, -10}}, textString = "H2"), Text(origin = {-2, 60}, lineColor = {255, 255, 255}, extent = {{-22, 10}, {22, -10}}, textString = "Cool"), Text(origin = {80, 60}, lineColor = {255, 255, 255}, extent = {{-22, 10}, {22, -10}}, textString = "Air")}, coordinateSystem(initialScale = 0.1))); -end FuelCellSubSystems; +end FuelCellSubSystems; \ No newline at end of file diff --git a/VirtualFCS/SubSystems/Hydrogen/SubSystemHydrogen.mo b/VirtualFCS/SubSystems/Hydrogen/SubSystemHydrogen.mo index b620688..8074033 100644 --- a/VirtualFCS/SubSystems/Hydrogen/SubSystemHydrogen.mo +++ b/VirtualFCS/SubSystems/Hydrogen/SubSystemHydrogen.mo @@ -6,16 +6,16 @@ model SubSystemHydrogen replaceable package Anode_Medium = Modelica.Media.IdealGases.SingleGases.H2; // Parameter definition parameter Real m_system_H2(unit = "kg") = 61 "H2 system mass"; - parameter Real V_tank_H2(unit="m3") = 0.13 "H2 tank volume"; - parameter Real A_tank_H2(unit="m2") = 2 "H2 tank surface area"; - parameter Real p_tank_H2(unit="Pa") = 35000000 "H2 tank initial pressure"; + parameter Real V_tank_H2(unit = "m3") = 0.13 "H2 tank volume"; + parameter Real A_tank_H2(unit = "m2") = 2 "H2 tank surface area"; + parameter Real p_tank_H2(unit = "Pa") = 35000000 "H2 tank initial pressure"; //*** INSTANTIATE COMPONENTS ***// // System // Interfaces and boundaries Modelica.Fluid.Sources.Boundary_pT exhaustHydrogen(redeclare package Medium = Anode_Medium, T = 293.15, nPorts = 1, p = 101325) annotation( Placement(visible = true, transformation(origin = {-120, -76}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); Modelica.Fluid.Interfaces.FluidPort_b port_H2ToStack(redeclare package Medium = Anode_Medium) annotation( - Placement(visible = true, transformation(origin = {79, 74}, extent = {{-9, -9}, {9, 9}}, rotation = 0), iconTransformation(origin = {-60,118}, extent = {{-18, -18}, {18, 18}}, rotation = 0))); + Placement(visible = true, transformation(origin = {79, 74}, extent = {{-9, -9}, {9, 9}}, rotation = 0), iconTransformation(origin = {-60, 118}, extent = {{-18, -18}, {18, 18}}, rotation = 0))); Modelica.Fluid.Interfaces.FluidPort_a port_StackToH2(redeclare package Medium = Anode_Medium) annotation( Placement(visible = true, transformation(origin = {77, -76}, extent = {{-9, -9}, {9, 9}}, rotation = 0), iconTransformation(origin = {60, 119}, extent = {{-18, -19}, {18, 19}}, rotation = 0))); // Vessels @@ -70,6 +70,8 @@ model SubSystemHydrogen Placement(visible = true, transformation(origin = {-60, 116}, extent = {{15, -10}, {-15, 10}}, rotation = 0))); Modelica.Thermal.HeatTransfer.Components.BodyRadiation bodyRadiation(Gr = 0.95 * A_tank_H2) annotation( Placement(visible = true, transformation(origin = {-140, 116}, extent = {{10, -10}, {-10, 10}}, rotation = -90))); + inner replaceable VirtualFCS.Utilities.SystemRecords.HydrogenData hydrogenData annotation(choicesAllMatching = true, + Placement(visible = true, transformation(origin = {130, 52}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); equation //*** DEFINE CONNECTIONS ***// connect(sensors, multiplex.y) annotation( @@ -115,7 +117,6 @@ equation connect(subSystemHydrogenControl.controlInterface, controlSignals.u) annotation( Line(points = {{-76, -12}, {-68, -12}, {-68, -12}, {-68, -12}}, color = {0, 0, 127}, thickness = 0.5)); connect(sensors, subSystemHydrogenControl.signalInterface_H2) annotation( - Line(points = {{146, 0}, {162, 0}, {162, -112}, {-160, -112}, {-160, -24}, {-120, -24}, {-120, -24}}, color = {0, 0, 127}, thickness = 0.5)); connect(fixedTemperature.port, bodyRadiation.port_b) annotation( Line(points = {{-122, 150}, {-122, 150}, {-122, 136}, {-140, 136}, {-140, 126}, {-140, 126}}, color = {191, 0, 0})); @@ -127,13 +128,10 @@ equation Line(points = {{-100, 106}, {-100, 106}, {-100, 100}, {-118, 100}, {-118, 92}, {-116, 92}}, color = {191, 0, 0})); connect(setConvectiveCoefficient.y, convection.Gc) annotation( Line(points = {{-76, 116}, {-88, 116}, {-88, 116}, {-90, 116}}, color = {0, 0, 127})); - annotation( - uses(Modelica(version = "3.2.3")), Diagram(coordinateSystem(extent = {{-150, -100}, {150, 100}}, initialScale = 0.1), graphics = {Text(origin = {-32, 90}, extent = {{-14, 4}, {22, -6}}, textString = "Pressure regulator"), Text(origin = {50, 14}, extent = {{-14, 4}, {22, -6}}, textString = "Recirculation blower")}), Icon(graphics = {Bitmap(origin = {-5, 1}, extent = {{-95, 99}, {105, -101}}, imageSource = "iVBORw0KGgoAAAANSUhEUgAAA0wAAANLCAMAAABFRu09AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAIWUExURQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAgADBQAFCAAFCQAHDAAIDQAIDgAJDwAKEAAKEQAKEgALEgALEwAMFAANFQANFgAOFwAOGAAQGgAQGwARHAASHgASHwATHwATIQAUIQAVIwAWJAAWJQAXJgAXJwAZKQAZKgAZKwAaLAAbLgAcLgAdMQAfNAAhOAAiOQAjOgAjOwAkPAAkPQAlPgAlPwAmPwAmQAAmQQAoQwAoRAApRQAqRgArSAAsSQAsSgAtTAAuTQAuTgAvTwAvUAAwUAAxUgAxUwAyVAA0VwA1WQA1WgA2XAA3XAA3XQA4XgA4XwA5XwA6YQA6YgA7YwA7ZAA8ZYJ4HvgAAABgdFJOUwAICRAXGRobHR8jKywuLzE3PEBCQ0hJSk1PUFFSVVdZXF5fYGFpam9xdnd5e4CBgoOIj5CRkpOUlpydn6Cio6aoqa+0tre/wMPExcbHyMnOz9DW193g6Orv9fb3+Pn7/cpJ8rwAAAAJcEhZcwAAMsAAADLAAShkWtsAAB6GSURBVHhe7d3nu1TlucDhAcVOVGzR2KMGS06CpphEY8UaVBR7Wyf2ir3EBohKFDUqYkM92DWx5D88vM96kCJl73k2sMt9f3BmrzKzxuv9XcDstd412LFmzDr4yGOP/83Jfzrr3AvmL7j6ug5G4bqrF8y/4Nyz/nzKb48/9siDZ83IYTXFTJt52Emnz7sm/5/AmLhm3uknHTZzWg6yyW+3/Y87Ze6C/PCwDSyYe8px+++WA26y2vnwUy/Pzwvb2OWnHr5zDrzJZqdDTr4sPyVsJ5edfMhOOQAni+kHzpmXn25Dtyx88pnFLy57+fUV765a/dlX3/4XRuHbrz5bverdFa+/vOzFxc88ufCWHFYbmjfnwOk5ECe83U84Pz/V+u54bOny9z/P/ycwJj5/f/nSx+7IIba+80/YPYfjBDbt6Ln5cX70wLPLVqz+Lj89jLnvVq9Y9uwDOdx+NPeXE/tbvgP+cn1+knT/0pXf5CeGbeqblUvvz2GXrj/tgByYE87ec67MD9G7e/GKL/Nzwnbx5YrFd+fw6105Z+8cnhPIjNmX5OGHOxe96d9H7BCfv7nozhyG4ZLZE+tEiX3OyAMP9yx7Lz8X7BDvLbsnB2M4Y58cqOPfrLPzmJtbl6zKDwQ70Kolt+aQbM6elYN1fDtg/a/vnno7PwrscG8/lcOymTv+v4z4xXl5rGs8/MrX+SlgXPj6lYdzcK5x3iE5aMenI9ad53DHS5/mB4Bx5NOX1v1S929H5MAdf46Zn8fYdXe/mocO486r674un39MDt7x5dB154MvfCOPGsalNxbmUO26yw/NATx+7HFmHlvXPbQijxjGrRUP5XDtujP3yEE8Tpx4cx5Y98g7ebQwrr3zSA7Z7uYTcxiPBwddmkfVPe7Xs0wY7z2ew7a79KAcyjvarqflEXVP+P0sE8qqJ3LodqftmsN5h5p9bR7O7W/lEcKE8dbtOXyvnZ0DesfZ7+I8lu6F7/PwYAL57oUcwN3F++Wg3kF+l8fRPfp/eWwwwXz8aA7i7nc5rHeEvS7Mg7jttTwumIBeuy0H8oV75dDe7o6+IQ/h+f/kQcGE9J/ncyjfcHQO7u3sD/n+D/sOjwlv1dozYP+Qw3t7mrn2m4en8mhgQvtHDuiLZ+YQ326OubF/53s/zEOBCe7De/sxfeN2Pvn1j/3bds/5PpxJ4/vnclj/MYf59vCztZctLc+jgEnhlRzY836WQ32bO+qm/h3v+ygPASaJj+7rx/ZNR+Vg38Z+1b9dt8hf8Zh0vl+Uw/tXOdy3qV/nm/krHpPS8hzgv84Bvw3lCUT3f5xvDZPMxzmr8u9zyG8zf+3f5+kf8o1h0vnh6X6U/zUH/bYx/Zz+XZbku8KktKQf5+dsw/tm7HJR/x4v5VvCJPVSP9Iv2iWH/pjb84r+Hf6ZbwiT1j/7sX7Fnjn4x9i+V/Wv/698O5jEXu9H+1X75vAfUz/vz8b7+8p8M5jUVv5vDPgbf54BjKF9+5Zu+yDfCia5D/rbZtw45n827dn/He+uT/KNYNL75K4Y9FeN8b+bdum/e3jwi3wbmAK+eDCG/RVj+p3e9P478QfdIoYp5eu+poumZwhjof9d7V3+XGKK+aL/m945GcIY6M8hus2/l5hyPum/hRizM4t+Hy/3d9/jMQV98PcY/mM0pd7/xIt1fr/ElLSyH/9jckVGXgvovAemqH/1BYzB1YJH9a/kfDymrDxPr3wl+8/6+R6cJ84U1p9DflN1lpV+HiLXLzGl9dc3zcsohtTPj/d0viRMUf21t6X59I6Jl7jfNepMcT/080IU5nqd2Z8pbu4UpryPI4Ubh5+HvJ+b35xekDOAXZxpjFp/z5hF+WIwpfWzUw55x5mjY+f7zNsKa3zfz5w81N3Q9urvC2g+cQgfRRA3DHOnzv5+ta/kC8GU1/+z6cIMZBT6aZCfy5cB/tvfv2nUJ5DvF7vd6x9M8KPv+3sL7peRjFT/rbh7bMJ6PowsRvn9+OzY6R/5EkDo7yI9OzMZkV2vbbs8nC8ApIdbGdfumqGMxGltj25V7g+kDyKN0zKUETgodng+dwd+9HzEcVCmsnWXts1v+0/uDfzo37e1Oi7NVLbqxLZ191ruDKzntcjjxIxlK/a4uW38aO4KbODR1sfNe2QuW3Zm27b7v9wT2EB/adOZmcsWHRqbvpA7Aht5IRI5NIPZksvbhrc7jwg24/vbWyOXZzBb0E/78FbuBvzEWxHJ1ieEmN82eyJ3AjbhiVbJ/Exms45oWzn3AbZkVWRyREazOX9rGz2euwCb9HjrZCuTUh7Stuneyz2ATXovQvlFZrNp57VNHskdgM14pJVyXmazSQe0Lbp3cntgM96JVA7IcDZlbtvgodwc2KyHWitzM5xNmNXWdytya2CzVkQsszKdnzq7rV6YGwNbsLDVcnam8xP7tLXdG7ktsAVvRC77ZDwbO6OtvDs3Bbbo7tbLGRnPRma0dd2ruSWwRa9GMDMynw3F9F535IbAVtzRitn0tF+XtFXuBA0jFPeNviTz2cDebU33aW4HbMWnkczeGdD65rQV5p2EEYsZKedkQOu7sq1wBxkYsVdaM1dmQOvpT8v7OrcCturriOanJ+jFjMhP5UbACDzVqvlLJvSjade3xW/nNsAIvN2quX5aRrTWL9vSW3MTYERubd1sfM/ouPhiSW4BjMiS1s1GF2Ls3paZRwVGp59ZZffMqHdCW3RPbgCM0D2tnBMyo975bdGyXA+M0LJWzvmZUZjelpiUCEarn6ZoeobUHNgW3JmrgRG7s7VzYIbUxHl5i3ItMGKLWjvrn583ry14M9cCI/Zma2e9uV13aj93n+daYMQ+j3h2ypRyUmSTP8AQYiqIQzKlweDk9uPiXAeMwuJWz8mZ0mBwWfvR3JMwhJiN8rJMabBz+6n7MtcBo/Bl5LNzxnR4++H+XAWMyv2tn8MzplPbD0tzDTAqS1s/p2ZMcX/1lbkGGJWVrZ+89/pu7Xn3Ta4BRuWbCGi3iGn/9vSBXAGM0gOtoP0jpuPa02dzOTBKz7aCjouYTmlPXcsEQ4prmk6JmGL6B7+yhSHFr237iSAWtKerczkwSqtbQQtaS9Pas+67XA6M0neRUJs9b2Z74rZMMLS4UdPMNTEd1p48lkuBUXusNXTYmphOak+cTARDixOKTloT0+ntyfJcCoza8tbQ6Wtiivkf3s+lwKi93xpq80Bc056Y/wGGFvNAXDMYzGiPt+RCYAi3tIpmDGa1h4W5DBjCwlbRrMHB7eHJXAYM4clW0cGDI9vDM7kMGMIzraIjB8e2B9N8QUFM93Xs4Pj28GIuA4bwYqvo+MFv24OrmaAgrmj6TX9p4Mu5DBjCy62ikwd/bg+v5zJgCK+3iv40OKs9uM4WCuJa27MG57aHd3MZMIR3W0XnDi5oD6tyGTCEVa2iCwbz24MZIKAgZoGY30+n8lkuA4bwWatoweDq9vBVLgOG8FWr6OrBde3h21wGDOHbVtF1g/bfLhcBQ4mMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoiIzFBXWQkJqiLjMQEdZGRmKAuMhIT1EVGYoK6yEhMUBcZiQnqIiMxQV1kJCaoi4zEBHWRkZigLjISE9RFRmKCushITFAXGYkJ6iIjMUFdZCQmqIuMxAR1kZGYoC4yEhPURUZigrrISExQFxmJCeoio8F17b/f5iJgCN+2iq4bXN0evsplwBC+ahVdPVjQHj7LZcAQPmsVLRjMbw+rcxkwhNWtovmDC9rDqlwGDGFVq+iCwbnt4d1cBgzh3VbRuYOz2sOKXAYMYUWr6KzBn9rD67kMGMLrraI/D05uDy/nMmAIL7eKThn8pj0sy2XAEJa1in47OL49vJjLgCG82Co6fnBse1icy4AhLG4VHTs4sj08k8uAITzTKjpycHB7eDKXAUN4slV08GBWe1iYy4AhLGwVzRrMaA+35DJgCLe0imYMBte0x89zITBqn7eGrhkMBvPak/dzKTBq77eG5q2J6fT2ZHkuBUZteWvo9DUxndSeLM2lwKgtbQ2dtCamw9qTx3IpMGqPtYYOWxPTzPbkjlwKjNodraGZa2Ka1p503+ViYJS+i4SmrYmpn1LFLBAwpJgBYkFraTC3PXWtLQwprrOdGzGd0p66ogmGFFcznRIxHdeePpvLgVF6thV0XMS0f3v6QC4HRumBVtD+EdNu7Wn3Ta4ARuWbCGi3iGlweXu+MtcAo7Ky9XN539Lg1PaDE4pgKHEy0akZ0+Hth/tzDTAq97d+Ds+Ydm4/dF/mKmAUvox8ds6YBpe1n/zaFoYQv7K9LFMa9LO6mu4LhhDTfJ2cKQ0Gh7Qf7851wCjc3eo5JFMaDHZqP5oHAkYv5n/odsqU1oh5IN7MtcCIvdnaafM/rDWnLViUa4ERW9TamZMhNQe2BXfmWmDE7mztHJghNdPbgu69XA2M0HuRzvQMKZzflrimCUYprmU6PzPqndAW3ZPrgRG6p5VzQmbU270t6lblBsCIrIpwds+MUkwEsSS3AEZkSeumn/5hnaPbwltzC2BEbm3d/DIjWmva9W3p27kJMAJvt2qujxnz1veXtvip3AYYgadaNadlQusc0BZ3X+dGwFZ9HdEckAmt58q2/JXcCtiqV1ozV2ZA64vz8x7OrYCterg1s/55eWvt3VZ0n+ZmwFZ8GsnsnQFt4JK25qXcDtiKl1oxl2Q+G5rdVrlRE4xQ3JZpduazoRltVfdqbghs0asRzIzMZyNntHWmgoARickfzsh4NrZPW9m9kZsCW/BG5LJPxvMTZ7e1C3NbYAsWtlrOznR+alZbbTZK2LqYe7KblelsQlyI8VBuDWzWQ62VjS++WF9/gt47uTmwGe9EKps4LW+d89oWj+T2wGY80ko5L7PZtF+0TUxTBFvWT0q0blLkTYq5XR/PPYBNerx18reMZnOOaBuZWQW2pJ9H5YiMZrPmt62eyH2ATXiiVTI/k9m8Y9pm3Vu5E/ATb0Ukx2QyWxD3Xr/9u9wN2Mh3t7dG1t5ffUsObRt2L+R+wEZeiEQOzWC26MzY9OPcEdjAxxHImZnLlu1xc9v20dwT2MCjrY+b98hctuLEtnH3Wu4KrOe1yOPEjGWrLm1b3/af3Bn40b9va3Vcmqls3UFt8+753Bv40fMRx0GZygicFjs4DwI28kGk8dMZkTdv12vbHmakhI3EvJPX7pqhjEhM+2Uef9jQPyKMTU/vtVkXx04f5ksAa3wYWVyckYzUfrHXvd/niwD//f7eyGK/jGTEfhe7PZevAvz3uYjid5nIKFwYO7rHDKS4g0x3YQYyGnvdELt+lC8EU9xHEcQNe2UgoxL3jO7u888mWOP7+yKIozOPUfpD7LwoXwumtEWRwx8yjlHrvx9fni8GU9jyiGG034qvM/PGeAGXNjHl9Rcx3Tgz0xhCPyHE/T/kC8IU9cP9kcIIpn3YvD/GSzydrwhT1NMRwh8ziyHFpJTdknxJmJKWRAbzMoph/eymeBn3jWYKiztBdzf9LKMY2lHxOt0/82Vhyvln38BRmUTBr/pX+le+MEwxr/cF/CqDKPl1/1or86VhSlnZj/9fZw5F/Qnk//tBvjhMIR/8bwz/32cMZX+Nl7v1k3x5mDI+uTUG/18zhTFwTrzgXV/kG8AU8cVdMfTPyRDGwrSL4iUf/DrfAqaErx+MgX/RtAxhTOxyRbzog/5sYgr5om/pil0ygzGy51Xxsnf5dxNTxif93/Gu2jMjGDP79meQ3+o7PaaID/rvHm7cNxMYQz/va/q73zcxJazsvxO/8ecZwJjat/+bnnMhmAryvIertsGfS82e/bcQztNj8svz8a4Y838vrbVL/w25c8iZ7PrzxLuLxvh7vPVN73976/omJrf++qXunDH9/dJP9GcWdU+7kp1J64f+utqxPIdo037fv8/9Zllhkvq4n+9hmGmQR+t/+ncyAxiTUz+n15hdc7FlebVgt8hcr0w63/dzTY7RtYBbd1Q/L0R3n3nImWQ+6udA7m4ag2vUR+Zn/ZxF7pHBJNPf56Lr5pXnThmFfj69rnvOX/WYNL7v779Unh9vtI7pz9Tr7nWnTiaJD/v7AnY3luZtHcbMflb/rvtHHgpMaP29n7vu4sJ84kPr7zjTdQ+7KoMJ74OHczgPfc+YmqP7ewt23fP/ziOCCenfz+dQvmHIe5nV7dXf97brbnstDwomoNduy4F84VD32Bwj/ZR6azzq9CImqI8fzUG8PU4g2pL91n4P0b3gW3ImoO9eyAHcXbxfDuodZ/a1eSy3v5WHBxPGW7fn8L12dg7oHWrX0/JwuidW5RHChLDqiRy63Wm75nDe0Q66NI+oe/y9PEoY9957PIdtd+lBOZTHgxNvzqPqHnknjxTGtXceySHb3XxiDuNxYo8z88C67qEVebQwbq14KIdr1525Rw7i8ePQy/PYum7hG3nEMC69sTCHatddfmgO4PHlmPl5fF1396t51DDuvHp3DtOum7/dT2odsSP+lsfYdXe89GkeOowjn750Rw7Rrpt3RA7c8emQ8/I413j4FbegYVz5+pW157Oucd4vctCOXwfMzWNtnno7PwXscG8/lcOymXtADtjxbdbZebzNrUv8JpdxYNWS/qYWvbNn5WAd//Y5I4853LPMr3LZod5bdk8OxnDGPjlQJ4YZsy/JAw93Lnrz8/xcsF19/uaiO3MYhktmz8hBOoHsPefKPPze3YtXfJmfD7aLL1csXvc1eHPlnL1zeE44B5x2fX6IdP/Sld/k54Rt6puVS3Oe47Wu/8vE+NJhc6b9cv0v98IDzy5bsfq7/MQw5r5bvWLZsw/kcPvR3KO37T0ttovdTzg/P8767nhs6fL3/TuKMfX5+8uXPrbul7LrnH/C7jkcJ7zpB85ZOwnshm5Z+OQzi19c9vLrK95dtfqzr77N/ycwIt9+9dnqVe+ueP3lZS8ufubJhbfksNrQvDkHTs+BOFnsdMjJl+Wng+3kspMP2SkH4GSz8+Gnrju3HLapy089fOcceJPVbvsfd8rcBfl5YRtYMPeU4/bfLQfc5Ddt5mEnnT7vmvzwMCaumXf6SYfNnATf2g1jxqyDjzz2+N+e8uezzr1g/oKrr8v/JzAi1129YP4F5571p5N/c/yxRx48a4ee2jAY/D/LnKffN+3eBgAAAABJRU5ErkJggg=="), Text(origin = {-78, 83}, lineColor = {255, 255, 255}, extent = {{30, -23}, {128, -141}}, textString = "H2"), Text(origin = {-75, 64}, lineColor = {255, 255, 255}, extent = {{-19, 10}, {29, -18}}, textString = "Control"), Text(origin = {-74, -57}, lineColor = {255, 255, 255}, extent = {{-28, 7}, {36, -11}}, textString = "Sensors")}, coordinateSystem(extent = {{-150, -100}, {150, 100}}, initialScale = 0.1)), - version = "", - Documentation(info = "The hydrogen sub system provides hydrogen to the Fuel Cell Stack



References to base model/related packages

Subsystem Hydrogen Control, Recirculation BlowerPressure Regulator, and Purge Valve


+ Documentation(info = "The hydrogen sub system provides hydrogen to the Fuel Cell Stack



References to base model/related packages

Subsystem Hydrogen Control, Recirculation BlowerPressure Regulator, and Purge Valve


Description

@@ -144,4 +142,4 @@ equation

 

")); -end SubSystemHydrogen; +end SubSystemHydrogen; \ No newline at end of file diff --git a/VirtualFCS/SubSystems/Hydrogen/SubSystemHydrogenControl.mo b/VirtualFCS/SubSystems/Hydrogen/SubSystemHydrogenControl.mo index d09a31e..df8f9f0 100644 --- a/VirtualFCS/SubSystems/Hydrogen/SubSystemHydrogenControl.mo +++ b/VirtualFCS/SubSystems/Hydrogen/SubSystemHydrogenControl.mo @@ -1,10 +1,8 @@ within VirtualFCS.SubSystems.Hydrogen; class SubSystemHydrogenControl - parameter Real pressure_H2_set(unit = "Pa") = 200000 "Set H2 Pressure"; parameter Real massFlow_H2_set(unit = "kg/s") = 1e-2 "Set H2 Recirculation Mass Flow"; - Modelica.Blocks.Routing.Multiplex3 multiplexSignalsH2Subsystem annotation( Placement(visible = true, transformation(origin = {124, 40}, extent = {{-16, -16}, {16, 16}}, rotation = 0))); Modelica.Blocks.Sources.RealExpression getH2MassFlow(y = deMultiplexH2Sensors.y1[1]) annotation( @@ -45,5 +43,5 @@ equation annotation( Diagram(coordinateSystem(extent = {{-200, -200}, {200, 200}})), Icon(coordinateSystem(extent = {{-200, -200}, {200, 200}}, initialScale = 0.1), graphics = {Rectangle(fillColor = {50, 50, 50}, fillPattern = FillPattern.Solid, extent = {{-200, 200}, {200, -200}}), Text(origin = {-9, 240}, lineColor = {0, 0, 255}, extent = {{-137, 34}, {137, -34}}, textString = "%name")}), - Documentation(info = "The hydrogen sub system control governs the flow and pressure of hydrogen, based on fuel cell current. 


Description

The fuel cell interface (output current value) and hydrogen interface (mass flow rate set value) signals are inputs to the Purge Valve Control and Pump Speed Control blocks. Other inputs include hydrogen feed pressure (from hydrogen tank to the fuel cell) and mass flow rate and are set to a constant value. The output signal is concatenated with three values, (1) Hydrogen Feed Pressure input to Pressure Regulator, (2) Control Signal to Purge Valve and (3) Set Speed to Recirculation Blower.  The Pump Speed Control blocks uses simple PID control to set Recirculation Blower speed as a function of mass flow andPurge Valve Control uses logical conditions to control Purge Valve


List of components

The model comprises Pump Speed ControlPurge Valve Control, DeMultipex2, Multiplex3. The subsystem features multiple interface connections all of them are control port. 

")); -end SubSystemHydrogenControl; + Documentation(info = "The hydrogen sub system control governs the flow and pressure of hydrogen, based on fuel cell current. 


Description

The fuel cell interface (output current value) and hydrogen interface (mass flow rate set value) signals are inputs to the Purge Valve Control and Pump Speed Control blocks. Other inputs include hydrogen feed pressure (from hydrogen tank to the fuel cell) and mass flow rate and are set to a constant value. The output signal is concatenated with three values, (1) Hydrogen Feed Pressure input to Pressure Regulator, (2) Control Signal to Purge Valve and (3) Set Speed to Recirculation Blower.  The Pump Speed Control blocks uses simple PID control to set Recirculation Blower speed as a function of mass flow andPurge Valve Control uses logical conditions to control Purge Valve


List of components

The model comprises Pump Speed ControlPurge Valve Control, DeMultipex2, Multiplex3. The subsystem features multiple interface connections all of them are control port. 

")); +end SubSystemHydrogenControl; \ No newline at end of file diff --git a/VirtualFCS/SubSystems/Hydrogen/package.mo b/VirtualFCS/SubSystems/Hydrogen/package.mo index 7e1ff74..0c15448 100644 --- a/VirtualFCS/SubSystems/Hydrogen/package.mo +++ b/VirtualFCS/SubSystems/Hydrogen/package.mo @@ -2,4 +2,4 @@ within VirtualFCS.SubSystems; package Hydrogen "Subsystems related to the hydrogen line." extends Modelica.Icons.VariantsPackage; -end Hydrogen; +end Hydrogen; \ No newline at end of file diff --git a/VirtualFCS/SubSystems/UsersGuide/package.mo b/VirtualFCS/SubSystems/UsersGuide/package.mo index 776a88d..be77d53 100644 --- a/VirtualFCS/SubSystems/UsersGuide/package.mo +++ b/VirtualFCS/SubSystems/UsersGuide/package.mo @@ -2,4 +2,4 @@ within VirtualFCS.SubSystems; package UsersGuide "User information for the SubSystems sub-library" extends Modelica.Icons.Information; -end UsersGuide; +end UsersGuide; \ No newline at end of file diff --git a/VirtualFCS/SubSystems/package.mo b/VirtualFCS/SubSystems/package.mo index 25bc2d2..1d6fa82 100644 --- a/VirtualFCS/SubSystems/package.mo +++ b/VirtualFCS/SubSystems/package.mo @@ -2,13 +2,6 @@ within VirtualFCS; package SubSystems "Encapsulated support subsystems for modelling fuel cell systems." extends Modelica.Icons.Package; - - - - - - - annotation( Documentation(info = "Subsystem models are designed to improve the encapsulation aspects of the modelling library. Users can design subsystems independently from the overall system design, with the option to plug-and-play different sub-system designs to determine the effect on overall system performance. Three example subsystems are provided: SubSystemAir, SubSystemCooling, and SubSystemHydrogen.")); -end SubSystems; +end SubSystems; \ No newline at end of file diff --git a/VirtualFCS/Thermal/HeatSink.mo b/VirtualFCS/Thermal/HeatSink.mo index 2ed47b7..6ba1d97 100644 --- a/VirtualFCS/Thermal/HeatSink.mo +++ b/VirtualFCS/Thermal/HeatSink.mo @@ -1,48 +1,22 @@ within VirtualFCS.Thermal; model HeatSink - -//*** DEFINE REPLACEABLE PACKAGES ***// + //*** DEFINE REPLACEABLE PACKAGES ***// // Medium models replaceable package Medium = Modelica.Media.Water.ConstantPropertyLiquidWater; - -//*** INSTANTIATE COMPONENTS ***// - Modelica.Thermal.HeatTransfer.Sources.FixedTemperature fixedTemperature( - T = 293.15) - annotation( + //*** INSTANTIATE COMPONENTS ***// + Modelica.Thermal.HeatTransfer.Sources.FixedTemperature fixedTemperature(T = 293.15) annotation( Placement(visible = true, transformation(origin = {0, -65}, extent = {{-5, -5}, {5, 5}}, rotation = 90))); - - Modelica.Thermal.HeatTransfer.Components.Convection convection - annotation( + Modelica.Thermal.HeatTransfer.Components.Convection convection annotation( Placement(visible = true, transformation(origin = {0, -27}, extent = {{-7, -7}, {7, 7}}, rotation = -90))); - - Modelica.Fluid.Pipes.DynamicPipe pipe( - redeclare package Medium = Medium, - diameter = 0.01, - length = 0.2, - modelStructure = Modelica.Fluid.Types.ModelStructure.a_vb, - nNodes = 1, - nParallel = 5, - p_a_start = 102502, - use_HeatTransfer = true) - annotation( + Modelica.Fluid.Pipes.DynamicPipe pipe(redeclare package Medium = Medium, diameter = 0.01, length = 0.2, modelStructure = Modelica.Fluid.Types.ModelStructure.a_vb, nNodes = 1, nParallel = 5, p_a_start = 102502, use_HeatTransfer = true) annotation( Placement(visible = true, transformation(origin = {0, 0}, extent = {{-10, 10}, {10, -10}}, rotation = 0))); - - Modelica.Blocks.Sources.Constant const( - k = 7200) - annotation( + Modelica.Blocks.Sources.Constant const(k = 7200) annotation( Placement(visible = true, transformation(origin = {36, -27}, extent = {{5, -5}, {-5, 5}}, rotation = 0))); - - Modelica.Fluid.Interfaces.FluidPort_a port_a( - redeclare package Medium = Medium) - annotation( + Modelica.Fluid.Interfaces.FluidPort_a port_a(redeclare package Medium = Medium) annotation( Placement(visible = true, transformation(origin = {-100, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {-100, -70}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - - Modelica.Fluid.Interfaces.FluidPort_b port_b( - redeclare package Medium = Medium) - annotation( + Modelica.Fluid.Interfaces.FluidPort_b port_b(redeclare package Medium = Medium) annotation( Placement(visible = true, transformation(origin = {100, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {100, -70}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - equation //*** DEFINE CONNECTIONS ***// connect(pipe.port_b, port_b) annotation( @@ -55,7 +29,6 @@ equation Line(points = {{0, -34}, {0, -34}, {0, -60}, {0, -60}}, color = {191, 0, 0})); connect(const.y, convection.Gc) annotation( Line(points = {{30.5, -27}, {18, -27}, {18, -26}, {8, -26}}, color = {0, 0, 127})); - -annotation( + annotation( Icon(graphics = {Rectangle(origin = {-16, -71}, fillColor = {0, 0, 255}, fillPattern = FillPattern.HorizontalCylinder, extent = {{-84, 11}, {116, -9}}), Ellipse(origin = {40, 76}, fillColor = {166, 166, 166}, fillPattern = FillPattern.Sphere, extent = {{40, 14}, {-40, -6}}, endAngle = 360), Bitmap(origin = {-16, -42}, extent = {{-84, 72}, {116, -18}}, imageSource = "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aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOqD6M8rPowhDloN6z6MMrDqg+jPKz6MIQ5aDes+jDKw6oPozys+jCEOWg3rPowysOq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"), Ellipse(origin = {-40, 76}, fillColor = {166, 166, 166}, fillPattern = FillPattern.Sphere, extent = {{40, 14}, {-40, -6}}, endAngle = 360), Ellipse(origin = {30, 78}, fillColor = {166, 166, 166}, fillPattern = FillPattern.Sphere, extent = {{-20, 12}, {-40, -6}}, endAngle = 360)}, coordinateSystem(initialScale = 0.1))); -end HeatSink; +end HeatSink; \ No newline at end of file diff --git a/VirtualFCS/Thermal/PreHeater.mo b/VirtualFCS/Thermal/PreHeater.mo index e05f8c7..090d57e 100644 --- a/VirtualFCS/Thermal/PreHeater.mo +++ b/VirtualFCS/Thermal/PreHeater.mo @@ -1,39 +1,20 @@ within VirtualFCS.Thermal; model PreHeater - -//*** DEFINE REPLACEABLE PACKAGES ***// + //*** DEFINE REPLACEABLE PACKAGES ***// // Medium models replaceable package Medium = Modelica.Media.Water.ConstantPropertyLiquidWater; - -//*** DECLARE PARAMETERS ***// + //*** DECLARE PARAMETERS ***// parameter Real R_eq(unit = "ohm") = 1.75 "Equivalent Resistance"; parameter Real D_pipe(unit = "m") = 0.015 "Pipe Diameter"; parameter Real L_pipe(unit = "m") = 1 "Pipe Length"; parameter Real N_pipe(unit = "-") = 10 "Number of Parallel Pipes"; - - -//*** INSTANTIATE COMPONENTS ***// - Modelica.Fluid.Pipes.DynamicPipe pipe( - redeclare package Medium = Medium, - diameter = D_pipe, - length = L_pipe, - modelStructure = Modelica.Fluid.Types.ModelStructure.a_vb, - nNodes = 1, - nParallel = N_pipe, - p_a_start = 102502, - use_HeatTransfer = true) - annotation( + //*** INSTANTIATE COMPONENTS ***// + Modelica.Fluid.Pipes.DynamicPipe pipe(redeclare package Medium = Medium, diameter = D_pipe, length = L_pipe, modelStructure = Modelica.Fluid.Types.ModelStructure.a_vb, nNodes = 1, nParallel = N_pipe, p_a_start = 102502, use_HeatTransfer = true) annotation( Placement(visible = true, transformation(origin = {0, -80}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - - Modelica.Fluid.Interfaces.FluidPort_a port_a( - redeclare package Medium = Medium) - annotation( + Modelica.Fluid.Interfaces.FluidPort_a port_a(redeclare package Medium = Medium) annotation( Placement(visible = true, transformation(origin = {-100, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {-100, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - - Modelica.Fluid.Interfaces.FluidPort_b port_b( - redeclare package Medium = Medium) - annotation( + Modelica.Fluid.Interfaces.FluidPort_b port_b(redeclare package Medium = Medium) annotation( Placement(visible = true, transformation(origin = {100, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {100, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); Modelica.Electrical.Analog.Interfaces.NegativePin pin_n annotation( Placement(visible = true, transformation(origin = {80, 100}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(extent = {{40, 90}, {60, 110}}, rotation = 0))); @@ -41,16 +22,14 @@ model PreHeater Placement(visible = true, transformation(origin = {-80, 102}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(extent = {{-60, 90}, {-40, 110}}, rotation = 0))); Modelica.Thermal.HeatTransfer.Components.ThermalConductor thermalConductor(G = 1777) annotation( Placement(visible = true, transformation(origin = {0, -50}, extent = {{-10, -10}, {10, 10}}, rotation = -90))); - Modelica.Thermal.HeatTransfer.Components.HeatCapacitor heatCapacitor(C = 100) annotation( + Modelica.Thermal.HeatTransfer.Components.HeatCapacitor heatCapacitor(C = 100) annotation( Placement(visible = true, transformation(origin = {0, -12}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - Modelica.Electrical.Analog.Basic.Resistor R1(R = R_eq) annotation( + Modelica.Electrical.Analog.Basic.Resistor R1(R = R_eq) annotation( Placement(visible = true, transformation(origin = {0, 60}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow prescribedHeatFlow annotation( Placement(visible = true, transformation(origin = {-50, -20}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); equation - prescribedHeatFlow.Q_flow = R1.LossPower; - connect(port_a, pipe.port_a) annotation( Line(points = {{-100, 0}, {-91, 0}, {-91, -80}, {-10, -80}})); connect(pipe.port_b, port_b) annotation( @@ -65,6 +44,6 @@ equation Line(points = {{10, 60}, {80, 60}, {80, 100}}, color = {0, 0, 255})); connect(prescribedHeatFlow.port, heatCapacitor.port) annotation( Line(points = {{-40, -20}, {0, -20}, {0, -22}, {0, -22}}, color = {191, 0, 0})); -annotation( + annotation( Icon(graphics = {Line(origin = {29, 31.44}, points = {{-79, 68.562}, {-79, -71.438}, {-69, 8.56202}, {-59, -71.438}, {-49, 8.56202}, {-39, -71.438}, {-29, 8.56202}, {-19, -71.438}, {-9, 8.56202}, {1, -71.438}, {11, 8.56202}, {21, -71.438}, {21, 70.562}, {23, 72.562}}, color = {255, 0, 0}, thickness = 1.5), Line(origin = {-0.67, 27.14}, points = {{-98.9689, -27.1425}, {99.0311, -27.1425}, {101.031, -27.1425}}, color = {0, 85, 255}, thickness = 2)})); -end PreHeater; +end PreHeater; \ No newline at end of file diff --git a/VirtualFCS/Thermal/UsersGuide/package.mo b/VirtualFCS/Thermal/UsersGuide/package.mo index b29f8e3..6c78dc4 100644 --- a/VirtualFCS/Thermal/UsersGuide/package.mo +++ b/VirtualFCS/Thermal/UsersGuide/package.mo @@ -2,4 +2,4 @@ within VirtualFCS.Thermal; package UsersGuide "User information for the Thermal sub-library" extends Modelica.Icons.Information; -end UsersGuide; +end UsersGuide; \ No newline at end of file diff --git a/VirtualFCS/Thermal/package.mo b/VirtualFCS/Thermal/package.mo index b7ff3db..d90c171 100644 --- a/VirtualFCS/Thermal/package.mo +++ b/VirtualFCS/Thermal/package.mo @@ -2,9 +2,6 @@ within VirtualFCS; package Thermal "Thermal components supplementing the Modelica Standards Library." extends Modelica.Icons.Package; - - - annotation( Documentation(info = "
")); -end Thermal; +end Thermal; \ No newline at end of file diff --git a/VirtualFCS/UsersGuide/Acknowledgements.mo b/VirtualFCS/UsersGuide/Acknowledgements.mo index 1968edc..73437f4 100644 --- a/VirtualFCS/UsersGuide/Acknowledgements.mo +++ b/VirtualFCS/UsersGuide/Acknowledgements.mo @@ -8,4 +8,4 @@ equation Documentation(info = "
The following people have directly contributed to the implementation of the Virtual-FCS library.

Dr. Simon Clark, SINTEF Industry, Norway
Dr. Yash Raka, SINTEF Industry, Norway
Dr. Michael R. Gerhardt, SINTEF Industry, Norway
Dr. Loic Vichard, UBFC, France
Amelie Pinard, France

Many others have contributed by other means than model implementation. Specifically, we thank Dr. Federico Zenith (SINTEF Digital), Dr. Alejandro Oyarce Barnett (SINTEF Industry), Dr. Nadia Steiner (UBFC) and Dr. Daniel Hissel (UBFC) for the helpful discussions. 

This project has received funding from the Fuel Cells and Hydrogen 2 Joint Undertaking under grant agreement No 875087. This Joint Undertaking receives support from the European Union’s Horizon 2020 research and innovation programme, Hydrogen Europe and Hydrogen Europe research.



")); -end Acknowledgements; +end Acknowledgements; \ No newline at end of file diff --git a/VirtualFCS/UsersGuide/Contact.mo b/VirtualFCS/UsersGuide/Contact.mo index f307a61..173be2c 100644 --- a/VirtualFCS/UsersGuide/Contact.mo +++ b/VirtualFCS/UsersGuide/Contact.mo @@ -4,4 +4,4 @@ class Contact extends Modelica.Icons.Contact; annotation( Documentation(info = "Dr. Kyrre Sundseth
SINTEF Industry
Trondheim, Norway
kyrre.sundseth@sintef.no
")); -end Contact; +end Contact; \ No newline at end of file diff --git a/VirtualFCS/UsersGuide/Conventions/package.mo b/VirtualFCS/UsersGuide/Conventions/package.mo index 64697cf..d060e5c 100644 --- a/VirtualFCS/UsersGuide/Conventions/package.mo +++ b/VirtualFCS/UsersGuide/Conventions/package.mo @@ -4,4 +4,4 @@ package Conventions extends Modelica.Icons.Information; annotation( Documentation(info = "

This library follows the conventions of the Modelica Standard Library, which are as follows:

Note, in the html documentation of any Modelica library, the headings \"h1, h2, h3\" should not be used, because they are utilized from the automatically generated documentation and headings. Additional headings in the html documentation should start with \"h4\".

In the Modelica package the following conventions are used:

  1. Class and instance names are written in upper and lower case letters, e.g., \"ElectricCurrent\". An underscore is only used at the end of a name to characterize a lower or upper index, e.g., \"pin_a\".
  2. Class names start always with an upper case letter.
  3. Instance names, i.e., names of component instances and of variables (with the exception of constants), start usually with a lower case letter with only a few exceptions if this is common sense (such as \"T\" for a temperature variable).
  4. Constant names, i.e., names of variables declared with the \"constant\" prefix, follow the usual naming conventions (= upper and lower case letters) and start usually with an upper case letter, e.g. UniformGravity, SteadyState.
  5. The two connectors of a domain that have identical declarations and different icons are usually distinguished by \"_a\", \"_b\" or \"_p\", \"_n\", e.g., Flange_a/Flange_b, HeatPort_a, HeatPort_b.
  6. The instance name of a component is always displayed in its icon (= text string \"%name\") in blue color. A connector class has the instance name definition in the diagram layer and not in the icon layer. Parameter values, e.g., resistance, mass, gear ratio, are displayed in the icon in black colorin a smaller font size as the instance name.
  7. A main package has usually the following subpackages:
    • UsersGuide containing an overall description of the library and how to use it.
    • Examples containing models demonstrating the usage of the library.
    • Interfaces containing connectors and partial models.
    • Types containing type, enumeration and choice definitions.
")); -end Conventions; +end Conventions; \ No newline at end of file diff --git a/VirtualFCS/UsersGuide/License.mo b/VirtualFCS/UsersGuide/License.mo index caa5984..9ae9a64 100644 --- a/VirtualFCS/UsersGuide/License.mo +++ b/VirtualFCS/UsersGuide/License.mo @@ -4,4 +4,4 @@ class License extends Modelica.Icons.Information; annotation( Documentation(info = "
MIT License

Copyright (c) 2021 Virtual-FCS H2020

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the \"Software\"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
")); -end License; +end License; \ No newline at end of file diff --git a/VirtualFCS/UsersGuide/ReleaseNotes/Version_0_1_0.mo b/VirtualFCS/UsersGuide/ReleaseNotes/Version_0_1_0.mo index edbce37..2830804 100644 --- a/VirtualFCS/UsersGuide/ReleaseNotes/Version_0_1_0.mo +++ b/VirtualFCS/UsersGuide/ReleaseNotes/Version_0_1_0.mo @@ -1387,4 +1387,4 @@ the library browser on the left of the Connection Editor

")); -end Version_0_1_0; +end Version_0_1_0; \ No newline at end of file diff --git a/VirtualFCS/UsersGuide/ReleaseNotes/Version_2022_1_0.mo b/VirtualFCS/UsersGuide/ReleaseNotes/Version_2022_1_0.mo index 15ccbf4..53f2172 100644 --- a/VirtualFCS/UsersGuide/ReleaseNotes/Version_2022_1_0.mo +++ b/VirtualFCS/UsersGuide/ReleaseNotes/Version_2022_1_0.mo @@ -1,6 +1,6 @@ within VirtualFCS.UsersGuide.ReleaseNotes; -encapsulated class Version_2022_1_0 +class Version_2022_1_0 extends Modelica.Icons.ReleaseNotes; annotation( Documentation(info = "Release of VirtualFCS v2022.1.0

Version Control
Starting from this release, we have switched to calender versioning. This change was made due to the plans to release updates to the code in regular intervals. The version numbers adhere to the format YYYY.Major.Minor.

Notable Modifications 
This release includes improvements which are @@ -676,4 +676,4 @@ Documentation and Real-Time Emulation.
")); -end Version_2022_1_0; +end Version_2022_1_0; \ No newline at end of file diff --git a/VirtualFCS/UsersGuide/ReleaseNotes/package.mo b/VirtualFCS/UsersGuide/ReleaseNotes/package.mo index 07e0dd3..541e912 100644 --- a/VirtualFCS/UsersGuide/ReleaseNotes/package.mo +++ b/VirtualFCS/UsersGuide/ReleaseNotes/package.mo @@ -2,7 +2,6 @@ within VirtualFCS.UsersGuide; package ReleaseNotes extends Modelica.Icons.ReleaseNotes; - annotation( Documentation(info = "• Version 0.1.0 (30.06.2021)")); -end ReleaseNotes; +end ReleaseNotes; \ No newline at end of file diff --git a/VirtualFCS/UsersGuide/package.mo b/VirtualFCS/UsersGuide/package.mo index 45b3293..72863ea 100644 --- a/VirtualFCS/UsersGuide/package.mo +++ b/VirtualFCS/UsersGuide/package.mo @@ -2,15 +2,6 @@ within VirtualFCS; package UsersGuide "User information for the VirtualFCS library" extends Modelica.Icons.Information; - - - - - - - - - annotation( Documentation(info = "

The VirtualFCS library is a free open-source library for modeling hydrogen fuel cell power systems. The models developed in the library are based on the Modelica standard library, and adhere to the proper conventions to support compatibility and interoperability with other libraries. The library is developed through the research project Virtual-FCS, funded by the European Union (see Acknowledgements for more information). The webpage for the project is www.virtual-fcs.eu

The source code for the library is hosted on GitHub (https://github.com/Virtual-FCS). The developers welcome contributions from the fuel cell and modelling communities to support the development, adoption, and improvement of the library. For information on how to contribute, please see the guidelines posted in the GitHub repository. 

General information and training materials can be found on the project website. Dedicated User Guides for the main sub-packages are listed below and accessible via hyperlink.

@@ -60,4 +51,4 @@ package UsersGuide "User information for the VirtualFCS library"
Name Description
")); -end UsersGuide; +end UsersGuide; \ No newline at end of file diff --git a/VirtualFCS/Utilities/ParameterRecords/DcPermanentMagnetMotorData.mo b/VirtualFCS/Utilities/ParameterRecords/DcPermanentMagnetMotorData.mo index c2d354a..97d9890 100644 --- a/VirtualFCS/Utilities/ParameterRecords/DcPermanentMagnetMotorData.mo +++ b/VirtualFCS/Utilities/ParameterRecords/DcPermanentMagnetMotorData.mo @@ -2,59 +2,37 @@ within VirtualFCS.Utilities.ParameterRecords; record DcPermanentMagnetMotorData extends Modelica.Icons.Record; - parameter Modelica.SIunits.Inertia Jr=0.15 "Rotor's moment of inertia"; - parameter Modelica.SIunits.Inertia Js=Jr "Stator's moment of inertia"; - parameter Modelica.SIunits.Voltage VaNominal=18 - "Nominal armature voltage" - annotation (Dialog(tab="Nominal parameters")); - parameter Modelica.SIunits.Current IaNominal=10 - "Nominal armature current (>0..Motor, <0..Generator)" - annotation (Dialog(tab="Nominal parameters")); - parameter Modelica.SIunits.AngularVelocity wNominal(displayUnit="rev/min")= - 1425*2*Modelica.Constants.pi/60 "Nominal speed" - annotation (Dialog(tab="Nominal parameters")); - parameter Modelica.SIunits.Temperature TaNominal=293.15 - "Nominal armature temperature" - annotation (Dialog(tab="Nominal parameters")); - parameter Modelica.SIunits.Resistance Ra=0.05 - "Armature resistance at TRef" - annotation (Dialog(tab="Nominal resistances and inductances")); - parameter Modelica.SIunits.Temperature TaRef=293.15 - "Reference temperature of armature resistance" - annotation (Dialog(tab="Nominal resistances and inductances")); - parameter Modelica.Electrical.Machines.Thermal.LinearTemperatureCoefficient20 alpha20a=0 "Temperature coefficient of armature resistance" - annotation (Dialog(tab="Nominal resistances and inductances")); - parameter Modelica.SIunits.Inductance La=0.0015 "Armature inductance" - annotation (Dialog(tab="Nominal resistances and inductances")); - parameter Modelica.Electrical.Machines.Losses.FrictionParameters frictionParameters(PRef=0, - wRef=wNominal) "Friction loss parameter record" - annotation (Dialog(tab="Losses")); - parameter Modelica.SIunits.Voltage ViNominal=VaNominal - - Modelica.Electrical.Machines.Thermal.convertResistance( - Ra, - TaRef, - alpha20a, - TaNominal)*IaNominal - - Modelica.Electrical.Machines.Losses.DCMachines.brushVoltageDrop(brushParameters, - IaNominal); - parameter Modelica.Electrical.Machines.Losses.CoreParameters coreParameters( - final m=1, - PRef=0, - VRef=ViNominal, - wRef=wNominal) "Armature core loss parameter record" - annotation (Dialog(tab="Losses")); - parameter Modelica.Electrical.Machines.Losses.StrayLoadParameters strayLoadParameters( - PRef=0, - IRef=IaNominal, - wRef=wNominal) "Stray load losses" annotation (Dialog(tab="Losses")); - parameter Modelica.Electrical.Machines.Losses.BrushParameters brushParameters(V=0, ILinear= - 0.01*IaNominal) "Brush loss parameter record" - annotation (Dialog(tab="Losses")); - annotation ( - defaultComponentName="dcpmData", - defaultComponentPrefixes="parameter", - Documentation(info=" + parameter Modelica.Units.SI.Inertia Jr = 0.15 "Rotor's moment of inertia"; + parameter Modelica.Units.SI.Inertia Js = Jr "Stator's moment of inertia"; + parameter Modelica.Units.SI.Voltage VaNominal = 18 "Nominal armature voltage" annotation( + Dialog(tab = "Nominal parameters")); + parameter Modelica.Units.SI.Current IaNominal = 10 "Nominal armature current (>0..Motor, <0..Generator)" annotation( + Dialog(tab = "Nominal parameters")); + parameter Modelica.Units.SI.AngularVelocity wNominal(displayUnit = "rev/min") = 1425 * 2 * Modelica.Constants.pi / 60 "Nominal speed" annotation( + Dialog(tab = "Nominal parameters")); + parameter Modelica.Units.SI.Temperature TaNominal = 293.15 "Nominal armature temperature" annotation( + Dialog(tab = "Nominal parameters")); + parameter Modelica.Units.SI.Resistance Ra = 0.05 "Armature resistance at TRef" annotation( + Dialog(tab = "Nominal resistances and inductances")); + parameter Modelica.Units.SI.Temperature TaRef = 293.15 "Reference temperature of armature resistance" annotation( + Dialog(tab = "Nominal resistances and inductances")); + parameter Modelica.Electrical.Machines.Thermal.LinearTemperatureCoefficient20 alpha20a = 0 "Temperature coefficient of armature resistance" annotation( + Dialog(tab = "Nominal resistances and inductances")); + parameter Modelica.Units.SI.Inductance La = 0.0015 "Armature inductance" annotation( + Dialog(tab = "Nominal resistances and inductances")); + parameter Modelica.Electrical.Machines.Losses.FrictionParameters frictionParameters(PRef = 0, wRef = wNominal) "Friction loss parameter record" annotation( + Dialog(tab = "Losses")); + parameter Modelica.Units.SI.Voltage ViNominal = VaNominal - Modelica.Electrical.Machines.Thermal.convertResistance(Ra, TaRef, alpha20a, TaNominal) * IaNominal - Modelica.Electrical.Machines.Losses.DCMachines.brushVoltageDrop(brushParameters, IaNominal); + parameter Modelica.Electrical.Machines.Losses.CoreParameters coreParameters(final m = 1, PRef = 0, VRef = ViNominal, wRef = wNominal) "Armature core loss parameter record" annotation( + Dialog(tab = "Losses")); + parameter Modelica.Electrical.Machines.Losses.StrayLoadParameters strayLoadParameters(PRef = 0, IRef = IaNominal, wRef = wNominal) "Stray load losses" annotation( + Dialog(tab = "Losses")); + parameter Modelica.Electrical.Machines.Losses.BrushParameters brushParameters(V = 0, ILinear = 0.01 * IaNominal) "Brush loss parameter record" annotation( + Dialog(tab = "Losses")); + annotation( + defaultComponentName = "dcpmData", + defaultComponentPrefixes = "parameter", + Documentation(info = "

Basic parameters of DC machines are predefined with default values.

")); - -end DcPermanentMagnetMotorData; +end DcPermanentMagnetMotorData; \ No newline at end of file diff --git a/VirtualFCS/Utilities/ParameterRecords/DriveDataDcPm.mo b/VirtualFCS/Utilities/ParameterRecords/DriveDataDcPm.mo index ac2492e..51f1def 100644 --- a/VirtualFCS/Utilities/ParameterRecords/DriveDataDcPm.mo +++ b/VirtualFCS/Utilities/ParameterRecords/DriveDataDcPm.mo @@ -2,90 +2,72 @@ within VirtualFCS.Utilities.ParameterRecords; record DriveDataDcPm extends Modelica.Icons.Record; - import Modelica.Electrical.Machines.Thermal.convertResistance; -//Motor - parameter VirtualFCS.Utilities.ParameterRecords.DcPermanentMagnetMotorData - motorData "Motor data" annotation (Dialog(group="Motor"), Placement( - transformation(extent={{-10,-10},{10,10}}))); - parameter Modelica.SIunits.Resistance Ra=convertResistance(motorData.Ra, - motorData.TaRef,motorData.alpha20a,motorData.TaNominal) - "Armature resistance at nominal temperature" - annotation(Dialog(group="Motor", enable=false)); - parameter Modelica.SIunits.Time Ta=motorData.La/Ra "Armature time constant" - annotation(Dialog(group="Motor", enable=false)); - parameter Modelica.SIunits.Power PNominal=motorData.ViNominal*motorData.IaNominal - -motorData.frictionParameters.PRef -motorData.coreParameters.PRef -motorData.strayLoadParameters.PRef - "Nominal mechanical output" - annotation(Dialog(group="Motor", enable=false)); - parameter Modelica.SIunits.Torque tauNominal=PNominal/motorData.wNominal - "Nominal torque" - annotation(Dialog(group="Motor", enable=false)); - parameter Modelica.SIunits.ElectricalTorqueConstant kPhi=tauNominal/motorData.IaNominal - "Torque constant" - annotation(Dialog(group="Motor", enable=false)); - parameter Modelica.SIunits.AngularVelocity w0=motorData.wNominal*motorData.VaNominal/motorData.ViNominal - "No-load speed" - annotation(Dialog(group="Motor", enable=false)); -//Inverter - parameter Modelica.SIunits.Frequency fS=2e3 "Switching frequency" - annotation(Dialog(tab="Inverter", group="Armature inverter")); - parameter Modelica.SIunits.Voltage VBat=VaMax "DC no-load voltage" - annotation(Dialog(tab="Inverter", group="Armature inverter")); - parameter Modelica.SIunits.Time Td=0.5/fS "Dead time of inverter" - annotation(Dialog(tab="Inverter", group="Armature inverter", enable=false)); - parameter Modelica.SIunits.Time Tmf=4*Td "Measurement filter time constant" - annotation(Dialog(tab="Inverter", group="Armature inverter", enable=false)); - parameter Modelica.SIunits.Time Tsigma=Td + Tmf "Sum of small time constants" - annotation(Dialog(tab="Inverter", group="Armature inverter", enable=false)); -//Load - parameter Modelica.SIunits.Inertia JL=motorData.Jr "Load inertia" - annotation(Dialog(group="Load")); -//Limits - parameter Modelica.SIunits.Voltage VaMax=1.2*motorData.VaNominal "Maximum Voltage" - annotation(Dialog(tab="Controller", group="Limits")); - parameter Modelica.SIunits.Current IaMax=1.5*motorData.IaNominal "Maximum current" - annotation(Dialog(tab="Controller", group="Limits")); - parameter Modelica.SIunits.Torque tauMax=kPhi*IaMax "Maximum torque" - annotation(Dialog(tab="Controller", group="Limits", enable=false)); - parameter Modelica.SIunits.AngularVelocity wMax=motorData.wNominal*motorData.VaNominal/motorData.ViNominal - "Maximum speed" - annotation(Dialog(tab="Controller", group="Limits")); - parameter Modelica.SIunits.AngularAcceleration aMax=tauMax/(JL +motorData.Jr) - "Maximum acceleration" - annotation(Dialog(tab="Controller", group="Limits", enable=false)); -//Current controller: absolute optimum - parameter Real kpI=motorData.La/(2*Tsigma) "Proportional gain" annotation ( - Dialog( - tab="Controller", - group="Current controller", - enable=false)); - parameter Modelica.SIunits.Time TiI=Ta "Integral time constant" - annotation(Dialog(tab="Controller", group="Current controller", enable=false)); - parameter Modelica.SIunits.Time Tsub=2*Tsigma "Substitute time constant" - annotation(Dialog(tab="Controller", group="Current controller", enable=false)); -//Speed controller: symmetrical optimum - parameter Real kpw=(JL + motorData.Jr)/(2*Tsub) "Proportional gain" - annotation (Dialog( - tab="Controller", - group="Speed controller", - enable=false)); - parameter Modelica.SIunits.Time Tiw=4*Tsub "Integral time constant" - annotation(Dialog(tab="Controller", group="Speed controller", enable=false)); - parameter Modelica.SIunits.Time Tfw=Tiw "Filter time constant" - annotation(Dialog(tab="Controller", group="Speed controller", enable=false)); -//Position controller - parameter Real kpP=1/(16*Tsub) "Proportional gain" - annotation(Dialog(tab="Controller", group="Position controller", enable=false)); - annotation ( - defaultComponentName="dcpmDriveData", - defaultComponentPrefixes="parameter", - Documentation(info=" + //Motor + parameter VirtualFCS.Utilities.ParameterRecords.DcPermanentMagnetMotorData motorData "Motor data" annotation( + Dialog(group = "Motor"), + Placement(transformation(extent = {{-10, -10}, {10, 10}}))); + parameter Modelica.Units.SI.Resistance Ra = convertResistance(motorData.Ra, motorData.TaRef, motorData.alpha20a, motorData.TaNominal) "Armature resistance at nominal temperature" annotation( + Dialog(group = "Motor", enable = false)); + parameter Modelica.Units.SI.Time Ta = motorData.La / Ra "Armature time constant" annotation( + Dialog(group = "Motor", enable = false)); + parameter Modelica.Units.SI.Power PNominal = motorData.ViNominal * motorData.IaNominal - motorData.frictionParameters.PRef - motorData.coreParameters.PRef - motorData.strayLoadParameters.PRef "Nominal mechanical output" annotation( + Dialog(group = "Motor", enable = false)); + parameter Modelica.Units.SI.Torque tauNominal = PNominal / motorData.wNominal "Nominal torque" annotation( + Dialog(group = "Motor", enable = false)); + parameter Modelica.Units.SI.ElectricalTorqueConstant kPhi = tauNominal / motorData.IaNominal "Torque constant" annotation( + Dialog(group = "Motor", enable = false)); + parameter Modelica.Units.SI.AngularVelocity w0 = motorData.wNominal * motorData.VaNominal / motorData.ViNominal "No-load speed" annotation( + Dialog(group = "Motor", enable = false)); + //Inverter + parameter Modelica.Units.SI.Frequency fS = 2e3 "Switching frequency" annotation( + Dialog(tab = "Inverter", group = "Armature inverter")); + parameter Modelica.Units.SI.Voltage VBat = VaMax "DC no-load voltage" annotation( + Dialog(tab = "Inverter", group = "Armature inverter")); + parameter Modelica.Units.SI.Time Td = 0.5 / fS "Dead time of inverter" annotation( + Dialog(tab = "Inverter", group = "Armature inverter", enable = false)); + parameter Modelica.Units.SI.Time Tmf = 4 * Td "Measurement filter time constant" annotation( + Dialog(tab = "Inverter", group = "Armature inverter", enable = false)); + parameter Modelica.Units.SI.Time Tsigma = Td + Tmf "Sum of small time constants" annotation( + Dialog(tab = "Inverter", group = "Armature inverter", enable = false)); + //Load + parameter Modelica.Units.SI.Inertia JL = motorData.Jr "Load inertia" annotation( + Dialog(group = "Load")); + //Limits + parameter Modelica.Units.SI.Voltage VaMax = 1.2 * motorData.VaNominal "Maximum Voltage" annotation( + Dialog(tab = "Controller", group = "Limits")); + parameter Modelica.Units.SI.Current IaMax = 1.5 * motorData.IaNominal "Maximum current" annotation( + Dialog(tab = "Controller", group = "Limits")); + parameter Modelica.Units.SI.Torque tauMax = kPhi * IaMax "Maximum torque" annotation( + Dialog(tab = "Controller", group = "Limits", enable = false)); + parameter Modelica.Units.SI.AngularVelocity wMax = motorData.wNominal * motorData.VaNominal / motorData.ViNominal "Maximum speed" annotation( + Dialog(tab = "Controller", group = "Limits")); + parameter Modelica.Units.SI.AngularAcceleration aMax = tauMax / (JL + motorData.Jr) "Maximum acceleration" annotation( + Dialog(tab = "Controller", group = "Limits", enable = false)); + //Current controller: absolute optimum + parameter Real kpI = motorData.La / (2 * Tsigma) "Proportional gain" annotation( + Dialog(tab = "Controller", group = "Current controller", enable = false)); + parameter Modelica.Units.SI.Time TiI = Ta "Integral time constant" annotation( + Dialog(tab = "Controller", group = "Current controller", enable = false)); + parameter Modelica.Units.SI.Time Tsub = 2 * Tsigma "Substitute time constant" annotation( + Dialog(tab = "Controller", group = "Current controller", enable = false)); + //Speed controller: symmetrical optimum + parameter Real kpw = (JL + motorData.Jr) / (2 * Tsub) "Proportional gain" annotation( + Dialog(tab = "Controller", group = "Speed controller", enable = false)); + parameter Modelica.Units.SI.Time Tiw = 4 * Tsub "Integral time constant" annotation( + Dialog(tab = "Controller", group = "Speed controller", enable = false)); + parameter Modelica.Units.SI.Time Tfw = Tiw "Filter time constant" annotation( + Dialog(tab = "Controller", group = "Speed controller", enable = false)); + //Position controller + parameter Real kpP = 1 / (16 * Tsub) "Proportional gain" annotation( + Dialog(tab = "Controller", group = "Position controller", enable = false)); + annotation( + defaultComponentName = "dcpmDriveData", + defaultComponentPrefixes = "parameter", + Documentation(info = "

Calculates controller parameters of a DC permanent magnet drive: Current controller according to absolute optimum, speed controller according to symmetric optimum.

")); - - -end DriveDataDcPm; +end DriveDataDcPm; \ No newline at end of file diff --git a/VirtualFCS/Utilities/ParameterRecords/EVDriveData.mo b/VirtualFCS/Utilities/ParameterRecords/EVDriveData.mo index ff07a9c..6425780 100644 --- a/VirtualFCS/Utilities/ParameterRecords/EVDriveData.mo +++ b/VirtualFCS/Utilities/ParameterRecords/EVDriveData.mo @@ -4,56 +4,56 @@ record EVDriveData extends Modelica.Icons.RecordsPackage; import Modelica.Electrical.Machines.Thermal.convertResistance; //Motor - parameter Modelica.SIunits.Resistance Ra = convertResistance(motorData.Ra, motorData.TaRef, motorData.alpha20a, motorData.TaNominal) "Armature resistance at nominal temperature" annotation( + parameter Modelica.Units.SI.Resistance Ra = convertResistance(motorData.Ra, motorData.TaRef, motorData.alpha20a, motorData.TaNominal) "Armature resistance at nominal temperature" annotation( Dialog(group = "Motor", enable = false)); - parameter Modelica.SIunits.Time Ta = motorData.La / Ra "Armature time constant" annotation( + parameter Modelica.Units.SI.Time Ta = motorData.La / Ra "Armature time constant" annotation( Dialog(group = "Motor", enable = false)); - parameter Modelica.SIunits.Power PNominal = motorData.ViNominal * motorData.IaNominal - motorData.frictionParameters.PRef - motorData.coreParameters.PRef - motorData.strayLoadParameters.PRef "Nominal mechanical output" annotation( + parameter Modelica.Units.SI.Power PNominal = motorData.ViNominal * motorData.IaNominal - motorData.frictionParameters.PRef - motorData.coreParameters.PRef - motorData.strayLoadParameters.PRef "Nominal mechanical output" annotation( Dialog(group = "Motor", enable = false)); - parameter Modelica.SIunits.Torque tauNominal = PNominal / motorData.wNominal "Nominal torque" annotation( + parameter Modelica.Units.SI.Torque tauNominal = PNominal / motorData.wNominal "Nominal torque" annotation( Dialog(group = "Motor", enable = false)); - parameter Modelica.SIunits.ElectricalTorqueConstant kPhi = tauNominal / motorData.IaNominal "Torque constant" annotation( + parameter Modelica.Units.SI.ElectricalTorqueConstant kPhi = tauNominal / motorData.IaNominal "Torque constant" annotation( Dialog(group = "Motor", enable = false)); - parameter Modelica.SIunits.AngularVelocity w0 = motorData.wNominal * motorData.VaNominal / motorData.ViNominal "No-load speed" annotation( + parameter Modelica.Units.SI.AngularVelocity w0 = motorData.wNominal * motorData.VaNominal / motorData.ViNominal "No-load speed" annotation( Dialog(group = "Motor", enable = false)); //Inverter - parameter Modelica.SIunits.Frequency fS = 2e3 "Switching frequency" annotation( + parameter Modelica.Units.SI.Frequency fS = 2e3 "Switching frequency" annotation( Dialog(tab = "Inverter", group = "Armature inverter")); - parameter Modelica.SIunits.Voltage VBat = VaMax "DC no-load voltage" annotation( + parameter Modelica.Units.SI.Voltage VBat = VaMax "DC no-load voltage" annotation( Dialog(tab = "Inverter", group = "Armature inverter")); - parameter Modelica.SIunits.Time Td = 0.5 / fS "Dead time of inverter" annotation( + parameter Modelica.Units.SI.Time Td = 0.5 / fS "Dead time of inverter" annotation( Dialog(tab = "Inverter", group = "Armature inverter", enable = false)); - parameter Modelica.SIunits.Time Tmf = 4 * Td "Measurement filter time constant" annotation( + parameter Modelica.Units.SI.Time Tmf = 4 * Td "Measurement filter time constant" annotation( Dialog(tab = "Inverter", group = "Armature inverter", enable = false)); - parameter Modelica.SIunits.Time Tsigma = Td + Tmf "Sum of small time constants" annotation( + parameter Modelica.Units.SI.Time Tsigma = Td + Tmf "Sum of small time constants" annotation( Dialog(tab = "Inverter", group = "Armature inverter", enable = false)); //Load - parameter Modelica.SIunits.Inertia JL = motorData.Jr "Load inertia" annotation( + parameter Modelica.Units.SI.Inertia JL = motorData.Jr "Load inertia" annotation( Dialog(group = "Load")); //Limits - parameter Modelica.SIunits.Voltage VaMax = 1.2 * motorData.VaNominal "Maximum Voltage" annotation( + parameter Modelica.Units.SI.Voltage VaMax = 1.2 * motorData.VaNominal "Maximum Voltage" annotation( Dialog(tab = "Controller", group = "Limits")); - parameter Modelica.SIunits.Current IaMax = 1.5 * motorData.IaNominal "Maximum current" annotation( + parameter Modelica.Units.SI.Current IaMax = 1.5 * motorData.IaNominal "Maximum current" annotation( Dialog(tab = "Controller", group = "Limits")); - parameter Modelica.SIunits.Torque tauMax = kPhi * IaMax "Maximum torque" annotation( + parameter Modelica.Units.SI.Torque tauMax = kPhi * IaMax "Maximum torque" annotation( Dialog(tab = "Controller", group = "Limits", enable = false)); - parameter Modelica.SIunits.AngularVelocity wMax = motorData.wNominal * motorData.VaNominal / motorData.ViNominal "Maximum speed" annotation( + parameter Modelica.Units.SI.AngularVelocity wMax = motorData.wNominal * motorData.VaNominal / motorData.ViNominal "Maximum speed" annotation( Dialog(tab = "Controller", group = "Limits")); - parameter Modelica.SIunits.AngularAcceleration aMax = tauMax / (JL + motorData.Jr) "Maximum acceleration" annotation( + parameter Modelica.Units.SI.AngularAcceleration aMax = tauMax / (JL + motorData.Jr) "Maximum acceleration" annotation( Dialog(tab = "Controller", group = "Limits", enable = false)); //Current controller: absolute optimum parameter Real kpI = motorData.La / (2 * Tsigma) "Proportional gain" annotation( Dialog(tab = "Controller", group = "Current controller", enable = false)); - parameter Modelica.SIunits.Time TiI = Ta "Integral time constant" annotation( + parameter Modelica.Units.SI.Time TiI = Ta "Integral time constant" annotation( Dialog(tab = "Controller", group = "Current controller", enable = false)); - parameter Modelica.SIunits.Time Tsub = 2 * Tsigma "Substitute time constant" annotation( + parameter Modelica.Units.SI.Time Tsub = 2 * Tsigma "Substitute time constant" annotation( Dialog(tab = "Controller", group = "Current controller", enable = false)); //Speed controller: symmetrical optimum parameter Real kpw = (JL + motorData.Jr) / (2 * Tsub) "Proportional gain" annotation( Dialog(tab = "Controller", group = "Speed controller", enable = false)); - parameter Modelica.SIunits.Time Tiw = 4 * Tsub "Integral time constant" annotation( + parameter Modelica.Units.SI.Time Tiw = 4 * Tsub "Integral time constant" annotation( Dialog(tab = "Controller", group = "Speed controller", enable = false)); - parameter Modelica.SIunits.Time Tfw = Tiw "Filter time constant" annotation( + parameter Modelica.Units.SI.Time Tfw = Tiw "Filter time constant" annotation( Dialog(tab = "Controller", group = "Speed controller", enable = false)); //Position controller parameter Real kpP = 1 / (16 * Tsub) "Proportional gain" annotation( @@ -69,4 +69,4 @@ Calculates controller parameters of a DC permanent magnet drive: Current controller according to absolute optimum, speed controller according to symmetric optimum.

")); -end EVDriveData; +end EVDriveData; \ No newline at end of file diff --git a/VirtualFCS/Utilities/ParameterRecords/EVMotor1.mo b/VirtualFCS/Utilities/ParameterRecords/EVMotor1.mo index b11c6c7..bce7dca 100644 --- a/VirtualFCS/Utilities/ParameterRecords/EVMotor1.mo +++ b/VirtualFCS/Utilities/ParameterRecords/EVMotor1.mo @@ -1,91 +1,73 @@ within VirtualFCS.Utilities.ParameterRecords; record EVMotor1 -extends Modelica.Icons.Record; - + extends Modelica.Icons.Record; import Modelica.Electrical.Machines.Thermal.convertResistance; -//Motor - parameter VirtualFCS.Utilities.ParameterRecords.EVMotorData - motorData(wNominal = 900.59) "Motor data" annotation (Dialog(group="Motor"), Placement( - transformation(extent={{-10,-10},{10,10}}))); - parameter Modelica.SIunits.Resistance Ra=convertResistance(motorData.Ra, - motorData.TaRef,motorData.alpha20a,motorData.TaNominal) - "Armature resistance at nominal temperature" - annotation(Dialog(group="Motor", enable=false)); - parameter Modelica.SIunits.Time Ta=motorData.La/Ra "Armature time constant" - annotation(Dialog(group="Motor", enable=false)); - parameter Modelica.SIunits.Power PNominal=motorData.ViNominal*motorData.IaNominal - -motorData.frictionParameters.PRef -motorData.coreParameters.PRef -motorData.strayLoadParameters.PRef - "Nominal mechanical output" - annotation(Dialog(group="Motor", enable=false)); - parameter Modelica.SIunits.Torque tauNominal=PNominal/motorData.wNominal - "Nominal torque" - annotation(Dialog(group="Motor", enable=false)); - parameter Modelica.SIunits.ElectricalTorqueConstant kPhi=tauNominal/motorData.IaNominal - "Torque constant" - annotation(Dialog(group="Motor", enable=false)); - parameter Modelica.SIunits.AngularVelocity w0=motorData.wNominal*motorData.VaNominal/motorData.ViNominal - "No-load speed" - annotation(Dialog(group="Motor", enable=false)); -//Inverter - parameter Modelica.SIunits.Frequency fS=2e3 "Switching frequency" - annotation(Dialog(tab="Inverter", group="Armature inverter")); - parameter Modelica.SIunits.Voltage VBat=VaMax "DC no-load voltage" - annotation(Dialog(tab="Inverter", group="Armature inverter")); - parameter Modelica.SIunits.Time Td=0.5/fS "Dead time of inverter" - annotation(Dialog(tab="Inverter", group="Armature inverter", enable=false)); - parameter Modelica.SIunits.Time Tmf=4*Td "Measurement filter time constant" - annotation(Dialog(tab="Inverter", group="Armature inverter", enable=false)); - parameter Modelica.SIunits.Time Tsigma=Td + Tmf "Sum of small time constants" - annotation(Dialog(tab="Inverter", group="Armature inverter", enable=false)); -//Load - parameter Modelica.SIunits.Inertia JL=motorData.Jr "Load inertia" - annotation(Dialog(group="Load")); -//Limits - parameter Modelica.SIunits.Voltage VaMax=1.2*motorData.VaNominal "Maximum Voltage" - annotation(Dialog(tab="Controller", group="Limits")); - parameter Modelica.SIunits.Current IaMax=1.5*motorData.IaNominal "Maximum current" - annotation(Dialog(tab="Controller", group="Limits")); - parameter Modelica.SIunits.Torque tauMax=kPhi*IaMax "Maximum torque" - annotation(Dialog(tab="Controller", group="Limits", enable=false)); - parameter Modelica.SIunits.AngularVelocity wMax=motorData.wNominal*motorData.VaNominal/motorData.ViNominal - "Maximum speed" - annotation(Dialog(tab="Controller", group="Limits")); - parameter Modelica.SIunits.AngularAcceleration aMax=tauMax/(JL +motorData.Jr) - "Maximum acceleration" - annotation(Dialog(tab="Controller", group="Limits", enable=false)); -//Current controller: absolute optimum - parameter Real kpI=motorData.La/(2*Tsigma) "Proportional gain" annotation ( - Dialog( - tab="Controller", - group="Current controller", - enable=false)); - parameter Modelica.SIunits.Time TiI=Ta "Integral time constant" - annotation(Dialog(tab="Controller", group="Current controller", enable=false)); - parameter Modelica.SIunits.Time Tsub=2*Tsigma "Substitute time constant" - annotation(Dialog(tab="Controller", group="Current controller", enable=false)); -//Speed controller: symmetrical optimum - parameter Real kpw=(JL + motorData.Jr)/(2*Tsub) "Proportional gain" - annotation (Dialog( - tab="Controller", - group="Speed controller", - enable=false)); - parameter Modelica.SIunits.Time Tiw=4*Tsub "Integral time constant" - annotation(Dialog(tab="Controller", group="Speed controller", enable=false)); - parameter Modelica.SIunits.Time Tfw=Tiw "Filter time constant" - annotation(Dialog(tab="Controller", group="Speed controller", enable=false)); -//Position controller - parameter Real kpP=1/(16*Tsub) "Proportional gain" - annotation(Dialog(tab="Controller", group="Position controller", enable=false)); - annotation ( - defaultComponentName="dcpmDriveData", - defaultComponentPrefixes="parameter", - Documentation(info=" + //Motor + parameter VirtualFCS.Utilities.ParameterRecords.EVMotorData motorData(wNominal = 900.59) "Motor data" annotation( + Dialog(group = "Motor"), + Placement(transformation(extent = {{-10, -10}, {10, 10}}))); + parameter Modelica.Units.SI.Resistance Ra = convertResistance(motorData.Ra, motorData.TaRef, motorData.alpha20a, motorData.TaNominal) "Armature resistance at nominal temperature" annotation( + Dialog(group = "Motor", enable = false)); + parameter Modelica.Units.SI.Time Ta = motorData.La / Ra "Armature time constant" annotation( + Dialog(group = "Motor", enable = false)); + parameter Modelica.Units.SI.Power PNominal = motorData.ViNominal * motorData.IaNominal - motorData.frictionParameters.PRef - motorData.coreParameters.PRef - motorData.strayLoadParameters.PRef "Nominal mechanical output" annotation( + Dialog(group = "Motor", enable = false)); + parameter Modelica.Units.SI.Torque tauNominal = PNominal / motorData.wNominal "Nominal torque" annotation( + Dialog(group = "Motor", enable = false)); + parameter Modelica.Units.SI.ElectricalTorqueConstant kPhi = tauNominal / motorData.IaNominal "Torque constant" annotation( + Dialog(group = "Motor", enable = false)); + parameter Modelica.Units.SI.AngularVelocity w0 = motorData.wNominal * motorData.VaNominal / motorData.ViNominal "No-load speed" annotation( + Dialog(group = "Motor", enable = false)); + //Inverter + parameter Modelica.Units.SI.Frequency fS = 2e3 "Switching frequency" annotation( + Dialog(tab = "Inverter", group = "Armature inverter")); + parameter Modelica.Units.SI.Voltage VBat = VaMax "DC no-load voltage" annotation( + Dialog(tab = "Inverter", group = "Armature inverter")); + parameter Modelica.Units.SI.Time Td = 0.5 / fS "Dead time of inverter" annotation( + Dialog(tab = "Inverter", group = "Armature inverter", enable = false)); + parameter Modelica.Units.SI.Time Tmf = 4 * Td "Measurement filter time constant" annotation( + Dialog(tab = "Inverter", group = "Armature inverter", enable = false)); + parameter Modelica.Units.SI.Time Tsigma = Td + Tmf "Sum of small time constants" annotation( + Dialog(tab = "Inverter", group = "Armature inverter", enable = false)); + //Load + parameter Modelica.Units.SI.Inertia JL = motorData.Jr "Load inertia" annotation( + Dialog(group = "Load")); + //Limits + parameter Modelica.Units.SI.Voltage VaMax = 1.2 * motorData.VaNominal "Maximum Voltage" annotation( + Dialog(tab = "Controller", group = "Limits")); + parameter Modelica.Units.SI.Current IaMax = 1.5 * motorData.IaNominal "Maximum current" annotation( + Dialog(tab = "Controller", group = "Limits")); + parameter Modelica.Units.SI.Torque tauMax = kPhi * IaMax "Maximum torque" annotation( + Dialog(tab = "Controller", group = "Limits", enable = false)); + parameter Modelica.Units.SI.AngularVelocity wMax = motorData.wNominal * motorData.VaNominal / motorData.ViNominal "Maximum speed" annotation( + Dialog(tab = "Controller", group = "Limits")); + parameter Modelica.Units.SI.AngularAcceleration aMax = tauMax / (JL + motorData.Jr) "Maximum acceleration" annotation( + Dialog(tab = "Controller", group = "Limits", enable = false)); + //Current controller: absolute optimum + parameter Real kpI = motorData.La / (2 * Tsigma) "Proportional gain" annotation( + Dialog(tab = "Controller", group = "Current controller", enable = false)); + parameter Modelica.Units.SI.Time TiI = Ta "Integral time constant" annotation( + Dialog(tab = "Controller", group = "Current controller", enable = false)); + parameter Modelica.Units.SI.Time Tsub = 2 * Tsigma "Substitute time constant" annotation( + Dialog(tab = "Controller", group = "Current controller", enable = false)); + //Speed controller: symmetrical optimum + parameter Real kpw = (JL + motorData.Jr) / (2 * Tsub) "Proportional gain" annotation( + Dialog(tab = "Controller", group = "Speed controller", enable = false)); + parameter Modelica.Units.SI.Time Tiw = 4 * Tsub "Integral time constant" annotation( + Dialog(tab = "Controller", group = "Speed controller", enable = false)); + parameter Modelica.Units.SI.Time Tfw = Tiw "Filter time constant" annotation( + Dialog(tab = "Controller", group = "Speed controller", enable = false)); + //Position controller + parameter Real kpP = 1 / (16 * Tsub) "Proportional gain" annotation( + Dialog(tab = "Controller", group = "Position controller", enable = false)); + annotation( + defaultComponentName = "dcpmDriveData", + defaultComponentPrefixes = "parameter", + Documentation(info = "

Calculates controller parameters of a DC permanent magnet drive: Current controller according to absolute optimum, speed controller according to symmetric optimum.

")); - - -end EVMotor1; +end EVMotor1; \ No newline at end of file diff --git a/VirtualFCS/Utilities/ParameterRecords/EVMotorData.mo b/VirtualFCS/Utilities/ParameterRecords/EVMotorData.mo index f5c4aac..5768a72 100644 --- a/VirtualFCS/Utilities/ParameterRecords/EVMotorData.mo +++ b/VirtualFCS/Utilities/ParameterRecords/EVMotorData.mo @@ -2,61 +2,37 @@ within VirtualFCS.Utilities.ParameterRecords; record EVMotorData extends Modelica.Icons.Record; - - parameter Modelica.SIunits.Inertia Jr=0.15 "Rotor's moment of inertia"; - parameter Modelica.SIunits.Inertia Js=Jr "Stator's moment of inertia"; - parameter Modelica.SIunits.Voltage VaNominal=343 - "Nominal armature voltage" - annotation (Dialog(tab="Nominal parameters")); - parameter Modelica.SIunits.Current IaNominal=100 - "Nominal armature current (>0..Motor, <0..Generator)" - annotation (Dialog(tab="Nominal parameters")); - parameter Modelica.SIunits.AngularVelocity wNominal(displayUnit="rev/min")= - 8600 "Nominal speed" - annotation (Dialog(tab="Nominal parameters")); - parameter Modelica.SIunits.Temperature TaNominal=293.15 - "Nominal armature temperature" - annotation (Dialog(tab="Nominal parameters")); - parameter Modelica.SIunits.Resistance Ra=0.05 - "Armature resistance at TRef" - annotation (Dialog(tab="Nominal resistances and inductances")); - parameter Modelica.SIunits.Temperature TaRef=293.15 - "Reference temperature of armature resistance" - annotation (Dialog(tab="Nominal resistances and inductances")); - parameter Modelica.Electrical.Machines.Thermal.LinearTemperatureCoefficient20 alpha20a=0 "Temperature coefficient of armature resistance" - annotation (Dialog(tab="Nominal resistances and inductances")); - parameter Modelica.SIunits.Inductance La=0.0015 "Armature inductance" - annotation (Dialog(tab="Nominal resistances and inductances")); - parameter Modelica.Electrical.Machines.Losses.FrictionParameters frictionParameters(PRef=0, - wRef=wNominal) "Friction loss parameter record" - annotation (Dialog(tab="Losses")); - parameter Modelica.SIunits.Voltage ViNominal=VaNominal - - Modelica.Electrical.Machines.Thermal.convertResistance( - Ra, - TaRef, - alpha20a, - TaNominal)*IaNominal - - Modelica.Electrical.Machines.Losses.DCMachines.brushVoltageDrop(brushParameters, - IaNominal); - parameter Modelica.Electrical.Machines.Losses.CoreParameters coreParameters( - final m=1, - PRef=0, - VRef=ViNominal, - wRef=wNominal) "Armature core loss parameter record" - annotation (Dialog(tab="Losses")); - parameter Modelica.Electrical.Machines.Losses.StrayLoadParameters strayLoadParameters( - PRef=0, - IRef=IaNominal, - wRef=wNominal) "Stray load losses" annotation (Dialog(tab="Losses")); - parameter Modelica.Electrical.Machines.Losses.BrushParameters brushParameters(V=0, ILinear= - 0.01*IaNominal) "Brush loss parameter record" - annotation (Dialog(tab="Losses")); - annotation ( - defaultComponentName="dcpmData", - defaultComponentPrefixes="parameter", - Documentation(info=" + parameter Modelica.Units.SI.Inertia Jr = 0.15 "Rotor's moment of inertia"; + parameter Modelica.Units.SI.Inertia Js = Jr "Stator's moment of inertia"; + parameter Modelica.Units.SI.Voltage VaNominal = 343 "Nominal armature voltage" annotation( + Dialog(tab = "Nominal parameters")); + parameter Modelica.Units.SI.Current IaNominal = 100 "Nominal armature current (>0..Motor, <0..Generator)" annotation( + Dialog(tab = "Nominal parameters")); + parameter Modelica.Units.SI.AngularVelocity wNominal(displayUnit = "rev/min") = 8600 "Nominal speed" annotation( + Dialog(tab = "Nominal parameters")); + parameter Modelica.Units.SI.Temperature TaNominal = 293.15 "Nominal armature temperature" annotation( + Dialog(tab = "Nominal parameters")); + parameter Modelica.Units.SI.Resistance Ra = 0.05 "Armature resistance at TRef" annotation( + Dialog(tab = "Nominal resistances and inductances")); + parameter Modelica.Units.SI.Temperature TaRef = 293.15 "Reference temperature of armature resistance" annotation( + Dialog(tab = "Nominal resistances and inductances")); + parameter Modelica.Electrical.Machines.Thermal.LinearTemperatureCoefficient20 alpha20a = 0 "Temperature coefficient of armature resistance" annotation( + Dialog(tab = "Nominal resistances and inductances")); + parameter Modelica.Units.SI.Inductance La = 0.0015 "Armature inductance" annotation( + Dialog(tab = "Nominal resistances and inductances")); + parameter Modelica.Electrical.Machines.Losses.FrictionParameters frictionParameters(PRef = 0, wRef = wNominal) "Friction loss parameter record" annotation( + Dialog(tab = "Losses")); + parameter Modelica.Units.SI.Voltage ViNominal = VaNominal - Modelica.Electrical.Machines.Thermal.convertResistance(Ra, TaRef, alpha20a, TaNominal) * IaNominal - Modelica.Electrical.Machines.Losses.DCMachines.brushVoltageDrop(brushParameters, IaNominal); + parameter Modelica.Electrical.Machines.Losses.CoreParameters coreParameters(final m = 1, PRef = 0, VRef = ViNominal, wRef = wNominal) "Armature core loss parameter record" annotation( + Dialog(tab = "Losses")); + parameter Modelica.Electrical.Machines.Losses.StrayLoadParameters strayLoadParameters(PRef = 0, IRef = IaNominal, wRef = wNominal) "Stray load losses" annotation( + Dialog(tab = "Losses")); + parameter Modelica.Electrical.Machines.Losses.BrushParameters brushParameters(V = 0, ILinear = 0.01 * IaNominal) "Brush loss parameter record" annotation( + Dialog(tab = "Losses")); + annotation( + defaultComponentName = "dcpmData", + defaultComponentPrefixes = "parameter", + Documentation(info = "

Basic parameters of DC machines are predefined with default values.

")); - - -end EVMotorData; +end EVMotorData; \ No newline at end of file diff --git a/VirtualFCS/Utilities/ParameterRecords/package.mo b/VirtualFCS/Utilities/ParameterRecords/package.mo index 2654600..3b5c08a 100644 --- a/VirtualFCS/Utilities/ParameterRecords/package.mo +++ b/VirtualFCS/Utilities/ParameterRecords/package.mo @@ -2,4 +2,4 @@ within VirtualFCS.Utilities; package ParameterRecords extends Modelica.Icons.RecordsPackage; -end ParameterRecords; +end ParameterRecords; \ No newline at end of file diff --git a/VirtualFCS/Utilities/SystemRecords/HydrogenData.mo b/VirtualFCS/Utilities/SystemRecords/HydrogenData.mo new file mode 100644 index 0000000..4fd84c8 --- /dev/null +++ b/VirtualFCS/Utilities/SystemRecords/HydrogenData.mo @@ -0,0 +1,17 @@ +within VirtualFCS.Utilities.SystemRecords; + +record HydrogenData "Generic Plant Data" + extends Modelica.Icons.Record; + parameter Real PumpSpeed_k = 1 "Gain for the pump speed controller" + annotation(Dialog(group = "Speed controller")); + parameter Real PumpSpeed_Td = 0.1 "Time constant for the pump speed controller" + annotation(Dialog(group = "Speed controller")); + parameter Modelica.Units.NonSI.AngularVelocity_rpm Pump_N_nominal = 365 "Nominal speed of the pump" + annotation(Dialog(group = "Pump")); + annotation( + defaultComponentName="hydrogenData", + defaultComponentPrefixes="inner", + missingInnerMessage=" + No 'Hydrogen Data' component is defined. A default component will be used with + parameters of a generic hydrogen system"); +end HydrogenData; \ No newline at end of file diff --git a/VirtualFCS/Utilities/SystemRecords/HydrogenDataPlantA.mo b/VirtualFCS/Utilities/SystemRecords/HydrogenDataPlantA.mo new file mode 100644 index 0000000..16d9fe5 --- /dev/null +++ b/VirtualFCS/Utilities/SystemRecords/HydrogenDataPlantA.mo @@ -0,0 +1,17 @@ +within VirtualFCS.Utilities.SystemRecords; + +record HydrogenDataPlantA + extends Modelica.Icons.Record; + parameter Real PumpSpeed_k = 2 "Gain for the pump speed controller" + annotation(Dialog(group = "Speed controller")); + parameter Real PumpSpeed_Td = 0.2 "Time constant for the pump speed controller" + annotation(Dialog(group = "Speed controller")); + parameter Modelica.Units.NonSI.AngularVelocity_rpm Pump_N_nominal = 500 "Nominal speed of the pump" + annotation(Dialog(group = "Pump")); + annotation( + defaultComponentName="hydrogenData", + defaultComponentPrefixes="inner", + missingInnerMessage=" + No 'Hydrogen Data' component is defined. A default component will be used with + parameters of a generic hydrogen system"); +end HydrogenDataPlantA; \ No newline at end of file diff --git a/VirtualFCS/Utilities/SystemRecords/HydrogenDataPlantB.mo b/VirtualFCS/Utilities/SystemRecords/HydrogenDataPlantB.mo new file mode 100644 index 0000000..b245543 --- /dev/null +++ b/VirtualFCS/Utilities/SystemRecords/HydrogenDataPlantB.mo @@ -0,0 +1,17 @@ +within VirtualFCS.Utilities.SystemRecords; + +record HydrogenDataPlantB + extends Modelica.Icons.Record; + parameter Real PumpSpeed_k = 3 "Gain for the pump speed controller" + annotation(Dialog(group = "Speed controller")); + parameter Real PumpSpeed_Td = 0.3 "Time constant for the pump speed controller" + annotation(Dialog(group = "Speed controller")); + parameter Modelica.Units.NonSI.AngularVelocity_rpm Pump_N_nominal = 400 "Nominal speed of the pump" + annotation(Dialog(group = "Pump")); + annotation( + defaultComponentName="hydrogenData", + defaultComponentPrefixes="inner", + missingInnerMessage=" + No 'Hydrogen Data' component is defined. A default component will be used with + parameters of a generic hydrogen system"); +end HydrogenDataPlantB; \ No newline at end of file diff --git a/VirtualFCS/Utilities/SystemRecords/HydrogenDataPlantC.mo b/VirtualFCS/Utilities/SystemRecords/HydrogenDataPlantC.mo new file mode 100644 index 0000000..c0cf829 --- /dev/null +++ b/VirtualFCS/Utilities/SystemRecords/HydrogenDataPlantC.mo @@ -0,0 +1,5 @@ +within VirtualFCS.Utilities.SystemRecords; + +record HydrogenDataPlantC "Data set for Plant C" + extends VirtualFCS.Utilities.SystemRecords.HydrogenData(PumpSpeed_k=50); +end HydrogenDataPlantC; \ No newline at end of file diff --git a/VirtualFCS/Utilities/SystemRecords/HydrogenDataPlantD.mo b/VirtualFCS/Utilities/SystemRecords/HydrogenDataPlantD.mo new file mode 100644 index 0000000..b9f8362 --- /dev/null +++ b/VirtualFCS/Utilities/SystemRecords/HydrogenDataPlantD.mo @@ -0,0 +1,5 @@ +within VirtualFCS.Utilities.SystemRecords; + +record HydrogenDataPlantD + extends VirtualFCS.Utilities.SystemRecords.HydrogenData(PumpSpeed_Td = 23, PumpSpeed_k = 14, Pump_N_nominal = 500); +end HydrogenDataPlantD; \ No newline at end of file diff --git a/VirtualFCS/Utilities/SystemRecords/package.mo b/VirtualFCS/Utilities/SystemRecords/package.mo new file mode 100644 index 0000000..50e0d26 --- /dev/null +++ b/VirtualFCS/Utilities/SystemRecords/package.mo @@ -0,0 +1,5 @@ +within VirtualFCS.Utilities; + +package SystemRecords + extends Modelica.Icons.RecordsPackage; +end SystemRecords; \ No newline at end of file diff --git a/VirtualFCS/Utilities/SystemRecords/package.order b/VirtualFCS/Utilities/SystemRecords/package.order new file mode 100644 index 0000000..ac07f81 --- /dev/null +++ b/VirtualFCS/Utilities/SystemRecords/package.order @@ -0,0 +1,5 @@ +HydrogenData +HydrogenDataPlantA +HydrogenDataPlantB +HydrogenDataPlantC +HydrogenDataPlantD diff --git a/VirtualFCS/Utilities/package.mo b/VirtualFCS/Utilities/package.mo index ba701f9..5774d0c 100644 --- a/VirtualFCS/Utilities/package.mo +++ b/VirtualFCS/Utilities/package.mo @@ -2,7 +2,6 @@ within VirtualFCS; package Utilities "Supporting utilities and data." extends Modelica.Icons.UtilitiesPackage; - annotation( Documentation(info = "
")); -end Utilities; +end Utilities; \ No newline at end of file diff --git a/VirtualFCS/Utilities/package.order b/VirtualFCS/Utilities/package.order index 8fbd0e7..1f8c1e2 100644 --- a/VirtualFCS/Utilities/package.order +++ b/VirtualFCS/Utilities/package.order @@ -1 +1,2 @@ ParameterRecords +SystemRecords diff --git a/VirtualFCS/Vehicles.zip b/VirtualFCS/Vehicles.zip deleted file mode 100644 index 09cb829..0000000 Binary files a/VirtualFCS/Vehicles.zip and /dev/null differ diff --git a/VirtualFCS/Vehicles/DriveCycle.mo b/VirtualFCS/Vehicles/DriveCycle.mo index 3251304..d4a5904 100644 --- a/VirtualFCS/Vehicles/DriveCycle.mo +++ b/VirtualFCS/Vehicles/DriveCycle.mo @@ -2,7 +2,7 @@ within VirtualFCS.Vehicles; class DriveCycle import Modelica.Blocks.Tables.Internal; - ////////////////////// Choose speed_profile ////////////////////////////////////////////////////// + ////////////////////// Choose speed_profile ////////////////////////////////////////////////////// type speed_profile = enumeration(NEDC "NEDC", WLTC "WLTC", custom "custom") annotation( Evaluate = true); parameter speed_profile v = VirtualFCS.Vehicles.DriveCycle.speed_profile.custom "Speed profile"; @@ -40,9 +40,9 @@ class DriveCycle name := table; end if; end speed_profile_name; - -// *** INSTANTIATE COMPONENTS *** // - Modelica.Blocks.Sources.CombiTimeTable combiTimeTable(extrapolation = Modelica.Blocks.Types.Extrapolation.Periodic,fileName = filepath, smoothness = Modelica.Blocks.Types.Smoothness.ContinuousDerivative, table = fill(0.0, 0, 2), tableName = table_Name, tableOnFile = true) annotation( + + // *** INSTANTIATE COMPONENTS *** // + Modelica.Blocks.Sources.CombiTimeTable combiTimeTable(extrapolation = Modelica.Blocks.Types.Extrapolation.Periodic, fileName = filepath, smoothness = Modelica.Blocks.Types.Smoothness.ContinuousDerivative, table = fill(0.0, 0, 2), tableName = table_Name, tableOnFile = true) annotation( Placement(visible = true, transformation(origin = {-1, 0}, extent = {{-12, -12}, {12, 12}}, rotation = 0))); Modelica.Blocks.Interfaces.RealOutput y 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))); @@ -57,4 +57,4 @@ equation annotation( Icon(coordinateSystem(preserveAspectRatio = false, initialScale = 0.05), graphics = {Text(origin = {-4, -12}, lineColor = {0, 0, 255}, extent = {{-150, 120}, {150, 150}}, textString = "%name"), Bitmap(origin = {-1, 0}, extent = {{-99, 100}, {101, -100}}, imageSource = "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1gIAABTTvMaebifilxEPt5XzgHJRvYiyFIGkUWsBAACKadrnn7qdiF8mvP6KnAeUi+pFlKUIJI1aCwAAUEx2MpaQTP/qSzkPKBfViyhLEUgatRYAAKCYhj1wr9uJ+GV+v75yHlAuqhdRliKQNGotAABAMfW78lK3E/HL8mlT5TygXFQvoixFIGnUWgAAgGLqfupJbieis2bJ4sySMaMzc7p2yUz5qENmzPPPZobec0emz4X1ch5QLqoXUZYikDRqLQAAQLEtHDI4M+vnnzKT338nM/qpf2QG335zpneb8zNdjjlS/n0gjVQvoixFIGnUWgAAAADNU72IshSBpFFrAQAAADRP9SLKUgSSRq0FAAAA0DzViyhLEUgatRYAAABA81QvoixFIGnUWgAAAADNU72IshSBpFFrAQAAADRP9SLKUgSSRq0FAAAA0DzViyhLEUgatRYAAABA81QvoixFIGnUWgAAAADNU72IshSBpFFrAQAAADRP9SLKUgSSRq0FAAAA0DzViyhLEUgatRYAAABA81QvoixFIGnUWgAAAADNU72IshSBpFFrAQAAADRP9SLKUgSSRq0FAAAA0DzViyhLEUgatRYAAABA81QvoixFIGnUWgAAAADNU72IshSBpFFrAQAAADRP9SLKUgSSRq0FAAAA0DzViyhLEUgatRYAAABA81QvoixFIGnUWgAAAADNU72IshSBpFFrAQAAADRP9SLKUgSSRq0FAAAA0DzViyhLEUgatRYAAABA81QvoixFIGnUWgAAAADNU72IshSBpFFrAQAAADRP9SLKUgSSRq0FAAAA0DzViyhLEUgatRYAAABA81QvoixFIGnUWgAAAADNU72IshSBpFFrAQAAADRP9SLKUgSSRq0FAAAA0DzViyhLEUgatRYAAABA81QvoixFIGnUWgAAAADNU72IshSBpFFrAQAAADRP9SLKUgSSRq0FAAAA0DzViyhLEUgatRYAAADN63/NFZkJr70i/wzVQfUiylIEkkatBQAAQPOsLDWF0lSdVC+iLEUgadRaAAAANG/jstQUSlN1Ub2IshSBpFFrAQAA0DxVlppCaaoOqhdRliKQNGotAAAAmre1stQUSlNlU72IshSBpFFrAQAA0LwkZakplKbKpHoRZSkCSaPWAgAAoHk+ZakplKbKonoRZSkCSaPWAgAAoHkhZakp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")}), Documentation(info = "
The DriveCycle block is designed to replicate the power demand of a vehicle considering a pre-determined drive cycle and vehicle parameters such as weight and frontal area. The generated power profile considers the needs to propel the vehicle plus the aerodynamic drag. The block allows the user to select if regenerative breaking is used or not.

The block enables the user to select from standard testing drive cycles including WLTC Class 1-3 and NEDC. The drive cycles are provided as .mat files in the library directory containing the block.
")); -end DriveCycle; +end DriveCycle; \ No newline at end of file diff --git a/VirtualFCS/Vehicles/JoystickDriveInput.mo b/VirtualFCS/Vehicles/JoystickDriveInput.mo index 601ae45..92dde65 100644 --- a/VirtualFCS/Vehicles/JoystickDriveInput.mo +++ b/VirtualFCS/Vehicles/JoystickDriveInput.mo @@ -1,15 +1,13 @@ within VirtualFCS.Vehicles; model JoystickDriveInput - parameter Real R_accel = 6; parameter Real R_decel = -4.5; parameter Real maxVelocity = 200; parameter Real minVelocity = 0; - VirtualFCS.XInTheLoop.UserInTheLoop.JoystickRoadElectricVehicleControl joystickRoadElectricVehicleControl annotation( Placement(visible = true, transformation(origin = {-80, -9}, extent = {{-15, -15}, {15, 15}}, rotation = 0))); - Modelica.Blocks.Math.Gain gain(k = R_decel) annotation( + Modelica.Blocks.Math.Gain gain(k = R_decel) annotation( Placement(visible = true, transformation(origin = {-40, 16}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); Modelica.Blocks.Math.Gain gain1(k = R_accel) annotation( Placement(visible = true, transformation(origin = {-40, -14}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); @@ -19,9 +17,9 @@ model JoystickDriveInput Placement(visible = true, transformation(origin = {-10, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); Modelica.Blocks.Interfaces.RealOutput setVelocity 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))); - Modelica.Blocks.Nonlinear.Limiter limiter(limitsAtInit = true, uMax = maxVelocity, uMin = minVelocity) annotation( + Modelica.Blocks.Nonlinear.Limiter limiter(uMax = maxVelocity, uMin = minVelocity) annotation( Placement(visible = true, transformation(origin = {82, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - Modelica.Blocks.Math.Gain gain2(k = 3600 /1000) annotation( + Modelica.Blocks.Math.Gain gain2(k = 3600 / 1000) annotation( Placement(visible = true, transformation(origin = {57, -1}, extent = {{-5, -5}, {5, 5}}, rotation = 0))); equation connect(gain.y, add.u1) annotation( @@ -40,8 +38,7 @@ equation Line(points = {{42, 0}, {50, 0}, {50, 0}, {50, 0}}, color = {0, 0, 127})); connect(gain2.y, limiter.u) annotation( Line(points = {{62, 0}, {68, 0}, {68, 0}, {70, 0}}, color = {0, 0, 127})); - -annotation( + annotation( experiment(StartTime = 0, StopTime = 30, Tolerance = 1e-6, Interval = 0.1), Icon(graphics = {Bitmap(origin = {-2, 0}, extent = {{-98, 100}, {102, -100}}, imageSource = "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"), Text(origin = {-5, 123}, lineColor = {0, 0, 255}, extent = {{-121, 23}, {121, -23}}, textString = "%name")}, coordinateSystem(initialScale = 0.1))); -end JoystickDriveInput; +end JoystickDriveInput; \ No newline at end of file diff --git a/VirtualFCS/Vehicles/UsersGuide/package.mo b/VirtualFCS/Vehicles/UsersGuide/package.mo index 1027833..1f33f5c 100644 --- a/VirtualFCS/Vehicles/UsersGuide/package.mo +++ b/VirtualFCS/Vehicles/UsersGuide/package.mo @@ -2,4 +2,4 @@ within VirtualFCS.Vehicles; package UsersGuide "User information for the Vehicles sub-library" extends Modelica.Icons.Information; -end UsersGuide; +end UsersGuide; \ No newline at end of file diff --git a/VirtualFCS/Vehicles/VehicleProfile.mo b/VirtualFCS/Vehicles/VehicleProfile.mo index 4276ce4..19d0e22 100644 --- a/VirtualFCS/Vehicles/VehicleProfile.mo +++ b/VirtualFCS/Vehicles/VehicleProfile.mo @@ -67,10 +67,10 @@ equation F_T = F_drag + F_accel; P = F_T * v / 0.9; if P >= 0 then - signalCurrent.i = -(P/0.9) / V_load; - else - signalCurrent.i = -(P*0.5) / V_load; - end if; + signalCurrent.i = -(P / 0.9) / V_load; + else + signalCurrent.i = -(P * 0.5) / V_load; + end if; omega_engine = v * R_gear / (0.5 * D_tire); N_engine = 30 * omega_engine / Modelica.Constants.pi; //der_v = if der(V) > 4.5 then 0 elseif der(V) < (-7) then 0 else der(v); @@ -108,4 +108,4 @@ equation annotation( Icon(coordinateSystem(preserveAspectRatio = false, initialScale = 0.05), graphics = {Text(origin = {-4, -12}, lineColor = {0, 0, 255}, extent = {{-150, 120}, {150, 150}}, textString = "%name"), Bitmap(origin = {-2, 1}, extent = {{-98, 99}, {102, -101}}, imageSource = "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Y8a7M1y64+2uZwPM6809YtyzZutzUGYrR9o83ULLvzTJu/cblgja1flj3FH28Rqw+eslmaZWvG/j7Wws75u61jlq1/90tbdSAeX7673mZolq0+x+ZtnH5+g63njGe37bMrAMRg37a5p0nZDb+wORuvU1bZugav7LRrAUzazldsVgarTrH5Grel19r6Buve4A+4mLw9b8y+gTW4dqnN1fidcJWtszy9lb/gYpJ2b7XPzOauOsHmaRoWL7vNVlzWb97+tV0vYJy+3r557tWGGbctW2xzNCHHL7/bVj/31JYd39r1A8bh2x1b5l7/Du5efrzNzuSccsWDdiXMhrd2fWfXE6jTd7vesp0Zz3rwL2m83tDPol92v6wnm15/b+dePuyEuuzfu/O91/Ovbe6y6vx6v7ViLI665Ea7Ot3Wv/jmtt08h0KVvt697c0X5z07MjdecpTNxuQdcury2V29zvf4xpdf2/LO1vc/3PHJnr1f7ePRCmXs3/fV3j2f7Pjw/a3vbHnt5Y2P26yab/XyUw+xedgUh56x4g67dsB43LHijENt/jXNYWdfPvducqBOd15+9mE275rqyJMvWrlqrV1foHprV6286OQjbb4136IlZ1125er77MoDVbhv9ZWXnbWkAa/XjWLx0tPPvfDi36788zXX37Rm7b0P2JgARTxw79o1N11/zZ9W/ObiC889felE39DQ6fwfekSttlB4ajcAAAAASUVORK5CYII="), Bitmap(origin = {-2, 1}, extent = {{-98, 99}, {102, -101}}, imageSource = "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rHY8a7M1y64+2uZwPM6809YtyzZutzUGYrR9o83ULLvzTJu/cblgja1flj3FH28Rqw+eslmaZWvG/j7Wws75u61jlq1/90tbdSAeX7673mZolq0+x+ZtnH5+g63njGe37bMrAMRg37a5p0nZDb+wORuvU1bZugav7LRrAUzazldsVgarTrH5Grel19r6Buve4A+4mLw9b8y+gTW4dqnN1fidcJWtszy9lb/gYpJ2b7XPzOauOsHmaRoWL7vNVlzWb97+tV0vYJy+3r557tWGGbctW2xzNCHHL7/bVj/31JYd39r1A8bh2x1b5l7/Du5efrzNzuSccsWDdiXMhrd2fWfXE6jTd7vesp0Zz3rwL2m83tDPol92v6wnm15/b+dePuyEuuzfu/O91/Ovbe6y6vx6v7ViLI665Ea7Ot3Wv/jmtt08h0KVvt697c0X5z07MjdecpTNxuQdcury2V29zvf4xpdf2/LO1vc/3PHJnr1f7ePRCmXs3/fV3j2f7Pjw/a3vbHnt5Y2P26yab/XyUw+xedgUh56x4g67dsB43LHijENt/jXNYWdfPvducqBOd15+9mE275rqyJMvWrlqrV1foHprV6286OQjbb4136IlZ1125er77MoDVbhv9ZWXnbWkAa/XjWLx0tPPvfDi36788zXX37Rm7b0P2JgARTxw79o1N11/zZ9W/ObiC889felE39DQ6fwfekSttlB4ajcAAAAASUVORK5CYII=")}), Documentation(info = "
The VehicleProfile block is designed to replicate the power demand of a vehicle considering a pre-determined drive cycle and vehicle parameters such as weight and frontal area. The generated power profile considers the needs to propel the vehicle plus the aerodynamic drag. The block allows the user to select if regenerative breaking is used or not.

The block enables the user to select from standard testing drive cycles including WLTC Class 1-3 and NEDC. The drive cycles are provided as .mat files in the library directory containing the block.
")); -end VehicleProfile; +end VehicleProfile; \ No newline at end of file diff --git a/VirtualFCS/Vehicles/package.mo b/VirtualFCS/Vehicles/package.mo index 16f42e7..049dff5 100644 --- a/VirtualFCS/Vehicles/package.mo +++ b/VirtualFCS/Vehicles/package.mo @@ -2,9 +2,6 @@ within VirtualFCS; package Vehicles "Vehicle profiles and drive cycle data." extends Modelica.Icons.Package; - - - annotation( Documentation(info = "The vehicles category of the VirtualFCS library includes the information needed to model the performance and demands of vehicles on the system. This includes a vehicle profile block that calculates the power demand of the vehicle as a function of its drive cycle, as well as the raw data for standard drive cycles themselves.")); -end Vehicles; +end Vehicles; \ No newline at end of file diff --git a/VirtualFCS/XInTheLoop/HardwareInTheLoop/package.mo b/VirtualFCS/XInTheLoop/HardwareInTheLoop/package.mo index 787a14d..a957ad2 100644 --- a/VirtualFCS/XInTheLoop/HardwareInTheLoop/package.mo +++ b/VirtualFCS/XInTheLoop/HardwareInTheLoop/package.mo @@ -2,4 +2,4 @@ within VirtualFCS.XInTheLoop; package HardwareInTheLoop extends Modelica.Icons.VariantsPackage; -end HardwareInTheLoop; +end HardwareInTheLoop; \ No newline at end of file diff --git a/VirtualFCS/XInTheLoop/ModelInTheLoop/package.mo b/VirtualFCS/XInTheLoop/ModelInTheLoop/package.mo index d3e526e..2e1269a 100644 --- a/VirtualFCS/XInTheLoop/ModelInTheLoop/package.mo +++ b/VirtualFCS/XInTheLoop/ModelInTheLoop/package.mo @@ -2,4 +2,4 @@ within VirtualFCS.XInTheLoop; package ModelInTheLoop extends Modelica.Icons.VariantsPackage; -end ModelInTheLoop; +end ModelInTheLoop; \ No newline at end of file diff --git a/VirtualFCS/XInTheLoop/SoftwareInTheLoop/package.mo b/VirtualFCS/XInTheLoop/SoftwareInTheLoop/package.mo index 6e3e0fe..81387c2 100644 --- a/VirtualFCS/XInTheLoop/SoftwareInTheLoop/package.mo +++ b/VirtualFCS/XInTheLoop/SoftwareInTheLoop/package.mo @@ -2,4 +2,4 @@ within VirtualFCS.XInTheLoop; package SoftwareInTheLoop extends Modelica.Icons.VariantsPackage; -end SoftwareInTheLoop; +end SoftwareInTheLoop; \ No newline at end of file diff --git a/VirtualFCS/XInTheLoop/UserInTheLoop/JoystickRoadElectricVehicleControl.mo b/VirtualFCS/XInTheLoop/UserInTheLoop/JoystickRoadElectricVehicleControl.mo index d877109..4ab5bd4 100644 --- a/VirtualFCS/XInTheLoop/UserInTheLoop/JoystickRoadElectricVehicleControl.mo +++ b/VirtualFCS/XInTheLoop/UserInTheLoop/JoystickRoadElectricVehicleControl.mo @@ -9,7 +9,7 @@ block JoystickRoadElectricVehicleControl Placement(visible = true, transformation(origin = {110, -40}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {110, -40}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); Modelica.Blocks.Nonlinear.SlewRateLimiter steeringRateLimiter "Limit the time rate of change of the steering control." annotation( Placement(visible = true, transformation(origin = {50, -40}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); - Modelica_DeviceDrivers.Blocks.InputDevices.JoystickInput joystickInput(axes(each fixed = false)) annotation( + Modelica_DeviceDrivers.Blocks.InputDevices.JoystickInput joystickInput(axes(each fixed = false)) annotation( Placement(visible = true, transformation(origin = {-72, -6}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); Modelica.Blocks.Interfaces.RealOutput ctl_brake annotation( Placement(visible = true, transformation(origin = {110, 80}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {110, 80}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); @@ -21,7 +21,7 @@ block JoystickRoadElectricVehicleControl Placement(visible = true, transformation(origin = {0, 20}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); Modelica.Blocks.Logical.LessEqualThreshold lessEqualThreshold annotation( Placement(visible = true, transformation(origin = {0, 80}, 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 = {72, 48}, extent = {{10, -10}, {-10, 10}}, rotation = 0))); Modelica.Blocks.Nonlinear.SlewRateLimiter accelerationRateLimiter(Rising = 3) annotation( Placement(visible = true, transformation(origin = {-40, 50}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); @@ -56,4 +56,4 @@ equation Line(points = {{62, 80}, {66, 80}, {66, 80}, {68, 80}}, color = {0, 0, 127})); connect(abs1.y, ctl_brake) annotation( Line(points = {{92, 80}, {104, 80}, {104, 80}, {110, 80}}, color = {0, 0, 127})); -end JoystickRoadElectricVehicleControl; +end JoystickRoadElectricVehicleControl; \ No newline at end of file diff --git a/VirtualFCS/XInTheLoop/UserInTheLoop/ThrottleKeys.mo b/VirtualFCS/XInTheLoop/UserInTheLoop/ThrottleKeys.mo index 9d5c42d..6acc2cd 100644 --- a/VirtualFCS/XInTheLoop/UserInTheLoop/ThrottleKeys.mo +++ b/VirtualFCS/XInTheLoop/UserInTheLoop/ThrottleKeys.mo @@ -1,9 +1,7 @@ within VirtualFCS.XInTheLoop.UserInTheLoop; block ThrottleKeys - - - Modelica.Blocks.Continuous.Integrator integrator annotation( + Modelica.Blocks.Continuous.Integrator integrator annotation( Placement(visible = true, transformation(origin = {10, 50}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); Modelica.Blocks.Interfaces.RealOutput y(unit = "km/h") annotation( Placement(visible = true, transformation(origin = {117, 1}, extent = {{-17, -17}, {17, 17}}, rotation = 0), iconTransformation(extent = {{99, 25}, {133, 59}}, rotation = 0))); @@ -24,7 +22,7 @@ block ThrottleKeys Modelica_DeviceDrivers.Blocks.OperatingSystem.RealtimeSynchronize realtimeSynchronize annotation( Placement(visible = true, transformation(origin = {-70, 70}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); equation - connect(integrator.y, add.u1) annotation( + connect(integrator.y, add.u1) annotation( Line(points = {{21, 50}, {38, 50}, {38, 36}}, color = {0, 0, 127})); connect(add.y, product.u1) annotation( Line(points = {{61, 30}, {68, 30}, {68, 6}}, color = {0, 0, 127})); @@ -34,17 +32,14 @@ equation Line(points = {{61, -30}, {68, -30}, {68, -6}}, color = {0, 0, 127})); connect(product.y, y) annotation( Line(points = {{91, 0}, {104, 0}, {104, 1}, {117, 1}}, color = {0, 0, 127})); - connect(booleanToReal.y, integrator.u) annotation( + connect(booleanToReal.y, integrator.u) annotation( Line(points = {{-19, 50}, {-2, 50}}, color = {0, 0, 127})); - connect(keyboardInput.keyUp, booleanToReal.u) annotation( + connect(keyboardInput.keyUp, booleanToReal.u) annotation( Line(points = {{-59, 6}, {-51, 6}, {-51, 50}, {-42, 50}}, color = {255, 0, 255})); connect(integrator1.y, add.u2) annotation( Line(points = {{21, -50}, {30, -50}, {30, 24}, {38, 24}}, color = {0, 0, 127})); - connect(keyboardInput.keyDown, booleanToReal1.u) annotation( + connect(keyboardInput.keyDown, booleanToReal1.u) annotation( Line(points = {{-70, -10}, {-70, -10}, {-70, -50}, {-42, -50}, {-42, -50}}, color = {255, 0, 255})); annotation( - uses(Modelica(version = "3.2.3"), Modelica_DeviceDrivers(version = "1.7.1")), Icon(graphics = {Rectangle(origin = {5, -49}, fillColor = {56, 56, 56}, fillPattern = FillPattern.Solid, extent = {{-35, 39}, {25, -21}}), Polygon(origin = {-7, -45}, fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, points = {{-13, 13}, {27, 13}, {7, -7}, {-13, 13}}), Rectangle(origin = {5, 29}, fillColor = {56, 56, 56}, fillPattern = FillPattern.Solid, extent = {{-35, 39}, {25, -21}}), Polygon(origin = {7, 41}, rotation = 180, fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, points = {{-13, 13}, {27, 13}, {7, -9}, {-13, 13}}), Rectangle(origin = {71, -49}, fillColor = {56, 56, 56}, fillPattern = FillPattern.Solid, extent = {{-35, 39}, {25, -21}}), Rectangle(origin = {-61, -49}, fillColor = {56, 56, 56}, fillPattern = FillPattern.Solid, extent = {{-35, 39}, {25, -21}}), Polygon(origin = {-63, -31}, rotation = 180, fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, points = {{17, 9}, {-3, 29}, {-3, -11}, {17, 9}}), Polygon(origin = {87, -7}, rotation = 180, fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, points = {{27, 53}, {27, 13}, {7, 33}, {27, 53}})}, coordinateSystem(initialScale = 0.1))); - - -end ThrottleKeys; +end ThrottleKeys; \ No newline at end of file diff --git a/VirtualFCS/XInTheLoop/UserInTheLoop/package.mo b/VirtualFCS/XInTheLoop/UserInTheLoop/package.mo index 21138ed..3156eb7 100644 --- a/VirtualFCS/XInTheLoop/UserInTheLoop/package.mo +++ b/VirtualFCS/XInTheLoop/UserInTheLoop/package.mo @@ -2,4 +2,4 @@ within VirtualFCS.XInTheLoop; package UserInTheLoop extends Modelica.Icons.VariantsPackage; -end UserInTheLoop; +end UserInTheLoop; \ No newline at end of file diff --git a/VirtualFCS/XInTheLoop/UsersGuide/package.mo b/VirtualFCS/XInTheLoop/UsersGuide/package.mo index f1886a8..2f7e586 100644 --- a/VirtualFCS/XInTheLoop/UsersGuide/package.mo +++ b/VirtualFCS/XInTheLoop/UsersGuide/package.mo @@ -2,4 +2,4 @@ within VirtualFCS.XInTheLoop; package UsersGuide "User information for the XInTheLoop sub-library" extends Modelica.Icons.Information; -end UsersGuide; +end UsersGuide; \ No newline at end of file diff --git a/VirtualFCS/XInTheLoop/package.mo b/VirtualFCS/XInTheLoop/package.mo index eea1e4a..88bcd31 100644 --- a/VirtualFCS/XInTheLoop/package.mo +++ b/VirtualFCS/XInTheLoop/package.mo @@ -2,13 +2,6 @@ within VirtualFCS; package XInTheLoop "Components for X-in-the-Loop functionality." extends Modelica.Icons.Package; - - - - - - - annotation( Documentation(info = "
")); -end XInTheLoop; +end XInTheLoop; \ No newline at end of file diff --git a/VirtualFCS/package.mo b/VirtualFCS/package.mo index 7fc29be..bb21ff4 100644 --- a/VirtualFCS/package.mo +++ b/VirtualFCS/package.mo @@ -1,32 +1,8 @@ -within ; package VirtualFCS "VirtualFCS - VIRTUAL & physical platform for Fuel Cell System development" -extends Modelica.Icons.Package; - -// import Annex60; - - - - - - - - - - - - - - - - - - - - + extends Modelica.Icons.Package; + // import Annex60; annotation( Icon(graphics = {Rectangle(fillColor = {255, 255, 255}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {100, -100}}), Bitmap(origin = {-16, 4}, extent = {{-84, 74}, {116, -88}}, imageSource = "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")}), - uses(Modelica(version = "3.2.3")), - Documentation(info = "
Version
0.1.0 (30.06.2021)

Overview
VirtualFCS is a Modelica library to model hybrid proton exchange membrane fuel cell (PEMFC) & battery electric vehicles. The library provides classes describing:
The VirtualFCS library is composed of 8 main sub-packages: Control, Electrical, Electrochemical, Examples, Fluid, Thermal, Vehicles, and XInTheLoop.




Development 
The Virtual-FCS project is supported by the European Union's H2020 research and innovation program and runs from Jan 2020 to Dec 2022. The repository was first opened to the public on April 22, 2021 (Earth Day) with the first minor release with documentation on 30.06.2021. Regular updates are planned every 3 months until Dec 2022.

Contributors (in alphabetical order)
Dr. Simon Clark, SINTEF Industry, Trondheim, Norway
Dr. Michael R. Gerhardt SINTEF Indsutry, Trondheim, Norway
Amelie Pinard, SINTEF Industry, Trondheim, Norway
Dr. Roberto Scipioni, SINTEF Industr,y Trondheim, Norway
Dr. Nadia Steiner UBFC, Belfort, France
Dr. Yash Raka, SINTEF Industry, Trondheim, Norway
Dr. Loic Vichard, UBFC, Belfort, France

Contact
www.virtual-fcs.eu

Funding
This project has received funding from the European Union’s Horizon 2020 research and innovation programme under grant agreement No 875087. Programme: H2020-EU.3.4.6.1. - Reduce the production cost of fuel cell systems to be used in transportation applications, while increasing their lifetime to levels which can compete with conventional technologies. Topic: FCH-01-3-2019 - Cyber-physical platform for hybrid Fuel Cell Systems.


")); - - -end VirtualFCS; + uses(Modelica(version = "4.0.0")), + Documentation(info = "
Version
0.1.0 (30.06.2021)

Overview
VirtualFCS is a Modelica library to model hybrid proton exchange membrane fuel cell (PEMFC) & battery electric vehicles. The library provides classes describing:
The VirtualFCS library is composed of 8 main sub-packages: Control, Electrical, Electrochemical, Examples, Fluid, Thermal, Vehicles, and XInTheLoop.




Development 
The Virtual-FCS project is supported by the European Union's H2020 research and innovation program and runs from Jan 2020 to Dec 2022. The repository was first opened to the public on April 22, 2021 (Earth Day) with the first minor release with documentation on 30.06.2021. Regular updates are planned every 3 months until Dec 2022.

Contributors (in alphabetical order)
Dr. Simon Clark, SINTEF Industry, Trondheim, Norway
Dr. Michael R. Gerhardt SINTEF Indsutry, Trondheim, Norway
Amelie Pinard, SINTEF Industry, Trondheim, Norway
Dr. Roberto Scipioni, SINTEF Industr,y Trondheim, Norway
Dr. Nadia Steiner UBFC, Belfort, France
Dr. Yash Raka, SINTEF Industry, Trondheim, Norway
Dr. Loic Vichard, UBFC, Belfort, France

Contact
www.virtual-fcs.eu

Funding
This project has received funding from the European Union’s Horizon 2020 research and innovation programme under grant agreement No 875087. Programme: H2020-EU.3.4.6.1. - Reduce the production cost of fuel cell systems to be used in transportation applications, while increasing their lifetime to levels which can compete with conventional technologies. Topic: FCH-01-3-2019 - Cyber-physical platform for hybrid Fuel Cell Systems.


")); +end VirtualFCS; \ No newline at end of file diff --git a/VirtualFCS/tmp b/VirtualFCS/tmp deleted file mode 100644 index f234803..0000000 --- a/VirtualFCS/tmp +++ /dev/null @@ -1,2 +0,0 @@ -The system cannot accept the date entered. -Enter the new date: (dd-mm-yy) \ No newline at end of file