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. CSS – rem, em, px

    参考: 掘金 – 如何更愉快地使用em -- 别说你懂CSS相对单位 绝对值 vs 相对值 px, cm, mm 这些是绝对值. rem, em 是相对值. 绝对值就是最终的尺寸. 相对值的意思是它不 ...

  2. MybatisPlus——DML编程控制——增删改

    DML编程控制 id生成策略控制 不同的表应用不同的id生成策略 日志:自增(1,2,3,4,......) 购物订单:特殊规则(FQ23948AK3843) 外卖单:关联地区日期等信息(10 04 ...

  3. linux 内核中READ_ONCE宏定义

    在Linux内核编程中,READ_ONCE 宏用于确保从内存中读取一个变量的值时,编译器不会对这个读取操作进行优化,从而保证了读取操作的原子性.这个宏通常在需要防止编译器优化.多线程或中断上下文中使用 ...

  4. 将一个Eigen::Matrix中的数据(数组格式),按行写入到json文件当中.

    1.这里主要实现如何以数组的形式写入到json文件当中,因为c++的Jsoncpp库中的.append只支持一个字符的写入(还是python的json友好).去网上找了老久的解决办法,发现中文解答全是 ...

  5. 后台管理系统的setting.js

    // 修改了此处要重新启动 module.exports = { // 网页的标题 title: "人力资源系统", /** * @type {boolean} true | fa ...

  6. Fluent Operator v2.0 发布:Fluent Bit 新的部署方式——Fluent Bit Collector

    2019 年 1 月 21 日,KubeSphere 社区为了满足以云原生的方式管理 Fluent Bit 的需求开发了 FluentBit Operator.此后产品不断迭代,在 2021 年 8 ...

  7. 游戏引擎数学库 Plane

    0 前言 平面的表达方式有很多,常用的就两种.向量形式的点法式,标量形式的平面方程.两者可以互相转化. \[(\mathbf{p}-\mathbf{p_0})\cdot\mathbf{n}=0 \] ...

  8. Java高并发,ThreadPoolExecutor线程池技术

    Java当中的线程池是通过Executor这个框架接口来实现的,该框架当中用到了Executor,Executors工具类,ExecutorService,ThreadPoolExecutor Exe ...

  9. sqluldr2linux64.bin命令行下的Oracle数据导出工具

    sqluldr2.bin是Oracle数据库下,数据导出的工具 (1)query导出 ./sqluldr2.bin user=用户/密码@主机IP/数据库名  query="select  ...

  10. Nginx 安全配置

    server { listen 8089; server_name 10.5.210.203:8089; #charset koi8-r; #access_log logs/host.access.l ...