wjk478
级别: 正式会员
精华主题: 0
发帖数量: 5 个
工控威望: 56 点
下载积分: 299 分
在线时间: 5(小时)
注册时间: 2022-11-14
最后登录: 2024-12-06
查看wjk478的 主题 / 回贴
楼主  发表于: 2024-01-29 20:05
请教一下论坛大佬,比如寄存器中的数值:50046其中有效数字是46,放大倍数是10的5次幂即100000那么对应的浮点数值是0.00046
                                               如果数值是:30046其中有效数字是46,放大倍数是10的3次幂即1000那么对应的浮点数值是0.046
怎么实现威纶通触摸屏上显示对应的浮点数值而不是寄存器中的数值?
梦雨天涯
微信hui530527   &
级别: 网络英雄
精华主题: 0
发帖数量: 4306 个
工控威望: 7682 点
下载积分: 15305 分
在线时间: 2949(小时)
注册时间: 2016-10-31
最后登录: 2024-12-19
查看梦雨天涯的 主题 / 回贴
1楼  发表于: 2024-01-30 08:20
那就把你的数值除以100,找到余数46,然后余数除以100000,得到0.00046就行
微信hui530527      b站账号,非标自动化谭工
请不要随意加我,不会随便通过。QQ群942493953
卓发智能
相互学习,共同进步。
级别: 工控侠客
精华主题: 0
发帖数量: 2457 个
工控威望: 3066 点
下载积分: 11431 分
在线时间: 660(小时)
注册时间: 2008-08-03
最后登录: 2024-12-19
查看卓发智能的 主题 / 回贴
2楼  发表于: 2024-01-31 10:01
分二步,PLC需要运算一下,屏有内差转换设置。
相信自我!
gxtmdb82164
级别: 论坛先锋
精华主题: 0
发帖数量: 769 个
工控威望: 1147 点
下载积分: 397 分
在线时间: 604(小时)
注册时间: 2019-09-22
最后登录: 2024-12-19
查看gxtmdb82164的 主题 / 回贴
3楼  发表于: 2024-01-31 10:39
如果只是显示的话,推荐HMI后写个脚本处理,最简单最灵活
wjk478
级别: 正式会员
精华主题: 0
发帖数量: 5 个
工控威望: 56 点
下载积分: 299 分
在线时间: 5(小时)
注册时间: 2022-11-14
最后登录: 2024-12-06
查看wjk478的 主题 / 回贴
4楼  发表于: 2024-02-01 09:52
引用
引用第1楼梦雨天涯于2024-01-30 08:20发表的  :
那就把你的数值除以100,找到余数46,然后余数除以100000,得到0.00046就行

放大倍数不是一个固定的值是寄存器数值里决定的是可变的,寄存器里的数值是一个十进制的电压数值
wjk478
级别: 正式会员
精华主题: 0
发帖数量: 5 个
工控威望: 56 点
下载积分: 299 分
在线时间: 5(小时)
注册时间: 2022-11-14
最后登录: 2024-12-06
查看wjk478的 主题 / 回贴
5楼  发表于: 2024-02-01 10:01
引用
引用第3楼gxtmdb82164于2024-01-31 10:39发表的  :
如果只是显示的话,推荐HMI后写个脚本处理,最简单最灵活

是不是触摸屏写段宏指令对读取的数值进行一个数值转换,问题是这个数值转换思路是什么?寄存器内数值首位是决定放大倍数后几位是有效数值,放大倍数决定有效数值的小数位数
wjk478
级别: 正式会员
精华主题: 0
发帖数量: 5 个
工控威望: 56 点
下载积分: 299 分
在线时间: 5(小时)
注册时间: 2022-11-14
最后登录: 2024-12-06
查看wjk478的 主题 / 回贴
6楼  发表于: 2024-02-01 10:07
引用
引用第2楼卓发智能于2024-01-31 10:01发表的  :
分二步,PLC需要运算一下,屏有内差转换设置。

能不能屏直接读取数值对数值进行转换后再在屏上显示出来,只是现在转换的思路是什么?数值中包含放大倍数和有效数值怎么区别转换
gxtmdb82164
级别: 论坛先锋
精华主题: 0
发帖数量: 769 个
工控威望: 1147 点
下载积分: 397 分
在线时间: 604(小时)
注册时间: 2019-09-22
最后登录: 2024-12-19
查看gxtmdb82164的 主题 / 回贴
7楼  发表于: 2024-02-01 10:43
引用
引用第5楼wjk478于2024-02-01 10:01发表的  :

是不是触摸屏写段宏指令对读取的数值进行一个数值转换,问题是这个数值转换思路是什么?寄存器内数值首位是决定放大倍数后几位是有效数值,放大倍数决定有效数值的小数位数


所以让你用宏指令读到HMI里处理,直接转成字符串,然后分成两个子字符串,一个是位数一个是有效数值,然后再转成数值运算以后写到HMI内部地址上,HMI直接显示就行了
PC编程上的大数运算也是这样操作的,什么20位数乘以20位数,常规的数值系统都容纳不了这么大的数值,都是转成字符串以后,按四则运算的规则一位一位的算,算一位就写一位结果到字符串里面,字符串随便多长都无所谓

你这个等于是一个自定义的科学计数法,不过足够简单罢了
xuxulaifeng
级别: 探索解密
精华主题: 0
发帖数量: 31 个
工控威望: 122 点
下载积分: 637 分
在线时间: 44(小时)
注册时间: 2015-01-03
最后登录: 2024-02-04
查看xuxulaifeng的 主题 / 回贴
8楼  发表于: 2024-02-04 16:19
1.蒋数据转换为字符串
2.PLC使用字符串指令,取第一位,得到其精度,
3.PLC使用字符串指令,取除第一位外其它的值,并转换为整数
4.根据2 3条换算真正的浮点数,50046,是数值除以100000,40046是除以10000,30046是除以1000
5.在人机中显示浮点数,设置小数点后位数是可能出现最小精度
wjk478
级别: 正式会员
精华主题: 0
发帖数量: 5 个
工控威望: 56 点
下载积分: 299 分
在线时间: 5(小时)
注册时间: 2022-11-14
最后登录: 2024-12-06
查看wjk478的 主题 / 回贴
9楼  发表于: 2024-02-05 16:12
macro_command main()
unsigned short c,a,e
unsigned char b[5]
float d
GetData(a, "MODBUS RTU (zero-based addressing)", 3x, 2, 1)
//读取寄存器数值如:34567(3是放大倍数,4567为有效数值)
DEC2ASCII(a, b[0], 5)//将34567转为ASCII码
ASCII2FLOAT(b[1], d, 4)//将4567转为浮点数
c=b[0]-48//将3的ASCII码减去48得出数字(放大倍数)
//ASCII2DEC(b[0], c, 1)
POW(10,c,e)//10的c次方赋于e
d=d/e
SetData(d, "Local HMI", LW, 0, 1)
end macro_command
谢谢大佬们的解答帮助,初步程序如上基本实现显示问题
gxtmdb82164
级别: 论坛先锋
精华主题: 0
发帖数量: 769 个
工控威望: 1147 点
下载积分: 397 分
在线时间: 604(小时)
注册时间: 2019-09-22
最后登录: 2024-12-19
查看gxtmdb82164的 主题 / 回贴
10楼  发表于: 2024-02-06 10:05
引用
引用第9楼wjk478于2024-02-05 16:12发表的  :
macro_command main()
unsigned short c,a,e
unsigned char b[5]
float d
GetData(a, "MODBUS RTU (zero-based addressing)", 3x, 2, 1)
.......


功能实现就好,距离完美的程序(别人死我不死,我死也要优雅的死)还有两小步
1、入参检查,不能保证下位机给的数值一定是正确的,第一位如果读到0呢?你这里可是有除法的(一般不会炸,但是万一哪天移植到其他平台上呢),如果大于5呢?
2、错误通知,这个也是要依赖特定平台的,比如说你这里用威纶通的话,最直接的办法就是给显示元件设置一个极限值,最大或者最小看具体设计,总之读取到错误数据后要给用户一个良好的提示,是数据错误了

可能的优化方案:
1、入参检查,读取到字符串后检查第一位的数值范围,理论上应该是1~5的范围,超过这个范围可以认为数据无效了
2、去掉除法,第一位的1~5会对应0.1到0.00001这5个小数值,取出来这个小数值和有效值相乘即可(你这个系统里面0到底是怎么表达的?)
3、更高阶的写法是在宏函数内完成数值到字符串的转换,界面元件直接显示字符串,本身有float2Ascii的内建函数,同时可以在函数内方便的判断数据有效情况,反正最后输出的字符串,数据合法范围内输出这个数值的字符串结果,超过这个结果直接输出一个ERROR或者NaN,可以更明确当前的错误