在s7-300中怎么把十六进制转换成十进制

我现在通过485通讯把现场的流量计数据传到了plc中(300的),然后现在我想把瞬时流量和累计流量在上位机上显示,但是协议上说是16进制的,流量计是科隆的,转换器是IFC300,厂家给了计算方法:
3.获取计数器1Counter 1[m3]
主机发送:(皆为十六进制数) 
01 04 75 44 00 04 AB 00
**01 代表仪表地址
**04代表获取参数命令
**75 44代表获取计数器1
**00固定值
**04代表返回双精度数据,即8个数据字节
**AB 00代表循环冗余码校验(CSC)

IFC300响应代码:
01 04 08 40 B0 0B 02 33 8B 26 96 0C 2D
**01 代表仪表地址
**04代表获取参数命令
**08代表字节数,此处为08,即后面有8个数据字节
**40 B0 0B 02 33 8B 26 96代表数据区,即计数器1值
**0C 2D代表循环冗余码校验(CSC)

由此响应代码可以得出当前计数器1的代码为40 B0 0B 02 33 8B 26 96,通过计算可以得出计数器1值为4107m3
8个字节计数器1的算法:(浮点数转十进制数)
例如:40/B0/0B/02/33/8B/26/96 ,如果要转换成十进制数,可按下列算法:(注:此处c(X)代表&H40 或64 ,此处c(X+1)代表&HB0 或 176,依次类推)
符号位:  si = ((c(X) And 128) / 128)
           si = (64 And 128)/128 = 0 
阶  码:   ex = (c(X + 1) And 240) / 2 ^ 4 + (c(X) And 15) * 2 ^ 4 + (c(X) And 112) * 2 ^ 4  
               ex = (176 And 240)/16 + (64 And 15)/16 + (64 And 112)/16 = 1035
                              尾  数:   ma = (c(X + 1) And 15) / 2 ^ 4 + c(X + 2) / 2 ^ 12 + c(X + 3) / 2 ^ 20 + c(X + 4) / 2 ^ 28 + c(X + 5) / 2 ^ 36 + c(X + 6) / 2 ^ 44 + c(X+7) / 2 ^ 52 + 1
                                              ma = (176 And 15)/16 + (11/4096) + ...    +1 = 1.0027
所以所需求的量 vo = (-1) ^ si * 2 ^ (ex-1023) * ma 
vo =  (-1)0×212×1.0027=4107.36
则浮点数40/B0/0B/02/33/8B/26/96 代表的值为4107.36。
但是在s7-300中计算非常麻烦,而且在数据显示有延时,大家有没有更好的方法呢?

最佳答案

1、方法1:
、可以试试,看看系统标准IEC功能中的FC39 是否满足你的要求:
FC39 STRNG_R:
功能FC39将字符串转换为REAL数据类型格式变量。字符串必须为以下格式:
±v.nnnnnnnE±xx ± 符号
v 小数点前1位
n 小数点后7位
x 2位指数
、有关FC39 STRNG_R应用:
<S7-300400的系统软件和标准功能>下载:
http://www.ad.siemens.com.cn/download/SearchResult.aspx?searchText=1023
2、方法2“
在上位机上进行转换很容易。只将字符串中的有用的数据传给上位机。如果在上位机中的组态软件可以转换则以,否则可应用VB,VC来进行编脚本进行计算。例如,WINCC的脚本实现较容易。

提问者对于答案的评价:
谢谢

专家置评

已阅,最佳答案正确。

原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc236961.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2018年12月1日 下午4:08
下一篇 2018年12月1日 下午4:08

相关推荐