Tam Entegre Çözüm: ZMA + HMI + AWS Bulut ile Tartım Sistemleri

Amazeng Teknik Ekip
15 dakika okuma
ZMAHMIAWS IoTTartım SistemleriLoadcellEndüstri 4.0Full Stack IoT

Giriş

Modern endüstriyel tesislerde, tartım sistemleri artık sadece "ağırlık göstergesi" olmaktan çıktı. Gerçek zamanlı izleme, bulut tabanlı raporlama, kestirimci bakım ve uzaktan erişim gibi özellikler, rekabet avantajı sağlayan temel gereksinimler haline geldi.

Bu yazımızda, Amazeng ürün portföyünü kullanarak end-to-end bir tartım çözümü inceliyoruz:

Not: GDT Dijital Transmitter maksimum 2 kanal + 3 DIO destekler. 4 loadcell'li uygulamalar için ZMA-4 tercih edilmelidir.

Senaryo: Süt İşleme Tesisi

Gereksinimler

Bir süt işleme tesisinde 5 adet 10.000 litrelik tank var:

  • Tank 1-3: Ham süt depolama (her biri 4 loadcell)
  • Tank 4-5: Pastörize süt (her biri 4 loadcell)

İstenen Özellikler:

  1. Her tankın anlık ağırlık gösterimi (±0.5kg hassasiyet)
  2. Operatör panelinde tüm tankların görselleştirilmesi
  3. Bulut tabanlı günlük raporlama
  4. Tankerleme sırasında otomatik kayıt
  5. SMS/email ile doluluk alarmları
  6. Geçmiş verilere web üzerinden erişim

Sistem Mimarisi

┌─────────────────────────────────────────────────────────────────────┐
│                        Tesiste (On-Premise)                         │
│                                                                     │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐            │
│  │  Tank 1      │  │  Tank 2      │  │  Tank 3      │            │
│  │ 4x Loadcell  │  │ 4x Loadcell  │  │ 4x Loadcell  │            │
│  └───────┬──────┘  └───────┬──────┘  └───────┬──────┘            │
│          │ mV/V            │ mV/V            │ mV/V               │
│          ▼                 ▼                 ▼                     │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐            │
│  │   ZMA-4-01   │  │   ZMA-4-02   │  │   ZMA-4-03   │            │
│  │  (Modbus)    │  │  (Modbus)    │  │  (Modbus)    │            │
│  └───────┬──────┘  └───────┬──────┘  └───────┬──────┘            │
│          │                 │                 │                     │
│          │ Modbus TCP      │ Modbus TCP      │ Modbus TCP         │
│          │ 192.168.1.101   │ 192.168.1.102   │ 192.168.1.103      │
│          │                 │                 │                     │
│          └─────────────────┴─────────────────┘                     │
│                            │                                       │
│                            │ Ethernet Switch                       │
│                            │                                       │
│              ┌─────────────┴─────────────┐                        │
│              │                           │                         │
│         ┌────▼─────┐              ┌──────▼──────┐                 │
│         │ HMI Panel│              │ IoT Gateway │                 │
│         │ (10.1")  │              │ (RPi/Linux) │                 │
│         │          │              │             │                 │
│         │ - Qt/QML │              │ - Modbus    │                 │
│         │ - Modbus │              │   Client    │                 │
│         │   Client │              │ - MQTT      │                 │
│         └──────────┘              │   Client    │                 │
│                                   └──────┬──────┘                 │
└──────────────────────────────────────────┼────────────────────────┘
                                           │
                                           │ MQTT/TLS (8883)
                                           │
┌──────────────────────────────────────────▼────────────────────────┐
│                        AWS Cloud                                  │
│                                                                   │
│  ┌─────────────┐    ┌──────────────┐    ┌────────────────┐      │
│  │  IoT Core   │───►│  Timestream  │◄───│  Grafana       │      │
│  │             │    │  (Time-series│    │  (Dashboard)   │      │
│  │  - MQTT     │    │   Database)  │    └────────────────┘      │
│  │  - Rules    │    └──────────────┘                            │
│  └──────┬──────┘                                                 │
│         │                                                        │
│         ▼                                                        │
│  ┌─────────────┐    ┌──────────────┐                            │
│  │  Lambda     │───►│     SNS      │───► Email/SMS Alarm       │
│  │  (Alarms)   │    │  (Notify)    │                            │
│  └─────────────┘    └──────────────┘                            │
│                                                                   │
└───────────────────────────────────────────────────────────────────┘

Bileşen #1: ZMA Data Acquisition

Neden ZMA-4?

Çoklu loadcell uygulamaları için ZMA Data Acquisition ideal çözümdür:

Yüksek Kanal Sayısı

  • GDT: Maksimum 2 kanal (2 loadcell)
  • ZMA-4: 4 kanal (4 loadcell) - Tank uygulamaları için ideal

Tam Hassasiyet

  • 24-bit ADC her kanalda bağımsız
  • Modbus TCP/RTU ile dijital iletişim = Sıfır sinyal kaybı
  • ±0.02% tipik doğruluk

Yüksek Örnekleme Hızı

  • 1000 SPS'e kadar (samples per second)
  • Dinamik tartım uygulamaları için kritik

Uzaktan Kalibrasyon

  • Modbus üzerinden yazılımsal kalibrasyon
  • Fiziksel müdahale gereksiz

ZMA-4 Konfigürasyonu

Her ZMA-4 cihazı 4 bağımsız analog girişe sahip (mV/V veya 4-20mA):

Tank 1 - ZMA-4-01:

Loadcell 1: Ön Sol    → Kanal 1 (mV/V)
Loadcell 2: Ön Sağ    → Kanal 2 (mV/V)
Loadcell 3: Arka Sol  → Kanal 3 (mV/V)
Loadcell 4: Arka Sağ  → Kanal 4 (mV/V)

Toplam Ağırlık = Kanal1 + Kanal2 + Kanal3 + Kanal4

ZMA-4 Modbus Register Map:

Input Registers (Read):
  0-1:   Kanal 1 Ham Değer (IEEE 754 float, mV/V)
  2-3:   Kanal 2 Ham Değer (IEEE 754 float, mV/V)
  4-5:   Kanal 3 Ham Değer (IEEE 754 float, mV/V)
  6-7:   Kanal 4 Ham Değer (IEEE 754 float, mV/V)

Holding Registers (Read/Write):
  100-101: Kanal 1 Kalibrasyon Faktörü
  102-103: Kanal 2 Kalibrasyon Faktörü
  104-105: Kanal 3 Kalibrasyon Faktörü
  106-107: Kanal 4 Kalibrasyon Faktörü
  200-201: Toplam Net Ağırlık (kg, hesaplanmış)
  202-203: Tare Değeri (kg)

Coils (Write):
  0: Tare komutu
  1: Zero komutu

Bileşen #2: HMI Endüstriyel Ekran

Neden Touchscreen HMI?

Operatörün tankerleme sırasında ihtiyaç duyduğu fonksiyonlar:

  • Net ağırlık okuma
  • Tare (dara alma)
  • Start/Stop kayıt
  • Alarm durumu

10.1 inch HMI Panelimiz, Qt/QML ile geliştirilmiş özel arayüz sunar:

HMI Ekran Tasarımı

Ana Ekran (Grid Layout - 5 Tank)

GridLayout {
    columns: 3
    rows: 2

    // Tank 1
    TankWidget {
        tankId: 1
        tankName: "Ham Süt - Tank 1"
        modbusIp: "192.168.1.101"
        maxCapacity: 10000
        alarmThreshold: 9500
    }

    // Tank 2-5 benzer şekilde...
}

TankWidget.qml (Tek Tank Komponenti)

Rectangle {
    property int tankId
    property string tankName
    property string modbusIp
    property real maxCapacity
    property real alarmThreshold

    property real currentWeight: modbusClient.getWeight(modbusIp)
    property real fillPercent: (currentWeight / maxCapacity) * 100

    color: fillPercent > 95 ? "#E74C3C" : "#2ECC71"
    border.color: "#34495E"
    border.width: 2
    radius: 10

    ColumnLayout {
        anchors.fill: parent
        spacing: 10

        // Tank adı
        Text {
            text: tankName
            font.pixelSize: 24
            font.bold: true
            color: "white"
        }

        // Ağırlık göstergesi
        Text {
            text: currentWeight.toFixed(1) + " kg"
            font.pixelSize: 48
            color: "white"
        }

        // Doluluk yüzdesi
        ProgressBar {
            from: 0
            to: maxCapacity
            value: currentWeight
        }

        Text {
            text: "%" + fillPercent.toFixed(1)
            font.pixelSize: 20
            color: "white"
        }

        // Tare butonu
        Button {
            text: "TARE"
            onClicked: modbusClient.sendTare(modbusIp)
        }
    }
}

HMI'nın İki Rolü

  1. Operatör Arayüzü: Lokal kontrol ve görselleştirme
  2. IoT Gateway: Modbus verilerini MQTT ile AWS'ye gönderme

HMI paneli Embedded Linux tabanlı olduğu için, üzerinde Python gateway scripti de çalışabilir.

Bileşen #3: IoT Gateway (Raspberry Pi)

GDT cihazları Modbus TCP ile haberleşirken, AWS IoT Core MQTT protokolünü kullanır. Bu nedenle bir gateway gereklidir.

Gateway Yazılımı

gateway.py (Özet)

from pymodbus.client.sync import ModbusTcpClient
from awsiot import mqtt_connection_builder

# Modbus bağlantıları (ZMA-4 cihazları)
zma_clients = {
    'tank1': ModbusTcpClient('192.168.1.101', 502),
    'tank2': ModbusTcpClient('192.168.1.102', 502),
    'tank3': ModbusTcpClient('192.168.1.103', 502),
}

# AWS IoT MQTT bağlantısı
mqtt_conn = mqtt_connection_builder.mtls_from_path(
    endpoint="xxxxx.iot.eu-west-1.amazonaws.com",
    port=8883,
    cert_filepath="certs/gateway-cert.pem",
    pri_key_filepath="certs/gateway-private.key",
    ca_filepath="certs/AmazonRootCA1.pem",
    client_id="amazeng-milk-factory"
)
mqtt_conn.connect()

# Her 1 saniyede bir veri topla ve gönder
while True:
    for tank_name, client in zma_clients.items():
        # ZMA'dan toplam ağırlık oku (Holding Register 200-201)
        result = client.read_holding_registers(address=200, count=2, unit=1)
        weight = struct.unpack('f', struct.pack('HH', *result.registers))[0]

        # MQTT'ye publish et
        payload = json.dumps({
            'tank': tank_name,
            'weight_kg': weight,
            'timestamp': int(time.time() * 1000)
        })
        mqtt_conn.publish(
            topic=f"amazeng/milk-factory/{tank_name}/weight",
            payload=payload,
            qos=1
        )

    time.sleep(1)

Not: HMI paneli de bu görevi yapabilir, ayrı bir Raspberry Pi zorunlu değil.

Bileşen #4: AWS Bulut Platformu

AWS IoT Core - Rule Engine

Kural 1: Timestream'e Veri Yazma

SELECT
    tank as tank_id,
    weight_kg,
    timestamp
FROM 'amazeng/milk-factory/+/weight'

Action: Amazon Timestream → MilkFactory database → TankWeights table

Kural 2: Aşırı Doluluk Alarmı

SELECT
    tank,
    weight_kg
FROM 'amazeng/milk-factory/+/weight'
WHERE weight_kg > 9500

Action: Lambda function → SNS → Email/SMS

Lambda Function - Alarm Bildirimi

alarm_handler.py

import boto3

sns = boto3.client('sns')

def lambda_handler(event, context):
    tank = event['tank']
    weight = event['weight_kg']

    message = f"""
    ⚠️ TANK KAPASĐTE ALARMI ⚠️

    Tank: {tank.upper()}
    Ağırlık: {weight:.1f} kg
    Kapasite: %{(weight/10000)*100:.1f}

    Acil boşaltma gerekebilir!
    """

    # SMS gönder
    sns.publish(
        PhoneNumber='+905551234567',
        Message=message
    )

    # Email gönder
    sns.publish(
        TopicArn='arn:aws:sns:eu-west-1:123456789:tank-alarms',
        Subject='Tank Doluluk Alarmı',
        Message=message
    )

    return {'statusCode': 200}

Amazon Timestream - Veri Depolama

Retention Policy:

  • Memory Store: 7 gün (hızlı sorgu)
  • Magnetic Store: 2 yıl (arşiv)

Örnek Sorgu (Son 24 Saat Ortalaması):

SELECT
    tank_id,
    BIN(time, 1h) as hour,
    AVG(measure_value::double) as avg_weight
FROM "MilkFactory"."TankWeights"
WHERE time > ago(24h)
GROUP BY tank_id, BIN(time, 1h)
ORDER BY hour DESC

Grafana Dashboard

Grafana + Timestream plugin ile gerçek zamanlı dashboard:

Panel 1: Live Tank Status (Gauge)

  • Her tank için doluluk yüzdesi
  • Renk kodlaması: Yeşil (<80%), Sarı (80-95%), Kırmızı (>95%)

Panel 2: Trend Grafiği (Time Series)

  • Son 7 günün ağırlık trendi
  • 5 tank overlay

Panel 3: Günlük Rapor (Table)

  • Her tankın min/max/avg ağırlığı
  • Toplam süt miktarı (litre cinsine dönüştürülmüş)

Gerçek Dünya Faydaları

1. Üretim Optimizasyonu

Öncesi: Operatör her 2 saatte bir tankları fiziksel olarak kontrol eder.
Sonrası: Grafana'dan anlık görür, sadece doluluk alarmında müdahale eder.
Kazanç: Operatör başka işlere odaklanır, %30 verimlilik artışı.

2. Döküman İzlenebilirliği

Öncesi: El yazısı defter kayıtları, hata riski yüksek.
Sonrası: Timestream'de otomatik loglar, Excel export.
Kazanç: Gıda güvenliği denetimleri için hazır raporlar.

3. Kestirimci Bakım

Örnek: Tank 2'nin ağırlığı son 1 haftadır diğerlerine göre %2 düşük okuyor.
Analiz: Grafana anomaly detection → Loadcell arızası şüphesi
Aksiyon: Planlanmış bakım, üretim duruşu önlenir.

Genişletme Seçenekleri

1. AI/ML ile Tahmin

AWS SageMaker ile model eğitimi:

  • Geçmiş verilerden günlük tüketim tahmini
  • Stok yönetimi optimizasyonu

2. n8n ile Workflow Otomasyonu

Örnek: Tank 1 doluluk %95'i geçince → n8n → Tankerleme firmasına otomatik sipariş emaili

3. Mobile App

Flutter/React Native ile mobil uygulama:

  • Yöneticiler telefonda tüm tankları görebilir
  • Push notification ile anında alarmlar

Sonuç

Bu proje, Amazeng ürün ekosisteminin gücünü gösterir:

Not: 2 loadcell'li daha basit uygulamalar için GDT Dijital Transmitter (2 kanal + 3 DIO) tercih edilebilir.

Benzer bir çözümü kendi tesisınızde uygulamak için teknik ekibimizle iletişime geçin.

İlgili Kaynaklar