请选择 进入手机版 | 继续访问电脑版

工业软件开发社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 424|回复: 3

为WINCC开发winform控件入门 控件和WINCC交互

[复制链接]

6

主题

13

帖子

402

积分

中级会员

Rank: 3Rank: 3

积分
402
发表于 2019-6-24 17:53:45 | 显示全部楼层 |阅读模式
本帖最后由 gxrsprite 于 2019-6-24 20:49 编辑

首先给目标机安装.net 4.8

先在wincc里面做一个简单的功能预备
按start显示 图1,按end显示 图2

先添加变量


我们需要两个 按钮 控件,和一个 状态显示 控件

给End按钮加上


就是用 SetTagWord("Statu",0); 把状态设置为0,这是End,Start就是SetTagWord("Statu",1);



给 状态显示-属性-其他-显示 加个C脚本



把Statu状态赋值给PicStatu,其实完全可以用一个变量,但是方便扩展添加动画嘛

状态为0是给个图1,状态为1是给个图2


准备工作做完,我们搞个更简单的winform控件,就是用label显示状态是Start还是End,做个最简单的交互


添加COM组件的引用,需要在安装有wincc的机子上

添加引用后,我们看属性可以看到文件Interop.CCHMIRUNTIME.dll的路径,可以把文件拷贝出来,在没有wincc的机子上开发

在VS2019里新建winform的类库项目,添加用户控件,界面上只放个label,Name为txt1

  1. System.Threading.Timer timer;

  2.         HMIRuntime hMI = new HMIRuntime();//引入的COM组件


  3.         private void UserControl1_Load(object sender, EventArgs e)
  4.         {
  5.             timer = new System.Threading.Timer((s) =>
  6.             {
  7.                 try
  8.                 {
  9.                     dynamic PicStatu = hMI.Tags["PicStatu"].Read(HMIReadType.hmiReadCache);//读取wincc变量
  10.                     if (PicStatu == null)
  11.                     {
  12.                         return;
  13.                     }
  14.                     this.Invoke((Action)delegate ()
  15.                     {
  16.                         if (PicStatu == 0)
  17.                         {
  18.                             txt1.Text = "End";
  19.                         }
  20.                         else
  21.                         {
  22.                             txt1.Text = "Start";
  23.                         }
  24.                     });
  25.                 }
  26.                 catch (Exception ex)
  27.                 {
  28.                     timer.Dispose();
  29.                     this.Invoke((Action)delegate ()
  30.                     {
  31.                         System.Windows.Forms.MessageBox.Show(ex.Message);
  32.                     });
  33.                 }
  34.             }, null, 0, 250);
  35.         }
复制代码
这就是两者全部的交互能力了

接下来在图形编辑器右边选择控件,添加.net控件






最终效果就是按Start显示图1和Start,按End,显示图2和End

---------
本文用最搓的例子,展示了wincc的图片状态显示,以及用winform控件开发类似的功能(还是文字的),但是这也基本展现了在wincc中开发winform控件的一定潜力,适合开发较少交互下,显示比较多内容的用户控件,并且上开发wincc .net控件说到底还是winform开发,还可以引用winform的控件库,还可以读取配置,访问wincc数据库之类的操作。
在wincc中开发东西比较繁琐,工具也很难用,c脚本和vbs脚本也没有智能提示,winform控件算是多给了一个用起来也不容易的甜点,只能说多一种选择多一条路吧。经过试验,wpf要把new HMIRuntime();这一句延迟到load事件中,否则往编辑器里一拖就crash。

本文逻辑比较混乱,而且wincc界面繁多,截图可能看不懂,更多阅读可以参考:
http://www.ad.siemens.com.cn/service/elearning/Course/683.html  wincc入门,此次功能就是模仿其第一个案例
http://www.ad.siemens.com.cn/clu ... a_id=1516617&b_id=5   wincc .net开发归档功能, 比较全的一个demo,但是没有配套的东西无法仿造重现这个demo

------
彩蛋,将群主控件用于此功能,可互动,比如用来代替Start End按钮

  1. System.Threading.Timer timer;

  2. HMIRuntime hMI = new HMIRuntime ();

  3. private void TestWinformUserControl1_Load (object sender, EventArgs e) {
  4.     timer = new System.Threading.Timer ((s) => {
  5.         if (later) {
  6.             return;
  7.         }
  8.         var tag = hMI.Tags["PicStatu"];
  9.         if (tag == null) {
  10.             return;
  11.         }
  12.         dynamic b = hMI.Tags["PicStatu"].Read (HMIReadType.hmiReadCache);
  13.         if (b == null) {
  14.             return;
  15.         }
  16.         this.Invoke ((Action) delegate () {
  17.             if (b == 0) {
  18.                 hslSwitch1.SwitchStatus = false;
  19.             } else {
  20.                 hslSwitch1.SwitchStatus = true;
  21.             }
  22.         });

  23.     }, null, 0, 250);
  24. }

  25. bool later = false;

  26. private async void HslSwitch1_Click (object sender, EventArgs e) {
  27.     later = true;
  28.     hMI.Tags["Statu"].Write (hslSwitch1.SwitchStatus ? 1 : 0, HMIWriteType.hmiWriteSync);
  29.     await Task.Delay (500);
  30.     later = false;
  31. }
复制代码





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

1

主题

23

帖子

46

积分

新手上路

Rank: 1

积分
46
发表于 2019-7-1 22:42:17 | 显示全部楼层
求问,Wincc中放置群主控件,密匙怎么解决!  
还有在画面中放置控件较多的情况下画面会卡顿,比较严重的那种,管道控件已经在项目上用了,出现这个问题!后面我尽量减少使用这个控件
回复

使用道具 举报

6

主题

13

帖子

402

积分

中级会员

Rank: 3Rank: 3

积分
402
 楼主| 发表于 2019-7-2 09:40:39 | 显示全部楼层
本帖最后由 gxrsprite 于 2019-7-2 09:44 编辑
zjx 发表于 2019-7-1 22:42
求问,Wincc中放置群主控件,密匙怎么解决!  
还有在画面中放置控件较多的情况下画面会卡顿,比较严重的那 ...

在构造函数里注册即可,或者专门写一个只能运行一次的初始化方法,在每个控件构造函数调用,画面卡顿请使用wpf控件,管道控件已有wpf版本。
回复

使用道具 举报

1

主题

26

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2019-7-6 10:43:16 | 显示全部楼层
用winfrom写的控件放在wincc画面里确实会卡,我就在wincc上面上放了2个datagrid,画面编辑有时候会卡死的,导致死机
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|bbs.hslcommunication.cn

GMT+8, 2019-8-23 05:00 , Processed in 0.090190 second(s), 28 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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