1.Winform窗体界面



2.后台代码

点击查看代码
using Modbus.Device;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
SerialPort serialPort;
ModbusSerialMaster master; public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;//跨线程操作必须添加这段代码
} private void Form1_Load(object sender, EventArgs e)
{
string[] ports = SerialPort.GetPortNames();//获取当前计算机的串行端口名的数组。
cmb_PortName.Items.Clear();//移除所有项
cmb_PortName.Items.AddRange(ports);//端口号下拉框控件添加获取到当前计算机的串行端口名的数组
cmb_PortName.SelectedIndex = 0;//设置端口号下拉框控件指定当前选定项的索引
cmb_BaudRate.SelectedIndex = 0;//设置波特率下拉框控件指定当前选定项的索引
cmb_DataBits.SelectedIndex = 1;//设置数据位下拉框控件指定当前选定项的索引
cmb_Parity.DataSource = Enum.GetNames(typeof(Parity));//校验位下拉框控件添加枚举(Parity)类型的数据源
cmb_Parity.SelectedIndex = 2;//设置校验位下拉框控件指定当前选定项的索引
cmb_StopBits.DataSource = Enum.GetNames(typeof(StopBits)); //停止位下拉框控件添加枚举(StopBits)类型的数据源
cmb_StopBits.SelectedIndex = 1;//设置停止位下拉框控件指定当前选定项的索引 serialPort = new SerialPort();
serialPort.PortName = cmb_PortName.Text;//端口号
serialPort.BaudRate = int.Parse(cmb_BaudRate.Text);//波特率
serialPort.DataBits = int.Parse(cmb_DataBits.Text);//数据位
serialPort.Parity = (Parity)cmb_Parity.SelectedIndex;//校验位
serialPort.StopBits = (StopBits)cmb_StopBits.SelectedIndex;//停止位
master = ModbusSerialMaster.CreateRtu(serialPort);
master.Transport.ReadTimeout = 300;
Task.Run(() =>//开启一个用于读取数据的任务
{
GetPlcData();//执行循环读取数据的方法
}); } private void GetPlcData()//循环读取数据的方法
{
while (true)
{
if (serialPort.IsOpen)//判断端口打开状态
{
try
{
ushort[] ushorts = master.ReadHoldingRegisters(1, 0, 10);//读取数据
textBox1.Clear();//清空文本框控件内容
for (int i = 0; i < ushorts.Length; i++)//遍历读取到的数据数组
{
textBox1.AppendText(ushorts[i] + "\r\n");//将数组的内容添加到文本框控件
}
System.Threading.Thread.Sleep(100);//等待100MS
}
catch (Exception)
{
//异常处理
serialPort.Close();//关闭端口
btn_Open.Text = "打开";//更改按钮的文本
MessageBox.Show("读取异常");//弹出提示框 }
}
}
} private void btn_Open_Click(object sender, EventArgs e)
{
if (serialPort != null && serialPort.IsOpen)
{
serialPort.Close();
btn_Open.Text = "打开";
MessageBox.Show("关闭成功", "提示");
}
else
{
serialPort.Open();
btn_Open.Text = "关闭";
MessageBox.Show("打开成功", "提示");
}
}
}
}

Winform多线程持续读取PLC数据的更多相关文章

  1. intouch 10.1出现暂停读取PLC数据问题及其解决

    问题描述 雨水泵站经过3年运行,突发dasmbtcp驱动与施耐德M580系列PLC时断时连问题 原因分析 在经过现场软件重装修复,授权重装,网络通讯状态监视(一直ping PLC IP地址方式)重装d ...

  2. C#读写三菱PLC和西门子PLC数据 使用TCP/IP 协议

    本文将使用一个Github开源的组件库技术来读写三菱PLC和西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能 ...

  3. C# 读写倍福plc beckhoff , 使用ADS协议实现读取plc

    本文将使用库技术来读写倍福PLC数据,使用的是基于以太网的ADS实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 github地址:https://g ...

  4. C#读写三菱PLC数据 使用TCP/IP 协议

    本文将使用一个Github开源的组件库技术来读写三菱PLC和西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能 ...

  5. WinForm多线程学习文档

    基础篇 怎样创建一个线程 受托管的线程与 Windows线程 前台线程与后台线程 名为BeginXXX和EndXXX的方法是做什么用的 异步和多线程有什么关联 WinForm多线程编程篇 我的多线程W ...

  6. C# 读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC

    本文将使用一个gitHub开源的组件技术来读写西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 官方 ...

  7. python 读写三菱PLC数据,使用以太网读写Q系列,L系列,Fx系列的PLC数据

    本文将使用一个gitHub开源的组件技术来读写三菱的plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 gi ...

  8. java android 读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC

    本文将使用一个gitHub开源的组件技术来读写西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 gi ...

  9. 使用HslCommunication实现PLC数据的远程客户端监视,以及web端实时监视,远程操作设备示例

    前言 本文主要是演示一个例子,服务器后台程序从PLC采集数据,并推送给在线客户端显示,以及推送给web端进行实时的显示,还支持远程操作,支持安卓端的同步监视和远程操作,关于HslCommunicati ...

  10. C#读写西门子PLC数据

    C#读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC 本文将使用一个gitHub开源的组件技术来读写西门子plc数 ...

随机推荐

  1. ARM SMMU原理与IOMMU技术(“VT-d” DMA、I/O虚拟化、内存虚拟化)

    名词缩写 ASID:Address Space ID 地址空间标识符 CD:Context Descriptor: 上下文描述符: CTP:Context-table pointer 上下文表指针 E ...

  2. USB LFPS是什么?

    USB LFPS:低功耗状态下的高速数据传输 什么是USB LFPS? USB LFPS(Low-Power Signaling)指的是USB接口在低功耗状态下的一种高速数据传输技术.传统上,USB接 ...

  3. Java日期时间API系列29-----Jdk8中java.time包中的新的日期时间API类,Java定时任务job中cron表达式计算应用。

    Java开发过程中经常会用到定时任务job的场景,比如定时处理数据报表等问题,开源作业调度框架也非常多,常用的开源作业调度框架有:Spring Task.Quartz和xxl-job等.各个框架的具体 ...

  4. 动态去读 dll 文件

    // 反射动态读取 dll // Assembly assembly = Assembly.LoadFile(); 路径 // Assembly assembly = Assembly.LoadFro ...

  5. Vue 如何实现组件切换的时候,让组件缓存,不会被销毁

    使用场景:我们开发项目的时候,会遇到组件之间的切换,一般都是创建组件销毁组件来回切换 :但是现在需求是切换组件的时候,另一个组件不会销毁: 基于这个需求 ,我们使用 keep-live 组件包裹起来要 ...

  6. 更改后端的数据格式适配el-tree组织树

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  7. 基于 KubeSphere 的分级管理实践

    作者:许伟,航天网信研发工程师 K8s 是容器编排和分布式应用部署领域的领导者,在 K8s 环境中,我们只需要关心应用的业务逻辑,减轻了我们服务器网络以及存储等方面的管理负担.对于一个用户而言,K8s ...

  8. 分享一个大模型在请求api接口上的巧用

    前言 自从Chatgpt横空出世以来,各种智能工具层出不穷,聊天.绘画.视频等各种工具帮助很多人高效的工作.作为一个开发者,目前常用应用包括代码自动填充,聊天助手等. 这些是工具层面的使用,有没有将大 ...

  9. EDUSRC | 记录几张edusrc证书站挖掘

    在web资产挖证书站是比较难的,尤其是没有账号密码进入后台或者统一的情况下,于是便转变思路,重点放在信息收集,收集偏远资产上. 一.XX大学 srping actuator未授权 茫茫c段,找到这么一 ...

  10. TrueNAS关闭5357端口

    sockstat -4l 查看监听5357端口进程的ID. 用kill -9 PID 干掉进程.