详细讲解仪器仪表modbus RTU或TCP 获取的16位二进制转浮点数 附c#代码

本人从事工控领域,发现从仪表获取的数据,每个地址16位,两个地址一个32位浮点数,怎么转换?PLC到是有相应的模块可以直接转换为浮点数。
计算原理:先把两个16位高低位组合。
比如,下面两个16字:
在这里插入图片描述
下面为组合:第一个为符号位:
在这里插入图片描述
在这里插入图片描述
小数偏移位:1000 0110 为 134
偏移 : 134 - 127 = 7
意思小数点接下来偏移7位
在这里插入图片描述
数据位为: 110 1111 0100 1100 1100 1101
数据须在前面补1,结果为:1110 1111 0100 1100 1100 1101
偏移为:7 + 1 = 8
所以结果为:1110 1111. 0100 1100 1100 1101
在这里插入图片描述

下面是基于c#封装的方法

数据转换的方法


        private double getFloatData(int c1,int c2)
        {
            var d1 = getTwo(c1);
            var d2 = getTwo(c2);
            var strAll_two = d1 + d2;
            var fu = strAll_two.Substring(0, 1);
            var pian = strAll_two.Substring(1, 8);
            var data = strAll_two.Substring(9, 23);
            var pian_num = Convert.ToInt32(pian, 2) - 127;
            var data_zheng_str = data.Substring(0, pian_num);
            data_zheng_str = "1" + data_zheng_str;
            var data_xiao_str = data.Substring(pian_num + 1, data.Length - pian_num - 1);
            var data_zheng = Convert.ToInt32(data_zheng_str, 2);
            var data_xiao = Convert.ToInt32(data_xiao_str, 2);
            var data_xiao_db = Convert.ToDouble("0." + data_xiao.ToString());
            var all_data = data_zheng + data_xiao_db;
            return all_data;
        }
        // 获取二进制
        private string getTwo(int c)
        {
            if (c>= 0)
            {
                var aa = Convert.ToString(c, 2).PadLeft(4, '0');
                if (aa.Length < 16)
                {
                    var num = 16 - aa.Length;
                    for (var i = 0; i < num; i++)
                    {
                        aa = "0" + aa;
                    }
                }
                return aa;
            }
            else
            {
                c = Math.Abs(c);
                var zheng = "";
                while (c != 0)
                {
                    var a = 0;
                    a = c % 2;
                    zheng += a;
                    c = c / 2;
                    if (c == 1)
                    {
                        break;
                    }
                }
                var d = "";
                for (var i = 0;i < zheng.Length;i++)
                {
                    if (zheng.Substring(i,1) == "0")
                    {
                        d += "1";
                    }
                    else
                    {
                        d += "0";
                    }
                }
                d = d.Remove(0,1);
                d = "1" + d;
                if (d.Length < 16)
                {
                    var num = 16 - d.Length;
                    for (var i = 0; i < num; i++)
                    {
                        d = "0" + d;
                    }
                }
                return d;
            }
        }
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值