对于具有不同间隔的设备,在c#中编写轮询服务的方法应该是什么

时间:2015-05-16 01:21:12

标签: c# multithreading modbus plc

我有近400台带有Modbus接口的PLC设备,我想轮询并将结果存储在MySQL数据库中。用户将为每个设备配置轮询间隔,例如温度轮询为500毫秒,三角波为1000毫秒,环境参数为5000毫秒等。我已将所有这些信息存储在数据库中。

现在我想编写一个Windows服务,它将执行以下操作:

  1. 从数据库中读取每个设备的通信参数,例如IP地址,寄存器地址,寄存器计数等。
  2. 为具有特定时间间隔
  3. 的每台设备启动一个主题
  4. 该线程将继续轮询设备并将值写入数据库,直到服务停止。
  5. 现在,我的问题是如何为每个设备实现具有特定间隔的单独线程。

    我正在使用带有nModbus库的C#。

2 个答案:

答案 0 :(得分:0)

有很多关于如何在一个间隔上进行轮询的资源。 C# 4.0 - Threads on an Interval您可以枚举已配置的计时器间隔的集合,并为每个间隔旋转一个线程。

有了这么多并发线程,我建议排队这些。无论您是使用队列产品(如MSMQ)还是自定义滚动某种线程安全并发字典来处理排队。以下是自定义排队的一个资源:http://www.nullskull.com/a/1464/producerconsumer-queue-and-blockingcollection-in-c-40.aspx

希望这会让你朝着正确的方向前进。

答案 1 :(得分:0)

您可以使用简单的System.Timers.Timer类; 这是示例代码

class Program
{
    static void Main(string[] args)
    {
        // Timer interval in ms
        // in your case read from database
        double timerIntervalInMs = 1000.00;
        var myTimer = new Timer(timerIntervalInMs);
        // I generally prefer to use AutoReset false 
        // and explicitly start the timer within the elapsed event.
        // Thus you can ensure that there will not be overlapping elapsed events.
        myTimer.AutoReset = false;
        myTimer.Elapsed += OnMyTimedEvent;
        myTimer.Enabled = true;
        myTimer.Start();
        Console.ReadLine();

    }

    private static void OnMyTimedEvent(Object source, ElapsedEventArgs e)
    {
        Console.WriteLine("On timer event");
        // Do work
        var timerObj = (Timer) source;
        timerObj.Start();
    }

}