Ta seria artykułów będzie dotyczyć budowy aplikacji (Windows), która ma za zadanie zarządzać pracą centrali Integra. Wspólnie zajrzymy do uproszczonego protokołu integracji, który dostępny jest w złączu PIN5 manipulatorów INT-KLCD.
Przegląd protokołów integracji dla systemów INTEGRA
Rozróżniamy dwa protokoły integracji. W zależności od potrzeb i sprzętu, jakim dysponujemy:
- rozbudowany protokół (pełne zarządzanie, tj. załączanie/wyłączanie czuwania, blokowanie wejść, statusy i sterowanie wyjściami, pamięć zdarzeń, użytkownicy itd.) – wymaga ETHM-1 lub INT-RS,
- uproszczony protokół (kilka funkcji, tj. załączanie i wyłączanie czuwania, blokowanie wejść, statusy i sterowanie wyjściami, awarie) – dostępny w INT-KLCD w złączu PIN5. Tym protokołem zajmiemy się w ramach artykułu.
Dokumentacja pierwszego dostępna jest na stronie producenta (www.satel.pl), natomiast dokumentacja uproszczonego protokołu (RS-232 w INT-KLCD) do pobrania jest poniżej.
Rozpoczynamy: wstępny przegląd dokumentacji protokołu RS-232 w INT-KLCD
Proponuję ściągnąć powyższy plik PDF. W ramach opisywanego protokołu, rozróżniamy dwa modele ramek transmisyjnych. Stary i nowy protokół. Zajmiemy się starym protokołem, ponieważ jest łatwiejszy w implementacji (2 bajtowa suma kontrolna) i występuje znacznie większa kompatybilność wsteczna. Przesiadka ze starego na nowy protokół polega na wyliczaniu bardziej złożonej sumy kontrolnej (w nowym protokole są to 4 bajty) i kończenia ramki sekwencją bajtów 0xFF, 0x99 (zamiast 0xFF, 0xAA).
Wzór ramki transmisyjnej (bajty w HEX):
| 0xFF | 0xFF | d1 | d2 | … | dn | crc1 | crc2 | 0xFF | 0xAA |
|---|
W powyższej ramce możemy wyróżnić następujące bajty:
- 0xFF, 0xFF – początek ramki
- d1.. dn – dane
- crc1 crc2 – suma kontrolna
- 0xFF, 0xAA – koniec ramki
Jeżeli więc chcemy np. załączyć wyjście w centrali, należy przesłać ramkę w powyższym formacie (o tym jak wysyłać ramki, jakim programem, jakim kablem – napiszę w kolejnej części). W tej części mamy jedną misję – zrozumieć koncepcję tego protokołu.
Przykład 1: Projektujemy ramkę, która załączy czuwanie
Załączenie czuwania:
Spójrzmy w dokumentację: załączenie czuwania to komenda 0x70 (czyli d1 = 0x70)

Aby załączyć czuwanie, należy w ramce (d1 … dn) uwzględnić następujące dane:
- 8 bajtów – w tych bajtach należy przesłać kod, czyli hasło (pozostałe cyfry wypełniamy znakami „A”)
- 4 bajty, czyli 32 bity – strefy do uzbrojenia (na 4 bajtach podajemy, które strefy mają się uzbroić)
- 1 bajt – typ czuwania, tutaj podajemy rodzaj uzbrojenia (0 = tryb pełny, czyli full arm)
Ok, w takim razie do dzieła:
8 bajtów, które opisują hasło
Chcemy posłużyć się hasłem „1111”, więc 8 bajtów w zapisie szesnastkowym (hex) zapisujemy jako:
| Hasło: | 11 | 11 | AA | AA | AA | AA | AA | AA |
|---|
Jeżeli hasło użytkownika to np. 24680, to ramka będzie wyglądała następująco: 24 68 0A AA AA AA AA AA.
4 bajty, które opisują strefę
Następnie należy podać informacje o tym, które strefy chcemy załączyć. Integra obsługuje max. 32 strefy (a więc 32 bity), dlatego możemy podać tę informację w postaci 4 odpowiednio zapisanych bajtów. Schemat obsadzania stref widoczny jest w poniższej tabeli:
Dla pierwszego bajta:
| Numer strefy: | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|---|---|---|
| Bit: | _ | _ | _ | _ | _ | _ | _ | _ |
Dla drugiego bajta:
| Numer strefy: | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 |
|---|---|---|---|---|---|---|---|---|
| Bit: | _ | _ | _ | _ | _ | _ | _ | _ |
Dla trzeciego bajta:
| Numer strefy: | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 |
|---|---|---|---|---|---|---|---|---|
| Bit: | _ | _ | _ | _ | _ | _ | _ | _ |
Dla czwartego bajta:
| Numer strefy: | 32 | 31 | 30 | 29 | 28 | 27 | 26 | 25 |
|---|---|---|---|---|---|---|---|---|
| Bit: | _ | _ | _ | _ | _ | _ | _ | _ |
Załączenie tylko pierwszej strefy będzie wyglądać następująco (pierwszy bajt). Czyli tam, gdzie chcemy załączyć strefę, za „bit” podstawiamy wartość „1”.
| Numer strefy: | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|---|---|---|
| Bit: | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
Pozostałe bity (bajty) będą miały wartość 0. Finalnie, część ramki dotycząca stref (a konkretnie pierwszej strefy), po przekształceniu z zapisu binarnego do zapisu szesnastkowego (hex), będzie miała postać:
| 01 00 00 00 |
|---|
Dla przykładu, załączenie stref 1 i 2 w zapisie bajtowym (hex) to: 03 00 00 00. Tutaj bez wątpienia konieczna jest umiejętność przeliczania liczb zapisanych w formatach binarnych i szesnastkowych. Jeżeli ktoś nie czuje się w tym biegły, to może skorzystać z wbudowanego w system operacyjny kalkulatora. Wystarczy go przestawić do trybu pracy: programista.
1 bajt, który opisuje typ załączenia strefy
Tutaj wystarczy podać tylko 1 bajt, który posiada postać (zgodnie z powyższą tabelą) – 0, 1, 2 lub 3 (zapis dziesiętny). W zapisie szesnastkowym będzie to odpowiednio:
- 00 (tryb 0, pełny)
- 01 (tryb 1)
- 10 (tryb 2)
- 11 (tryb 3)
Jeżeli chcemy załączyć czuwanie w trybie pełnym, to musimy za nasz bajt podstawić wartość 00.
Podsumujmy powyższe informacje. Fragment ramki, który załącza 1 strefę w trybie pełnym i hasłem „1111” wygląda następująco (wartości HEX):
| 70 | 11 | 11 | AA | AA | AA | AA | AA | AA | 01 | 00 | 00 | 00 | 00 |
|---|
A pełna ramka, razem z początkiem, sumą kontrolną i końcem wygląda następująco:
| FF | FF | 70 | 11 | 11 | AA | AA | AA | AA | AA | AA | 01 | 00 | 00 | 00 | 00 | 71 | 00 | FF | AA |
|---|
Wysyłając taki zestaw bajtów do portu RS-232 w manipulatorze INT-KLCD, załączamy czuwanie w strefie 1. Padła tutaj kwestia tzw. sumy kontrolnej.
Co to jest suma kontrolna?
Suma kontrolna to liczba (zestaw liczb), które są obliczane na podstawie danych zawartych w ramce. Urządzenie wysyłające oblicza sumę kontrolną i załącza ją do ramki. Urządzenie odbiorcze (manipulator/centrala) otrzymując ramkę, również oblicza jej sumę kontrolną. Jeżeli obie sumy się zgadzają, tzn., że transmisja przebiegła prawidłowo i nie doszło do przekłamania transmisji.
Sposób, w jaki suma kontrolna jest obliczana to zawsze kwestia indywidualna. Producenci oprogramowania mogą stosować swoje metody na liczenie tych wartości.
Na potrzeby naszej ramki, 2-bajtowa suma kontrolna CRC wynosi : 71 00. To, w jaki sposób należy obliczyć sumę kontrolną, zostanie przedstawione w kolejnej części.
Przykład 2: Projektujemy ramkę, która załączy wyjście
Załączenie wyjścia:
Spójrzmy w dokumentację: załączenie wyjścia to komenda 0x75 (czyli d1 = 0x75)
Aby załączyć wyjście, należy w ramce (d1 … dn) uwzględnić następujące dane:
- 8 bajtów – w tych bajtach należy przesłać kod, czyli hasło (pozostałe cyfry wypełniamy znakami „A”)
- 16 bajtówy, czyli 128 bitów – wyjścia do załączenia (na 16 bajtach podajemy, które wyjścia mają się załączyć)
Ok, w takim razie do dzieła.
8 bajtów, które opisują hasło
Chcemy posłużyć się hasłem „1111”, więc 8 bajtów w zapisie szesnastkowym (hex) zapisujemy jako:
| Hasło: | 11 | 11 | AA | AA | AA | AA | AA | AA |
|---|
16 bajtów, które opisują wyjścia
Następnie należy podać informację o tym, które wyjścia chcemy załączyć. Integra obsługuje max. 128 wyjść (256 w Integrze Plus) i każde wyjście jest reprezentowane przez 1 bit. Dlatego 128 bitów / 8 = 16 bajtów. Schemat obsadzania wyjść w poszczególnych bajtach widoczny jest w poniższej tabeli:
Dla pierwszego bajta:
| Numer wyjścia: | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|---|---|---|
| Bit: | _ | _ | _ | _ | _ | _ | _ | _ |
Dla drugiego bajta:
| Numer wyjścia: | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 |
|---|---|---|---|---|---|---|---|---|
| Bit: | _ | _ | _ | _ | _ | _ | _ | _ |
Dla trzeciego bajta:
| Numer wyjścia: | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 |
|---|---|---|---|---|---|---|---|---|
| Bit: | _ | _ | _ | _ | _ | _ | _ | _ |
Dla czwartego bajta:
| Numer wyjścia: | 32 | 31 | 30 | 29 | 28 | 27 | 26 | 25 |
|---|---|---|---|---|---|---|---|---|
| Bit: | _ | _ | _ | _ | _ | _ | _ | _ |
Dla piątego bajta:
| Numer wyjścia: | 40 | 39 | 38 | 37 | 36 | 35 | 34 | 33 |
|---|---|---|---|---|---|---|---|---|
| Bit: | _ | _ | _ | _ | _ | _ | _ | _ |
Dla pozostałych bajtów (6.. 16) sprawa wygląda analogicznie jak wyżej.
Załączenie tylko np. 8 wyjścia będzie wyglądać następująco (pierwszy bajt). Czyli tam, gdzie chcemy załączyć wyjście, za „bit” podstawiamy wartość „1”.
| Numer strefy: | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|---|---|---|
| Bit: | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Pozostałe bity (bajty) będą miały wartość 0. Finalnie, część ramki dotycząca wyjść (a konkretnie ósmego wyjścia), po przekształceniu z zapisu binarnego do zapisu szesnastkowego (hex), będzie miała postać:
| 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
|---|
Dla przykładu, załączenie wyjść 7 i 8 (jednocześnie) w zapisie bajtowym (hex) to:
| C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
|---|
A jednoczesne załączenie wyjść np. 7,8,9,12,15 to ramka (hex):
| C0 49 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
|---|
Tutaj bez wątpienia konieczna jest umiejętność przeliczania liczb zapisanych w formatach binarnych i szesnastkowych. Jeżeli ktoś nie czuje się w tym biegły, to może skorzystać z wbudowanego w system operacyjny kalkulatora. Wystarczy go przestawić do trybu pracy: programista.
Podsumujmy powyższe informacje. Fragment ramki, który załącza 8 wyjście, z hasłem „1111” wygląda następująco (wartości HEX):
| 75 | 11 | 11 | AA | AA | AA | AA | AA | AA | 80 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
|---|
Do powyższego należy pamiętać o dołożeniu początku (FF FF), końca (FF AA) i 2 bajtowej sumy kontrolnej (przed końcem ramki), która wynosi: F5 08.
Jeżeli w ramce danych (oprócz znaczników początku i końca) pojawi się bajt o wartości: 0xFF, to zaraz po nim powinien być dodatkowo wysłany bajt 0x00. Jest to spowodowane tym, że bajty o wartości „FF” są zarezerwowane dla początku i końca ramki.Jeżeli powyższe nie jest jasne, to nic straconego. W kolejnej części będzie można ściągnąć program, który sam projektuje za nas pełną ramkę i oblicza dla niej sumę kontrolną.
Czas na testy – wysyłamy ramki do centrali
To już jest zadanie na kolejny odcinek tej serii artykułów. Proponuję przejrzeć powyższe ramki i sposoby ich projektowania. Dodam jeszcze, że tak naprawdę człowiek ręcznie tych ramek nie ustala. W docelowym rozwiązaniu programista pisze kod, który za nas projektuje wygląd takich ramek. Temat jednak jest na tyle złożony, że odpuścimy lekcje programowania i skupimy się na gotowych rozwiązaniach. Może jedynie zahaczymy o ten wątek, ale tylko w podstawowym stopniu.
W kolejnej części będziemy wysyłać ramki do centrali. Przyda się centrala Integra z manipulatorem INT-KLCD, przewód USB-RS, program do obsługi portu RS-232 (np. „Bray Terminal”).
Dodaj komentarz
Możliwość komentowania dostępna jest dla zalogowanych użytkowników