W tym artykule postaram się przedstawić w sposób interesujący przykład wykorzystania języka wysokiego poziomu, jakim jest C++ w naszej branży. W tym przykładzie razem z Qt zostanie zaprzęgnięty do wizualizacji danych, pobranych ze sterownika Siemensa. Qt to wieloplatformowy zestaw narzędzi i bibliotek do tworzenia aplikacji z graficznym interfejsem użytkownika. Całość przedstawiłem w trzech filmach umieszczonych w dalszej części artykułu.
Na wstępie artykułu podaje dwa linki:
- Kod źródłowy biblioteki w Qt C++ do komunikacji ze sterownikiem S7plc;
- Kod źródłowy prostego programu testowego dla wyżej wymienionej biblioteki;
Na bazie tych linków chciałbym zaprezentować mój sposób na małe wizualizacje pisane w C++. Zdjęcie poniżej przedstawia blok danych do zwizualizowania.
1. Objaśnienie kodu źródłowego programu testowego
Program testowy dla biblioteki ma za zadanie odczytywać blok danych ze sterownika PLC i wyświetlić na formatce wartości z poszczególnych jego pól. W pliku nagłówkowym aplikacji stworzyłem strukturę, która odzwierciedla mapę bloku danych, który to blok będziemy wizualizować.
Konstruktor klasy okna głównego aplikacji:
Funkcja „plcQtLib” (linia nr9) – tworzenie obiektu bibliotecznego PLC. Po odczytaniu danych ze sterownika PLC zgłosi sygnał do aplikacji.
- „192.168.0.10” – adres ip sterownika PLC;
- 1 – numer Bloku danych który chcemy odczytać;
- sizeof(db) – rozmiar bloku danych;
- (unsigned char*)&db – przekazanie do biblioteki wskaźnika na strukturę bloku danych;
- kolejne parametry to Slot (2), Rak(0). Slot i Rak zależą od sterownika PLC. Parametry te są do odczytania w konfiguracji hardware (step tiaportal). Dla przykładu S7-300 miało te parametry 2,0 , a S7-1500 1,0. Kolejnym parametrem jest i odstęp w milisekundach, między kolejnymi zapytaniami do sterownika (w wątku jest funkcja oczekująca „QThread::msleep(sleepTime) „);
Funkcja „connect ” (linijka nr 10):
- Obiekt biblioteczny „PLC” po prawidłowym odpytaniu sterownika wyemituje sygnał „dataReady”. Ten sygnał łączymy z funkcją „readedData()”. Funkcja zaktualizuje wizualizacje o nowo pobrane dane. Pamiętać należy, że w S7 bajty są w odwrotnej kolejności niż w PC. Stąd konieczność wywołania funkcji konwertujących.
Funkcja „connect” (linijka nr 11):
- Biblioteka pracuje w wątku, jeśli z jakiegoś powodu zostanie zerwane połączenie, lub wątek się zakończy biblioteka spróbuje ponownie nawiązać połączenie ze sterownikiem.
Funkcja „connect” (linijka nr12):
- informacja o zmianie statusu połączenia. W przypadku braku połączenia z PLC wygasza interface
2. Test biblioteki na Raspberry Pi
Poniżej filmik pokazujący jak skompilować bibliotekę i program testowy na komputerku Raspberry Pi.
3. Test biblioteki na tablet/telefon z Androidem
Kompilacja biblioteki oraz programu testowego na telefon z Androidem.
4. Test biblioteki na komputerze PC z systemem WINDOWS
Krótki Filmik prezentujący test biblioteki na komputerze z Windows.
5. Czy warto pisać wizualizacje w C++?
Czasami, gdy komputer już jest do dyspozycji a liczba danych do zwizualizowania jest niewielka myślę, że można się pokusić o napisanie programu w C++. Nie sposób również nie docenić elastyczności jaką daje użycie klasycznego pc i języków wysokiego poziomu do programowania wizualizacji.
Artykuł został nagrodzony w Konkursie iAutomatyka – edycja Lipiec 2019
Nagrodę Zasilacz EPSITRON + klucz do szaf + zestaw gadżetów dostarcza ambasador konkursu, firma WAGO. |