WinCC脚本对变量位读写
有时候在项目里面需要对一个变量的位进行操作,比如为了节省授权,一个无符号32位的变量可以节省31个BOOL类型的变量,我项目做的比较少,其他时候应该也有这样的需求,这里分别就用C和VBS脚本对变量的每一位的操作介绍一下。
在VBS脚本脚本里面,“AND”即有逻辑与运算的功能,也有对变量进行按位与运算,“OR”即有逻辑或运算的功能,也能对变量进行按位或运算,字面意思就能分辨。在C脚本里面的是按位与运算“&”;按位或运算是“|”。
当对一个变量的某一位操作的时候,需要注意不能影响其他位的状态,根据逻辑运算可以知道,和TRUE进行逻辑运算,结果是不变的,和False进行或运算,结果也是不会发生改变的,所以不管VBS还是C脚本,对位操作都是这个思路,想对一个变量的某一位置1的时候,就进行按位或运算,该位是1,其他位都是0,对变量的某一位置0的时候,进行按位与运算,该位是0,其他位是1,举个例子,在VBS脚本里面对一个8位无符号的变量的第4位(0位开始),分别进行置1和置0的脚本如下:
'对第4位置1
Dim BIT
Set BIT = HMIRuntime.Tags("8BIT")
BIT.Write BIT.Read Or 16
'下面是对第4位置0
Dim BIT
Set BIT = HMIRuntime.Tags("8BIT")
BIT.Write BIT.Read And &HEF
C脚本里面对第7位置1和置0如下:
// 下面是对第7位置1,去除了WinCC里面的注释
#define TAG "8BIT"
SetTagByte(TAG,(BYTE)(GetTagByte(TAG) | 0x80));
// 下面是对第7位置0
// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
#define TAG "8BIT"
// next TagID : 1
// WINCC:TAGNAME_SECTION_END
// WINCC:PICNAME_SECTION_START
// syntax: #define PicNameInAction "PictureName"
// next PicID : 1
// WINCC:PICNAME_SECTION_END
SetTagByte(TAG,(BYTE)(GetTagByte(TAG) & 0x7F));
上面是对变量的写操作,那还有对变量的读操作,下面以WinCC8.0为例,我个人认为常用的4中方法分别说明一下。
忘了哪个版本新增的动画组态功能,有点类似博途组态动画的操作,组态的大题过程看图里面的箭头

再就是WinCC所有版本里面都有的直接动态对话框组态,看附图

VBS脚本,这次以图片的形式显示吧

C脚本,也是用图片显示

如果只是一般的状态显示,推荐第一种或者第二种,除非脚本还有别的功能,要不然不推荐脚本,一个画面里面脚本多了,会影响运行速度的。最后是动图演示,呃,那个变量名写错了,本来是想用32位的,结果做画面的时候32位实在太麻烦了,所以变量名就改成了8BIT:

PS:
做这种有技术性的内容,还是比较麻烦的,需要做画面,然后测试,测试没问题了,再写出来,最后做动图了才发现变量名称没改,不想再弄了,就这样吧