Modbus network linking a controller with distributed field devices

Modbus: Giao thức bus trường công nghiệp nguyên bản

Modbus remains widely deployed because its data model is simple, not because every implementation is simple. This guide explains frames, register mapping, ti...

Bus trường là một giao thức truyền thông được sử dụng trong các mạng công nghiệp để kết nối các thiết bị hiện trường với các bộ điều khiển công nghiệp. Bus trường làm giảm lượng dây dẫn cần thiết giữa bộ điều khiển và các thiết bị vì nhiều thiết bị có thể kết nối với cùng một cặp dây.

Có nhiều công nghệ bus trường phổ biến, bao gồm Modbus, Profibus, Foundation Fieldbus, ControlNet, DeviceNet và nhiều công nghệ khác.

Năm 1979, Modicon giới thiệu một giao thức tận dụng lớp ứng dụng của mô hình OSI, được thiết kế riêng để sử dụng với các PLC của mình. Giao thức này có tên là Modbus và trở thành bus trường được sử dụng rộng rãi đầu tiên trong lịch sử tự động hóa.

 

PLC kết nối với các thiết bị hiện trường bằng bus trường

Hình 1. Một PLC được kết nối với các thiết bị hiện trường 

 

Giới thiệu về Modbus

Modbus được thiết kế để kết nối các thiết bị hiện trường với các bộ điều khiển công nghiệp. Vào thời điểm được phát minh, hầu hết các thiết bị sử dụng biểu diễn điện áp hoặc dòng điện để truyền đạt trạng thái của thiết bị. Modbus có thể xử lý hiệu quả các bit rời rạc phản ánh trạng thái cao/thấp của cảm biến và cơ cấu chấp hành, cũng như các thanh ghi chứa các giá trị số nguyên tương ứng với các giá trị quy trình tương tự.

Quá trình chuyển đổi chậm sang các công nghệ bus trường khiến Modbus trở thành một trong những giao thức đơn giản nhất, đồng thời các phiên bản mới đã được bổ sung qua nhiều năm.

Ban đầu, Modbus được triển khai trên liên kết truyền thông nối tiếp, tức là RS-232/RS-485. Các biến thể này vẫn thường được sử dụng dưới tên Modbus RTU và ASCII. Cuối cùng, giao thức được điều chỉnh để sử dụng trên TCP/IP và Ethernet. Giao thức này thường được gọi là Modbus TCP và là cách triển khai Modbus phổ biến nhất trong các hệ thống hiện đại.

 

Mô hình giao tiếp

Modbus sử dụng mô hình chủ/tớ để giao tiếp (máy khách/máy chủ trong Modbus TCP). Một thiết bị chủ Modbus gửi yêu cầu đến một thiết bị tớ Modbus, thiết bị này thực hiện các hành động và phản hồi cho thiết bị chủ. Trong trường hợp này, thiết bị chủ thường là một PLC, còn các thiết bị hiện trường hoạt động như các thiết bị tớ. 

Một khung tin nhắn trong Modbus bao gồm một đơn vị dữ liệu ứng dụng (ADU) và một đơn vị dữ liệu giao thức (PDU). ADU khác nhau tùy thuộc vào loại Modbus được sử dụng, trong khi PDU độc lập với phương thức truyền thông.

Một PDU thường bao gồm mã chức năng và một số dữ liệu. Nội dung này được đóng gói trong ADU cùng với địa chỉ và mã kiểm tra lỗi. Modbus TCP sử dụng tiêu đề MBAP (Modbus Application Protocol) trong ADU.

 

Hình 2. ADU và PDU Modbus cho Modbus ASCII/RTU (trên) và Modbus TCP (dưới). Hình ảnh được chuyển thể từ Modbus.org

 

Để PDU không phụ thuộc vào lớp truyền thông bên dưới, nó phải tuân thủ các giới hạn kích thước của đặc tả nối tiếp ban đầu. Kích thước này là 256 byte đối với ADU qua RS-485. Vì vậy, cần tính đến ADU – 1 byte địa chỉ và 2 byte kiểm tra lỗi – nghĩa là PDU bị giới hạn ở tổng cộng 253 byte. Lưu ý rằng địa chỉ trong ADU thực chất là ID của thiết bị phụ trên mạng Modbus.

Phần dữ liệu của PDU sẽ chứa các trường cụ thể cho mã chức năng cùng với dữ liệu thực tế được truyền. Các trường này sẽ được thảo luận chi tiết ở phần sau của bài viết.

 

Biểu diễn dữ liệu

Modbus cổ điển có hai chế độ truyền: ASCII và RTU.

Ở chế độ ASCII, dữ liệu được gửi dưới dạng các ký tự ASCII 0-9 và A-F, trong khi ở chế độ RTU, dữ liệu được biểu diễn dưới dạng nhị phân 8 bit. Dữ liệu và địa chỉ được mã hóa theo thứ tự byte lớn, nên byte quan trọng nhất được truyền trước.

Dữ liệu Modbus có bốn loại chính:

  • Đầu vào rời rạc
  • Cuộn dây (đầu ra)
  • Các thanh ghi đầu vào
  • Các thanh ghi lưu trữ

Đầu vào rời rạc biểu diễn một bit dữ liệu đơn và chỉ được đọc. Cuộn dây cũng biểu diễn một bit đơn nhưng có thể được đọc và ghi. Các thanh ghi đầu vào biểu diễn dữ liệu chỉ đọc 16 bit, trong khi các thanh ghi lưu trữdữ liệu đọc-ghi 16 bit.

 

Hình 3. Trích từ Đặc tả giao thức Modbus

 

Đối với mỗi loại, bộ nhớ của thiết bị có thể chứa tối đa 2^16 (65536) mục dữ liệu. Có các mã chức năng cụ thể để truy cập từng loại dữ liệu khác nhau, trong đó mỗi loại thường có một khối bộ nhớ riêng.

Để định địa chỉ một mục dữ liệu, thiết bị chủ chỉ cần sử dụng phạm vi từ 0-65535. Mục dữ liệu 1 nằm tại địa chỉ 0x0000. Mục dữ liệu 2 nằm tại địa chỉ 0x0001. Mục dữ liệu 65536 nằm tại địa chỉ 0xFFFF. Lưu ý rằng thiết bị không bắt buộc phải có đủ 65536 mục dữ liệu; trên thực tế, hầu hết các đầu cuối I/O từ xa sử dụng Modbus có số lượng thấp hơn nhiều so với giới hạn tối đa này.

 

Các giao dịch Modbus

Sau khi hiểu cách dữ liệu được biểu diễn trong Modbus, giờ đây chúng ta có thể xem xét chi tiết các giao dịch. Nội dung này sẽ được trình bày dưới góc nhìn của PDU, vì PDU không phụ thuộc vào lớp truyền thông.

Các giao dịch Modbus sử dụng các lệnh ký tự thập lục phân, trong đó một byte 8 bit có định dạng 0x00, với phạm vi từ 0-F cho mỗi ký tự. Do đó, một thanh ghi 16 bit tương đương với hai byte, được biểu diễn ở định dạng 0x0000. 

Đặc tả Modbus định nghĩa ba loại PDU:

  • Yêu cầu Modbus
  • Phản hồi Modbus
  • Phản hồi ngoại lệ Modbus

Master khởi tạo yêu cầu bằng cách sử dụng mã chức năng, trong khi slave gửi phản hồi để đáp lại yêu cầu đó. Phản hồi thành công lặp lại mã chức năng mà master đã gửi đến. Phản hồi ngoại lệ trả về cùng mã chức năng, nhưng bit cao nhất (bit có trọng số lớn nhất) được đặt thành 1 để cho biết đã xảy ra lỗi. 

Đặc tả Modbus định nghĩa một số mã chức năng. Mã chức năng 0x01 là chức năng Đọc coil.

Hình 4 minh họa một yêu cầu và phản hồi đọc coil có thể trông như thế nào. Master Modbus gửi yêu cầu với mã chức năng 0x01 (Đọc coil), bắt đầu từ mục dữ liệu đầu tiên (địa chỉ 0x0000) và chỉ đọc một coil. Chức năng Đọc coil có thể được dùng để đọc tối đa 2000 (0x7D0) coil cùng lúc. 

 

Hình 4. Giao dịch đọc coil

 

Nếu thành công, slave sẽ phản hồi bằng cùng mã chức năng và số lượng coil mà nó đang phản hồi. Trạng thái coil sẽ có độ dài n byte, trong đó mỗi bit biểu thị coil tương ứng đang BẬT (1) hay TẮT (0).

Trong trường hợp này, coil tại địa chỉ 0x0000 đang BẬT. Nếu yêu cầu không thành công, phản hồi ngoại lệ sẽ chứa mã chức năng với bit cao nhất được đặt thành 1 (0x81), cùng với một mã ngoại lệ giải thích nguyên nhân. Mã ngoại lệ 0x02 có nghĩa là đã sử dụng địa chỉ dữ liệu không hợp lệ, tức là không có coil nào tại 0x0000 trong bộ nhớ của slave này. 

Ví dụ tiếp theo minh họa giao dịch ghi một thanh ghi đơn (mã chức năng 0x06). Trong ví dụ này, master yêu cầu ghi dữ liệu 0xA0A0 vào địa chỉ 0x00FF. Phản hồi của slave chỉ đơn giản là lặp lại yêu cầu.

Phản hồi ngoại lệ trong ví dụ này hiển thị mã chức năng với bit cao nhất được đặt thành 1, cùng với mã ngoại lệ 0x04. Mã này có nghĩa là đã xảy ra lỗi không thể khắc phục khi thiết bị slave đang cố gắng thực hiện yêu cầu. 

 

Hình 5. Giao dịch ghi một thanh ghi đơn 

 

Tất cả mã chức năng Modbus đều tuân theo một mẫu tương tự như hai ví dụ ở trên.

Hình 6 liệt kê các mã chức năng phổ biến cùng với các mã ngoại lệ dùng cho phản hồi ngoại lệ. Để biết thêm thông tin, hãy tham khảo đặc tả Modbus. 

 

Hình 6. Mã chức năng và mã ngoại lệ

 

Kết luận

Modbus cho phép các PLC giao tiếp với mọi loại thiết bị từ xa, bao gồm các khối I/O, thiết bị đầu cuối và các bộ điều khiển khác, bằng cách sử dụng một phương thức tiêu chuẩn để đọc và ghi cả thông tin rời rạc lẫn thông tin số nguyên, đáp ứng gần như mọi trường hợp liên quan đến việc truyền dữ liệu số.

Modbus hiện là một tiêu chuẩn trong ngành và là giao thức công nghiệp miễn phí bản quyền được sử dụng rộng rãi nhất cho đến nay, mặc dù nó có trước hầu hết các hệ thống điều khiển hiện đại. Modbus có mặt tại các nhà máy và cơ sở sản xuất trên toàn thế giới, và dù đã tồn tại lâu năm, giao thức này chắc chắn vẫn sẽ là một giao thức công nghiệp phù hợp trong nhiều năm tới.

 

Bài viết gốc được xuất bản vào năm 2019

Modbus: Giao thức bus trường công nghiệp nguyên bản

Modbus remains widely deployed because its data model is simple, not because every implementation is simple. This guide explains frames, register mapping, timing, diagnostics, and the design limits...

Bus trường là một giao thức truyền thông được sử dụng trong các mạng công nghiệp để kết nối các thiết bị hiện trường với các bộ điều khiển công nghiệp. Bus trường làm giảm lượng dây dẫn cần thiết giữa bộ điều khiển và các thiết bị vì nhiều thiết bị có thể kết nối với cùng một cặp dây.

Có nhiều công nghệ bus trường phổ biến, bao gồm Modbus, Profibus, Foundation Fieldbus, ControlNet, DeviceNet và nhiều công nghệ khác.

Năm 1979, Modicon giới thiệu một giao thức tận dụng lớp ứng dụng của mô hình OSI, được thiết kế riêng để sử dụng với các PLC của mình. Giao thức này có tên là Modbus và trở thành bus trường được sử dụng rộng rãi đầu tiên trong lịch sử tự động hóa.

 

PLC kết nối với các thiết bị hiện trường bằng bus trường

Hình 1. Một PLC được kết nối với các thiết bị hiện trường 

 

Giới thiệu về Modbus

Modbus được thiết kế để kết nối các thiết bị hiện trường với các bộ điều khiển công nghiệp. Vào thời điểm được phát minh, hầu hết các thiết bị sử dụng biểu diễn điện áp hoặc dòng điện để truyền đạt trạng thái của thiết bị. Modbus có thể xử lý hiệu quả các bit rời rạc phản ánh trạng thái cao/thấp của cảm biến và cơ cấu chấp hành, cũng như các thanh ghi chứa các giá trị số nguyên tương ứng với các giá trị quy trình tương tự.

Quá trình chuyển đổi chậm sang các công nghệ bus trường khiến Modbus trở thành một trong những giao thức đơn giản nhất, đồng thời các phiên bản mới đã được bổ sung qua nhiều năm.

Ban đầu, Modbus được triển khai trên liên kết truyền thông nối tiếp, tức là RS-232/RS-485. Các biến thể này vẫn thường được sử dụng dưới tên Modbus RTU và ASCII. Cuối cùng, giao thức được điều chỉnh để sử dụng trên TCP/IP và Ethernet. Giao thức này thường được gọi là Modbus TCP và là cách triển khai Modbus phổ biến nhất trong các hệ thống hiện đại.

 

Mô hình giao tiếp

Modbus sử dụng mô hình chủ/tớ để giao tiếp (máy khách/máy chủ trong Modbus TCP). Một thiết bị chủ Modbus gửi yêu cầu đến một thiết bị tớ Modbus, thiết bị này thực hiện các hành động và phản hồi cho thiết bị chủ. Trong trường hợp này, thiết bị chủ thường là một PLC, còn các thiết bị hiện trường hoạt động như các thiết bị tớ. 

Một khung tin nhắn trong Modbus bao gồm một đơn vị dữ liệu ứng dụng (ADU) và một đơn vị dữ liệu giao thức (PDU). ADU khác nhau tùy thuộc vào loại Modbus được sử dụng, trong khi PDU độc lập với phương thức truyền thông.

Một PDU thường bao gồm mã chức năng và một số dữ liệu. Nội dung này được đóng gói trong ADU cùng với địa chỉ và mã kiểm tra lỗi. Modbus TCP sử dụng tiêu đề MBAP (Modbus Application Protocol) trong ADU.

 

Hình 2. ADU và PDU Modbus cho Modbus ASCII/RTU (trên) và Modbus TCP (dưới). Hình ảnh được chuyển thể từ Modbus.org

 

Để PDU không phụ thuộc vào lớp truyền thông bên dưới, nó phải tuân thủ các giới hạn kích thước của đặc tả nối tiếp ban đầu. Kích thước này là 256 byte đối với ADU qua RS-485. Vì vậy, cần tính đến ADU – 1 byte địa chỉ và 2 byte kiểm tra lỗi – nghĩa là PDU bị giới hạn ở tổng cộng 253 byte. Lưu ý rằng địa chỉ trong ADU thực chất là ID của thiết bị phụ trên mạng Modbus.

Phần dữ liệu của PDU sẽ chứa các trường cụ thể cho mã chức năng cùng với dữ liệu thực tế được truyền. Các trường này sẽ được thảo luận chi tiết ở phần sau của bài viết.

 

Biểu diễn dữ liệu

Modbus cổ điển có hai chế độ truyền: ASCII và RTU.

Ở chế độ ASCII, dữ liệu được gửi dưới dạng các ký tự ASCII 0-9 và A-F, trong khi ở chế độ RTU, dữ liệu được biểu diễn dưới dạng nhị phân 8 bit. Dữ liệu và địa chỉ được mã hóa theo thứ tự byte lớn, nên byte quan trọng nhất được truyền trước.

Dữ liệu Modbus có bốn loại chính:

  • Đầu vào rời rạc
  • Cuộn dây (đầu ra)
  • Các thanh ghi đầu vào
  • Các thanh ghi lưu trữ

Đầu vào rời rạc biểu diễn một bit dữ liệu đơn và chỉ được đọc. Cuộn dây cũng biểu diễn một bit đơn nhưng có thể được đọc và ghi. Các thanh ghi đầu vào biểu diễn dữ liệu chỉ đọc 16 bit, trong khi các thanh ghi lưu trữdữ liệu đọc-ghi 16 bit.

 

Hình 3. Trích từ Đặc tả giao thức Modbus

 

Đối với mỗi loại, bộ nhớ của thiết bị có thể chứa tối đa 2^16 (65536) mục dữ liệu. Có các mã chức năng cụ thể để truy cập từng loại dữ liệu khác nhau, trong đó mỗi loại thường có một khối bộ nhớ riêng.

Để định địa chỉ một mục dữ liệu, thiết bị chủ chỉ cần sử dụng phạm vi từ 0-65535. Mục dữ liệu 1 nằm tại địa chỉ 0x0000. Mục dữ liệu 2 nằm tại địa chỉ 0x0001. Mục dữ liệu 65536 nằm tại địa chỉ 0xFFFF. Lưu ý rằng thiết bị không bắt buộc phải có đủ 65536 mục dữ liệu; trên thực tế, hầu hết các đầu cuối I/O từ xa sử dụng Modbus có số lượng thấp hơn nhiều so với giới hạn tối đa này.

 

Các giao dịch Modbus

Sau khi hiểu cách dữ liệu được biểu diễn trong Modbus, giờ đây chúng ta có thể xem xét chi tiết các giao dịch. Nội dung này sẽ được trình bày dưới góc nhìn của PDU, vì PDU không phụ thuộc vào lớp truyền thông.

Các giao dịch Modbus sử dụng các lệnh ký tự thập lục phân, trong đó một byte 8 bit có định dạng 0x00, với phạm vi từ 0-F cho mỗi ký tự. Do đó, một thanh ghi 16 bit tương đương với hai byte, được biểu diễn ở định dạng 0x0000. 

Đặc tả Modbus định nghĩa ba loại PDU:

  • Yêu cầu Modbus
  • Phản hồi Modbus
  • Phản hồi ngoại lệ Modbus

Master khởi tạo yêu cầu bằng cách sử dụng mã chức năng, trong khi slave gửi phản hồi để đáp lại yêu cầu đó. Phản hồi thành công lặp lại mã chức năng mà master đã gửi đến. Phản hồi ngoại lệ trả về cùng mã chức năng, nhưng bit cao nhất (bit có trọng số lớn nhất) được đặt thành 1 để cho biết đã xảy ra lỗi. 

Đặc tả Modbus định nghĩa một số mã chức năng. Mã chức năng 0x01 là chức năng Đọc coil.

Hình 4 minh họa một yêu cầu và phản hồi đọc coil có thể trông như thế nào. Master Modbus gửi yêu cầu với mã chức năng 0x01 (Đọc coil), bắt đầu từ mục dữ liệu đầu tiên (địa chỉ 0x0000) và chỉ đọc một coil. Chức năng Đọc coil có thể được dùng để đọc tối đa 2000 (0x7D0) coil cùng lúc. 

 

Hình 4. Giao dịch đọc coil

 

Nếu thành công, slave sẽ phản hồi bằng cùng mã chức năng và số lượng coil mà nó đang phản hồi. Trạng thái coil sẽ có độ dài n byte, trong đó mỗi bit biểu thị coil tương ứng đang BẬT (1) hay TẮT (0).

Trong trường hợp này, coil tại địa chỉ 0x0000 đang BẬT. Nếu yêu cầu không thành công, phản hồi ngoại lệ sẽ chứa mã chức năng với bit cao nhất được đặt thành 1 (0x81), cùng với một mã ngoại lệ giải thích nguyên nhân. Mã ngoại lệ 0x02 có nghĩa là đã sử dụng địa chỉ dữ liệu không hợp lệ, tức là không có coil nào tại 0x0000 trong bộ nhớ của slave này. 

Ví dụ tiếp theo minh họa giao dịch ghi một thanh ghi đơn (mã chức năng 0x06). Trong ví dụ này, master yêu cầu ghi dữ liệu 0xA0A0 vào địa chỉ 0x00FF. Phản hồi của slave chỉ đơn giản là lặp lại yêu cầu.

Phản hồi ngoại lệ trong ví dụ này hiển thị mã chức năng với bit cao nhất được đặt thành 1, cùng với mã ngoại lệ 0x04. Mã này có nghĩa là đã xảy ra lỗi không thể khắc phục khi thiết bị slave đang cố gắng thực hiện yêu cầu. 

 

Hình 5. Giao dịch ghi một thanh ghi đơn 

 

Tất cả mã chức năng Modbus đều tuân theo một mẫu tương tự như hai ví dụ ở trên.

Hình 6 liệt kê các mã chức năng phổ biến cùng với các mã ngoại lệ dùng cho phản hồi ngoại lệ. Để biết thêm thông tin, hãy tham khảo đặc tả Modbus. 

 

Hình 6. Mã chức năng và mã ngoại lệ

 

Kết luận

Modbus cho phép các PLC giao tiếp với mọi loại thiết bị từ xa, bao gồm các khối I/O, thiết bị đầu cuối và các bộ điều khiển khác, bằng cách sử dụng một phương thức tiêu chuẩn để đọc và ghi cả thông tin rời rạc lẫn thông tin số nguyên, đáp ứng gần như mọi trường hợp liên quan đến việc truyền dữ liệu số.

Modbus hiện là một tiêu chuẩn trong ngành và là giao thức công nghiệp miễn phí bản quyền được sử dụng rộng rãi nhất cho đến nay, mặc dù nó có trước hầu hết các hệ thống điều khiển hiện đại. Modbus có mặt tại các nhà máy và cơ sở sản xuất trên toàn thế giới, và dù đã tồn tại lâu năm, giao thức này chắc chắn vẫn sẽ là một giao thức công nghiệp phù hợp trong nhiều năm tới.

 

Bài viết gốc được xuất bản vào năm 2019

Để lại bình luận

Xin lưu ý, bình luận cần được phê duyệt trước khi được đăng.