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. WiFi基础(四):WiFi工作原理及WiFi接入过程

    liwen01 2024.09.16 前言 802.11 无线 WiFi 网有三类帧:数据帧.管理帧.控制帧.与有线网相比,无线 WiFi 网会复杂很多.大部分应用软件开发对 WiFi 的控制帧和管理 ...

  2. MyBatis——使用Mapper代理开发

    使用 Mapper 代理开发方式完成入门案例   1.定义与SQL映射文件同名的Mapper接口,并将 Mapper 接口和SQL映射文件放置在同一目录下       (企业开发中,通常是将配置文件统 ...

  3. 仿Linux内核链表实现合并有序链表、逆序单链表功能,C版本 JavaScript版本

    直接贴上已经码好的: list_sort.c: #include <stdio.h> #include <string.h> #include <assert.h> ...

  4. [TK] Tourist Attractions

    题目描述 给出一张有 \(n\) 个点 \(m\) 条边的无向图,每条边有边权. 你需要找一条从 \(1\) 到 \(n\) 的最短路径,并且这条路径在满足给出的 \(g\) 个限制的情况下可以在所有 ...

  5. cobalt strike安装教程

    将本地IP和密码填入:./teamserver 192.168.xx.xx 密码 启动成功

  6. android 性能优化 -systrace

    简介: Systrace允许监视和跟踪Android系统的行为(trace).它会指明系统都在哪些工作上花费时间.CPU周期都用在哪里,甚至可以看到每个线程.进程在指定时间内都在干嘛.它同时还会突出观 ...

  7. 深入理解虚拟 物理地址转换,页表--基于ARMV8

    1. 页表转换寄存器描述符 1.1,页表/页目录结构 基于前言中的内核配置,内核采用39位虚拟地址,因此可寻址范围为2^39 = 512G,采用(linux 默认为五级页表,另外还有PUD,P4D,由 ...

  8. 【01】DataFrame的创建和属性

    DataFrame是一个表格型的数据结构,可以看成就是excel中的表格. 官方文档:https://pandas.pydata.org/docs/reference/frame.html DataF ...

  9. 分布式缓存 - 缓存服务器 - redis

    如果一般的缓存可以解决问题,就不必使用分布式缓存 : 一般使用分布式缓存 都是使用 redis : 使用教程: 1. 安装包 Microsoft.Extensions.Caching.StackExc ...

  10. 如何使用echarts

    官网:https://echarts.apache.org/handbook/zh/get-started/ a 下载js文件并引入 b 初始化实例对象 echarts.init(获取盒子对象)  关 ...