作者 | 主题 |
---|---|
梦到内河 侠客 经验值: 730 发帖数: 10 精华帖: 3 |
楼主 2018-11-09 00:05:25
主题:C#开发.NET控件实现WINCC用户归档(配方)的下拉框选择工艺 WINCC用户归档(配方)使用C#实现下拉列表选择工艺(传统方式要么使用按钮配合ID来控制,要么使用配方视图,按钮小的可怜),所有突发奇想就自己写了一个.NET控件来代替传统操作方式,当然是要WINCC自带的VBS脚本和C脚本也可以实现此功能,但是WINCC的脚本开发环境实在不好用,所有就放弃了;还是宇宙第一Visual Studio 好用 下面先来看下效果,后面再介绍怎么在WINCC里实现的 是不是感觉很方便,下拉框选择 工艺名称就可以自动调取相对应的参数列表,点击下载按钮就把数据下载到PLC里 下面来看看WINCC里怎么配置的,最后再解释C#里怎么编写的 1.添加C#写好的.NET控件,在我的控件里选择对象 2.选中.NET控件的路径,会自动出现控件内容,勾选上 3.添加之后会在我的控件里多出一个控件,可拖拽至画面中 4.拖拽到画面中就会看到红色区域内界面 5.添加一些内部变量,供用户归档控制使用(名称和数据类型必须和图内一致) 到这里WINCC的配置就结束了,是不是感觉很简单;没错,简单就对了 组态软件里要的就是简单粗暴。。。。。。。。 下面就来看看细腻的C#实现方法,这个可是麻烦又温柔的,别小看一个WINCC简单的控件,你不知道厂家在后台写了多少行代码才实现,比如WINCC里的IO域(输入的时候停止更新显示信息,而且输入的时候内容默认全选,输入完成后改变PLC变量状态,同时又继续更新显示) 这可是繁琐的事件操作,在我们看来也就是一拖一放一配置就完事了。。。。好了,废话不多说了,进入正题。。。。 1.咱们先来做好界面,在这里我就随便拖几个控件,不讲究美观了,实现功能为主 2.画面做好了,我们就来讲讲整个控件的思路,WINCC的用户归档数据全部存储在SQL数据库里,我们可以进入整个数据库来查看下具体数据,一旦能让我们进入数据库那么里面的数据还不任由我们C#代码提取了 ,下面来看看数据库里的内容:首先,数据库名字最后一个字母带R的就是我们正在运行的,然后UA#Recipe_1就是我们的用户归档名称,打开表就看到我们的数据内容了 3.在WINCC里我们知道控制用户归档的主要两个变量就是ID和JOB,这里ID只能为数字而且是增量不可更改,JOB是命令(控制新建,保存,下载,删除),还需要一个供我们用户识别的代号(工件名称),这时就需要再新建一个变量当做工件名称选择 4.主要以C#去查询工件名称这个变量信息再去索引与它相对应得ID号,这样就可以名称和ID对应,调取就不是事了,下面来看代码: 5.只有WINCC运行起来后才可调取数据库,因为数据库是在运行后才有的,我找了两个WINCC运行后才会出现的进程来判断WINCC是否运行 6.新建按钮,保存按钮,下载按钮,删除按钮都通过操作WINCC的内部变量来实现操作,这里使用到了一个dll, 只有在安装WINCC后计算机才会出现这个,这是WINCC提供外部程序访问变量的一个API 7.这里还使用到了ini文件的配置,为了掉电保存当前选择是哪一项工艺,当然也可以使用PLC变量来做(PLC有掉电保存区域),我在这里为了和PLC分离所有使用了ini来保存到计算机里,计时没有PLC也可以保持。 文章写到这里也该结束了,如果看不太明白的可以到GitHub下载源码来研究(一定要引用WinCC HMIRuntime 1.0 Type Library,否则没办法和WINCC通讯,且程序会报错) GitHub地址: https://github.com/lt8300877/WinccRecipeLib 喜欢的可以Star或者Fork 有兴趣讨论的也可以加QQ:8300877 QQ群:923525781 一起学习一起进步 在这里来点杂谈,其实我们做为西门子的忠实粉丝,他的软件产品里太多微软的痕迹,不过也是基于.NET平台做的开发,不难发现在博图里数据结构什么的都和.NET里类似了,越来越接轨了,在高版本的1500里已经支持C/C++语言开发了,在这里给大家提点建议,我们能使用C#写一个配方的.NET控件来嵌入到WINCC里使用,同样以后遇到复杂的数据存储或者操作的时候WINCC往往满足不了功能需求,这时也可以自己开发一个控件嵌入WINCC使用,不失为一种好办法。 现在做工控的和IT接轨越来越近了,视觉 AI Python 什么的在这几年都应用到了工控领域,较多的工程师喜欢使用Halcon和OpenCV开发视觉识别,都是应用在工控领域,在十年前根本不可想象;还有现在比较前卫的HTML5+CSS开发WEB来代替传统SCADA;OPCUA的广泛应用,云端的推行,让手机,电脑,Ipad各种设备都能去监控工业数据,统统一个浏览器就搞定;这个趋势也是体现了工控行业已经不是老一套(玩玩PLC,搞搞组态,拖几个触摸屏)就能继续活下去时代。。。。。。。。。。 这次就到这里吧,等下次再研究出来新功能了继续和大家分享干货,第一次看帖的可以进我的个人信息看看之前发的几篇帖子,都是干货哦 |
Zaxife 至圣 经验值: 12573 发帖数: 2503 精华帖: 31 |
1楼 2018-11-09 07:47:45
主题:回复:C#开发.NET控件实现WINCC用户归档(配方)的下拉框选择工艺
其实,我还是喜欢直接用文本列表做菜单;
我比较喜欢能够直观的看到所有配方以及配方的所有数据; 所以,原配控件刚好WinCC7感觉调用不同版本.net各种兼容性问题太拉仇恨了。 至于Web,nodejs+chorme浏览器棒棒的。nodejs有全套webserver组件可用,串口、以太网…乃至各种协议。chorme浏览器特性比其他浏览器多太多浏览网页的不二选择。 至于MSVS宇宙最好用?java笑了,众多嵌入式笑了,就微笑的看着你不说话。 |
xxctjd 侠圣 经验值: 4241 发帖数: 583 精华帖: 3 |
2楼 2018-11-09 08:34:27
主题:回复:C#开发.NET控件实现WINCC用户归档(配方)的下拉框选择工艺 太强大了,最近在测试C#编写的服务软件与PLC远程交互的通讯速度,目前结果还不错。 |
华山松柏 奇侠 经验值: 5622 发帖数: 541 精华帖: 3 |
3楼 2018-11-09 09:48:19
主题:回复:C#开发.NET控件实现WINCC用户归档(配方)的下拉框选择工艺 感觉楼主好强大,C#语言比较难学,VB。NET研究过一段时间感觉好掌握一点,不过也就了解一下,以后跨界IT是工控人必须掌握的。
学无止境
|
渔明鱼工 至圣 经验值: 23902 发帖数: 2059 精华帖: 78 |
4楼 2018-11-09 09:57:08
主题:回复:C#开发.NET控件实现WINCC用户归档(配方)的下拉框选择工艺
网鱼能够改善伙食,还能释放工作中的压力。
|
z349568117 侠士 经验值: 1225 发帖数: 43 精华帖: 0 |
6楼 2018-11-09 11:28:32
主题:回复:C#开发.NET控件实现WINCC用户归档(配方)的下拉框选择工艺 |
黑猫警长W 至圣 经验值: 18394 发帖数: 2409 精华帖: 1 |
7楼 2018-11-09 13:22:19
主题:回复:C#开发.NET控件实现WINCC用户归档(配方)的下拉框选择工艺 |
不断攀登 至圣 经验值: 12543 发帖数: 1843 精华帖: 0 |
8楼 2018-11-10 08:21:49
主题:回复:C#开发.NET控件实现WINCC用户归档(配方)的下拉框选择工艺 感谢 分享!
邮箱 yongquancun@126.com
|
yuyongxing 奇侠 经验值: 7323 发帖数: 94 精华帖: 0 |
9楼 2018-11-10 08:38:41
主题:回复:C#开发.NET控件实现WINCC用户归档(配方)的下拉框选择工艺 学习了,最近有相关的脚本程序需要编制一下,谢谢
Do my best everyday
|
master_mb 侠圣 经验值: 4030 发帖数: 1259 精华帖: 6 |
10楼 2018-11-10 08:49:31
主题:回复:C#开发.NET控件实现WINCC用户归档(配方)的下拉框选择工艺
最近在做一个c#通过1500集成的web server访问PLC的测试。 想搞成类似于HMI功能的画面,无需任何驱动,只需通过网页访问。 实现倒是实现了,感觉速度太慢了。(是server刷新的速度慢,不是访问速度慢) 有做过类似应用的希望交流。
另外 msvs确实是多数人公认的宇宙第一开发环境。 据说.netcore也要支持UI跨平台了,拭目以待吧。
QQ 402550360 TEL 17606539722
|
imycat 侠士 经验值: 1321 发帖数: 276 精华帖: 0 |
14楼 2018-11-13 15:44:47
主题:回复:C#开发.NET控件实现WINCC用户归档(配方)的下拉框选择工艺 楼主的想法不错,可惜路走偏了,记住不要去read wincc sql, 没有打击楼主的意思
var cols = ccuc.GetColumnCollection(); var colCount = cols.Count; for (int i = 0; i < colCount; i++) { var col = cols[i] as ICCAxUAColumn; Trace.WriteLine(col.Name); } 3. 拿到选定的row var row = ccuc.GetSelectedRow(); if(row!=null) { var count = row.CellCount; for (int i = 1; i <= count; i++) { Trace.WriteLine(row.CellText[i]); } } 枚举所有row var rows = ccuc.GetRowCollection(); foreach (ICCAxDataRow r in rows) { var count = r.CellCount; for (int i = 1; i <= count; i++) { Trace.WriteLine(r.CellText[i]); } } |