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?
Połączenie supla z siemens LOGO!
-
myxhir
- Posts: 664
- Joined: Thu Jan 07, 2021 12:16 pm
- Location: Skórzewo, Poznań
- Has thanked: 6 times
- Been thanked: 9 times
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 relaynoldziu 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?
Spełniony Automatyk / Mąż / Świeżo Upieczony Ojciec
-
noldziu
- Posts: 21
- Joined: Sat Jul 29, 2023 7:32 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?
Jak dobrze rozumiem to najpierw własny serwer na raspberry potem komunikacja po modbusie z logo i dopiero potem virtual relay. Tak?
-
myxhir
- Posts: 664
- Joined: Thu Jan 07, 2021 12:16 pm
- Location: Skórzewo, Poznań
- Has thanked: 6 times
- Been thanked: 9 times
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.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?
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
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ć. 
-
noldziu
- Posts: 21
- Joined: Sat Jul 29, 2023 7:32 pm
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");
}
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");
}
Fajnie, pewnie się przydanoldziu 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"); }
Na następny raz wklejając kod użyj znaczników </> jak zrobiłem to, cytując Ciebie.
Będzie bardziej czytelnie.
Wiesz, że Supla obsługuje Zigbee? Wstąp do Klubu Promila: https://forum.supla.org/viewtopic.php?t=18018
Szukasz nowego GG? Jest tutaj: https://forum.supla.org/viewtopic.php?t=18036