'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 - kur4kwdz

Strony: [1]
1
(Pod)Systemy i Funkcje / Odp: Integracja PLC z systemem alarmowym SATEL INTEGRA
« dnia: Listopada 19, 2019, 03:09:39 pm »
Witam w złączeniu moja próba integracji sterownika PFC200 z centralką Satel INTEGRA128 stworzona na podstawie kodu @KamilKAC. Niestety ze względu na awarię płyty centrali nie jestem w stanie sprawdzićdziałania, chociaż symulowanie transmisji przy pomocy programu Hercules wygląda obiecująco.

Kolego @Schockimp sprawdzisz czy lata u Ciebie?

FUNCTION_BLOCK SatelEthernet
VAR_INPUT
xOpen_Client: BOOL; (* uaktywnij polaczenie do modulu ETHM-1 *)
IP: STRING; (* adres IP  modulu ETHM-1 *)
Port: WORD; (* port integracji modulu ETHM-1 *)
END_VAR
VAR_OUTPUT
czujki: ARRAY [1..128] OF BOOL; (* tablica zawierajaca stany czujek od 1 do 128, TRUE - czujka aktywna *)
strefy: ARRAY [1..32] OF BOOL; (* tablica zawierajaca stany stref od 1 do 32, TRUE - strefa uzbrojona *)
xCLIENT_OPEN: BOOL; (* polaczenie do modulu ETHM-1 aktywne *)
wSocketState: WORD; (* numer wtyczki *)
END_VAR
VAR
pingSatel : FbPing_base;
pingState : WagoTypes.eResultCode;

socketSatel : FbSocketClient;
socketState : WagoSysErrorBase.FbResult;
socketOpenState : WagoTypes.eResultCode;
socketWriteState : WagoTypes.eResultCode;
socketReadState : WagoTypes.eResultCode;

Read00 : BOOL := TRUE; (* zadanie wyslania polecenia 00 - odczyt stanu czujek*)
Read0A : BOOL := TRUE; (*zadanie wyslania polecenia 0A - odczyt stanu uzbrojenia alarmu *)

fi : INT; (* pierwszy  indeks ramki *)
fin : INT; (* drugi indeks ramki *)
buf_len : INT; (* dlugosc danych w buforze *)
znacznik : BYTE := 1; (* znacznik uzywany do operacji bitowych *)
pt : POINTER TO ARRAY [1..1500] OF BYTE; (* wskaznik do tablicy - uzywany przy przkazywaniu tablicy do funkcji *)
frame_rcv : ARRAY [1..1500] OF BYTE; (* tablica danych odebranych *)
frame_snd : ARRAY [1..1500] OF BYTE; (* tablica danych wysylanych *)
rcv_len : UDINT;
Status : WORD := 0; (* status transmisji: 0 - inicjalizacja, 1 - sprawdzenie stosu TCP/IP 4 - inicjalizacja otwarcia polaczenia, 5 - oczekiwanie na otwarcie polaczenia, 10 -wyslanie danych do serwera, 20 - oczekiwanie na odbior danych, 30 - interpretacja otrzymanych danych, 40 - zamykanie polaczenia *)

tonTimeOut : Standard.TON := (PT:=T#2s);
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 := 40;
  END_IF

// socketSatel.CancelWrite();
status:=20;

20:
socketSatel.Read(
pRxBuffer:=ADR(frame_rcv),
udiRxBufferSize:= SIZEOF(frame_rcv),
udiRxNBytes => rcv_len,
Read => socketReadState);
tonTimeOut(IN := TRUE);
IF buf_len <> 0 THEN
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

Do Poprawnego działania potrzeba biblioteki WagoAppSocket
Funkcja SatelCRC zgodna z kodem kolegi @KamilKac

2
(Pod)Systemy i Funkcje / Odp: Integracja PLC z systemem alarmowym SATEL INTEGRA
« dnia: Października 17, 2019, 08:00:45 am »
Witam kolegów.

Czy komuś udało się połączyć CA ze sterownikiem WAGO pod e!cockpit? Jeśli tak, to czy mógłbym uśmiechnąć się o jakieś źródła?

Pozdrawiam.

Strony: [1]