C#Winform中窗体之间通信

一、子父窗体通信

1.使用公共静态变量传值

主窗体frmMain中代码

public partial class frmMain : Form
{
 //声明工位ID 为公共静态变量
 public static string terminalID = "";
 //给静态变量赋值
 terminalID = "q13bh01-bh12";
 }

子窗体frmGroup中代码

private void frmGroup_Load(object sender, EventArgs e)
{
    this.txtTerminalID.Text= frmMain.terminalID.Trim(); 
    //可以再赋值给静态成员,方便其他窗体调用
    frmMain.terminalID = "q13bh01-bh11";
}

特点 : 双向传值,实现简单
缺点: 静态变量在类加载的时候分配内存,存储于方法区,一般不会被销毁,在系统不够内存情况下会自动回收静态内存,这样就会引起访问全局静态错误。

2.使用公共变量传值

主窗体frmMain中代码

public partial class frmMain : Form
{
 //声明工位ID 为公共变量
 public string terminalID = "";
 //给变量赋值
 terminalID = "q13bh01-bh12";
 //单击‘行为’按钮的时候会给窗体传值
  private void btnGroup_Click(object sender, EventArgs e)
        {
            frmGroup frmGro = new  frmGroup();
            //变量传值 ,注意顺序写在ShowDialog()方法之前
            frmGro .stationID = this.terminalID;
            frmGro .ShowDialog();
        }
 }

子窗体frmGroup中代码

`public partial class frmGroup : Form
  {
    //定义公共属性
    public string stationID = "";
  }

特点 : 单向传值,只能主窗体给子窗体传值,实现简单

3.使用事件传值

首先定义一个事件

 public class RefreshEventArg : EventArgs
    {
        public string Text { get; set; }
    }

子窗体:

    public partial class frmGroup : Form
    {
        public frmGroup()
        {
            InitializeComponent();
        }
        public void ShowText(string strData)
        {
            textBox1.Text = strData;
            textBox1.Refresh();
        }
        public void AfterTxtChange(object sender, EventArgs e)
        {
            //拿到父窗体传来的文本,强转数据类型
            RefreshEventArg arg = e as RefreshEventArg;
            this.ShowText(arg.Text);
        }
    }

主窗体:

  public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }
        public event EventHandler AfterMsgChange;
        ///事件具体实现
        private void SetContent_Click(object sender, EventArgs e)
        {
            AfterMsgChange(this, new RefreshEventArg() { Text = this.textBox1.Text });
        }
        private void btnGroup_Click(object sender, EventArgs e)
        {
            frmGroup jsd = new frmGroup();
            //初始化事件  
            AfterMsgChange += jsd.AfterTxtChange;
            jsd.Show();
            
        }
    }

特点 :适合数据实时回传。

二、非子父窗体通信

     /// <summary>
        /// 等待服务器连接,并且创建一个负责通信的Socket
        /// </summary>
        void Listen(Socket socketWatch)
        {
            //负责监听的Socket来接收客户端的连接
            while (true)
            {
                //接收客户端消息线程
                Task.Run(() => Recive(socketSend));

            }
        }
        /// <summary>
        /// 不停的接受服务器发来的消息
        /// </summary>
        void Recive(Socket socketWatch)
        {
            while (true)
            {
                try
                {
                    //客户端连接成功后,服务器应该接受客户端发来的消息
                    byte[] buffer = new byte[1024 * 1024 * 4];
                    int r = socketWatch.Receive(buffer);

       if (buffer[0] == 0)
          {
            string str = Encoding.UTF8.GetString(buffer, 1, r - 1);
          this.Invoke(new Action<string>(ShowMsg), socketWatch.RemoteEndPoint.ToString() + ":" + str);
          }
             }
                catch (Exception ex)
                {

                    throw;
                }

                Thread.Sleep(1000);
               
            }
        }
        /// <summary>
        /// 记录操作
        /// </summary>
        /// <param name="str"></param>
        void ShowMsg(string str)
        {
            txtLog.AppendText(str + "\r\n");
        }
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
欧姆龙通讯一般指的是与欧姆龙PLC进行通信,通常使用欧姆龙的HostLink协议或FINS协议进行通信。这里提供一个使用HostLink协议进行通信的示例代码: 1. 在WinForm窗体上添加一个按钮和一个文本框,用于发送和接收数据。 2. 引用欧姆龙HostLink通讯的DLL库文件(OmronHostLink.dll)。 3. 编写代码: ```csharp using System; using System.Windows.Forms; using OmronHostLink; namespace OmronHostLinkTest { public partial class Form1 : Form { // 定义HostLink通讯对象 private OmronHostLink hostLink = new OmronHostLink(); public Form1() { InitializeComponent(); } private void btnConnect_Click(object sender, EventArgs e) { // 设置PLC的通讯参数 hostLink.SerialPortName = "COM1"; hostLink.BaudRate = 9600; hostLink.DataBits = 7; hostLink.Parity = OmronHostLink.Parities.Even; hostLink.StopBits = OmronHostLink.StopBits.One; try { // 打开通讯端口 hostLink.Open(); // 连接PLC hostLink.Connect(); MessageBox.Show("连接成功!"); } catch (Exception ex) { MessageBox.Show("连接失败:" + ex.Message); } } private void btnDisconnect_Click(object sender, EventArgs e) { // 断开PLC的连接 hostLink.Disconnect(); // 关闭通讯端口 hostLink.Close(); MessageBox.Show("断开连接成功!"); } private void btnSend_Click(object sender, EventArgs e) { // 发送读取PLC数据的命令 OmronHostLink.WordData data = hostLink.ReadWord(0x82, 0, 1); // 将数据显示在文本框 txtRecv.Text = data.ToString(); } } } ``` 4. 在窗体上的按钮的Click事件调用对应的函数即可进行通讯操作。 需要注意的是,HostLink通讯需要使用RS232串口进行连接,需要根据实际情况设置相应的通讯参数(如串口号、波特率、数据位、校验位、停止位等)。此外,还需要根据PLC的具体情况设置读取和写入数据的地址和数据类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雾里看花0514

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值