Modbus TCP PLC S7-1...
 
Powiadomienia
Wyczyść wszystko

Modbus TCP PLC S7-1200

7 Wpisów
3 Użytkownicy
0 Reactions
2,762 Wyświetleń
kam01
(@kam01)
Wpisów: 13
Praktykant
Autor tematu
 

Witam!

Pytanie dotyczy polaczenia sterownika PLC S7-1200 po modbasie TCP.

Mianowicie polaczylem iobroker z sterownikiem i wszystko dzialalo prawie normalnie, prawie bo nie moglem uzyc input czy coil do sterowania z przycisku z vis jak  i hab panela tylko Holding register dzialal poprawnie.

Wczoraj modbus przestal dzialac brak comunikacji nic nie zmienialem.!

Moze cos zle mam skonfigurowane od strony sterownika plc nie wiem nic nie przychodzi mi do glowy.

Czy jest ktos Kto robil cos na s7-1200 z iobrokerem?

 

 

 
Dodane : 22/08/2019 1:34 pm
mguc
 mguc
(@mguc)
Wpisów: 55
Kontrybutor Donator 2K23
 

Np. ja mam S7-1200.. i działa.

W manualu wyraźnie napisane jest, że systemowe funkcje obsługują tylko odczyt/zapis rejestrów. Bitowych zapytań nie ma :(. Trzeba z tym żyć.

Ja wszystkie bity "pakuję" do bazy z rejestrami i tak są przesyłane/czytane prze iobroker.

W iobrokerze rejestry "rozbijam" na poszczególne bity i przypisuje do poszczególnych zmiennych programu - trzeba napisać skrypt który to robi..

 
Dodane : 25/08/2019 11:05 pm
kam01
(@kam01)
Wpisów: 13
Praktykant
Autor tematu
 

@mguc

Dzieki to duzo wyjania, wspomne ze problem z modbusem roamiazany wina lezala po stronie sterownika i konfiguracji DB.

Teraz wszystko dziala poprawnie.

Co do skryptu i rozbijania zmiennej na bity czy moglby kolega sie podzielic wiedza na ten temat  bo nie bardzo rozumiem gdzie i jaki ten skrypt kolega napisal, dodam ze chodzi glownie o ustawianie poszczegolnych bitow w zmiennej ktore chce wykozystac w habPanel i Vis do wizualizacji i kontrolowania oswietleniem.

 
Dodane : 26/08/2019 8:44 am
mguc
 mguc
(@mguc)
Wpisów: 55
Kontrybutor Donator 2K23
 

Tworzysz obiekty bitowe w drzewie. I ich używasz w aplikacji.

Skrypty dodajesz w zakładce.. skrypty.

Pobranie bitu z odczytanego rejestru:

function odczytajBit(slowo, nr_bitu) { //nr_bitu liczymy od 0
var mask = 1 << nr_bitu;

return ((slowo & mask) !==0) ? true : false;
}

 

Odczytujemy rejestr i przepisujemy bity:

{init('modbus.0.holdingRegisters.10.40010');
function init(id){
read_w(getState(id).val);
on(id, function(obj) {
var slowo = getState(obj.id).val;
read_w(slowo);
}
);
}
function read_w(slowo){
if (!(slowo & 0xC000)) /* dwa najstarsze bity to znacznik cmd_id -> zmiana sterowania */
{
setState("PLC.DOM.LED.L01_1.status"/*status*/, odczytajBit(slowo, 0));
setState("PLC.DOM.LED.L01_2.status"/*status*/, odczytajBit(slowo, 1));
setState("PLC.DOM.LED.L01_3.status"/*status*/, odczytajBit(slowo, 2));
setState("PLC.DOM.LED.L01_4.status"/*status*/, odczytajBit(slowo, 3));
setState("PLC.DOM.LED.L01_5.status"/*status*/, odczytajBit(slowo, 4));
setState("PLC.DOM.LED.L01_6.status"/*status*/, odczytajBit(slowo, 5));
setState("PLC.DOM.LED.L01_7.status"/*status*/, odczytajBit(slowo, 6));
setState("PLC.DOM.LED.L01_8.status"/*status*/, odczytajBit(slowo, 7));
}
}
} /* L01 */

A zapisywanie - tutaj jest więcej pisaniny - trzeba przygotowac odpowiednie zdarzenia (tutaj tylko mały fragment):

//wywołanie obsługi
//1 parametr to nazwa obiektu
//2 parametr to: false - obiekt nie jest załączany impulsem
// true - obiekt jest załączany impulsem
device_led(id, id_enable, false);

//zmiany stanu LED realizowane na poziomie PLC
on({id: status, change: "ne"}, function (obj) {
var value = obj.state.val;
 
setState(out, value, true);
setState(cmd, value, true);
});

 

 
Dodane : 26/08/2019 9:22 pm
mguc
 mguc
(@mguc)
Wpisów: 55
Kontrybutor Donator 2K23
 

Nie wiem, jak u Was, ale  u mnie coś ten Modbus na PLC S7-1200 się wiesza. Po jakimś czasie przestaje odpowiadać. iobroker zgłasza błąd.

Okazuje się, że wystarczy zrestartowac bloczek obsługi MB-Server w PLC i ponownie zaczyna działać.

Zrobiłem sobie "watch-doga" który robi to automatycznie, jeżeli przerwa w komunikacji (czyli brak zapytania/odpowiedzi trwa dłużej niż 20sek.) Po ponad 2 miesiącach pracy bez "wyłączania się" PLC zakładam, że problem mam rozwiązany.

Trochę to dziwne jest...

 
Dodane : 16/05/2020 10:46 pm
(@ldywicki)
Wpisów: 78
Kontrybutor
 

Wiem, że odkopuję stary temat, ale może komuś to pomoże z ioBrokerem i S7.

Pamiętam, że kiedyś przeglądając kod biblioteki do obsługi modbusa w openHAB trafiłem na komentarz który sugerował, że PLC Siemensa nie lubią odpytań bez przerwy. Dlatego też w OH pojawił się parametr który dodaje przerwy między wywołaniami (timeBetweenTransactions dla połączenia).

 
Dodane : 30/06/2023 8:37 am
mguc
 mguc
(@mguc)
Wpisów: 55
Kontrybutor Donator 2K23
 

W iobrokerze też się tak da. Aż z ciekawości sprawdzę, bo na wszelki w programie S7-1200 mam wstawionego watch-doga do resetowania komunikacji (bo faktycznie ona od czasu do czasu się  zawiesza. I to bez znaczenia czy po TCP czy po RS..)

 
Dodane : 30/06/2023 10:33 am
Udostępnij: