Do stworzenia tego oprogramowania skłoniła mnie dość wysoka cena modułów UART instalowanych w systemie WAGO I/O 750-XXX. Na dzień pisania tego posta trzeba zapłacić ponad 1.000,00zł za moduł uniwersalny RS232/RS485 o symbolu 750-652. Można oczywiście prawie za darmo użyć portu do programowania kontrolerów WAGO zwłaszcza jeżeli używamy kontrolerów Ethernet (o tym w innym poście) jednak „jeden port wiosny nie czyni”, zawsze jest ich zbyt mało.
Rozwiązaniem jest stworzona poniższa biblioteka, którą prezentuję wraz z przykładem użycia.
UWAGA!! Większość moich bibliotek wymaga również dodania biblioteki o nazwie iHMS_Util.lib, która miała stanowić pewnego rodzaju zabezpieczenie licencyjne biblioteki głównej, od kiedy zdecydowałem się „uwolnić” to oprogramowanie od kwestii licencyjnych prezentuję wszystkie biblioteki jako otwarte. Zatem obejście tego zabezpieczenia polega na tym, że zmienicie linijkę kodu w bibliotece głównej (w tym przypadku iHMS_VCOM.lib) lub wygenerujecie „wieczysty klucz licencyjny” w kodzie iHMS_Util.lib
Miłej zabawy.
Biblioteka iHMS_VCOM.lib
Biblioteka zawiera bloki funkcjonalne służące do obsługi wirtualnych portów VCOM. Blok serwera umożliwia udostępnianie lokalnych portów COM kontrolera Wago po protokole IP/UDP dla innych zewnętrznych klientów.
Bloczek klienta służy do komunikacji z urządzeniem VCOM udostępniającym port wirtualny w sieci poprzez IP/UDP (sytuacja odwrotna do serwera i według mnie bardziej atrakcyjna).
Bloczek iHMS_VCOM_SERVER
iHMS_VCOM_SERVER jest to bloczek serwera wirtualnego portu COM, który konwertuje pakiety UDP otrzymane z sieci Ethernet(UDP/IP) na ramki portu szeregowego. W drugą stronę dane odczytane na porcie szeregowym są rozsyłane pod skonfigurowane adresy IP.
Nazwa: | iHMS_VCOM_SERVER | |
Typ: | Blok funkcyjny | |
Wejściowe parametry: | Typ: | Komentarz: |
EN | BOOL | Włącza/wyłącza bloczek co jest równoznaczne z otwarcie/zamknięciem portu szeregowego. |
REMOTE_IP_ADDRS | ARRAY[0..4] OF STRING | Tablica do której należy wprowadzić zdalne adresy IP pod które bedą wysłane ramki odczytane na porcie szeregowym. |
REMOTE_PORTS | ARRAY[0..4] OF WORD | Tablica do której należy wprowadzić porty zdalnych hostów(patrzy wyżej). |
LOCAL_PORT | WORD | Numer lokalnego portu UDP/IP serwera. |
bCOMPORT | BYTE | Numer portu szeregowego kontrolera Wago, który ma być wykorzystany przez bloczek serwera. |
cbBAUDRATE | COM_BAUDRATE | Prędkość komunikacji na lokalnym porcie szeregowym(patrz opis biblioteki Wago portu szeregowego SerComm.lib). |
cpPARITY | COM_PARITY | Parzystość(patrz opis biblioteki Wago portu szeregowego SerComm.lib). |
csSTOPBITS | COM_STOPBITS | Bity stopu(patrz opis biblioteki Wago portu szeregowego SerComm.lib). |
cbBYTESIZE | COM_BYTESIZE | Rozmiar bajtu(patrz opis biblioteki Wago portu szeregowego SerComm.lib).. |
cfFLOW_CONTROL | COM_FLOW_CONTROL | Kontrola przepływu(patrz opis biblioteki Wago portu szeregowego SerComm.lib).. |
Wyjściowe parametry: | Typ: | Komentarz: |
LAST_ERROR | BYTE | Zmienna zwraca ostatni kod błędu portu szeregowego odczytany z bloczka do obsługi portu SERCOMM(patrz opis biblioteki Wago portu szeregowego SerComm.lib). |
Bloczek iHMS_VCOM_CLIENT
iHMS_VCOM_CLIENT jest bloczkiem klienckim, który można wykorzystać do komunikacji z urzadzeniem portu szeregowego VCOM innej firmy lub z serwerem iHMS_VCOM_MASTER (w tym ostatnim przypadku na jednym kontrolerze WAGO oprogramowujemy serwer a na drugim klienta.
Dalej sposób wykorzystania jest analogiczny do bloczku portu szeregowego SERCOMM z biblioteki standardowej SerComm.lib co jest dodatkowym atutem funkcjonalnym, gdyż jeżeli już macie jakieś oprogramowanie działające na SERCOMM to łatwo je będzie przystosować do funkcjonowania za pomocą wirtualnego portu gdzieś w internecie.
Wykorzystanie:
- Skonfiguruj zdalny adres IP, port oraz lokalny port UDP/IP. Skonfiguruj zdalny bloczek serwera, aby wysyłał dane pod nasz adres IP (potrzebne stałe IP).
- Otwórz port wywyołując bloczek z EN=TRUE i FB_ACTION=vcomOPEN.
- Poczekaj na ENO = TRUE (akcja zakończona).
- Aby wysłać dane użyj akcji vcomWRITE, aby odczytać dane vcomREAD. Ustaw odpowiednie wskaźniki na bufory odczytu zapisu. Przy wysyłaniu ustaw ilość bajtów do wysłania BYTES_TO_DO.
- Ustaw EN=FALSE, potemTRUE (zbocze rosnące), aby uruchomić akcję. Poczekaj na ENO=TRUE co oznacza, że dane zostały wysłane/odebrane. Zmienna BYTES_DONE zwróci ilość odebranych/wysłanych bajtów.
- Po zakończeniu komunikacji zamknij port akcją vcomCLOSE.
Nazwa: | iHMS_VCOM_CLIENT | |
Typ: | Blok funkcyjny | |
Wejściowe parametry: | Typ: | Komentarz: |
EN | BOOL | Zbocze rosnące rozpoczyna wykonanie akcji FB_ACTION. ENO = TRUE sygnalizuje zakończenie akcji. |
REMOTE_IP_ADDR | STRING | Adres IP zdalnego portu VCOM z którym chcemy się komunikować. |
REMOTE_PORT | WORD | Port UDP/IP zdalnego urządzenia VCOM z którym checmy się komunikować. |
LOCAL_PORT | WORD | Numer lokalnego portu UDP/IP pod który bloczek serwera będzie wysyłał ramki UDP. |
FB_ACTION | VCOM_ACTION | Akcja do wykonania na bloczku: – vcomOPEN: otwarcie portu – vcomCLOSE: zamknięcie portu – vcomREAD: odczyt danych do RECEIVE_BUFFER. Ilość odczytanych danych zostanie zwrócona w zmiennej BYTES_DONE – vcomWRITE: wysłanie danych umieszczonych w RECEIVE_BUFFER. Ilośc należy okreslić w zmiennej BYTES_TO_DO. |
BYTES_TO_DO | DWORD | Ilość bajtów do wysłania(akcja vcomWRITE). |
SEND_BUFFER | DWORD | Wskaźnik na bufor danych do wysłania.(zwracany przez wyrażenie ADR(zmienna_bufora)) |
RECEIVE_BUFFER | DWORD | Wskaźnik na bufor danych do odczytu.(zwracany przez wyrażenie ADR(zmienna_bufora)) |
Wyjściowe parametry: | Typ: | Komentarz: |
ENO | BOOL | Ustawiana na TRUE po zakończeniu wykonywania aktualnej akcji FB_ACTION. FALSE w trakcie wykonywania zadania. |
ERROR | BOOL | TRUE jeżeli wystapił błąd. |
LAST_ERROR | BYTE | Kod błędu: 0 – brak błędu 1 – nie udało się utworzyć instancji gniazdka UDP/IP 2 – niepoprawny zdalny adres IP 3 – błąd zapisu 4 – błąd odczytu 5 – niepoprawne gniazdka UPD/IP(wystapił błąd przy otwieraniu lub nie zostało otwarte – użyj vcomOPEN) 6 – nie udało się otworzyć portu UDP 7 – nie można przełączyć gniazdka UDP/IP w tryb nie blokujący. |
BYTES_DONE | DWORD | Ilośc odczytanych/wysłanych bajtów akcją vcomREAD/vcomWRITE. |
Biblioteka iHMS_Util.lib
Biblioteka zawiera bloczki wykorzystywane przez pozostałe biblioteki i jest wymagana do ich uruchomienia (chyba, że w pozostałych bibliotekach ktoś to zmieni, tak aby nie korzystały z bloczka iHMS_Util). Bloczki nie uwzględnione w dokumentacji są traktowane jako prywatne i nie powinny być wykorzystywane w programach.
Bloczek iHMS_License
Jest to bloczek służący do aktywacji licencji. Od pierwszego uruchomienia biblioteki działają w trybie demo przez 30 dni (chyba, że zmienicie sobie ten stan w bibliotece iHMS_Util_NOPASS.lib (NOPASS – oznacza, że źródła oprogramowania są otwarte). Po upływie tego czasu konieczna jest aktywacja licencji.
Nazwa: | iHMS_License | |
Typ: | Blok funkcyjny | |
Wejściowe parametry: | Typ: | Komentarz: |
ACT_CODE | STRING | Kod aktywacyjny licencji |
Wyjściowe parametry: | Typ: | Komentarz: |
ACTIVE | BOOL | Informuje o stanie aktywacji licencji: TRUE – licencja aktywowana FALSE – brak aktywacji |
MAC_ADR | ARRAY[0..5] OF BYTE | Zwraca adres MAC urządzenia wymagany do wygenerowania kodu aktywacyjnego. |
DEMO | BOOL | Zwraca TRUE, jeżeli jest aktywny tryb demo. Tryb ten jest dostępny przez 30 dni od pierwszego uruchomienia biblioteki. |
DEMO_LEFT | TIME | Zwraca czas, który pozostał do końca trybu demo. |
DEMO_DAYS_LEFT | DWORD | Zwraca liczbę dni do końca trybu demo. |
Bloczek fbBlockQueue
Bloczek wykorzystywany do kolejkowania zadań. Każde zadanie powinno posiadać unikalny identyfikator(BLOCK_ID) w obrębie jednej grupy korzystającej z tej samej instancji bloczka. Mając identyfikator ustawiamy się w kolejkę wywołując bloczek z ENQ=TRUE i BLOCK_ID = nasz identyfikator zadania. Po każdym wywołaniu bloczka sprawdzamy stan zmiennej MY_TURN, która przyjmie wartość TRUE jeżeli jest nasza kolej na wykonanie zadania. Po wykonaniu zadania wywołujemy bloczek z JOB_DONE=TRUE w celu zwolnienia kolejki i ponownego przejścia na jej koniec.
Nazwa: | fbBlocksQueue | |
Typ: | Blok funkcyjny | |
Wejściowe parametry: | Typ: | Komentarz: |
ENQ | BOOL | TRUE – aby zapisać się do kolejki FALSE – wypisuje się z kolejki |
JOB_DONE | BOOL | Należy ustawić na TRUE po wykonaniu zadania. Spowoduje to zwolnienie kolejki i ponowne ustawienie się na jej końcu. |
BLOCK_ID | INT | Identyfikator zadania. Każde oddzielne zadanie powinno wywoływać bloczek ze stałym i unikalnym identyfikatorem. |
Wyjściowe parametry: | Typ: | Komentarz: |
MY_TURN | BOOL | Zwraca TRUE – jeżeli jest nasza kolej na wykonanie zadania. Po wykonaniu zadania należy wywołać bloczek ze zmienną JOB_DONE ustawioną na TRUE w celu zwolnienia kolejki. |
Prezentowane przeze mnie oprogramowanie posiada otwarte źródła i może być wykorzystywane dowolnie bez mojego zezwolenia. Nie odpowiadam za szkody wynikłe z jego wykorzystywania.
Jeżeli uzyskane z tej strony informacje okażą się dla Was przydatne (może ułatwią Waszą pracę) zapraszam do postawienia mi kawy na: https://buycoffee.to/averon.pl