'Inteligenty' dom ze sterownikiem PLC

 Language:
Szukanie zaawansowane  

Aktualności:

Powrót do strony głównej: www.edom-plc.pl

Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.

Wiadomości - shockmp

Strony: [1]
1
(Pod)Systemy i Funkcje / Okna VELUX i sterownik WAGO za pomocą KLF 200 API
« dnia: Grudnia 28, 2019, 06:09:47 pm »
Witam,

Mam w domu sterownik WAGO PFC200, oraz okna dachowe z roletami VELUX Integra. Chciałbym do sterowania roletami wykorzystać moduł KLF 200 i udostępnione przez producenta API.
Na stronie https://www.velux.com/api/klf200 dostępne jest demo napisane w Python'ie które nawet działa.
Niestety ten język to dla mnie magia - może ma ktoś pomysł jak wykorzystać gotowe skrypty, albo przepisać je na język ST?

Będę wdzięczny za każdą pomoc ;)

2
(Pod)Systemy i Funkcje / Odp: Integracja PLC z systemem alarmowym SATEL INTEGRA
« dnia: Listopada 20, 2019, 08:41:18 pm »
Wkleiłem, skompilowałem, uruchomiłem i nie chciało czytać.
Znalazłem drobny błąd, wniosłem małe poprawki i działa aż miło.
Jakoś specjalnie nie wdawałem się w analizę i chyba nie będę - dopóki działa.
Dzięki @kur4kwdz

Sprawdzone na PFC200 e!COCKPIT
socketSatel(oStatus => socketState);
pingSatel(xAbort:=FALSE);

IF xOpen_Client THEN
CASE Status OF
0:(*Initialize functionblocks*)
Read00 := TRUE;
Read0A := TRUE;
buf_len := 0;
socketSatel.Initialize();
xCLIENT_OPEN:=FALSE;
status:=1;

1:
pingSatel.Start(
sAddress := IP,
tPingTimeout := T#20MS,
udiNumber := 5);

IF (pingState=0) AND (NOT socketSatel.xBusy) THEN
status := 5;
ELSE
Status := 0;
END_IF

5:(*open connection*)
socketSatel.OpenAndConnect(
sAddress := IP,
uiPort := Port,
eType := TCP,
xAllowBroadcast := FALSE,
sOwnInterface := '',
tTimeout := T#5S,
pWriteBuffer := 0,
udiWriteBufferSize := 0,
pReadBuffer := 0,
udiReadBufferSize := 0,
OpenAndConnect => socketOpenState);

IF  socketSatel.State = eSocketOpState.connected THEN
Status  := 10;
xCLIENT_OPEN:=TRUE;
ELSIF socketSatel.State = eSocketOpState.connecting THEN
Status := 5;
ELSE
Status := 0;
END_IF


10:(* Write data to server*)

frame_snd[1]:=16#FE;
frame_snd[2]:=16#FE;
IF Read00 THEN
frame_snd[3]:=16#00; (* zapytanie o stan czujek *)
ELSIF Read0A THEN
frame_snd[3]:=16#0A; (* zapytanie o stan uzbrojenia alarmu *)
ELSE
frame_snd[3]:=16#7F; (* zapytanie o zmiane stanu *)
END_IF
pt:=ADR(frame_snd);
frame_snd[4]:=WORD_TO_BYTE(SHR(SatelCRC(pt,3,3),8)); (* obliczenie CRC.H *)
frame_snd[5]:=WORD_TO_BYTE(SatelCRC(pt,3,3)); (* obliczenie CRC.L *)
frame_snd[6]:=16#FE;
frame_snd[7]:=16#0D;

IF socketSatel.IsReadyForWrite THEN
socketSatel.Write(
pTxBuffer:=ADR(frame_snd),
udiTxNBytes:=7,
write => socketWriteState);
END_IF

  IF  (socketWriteState <> 0) THEN
  Status:=0;
ELSE
Status := 20; //było 40
  END_IF

// socketSatel.CancelWrite();

20:
socketSatel.Read(
pRxBuffer:=ADR(frame_rcv),
udiRxBufferSize:= SIZEOF(frame_rcv),
udiRxNBytes => rcv_len,
Read => socketReadState);
tonTimeOut(IN := TRUE);
IF rcv_len <> 0 THEN   //było buf_len <> 0
tonTimeOut(IN := FALSE);
Status:=30;
ELSIF tonTimeOut.Q THEN
tonTimeOut(IN := FALSE);
Status:=10;
END_IF

30:
buf_len := UDINT_TO_INT(rcv_len);
FOR fi:=3 TO buf_len-4 DO (* sprawdzenie, czy bajt odebranej ramki nie zawiera kombinacji FE F0; w takim przypadku wyrzuc F0 i skroc odebrane dane *)
IF frame_rcv[fi]=16#FE THEN
IF frame_rcv [fi+1]=16#F0 THEN
FOR fin:=fi+1 TO buf_len-2 DO
frame_rcv[fin]:= frame_rcv[fin+1];
END_FOR
buf_len:=buf_len-1;
END_IF;
END_IF;
END_FOR;
pt:=ADR(frame_rcv); (* przekazanie adresu znacznika danych odebranych - potrzebne do przekazania danych do obliczenia CRC *)
IF frame_rcv[buf_len-3]=WORD_TO_BYTE(SHR(SatelCRC(pt,3,buf_len-4),8)) AND frame_rcv[buf_len-2]=WORD_TO_BYTE(SatelCRC(pt,3,buf_len-4)) THEN (* sprawdzenie poprawnosci CRC otrzymanych danych *)
IF frame_rcv[3]=16#7F THEN (* jesli otrzymano ramke zapytania o zmiane stanu *)
(*Com7FReceived:=Com7FReceived+1;*)
IF (frame_rcv[4] AND znacznik) >0 THEN (* sprawdzenie czy bit 0 pierwszego bajtu danych jest 1, czyli stan czujek ulegl zmianie *)
Read00:=TRUE; (* jesli tak, nastepnym razem zapytaj o stan czujek *)
END_IF;
IF (frame_rcv[5] AND ROL(znacznik,2)) >0 THEN (* sprawdzenie czy bit 2 drugiego bajtu danych jest 1, czyli stan stref ulegl zmianie *)
Read0A:=TRUE; (* jesli tak, nastepnym razem zapytaj o stan stref*)
END_IF;
ELSIF frame_rcv[3] = 16#00 THEN (* jesli otrzymano ramke stanu czujek *)
(*Com00Received:=Com00Received+1;*)
znacznik:=1;
FOR fi:=4 TO buf_len-5 DO (* dla kazdego bajtu danych *)
FOR fin:=0 TO 7 DO (* dla kazdego bitu *)
IF (SHL(znacznik,fin) AND frame_rcv[fi]) >0 THEN (* sprawdz czy bit jest 1 *)
czujki[(fi-4)*8+fin+1]:=TRUE; (* jesli tak stan czujki = TRUE - aktywna *)
ELSE
czujki[(fi-4)*8+fin+1]:=FALSE; (* jesli nie = FALSE - nieaktywna *)
END_IF;
END_FOR;
END_FOR;
(*AktCzujek := TRUE;*)
Read00 := FALSE;; (* nastepnym razem nie pytaj o czujki *)
ELSIF frame_rcv[3] = 16#0A THEN
FOR fi:=4 TO buf_len-5 DO (* dla kazdego bajtu danych *)
FOR fin:=0 TO 7 DO (* dla kazdego bitu *)
IF (SHL(znacznik,fin) AND frame_rcv[fi]) >0 THEN (* sprawdz czy bit jest 1 *)
strefy[(fi-4)*8+fin+1]:=TRUE; (* jesli tak stan strefy = TRUE - uzbrojona *)
ELSE
strefy[(fi-4)*8+fin+1]:=FALSE; (* jesli nie = FALSE - rozbrojona *)
END_IF;
END_FOR;
END_FOR;
Read0A := FALSE; (* nastepnym razem nie pyatj o strefy *)
END_IF;
END_IF;
Status:=10; (* przejdz do wysylania danych *)
40:
socketSatel.Finish();
socketSatel.Close();
status := 0;
END_CASE
ELSE
socketSatel.Finish();
socketSatel.Close();
END_IF

3
(Pod)Systemy i Funkcje / Odp: Integracja PLC z systemem alarmowym SATEL INTEGRA
« dnia: Listopada 07, 2019, 07:04:40 pm »
Podłączam się do prośby. Na 750-880 działało, teraz mam PFC200 i chciałbym uruchomić komunikację z Satelem ale chyba jestem za cienki :'(

Strony: [1]