以前の質問Qt/C++ communication with CMMO-ST-C5-1-LKP Festo controller over Modbus TCPで既に述べたように、FHPPモードでFESTOコントローラと通信しています。私は継続的なModbus TCP通信について詳しく説明しています。私はそれを私がグローバルQTimer
を使用し、連続通信を行うために、のModbus TCPパケットを送信することを可能にする機能Send_data()
を作成し、それが100ミリ秒ごとにこの機能を発射作っ:再組み立てされたTCPセグメントの回避 "Modbus TCP通信"
m_timer->start(100) connect(m_timer, &QTimer::timeout, [this]() { Send_Data(); });
は全く問題ありません設定ビットが0または1に固定されていると、グローバル変数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();
});}
(trigger_bit(bit bitName)
の内側にこれらの方法はQString Data
変数のビットを変更します。)
モーターを2度動かそうとする段階で、STARTビットを再起動する必要がありますが、それは起動されず、コマンドはモーターによって実行されません。私は前もって再構成されたTCPセグメントが問題であると仮定しています。移動ボタンを押すたびに(別の位置でSTARTビットをトリガーします)、1つ以上のTCPセグメントが送信されたパケットに追加されるためです。通常は、Send_Data()
の機能は以前の呼び出しで引き続きトリガーされますが、常に新しいQString Data
でトリガーされます。この問題を回避するソリューションはありますか? Send_Data()
関数でmutex変数を作成するようにします。