『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 3310|回复: 2

[流程系列] 控制西门子PLC,有一个问题就是数字怎么转成浮点数还要hex

[复制链接]

4

主题

10

帖子

98

积分

注册会员

Rank: 2

积分
98
金钱
88
HASS币
0
发表于 2020-7-3 14:39:44 | 显示全部楼层 |阅读模式
最近在控制一个西门子PLC通过nodered,现在想通过改写一个register的数据来控制。

register是单精度浮点数,四个字节。我在界面设置了一个dashboard numbric来设置数字,这个数字输出的是十进制数,我想把它变成四字节的hex的buffer,不知道怎木弄。

下面是一个function可以转value to hex float,但是输出是字符串型的,怎弄弄成纯数字型的?




function InsertString(t, c, n) {
    var r = new Array([]);
    for (var i = 0; i * 2 < t.length; i++) {
        r.push(t.substr(i * 2, n));
    }
    return r.join(c);
}
function FillString(t, c, n, b) {
    if ((t === "") || (c.length != 1) || (n <= t.length)) {
        return t;
    }
    var l = t.length;
    for (var i = 0; i < n - l; i++) {
        if (b === true) {
            t = c + t;
        }
         else {
            t += c;
        }
    }
    return t;
}
function SingleToHex(t) {
    if (t === "") {
        return "";
    }
    t = parseFloat(t);
    if (isNaN(t) === true) {
        return "Error";
    }
    if (t === 0) {
        return "00000000";
    }
    var s,
    e,
    m;
    if (t > 0) {
        s = 0;
    }
     else {
        s = 1;
        t = 0 - t;
    }
    m = t.toString(2);
    if (m >= 1) {
        if (m.indexOf(".") == -1) {
            m = m + ".0";
        }
        e = m.indexOf(".") - 1;
    }
     else {
        e = 1 - m.indexOf("1");
    }
    if (e >= 0) {
        m = m.replace(".", "");
    }
     else {
        m = m.substring(m.indexOf("1"));
    }
    if (m.length > 24) {
        m = m.substr(0, 24);
    }
     else {
        m = FillString(m, "0", 24, false)
    }
    m = m.substring(1);
    e = (e + 127).toString(2);
    e = FillString(e, "0", 8, true);
    var r = parseInt(s + e + m, 2).toString(16);
    r = FillString(r, "0", 8, true);
    return InsertString(r, " ", 2).toUpperCase();
}


回复

使用道具 举报

0

主题

23

帖子

70

积分

注册会员

Rank: 2

积分
70
金钱
47
HASS币
0
发表于 2020-7-9 11:23:22 | 显示全部楼层
用的西门子什么型号的plc啊?
回复

使用道具 举报

4

主题

10

帖子

98

积分

注册会员

Rank: 2

积分
98
金钱
88
HASS币
0
 楼主| 发表于 2020-7-9 22:01:52 | 显示全部楼层
解决了,

function InsertString(t, c, n) {
    var r = new Array([]);
    for (var i = 0; i * 2 < t.length; i++) {
        r.push(t.substr(i * 2, n));
    }
    return r.join(c);
}
function FillString(t, c, n, b) {
    if ((t === "") || (c.length != 1) || (n <= t.length)) {
        return t;
    }
    var l = t.length;
    for (var i = 0; i < n - l; i++) {
        if (b === true) {
            t = c + t;
        }
         else {
            t += c;
        }
    }
    return t;
}
function SingleToHex(t) {
    if (t === "") {
        return "";
    }
    t = parseFloat(t);
    if (isNaN(t) === true) {
        return "Error";
    }
    if (t === 0) {
        return "00000000";
    }
    var s,
    e,
    m;
    if (t > 0) {
        s = 0;
    }
     else {
        s = 1;
        t = 0 - t;
    }
    m = t.toString(2);
    if (m >= 1) {
        if (m.indexOf(".") == -1) {
            m = m + ".0";
        }
        e = m.indexOf(".") - 1;
    }
     else {
        e = 1 - m.indexOf("1");
    }
    if (e >= 0) {
        m = m.replace(".", "");
    }
     else {
        m = m.substring(m.indexOf("1"));
    }
    if (m.length > 24) {
        m = m.substr(0, 24);
    }
     else {
        m = FillString(m, "0", 24, false)
    }
    m = m.substring(1);
    e = (e + 127).toString(2);
    e = FillString(e, "0", 8, true);
    var r = parseInt(s + e + m, 2).toString(16);
    r = FillString(r, "0", 8, true);
    return InsertString(r, " ", 2).toUpperCase();
}

let buf = msg.payload;

let result = SingleToHex(buf);

msg.payload = result;

return msg;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-26 08:24 , Processed in 0.901332 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表