IoT sensörleriyle üretim sayımı, çetele kağıtlarının ve vardiya sonu tahminlerinin yerini kesin, canlı parça sayılarına bırakır. Bu eğitimde fotoelektrik sensörler ve bir Raspberry Pi ile sağlam ve reddedilen parçaları sayacak, sayacın yeniden başlatmalara ve ağ kesintilerine dayanmasını sağlayacak ve her panonun, tabletin ve raporun aynı sayıyı göstermesi için MQTT üzerinden retained vardiya toplamları yayınlayacaksınız.
Otomatik Sayım Neden Önemli?
Elle yazılan sayımlar geç gelir, yuvarlanır ve zaman zaman iyimserdir. Vardiyadan sonra, bir eksiklik için artık hiçbir şey yapılamayacakken ulaşırlar. Otomatik bir sayaç, hâlâ tepki vermek için zaman varken hedefe olan farkı gösterir ve OEE'nin ihtiyaç duyduğu kalite ve performans girdilerini sağlar. Ayrıca atölyedeki en basit IoT projelerinden biridir: bir sensör, bir uç cihaz, bir topic.
Sayım Noktasını Seçmek
| Sayım noktası | Artıları | Eksileri |
|---|---|---|
| PLC parça sayacı veya "parça tamamlandı" biti | Kesin, zaten debounce edilmiş | PLC erişimi ve değişiklik gerektirir |
| İstasyon çıkışında fotoelektrik sensör | PLC'ye dokunmadan sonradan eklenebilir; çoğu parçada çalışır | Boşlukları, birbirine değen parçaları, yansıtıcı yüzeyleri yönetmesi gerekir |
| Endüktif sensör | Metal parçalar için dayanıklı, kiri yok sayar | Kısa menzil, yalnızca metal |
| Ret oluğu veya hurda kutusu sensörü | Kalite oranı için hurda sayısı verir | İkinci bir sensör gerekir |
| Paketleme istasyonu (kutular, sonra çarpma) | Gerçekte sevk edileni sayar | Gecikmeli, istasyon ile paketleme arasındaki hurdayı gizler |
Parçanın "sağlam" hale geldiği noktaya mümkün olduğunca yakın sayın. Hatta bir muayene istasyonu varsa, geçen parçaları ondan sonra, reddedilen parçaları ise ret yolunda sayın. Sağlam sayısı ile hurda sayısı birlikte toplam çıktıyı verir.
Fotoelektrik sensörlerde konveyörler üzerinde en güvenilir tip karşılıklı (through-beam) sensörlerdir, çünkü birbirine değen veya parlak parçalar difüz sensörleri yanıltabilir. Sensörü, parçalar arasında bir boşluk olacak şekilde her parçanın ışını tam olarak bir kez keseceği biçimde monte edin.
Kablolama
Endüstriyel sensörler 24 V ile çalışır ve PNP veya NPN çıkışlar anahtarlar. Bunları Raspberry Pi'ye bir optokuplör giriş kartı üzerinden bağlayın; Pi'nin GPIO pinleri yalnızca 3,3 V'u tolere eder. Örnek atama:
| Giriş | GPIO (BCM) | Sinyal |
|---|---|---|
| Sağlam parça sensörü | 17 | Karşılıklı sensör alıcı çıkışı |
| Ret sensörü | 27 | Ret oluğu sensörü |
| Vardiya sıfırlama (isteğe bağlı) | 22 | Anahtarlı şalter veya amir butonu |
Sayımlar ve Vardiya Toplamları İçin Topic Tasarımı
connectmq/plant1/packaging/line2/counter/count every N seconds, not retained
connectmq/plant1/packaging/line2/counter/shift retained shift totals
connectmq/plant1/packaging/line2/counter/status retained online / offline
shift mesajı retained olarak tutulur; böylece vardiyanın ortasında açılan bir pano güncel toplamları anında gösterir. Payload'ı artışları değil, mutlak toplamları içerir:
{
"shift": "2026-10-16-A",
"start": 1760594400,
"good": 1843,
"reject": 27,
"target": 2400,
"ts": 1760600000
}
Mutlak toplamları yayınlamak kilit tasarım tercihidir. Bir mesaj kaybolsa veya iki kez teslim edilse bile bir sonraki mesaj yine doğru toplamı içerir; artışlar ise zamanla kayardı.
IoT ile Üretim Sayımı Uç Betiği
Betik her iki girişteki kenarları sayar, bir yeniden başlatmada kaybolmamaları için toplamları birkaç saniyede bir küçük bir dosyaya kaydeder, vardiya değişimlerini bir takvime göre algılar ve retained toplamları yayınlar. Bağımlılıkları bir sanal ortamda pip install gpiozero lgpio paho-mqtt ile kurun.
#!/usr/bin/env python3
"""Production counting IoT edge: sensors -> persistent counts -> retained MQTT totals."""
import json
import os
import threading
import time
from datetime import datetime, timedelta
import paho.mqtt.client as mqtt
from gpiozero import DigitalInputDevice
BROKER = "broker.connectmq.com"
BASE = "connectmq/demo/pc-9d1x/line2/counter"
STATE_FILE = "/var/lib/pc-counter/state.json"
PUBLISH_EVERY = 5 # seconds
SHIFTS = [("A", 6), ("B", 14), ("C", 22)]
TARGET_PER_SHIFT = 2400
lock = threading.Lock()
def current_shift(now=None):
now = now or datetime.now()
starts = []
for name, hour in SHIFTS:
start = now.replace(hour=hour, minute=0, second=0, microsecond=0)
if start > now:
start -= timedelta(days=1)
starts.append((start, name))
start, name = max(starts)
return f"{start:%Y-%m-%d}-{name}", int(start.timestamp())
def load_state():
shift_id, start = current_shift()
try:
with open(STATE_FILE) as f:
state = json.load(f)
if state.get("shift") == shift_id:
return state
except (FileNotFoundError, ValueError):
pass
return {"shift": shift_id, "start": start, "good": 0, "reject": 0}
def save_state(state):
tmp = STATE_FILE + ".tmp"
with open(tmp, "w") as f:
json.dump(state, f)
os.replace(tmp, STATE_FILE) # atomic on the same filesystem
state = load_state()
def count(field):
def handler():
with lock:
state[field] += 1
return handler
good_in = DigitalInputDevice(17, pull_up=True, bounce_time=0.01)
reject_in = DigitalInputDevice(27, pull_up=True, bounce_time=0.01)
good_in.when_activated = count("good")
reject_in.when_activated = count("reject")
def on_connect(client, userdata, flags, reason_code, properties):
print("Connected:", reason_code)
client.publish(f"{BASE}/status", "online", qos=1, retain=True)
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="pc-9d1x-line2")
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()
os.makedirs(os.path.dirname(STATE_FILE), exist_ok=True)
while True:
time.sleep(PUBLISH_EVERY)
shift_id, start = current_shift()
with lock:
if shift_id != state["shift"]:
final = dict(state, ts=int(time.time()), final=True)
client.publish(f"{BASE}/shift-closed", json.dumps(final), qos=1)
state.update(shift=shift_id, start=start, good=0, reject=0)
snapshot = dict(state, target=TARGET_PER_SHIFT, ts=int(time.time()))
save_state(state)
client.publish(f"{BASE}/shift", json.dumps(snapshot), qos=1, retain=True)
client.publish(f"{BASE}/count", json.dumps(snapshot), qos=0)
Vurgulanmaya değer noktalar:
- Atomik kayıt: geçici bir dosyaya yazıp onu yeniden adlandırmak, yazma sırasında bir elektrik kesintisinin durum dosyasını bozamayacağı anlamına gelir.
- Uçta vardiya devri: cihaz vardiyayı kendisi kapatır ve
shift-closedüzerinde nihai bir kayıt yayınlar; böylece o anda hiçbir sunucu dinlemiyor olsa bile toplam doğru olur. Kalıcı oturumla abone olmuş bir historian bu kaydı daha sonra alır. - Debounce:
bounce_timeelektriksel gürültüyü filtreler; debounce penceresinden daha hızlı geçen parçalar eksik sayılır, bu yüzden değeri maksimum parça hızınıza göre ayarlayın.
/var/lib/pc-counter dizinini servis kullanıcısı için izinlerle oluşturun ve betiği systemd altında çalıştırın.
Sayımları İzlemek
mosquitto_sub -h broker.connectmq.com -p 1883 -i pc-view-$RANDOM \
-t "connectmq/demo/pc-9d1x/line2/counter/#" -v
Önce retained vardiya toplamı ve durum gelir, ardından her beş saniyede bir güncellemeler. Genel MQTT test broker'ında bu topic'leri herkes okuyabilir; bu, ışık bariyerinden el geçirilerek yapılan bir masa testi için sorun değildir ama gerçek bir hat için uygun değildir. Üretim 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.
Sayacı Doğrulamak
Kimse sayılara güvenmeden önce bunları doğrulayın:
- Bilinen bir parti çalıştırın (örneğin elle sayılmış 200 parça) ve karşılaştırın.
- Birbirine değen parçalarla ve gerçekçi en yüksek hat hızıyla test edin.
- Bir çalışmanın ortasında yeniden başlatma sırasındaki davranışı kontrol edin: sayım sıfırdan başlamamalı, devam etmelidir.
- Ağı birkaç dakikalığına kesin: sayım yerelde devam eder ve yayınlanan bir sonraki toplam çevrimdışıyken üretilen parçaları da içerir.
- Tam bir vardiyayı paketleme veya ERP sayımıyla karşılaştırın; farklar açıklanabilir olmalıdır (hurda, yeniden işleme, yarı mamul).
Yaygın Sorunlar
| Sorun | Neden | Çözüm |
|---|---|---|
| Çift sayım | Parça kenarları veya delikleri ışını iki kez kesiyor | Debounce'u artırın, sensörü yeniden konumlandırın, karşılıklı sensör kullanın |
| Eksik sayım | Birbirine değen parçalar, çok uzun debounce | Konveyörde boşluk bırakın, debounce'u kısaltın, PLC sinyali kullanın |
| Elektrik kesintisinden sonra sayımın sıfırlanması | Durum kalıcı hale getirilmemiş | Gösterildiği gibi dosyaya kaydedin veya PLC sayacı kullanın |
| Panoların dünkü vardiyayı göstermesi | Durmuş bir cihazdan kalan retained mesaj | status topic'ini izleyin; "çevrimdışı" durumunu belirgin şekilde gösterin |
| Ekranlar arasında farklı toplamlar | Ekranlar artışlardan hesaplıyor | Her zaman retained mutlak toplamı gösterin |
Sayımları Hatta Göstermek
En etkili ekran basit olanıdır: şu ana kadarki sağlam parçalar, şu ana kadarki hedef (geçen vardiya süresine orantılı) ve aradaki fark; hepsi iş istasyonundan görülebilecek büyük rakamlarla. Duvar ekranındaki bir tarayıcı, güvenli WebSocket üzerinden retained shift topic'ine abone olabilir ve orantılı hedefi start ile target değerlerinden hesaplayabilir; böylece ek bir sunucuya gerek kalmaz. Farkı öndeyken yeşil, gerideyken kırmızı renklendirin ve hızın kalite pahasına kutlanmaması için yanına ret sayısını koyun.
Devreye alma sırasında ConnectMQ portalındaki canlı topic gezgini her sayacın retained toplamını ve durumunu gösterir; bu da ekranlar asılmadan önce her hattın yayın yaptığını kontrol etmeyi kolaylaştırır.
Sayımları Kullanmak
Hedefe karşı canlı sayımlar, bir hattaki en basit motive edici ekrandır. Makine durumu izleme ile elde edilen çalışma süresi ve çevrim süresi izleme ile elde edilen çevrim verileriyle birleştiğinde doğrudan gerçek zamanlı OEE izleme sürecini besler: sağlam sayısının toplam sayıya oranı kalite oranıdır, toplam sayının ideal çevrim süresiyle karşılaştırılması ise performansı verir. Enerji ekipleri de parça başına enerjiyi hesaplamak için aynı sağlam parça sayısını kullanır.
Broker, tüm bu tüketiciler için ortak doğruluk kaynağıdır; bu yüzden çok sayıda hatta ölçeklenmeden önce bir MQTT broker'ın ne yaptığını anlamak faydalıdır. Akıllı üretim rehberi, sayımın daha geniş bir yol haritasında nereye oturduğunu gösteriyor.
Sayaçlarınızı ConnectMQ ile Ölçeklendirin
ConnectMQ; TLS, MQTT 5, retained mesajlar, ISA-95 cihaz görünümü ve örneğin good sayısının planın gerisinde kalması gibi durumlar için eşik alarmları sunan tam yönetilen bir MQTT hizmetidir. Kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun ve ilk sayacınızı dakikalar içinde bağlayın.
Sık Sorulan Sorular
Bir üretim sayacı artışları mı yoksa toplamları mı yayınlamalı?
Toplamları. Retained bir mesajdaki mutlak vardiya toplamı, mesajlar kaybolsa veya çoğaltılsa bile doğrudur ve yeni aboneler güncel değeri hemen görür.
Ağ kesilirse sayımlara ne olur?
Uç cihaz yerelde saymaya devam eder ve toplamları kalıcı olarak saklar. Bağlantı geri geldiğinde yayınlanan bir sonraki mesaj, kesinti sırasında üretilen parçalar dahil eksiksiz toplamı içerir.
IoT ile üretim sayımı projeleri için en iyi sensör hangisi?
Konveyörlerde en güvenilir genel tercih karşılıklı fotoelektrik sensörlerdir. Endüktif sensörler metal parçalara uygundur; mevcutsa bir PLC "parça tamamlandı" sinyali en iyisidir.
Hurdayı ayrı olarak nasıl sayarım?
Ret yoluna ikinci bir sensör ekleyin veya muayene istasyonunun ret sinyalini kullanın; kalite oranının her zaman tutarlı olması için sağlam ve ret sayılarını aynı mesajda yayınlayın.



