冷却・発電設備の検討(1)
ソースコードは以下の実行環境で確認しています。
- Visual Studio Code バージョン: 1.104.2
- 拡張機能:Jupyter バージョン 2025.8.0
- Python 3.12.10
- biosteam 2.52.13
- graphviz-14.0.2
冷却・発電設備の検討(1)
蒸留塔、ボイラー・ターボ発電機、冷却水塔のシステム
設備側の装置として、ボイラー・ターボ発電機 BoilerTurbogenerator、 チルド水供給装置ChilledWaterPackage、 冷却水塔CoolingTowerを例を挙げて説明してきました。蒸留塔とボイラー・ターボ発電機の組み合わせ、熱交換器とチルド水供給装置の組み合わせ、蒸留塔と冷却水塔の組み合わせでした。では、さらにこれらを組み合わせた場合はどうなるでしょうか?実際の蒸留塔のプラントは、必要な電力と蒸気をボイラー・ターボ発電機で生成しつつ、冷却は冷却水塔やチルド水供給装置を使ってシステムとして成り立つものと思われます。今回サンプルとしている蒸留塔は、チルド水は要らないようなので、まずは蒸留塔、ボイラー・ターボ発電機、冷却水塔のシステムを考えます。import biosteam as bst
from biorefineries import cane
bst.nbtutorial() # Ignore warnings and reset local BioSTEAM preferences
chemicals = cane.create_sugarcane_chemicals()
chemicals.define_group(
name='Fiber',
IDs=['Cellulose', 'Hemicellulose', 'Lignin'],
composition=[0.4704 , 0.2775, 0.2520],
wt=True, # Composition is given as weight
)
bst.settings.set_thermo(chemicals)
dilute_ethanol = bst.Stream('dilute_ethanol', Water=1390, Ethanol=590)
bagasse = bst.Stream('bagasse', Water=0.4, Fiber=0.6, total_flow=8e4, units='kg/hr')
with bst.System('sys') as sys:
D1 = bst.BinaryDistillation('D1', ins=dilute_ethanol, outs=('distillate', 'bottoms_product'),
Lr=0.999, Hr=0.89, k=1.25, LHK=('Ethanol', 'Water'))
BT = bst.BoilerTurbogenerator('BT')
BT.ins[0] = bagasse
CT = bst.CoolingTower('CT')
sys.simulate()
sys.show(T='degC')
System: sys
ins...
[0] dilute_ethanol
phase: 'l', T: 25 degC, P: 101325 Pa
flow (kmol/hr): Water 1.39e+03
Ethanol 590
[1] bagasse
phase: 'l', T: 25 degC, P: 101325 Pa
flow (kmol/hr): Water 1.78e+03
Cellulose 139
Hemicellulose 101
Lignin 79.5
[2] -
phase: 'l', T: 25 degC, P: 101325 Pa
flow: 0
[3] -
phase: 'l', T: 25 degC, P: 101325 Pa
flow (kmol/hr): Water 488
[4] -
phase: 'g', T: 15.556 degC, P: 101560 Pa
flow: 0
[5] -
phase: 'l', T: 25 degC, P: 101325 Pa
flow: 0
[6] -
phase: 'l', T: 25 degC, P: 101325 Pa
flow (kmol/hr): Ash 0.567
[7] -
phase: 'g', T: 25 degC, P: 101325 Pa
flow (kmol/hr): O2 9.85e+03
N2 4.23e+04
[8] -
phase: 'l', T: 32.222 degC, P: 101325 Pa
flow (kmol/hr): Water 1.96e+04
[9] cooling_tower_makeup_water
phase: 'l', T: 32.222 degC, P: 101325 Pa
flow (kmol/hr): Water 215
[10] cooling_tower_chemicals
phase: 'l', T: 32.222 degC, P: 101325 Pa
flow (kmol/hr): Water 0.00494
outs...
[0] distillate
phase: 'g', T: 78.465 degC, P: 101325 Pa
flow (kmol/hr): Water 153
Ethanol 589
[1] bottoms_product
phase: 'l', T: 99.814 degC, P: 101325 Pa
flow (kmol/hr): Water 1.24e+03
Ethanol 0.59
[2] emissions
phase: 'g', T: 121 degC, P: 101325 Pa
flow (kmol/hr): Water 3.19e+03
CO2 1.98e+03
O2 7.84e+03
N2 4.23e+04
[3] rejected_water_and_blowdown
phase: 'l', T: 25 degC, P: 101325 Pa
flow (kmol/hr): Water 488
[4] ash_disposal
phase: 'l', T: 25 degC, P: 101325 Pa
flow (kmol/hr): Water 0.00944
Ash 0.567
[5] -
phase: 'l', T: 51.667 degC, P: 101325 Pa
flow (kmol/hr): Water 1.96e+04
[6] cooling_tower_blowdown
phase: 'l', T: 51.667 degC, P: 101325 Pa
flow (kmol/hr): Water 19.6
[7] cooling_tower_evaporation
phase: 'g', T: 51.667 degC, P: 101325 Pa
flow (kmol/hr): Water 196
ちょっと見にくいですが、流入ストリームのfeed中のエタノールがほとんど流出ストリーム'distillate(留出物)'に含まれつつ、水分が大幅に減っているので上手く蒸留できていると思われます。システムの図はこんな感じです。
冷却に必要な冷却水の量
このプラントの熱収支はどうなっているでしょうか?sys.heat_utilities
[<cooling_water: -8.42e+07 kJ/hr, 5.75e+04 kmol/hr, 28.1 USD/hr>, <low_pressure_steam: 0 kJ/hr, 0 kmol/hr, 0 USD/hr>]System.heat_utilitiesは媒体ごとの熱収支の合計です。 冷却水'cooling_water'の冷却が8.42e+07 kJ/hr程必要、となっています。では、機器ユニットごとの状況を調べます。
- 蒸留塔
D1.heat_utilities
[<cooling_water: -2.87e+07 kJ/hr, 1.96e+04 kmol/hr, 9.55 USD/hr>, <low_pressure_steam: 7.32e+07 kJ/hr, 1.89e+03 kmol/hr, 450 USD/hr>]
BT.heat_utilities
[<low_pressure_steam: -7.32e+07 kJ/hr, -1.89e+03 kmol/hr, -450 USD/hr>, <cooling_water: -8.42e+07 kJ/hr, 5.75e+04 kmol/hr, 28.1 USD/hr>]
CT.heat_utilities
[<cooling_water: 2.87e+07 kJ/hr, -1.96e+04 kmol/hr, -9.55 USD/hr>]熱負荷を表にしてみます。
| cooling water | low_pressure_steam | |
|---|---|---|
| 蒸留塔 | -2.87e+07 kJ/hr | 7.32e+07 kJ/hr |
| ボイラー・ターボ発電機 | -8.42e+07 kJ/hr | -7.32e+07 kJ/hr |
| 冷却水塔 | 2.87e+07 kJ/hr |
蒸留塔の'cooling water(冷却水)'が-2.87e+07 kJ/hrということは、マイナスなので冷却要求で、2.87e+07 kJ/hrの熱負荷分を冷却してほしい、 ボイラー・ターボ発電機は同じくマイナスなので8.42e+07kJ/hrの冷却要求があり、冷却水塔はプラスで2.87e+07 kJ/hr分の冷却を提供しているということになります。 マイナスがシステムからの流出、取り除く側、プラスがシステムへの流入、加える側ですかね。 蒸留塔分の冷却要求は冷却水塔で対応できていそうですが、ボイラー・ターボ発電機分は冷却能力が不足しているように見えます。
'low_pressure_steam(低圧蒸気)'は蒸留塔で7.32e+07kJ/hr必要、同じ分をボイラー・ターボ発電機で除去している計算になっています。 ボイラーでの熱の供給をマイナスとすることで低圧蒸気系統の需要と供給が一致していることを表現しているようです。
なぜ、'low_pressure_steam(低圧蒸気)'の方はプラスとマイナスで収支が取れているように見えるのに、'cooling water(冷却水)'の方はそうなっていないのか? ソースコードを確認すると、それぞれのモデルを作成した時にシステム内の機器のheat_utilitiesを集約し、 'agent'(媒体)ごとにまとめています(boilerturbogeneratorの_load_utility_agents() など)。でも、システムを記述した時には BT を先に、CT に書いたので、BTの冷却分も含めてCTで集約して欲しいところです。 system.print()とすると計算順序が分かるようなので試してみます。
sys.print() # Show system simulation order
System('sys',
[D1],
facilities=[CT,
BT])
どうも、CTによる冷却系の集約の後にBTの計算をしているようです。Facilityを見ると、
ordered_facilities(facilities)というのがあって、
何か順番を制御しているものがありそうです。ソースコードを確認してみると、network_priorityがその順番を決めていそうです。
CT.network_priority
0
BT.network_priority
1
network_priorityはユーザー側で変更できそうなので変更してみます。
with bst.System('sys') as sys:
D1 = bst.BinaryDistillation('D1', ins=dilute_ethanol, outs=('distillate', 'bottoms_product'),
Lr=0.999, Hr=0.89, k=1.25, LHK=('Ethanol', 'Water'))
BT = bst.BoilerTurbogenerator('BT')
BT.network_priority = 0
BT.ins[0] = bagasse
CT = bst.CoolingTower('CT')
CT.network_priority = 1
sys.simulate()
sys.print()
sys.heat_utilities
System('sys',
[D1],
facilities=[BT,
CT])
[<cooling_water: 0 kJ/hr, -3.64e-12 kmol/hr, 0 USD/hr>, <low_pressure_steam: 0 kJ/hr, 0 kmol/hr, 0 USD/hr>]計算順序を入れ替えることが出来、熱負荷の収支はゼロ、流量もほぼゼロになりました。機器側も確認してみると、
- 蒸留塔
D1.heat_utilities
[<cooling_water: -2.87e+07 kJ/hr, 1.96e+04 kmol/hr, 9.55 USD/hr>, <low_pressure_steam: 7.32e+07 kJ/hr, 1.89e+03 kmol/hr, 450 USD/hr>]
BT.heat_utilities
[<low_pressure_steam: -7.32e+07 kJ/hr, -1.89e+03 kmol/hr, -450 USD/hr>, <cooling_water: -8.42e+07 kJ/hr, 5.75e+04 kmol/hr, 28.1 USD/hr>]
CT.heat_utilities
[<cooling_water: 1.13e+08 kJ/hr, -7.71e+04 kmol/hr, -37.6 USD/hr>]
表にすると
| cooling water | low_pressure_steam | |
|---|---|---|
| 蒸留塔 | -2.87e+07 kJ/hr | 7.32e+07 kJ/hr |
| ボイラー・ターボ発電機 | -8.42e+07 kJ/hr | -7.32e+07 kJ/hr |
| 冷却水塔 | 1.13e+08 kJ/hr |
となり、冷却水塔の'cooling water(冷却水)'の負荷は蒸留塔とボイラー・ターボ発電機の負荷と合計すると0になり、釣り合うようになりました。他の計算結果はシステムの流出ストリームも含めて同じようなので、計算順序を変えた影響はなさそうです。
次に、System.results()を見ます。'Cooling water'の'Duty'はゼロなので、冷却水は不要? 増減はしない、という意味かもしれません。知りたいことはこのシステムにどれくらいの冷却水が必要か?ということですよね。システムの結果の出し方はさらに考慮したほうがいいかもしれません。
sys.results()
| System | Units | sys | |
|---|---|---|---|
| Electricity | Power | kW | -1.31e+05 |
| Cost | USD/hr | -1.02e+04 | |
| Cooling water | Duty | kJ/hr | 0 |
| Flow | kmol/hr | -3.64e-12 | |
| Cost | USD/hr | 0 | |
| Low pressure steam | Duty | kJ/hr | 0 |
| Flow | kmol/hr | 0 | |
| Cost | USD/hr | 0 | |
| Ash disposal (outlet) | Flow | kmol/hr | 0.737 |
| Cost | USD/hr | 0.0234 | |
| Total purchase cost | USD | 5.42e+07 | |
| Installed equipment cost | USD | 9.92e+07 | |
| Utility cost | USD/hr | -1.02e+04 | |
| Material cost | USD/hr | 3.88 | |
| Sales | USD/hr | 0 | |
実際に冷却水塔の入出力を確認すると、
CT.show(T='degC',flow='kg/hr')
CoolingTower: CT
ins...
[0] -
phase: 'l', T: 32.222 degC, P: 101325 Pa
flow (kg/hr): Water 1.39e+06
[1] cooling_tower_makeup_water
phase: 'l', T: 32.222 degC, P: 101325 Pa
flow (kg/hr): Water 1.53e+04
[2] cooling_tower_chemicals
phase: 'l', T: 32.222 degC, P: 101325 Pa
flow (kg/hr): Water 0.35
outs...
[0] -
phase: 'l', T: 51.667 degC, P: 101325 Pa
flow (kg/hr): Water 1.39e+06
[1] cooling_tower_blowdown
phase: 'l', T: 51.667 degC, P: 101325 Pa
flow (kg/hr): Water 1.39e+03
[2] cooling_tower_evaporation
phase: 'g', T: 51.667 degC, P: 101325 Pa
flow (kg/hr): Water 1.39e+04
ということなので、冷却水としてはins[0]の 1.39e+06 kg/hr、補給水としてins[1]の 1.53e+04 kg/hr が必要なようです。この分の冷却水、補給水があって需給のバランスが取れた、ということなので、システムとしては外部からこれらの供給が必要だということを意味していると思います。
発電量
冷却水塔で処理する冷却量にボイラー・ターボ発電機分を加算したい、ということで計算順序を変更しました。他の計算結果が変わっていないか確認はしましたが、先に各機器の消費電力を集約することでボイラー・ターボ発電機分が外れて実は発電量が不足している、ということがないか、確認しました。for u in sys.units:
print(u.ID,u.power_utility)
D1 PowerUtility(consumption=2.7306386491000847, production=0.0) CT PowerUtility(consumption=88.96268976418037, production=0.0) BT PowerUtility(consumption=842.0258967952441, production=57636.25001185809)
表にしてみました。蒸留塔D1、冷却水塔CTは電力は消費しますが、生成はしていない、となっています。ボイラー・ターボ発電機BTは約58MW生成もしているけれども、消費もしている、ということになります。
| consumption(消費)[kW] | production(生成)[kW] | |
|---|---|---|
| D1 | 2.73 | 0.0 |
| CT | 88.96 | 0.0 |
| BT | 842.03 | 57636.25 |
ボイラー・ターボ発電機モデルの説明 _design()に、発電量は燃料の発熱量にボイラー効率をかけた有効熱量から必要蒸気分を引き、発電効率を掛けて発電量を計算している、と書いてあります。 \[ 発電量\textit{(H_electricity)} = 燃料の発熱量 \cdot \textit{boiler_efficiency} - 必要蒸気量 \] では、消費量は?ソースコードには直接記述はなかったのですが、良く調べてみるとソースコードの冒頭部分にある、
@cost('Work', 'Turbogenerator',
CE=551, S=42200, kW=0, cost=9500e3, n=0.60, BM=1.8)
@cost('Flow rate', 'Hot process water softener system',
CE=551, cost=78e3, S=235803, n=0.6, BM=1.8)
@cost('Flow rate', 'Amine addition pkg',
CE=551, cost=40e3, S=235803, n=0.6, BM=1.8)
@cost('Flow rate', 'Deaerator',
CE=551, cost=305e3, S=235803, n=0.6, BM=3.0)
@cost('Flow rate', 'Boiler',
CE=551, cost=28550e3, kW=1371, S=238686, n=0.6, BM=1.8)
@cost('Ash disposal', 'Baghouse bags',
CE=551, cost=466183. / 4363., n=1.0, lifetime=5)
の部分で計算していることが分かりました。CostItem('_basis', '_units', 'S', 'lb', 'ub', 'CE', 'cost', 'n', 'kW', 'N', 'f', 'condition', 'magnitude')の記述と合わせてみると、これらの6個の@cost記載の中で'kW='の設定のある'Boiler'の'Flow rate(流量)'基準で計算されていました。詳細は省きますが、今回のシステムでは、ボイラー・ターボ発電機の'流量'は1.47e+05 kg/hr で、 \[ \textit{Flow rate(流量)} / S(=235803) * kW(=1371) = 842.0258967952441 \] と計算されていました。ボイラー・ターボ発電機BTの発電量が冷却水塔CTの消費電力が含まれていなくて、その分発電量を増加させるとBTの'流量'が増え、BTの消費電力も増え、その分BTの発電量を増やさなくてはならなくなり、という事態も考えられますが、今は、それ以上の発電量があるので、課題は顕在化していないと考えておきましょう。
