登录
首页 PLC论坛 PLC论坛
回帖 发帖
正文

主题:求助winform连接plc

点击:1896 回复:5

一个项目两个窗体
一个主窗体和一个软键盘窗体。连接西门子S71200的程序是在主窗体里,可以成功连接plc并读取数据。问题是第二个窗体连接不到plc啊。
哪位大神帮看下
主窗体连接程序
public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }
       public Plc plc = new Plc(CpuType.S71200, "ip地址", 0, 1);  //这里地址改了,因为论坛以为我输入电话号了
       private void button1_Click(object sender, EventArgs e)
       {
           try
           {
               plc.Open();//连接PLC
           }
           catch (Exception)
           {
               MessageBox.Show("连接时间超时,请检查网络");
           }
第二个窗体就是软键盘窗体的程序 直接实例化form1,得到form1的对象fo1,调用fo1的plc对象。问题是连接不上
private void label1_Click(object sender, EventArgs e)
       {
           this.label1.BackColor = Color.Red;
           Form1 fo1=new Form1();
           if (fo1.plc.IsConnected == false)
           {
               MessageBox.Show("未连接PLC!", "连接提示", MessageBoxButtons.OK);
           }
           else
           {
               try
               {
                   string[] arr = (fo1.txt_read_addr.Text.ToUpper()).Split('.');
                   string valuetype = arr[1].Substring(0, 3);
                   if (valuetype == "DBX")
                   {
                      fo1. plc.Write(fo1.txt_read_addr.Text.ToUpper(), Convert.ToBoolean(this.textBox1.Text));
                   }
                   else if (valuetype == "DBW")
                   {
                       var value = short.Parse(this.textBox1.Text);
                       fo1.plc.Write(fo1.txt_read_addr.Text.ToUpper(), value);
                   }
                   else if (valuetype == "DBD")
                   {
                       double value = double.Parse(this.textBox1.Text);
                      fo1. plc.Write(fo1.txt_read_addr.Text.ToUpper(), value);
                   }
                   else
                   {
                       MessageBox.Show("请检查地址是否输入错误!", "输入提示", MessageBoxButtons.OK);
                   }
               }
               catch (Exception Ex)
               {
                   MessageBox.Show("请检查输入的“地址”或“值”是否错误!", "输入提示", MessageBoxButtons.OK);
               }
           }
22-02-20 20:14
记得在其他地方见过有一种写法是把那个PLC连接做成静态的,供全局使用,这样在任何窗体都可以调用。
22-02-24 17:46
Form1 fo1=new Form1();  你创建一个新的了,fo1.plc.IsConnected  中的plc 和你打开的主界面中的Plc不是同一个对象
22-02-25 13:30
您说的我也想到了,但是不论是静态类还是静态方法,里面都不允许实例成员出现,那样就没法new出plc的对象了。那岂不是根本连接不上?
22-02-25 18:40
该怎么解决?谢谢
22-02-25 18:52
public static Plc plc = new Plc(CpuType.S71200, "ip地址", 0, 1);  //加个static,另外一个直接用 Form1.plc
或者将这个plc在打开另外一个界面的时候以参数的形式传到另外一个界面,总之确保另外一个界面用的是同一个对象就行
22-02-25 19:04

工控新闻

更多新闻资讯