Promotic
WikipediaLinkedInYoutubeTwitterFacebook

PmChar - Driver do komunikacji przy pomocy ASCII/BIN protokołu zdefiniowanego przez użytkownika

Przed zastosowaniem tego drivera w aplikacji PROMOTIC należy zaznajomić się z rozdziałem: Komunikacja przy pomocy driverów PROMOTIC.
 
Podstawowe właściwości drivera:
- Zastosowanie tego drivera wymaga zakup licencji PmChar. Z wersją freeeware PmFree lub przy opracowywaniu aplikacji (z licencją deweloperską w celach testowania) element ten zawsze funkcjonuje.
- Komunikacja przebiega dla Ethernet-klienta lub dla łącza szeregowego (COM1, COM2 ...) (dla Ethernet-serwera jest przeznaczony driver komunikacyjny PmCharServer).
- Driver jest wbudowany do systemu PROMOTIC przy pomocy obiektu PmaComm.

Driver umożliwia wykorzystanie obiektu PmaCommMsg. Obiekt PmaCommGroup nie można zastosować.

Dla łatwego dodania tego drivera do aplikacji jest dogodne zastosować: Konfiguracje wstępne w grupie "PmChar Konfigurowalny protokół"

 
Driver jest proste oraz mocne narzędzie do komunikacji określonym przez użytkownika protokołem. Jest przeznaczony przedze wszystkim do komunikacji, do których nie trzeba stosować specjalistycznych protokołów komunikacyjnych.

Zastosowanie drivera jest więc zwłaszcza odpowiednie dla:

- komunikacji bardzo prostych.
- komunikacji orientowanych tekstowo lub binarnie.
- prób i testowania.
 
Driver umożliwia wykorzystanie jak wiadomości typu Master, tak również wiadomości typu Slave.
Slave powiadomienia dla Ethernetu:
- Działają tylko dla ustawienia "Typ transmisji Ethernet = TCP".
- Driver również podczas tego ustawienia inicjuje połączenie (tzn. jest klientem). Slave powiadomienia oczekiwują na odbiór dopiero po nawiązaniu połączenia z serwerem.
 
Przy pomocy drivera PmChar można komunikować się z całym szeregiem urządzeń i sterowników PLC, których protokół jest prosty i jest znany, na przykład:
- Dataloggery firmy OMEGA, ESC, ..
- Landis&Gyr typ PRV1 oraz PRV2
- ABB CS31
- i dużo innych
 
Driver PmChar nie jest przeznaczony do emulacji bardziej złożonych protokołów (wymagających na przykład dotrzymywania dokładnych stosunków czasowych na linii komunikacyjnej, niestandardowe sterowanie na bieżąco sygnałów modemowych, itd.). Z zadowoleniem doradzimy Ci przy podejmowaniu decyzji, czy do danego protokołu można wykorzystać driver PmChar; prosimy o kontakt! (sw-support@microsys.cz).
 

Zalecone wartości parametrów:

Opis i zalecane wartości dla pozycji Parametry protokołu:
Timeout odbioru odpowiedziWyłącznie dla łącza szeregowego. Ma znaczenie tylko w wiadomościach typu Master. Okres czasu (w milisekundach) w którym driver będzie oczekiwać na odpowiedć po odesłaniu wiadomości. Jeżeli do tego czasu nie zostanie odebrana żadna odpowiedć, wtedy transmisja wiadomości zostanie zakończona (zostanie wywołane zdarzenie onEndOfTransfer z błędem 24 lub 66).
Odczytane dane będą zawsze tylko w jednym pakiecieWyłącznie dla Ethernetu.

Jeżeli jest zaznaczone, wtedy zakłada się, że cała zawartość odczytanej wiadomości zawsze zmieści się do jednego pakietu IP.

Ustawienie to ma wpływ na optymalizację prędkości odczytu w przypadku, że nie można stosować ETX:

Po odczycie jednego pakietu zostanie on zawsze zakończony bez oczekiwania na timeout (określony w konfiguratorze "Timeout transmisji jednego pakietu [ms]").

Wielkość pakietów określa dana sieć. Może to być np. 521 bajtów, 1024 bajtów itd.

Stosuj STXOkreśla, czy dany protokół stosuje specjalny znak oznaczający początek transmisji. Jeżeli stosowanie znaku początkowego wiadomości jest włączone, wtedy przed wysłaniem danych zdefiniowanych przez użytkownika zostaje automatycznie wysłany znak początku transmisji. I odwrotnie, przy każdym odbiorze danych zostaje przeprowadzony test, czy na początku wiadomości znajduje się znak początku transmisji. W przypadku braku tego znaku, wiadomość komunikacyjna zostaje zakończona z błędem.
Wartość STXOkreśla wartość ASCII znaku początku transmisji (znak początku transmisji ma zazwyczaj wartość 2).
Stosuj ETXOkreśla, czy dany protokół wykorzystuje specjalny znak oznaczający koniec transmisji. Jeżeli jest włączone wykorzystanie znaku końcowego, wtedy za danymi definiowanymi przez użytkownika zostaje automatycznie wysłany znak końca wiadomości. I odwrotnie, przy odbiorze wiadomości przebiega test, czy na końcu wiadomości znajduje się znak końca wiadomości. W przypadku jego braku odbiór wiadomośći komunikacyjnej kończy się błędem. Zastosowanie znaku ETX optymalizuje szybkość odbioru w przypadku, kiedy odbierane wiadomości mają zmienną długość (odbierane wiadomości są typu String). Bezpośrednio po odbiorze znaku ETX system uważa wiadomość za zakończoną (ewentualnie oczekuje tylko znaki sumy kontrolnej) i szybko zakończy odbiór, zamiast oczekiwania timeoutu między odbiorem dwu znaków.
Wartość ETXOkreśla wartość ASCII znaku końca transmisji (znak końca transmisji ma zazwyczaj wartość 3).
Suma kontrolnaOkreśla sposób obliczenia sumy kontrolnej:
- żadna: komunikacja bez sumy kontrolnej.
- XOR 1 byte: Jest zastosowana suma kontrolna typu XOR (chodzi o tzw. pionową kontrolę parzystości). Ma wielkość 1 bajt i matematycznie jest to XOR wszystkich bajtów, które są zagarnięte do sumy kontrolnej.
- SUM 1 byte: Jest zastosowana suma kontrolna typu suma. Ma wielkość 1 bajt i matematycznie jest to suma arytmetyczna wszystkich bajtów, które są zagarnięte do sumy kontrolnej (obcięte do 1 bajta).
- SUM 2 byte: tak samo jak "SUM 1 byte" lecz ma wielkość 2 bajtów (obcięta na 2 bajty).
- CRC 2 byte CCITT [polynom 0x1021 = x16+x12+x5+1, use SBUS]: (Cyclical Redundancy Check) - Specjalna suma kontrolna, która jest stosowana na przykład w komunikacji PmSBUS.
- CRC 2 byte IBM [polynom 0xA001 = x16+x15+x2+1, use Modbus]: (Cyclical Redundancy Check) - Specjalna suma kontrolna, która jest stosowana na przykład przez protokół Modbus.
- CRC 2 byte IBM [polynom 0x8005 = x16+x15+x2+1, use DF1]: (Cyclical Redundancy Check) - Specjalna suma kontrolna, która jest stosowana na przykład w komunikacji PmABradleyDF1.
 
Można wprowadzić, gdzie zostanie umiejscowiona suma kontrolna:
- na koniec komunikatu (za ETX)
- przed ETX
 
Można wprowadzić, które dane mają zostać zagarnięte do sumy kontrolnej:
- Wszystkie dane przed sumą kontrolną
- Wszystkie dane przed sumą kontrolną z wyjątkiem pierwszego znaku (z wyjątkiem STX)
- Wszystkie dane przed sumą kontrolną z wyjątkiem ostatniego znaku (z wyjątkiem ETX)
- Wszystkie dane przed sumą kontrolną z wyjątkiem pierwszego i ostatniego znaku (z wyjątkiem STX i ETX)
 
Jeżeli suma kontrolna jest stosowana, wtedy jest automatycznie wysyłana. I odwrotnie, przy każdym odbiorze danych przebiega kontrola, czy na końcu wiadomości znajduje się poprawna suma kontrolna. W przypadku braku poprawnej sumy kontrolnej wiadomość zostanie zakończona błędem.

Obliczenie sumy kontrolnej można wykonać także przy pomocy metody Pm.ArrayOper.

Stosować zamianę znaków w odebranych danychmożna zaktywować, jeżeli w odbieranych danych chcesz zamienić rzeczywiście odebrany znak za inny znak. Najczęściej wykorzystuje się w przypadku, kiedy chcesz odebrane dane zapisać do wartości typu String lecz w danych odebranych może wystąpić znak 00hex (zero binarne). W tym przypadku jest konieczne zamienić znak 00hex za inny znak, ponieważ znak 00hex uznaje się za koniec tekstu. Patrz poniższy opis.

Wartość znaku określa się w układzie dziesiątkowym, patrz Tabela kodów ASCII.

Opis komunikacji przy pomocy obiektów PmaCommMsg

Parametry wiadomości:
W 'Dane-wysłanie' jest tylko HexaStringJeżeli jest zaznaczone, wtedy przyjmuje się, że w zakładce "Dane-wysłanie" występuje tylko jedna zmienna typu String. Zawartością tej zmiennej jest tzw. HexaString, przy pomocy którego można typie String przekazywać dowolne wartości binarne w następujący sposób:

Na przykład jeżeli mają zostać przesłane 4 bajty o wartościach binarnych 01 A0 00 B3 (w układzie szesnastkowym), wtedy jest konieczne ustawić do tej zmiennej typu String wartość "01A000B3" - tzn. tekst o długości 2*4=8 znaków. W ten prosty sposób można przesyłać również dane, które zawierają także binarne zera, które w wartości typu String nie mogą występować.

Do przygotowania wysyłanych danych można zastosować metodę Pm.TransformValue(240).

W 'Dane-odbiór' jest tylko HexaStringTo samo jak poprzedni konfigurator, tylko dla zakładki Dane-odbiór.

Do opracowania odebranych danych można zastosować metodę Pm.TransformValue(241).

Wiadomość będzie wykorzystywać następujące parametry (zamiast tych, które są zdefiniowane w parametrach protokołu)(tylko dla wiadomości typu Master) Jeżeli jest zaznaczone, wtedy są wyświetlone takie same konfiguratory jak w przypadku parametrów protokołu (czy stosować znaki STX, ETX oraz czy stosować sumę kontrolną). Te parametry są stosowane w czasie transmisji danej wiadomości zamiast parametrów protokołu.
 
Rzeczywiście przyjęte/odebrane dane mają więc na przykład wygląd:
[STX] "dane użytkownika" [ETX] [suma kontrolna]

Notatka: Części w nawiasach są opcjonalne przy pomocy wyżej przedstawionych parametrów. Projektant przy tym w zakładkach Dane-wysłanie oraz Dane-odbiór ustawia wyłącznie część oznaczoną tutaj jako "dane użytkownika".

 
Obiekt PmaCommMsg można ustawić dla wiadomości typu Master lub Slave (patrz konfigurator "PmaCommMsg > Parametry > Typ wiadomości"). Kolejność transmisji dla wymienionych typów wiadomości jest następująca:
- Typ Master:
- Komunikacja danego obiektu jest uruchomiona albo automatycznie (według konfiguratora "Transmituj automatycznie") lub przy pomocy metody Run.
- Obiekt jest zaszeregowany do wewnątrznej kolejki oczekujących obiektów typu Master (kilka obiektów PmaCommMsg może wymagać transmisji danych w jednej chwili).
- Przy rozpoczęciu wykonanywania transmisji zostanie wywołane zdarzenie onBeginOfTransfer. W tym zdarzeniu projektant może na przykład ustawić dane w zakładce "Dane-wysłanie" (nie jest to konieczne, jeżeli dane są już ustawione).
- Dane z zakładki Dane-wysłanie zostaną opracowane (np. zostanie wykonana konwersja z HexaString do formy binarnej, zostaną dodane znaki STX, ETX lub suma kontrolna).
- Opracowane dane zostaną wysłane poprzez Ethernet lub po łączu szeregowym komputera.
- Jeżeli w zakładce "Dane-odbiór" nie ma żadnych zmiennych, wtedy transmisja zostanei zakończona (zostanie wywołane zdarzenie onEndOfTransfer). Stosowane jeżeli druga strona nie wysyła odpowiedzi.
- Jeżeli w zakładce "Dane-odbiór" są zdefiniowane zmienne, wtedy obiekt oczekuje na odbiór danych z drugiej strony.
- Po odbiorze wiadomości odebrane dane zostaną skontrolowane i opracowane (kontrola czy na przykład jest poprawny znak STX, ETX, poprawność sumy kontrolnej. Jeżeli jest ustawione, wtedy zostanie wykonana konwersja do HexaString), i opracowane dane zostaną zapisane do zakładki "Dane-odbiór" oraz zostanie wywołane zdarzenie onDataReceive.
- zostanie wywołane zdarzenie onEndOfTransfer.
- Typ Slave:
- Obiekt oczekuje na odbiór danych z drugiej strony. W czasie transmisji wiadomości typu Master odbiór wiadomości typu Slave zostaje "zablokowany", tzn. wiadomości typu Master mają pierwszeństwo.
- Po odviorze z drugiej strony zostanie określone, do którego obiektu typu Slave należą odebrane dane. Jeżeli istnieje tylko jeden obiekt typu Slave, wtedy odebrane dane są mu przekazywane, w innym przypadku decyzja jest podejmowana następująco:

Zostanie określona długość odebranych danych i zostanie sprawdzona wymagana długość danych w poszczególnych obiektach w zakładkach Dane-odbiór. Odebrane dane są przydzielona do obiektu, którego wymagana długość jest równa (lub najbliższa większa) długości odebranej wiadomości. Jeżeli istnieją dwa obiekty o tej samej długości wymaganych danych, wtedy odebrane dane są przydzielane do pierwszego obiektu - i obiekt ten zostanie przesunięty na koniec i kolejna wiadomość zostanie przydzielona do drugiego obiektu, itd.

- Po zapisaniu odebranych danych do zakładki "Dane-odbiór" odpowiedniego obiektu zostanie wywołane zdarzenie onDataReceive. W tym miejscu projektant może na podstawie odebranych danych ustawić dane do wysłania w zakładce "Dane-wysłanie".
- Jeżeli w zakładce "Dane-wysłanie" nie ma żadnych zmiennych, wtedy transmisja zostaje zakończona (zostanie wywołane zdarzenie onEndOfTransfer). Jest stosowane, jeżeli PROMOTIC nie ma przesyłać odpowiedzi drugiej stronie.
- Jeżeli w zakładce "Dane-wysłanie" są zdefiniowane zmienne, wtedy obiekt opracuje dane z tej zakładki (np. dokona konwersji z HexaString do formy binarnej, zostają dodane znaki STX, ETX lub suma kontrolna) i opracowane dane są przesłane drugiej stronie.
- Po wysłaniu danych zostanie wywołane zdarzenie onEndOfTransfer.
 
Transmisja danych tekstowych:
- Jeżeli zamieścisz do zakładki "Dane-wysłanie" pozycję typu String, wtedy długość wiadomości można zmieniać dynamicznie (do wartości typu String można przyszeregować tekst o zmiennej długości).
- Jeżeli jest ustawiony konfigurator "W 'Dane-wysłanie' jest tylko HexaString", wtedy wysłany tekst podczas transmisji zostanie skonwertowany do danych binarncyh, których wielkość (w bajtach) jest równa połowie długości tekstu. Odpowiednie dla komunikacji orientowanych binarnie. Do łatwego wytworzenia wartości HexaString można zastosować metodę Pm.TransformValue(240) (np. w zdarzeniu onBeginOfTransfer).
- Jeżeli nie jest ustawione, wtedy zostanie wysłany tekst bez konwersji. Odpowiednie dla komunikacji orientowanych tekstowo. Do łatwego wytworzenia naformatowanego tekstu można zastosować metodę Pm.StringFormat (np. w zdarzeniu onBeginOfTransfer).
- Jeżeli w zakładce "Dane-odbiór" znajduje się pozycja typu String, wtedy można odbierać wiadomości o zmiennej długości.
- Jeżeli jest ustawiony konfigurator "W 'Dane-odbiór' jest tylko HexaString", wtedy odebrane dane są konwertowane do HexaString (będą mieć dwukrotną wielkość niż długość odebranych danych binarnych w bajtach). Odpowiednie dla komunikacji orientowanych binarnie. Do łatwego opracowania wartości HexaString można zastosować metodę Pm.TransformValue(241) (np. w zdarzeniu onEndOfTransfer).
- Jeżeli nie jest ustawione, wtedy odebrany tekst jest zapisany bez konwersji. Odpowiednie dla komunikacji orientowanej tekstowo. Do łatwego opracowania tekstu można zastosować metodę Pm.StringScan (np. w zdarzeniu onEndOfTransfer).

Dla pozycji typu String jest konieczne określenie długości danych w zakładce "Dane-odbiór" (żeby driver podczas odbioru rozpoznał jaką maksymalną ilość znaków powinien oczekiwać). To można wykonać na dwa sposoby:

- bezpośrednio w zakładce przez wypełnienie konfiguratora "Długość"
- lub można tą pozycję pozostawić nie wypełnioną i przy pomocy właściwości PmaCommMsg.ReadVars przed uruchomieniem wiadomości wpisać do pozycji typu String łańcuch o wymaganej długości.

Jeżeli pozycja typu String jest ostatnią pozycją w zakładce, wtedy jest odbierana zmienna ilość znaków do długości łańcucha określonej w powyższy sposób.

Jeżeli pozycja typu String nie jest ostatnią pozycją w zakładce, wtedy do danej pozycji odbierana jest ilość znaków dokładnie odpowiadająca długości łańcucha określonej w wyżej wymieniony sposób.

 
Transmisja danych binarnych:

Częstym problemem jest odbiór danych, gdzie występuje także binarna wartość 0 (dalej 00hex). Bezpośredni odbiór takich wiadomości do wartości typu String nie będzie działać poprawnie, ponieważ String jest zawsze interpretowany jako tekst zakończony znakiem 00hex. Więc dane zostaną odebrane, lecz dostępne będą wyłącznie znaki do pierwszej wartości 00hex. Dostępne są następujące rozwiązania:

- Odbiór danych binarnych z konwersją do HexaString (patrz konfiguratory W 'Dane-wysłanie' jest tylko HexaString oraz W 'Dane-odbiór' jest tylko HexaString). Jest to najbardziej ogólny sposób i można tak dynamicznie przekazywać za pomocą tekstu dowolne dane binarne. Patrz powyższy opis.
- lub do zakładek Dane-wysłanie lub Dane-odbiór nie wprowadzać zmiennych typu String lecz bezpośrednio wprowadzić zmienne typu Byte, Integer, itd. Jednak ten sposób nie umożliwia dynamicznie zmieniać wielkości nadawanych czy odbieranych danych.
- lub wykorzystać konfigurator "Stosować zamianę znaków w odebranych danych", w którym można ustawić, że odebrany znak 00hex ma zostać zastąpiony na przykład znakiem "#" - jeżeli wiadomo, że znak "#" nie występuje w danych (znak "#" ma wartość, patrz Tabela kodów ASCII). Wtedy można odbierać dane tylko do jednej pozycji typu String w której może wystąpić niekiedy wartość "#" (zamiast 00hex). Taki tekst można dalej opracowywać (np. w zdarzeniu onEndOfTransfer) na przykład przy pomocy VBScript funkcji Split, która rozdzieli dany tekst według ważnego znaku rozdzielenia "#".

Historia:
Pm9.00.02: Usunięty błąd: Podczas zamykania portu nie została poprawnia zakończona wiadomość typu Slave.
Pm8.03.27: Usunięty błąd: Dla Etnernet TCP nie działały wiadomości typu Slave.
Pm8.03.24: Usunięty błąd: Jeżeli w trakcie połaczenia Ethernet doszło do awarii, wtedy driver przestał działać.
Pm8.03.22: Uogólnienie parametrów protokołu dla Ethernet o konfigurator "Odczytane dane będą zawsze tylko w jednym pakiecie", przy pmocy którego można optymalizować prędkość odczytu krótkich powiadomień.
Pm8.03.13: Uogólnienie dla Ethernetu Slave powiadomienia.
Pm8.01.02: Uogólnienie o możliwość odbioru danych binarnych do wartości typu HexaString (chodzi o String z zawartością danych binarnych - na przykład 3 bajty z szestastkowymi wartościami A1, 00 oraz 4B zostaną zapisane do łańcucha o 2*3 znakach "A1004B"). Obecnie można więc w prosty i ogólny sposób nadawać i odbierać dowolne dane binarne.

Patrz nowe konfiguratory W 'Dane-wysłanie' jest tylko HexaString oraz W 'Dane-odbiór' jest tylko HexaString.

Pm8.00.02: Usunięty błąd: suma kontrolna w niekórych przypadkach została źle obliczona
Pm7.01.00: teraz wspiera również komunikację poprzez Ethernet
© MICROSYS, spol. s r. o.Tavičská 845/21 703 00 Ostrava-Vítkovice