Winform多线程持续读取PLC数据
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数据的更多相关文章
- intouch 10.1出现暂停读取PLC数据问题及其解决
问题描述 雨水泵站经过3年运行,突发dasmbtcp驱动与施耐德M580系列PLC时断时连问题 原因分析 在经过现场软件重装修复,授权重装,网络通讯状态监视(一直ping PLC IP地址方式)重装d ...
- C#读写三菱PLC和西门子PLC数据 使用TCP/IP 协议
本文将使用一个Github开源的组件库技术来读写三菱PLC和西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能 ...
- C# 读写倍福plc beckhoff , 使用ADS协议实现读取plc
本文将使用库技术来读写倍福PLC数据,使用的是基于以太网的ADS实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 github地址:https://g ...
- C#读写三菱PLC数据 使用TCP/IP 协议
本文将使用一个Github开源的组件库技术来读写三菱PLC和西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能 ...
- WinForm多线程学习文档
基础篇 怎样创建一个线程 受托管的线程与 Windows线程 前台线程与后台线程 名为BeginXXX和EndXXX的方法是做什么用的 异步和多线程有什么关联 WinForm多线程编程篇 我的多线程W ...
- C# 读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC
本文将使用一个gitHub开源的组件技术来读写西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 官方 ...
- python 读写三菱PLC数据,使用以太网读写Q系列,L系列,Fx系列的PLC数据
本文将使用一个gitHub开源的组件技术来读写三菱的plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 gi ...
- java android 读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC
本文将使用一个gitHub开源的组件技术来读写西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 gi ...
- 使用HslCommunication实现PLC数据的远程客户端监视,以及web端实时监视,远程操作设备示例
前言 本文主要是演示一个例子,服务器后台程序从PLC采集数据,并推送给在线客户端显示,以及推送给web端进行实时的显示,还支持远程操作,支持安卓端的同步监视和远程操作,关于HslCommunicati ...
- C#读写西门子PLC数据
C#读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC 本文将使用一个gitHub开源的组件技术来读写西门子plc数 ...
随机推荐
- Angular 18+ 高级教程 – Component 组件 の 生命周期钩子 (Lifecycle Hooks)
前言 之前在 Component 组件 の Angular Component vs Custom Elements 文章中,我们有学习过几个基础的 Lifecycle Hooks. 比如 OnCha ...
- QT硬件通讯基础
QT硬件通讯基础 使用AI技术辅助生成 1 QT与硬件通讯概述 1.1 QT硬件通讯的基本概念 1.1.1 QT硬件通讯的基本概念 QT硬件通讯的基本概念 QT硬件通讯的基本概念 QT作为一种跨平台的 ...
- 【赵渝强老师】MongoDB中的索引(上)
索引是提高查询查询效率最有效的手段.索引是一种特殊的数据结构,索引以易于遍历的形式存储了数据的部分内容(如:一个特定的字段或一组字段值),索引会按一定规则对存储值进行排序,而且索引的存储位置在内存中, ...
- 能用到“退休”的 600条 Linux 命令,可以解决日常99%的问题~
1.基本命令 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 (SMBIOS / DMI) hdparm -i /dev/ ...
- JVM 系列知识体系全面回顾
经过几个月的努力,JVM 知识体系终于梳理完成了. 很早之前也和小伙伴们分享过 JVM 相关的技术知识,再次感谢大家支持和反馈. 最后再次献上 JVM系列文章合集索引,感兴趣的小伙伴可以点击查看. J ...
- php生成验证码类
php生成验证码类 直接看代码 <?php session_start(); class Code{ //资源 private $img; //画布宽度 private $width=100; ...
- 高通ramdump
背景 高通平台下提供了一个工具,专门用来抓取内核死机以后的dump信息.如果只是非系统层面的crash(例如底层应用,安卓程序),则不能抓取dump信息. 在阅读一些文档的时候知道有这个功能,但是一直 ...
- base64 是什么,有什么作用?
base64 是图片编码的一种形式,可以替代图片的url进行网络访问和请求等操作: 使用图片的url形式操作图片,每次都要请求一次网络,因为每次请求都是一个http:都是一个网络开销,都是对服务器的负 ...
- 32. vue框架的理解
vue是创建用户界面的框架,是创建SPA应用的框架,采用了MVVM模型,是数据驱动视图 :使用了 业务逻辑和页面解构分离的开发思想 :使用 高效的diff算法渲染列表 :使用组件化开发,提高代码的复用 ...
- 《使用Gin框架构建分布式应用》阅读笔记:p1-p19
<使用Gin框架构建分布式应用>学习第1天,p1-p19总结,总计19页. 一.技术总结 1.go get & go install 执行go get 或者 go install ...