Promotic

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

Przed zastosowaniem tego drivera w aplikacji PROMOTIC należy obejżeć "PROMOTIC wideo kurs 4 - Drivery komunikacyjne".

Podstawowe właściwości drivera:
- Zastosowanie tego drivera wymaga zakup licencji PmChar. Podczas wytwarzania aplikacji w trybie freeware PmFree lub z licencją deweloperską oraz podczas jej testowania w runtime element ten jest zawsze funkcjonalny.
- Komunikacja jest dla Ethernetu (aplikacja PROMOTIC jest klientem) 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 wspiera zastosowanie 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 wiadomości dla Ethernetu:
- Działają tylko do ustawienia "Typ transmisji Ethernet = TCP".
- Driver również podczas tego ustawienia inicjuje połączenie (tzn. jest klientem). Slave wiadomości 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 opis jest znany, na przykład:
- Dataloggery firmy OMEGA, ESC, ..
- Landis&Gyr typ PRV1 oraz PRV2
- ABB CS31
- oraz wiele 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 obiektu PmaComm:

Opis i zalecane wartości dla pozycji Parametry protokołu:
Timeout odbioru odpowiedziWyłącznie dla łącza szeregowego. Ma to sens 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ść odebranej wiadomości zawsze zmieści się do jednego pakietu IP.
Ustawienie to ma wpływ na optymalizację prędkości odczytu jeżeli nie można stosować ETX:
Po odbiorze 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 jeżeli odbierane wiadomości mają zmienną długość (odbierane do wartości 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 poprzez 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 wiadomości (za ETX)
- przed ETX


Można wprowadzić, które dane wiadomości 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 PmBuffer.CalcCheckSum.
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 obiektu PmaCommMsg

Parametry wiadomości:
W 'Dane-wysłanie' jest tylko HexaStringJeżeli jest zaznaczone, wtedy przyjmuje się, że w karcie "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 następująco:
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 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 karty Dane-odbiór.
Do opracowania odebranych danych można zastosować metodę Pm.TransformValue(241).
Wiadomość ta 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 tej 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 kartach 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"). Opis transmisji dla wymienionych typów wiadomości jest następująca:
- Typ Master:
- Transmisja 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 równocześnie).
- Przy rozpoczęciu wykonanywania transmisji zostanie wywołane zdarzenie onBeginOfTransfer. W tym zdarzeniu projektant może na przykład ustawić dane w karcie "Dane-wysłanie" (nie jest to konieczne, jeżeli dane są już ustawione).
- Dane w karcie "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 karcie "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 karcie "Dane-odbiór" są zdefiniowane zmienne, wtedy obiekt oczekuje na odbiór wiadomości 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 karty "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 odbiorze wiadomości 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ść odebranej wiadomości i zostanie sprawdzona wymagana długość danych w poszczególnych obiektach (określona w karcie "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 karty "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 karcie "Dane-wysłanie".
- Jeżeli w karcie "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 karcie "Dane-wysłanie" są zdefiniowane zmienne, wtedy obiekt opracuje dane z tej karty (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 karty "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 binarnych, 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ć obiekt PmFormat (np. w zdarzeniu onBeginOfTransfer).
- Jeżeli w karcie "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 karcie "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 karcie przez wypełnienie konfiguratora "Długość"
- lub można tą pozycję pozostawić nie wypełnioną i przy pomocy metody 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 karcie, wtedy jest odbierana zmienna ilość znaków aż do długości łańcucha tekstowego określonej w powyższy sposób.
Jeżeli pozycja typu String nie jest ostatnią pozycją w karcie, 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 kart 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 "#" posiada wartość 35, patrz Tabela kodów ASCII). Wtedy można odbierać dane tylko do jednej pozycji typu String w której może wystąpić niekiedy znak "#" (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 Ethernetu o konfigurator "Odczytane dane będą zawsze tylko w jednym pakiecie", przy pmocy którego można optymalizować prędkość odczytu krótkich wiadomości.
Pm8.03.13: Uogólnienie dla Ethernetu Slave wiadomości.
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 wartościami (w układzie szesnastkowym) A1, 00, 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
© MICROSYS, spol. s r.o.