ゼロから始めるFactorioの回路構築(実践例編)
[Factorio] [2021/08/27 14:00]
前回までに書いたFactorioにおける回路構成のまとめ。
前回までに、鉄板や銅板の量に応じてランプを光らせるといった動作をさせてみたが、それを具体的にどう活かしていけばいいか、自分が実際に構成した例を引き合いに出してみたい。
基本編 > 入力・出力・混合編 > 定数・算術回路編 > 条件回路編 > 実践例編 > 累積回路編
軽油をプロパンガスに分解し過ぎ問題を解決する
一番最初の記事にも書いたが、軽油を石油ガスに分解するプラントを動かし続けると、いざ軽油が大量に必要になったときに軽油が足りなくなってしまう。
逆にプラントを動かさなければ、ガスが大量に必要になったときにガスが足りなくなってしまう。
この問題を自動的に解決するのが本節で書く回路である。
結論を先に書いてしまうと、この回路は以下の制御を行っている。
- 軽油タンクの内容量と、ガスタンクの内容量を比較する。
- ガスのほうが少ない場合は、「軽油をガスに分解」のプラントを動かす。
- ガスのほうが多い場合は、「軽油をガスに分解」のプラントを止める。
上記により、ガスが減った場合は軽油を分解してガスの補給に努め、ガスが増えた場合は分解を止めて軽油の温存に努めることが可能になる。
具体的な回路の構成を見てみよう。
ガスタンクと軽油タンクから、それぞれレッドワイヤーで内容量がポンプに伝えられる。
ポンプは両タンクの内容量を比較し、「ガス<軽油」の作動条件がYESのときだけ動作し、軽油を化学プラントに流し込む。
軽油が分解されてガスのほうが多くなると、作動条件がYESではなくなるためポンプが停止し、分解も停止する仕組み。
ちなみに、ポンプの隣に置かれているランプは作動状況を視認するための表示灯で、ポンプと同じ作動条件が設定されている。
こうすると、ポンプが動くと同時にランプが光るので見た目が楽しくなる。
ここで書いた軽油→ガスの分解制御は一例に過ぎず、同様の方法で重油→軽油、重油→潤滑油、ガス→硫黄→硫酸すべての制御が可能である。
また、「タンク → ポンプ → 化学プラント」という組み合わせを「チェスト → インサータ → 炉」
の組み合わせに置き換えて考えれば「鉄板が充分ある場合だけ鋼鉄に加工する」といった応用もでき、
この考え方自体はあらゆる生産制御に応用できる。
余談だが、上記で書いた表示灯はガスと軽油の残量がほぼ等しい時はチカチカとフラッシュランプ的な光り方をする。
真っ暗な工場で明るいランプがチカチカ光るのは結構目が疲れる。
その場合は工場全体にランプを置いて、工場がそもそも暗くならないようにすると目にやさしくなる。
各タンクが満タンになるのを防いで原油を絶えず生産しながら、固形燃料を生産し続ける
原油を原油処理施設で処理すると、重油と軽油と石油ガスが採れる。
しかし原油処理施設は、3つのうちどれかのタンクが満タンになると、原油処理を停止してしまう。
このためあまり大量に特定の資源を使い続けると、例えば「石油ガスタンクが空なのに、軽油タンクが満タンなので原油処理が動かない」といった事態が起きてしまう。
また、Factorioの油田は産出量が減りこそすれ、決して尽きることはない。
このため、産出量が最低まで低下した油田は、温存しても意味がないので掘り続けたほうが得と思われる。
しかし原油のタンクが満タンになると産出が止まってしまう。
このように石油精製関連のタンクは、満タンになるといろいろ非効率である。
かといって原油を減らすために固形燃料を延々と作り続けたら、いざ必要なときには軽油や石油ガスのタンクが空という事態も起きかねない。
そこで、いざというときに備えてタンクの備蓄を確保しながら、満タンになりそうなときは固形燃料を生産してタンクの中身を減らすという制御を考えた。
回路による制御は以下のように行う。
- 原油タンクと軽油タンクの内容量が、どちらも24000以上か調べる(備蓄が充分あることを確認する)。
- どちらも24000より多い場合は、「軽油を固形燃料に変換」のプラントを動かす。
- どちらかが24000より少ない場合は、「軽油を固形燃料に変換」のプラントを動かさない。
原油と軽油の2つのタンクの内容量をレッドワイヤーで取り出し、ポンプに入力する。
ポンプはすべての信号が24000より多いか調べ、YESなら軽油を化学プラントに流し込む。
こうすることで、原油や軽油のタンクに充分な備蓄がある状態を維持しつつも、軽油タンクが満タンになるのを防ぐ。
なおFactorio@Wikiの記載によると、固形燃料の生産はガス・軽油・重油のうち軽油から行うのが最も効率が良いらしい。
このため重油からの固形燃料の生産はせず、代わりに上記した「分解し過ぎ問題を解決する」の流用で重油→軽油の分解プラントを作っておく。
そうすれば、重油はまず軽油に分解され、分解された軽油が軽油タンク経由で固形燃料生産プラントに流れるので、最高の固形燃料生成効率を維持できる。
不足アイテムを自動生産する(ロボットステーションと組立機の回路制御)
インサータや搬送ベルトなど「よく使うアイテム」は、いちいち手で作るより自動で作っておいたほうが便利である。
そんなときは、ロボットステーションから出力される倉庫内アイテムの信号をインサータに入力し、「アイテムの在庫が減ってきたらインサータが作動して、組立機に材料を投入する」ようにしておく。
こうすればアイテムが減った時だけ組立機が組立てを行い、減ったアイテムを補充してくれる。
ロボットステーションからは、物流ネットワーク内にあるアイテムの在庫数が信号として出力される。
在庫が減るとインサータが動いて組立機に材料を投入し、組み立てが行われる。在庫が増えるとインサータが止まり、在庫の生産は停止する。
実際の我が拠点の運用風景。上で紹介した組立機のセットを実際には数十セット並べて設置し、それぞれ違うアイテムを自動補充している。
こうすれば歯車1個からスタックインサータに至るまで使用頻度の高いアイテムが全自動で補充される。
ちなみに回路制御をせずとも、「チェストが満杯になったら組立機が自動で止まる」ことを利用して在庫数制限は可能である。
ただしその場合、使用後に回収したアイテムを供給チェストなどに入れた場合に在庫として計上されず、在庫を補充しすぎ気味になる点が異なる。
ちなみに物流ネットワーク(物流ロボットがアイテムを運んでくれる範囲)内に置かれた設備であれば、実は回路を繋がなくても物流ネットワーク内の在庫量を参照することができる。
この図の場合はインサータに回路が繋がっていないが、物流ネットワークの範囲内に置かれているので、物流ネットワーク内の在庫数をリアルタイムで受信し、鉄板が200枚より多くあるときだけ動作する。
アイテムが十分にあったら工場を停電させて節電する(チェストと電源スイッチの回路制御)
ゲームが後半戦に入ってくると、ビーコンを使ったり組立機に生産力モジュールをセットして生産効率を向上させたい場合がある。
しかしそうすると消費電力が増え、汚染をばらまき放題になってしまう。
そこで、もしアイテムが十分にあるときはビーコンや組立機を含む工場区画全体の電源を落とすようにすれば、燃料を節約できて環境にもやさしく、バイターとの友好にも寄与できるはずである。
画像は生産力モジュール4枚差しで消費電力激増の組立機が並ぶ製造サイエンスパック(紫P)工場を回路で節電させている例。
画像左下に出荷口があり、6個のチェストに紫Pを溜め込み、列車で出荷している。
そこで、その6個のチェストを回路でつないでチェストの内容物の信号を出力させ、それを電源スイッチに入力する。
電源スイッチの動作条件は「紫P<50000」とする。(50000は「これ以上在庫があるときは工場を停電させる」というお好みの在庫数。)
こうしておけば、在庫が足りない場合だけ工場に電気を流し、在庫が増えたら停電させて節電に取り組む。
工場を停電させても駅施設は停電させないところがポイント。
この回路は駅に溜まった在庫の数で停電を判断しているので、駅施設を停電させると積み込みが止まり、
積み込みが止まると在庫が減らないので永久に停電したままになってしまう。
なお補足だが、組立機などの設備は停止中は待機電力だけになるので、わざわざ停電させる必要性は薄い。
ビーコンには停止の概念がなく工場の停止中にも大電力を消費してしまうので、節電が役に立つのは主にビーコンを含む工場である。
原油が溜まった時だけ原油輸送列車を呼ぶ(タンクと駅の回路制御)
原油は油田から採れる。採れた原油は一旦タンクに溜め、列車で製油所に運んで軽油などの石油製品に加工する。
しかし各地に散らばる油田から原油を集めて処理しているとき、まだ原油が溜まっていない駅に列車が来てしまうと、タンクが満タンになるまで列車が延々と待たされ続ける羽目になってしまう。
そんなときは、原油が充分溜まってから列車を呼ぶように回路制御を加えてみよう。
原油を溜めるタンクと駅をレッドワイヤーでつなぎ、駅の作動条件に「原油≧100,000」を設定する。
(100,000はタンク貨車を4両満タンにする場合の量(25,000×4)。)
こうすれば、原油が列車1本分溜まっているときだけ駅が有効化し、列車はスムーズに積み込みを終えて発車することが可能になる。
Factorioでは2つ以上の駅に同じ駅名をつけることができる。その場合、列車は「同じ名前の行き先のうち、最短距離で行ける駅」へ自動的に向かう。
さらに回路制御を組み合わせ「原油が少ない駅は無効化する」ように設定しておけば、列車は「同じ名前の行き先のうち、原油が充分溜まっている最短距離で行ける駅」へ自動的に向かうようになり、最小限の列車を能動的に走らせて各地から原油をかき集めることが可能になる。
上記画像では“油田駅”が3か所あるが、左端の駅は無効化(赤く表示)されているので、列車は残り2駅のうち最短なほうに自動的に向かう。
列車のダイヤはピストン輸送のように、油田駅[発車条件:貨物が満杯]と製油所駅[発車条件:貨物が空]の2つを登録しておくだけでいい。
状況に応じて駅の有効/無効を制御する方法は、かなり広い範囲に応用が利く。
例えば発電所で燃料がたくさんある時は駅を無効化し、燃料が少ないときだけ駅を有効化すると燃料輸送列車がやってくるとか、
逆に工場で完成品がたくさん溜まったときだけ駅を有効化すると搬出列車がやってくるといった使い方ができる。
ウランの採掘場で硫酸が減ってきたらタンク車を呼ぶというのも面白い。
バイターの侵入を防ぐために防壁を張り巡らせて建設ロボットで自動修復させている場合は、リペアキットなどの修理部材が減ってきたら補給列車を呼ぶといったこともできる。
V1.1では駅ごとに列車数上限(駅が受け入れる列車の最大本数)を指定できるようになったので、上記をさらに改良し、
貨車を満タンにできる目いっぱいの数の列車を呼ぶことも出来るようになった。
例えば駅に原油が250,000溜まっていて、列車1本あたり原油を100,000積み込めるとする。250,000÷100,000は2.5なので、
列車2本までなら貨車を満タンにできる計算である。
そこで、算術回路で「溜まっている原油の量÷100,000」を計算しその結果を駅の列車数上限に設定する。
そうすればその駅は常に貨車を満タンにできる範囲内の列車を受け入れる。
ちなみにこの場合、原油がまだ100,000溜まっていないときは割り算の結果が0となるため、
駅は実質的に無効となり列車は1本もその駅に向かわなくなる。
V1.1用に改善された油田駅。タンクに溜まっている原油の量を算術回路で100,000で割り、その数だけ列車を受け入れる。
緑に光っているランプは、割り算の結果を光っているランプの数で表示している。この図の場合は列車3本分の原油が溜まっていることがわかる。
必須ではないが、駅に作動条件[緑信号≧1]を設定している。これにより、原油が全く溜まっていないときは緑信号は0になり、作動条件を満たさないため駅は無効化される。無効化された駅はマップ上で駅名が赤く表示されるため、原油が溜まっていないことが一目瞭然になる効果がある。
タンクの残量メーターを作る(貯蔵タンクとランプの回路制御)
原子力発電で発生させた蒸気を貯蔵タンクに溜め、タンク内の蒸気の残量を表示させてみる。
実用性はないが、見た目が少し楽しくなる回路。
画像左側に19個並んでいるランプが蒸気の残量メーター。うち左の10個が10%単位、右の9個が1%単位で0~100までの数値を表すことができる。
熱交換器で発生させた蒸気を溜める貯蔵タンクにレッドワイヤーをつなぎ、それを算術回路に入力する。
算術回路は「蒸気の量÷5000」の割り算を行うことで、タンクに溜まった蒸気の残量を0~100の百分率に変換する。
(5000は画像のように貯蔵タンクが20個ある場合の満タン量を100で割った値(25000×20÷100)。)
左側のランプにはその計算結果を入力して「蒸気≧10」「蒸気≧20」などの10%刻みの条件を設定しておく。
また百分率の信号をもうひとつ別の算術回路に入力し「蒸気の量%10」の剰余算(割り算の余りを求める)を行うことで、百分率から1の位を抽出する。
右側のランプには2つ目の算術回路の結果を入力して「蒸気≧1」「蒸気≧2」などの1%刻みの条件を設定しておく。
こうすれば、例えば蒸気の量が85%であれば、左のランプが8つ、右のランプが5つ点灯し、85%という値が目視で確認できるようになる。
このような表示器は蒸気残量に限らず、いろいろな場面で使える。例えばロボットステーションのロボット稼働率表示器なんてのもいいだろう。
画像では白一色の直線表示だが、もっとシンプルに赤>黄>緑の1灯式にしたり、プログラマブルスピーカーと組み合わせて異常な減り方をしたら警報を上げると、トラブルが起きた場合に迅速に対応できるだろう。
こちらは上記の蒸気タンクとは違ったアプローチによる、水タンクの1灯式残量表示器。
タンクに水が充分ある時はランプが水色に光り、減ってくると黄色、減りすぎると赤く光る。
ランプには作動条件として鉄板=0を設定した。回路上にないアイテムの値はゼロなので、この作動条件は常にYESとなりランプは常時点灯し続ける。
さらに、このランプには「色の使用」にチェックをつけておく。定数回路からは常時「シアン=1」を出力する。
1台目の条件回路は「水<20,000」のとき「黄色=1」を、2台目の条件回路は「水<10,000」のとき「赤=1」を出力する。
別頁に書いた通り、ランプの色には優先順位があり最も優先度の高い色のみが発色するので、
上記のようにしておけば、最も優先度の高い赤の信号が出ているときはシアンと黄色は無視されてランプは赤く光り、次点で黄色、
赤も黄色もないときは最も優先度の低いシアンが発色する。
火力発電所を必要な時だけ動かす(蓄電池と電源スイッチの回路制御)
火力発電所は電気を生み出すが、同時に汚染も生み出す。
汚染のない太陽光発電をメインにし、それで足りない分だけ火力発電所を動かすようにすると、できるだけ汚染を減らしつつ電力を保つことができる。
送電網に太陽光発電(夜間も使用する場合は大量の蓄電池も含む)を直結する。
火力発電は送電網との間にスイッチを挟んで接続する。
送電網側に充電量検出用の蓄電池を1個つなぎ、この蓄電池とスイッチの間をレッドワイヤーで接続する。
蓄電池からは充電残量が百分率(0~100)で出力されるので、これを電源スイッチに入力し、作動条件を「充電残量<20」にしておく。
すると、充電残量が充分ある場合は火力発電所は送電網から切り離されるため発電を停止し、汚染を出さなくなる。
充電残量が20%未満になると火力発電所が送電網に接続され、発電を開始する。
(なお、充電残量はデフォルトではAという特殊アイテム信号として出力される。蓄電池をクリックして設定を確認できる。)
上記のような単純なON/OFF制御でも問題なく動くが、しかしそれだと以下のような挙動が起きる。
- 夜間に蓄電池の容量が消費され、充電残量が19%になる。
- 回路が働き、発電機が発電を開始する。
- 発電が行われると蓄電池が充電を開始し、充電残量が20%になる。
- 回路が働き、発電機が発電を停止する。
- しかし蓄電池の容量は1%しか回復していないので、すぐに充電残量が19%になる。
- 以降、発電機は発電と停止を繰り返す。
だめではないが、機械的に考えるとあまり美しいとは言えない稼動方法である。
そこで、発電の開始と停止の閾値を分けてみる。
例えば、蓄電容量が10%より下がったら発電を開始し、充電を行い、蓄電容量が30%を超えたら発電を停止する。
そうすれば差分の20%分は発電機が発電を続けることができる。
改善された非常用発電所の回路制御。
風車のように時計回り4マスで一周する搬送ベルトを用意し、ここに木材を1本だけ流しておく。
蓄電池からのレッドワイヤーを、風車の左上と右下のベルトにつなぎ、左上には「充電容量<10」、右下には「充電容量≧30」の作動条件を設定しておく。
こうすれば、充電容量が9%になると左上のベルトが動き出して木材は右上に流れ込むが、右下のベルトは止まっているので木材は右上で止まる。
充電容量が30%になると右下のベルトが動き出して木材は左下に流れ込むが、左上のベルトは止まっているので木材は左下で止まる。
これにより、「木材が右上のベルト上にある時は火力発電を行う」という検出器が出来上がる。
そこで、右上のベルトからもう1本別のレッドワイヤーを引き出して電源スイッチにつなぐ。
右上のベルトの設定は「有効/無効」のチェックを外し「ベルト上のアイテムを取得する」「ホールドモード」にしておく。
電源スイッチの動作条件を「木材=1」にすれば、木材が右上のベルト上にある時にだけ電源スイッチが接続され発電が開始される。
なお昔のバージョンのFactorioでは、電力網が発電設備のみで電力消費設備がない場合に停電警告マークが表示されていたが、現在のバージョンでは警告は出ないよう変更されているので当時のような対策は不要である。
参考までに、改善していないほうの(蓄電池と電源スイッチを直結した場合の)回路制御の結果例(V0.17時代)。
電力状況グラフが剣山になる。
と、回路を使うと想像力次第でいろいろなことができる。
次回はアイテムの信号をどんどん足し合わせていく、累積回路について触れる。
基本編 > 入力・出力・混合編 > 定数・算術回路編 > 条件回路編 > 実践例編 > 累積回路編
この記事を評価
この記事にコメント
- ...