MCMパーツ製造ユニット
https://scrapbox.io/files/66f7f17bea7e2b001c2ad358.png
1/4パーツ製造ラインは上から右上・右下・左下・左上担当となっており、左が上流(下層担当)で右が下流(上層担当)。
一番右のパーツ製造ユニットが最上層担当ユニットで、ピン押しユニットに繋っている。
https://scrapbox.io/files/66f17c96d609ae001cfc2e24.png
入出力信号
5種類の信号をユニット間でやり取りする。信号1~3は下流から上流へ送信し、信号4~5は上流から下流へ送信する。
信号1:製造図形信号
受信した図形信号の最上層がユニットの担当層で、その右上部分が担当部位
右上以外は別の製造ラインで作る
下層は上流ユニットに下層図形の信号を渡して作ってもらう
信号2:製造ライン番号 mod 2
ラインごとの固定値
担当部位が隙間かつ上層に結晶がある場合のサポート材の切断の仕方を制御する
右上・左下担当ラインなら0、右下・左上担当ラインなら1をピン押しユニットから渡す
信号3:上層結晶フラグ
下流(上層担当)で結晶を作る事になっている場合に1とする
担当層が隙間やピンの時の動作制御に使用する
信号4:ピンカウントフラグ
ピン押しユニットでピンを付け足す必要がある時、ピン数え上げ対象の層を担当するユニットで1とする
上層に結晶がある && 担当層が最下層 && 担当部位==ピンの時に1を出力
下流で担当部位がピンではなくなった所で0とする
信号5:ピン数
ピンカウントフラグが立っている間、ピンを数え上げる
ピン押しユニットは最上層担当パーツ製造ユニットから受け取るピン数信号を元にして受領図形をピン押し機に通す回数を決める
信号では整数を扱えるものの数値演算装置がないので、図形信号の積層数でカウントする事にした
仮想積層機がインクリメント装置となる
送受信値表 (横幅が足りないため入力と出力で行を分けた)
table:信号リスト
信号# ポート 内容 初期値 値
入力1 右上 製造図形信号 統合ユニットからの送信値 下流ユニット(右隣)の出力信号1
出力1 左上 製造図形信号 - 入力1をデパレタイザーに通して得た下層図形信号
入力2 右上 製造ライン番号 mod 2 0 or 1 下流ユニット(右隣)の出力信号2
出力2 左上 製造ライン番号 mod 2 - 入力2をそのまま出力
入力3 右上 上層結晶フラグ null 下流ユニット(右隣)の出力信号3
出力3 左上 上層結晶フラグ - 入力3 || (担当部位の形状==結晶)
入力4 左下 ピンカウントフラグ null 上流ユニット(左隣)の出力信号4
出力4 右下 ピンカウントフラグ - 担当部位の形状==ピン && (入力4 || (出力1==null && 入力3==1))
入力5 左下 ピン数 null 上流ユニット(左隣)の出力信号5
出力5 右下 ピン数 - ※ 表外で解説
※出力信号5の算出方法 (疑似コード)
code:signal5-output.rb
# 出力ピン数(出力信号5)の計算
if not 出力ピンカウントフラグ
# 入力ピン数をそのまま出力
出力ピン数 = 入力ピン数
else
if 入力ピン数 == null
# 初期値としてピン単層図形信号を出力
出力ピン数 = 'P-P-P-P-'
else
# 入力5にピン単層図形を積み上げて出力
出力ピン数 = stack(入力ピン数, 'P-P-P-P-')
end
end
内部バス
2Fに内部バスとしてワイヤを5本敷設し、製造ライン各所の制御に使う値を流すようにした。
なお入出力信号のためのワイヤは基本的に3Fを通している。
https://scrapbox.io/files/66f8bcce423af6001c249ef7.png
上から1本目: 担当部位の形状信号
信号入力1受領図形信号を図形解析機にかけて形状信号を取り出すとCu------のような1/4形状となる。これを4倍化加工してCuCuCuCuのように原料図形と同じ形にした形状信号を流す。
担当部位の色信号は内部バスから離して1Fに通している
2本目: 結晶フラグ
担当部位が結晶なら1 そうでなければ0
3本目: ピンフラグ
担当部位がピンなら1 そうでなければ0
4本目: 上層結晶フラグ
信号入力3の値をそのまま流す
5本目: 最下層フラグ
ユニットが最下層担当 (出力信号1==null) なら1 そうでなければ0
以上入出力信号5種と内部信号5種+αを使用して製造ラインの制御を行う。
図形製造過程の疑似コード
code:make-parts.rb
if not 入力製造図形信号 || 出力ピンカウントフラグ == 1
# 受信した製造図形信号がnull もしくは ピンカウント中なら何もしない
return
end
# 担当層図形製造 (tは担当層図形でuは担当部位図形)
if 結晶フラグ == 1
t = サポート材原料
else if 担当部位形状 == null
# 隙間
t = サポート材原料
if 上層結晶フラグ
# 上層に結晶がある場合は破壊用結晶を仕込むためにサポート材を加工する
t = rotate(cut_left(rotate(t, -90)), 90)
if 製造ライン番号 mod 2 == 1
t = rotate(t, -90)
end
end
else
if ピンフラグ == 1
u = split4(ピン原料)
else
u = split4(paint(select(図形原料, 担当部位形状), 担当部位色))
end
# 4分割した図形原料をサポート材と合成
t = stack(サポート材原料, u)
end
# 下層図形の上に積層
if 最下層フラグ == 1 || (入力ピンカウントフラグ == 1 && 出力ピンカウントフラグ == 0)
# 最下層担当 もしくは ピンカウントフラグがon->offに切り替わった所なら
# 積層工程をスキップして担当層図形をそのまま次工程へ流す
s = t
else
s = stack(上流ユニット.送出図形, t)
end
if 結晶フラグ == 1
# 担当部位が結晶の場合のみ結晶製造機に通す
# 上層に結晶のある隙間の場合の破壊用結晶は製造は上層での結晶製造時に為される
s = crystallize(s, 担当部位色)
end
送出図形 = s