2

私は、50 ~ 60 台の Modbus サポート デバイス (スレーブ) が、要求応答メカニズムでアプリケーションと通信している Com ポートに接続されていると言うアプリケーションを開発しています。

15分ごとに欲しい。要求はすべてのメーターに送信され、応答はメーターから 1 つずつ受信されます。複数のスレーブとの通信 (Modbus プロトコルベース)

このために、System.Timers.timer を使用してメソッドを呼び出し、15 分ごとに ReadAllSlave() と言います。ReadAllSlave() では、For ループを使用して要求を送信し、応答を受信し、thread.sleep を使用して遅延を維持しました..! しかし、それは機能していないようで、ループは有線の方法で実行されています。

private void StartPoll()
   {
      double txtSampleRate = 15 * 60 * 1000;
      timer.Interval = txtSampleRate;
      timer.AutoReset = true;
      timer.Start();
   }

void timer_Elapsed(object sender, ElapsedEventArgs e)
{
 for(int index = 0; index<meterCount; Index++)
 {
       //Sending request to connected meter..  
       mb.SendFc3(m_slaveID[0], m_startRegAdd[0], m_noOfReg[0], ref value_meter);
       if (mb.modbusStatus == "Read successful")
           {

                   //Some code for writing the values in SQL Express database
           }

       //Wait for some time so that will not get timeout error for the next 
       //request..
       Thread.Sleep(10000);

  }
}

同じことを実装するための最良のアプローチを教えてください。

前もって感謝します。

4

1 に答える 1

1

あなたの問題は些細なことのようです...あなたはいつも同じスレーブに尋問しています! 「インデックス」はコードで使用されていません...

このようなものはどうですか:

mb.SendFc3(m_slaveID[index], m_startRegAdd[index], m_noOfReg[index], ref value_meter);
于 2013-03-03T09:28:20.617 に答える