top of page

Industrial Automation Integration Engine

Seamlessly connect to PLCs, sensors, and various devices. Read and write data, construct control algorithms, or process data for SCADA, MES, and other systems.

InDriver acts as the Industrial Data Pump, delivering real-time, reliable data from various devices, ready for integration with SCADA, MES, Dashboards, Reporting Systems, and more.

Industrial Communication Schema

InDriver efficiently transforms various types of Industrial Automation Data into convenient JSON objects, enabling their smooth logging to an SQL Database. This integration seamlessly connects automation hardware with IT systems.

Industrial Automation Devices communicate and generate valuable gigabytes of data. InDriver, when installed on Industrial, Edge, HMI, and SCADA computers, can seamlessly run communication tasks, data processing algorithms, database logging, alarming, and even control operations. With a simple JS Script, users have unlimited possibilities to code precise data acquisition synchronized with the clock or incoming events, read multiple data sources simultaneously, and perform calculations, aggregation, interpolation, and forecasting — all meeting the expectations of modern industrial automation.

Distinguishing itself from existing device communication tools such as OPC Servers, IoT Platforms, Historians, Alarm Loggers, and SCADA-built drivers, InDriver stands out as a lightweight, user-friendly, and exceptionally flexible solution. Thanks to its JS coding, it offers multifunctionality, scalability, modern features, and competitive pricing, making it suitable for both automation engineers and programmers.

Distributed Architectures in Industrial Automation Systems

- Enhancing Connectivity and Efficiency

InDriver's distributed architecture enables the utilization of industrial (edge) computers positioned in close proximity to connected devices. InDrivers can be easily and remotely configured through InStudio by data engineers, providing a seamless solution to address any integration challenges.

Distributed Architectures in Industrial Automation Systems

Distributed Systems with Redundancy

InDriver System was designed as a distributed system with redundancy. Multiple InDriver instances can be installed on various computers/servers, connecting to multiple SQL Servers (InServer). These components can be configured and monitored collectively through a single InStudio. This architecture opens up extensive possibilities for designing scalable and fail-resistant systems, all managed from a centralized location.

InStudio InDriver InDriver InDriver InServer InServer

Communication APIs:

Empowering Industrial and IoT Connectivity in InDriver

ModbusAPI, RestApi, SerialPortApi, SocketApi, FileApi
ModbusAPI

The ModbusAPI is a powerful tool within InDriver that facilitates Modbus TCP or RTU communication. This API empowers developers to seamlessly integrate and communicate with devices using the widely adopted Modbus protocol. Whether it's for industrial automation or IoT applications, the ModbusAPI simplifies the implementation of Modbus communication for efficient data exchange.

RestAPI

The RestApi in InDriver streamlines communication through REST protocols, empowering developers to seamlessly integrate and exchange data with various systems. Ideal for industrial automation, IoT applications, and web-based scenarios, the RestApi simplifies the implementation of RESTful communication, providing a powerful tool for efficient data exchange in diverse applications.

Integrating Modbus Moxa IO Logic and REST API Weather Updates with SQL Database Logging.

Add a new task and copy-paste these onStartup and onHook functions attached below.

  • onStartup

 

InDriver.import("RestApi");

InDriver.import("ModbusApi");

RestApi.defineRequest('Krakow','{"url":"https://api.openweathermap.org/data/2.5/weather?appid=your_app_id&q=krakow","timeout":5000, "type":"get","headers":{"ContentTypeHeader":"application/json"}}');

Modbus.connectDevice('IOLogic','{"mode" : "TCP", "networkAddress" : "192.168.0.22"}');

InDriver.installHook(60000);

In the OnStartup script, import InDriver's dedicated APIs—RestApi and ModbusApi. Configure the request for weather data and Moxa connection, and install 60,000ms hooks. This setup triggers the execution of the OnHook script every full minute, synchronized with the clock

 

  • onHook
     

RestApi.begin();

ModbusApi.begin();

RestApi.sendRequest('Krakow');

ModbusApi.readDevice('IOLogic','{"name": "coils1", "type": "COILS", "address":1, "size":8}');

ModbusApi.commit();

RestApi.commit();

Modbus.wait();

RestApi.wait();

if (RestApi.isSucceeded() && ModbusApi.isSucceeded()) {

          const weatherData = RestApi.getData('krakow');

          const modbusData = ModbusApi.getAllData();

          ...

          let ts = InDriver.hookTs();

InDriver.sqlExecute("azureserver", "insert into public.weather (source, ts, data )
values ( 'krakow','"
+ts.toISOString()+"',$$"+weatherData+"$$);"

InDriver.sqlExecute("azureserver", "insert into public.modbus (source, ts, data )

values ( 'IOLogic','"+ts.toISOString()+"',$$"+modbusData+"$$);"

}

The ModbusApi and RestApi offer a solution similar to SQL transactions. The functions, RestApi.sendRequest and Modbus.readDevice, execute simultaneously after calling Modbus.commit() and RestApi.commit(). These non-blocking functions initiate read routines, followed by two blocking functions, Modbus.wait() and RestApi.wait(), which wait for data or reach a timeout. Once data is collected from both sources (if RestApi.isSucceeded() && ModbusApi.isSucceeded()), logging weatherData and modbusData becomes straightforward using InDriver.sqlExecute. This logs the data into a JSON Time Series Table, comprised of source, timestamp, and data columns.

  • Output

 

weatherData =

 

{
  "coord": {
  "lon": 19.9167,
  "lat": 50.0833
  },
  "weather": [
  {
     "id": 701,
     "main": "Mist",
     "description": "mist",
     "icon": "50n"
  }
  ],
  "base": "stations",
  "main": {
  "temp": 272.54,
  "feels_like": 270.64,
  "temp_min": 271.94,
  "temp_max": 273.7,
  "pressure": 1018,
  "humidity": 88
  },
  "visibility": 1100,
  "wind": {
  "speed": 1.54,
  "deg": 200
  },
  "clouds": {
  "all": 100
  },
  "dt": 1701968996,
  "sys": {
  "type": 2,
  "id": 2074307,
  "country": "PL",
  "sunrise": 1701930268,
  "sunset": 1701959943
  },
  "timezone": 3600,
  "id": 3094802,
  "name": "Krakow",
  "cod": 200
}

modbusData =

 

{
  "Moxa1": {
  "Read": {
     "coilsA": {
       "1": true,
       "2": false,
       "3": true,
       "4": false
     },
     "coilsB": {
       "5": true,
       "6": false,
       "7": true,
       "8"
: false
     }
  }
  }
}

With its unique and powerful features, InDriver offers automation engineers and programmers an easy solution, providing the freedom to develop systems with the expected flexibility and efficiency.

SerialPortAPI and SocketAPI

InDriver provides two versatile APIs, SerialPortAPI and SocketAPI, to support custom protocol implementations for various communication scenarios.

  • SerialPortAPI
    This API is tailored for serial interfaces such as RS232, RS422, RS485, CAN, M-BUS, and many more. Developers can leverage SerialPortAPI to establish communication with devices using these serial protocols. It offers flexibility and control over serial communication parameters, making it an ideal choice for diverse industrial and IoT applications.
     

  • SocketAPI
    For TCP and UDP communication, SocketAPI is the go-to solution. It supports both client-server and UDP communication, enabling seamless integration into networking solutions. Whether it's connecting devices over a local network or the internet, SocketAPI ensures reliable communication and flexibility in protocol implementation.

Example: Sending Data and Performing Validation with SerialPortAPI

In the example below, the serial port COM1 is opened, and a frame (0x1 0x2 0x3) is sent using the SerialPortApi.writeAndWait function, representing a DataRequest frame.

The onMessage function is called whenever data is received on COM1 within the specified timeout period. A simple validation check (length = 10) triggers the SerialPortApi.acceptRead() function, terminating the blocking operation initiated by SerialPortApi.writeAndWait().

  • onStartup

 

InDriver.import("SerialPortApi");

SerialPortApi.open('COM1', ‘{ "mode": "Flow",  "timeout": 3000,  "bufferSize": 256,  "baudRate": 9600,  "parity": "NoParity",  "stopBits": "OneStop",  "dataBits": 8}’);

SerialPortApi.writeAndWait('COM1', 'DataRequest', [0x01,0x02,0x03],3000);

  • onMessage

if (InDriver.messageSender() == InDriver.taskName() && InDriver.messageTags()[0] = 'SerialPortData') {

      let d = JSON.parse(InDriver.messageData())

      let bytes = d.data

      if (bytes.length === 10)

            SerialPortApi.acceptRead()

}

FileAPI

InDriver's FileAPI introduces a unique approach to communication by enabling interaction via files. This API includes a FileSystemWatcher that actively detects changes in monitored files or directories. This capability allows InDriver's JavaScript functions to be triggered in response to on-the-fly file processing. This feature is particularly beneficial in scenarios where communication through files is preferred or necessary, providing a dynamic and responsive approach to handling data.

In summary, InDriver's suite of APIs—ModbusAPI, SerialPortAPI, SocketAPI, and FileAPI—provides developers with comprehensive tools to address various communication challenges in industrial and IoT environments. These APIs empower developers to create tailored solutions, whether communicating via established protocols like Modbus or crafting custom communication strategies for specific devices and scenarios.

 

FileApiExample
In the example below, a watcher is installed on the driver.cfg file. Any change in this file triggers a call to the onMessage function, facilitating a straightforward method for establishing communication with an external system using file-based interactions.

  • onStartup

 

InDriver.import("FileApi");

FileApi.addFileSystemWatcherPath(InDriver.currentPath()+"/driver.cfg");

  • onMessage

if (InDriver.messageSender() === InDriver.taskName()) {

     InDriver.debug(InDriver.messageTags()+" : "+InDriver.messageData());

}

/*

When driver.cfg is changed onMessage is called 

 

onMessage: [FileChanged]:

{

  "message": {

"path": "C:/MyDevelopment/debug/driver.cfg",

"type": "JSscript"

  }

}

*/

bottom of page