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.
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 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.
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"
}
}
*/