Modbus TCP


#1

I note that the Fieldbus Gateway is available soon which supports Modbus TCP.

Is a class for Modbus TCP be available? I only see the RTU in https://github.com/electricimp/reference/tree/master/hardware/modbus


#2

The modbus TCP on the fieldbus accelerator is via the wiznet interface - as modbus-tcp isn’t exactly secure, we recommend it is on a dedicated point to point interface like this.

Modbus will be becoming an officially supported library which will work for multiple transports including RTU and TCP. Release 34 added a whole load of features which help make a good RTU implementation, and those will be supported too.


#3

Link the the Mudbus Library


#4

Thanks for this.

We have been using the Modbus TCP library and we are seeing a critical error that we notice has been fixed on the contributing branch given below. Can this be pulled into the Electric Imp library?


#6

The fix has been released in v1.0.1. Please give it a try and let me know if you have any questions.


#7

Thanks, we will pick this up. We have been using the fix for a couple of weeks - it looks good.


#8

The Modbus TCP library does not gracefully handle sending and disconnect, where the modbus connection has subsequently failed. This results in these two errors:

  • ERROR: the index ‘transmit’ does not exist
  • ERROR: the index ‘close’ does not exist

Testing for ‘transmit’ and ‘close’ in _connection would solve this problem, e.g.:

function _send(PDU, properties) {
    _transactions[_transactionCount] <- properties;
    local ADU = _createADU(PDU);
    // with or without success in transmission of data, the transaction count would be advanced
    _transactionCount = (_transactionCount + 1) % MAX_TRANSACTION_COUNT;
    if ("transmit" in _connection) {
        _connection.transmit(ADU, function(error) {
            if (error) {
                _callbackHandler(error, null, properties.callback);
            } else {
                _log(ADU, "Outgoing ADU: ");
            }
        }.bindenv(this));
    } else {
        // don't attempt to transmit if connection no longer exists
        local error = "CONNECTION_NO_LONGER_ACTIVE";
        _callbackHandler(error, null, properties.callback);
    }
}

function disconnect(callback = null) {
    _shouldRetry = false;
    if ("close" in _connection) {
        _connection.close(callback);
    } else if (callback) {
        callback();
    }
}