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.