Bir Revolution Pi MQTT gateway'i, alışık olduğunuz Raspberry Pi yazılım yığınını kumanda panoları için üretilmiş DIN ray muhafazasında; 24 V besleme, endüstriyel I/O modülleri ve daha uzun bir ürün ömrüyle sunar. Bu yazı, endüstriyel Pi tabanlı kontrolcülerin nereye oturduğunu, bir Revolution Pi'den saha sinyallerini Python ile nasıl okuyup MQTT'ye yayınlayacağınızı ve bir prototip üretim gateway'ine dönüştüğünde nelerin değiştiğini açıklar. Aynı kalıplar diğer Compute Module 4 ve Compute Module 5 tabanlı endüstriyel cihazlar için de geçerlidir.
Neden Endüstriyel Bir Raspberry Pi
Standart bir Raspberry Pi prototipler için mükemmeldir, ancak kumanda panosu farklı bir ortamdır: 24 V DC besleme, elektriksel gürültü, geniş sıcaklık aralıkları, titreşim ve DIN ray montajı ile vidalı klemens bekleyen bakım personeli. Raspberry Pi Compute Module tabanlı endüstriyel kontrolcüler bu sorunları çözerken Raspberry Pi OS'u (veya ona çok yakın bir türevini), Python'u, Node-RED'i ve zaten bildiğiniz ekosistemin geri kalanını korur.
KUNBUS'un Revolution Pi ailesi en bilinen örnektir. RevPi Connect gibi bir temel modül; Compute Module'ü, Ethernet portlarını ve güç düzenlemesini içerir. Dijital I/O, analog I/O ve fieldbus gateway'leri için genişleme modülleri yan tarafa takılır ve temel modülle bir backplane konnektörü üzerinden haberleşir. Diğer üreticiler de kendi I/O'larıyla CM4 ve CM5 tabanlı kontrolcüler üretir; bu yazıdaki entegrasyon yaklaşımı farklı bir I/O kütüphanesiyle onlara da taşınabilir.
| İhtiyaç | Standart Pi | Endüstriyel Pi tabanlı kontrolcü |
|---|---|---|
| Güç | 5 V USB-C | 24 V DC, çoğu zaman geniş giriş aralığıyla |
| Montaj | Kasa veya DIN adaptörü | Doğrudan DIN ray |
| I/O | 3.3 V GPIO | 24 V dijital giriş/çıkışlar, 0-10 V ve 4-20 mA analog |
| Depolama | SD kart | Compute Module üzerinde eMMC |
| Ortam | Ofis | Kumanda panosu sıcaklık ve EMC değerleri |
| Ürün ömrü | Tüketici döngüsü | Uzun süreli bulunabilirlik bir tasarım hedefi |
Tipik Mimari
Çoğu kurulumda endüstriyel Pi, makineyi çalıştıran PLC'nin yerini almaz. Onun yanında bir edge gateway olarak durur:
- Saha sinyalleri kontrolcüye doğrudan I/O modülleri üzerinden (bir kapı kontağı, bir debimetre darbesi, bir 4-20 mA basınç transmitteri) veya dolaylı olarak mevcut PLC'den Modbus TCP, Modbus RTU ya da başka bir protokolle ulaşır.
- Gateway uygulaması değerleri örnekler, ölçekleme ve ölü bant (deadband) uygular, durum değişikliklerini algılar ve her şeye zaman damgası ekler.
- MQTT verileri dışarıya, bulutta veya tesis ağındaki bir broker'a taşır; dashboard'lar, historian'lar ve alarm araçları oraya abone olur.
- İsteğe bağlı komutlar MQTT üzerinden çıkışlara geri gider; ancak yalnızca güvenlikle ilgili olmayan işlevler için ve açık doğrulamayla.
Bu iş bölümü önemlidir. PLC kontrolü deterministik ve güvenlik sertifikalı tutarken gateway bağlantıyı ve veri modellemeyi üstlenir; bunlar PLC'lerin çoğu zaman pek iyi olmadığı işlerdir. Sinyalleriniz doğrudan I/O yerine bir PLC'den geliyorsa Raspberry Pi Modbus MQTT rehberi sorgulama tarafını ayrıntılı olarak gösterir.
RevPi I/O'sunu Python ile Okumak
Revolution Pi tüm modül değerlerini piControl sürücüsünün yönettiği bir proses imajı üzerinden sunar. Modülleri PiCtory web aracında yapılandırır ve her I/O'ya bir ad verirsiniz; ardından bu adları herhangi bir dilden okuyup yazarsınız. piTest komutu en hızlı doğrulama yoludur:
piTest -d # algılanan modülleri listele
piTest -r I_1 # I_1 girişini oku
piTest -w O_1,1 # O_1 çıkışını ayarla
Python'da revpimodio2 kütüphanesi proses imajını PiCtory yapılandırmanıza göre adlandırılmış nesnelere eşler. Hem döngüsel sorgulamayı hem de olay callback'lerini destekler; bu MQTT'ye çok uygundur: girişler nadiren değişir, bu yüzden değişiklikte yayınlamak trafiği düşük tutar.
import json
import os
import time
import paho.mqtt.client as mqtt
import revpimodio2
BROKER = os.getenv("MQTT_HOST", "broker.connectmq.com")
PORT = int(os.getenv("MQTT_PORT", "1883"))
USERNAME = os.getenv("MQTT_USERNAME")
PASSWORD = os.getenv("MQTT_PASSWORD")
CLIENT_ID = os.getenv("MQTT_CLIENT_ID", "revpi-gw-r2d7k1")
PREFIX = os.getenv("TOPIC_PREFIX", "connectmq/demo/r2d7k1/plant1/packaging/line2/revpi1")
DIGITAL_INPUTS = ["I_1", "I_2", "I_3"] # PiCtory'deki adlar
ANALOG_INPUTS = {"InputValue_1": 0.001} # ad -> ölçek katsayısı (ör. mV'den V'ye)
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=CLIENT_ID)
if USERNAME:
client.username_pw_set(USERNAME, PASSWORD)
if PORT == 8883:
client.tls_set()
client.will_set(f"{PREFIX}/status", "offline", qos=1, retain=True)
client.reconnect_delay_set(1, 60)
def on_connect(client, userdata, flags, reason_code, properties):
client.publish(f"{PREFIX}/status", "online", qos=1, retain=True)
client.subscribe(f"{PREFIX}/cmd/O_1", qos=1)
def on_message(client, userdata, msg):
value = msg.payload.decode().strip().lower()
if value in ("1", "true", "on"):
rpi.io.O_1.value = True
elif value in ("0", "false", "off"):
rpi.io.O_1.value = False
client.on_connect = on_connect
client.on_message = on_message
client.connect_async(BROKER, PORT, keepalive=30)
client.loop_start()
rpi = revpimodio2.RevPiModIO(autorefresh=True)
rpi.handlesignalend(rpi.cleanup)
def publish_digital(ioname, iovalue):
payload = {"value": bool(iovalue), "ts": round(time.time(), 3)}
client.publish(f"{PREFIX}/di/{ioname}", json.dumps(payload), qos=1, retain=True)
for name in DIGITAL_INPUTS:
rpi.io[name].reg_event(publish_digital)
publish_digital(name, rpi.io[name].value) # başlangıç durumu
rpi.mainloop(blocking=False)
while not rpi.exitsignal.wait(5):
analog = {n: round(rpi.io[n].value * f, 3) for n, f in ANALOG_INPUTS.items()}
client.publish(f"{PREFIX}/ai", json.dumps({**analog, "ts": int(time.time())}), qos=1)
client.publish(f"{PREFIX}/status", "offline", qos=1, retain=True)
client.loop_stop()
client.disconnect()
Dijital girişler değiştikleri anda yayınlanır ve retained olarak tutulur; böylece bir abone her zaman güncel durumu bilir. Analog değerler beş saniyede bir örneklenir. Komut işleyicisi yalnızca adı belirtilmiş tek bir çıkış için açık değerleri kabul eder ve diğer her şeyi yok sayar. Komut aboneliğinin teamül gereği retained olmayan bir topic kullandığına dikkat edin: broker'da retained bir "on" komutu bekliyor olsaydı, gateway her yeniden başladığında çıkış anahtarlanırdı.
Tesis Verileri için Topic Tasarımı
Endüstriyel gateway'ler, tesisi yansıtan bir topic hiyerarşisinden fayda sağlar: kuruluş, saha, alan, hat, hücre veya makine. Bu ISA-95 tarzı yapı bir Unified Namespace'in omurgasıdır ve abonelikleri doğal hale getirir (bir alandaki her şey için plant1/packaging/#). ConnectMQ, ISA-95 tarzı topic'leri tanır ve bağlı cihazları portalında bu seviyelere göre gösterir; bu da büyük bir gateway filosunda gezinmeyi kolaylaştırır. MQTT Sparkplug B ve Unified Namespace rehberi, düz JSON'un üzerine Sparkplug B'nin ne zaman ekleneceğini açıklar.
Birkaç kural, namespace'in yıllar boyunca faydalı kalmasını sağlar:
- Varlık yolunu topic'e, ölçümleri payload'a koyun; tersini değil.
- Ham register adresleri yerine PiCtory'den veya bir eşleme tablosundan gelen kararlı sinyal adları kullanın.
- Durum ve meta verileri (firmware sürümü, I/O yapılandırma hash'i) retained topic'lere yayınlayın.
- Komut topic'lerini ayrı tutun (
.../cmd/...) ve bunlara tam olarak kimin yayın yapabileceğini belgeleyin.
Pilottan Üretime
Yukarıdaki kod genel MQTT test broker'ında bir pilot için yeterlidir, ancak tesis verilerinin genel bir broker'da yeri yoktur. Üretim gateway'leri özel bir broker'a, TLS'e ve birkaç operasyonel alışkanlığa ihtiyaç duyar:
- TLS üzerinden özel kimlik bilgileri. ConnectMQ üzerinde bir broker oluşturun, portaldan oluşturulan kullanıcı adı, parola ve client ID'yi kullanın ve 8883 portuna bağlanın. Client ID'ler verilen kimlik bilgilerine bağlıdır; böylece bir gateway diğerinin kimliğine bürünemez.
- Yalnızca giden bağlantı. Gateway broker'a bir bağlantı açar; OT ağında gelen trafik için güvenlik duvarı kuralı gerekmez.
- Depola ve ilet (store and forward). Ağ kesintilerinin veri boşluklarına yol açmaması için yerel bir kuyruk tutun. Python'da çevrim dışı MQTT tamponlama kalıbı bir RevPi üzerinde değişmeden çalışır.
- Servis yönetimi. Betiği otomatik yeniden başlatmalı bir systemd birimi olarak çalıştırın ve donanım watchdog'unu kullanın.
- Sağlamlaştırma. Güvenli Raspberry Pi IoT kontrol listesinde anlatıldığı gibi SSH anahtarları, bir güvenlik duvarı, düzenli güncellemeler ve özel bir servis kullanıcısı.
- Değişiklik kontrolü. PiCtory yapılandırmanızı ve gateway kodunuzu birlikte sürümleyin; böylece koddaki I/O adları her zaman donanımla eşleşir.
Bir yönetilen MQTT broker sunucu tarafını üstlenir: sertifikalar, erişilebilirlik ve kotalar. Daha büyük tesisler için Dedicated ve BYOC planları trafiği izole bir kümede veya kendi bulut hesabınızda tutar.
Endüstriyel Pi Gateway'leri Nerede İyi Uyar
Endüstriyel Pi tabanlı kontrolcüler; eski makinelere PLC'nin hiç sahip olmadığı sensörlerle retrofit yapmak, basınçlı hava, su ve enerji sayaçları gibi yardımcı tesisleri izlemek, OEE hesaplamaları için makine durumlarını toplamak ve bir üretici gateway'inin pahalı veya kapalı olacağı protokol dönüşümleri için güçlü bir seçimdir. Güvenlik PLC'lerinin yerini tutmazlar ve deterministik zamanlamaya bağlı hızlı kontrol döngülerini kapatmamalıdırlar. Bunları onlar için tasarlanmış kontrolcüde tutun ve gateway'in olup biteni raporlamasına izin verin.
Pi platformundaki edge gateway'lere daha geniş bir bakış için Raspberry Pi MQTT rehberine ve resmi Compute Module dokümantasyonuna göz atın.
Endüstriyel Gateway'lerinizi ConnectMQ'ya Bağlayın
Kredi kartı gerekmeden app.connectmq.com adresinde ücretsiz Serverless planıyla bir pilot başlatın ve RevPi sinyallerinizin dakikalar içinde canlı topic gezgininde belirmesini izleyin. Pilot değerini kanıtladığında aynı gateway'leri kodu değiştirmeden bir Dedicated veya BYOC broker'a taşıyın.
Sık Sorulan Sorular
Revolution Pi'de Python yerine Node-RED kullanabilir miyim?
Evet. Node-RED RevPi üzerinde çalışır ve proses imajı için node'lara sahiptir; yerleşik MQTT node'ları da herhangi bir broker'a yayın yapar. Python ise tamponlama ve test üzerinde size daha fazla kontrol verir.
Revolution Pi bir PLC'nin yerini alır mı?
Basit kontrol mantığını çalıştırabilir, ancak çoğu tesis kontrol ve güvenlik için mevcut PLC'lerini korur ve RevPi'yi onların yanında bir veri gateway'i olarak kullanır.
Bir RevPi gateway'i verileri ne kadar hızlı yayınlayabilir?
I/O döngüsü izleme için yeterince hızlıdır, ancak asıl soru tüketicilerin veriye ne sıklıkla ihtiyaç duyduğudur. Dijital sinyalleri değişiklikte, analog değerleri sabit aralıklarla yayınlayın.
MQTT tesis verileri için yeterince güvenli mi?
Gateway başına benzersiz kimlik bilgileri, yalnızca giden bağlantılar ve özel bir broker ile TLS üzerinden MQTT sağlam bir tasarımdır. Tesis verilerini asla genel bir broker'a yayınlamayın.



