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,地址是81:0,如果要访问地址为81:1的数据块,那么在画面或者脚本中就写成DDD.F_1,以此类推。甚至有人说他在工程里面只建立几个DR数据块用来访问上千个bit变量,果然是思路独特啊。
2、用D16类型的数据块,这个据说5.0以后就有,但是需要另外加载。在电子书中搜索d16,果然搜到了“理解数据库扩展块”,根据手册描述,找到安装目录下的btkcfg程序运行、加载,然后重新运行ifix就可以新建d16类型的数据块了。但是发现d16类型的数据块似乎是只读的,那么我只好多创建一个同地址的AI数据块来负责对bit进行写操作,感觉这样有点不方便啊。不过d16数据块应该是可以按bit来定义报警的,而前面的DR数据块则好像不行,这点有待于后面学习报警的时候再搞清楚吧。

加载中…