MODBUS模块


概述

演示通过RS485串口读取MODBUS数据。这里接的是一个温湿度模块,值的数据类型为16位整数。如果值的数据类型为其他,可以用"2l","4l","4b","fl","fb"等参数据需要的值。


代码


function readModbus(addr, cmd, reg, count)
{
    var d = Bytes.create(8);
    d.seti(addr, 0);
    d.seti(cmd, 1);
    d.seti(reg, 2, "2b");
    d.seti(count, 4, "2b");
    d.seti(Coder.crc16(d.sub(0, 6), "modbus"), 6, "2l");
    UART.send(2, d);
}

function processData(port, data)
{
    if(port == 1)
    {
        var cmd = data.gets();
        if(cmd == "read")
        {
            readModbus(1, 4, 1, 1);
        }
        else if(cmd == "read2")
        {
            readModbus(1, 4, 1, 2);
        }
        else
        {
            print("unknown cmd");
        }
    }
    if(port == 2)
    {
        if(Coder.crc16(data, "modbus") == 0)
        {
            var addr = data.geti(0);
            var cmd = data.geti(1);
            var count = data.geti(2) / 2;
            for(var i = 0; i < count; i++)
            {
                print(data.geti(3 + i * 2 , "2b"));
            }
        }
    }
}
UART.open(2, 9600);

while(true)
{
    var m = Event.get();
    switch(m.msg)
    {
        case Event.UART_RECV:
            processData(m.port, m.data);
            break;
    }
}