宏指令-运算
宏指令初学者求各位大师指点,最好有例子。拜谢!!!邮箱:409843441@qq.com 搞好没?变量LW最好改RW停电保持地址,免得开机又要输入数据 GetData(a, "Local HMI", LW, 60, 1)
GetData(b, "Local HMI", LW, 62, 1)
c=a*b
SetData(c, "Local HMI", LW, 64, 1)
macro_command main()
unsigned char baifenbi,cishu //定义变量类型
unsigned short canshu //参数值
unsigned int guocheng //过程变量
unsigned short jieguo //结果值
GetData(baifenbi, "HMI", LW, 0, 1) //读取LW0的当前值
GetData(canshu, "HMI", LW, 10, 10)//读取LW10到LW19的值分别存入canshu到canshu
for cishu = 0 to 9 step 1 //变量cishu从0到9一次计算,每次cishu值+1
guocheng = baifenbi * canshu //百分比*参数值
jieguo = guocheng / 100
next
SetData(jieguo, "HMI", LW, 101, 10) //将运算结果写入HMI,方便查看运算结果是否正确
SetData(jieguo, "MODBUS RTU", 3x, 1, 10) //将运算结果写入目标设备
end macro_command 可能有人会有疑问,为什么要定义一个无符号的int变量
因为:百分比×参数的值会超过short变量,造成运算位丢失
我就吃过这个亏,比如我直接写成jieguo=baifenbi*canshu/100
HMI的运行逻辑是,把baifenbi*canshu运算出来的值存入canshu,然后在除以100
因为上面定义的canshu是无符号short类型数据,数据上限是65535,那么百分比50*参数5000,结果是250000,超过了65535,所以溢出的高位数据就失效了,最后造成计算结果不对.
威纶通开发人员估计没考虑让大家用宏进行复杂的计算,希望能改一改.
页:
[1]