Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于具有不同间隔的设备,用c#编写轮询服务的方法应该是什么_C#_Multithreading_Modbus_Plc - Fatal编程技术网

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

对于具有不同间隔的设备,用c#编写轮询服务的方法应该是什么,c#,multithreading,modbus,plc,C#,Multithreading,Modbus,Plc,我有近400个带有Modbus接口的PLC设备,我想轮询并将结果存储在MySQL数据库中。用户将为每个设备配置轮询间隔,例如500毫秒的温度轮询、1000毫秒的三角波轮询、5000毫秒的环境参数轮询等。我已将所有这些信息存储在数据库中 现在我想编写一个windows服务,它将执行以下操作: 从数据库中读取每个设备的通信参数,例如IP地址、寄存器地址、寄存器计数等 以特定的间隔为每个设备启动一个线程 该线程将继续轮询设备并将值写入数据库,直到服务停止 现在,我的问题是如何为每个设备以特定的间隔实现

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

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

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


    我正在使用C#with nModbus库。

    关于如何在一个时间间隔内进行轮询,有很多参考资料。您可以枚举一组已配置的计时器间隔和每个间隔的线程旋转

    对于这么多并发线程,我建议将它们排队。无论您是使用队列产品(如MSMQ)还是自定义卷,都可以使用某种线程安全并发字典来处理队列。这里有一个关于自定义队列的资源:


    希望这能让你走上正确的方向

    您可以使用简单的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();
        }
    
    }
    

    我认为,如果强调您需要的范围相当有限,那么这个问题会有所帮助:使用每个设备轮询间隔设置的线程。你能照办吗?否则,听起来就像你在要求一个实质性的编码项目。400个设备的多线程?希望你有一台地狱般的计算机。就个人而言,我不会为每个设备启动一个线程,而是启动几个基本线程,每个线程处理一组设备。(您可以很容易地编写它来启动四个线程,每个线程处理100个PLC。)每个线程可以有10毫秒的超时时间,这样您就可以获得所需的非常精细的粒度。@Nathantugy:我认为这个标题看起来更具描述性。@RonBeyer:是的,Ron。我已对此进行了服务器设置。:)这将为一个任务只创建一个计时器。我需要在不同的计时器中轮询许多设备,这些计时器将在指定的时间间隔内保持轮询。将尝试通过实现多个计时器和更新来完成此操作。谢谢!这是有希望的,但我需要做很多研究。将更新。