跃然纸上

#😎路漫漫其修远兮,吾将上下而求索!

Node-Red学习笔记

1:Node-RED使用Modbus Tcp与从站通信

Poll Rate代表是循环读取从站间隔,下面图片设定的是3秒循环读取1次

image

 

2:Node-RED读取从站的数组数据转换成伏点数

image

 

 

image

下面是function1中代码 

// 假设 msg.payload 是包含六个 unsigned short 的数组,例如 [190, 3118, 0, 0, 0, 0]
// 假设每两个数字组成一个32位整数(高位在前,低位在后),然后转换为浮点数
// 注意:请根据你的数据源确认字节序(大端序或小端序)

// 1. 提取三对数据
let highWord = msg.payload[0];  // 第一组高位
let lowWord = msg.payload[1];   // 第一组低位

let highWord1 = msg.payload[2]; // 第二组高位
let lowWord1 = msg.payload[3];  // 第二组低位

let highWord2 = msg.payload[4]; // 第三组高位
let lowWord2 = msg.payload[5];  // 第三组低位

// 2. 将每对16位整数合并为一个32位整数
let combinedInt = (highWord << 16) | lowWord;
let combinedInt1 = (highWord1 << 16) | lowWord1;
let combinedInt2 = (highWord2 << 16) | lowWord2;

// 3. 创建DataView来转换每个32位整数为浮点数
let buffer = new ArrayBuffer(4);
let view = new DataView(buffer);

view.setUint32(0, combinedInt, false); // false表示大端序
let floatValue = Math.round((view.getFloat32(0, false)) * 10) / 10;

view.setUint32(0, combinedInt1, false);
let floatValue1 = view.getFloat32(0, false);

view.setUint32(0, combinedInt2, false);
let floatValue2 = view.getFloat32(0, false);

// 4. 将三个浮点数组织成数组形式赋值给msg.payload
msg.payload = [Math.round((floatValue*10)/10), floatValue1, floatValue2];

// 或者也可以组织成对象形式,更清晰但结构更复杂
msg.payload = {
    value1: floatValue,
    value2: floatValue1,
    value3: floatValue2
};

var newMsg1 = { payload: msg.payload.value1 };
var newMsg2 = { payload: msg.payload.value2 };
var newMsg3 = { payload: msg.payload.value3 };

// 对每个 payload 进行格式化,保留一位小数(返回数值)
if (typeof newMsg1.payload === 'number') {
    newMsg1.payload = parseFloat(newMsg1.payload.toFixed(1)); // 例如:1525.7
}
if (typeof newMsg2.payload === 'number') {
    newMsg2.payload = parseFloat(newMsg2.payload.toFixed(1));
}
if (typeof newMsg3.payload === 'number') {
    newMsg3.payload = parseFloat(newMsg3.payload.toFixed(1));
}

// 返回处理后的消息数组
return [newMsg1, newMsg2, newMsg3];

 

posted @ 2025-09-08 15:09  CCFWZ  阅读(48)  评论(0)    收藏  举报