节点红色在函数节点中将字节转换为十进制
Posted
技术标签:
【中文标题】节点红色在函数节点中将字节转换为十进制【英文标题】:Node-red converting bytes to decimal in function node 【发布时间】: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页面,但这与我想做的相反,我不太了解它以将其应用于我的情况。
【问题讨论】:
【参考方案1】:1:j-for循环中的i++有时会导致节点red崩溃。
2: 计算应该写入 32 位 var 中哪个位的公式是错误的。是 (byte+1)*(bit+1)-1,有时不是全部。新公式为 ((Byte+1)*8-8+bit
3:在最后一个 for 循环中,我将每个位的值添加到输出信号中。但是BitValue变量是从小变大,不是大变小(是LE,应该是BE)
新的工作代码:
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 = [2147483648]
var Negative;
var Out= 0;
//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= 1; 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= (((i+1)*8)-8+j);
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;
【讨论】:
以上是关于节点红色在函数节点中将字节转换为十进制的主要内容,如果未能解决你的问题,请参考以下文章