2
« 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