【问题标题】:communicating with multiple slave (Modbus protocol based)与多个从站通信(基于 Modbus 协议)
【发布时间】:2013-02-17 00:00:59
【问题描述】:

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

我希望每 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);

  }
}

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

提前致谢。

【问题讨论】:

  • 真正的问题是什么?第一次迭代后你没有得到任何值吗?如果我没看错你的意图,你尝试每 15 秒在 9600 波特的慢速线路上通信 50 米。不确定它是否可能。
  • 发送接收循环的代码或至少是它的精简版本会有所帮助。听起来您正在尝试与我同步进行异步通信。
  • 我的错,你写了几分钟。代码示例确实会有所帮助。
  • @Jonas 我想每 15 分钟后与所有从站通信。从属的请求或响应没有问题..如果我删除for循环并为每个从属编写相同的迭代,它的工作非常好..所以我的问题是我应该遵循线程或其他类似的方法.. .!!
  • 我不确定您是否过多地截断了代码。但根据您提供的代码,我发现 Alexandres 的回答很有用。不过,我可以看到您只需要提供 m_slaveID[index] 而不是 m_slaveID[0]。如果我理解您正确读取 mbus-datagrams 的框架,则另一个参数指向正在读取的数据记录(并且应该为零,如果这在单次测试中对您有用)。

标签: c# .net modbus


【解决方案1】:

看起来你的问题是一个小问题......你总是在审问同一个奴隶! “索引”从未在您的代码中使用...

这样的事情怎么样:

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

【讨论】:

    猜你喜欢
    • 2019-11-29
    • 2020-02-20
    • 2018-06-25
    • 1970-01-01
    • 2017-11-08
    • 2021-12-02
    • 2017-05-16
    • 2020-07-16
    • 1970-01-01
    相关资源
    最近更新 更多