2017-12-15 16 views
0

以前の質問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変数のビットを変更します。)

enter image description here

:これは、再組立TCPセグメント(下図のように)私はこれをしようと作成されます

モーターを2度動かそうとする段階で、STARTビットを再起動する必要がありますが、それは起動されず、コマンドはモーターによって実行されません。私は前もって再構成されたTCPセグメントが問題であると仮定しています。移動ボタンを押すたびに(別の位置でSTARTビットをトリガーします)、1つ以上のTCPセグメントが送信されたパケットに追加されるためです。通常は、Send_Data()の機能は以前の呼び出しで引き続きトリガーされますが、常に新しいQString Dataでトリガーされます。この問題を回避するソリューションはありますか? Send_Data()関数でmutex変数を作成するようにします。

答えて

0

私はあなたの質問を完全に理解していませんが、送信されたパケットが送信されたものと同じチャンクで相手側で受信されることをTCPが保証しないことを明確にしたいと思います。

100 + 100バイトが送信され、もう一方の端で200バイトのチャンクが受信されるか、150ともう1つの50のチャンクが受信される可能性があります。 これを防ぐ方法はありませんが、TCPはこのように動作します。

受信プログラムはフラグメントを再構成する準備ができている必要があります。

関連する問題