← 所有文章

FX5U BIN 讀寫教學

· 站長

使用 GX Works3 與 SP.FWRITE、SP.FREAD 讀寫 SD 卡 BIN 檔,圖解控制資料、檔案位置、單次驗證與常見錯誤。

把 16 字資料寫入 SD 卡,再讀回 PLC

這次我們把 D101~D116 的 16 字資料寫進 1.BIN,再從相同位置讀回,確認保存的數值沒有改變。先完成一次寫入與讀取,再進一步處理週期記錄。

BIN 直接保存二進位資料,適合保存固定長度的數值。操作時要對齊三件事:資料型態、資料數量、檔案位置。只看到完成燈亮還不夠,我們會一起檢查實際讀寫數量與資料內容。

本次練習 設定與目標
設備與工具 FX5U、適用的 SD 卡、GX Works3
寫入 SP.FWRITE,將 D101~D116 寫入 1.BIN
讀取 SP.FREAD,從位置 0 讀回相同的 16 字
比對方式 後九字填入 108~116,讀回後逐項核對

圖片可點開查看原尺寸。藍色矩形是 GX Works3 的編輯選取範圍,不代表接點導通。

1 先建立檔案與掃描觀念

一個 D 暫存器是 16 位元,也就是 1 字(word)或 2 位元組(byte)。本範例 D0=H0、D7=K0,因此 16 筆代表 16 字、共 32 位元組。檔案中的位置從 0 起算:位置 0 是第一個字,位置 2 是第三個字。BIN16 在檔案內先存低位元組,例如 H1234 依序為 34、12;位元圖樣相同的 HFFFF,以有號數監看為 -1,以無號數監看則為 65535。

觀念 操作時如何使用
K 與 H K16 是十進位 16;H10 也是十進位 16。H2 與 K2 的數值相同。
D4 與 D5 檔案位置為 32 位元,佔 D4、D5 兩字。DMOV 與 DADDP 都會一起使用這兩個裝置。
SM402 RUN 後第一次掃描為 ON,用來設定初始值。重新 RUN 會重新執行這些設定。
SM400 常時 ON;其下方 MOV、TRD 會在每次掃描執行。
完成訊號 M100 是完成脈衝,M101 是異常完成脈衝;程式將結果保存到 M150、M151。
檔案不是文字 BIN 不會把 123 變成字元 1、2、3。用一般文字編輯器看起來可能是亂碼。

開始前,準備支援範例設定的 FX5U、GX Works3、適用的 SD 記憶卡及讀卡機。SD 卡的容量、格式與使用限制應依 CPU 硬體手冊確認;不要直接把電腦上任意格式的記憶卡當成已相容。

在獨立教學設備上練習,先備份專案與卡上檔案。開啟專案後,沿「程式 → 掃描 → MAIN → ProgPou → 程式本體」查看梯形圖;下載、監看與裝置值變更只在確認目標 CPU 後進行。取卡前,完成 CPU 手冊規定的停止存取程序,確認沒有檔案存取再移除。

2 寫入與讀取的控制資料

兩個專案都把 D0 當成控制資料起點,但 D2 與 D100 在讀寫時的角色不同。不要把寫入專案的整組數值直接照搬到讀取專案。先依下表分清楚要求數量與完成後的回報位置。

裝置 BIN 寫入 BIN 讀取
D0 H0:BIN16 H0:BIN16
D1 初始 H0;完成後為狀態碼 初始 H0;完成後為狀態碼
D2 初始 K0;系統回寫實際寫入數 K16:要求讀取 16 字
D3 H0:用途設定 H0:非字串模式須為 0
D4、D5 初始 H0;週期觸發時先加 K16 初始 H2:從位置 2 讀取
D6 K0:BIN 不使用欄數 K0:BIN 不使用欄數
D7 K0:以字為單位,每掃描重設 K0:以字為單位,初始化設定
D100 K16:要求寫入 16 字 程式先設 K16;完成後由系統回寫實際讀取數
D101 起 寫入來源 D101~D116 讀取結果 D101~D116

D1=H0 只代表正常完成;寫入時仍要核對 D2,讀取時要核對 D100。如果要求 16 字卻只完成 0 字,不能把它當成資料保存成功。

D4:D5 表示一組 32 位元值。不要只改 D4 而留下 D5 的舊高位數值;監看時應使用 32 位元顯示,或明確核對兩字。

3 先認識會用到的裝置

裝置 實際用途與注意事項
M0 指令執行保持位。為 ON 且 SM606=OFF 時,程式執行 FWRITE 或 FREAD。
M1 寫入檔:上升沿執行 RST M0、RST M100、SET M101。讀取檔:一般接點執行 SET M0、RST M100、RST M101。兩者不同。
M3 僅寫入檔使用。與 SM412 上升沿一起啟動週期寫入。
SM753 檔案存取中。M1 啟動/重置段會檢查其為 OFF;M3 週期段沒有相同的忙碌互鎖。
SM606 記憶卡強制使用停止請求。程式以其常閉接點允許指令。它不是單純的「卡已插入」訊號。
M100、M101 系統回報的完成與異常完成脈衝,不適合只靠肉眼在監看畫面捕捉。
M150、M151 正常與異常結果保存位,程式用 SET 設定,沒有自動清除。每次練習前先清除舊結果。
D101~D107 TRD 寫入 CPU 時鐘:年、月、日、時、分、秒、星期。
D108~D116 仍屬於要求寫入的 16 字範圍,但這段梯形圖沒有指定內容,不可假設一定為 0。

TRD 只有 7 字時鐘資料,不是 16 字。若要把後面 9 字拿來做練習,必須先明確指定內容並記錄,才有可比對的結果。星期的數值為 0~6,0 代表星期日。

4 設定 BIN16 與初始狀態

圖 1  BIN 寫入程式第 1~4 列,步號 0 起

圖 1 BIN 寫入程式第 1~4 列,步號 0 起

先在 SM402 分支下把 D0 設為 H0,選擇 BIN16,再把 D1、D2、D3 清為 0。SM402 只在 RUN 後第一次掃描導通,因此完成後的 D1 狀態與 D2 實際寫入數不會每掃描被清掉。

圖中第 1~4 列共用左側的 SM402。把這四個 MOV 接在同一個 SM402 分支下,讓格式、狀態與用途設定在第一次掃描一起完成。

5 設定寫入位置與 16 字資料區

圖 2  BIN 寫入程式第 5~8 列

圖 2 BIN 寫入程式第 5~8 列

用 DMOV H0 D4 同時設定 D4、D5,讓初始檔案位置從 0 開始。接著把 D6 設為 K0,因為 BIN 不使用欄數。SM400 每掃描將 D7 設為 K0,所以本程式固定以字為單位,不能靠監看暫改 D7 來切換格式。

SM402 將 D100 設為 K16。D100 是數量欄,真正寫出的資料從 D101 開始,共到 D116;D100 本身不在這 16 字檔案資料內。

6 先分清楚重置與啟動

圖 3  BIN 寫入程式第 9~11 列,步號 39 起

圖 3 BIN 寫入程式第 9~11 列,步號 39 起

M1 為上升沿接點,並串接 SM753 常閉接點。條件成立時,程式依序 RST M0、RST M100,再 SET M101。這一段會取消 M0 的執行保持,不是啟動寫入。

這裡要特別注意:雖然註解寫「指令觸發器」,RST M0 的作用卻是解除執行保持。SET M101 也不是新的一次檔案錯誤回報。初學練習不要把 M1 當成「按一下就寫入」的按鈕;真正的週期 SET M0 在後段 M3 邏輯中。

7 執行 FWRITE 並保存結果

圖 4  BIN 寫入程式第 12~14 列,步號 51 與 70 起;解除 M0 接續下圖

圖 4 BIN 寫入程式第 12~14 列,步號 51 與 70 起;解除 M0 接續下圖

實際呼叫順序為 SP.FWRITE U1 K2 D0 "1" D100 M100。U1 為虛擬指定,K2 為 SD 卡驅動器;D0 是控制資料,"1" 是檔名,D100 是寫入資料區起點,M100 是完成位。

M100=ON 時,若 M101=OFF 就 SET M150;若 M101=ON 就 SET M151,並 RST M0。M150、M151 會保留舊結果;新一次測試前必須先清除,並以 D1、D2 再確認本次結果。

8 加入時鐘資料,理解週期觸發

圖 5  BIN 寫入程式第 15~19 列,接續解除 M0、步號 85 起至 END

圖 5 BIN 寫入程式第 15~19 列,接續解除 M0、步號 85 起至 END

SM400 每掃描執行 TRD D101,將 CPU 時鐘放入 D101~D107。M3=ON 時,每次 SM412 上升沿先用 DADDP 將 D4:D5 加 16,再 SET M0。因 FWRITE 位於前面,這個 SET 通常要到下一掃描才觸發檔案寫入。

這是「先增加指定位置再啟動」的寫法,不能直接解讀成可靠的檔尾追加。新檔及超出檔案大小的行為另見實作與排查章。此段也沒有用 SM753 阻擋忙碌時的位置變更。

9 設定讀取格式與要求數量

圖 6  BIN 讀取程式第 1~4 列

圖 6 BIN 讀取程式第 1~4 列

讀取程式仍使用 D0=H0 的 BIN16 模式,D1 初始化為 H0。但 D2 在這裡是「要求讀取數」,設定為 K16;它不再是寫入完成時的實際數量欄。

D3 在非 ASCII 字串讀取模式應設為 0。在初始化分支加入 MOV H0 D3,避免沿用寫入設定或裝置舊值。

10 對齊讀取起點,預留結果區

圖 7  BIN 讀取程式第 5~8 列

圖 7 BIN 讀取程式第 5~8 列

DMOV H2 D4 表示從 BIN 的字位置 2 讀取,相當於位元組偏移 4,並不是從第一字開始。D6=0,D7=0,要求讀取的 16 字仍由 D2 指定。

程式在第一次掃描先將 D100 設為 16,但 SP.FREAD 完成後會覆寫 D100,填入實際讀取數。因此剛 RUN 就看到 D100=16,不能證明已成功讀檔;必須等本次完成,再看 D100 與 D101 起的內容。

11 讓讀取指令只啟動一次

圖 8  BIN 讀取程式第 9~11 列,步號 37 起

圖 8 BIN 讀取程式第 9~11 列,步號 37 起

讀取程式的 M1 是一般常開接點。M1=ON 且 SM753=OFF 時,SET M0,並清除 M100、M101,準備啟動讀取。這與寫入專案中同名 M1 的重置用途不同。

若 M1 一直保持 ON,檔案存取完成、SM753 回到 OFF 後可能再次觸發;啟動段也可能在上方先清掉完成位。單次讀取練習應以可控制的一掃描觸發,或在確認 M0 已保持後立即讓 M1 回 OFF。

12 檢查讀取數量與資料

圖 9  BIN 讀取程式第 12~16 列,步號 47 起至 END

圖 9 BIN 讀取程式第 12~16 列,步號 47 起至 END

實際呼叫為 SP.FREAD U1 K2 D0 "1" D100 M100。完成後 D100 是實際讀入字數,D101 起才是資料。M150 保存正常結果,M151 保存異常結果,最後解除 M0。

同時把 M100 的註解改為「讀取完成」,方便監看時辨識;這裡執行的是 SP.FREAD。D100 小於 16 時,只比對真正讀到的範圍,不要把其後裝置舊值當作本次結果。

13 實作一 做一次可核對的 BIN 寫入

接著在獨立教學設備做一次寫入。先關閉週期觸發,讓檔案位置和本次結果都容易核對。

  1. 先讓 M3=OFF、M1=OFF、M0=OFF,確認沒有其他檔案存取,SM753=OFF、SM606=OFF。備份卡上的 1.BIN,避免覆寫有用資料。

  2. 確認 RUN 初始化已完成,D0=H0、D3=0、D6=0、D7=0、D100=16。以 32 位元方式把 D4:D5 設為 0,並清除 M150、M151 的舊結果。

  3. 在 D108~D116 明確填入 108~116 作為辨識值。D101~D107 由 TRD 更新,不要在這些裝置填固定值期待保留。

  4. 將 M0 設為 ON 一次,讓程式執行 FWRITE。不要啟用 M3,也不要按 M1。等待本次完成後確認 M0 已解除。

  5. 檢查 M150、M151、D1、D2。成功判準是 D1=H0、D2=16,而且本次沒有異常結果;記錄 D101~D116 的資料配置。

  6. 依硬體手冊停止卡片存取後,用讀卡機檢查 1.BIN。對新建空白測試檔,一次 16 字寫入應有 32 bytes。對既有較長檔,從位置 0 寫 16 字不代表檔案一定會縮成 32 bytes。

TRD 會持續刷新時鐘;寫入後才查看 D101~D107,時間可能已經改變。固定測試值 D108~D116 更適合做穩定比對。若需要同一時刻的整筆紀錄,後續正式設計應使用獨立快照緩衝區,並在存取完成前保持其內容。

14 實作二 從相同位置讀回

讀取必須使用同一張 SD 卡與同一個檔案。先確認寫入已完成,再使用讀取專案;切換程式前依現場程序備份及確認 CPU 狀態。

  1. 讓讀取專案完成 RUN 初始化。原值 D4:D5=H2,本次往返測試需在教學設備將其設定為 0,與前一節的寫入位置對齊。

  2. 確認 D0=H0、D2=16、D3=0、D6=0、D7=0,檔名仍為 "1"。M1、M0 先為 OFF;清除 M150、M151,並把 D100 清為 0,方便區分初始化值與真正回報。

  3. 確認 SM753、SM606 為 OFF,給 M1 一次受控短觸發,看到 M0 已保持後讓 M1 回 OFF。若無法可靠控制脈衝,可在教學設備維持 M1=OFF,以 M0 單次 ON 驗證同一指令。

  4. 等本次完成,確認 D1=H0、D100=16、M151 沒有異常記錄,並核對 D108~D116 是否為 108~116。

  5. 再閱讀 D101~D107,應是檔案中保存的時間資料。讀取專案沒有 TRD 持續覆寫結果,因此可以在完成後逐項檢查。

測試條件 正確判讀
寫入位置 0,讀取位置 0 D101 對到檔案第一字,可做 16 字完整往返比對。
寫入位置 0,原始讀取位置 2 D101 對到檔案第三字,資料整體往後移兩字,不能與原 D101 一對一比較。
檔案只有 16 字,從位置 2 要讀 16 字 剩餘資料不足要求數;須檢查實際讀取數與狀態,不能預設全部 16 字有效。

15 排除讀寫錯誤,再加入週期記錄

原寫入程式每次先把 D4:D5 加 16 才送出指令。依手冊,新檔不存在時會建立並從開頭寫;指定位置大於現有檔案大小時,可能正常完成卻實際寫入 0 字。

因此,若從不存在的 1.BIN 開始,第一筆可能從位置 0 建立 16 字檔案;下一次位置已增加到 32 字,超過檔尾,便可能出現 D1=0、D2=0。遇到這種情況,先把指定位置與檔案現有字數放在一起比較。M150 亮燈不能排除這種情況。

看到的現象 檢查與處理方向
M0 不啟動 寫入檔的 M1 是重置用途。先確認是否使用本篇單次 M0 操作或 M3 週期條件。
M0 保持但未完成 檢查 SM606、SM753、卡片及 CPU 診斷。一般運算錯誤不一定產生完成脈衝。
D1=0,但檔案不增加 核對 D2 及 D4:D5 與檔案大小;指定位置越過檔尾可能寫入 0 字。
M150、M151 同時亮 兩者都用 SET 保存,可能是不同次結果;先清除舊旗標,再做單次測試。
讀回內容錯位 檢查讀寫格式、數量、位置單位;圖中的讀取位置 H2 不等於開頭。
後九字內容不固定 程式只對前七字執行 TRD。先為 D108~D116 指定可核對的測試值。
週期資料不連續 M3 分支未檢查忙碌且先遞增位置。正式設計需在成功寫入後更新位置,並保持資料快照。

不要把無限重試、清除錯誤碼或強制改 SM606 當成排除故障的方法。先保留本次狀態碼、實際數量及位置,再查 CPU 與檔案指令診斷。

16 完成後做最後確認

把這次寫入與讀取的結果放在一起檢查:寫入 D2=16、讀取 D100=16,兩次 D1 都為 0;讀回的 D108~D116 與設定的 108~116 一致。再核對檔名與 D4:D5,確認讀寫使用同一個位置。

接著若要改成連續記錄,先加入忙碌互鎖與資料快照,並在成功寫入後依實際寫入數更新位置。完成單次往返後再做這一步,問題會容易定位得多。

參考資料

程式圖片來源:《SD卡 BIN檔案讀寫教學》。指令設定參考三菱電機手冊。

MELSEC iQ-F FX5 Programming Manual (Instructions, Standard Functions/Function Blocks),JY997D55801AB。核對範圍:SP.FREAD 印刷頁 488~513;SP.FWRITE 印刷頁 514~535;TRD 印刷頁 894~895。

三菱電機 FX5 指令手冊 JY997D55801AB

上機時請完成編譯與 CPU/SD 卡相容性確認,並依上述步驟驗證實際讀寫結果。本文未進行實機測試。

延伸閱讀

FX5U CSV 讀寫教學


使用 PLC 工具箱 →