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