Tải bản đầy đủ (.pdf) (100 trang)

Xây dựng mạng truyền thông công nghiệp Modbus RTU bằng ngôn ngữ Python trên máy tính nhúng Linux

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (11.02 MB, 100 trang )

ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC BÁCH KHOA

PHẠM NGỌC CƯỜNG

XÂY DỰNG MẠNG TRUYỀN THÔNG CÔNG NGHIỆP
MODBUS RTU BẰNG NGÔN NGỮ PYTHON
TRÊN MÁY TÍNH NHÚNG LINUX

LUẬN VĂN THẠC SĨ
KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA

Đà Nẵng – Năm 2017


ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC BÁCH KHOA

PHẠM NGỌC CƯỜNG

XÂY DỰNG MẠNG TRUYỀN THÔNG CÔNG NGHIỆP
MODBUS RTU BẰNG NGÔN NGỮ PYTHON
TRÊN MÁY TÍNH NHÚNG LINUX

Chuyên ngành: Kỹ thuật điều khiển và tự động hóa
Mã số: 60520216

LUẬN VĂN THẠC SĨ

NGƯỜI HƯỚNG DẪN KHOA HỌC:
TS Trần Đình Khôi Quốc



Đà Nẵng – Năm 2017


i

LỜI CAM ĐOAN
Tôi cam đoan đây là công trình nghiên cứu của tôi.
Các số liệu, kết quả nêu trong luận văn là trung thực và chưa từng được ai công bố
trong bất kỳ công trình nào khác.

Đà Nẵng, ngày 25 tháng 12 năm 2017
Tác giả luận án

PHẠM NGỌC CƯỜNG


ii

TÓM TẮT LUẬN VĂN
XÂY DỰNG MẠNG TRUYỀN THÔNG CÔNG NGHIỆP MODBUS RTU
BẰNG NGÔN NGỮ PYTHON TRÊN MÁY TÍNH NHÚNG LINUX

Học viên: Phạm Ngọc Cường
Mã số: 60.52.50

Chuyên ngành: Kỹ thuật điều khiển và tự động hóa

Khóa: K33.TĐH(PFIEV) Trường Đại học Bách khoa - ĐHĐN


Tóm tắt - Hiện nay, máy tính nhúng công nghiệp đang được dùng để làm các thiết bị đầu cuối
trong các mạng cục bộ công nghiệp. Tuy nhiên khi sử dụng máy tính trong mạng THCN cần có
phần cứng ngoài: các module/card xử lý dữ liệu ngoài như Modbus, Profibus…hoặc phần mềm từ
đối tác thứ 3, đó là driver để điều khiển và các phần mềm, mã nguồn để thực hiện các giao thức. Đề
tài này tìm hiểu mạng Modbus RTU và các ngăn xếp của nó được tìm hiểu từ đó xây dựng bằng
ngôn ngữ Python trên nền tảng máy tính Banana Pro nhúng hệ điều hành Linux. Dựa theo cách
thức hoạt động tiêu chuẩn của mạng công nghiệp Modbus RTU, đề tài này nghiên cứu thuật toán để
xây dựng các lớp hướng đối tượng nhằm truyền nhận dữ liệu và xử lý dữ liệu truyền thông nối tiếp.
Theo đó, các thuật toán giúp tạo khung truyền, nhận khung truyền, sinh ra giá trị kiểm thử CRC,
các mã ngoại lệ,... sẽ được xây dựng chính xác và viết bằng ngôn ngữ Python. Đề tài này góp phần
làm giảm giá thành khi tích hợp mạng Modbus trong hệ thống công nghiệp và nâng cao khả năng
điều khiển ngoại vi của máy tính nhúng.
Từ khóa – Modbus RTU, Python, máy tính nhúng,, CRC, Linux.

IMPLEMENTING MODBUS RTU INDUSTRIAL NETWORK
BY USING PYTHON PROGRAMMING LANGUAGE
ON LINUX EMBEDDED COMPUTER
Abstract – Nowaday, industrial computers are used for terminal devices in industrial network.
However, when we integrate it into system, we need external modules as Modbus, Profibus or third
party software which are drivers to control and implement protocols. The thesis is to study Modbus
RTU and its stacks to creating Modbus RTU industrial network by using Python programming
language on embedded Linux computer- Banana Pro. According to standard principle of this
network, the thesis provides algorithm, objects oriented stack and serial communication processing.
After that, frame building, frame receiving, CRC, exception codes and so on will be built exactly
by using Python. The thesis brings the lower cost when integrating Modbus in industrial network
and also enhance the peripheral control capability of embedded computer.
Keywords – Modbus RTU, Python, Embedded computer, CRC, Linux


iii


MỤC LỤC
LỜI CAM ĐOAN ........................................................................................................ i
TÓM TẮT LUẬN VĂN .............................................................................................ii
MỤC LỤC ................................................................................................................. iii
DANH MỤC CÁC BẢNG.......................................................................................... v
DANH MỤC CÁC HÌNH VẼ, ĐỒ THỊ .................................................................... vi
MỞ ĐẦU ..................................................................................................................... 1
1. Tính cấp thiết của đề tài.......................................................................................1
2. Mục tiêu nghiên cứu ............................................................................................2
3. Đối tượng và Phạm vi nghiên cứu .......................................................................2
4. Phương pháp nghiên cứu .....................................................................................2
5. Ý nghĩa khoa học và thực tiễn .............................................................................3
6. Cấu trúc luận văn .................................................................................................3
CHƯƠNG 1: GIỚI THIỆU TỔNG QUAN VỀ GIAO THỨC MẠNG MODBUS
RTU ............................................................................................................................. 5
1.1

GIỚI THIỆU MẠNG MODBUS ..................................................................5

1.2 CẤU TRÚC ĐOẠN TIN GIAO THỨC MODBUS .........................................9
CHƯƠNG 2: GIỚI THIỆU TỔNG QUAN VỀ PYTHON VÀ MÁY TÍNH
NHÚNG LINUX ....................................................................................................... 19
2.1

NGÔN NGỮ PYTHON...............................................................................19

2.2. MÁY TÍNH NHÚNG CÔNG NGHIỆP .........................................................24
CHƯƠNG 3: XÂY DỰNG CÁC LỚP DỮ LIỆU VÀ THUẬT TOÁN .................. 32
3.1


. SƠ ĐỒ CHUNG ........................................................................................32

3.1.1. Lớp dữ liệu của Slave ..............................................................................32
3.1.2. Lớp dữ liệu của Master ............................................................................35
3.2. XÂY DỰNG THUẬT TOÁN ........................................................................36
3.2.1. Lớp Utilities .............................................................................................37
3.2.2. Lớp physical ............................................................................................42
3.2.3. Lớp transaction ........................................................................................43
3.2.4. Lớp Factory..............................................................................................49
3.2.5. Lớp bit_read_message.py & bit_write_message.py &
register_read_message.py & register_write_message.py ..................................53
3.2.6. Lớp dành riêng cho kho dữ liệu (Server mode) .......................................62


iv

CHƯƠNG 4: KẾT QUẢ MÔ PHỎNG..................................................................... 67
4.1 KHỞI TẠO HỆ THỐNG ẢO ..........................................................................67
4.2 KẾT QUẢ MÔ PHỎNG KHI KẾT NỐI 2 MÁY ẢO ....................................68
4.2.1 Kết quả kiểm tra mã chức năng Write Coil (FC=05) ...............................68
4.2.2. Kết quả kiểm tra mã chức năng Write Coils (FC=15) .............................69
4.2.3. Kết quả kiểm tra mã chức năng Read Coils Status (FC=01) ...................70
4.2.4 Kết quả kiểm tra mã chức năng Read Coils Status (FC=01) ....................71
4.2.5 Kết quả kiểm tra mã chức năng Write Holding Registers (FC=16) .........72
4.2.6 Kết quả kiểm tra mã chức năng Read Holding Registers (FC=3) ............74
4.2.7 Kết quả kiểm tra mã chức năng Write Holding Registers (FC=16)(kiểm
tra lần thứ 2 cho 1 thanh ghi duy nhất) ..............................................................75
4.2.8 Kết quả kiểm tra mã chức năng Read Holding Registers (FC=3) (kiểm tra
lần thứ 2 cho 1 thanh ghi duy nhất) ...................................................................76

4.2.9 Kết quả kiểm tra mã chức năng Read Discrete Inputs (FC=02) ...............77
4.2.10 Kết quả kiểm tra mã chức năng Read Inputs Register (FC=04) .............78
4.2.11 Kết quả kiểm tra Mã Ngoại lệ nếu có vấn đề trên khung truyền hoặc kho
dữ liệu ................................................................................................................79
4.3. KẾT QUẢ MÔ PHỎNG KHI KẾT NỐI MÁY TÍNH NHÚNG VÀ MÁY
TÍNH NGOÀI ........................................................................................................82
4.3.1. Phương pháp thực hiện ............................................................................82
4.3.2. Mô phỏng quá trình ghi cuộn dây (FC=5 và FC=15) ..............................83
4.3.3. Mô phỏng quá trình ghi thanh ghi (FC=16) ............................................85
4.3.4. Mô phỏng quá trình đọc thanh ghi (FC=3) ..............................................85
4.3.5. Mô phỏng quá trình đọc đầu vào số (FC=2) ............................................86
4.3.6. Mô phỏng quá trình đọc thanh ghi analog (FC=4) ..................................87
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI .................................................. 89
Các điểm đã làm được ...........................................................................................89
Các điểm hạn chế...................................................................................................89
Hướng phát triển đề tài ..........................................................................................89
DANH MỤC ĐỀ TÀI THAM KHẢO ...................................................................... 90
QUYẾT ĐỊNH GIAO ĐỀ TÀI LUẬN VĂN ........................................................... 91


v

DANH MỤC CÁC BẢNG
Số hiệu bảng

Tên bảng

Trang

Bảng 1.1


Kiểu dữ liệu và cách tiếp cận trong Modbus

11

Bảng 1.2

Cấu trúc đoạn tin yêu cầu mã hàm 01

13

Bảng 1.3

Cấu trúc đoạn tin trả lời mã hàm 01

13

Bảng 1.4

Cấu trúc đoạn tin yêu cầu mã hàm 02

13

Bảng 1.5

Cấu trúc đoạn tin trả lời mã hàm 02

14

Bảng 1.6


Cấu trúc đoạn tin yêu cầu mã hàm 05

14

Bảng 1.7

Cấu trúc đoạn tin trả lời mã hàm 05

15

Bảng 1.8

Cấu trúc đoạn tin yêu cầu mã hàm 15

15

Bảng 1.9

Cấu trúc đoạn tin trả lời mã hàm 15

15

Bảng 1.10

Cấu trúc đoạn tin yêu cầu mã hàm 03

16

Bảng 1.11


Cấu trúc đoạn tin trả lời mã hàm 03

16

Bảng 1.12

Cấu trúc đoạn tin yêu cầu mã hàm 06

17

Bảng 1.13

Cấu trúc đoạn tin trả lời mã hàm 06

17

Bảng 1.14

Cấu trúc đoạn tin yêu cầu mã hàm 16

18

Bảng 1.15

Cấu trúc đoạn tin trả lời mã hàm 16

18

Bảng 2.1


Bảng so sánh ngôn ngữ Python và ngôn ngữ C

22

Bảng 2.2

Bảng so sánh ngôn ngữ Python và Java

23

Bảng 2.3

So sánh vi điều khiển và máy tính nhúng

29

Bảng 2.4

Cấu hình máy tính nhúng banana Pro

30

Bảng 3.1

Mã hàm của 4 lớp dữ liệu bit_read_message.py &

54

bit_write_message.py & register_read_message.py

& register_write_message.py


vi

DANH MỤC CÁC HÌNH VẼ, ĐỒ THỊ
Số hiệu hình vẽ

Tên hình vẽ

Trang

Hình 1.1

Giao thức Modbus và mô hình OSI

7

Hình 1.2

Cách kết nối cổng RS232

7

Hình 1.3

Tín hiệu 2 dây của RS485

8


Hình 1.4

Cấu trúc đoạn tin mạng Modbus

10

Hình 1.5

Mã hàm cung cấp bởi giao thức Modbus

11

Hình 1.6

Cơ chế truyền nhận của Modbus

12

Hình 2.1

Mặt dưới máy tính nhúng Banana Pro

31

Hình 2.2

Mặt trên máy tính nhúng Banana Pro

31


Hình 3.1

Mô hình các lớp dữ liệu của Slave (Server)

33

Hình 3.2

Mô hình các lớp dữ liệu của Master (Client)

35

Hình 3.3

Thuật toán cho hàm pack_bitstring

38

Hình 3.4

Thuật toán cho hàm unpack_bitstring

39

Hình 3.5

Thuật toán tạo bảng mã CRC

41


Hình 3.6

Thuật toán tạo mã CRC từ dữ liệu

42

Hình 3.7

Mô hình lớp transaction

44

Hình 3.8

Các thành phần khung truyền modbus

44

Hình 3.9

Thuật toán cho hàm processIncomingPacket

46

(1/2)
Hình 3.10

Thuật toán cho hàm processIncomingPacket

47


(2/2)
Hình 3.11

Thuật toán cho hàm execute

49

Hình 3.12

Sơ đồ dữ liệu trong việc phân tích mã chức

50

năng trong lớp Factory
Hình 3.13

Thuật toán cho quá trình nhận dạng chức năng
(Client)

51


vii

Hình 3.14

Thuật toán cho quá trình nhận dạng chức năng

52


(Server)
Hình 3.15

Bố cục kho dữ liệu (1/2)

62

Hình 3.16

Bố cục kho dữ liệu (2/2)

63

Hình 4.1

Kết nối giữa máy tính nhúng và laptop thông

83

qua PL2303
Hình 4.2

Giao diện phần mềm RSim

83

Hình 4.3

Kết quả trên giao diện RSim (FC=05 và


85

FC=15)
Hình 4.4

Kết quả trên giao diện RSim (FC=16)

86

Hình 4.5

Cài đặt giá trị cho đầu vào số của slave

87

Hình 4.6

Cài đặt giá trị cho đầu vào số của slave

88


1

MỞ ĐẦU
1. Tính cấp thiết của đề tài
Hiện nay, PLC và máy tính nhúng công nghiệp đang được dùng để làm các thiết bị
đầu cuối trong các mạng cục bộ công nghiệp. Cả hai loại PLC và máy tính nhúng
công nghiệp đều có ưu điểm và nhược điểm riêng. Xét riêng về máy tính nhúng

công nghiệp, khả năng mở rộng ngoại vi, lưu trữ dữ liệu là cực kì rộng lớn. Máy
tính nhúng có các khả năng chịu va đập, nhiệt độ môi trường, tốc độ xử lý cao.
Tuy nhiên khi sử dụng máy tính trong mạng THCN cần có một trong những yếu tố
sau:
Phần cứng ngoài: các module/card xử lý dữ liệu ngoài như Modbus, Profibus…Các
module/card có giá thành từ 200-1000$ tùy theo chức năng và số cổng.
Phần mềm từ đối tác thứ 3: nếu không dùng phần cứng ngoài có thể dùng ngoại vi
trực tiếp của máy tính nhúng nhưng cần driver để điều khiển và các phần mềm, mã
nguồn để thực hiện các giao thức. Cần phải mua bản quyền để sử dụng. Có những
phần mềm không hỗ trợ nguồn mở để phát triển các ứng dụng riêng.

Thông qua đề tài "Xây dựng mạng truyền thông công nghiệp Modbus RTU bằng
ngôn ngữ Python trên máy tính nhúng Linux", mạng Modbus RTU và các ngăn xếp
của nó được tìm hiểu và xây dựng bằng ngôn ngữ Python trên nền tảng máy tính
Banana Pro nhúng hệ điều hành Linux. Dựa theo cách thức hoạt động tiêu chuẩn
của mạng công nghiệp Modbus RTU, đề tài này nghiên cứu thuật toán để xây dựng
các lớp hướng đối tượng nhằm truyền nhận dữ liệu và xử lý dữ liệu truyền thông nối
tiếp. Theo đó, các thuật toán giúp tạo khung truyền, nhận khung truyền, sinh ra giá
trị kiểm thử, các mã ngoại lệ,... sẽ được xây dựng chính xác và viết bằng ngôn ngữ
Python.

Thông qua máy tính nhúng Linux, người lập trình ngoài việc sử dụng mã nguồn
Modbus được xây dựng để truyền nhận dữ liệu còn lập nhiều chức năng điều khiển
mới cho module này như đóng cắt thiết bị, đọc giá trị cảm biến, giao tiếp người –


2

máy (HMI),... mà các module Modbus thông thường không làm được. Đề tài này
hướng tới mục tiêu chính là tạo ra mã nguồn mở chỉ có chức năng truyền thông tin

giữa các nút mạng theo chuẩn modbus. Ngoài ra không có chức năng xử lý khác
như PID, mạng neuron…

2. Mục tiêu nghiên cứu
Tìm hiểu cấu tạo các lớp ngăn xếp của mạng Modbus RTU. Sau đó tìm hiểu các
hình thức trao đổi dữ liệu và xử lý dữ liệu giữa các lớp ngăn xếp.
Tìm hiểu ngôn ngữ Python hướng đối tượng và cách thức xử lý dữ liệu lớp vật lý
của giao thức truyền thông nối tiếp.
Tìm hiểu các cổng ngoại vi của máy tính nhúng Banana Pro được sử dụng cho
mạng Modbus.
Xây dựng các lớp ngăn xếp dùng ngôn ngữ Python hướng đối tượng sau khi đã tìm
hiểu về cách thức hoạt động của các lớp ngăn xếp này.
Mô phỏng đánh giá hoạt động trên các chương trình Server/Client thông qua cổng
truyền thông ảo.

3. Đối tượng và Phạm vi nghiên cứu
Mạng Modbus có 3 phương thức giao tiếp là RTU, ASCII và TCP/IP, trong đề tài
này đối tượng nghiên cứu là mạng Modbus RTU.
Phạm vi nghiên cứu là tích hợp mạng Modbus bằng ngôn ngữ Python trên máy tính
Banana Pro nhúng hệ điều hành Linux. Như vậy đề tài giới hạn phạm vi ở việc lập
trình dùng ngôn ngữ Python, máy tính Banana Pro và hệ điều hành Linux.

4. Phương pháp nghiên cứu
Tìm hiểu các tài liệu sách vở có liên quan đến mạng Modbus, cấu tạo, chức năng và
cách thức hoạt động của chúng. Từ đó kết hợp với ngôn ngữ Python hướng đối
tượng để xây dựng phần mềm.


3


Tìm hiểu cấu trúc phần cứng của máy tính Banana Pro, các thông số kĩ thuật và
cách sử dụng nó thông qua sổ tay từ nhà sản xuất LeMaker.
Từ các kiến thức trên, đưa ra các lưu đồ thuật toán để xử lý dữ liệu nhằm truyền và
nhận khung truyền dữ liệu theo tiêu chuẩn của Modbus RTU.
Mô phỏng phương thức truyền đạt dữ liệu thông qua các cổng truyền thông nối tiếp
ảo có sẵn trên hệ điều hành Linux. Xây dựng hai chương trình có cơ chế
Server/Client để thực hiện mô phỏng này.
Chạy mạng Modbus thực tế bằng cách gán cổng truyền thông thực, thông qua
module PL2303 trao đổi dữ liệu với một thiết bị Modbus khác, đó là một máy tính
hệ điều hành Windows có cài sẵn phần mềm mô phỏng Modbus.

5. Ý nghĩa khoa học và thực tiễn
Tích hợp được mạng Modbus RTU trên máy tính nhúng đem lại cho lập trình hệ
thống mở rộng tính năng hơn so với các module Modbus thông thường vì máy tính
nhúng hiện nay có hỗ trợ nhiều ngoại vi giúp giao tiếp với cảm biến (nhiệt, quang,
gia tốc,...), các thiết bị đóng cắt, các thiết bị truyền thông mạng công nghiệp, thậm
chí là giao tiếp với các màn hình HMI (Human Machine Interface: Giao tiếp ngườimáy) cũng như bản thân có thể làm thành thiết bị HMI.
Máy tính nhúng có giá thành rẻ hơn nhiều so với các module mạng công nghiệp
đang sử dụng, có khả năng làm trong môi trường công nghiệp, không cần thiết bị
làm mát, dễ dàng lắp đặt vì có kích thước nhỏ, không cồng kềnh.

6. Cấu trúc luận văn
Chương 1: Giới thiệu tổng quan về giao thức mạng Modbus RTU.
Chương này giới thiệu khái niệm mạng Modbus và cấu trúc đoạn tin mạng Mod bus
RTU.
Chương 2: Giới thiệu tổng quan về python và máy tính nhúng Linux.
Chương này so sánh ngôn ngữ Python với các ngôn ngữ lập trình nhúng hiện có,
đồng thời so sánh máy tính nhúng và các vi điều khiển thông thường.



4

Chương 3: Xây dựng các lớp dữ liệu và thuật toán.
Chương này mô tả cấu tạo của các lớp, thuật toán để xử lý khung truyền/nhận dữ
liệu.
Chương 4: Kết quả mô phỏng.
Chương này đưa ra kết quả mô phỏng bằng hai phương pháp, đó là kết nối 2 máy
ảo với nhau và kết nối máy tính nhúng và một máy tính khác có cài phần mềm mô
phỏng Modbus.


5

CHƯƠNG 1: GIỚI THIỆU TỔNG QUAN VỀ GIAO THỨC
MẠNG MODBUS RTU
Chương 1 sẽ giới thiệu tổng quan về mạng truyền thông công nghiệp nói chung và
mạng truyền thông công nghiệp Modbus nói riêng. Đối với mạng Modbus, chương
này đề cập đến lịch sử phát triển mạng Modbus, các hình thức vật lý truyền tín hiệu,
mô hình OSI 7 lớp, phân loại Modbus hiện có. Ngoài ra để hiểu rõ mạng Modbus
cần phân tích cấu trúc khung truyền của mạng Modbus, bao gồm phần địa chỉ, phần
chức năng, phần dữ liệu và phần kiểm tra mã lỗi. Cuối cùng chương 1 cung cấp các
mã chức năng, khung truyền gởi đi và khung truyền nhận lại.

1.1 GIỚI THIỆU MẠNG MODBUS
Giao thức truyền thông là những quy định trong việc truyền thông tin giữa các thiết
bị trong một hệ thống công nghiệp. Trong công nghiệp, thì các bộ phận trong hệ
thống được cấu trúc theo sơ đồ phân cấp. Điều này có nghĩa là các thiết bị trong một
hệ thống công nghiệp có mối liên quan với nhau. Các thiết bị cơ cấu chấp hành: như
motor, cảm biến…nằm ở cấp thấp nhất (được gọi là cấp trường), nó chịu sự điều
khiển của các thiết bị ở cấp trên nó – cấp điều khiển. Các thiết bị ở cấp điều khiển

như: PLC, PC… thì chịu sự điều khiển và giám sát ở cấp cao hơn…Và cứ thế, một
hệ thống trong công nghiệp thông thường có 5 cấp [3].
Điều cần quan tâm ở đây, là việc liên lạc và truyền tín hiệu giữa các thiết bị trong
các cấp được thực hiện nhờ các đường dây bus tín hiệu (bao gồm 4 loại bus: bus
trường, bus hệ thống, mạng xí nghiệp và mạng công ty). Để tín hiệu truyền được
trên các bus thì cần có những tiêu chuẩn để truyền. Tiêu chuẩn này phải đảm bảo cả
thiết bị ở cấp trên và cấp dưới đều hỗ trợ. Tiêu chuẩn này được gọi là giao thức
truyền thông.
Ứng với mỗi đường dây bus cho việc kết nối giữa 2 cấp thì có một giao thức truyền
thông riêng. Đối với bus trường: thông thường người ta sử dụng các giao thức:
profibus, modbus…
Modbus bắt nguồn trong cuối những năm 70 thế kỷ trước. Năm 1979 khi nhà sản


6

xuất PLC Modicon giờ là tập đoàn Schneider Electric's Telemecanique phát hành
giao diện truyền thông Modbus cho mạng multidrop dựa trên kiến trúc
master/client. Truyền thông giữa các Modbus node dựa trên các thông điệp. Modbus
ban đầu chạy trên RS232, nhưng gần đây Modbus dùng RS485 vì nó cho phép
khoảng cách lớn, tốc độ cao và khả năng của một mạng đa điểm thực sự. Trong thời
gian ngắn hàng trăm nhà sản xuất công nghiệp thực hiện tích hợp Modbus trong
thiết bị của họ và Modbus trở thành chuẩn cho các mạng truyền thông công nghiệp.
Modbus là một giao thức mạng truyền dữ liệu theo kiểu nối tiếp. Nó hỗ trợ cả 2
chuẩn truyền RS232 và RS485. Việc truyền dữ liệu được thực hiện theo cơ chế 1
Master/ nhiều Slave. Modbus thường được dùng để truyền các tín hiệu từ các thiết
bị đo, thiết bị điều khiển trở về bộ điều khiển chính hay hệ thống thu thập dữ liệu.
Mosbus thường dùng để kết nối máy tính giám sát với một thiết bị điều khiển
(RTU: remote terminal unit) trong hệ thống Scada (hệ thống điều khiển và thu thập
dữ liệu).

Sơ đồ hình 1.1 trình bày sự tham chiếu giao thức Modbus lên mô hình chuẩn OSI.
Theo đó thì giao thức Modbus nằm ở lớp thứ 7, thứ 2, và thứ 1 của mô hình OSI.
Lớp thứ 7 này (lớp ứng dụng) giúp hỗ trợ phương thức truyền thông Server/Client
giữa các thiết bị kết nối trên bus hoặc trên mạng không dây. Lớp thứ 2 và lớp thứ 1
quy định hình thức truyền dữ liệu theo kiểu nối tiếp và chuẩn truyền vật lý là
EIA/TIA – 485 (hoặc EIA/TIA – 232).


7

Hình 1.1: Giao thức Modbus và mô hình OSI.

Có 2 tiêu chuẩn phổ biến trong việc truyền dữ liệu nối tiếp: đó là chuẩn RS232 và
chuẩn RS485 [3].
Đối với chuẩn RS232, việc truyền dữ liệu được thực hiện nhờ 3 dây TxD, RxD và
đất. Tín hiệu được truyền đi bằng cách: tín hiệu được so sánh với đất để phát hiện
sự sai lệch. Điều này khiến cho dữ liệu khó có thể khôi phục lại ở trạm phát. Một
điều nữa là chuẩn truyền RS232 chỉ được sử dụng để truyền tín hiệu giữa 2 trạm
được kết nối trực tiếp, việc mở rộng số lượng trạm sử dụng chuẩn truyền RS232 là
không khả thi [3].

Hình 1.2 trình bày sơ đồ kết nối dây giữa 2 thiết bị có cổng COM dùng chuẩn
truyền RS232.

Hình 1.2: Cách kết nối cổng RS232


8

Một số đặc điểm của chuẩn truyền RS232 là: khoảng cách truyền tối đa là 15m, tốc

độ truyền là 20Kbps, hỗ trợ kết nối điểm – điểm trên một mạng.

Đối với chuẩn RS485, việc truyền dữ liệu được thực hiện trên 2 dây A,B. Chuẩn
này truyền tín hiệu theo phương pháp lấy vi sai cân bằng. Có nghĩa là tín hiệu
truyền đi nhờ cả 2 dây. Và dữ liệu nhận được được căn cứ theo sự sai lệch giữa 2 tín
hiệu này [3].

Hình 1.3: Tín hiệu 2 dây của RS485.

Hình 1.3 trình bày rõ hơn về cách truyền dữ liệu theo chuẩn truyền RS485.
Giả sử khi A = 0, B = 1 thì dữ liệu được nhận biết đó là data = 1, và khi A = 1, B =
0 thì dữ liệu được nhận biết là data = 0. Nhờ việc so sánh như trên, nên khi có nhiễu
xảy ra, thì cả 2 tín hiệu A, B điều bị suy giảm như nhau, thế nên độ chênh lệch điện
áp giữa chúng là không đổi, vì vậy ở thiết bị nhận vẫn có thể nhận được tín hiệu
một cách chính xác.
+ Khi sự chênh lệch điện áp giữa A và B nằm trong khoảng -1,6V đến -6V thì dữ
liệu được nhận tương ứng với mức 1.
+ Khi sự chênh lệch điện áp giữa A và B nằm trong khoảng +1,5 đến +6V thì dữ
liệu được nhận tương ứng với mức 0.
Ưu điểm của chuẩn truyền RS485 là giảm đi sự sai lệch dữ liệu ở thiết bị nhận, và
việc truyền thông tin đi được xa hơn. Ngoài ra, ta còn có thể kết nối được nhiều


9

thiết bị trên cùng một mạng, (chuẩn truyền RS485 sử dụng cách kết nối đa điểm) sử
dụng chuẩn truyền RS485 này.
Một số đặc tính của chuẩn truyền RS485: Khoảng cách truyền lên đến 1200m, tốc
độ truyền có thể lên đến 10Mbps, số lượng thiết bị tối đa có thể kết nối là 32 thiết bị
phát và 32 thiết bị thu.


Giao thức Modbus được sử dụng rộng rãi nhờ tính đơn giản, linh hoạt và đáng tin
cậy của nó. Nó có thể truyền dữ liệu rời rạc hoặc tương tự. Thế nhưng giao thức
Modbus bị giới hạn bởi cách thức giao tiếp theo chuẩn RS485. Tốc độ truyền của
chuẩn này trong khoảng 0.010Mbps đến 0.115Mbps. Trong khi ngày nay, các mạng
hỗ trợ tốc độ truyền trong khoảng từ 5Mbps đến 16Mbps, thậm chí đối với các
mạng Ethernet nó còn cung cấp tốc độ truyền lên đến 100Mbps, 1Gbps và 10Gbps.

Căn cứ vào cách thức truyền dữ liệu trong mạng, thì mạng Modbus được chia làm 3
loại: Modbus RTU, Modbus ASCII [3] và Modbus TCP/IP.
Modbus RTU: dữ liệu được truyền trên bus nối tiếp. Dữ liệu được truyền theo định
dạng mã hexadecimal. Modbus RTU thường được sử dụng trong việc truyền thông
thông thường.
Modbus ASCII: dữ liệu được truyền trên bus nối tiếp. Dữ liệu truyền được định
dạng dưới dạng mã ASCII. Modbus ASCII có ưu điểm là có thể dễ dàng để người
dùng hiểu được dữ liệu đang truyền. Thông thường thì giao thức Modbus ASCII
được sử dụng trong việc kiểm tra và giới thiệu cho giao thức mạng Modbus.
Modbus TCP/IP: Dữ liệu có thể được truyền trên mạng LAN hoặc mạng ở trên một
khu vực rộng. Dữ liệu được định dạng theo mã hexadecimal.

1.2 CẤU TRÚC ĐOẠN TIN GIAO THỨC MODBUS
Hình dưới đây trình bày cấu trúc của một đoạn tin truyền trong giao thức
mạng Modbus [1, 2, 3, 5].


10

Hình 1.4: Cấu trúc đoạn tin mạng Modbus.

Byte 1: Địa chỉ

Có độ dài 1 byte. Byte này cung cấp địa chỉ của Slave mà Master sẽ tác động đến.
Trong cả đoạn tin yêu cầu gửi từ Master và đoạn tin đáp ứng nhận từ Slave thì byte
này có giá trị giống nhau. Mỗi một Slave trong mạng có một địa chỉ Modbus riêng
(địa chỉ được chọn trong khoảng từ 1 đến 247).
Bằng cách này, sau 1 byte đầu tiên mỗi một Slave sẽ biết được nó có nhận đoạn tin
hay không.
Byte 2: Mã chức năng
Byte thứ 2 mà Master gửi đi là function code (mã nhiệm vụ). Mã này giúp Slave
biết được nhiệm vụ mà Master muốn Slave phải làm.
Điểm đặc biệt của Modbus là nó cung cấp một bảng mã hàm chung cho tất cả các
thiết bị.
Hình 1.3 trình bày các mã hàm được hỗ trợ bởi giao thức Modbus.


11

Hình 1.5: Mã hàm cung cấp bởi giao thức Modbus [7]
Khối dữ liệu:
Chức năng của khối dữ liệu: khối này thông thường chứa địa chỉ của các vùng trên
thiết bị Slave mà Master muốn tác động đến.
Trong giao thức mạng Modbus, thì có một tiêu chuẩn địa chỉ chung cho tất cả các
thiết bị có hỗ trợ giao thức Modbus. Có nghĩa là: chuẩn Modbus quy định từng
vùng địa chỉ rõ ràng cho khối cuộn dây ngõ ra, khối ngõ vào rời rạc, khối thanh ghi
đầu vào và khối thanh ghi Holding.
Loại

Kiểu dữ liệu

Kiểu tiếp cận


Đầu vào rời rạc

Bit đơn

Ghi – Đọc

Cuộn dây

Bit đơn

Ghi – Đọc

Thanh ghi vào

16 bit

Chỉ đọc

Thanh ghi nhớ

16 bit

Ghi – Đọc

Bảng 1.1: Kiểu dữ liệu và cách tiếp cận trong Modbus


12

Khối CRC (Cyclic Redundancy Check)

Chức năng: giúp Slave kiểm tra được có lỗi xuất hiện trong khung dữ liệu khi
Master truyền xuống hay không.
Mạng Modbus thực hiện việc kiểm tra lỗi theo 2 hình thức:
Kiểm tra số lượng bit1, bit0 trong mỗi khung truyền, nhờ mã kiểm tra chẵn lẻ
(Parity bit).
Kiểm tra nội dung của toàn bộ khung truyền xem có chính xác hay không. Khi
Master gửi khối dữ liệu xuống, nó sẽ dựa vào khung dữ liệu để tính mã CRC, sau đó
Master gửi khung dữ liệu đó xuống, kèm theo cả mã CRC vừa tính được. Khi Slave
nhận được khối tin truyền, nó cũng sẽ dựa vào khối dữ liệu nhận được, tính toán
độc lập lại mã CRC, sau đó nó kiểm tra CRC vừa tính được với CRC mà Master gửi
xuống. Nếu 2 mã CRC giống nhau, thì không có lỗi xảy ra. Nếu 2 mã CRC khác
nhau, tức là dữ liệu nhận được là không đúng, thì Slave sẽ báo lỗi lên cho Master.
Sự truyền nhận qua lai giữa master và slave thể hiện như hình 1.6.

Hình 1.6 Cơ chế truyền nhận của modbus
Sau đây là các mã hàm thông dụng của Modbus được thể hiện theo đoạn tin yêu cầu
và đoạn tin trả lời [1, 2, 5].
Mã hàm 01 (0x01) – hàm tác động lên bit:
Chức năng: đọc giá trị của các ngõ ra trên thiết bị được điều khiển
(Slave).
Cấu trúc đoạn thoại yêu cầu:
Địa chỉ của slave.
Function code.
Địa chỉ ngõ ra bắt

Độ dài
1 byte
1 byte
2 byte


Chú thích
Có giá trị 01 (hex)


13

đầu đọc.
Số lượng ngõ ra
2 byte
muốn đọc.
Mã kiểm soát lỗi
2 byte
CRC của khung dữ
liệu Master.
Bảng 1.2: Cấu trúc đoạn tin yêu cầu mã hàm 01.

Cấu trúc đoạn thoại trả lời:
Địa chỉ của slave.
Function code.
Số lượng byte dữ
liệu theo sau (N).

Độ dài
1 byte
1 byte
1 byte

Chú thích
0x01
Byte này chỉ số lượng byte có

nhiệm vụ lưu giá trị của các
cuộn dây mà Master yêu cầu
N = số ngõ ra muốn
đọc/8.

Dữ liệu của các ngõ
N byte
ra mà master yêu
cầu.
Mã lỗi CRC của
2 byte
khung dữ liệu Slave
đáp ứng.
Bảng 1.3: Cấu trúc đoạn tin trả lời mã hàm 01.

Mã hàm 02 (0x02) – hàm tác động lên bit:
Chức năng: giúp master đọc được trạng thái của một hay nhiều tín hiệu
ngõ vào rời rạc của slave.
Cấu trúc đoạn thoại yêu cầu:
Độ dài
1 byte
1 byte
2 byte

Chú thích

Địa chỉ của slave.
Function code.
Có giá trị 02 (hex)
Địa chỉ ngõ vào bắt

đầu đọc.
Số lượng ngõ vào
2 byte
muốn đọc.
Mã kiểm soát lỗi
2 byte
CRC của khung dữ
liệu Master.
Bảng 1.4: Cấu trúc đoạn tin yêu cầu mã hàm 02.


14

Cấu trúc của đoạn thoại trả lời:
Địa chỉ của slave.
Function code.
Số lượng byte dữ
liệu theo sau (N).

Độ dài
1 byte
1 byte
1 byte

Chú thích
0x02
Byte này chỉ số lượng byte có
nhiệm vụ lưu giá trị của các
cuộn dây mà Master yêu cầu.
N = số ngõ vào muốn

đọc/8.

Dữ liệu của các ngõ
N byte
vào mà master yêu
cầu.
Mã lỗi CRC của
2 byte
khung dữ liệu Slave
đáp ứng.
Bảng 1.5: Cấu trúc đoạn tin trả lời mã hàm 02.

Mã hàm 05 (0x05) – hàm tác động lên bit
Chức năng: giúp master ghi giá trị lên từng cuộn dây có trên Slave.
Cấu trúc của đoạn thoại yêu cầu:
Độ dài
1 byte
1 byte
2 byte

Chú thích

Độ dài
1 byte
1 byte
2 byte

Chú thích

Địa chỉ của slave.

Function code.
Có giá trị 05 (hex)
Địa chỉ của ngõ ra
muốn ghi.
Dữ liệu muốn ghi
2 byte
FF00: ứng với giá trị 1
cho ngõ ra.
0000: ứng với giá trị 0
Mã kiểm soát lỗi
2 byte
CRC của khung dữ
liệu Master.
Bảng 1.6: Cấu trúc đoạn tin yêu cầu mã hàm 05

Cấu trúc của đoạn thoại đáp ứng
Địa chỉ của slave.
Function code.
Địa chỉ của ngõ ra
muốn ghi.
Dữ liệu sau khi ghi

2 byte

Có giá trị 05 (hex)

FF00: ứng với giá trị 1
0000: ứng với giá trị 0



15

Mã lỗi CRC của
2 byte
khung dữ liệu Slave
đáp ứng.
Bảng 1.7: Cấu trúc đoạn tin trả lời mã hàm 05

Mã hàm 15 (0x15)- hàm tác động lên bit
Chức năng: giúp master ghi giá trị 0/1 lên nhiều cuộn dây đơn.
Cấu trúc đoạn thoại yêu cầu:
Độ dài
1 byte
1 byte
2 byte

Chú thích

Độ dài
1 byte
1 byte
2 byte

Chú thích

Địa chỉ của slave.
Function code.
Có giá trị 0F (hex)
Địa chỉ đầu tiên của
các ngõ ra muốn ghi.

Số lượng ngõ ra
2 byte
muốn ghi.
Số lượng byte dữ
1 byte
liệu theo sau (N).
Dữ liệu muốn ghi
N byte
N = số ngõ ra muốn ghi/8
đến các ngõ ra.
Mã kiểm soát lỗi
2 byte
CRC của khung dữ
liệu Master.
Bảng 1.8: Cấu trúc đoạn tin yêu cầu mã hàm 15

Cấu trúc đoạn thoại đáp ứng:
Địa chỉ của slave.
Function code.
Có giá trị 0F (hex)
Địa chỉ của ngõ ra
đầu tiên muốn ghi.
Số lượng ngõ ra
2 byte
được ghi.
Mã lỗi CRC của
2 byte
khung dữ liệu Slave
đáp ứng.
Bảng 1.9: Cấu trúc đoạn tin trả lời mã hàm 15



16

Mã hàm 03 (0x03) – hàm tác động lên thanh ghi
Chức năng: giúp master đọc được trạng thái của các thanh ghi trong vùng
Holding register của các thiết bị Slave.
Cấu trúc đoạn thoại yêu cầu:
Độ dài
1 byte
1 byte
2 byte

Chú thích

Độ dài
1 byte
1 byte
1 byte

Chú thích

Địa chỉ của slave.
Function code.
Có giá trị 03 (hex)
Địa chỉ đầu tiên của
các thanh ghi mà
master muốn đọc dữ
liệu.
Tổng số thanh ghi

2 byte
mà Master muốn đọc
giá trị.
Mã kiểm soát lỗi
2 byte
CRC của khung dữ
liệu Master.
Bảng 1.10: Cấu trúc đoạn tin yêu cầu mã hàm 03

Cấu trúc đoạn thoại đáp ứng:
Địa chỉ của slave.
Function code.
Có giá trị 03 (hex)
Số lượng byte dữ
liệu theo sau (2xN).
Các byte nội dung
2xN byte
N = số thanh ghi mà
của các thanh ghi mà
master muốn đọc.
master yêu cầu.
Mã lỗi CRC của
2 byte
khung dữ liệu Slave
đáp ứng.
Bảng 1.11: Cấu trúc đoạn tin trả lời mã hàm 03

Mã hàm 06 (0x06) – hàm tác động lên thanh ghi
Chức năng: giúp master ghi dữ liệu xuống một thanh ghi.
Cấu trúc khung yêu cầu:



×