Giá trị rỗng và số không trong macro FANUC: vì sao thêm “cộng 0” lại đổi nghĩa của tham số bỏ trống?
Dựa trên quy tắc macro 16i/18i-MB, phân biệt biến chưa xác định, số không, phép gán trực tiếp và chuyển đổi qua số học. Bảng điều kiện và vị trí tự xây dựng cho thấy phải nhận diện đầu vào bỏ trống trước khi tính, không dùng phép thử khác không để xác nhận tham số đã được cung cấp.
Mục lục
Cho phép bỏ một đầu vào macro và cho phép nhập số 0 là hai điều khác nhau. Nếu chương trình nhập nhằng hai trạng thái, đầu vào rỗng vốn có nghĩa “trục này không tham gia” có thể bị đổi thành “tọa độ đích của trục này là không”.
Quy tắc của phiên bản này: rỗng không phải cách viết khác của 0
Sổ tay vận hành FANUC 16i/18i-MB B-63534EN/02, §15.1 trang 394–395 và §15.5 trang 414 (bản sao công khai của tài liệu gốc nhà sản xuất) nêu rằng #0 luôn rỗng; khi biến rỗng được dùng trực tiếp làm giá trị địa chỉ trục, địa chỉ đó bị bỏ qua. Gán trực tiếp giữ được trạng thái rỗng, còn khi tham gia số học thì được xử lý như 0. EQ và NE phân biệt rỗng với 0; các phép so sánh khác xử lý rỗng như 0. Bài viết chỉ xét ngữ nghĩa Custom Macro của phiên bản này, không giả định thời gian tồn tại của biến giống nhau ở dòng khác.
Tính toán trước có thể làm mất thông tin “chưa được cung cấp”
Trong ví dụ tự xây dựng, biến đầu vào #1 là tọa độ Y tuyệt đối tùy chọn. Sau khi đọc đầu vào, gán trực tiếp #2=#1 sẽ giữ #2 rỗng nếu #1 rỗng; nếu đổi thành #2=#1+0 để “thống nhất định dạng”, #2 trở thành số 0. Phép tính có vẻ không đổi giá trị nhưng đã đổi trạng thái đầu vào.
| Trạng thái đầu vào | #1 EQ #0 | #1 NE 0 | Kết quả của #1+0 |
|---|---|---|---|
| Chưa xác định | Đúng | Đúng | Số 0 |
| Nhập rõ 0 | Sai | Sai | Số 0 |
| Nhập rõ 12 | Sai | Đúng | Số 12 |
Vì vậy, “NE 0 đúng” không chứng minh bên gọi đã cung cấp đầu vào khác không: trạng thái chưa xác định cũng làm điều kiện này đúng. Cần nhận diện trạng thái bỏ trống trước khi nhân hệ số, cộng độ lệch hay áp dụng hàm toán học; nếu không, số 0 sau tính toán không còn cho biết nó xuất phát từ bỏ trống hay nhập rõ.
Hệ quả về đường đi có thể rất khác
Sau đây là minh họa hình học ngoại tuyến, không phải chương trình cắt. Giả sử hiện tại XY=(10,37) mm, chuyển động thẳng dùng tọa độ tuyệt đối, đích X là 32 và Y lấy từ #2; không có biến đổi tọa độ khác hay bù dao. Khi #2 rỗng, Y không được chỉ định, điểm cuối là (32,37), dài 22 mm; khi #2 bằng 0, điểm cuối thành (32,0), dài √(22²+37²)≈43.046 mm.
Khác biệt không chỉ là đường dài hơn mà còn thêm 37 mm dịch chuyển theo Y. Vì vậy, giao diện macro cần phân biệt trước “bỏ trống”, “nhập rõ không” và “giá trị khác”, rồi quyết định đầu vào có được phép hay không theo ý nghĩa ứng dụng. Không đơn giản cấm 0 trong giao diện vốn cho phép tọa độ không, cũng không dùng cộng 0 để âm thầm biến đầu vào thiếu thành tọa độ hợp lệ. Xem thêm về macro tại chuyên mục OPTION.