modbus协议怎样读取PLC双字16进制浮点数将其转化为十进制?
其实与MODBUS无关,是把两个字的单精度浮点,转换成REAL DOUBLE,其实就是类型的转换.
1》首先确认标注:按照国际标准IEEE 754来的
2》确认字节的前低方式,这个很关键。
方法一:输入参数P1,P2代表PLC中浮点数储存的两个寄存器获取的数据
public static float GetFloat(ushort P1, ushort P2)
{
int intSign, intSignRest, intExponent, intExponentRest;
float faResult, faDigit;
intSign = P1 / 32768;
intSignRest = P1 % 32768;
intExponent = intSignRest / 128;
intExponentRest = intSignRest % 128;
faDigit = (float)(intExponentRest * 65536 + P2) / 8388608;
faResult = (float)Math.Pow(-1, intSign) * (float)Math.Pow(2, intExponent - 127) * (faDigit + 1);
return faResult;
}
方法二:bitConveter
string strReceive=string.Empty; //float a = 0.123456f;
float a = 360.0f;
byte[] bytetest =BitConverter.GetBytes(a);
int bytelen = bytetest.Length;
for(int i=0;i<bytelen;i++)
{ string str = Convert.ToString(bytetest[i], 16);
strReceive += str + " "; }
MessageBox.Show(strReceive);
float f=BitConverter.ToSingle(bytetest,0);
MessageBox.Show(f.ToString());
问题汇总:
PLC跟仪表通讯,读回来两个字,17256和11090,怎么转换成一个32位浮点数,结果是两百多付的电压_ : 17256,11090转化为16进制数为16#43682B52,转换为浮点数大概231.16922V计算公式就是将十进制数转换为16进制数,然后转换而2进制,根据浮点数数据格式进行逆向的运算.?