电工学习网

 找回密码
 立即注册
查看: 1738|回复: 0
打印 上一主题 下一主题

C#/.NET联合西门子WinCC实现数据通信分享心得

[复制链接]
跳转到指定楼层
楼主
发表于 2021-2-6 16:25:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
以下如何使用C#/.NET联合西门子WinCC实现数据通信
1 环境搭建
众所周知,WinCC作为西门子家族的一款组态软件,主要是用来和plc(主要是西门子plc)通信,因此我们选择的硬件就是一款西门子S7-1200 PLC。软件方面,使用的是WinCCV7.4(其他版本待测试),以及宇宙第一IDE——VS 2019。
这里注意一下:测试时当安装好WinCC V7.4,通过添加驱动和S7-1200 PLC通信时,怎么都连接不上,最后发现应该是WINCC的S7-1200 PLC的驱动有点BUG,缺少一些组件,通过安装TIA博图之后,最终解决。
如果想通过C#联合WINCC访问到PLC里的变量,前提是WINCC项目已经开发好,并且处于运行状态,操作步骤如下:
首先创建一个S7连接,并创建4个变量分别为data1、data2、data3、data4,地址对应DB100.DBD0、DB100.DBD4、DB100.DBD8、DB100.DBD12;
C#/.NET联合西门子WinCC实现数据通信分享心得

创建一个画面,拖入4个显示控件,分别绑定这4个变量,通过博图将4个变量的值分别设置为50.5、60.5、70.5、80.5;
C#/.NET联合西门子WinCC实现数据通信分享心得

运行WINCC画面;
C#/.NET联合西门子WinCC实现数据通信分享心得

最后要做的是通过编写一个简单的Winform程序来读取WINCC中这4个变量的值并显示,这里有两种方式可以实现这样的效果,一种是通过直接访问WINCC变量进行读取,另一种是通过访问WINCC画面中的控件。
2 访问WINCC变量
首先创建一个新的Windows窗体应用,再从WINCC安装目录中找到两个dll,分别是CChmiRuntime.dll和CCHMITags.dll,位置默认处于C:Program Files (x86)Common FilesSiemensBin,将这两个dll复制到debug根目录下并手动添加引用。
C#/.NET联合西门子WinCC实现数据通信分享心得

Windows窗体界面设计如下图所示:
C#/.NET联合西门子WinCC实现数据通信分享心得

编写读取变量代码
       //创建通信对象        CCHMIRUNTIME.HMIRuntime hmi = new CCHMIRUNTIME.HMIRuntime();
       //创建计时器        Stopwatch sw = new Stopwatch();
       ///         /// 读取变量        ///         ///         ///         private void btn_Read_Click(object sender, EventArgs e)        {            //开始计时            sw.Restart();
           //读取变量            object data1 = hmi.Tags["data1"].Read();            object data2 = hmi.Tags["data2"].Read();            object data3 = hmi.Tags["data3"].Read();            object data4 = hmi.Tags["data4"].Read();
           //显示变量            this.txt_data1R.Text = data1?.ToString();            this.txt_data2R.Text = data2?.ToString();            this.txt_data3R.Text = data3?.ToString();            this.txt_data4R.Text = data4?.ToString();
           //显示耗时            this.lbl_Time.Text = sw.ElapsedMilliseconds.ToString() + "ms";        }编写写入变量代码
       ///         /// 写入变量        ///         ///         ///         private void btn_Write_Click(object sender, EventArgs e)        {             //开始计时            sw.Restart();
           //写入变量            try            {                hmi.Tags["data1"].Write(Convert.ToSingle(this.txt_data1W.Text));                hmi.Tags["data2"].Write(Convert.ToSingle(this.txt_data2W.Text));                hmi.Tags["data3"].Write(Convert.ToSingle(this.txt_data3W.Text));                hmi.Tags["data4"].Write(Convert.ToSingle(this.txt_data4W.Text));            }            catch (Exception)            {                MessageBox.Show("写入失败");                return;            }
           //显示耗时            this.lbl_Time.Text = sw.ElapsedMilliseconds.ToString() + "ms";        }
读取测试结果如下:
C#/.NET联合西门子WinCC实现数据通信分享心得

写入测试结果如下:
C#/.NET联合西门子WinCC实现数据通信分享心得

3 访问WINCC控件
重新新建一个窗体,窗体内容和布局与之前一致编写读取控件属性代码
//创建通信对象        CCHMIRUNTIME.HMIRuntime hmi = new CCHMIRUNTIME.HMIRuntime();
       //创建计时器        Stopwatch sw = new Stopwatch();
       ///         /// 读取变量        ///         ///         ///         private void btn_Read_Click(object sender, EventArgs e)        {            //开始计时            sw.Restart();            try            {                //读取变量                dynamic data1 = hmi.Screens["NewPdl1"].ScreenItems[".NET 控件1"];                dynamic data2 = hmi.Screens["NewPdl1"].ScreenItems[".NET 控件2"];                dynamic data3 = hmi.Screens["NewPdl1"].ScreenItems[".NET 控件3"];                dynamic data4 = hmi.Screens["NewPdl1"].ScreenItems[".NET 控件4"];
               //显示变量                this.txt_data1R.Text = data1.CurrentValue.ToString();                this.txt_data2R.Text = data2.CurrentValue.ToString();                this.txt_data3R.Text = data3.CurrentValue.ToString();                this.txt_data4R.Text = data4.CurrentValue.ToString();            }            catch (Exception)            {                MessageBox.Show("读取失败");                return;            }            //显示耗时            this.lbl_Time.Text = sw.ElapsedMilliseconds.ToString() + "ms";        }编写写入控件属性代码
   ///       /// 写入变量      ///       ///       ///       private void btn_Write_Click(object sender, EventArgs e)      {          //开始计时          sw.Restart();
         //写入变量          try          {              dynamic data1 = hmi.Screens["NewPdl1"].ScreenItems[".NET 控件1"];              dynamic data2 = hmi.Screens["NewPdl1"].ScreenItems[".NET 控件2"];              dynamic data3 = hmi.Screens["NewPdl1"].ScreenItems[".NET 控件3"];              dynamic data4 = hmi.Screens["NewPdl1"].ScreenItems[".NET 控件4"];
             data1.CurrentValue = Convert.ToSingle(this.txt_data1W.Text);              data2.CurrentValue = Convert.ToSingle(this.txt_data2W.Text);              data3.CurrentValue = Convert.ToSingle(this.txt_data3W.Text);              data4.CurrentValue = Convert.ToSingle(this.txt_data4W.Text);
         }          catch (Exception)          {              MessageBox.Show("写入失败");              return;          }
         //显示耗时          this.lbl_Time.Text = sw.ElapsedMilliseconds.ToString() + "ms";      }读取结果写入结果
这里值得注意的是,通过访问控件实现的写入并没有真正写入PLC,所以这种方式仅限于读取数据,但可以通过这种方式来设置控件的其他属性,比如样式、背景、文本等。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

电工学习网 ( )

GMT+8, 2024-8-23 04:24

Powered by © 2011-2022 www.shop-samurai.com 版权所有 免责声明 不良信息举报

技术驱动未来! 电工学习网—专业电工基础知识电工技术学习网站。

栏目导航: 工控家园 | 三菱plc | 西门子plc | 欧姆龙plc | plc视频教程

快速回复 返回顶部 返回列表