SDK Script modbus-rtu-slave.are

modbus-rtu-slave.are
/* DESC: This script implements a modbus slave server
 * Copyright (C) 2015 NetModule AG, Switzerland
 */
 
DEV = "SERIAL1";
SLAVEID = 1;
DEBUG = 0;
 
/* check serial port config */
st = nb_config_get("serial.0.status");
if (st != "2") {
    nb_syslog("Serial port is not enabled for us");
    exit(1);
}
 
/* set attributes */
ret = nb_serial_setattr(DEV, 115200, 8, 1, 0, 0);
 
if (ret != 0) {
    printf("Could not set serial attributes: %i \n",ret);
    exit(1);
}
 
/* open serial port */
fd = nb_serial_open(DEV);
if (fd < 0) {
    printf("Unable to open %s\n", DEV);
    exit(1);
}
 
status = nb_config_get("serial.0.status");
if (status == "2") {
    printf("serial port enabled for sdk\n");
} else {
    printf("serial port not enabled for sdk\n\n", status);
    exit(1);
}
 
/* register fd for modbus functions */
if (nb_modbus_register(fd, MODBUS_TYPE_RTU) < 0) {
    printf("unable to register rtu descriptor");
    exit(1);
}
 
if (DEBUG > 0) {
    /* enable debug mode */
    if (nb_modbus_set_debug(fd, true) < 0) {
        printf("unable to enable debug");
        exit(1);
    }
}
 
/* set slave id */
if (nb_modbus_set_slave(fd, SLAVEID) < 0) {
    printf("unable to set slave id");
    exit(1);
}
 
for (ctr = 0;;ctr++) {
    request = nb_modbus_receive(fd);
    if (request == NULL) {
        printf("receive failed (%s)\n", nb_modbus_last_error());
        break;
    }
 
    resp = mkstruct(
        "bits", mkarray
        (
            ctr%2, 0, 0, 0, 1, 1, 1, 1, 
            0    , 0, 0, 0, 1, 1, 1, 1
        ), 
        "ibits", mkarray
        (
            ctr%2, 1, 0, 1, 0, 1, 0, 1, 
            0    , 1, 0, 1, 0, 1, 0, 1
        ), 
        "regs", mkarray
        (
            ctr,    0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 
            0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F
        ), 
        "iregs", mkarray
        (
            ctr,    0xFF01, 0xFF02, 0xFF03, 0xFF04, 0xFF05, 0xFF06, 0xFF07, 
            0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F
        )
    );
 
    ret = nb_modbus_reply(fd, request, resp);
    if (ret < 0) {
        printf("unable to reply to request (%s)\n", nb_modbus_last_error());
    } else {
        printf("replied %d bytes\n" , ret);
    }
}
 
nb_modbus_unregister(fd);
close(fd);
exit(0);