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("打开成功", "提示");
            }
        }
    }
}

posted @ 2024-11-12 14:05  小卡拉咪  阅读(16)  评论(0编辑  收藏  举报