Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

centralka satel integra komunikacja rs232

przemek_m 21 Wrz 2008 15:42 31903 46
  • #1 21 Wrz 2008 15:42
    przemek_m
    Poziom 9  

    Witam
    Czy ktoś z was próbował zasterować centralą integra z poziomu kompa
    chodzi mi o sterowanie wyjściami.
    Dokumentacja dostarczana przez satela jest jak dla mnie dość kiepsko sporządzona i nie czytelna.
    Oprogramowanie sam sobie zrobię tylko nie mogę rozgryść tego protokołu.
    Robiłem już rózne aplikacje wykorzytując sprzęt roger'a na protokole epso który jest bardzo dobrze przygtowany i opisany.
    Także nie będę już zanudzał jakby ktoś już kiedyś walczył z tym tematem to bardzo proszę o pomoc.
    Pozdrawiam wszytkich

    0 29
  • #2 02 Wrz 2009 12:36
    viper_lasser
    Poziom 17  

    Witam
    Ruszylo się coś w tym temacie ? Udało się komuś napisac program odczytujący i sterujący do centrali satela ?

    0
  • #3 21 Maj 2011 23:13
    michal.konopinski
    Poziom 11  

    Jeśli to jeszcze aktualne, to tak, udało mi się na bazie Arduino zrobić tak jakby moduł wyjść, ślę do centrali komendę 0x78 i czekam na ramkę z odpowiedzią (0x55) i wg tego ustawiam wyjścia.
    Największym problemem był dla mnie jest fakt, że centrala sama z siebie wysyła ciągle pewne informacje oraz to, że niektóre ramki mają różną długość a dowiedzieć się tego można tylko sprawdzając sumę crc :)
    W tej chwili wysyłam rozkaz i grzecznie czekam na odpowiedź ignorując inne ramki.

    Pozdrawiam
    Michał Konopiński

    0
  • #4 25 Maj 2011 13:49
    viper_lasser
    Poziom 17  

    Kolego Michale
    Mógłbyś udostepnić jakieś przykładowy program do komunikacji z satelem ?

    Poniżej zamieszczam obsługę satela z beckhoffem

    (odczytywanie co 3sekunk ramki*)

    Timer(IN:=TRUE, PT:=T#3s);
    IF Timer.Q OR Send.Busy THEN

    ?Send(?pSendData:=ADR(slSend),
    ???Length:=SIZEOF(slSend),
    ???TXbuffer:= TxBuffer1,?(* see global variables *)
    ???Busy=> SendBusy,
    ???Error=> SendErrorID);

    ?Timer(IN:=FALSE); (* reset timer *)
    END_IF
    (*
    Deklaracja długości ramki komunikacyjnej?
    *)

    Receive(
    ?pPrefix:=ADR(zmPrefix),
    ?LenPrefix:=3,
    ?pSuffix:=ADR(zmSuffix),
    ?LenSuffix:=2,
    ?pReceiveData:=ADR(ReceivedData),
    ?SizeReceiveData:=16,
    ?Timeout:= T#2s,
    ?RXbuffer:= RxBuffer1,
    ?DataReceived=> DataReceived,
    ?busy=> ReceiveBusy,
    ?Error=> ReceiveErrorID,
    ?RxTimeout=> ReceiveTimeout );
    IF DataReceived THEN
    ?ReceiveCounter := ReceiveCounter + 1;
    ?LastReceivedData := ReceivedData;
    END_IF

    (*
    Deklaracja komunikacji w beckhoff przez port COM
    *)
    COMportControl(
    ?Mode:= SERIALLINEMODE_PC_COM_PORT,
    ?pComIn:= ADR(COMin_COMport),???(* I/O data; see global variables *)
    ?pComOut:= ADR(COMout_COMport),??(* I/O data; see global variables *)
    ?SizeComIn:= SIZEOF(COMin_COMport),??(* I/O data; see global variables *)
    ?TxBuffer:= TxBuffer1,????(* transmit buffer; see global variables *)
    ?RxBuffer:= RxBuffer1,????(* receive buffer; see global variables *)
    ?Error=> COMportControlError,
    ?ErrorID=> COMportControlErrorID );

    ----------------------------------------------------------------------------------------------------------------------------------------------------------
    ?slSend: ARRAY [0..6] OF BYTE;
    ?zmPrefix: ARRAY [0..2] OF BYTE;
    ?zmSuffix: ARRAY [0..1] OF BYTE;
    ----------------------------------------------------------------------------------------------------------------------------------------------------------
    i teraz trzeba zrobić, aby co 3,5 sek odpytywał sterownik o konkretną ramkę, najlepiej blink'erem jeżeli jest kilka ramek do odpytania


    KONTR(IN:= O_Kontrakton, PT:=T#3.5s);
    IF O_Kontrakton THEN

    slSend[0]:=16#FE;
    slSend[1]:=16#FE;
    slSend[2]:=16#00;
    slSend[3]:=16#D7;
    slSend[4]:=16#E2;
    slSend[5]:=16#FE;
    slSend[6]:=16#0D;

    zmPrefix[0]:=16#FE;
    zmPrefix[1]:=16#FE;
    zmPrefix[2]:=16#00;

    zmSuffix[0]:=16#FE;
    zmSuffix[1]:=16#0D;
    END_IF

    IF KONTR.Q THEN
    Okno_PD_schody:=?ReceivedData[3].0;
    Okno_PD_pokoj:=??ReceivedData[3].1;
    Okno_Lazienka_B:=?ReceivedData[3].2;
    Okno_Lazienka_A:=?ReceivedData[3].3;
    Okno_Pok3_B:=??ReceivedData[3].4;
    Okno_Pok3_A:=??ReceivedData[3].5;
    Okno_Pok4_B:=??ReceivedData[3].6;
    Okno_Pok4_A:=??ReceivedData[3].7;
    Okno_Pok1_B:=??ReceivedData[4].0;
    Okno_Pok1_A:=??ReceivedData[4].1;
    Okno_Pok2_B:=??ReceivedData[4].2;
    Okno_Pok2_A:=??ReceivedData[4].3;
    Okno_Salon_NW:= ?ReceivedData[4].4;
    Okno_Salon_A:=??ReceivedData[4].5;
    Okno_Salon_B:=??ReceivedData[4].6;
    Drzwi_Wejsciowe:=?ReceivedData[4].7;

    Okno_Kuchnia_NW:=?ReceivedData[5].0;
    Okno_Kuchnia_PL:=?ReceivedData[5].1;
    Okno_Kuch_B:=??ReceivedData[5].2;
    Okno_Kuch_A:=??ReceivedData[5].3;

    Okno_Uchylne1:=??ReceivedData[9].2;
    Okno_Uchylne2:= ?ReceivedData[9].3;
    Okno_Uchylne3:=??ReceivedData[9].4;
    Okno_Uchylne4:=??ReceivedData[9].5;
    END_IF

    0
  • #5 25 Maj 2011 14:08
    michal.konopinski
    Poziom 11  

    Jasne
    Kod poniżej wysyła zapytanie o stan wyjść a następnie wysyła jeden z bajtów z odpowiedzi do expandera PCF 8574 po i2c. Kod napisany w dwa wieczory więc nie jest to jakaś wysoka sztuka programistyczna ale u mnie działa :)
    Kod jest napisany w środowisku Arduino.

    Pozdrawiam
    Michał Konopiński

    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    [/code]

    0
  • #6 14 Cze 2011 08:32
    ser1983
    Poziom 12  

    Dołączam się do tematu. Ja mam trochę bardziej rozszerzony problem. W moim przypadku satel będzie rozbudowany o moduł kontroli dostępu. Potrzebuję wyciągnąć informację o osobie przechodzącej przez przejście i wyświetlenie tego w SCADA. Może ktoś próbował czegoś podobnego? Będę wdzięczny za wszelkie materiały.

    0
  • #7 06 Lip 2011 22:57
    viper_lasser
    Poziom 17  

    @michał.konopinski: W jaki sposób łączysz się z centralka i jakiego typu ?
    Integrę można odpytać tylko i wyłącznie po rs-int czy jednak da się albo poprzez expaner albo jakoś inaczej - np poprzez manipulator (ustawiony w tryb downloading) ?
    Aktualnie mam w domu integre 32 i jedynie jest możliwość dostania się do niej po rs232 (rj12)

    0
  • #8 06 Lip 2011 22:59
    michal.konopinski
    Poziom 11  

    Mam Integre 128WRL i aktualnie łączę się przez manipulator

    0
  • #9 06 Lip 2011 23:09
    viper_lasser
    Poziom 17  

    Nie łączyłem się jeszcze w ten sposób z manipulatorem.
    Mógłbyś udostępnić jakiś schemat kabla pc z manipulatorem ?
    Konieczne jest ustawienie manipulatora w tryb downloading czy nie jest to potrzebne ?
    Udostępnione przez Ciebie źródła działają z każdym manipulatorem ?

    0
  • #10 06 Lip 2011 23:23
    michal.konopinski
    Poziom 11  

    Schemat znalazłem w instrukcji obsługi alarmu, więc pewnie w dokumentacji na stronie satela też będzie.
    Dobre pytanie, mam w trybie downloadingu,
    z ciekawości właśnie wyłączyłem downloading, moje sterowanie dziala nadal, ale na wyświetlaczu pojawiła się informacja o usterce : brak sygnału DTR na porcie RS, ciekawe :)
    Po właczeniu downloadingu usterka ustąpiła. Muszę to kiedyś zbadać dokładnie.
    Ja mam int-klcd-gr, z innymi nie mam jak sprawdzić.

    0
  • #11 06 Lip 2011 23:31
    viper_lasser
    Poziom 17  

    Mówisz o instrukcji od manipulatora czy ogólnie od integry ? Jest tak jakiś konwerter ttl->rs232 ?
    To prawda że ten tryb downloading po zaniku napięcia też jest pamiętany ? Dopiero zworka reset podobno go kasuje ....
    Twoim zdaniem łatwe jest przeniesienie tego kodu z andruino na jakiegoś linuxa do c/c++ ?

    Ustawienia portu komunikacyjnego można zmieniać czy zawsze na 4800 baudów trzeba to ustawić ?
    Jak rozpoznam schemat kabla i format wymiany danych to pobawię się moją integrą :)

    0
  • #12 07 Lip 2011 09:26
    michal.konopinski
    Poziom 11  

    W instrukcji od centrali, konwerter nie jest potrzebny, sygnał jest w standardzie RS232 wiec wystarczy kabelek i dwie wtyczki, o ile dobrze pamiętam to wtyczka od strony manipulatora była w komplecie.
    Nie wiem kiedy resetują się te ustawienia.
    Łatwiej chyba przenieść niż napisać :P
    Tam zawsze jest 4800.

    0
  • #13 07 Lip 2011 11:16
    viper_lasser
    Poziom 17  

    Właśnie przed chwilą pobawiłem się GuardX'em podłączonym po rs232 do portu w centrali - w integrze 32
    Zastanawiam się czy obojętne jest dla Twojego programu na andruino czy to będzie podpięcie do manipulatora czy do portu w centrali ?
    Spróbuję dzisiaj przełożyć ten program do windowsa w codeblocku

    0
  • #14 07 Lip 2011 11:57
    michal.konopinski
    Poziom 11  

    Próbowałem, mi nie działało, poza tym wolę ten port mieć wolny do programowania centrali.
    A docelowo planuję kupić ethm-1 i łączyć się po sieci :)

    0
  • #15 07 Lip 2011 12:38
    viper_lasser
    Poziom 17  

    A próbowałeś może zrobić taki numer żeby z tego portu do manipulatora puścić komunikację przez konwerter rs232/eth ?

    W jaki sposób patrzyłeś co leci na pocie. Odpaliłeś guardx'a i podpatrzyłeś port mon'em czy jakoś inaczej.

    Oficjalnie satel daje tylko dokumentację do modułu int-rs :)

    0
  • #16 07 Lip 2011 15:08
    michal.konopinski
    Poziom 11  

    Komunikacja centrala -> rs/eth -> eth/rs ->guardx pewnie zadziała jeśli konwertery będą przyzwoite.
    Znalazłem jakiś inny program do podglądania tego co się dzieje bezpośrednio na porcie com bo z samej dokumentacji ciężko to wywnioskować, a portmon nie działa na 64-bit Windows. Tzn mnie się nie udało, program napisany na podstawie samej dokumentacji nie działał, źle zrozumiałem o co chodzi z tą synchronizacją :)
    Więcej, niż w pliku z początku wątku, się nie dowiesz z nowszej dokumentacji.

    0
  • #17 07 Lip 2011 17:03
    viper_lasser
    Poziom 17  

    A co to za nowy program do monitoringu na 64 bitowym windowsie ?
    Podpatrzyłeś ramki odpalajać guardx'a ?
    Wydaje mi się że tak chyba najprościej ...

    0
  • #18 07 Lip 2011 21:25
    michal.konopinski
    Poziom 11  

    nie, portmon - to program do monitorowania portów com, nie działa pod win 64bit, a tylko takim systemem wtedy dysponowałem, żeby podglądać guardx-a.

    0
  • #19 07 Lip 2011 21:32
    viper_lasser
    Poziom 17  

    Domyślam się że z 64bitowym windows nie jest łatwo. Pół roku temu używałem przez chwilę 64 bitów ale zrezygnowałem bo sporo aplikacji nie chodziło i stwierdziłem że jeszcze za wcześnie i powróciłem do 32 bitów.

    Możesz się pochwalić co to za program ?
    Którą bibliotekę do obsługi portu szeregowego byś polecił pod c/c++ tak żeby można było bez problemu przeportować aplikację z windowsa na linuxa ?

    0
  • #20 08 Lip 2011 09:26
    michal.konopinski
    Poziom 11  

    Advanced Serial Port Monitor - Trial, bo niestety jest płatny.
    Nie znam takiej biblioteki, obsługę com-a napisałbym bezpośrednio dla każdego z systemów osobno.

    0
  • #22 27 Lip 2011 12:23
    michal.konopinski
    Poziom 11  

    To co znalazłeś to jakaś porażka,
    pod win używasz funkcji CreateFile, SetCommState, SetCommTimeouts, ReadFile, WriteFile itp
    a pod linuxa open,tcsetattr,read,write

    0
  • #23 27 Lip 2011 20:44
    viper_lasser
    Poziom 17  

    Tobie też port com przy ustawieniach 4800,8,N,1 sypał ciągle takimi danymi ?

    00000000: 06 78 9E 66 E6 78 E6 FE | FE 78 E0 00 00 00 00 78 .xžfćxćţţxŕ....x
    00000010: E0 18 E6 7E FE 66 E0 FE | F8 78 FE FE FE F8 80 00 ŕ.ć~ţfŕţřxţţţř€.
    00000020: 00 00 00 1E E6 06 98 FE | 00 86 E0 FE FE 80 E0 00 ....ć.˜ţ.†ŕţţ€ŕ.
    00000030: 00 00 00 80 E0 60 E6 80 | FE 06 F8 1E F8 E6 FE FE ...€ŕ`ć€ţ.ř.řćţţ
    00000040: FE FE FE 98 E0 00 00 00 | 00 66 E6 60 F8 FE FE E0 ţţţ˜ŕ....fć`řţţŕ
    00000050: E6 86 FE FE FE FE 98 E0 | 86 F8 18 F8 00 F8 7E 86 ć†ţţţţ˜ŕ†ř.ř.ř~†
    00000060: 7E 80 06 E0 18 98 78 E6 | 1E 80 60 7E 06 CC 18 F8 ~€.ŕ.˜xć.€`~.Ě.ř
    00000070: FE FE FE FE 00 00 00 00 | 00 7E E6 18 18 9E 86 1E ţţţţ.....~ć..ž†.
    00000080: FE FE FE 18 E0 00 00 00 | 00 80 E6 18 60 66 18 F8 ţţţ.ŕ....€ć.`f.ř
    00000090: FE FE 18 E0 00 00 00 18 | E0 00 86 E6 66 FE 9E F8 ţţ.ŕ....ŕ.†ćfţžř
    000000a0: E6 98 7E F8 FE FE 60 E0 | 00 00 00 00 98 E6 1E 80 ć˜~řţţ`ŕ....˜ć.€
    000000b0: 9E 80 9E 80 FE FE 66 E0 | 00 00 00 00 9E E6 1E 98 ž€ž€ţţfŕ....žć.˜
    000000c0: 7E 86 06 80 FE FE 86 E0 | 00 00 00 00 E0 E6 60 E0 ~†.€ţţ†ŕ....ŕć`ŕ
    000000d0: 7E 9E E6 98 FE FE 80 E0 | 00 00 00 00 E6 E6 60 F8 ~žć˜ţţ€ŕ....ćć`ř
    000000e0: 1E FE 98 86 FE FE E0 E0 | 00 00 06 80 00 00 F8 E6 .ţ˜†ţţŕŕ...€..řć
    000000f0: 98 FE 66 E6 9E 7E 06 FC | FE FE E0 E0 06 80 00 00 ˜ţfćž~.üţţŕŕ.€..

    Jak to wogóle interpretować ?

    0
  • #24 27 Lip 2011 21:02
    michal.konopinski
    Poziom 11  

    Tak, pisałem to w 3 poście, a jak to interpretować masz w pierwszym poście w PDF-ie :)

    0
  • #25 27 Lip 2011 21:07
    viper_lasser
    Poziom 17  

    A to hasło w Twoim programie do czego się tyczy "123456" ?
    Masz może jakąś wersję parsowania tych danych na pc. Narazie jestem jeszcze w trakcie przenoszenia pod c#

    0
  • #26 27 Lip 2011 21:12
    michal.konopinski
    Poziom 11  

    Tam musisz podać hasło jednego z użytkowników, nie napisałem jeszcze nic na pc.

    0
  • #27 28 Lip 2011 23:22
    viper_lasser
    Poziom 17  

    W c# odczytuję już sobie jakąś odpowiedź ale jeszcze daleka droga

    Nie potrafię zrozumieć dlaczego synchronizację uzyskujesz w taki sposób

    if ((lastreadbyte == 0xfe) && (readbyte == 0x55))

    a w dokumentacji piszą że muszą być pod rząd 2 bajty tj. FE FE

    Jak zminiłem sobie w Twoim kodzie FE 55 na FE FE to chociaż wyłapuje mi synchonizację.

    W Twoim kodzie po mojej zmianie synchornizacji jest cos takiego

    if ((lastreadbyte == 0xfe) && (readbyte == 0xfe))
    {
    insync = true;
    toget = 18;
    cnt = 0;
    buf[cnt++] = lastreadbyte;
    buf[cnt++] = readbyte;
    }

    Skąd wiesz że odpowiedz przyjdzie zawsze 18 bajtowa ?


    Zna ktos jakieś gotowe produkty
    Natknąłem się na firmę ibms i coś tam mają.

    0
  • #28 29 Lip 2011 10:37
    michal.konopinski
    Poziom 11  

    Wg dokumentacji jest przynajmniej jedna 0xfe, nie udało mi się odgadnąć kiedy centrala wysyła więcej.
    Ja czekam tylko na ramkę 0x55 dlatego początek ramki to dla mnie 0xfe 0x55,
    mój program wyłapuje tylko ten typ ramek. I dla ramki 0x55 długość jest właśnie 18.

    0
  • #29 03 Sie 2011 08:08
    viper_lasser
    Poziom 17  

    A jak zrobić tak żeby centrala wysyłała tylko ramkę fe fe 55 ?
    U mnie wogole ta ramka nie jest wysyła

    Gdzie mogę znaleść jakąś informację co jest w tych 16 bajtach po odebraniu początku ramki fe fe 55 ?

    0
  • #30 03 Sie 2011 08:32
    michal.konopinski
    Poziom 11  

    Chyba się tak nie da zrobić, ramka 55 jest odpowiedzią na ramkę 78 (patrz mój przykład), a opis masz w pdf-ie w pierwszym poście. Czytałeś tego pdfa? Tam wszystko jest napisane :)

    0