๐งช [Plant Simulation Study #05] – Xbox ์ปจํธ๋กค๋ฌ๋ก Plant Simulation ์ ์ดํ๊ธฐ (Socket ํต์ ํ์ฉ)
๐ฌ ๊ฐ์
์ด๋ฒ ๋ฐ๋ชจ์์๋ Plant Simulation๊ณผ Xbox ๊ฒ์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐ๋ํด๋ณด์์ต๋๋ค.
๋ชฉํ๋ ๋จ์ํ ์๋ฎฌ๋ ์ด์
์ ๋ณด๋ ๊ฒ์ด ์๋๋ผ, ์ธ๋ถ ์ฅ์น๋ฅผ ํตํด ์ค์๊ฐ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ ์ดํด๋ณด๋ ๊ฒ์
๋๋ค.
์ด๋ฅผ ํตํด ์ฌ์ฉ์๋ ์๋ฎฌ๋ ์ด์
๋ชจ๋ธ์ ๋ณด๋ค ์ธํฐ๋ํฐ๋ธํ๊ณ ๋์ ์ผ๋ก ์คํํ ์ ์์ต๋๋ค.
- ์ ์ ๋ชฉ์ : ์ธ๋ถ ๋๋ฐ์ด์ค๋ฅผ ํตํ ์ค์๊ฐ ์ ์ด ํ ์คํธ
- ์ฌ์ฉ ๊ธฐ์ : Python + Xbox Controller + Socket ํต์ + Plant Simulation
- ์ฌ์ฉ ๊ธฐ๋ฅ: Plant Simulation์ Method + SocketClient ๊ฐ์ฒด ํ์ฉ
๐ ๏ธ ์๋ฎฌ๋ ์ด์ ๊ตฌ์ฑ ๋ฐ ํต์ ๊ตฌ์กฐ
์ ๋ ฅ ์ฅ์น | Xbox ์ปจํธ๋กค๋ฌ (Python์ผ๋ก ์ ๋ ฅ๊ฐ ์์ ) |
์ค๊ฐ ์ฒ๋ฆฌ | Python์์ ์์ผ ์๋ฒ ์ด์, ์ข์ฐ/์ํ ๊ฐ ์ฒ๋ฆฌ |
์๋ฎฌ๋ ์ด์ | Plant Simulation์์ SocketClient๋ก Python ์๋ฒ์ ์ฐ๊ฒฐ, ๋ฐ์ดํฐ ์์ ํ ๊ฐ์ฒด ์ด๋ |
์ ์ด ๋์ | MU ๋๋ 3D ๊ฐ์ฒด์ ์์น, ์๋ ๋ฑ ์ค์๊ฐ ์ ์ด ๊ฐ๋ฅ |
๐ง ์ฃผ์ ๊ตฌํ ๋ฐฉ์
- Python์์ pygame ๋๋ inputs ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ Xbox ์ปจํธ๋กค๋ฌ ๊ฐ์ ์์ ํฉ๋๋ค.
- ํด๋น ๊ฐ์ Socket ํต์ ์ ํตํด ๋ฌธ์์ด๋ก Plant Simulation์ ์ ์กํฉ๋๋ค. server ์ ๋ณด๋ฅผ ์์ฑํฉ๋๋ค.
- Plant Simulation์ Method์ SocketClient ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๊ฐ์ ๋ฐ์ ์ฒ๋ฆฌํฉ๋๋ค.
// writes the value to the global variable ’MessageReceived’
if strLen(SocketMessage) = 0
MessageReceived := to_str(strAscii(SocketMessage)); // byte received
else
MessageReceived := to_str(SocketMessage); // string received
end
- ์์ผ๋ฐ์ดํฐ๋ฅผ ์ด๋๋ฐ์ดํฐ๋ก Plant Simulation ๋ด์์ ๊ตฌ๋
-- param attribute: string, oldValue, newValue: string
-- param attribute: string, oldValue: string
param newValue: string
switch newValue
case "UP,1"
if ํ์ฌ๋ก๋ด = void or ํ์ฌ_์ ์ด์ถ = ""
messagebox("๋ก๋ด๊ณผ ์ ์ด์ถ์ ๋ค์ ํ์ธํด์ฃผ์ธ์.")
return
end
switch ํ์ฌ_์ ์ด์ถ
case "J1"
ํ์ฌ๋ก๋ด.J1 := ํ์ฌ๋ก๋ด.J1 + ์ด๋๊ฐ
var J1_num := ํ์ฌ๋ก๋ด.J1
ํ์ฌ๋ก๋ด._3D.getobject("J1").moveTo(J1_num)
case "J2"
ํ์ฌ๋ก๋ด.J2 := ํ์ฌ๋ก๋ด.J2 + ์ด๋๊ฐ
var J2_num := ํ์ฌ๋ก๋ด.J2
ํ์ฌ๋ก๋ด._3D.getobject("J1").getobject("J2").moveTo(J2_num)
case "J3"
ํ์ฌ๋ก๋ด.J3 := ํ์ฌ๋ก๋ด.J3 + ์ด๋๊ฐ
var J3_num := ํ์ฌ๋ก๋ด.J3
ํ์ฌ๋ก๋ด._3D.getobject("J1").getobject("J2").getobject("J3").moveTo(J3_num)
case "J4"
ํ์ฌ๋ก๋ด.J4 := ํ์ฌ๋ก๋ด.J4 + ์ด๋๊ฐ
var J4_num := ํ์ฌ๋ก๋ด.J4
ํ์ฌ๋ก๋ด._3D.getobject("J1").getobject("J2").getobject("J3").getobject("J4").moveTo(J4_num)
case "J5"
ํ์ฌ๋ก๋ด.J5 := ํ์ฌ๋ก๋ด.J5 + ์ด๋๊ฐ
var J5_num := ํ์ฌ๋ก๋ด.J5
ํ์ฌ๋ก๋ด._3D.getobject("J1").getobject("J2").getobject("J3").getobject("J4").getobject("J5").moveTo(J5_num)
case "J6"
ํ์ฌ๋ก๋ด.J6 := ํ์ฌ๋ก๋ด.J6 + ์ด๋๊ฐ
var J6_num := ํ์ฌ๋ก๋ด.J6
ํ์ฌ๋ก๋ด._3D.getobject("J1").getobject("J2").getobject("J3").getobject("J4").getobject("J5").getobject("J6").moveTo(J6_num)
end
case "UP,-1"
if ํ์ฌ๋ก๋ด = void or ํ์ฌ_์ ์ด์ถ = ""
messagebox("๋ก๋ด๊ณผ ์ ์ด์ถ์ ๋ค์ ํ์ธํด์ฃผ์ธ์.")
return
end
switch ํ์ฌ_์ ์ด์ถ
case "J1"
ํ์ฌ๋ก๋ด.J1 := ํ์ฌ๋ก๋ด.J1 - ์ด๋๊ฐ
var J1_num1 := ํ์ฌ๋ก๋ด.J1
ํ์ฌ๋ก๋ด._3D.getobject("J1").moveTo(J1_num1)
case "J2"
ํ์ฌ๋ก๋ด.J2 := ํ์ฌ๋ก๋ด.J2 - ์ด๋๊ฐ
var J2_num1 := ํ์ฌ๋ก๋ด.J2
ํ์ฌ๋ก๋ด._3D.getobject("J1").getobject("J2").moveTo(J2_num1)
case "J3"
ํ์ฌ๋ก๋ด.J3 := ํ์ฌ๋ก๋ด.J3 - ์ด๋๊ฐ
var J3_num1 := ํ์ฌ๋ก๋ด.J3
ํ์ฌ๋ก๋ด._3D.getobject("J1").getobject("J2").getobject("J3").moveTo(J3_num1)
case "J4"
ํ์ฌ๋ก๋ด.J4 := ํ์ฌ๋ก๋ด.J4 - ์ด๋๊ฐ
var J4_num1 := ํ์ฌ๋ก๋ด.J4
ํ์ฌ๋ก๋ด._3D.getobject("J1").getobject("J2").getobject("J3").getobject("J4").moveTo(J4_num1)
case "J5"
ํ์ฌ๋ก๋ด.J5 := ํ์ฌ๋ก๋ด.J5 - ์ด๋๊ฐ
var J5_num1 := ํ์ฌ๋ก๋ด.J5
ํ์ฌ๋ก๋ด._3D.getobject("J1").getobject("J2").getobject("J3").getobject("J4").getobject("J5").moveTo(J5_num1)
case "J6"
ํ์ฌ๋ก๋ด.J6 := ํ์ฌ๋ก๋ด.J6 - ์ด๋๊ฐ
var J6_num1 := ํ์ฌ๋ก๋ด.J6
ํ์ฌ๋ก๋ด._3D.getobject("J1").getobject("J2").getobject("J3").getobject("J4").getobject("J5").getobject("J6").moveTo(J6_num1)
end
case "A,1"
if ํ์ฌ๋ก๋ด.empty = false
else
pick.mu.move(ํ์ฌ๋ก๋ด)
end
case "B,1"
if ํ์ฌ๋ก๋ด.empty = true
else
ํ์ฌ๋ก๋ด.mu.move(place)
end
case "X,1"
switch ์ด๋๊ฐ
case 1
์ด๋๊ฐ := 2
case 2
์ด๋๊ฐ := 3
case 3
์ด๋๊ฐ := 5
case 5
์ด๋๊ฐ := 10
case 10
์ด๋๊ฐ := 30
case 30
์ด๋๊ฐ := 90
case 90
์ด๋๊ฐ := 1
end
case "Y,1"
switch ํ์ฌ_์ ์ด์ถ
case ""
ํ์ฌ_์ ์ด์ถ := "J1"
case "J1"
ํ์ฌ_์ ์ด์ถ := "J2"
case "J2"
ํ์ฌ_์ ์ด์ถ := "J3"
case "J3"
ํ์ฌ_์ ์ด์ถ := "J4"
case "J4"
ํ์ฌ_์ ์ด์ถ := "J5"
case "J5"
ํ์ฌ_์ ์ด์ถ := "J6"
case "J6"
ํ์ฌ_์ ์ด์ถ := "J1"
end
end
๐ ์คํ ๊ฒฐ๊ณผ ๋ฐ ํ์ฉ ๊ฐ๋ฅ์ฑ
์ด ํ๋ก์ ํธ๋ ๋จ์ํ ๋ฐ๋ชจ ์ด์์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋๋ค.
- ์ค์ ์ฅ๋น๋ ๋ฌผ๋ฅ ์ฅ์น์ ์ฐ๋ํ ์๋ฎฌ๋ ์ด์ ํ ์คํธ
- ๊ฐ์ ์์ด์ (Virtual Commissioning)
- ๊ต์ก์ฉ ์ธํฐ๋ํฐ๋ธ ๋ชจ๋ธ ์ ์ ๋ฑ ๋ค์ํ ํ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
๐ง ๋ง๋ฌด๋ฆฌํ๋ฉฐ
Xbox ์ปจํธ๋กค๋ฌ๋ ํ๋์ ์์์ผ ๋ฟ, ์ด ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ฉด ์ผ์, ๋ชจ๋ฐ์ผ ์ฑ, ํค๋ณด๋, ์ ์ด๊ธฐ ๋ฑ ๋ค์ํ ์ธ๋ถ ์
๋ ฅ๊ณผ ์ฐ๋์ด ๊ฐ๋ฅํฉ๋๋ค.
Plant Simulation์ ๋จ์ ๋ถ์ ํด์ด ์๋๋ผ ์ค์๊ฐ ์คํ๊ณผ ํผ๋๋ฐฑ์ด ๊ฐ๋ฅํ ์๋ฎฌ๋ ์ด์
ํ๋ซํผ์ผ๋ก ํ์ฅํ ์ ์๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค ์ฌ๋ก์
๋๋ค.
์์ผ๋ก ๋ ๋ค์ํ ์ธ๋ถ ์ธํฐํ์ด์ค์ ์ฐ๊ฒฐํด๋ณด๊ณ ์ ํฉ๋๋ค.