新聞中心

將 FlashRunner 2.0 整合進 Python 生產流程

全新的 fr_comm 函式庫讓 Python 3.10 以上版本可在 Windows、Linux 與 ARM Linux 上完整控制 FlashRunner 2.0,中間不再需要 C/C++ 或 C# 轉接層。

現代產線與自動化測試環境對 Python 的依賴日益加深。它可原生執行於嵌入式 Linux 板卡、能直接整合進 CI/CD 流程,也支撐著無數廠內工具的自動化層。然而在此之前,若要將這些環境連接到 FlashRunner 2.0,必須透過 C/C++ 或 C# 的整合層來銜接 — 而這層額外的相依性,並非每個團隊都有餘力長期維護。

fr_comm Python 函式庫解除了這項限制。它以標準的 pip 安裝套件(wheel)形式提供,讓您在 Windows、Linux 與 ARM Linux 上,直接以 Python 3.10 以上版本使用完整的 FlashRunner 通訊介面,包含設備指令、檔案傳輸、專案執行、資料加密與即時記錄。

  • 可透過區域網路與 USB/序列埠完整控制設備,速率最高達 3 Mbaud
  • 可執行於 Windows、Linux 與 ARM Linux
  • 只需一道 pip 指令即可安裝,執行階段僅有兩項相依套件
  • 沿用 C/C++ 與 C# 函式庫的慣例,既有整合人員幾乎無須重新學習
  • 需要 Python 3.10 以上版本

開始使用

安裝 wheel 套件:

python -m pip install fr_comm_python-1.0.0.0-py3-none-any.whl

確認安裝結果:

python -c "import fr_comm; print('import ok')"
python -c "from fr_comm import FR_GetDllVersion; print(FR_GetDllVersion())"

設定到此就已完成。以下這個最精簡的範例會建立一個區域網路連線工作階段、查詢設備狀態並處理錯誤,可直接延伸成完整的量產腳本:

from fr_comm import FlashRunner, FR_Comm_Exception

try:
    with FlashRunner("LAN", "192.168.1.100:1234") as fr:
        fr.FR_SendCommand("#GETENGSTATUS")
        print(fr.FR_GetAnswer(1500))
except FR_Comm_Exception as exc:
    print(exc)

精簡而穩定的公開 API

客戶端應用程式只需透過六個公開符號即可操作。這樣刻意精簡的介面,能讓整合工作保持單純,日後升級的路徑也更為清楚:

  • FlashRunner — 主要類別,負責建立設備連線工作階段並提供所有操作功能。
  • FR_Logger — 獨立的即時記錄用戶端,可透過區域網路使用。
  • FR_Comm_Exception — 所有通訊與協定錯誤共用的單一例外型別。
  • FR_FileType — 支援的檔案類別列舉:FRB、PRJ、LIC、LOG、LIB。
  • ProgressHandler — 選用的回呼介面,用於回報檔案傳輸進度。
  • FR_GetDllVersion() — 回傳函式庫版本字串,供執行階段驗證之用。

彈性的連線方式

FlashRunner 物件在建立的當下就會立即開啟連線。建議採用 with 區塊的寫法:即使操作過程中發生例外,連線工作階段也會被自動且正確地關閉。

FlashRunner("LAN", "192.168.1.100:1234")   # 區域網路,最常見的量產配置
FlashRunner("COM3", "115200")              # Windows 上的 USB/序列埠
FlashRunner("/dev/ttyUSB0", "115200")      # Linux 上的 USB/序列埠

系統同時支援 115200 與 3000000 兩種鮑率。FlashRunner 啟動時預設為 115200;若要切換到 3 Mbaud,請先在 115200 的狀態下送出 #55*SETSERIALBAUDRATE HIGH,再將主機端的鮑率調整為相同設定後繼續作業。如此一來,即使是直接的 USB 連線也能實現高吞吐量的傳輸。

設備操作

指令的執行採用單純的送出/接收模式。FR_SendCommand() 可送出任何 FlashRunner 指令字串,FR_GetAnswer() 則以可設定的逾時時間收取設備的回應:

fr.FR_SendCommand("#GETENGSTATUS")
answer = fr.FR_GetAnswer(1500)   # 逾時時間,單位為毫秒

在多通道的情境下,FR_SendCommand_Ex() 可指定明確的通道清單,並自動組出通道標頭,省去在呼叫端手動組字串的麻煩:

fr.FR_SendCommand_Ex([1, 2], "RUN Project.prj")
answer = fr.FR_GetAnswer(1500)

檔案傳輸支援雙向操作。選用的 ProgressHandler 會回報百分比進度,在傳輸時間較長時,可用於主控台訊息或介面上的進度條:

fr.FR_SendFile(r"C:\FlashRunner\app.frb", FR_FileType.FRB)
fr.FR_GetFile("app.frb", r"C:\FlashRunner\dest", FR_FileType.FRB)

專案的執行只需一次呼叫。FR_RunProject() 會持續等待,直到所有通道完成或逾時為止。搭配選用的逐通道回呼函式,即可將結果直接送入 MES 或測試報告系統:

def on_done(channel: int, result: bool) -> None:
    print(f"channel {channel}: {'OK' if result else 'FAIL'}")

fr.FR_RunProject("demo.prj", [1, 2, 3], 120000, on_done)

動態記憶體的內建資料加密

若應用程式需要將受保護的內容寫入 FlashRunner 的動態記憶體,可完全在 Python 內完成 RSA/AES 加密,無須額外工具。FR_GetPublicKey() 會取得並儲存設備的公開金鑰;接著可依作業型態選擇兩種加密模式:

  • 單次加密(FR_EncryptData) — 每次呼叫都會產生新的 AES 金鑰與 IV,並同時回傳加密後的資料與經 RSA 包裝的標頭。每送出一個資料區塊前,都必須先將標頭傳給設備。作法單純且自成一體,適合零星或次數不多的寫入。
  • 工作階段加密(FR_DynMem*) — FR_DynMemBeginEncryption() 只需建立一次工作階段金鑰,並回傳單一標頭供傳送至設備;接著 FR_DynMemEncryptData() 便可連續加密多個區塊,並自動處理 CBC 的 IV 串接,因此不需重複傳送標頭,也沒有管理工作階段的額外負擔。最後以 FR_DynMemResetEncryption() 結束該工作階段。當需要將一連串區塊寫入同一塊動態記憶體區域時,建議採用此方式。

典型的應用情境

  • 自動化測試治具:燒錄韌體、在多個通道上執行驗證專案,並將合格/不合格結果送入測試框架或 MES — 全程透過區域網路完成,不需要 Windows 主機。
  • 執行於嵌入式 Linux 板卡上的產線控制器:管理 FlashRunner 的連線工作階段,並即時將燒錄結果回報給中央系統。
  • CI/CD 流程:將更新後的韌體檔案上傳至 FlashRunner、觸發燒錄作業,並在建置驗證階段以程式方式判定結果。
  • 既有 Python 廠內工具的移轉路徑:讓這些工具能支援 FlashRunner,而不必在專案中引入 C/C++ 或 C# 的相依性。

重要效益

  • 跨平台且無須修改程式碼:同一份 wheel 套件可在 Windows 工作站、Linux 伺服器與廠房現場的嵌入式 Linux 板卡上執行。
  • 整合成本極低:一道 pip 指令、兩項相依套件、一行 import — 幾分鐘內就能從零建立起可運作的設備連線。
  • 熟悉的 API:沿用既有 C/C++ 與 C# 函式庫的慣例,已在使用 FlashRunner 的團隊無須重新學習整合方式即可轉用 Python。
  • 以工作階段為核心的設計:單一 FlashRunner 物件即管理整段連線的生命週期,讓整合程式碼保持簡潔而可預期。
  • 結構化的錯誤處理:所有失敗都會以 FR_Comm_Exception 形式呈現,並可附帶機器可讀的錯誤碼,讓自動化的錯誤分類變得單純。

fr_comm 函式庫毫無妥協地將 FlashRunner 2.0 延伸到以 Python 為基礎的生產與測試環境。凡是 C/C++ 與 C# 函式庫所能執行的操作 — 指令、檔案傳輸、專案執行、加密與即時記錄 — 都能透過這個單一的 pip 安裝套件取得,適用於任何可執行 Python 3.10 的平台。

對於正在圍繞 FlashRunner 建構自動化的團隊而言,這意味著更短的整合週期、更少的工具鏈相依性,以及從一段 Python 腳本直達完整受控燒錄站台的捷徑 — 無論該站台位於開發用工作站,或是嵌入在產線之中。