Modbus master (Linux, Qt)

Transkrypt

Modbus master (Linux, Qt)
Politechnika Wrocławska
Systemy mikroprocesorowe projekt
Modbus master (Linux, Qt)
Prowadzący: dr inż. Marek Wnuk
Opracował: Artur Papuda
Elektronika, ARR IV rok
1. Wstępne założenia projektu
Moje zadanie w na tym projekcie polegało na stworzeniu programu
działającego jako obsługa protokołu modbus po stronie komputera czyli mastera.
Protokół modbus działa na zasadzie mastera wydającego rozkazy i slave’a, który te
rozkazy wykonuje. Najbardziej standardowymi komendami tego protokołu są:
-
Read n Registers – odczyt pewnej liczby rejestrów ze Slave’a
-
Write n Registers – zapis pewnej liczby rejestrów ze Slave’a
-
Slave identify – identyfikacja urządzenia Slave
Inne rozkazy najczęściej okazują się zbędne, a często nie zostają nawet
zaimplementowane w niektórych Slave’ach. Dlatego też w tworzonym przeze mnie
modbus masterze zaimlementowałem funkcje Czytaj n rejestrów i zapisz n rejestrów.
Program o którym mówię napisałem pod Linuxa, gdyż takie były założenia. Pod tym
systemem niestety wciąż jest za mało przydatnych programów narzędziowych tego
typu. Poza tym program modbusa może okazać się przydatny w sali robotyki
naszego instytutu. Program modbusa miał działać w systemie okien Linuxa. Dlatego
wykorzystałem bibliotekę QT w wersji 2.3 firmy Troll Tech. Biblioteka ta jest
obiektowo zorientowana na tworzenie okien i używanych w niech gadgetów. Dla
potrzeb instytutu modbus master obsługuje tryb ASCII protokołu modbus. Ważnym
elementem programu powinny być opcje pozwalające na konfigurację parametrów
portu, przez który ma odbywać się transmisja danych. Po pierwsze należało by móc
ustawiać numer portu oraz prędkość transmisji. Innymi ważnymi parametrami obsługi
danych jest parzystość, liczba bitów stopu oraz liczba bitów danych. Ustawianie tych
parametrów za każdym razem dla różnych urządzeń typu Slave, które mogą mieć
transmisję różnego typu, mogło by okazać się dość uciążliwe dlatego pomyślałem o
możliwości wprowadzania ustawień z zewnętrznych plików.
2. Informacje o modbusie
Protokół modbus opiera się o architekturę Master – Slave. Master wydaje
polecenia w postaci ramek, a Slave je wykonuje oraz zwraca odpowiedź Masterowi.
Master wysyła numer rozkazu oraz adres slave’a do którego ten rozkaz jest
kierowany. Na jednej linii szeregowej może być umieszczonych do 247 Slave’ów.
Wszystkie slave’y ignorują rozkaz od mastera jeśli nie został podany ich adres \. Na
rozkaz odpowiada tylko ten slave, którego adres został określony.
Format tamki w trybie ASCII
Adres slave dwu-bajtowy
Kod funkcji dwu-bajtowy
Pole danych – liczba bajtów zależy od ilości przesyłanych danych
Suma kontrolna dwu-bajtowa
CR – kontrola parzystości
LF – liczba bitów stopu – w zależności od kontroli parzystości
Odpowiedź slave’a:
Ramka pochodząca od slave’a zawiera jego adres, kod funkcji którą slave miał
wykonać, następne pola to pola danych lub w przypadku błędu kod funkcji błędu oraz
na samym końcu suma kontrolna i CR, LF.
3. Tworzenie programu:
Całą komunikacje przez port szeregowy oparłem o gotową bibliotekę napisaną
przez pana Grzegorz Pietkiewicza. Takie rozwiązanie pozwoliło mi ułatwić sobie
prace, gdyż nie musiałem martwić się o takie zagadnienia związane z transmisją
przez port szeregowy jak prędkość danych, ich parzystość, liczbę bitów danych i
bitów stopu. Biblioteka ta pozwoliła mi również na wprowadzenie opcji wyboru portu
szeregowego.
Rozwiązania związane z trybem ASCII Modbus’a po stronie tworzonego
mastera pozwoliłem sobie zaczerpnąć z prostego Modbus Mastera działającego w
trybie tekstowym, którego otrzymałem od prowadzącego ten projekt
dr inż. Marka Wnuka.
Część dotyczącą interfejsu oparłem o bibliotekę QT. Stworzyłem trzy okna. W
oknie głównym umieściłem gadgety umożliwiające ustawianie parametrów transmisji
szeregowej, a także obsługę plików konfigurujących te ustawienia. Rozkazy „Write n
reg.” oraz
„Read n reg.” rozwiązałem na zasadzie otwierania nowych okien, w
których można określić jakie rejestry mają zostać odczytane lub zapisane w slave.
Dostęp do tych okien zrobiłem poprzez odpowiednie klawisze umieszczone w oknie
głównym.
4. Instrukcje obsługi programu:
Program uruchamiany jest komendą „ModbusM”. Po uruchomieniu programu
otwiera się przyjazny dla użytkownika interfejs okna głównego. W programie użyłem
języka
angielskiego,
ponieważ
jest
standardowym
językiem
używanym
komputerach.
Okno głowne:
Okno główne, które widzimy powyżej podzielone jest na cztery sekcje oraz
pasek narzedzi.
Pasek narzędzi zawiera trzy klawisze:
-
otwórz –otwiera okno dialogowe pozwalające wybrać plik w którym
zawarte są parametry portu i transmisji danych
-
zapisz –otwiera okno dialogowe pozwalające zapisać do wybranego
pliku aktualnie ustawione parametry programu Modbus Master
-
zamknij –zakończenie programu
w
W sekcji pierwszej możemy ustawiać parametry portu:
-
numer portu [1..4]
-
prędkość transmisji [300..115200]
-
parzystość [0,1,2]
W sekcji drugiej możemy ustawiać parametry Modbus Mastera:
-
numer slave [0..247]
-
czas oczekiwania [1..3]
-
liczba powtórzeń [1..3]
W sekcji trzeciej możemy ustawić parametry transmisji danych:
-
bity danych [7,8]
-
bity stopu [1,2}
Sekcja czwarta to polecenia otwierające nowe okna:
-
klawisz otwierający okno odczytu danych:
-
klawisz otwierający okno zapisu danych:
Okno odczytu danych:
Okno odczytu zawiera cztery sekcje:
Sekcja pierwsza pozwala ustawić, które rejestry mają zostać odczytane
-
początkowy odczytywany rejestr
-
liczba rejestrów do odczytania
W sekcji drugiej możemy ustawić format przychodzących danych:
-
szesnastkowy
-
dziesiętny
Sekcja trzecia odpowiedzialna jest za wysłanie rozkazu odczytu:
-
przycisk wysyłający rozkaz odczytu za każdym jego naciśnięciem
-
przycisk wysyłający rozkaz odczytu w sposób ciągły co krótki okres czasu
-
przycisk zatrzymujący ciągłe odczytywanie
-
przycisk zamykający okno odczytu
Sekcja czwarta jest polem w którym wyświetlane są odczytywane ze slave rejestry
Okno zapisu danych:
Okno podzielone jest na trzy sekcje:
Sekcja pierwsza pozwala na określenie rejestrów, które mają zostać zapisane
-
początkowy rejestr przeznaczony do zapisu
-
liczba rejestrów do zapisu
W sekcji drugiej możemy nadać wartość każdemu z wybranych w sekcji pierwszej
rejestrów:
-
numer rejestru któremu chcemy przypisać nową wartość
-
nowa wartość do zapisania w ustawionym rejestrze
Sekcja trzecia:
-
przycisk wysyłający rozkaz zapisu rejestrów ustawionych we
wcześniejszych sekcjach
-
przycisk zamykający okno zapisu
Odnośnie plików pozwalających na ustawienie parametrów transmisji w programie
„ModbusM”, to są one w formacie ASCII. Poszczególne parametry mają wartość
liczbową i są podzielone spacjami. Ich kolejność jest następująca:
-
Numer portu [1..4]
-
Predkosc portu [300..115200]
-
Parzystość [0,1,2]
-
Bity danych [7,8]
-
Bity stopu [1,2]
-
Numer Slave [0..247]
-
Timeout [1..3]
-
Liczba powtórzeń [1..3]
5. Trudności w realizacji projektu:
Największe trudności sprawiło mi ustalenie techniki liczenia sumy kontrolnej
wymaganej przez ramkę modbusa. Znalazłem w dokumentacji dwa algorytmy
liczenia tej sumy, jednakże oba okazały się wadliwe. Straciłem bardzo dużo czasu
na ustaleniu gdzie jest błąd. I w ostateczności nie udało mi się poprawić tego
błędu. Błędów szukałem w niepoprawnym formacie ramek, które składałem w
swoim programie, jednakże znalazłem go w sumie kontrolnej. Muszę stwierdzić,
że ten projekt kosztował mnie dużo czasu i energii.

Podobne dokumenty