Cześć,
wszędzie używam ST i nigdy nie próbowałem inaczej. Nie wiem nawet, czy bym potrafił.
Mój program PLC_PRG jest całkiem uporządkowany.
Na początku zmienne grupowe (do zbierania kilka wydarzeń z OR), potem obsługa świateł, przy czym każde 'światło' zaczyna się od obsługi przycisków krótki/długi i od definicji timerów pilnujących bezruchu. Następnie obsługa gniazdek i wentylatorów. Potem obsługa rolet, które zaczynam od definicji timerów/schedulerów, a każdą z rolet mam w podobnym układzie, co światła - przy każdej bloki do obsługi długi/krótki przycisk. Dalej jest obsługa zaworów grzejników, liczników prądu, podlewania.
Staram się umieszczać możliwie dużo komentarzy i grupować podobne do podobnego. Nigdy jakoś specjalnie niczego nie szukam, program jest na poje potrzeby przejrzysty. Kilka przykładów:
(*--------------------------------SWIATLA-------------------------------*)
(*Swiatla w kuchni czujki i ogólne zmienne*)
LIGHT_1K_ALLOFFSIGN(CLK:= OUT1 OR OUT2 OR OUT3 OR OUT4);
LIGHT_1K_ANYONSIGN(CLK:= OUT1 OR OUT2 OR OUT3 OR OUT4);
LIGHT_1K_MovementInDarkness(CLK:=Move_Kuchnia.Q AND HomeSleeps.BUSY AND NOT LIGHT_1K_GUARD2.Q);
(...)
(*Swiatlo w kuchni 1*)
LIGHT_1K1(xSwitch:=SWITCH_IN3.xShort OR VIS_L_1K1, xCentOFF:=LIGHT_K_OFF OR HomeSleep OR LIGHT_1K_GUARDSIGN.Q,
xCentON:=LIGHT_1K_MovementInDarkness.Q AND LIGHT_1K_AutoON[0]);
OUT1:=LIGHT_1K1.xActuator;
albo:
(*-----------------------G N I A Z D K A--------!!! ON oznacza WYlaczone gniazdko !!!!------------*)
(*Gniazdko Wewnatrz szafy ze switchem i baza dla telefonu*)
SOCKET_0K1( xCentON:=SWITCH_IN3.xLong OR HomeSleep, xCentOFF:=(Timers.Network_ONsignal AND NOT ON_HOLIDAY) OR SWITCH_IN4.xLong);
OUT82:=SOCKET_0K1.xActuator;
Nie chciałbym nikogo namawiać, ani narażać się zawodowcom, którzy potrafią wszystko wyklikać w drabinkach... dla mnie - amatora - drabinki wydają się być anachronizmem.
Pozdrawiam!