Error handling

The J1939 and CANopen stacks produces error messages that is transmitted via Data Engine to your application. The default data engine signal name is “fieldbusAccess_J1939Error” or “fieldbusAccess_CANopenError”. If you would like to change it you may start the fieldbusaccess runtime with the argument –name “InstanceName”. Please note that the signal name should start with lower case letter (this will be automatically changed by the runtime).

./fieldbusaccess --name instanceName FieldbusAccess_ConfigFile.json

This would create the data engine signal “instanceName_J1939Error” or “instanceName_CANopenError” available for the application. This should be considered as an advanced feature and is in most cases not needed to be altered.

J1939 error model

LinX Manager Fieldbus injects projects with the following files which are related to error handling:

  • fieldbusaccesserror.cpp

  • fieldbusaccesserror.h

  • fieldbusaccesserrormodel.cpp

  • fieldbusaccesserrormodel.h

Qt projects based on the CrossControl Qt Quick 2 Application project template are prepared to work directly with the configurator. LinX Manager Fieldbus Access injects main.cpp with the required code to make the configured signals available directly in QML, including the error model. The error model is available in QML as a context property named j1939ErrorModel.

QQuickView *view = new QQuickView;
// <LINX MANAGER> //
...
FieldbusAccessErrorModel *fieldbusAccessErrorModel = new FieldbusAccessErrorModel(&dataEngineContext);
view->rootContext()->setContextProperty("j1939ErrorModel", fieldbusAccessErrorModel);
QObject::connect(
    dataEngineContext.fieldbusAccess_J1939Error_CAN0(),
    &QByteArrayConsumerSignal::valueChanged,
    fieldbusAccessErrorModel,
    [fieldbusAccessErrorModel](QByteArray value){
        fieldbusAccessErrorModel->receiveError(value, 0);
    });
// </LINX MANAGER> //

The following roles can be access from the FieldbusAccessErrorModel model:

Role Description
bus Bus nr the error occurred on.
level Severity of the error.
code Error code.
identifier Module ID.
addInfo PGN the error is associated with.
description Error description.
started Time and date when the error started.
ended Time and date when the error ended.
exists True if error is active, otherwise false.

Value descriptions for the level, code and identifier are found in J1939 stack errors. An example how to access and display errors in QML can be found in J1939 examples.

J1939 cyclic timeout monitor detection

When an RX (receive) PGN is configured as Cyclic in the be automatically monitored for cyclic timeouts (no values received on the CAN bus since last received value + cycle time x 3). As soon as a cycle timeout is detected for a PGN an error message is sent to the application through Data Engine. Every period (cycle time x 3) a new error will be sent.

When Fieldbus Access starts to receive values again from the CAN bus an error message is sent once with same code and PGN info except that the error classification is of type ERR_OK. This way it’s possible to validate the status of the values received in your application.

Text {
    id: engSpeed
    text: dataEngine.engSpeed.value
    visible: dataEngine.engSpeed.status === IDataEngineSignalError.OK
}

Please view the Cyclic timeout detection for J1939 SPNs in QML for information how to setup and access the status information of signals.

CANopen error model

LinX Manager Fieldbus Access injects projects with the following files which are related to error handling:

  • idataenginesignalerror.cpp

  • idataenginesignalerror.h

  • fieldbusaccesscanopenstatusmodel.h

  • fieldbusaccesscanopenstatusmodel.cpp

Qt projects based on the CrossControl Qt Quick 2 Application project template are prepared to work directly with the configurator. LinX Manager Fieldbus Access injects main.cpp with the required code to make the configured signals available directly in QML, including the error model. The error model is available in QML as a context property named canopenStatusModel.

QQuickView *view = new QQuickView;
// <LINX MANAGER> //
...
FieldbusAccessCANopenStatusModel *canopenStatusModel = new FieldbusAccessCANopenStatusModel();
view->rootContext()->setContextProperty("canopenStatusModel", canopenStatusModel);
QObject::connect(
    dataEngineContext.fieldbusAccess_CANopenError_CAN0(),
    &ShortConsumerSignal::valueChanged,
    canopenStatusModel,
    [canopenStatusModel](short value){
        canopenStatusModel->receiveError(value, 0);
    });
QObject::connect(
    dataEngineContext.fieldbusAccess_CANopenStatus_CAN0(),
    &ShortConsumerSignal::valueChanged,
    canopenStatusModel,
    [canopenStatusModel](short value){
        canopenStatusModel->receiveStatus(value, 0);
    });
// </LINX MANAGER> //

The following roles can be access from the FieldbusAccessCANopenStatusModel model:

Role Description
bus Bus nr the error occurred on.
type Severity of the error.
code Error code.
message Error description.
received Time and date when the error was received.

Value descriptions for the type, code and message are found in CANopen stack errors. An example how to access and display errors in QML can be found in CANopen examples.