2013-03-02 22 views
2

我正在开发一个应用程序,其中Lets表示50-60个Modbus支持设备(从站)连接到Com端口,这些Com端口与请求响应机制中的应用程序进行通信。与多个从站通信(基于Modbus协议)

我想每15分钟后。请求应发送到每个仪表并响应从仪表逐个接收。 与多个从站通信(基于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); 

    } 
} 

任何人都可以请我建议实施相同的最佳方法。

在此先感谢。

+0

什么是真正的问题?第一次迭代后你没有得到任何值?如果我读到你的意图是正确的,那么你试图在慢速9600波特速度线上每隔15秒沟通50米。不确定它是否可能。 – Independent 2013-03-02 14:30:14

+0

您的发送接收循环的代码或至少一个削减版本将有所帮助。听起来你正在尝试与我同步执行异步通信。 – 2013-03-02 14:35:07

+0

我不好,你写了几分钟。代码示例确实会有所帮助。 – Independent 2013-03-02 14:41:56

回答

1

它看起来像你的问题是一个微不足道的...你总是审问同一个奴隶! “指数”从来没有在你的代码中使用...

什么是这样的:

mb.SendFc3(m_slaveID[index], m_startRegAdd[index], m_noOfReg[index], ref value_meter);