C#模拟PLC设备运行

发布时间 2023-09-06 09:22:46作者: CHHC

涉及:控件数据绑定,动画效果

using System;
using System.Windows.Forms;

namespace PLCUI
{
    public partial class MainForm : Form
    { 
        public MainForm()
        {
            InitializeComponent();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            // 方式2:基于事件的方式,将控件和数据进行绑定,优点:在任何地方改变变量的值,所绑定的控件也能同时改变
            lblValue_D100.DataBindings.Add("Text", Program.PlcData, "D100");
            ucRightBelt1.DataBindings.Add("Data", Program.PlcData, "D100");
        }

        private void btnSimulate_Click(object sender, EventArgs e)
        { 
            timer1.Enabled = true;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            // 模拟数据
            Program.PlcData.D100++;

            if (Program.PlcData.D100 > 15)
            {
                Program.PlcData.D100 = 0;
            }

            // 方式1:基于轮询的方式,查询到plc数据,然后进行更新
            //lblValue_D100.Text = Program.PlcData.D100.ToString();
            //int status = 0;
            //if (Program.PlcData.D100 >= 0 && Program.PlcData.D100 <= 5)
            //{
            //    status = 0;
            //}
            //else if (Program.PlcData.D100 > 5 && Program.PlcData.D100 <= 10)
            //{
            //    status = 1;
            //}
            //else if (Program.PlcData.D100 > 10 && Program.PlcData.D100 <= 15)
            //{
            //    status = 2;
            //}
            //ucRightBelt1.ShowImage(status);
        } 
    }
}
using System.ComponentModel;

namespace PLCUI
{
    public class PLCData : INotifyPropertyChanged
    { 
        static int d100;
        static int d101; 
        
        public int D100
        {
            get { return d100; }
            set
            {
                d100 = value;
                OnPropertyChanged(nameof(D100));
            }
        }

        public int D101
        {
            get { return d101; }
            set
            {
                d101 = value;
                OnPropertyChanged(nameof(D101));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}
using System;
using System.Windows.Forms;

namespace PLCUI.customcontrol
{
    public partial class ucRightBelt : UserControl
    {
        int temp = 0;

        public ucRightBelt()
        {
            InitializeComponent();
        }

        public object data;

        public object Data
        {
            get
            {
                return data;
            }
            set
            {
                data = value;

                int plcdata = (int)data; int status = 0;

                if (plcdata >= 0 && plcdata <= 5)
                {
                    status = 0;
                }
                else if (plcdata > 5 && plcdata <= 10)
                {
                    status = 1;
                }
                else if (plcdata > 10 && plcdata <= 15)
                {
                    status = 2;
                }
                ShowImage(status);
            }
        }

        public void ShowImage(int status)
        {
            if (temp == status) return;

            temp = status;

            this.pictureBox1.Invoke(new Action(() =>
            {
                switch(status)
                {
                    case 0:
                        this.pictureBox1.Image = Properties.Resources.右皮带机待机;
                        break;
                    case 1:
                        this.pictureBox1.Image = Properties.Resources.右皮带机工作1;
                        break;
                    case 2:
                        this.pictureBox1.Image = Properties.Resources.右皮带机工作2;
                        break;
                } 
            }));
        } 
    }
}