NX Lab

Thư mục 'thả file là xử lý' (hot folder): theo dõi thư mục, tự chạy NX xử lý file mới và chuyển sang đã xong

#Python#Tự động hóa#Hot folder1 lượt xem

  1. Quản trị viênQuản trị· 0 điểm

    Câu hỏi ·

    Mô hình hot folder: người dùng thả file .prt hoặc .stp vào thư mục 'vao', một dịch vụ nhỏ phát hiện và gọi NX xử lý, kết quả ra thư mục 'ra', file gốc chuyển sang 'da_xong' hoặc 'loi'. Dịch vụ là Python ngoài NX, gọi run_journal.

    Thư mục 'thả file là xử lý' (hot folder) Thư mục 'thả file là xử lý' (hot folder)

    Các bước thực hiện

    1. Thiết kế thư mục. vao, dang_xu_ly, ra, da_xong, loi.
    2. Theo dõi bằng polling. Quét thư mục mỗi vài giây.
    3. Đảm bảo file đã chép xong. Kích thước không đổi qua hai lần quét.
    4. Chuyển và xử lý. Di chuyển sang dang_xu_ly rồi gọi run_journal.
    5. Phân loại kết quả. Chuyển sang da_xong hoặc loi theo mã thoát.

    Code tham khảo (Python)

    # hot_folder.py - chạy bằng Python hệ thống (dịch vụ nền), KHÔNG chạy trong NX
    import os
    import shutil
    import subprocess
    import time
    
    GOC = r"D:\NXLab_hot"
    VAO, DANG, RA, XONG, LOI = (os.path.join(GOC, t) for t in ("vao", "dang_xu_ly", "ra", "da_xong", "loi"))
    RUN_JOURNAL = r"C:\Program Files\Siemens\NX 12.0\NXBIN\run_journal.exe"
    SCRIPT = r"D:\NXLab\scripts\xu_ly_mot_file.py"
    DUOI = (".prt", ".stp", ".step")
    
    def kich_thuoc_on_dinh(duong_dan, cho=1.5):
        k1 = os.path.getsize(duong_dan)
        time.sleep(cho)
        return os.path.exists(duong_dan) and os.path.getsize(duong_dan) == k1
    
    def xu_ly(duong_dan):
        ten = os.path.basename(duong_dan)
        dang = os.path.join(DANG, ten)
        shutil.move(duong_dan, dang)
        kq = subprocess.run([RUN_JOURNAL, SCRIPT, "-args", dang, RA], timeout=1800)
        dich = XONG if kq.returncode == 0 else LOI
        shutil.move(dang, os.path.join(dich, "%s_%s" % (time.strftime("%Y%m%d_%H%M%S"), ten)))
        return kq.returncode
    
    def main():
        for thu_muc in (VAO, DANG, RA, XONG, LOI):
            os.makedirs(thu_muc, exist_ok=True)
        print("Theo dõi thư mục:", VAO)
        while True:
            try:
                for ten in sorted(os.listdir(VAO)):
                    duong_dan = os.path.join(VAO, ten)
                    if os.path.isfile(duong_dan) and ten.lower().endswith(DUOI) and kich_thuoc_on_dinh(duong_dan):
                        ma = xu_ly(duong_dan)
                        print("%s: %s (mã %d)" % (time.strftime("%H:%M:%S"), ten, ma))
            except Exception as ex:
                print("Lỗi vòng lặp:", ex)
            time.sleep(5)
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Kiểm tra kích thước hai lần cách nhau 1.5 giây tránh xử lý file đang được chép dở.
    • File đi qua các thư mục trạng thái nên nhìn thư mục là biết tình hình, không cần đọc log.
    • timeout=1800 giới hạn mỗi file 30 phút, một file treo không chặn cả dây chuyền.

    Lỗi thường gặp

    • Dịch vụ chạy mãi cần được khởi động lại khi máy khởi động; dùng Task Scheduler hoặc dịch vụ Windows.
    • Một phiên NX mỗi file tốn thời gian khởi động; với nhiều file nhỏ nên gom lô thay vì từng file.

    Code mang tính tham khảo, viết cho NX 12 trở lên (Python journal). Tên menu và một số lớp có thể khác theo phiên bản NX; hãy chạy thử trên bản sao của chi tiết trước khi dùng cho dữ liệu thật.

    Điểm: 0

Trả lời

Đăng nhập để tham gia thảo luận.