Akıllı Üretim

MQTT ile Makine Durum İzleme: Çalışıyor, Boşta ve Arızalı Durumları Gerçek Zamanlı

Temiz bir makine durum modeli tanımlayın, çalışıyor, boşta ve arızalı durumlarını kolon lambalarından veya PLC sinyallerinden türetin ve retained MQTT mesajları yayınlayarak her panonun bağlandığı anda güncel durumu göstermesini sağlayın.

MQTT retained mesajlarıyla canlı güncellenen, birkaç makinenin çalışıyor, boşta ve arızalı durumlarını gösteren makine durum izleme panosu
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

Makine durum izleme, atölyedeki en temel soruyu, yani "şu anda çalışıyor mu?" sorusunu tüm makineler için aynı anda yanıtlar. Bu eğitimde basit bir durum modeli tanımlayacak, bir Raspberry Pi üzerinde kolon lambası veya PLC sinyallerinden çalışıyor, boşta ve arızalı durumlarını türetecek ve durumu retained MQTT mesajları olarak yayınlayacaksınız; böylece herhangi bir pano bağlandığı anda güncel durumu gösterir.

Neden Makine Durumuyla Başlamalı?

Makine durumu, neredeyse her üretim KPI'ının temelidir. OEE'deki kullanılabilirlik, duruş analizi, çevrim süresi istatistikleri ve boşta geçen saat başına enerji, makinenin ne zaman çalışıp ne zaman çalışmadığını bilmeye dayanır. Aynı zamanda elde edilmesi en ucuz veridir: birçok makine durumunu zaten bir kolon lambasında gösterir ve neredeyse her PLC'nin bir "çevrim aktif" ve bir "arıza" biti vardır.

Zorluk sinyalde değil, tutarlılıktadır. Bir makine "auto", bir diğeri "RUN" ve üçüncüsü yalnızca yeşil bir lamba bildiriyorsa, bunları karşılaştırmak zahmetlidir. Bu yüzden önce durum modeli gelir.

Pratik Bir Durum Modeli

Durum sayısını az, tanımları ise net tutun. Bu beş durumlu model, kesikli üretimin çoğunu kapsar:

Durum Tanım Tipik sinyal
running Makine üretiyor; beklenen süre içinde bir çevrim tamamlandı Çevrim darbesi, yeşil lamba, PLC "in cycle"
idle Makine sağlıklı ve kullanılabilir ama üretmiyor (malzeme, operatör veya önceki istasyon bekleniyor) Arıza yok, yakın zamanda çevrim yok
down Makine bir arıza veya alarm nedeniyle üretemiyor Kırmızı lamba, PLC arıza biti
setup Planlı ürün değişimi, takım değişimi veya bakım Operatör girişi, PLC modu, MES iş emri durumu
offline Edge cihazından veri yok MQTT Last Will

Modelin işlemesini iki kural sağlar:

  1. Öncelik: birden fazla koşul doğruysa en yüksek öncelikli olan kazanır. Mantıklı bir sıra şöyledir: offline, down, setup, running, idle.
  2. Zamanla debounce: her 40 saniyede bir çevrim tamamlayan bir makine, çevrimler arasında boşta durumuna gidip gelmemelidir. Örneğin nominal çevrim süresinin iki katı boyunca hiç çevrim görülmeyene kadar onu çalışıyor kabul edin.

Arıza ve boşta kalma nedenleri (malzeme yok, takım kırılması, kalite blokajı) ayrı bir boyuttur. Durumları çoğaltmak yerine bunları daha sonra bir reason alanında yakalayın.

Retained Mesajlarla Topic Tasarımı

Her makine, güncel durumunu retained mesaj olarak tutan bir state topic'ine sahip olur. Broker, topic başına son retained mesajı saklar ve her yeni aboneye hemen gönderir. Saat 10:15'te açılan bir panonun bir sonraki değişikliği beklemesi gerekmez; "09:52'den beri arızalı" bilgisini hemen görür. Mekanizmanın tamamı için MQTT retained mesajları yazısını okuyun.

connectmq/plant1/machining/line1/cnc-01/state     retained  current state
connectmq/plant1/machining/line1/cnc-01/events    not retained, one message per transition
connectmq/plant1/machining/line1/cnc-01/status    retained  online / offline (Last Will)

Durum payload'u:

{
  "state": "down",
  "since": 1760599920,
  "previous": "running",
  "reason": null,
  "source": "edge-cnc-01"
}

since alanını eklemek, bir panonun herhangi bir geçmiş veritabanı olmadan süreyi göstermesini sağlar. events topic'i ise duruş ve kullanılabilirlik raporları için bir historian'ın abone olduğu topic'tir.

Sinyallerin Kablolanması

PLC'ye ağ erişimi olmayan makinelerde kolon lambasını veya boştaki PLC çıkışlarını 24 V optokuplör giriş modülleri üzerinden Raspberry Pi GPIO'suna bağlayın. 24 V sinyalleri asla doğrudan Pi'ye bağlamayın; GPIO pinleri yalnızca 3,3 V'tur. Makine panolarındaki elektrik işleri yetkin personel tarafından yapılmalıdır.

Sinyal GPIO (BCM) Aktif olduğunda anlamı
Çevrim tamamlandı darbesi veya yeşil lamba 17 Bir çevrim bitti / makine çevrimde
Kırmızı lamba veya arıza çıkışı 27 Makine arızada
Kurulum anahtarı veya sarı lamba 22 Planlı kurulum veya ürün değişimi

PLC'ye ağ üzerinden erişilebiliyorsa aynı bitleri bunun yerine Modbus TCP, OPC UA veya S7 üzerinden okuyun; yalnızca giriş fonksiyonu değişir.

Makine Durum İzleme Edge Betiği

Kütüphaneleri bir sanal ortama kurun (pip install gpiozero lgpio paho-mqtt). Aşağıdaki betik girişleri saniyede iki kez değerlendirir, öncelik ve zamanlama kurallarını uygular ve yalnızca geçişlerde yayın yapar.

#!/usr/bin/env python3
"""Machine status monitoring edge script: GPIO signals -> retained MQTT state."""
import json
import time

import paho.mqtt.client as mqtt
from gpiozero import DigitalInputDevice

BROKER = "broker.connectmq.com"
MACHINE = "cnc-01"
BASE = f"connectmq/demo/msm-5t2r/line1/{MACHINE}"
NOMINAL_CYCLE_S = 40
RUN_TIMEOUT_S = 2 * NOMINAL_CYCLE_S

cycle_in = DigitalInputDevice(17, pull_up=True, bounce_time=0.02)
fault_in = DigitalInputDevice(27, pull_up=True, bounce_time=0.05)
setup_in = DigitalInputDevice(22, pull_up=True, bounce_time=0.05)

last_cycle = 0.0
state, since = None, 0


def on_cycle():
    global last_cycle
    last_cycle = time.time()


cycle_in.when_activated = on_cycle


def derive_state(now):
    if fault_in.is_active:
        return "down"
    if setup_in.is_active:
        return "setup"
    if cycle_in.is_active or now - last_cycle < RUN_TIMEOUT_S:
        return "running"
    return "idle"


def on_connect(client, userdata, flags, reason_code, properties):
    print("Connected:", reason_code)
    client.publish(f"{BASE}/status", "online", qos=1, retain=True)
    if state is not None:                           # yeniden bağlantıdan sonra geri yükle
        publish_state(client, state, state, since, event=False)


def publish_state(client, new, previous, ts, event=True):
    payload = {"state": new, "since": ts, "previous": previous,
               "reason": None, "source": f"edge-{MACHINE}"}
    client.publish(f"{BASE}/state", json.dumps(payload), qos=1, retain=True)
    if event:
        client.publish(f"{BASE}/events", json.dumps(payload), qos=1)
    print(payload)


client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=f"msm-5t2r-{MACHINE}")
client.will_set(f"{BASE}/status", "offline", qos=1, retain=True)
client.on_connect = on_connect
client.connect(BROKER, 1883, keepalive=30)
client.loop_start()

while True:
    now = time.time()
    new = derive_state(now)
    if new != state:
        previous, state, since = state, new, int(now)
        publish_state(client, state, previous, since)
    time.sleep(0.5)

Dikkat çekmeye değer birkaç tasarım tercihi:

  • status üzerindeki Last Will, çöken bir betiği, kaybolan bir ağı veya bir elektrik kesintisini donmuş bir "running" yerine görünür bir "offline" durumuna dönüştürür.
  • Betik yeniden bağlandığında retained durumu yeniden yayınlar; böylece bağlantı koptuğu sırada bir geçiş yaşanmış olsa bile broker her zaman en güncel gerçeği tutar.
  • Girişler pull_up=True kullanır, çünkü tipik optokuplör modülleri aktif olduklarında hattı düşük seviyeye çeker. Modülünüz farklı davranıyorsa mantığı tersine çevirin.

Açılışta başlaması için betiği bir systemd servisi olarak çalıştırın. Üretim broker'ı için client.username_pw_set("YOUR_USERNAME", "YOUR_PASSWORD") ve client.tls_set() ekleyin, size verilen client ID'yi kullanın ve 8883 portuna bağlanın.

Durum Panosunu Görüntülemek

Artık herhangi bir MQTT istemcisi canlı durumu gösterebilir. Bir terminalden:

mosquitto_sub -h broker.connectmq.com -p 1883 -i msm-board-$RANDOM \
  -t "connectmq/demo/msm-5t2r/line1/+/state" -v

Retained durumlar her makine için bir satır olmak üzere hemen görünür. Bir tarayıcı panosunda MQTT.js güvenli WebSocket üzerinden bağlanır ve aynısını yapar:

import mqtt from "mqtt";

const client = mqtt.connect("wss://broker.connectmq.com:8084/mqtt", {
  clientId: "msm-board-" + Math.random().toString(16).slice(2, 8),
  protocolVersion: 5,
});
const board = {};

client.on("connect", () => client.subscribe("connectmq/demo/msm-5t2r/line1/+/state"));
client.on("message", (topic, payload) => {
  const machine = topic.split("/").at(-2);
  board[machine] = JSON.parse(payload.toString());
  const lines = Object.entries(board).map(([m, s]) => {
    const minutes = Math.round((Date.now() / 1000 - s.since) / 60);
    return `${m}: ${s.state} for ${minutes} min`;
  });
  console.clear();
  console.log(lines.join("\n"));
});

Herkese açık MQTT test broker'ındaki topic'lerin herkes tarafından görülebildiğini unutmayın; gerçek bir tesisin makine adları ve durumları özel bir broker'da olmalıdır.

Durumdan Metriklere

events akışı oluştuğunda hat izlemenin geri kalanı bunun üzerine kurulur:

  1. Kullanılabilirlik: olay geçmişinden, çalışma süresinin planlanan üretim süresine bölünmesi.
  2. Duruş kaydı: çalışıyor durumundan arızalıya her geçiş bir duruş kaydı açar; operatörler bir tablette nedenleri ekler.
  3. Çevrim süresi: zaman damgalı aynı çevrim girişi, çevrim çevrim süreleri verir; bu konu çevrim süresi izleme yazısında ele alınmıştır.
  4. Parça sayımı: aynı darbe üzerindeki bir sayaç IoT sensörlerle üretim sayımı uygulamasını besler.
  5. Eskalasyon: bir eşikten uzun süre arızalı kalan bir makine, bir dijital andon sistemi üzerinde çağrı tetikler.

Sorun Giderme

Belirti Neden Çözüm
Durum çalışıyor ile boşta arasında gidip geliyor Çalışma zaman aşımı gerçek çevrim değişkenliğinden kısa RUN_TIMEOUT_S değerini artırın
Pano bir elektrik kesintisinden sonra eski "running" durumunu gösteriyor Last Will yok veya pano status bilgisini yok sayıyor Last Will kullanın ve offline durumunu öncelikli gösterin
Eski makineler hâlâ panoda görünüyor Devreden çıkarmadan sonra retained mesajlar kalıyor Topic'i temizlemek için boş bir retained mesaj yayınlayın
Arıza girişi her zaman aktif Optokuplör modülünün ters mantığı pull_up ayarını değiştirin veya active_state kullanın

Ölçekte Çalıştırmak

Her biri retained bir duruma ve güvenilir şekilde yeniden bağlanması gereken bir edge istemcisine sahip düzinelerce makine, tam olarak bir yönetilen MQTT broker için tasarlanmış iş yüküdür. ConnectMQ ayrıca istemci başına bağlantı durumunu $SYS/broker/connection/{clientId}/state altında sunar; bu da sürekli bağlantısı kopan edge cihazlarını fark etmeye yardımcı olur. Akıllı üretim rehberi, makine durumunun eksiksiz bir izleme yol haritasına nasıl oturduğunu gösteriyor.

ConnectMQ ile Başlayın

ConnectMQ; retained mesajlar, canlı topic gezgini ve makineleri alan ve hatta göre gruplayan ISA-95 cihaz görünümüyle TLS ile güvenli bir MQTT 5 broker sunar. Kredi kartı olmadan ücretsiz bir Serverless broker oluşturun ve makine durum izlemenizi test broker'ından üretime taşıyın.

Sık Sorulan Sorular

Makine durumu için neden retained mesajlar kullanılmalı?

Retained bir mesaj her yeni aboneye hemen iletilir; böylece panolar, tabletler ve servisler bir sonraki değişikliği beklemek yerine her makinenin güncel durumuyla başlar.

Bir makinenin edge cihazının çevrimdışı olduğunu nasıl tespit ederim?

İstemci bağlandığında retained bir status topic'i üzerinde bir Last Will mesajı ayarlayın. Cihazın bağlantısı beklenmedik şekilde koparsa broker Will mesajını yayınlar ve panolar makineyi çevrimdışı olarak gösterebilir.

Makine durumunu kolon lambaları yerine doğrudan PLC'den alabilir miyim?

Evet. PLC'nin çevrim ve arıza bitlerini Modbus TCP, OPC UA veya bir üretici protokolü üzerinden okuyun ve aynı durum mantığına aktarın. PLC sinyalleri genellikle kolon lambalarından daha hassastır.

Bir makine durum modelinde kaç durum olmalı?

Sorularınızı yanıtlamaya devam ederken mümkün olduğunca az. Çalışıyor, boşta, arızalı, kurulum ve çevrimdışı durumları ihtiyaçların çoğunu karşılar; ayrıntılar için durum eklemek yerine neden kodları kullanın.

İlgili yazılar

OEE vs TEEP vs OOE: Hangi Metriği Kullanmalısınız?

OEE, OOE ve TEEP aynı performans ve kalite faktörlerini paylaşır, ancak farklı zaman tabanlarına göre ölçer. Bu karşılaştırma tek bir örnek üzerinden ilerliyor ve her metriğin ihtiyaç duyduğu MQTT sinyallerini listeliyor.

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.