2017-12-15 35 views
0

이전의 질문 Qt/C++ communication with CMMO-ST-C5-1-LKP Festo controller over Modbus TCP에서 이미 언급했듯이 FHPP 모드에서 FESTO 컨트롤러와 통신 중이며, 계속해서 Modbus TCP 통신을 시도하려고합니다. 나는 그것을 내가 글로벌 QTimer을 사용 연속 통신을 만들기 위해, 모드 버스 TCP 패킷을 보낼 수있는 기능 Send_data()를 작성하고 100 밀리 초마다이 기능을 발사했다 :재조합 된 TCP 세그먼트 "Modbus TCP 통신"피하기

m_timer->start(100) connect(m_timer, &QTimer::timeout, [this]() { Send_Data(); });

아무 문제가 없다 구성 비트가 0 또는 1로 고정되면 전역 변수 QString Data 패킷을 변경할 수 있습니다. 그러면 패킷이 전송됩니다. 문제는 비트 (구성 또는 위치 지정)를 상승 또는 하강 에지로 트리거해야하는 경우입니다. (아래 그림에 도시 된 바와 같이) I 이렇게 할 때 이것은 어셈블 TCP 세그먼트를 생성한다. (trigger_bit(bit bitName) 내부 이러한 메소드 QString Data 변수의 비트를 수정)

void Stepper::trigger_bit(bit bitName){ 
switch (bitName) { 
case(RES): {  
    activer_reset();break; 
} 
case(HOM): { 
    activer_homing(); 
    break; 
} 
case(START): { 
    activer_start(); 
    break; 
} 
case(CLEAR): { 
    activer_clear(); 
    break; 
} 
case(HALT): { 
    desactiver_halt(); 
    break; 
} 
} 
connect(m_timer, &QTimer::timeout, [this]() { 
    Send_Data(); 
}); 
switch (bitName) { 
    case(RES): { 
    desactiver_reset();break; 
} 
case(HOM): { 
    desactiver_homing(); 
    break; 
} 
case(START): { 
    desactiver_start(); 
    break; 
} 
case(CLEAR): { 
    desactiver_clear(); 
    break; 
} 
case(HALT): { 
    activer_halt(); 
    break; 
} 
} 
connect(m_timer, &QTimer::timeout, [this]() { 
    Send_Data(); 
});} 

enter image description here

모터를 두 번째로 움직이려하는 단계에서 START 비트를 다시 트리거해야합니다.하지만 그렇게하지는 않습니다. 트리거되지 않고 명령이 모터에 의해 실행되지 않습니다. 나는 미리 설정 한 TCP 세그먼트가 문제라는 것을 전제로합니다. 이동 버튼을 누를 때마다 (다른 위치로 START 비트를 트리거합니다) 하나 이상의 TCP 세그먼트가 전송 된 패킷에 추가되기 때문입니다. 일반적으로 Send_Data() 함수는 이전 호출로 계속 트리거되지만 항상 새로운 QString Data으로 트리거됨을 의미합니다. 이 문제를 피할 수있는 해결책이 있습니까? Send_Data() 함수에서 뮤텍스 변수를 만드는 것과 같습니다.

답변

0

질문을 완전히 이해하지 못했지만 전송 된 패킷이 전송 된 것과 동일한 청크로 다른 쪽에서 수신되었음을 TCP가 보증하지 않음을 명확히 밝히고 싶습니다.

100 + 100 바이트가 전송되고 다른 끝에서 200 바이트 청크가 수신되거나 150 비트와 50 비트 중 하나가 수신됩니다. 이런 일이 발생하지 않도록하는 방법은 없습니다. TCP는이 방법으로 작동합니다.

받는 프로그램은 조각을 다시 구성 할 준비가되어 있어야합니다.