威纶通官方论坛

宏指令不同类型数据四则运算问题

[复制链接]
发表于 2021-5-3 19:06:28 | 显示全部楼层 |阅读模式
说明:这个宏指令是每秒钟执行一次,gs[0]和gs[1]每秒增量20左右,gs[2]每秒增量50左右
为了方便大家测试我把读取PLC和部分HMI数据的部分直接赋值了.
这个宏指令可以作为宏指令初学者借鉴参考使用

这个宏指令的问题是zcsht[2]和zcsht[3]计算出来的结果是0,我也不知道是为什么,希望高手给与解答
先前zcint[4]计算出来的结果不对,后来一步一步计算结果并且输出得出结论是计算过程中数据太大溢出了临时存储器,后来临时转换了数据类型和计算顺序,算是解决了,但是相同的方式就解决不了zcsht[2]和zcsht[3],实在没有办法了才找论坛的高手帮忙研究研究


macro_command main()
//定义播种数据变量类型
unsigned int gs[3]                           //高速计数器值
unsigned short cs[3]                           //可配置参数
unsigned int zuoyouxiao,youyouxiao           //有效编码器长度
unsigned int zongshu                         //两侧种子总数
unsigned int changdu                         //行走长度(米)
float mianji                          //种植面积(平方米)
unsigned int yuanshi                         //编码器上次转存值
float sudu
//获取PLC&HMI配置数据及参数
//GetData(gs[0], "PLC1", "PLC-左侧种子脉冲数", 3)
//GetData(cs[0], "HMI", "参数-垅宽(毫米)", 3)
//GetData(zuoyouxiao, "PLC1", "PLC-左侧有效编码值", 1)
//GetData(youyouxiao, "PLC1", "PLC-右侧有效编码值", 1)
gs[0]=1344633
gs[1]=1451527
gs[2]=3243615
cs[0]=600
cs[1]=277
cs[2]=124
zuoyouxiao=3233151
youyouxiao=3243615
//直接转换单位,防止溢出
float zuozhonglv,youzhonglv           //下种率(千分比)
float longkuan,zhuju,bianma
        longkuan=cs[0]/1000
        zhuju=cs[1]/1000
        bianma=cs[2]/1000
//获取车速相关数据
//GetData(yuanshi, "HMI", "HMI-测速用编码器临时值", 1)
GetData(yuanshi, "HMI", LW, 90, 1)
//计算当前车速值
sudu = (gs[2] - yuanshi) * cs[2] / 1000 * 3600 /1000
//播种数据计算
zuozhonglv = gs[0] * zhuju / zuoyouxiao * 1000 / bianma  //(左侧种子当前值*株距*显示比例)/(左侧有效编码值*单编码距离值)
youzhonglv = gs[1] * zhuju / youyouxiao * 1000 / bianma
zongshu = gs[0] + gs[1]
mianji = zongshu * cs[0] / 1000  * cs[1] /1000
changdu = gs[2] * cs[2] / 1000
//播种数据转储
unsigned int zcint[6]   //无符号32位,占用两个
short zcsht[4]
        zcint[0] = gs[0]
        zcint[1] = gs[1]
        zcint[2] = gs[2]
        zcint[3] = zongshu
        zcint[4] = mianji
        zcint[5] = changdu
        zcsht[0] = cs[0]
        zcsht[1] = cs[1]
        zcsht[2] = zuozhonglv       //>>>>>计算不出来数值
        zcsht[3] = youzhonglv       //>>>>>计算不出来数值
SetData(zcint[0], "HMI", LW, 100, 6)     //左侧下种数
SetData(zcsht[0], "HMI", LW, 112, 4)
//车速数据转储
SetData(gs[2],, "HMI", LW, 90, 1)
SetData(sudu, "HMI", LW, 80, 1)
end macro_command
 楼主| 发表于 2021-5-4 21:37:47 | 显示全部楼层
macro_command main()
//定义播种数据变量类型
unsigned int gs[3]                           //高速计数器值
unsigned short cs[3]                           //可配置参数
unsigned int zuoyouxiao,youyouxiao           //有效编码器长度
unsigned int zongshu                         //两侧种子总数
unsigned int changdu                         //行走长度(米)
float mianji                          //种植面积(平方米)
unsigned int zuozhonglv,youzhonglv           //下种率(千分比)
unsigned int yuanshi                         //编码器上次转存值
float sudu
//获取PLC&HMI配置数据及参数
//GetData(gs[0], "PLC1", "PLC-左侧种子脉冲数", 3)
//GetData(cs[0], "HMI", "参数-垅宽(毫米)", 3)
//GetData(zuoyouxiao, "PLC1", "PLC-左侧有效编码值", 1)
//GetData(youyouxiao, "PLC1", "PLC-右侧有效编码值", 1)
gs[0]=1344633
gs[1]=1451527
gs[2]=3243615
cs[0]=600
cs[1]=277
cs[2]=124
zuoyouxiao=3233151
youyouxiao=3243615
//获取车速相关数据
//GetData(yuanshi, "HMI", "HMI-测速用编码器临时值", 1)
GetData(yuanshi, "HMI", LW, 90, 1)
//计算当前车速值
sudu = (gs[2] - yuanshi) * cs[2] / 1000 * 3600 /1000
//播种数据计算
//>>>>>>>>>>>>>>拆分原始的计算公式,改为单步处理,最大可能提高计算准确率
unsigned int zss1,yss1,zss2,yss2                    //下种率临使用变量
zss1 = gs[0] * cs[1] * 20
yss1 = gs[1] * cs[1] * 20
zss2 = zuoyouxiao * cs[2] / 50
yss2 = youyouxiao * cs[2] / 50
zuozhonglv = zss1 / zss2
youzhonglv = yss1 / yss2
//>>>>>>>>>>>>>>以上就是修改后的部分
//zuozhonglv = gs[0] * zhuju / zuoyouxiao * 1000 / bianma  //(左侧种子当前值*株距*显示比例)/(左侧有效编码值*单编码距离值)
//youzhonglv = gs[1] * zhuju / youyouxiao * 1000 / bianma
zongshu = gs[0] + gs[1]
mianji = zongshu * cs[0] / 1000  * cs[1] /1000
changdu = gs[2] * cs[2] / 1000
//播种数据转储
unsigned int zcint[6]   //无符号32位,占用两个
short zcsht[4]
        zcint[0] = gs[0]
        zcint[1] = gs[1]
        zcint[2] = gs[2]
        zcint[3] = zongshu
        zcint[4] = mianji
        zcint[5] = changdu
        zcsht[0] = cs[0]
        zcsht[1] = cs[1]
        zcsht[2] = zuozhonglv
        zcsht[3] = youzhonglv
SetData(zcint[0], "HMI", LW, 100, 6)     //左侧下种数
SetData(zcsht[0], "HMI", LW, 112, 4)
//车速数据转储
SetData(gs[2],, "HMI", LW, 90, 1)
SetData(sudu, "HMI", LW, 80, 1)
end macro_command

问题基本上是解决了,但是也损失了一些精度,一旦gs[0],和gs[1]数据过大还是会溢出,造成数据不准确
您需要登录后才可以发帖 登录 | 注册

本版积分规则

回复帖子

Archiver|小黑屋|威纶通官网 ( 粤ICP备06054553号 )

GMT+8, 2024-4-29 07:07

Powered by Discuz! X3.4

© 2001-2023 Comsenz Inc.

快速回复 返回顶部 返回列表