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

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

下面是基于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;
            }
        }

你可能感兴趣的:(c#,c#,开发语言)