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. 游览器 reflow

    refer: https://juejin.im/post/5a9372895188257a6b06132e reflow 伤性能. 所以要闪. 有几个频密触发的东西要留意. 1. scroll 2. ...

  2. k8s 操作命令(合集List)

    k8s 操作命令 合集List 一.K8S最常用命令如下: 1.获取pod信息:kubectl get pod 2.查看指定pod的日志信息:kubectl logs -f --tail(最后多少行) ...

  3. QT6新旧版本功能模块对比:QT6做了哪些优化重组?QT6新增加了哪些功能模块?QT6做了哪些改进、提升和优化?

    简介 本文介绍了QT6新旧版本都有的功能模块.QT6优化掉了或转移了的功能模块.QT6新增加的功能模块,以及QT6做了哪些改进.提升和优化. 文章目录 QT6新旧版本都有的功能模块 QT6优化掉了或转 ...

  4. namenode rpc 请求队列调优

    当 datanode 上新写完一个块,默认会立即汇报给 namenode.在一个大规模 Hadoop 集群上,每时每刻都在写数据,datanode 上随时都会有写完数据块然后汇报给 namenode ...

  5. 关于 B 先生

    B 先生是不是要疯了,他今天说的都是他妈什么几把

  6. 三大硬核方式揭秘:Java如何与底层硬件和工业设备轻松通信!

    大家好,我是V哥,程序员聊天真是三句不到离不开技术啊,这不前两天跟一个哥们吃饭,他是我好多年前的学员了,一直保持着联系,现在都李总了,在做工业互联网相关的项目,真是只要 Java 学得好,能干一辈子, ...

  7. scala安装及配置

    window 上安装 Scala 1.Scala下载网址:https://www.scala-lang.org/download/ 2.下载后,双击 msi 文件,一步步安装即可,安装过程你可以使用默 ...

  8. form data 与request payload的区别以及php接收这些数据的方法

    form data 与request payload的区别以及php接收这些数据的方法 以前与前端交互一直都是POST.GET的,PHP端就直接$_POST,$_GET来接收,从来没有出现过以外. 最 ...

  9. arm64 下内核 crash—— 非法地址

    下面是在实际工作中遇到的一次内核(5.4.110)访问非法内存地址(空指针)导致出错的现场,在这里记录一下简单的分析流程为以后遇到类似的问题作为参考. [ 220.619861] Unable to ...

  10. 2022年第十八届 GOPS 全球运维大会资料分享

    全球运维大会是国内第一个运维行业大会,面向互联网.金融.通信及传统行业广大运维技术人员,旨在传播先进技术思想和理念,分享业内最佳实践. 2022年第十八届 GOPS 全球运维大会(深圳站)共分为18个 ...