2014-12-19 7 views
0

저는 C++ 애플리케이션을 만들었고,이 애플리케이션에서 Tcp 통신을 통해 Modbus 디바이스에 대한 통계를 얻을 필요가있었습니다. TCP 통신은 소켓으로 만든 이고, 데이터를 보내기 위해 send()를 사용합니다.내가 보내준 tcp 프레임의 절반 modbus가 유효하지 않습니다.

이제 프레임의 절반이 유효하지 않은 것처럼 보입니다. 연결 후 첫 번째 프레임은 항상 유효하고 두 번째 프레임은 항상 거짓입니다 ... 등등. 그리고 새 연결을 시작할 때마다 첫 번째 프레임이 유효합니다.

그래서 Wireshark와 데이터 방식으로 Modbus 데이터를 확인했습니다 (정상적인 트랜잭션 식별자 제외). 유일한 문제는 Wireshark가 Wireshark 옵션에서 "subdissector가 TCP 스트림을 재구성 할 수 있도록 허용"하는 경우 Wireshark가 Modbus 프레임으로 프레임을 보지 않는다는 것입니다. "2 TCP 세그먼트 재 조립 (29 바이트) : # 79391 (1), # 79404 (28) " 여기서 # 79391은 마지막 올바른 프레임의 프레임 번호이고 # 79404는 현재 프레임의 프레임 번호입니다.

이 문제를 피하기 위해 TCP_NODELAY를 허용하여 TCP 버퍼를 플러시하려고 시도했지만 정확한 결과를 얻었습니다. 따라서 누군가가 Reassemble 프레임을 피하는 방법으로 데이터를 보내는 방법을 알고 있다면 기꺼이 모든 솔루션을 시도 할 것입니다.

편집 : 내 문제를 해결했지만 TCP는 잘못하지 않았습니다. 그러나 그것은 다음 프레임에 버퍼의 불필요한 데이터를 추가하는 것이 불가능한 일을하고있었습니다. 긴 이야기 짧은 나는 데이터의 오른쪽 금액을 보내지 못했습니다.

+0

왜 프레임이 유효하지 않다고 생각하십니까? TCP는 원하는대로 스트림을 패킷으로 분할 할 수 있습니다. 그것이 작동하는 방법입니다. 따라서 Ethereal/Wireshark는 Modbus 메시지를 볼 수 있도록 TCP 스트림을 재구성해야합니다. 그렇다고 그들에게 잘못된 것이 있다는 것을 의미하지는 않습니다. –

+0

modbus 마스터 소프트웨어는 querry의 두 답변 중 하나를 이해하지 못했습니다. 그래서 여러 modbus 마스터 시뮬레이터를 사용하여 Modbus 슬레이브를 테스트했으며 동일한 결과를 얻었습니다. 그 중 하나 : QModMaster는 모드 버스 프레임을 볼 수 있습니다. 그리고 Wireshark가 재조합 된 2 개의 조각을 보여주는 프레임에서 시뮬레이터는 에러 -> 슬레이브 예외를 던졌지 만 TCP 프레임의 modbus 부분은 정확하고 예상 답변입니다 –

답변

2

나는 내 문제를 해결했지만 TCP는 잘못하지 않았습니다. 그러나 그것은 다음 프레임에 버퍼의 불필요한 데이터를 추가하는 것이 불가능한 일을하고있었습니다. 긴 이야기 짧은 나는 데이터의 오른쪽 금액을 보내지 못했습니다. - Julien Amar