ドナドナされるプログラマのメモ

Windows用アプリのプログラミングメモ

Factorio スペース・エクスプローラー日記 113 LTNの導入

f:id:donadonasan:20210116215342p:plain

 LTNの導入

qeloさんのLTN説明動画を参考に、LTNを導入してみる。

LTN説明動画:

www.youtube.com

LTN説明補足:

www.youtube.com

LTNは本体+ヘルパーmodを入れる。

本体:LTN - Logistic Train Network 1.16.0

LTNネットワーク内シグナルの読み取り:LTN Content Reader 0.3.8

LTN設定GUI : LTN Combinator for 0.18, 1.0 & 1.1 (作者:ProfessorHicman)

Logistic Train Stop Output: 積み込み後または積み下ろし後の予定数量、列車位置情報、列車ネットワーク情報

Logistic Train Stop Input: 様々な設定。LTN Combinatorによりまとめて設定可能だが、手動でもOK

以下のような線路を試しに作って味見してみた。

f:id:donadonasan:20210411124513p:plain

LTN味見線路

また、すべてのLTN駅には駅と隣合わせにLTN Combinatorを設置した。以下、LTN Combinatorがあることを前提に説明する。

積み込み駅の基本設定

貨物を積み込む駅のことを、以下積み込み駅と呼ぶ。LTNの駅を積み込み駅とするには、LTN Combinatorの設定画面にてProviderを選択する。

積み込み駅では、以下が必須である。

  • LTN Combinatorからの出力をLTN Inputに入力する
  • LTNに在庫がいくつあるか知らせる
  • 所定数量以上積み込まないためのインサータ制御

LTN Combinatorからは駅に関する設定値が出力されているので、これをそのままLTN Inputに入れればよい。

LTNに在庫がいくつあるか知らせるには、チェストなどの出力をLTN Inputへつなげればよい。LTNは、LTN Inputに入力された信号をもとに積み出す列車を手配する。

次にインサータであるが、LTNは貨車内の貨物数量が変化している間は列車を発車させないようだ。そのため、インサータが稼働している限りは貨車が満杯になるまで列車が発車しない。そのような運用でも構わないことが多いが、ちゃんと制御したい場合は要求された数量だけ貨車に積み込み終わったらインサータを停止させる必要がある。これを実現するためにLTNはLTN Outputから要求された数量(正確には、積み込み完了時の予定積載数量)を出力してくれており、搬出先ごとに数量が異なる場合でもこれを使うことで対応可能だ。すなわち、駅から出力した貨車内の貨物数量に-1をかけて、これにLTN Outputより出力される要求された数量を足す。インサータにはこの足し合わせた値を入力し、これが0より大ならインサータが動作するようにすれば要求された数量だけ積み込む施設の出来上がりである。

なお、動作の原理上スタックインサータ等の複数個同時に掴むインサータを使うと、要求された数量よりわずかに多く積み込むことがある。これを避けるには、スタック数を1に設定したインサータを使えばよい。

更に、フィルタインサータを使うことで複数種類の貨物を単一の駅から積み出すことも可能だ。LTN Outputからの出力信号は積み出す貨物の信号となっているので、前述の構成でのインサータをフィルタインサータとするだけで、要求された貨物を要求された数量だけ積み積み込む施設となる。

f:id:donadonasan:20210505200937p:plain

LTN積み込み駅設定

積み込み駅の設定には、他にも以下の信号がある。

  • Network ID:駅が所属する列車ネットワークのID。複数のネットワークに所属可能とするため、ネットワーク1: 1, 同2: 2, 同3: 4, 同4: 8・・・同32: 2,147,483,648となっている。ネットワーク1と3に同時に所属するには、1+4=5とする。Encoded Network IDの左にあるボタンをクリックすれば、GUIで設定できるので前記面倒な計算は不要。

    f:id:donadonasan:20210505214234p:plain

    Network IDはGUIで設定可能
  • Threshold:貨物を積み出すために最低限溜まってなければならない数量(しきい値
  • Priority:優先度
  • Minimum Train Length:この駅に呼び寄せる列車の最小編成数(機関車+貨車)
  • Maximum Train Length:この駅に呼び寄せる列車の最大編成数(機関車+貨車)
  • 駅出力:別項目にて説明する。

積み下ろし駅の基本設定

貨物を列車から積み下ろす駅のことを、以下では積み下ろし駅と呼ぶ。LTNの駅を積み下ろし駅とするには、LTN Combinatorの設定画面にてRequestorを選択する。

積み下ろし駅には以下が必須である。

  • LTN Combinatorからの出力をLTN Inputに入力する
  • 要求する貨物の種類及び数量の設定

LTN Combinatorからは駅に関する設定値が出力されているので、これをそのままLTN Inputに入れればよい。

要求する貨物の種類及び数量を設定するには、貨物の種類の信号(鉄鉱石など)に対し必要な数量に-1をかけたものをLTN Inputに入力すればよい。例えば、鉄鉱石が3000必要ならば-3000をLTN Inputに入力する。入力した数値は、LTNにより列車が手配された瞬間から積み下ろし完了まで無視されるようで、気にせずLTN Inputへ入力しっぱなしとしてよい。

要求する貨物の種類及び数量を設定する典型的な構成は、定数回路・比較回路・算術回路によるものである。定数回路には列車を手配するしきい値を設定する。埋立地が100未満のときに列車を手配するなら、定数回路に埋立地-100を設定する。

そして定数回路とチェストの出力を比較回路の入力に接続することで信号を足し合わせ、それぞれ0より小さいかを比較する。0より小さい(=しきい値未満となった)ならば、比較回路からはその資源の信号について1を出力させる。

比較回路の出力を算術回路に入力し、補充数量の-1倍する。例えば300個補充したい場合は、-300倍する。そして最後に、算術回路の出力をLTN Intputへと入力する。

なお、この例ではコピペを容易とするためにしきい値を定数回路で設定しているが、定数回路を省き比較回路の中に直接書いてもよい。

なお、LTN Stop Outputからは積み下ろし後の貨物数量が出力される。要求した貨物については全量積み下ろしが前提なのか、要求量より多く積んでいても0が出力される。一方、要求していない貨物についてはOutputからその貨物の信号および数量が出力されるので、これをフィルタインサータに接続し、フィルタをブラックリストとすれば要求していない貨物の積み下ろしを防ぐことができる。

f:id:donadonasan:20210505193303p:plain

LTN積み下ろし駅設定

車庫の設定

LTNで運用する列車の待機場所を以下では車庫と呼ぶ。LTNの駅を車庫とするには、LTN Combinatorの設定画面にてDepotを選択する。車庫はマップ内に1箇所以上必要である。車庫の数は1個でもよいが、工場の規模が大きくなると車庫からの発車頻度が高くなり詰まりやすくなる。このような場合は車庫の数を増やしたほうがよい。ただし、LTNは車庫と目的地の間の距離を考慮できない(Factorioの制約が原因?)ことに留意。

車庫には以下が必須である。

  • LTN Combinatorからの出力をLTN Inputに入力する

LTN Combinatorからは駅に関する設定値が出力されているので、これをそのままLTN Inputに入れればよい。

f:id:donadonasan:20210505192324p:plain

車庫の設定

 共通項目

LTN Outputからは、駅に停まっている列車の車両位置に関する情報も出力される。車両位置に関する情報は車庫・積み込み駅・積み下ろし駅いずれでも共通である。車両位置は、車両の種別および種類ごとに出力される。例えば、機関車と機関車の一種であるF.A.R.L.がそれぞれ先頭および2両目にいた場合は、赤い背景の機関車種別信号と, 黒い背景の機関車信号, 黒い背景のF.A.R.L.信号が出力される。種別信号はそれに属するものすべてを表す。この例では機関車とF.A.R.L.の両方を含む信号となる。それぞれの信号の数値は編成内における該当車輌の位置を表す。先頭は1, 2番目は2, 3番目は4, 4番目は8・・・となっている。そして例えば1番目と4番目に同じものがいた場合、信号は両者(1, 8)の和である9となる。先程の例だと、機関車が1、F.A.R.L.が2、そして機関車種別信号は1+2で3となる。下の画像の例では先頭が機関車、その後ろに貨車が1という編成なので貨車種別および貨車信号がともに2,機関車種別および機関車信号が1となっている。

なおFactorioではInt32までしか扱えないため、信号に表すことができるのは32両目の数値までとなる。

f:id:donadonasan:20210506014229p:plain

LTN Outputからの出力信号

f:id:donadonasan:20210506014406p:plain

信号種別

今日はここまで。