Giữa mã đẹp đẽ và thiết bị thật là một lớp giao tiếp, và đó là nơi phần lớn thời gian gỡ lỗi bị tiêu tốn trong giai đoạn đầu của mọi dự án robot.
Các chuẩn thường gặp
Cổng nối tiếp. Đơn giản nhất, một thiết bị một cổng. Dễ gỡ lỗi vì đọc được bằng công cụ đầu cuối. Không hợp với nhiều thiết bị hoặc khoảng cách xa.
Bus vi sai nhiều thiết bị. Nhiều thiết bị trên cùng đôi dây, chống nhiễu tốt, khoảng cách xa. Phổ biến trong công nghiệp và trong robot.
Bus tốc độ cao nội bộ. Nối các chip trên cùng bo mạch. Khoảng cách rất ngắn và nhạy với nhiễu.
Ethernet. Băng thông cao, khoảng cách xa, nhiều thiết bị. Có biến thể thời gian thực cho ứng dụng cần đảm bảo độ trễ.
Cổng cắm nóng. Tiện cho thiết bị ngoài như camera. Vấn đề với robot là kết nối có thể mất do rung, và tên thiết bị đổi giữa các lần khởi động.
Chân vào ra số. Đơn giản nhất — bật tắt, đọc mức. Cho tín hiệu an toàn và cho cảm biến đơn giản. Đáng tin nhất trong tất cả.
Chọn theo yêu cầu. Một thiết bị gần thì nối tiếp. Nhiều thiết bị trong môi trường nhiễu thì bus vi sai. Dữ liệu lớn thì Ethernet. An toàn thì chân số trực tiếp.
Thiết kế giao thức
Cấu trúc gói. Dấu bắt đầu, độ dài, mã lệnh, dữ liệu, mã kiểm tra. Đơn giản và đủ cho hầu hết nhu cầu.
Mã kiểm tra là bắt buộc. Không có nó thì nhiễu biến thành lệnh chuyển động. Đây không phải chi tiết tuỳ chọn.
Đồng bộ lại sau lỗi. Nếu mất byte giữa chừng, bộ nhận phải tìm lại được dấu bắt đầu của gói tiếp theo thay vì lệch mãi.
Số thứ tự gói. Phát hiện được gói mất hoặc gói đến sai thứ tự.
Xác nhận. Với lệnh quan trọng, thiết bị phải báo đã nhận. Gửi rồi hy vọng là không đủ với lệnh điều khiển chuyển động.
Cơ chế nhịp tim. Hai bên gửi tín hiệu định kỳ. Không nhận được trong một khoảng thì coi như mất kết nối và chuyển sang trạng thái an toàn.
Đây là cơ chế an toàn quan trọng nhất. Nó đảm bảo robot dừng khi máy tính treo hoặc cáp đứt, thay vì chạy tiếp theo lệnh cuối.
Định dạng dữ liệu. Thống nhất thứ tự byte và kiểu số. Nhầm ở đây cho giá trị vô lý và rất khó nhận ra.
Xử lý lỗi kết nối
Giả định kết nối sẽ hỏng. Cáp lỏng, thiết bị khởi động lại, nhiễu gây mất gói. Đây là điều kiện bình thường.
Thời gian chờ. Mọi thao tác đọc phải có giới hạn thời gian. Đọc chờ vô hạn làm treo cả chương trình.
Thử lại có giới hạn. Thử lại vài lần rồi báo lỗi. Thử lại vô hạn che giấu vấn đề thật.
Kết nối lại tự động. Thiết bị mất kết nối thì thử mở lại định kỳ. Và khi kết nối lại thì đặt lại trạng thái thiết bị về mức đã biết.
Đừng dùng dữ liệu cũ. Nếu không nhận được cập nhật, đừng tiếp tục dùng giá trị cuối như thể nó mới. Đánh dấu là cũ và xử lý phù hợp.
Báo rõ ràng. Lỗi kết nối phải hiển thị cho người vận hành với thông tin cụ thể — thiết bị nào, lỗi gì. Không phải mã lỗi khó hiểu.
Ghi thống kê. Số gói mất, số lần kết nối lại. Xu hướng tăng là dấu hiệu cáp hoặc đầu nối đang xuống cấp, và nó cho cảnh báo trước khi hỏng hẳn.
Gỡ lỗi kết nối
Chia làm hai. Vấn đề ở phần cứng hay phần mềm. Thử với công cụ đơn giản trước — đọc cổng bằng công cụ đầu cuối và xem có dữ liệu không.
Kiểm cáp trước. Rút cắm lại, thử cáp khác. Nghe đơn giản và là nguyên nhân thường gặp nhất.
Kiểm nguồn thiết bị. Thiết bị không đủ điện có thể khởi động rồi tắt liên tục.
Kiểm tốc độ và tham số cổng. Tốc độ không khớp cho ra dữ liệu rác. Triệu chứng là nhận được byte nhưng vô nghĩa.
Kiểm quyền truy cập. Trên hệ điều hành, chương trình có thể không có quyền mở cổng. Lỗi này gây bối rối vì nó không liên quan gì tới phần cứng.
Ghi lại byte thô. Trước khi phân tích gói. Nhìn dữ liệu thô cho biết ngay là không có dữ liệu, có nhưng rác, hay có và đúng nhưng phân tích sai.
Máy phân tích giao thức. Với bus phức tạp, thiết bị đo chuyên dụng cho thấy đúng những gì đi trên đường truyền. Đắt nhưng tiết kiệm nhiều ngày.
Kiểm với thiết bị khác. Cùng loại. Xác định vấn đề ở thiết bị cụ thể hay ở hệ thống.
Trừu tượng hoá phần cứng
Vì sao cần. Đổi loại động cơ hoặc cảm biến là chuyện sẽ xảy ra. Mã ứng dụng không nên biết chi tiết thiết bị cụ thể.
Cách làm. Định nghĩa giao diện chung — đọc vị trí, đặt vận tốc, đọc trạng thái. Mỗi loại thiết bị có một lớp cài đặt giao diện đó.
Lợi ích. Đổi thiết bị chỉ cần viết lớp mới. Và viết được lớp giả để kiểm thử không cần phần cứng.
Lớp giả rất giá trị. Cho phép phát triển và kiểm thử phần lớn hệ thống khi phần cứng chưa có hoặc đang bận.
Đừng trừu tượng quá mức. Cố tạo giao diện chung cho mọi loại thiết bị có thể có thì giao diện trở nên phức tạp và khó dùng. Trừu tượng cho những gì thực sự có nhiều lựa chọn.
Giữ đường thoát. Một số thiết bị có tính năng riêng không nằm trong giao diện chung. Cần cách truy cập chúng khi cần.
Ghi rõ giả định. Giao diện giả định đơn vị gì, hệ toạ độ nào, chiều dương nào. Không ghi rõ thì mỗi lớp cài đặt hiểu một kiểu.
Câu hỏi thường gặp
Cơ chế an toàn quan trọng nhất trong giao tiếp với phần cứng?
Nhịp tim — hai bên gửi tín hiệu định kỳ, không nhận được trong một khoảng thì chuyển sang trạng thái an toàn. Nhờ đó robot dừng khi máy tính treo hoặc cáp đứt.
Vì sao mã kiểm tra trong gói dữ liệu là bắt buộc?
Vì không có nó thì nhiễu trên đường truyền có thể biến thành lệnh chuyển động. Đây không phải chi tiết tuỳ chọn với hệ thống điều khiển thật.
Bước gỡ lỗi kết nối đầu tiên nên làm gì?
Ghi lại byte thô trước khi phân tích gói. Nhìn dữ liệu thô cho biết ngay là không có dữ liệu, có nhưng rác, hay có và đúng nhưng phân tích sai.
Lợi ích của lớp trừu tượng phần cứng?
Đổi thiết bị chỉ cần viết lớp mới, và viết được lớp giả để phát triển cùng kiểm thử phần lớn hệ thống khi phần cứng chưa có hoặc đang bận.
Đọc thêm trong Bảo trì & phụ tùng và Hiệu chỉnh & căn chỉnh.