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:
- Ö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.
- 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=Truekullanı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:
- Kullanılabilirlik: olay geçmişinden, çalışma süresinin planlanan üretim süresine bölünmesi.
- Duruş kaydı: çalışıyor durumundan arızalıya her geçiş bir duruş kaydı açar; operatörler bir tablette nedenleri ekler.
- Ç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.
- Parça sayımı: aynı darbe üzerindeki bir sayaç IoT sensörlerle üretim sayımı uygulamasını besler.
- 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.



