【发布时间】:2021-11-22 00:46:54
【问题描述】:
我试图弄清楚我从 modbus 读取节点获得的值的缩放比例,并最终以艰难的方式做到了。所以我需要将缓冲区中的 4 个字节转换为函数节点中的十进制值。 这样我可以轻松地手动调整缩放和 modbus 参数。
我认为最简单的方法是:
字节 -> 位 ->(应用不同的参数) -> 十进制值 -> 应用可选缩放
这就是我尝试做的,但它不起作用,我不明白为什么。要么它什么都不做(输出 NaN),要么 node-red 停止运行。而且我必须禁用来自节点红色文件的流。然后重启树莓派,再手动启动node-red。
var In = msg.buffer;
var i;
var j;
var Bit;
var Bits = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
var BitVal8 = [128,64,32,16,8,4,2,1]
var BitVal32 = [1,2,4,8,16,32,64,128]
var Negative;
var Out;
//Sjekker om MSB er 1
if (In[0] >= 128)
{
Negative= true;
In[0] -= 128;
}
//Regner ut verdien av hvert bit i et 32 bit word
for (i= 8; i<32;i++)
{
j = i-1;
BitVal32[i]= (BitVal32[j]*2);
}
//Går gjennom alle 4 bytes (0-3)
for (i= 0; i<4; i++)
{
//Går gjennom alle bits (0-7) og legger de inn rett i 32 bit var
for (j=0; j<8; j++)
{
Bit= (j+1)*(i+1)-1;
if ((In[i]/BitVal8[j])>1)
{
In[i]-= BitVal8[j];
Bits[Bit]=1;
}
}
}
//Konverterer 32 bit var til decimal var
for (i = 0; i < 32; i++)
{
if (Bits[i]==1)
{
Out+=BitVal32[i];
}
}
//Hvis MSB var 1, negates tallet
if (Negative)
{
Out= Out*-1;
}
msg.payload = Out;
node.status({fill:"blue",shape:"ring",text:msg.topic + ": " + msg.payload});
return msg;
我用了一段时间these 节点。但我不能让他们使用 modbus 单元中的某些变量。因为它们的modbus参数不同。
通读this页面,但这与我想做的相反,我不太了解它以将其应用于我的情况。
【问题讨论】:
标签: javascript raspberry-pi binary node-red converters