Profil użytkownika
posty użytkownika | ||||
|
||||
DarekB
|
W tym skrypcie do łączenia po RS232 na samym początku umieściłem moje przemyślenia na temat budowy rozkazów do sterownika zacytuję:
# bajt znczenia # 0 0x02 (2) początek rozkazu # 1 0x01 (1) ? # 2 0x00 (0) ? dla polecenia 0x06 (6) dla odpowiedzi # 3 `\ polecenie # 4 > p. wysłane jest z bajtem 2 utawionym na 0 # 5 _/ w odpowiedzi zwracane przy czym bajt 2 jest zmieniany na 6 # 6 lo długosc parametrow polecenia # 7 hi ---//--- # ... parametry polecenia z reguly 2 bajty 1-lo, 2-hi (on - 0100 off - 0000) # -2 (przedostatni) suma CRC od [1:-2] # -1 (ostatni) 0x03 (3) koniec rozkazu Jak widać po logach wklejonych kilka komentarzy wyżej myliłem się ponieważ sterownik zwrócił w bajcie 3 (indeks 2) 15 nie 06 widocznie tak może być a ja mylnie sprawdzam czy jest 6 oraz czy 3 bajty od 4 do 6 [3:6] jakie zostały wysłane zostały zwrócone. W wypadku dmuchawy należy wyliczyć sumę kontrolną, ta suma kontrolna jest w każdym rozkazie tylko my mamy takie gotowce które już mają wyliczoną tę sumę. Jakby ciągi wysyłane przez com=.. są tożsame ciągom binarnym wysyłanym po rs (grupując parami po 2 znaki) Tak więc funkcja ustawiająca dmuchawę zmieni się tylko 1 bajtem #02 01 00 02 00 0F 02 00 28 00 DF 03 def setDmuchawaMocAuto(self, value): tab = [0x01, 0x00, 0x02, 0x00, 0x0F, 0x02, 0x00, value & 0xff, 0x00] crc = self.crc(tab) tab.insert(0, 0x02) tab.append(crc) tab.append(0x03) cmd = ''.join('{:02x}'.format(x) for x in tab) return self._getRequest(cmd) To tak na szybko Pozdrawiam Darek |
|||
|
||||
DarekB
|
VERB napisał » 2014-03-21 06:33 Niestety, nie działa. OK https://drive.google.com/file/d/0B1rjRhAXEGUoclM5Q1ltOW5fZ0k/edit?usp=sharing Tam jest taka właściwość klasy __debug obecnie ustawiona na True i dzięki temu wyświetla co wysłał, nagłówek komunikatu zwrotnego, cały komunikat oraz czy ustawione są bajty początkowe końcowe i suma kontrolna. Dodatkowo dołączony jest test który prócz tego co poprzednio (status, ręczny, status,auto,status) włącza i wyłącza pompę CWU. Żeby przetestować skrypt pod Windows postanowiłem to zrobić w po cichu w pracy, zestawiłem poprzez VPN połączenie Serial over IP z kotłownią w domu i uruchomiłem skrypt na pythonie 3.4 na przeterminowanym XP, musiałem zwiększyć timeout początkowo do 5 i okazało się że status pobiera ale nie chce kotła przełączyć w tryb ręczny, (pompę CWU włącza i wyłącza) porobiłem "debugowanie" i okazało się że ta komenda mu coś nie pasuje bo nie dość że nic nie robi to jeszcze nic nie zwraca. Ale ten sam skrypt uruchomiony bezpośrednio na komputerze podłączonym do pieca (Linux) wykonuje wszystkie komendy. Żeby ten skrypt normalnie używać należy ustawić właściwość __debug na False i zmienić timeout w konstruktorze __init__ lub przy wywoływaniu konstruktora ponieważ domyślny ustawiłem na 10 sek. tu jest udostępniony cały katalog na google drive a w środku wyniki działanie skryptu pod linux (bezpośrednio) i windows (serial over IP) https://drive.google.com/folderview?id=0B1rjRhAXEGUoaFFHSktha2t2cGc&usp=sharing Pozdrawiam Darek |
|||
|
||||
DarekB
|
VERB napisał » 2014-03-20 18:57 Niestety, nie robi nic ze sterownikiem. Nie używam przejściówki, zmieniłem na ('COM1','9600'; dobrze to wpisuję ? Stąd pociągnąłem serial: pyserial-2.7 for Python 3.x (3.0...3.4) PS: Sprawdziłem, port zostaje otwarty przez skrypt, tylko druga strona nie odpowiada:> sprawdziłem, u mnie działa tylko z prędkością 115200 przy innych pomimo zwiększenia timeout do 5 wyłączenia flow control (DTR/DSR) na innych prędkościach nie działa (ale sypie błędami). Po prostu nic nie otrzymuje ze sterownika. Prędkość portu to liczba bez ' '. Pozdrawiam Darek |
|||
|
||||
DarekB
|
VERB napisał » 2014-03-20 16:40 Napisz jeśli możesz, działającego sampla - może w końcu załapię o co chodzi. test do sterownik_rs.py: https://drive.google.com/file/d/0B1rjRhAXEGUoZGFXN0dYVFRqeVE/edit?usp=sharing pokazuje status wyłącza tryb auto 3 sek czeka pokazuje status włącza tryb auto 3 sek czeka pokazuje status Pozdrawiam Darek |
|||
|
||||
DarekB
|
Było pytanie o błąd w skrypcie do łączenia po RS, ale znikło. Myślę że chodzi o to że skrypt był uruchamiany pod python 3. Jakoś do tej pory mimo kilku podejść nie miałem śmiałości zanurzyć się w pythonie 3 ale w końcu się przemogłem i zainstalowałem wersję 3. Jest źle, kilkanaście linii wymagało poprawienia to co python 2 łykał to teraz nie przechodzi, szczególnie że zrobiłem już serwer www do tego skryptu w python 2.7, taka wersja minimalistyczna bez frameworków, cgi, apachów czy innych serwerów www, żeby pociągną to micro PC. Ale teraz działa na python3 tylko należy dociągnąć python3-serial bo ten co był też się wysypał. debian ma to w repozytoriach apt-get install python3-serial a poprawiony skrypt wrzuciłem tu: https://drive.google.com/file/d/0B1rjRhAXEGUobGx4RHNfRkVFU1E/edit?usp=sharing Pozdrawiam Darek |
|||
|
||||
DarekB
|
Zrobiłem jeszcze jedno rozwiązanie.
Skoro sprzęt który będzie to obsługiwał i tak ma wisieć w okolicach kotła można połączyć się bezpośrednio pod rs232. podjąłem próbę rozpracowania go oto efekt: sterownik ma identyczną strukturę więc można go łatwo wymienić wystarczy zamiast ip podać port com1 lub /dev/ttyS0 lub /dev/ttyUSB0 przy przejściówce usb-rs Wymaga biblioteki pyserial http://pyserial.sourceforge.net/ którą dołaczyłem do paczki do pobrania: https://drive.google.com/file/d/0B1rjRhAXEGUoc2pfNzh4c2VQZTQ/edit?usp=sharing test: python sterownik.py /dev/ttyUSB0 lub python sterownik.py com1 Testowane na python 2.7 Pozdrawiam Darek |
|||
|
||||
DarekB
|
mark3k napisał » 2014-03-18 19:11 Na routerku TL-WR1043ND v.1 skrypt nie działa. Na dzisiaj nie ma nowej wersji pythona na OpenWRT (AA). Jest wersja serii 2.7... Pozdrawiam. Ps: Do kolegi Stan Jaki system wrzuciłeś do RPi v.2 ? Na python 2.7 skrypt działa. Nie wiem jak na openwrt (czy nie jest okrojony o jakieś biblioteki) Pozdrawiam Darek |
|||
|
||||
DarekB
|
Podmieniłem wersję biblioteki https://drive.google.com/file/d/0B1rjRhAXEGUoN3hTV2xHWXFpaGs/edit?usp=sharing zrobiłem kilka poprawek: Można się łączyć ze sterownikiem w sieci lokalnej jak i poprzez esterownik.pl zależnie od tego czy poda się IP czy id sterownika, Uwzględniłem interpretację temperatur ujemne Do łączenia używam wbudowane urllib2 więc nie potrzeba dociągać dodatkowych bibliotek. Jeszcze pytania: Czy ktoś zaczął pisać jakiś sterownik do kotła, chętnie w miarę umiejętności i czasu dołączę się, może nie pomogę merytorycznie ale programistycznie chętnie? Czy można gdzieś zdobyć algorytmy lub źródła programów do sterowania kotłami. Pozdrawiam db |
|||
|
||||
DarekB
|
Faktycznie jest błąd najprostsze rozwiązanie to przed (przed funkcjami zwracającymi temperatury) wstawić temp=lambda hi,lo: struct.unpack('h', chr(lo)+chr(hi))[0]/10.0 i przepisać definicje funkcji zwracajacych temperatury np: def getTempZew(self): if (bool(self.s_statusdata)): return temp(self.s_statusdata[21], self.s_statusdata[20]) Pozdrawiam db |
|||
|
||||
DarekB
|
mateuszm napisał » 2014-02-27 11:51 A co z możliwością połączenia przez esterownik? Nie wiem czy można takie rzeczy robić ale dodałem do tej biblioteki parę linii kodu i zrobiłem możliwość łączenia się ze sterownikiem przez platformę esterownik. Można też skrypt wywołać z linii komend podając id sterownika, opcjonalnie można podać login i hasło żeby połączyć się w trybie do odczyt - zapis. skrypt do pobrania z https://drive.google.com/file/d/0B1rjRhAXEGUoN3hTV2xHWXFpaGs/edit?usp=sharing Już kiedyś próbowałem rozpracować protokół sterownika ale kod javascript jest tak zaciemniony ze nie chciało mi się w to wgryzać. Pozdrawiam Darek |
|||
|
||||
DarekB
|
Dzięki nie wiem czy się praktycznie do czegoś przyda ale zawsze warto wiedzieć. Ktoś pytał o przełączanie pomiędzy auto a manual: def setTrybAuto(self, state): #auto 020100020033020001006503 #manual 020100020033020000009103 if (state): self._getRequest("020100020033020001006503"); else: self._getRequest("020100020033020000009103"); Pozdrawiam DarekB |