加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Ifix学习(6)

(2019-10-31 09:57:21)
标签:

ifix

工控

分类: iFix


2019-10-31

这几天事情比较多,只能见缝插针的学一下iFix了,主要学习了两个小问题,一个是读写模拟量的某个bit的方法。因为这两年比较喜欢在wincc+s7中采用这种方法来实现设备状态的显示、报警和操作,一个设备用一个控制字来实现各种操作,用一个状态字来显示各种状态、模式和报警等等,感觉蛮方便的。去年做的施耐德plc+citect的项目也是采用了这种思路去做,所以想看看ifix里面怎么来实现这种方法。

先测试按bit写数据,结果发现SIM驱动对双整型变量支持的有点问题,例如把AI数据块高限设定为21亿,然后在画面上输入123456,则画面数据会变为128176。也许真正的PLC驱动不会有这样的问题吧,以后准备用西门子plc的驱动来测试一下。

那么先按照整数范围也就是int/word型变量(0-65535)来测试读写,先测试写某个bit

'SET BIT1

Const bit1 = &H2

Dim tempVar As Variant

Dim strVar As String

tempVar = ReadValue("Fix32.MYFIX.AI1_CMD_WORD.F_CV")

strVar = Str(tempVar Or bit1)

WriteValue strVar, "Fix32.MYFIX.AI1_CMD_WORD.F_CV"

 

考虑到代码的复用性,这段代码其实可以改写为一个通用的模块,功能是对指定变量的某个bit置位或者复位。再来看看如何用一个变量的其中一个bit来控制颜色变化或者闪烁,点开变量的表达式编辑器界面,在底部就可以编辑一个公式,形如“tag名称" and 128 ,但是实际上这里的and操作符却是一个逻辑运算符,而不是我期望的按位运算符!真的是非常的奇怪啊。查看电子手册,大意是当两个操作数是数值表达式就是按位运算,但是这里却不是啊,郁闷了。又想着是不是可以写一个公用的函数来取bit,可是函数写好以后发现根本不能写在表达式中!

网上搜了一下,关于取一个int变量的bit位,有一些方法:

1、用AR类型的数据块,然后字段写成F_0\F_1这种,试了一下,这种方法无效。后来再搜,有人说其实是用DR类型,果然我试了一下ok,这种方法其实是利用了地址的偏移。例如定义一个sim驱动下的DR数据块叫做DDD,地址是810,如果要访问地址为811的数据块,那么在画面或者脚本中就写成DDD.F_1,以此类推。甚至有人说他在工程里面只建立几个DR数据块用来访问上千个bit变量,果然是思路独特啊。

2、用D16类型的数据块,这个据说5.0以后就有,但是需要另外加载。在电子书中搜索d16,果然搜到了“理解数据库扩展块”,根据手册描述,找到安装目录下的btkcfg程序运行、加载,然后重新运行ifix就可以新建d16类型的数据块了。但是发现d16类型的数据块似乎是只读的,那么我只好多创建一个同地址的AI数据块来负责对bit进行写操作,感觉这样有点不方便啊。不过d16数据块应该是可以按bit来定义报警的,而前面的DR数据块则好像不行,这点有待于后面学习报警的时候再搞清楚吧。

   第二个小问题是对象的变色,本以为是非常简单的事情,没想到竟然跟我想象的不一样。例如我的需求是利用一个模拟量的数值变化来控制一个矩形框的颜色变化,但是测试下来总是有我没有定义过的黑色出现,一番折腾下来我终于发现如果要设定“完全匹配”,那么变量的范围必须修改一下,例如需求是0绿,1红绿闪烁,2红,3绿,则变量范围最好定义为0-3,否则就出现古怪的黑色了。真的是不太懂iFix的颜色变化机制啊,只能先这么适应一下吧。

    下一步就准备学习iFix的画面框架、报警和归档等问题了。忽然想起以前看过的一篇opc学习十日谈的帖子,想想自己学iFix也差不多十天了吧,感觉刚刚跨进iFix的大门,很多东西还不了解,还得继续努力。

0

阅读 收藏 喜欢 打印举报/Report
前一篇:Ifix学习(5)
后一篇:Ifix学习(7)
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有