【问题标题】: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页面,但这与我想做的相反,我不太了解它以将其应用于我的情况。

【问题讨论】:

    标签: javascript raspberry-pi binary node-red converters


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      • 2016-01-22
      • 2023-03-09
      • 2014-03-11
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      相关资源
      最近更新 更多