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:
- Wykorzystanie tego drivera jest powiązane z zakupem licencji: PmChar. Z wersją freeeware PmFree lub przy opracowywaniu aplikacji (z licencją deweloperską w celach testowania) element ten zawsze funkcjonuje.
- Komunikacja przebiega poprzez Ethernet lub po łączu szeregowym komputera (COM1, COM2 ...).
- Driver jest wbudowany do systemu PROMOTIC przy pomocy obiektu PmComm.

Driver umożliwia wykorzystanie obiektu PmCommMsg. Nie można stosować obiekt PmCommData.

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. Jego wykorzystanie 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 i 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:
Limit czasu 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 Czas limitu 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ści 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 danych 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 limitu czasu 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 byte 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 bzte 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: taka sama 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) - Specjalne obliczenie kontrolne, które jest stosowane na przykład w komunikacji PmSBUS.
- CRC 2 byte IBM [polynom 0xA001 = x16+x15+x2+1, use Modbus]: (Cyclical Redundancy Check) - Specjalne obliczenie kontrolne, które jest stosowane na przykład przez protokół Modbus.
- CRC 2 byte IBM [polynom 0x8005 = x16+x15+x2+1, use DF1]: (Cyclical Redundancy Check) - Specjalne obliczenie kontrolne, które jest stosowane na przykład w komunikacji PmABradleyDF1.
 
Można określić, gdzie zostanie umiejscowiona suma kontrolna:
- na koniec komunikatu (za ETX)
- przed ETX
 
Można określić, 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 typu danych String lecz w danych odebranych może wystąpić znak 00hex (zero binarne). W tym przypadku jest konieczne zamienić znak 00hex za inny znak, albowiem znak 00hex uznaje się za koniec tekstu. Patrz poniższy opis.

Wartość znaku jest wprowadzana w układzie dziesiątkowym, patrz Tabela kodów ASCII.

Opis komunikacji przy pomocy obiektów PmCommMsg

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 do tej zmiennej String trzeba ustawić 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 i Dane-odbiór ustawia wyłącznie część oznaczoną tutaj jako "dane użytkownika".

 
Obiekt PmCommMsg można ustawić dla wiadomości typu Master lub Slave (patrz konfigurator "PmCommMsg > 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 (wg. konfiguratora Transmituj automatycznie) lub za pomocą metody Run.
- Obiekt jest zaszeregowany do wewnątrznej kolejki oczekujących obiektów typu Master (kilka obiektów PmCommMsg 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 (zostanei wywołane zdarzenie onEndOfTransfer). Stosowane w przypadkach, kiedy 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 (jest 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 zostaje wywołane zdarzenie onEndOfTransfer.
 
Transmisja danych tekstowych:
- Jeżeli zamieścisz do zakładki Dane-wysłanie pozycję typu danych String, wtedy długość wiadomości można zmieniać dynamicznie (do 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 wykorzystać 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 wykorzystać metodę Pm.StringFormat (np. w zdarzeniu onBeginOfTransfer).
- Jeżeli w zakładce Dane-odbiór znajduje się pozycja typu danych 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 PmCommMsg.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 typu danych 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 i 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 "#".
© MICROSYS, spol. s r. o.Tavičská 845/21 703 00 Ostrava-Vítkovice