NModbus4项目4——数据的读写框架

上位机与PLC之间进行数据读写时一般采用两种方式,

一种是使用定时器进行读,一种是使用一个独立的线程进行读,

但是无论使用哪种方式,都要求写优先级高于读,这里就涉及到读写状态切换。

写数据时,暂停读,切换到写状态,数据写完,再切换到读状态。

 


 具体实现方式如下:

第一种方式:使用定时器读写

第一步:建立一个定时器,并设置定时器触发事件:

System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 1000;
timer.AutoReset = true;
timer.Elapsed += Timer_Elapsed;
timer.Start();

第二步,在定时器的触发事件中进行数据读操作:

if (isRead && !isWrite)
{
  //读PLC数据
}

第三步,在控件的触发事件中写数据

1、先创建一个事件

2、在事件中先关闭读数据标志位

3、执行数据写入

4、恢复读数据标志位

复制代码
private void button1_Click(object sender, EventArgs e)
{
    if (isRead)
    {
        isRead = false;//关闭读数据
        //timer.Stop();
    }
    //执行数据写入
    bool writeResult = WriteSlaveData();
    if (writeResult)
    {
        isRead = true;//恢复读数据
        //timer.Start();
    }
}
复制代码

 

 

第二种方法,使用线程对数据进行读写

第一步,读数据,如下:

复制代码
Task.Run(() =>
{
    while (true)
    {
        if (isRead )
        {
            ReadSlaveData();//读PLC数据
        }
        else
        {
            Thread.Sleep(200);
        }
    }
});
复制代码

第二步,写数据,如下:

复制代码
private void button1_Click(object sender, EventArgs e)
{
    if (isRead)
    {
        isRead = false;
        //timer.Stop();
    }
    //执行数据写入
    bool writeResult = WriteSlaveData();
    if (writeResult)
    {
        isRead = true;
        //timer.Start();
    }
}
复制代码

 

使用第二种方法时,由于涉及到线程的暂停,还可以使用ManualResetEvent来实现该方法。(可以参见多线程的启/停,暂停和恢复 

实现方法如下:

复制代码
//第一步,创建一个ManulResetEvent
ManualResetEvent WriteEvent = new ManualResetEvent(true);

//第二不,在执行的线程中添加WaitOne方法
Task.Run(() =>
{    
    while (true)
    {        
        WriteEvent.WaitOne();
        ReadSlaveData();
    }
});

//第三步通过一个按钮控制线程的暂停和恢复
private void button1_Click(object sender, EventArgs e)
{
    WriteEvent.Reset();
    //执行数据写入
    bool writeResult = WriteSlaveData();
    if (writeResult)
    {
        WriteEvent.Set();
    }            
}
复制代码

 

posted on   hanzq_go  阅读(1338)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示