우선 데이터가 끊어 지는 부분은 약간의 수정으로 처리 하였습니다.
그냥… plc에서 들어오는 데이터 11byte이라 getSn_RX_RSR(0); 이용하여 0byte 일 경우 소켓 클로즈 처리 할려고 했는데 getSn_RX_RSR(0); 이 값을 보니 , 0~ 2048 증가 하는것 같더라고요 … 제 생각에 11byte라고 떠야 하는데 그게 아니고 또한 2048이 넘으면 pLC가 멈추는 현상이 있는것 같았습니다. 그래서 2048 넘어가면 소켓 클로즈 처리 했습니다. 결국 이런 방법을 이용하여 데이터는 계속 받고 있습니다. 다만 걱정되는 부분은 데이터를 받다가 소켓 클로즈 되면 몇 바이트를 PLC에 못 보낼수 있다고 생각됩니다.
혹시 이런 방법 말고 다른 방법은 없을까요 ?
RX_RSR은 Socket이 Recv한 데이터 크기를 나타냅니다. Socket Recv Buffer가 2K byte라면 RX_RSR값은 2048이 최대값이 맞습니다. 따라서 RX_RSR이 2048인 경우 Socket은 더이상 Recv할 Buffer가 없기때문에 PLC와 TCP 통신중이라면 PLC쪽에서 데이터를 전송할 수 없습니다.
RX_RSR은 사용자가 Read하지 않는한 값은 계속 누적됩니다. (Recv를 통해 데이터가 Buffer에 쌓이므로)
따라서 RX_RSR이 0보다 큰경우는 무조건 사용자측에서 Buffer의 데이터를 읽어가는것이 통신지연이나 데이터 로스를 막을 수 있습니다. (Read하지 않으면 RX_RSR은 2048이 되고 데이터를 더이상 수신할 수 없습니다.)
만약에 2048이 너무 적다고 생각되시면 Socket Recv Buffer Size(Sn_RXBUF_SIZE)를 증가시키는 것도 방법입니다.
그러나 가장 중요한 것은 RX_RSR이 0보다 큰 경우에는 Read를 해주셔서 Buffer가 가득차지 않도록 해주시는것이 통신과정에서 중요해보입니다.