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

Strony: [1] 2 3 ... 5
1
(Pod)Systemy i Funkcje / Odp: Integracja PLC z systemem alarmowym SATEL INTEGRA
« dnia: Październik 22, 2018, 11:11:14 pm »
Czołem

Jeśli pytanie dotyczy eCockpit, to nie pomogę, bo nie mam. W Codesys 3.2 jest tak, że w górnej części okna deklaruje się zmienne a w dolnej wpisuje kod (program) operujący na tych zmiennych. radnet wkleił wszystko w jedno okno i program się nie kompilował.

Znajomy właśnie zakupił zestaw z eCockpitem, ale on jeszcze do integracji z Satelem nie doszedł :)

Pozdrawiam

2
(Pod)Systemy i Funkcje / Odp: Odczyt danych pogodowych ze stacji WH2600
« dnia: Październik 21, 2017, 09:53:07 am »
A tutaj znalazłem program, który obsługuje stacje z USB w pythonie. Twojej nie ma w spisie, ale może da się program dostosować.
https://github.com/jim-easterbrook/pywws

Pozdrawiam

3
(Pod)Systemy i Funkcje / Odp: Odczyt danych pogodowych ze stacji WH2600
« dnia: Październik 20, 2017, 06:50:05 pm »
Witam

Zastanawiam się nad zakupem w Conradzie stacji Renkforce WH2315 - i chciałbym również mieć możliwość odczytu danych pomiarowych do własnej aplikacji. Nie umiem znaleźć żadnych informacji o tym jak to zrobić.

Czy Twój kod (pewnie  z jakimiś modyfikacjami) ma szanse działać w tą stacją ? Rozumiem, że cały problem polega na analizie odpowiedzi w XML.

Gdzie na takie tematy szukać informacji , by nie wyważać otwartych drzwi?

pozdrawiam
Andrzej

Witam

Jeśli to ma być aplikacja na sterowniku, to ja mam tylko jedno pytanie: jak podłączyć stację do sterownika?

Przypuszczam, że wymiana danych z tej stacji do komputera może odbywać się na zasadzie portu szeregowego, ale trudno znaleźć info na ten temat.
Można też spróbować obejść bazę i odbierać dane bezpośrednio jak w przypadku WH1080:
https://github.com/ovrheat/raspberry_rtl_wh1080

Moja stacja jest podłączona do sieci i program w sterowniku ściąga informacje pogodowe z interfejsu www bazy. W przypadku WH2315 i każdej stacji z USB będzie to trudniejsze, bo trzeba rozkminić protokół.

Pozdrawiam

4
Cześć

Czy udało się uruchomić komunikację z Satelem? Aktualnie mam urlop i mogę pomóc.

Pozdrawiam
kamiKAC

5
Tematy ogólne / Odp: Video domofon
« dnia: Wrzesień 27, 2016, 10:28:30 am »
Ktoś testował http://safeautomation.pl/index.php/kontrola-dostepu/widodomofony-ip ?

Ja mam, ale jeszcze nie na ogrodzeniu, bo czekam aż słupek zostanie skończony. Pobawiłem się na razie na stole i wszystko działało jak należy. Ze względu na posiadany niezbyt wyszukany model telefonu VOIP musiałem postawić Asteriska na routerze, żeby móc odbierać domofon w telefonie.
Mogę pochwalić support.
Jak dla mnie minusem jest zasilanie 12V lub 48V POE, najlepiej byłoby na 24V.

Dodatkowo zamontowałem jeszcze
kontroler zamka http://safeautomation.pl/index.php/kontroler-zamkow-z5r
czytnik http://safeautomation.pl/index.php/czytnik-zblizeniowy-cp-z2l-safe
przycisk http://bomap.pl/pl/p/Przycisk-piezo-19-mm-PS193P10Y-NT1-x12T-z-podswietleniem/440

Pozdrawiam
--
kamiKAC

6
Witam

Oto obiecany poprawiony bloczek odczytu danych ze stacji WH2600 (nowa wersja oprogramowania odbiornika)

Na początek należy zwiekszyć wartość zmiennej określającej maksymalna długość odpowiedzi TCP:
MAX_RECEIVE_TCP_CLIENT: UINT := 15000;
Deklaracje:
FUNCTION_BLOCK WH2600_weather
(*
Weather data from Renkforce WH2600 Weather Station (Weather Logger 2.1)
Based on pWorldWeatherForecast

03.05.2016 Marcin Rudzki
*)

VAR_INPUT
sAddress: STRING := '192.168.2.195';
END_VAR

VAR_OUTPUT
rInTemp: REAL := 0; (* Indoor temperature *)
iInHumi: INT := 0; (* Indoor humidity *)
rAbsPress: REAL := 0; (* Absolute pressure *)
rRelPress: REAL := 0; (* Relative pressure *)
rOutTempC: REAL := 0; (* Outdoor temperature *)
iOutHumi: INT:= 0; (* Outdoor humidity *)
iWinDir: INT := 0; (* Wind direction *)
sWinDir: STRING(3);
rAvgWind: REAL := 0; (* Average wind speed *)
rGustSpeed: REAL := 0; (* Gust speed *)
rSolarRad: REAL := 0; (* Solar radiation *)
iUV: INT := 0; (* UV *)
iUVI: INT := 0; (* UV index *)
rRainOfHourly: REAL := 0; (* Hourly Rain rate *)
rRainOfDaily: REAL := 0; (* Daily Rain Rate *)
rRainOfWeekly: REAL := 0; (* Weekly Rain Rate *)
rRainOfMonthly: REAL := 0; (* Monthly Rain Rate *)
rRainOfYearly: REAL := 0; (* Annually Rain Rate *)
sStatus: STRING;
diError: DINT;
END_VAR

VAR_IN_OUT
xStart : BOOL;
END_VAR
VAR
wStateMachine: WORD;

(* Function block HTTP_GET *)
    oHTTP_GET:HTTP_GET;(* Input variables: *)
    oHttp_sServerName : STRING ; (* Hostname or server IP in dotted normal form *)
    oHttp_pabUrlData : POINTER TO ARRAY [0..MAX_RECEIVE_TCP_CLIENT] OF BYTE ; (* The HTTP-GET-Request *)
    oHttp_uiUrlLength : UINT ; (* Length of HTTP-GET-Request *)
    oHttp_tTimeOut : TIME := t#24s; (* WatchDogTime, operation aborted after time is elapsed *)
    oHttp_xSend : BOOL ;
    oHttp_diError : DINT ; (* 0 == successful *)
    oHttp_sStatus : STRING(255) ;
    oHttp_abContentData : ARRAY [0..MAX_RECEIVE_TCP_CLIENT] OF BYTE ; (* The HTTP response *)
    oHttp_uiContentLength : UINT ; (* Length of HTTP response in byte *)

(* Function block HTTP_GET helper *)
sUrl: STRING(250);
sUrlHelp: STRING(250);

(* HTML file *)
abXmlFileStream : ARRAY [0..MAX_RECEIVE_TCP_CLIENT] OF BYTE ; (* The HTTP response *)
    uiXmlFileStreamLen : UINT ; (* Length of HTTP response in byte *)
pabXmlHandler : POINTER TO ARRAY [0..MAX_RECEIVE_TCP_CLIENT] OF BYTE;
uiXmlHandlerIndex: UINT;
uiXmlStreamLen: UINT;
sSearchedString: STRING(105);
xFail: BOOL;
sHTTP_Response: STRING;

(* Helpers *)
i: INT;
uiPos: UINT;
bHelp: BYTE;
abHelp: ARRAY [0..50] OF BYTE;
psHelp: POINTER TO STRING(50);
sHelp: STRING(50);
xInSensorAbsent: BOOL := FALSE;
xOutSensorAbsent: BOOL := FALSE;
END_VAR

Kod:
(* Function block HTTP_GET instance *)
oHTTP_GET (
  (* Input variables: *)
    sServerName := sAddress   ,
    wServerPort := 80   ,
    pabUrlData := oHttp_pabUrlData,
    uiUrlLength := oHttp_uiUrlLength,
    tTimeOut := oHttp_tTimeOut,
  (* Input/output variables: *)
    xSend := oHttp_xSend,
  (* Output variables: *)
    diError => oHttp_diError,
    sStatus => oHttp_sStatus,
    abContentData => oHttp_abContentData   ,
    uiContentLength => oHttp_uiContentLength
);

CASE wStateMachine OF
0: (* Init *)
IF xStart THEN
(* Url builder *)
sUrl := '/livedata.htm';
(* Set HTTP_GET *)
oHttp_pabUrlData := ADR(sUrl);
oHttp_uiUrlLength := LEN(sUrl);
(* Process HTTP_GET *)
oHttp_xSend := TRUE;
wStateMachine := 10;
END_IF

10: (* Process the HTTP reguest *)
IF NOT oHttp_xSend THEN
IF oHttp_diError = 0 THEN
(* Process the weather HTML response *)
wStateMachine := 20;
ELSE
(* Error *)
sStatus := oHttp_sStatus;
diError := oHttp_diError;
wStateMachine := 999;
END_IF
END_IF

20: (* Process the weather HTML response *)
(* Get HTML stream *)
abXmlFileStream := oHttp_abContentData;
uiXmlFileStreamLen := oHttp_uiContentLength;

(* Set pointer to the start of the HTML file*)
uiXmlHandlerIndex := 0;
pabXmlHandler := ADR(abXmlFileStream[0]);
uiXmlStreamLen := uiXmlFileStreamLen;
sHTTP_Response := BUFFER_TO_STRING(pabXmlHandler,SIZEOF(abXmlFileStream),0,100);
(* Search for 'livedata' string in the HTML file *)
sSearchedString := 'form name="livedata" method="POST" onsubmit="return chkForm(0);"';
SearchForString;
IF xFail THEN
sStatus := 'ERROR: No livedata form in the stream!';
xStart:= FALSE;
diError := 16#00000001;
wStateMachine := 999;
ELSE
wStateMachine := 25;
END_IF

25: (* Search for 'IndoorID' string in the HTML file *)
sSearchedString := 'input name="IndoorID" disabled="disabled" type="text" class="item_2" style="WIDTH: 80px" value="0x';
SearchForString;
IF xFail THEN
sStatus := 'ERROR: No indoorID in the stream';
xStart:= FALSE;
diError := 16#00000001;
wStateMachine := 999;
ELSE
(* Get value content *)
i := 0;
bHelp := pabXmlHandler^[i];
WHILE bHelp <> 16#22 AND bHelp <> 16#00 DO
abHelp[i] := bHelp;
i := i + 1;
bHelp := pabXmlHandler^[i];
END_WHILE
abHelp[i] := 16#00;
psHelp := ADR(abHelp);
IF (psHelp^) = '--' THEN
sStatus := 'ERROR: No indoor sensor detected';
diError := 16#00000002;
xInSensorAbsent := TRUE;
ELSE
xInSensorAbsent := FALSE;
END_IF
wStateMachine := 27;
END_IF

27: (* Search for 'Outdoor1ID' string in the HTML file *)
sSearchedString := 'input name="Outdoor1ID" disabled="disabled" type="text" class="item_2" style="WIDTH: 80px" value="0x';
SearchForString;
IF xFail THEN
sStatus := 'ERROR: No Outdoor1ID in the stream';
xStart:= FALSE;
diError := 16#00000001;
wStateMachine := 999;
ELSE
(* Get value content *)
i := 0;
bHelp := pabXmlHandler^[i];
WHILE bHelp <> 16#22 AND bHelp <> 16#00 DO
abHelp[i] := bHelp;
i := i + 1;
bHelp := pabXmlHandler^[i];
END_WHILE
abHelp[i] := 16#00;
psHelp := ADR(abHelp);
IF (psHelp^) = '--' THEN
sStatus := 'ERROR: No outdoor1 sensor detected';
IF xInSensorAbsent THEN
diError := 16#00000006;
wStateMachine := 999;
ELSE
diError := 16#00000004;
xOutSensorAbsent := TRUE;
wStateMachine := 30;
END_IF
ELSIF xInSensorAbsent THEN
xOutSensorAbsent := FALSE;
wStateMachine := 50;
ELSE
xOutSensorAbsent := FALSE;
wStateMachine :=30;
END_IF
END_IF

30: (* Search for 'inTemp' string in the HTML file *)
sSearchedString := 'input name="inTemp" disabled="disabled" type="text" class="item_2" style="WIDTH: 80px" value="';
SearchForString;
IF xFail THEN
sStatus := 'ERROR: No inTemp in file';
xStart:= FALSE;
diError := 16#00000001;
wStateMachine := 999;
ELSE
(* Get value content *)
i := 0;
bHelp := pabXmlHandler^[i];
WHILE bHelp <> 16#22 AND bHelp <> 16#00 DO
abHelp[i] := bHelp;
i := i + 1;
bHelp := pabXmlHandler^[i];
END_WHILE
abHelp[i] := 16#00;
psHelp := ADR(abHelp);
rInTemp := STRING_TO_REAL(psHelp^);
wStateMachine := 40;
END_IF

40: (* Search for 'inHumi' string in the HTML file *)
sSearchedString := 'input name="inHumi" disabled="disabled" type="text" class="item_2" style="WIDTH: 80px" value="';
SearchForString;
IF xFail THEN
sStatus := 'ERROR: No inTemp in file';
xStart:= FALSE;
diError := 16#00000001;
wStateMachine := 999;
ELSE
(* Get value content *)
i := 0;
bHelp := pabXmlHandler^[i];
WHILE bHelp <> 16#22 AND bHelp <> 16#00 DO
abHelp[i] := bHelp;
i := i + 1;
bHelp := pabXmlHandler^[i];
END_WHILE
abHelp[i] := 16#00;
psHelp := ADR(abHelp);
iInHumi := STRING_TO_INT(psHelp^);
IF xOutSensorAbsent THEN
wStateMachine := 0;
xStart := FALSE;
ELSE
wStateMachine := 50;
END_IF
END_IF

50: (* Search for 'AbsPress' string in the HTML file *)
sSearchedString := 'input name="AbsPress" disabled="disabled" type="text" class="item_2" style="WIDTH: 80px" value="';
SearchForString;
IF xFail THEN
sStatus := 'ERROR: No AbsPress in file';
xStart:= FALSE;
diError := 16#00000001;
wStateMachine := 999;
ELSE
(* Get value content *)
i := 0;
bHelp := pabXmlHandler^[i];
WHILE bHelp <> 16#22 AND bHelp <> 16#00 DO
abHelp[i] := bHelp;
i := i + 1;
bHelp := pabXmlHandler^[i];
END_WHILE
abHelp[i] := 16#00;
psHelp := ADR(abHelp);
rAbsPress := STRING_TO_REAL(psHelp^);
wStateMachine := 60;
END_IF


60: (* Search for 'RelPress' string in the HTML file *)
sSearchedString := 'input name="RelPress" disabled="disabled" type="text" class="item_2" style="WIDTH: 80px" value="';
SearchForString;
IF xFail THEN
sStatus := 'ERROR: No RelPress in file';
xStart:= FALSE;
diError := 16#00000001;
wStateMachine := 999;
ELSE
(* Get value content *)
i := 0;
bHelp := pabXmlHandler^[i];
WHILE bHelp <> 16#22 AND bHelp <> 16#00 DO
abHelp[i] := bHelp;
i := i + 1;
bHelp := pabXmlHandler^[i];
END_WHILE
abHelp[i] := 16#00;
psHelp := ADR(abHelp);
rRelPress := STRING_TO_REAL(psHelp^);
(* *)
wStateMachine := 70;
END_IF

70: (* Search for 'outTemp' string in the HTML file *)
sSearchedString := 'input name="outTemp" disabled="disabled" type="text" class="item_2" style="WIDTH: 80px" value="';
SearchForString;
IF xFail THEN
sStatus := 'ERROR: No outTemp in file';
xStart:= FALSE;
diError := 16#00000001;
wStateMachine := 999;
ELSE
(* Get value content *)
i := 0;
bHelp := pabXmlHandler^[i];
WHILE bHelp <> 16#22 AND bHelp <> 16#00 DO
abHelp[i] := bHelp;
i := i + 1;
bHelp := pabXmlHandler^[i];
END_WHILE
abHelp[i] := 16#00;
psHelp := ADR(abHelp);
rOutTempC := STRING_TO_REAL(psHelp^);
(* *)
wStateMachine := 80;
END_IF

80: (* Search for 'outHumi' string in the HTML file *)
sSearchedString := 'input name="outHumi" disabled="disabled" type="text" class="item_2" style="WIDTH: 80px" value="';
SearchForString;
IF xFail THEN
sStatus := 'ERROR: No outHumi in file';
xStart:= FALSE;
diError := 16#00000001;
wStateMachine := 999;
ELSE
(* Get value content *)
i := 0;
bHelp := pabXmlHandler^[i];
WHILE bHelp <> 16#22 AND bHelp <> 16#00 DO
abHelp[i] := bHelp;
i := i + 1;
bHelp := pabXmlHandler^[i];
END_WHILE
abHelp[i] := 16#00;
psHelp := ADR(abHelp);
iOutHumi := STRING_TO_INT(psHelp^);
(* *)
wStateMachine := 90;
END_IF


90: (* Search for 'windir' string in the HTML file *)
sSearchedString := 'input name="windir" disabled="disabled" type="text" class="item_2" style="WIDTH: 80px" value="';
SearchForString;
IF xFail THEN
sStatus := 'ERROR: No windir in file';
xStart:= FALSE;
diError := 16#00000001;
wStateMachine := 999;
ELSE
(* Get value content *)
i := 0;
bHelp := pabXmlHandler^[i];
WHILE bHelp <> 16#22 AND bHelp <> 16#00 DO
abHelp[i] := bHelp;
i := i + 1;
bHelp := pabXmlHandler^[i];
END_WHILE
abHelp[i] := 16#00;
psHelp := ADR(abHelp);
iWinDir := STRING_TO_INT(psHelp^);
sWinDir := AZIMUTH_TO_DIRECTION(iWinDir);
(* *)
wStateMachine := 100;
END_IF

100: (* Search for 'avg' string in the HTML file *)
sSearchedString := 'input name="avgwind" disabled="disabled" type="text" class="item_2" style="WIDTH: 80px" value="';
SearchForString;
IF xFail THEN
sStatus := 'ERROR: No avgwind in file';
xStart:= FALSE;
diError := 16#00000001;
wStateMachine := 999;
ELSE
(* Get value content *)
i := 0;
bHelp := pabXmlHandler^[i];
WHILE bHelp <> 16#22 AND bHelp <> 16#00 DO
abHelp[i] := bHelp;
i := i + 1;
bHelp := pabXmlHandler^[i];
END_WHILE
abHelp[i] := 16#00;
psHelp := ADR(abHelp);
rAvgWind := STRING_TO_REAL(psHelp^);
(* *)
wStateMachine := 110;
END_IF

110: (* Search for 'gustspeed' string in the HTML file *)
sSearchedString := 'input name="gustspeed" disabled="disabled" type="text" class="item_2" style="WIDTH: 80px" value="';
SearchForString;
IF xFail THEN
sStatus := 'ERROR: No gustspeed in file';
xStart:= FALSE;
diError := 16#00000001;
wStateMachine := 999;
ELSE
(* Get value content *)
i := 0;
bHelp := pabXmlHandler^[i];
WHILE bHelp <> 16#22 AND bHelp <> 16#00 DO
abHelp[i] := bHelp;
i := i + 1;
bHelp := pabXmlHandler^[i];
END_WHILE
abHelp[i] := 16#00;
psHelp := ADR(abHelp);
rGustSpeed := STRING_TO_REAL(psHelp^);
(* *)
wStateMachine := 120;
END_IF

120: (* Search for 'solarrad' string in the HTML file *)
sSearchedString := 'input name="solarrad" disabled="disabled" type="text" class="item_2" style="WIDTH: 80px" value="';
SearchForString;
IF xFail THEN
sStatus := 'ERROR: No solarrad in file';
xStart:= FALSE;
diError := 16#00000001;
wStateMachine := 999;
ELSE
(* Get value content *)
i := 0;
bHelp := pabXmlHandler^[i];
WHILE bHelp <> 16#22 AND bHelp <> 16#00 DO
abHelp[i] := bHelp;
i := i + 1;
bHelp := pabXmlHandler^[i];
END_WHILE
abHelp[i] := 16#00;
psHelp := ADR(abHelp);
rSolarRad := STRING_TO_REAL(psHelp^);
(* *)
wStateMachine := 130;
END_IF

130: (* Search for 'uv' string in the HTML file *)
sSearchedString := 'input name="uv" disabled="disabled" type="text" class="item_2" style="WIDTH: 80px" value="';
SearchForString;
IF xFail THEN
sStatus := 'ERROR: No uv in file';
xStart:= FALSE;
diError := 16#00000001;
wStateMachine := 999;
ELSE
(* Get value content *)
i := 0;
bHelp := pabXmlHandler^[i];
WHILE bHelp <> 16#22 AND bHelp <> 16#00 DO
abHelp[i] := bHelp;
i := i + 1;
bHelp := pabXmlHandler^[i];
END_WHILE
abHelp[i] := 16#00;
psHelp := ADR(abHelp);
iUV := STRING_TO_INT(psHelp^);
(* *)
wStateMachine := 140;
END_IF

140: (* Search for 'uvi' string in the HTML file *)
sSearchedString := 'input name="uvi" disabled="disabled" type="text" class="item_2" style="WIDTH: 80px" value="';
SearchForString;
IF xFail THEN
sStatus := 'ERROR: No uvi in file';
xStart:= FALSE;
diError := 16#00000001;
wStateMachine := 999;
ELSE
(* Get value content *)
i := 0;
bHelp := pabXmlHandler^[i];
WHILE bHelp <> 16#22 AND bHelp <> 16#00 DO
abHelp[i] := bHelp;
i := i + 1;
bHelp := pabXmlHandler^[i];
END_WHILE
abHelp[i] := 16#00;
psHelp := ADR(abHelp);
iUVI := STRING_TO_INT(psHelp^);
(* *)
wStateMachine := 150;
END_IF

150: (* Search for 'rainofhourly' string in the HTML file *)
sSearchedString := 'input name="rainofhourly" disabled="disabled" type="text" class="item_2" style="WIDTH: 80px" value="';
SearchForString;
IF xFail THEN
sStatus := 'ERROR: No rainofhourly in file';
xStart:= FALSE;
diError := 16#00000001;
wStateMachine := 999;
ELSE
(* Get value content *)
i := 0;
bHelp := pabXmlHandler^[i];
WHILE bHelp <> 16#22 AND bHelp <> 16#00 DO
abHelp[i] := bHelp;
i := i + 1;
bHelp := pabXmlHandler^[i];
END_WHILE
abHelp[i] := 16#00;
psHelp := ADR(abHelp);
rRainOfHourly := STRING_TO_REAL(psHelp^);
(* *)
wStateMachine := 160;
END_IF

160: (* Search for 'rainofdaily' string in the HTML file *)
sSearchedString := 'input name="rainofdaily"  type="text" class="item_2" style="WIDTH: 80px" value="';
SearchForString;
IF xFail THEN
sStatus := 'ERROR: No rainofdaily in file';
xStart:= FALSE;
diError := 16#00000001;
wStateMachine := 999;
ELSE
(* Get value content *)
i := 0;
bHelp := pabXmlHandler^[i];
WHILE bHelp <> 16#22 AND bHelp <> 16#00 DO
abHelp[i] := bHelp;
i := i + 1;
bHelp := pabXmlHandler^[i];
END_WHILE
abHelp[i] := 16#00;
psHelp := ADR(abHelp);
rRainOfDaily := STRING_TO_REAL(psHelp^);
(* *)
wStateMachine := 170;
END_IF

170: (* Search for 'rainofweekly' string in the HTML file *)
sSearchedString := 'input name="rainofweekly" type="text" class="item_2" style="WIDTH: 80px" value="';
SearchForString;
IF xFail THEN
sStatus := 'ERROR: No rainofweekly in file';
xStart:= FALSE;
diError := 16#00000001;
wStateMachine := 999;
ELSE
(* Get value content *)
i := 0;
bHelp := pabXmlHandler^[i];
WHILE bHelp <> 16#22 AND bHelp <> 16#00 DO
abHelp[i] := bHelp;
i := i + 1;
bHelp := pabXmlHandler^[i];
END_WHILE
abHelp[i] := 16#00;
psHelp := ADR(abHelp);
rRainOfWeekly := STRING_TO_REAL(psHelp^);
(* *)
wStateMachine := 180;
END_IF

180: (* Search for 'rainofmonthly' string in the HTML file *)
sSearchedString := 'input name="rainofmonthly" type="text" class="item_2" style="WIDTH: 80px" value="';
SearchForString;
IF xFail THEN
sStatus := 'ERROR: No rainofmonthly in file';
xStart:= FALSE;
diError := 16#00000001;
wStateMachine := 999;
ELSE
(* Get value content *)
i := 0;
bHelp := pabXmlHandler^[i];
WHILE bHelp <> 16#22 AND bHelp <> 16#00 DO
abHelp[i] := bHelp;
i := i + 1;
bHelp := pabXmlHandler^[i];
END_WHILE
abHelp[i] := 16#00;
psHelp := ADR(abHelp);
rRainOfMonthly := STRING_TO_REAL(psHelp^);
(* *)
wStateMachine := 200;
END_IF

200: (* Search for 'rainofyearly' string in the HTML file *)
sSearchedString := 'input name="rainofyearly" type="text" class="item_2" style="WIDTH: 80px" value="';
SearchForString;
IF xFail THEN
sStatus := 'ERROR: No rainofyearly in file';
xStart:= FALSE;
diError := 16#00000001;
wStateMachine := 999;
ELSE
(* Get value content *)
i := 0;
bHelp := pabXmlHandler^[i];
WHILE bHelp <> 16#22 AND bHelp <> 16#00 DO
abHelp[i] := bHelp;
i := i + 1;
bHelp := pabXmlHandler^[i];
END_WHILE
abHelp[i] := 16#00;
psHelp := ADR(abHelp);
rRainOfYearly := STRING_TO_REAL(psHelp^);
(**)
sStatus := 'Sucessfully executed';
diError := 0;
xStart := FALSE;
(**)
wStateMachine := 0;
END_IF

999: (* Error *)
xStart := FALSE;
wStateMachine := 0;

ELSE
xStart := FALSE;
wStateMachine := 0;

END_CASE

7
Witam

Stacja działała pięknie prawie rok. Aż miesiąc temu zewnętrzny moduł "umarł" (akumulatorki były w porządku). Spakowałem i na koszt Conrada odesłałem. Po tygodniu przyszła nowa. Ma już nowsze oprogramowanie, więc oczywiście integracja z Wago nie działała (wprowadziłem już stosowne poprawki). Jak zweryfikuję bloczek resetowania, czy rzeczywiście działa, to wkleję aktualny kod.

Stacja nie ma dobrego przelicznika ciśnienia bezwzględnego na względne, jedynie można wprowadzić offset. Wiatromierz wymagał przeskalowania, bo według mnie zaniżał wartości (można wprowadzić współczynnik do przemnożenia).

Mimo wszystko uważam, że jest to całkiem niezła alternatywa dla stacji Davis Vantage Pro, której cena (ale i jakość) jest poza moim zasięgiem.

Pozdrawiam

8
Sterowanie i Wizualizacje / Odp: Temperatura - DS18B20
« dnia: Kwiecień 27, 2016, 04:13:06 pm »
Przepraszam, że odgrzewam stare kotlety, ale czy przypadkiem problem z odczytem ujemnych temperatur nie wynika z zastosowania typu UINT zamiast INT przy przekazywaniu wartości? Miałem ten sam problem przy odczycie temperatur poprzez MODBUS.

Pozdrawiam
--
kamiKAC

9
Tematy ogólne / Odp: Kupię/Sprzedam/Zamienię
« dnia: Kwiecień 22, 2016, 11:52:55 am »
Witam

Ma ktoś może na sprzedaż 5 przekaźników 788-304 (lub inne WAGO) w rozsądnej cenie?

Zabrakło mi do sterowania nawadnianiem ;)

Pozdrawiam
--
kamiKAC

10
Sterowanie i Wizualizacje / Odp: Sterowanie ogrzewaniem podlogowym
« dnia: Grudzień 30, 2015, 05:28:43 pm »
Witam

Ja ustawiłem minimalne wyjście PID na 20%, bo czas otwarcia zaworu u mnie to ok 5 minut, więc przy okresie PWM 30min przez 5 minut otwiera się zawór, a 1 minutę podgrzewa się podłoga.

Aktualnie nastawy mam takie (układ działa stabilnie):
Kp = 10
Ti=5000
Td=400
rCycleTime=900 (15 minut)

Pozdrawiam i życzę wszystkiego najlepszego w Nowym Roku :)

11
Sterowanie i Wizualizacje / Odp: Sterowanie ogrzewaniem podlogowym
« dnia: Grudzień 24, 2015, 01:53:44 pm »
Witaj

W zasadzie należałoby to ustawić według ogólnych zasad dobierania nastaw PID (jest o tym dużo w Internecie). U mnie był problem, bo jak się mieszka to trudno zapewnić brak wpływu czynników zewnętrznych (po prysznicu temperatura w łazience wzrasta od 0,5 do 1 st C), więc odpowiedź skokowa nie byłaby wynikiem zmiany nastawy, ale wypadkowej zmiany nastawy i zakłócenia w postaci podgrzania powietrza poprzez prysznic.

Dobierałem nastawy doświadczalnie. Logowałem temperaturę w łazience, nastawę i wyjście regulatora PID co kilka minut do pliku, potem obserwując wykresy zmieniałem nastawy. Najłatwiej zacząć od samego P. Jak układ jest stabilny, to stopniowo włączamy człony I oraz D. Trzeba tylko pamiętać, żeby zwiększając udział tych członów zmniejszać udział P, żeby zachować stabilność.

W garażu będzie Ci łatwiej, bo jeśli nie będziesz go otwierał, nie będzie zakłócenia, można wtedy książkowo wyregulować ten PID

Mam nadzieję, że pomogłem :)

Zdrowych i spokojnych świąt
--
kamiKAC

12
Witam

Nie bardzo rozumiem, o co chodzi z tymi wyświetlaczami, ale ja konwertuję dane z MODBUS (WORD) poprzez rTemp := WORD_TO_REAL(wTemp)/100, potem do wyświetlania w edomApp używam SINT: iTemp := REAL_TO_SINT(rTemp*10)

Pozdrawiam
--
kamiKAC

P.S. Ja chyba miałem ten sam problem, co Ty pierwszej zimy.
A 3 tygodnie temu po burzy z piorunami miałem na wszystkich czujnikach ponad 400stopni. Pomógł reset wirechipa. Latem 2014 było dokładnie to samo.

13
Tematy ogólne / Odp: Wago duzo modułów
« dnia: Grudzień 10, 2015, 08:55:33 pm »
Witaj

Według specyfikacji 750-880 może dostarczyć 1700mA (5V) do modułów I/O.
750-403 pobiera 7,5mA, więc 30 modułów pobiera 30x7,5mA = 225mA
750-504 pobiera 10mA, więc 20 modułów pobiera 20x10mA=200mA
Łącznie wszystkie moduły pobierają 425mA (5V), więc wydajność źródła 5V jest wystarczająca.

Zasilacz 24V raczej powinien być wystarczający, jeśli stabilnie daje 600mA, bez przekaźników.

Jakie są objawy problemów?

Pozdrawiam
--
kamiKAC

14
(Pod)Systemy i Funkcje / Odp: Sterowanie ogrzewaniem
« dnia: Październik 29, 2015, 11:12:13 pm »
Chłodzenie i grzanie to raczej pompą ciepła. Rekuperator służy jedynie wentylacji i odzyskowi ciepła/zimna z budynku. Nie ma znaczenia czym grzejesz, możesz nawet kominkiem :-) Zresztą teraz żona nie pracuje, to często sobie dogrzewamy w ten sposób.

Gaz to przede wszystkim wygoda i bezobsługowość, bo paliwa stałe wychodzą taniej.

15
(Pod)Systemy i Funkcje / Odp: Sterowanie ogrzewaniem
« dnia: Październik 28, 2015, 02:25:20 am »
Problem z solarami jest taki, że najwięcej ciepła dostarczają, gdy zatrzebowanie na nie jest minimalne. Mój kolega ma zainstalowane solary, ale jeszcze nie mieszka. Ponoć latem woda się gotowała ;-)

Domek 140m.kw. powierzchni użytkowej, garaż w bryle budynku (projekt W-49.12b z wykuszem i poj. garażem). Ocieplenie styropian grafitowy 15cm, okna aluplast profil 4000 dwuszybowe, na połaciach dachu i sufitach 25 cm wełny, strych częściowo ocieplony 15cm wełny. Drzwi wejściowe metalowe. Rekuperator Vort Prometeo HR400. Do lutego nie używaliśmy piętra.
Aktualnie docieplam strych.

WAF - Wife Acceptance Factor ;-)

Strony: [1] 2 3 ... 5