pcsms_8GrpPPji 发表于 2020-8-13 17:23:15

宏指令-运算

宏指令初学者求各位大师指点,最好有例子。拜谢!!!

邮箱:409843441@qq.com

wwjdtmf 发表于 2020-8-28 12:04:13

搞好没?变量LW最好改RW停电保持地址,免得开机又要输入数据

pcsms_nma5SeLp 发表于 2021-5-12 17:16:53

GetData(a, "Local HMI", LW, 60, 1)
GetData(b, "Local HMI", LW, 62, 1)
c=a*b
SetData(c, "Local HMI", LW, 64, 1)

pcsms_oBudRLgL 发表于 2021-5-13 22:36:58


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

pcsms_oBudRLgL 发表于 2021-5-13 22:46:33

可能有人会有疑问,为什么要定义一个无符号的int变量
因为:百分比×参数的值会超过short变量,造成运算位丢失
我就吃过这个亏,比如我直接写成jieguo=baifenbi*canshu/100
HMI的运行逻辑是,把baifenbi*canshu运算出来的值存入canshu,然后在除以100
因为上面定义的canshu是无符号short类型数据,数据上限是65535,那么百分比50*参数5000,结果是250000,超过了65535,所以溢出的高位数据就失效了,最后造成计算结果不对.
威纶通开发人员估计没考虑让大家用宏进行复杂的计算,希望能改一改.
页: [1]
查看完整版本: 宏指令-运算