【发布时间】: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 的框架,则另一个参数指向正在读取的数据记录(并且应该为零,如果这在单次测试中对您有用)。