本人从事工控领域,发现从仪表获取的数据,每个地址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;
}
}