Skip to main content
Back to Projects

Industrial IoT Edge Platform

Manufacturing Data Infrastructure

Edge computing platform for industrial manufacturing environments. Collects sensor data from PLCs, aggregates at the edge, and streams to cloud analytics. Built for reliability in harsh industrial conditions.

01

Problem

Manufacturing plants generate massive amounts of sensor data, but connectivity to cloud is unreliable and latency is critical for safety systems. Legacy SCADA systems are expensive, closed-source, and difficult to integrate with modern analytics tools.

Unreliable Connectivity

Manufacturing floors have intermittent network connectivity

Latency Critical

Safety systems need <50ms response time for alerts

Closed Systems

Legacy SCADA is proprietary and hard to integrate

02

Architecture

PLC LayerSiemens S7Allen-BradleyModbus / OPC UAEdge LayerAzure IoT EdgeDocker ContainersInfluxDB + MQTTAdaptersS7 AdapterModbus AdapterOPC UA AdapterCloud LayerIoT HubAnalytics PipelineGrafana DashboardsAlerting SystemLong-term StorageMachine LearningSensorsTemperature, PressureVibration, FlowAnalog/DigitalIndustrial ProtocolsRaw DataMQTTTLS/HTTPSCommands

The system uses a three-tier edge computing architecture. PLCs communicate via industrial protocols (S7, Modbus, OPC UA) to local edge gateways. These gateways aggregate data, filter noise, and perform local analytics. Azure IoT Edge orchestrates containers with store-and-forward resilience for cloud connectivity interruptions.

PLC Layer

  • Siemens S7 protocol adapters
  • Allen-Bradley integration
  • Modbus TCP/RTU support
  • OPC UA for modern devices

Edge Layer

  • Azure IoT Edge runtime
  • Docker container orchestration
  • Local InfluxDB time-series storage
  • Store-and-forward message queue

Cloud Layer

  • Azure IoT Hub for device management
  • Time-series analytics pipeline
  • Grafana dashboards for visualization
  • Alerting and notification system

Protocol Adapters

  • Modular adapter pattern
  • Auto-discovery of new devices
  • Protocol translation to MQTT
  • Health monitoring per adapter
03

Technical Approach

Designed a three-tier architecture: PLC layer for data acquisition, Edge layer for aggregation and local processing, and Cloud layer for long-term analytics. Used Azure IoT Edge for container orchestration at the edge. Implemented store-and-forward pattern for network resilience. Created modular protocol adapters for Siemens S7, Allen-Bradley, and Modbus devices.

edge-gateway/edge_module.py
import asyncio
import json
from dataclasses import dataclass, asdict
from typing import Optional
from azure.iot.device import IoTHubModuleClient

@dataclass
class SensorReading:
    device_id: str
    timestamp: float
    value: float
    quality: str  # 'good', 'uncertain', 'bad'
    
class EdgeGateway:
    def __init__(self, connection_string: str):
        self.client = IoTHubModuleClient.create_from_connection_string(
            connection_string
        )
        self.local_buffer = []
        self.cloud_connected = False
        
    async def process_reading(self, reading: SensorReading):
        # Always store locally first
        self.local_buffer.append(asdict(reading))
        
        # Try to send to cloud
        if self.cloud_connected:
            try:
                message = json.dumps(asdict(reading))
                await self.client.send_message(message)
            except Exception:
                self.cloud_connected = False
                self._persist_to_disk(reading)
        else:
            # Store-and-forward pattern
            self._persist_to_disk(reading)
    
    def _persist_to_disk(self, reading: SensorReading):
        # SQLite for local resilience
        with self._get_db() as db:
            db.execute(
                "INSERT INTO pending VALUES (?, ?, ?, ?)",
                (reading.device_id, reading.timestamp, 
                 reading.value, reading.quality)
            )
            
    async def flush_buffer(self):
        # Send buffered messages when connection restored
        if not self.cloud_connected:
            return
            
        pending = self._get_pending_messages()
        for msg in pending:
            await self.client.send_message(json.dumps(msg))
            self._mark_sent(msg['timestamp'])

Key Technical Decisions

Azure IoT Edge Over Custom Solution

Chose Azure IoT Edge for its built-in container orchestration, security features, and managed device provisioning. This reduced operational complexity compared to building a custom edge runtime.

Store-and-Forward Pattern

Implemented SQLite-based local storage for message persistence during network outages. This ensures zero data loss even during extended connectivity interruptions common in manufacturing environments.

Modular Protocol Adapters

Designed each industrial protocol as a separate Docker container. This allows mixing different device types at a single site and enables independent updates without affecting other adapters.

04

Tech Stack

Azure IoT Edge
Docker
Python
C++
Siemens S7 Protocol
OPC UA
MQTT
InfluxDB
Grafana
05

Results & Outcomes

01

Deployed across 3 manufacturing sites with 500+ sensors

02

<50ms latency for critical safety alerts

03

99.9% uptime over 18 months of operation

04

40% reduction in cloud data transfer costs via edge filtering

05

Zero data loss during 47 network outage events

500+
Sensors
<50ms
Alert Latency
99.9%
Uptime
40%
Cost Reduction
06

Live Demo

Explore the interactive manufacturing operations dashboard showing real-time production metrics, sensor health, and alert status. This is a read-only demonstration of the edge platform interface.

Open Dashboard Demo