弥生研究所

人は誰しもが生きることの専門家である

【Factorio】原子力発電の制御【回路ネットワーク】

回路ネットワーク 難易度
実践編 ☆☆☆

原子炉の温度は1000度が上限ですが、上限に達しても燃料棒の消費は止まりません。ボイラーなどは必要な分だけ石炭や固形燃料を消費してくれますが、原子炉は投入された燃料棒をきっちり200秒で1本消費していきます。つまり、燃料棒の投入をインサーターで逐次行っていると、燃料棒が無駄になってしまいます。

効率よく燃料棒を消費するには、温度が低下したときに、1回だけインサータを起動して、燃料棒を投入する必要があります。この制御を回路ネットワークで行うのが、今回の趣旨です。ただし、原子炉やヒートパイプの温度は、回路ネットワークで扱えない情報のため、タンクに貯蔵された蒸気の量で温度の代替とします。つまり、蒸気の貯蔵量が一定以下になったときに、燃料棒を1個だけ投入する制御を、回路ネットワークで行います。

原子力発電の全体レイアウト

まず、解説のために使用する原子力発電のラインを紹介します。

f:id:yayoi-tech:20190917164825j:plain
全体図

原子炉は4基、熱交換器、蒸気タンク、蒸気タービンは32基づつです。

ポイントは全体のうち左下の1/4のエリアです。

f:id:yayoi-tech:20190917165004j:plain
原子力発電の左下

32個ある蒸気タンクのうち、左下の8個のタンクにレッドケーブルを繋げています。これは、蒸気の貯蔵量を監視するものです。今回の原子力発電はレイアウトが対称的なので、蒸気の貯蓄や消費も、ほぼ均等に行われます。左下の8個のタンクを監視することで、全体の量もほぼ正確に監視できます。

燃料棒の投入制御回路の仕様

f:id:yayoi-tech:20190917165112j:plain
燃料棒投入の制御回路

定数回路とランプはテスト用のものです。

条件回路1

条件回路1は、燃料棒を投入する条件となる蒸気の閾値を決めています。ひとつのタンクの容量は25Kなので、8個の合計は200Kになります。8個の蒸気の合計が25K(タンク1個分)以下*1になったとき、蒸気の不足を意味する、信号「蒸気」を1個送信します。蒸気の閾値は、低すぎると消費に供給が追い付かず、高すぎると供給過多により燃料棒を無駄にする可能性があります。蒸気の閾値は消費電力、熱交換器、蒸気タンク、蒸気タービンのバランスによって調整すると良いでしょう。

条件回路2

条件回路2は、クロック回路の一部です。条件回路1から蒸気の不足を意味する信号「蒸気」を1個受け取ったとき、信号「T」を入力された個数だけ出力します。条件回路2の入力には、自分自身の出力と、条件回路3の出力が繋がっています。

条件回路3

条件回路3も、クロック回路の一部です。条件回路2から受け取った信号「T」が 5以下*2だった時、信号「T」を1個だけ出力します。

算術回路1

算術回路1は、最終的に燃料棒投入を行うインサータを制御する信号を送信します。つまり、蒸気の不足を意味する信号「蒸気」と、条件回路3が出力した信号「T」を、同時に受け取ったとき(両方とも真だったとき)、インサーターを起動する信号「燃料棒」を送信します。

動作確認

f:id:yayoi-tech:20190917165516g:plain
オンにしたときに一瞬だけランプが光る

テスト用に定数回路を使用していますが、この挙動は蒸気が不足したときのものと同じになります。ランプが光っているとき、インサーターも動くので、インサーターを動かす命令はごく一瞬であることが分かります。また、オフにしたときはランプは光りません。

解説

1ティック目。蒸気が25Kを下回ったとき、条件回路1が信号「蒸気」を1個送信します。条件回路2は、「蒸気」を1個受け取ったとき、入力されている信号「T」を入力個数分だけ出力します。このとき、条件回路2は、信号「T」をどこからも受け取っていないので、信号「T」は出力されないこと(T=0)を意味します。条件回路2の出力は、自分自身の入力(受け取るのは2ティック目)と、条件回路3の入力に送信されます。条件回路3では、信号「T」が5未満のとき、信号「T」を1個だけ出力します。条件回路2は信号「T」を出力しなかった(T=0)ので、条件回路3は信号「T」を1個だけ出力します。条件回路3の出力は、条件回路2の入力(受け取るのは2ティック目)と、自分自身の入力(受け取るのは2ティック目)と、算術回路1に送信されます。算術回路1は条件回路1が出力した信号「蒸気」と、算術回路3が出力した信号「T」の論理和(AND)を取り、インサーターに信号「燃料棒」を送信します。インサーターは信号「燃料棒」を受け取ったときだけ有効になるため、チェストに入った燃料棒を原子炉に投入します。

2ティック目。蒸気が補充されるのにはしばらく時間がかかるため、条件回路1はしばらくの間は信号「蒸気」を送信し続けます。その間、条件回路2は入力された信号「T」を、そのまま出力し続けることになります。2ティック目では、条件回路2は1ティック目で出力された自分自身の出力(つまりT=0)と、1ティック目で出力された条件回路3の出力(T=1)の合計であるT=1を受け取り、それ(T=1)をそのまま出力します。条件回路3が受け取る信号は、条件回路2が出力した信号「T=1」と、1ティック目で自分自身が出力した信号「T=1」の合計である「T=2」です。条件回路3の条件を満たすため、条件回路3は信号「T=1」を出力します。

3~5ティック目。条件回路2は1ティックごとにTを1づつ増幅します。1~5ティック目までの間、インサーターに対して有効になるよう信号を送りづけます。

6ティック目。条件回路3が受け取る信号は、5ティック目の自分自身の出力「T=1」と、条件回路2の出力「T=5」の合計、つまり「T=6」になります。これは条件回路3の条件に当てはまらないので、ここにきて初めて条件回路3は信号「T」を出力しない(T=0を出力する)ことになります。算術回路1は信号「蒸気」を受け取りつつも信号「T」を受け取らなくなるので、信号「燃料棒」の出力を停止します。

6ティック目以降。蒸気が不足している間は、条件回路2が入力された信号「T=6」を出力し続け、条件回路3は信号「T=0」を出力しづけます。やがて、蒸気が充足すると、条件回路2には信号「蒸気」が届かなくなるため、条件回路2は入力された信号「T=6」を出力するのを停止します。条件回路3は信号「T=0」を受け取るため、再び、信号「T=1」を出力しますが、算術回路1には信号「蒸気」が届かなくなるので、インサーターは起動しません。

今回の制御ではクロック回路を使用しています。以下の記事もあわせてご参考ください。

yayoi-tech.hatenablog.com

f:id:yayoi-tech:20190917171944p:plain

*1:画像では24K未満になっています

*2:画像では5未満になっています