2016-11-20 8 views
0

뒤에 이야기 :QModbusTcpClient을 사용하여 Modbus/TCP 네트워크에 연결된 장치에서 내용을 읽으려고합니다. 이를 위해 나는 기본적으로 유형HoldingRegisters입니다 매개 변수로 QModbusDataUnit::QModbusDataUnit(RegisterType type, int address, quint16 size)QModbusClient::sendReadRequest를 호출 Qt는 C++ (Qt는 버전 5.7.0)에서 (7, 10 테스트) Windows 프로그램,이 1000에 동일 주소를 (작성했습니다 다른 주소 일 수 있음,이 특정 문제에는 중요하지 않음). 크기은 장치에서 읽으려는 원하는 데이터의 길이입니다.QModbusTcpClient의 데이터 크기 제한

문제 :size63보다 작거나 같으면 모든 것이 잘 작동합니다. 이 값을 초과하여 시도 할 때마다 프로그램을 테스트하는 장치에 따라 오류가 발생하지만 일반적으로 잘못된 요청이 표시됩니다.

테스트 : I 여러 실제 장치와 같은 결과를 얻는 Modbus/TCP simulator 이것을 테스트 한

  1. , 즉 size < = 63 -> 괜찮; size> 63 - 다른 측면에서> 오류
  2. Modpoll이 나를 size63 이상의 레지스터

과 같은 장치와 시뮬레이터에서 데이터 청크를 읽을 수 있습니다 일부 연구 :이 적혀있다Here, 실제로 제한이 있지만, 256 바이트입니다. 이는 128 16 비트 레지스터와 같습니다. 즉, 내 읽기 시도 한계를 초과합니다.

내 의심 :QModbusTcpClient63 개 이상의 레지스터를 읽을 수 없습니다.

질문 :QModbusTcpClient을 사용하여이 문제를 경험 한 사람이 있습니까?이 두 가지 데이터를 읽는 것 외에이 제한을 극복 할 수있는 방법이 있습니까?

답변

0

필자의 경우 해결책은 내 손안에 문제를 해결하고 Modbus 장치와 통신하기 위해 클래스를 작성하는 것입니다. 클래스는 QObject에서 상속되므로 신호 슬롯 시스템은 여전히 ​​처분되고 있지만 실제 기능은 winsock2.h을 기반으로합니다. Here은 필자가 필요로하는 일을 수행하는 샘플 프로그램입니다. 내가 우연히 만났던 또 다른 유용한 소스는 this book이고, winsocket 2 레퍼런스의 example program이고, 물론 Modbus specification이다. 그것은 어려운 일이 아니며, 제가 언급 한 근원으로부터 약간의 도움을 받음으로써 제가 가진 문제를 해결할 수있었습니다.