Raspberry Pi

Revolution Pi MQTT Gateway'leri: Üretimde Endüstriyel Raspberry Pi (CM4)

Revolution Pi ve diğer CM4 tabanlı cihazlar gibi endüstriyel Raspberry Pi kontrolcülerinin dijital ve analog saha sinyallerini MQTT'ye nasıl köprülediği; mimari, kod ve üretim uygulamalarıyla.

Bir revolution pi mqtt gateway'ini gösteren, kumanda panosunda I/O modülleriyle DIN raya monte Revolution Pi kontrolcüsü
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

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:

  1. 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.
  2. Gateway uygulaması değerleri örnekler, ölçekleme ve ölü bant (deadband) uygular, durum değişikliklerini algılar ve her şeye zaman damgası ekler.
  3. 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.
  4. İ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:

  1. 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.
  2. 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.
  3. 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.
  4. Servis yönetimi. Betiği otomatik yeniden başlatmalı bir systemd birimi olarak çalıştırın ve donanım watchdog'unu kullanın.
  5. 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ı.
  6. 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.

İlgili yazılar

RC522 Okuyucu ile Raspberry Pi RFID MQTT Erişim Kaydı

Bir RC522 RFID okuyucuyu Raspberry Pi'ye bağlayın, etiketleri Python ile okuyun, yerel bir izin listesiyle karşılaştırın ve her erişim denemesini kayıt araçlarının, panellerin ve uyarı araçlarının tüketebileceği bir MQTT olayı olarak yayınlayın.

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.