(Unity 3d) Plc시뮬레이터 작업 일기 ④ Unity 스크립트 수정

2023. 3. 14. 20:22plc 시뮬레이션 제작 (Unity)

 (Unity 3d) Plc 시뮬레이터 수정 작업 3일차. (23.03.11 토요일)


 기존에 만들었던 시뮬레이터와 통신방식이 완전히 바뀌었기 때문에, 기존에 작성했던 유니티 스크립트들을 전부 뜯어 고쳐야 했다. 기존에는 유니티 시뮬레이터과 gx-works2 를 직접적으로 연결하였기에, 엄청난 성능저하가 발생햇었다.

 그래도 최대한의 최적화를 위해 값을 읽어서 유니티 시뮬레이터의 실린더를 동작시키는 값을 읽는 것은 코루틴을 사용해 인터벌을 두었고, 실린더가 동작하면서 바뀌는 센서값들을 다시 gx-works2로 보내는 부분은 bool변수를 이용하여 딱 한번만 통신을 열었다가 닫는 식으로 제한을 뒀었다. 하지만 그정도의 최적화를 하더라도 성능이 좋은 pc도 30프레임의 성능이 한계였으며, 성능이 저조한  pc의 경우 그 이하의 퍼포먼스를 보여주었다.


 유니티가 메인 스레드 하나만을 사용하기 때문에 그러한 현상이 발생하는 것이었는데,

스레드를 분리해서 백그라운드에서 실행되도록 수정하는 방법을 사용했는데, 통신의 문제인지 유니티 시뮬레이터가 프리징되는 버그가 발생하였다. 그나마 코루틴을 사용하는 방법은 문제없이 돌아가서 그정도로 만족하고, unity시뮬레이터 제작을 일단 완료했었다.


 조금 잡설이 길어졌지만, 수정 작업 3일차 토요일은 이른 아침부터 오후 약속에 나가기 전까지 내내 코드를 수정하였다.

 먼저 서버에서 시뮬레이터로 값을 받는 Y출력 부분의 경우에는 다행히 이전 .Net 에서 처럼 쪼개는 작업이 따로 필요 없었다. 서버에서 시뮬레이터로 값을 읽어올때, 비트로 값을 분리하기 전 저장된 data를 그대로 가져오도록 했고, 유니티 스크립트 안에서 그것을 나눠서 bool변수 배열에 넣었다.

 bool변수를 public static으로 정의하고, 실린더의 동작 스크립트들에서 각각 통신 스크립트의 Y출력 static 변수에 접근하여 true/false 값에 따라 동작이 구현되도록 하였다. 혹시나 약간이라도 성능저하가 발생할까봐 Find나 Getcomponent 는 전혀 사용하지 않았다.

 그렇게 별다른 문제없이 수정작업을 마치고 있었는데... 

 약속 나가기 직전에 문제가 발생하였다.


 서버에서 시뮬레이터로 값을 읽어올때는 별 문제가 없었는데, 시뮬레이터에서 서버로 센서 변동값을 보내는  'X입력' 부분에서 문제가 생겼다.

 시뮬레이터에서 서버로 전송하는 data는 2바이트의 크기를 가지고 있는데, 시뮬에서 보낸 data를 서버어서 받을때 data값이 기존에 나누었던 x접점 DatagridView의 인덱스에 맞게 들어가지 않는다는 것이었다. Datagridview 인덱스값에 제대로 들어가야 서버에서 gx-works2로 알맞은 값을 보낼 수 있었기에, 꼭 수정을 해야했다.

 이걸 유니티 스크립트에서 수정을 해야 하는 것인지, 별 문제없이 동작하는 것 같았던 .Net winform의 코드를 수정해야 할지 감이 잘 안잡혔다. 당장 약속 시간이 다가오고 있어서 시간 관계상 더이상의 작업은 하지 못했다.


 당장 생각나는 해결방법은 잘 돌아가고 있어서 수정하기 무섭지만, .Net winForm의 코드를 수정하여 시뮬레이터에서 서버로 보내는 값을 임시로 저장한뒤, 바이너리 값으로 바꾸고, 바이너리의 값의 자릿수에 맞춰서 쪼갠뒤에, 배열을 생성해 넣어서 그 나뉜 값을 wfToPLC Row에 넣는 것이었다.

 될지 안될지 해봐야 알겠지만, 일단 내일 이어서 해보도록 하겠다.