'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
1
Wcześniej ktoś udostępniał mój kod (starszą wersję) przerobiony pod PFC200 w tym wątku, proponuję przekopiować i spróbować. Ja mam 750-880 i Codesys 2.3, nie pomogę.

2
Jednym słowem projektu bootowalnego się nie da zrobić.
Ale kojarzę, że jest taka opcja w sterowniku 750-880 wykonania kopii zapasowej konfiguracji na karcie SD oraz opcja przywrócenia konfiguracji z karty przy starcie systemu. Może to załatwiłoby sprawę?

W interfejsie HTTP zakładka Features:
Services: Backup device settings to removable disk. START wykonuje backup na karcie
Synchronize device settings from removable disk at start-up. Po zaptaszkowaniu opcji przy każdym starcie przywraca konfigurację z karty.

3
Korzystając z Codesys ( wersja demo ) - jest pełna możliwosc zaprogramowania sterownika ale po zaniku napięcia trzeba wrzucić program do sterownika jeszcze raz - czyli jakies rozwiązanie to instalacja UPS obok sterownika :)   Rozumiem że mając demo moge sie spokojnie pobawić Starszym sterownikiem i przygotować do wrzucenia tego na prawdziwy obiekt.
Skąd taka informacja? Nie sprawdzałem tego, ale wydaje mi się, że jak nie masz targetów to nie wygenerujesz pliku z programem.

Pytanie mam jeszcze o te targety.
Czy to jest coś co jest wbudowane w Codesys i kupując taki zestaw startowy mam to ( te targety ) juz w instalce Codesysa cz jest to jakis oddzielny plik który sie doinstalowuje do Codesysa ? 
Jak dostajesz Codesys z WAGO to targety są już w instalce. Natomiast wersja z internetu ich nie posiada.

4
Aktualna wersja programu z opisem znajduje się na githubie:
https://github.com/kamiKAC/wago-satel-ethernet/

5
(Pod)Systemy i Funkcje / Odp: Monitorowanie mocy, energii i przeplywow...
« dnia: Stycznia 12, 2021, 11:58:39 pm »
Faktycznie ten SDM630 wygląda zacnie i jest dużo lektury na temat modbusa.
Ile chcesz za tego LE03MQ?

6
O cenę Codesys do WAGO należy pytać w WAGO we Wrocławiu.

Z tego, co pamiętam cena Codesys była zbliżona do ceny nowego sterownika.
Znalazłem stary cennik:
750-880      Progr. sterownik Ethernet v2 /switch 2p /SD         1683,00
759-333/000-923   Wago-I/O-Pro v.2.3 CAA: CD+przewód USB+dokumentacja   1540,00
8x1-51262278   Zestaw startowy: Ethernet_4 (750-880 - SD)         2190,00

Jak widać zakup Codesys w tej cenie jest zupełnie bez sensu. Znacznie korzystniej wychodzi zakup zestawu startowego, gdzie oprócz sterownika dostajemy podstawowe elementy wejścia/wyjścia oraz zasilacz.

Jednym słowem warto kupić używany sterownik, jeśli mamy oprogramowanie do niego.

Proponuję zadzwonić do WAGO i spytać, może cena na stary CODESYS nie jest już taka zaporowa. W zasadzie rzecz się rozbija o targety do sterowników WAGO, bo samego CODESYSa można ściągnąć za darmo.

Pozdrawiam

7
(Pod)Systemy i Funkcje / Odp: Monitorowanie mocy, energii i przeplywow...
« dnia: Stycznia 12, 2021, 05:21:55 pm »
Tylko tu chyba była mowa o 3 licznikach 1-faz. Czyli w przypadku osobnego pomiaru produkcji i zużycia potrzebujemy już 6 liczników czyli zbliżamy się do ceny Shelly 3EM...

Pozdrawiam

8
Mój kod jest na początku tego wątku.

P.S. Przyznam się, że 10 minut temu obserwowałem działanie programu i zastanowiło mnie, czemu tak często odpytuje o stan wejść i wyjść i znalazłem byka :)
W najbliższym czasie wrzucę ostatnią wersję kodu na githuba (z zapisem i odczytem wyjść centrali).

9
xOpen_Client:=FALSE powinno rozłączać.
Dziwne, bo u mnie to chodzi tygodniami i nawet jak prąd wyłączą, to wszystko wstaje i po prostu działa.
Na jakim statusie Ci się blokuje(Zmienna Status bloczka SatelEthernet)?

10
(Pod)Systemy i Funkcje / Odp: Bezprzewodowe sterowanie obwodem elektrycznym
« dnia: Stycznia 11, 2021, 04:14:16 pm »
AKTUALIZACJA:
Tamta biblioteka z filmiku nie obsługiwała subskrypcji. Znalazłem jednak backport biblioteki MQTT od Codesys3.5:
https://github.com/huwylphi/codesys2-mqtt-library

Po dodaniu bliblioteki należy zadeklarować w zmiennych globalnych długość zmiennych string (długości przykładowe):
VAR_GLOBAL CONSTANT
MQTT_USERNAME_MAX_LENGTH: INT :=16;
MQTT_PASSWORD_MAX_LENGTH: INT :=16;
MQTT_TOPIC_MAX_LENGHT: INT :=128;
MQTT_MESSAGE_MAX_LENGHT: INT :=256;
END_VAR

11
(Pod)Systemy i Funkcje / Odp: Bezprzewodowe sterowanie obwodem elektrycznym
« dnia: Stycznia 10, 2021, 09:14:55 pm »
Ja akurat nie z Sonofem, ale z Wemosem (też ESP8266) bez problemu byłem w stanie się połączyć ze sterownika (własny soft do komunikacji z piecem po OpenTherm). Jak wgrasz Tasmotę też powinno zadziałać. Ewentualnie możesz zmienić w źródłach, że ma również obsługiwać HTTP 1.0.
Jak Tasmota, to jest obsługa MQTT. Właśnie się przymierzam do implementacji MQTT na 750-880 https://www.youtube.com/watch?v=FeY-z-h9_UA. To w sumie lepsze, niż okresowe sprawdzanie stanu przez HTTP API.
Aktualnie nie mam parcia, ale planuję bramkę OpenTherma przenieść na Tasmotę, więć to MQTT na pewno wypróbuję.

12
(Pod)Systemy i Funkcje / Odp: Monitorowanie mocy, energii i przeplywow...
« dnia: Stycznia 10, 2021, 09:06:01 pm »
Wtrącę tylko, że taki typ licznika nie sprawdzi się przy instalacji z fotowoltaiką: zarówno przepływ z jak i do elektrowni będzie pokazywany jako zużycie. Ponieważ planuję w tym roku wykonać instalację fotowoltaiczną skłaniam się ku pomiarowi energii na Shelly 3EM.

13
(Pod)Systemy i Funkcje / Odp: Integracja PLC z systemem alarmowym SATEL INTEGRA
« dnia: Października 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

14
(Pod)Systemy i Funkcje / Odp: Odczyt danych pogodowych ze stacji WH2600
« dnia: Października 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

15
(Pod)Systemy i Funkcje / Odp: Odczyt danych pogodowych ze stacji WH2600
« dnia: Października 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

16
Cześć

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

Pozdrawiam
kamiKAC

17
Tematy ogólne / Odp: Video domofon
« dnia: Września 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

18
(Pod)Systemy i Funkcje / Odp: Odczyt danych pogodowych ze stacji WH2600
« dnia: Maja 27, 2016, 03:06:46 pm »
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

19
(Pod)Systemy i Funkcje / Odp: Odczyt danych pogodowych ze stacji WH2600
« dnia: Maja 24, 2016, 12:21:03 pm »
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

20
Sterowanie i Wizualizacje / Odp: Temperatura - DS18B20
« dnia: Kwietnia 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

21
Tematy ogólne / Odp: Kupię/Sprzedam/Zamienię
« dnia: Kwietnia 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

22
Sterowanie i Wizualizacje / Odp: Sterowanie ogrzewaniem podlogowym
« dnia: Grudnia 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 :)

23
Sterowanie i Wizualizacje / Odp: Sterowanie ogrzewaniem podlogowym
« dnia: Grudnia 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

24
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.

25
Tematy ogólne / Odp: Wago duzo modułów
« dnia: Grudnia 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

26
(Pod)Systemy i Funkcje / Odp: Sterowanie ogrzewaniem
« dnia: Października 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.

27
(Pod)Systemy i Funkcje / Odp: Sterowanie ogrzewaniem
« dnia: Października 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 ;-)

28
(Pod)Systemy i Funkcje / Odp: Sterowanie ogrzewaniem
« dnia: Października 27, 2015, 02:47:02 pm »
Witam

Co do samej instalacji, to za dużo nie pomogę, bo ja mam prosty zestaw:
- kocioł gazowy kondensacyjny jednofunkcyjny z zaworem trójdrogowym i zasobnikiem 120l
- rozdzielacz na grzejniki,
- rozdzielacz na podłogówkę z pompą (4 obwody).

Gdy któryś grzejnik powinien grzać otwieram zawór od grzejnika, odczekuję czas na otwarcie zaworu i uruchamiam kocioł na grzanie (on/off). Grzejnikami steruję zwykła histerezą z bloczku Fb_TwoStepControl.
Podłogówkę mam na zasadzie PID + PWM. Na wejściu PID mam temp zadaną i obecną w pomieszczeniu. PID sam oblicza ile % czasu ma być otwarty obwód (20-100%) a blok PWM zamienia to na czas otwarcia zamknięcia zaworu (okres 30 min). Jeśli któryś zawór jest otwarty to pompa i kocioł są załączone.
Wcześniej kombinowałem z mierzeniem temp  na powrotach podłogówki, ale nie działało to tak, jak chciałem. Cały czas kombinuję z nastawami regulatora, żeby oscylacje były jak najmniejsze ale i uchyb nie był zbyt duży. Obniżanie wyjścia PID poniżej 20% nie ma sensu, gdyż ok. 5 minut zajmuje otwarcie zaworu, więc poniżej 20% grzałby poniżej 1 minuty co mija się z celem.

Z mojego doświadczenia wynika też, że może obniżanie temperaury pod nieobceność domowników daje oszczędności, ale tylko w przypadku grzejników jest szansa na komfort w domu. Przy podłogówce nie widzę sensu obniżania temperatury (w czasie testów wyszło, że najcieplej jest w nocy a jak kąpiemy córkę w łazience jest zimno).

Za gaz za cały rok zapłaciłem 2400zł (CO + CW + płyta gazowa).

W solary bym się nie pakował przy obecnym stanie wiedzy. Lepiej zainstalować ogniwa fotowoltaiczne w układzie on-grid.
W zasobnik, drabinkę czy cokolwiek innego można wsadzić grzałkę elektryczną, a nadmiar energii odsprzedać do zakładu energetycznego.
A co w przypadku jak będziesz na wakacjach i będzie nadmiar ciepła z solarów?

Jakby WAF był wyższy to już bym miał ogniwa na dachu ;)

Pozdrawiam
--
kamiKAC

29
A sprawdzałeś czy wyłączenie tej opcji z poziomu przeglądarki również nie działa?
Jaki masz sterownik?

30
Programowanie / Odp: Skąd pobrać pełną wersję codesys
« dnia: Września 04, 2015, 07:49:53 pm »
WAGO IO PRO Demo czyli wersję CodeSys dla WAGO można pobrać stąd bez rejestracji:

http://www.wago.pl/download.esm?file=%5Cdownload%5C00324833_0.iso&name=CODESYS_2.3.9.47_DEMO_BUILD_20150615.iso

Pozdrawiam

Strony: [1] 2 3