Nam Nam gửi vào
- 23592 lượt xem
Chào các bạn, trong series bài viết về Modbus RTU mình sẽ bỏ qua các lí thuyết hàn lâm mà các bạn dễ tìm hiểu qua wikipedia (https://en.wikipedia.org/wiki/Modbus) mà chủ yếu tập trung vào cung cấp code, phần cứng và chỉ các bước để các bạn giao tiếp được từ arduino với các thiết bị có hỗ trợ truyền thông Modbus RTU như các đồng hồ điện, đồng hồ nước, các cảm biến trong công nghiệp...
1. Modbus RTU là gì?
-
Modbus là một giao thức truyền thông nối tiếp ban đầu được Modicon (nay là Schneider Electric) trình làng năm 1979 để sử dụng với các bộ điều khiển logic lập trình (PLC). Modbus đã trở thành một giao thức truyền thông tiêu chuẩn thực tế và hiện là phương tiện phổ biến để kết nối các thiết bị điện tử công nghiệp.
-
Giao thức Modbus RTU là một giao thức mở, sử dụng đường truyền vật lý RS-232 hoặc RS485 và mô hình dạng Master-Slave. Đây là một giao thức được sử dụng rộng rãi trong nhiều lĩnh vực tự động hóa, công nghiệp.... vì những ưu điểm ổn định - đơn giản - dễ dùng.
-
Modbus được coi là giao thức truyền thông hoạt động ở tầng "Application", cung cấp khả năng truyền thông Master/Slave giữa các thiết bị được kết nối thông qua các bus hoặc network. Trên mô hình OSI, Modbus được đặt ở lớp 7. Modbus được xác định là một giao thức hoạt động theo "hỏi/đáp" và sử dụng các "function codes" tương ứng để hỏi đáp.
Ưu điểm của modbus RTU (dùng RS485) là gì?
- Đơn giản về kết nối vì chỉ với 2 dây chúng ta có thể giao tiếp master với nhiều node.
- Khoảng cách xa (1200m).
- Phần cứng giá rẻ, hệ sinh thái tốt, dùng phổ biến trong công nghiệp.
Cấu trúc frame truyền Modbus RTU
Một frame truyền Modbus RTU bao gồm: 1 byte địa chỉ - 1 byte mã hàm - n byte dữ liệu - 2 byte CRC như hình ở dưới:
Chức năng và vai trò cụ thể như sau:
-
Byte địa chỉ: xác định thiết bị mang địa chỉ được nhận dữ liệu (đối với Slave) hoặc dữ liệu nhận được từ địa chỉ nào (đối với Master). Địa chỉ này được quy định từ 0 - 254
-
Byte mã hàm: được quy định từ Master, xác định yêu cầu dữ liệu từ thiết bị Slave. Ví dụ mã 01: đọc dữ liệu lưu trữ dạng Bit, 03: đọc dữ liệu tức thời dạng Byte, 05: ghi dữ liệu 1 bit vào Slave, 15: ghi dữ liệu nhiều bit vào Slave ...
-
Byte dữ liệu: xác định dữ liệu trao đổi giữa Master và Slave.
-
Đọc dữ liệu:
-
Master: 2 byte địa chỉ dữ liệu - 2 byte độ dài dữ liệu
-
Slave: 2 byte địa chỉ dữ liệu - 2 byte độ dài dữ liệu - n byte dữ liệu đọc được
-
-
Ghi dữ liệu:
-
Master: 2 byte địa chỉ dữ liệu - 2 byte độ dài dữ liệu - n byte dữ liệu cần ghi
-
Slave: 2 byte địa chỉ dữ liệu - 2 byte độ dài dữ liệu
-
-
- Byte CRC: 2 byte kiểm tra lỗi của hàm truyền. cách tính giá trị của Byte CRC 16 Bit
Ngoài Modbus RTU còn có nhiều loại Modbus khác như Modbus TCP, Modbus ASCII, Modbus UDP, Modbus Plus, Pemex Modbus, Enron Modbus.
Modbus TCP - Sự khác nhau cơ bản giữa MODBUS RTU và MODBUS TCP ( còn được gọi là modbus IP, Modbus Ethernet hay Modbus TCP/IP) là Modbus TCP chạy ở cổng vật lý Ethernet và Modbus RTU thì chạy ở cổng vật lý serial nối tiếp ( RS232 hoặc RS485).
Modbus ASCII - cho phép người đọc có thể đọc trực tiếp tin nhắn trong bản tin. Modbus ASCII không thể giao tiếp với modbus RTU và ngược lại.
Modbus UDP. - Một số người đã thử nghiệm sử dụng Modbus qua UDP trên mạng IP, loại bỏ các thủ tục cần thiết cho TCP.
Modbus Plus - (Modbus +, MB + hoặc MBP) - Modbus Plus là độc quyền của Schneider Electric và không giống như các biến thể khác, nó hỗ trợ liên lạc ngang hàng giữa nhiều chủ. Nó đòi hỏi một bộ đồng xử lý chuyên dụng để xử lý xoay vòng mã thông báo giống như HDLC nhanh . Nó sử dụng cặp xoắn với tốc độ 1 Mbit / s và bao gồm cách ly máy biến áp ở mỗi nút, làm cho nó chuyển đổi / kích hoạt cạnh thay vì kích hoạt điện áp / cấp độ.
Pemex Modbus - Đây là một phần mở rộng của Modbus tiêu chuẩn, nó được thiết kế cho công ty dầu khí Pemex để sử dụng trong kiểm soát quá trình và không bao giờ được áp dụng rộng rãi.
Enron Modbus - Đây là một phần mở rộng khác của Modbus tiêu chuẩn được phát triển bởi Enron Corporation.
Sơ qua về Modbus RTU là vậy, các bạn có thể tự tìm hiểu thêm. Chúng ta sẽ qua phần 2 với những thông tin hưu dụng hơn.
2. Cách giao tiếp Modbus RTU.
Modbus RTU có mô hình dạng Master-Slave, dùng đường truyền vật lí RS485 nên để giao tiếp được giữa master và slave ta phải cài đặt các thông số về tốc độ truyền baudrate (4800.9600.115200...), số data bit (7-8), bit stop (0-1-2) , Flag Parity kiểm tra chẵn lẻ (None, Event, Odd). Ngoài các thông số trên phản giống nhau giữa master và slave, thì bên master phải biết được ID của slave cần giao tiếp.
Mỗi thiết bị trong mạng modbus được cung cấp một địa chỉ duy nhất. Trong mạng modbus chỉ có 1 node được gán là Master (ta gọi là Master, các node còn lại gọi là Node) mới có thể khởi tạo lệnh. Trong frame truyền có chứa địa chỉ của thiết bị slave (1 đến 247), chỉ thiết bị có ID tương ứng mới đáp ứng, mặc dù các thiết bị khác có thể nhận được nó (một ngoại lệ là các lệnh có thể phát được cụ thể được gửi đến nút 0, được thực hiện nhưng không được xác nhận). Tất cả các lệnh Modbus chứa thông tin tổng kiểm tra (check sum CRC) để cho phép người nhận phát hiện lỗi truyền. Master sẽ đọc và ghi các dữ liệu vào thanh ghi của thiết bị slave.
Cách đấu nối
A- (Master) <------> A- (Slave)
B+ (Master) <------> B+ (Slave)
GND (Master) <-------> GND (Slave)
Dây GND cần nối trong trường hợp khu vực đấu nối ở vùng nhiều sấm sét, máy móc hoạt động dòng lớn, nhiễu phức tạp...để tránh bị phá hỏng thiết bị hoặc tín hiệu thu được bị sai. Điện thế chênh lệch giữa GND hai bên tối đa là 7V.
Nếu thiết bị cần đọc là một đồng hồ điện (ví dụ Select MFM383A) thì mạch arduino của chúng ta sẽ làm master để truy xuất vào đọc thanh ghi của nó. Các thông số baud rate, data bit, bit stop, parity chúng ta phải cài đặt đồng bộ giữa mastter và slave. Thông thường với các slave là đồng hồ điện, đồng hồ nước, cảm biến..chúng ta sẽ xem chúng ở màn hình cài đặt hay ở manual, datasheet của thiết bị. Ở phần code arduino chúng ta sẽ chỉnh sửa các thông tin đó cho giống trên thiết bị hoặc với các thiết bị có LCD đa số chúng ta đều set được các thông số đó cho salve. Nếu cần đọc các thanh ghi chứa dữ liệu của slave chúng ta sẽ dùng các function code 01, 02, 03, 04.
- FC01: Đọc trạng thái coil, một coil là một giá trị output. Số coil numbers kéo dài từ 0 00001 đến 0 65536 ,
- FC02: Đọc trạng thái input, số discrete input kéo dài từ 1 00001 đến 1 65536,
- FC04: Đọc các input register, số input register trải dài từ 3 00001 đến 3 65536,
- FC03: Đọc các holding register, số holding register trải dài từ 4 00001 đến 4 65536.
Khi xem manual ta thường chú ý tới địa chỉ thanh ghi nào chứa dữ liệu gì.
Nhìn vào hình này chúng ta sẽ thấy địa chỉ 30002 chứa giá trị điện áp V2N , vậy ta sẽ hiểu địa chỉ ở đây là 0x02, Function code là 04, kiểu dữ liệu là float, độ dài thanh ghi là 2. Để tránh nhầm lẫn giữa function code và địa chỉ thanh ghi người ta quy định độ dài FC+ADDRESS là 6, ở hình trên ta thấy độ dài của 30002 là 5 ta sẽ hiểu rằng 030002, vậy FC là 03, addr là 2. Mỗi thanh ghi sẽ là 2 byte, ở đây theo ví dụ trên thì dữ liệu có độ dài 2 thanh ghi nghĩa là 4 byte. Gọi 4 byte đó là A,B,C,D vậy có thể dữ liệu được lưu trong thanh ghi sẽ là ABCD với AB lưu ở thanh ghi địa chỉ thấp, CD lưu ở thanh ghi địa chỉ cao. Hoặc cũng có thể là CDAB... Vì vậy chỉ biết kiểu dữ liệu thôi là chưa đủ, chúng ta cần phải biết dữ liệu đang được lưu dạng nào.
Một chú ý khi chúng ta làm việc với các device hỗ trợ truyền thông modbus là ở các device dữ liệu sẽ nằm trong các thanh ghi có địa chỉ tờ 1 tới 10000, nhưng ở trong frame truyền (Modbus message) các điịa chỉ được dùng giữa 0 tới 9999 vì vậy ở đây chúng ta sẽ phải ofset nếu muốn đọc/ghi tới chính xác địa chỉ cần làm việc. Ví dụ các bạn muốn đọc thanh ghi 30069 (FC04, địa chỉ 69 DEC) thì trong frame truyền chúng ta sẽ chỉ định giá trị là 68. .
Ở phần này mình chỉ note một vài ý chính để phục vụ cho bào viết sau, vì kiến thức bản thân có hạn nên mình không tình bày hết được về modbus mà chỉ chủ yếu tập trung giúp các bạn nắm các phần cơ bản để đẻ có khái niệm về modbus rtu.
3. Độ phổ biến và các ứng dụng với modbus RTU thường gặp.
Ở cộng đồng arduino chúng ta thì việc sử dụng modbus rtu chưa nhiều nhưng ở mảng điện công nghiệp chúng ta sẽ rất dễ bắt gặp các thiết bị như cảm biến nhiệt, áp suất, PLC, đồng hộ điện, đồng hồ nước....sử dụng modbus RTU. Cuộc cách mạng 4.0 đã được khởi xướng, cộng đồng IoT, IIoT ngày càng lớn mạnh nên chúng ta sẽ ngày càng thấy nhiều thiết bị điện tử của các anh em chúng ta dần lấn sân sang điện công nghiệp vốn từ lâu chỉ là sân chơi của các thiết bị của các hãng tên tuôi như Mitsu, ABB, Simen, Sneighder, Omron, IFM.... Một vài ứng dụng thường gặp như:
-VD1: Điều khiển hệ thống mạng lưới các quạt làm mát trong trang trại, phân xưởng sản xuất. Với yêu cầu này theo các truyền thống chúng ta sẽ kéo từng cặp dây nguồn từ tủ điện trung tâm tới quạt. Thử tưởng tượng số lượng quạt lên tới 30 cái thì chúng ta phải kéo 30 dây nguồn tới 30 cái quạt mới có thể điều khiển đôc lập bật/tắt từng cái, hoặc nếu chỉ kéo một dây nguồn nhưng lại sử dụng 30 công tắc để cấp nguồn cho từng quạt thì mỗi khi muốn bật/tắt quạt nào chúng ta phải tới vị trí từng quạt đó rất mất thời gian. Vậy giải pháp tối ưu nhất là ta chỉ cần kéo dây 4 lõi với 2 dây A,B của truyền thông modbus rtu và 2 dây nguồn là đã có thể đáp ứng đủ yêu cầu bật tắt từng mà không cần kéo từng dây nguồn từ tủ điện tới từng quạt. Tại mỗi quạt ta có một node slave, với 30 quat ta sẽ có 30 slave id từ 1 tới 30. Vì vậy sẽ tiết kiệm được thời gian triển khai dự án, đỡ nguy hai khi kéo một lưới điện âm sàn, âm tường, hay treo như một mạng nhện trên đầu, tiềm ẩnn nguy cơ chập cháy. Ngoài tiết kiệm thời gian, công sức thi công chúng ta còn tiết kiệm được một lượng lớn dây điện đủ để bù vào chi phí tạo ra các node modbus rtu. Mở rộng ra với ứng dụng vào các device như hệ thống van nước trong vườn, đồng hồ điện năng tiêu thụ từng phòng, từng nhà trong building....
-VD2: Đưa các giá trị từ PLC về trung tâm giám sát và điều khiển. Việc sử dụng mạng internet ở các nhà máy, khu công nghiệp thường hay bị chặn các port vì vậy từ PLC rất khó để đưa các dữ liệu ra ngoài ở một khu vực các xa đó. Vì vậy giải pháp thường dùng là sử dụng GPRS, 3G, 4G của các nhà mạng di động như Viettel, Vinaphone, Mobiphone..chúng ta sẽ đỡn tránh rắc rối trong việt NAT port, xin phép, thủ tục....Vậy với các mạch điện tử của anh em chúng ta vốn chỉ có các cổng uart làm sao để có thể giao tiếp với PLC? Câu trả lời đơn giản là dùng module chuyển đổi giao tiếp UART to RS485 và sau đó sử dụng giao thức modbus rtu để giao tiếp với PLC. Việc này đòi hỏi PLC phải có cổng giao tiếp modbus RTU nhưng các bạn yêu tầm là đa số các PLC đều có cổng giao tiếp này và nó ngày càng phổ biến thay thế dần các cổng RS232.
Lan man lí thuyết vậy mình nghĩ đủ rồi, ở bài viết sau chúng ta sẽ đi nhanh vào ứng dụng dùng con arduino esp32 để đọc giá trị chứa trong các thanh ghi của đồng hồ điện select mfm383a.
Nếu bạn nào không có sẵn các thiết bị hỗ trợ chuẩn truyền thông modbus rtu thì chúng ta vẫn thực hành được bằng cách dùng tool mô phỏng modbus device bằng chính laptop/PC của chúng ta.
Hi vọng bài viết có ích cho bạn đọc.
Chào thân ái và hẹn gặp lại ở bài viết sau.