VCOM integracja wirtualnych portów UART w systemie automatyki WAGO I/O

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.

Moduł RS232/RS485 firmy WAGO o symbolu 750-652

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 VCOM jako serwer

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:
ENBOOLWłącza/wyłącza bloczek co jest równoznaczne z otwarcie/zamknięciem portu szeregowego.
REMOTE_IP_ADDRSARRAY[0..4] OF STRINGTablica do której należy wprowadzić zdalne adresy IP pod które bedą wysłane ramki odczytane na porcie szeregowym.
REMOTE_PORTSARRAY[0..4] OF WORDTablica do której należy wprowadzić porty zdalnych hostów(patrzy wyżej).
LOCAL_PORTWORDNumer lokalnego portu UDP/IP serwera.
bCOMPORTBYTENumer portu szeregowego kontrolera Wago, który ma być wykorzystany przez bloczek serwera.
cbBAUDRATECOM_BAUDRATEPrędkość komunikacji na lokalnym porcie szeregowym(patrz opis biblioteki Wago portu szeregowego SerComm.lib).
cpPARITYCOM_PARITYParzystość(patrz opis biblioteki Wago portu szeregowego SerComm.lib).
csSTOPBITSCOM_STOPBITSBity stopu(patrz opis biblioteki Wago portu szeregowego SerComm.lib).
cbBYTESIZECOM_BYTESIZERozmiar bajtu(patrz opis biblioteki Wago portu szeregowego SerComm.lib)..
cfFLOW_CONTROLCOM_FLOW_CONTROLKontrola przepływu(patrz opis biblioteki Wago portu szeregowego SerComm.lib)..
Wyjściowe parametry:Typ:Komentarz:
LAST_ERRORBYTEZmienna 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.

Wirtualny port szeregowy za 220zł, który był przetestowany z bloczkiem client.

Wykorzystanie:

  1. 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).
  2. Otwórz port wywyołując bloczek z EN=TRUE i FB_ACTION=vcomOPEN.
  3. Poczekaj na ENO = TRUE (akcja zakończona).
  4. 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.
  5. 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.
  6. Po zakończeniu komunikacji zamknij port akcją vcomCLOSE.
Nazwa:iHMS_VCOM_CLIENT
Typ:Blok funkcyjny
Wejściowe parametry:Typ:Komentarz:
ENBOOLZbocze rosnące rozpoczyna wykonanie akcji FB_ACTION. ENO = TRUE sygnalizuje zakończenie akcji.
REMOTE_IP_ADDRSTRINGAdres IP zdalnego portu VCOM z którym chcemy się komunikować.
REMOTE_PORTWORDPort UDP/IP zdalnego urządzenia VCOM z którym checmy się komunikować.
LOCAL_PORTWORDNumer lokalnego portu UDP/IP pod który bloczek serwera będzie wysyłał ramki UDP.
FB_ACTIONVCOM_ACTIONAkcja 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_DODWORDIlość bajtów do wysłania(akcja vcomWRITE).
SEND_BUFFERDWORDWskaźnik na bufor danych do wysłania.(zwracany przez wyrażenie ADR(zmienna_bufora))
RECEIVE_BUFFERDWORDWskaźnik na bufor danych do odczytu.(zwracany przez wyrażenie ADR(zmienna_bufora))
Wyjściowe parametry:Typ:Komentarz:
ENOBOOLUstawiana na TRUE po zakończeniu wykonywania aktualnej akcji FB_ACTION. FALSE w trakcie wykonywania zadania.
ERRORBOOLTRUE jeżeli wystapił błąd.
LAST_ERRORBYTEKod 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_DONEDWORDIloś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_CODESTRINGKod aktywacyjny licencji
Wyjściowe parametry:Typ:Komentarz:
ACTIVEBOOLInformuje o stanie aktywacji licencji: TRUE – licencja aktywowana FALSE – brak aktywacji
MAC_ADRARRAY[0..5] OF BYTEZwraca adres MAC urządzenia wymagany do wygenerowania kodu aktywacyjnego.
DEMOBOOLZwraca TRUE, jeżeli jest aktywny tryb demo. Tryb ten jest dostępny przez 30 dni od pierwszego uruchomienia biblioteki.
DEMO_LEFTTIMEZwraca czas, który pozostał do końca trybu demo.
DEMO_DAYS_LEFTDWORDZwraca 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:
ENQBOOLTRUE – aby zapisać się do kolejki FALSE – wypisuje się z kolejki
JOB_DONEBOOLNależy ustawić na TRUE po wykonaniu zadania. Spowoduje to zwolnienie kolejki i ponowne ustawienie się na jej końcu.
BLOCK_IDINTIdentyfikator zadania. Każde oddzielne zadanie powinno wywoływać bloczek ze stałym i unikalnym identyfikatorem.
Wyjściowe parametry:Typ:Komentarz:
MY_TURNBOOLZwraca 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

Zawartość poniższego pliku rar.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *