Endüstriyel IoT

Endüstriyel Zaman Serisi Verisi: Örnekleme, Sıkıştırma ve Depolama

MQTT üzerinden akan endüstriyel zaman serisi verisinin nasıl örnekleneceği, sıkıştırılacağı, zaman damgası ekleneceği ve depolanacağı; deadband kodu, bir Telegraf yapılandırması ve bir depolama karar tablosuyla.

Ham sensör örneklerini, deadband ile sıkıştırılmış noktaları ve sahadan historian'a depolama katmanlarını gösteren endüstriyel zaman serisi verisi grafiği
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

Endüstriyel zaman serisi verisi; makinelerin, sensörlerin ve kontrolörlerin her vardiyanın her saniyesinde ürettiği zaman damgalı ölçümler akışıdır. Bu veriyi iyi yönetmek; ne sıklıkta örnekleme yapılacağını, neyin atılacağını, zaman damgasının nasıl ekleneceğini ve verinin nerede tutulacağını seçmek demektir. Bu yazı bu kararların her birini ele alıyor ve MQTT verisine historian'a ulaşmadan önce deadband sıkıştırma uygulamak için çalışan bir kod sunuyor.

Endüstriyel Zaman Serisi Verisini Farklı Kılan Nedir?

Tüm zaman serileri aynı yapıyı paylaşır: bir zaman damgası, bir tanımlayıcı ve bir değer. Endüstriyel veri, BT izleme verisinde nadiren görülen birkaç zorluk ekler.

  • Çok farklı değişim hızları. Bir tank seviyesi saatler içinde yavaşça değişir; bir titreşim sinyali saniyede binlerce kez değişir. Tek bir örnekleme politikası ikisine birden uymaz.
  • Uzun saklama gereksinimleri. Kalite soruşturmaları, yasal kayıtlar ve model eğitimi çoğu zaman haftalar değil, yıllar boyu geçmiş gerektirir.
  • Kalite en az değer kadar önemlidir. Bağlantısı kopmuş bir sensörden gelen değer bir ölçüm değildir. Endüstriyel sistemler her noktanın yanında bir kalite bayrağı taşır.
  • Analog veriyle karışık olay ve durum verisi. Makine durumları, alarmlar, parti kimlikleri ve reçete değişiklikleri seyrektir ve yoğun analog sinyallerle birleştirilmesi gerekir.
  • Kontrol etmediğiniz saatler. PLC'lerin, gateway'lerin ve sunucuların her birinin kendi saati vardır ve bu saatler kayar.

Bunları en baştan doğru kurmak, yıllarca biriken tutarsız geçmişi sonradan onarmaktan çok daha ucuzdur.

Örnekleme Hızlarını Seçmek

Örnekleme hızı, PLC'nin varsayılan tarama süresini değil, sinyalin fiziğini ve yanıtlamak istediğiniz soruyu izlemelidir.

Sinyal türü Tipik davranış Pratik yaklaşım
Sıcaklıklar, seviyeler, yavaş basınçlar Saniyeler ile dakikalar içinde değişir Her 1–10 s'de örnekleyin, deadband ile sıkıştırın
Debiler, motor akımı, hızlar Saniyenin altında ile saniyeler içinde değişir Her 100 ms–1 s'de örnekleyin, deadband ile sıkıştırın
Makine durumu, alarmlar, sayaçlar Ayrık olaylar Yalnızca değişimde yayınlayın (istisna bazlı raporlama)
Titreşim, akustik, güç kalitesi Milisaniyeler içinde değişir Sahada kHz düzeyinde örnekleyin, öznitelikleri (RMS, tepe, bantlar) yayınlayın

İki kural yardımcı olur. Birincisi Nyquist ilkesi: bir değişimi görmek için en az o değişimin iki katı hızda, pratikte ise birkaç katı hızda örnekleme yapın. İkincisi, ham yüksek frekanslı dalga formlarını MQTT üzerinden sürekli olarak akıtmayın. Öznitelikleri sahada hesaplayıp onları yayınlayın; ham anlık görüntüleri yalnızca talep üzerine veya olaylarda gönderin.

Ayrık veri için istisna bazlı raporlama doğal desendir. İstisna bazlı raporlama yazısı, bunun bilgi kaybetmeden trafiği nasıl azalttığını açıklıyor.

Sıkıştırma: Sinyali Korumak, Gürültüyü Atmak

Endüstriyel historian'larda sıkıştırma genellikle zip dosyaları değil, veri alımı sırasında kayıplı filtreleme anlamına gelir. Amaç, sinyali bilinen bir tolerans içinde yeniden oluşturabilirken daha az nokta saklamaktır.

Deadband (istisna) filtreleme

En basit yöntem: yalnızca değer son saklanan değerden bir eşikten fazla farklı olduğunda yeni bir nokta saklayın. Bir sıcaklıkta 0,2 degC'lik bir deadband, 0,2 degC'nin altındaki dalgalanmaların saklanmadığı anlamına gelir. Çoğu uygulama, hiçbir şey değişmese bile belirli bir maksimum süreden sonra bir nokta saklar (heartbeat); böylece tüketiciler kararlı bir sinyali ölü bir sinyalden ayırt edebilir.

Swinging door sıkıştırma

Pek çok ticari historian'da kullanılan swinging door trending, yalnızca son saklanan noktadan çizilen düz bir çizgi aradaki değerleri artık tolerans içinde temsil edemediğinde bir nokta saklar. Eğimleri düz bir deadband'den çok daha iyi korur; böylece rampalar çok sayıda nokta yerine birkaç noktayla saklanır.

Toleransları seçmek

Toleransı keyfi bir yüzdeye göre değil, sensörün doğruluğuna göre belirleyin. Sensörün gürültü tabanının altında filtrelemek gürültüyü saklar; çok üstünde filtrelemek ise gerçek proses değişikliklerini kaybettirir. Toleransı, diğer model öznitelikleri gibi gözden geçirilmesi için IIoT veri modelinizde etiket türü başına belgeleyin.

Python ile MQTT Verisinde Deadband Sıkıştırma

Bu abone MQTT'den JSON telemetri okur, heartbeat'li bir deadband uygular ve elenmeyen noktaları InfluxDB line protocol formatında standart çıktıya yazar; bunu bir dosyaya yönlendirebilir veya bir yazıcıya aktarabilirsiniz. Ücretsiz herkese açık MQTT broker ile yerleşik bir demo simülatörü kullanır.

import json
import math
import random
import threading
import time
import uuid

import paho.mqtt.client as mqtt

BROKER = "broker.connectmq.com"
PREFIX = f"connectmq/demo/{uuid.uuid4().hex[:8]}/plant1/line1"
DEADBAND = {"temperature": 0.2, "pressure": 0.05}
HEARTBEAT_S = 60

last_stored = {}  # topic -> (değer, ts_saniye)


def keep(topic, metric, value, ts):
    prev = last_stored.get(topic)
    if prev is None:
        return True
    band = DEADBAND.get(metric, 0.0)
    return abs(value - prev[0]) > band or ts - prev[1] >= HEARTBEAT_S


def on_connect(client, userdata, flags, reason_code, properties):
    client.subscribe(f"{PREFIX}/+/+", qos=1)


def on_message(client, userdata, msg):
    asset, metric = msg.topic.split("/")[-2:]
    p = json.loads(msg.payload)
    ts = p["ts"] / 1000
    if keep(msg.topic, metric, p["value"], ts):
        last_stored[msg.topic] = (p["value"], ts)
        print(f'{metric},asset={asset},quality={p["quality"]} value={p["value"]} {int(p["ts"] * 1e6)}')


def simulate(pub):
    t0 = time.time()
    while True:
        t = time.time() - t0
        temp = 60 + 5 * math.sin(t / 120) + random.gauss(0, 0.05)
        pres = 2.5 + random.gauss(0, 0.01)
        ts = int(time.time() * 1000)
        for metric, val in [("temperature", temp), ("pressure", pres)]:
            body = {"value": round(val, 3), "ts": ts, "quality": "GOOD"}
            pub.publish(f"{PREFIX}/pump1/{metric}", json.dumps(body), qos=0)
        time.sleep(1)


client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="tsdb-" + uuid.uuid4().hex[:8])
client.on_connect = on_connect
client.on_message = on_message
client.connect(BROKER, 1883, keepalive=60)
threading.Thread(target=simulate, args=(client,), daemon=True).start()
client.loop_forever()

Birkaç dakika çalıştırın ve satırları sayın: deadband'inin altında yalnızca gürültü gösteren basınç, dakikada kabaca bir nokta (heartbeat) üretirken sıcaklık sinüs dalgası hareket ettikçe nokta üretir. Bir historian'dan istediğiniz davranış tam olarak budur: proses hareket ettiğinde yoğun, hareket etmediğinde seyrek.

Zaman Damgaları ve Sıralama

Zaman damgasını her zaman kaynakta, ölçüme olabildiğince yakın, UTC olarak ve milisaniye hassasiyetinde ekleyin. Broker'a varış zamanı ölçüm zamanı değildir; özellikle bir edge gateway ağ kesintisi sırasında veriyi tamponlayıp daha sonra ilettiğinde. Store and forward deseni, geç gelen veriyi doğru yere yerleştirmek için kaynak zaman damgalarına dayanır.

Saatleri gateway'lerde ve mümkünse kontrolörlerde NTP veya PTP ile senkronize edin. Sırasız varış bekleyin ve depolamanızın geçmişe yazmayı kabul ettiğinden emin olun. Bazı zaman serisi veritabanları geç yazmaları verimli şekilde işler; bazıları ise bunu cezalandırır.

Endüstriyel Zaman Serisi Verisi İçin Depolama Seçenekleri

Seçenek Güçlü yönler Dikkat edilecekler
Ticari proses historian'ı Yerleşik sıkıştırma, kalite, varlık modelleri, uzun saklama Lisanslama, tescilli erişim
Zaman serisi veritabanı (InfluxDB, TimescaleDB, QuestDB) Açık arayüzler, SQL veya Flux sorguları, iyi yazma hızları Sıkıştırma, saklama ve örnek azaltmayı kendiniz tasarlarsınız
Veri gölü (nesne depolamada Parquet) Ucuz uzun vadeli depolama, ML eğitimi için ideal Gerçek zamanlı sorgular için uygun değil
Katmanlı kombinasyon Sıcak veri TSDB'de, soğuk veri veri gölünde İşletilmesi gereken iki sistem

Pek çok tesis, yakın dönem verisi için bir historian veya TSDB'yi uzun vadeli analitik için bir veri gölüyle birleştirir. MQTT historian yazısı, historian tarafını doğrudan MQTT topic'lerinden kurmayı adım adım anlatıyor.

Veriyi Broker'dan Depolamaya Taşımak

Broker bir veritabanı değil, bir yönlendiricidir: mesajlar onun üzerinden akar ve retained message'lar topic başına yalnızca son değeri tutar. Geçmişi saklamak için abone olup veri ekleyen bir yazıcı çalıştırırsınız. Telegraf yaygın bir seçimdir:

[[inputs.mqtt_consumer]]
  servers = ["ssl://broker.connectmq.com:8883"]
  topics = ["connectmq/plant1/#"]
  client_id = "YOUR_CLIENT_ID"
  username = "YOUR_USERNAME"
  password = "YOUR_PASSWORD"
  qos = 1
  data_format = "json"
  json_time_key = "ts"
  json_time_format = "unix_ms"
  tag_keys = ["quality"]

  [[inputs.mqtt_consumer.topic_parsing]]
    topic = "connectmq/+/+/+/+"
    tags = "_/site/line/asset/_"
    measurement = "_/_/_/_/measurement"

[[outputs.influxdb_v2]]
  urls = ["http://localhost:8086"]
  token = "YOUR_INFLUX_TOKEN"
  organization = "plant"
  bucket = "telemetry"

Yönetilen MQTT broker olarak ConnectMQ kullanıldığında Telegraf, 8883 portunda TLS üzerinden bağlanan kimliği doğrulanmış bir istemciden ibarettir. Kısa bir bağlantı kopmasının veriyi sessizce kaybettirmemesi için yazıcı aboneliğinde QoS 1 kullanın; yazıcı yeniden başlarken mesajların kuyrukta tutulmasını istiyorsanız oturumunu kalıcı tutun.

Endüstriyel Zaman Serisi Verisi İçin Kontrol Listesi

  1. Her sinyali sınıflandırın: yavaş analog, hızlı analog, ayrık veya yüksek frekanslı.
  2. Örneklemeyi ve deadband'i sınıf başına, sensör doğruluğuna göre belirleyin.
  3. Kararlı sinyallerin ölü sinyallerden ayırt edilebilmesi için bir heartbeat ekleyin.
  4. Zaman damgasını kaynakta, UTC olarak ve milisaniye hassasiyetinde ekleyin.
  5. Her değerle birlikte kalite bilgisini yayınlayın.
  6. kHz düzeyindeki sinyaller için öznitelikleri sahada hesaplayın.
  7. Sıcak ve soğuk depolamayı seçin; saklama ve örnek azaltma kurallarını tanımlayın.
  8. Devreye almadan önce geç ve sırasız yazmaları test edin.

Tüm bunların etrafındaki mimari için MQTT ile endüstriyel IoT rehberine bakın.

ConnectMQ ile Başlayın

app.connectmq.com adresinde kredi kartı gerektirmeden ücretsiz bir Serverless broker oluşturun, ardından gateway'inizi ve bir Telegraf veya Python yazıcısını oluşturulan kimlik bilgilerinizle bağlayın. ConnectMQ canlı topic gezgini, bir örnekleme ve sıkıştırma politikasına karar vermeden önce yayın hızlarını ve payload'ları kontrol etmenize yardımcı olur.

Sık Sorulan Sorular

Endüstriyel zaman serisi verisi nedir?

Sıcaklıklar, basınçlar, hızlar, durumlar ve sayaçlar gibi endüstriyel ekipmanın ürettiği zaman damgalı ölçüm ve olay verisidir. Genellikle bir kalite bayrağıyla saklanır ve operasyon, kalite ve analitik için uzun süre tutulur.

İyi bir deadband değeri nedir?

O ölçüm için sensörün doğruluk veya gürültü düzeyine yakın bir değerle başlayın, ardından önemli proses değişikliklerinin saklanan veride hâlâ görünür olduğunu kontrol edin. Değeri etiket türü başına belgeleyin ve sensörler değiştiğinde gözden geçirin.

Bir MQTT broker zaman serisi geçmişini saklayabilir mi?

Hayır. Broker mesajları yönlendirir ve topic başına en fazla son retained değeri tutar. Geçmişi Telegraf, bir historian bağlayıcısı veya kendi yazıcınız gibi bir aboneyle saklayın.

Ham titreşim verisini MQTT üzerinden akıtmalı mıyım?

Genellikle sürekli olarak değil. RMS, tepe ve bant enerjileri gibi öznitelikleri sahada hesaplayıp bunları yayınlayın; ham dalga formu anlık görüntülerini yalnızca talep üzerine veya bir olay tetiklediğinde gönderin.

İlgili yazılar

CODESYS MQTT Client: PLC Değişkenlerini Bir Broker'a Yayınlama

CODESYS IIoT MQTT Client kütüphanesini PLC değişkenlerini JSON olarak yayınlayacak şekilde yapılandırın, broker.connectmq.com üzerinde doğrulayın, ardından kimlik bilgileri ve TLS içeren özel bir broker'a geçin.

6 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.