Çevrim süresi takibi, kronometre çalışmasının yerini her istasyonda, gün boyu her çevrimin ölçümüyle değiştirir. Bu eğitimde bir PLC çıkışından veya bir sensörden gelen çevrim sinyallerini ESP32 ile yakalayacak, her çevrimi MQTT üzerinden yayınlayacak ve istasyon başına kayan istatistikleri hesaplayıp takt süresine göre hattın darboğazını belirleyen küçük bir analiz servisi çalıştıracaksınız.
Çevrim Süresi, Takt Süresi ve Farkın Önemi
Üç terim sık sık karıştırılır:
| Terim | Tanım | Kaynak |
|---|---|---|
| Takt süresi | Kullanılabilir üretim süresinin müşteri talebine bölümü; hattın tutturması gereken tempo | Planlama |
| İdeal (tasarım) çevrim süresi | İdeal koşullarda bir çevrim için mümkün olan en kısa süre | Makine spesifikasyonu, proses mühendisliği |
| Gerçek çevrim süresi | Bir istasyonda art arda tamamlanan çevrimler arasında ölçülen süre | Ölçüm |
Bir istasyonun gerçek çevrim süresi takt süresinden uzunsa hat, fazla mesai olmadan talebi karşılayamaz. İdeal çevrim süresinden uzunsa aradaki fark OEE açısından bir performans kaybıdır. Bir kronometre çalışması birkaç düzine çevrimlik anlık bir görüntü verir; sürekli izleme ise vardiya başında, takım değişimlerinden sonra veya belirli operatörler ve malzemelerle yaşanan yavaş çevrimler dahil tüm dağılımı gösterir.
Hangi Sinyal Kullanılmalı?
Her çevrimin aynı noktasını işaretleyen bir sinyal seçin:
- PLC "çevrim tamamlandı" çıkışı veya boş bir çıkışa eşleyebileceğiniz bir bit. En doğru seçenek.
- Fotoelektrik veya endüktif sensör gibi istasyon çıkışında bir parça var sensörü.
- Bir açma/kapama dizisinin bir çevrime eşit olduğu, manuel yüklenen makineler için bağlama veya kapı sinyali.
- Hiçbir ayrık sinyal yoksa son çare olarak bir iş milinin veya presin akım imzası.
Tüm 24 V sinyaller mikrodenetleyiciye asla doğrudan değil, bir optokuplör veya uygun bir seviye dönüştürücü giriş modülü üzerinden ulaşmalıdır.
Topic Tasarımı
Çevrim başına bir mesaj ham veriyi bozulmadan korur ve her tüketicinin kendi istatistiklerini hesaplamasına izin verir:
connectmq/plant1/assembly/line1/st-10/cycle {"seq":1532,"ct_ms":41250,"ts":1760600000}
connectmq/plant1/assembly/line1/st-20/cycle ...
connectmq/plant1/assembly/line1/cycle-stats retained summary for all stations
Sıra numarası tüketicilerin kayıp mesajları tespit etmesini sağlar; ct_ms ise cihazda kendi saatiyle hesaplanır, böylece ağ gecikmesi ölçümü bozmaz.
ESP32 ile Çevrimleri Yakalamak
Aşağıdaki sketch, her yükselen kenara millis() ile zaman damgası vurmak için bir donanım kesmesi kullanır, önceki kenardan bu yana geçen süreyi hesaplar ve PubSubClient ile çevrim başına bir JSON mesajı yayınlar. PubSubClient'ı Arduino Library Manager'dan kurun. Karta yeniyseniz ESP32 MQTT eğitimi araç zincirini ele alır.
#include <WiFi.h>
#include <PubSubClient.h>
const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_WIFI_PASSWORD";
const char* BROKER = "broker.connectmq.com";
const char* STATION = "st-10";
const char* TOPIC = "connectmq/demo/ctm-3k8p/line1/st-10/cycle";
const int CYCLE_PIN = 4; // optokuplör çıkışı, aktif LOW
const unsigned long MIN_CYCLE_MS = 2000; // sıçramaları ve çift darbeleri yok say
WiFiClient net;
PubSubClient mqtt(net);
volatile unsigned long lastEdge = 0;
volatile unsigned long pendingCt = 0;
volatile bool havePending = false;
unsigned long seq = 0;
void IRAM_ATTR onCycle() {
unsigned long now = millis();
unsigned long ct = now - lastEdge;
if (ct < MIN_CYCLE_MS) return;
if (lastEdge != 0) {
pendingCt = ct;
havePending = true;
}
lastEdge = now;
}
void connectMqtt() {
while (!mqtt.connected()) {
String id = String("ctm-3k8p-") + STATION;
if (mqtt.connect(id.c_str())) {
Serial.println("MQTT connected");
} else {
Serial.printf("MQTT failed, rc=%d\n", mqtt.state());
delay(2000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(CYCLE_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(CYCLE_PIN), onCycle, FALLING);
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) delay(250);
mqtt.setServer(BROKER, 1883);
}
void loop() {
if (!mqtt.connected()) connectMqtt();
mqtt.loop();
if (havePending) {
noInterrupts();
unsigned long ct = pendingCt;
havePending = false;
interrupts();
char payload[96];
snprintf(payload, sizeof(payload), "{\"seq\":%lu,\"ct_ms\":%lu,\"up_ms\":%lu}",
++seq, ct, millis());
mqtt.publish(TOPIC, payload);
Serial.println(payload);
}
}
MIN_CYCLE_MS koruması kontak sıçramasını ve çift darbeleri filtreler; bunu gerçekçi en hızlı çevrimin yaklaşık yarısına ayarlayın. Açılıştan sonraki ilk kenar yalnızca saati başlatır, böylece sahte uzun bir çevrim raporlanmaz. PubSubClient QoS 0 ile yayın yapar; her çevrim için QoS 1 teslimatına ihtiyacınız varsa AsyncMqttClient bunu destekler veya çevrimleri tamponlayıp toplu olarak yayınlayabilirsiniz. Üretim için WiFiClientSecure, 8883 portu ve broker'ınızın verdiği kimlik bilgilerine geçin.
Çevrim Süresi Takibi Verilerini Analiz Etmek
Analiz servisi tüm istasyonlara abone olur, istasyon başına son 200 çevrimi bellekte tutar ve her 30 saniyede bir retained bir özet yayınlar. Ortalama yerine medyan ve 90. yüzdelik dilimi kullanmak, ara sıra görülen çok uzun çevrimlerin (aslında kısa duruşlar) tabloyu bozmasını engeller.
#!/usr/bin/env python3
"""Rolling cycle time statistics and bottleneck detection."""
import json
import statistics
import threading
import time
from collections import defaultdict, deque
import paho.mqtt.client as mqtt
PREFIX = "connectmq/demo/ctm-3k8p/line1"
TAKT_MS = 45_000
STOP_THRESHOLD_MS = 3 * TAKT_MS # daha uzun boşluklar çevrim değil, kısa duruştur
cycles = defaultdict(lambda: deque(maxlen=200))
lock = threading.Lock()
def on_connect(client, userdata, flags, reason_code, properties):
client.subscribe(f"{PREFIX}/+/cycle", qos=1)
def on_message(client, userdata, msg):
station = msg.topic.split("/")[-2]
ct = json.loads(msg.payload)["ct_ms"]
if ct <= STOP_THRESHOLD_MS:
with lock:
cycles[station].append(ct)
def p90(values):
return statistics.quantiles(values, n=10)[-1] if len(values) >= 10 else max(values)
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="ctm-stats-3k8p")
client.on_connect = on_connect
client.on_message = on_message
client.connect("broker.connectmq.com", 1883, keepalive=60)
client.loop_start()
while True:
time.sleep(30)
with lock:
stats = {
st: {"n": len(v), "median_ms": int(statistics.median(v)), "p90_ms": int(p90(v))}
for st, v in cycles.items() if v
}
if not stats:
continue
bottleneck = max(stats, key=lambda s: stats[s]["median_ms"])
summary = {
"ts": int(time.time()),
"takt_ms": TAKT_MS,
"bottleneck": bottleneck,
"over_takt": [s for s, v in stats.items() if v["median_ms"] > TAKT_MS],
"stations": stats,
}
client.publish(f"{PREFIX}/cycle-stats", json.dumps(summary), qos=1, retain=True)
print(json.dumps(summary, indent=2))
Sentetik çevrimler yayınlayarak donanım olmadan test edebilirsiniz:
for i in $(seq 1 20); do
mosquitto_pub -h broker.connectmq.com -p 1883 -i ctm-sim-$RANDOM \
-t connectmq/demo/ctm-3k8p/line1/st-20/cycle \
-m "{\"seq\":$i,\"ct_ms\":$((44000 + RANDOM % 6000))}"
sleep 1
done
Genel broker'ın client başına saniyede 10 mesaja izin verdiğini unutmayın; bu, herhangi bir gerçek istasyonun ihtiyacından çok fazladır. Orada yayınlanan her şey herkes tarafından okunabilir; bu yüzden onu yalnızca testler ve sentetik veriler için kullanın.
Sonuçları Yorumlamak
| Gözlem | Olası anlamı | Sonraki adım |
|---|---|---|
| Bir istasyonda medyan takt süresinin üzerinde | Gerçek darboğaz | İş içeriğini yeniden dengeleyin, kapasite ekleyin, ayar süresini azaltın |
| Medyan takt süresinin altında ama p90 çok yukarıda | Kapasite değil, istikrarsızlık | Yavaş çevrimlerin malzeme, operatör veya kalite kaynaklı nedenlerini arayın |
| Tüm istasyonlar takt süresine yakın, hat yine de hedefi kaçırıyor | Kısa duruşlar veya bloke olma/aç kalma | Makine durumları ve tampon seviyeleriyle birleştirin |
| Çevrim süresi haftalar içinde yukarı kayıyor | Takım aşınması, bozulan ekipman | Bakım verileriyle ilişkilendirin |
| Vardiyalar arasında büyük fark | Yöntem veya personel farklılıkları | İşi standartlaştırın, eğitim verin |
Darboğaz istasyonu, iyileştirmenin tüm hat için karşılığını verdiği yerdir; başka herhangi bir istasyonu iyileştirmek yalnızca stok biriktirir. Değişikliklerden sonra darboğazın yer değiştirmesine dikkat edin; bu dengeli bir hattın işaretidir.
Çevrim Süresi Takibini Hat Geneline Yaygınlaştırmak
Herkesin darboğaz olduğundan şüphelendiği istasyonla ve iki yanındaki birer istasyonla başlayın. Yavaş çevrimlerin istasyonun kendisinden mi yoksa komşularından kaynaklanan aç kalma ve bloke olmadan mı kaynaklandığını görmek için üç istasyon yeterlidir. Sinyal seçimi ve sıçrama önleme ayarları kanıtlandıktan sonra aynı sketch'i kalan istasyonlara kopyalayın ve yalnızca istasyon adını ve topic'i değiştirin.
Birkaç pratik kural yaygınlaştırmayı kolaylaştırır:
- İstasyonları hat yerleşimindeki adlarıyla birebir adlandırın. Operatörler ve mühendisler panoda
st-20'yi bir eşleme tablosuna bakmadan tanımalıdır. - İstasyon başına çevrim noktası üzerinde anlaşın. Bir istasyon parça girişinde, bir sonraki parça çıkışında sayıyorsa rakamlar karşılaştırılamaz.
- Takt süresini veriyle birlikte kaydedin. Talep değiştiğinde takt süresi de değişir; bunu özette saklamak eski raporların yorumlanabilir kalmasını sağlar.
- Cihaz saatlerini kontrol edin.
ct_mscihazın kendi zamanlayıcısından gelir ve güvenilirdir, ancak ilişkilendirme için eklediğiniz zaman damgaları NTP ile senkronize gateway'ler gerektirir. - Veriyi hatta gösterin. İstasyon başına canlı medyanı takt süresine karşı gösteren bir ekran, haftalık bir rapordan daha fazla iyileştirme sohbeti başlatır.
ConnectMQ portalında canlı topic gezgini, devreye alma sırasında her istasyonun yayın yaptığını doğrulamanın hızlı bir yoludur; bir istasyonun median_ms alanı için tanımlanan eşik tabanlı uyarı kuralı da takt süresinin üzerine her çıkışını kaydeder.
Diğer Metriklerle Bağlantı
Çevrim verisi OEE'nin performans ayağıdır. Makine durum izlemeden gelen çalışma süresi ve IoT ile üretim sayımından gelen sağlam parça sayılarıyla birleştiğinde OEE hesaplamak için gereken her şeye sahip olursunuz. Hepsini tek bir broker'da ve tek bir topic hiyerarşisinde tutun; her yeni KPI yeni bir entegrasyon projesi değil, bir abone haline gelir. Bu tasarımın merkezi olarak bir MQTT broker'ın ne yaptığını anlamak istiyorsanız oradan başlayın; akıllı üretim rehberi bunu daha geniş yol haritasına yerleştirir.
ConnectMQ ile Başlayın
Düzinelerce istasyonun her çevrimi yayınladığı bir hat, her zaman erişilebilir bir broker'a ihtiyaç duyar. ConnectMQ; TLS, MQTT 5, retained message, canlı topic gezgini ve median_ms gibi alanlarda eşik uyarıları sunan bir bulut MQTT broker'dır. Kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun ve ilk istasyonunuzu bağlayın.
Sık Sorulan Sorular
Çevrim süresi ile takt süresi arasındaki fark nedir?
Takt süresi, kullanılabilir süre ve talepten hesaplanan, müşteri talebinin gerektirdiği tempodur. Çevrim süresi ise bir istasyonun birim başına gerçekte ne kadar sürdüğüdür. Çevrim süresi takt süresini aşan bir istasyon hattın çıktısını sınırlar.
Ortalama mı yoksa medyan çevrim süresi mi kullanmalıyım?
Tipik çevrim için medyanı, değişkenlik için p90 gibi yüksek bir yüzdelik dilimi kullanın. Ortalama, aslında kısa duruş olan birkaç uzun çevrimle kolayca bozulur.
PLC'ye erişim olmadan çevrim süresini ölçebilir miyim?
Evet. İstasyon çıkışındaki bir fotoelektrik sensör, bir kapı veya bağlama sinyali ya da ana tahrikin akım imzası her çevrimi işaretleyebilir. Mevcut olduğunda PLC sinyalleri en doğru olanlardır.
Çevrimler arasındaki çok uzun boşlukları nasıl ele almalıyım?
Takt süresinden çok daha uzun boşlukları çevrim değil, duruş olarak değerlendirin. Bunları çevrim istatistiklerinin dışında tutun ve makine durum verileriyle duruş süresi olarak kaydedin.



