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(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?