こんにちは、よっさんです。
今日は原子力発電に必要なウラン235を生成するためのkovarex濃縮プロセスについて、自分なりに考えたライン1を提案してみたいと思います。この生産ラインを試行錯誤するうえでわかった注意点等について、解説していきたいと思います。
kovarex濃縮プロセスとは
すでにご存じの方も多いと思いますので、ご存じの方は次の章から読んでいただいても良いかもしれません。
基本情報
kovarex濃縮プロセスとはウラン235を増殖させるための処理です。インプットとして、ウラン235を40個、ウラン238を5個必要とし、プロセス後はウラン235を41個、ウラン238を2個生成します。
この処理少し特殊で、数字だけ見れば、ウラン238 3個をウラン235 1個に変換しているだけなのですが、触媒用に同じ部品を多数入力して出力しています。この触媒の扱い方が、生産ライン作成を難しくする要因になっています。
生産ライン
作成したラインがこちらになります。次の章にて、内容解説いたします。また、ブループリントも用意しましたので、適宜使用してもらえると幸いです。
複数台接続
1ブロック分を左右反転して縦につなげていけば複数台で生産可能です。上から下のラインですが、対象性があるので回転してもらえればどの向きでも使用できます。中型電柱は2つ置いていますが、上と下の電柱は2ライン以降重ねるときは重複させることが可能です。
ブループリント
・1モジュール分
・4モジュール分(ライン構成)
解説
それでは内容について解説したいと思います。
ウラン235は上限付きカウンタで40個を管理
まずはウラン235側の処理です。ウラン235は40個を入力し、41個を出力します。つまり出力された41個のうち40個は、またkovarex濃縮プロセスのためにインプットし直さなければなりません。
間違って、40個全部を次の処理(燃料棒作成等)に渡してしまうと、また40個を作り直すことになります。
、、、とはいえ、このようなミスは原子力発電に取り掛かるレベルの工場長の方であれば起こす可能性は少ないと思います。悩ましいのは、ちょうど”40個”をフィードバックすることです。
遠心分離機や組立機は2回分の組立材料を保持してしまいます。なので、成り行きで部品を戻し、遠心分離機に入らなくなったら搬出する方法だけだと、1つの遠心分離機に120個のウラン235が必要になってしまいます。
それでもウラン235が大量に生成されるのを待てば問題はないのですが、なんとか40個だけでフィードバックしたい、、、そこで、上限付きのカウンタ回路を用いて管理するようにしました。
上限付きカウンタ回路についての動作原理
(論理回路のややこしい話になるので、読み飛ばしていただいても大丈夫です。ブループリントにはこれらの設定も反映されています。)
カウンタは算術回路や条件回路を用いることで作ることができます。今回は上限付きで構成したので算術回路を使用しています。
説明のために、簡易的に下記の構成で説明します。このときのインサータの設定は”パルス”になっていることにご注意ください。これはインサータがウラン235を掴んだ回数を数え、回数が10回目担ったときに、カウンタ値を0に戻す回路です。
カウンタは算術回路の入力と出力を繋いでいることがポイントです。こうするとなぜカウンタになるのかをこれから説明したいのですが、その前段として、factorioの世界では”tick”という単位で演算処理が行われていることをご存知でしょうか?
算術回路の演算に限らず、factorioの中ではtickという時間の単位でゲーム内の処理制御が行われています。具体的な時間は1/60秒(≒16.7ms)です。
ですので、上記の構成を元に各tickでどんな制御をしているのかを順を追って説明したいと思います。
①まずは一番最初ですが、赤ケーブル上にはウラン235は無いため、ケーブル上全てのウラン235は”0”です。算術回路も”0″を出力します。
②ここで、あるtickでインサータがウラン235を掴みます。ここでケーブル上のウラン235は合計で”1″になります。ただし、この情報を用いて算術回路が計算するのは次のtickです。このtickでは”1″に切り替わる前の”0”の情報を用いて計算を行います。
③そして次のtickで算術回路はインサータからの入力値”1″に対し演算をします。演算式は、1(入力) % 10 です。この”%”という演算子ですが、これは割ったあまりを出力するという演算子です。1を10で割った余りで算術回路は”1″を出力します。
ここで同時にインサータはこのtickでウラン235を1から0に切り替えます。これはパルス設定にしたためで、パルス設定の場合入力に変化のあった初回の1tickのみ、その情報を伝達します。インサータが部品を掴んでいる時間はもっと長いのですが、パルス設定をしたことで次のtickでこの情報は消滅します。
④そして次のtickに到達します。ここで次の計算が始まります。
前のtickでインサータは0に、算術回路は0から1に切り替わっています。よってケーブル全体のウラン235の個数は”1”になります。これが算術回路に入力(フィードバック)され、同じ値が出力し保持されます。逆にフィードバックしていないと、このtickで0に戻ってしまいます。ここでフィードバックしている効果が現れます。
⑤更に時間が経ち、インサータは次のウラン235を掴みます。ここで②、③の処理が繰り返され、回路上のウラン235は2になります。
以上により0→1→2→3、、、とインサータの掴んだウラン235を記憶しておくことが可能なのです。
ここまで読んでいただければ、算術回路に”% 10”と設定している意味もおわかりかと思います。カウンタが加算され、ウラン235の値が10になったとき算術結果は、、1余り0、よってここで出力は0に戻されます。このカウンタは狙い通り0から9を循環してカウントする上限付きカウンタになっています。
具体的なkovarex処理
kovarex濃縮プロセスに戻ります。今回はこの上限付きカウンタ回路を遠心分離機からの出力、フィードバック、そして搬送ベルトへの搬出の3つのインサータに接続しています。なお、遠心分離機からの出力インサータはスタックフィルタインサータを使用し、ウラン235だけを出力するようにしています。回路条件としては、
- ①出力、②入力用インサータ:ウラン235 が81未満で動作
- ③搬出用インサータ:ウラン235が82以上で動作
- ④ウラン238用フィルタインサータ:回路設定なし。フィルタのみ。
- ⑤ウラン238入力インサータ:設定不要
としています。出力されるウラン235が41個、フィードバックに必要なウラン235が40個なのではじめの81回はこの2つのインサータを作動させます。81個目のウラン235が吐き出された時点でこの2つのインサータは無効になり、逆に搬出のインサータが有効になります。そしてこの最後の1個を搬出のインサータが搬出ラインに運んでカウンタは0に戻ります。
また、②入力用インサータのフィルタスタック数を“10”にしています。その理由は、間違ってフィードバック用のインサータが41個めのウラン235を遠心分離機に入れないためです。例えばスタック数を12個に設定してしまうと、12→24→36→48と40を飛び越えて41個目を間違えて掴んでしまいます。そのため、40で割り切れる10を設定しました。
ウラン235側の搬出ラインが満杯になってもカウンタが乱れない
詳細は割愛しますが、一般的に生産量が多いと搬出ラインがその部品で埋まってしまい組立機が止まるケースがあると思います。色々と試行錯誤してたときに、例えばカウンタがずれる等が発生し、部品つまりが解消されても、生産が開始できない問題が発生しました。また、生産開始できても遠心分離機内にストックが溜まってしまうことも発生しました。
今回の構成は、そのような場合でも部品を遠心分離機内にストックせず待機して生産再開できるような構成を考えました。実際に動作確認済です。
それでもカウンタ値がおかしくなった場合
とはいえ、不測の事態でカウンタ値がおかしくなる可能性があるかもしれません。その場合は、濃縮プロセス実施中に算術回路の計算を % 82から % 1に一旦変更して、また戻してください。要はどんな数でも1で割った余りは0ということで結果的に出力を0にリセットをするということをしています。
ウラン238は分配器で確実に排出
kovarex濃縮プロセスで意外と陥りやすいのが、ウラン238の処理です。2個排出しなければならないというのがネックで、搬送ベルトが満杯でこの2個を排出できずにkovarex濃縮プロセスが止まるという問題が発生します。とはいえ5個入力し2個出力するということは、どうしても消費する3個を別から供給しつづけなければなりません。
そのため、分配器を挿入してこのウラン238を排出する方法をとりました。分配器は入力を均等に出力する性質があるので、たとえ満杯でも排出可能です。遠心分離機が5個消費するので排出する場所はその手前に置いておけば、理屈的には同じ遠心分離機で消費されることになります。
また、インサータの搬出・搬入を考慮して搬送ベルトを敷いています。これはどういうことかと言うと、インサータは横向きの搬送ベルトに対し搬出搬入をこのように行います。
搬出 (搬送ベルトに部品を乗せる) | インサータから見て奥側に部品を乗せる。 搬送ベルトの奥側が詰まっている場合は待機する。(内側に部品は置かない) |
搬入 (搬送ベルトから部品をもらう) | インサータから見て内側から優先して部品を掴む。 部品がない場合は、奥側を掴む。 |
つまり、搬入と搬出の場所が異なるため、仮に搬入のインサータの前段に搬出のインサータを置いても搬出が詰まる可能性があるということです。
そのために、搬出部品を搬送ベルトの内側にして搬出するという部分を作成して排出しているのです。
最後に
今回は非常に長文になってしまい申し訳ありません。(これでも頑張って削除したのですが。。)いかがだったでしょうか?自己流で作ったので、読まれる方によっては改善点も多々あるかと思います。作成したブループリントを使っていただければ幸いです、また改善案などありましたら遠慮なくご連絡いただけますと幸いです。ではまた!factorioやっていきましょう。
- もしすでに同じ内容を考案し、提示されている方がいましたら申し訳ありません。ご一報いただけますと幸いです。 ↩︎