Xây dựng thuật toán gửi và nhận tín hiệu CAN

Một phần của tài liệu Nghiên cứu và thử nghiệm máy chẩn đoán cơ bản (Trang 62 - 67)

Thuật toán tín hiệu CAN cũng được xây dựng đi kèm với các chế độ hiển thị. 5.2.3.1. ID và vùng dữ liệu trong tin nhắn CAN

Thư viện CAN đã cài đặt có ví dụ về cách gửi và nhận tin nhắn trong mạng CAN. Do mạng CAN được phổ biến khá rộng rãi trên ô tô nên thư viên CAN đi kèm một ví dụ có liên quan đến OBD-II, đọc các thông số của động cơ thông qua giao thức CAN trên ECU động cơ. Trước khi chạy thử code mẫu, chúng ta phải biết rằng chúng ta chỉ can thiệp vào tin nhắn CAN ở vùng điều khiển (ID) và vùng dữ liệu của tin nhắn ở cả tin nhắn gửi đi và nhận về với các yêu cầu theo tiêu chuẩn OBD-II.

Hình 5.12. Cấu trúc ID vùng dữ liệu trong tin nhắn CAN theo tiêu chuẩn OBD-II

Để hiểu rõ hơn về từng byte trong vùng dữ liệu, chúng ta có ví dụ sau về việc yêu cầu và nhân thông tin về Tốc độ xe qua mạng CAN.

Identifier (ID): Đối với các thông báo OBD-II, mã ID theo chuẩn 11-bit và được

sử dụng để phân biệt giữa “Request Massages” (ID 7DF) và “Response Massages” (ID 7E8 đến 7EF). Với ID 7E8 thường sẽ là nơi động cơ chính hoặc ECU phản hồi.

Length: Byte đầu tiên của Vùng dữ liệu phản ánh độ dài theo số byte của dữ liệu

còn lại (03 - 06). Đối với ví dụ về Tốc độ Xe, nó là 02 cho yêu cầu (vì chỉ có 01 và 0D theo sau), trong khi đối với phản hồi là 03 vì cả 41, 0D và 32.

Mode: Đối với các yêu cầu, điều này sẽ nằm trong khoảng 01-0A. Đối với các tin

nhắn phản hồi, số 0 được thay thế bằng 4 (tức là 41, 42,…, 4A). Có 10 chế độ như được mô tả trong tiêu chuẩn SAE J1979 OBD2.

Mode (HEX) Mô tả

01 Hiển thị dữ liệu hiện tại

02 Hiển thị dữ liệu khung đóng băng

03 Hiển thị mã lỗi đã lưu trữ

04 Xóa mã lỗi và giá trị đã lưu

05 Các kết quả kiểm tra, giám sát cảm biến oxy

06 Các kết quả kiểm tra, giám sát các thành phần/hệ thống khác

07 Hiển thị mã lỗi đang chờ xử lý trong chu kì lái xe cuối cùng

08 Kiểm tra hoạt động của các thành phần/hệ thống trên xe

09 Yêu cầu thông tin xe

0A Hiển thị các mã lỗi đã xuất hiện (đã xóa)

Bảng 5.5. Các chế độ chẩn đoán của OBD-II

PID: Đối với mỗi chế độ, chúng ta có một danh sách các PID OBD-II tiêu chuẩn

đầy đủ được tổng hợp trên Wikipedia OBD-II PIDs và mỗi PID có một mô tả và một số có công thức chuyển đổi và tối thiểu/tối đa được chỉ định. Ví dụ: trong Chế độ 01, PID 0D là Tốc độ Xe với công thức tính là A.

Công thức cho tốc độ: A, có nghĩa là byte dữ liệu A (ở dạng HEX) được chuyển

đổi thành số thập phân để nhận giá trị được chuyển đổi km/h (32 trở thành 50 km/h).

A, B, C, D: Đây là các byte dữ liệu trong HEX, cần được chuyển đổi sang dạng

thập phân trước khi chúng được sử dụng trong tính toán công thức PID. Lưu ý rằng byte dữ liệu cuối cùng (sau byte D) không được sử dụng.

5.2.3.2. Code mẫu chế độ “Đọc dữ liệu hiện tại”

Hình 5.15. Đường dẫn Code OBD-II mẫu theo thư viện CAN

Hình 5.16. Cấu trúc vùng dữ liệu trong tin nhắn CAN yêu cầu (adsbygoogle = window.adsbygoogle || []).push({});

Hình 5.17. Vùng dữ liệu trong tin nhắn CAN phẩn hồi tốc độ xe

Như vậy, cấu trúc tin nhắn CAN yêu cầu và phản hồi luôn tuân theo tiêu chuẩn OBD-II cho Vùng điều khiển (ID) và Vùng dữ liệu. Từ một thông số đơn giản có thể phát triển thành nhiều thông số yêu cầu khác như RPM, Nhiệt độ nước làm mát động cơ,… để đáp ứng yêu cầu đọc dữ liệu hiện tại của thiết bị chẩn đoán. Dưới đây là một vài thông số khác đọc được từ ECU động cơ theo cách tương tự. Mọi thử nghiệm đều được tiến hành trên Mô hình mô phỏng ECU động cơ Kia Morning 2011.

Hình 5.18. Một vài thông số từ ECU trong chế độ đọc dữ liệu hiện tại chuẩn OBD-II 5.2.3.3. Chế độ đọc mã lỗi lưu trữ

Hình 5.19. Chương trình gửi tin nhắn CAN cho các chế độ của OBD-II

Hình 5.20. Vùng dữ liệu tin nhắn CAN phản hồi

Cấu trúc gửi và nhận tương tự bằng cách thay đổi byte thứ nhất (Length) thành 0x01 và byte thứ hai (Mode) thành 0x03 và gửi yêu cầu.

Với tin nhắn phản hồi, ta có các Byte dữ liệu 1 và 2 như ở chế độ “Đọc dữ liệu hiện tại”. Byte dữ liệu thứ 3 là số mã lỗi trong 1 tin nhắn CAN, có từ 0 đến 2 mã lỗi cho 1 tin nhắn (0x00 – 0x02) với hai byte dữ liệu 4 và 5 cho một mã lỗi, 6 và 7 cho một mã lỗi. Khi có được các byte dữ liệu, chúng ta cần chuyển đổi các byte đấy thành các Mã lỗi chẩn đoán OBD-II theo cấu trúc sau:

Hình 5.21. Chuyển đổi hai kí tự đầu trong mã lỗi chẩn đoán OBD-II

Với 4 bit theo hệ Nhị phân, tức số đầu tiên trong byte dữ liệu thứ 4 đã nhận được, chúng ta chuyển đổi thành 2 kí tự đầu trong một mã lỗi “P0,P1,…,U3,U4”.

Với các kí tự còn lại trong mã lỗi chẩn đoán OBD-II tương ứng với số còn lại trong byte dữ liệu thứ 4 và 2 số trong byte dữ liệu thứ 5 theo hệ Thập lục phân. Với byte dữ liệu thứ 6 và 7 cũng chuyển đổi tương tự. Trường hợp không có mã lỗi thì byte dữ liệu thứ 3 là 0x00 và các byte dữ liệu sau đó đều 0x00. Trường hợp có 1 mã lỗi, byte dữ liệu thứ 3 là 0x01 và chỉ có dữ liệu ở byte dữ liệu thứ 4 và 5, byte dữ liệu 6 và 7 đều là 0x00. Trường hợp có nhiều hơn 2 mã lỗi thì ECU sẽ gửi nhiều khung tương tự liên tiếp nhau để thể hiện toàn bộ mã lỗi hiện tại.

5.2.3.4. Chế độ xóa mã lỗi

Tương tự các chế độ trên, chế độ xóa mã lỗi cũng tương tự với byte dữ liệu thứ 2 trong tin nhắn CAN yêu cầu là 0x04 và không có tin nhắn CAN phản hồi từ ECU.

Một phần của tài liệu Nghiên cứu và thử nghiệm máy chẩn đoán cơ bản (Trang 62 - 67)