ASCII cho dữ liệu PLC: Mã thập phân, thập lục phân và mã điều khiển
Tìm hiểu cách các ký tự ASCII, giá trị thập phân, byte thập lục phân và mã điều khiển xuất hiện trong chuỗi PLC và tin nhắn nối tiếp, cùng với phương pháp thực tế để chẩn đoán lỗi khung và định dạng.
ASCII vẫn phổ biến trong các dự án PLC vì nhiều thiết bị công nghiệp trao đổi văn bản từng byte một. Bộ đọc mã vạch, máy in nhãn, cân, bộ truyền động, cổng nối tiếp và thiết bị đầu cuối vận hành thường biểu diễn lệnh và phép đo dưới dạng mã ký tự. Các kỹ sư có thể chuyển đổi giữa ký tự, giá trị thập phân và byte hệ thập lục phân sẽ xử lý sự cố các kết nối này nhanh hơn.
ASCII định nghĩa những gì
American Standard Code for Information Interchange nguyên bản là một bộ ký tự bảy bit. Nó định nghĩa 128 giá trị, được đánh số từ 0 đến 127. Các giá trị từ 0 đến 31 và 127 là ký tự điều khiển. Các giá trị từ 32 đến 126 là ký tự có thể in, bao gồm chữ cái, chữ số, dấu câu và khoảng trắng.
Đặc tả RFC 20 do IETF lưu trữ ghi lại vị trí mã và ý nghĩa dự kiến của chúng. Các hệ thống hiện đại thường lưu một ký tự ASCII trong một byte tám bit. Bit cao nhất luôn bằng 0 đối với ASCII tiêu chuẩn.
Thập phân, thập lục phân và nhị phân là cùng một byte
Một tag PLC có thể hiển thị cùng một giá trị ở nhiều định dạng số. Chữ A viết hoa là 65 ở dạng thập phân, 41 ở dạng thập lục phân và 01000001 ở dạng nhị phân. Chữ số 0 là 48 ở dạng thập phân hoặc 30 ở dạng thập lục phân. Đây không phải là các ký tự khác nhau. Chúng là những cách biểu diễn khác nhau của cùng một mẫu số.
Hệ thập lục phân rất hữu ích khi chạy thử vì một byte vừa trong hai chữ số hệ thập lục phân. Các bản ghi bắt gói, trình giám sát nối tiếp và tài liệu thiết bị cũng thường hiển thị giá trị byte ở dạng thập lục phân. Dạng thập phân thường thuận tiện hơn khi lệnh PLC yêu cầu hằng số số nguyên.
Mã điều khiển rất quan trọng trong các thông điệp công nghiệp
Nhiều giao thức nối tiếp sử dụng ký tự điều khiển làm dấu phân cách. Carriage return là 13 ở dạng thập phân hoặc 0D ở dạng thập lục phân. Line feed là 10 ở dạng thập phân hoặc 0A ở dạng thập lục phân. Start of Text là 02 ở dạng thập lục phân, trong khi End of Text là 03. Một thiết bị có thể bỏ qua một lệnh hợp lệ nếu thiếu ký tự kết thúc bắt buộc.
Đừng cho rằng mọi thiết bị đều sử dụng CR/LF. Một số chỉ yêu cầu CR. Một số khác sử dụng dấu phân cách có thể in, độ dài thông điệp cố định hoặc một byte checksum. Hãy xác nhận khung chính xác trong tài liệu giao thức của nhà sản xuất.
Cách chuỗi PLC trở thành mảng byte
Các nền tảng PLC lưu trữ chuỗi theo những cách khác nhau. Một số đặt độ dài hiện tại trước dữ liệu ký tự. Một số khác dành sẵn một mảng cố định và kết thúc văn bản bằng byte 0. Khi dữ liệu đi qua ranh giới giao thức, thiết bị nhận sẽ thấy các byte thay vì kiểu chuỗi nội bộ của bộ điều khiển.
Hãy kiểm tra cả độ dài chuỗi đã khai báo và bộ đệm bên dưới. Một byte cũ nằm sau độ dài hiện tại có thể xuất hiện trong dữ liệu truyền nếu một routine gửi toàn bộ bộ đệm. Hãy xóa đích hoặc chỉ truyền số ký tự đang hoạt động.
Phương pháp chẩn đoán thực tế
- Ghi lại chính xác các byte đã truyền bằng trình giám sát nối tiếp, bộ phân tích giao thức hoặc trang chẩn đoán của gateway.
- Viết từng byte ở dạng thập lục phân và ánh xạ các giá trị có thể in trở lại thành ký tự.
- Đánh dấu các byte tạo khung, ký tự kết thúc, dấu phân cách, trường độ dài và checksum.
- So sánh bản ghi với tài liệu thiết bị, bao gồm cả khoảng trắng và kiểu chữ hoa, chữ thường.
- Ghi lại lần nữa đối với một thông điệp đã biết là đúng và so sánh các vị trí byte.
Cách tiếp cận ở cấp byte này giúp phân biệt lỗi định dạng với các vấn đề về dây dẫn, tốc độ baud và parity. Nếu bản ghi hiển thị văn bản dễ đọc nhưng không đầy đủ, hãy tập trung vào việc ghép chuỗi. Nếu mọi byte đều sai, trước tiên hãy kiểm tra các cài đặt vật lý và nối tiếp.
Các lỗi triển khai thường gặp
Nhầm lẫn giữa chữ số và giá trị số của nó
Ký tự “5” là ASCII 53 ở dạng thập phân, không phải giá trị số nguyên 5. Việc chuyển một số đo thành văn bản cần một routine định dạng. Sao chép số nguyên thô vào bộ đệm ký tự sẽ tạo ra một byte điều khiển thay thế.
Trộn văn bản thập lục phân với byte nhị phân
Văn bản “41” chứa hai ký tự: 34 ở dạng thập lục phân và 31 ở dạng thập lục phân. Một byte duy nhất có giá trị 41 ở dạng thập lục phân biểu diễn chữ A. Hãy xác định giao thức yêu cầu văn bản thập lục phân mà con người có thể đọc hay dữ liệu nhị phân thô.
Bỏ qua các mã hóa ngoài ASCII
ASCII bao phủ các chữ cái tiếng Anh và một tập hợp ký hiệu hạn chế. UTF-8 sử dụng cùng các giá trị byte cho 128 ký tự đầu tiên, nhưng các ký tự không thuộc ASCII sử dụng nhiều byte. Một thiết bị cũ có thể từ chối các byte đó hoặc đếm chúng không chính xác.
Hướng dẫn thiết kế mã PLC dễ bảo trì
Hãy tập trung việc định dạng giao thức vào một routine. Đặt tên hằng số cho các mã điều khiển thay vì rải các giá trị số trực tiếp trong logic ladder hoặc structured text. Ghi nhật ký bộ đệm truyền cuối cùng ở dạng thập lục phân trong quá trình chạy thử. Đưa các ví dụ vào tài liệu dự án.
Khi giao thức phát triển vượt ra ngoài việc tạo khung văn bản đơn giản, hãy sử dụng một state machine được định nghĩa rõ ràng. Theo dõi riêng vị trí nhận, thời gian chờ, trạng thái khung và kết quả xác thực. Điều này giúp chẩn đoán các lần thử lại và thông điệp sai định dạng dễ hơn.
Để xem các mẫu xử lý dữ liệu tổng quát hơn, hãy tham khảo việc duyệt qua các mảng trong hệ thống PLC. Đối với các thiết bị nối mạng, hướng dẫn triển khai thiết bị Modbus TCP bổ sung bối cảnh về tạo khung và chạy thử.
Danh sách kiểm tra khi chạy thử
- Xác nhận bộ ký tự và thứ tự byte.
- Xác minh các dấu phân cách và ký tự kết thúc ở dạng thập lục phân.
- Kiểm tra xem thông điệp có độ dài cố định hay có tiền tố độ dài.
- Phân biệt văn bản thập lục phân có thể in với dữ liệu nhị phân thô.
- Xác thực hành vi của thời gian chờ, lần thử lại và việc xóa bộ đệm.
- Lưu trữ một bản ghi byte đã biết là đúng cùng với các tệp dự án.
ASCII đơn giản, nhưng các sự cố công nghiệp thường ẩn trong một byte bị thiếu hoặc bị đọc sai. Trước tiên hãy xem thông điệp như một chuỗi các giá trị số. Chỉ chuyển đổi nó trở lại thành văn bản sau khi đã hiểu rõ khung.