Połączenie supla z siemens LOGO!

noldziu
Posts: 21
Joined: Sat Jul 29, 2023 7:32 pm

Post

Cześć,

Ostatnio nabyłem sterownik siemens logo z modułem rozszerzen. Zastanawiam się czy jest możliwość sterowania jego wyjściami jak i podglądu stanu jego wejść w aplikacji supla? Jeśli tak to w jako sposób?
User avatar
myxhir
Posts: 664
Joined: Thu Jan 07, 2021 12:16 pm
Location: Skórzewo, Poznań
Has thanked: 6 times
Been thanked: 9 times

Post

noldziu wrote: Sat Jul 29, 2023 7:38 pm Cześć,

Ostatnio nabyłem sterownik siemens logo z modułem rozszerzen. Zastanawiam się czy jest możliwość sterowania jego wyjściami jak i podglądu stanu jego wejść w aplikacji supla? Jeśli tak to w jako sposób?
Koncepcyjnie to chyba musiałbyś napisać część kodu w siemensie która wysyła do pliku wartość 0 i 1 a te pliki umieszczone na np rpi. Następnie w rpi stawiasz supladevice i tam jest virtual relay
Spełniony Automatyk / Mąż / Świeżo Upieczony Ojciec
noldziu
Posts: 21
Joined: Sat Jul 29, 2023 7:32 pm

Post

Jesteś w stanie opisać co i jak powinienem zrobić?
Jak dobrze rozumiem to najpierw własny serwer na raspberry potem komunikacja po modbusie z logo i dopiero potem virtual relay. Tak?
User avatar
myxhir
Posts: 664
Joined: Thu Jan 07, 2021 12:16 pm
Location: Skórzewo, Poznań
Has thanked: 6 times
Been thanked: 9 times

Post

noldziu wrote: Sun Jul 30, 2023 12:34 pm Jesteś w stanie opisać co i jak powinienem zrobić?
Jak dobrze rozumiem to najpierw własny serwer na raspberry potem komunikacja po modbusie z logo i dopiero potem virtual relay. Tak?
Dlatego pisałem że to bardziej koncepcyjnie jak podejść. Ja głównie mam doświadczenie z Allen-Bradley a nie Siemensem. Natomiast jak mówisz albo jakiś modniś TCP/IP ale musiałbyś znaleźć przykład softu jak wysyłać dane i zapisywać je do pliku. Wydaje mi się - takie coś na studiach robiłem że na rpi musiałby być serwer który odbiera dane i je zapisuje a na plc byś miał wysyłanie paczki. Potem stawiasz supla service - na forum jest tutorial jak postawić i w supla service masz rodzaj kanału jako virtual relay który by reprezentował stan. To jest moja propozycja. W szczegółach może lepiej ktoś bardziej zaznajomionynz IT niech się wypowie albo może jakaś prostsza opcja.

W necie natomiast idzie znaleźć przykłady komunikacji z rpi

Wpisz frazę siemens raspberry pi communication i masz np

https://www.google.com/url?sa=t&source= ... CAznJ4E1gg
Spełniony Automatyk / Mąż / Świeżo Upieczony Ojciec
noldziu
Posts: 21
Joined: Sat Jul 29, 2023 7:32 pm

Post

Ogólnie udało się to wykonać. Wykorzystałem Nodemcu (ale to bez znaczenia jakie esp) napisałem kod z użyciem biblioteki supli i modbus tcp. Z siemensa po modbus tcp ip odczytuje stany i potem wyswietlam je w aplikacji na telefonie albo steruje. Ogólnie kod okazał się dość prost, tylko bibliotekę trzeba było przestudiować. :D
djalex
Posts: 1226
Joined: Fri Dec 20, 2019 10:59 pm
Location: Rydułtowy
Has thanked: 2 times
Been thanked: 2 times

Post

Fajnie by było jakbyś napisał tu jakiś tutorial co po kolei i jak.
noldziu
Posts: 21
Joined: Sat Jul 29, 2023 7:32 pm

Post

djalex wrote: Sat Feb 08, 2025 6:18 pm Fajnie by było jakbyś napisał tu jakiś tutorial co po kolei i jak.
Wkleję kod na dniach
noldziu
Posts: 21
Joined: Sat Jul 29, 2023 7:32 pm

Post

Cześć,

wklejam kod na esp8266/esp32 jako bramka supla <-> LOGO8!

#include <ESP8266WiFi.h>
#include <ModbusIP_ESP8266.h>
#include <SuplaDevice.h>
#include <supla/network/esp_wifi.h>
#include <supla/control/relay.h>
#include <supla/sensor/ds18b20.h>
#include <supla/sensor/bme280.h>
#include <supla/control/virtual_relay.h>
#include <supla/sensor/virtual_binary.h>
#include <supla/control/button.h>


// --- KONFIGURACJA SUPLA ---
char GUID[SUPLA_GUID_SIZE] = {TWÓJ GUID};
char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {TWÓJ AUTHKEY};
#define SUPLA_SERVER "svrXX.supla.org"
#define SUPLA_EMAIL "EMAIL KONTA"

// --- KONFIGURACJA LOGO! ---
IPAddress logoIp(192, 168, XXX, XXX);

ModbusIP mb;
Supla::ESPWifi wifi("SSID", "HASŁO");

// --- KONFIGURACJA SUPLA ---
const int RELAY_COUNT = 8;
Supla::Control::VirtualRelay *vrelays[RELAY_COUNT];
bool lastStates[RELAY_COUNT] = {false, false, false, false, false, false,false, false};

const int MARKER_COUNT = 3; // Ile markerów chcesz czytać
Supla::Sensor::VirtualBinary *vmarkers[MARKER_COUNT];
bool markerResults[3]; // Tablica, w której biblioteka zapisze stany z LOGO

const int relayPins[] = {12, 13, 14, 15};

void setup() {
Serial.begin(115200);
mb.client();

for (int i = 0; i < RELAY_COUNT; i++) {
vrelays = new Supla::Control::VirtualRelay();
}
for (int i = 0; i < 4; i++) {
new Supla::Control::Relay(relayPins, true);
}
for (int i = 0; i < MARKER_COUNT; i++) {
vmarkers = new Supla::Sensor::VirtualBinary();
}

SuplaDevice.begin(GUID, SUPLA_SERVER, SUPLA_EMAIL, AUTHKEY);
new Supla::Sensor::BME280(0x76);
new Supla::Sensor::DS18B20(2);

}

void loop() {
SuplaDevice.iterate();
mb.task(); // Niezbędne do obsługi protokołu Modbus

// 1. ZARZĄDZANIE POŁĄCZENIEM MODBUS
if (!mb.isConnected(logoIp)) {
static uint32_t lastConnTry = 0;
if (millis() - lastConnTry > 5000) { // Próbuj połączyć co 5 sekund
lastConnTry = millis();
Serial.println("Modbus: Łączenie z serwerem...");
mb.connect(logoIp);
}
}

// 2. SPRAWDZANIE STANÓW SUPLA I SYNCHRONIZACJA
for (int i = 0; i < RELAY_COUNT; i++) {
if (vrelays) {
bool currentState = vrelays->isOn();

if (currentState != lastStates) {
// Próba wysłania tylko jeśli połączenie Modbus żyje
if (mb.isConnected(logoIp)) {
syncWithModbus(i, currentState);
lastStates = currentState; // Zapamiętaj stan tylko po udanej wysyłce
}
}
}
}

// 3. CYKLICZNY ODCZYT MARKERÓW (LOGO -> SUPLA)
unsigned long lastMarkerRead = 0;
if (mb.isConnected(logoIp) && (millis() - lastMarkerRead > 1000)) {
lastMarkerRead = millis();

for (int i = 0; i < 3; i++) {
// Proste wywołanie: adres IP, adres w LOGO, gdzie zapisać wynik, ile cewek
mb.readCoil(logoIp, 8 + i, &markerResults);

// Przepisanie wyniku z tablicy do Supli
if (markerResults) {
vmarkers->set();
} else {
vmarkers[i]->clear();
}
}
}

}


void syncWithModbus(int coilAddress, bool value) {
// Funkcja writeCoil w tej bibliotece jest nieblokująca
// Parametry: IP, Adres_Cewki, Wartość, Callback, Unit_ID
mb.writeCoil(logoIp, coilAddress, value);

Serial.print("Wysłano Modbus TCP -> Adres: ");
Serial.print(coilAddress);
Serial.print(" Stan: ");
Serial.println(value ? "ON" : "OFF");
}
User avatar
Zibi_007
Posts: 3985
Joined: Tue Oct 31, 2023 10:06 pm
Has thanked: 10 times
Been thanked: 31 times

Post

noldziu wrote: Mon Dec 22, 2025 5:13 pm Cześć,

wklejam kod na esp8266/esp32 jako bramka supla <-> LOGO8!

Code: Select all

#include <ESP8266WiFi.h>
#include <ModbusIP_ESP8266.h>
#include <SuplaDevice.h>
#include <supla/network/esp_wifi.h>
#include <supla/control/relay.h>
#include <supla/sensor/ds18b20.h>
#include <supla/sensor/bme280.h>
#include <supla/control/virtual_relay.h>
#include <supla/sensor/virtual_binary.h>
#include <supla/control/button.h>


// --- KONFIGURACJA SUPLA ---
char GUID[SUPLA_GUID_SIZE] = {TWÓJ GUID};
char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {TWÓJ AUTHKEY};
#define SUPLA_SERVER "svrXX.supla.org"
#define SUPLA_EMAIL  "EMAIL KONTA"

// --- KONFIGURACJA LOGO! ---
IPAddress logoIp(192, 168, XXX, XXX);

ModbusIP mb;
Supla::ESPWifi wifi("SSID", "HASŁO");

// --- KONFIGURACJA SUPLA ---
const int RELAY_COUNT = 8;
Supla::Control::VirtualRelay *vrelays[RELAY_COUNT];
bool lastStates[RELAY_COUNT] = {false, false, false, false, false, false,false, false};

const int MARKER_COUNT = 3;               // Ile markerów chcesz czytać
Supla::Sensor::VirtualBinary *vmarkers[MARKER_COUNT];
bool markerResults[3]; // Tablica, w której biblioteka zapisze stany z LOGO

const int relayPins[] = {12, 13, 14, 15};

void setup() {
  Serial.begin(115200);
  mb.client(); 

  for (int i = 0; i < RELAY_COUNT; i++) {
    vrelays[i] = new Supla::Control::VirtualRelay();
  }
  for (int i = 0; i < 4; i++) {
    new Supla::Control::Relay(relayPins[i], true); 
  }
  for (int i = 0; i < MARKER_COUNT; i++) {
  vmarkers[i] = new Supla::Sensor::VirtualBinary();
  }

  SuplaDevice.begin(GUID, SUPLA_SERVER, SUPLA_EMAIL, AUTHKEY);
  new Supla::Sensor::BME280(0x76); 
  new Supla::Sensor::DS18B20(2);

}

void loop() {
  SuplaDevice.iterate();
  mb.task(); // Niezbędne do obsługi protokołu Modbus

  // 1. ZARZĄDZANIE POŁĄCZENIEM MODBUS
  if (!mb.isConnected(logoIp)) {
    static uint32_t lastConnTry = 0;
    if (millis() - lastConnTry > 5000) { // Próbuj połączyć co 5 sekund
      lastConnTry = millis();
      Serial.println("Modbus: Łączenie z serwerem...");
      mb.connect(logoIp); 
    }
  }

  // 2. SPRAWDZANIE STANÓW SUPLA I SYNCHRONIZACJA
  for (int i = 0; i < RELAY_COUNT; i++) {
    if (vrelays[i]) {
      bool currentState = vrelays[i]->isOn();

      if (currentState != lastStates[i]) {
        // Próba wysłania tylko jeśli połączenie Modbus żyje
        if (mb.isConnected(logoIp)) {
          syncWithModbus(i, currentState);
          lastStates[i] = currentState; // Zapamiętaj stan tylko po udanej wysyłce
        }
      }
    }
  }

  // 3. CYKLICZNY ODCZYT MARKERÓW (LOGO -> SUPLA)
  unsigned long lastMarkerRead = 0;
  if (mb.isConnected(logoIp) && (millis() - lastMarkerRead > 1000)) { 
    lastMarkerRead = millis();

    for (int i = 0; i < 3; i++) {
      // Proste wywołanie: adres IP, adres w LOGO, gdzie zapisać wynik, ile cewek
      mb.readCoil(logoIp, 8 + i, &markerResults[i]);
      
      // Przepisanie wyniku z tablicy do Supli
      if (markerResults[i]) {
        vmarkers[i]->set();
      } else {
        vmarkers[i]->clear();
      }
    }
  }

}


void syncWithModbus(int coilAddress, bool value) {
  // Funkcja writeCoil w tej bibliotece jest nieblokująca
  // Parametry: IP, Adres_Cewki, Wartość, Callback, Unit_ID
  mb.writeCoil(logoIp, coilAddress, value);
  
  Serial.print("Wysłano Modbus TCP -> Adres: ");
  Serial.print(coilAddress);
  Serial.print(" Stan: ");
  Serial.println(value ? "ON" : "OFF");
}
Fajnie, pewnie się przyda :)
Na następny raz wklejając kod użyj znaczników </> jak zrobiłem to, cytując Ciebie.
Będzie bardziej czytelnie.
Image Wiesz, że Supla obsługuje Zigbee? Wstąp do Klubu Promila: https://forum.supla.org/viewtopic.php?t=18018
Image Szukasz nowego GG? Jest tutaj: https://forum.supla.org/viewtopic.php?t=18036

Return to “Pomoc”