对于具有不同间隔的设备,用c#编写轮询服务的方法应该是什么
我有近400个带有Modbus接口的PLC设备,我想轮询并将结果存储在MySQL数据库中。用户将为每个设备配置轮询间隔,例如500毫秒的温度轮询、1000毫秒的三角波轮询、5000毫秒的环境参数轮询等。我已将所有这些信息存储在数据库中 现在我想编写一个windows服务,它将执行以下操作:对于具有不同间隔的设备,用c#编写轮询服务的方法应该是什么,c#,multithreading,modbus,plc,C#,Multithreading,Modbus,Plc,我有近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。我已对此进行了服务器设置。:)这将为一个任务只创建一个计时器。我需要在不同的计时器中轮询许多设备,这些计时器将在指定的时间间隔内保持轮询。将尝试通过实现多个计时器和更新来完成此操作。谢谢!这是有希望的,但我需要做很多研究。将更新。