MELSEC QnUDVCPUのメモリ構成


機種により仕様が変わるのでQnUDVCPUを想定して書いています。
詳しくはマニュアル参照[SH-080802 QnUCPUユーザーズマニュアル(機能解説･プログラム基礎編)]

|番号|名称|種類|
|:----:|:-----|:----:|
|-|プログラムキャッシュメモリ|SRAM|
|-|デバイスメモリ|SRAM|
|ドライブ0|プログラムメモリ|フラッシュROM|
|ドライブ1|QnUDVCPU使用不可||
|ドライブ2|メモリカード(SD)|フラッシュROM|
|ドライブ3|標準RAM|SRAM|
|ドライブ4|標準ROM|フラッシュROM|

番号はFTPアクセス時のドライブ指定で使います。
ドライブ1はSRAMカード用ですがQnUDVCPUでは装着出来ないので使えません。
拡張SRAMカセットはドライブ3に含まれます

# プログラムキャッシュメモリ
ラダープログラム実行用のメモリです。

# デバイスメモリ
X0/Y0/M0/D0みたいなやつです。(ZR除く)
詳しくはこちら

https://qiita.com/fa_yoshinobu/items/266c4cbd5514c3a388c2

# プログラムメモリ
CPU ユニットが演算するために必要なプログラムやパラメータを格納するメモリです。
さてプログラムキャッシュメモリとの違いは何でしょうか？

ユニバーサルモデルからはバッテリが無くてもプログラムが消えないようにフラッシュROM化されています。
CPU起動時にプログラムメモリからプログラムキャッシュメモリにラダープログラムが自動転送されて実行されます。
フラッシュROM上では直接実行できないからSRAMに転送してるのだと思われます。
フラッシュROM化により従来の標準ROMからのブート運転機能は廃止になり、代わりにSDからのブート運転になりました。

逆にRUN中書き込みをするとプログラムキャッシュメモリに書き込まれその後プログラムメモリに転送されます。
RUN中書き込みを実行すると一瞬出てくるウィンドウはこの動作の進捗状況です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/ecd363e4-a258-1e88-db3e-fd37800a24f7.png)
プログラムメモリに転送しないオプションもありますが、OFFにして使うと再起動で変更内容が消えて変更前に戻るのでおすすめはしないです。
例えば検証用で買ったCPUのフラッシュROMの書き換え寿命を節約したい場合くらいでしょうか？
SD682/683を見れば書き換え回数がわかります。
寿命の目安が10万回らしく超えると"FLASH ROM ERROR"になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/44411a48-7eda-922e-6699-b705449e72fa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/f0de48f3-6bf5-d948-5da5-62971e4eccbb.png)

# メモリカード(SD)
QnUDVCPUからATAメモリカード(Compact Flash)のスロットがなくなり代わりSDカードになりました。
SDからブート運転(SDからプログラムメモリへラダーを転送)が出来たり、SDカードにデータロギングをする機能が追加されています。
ロギングの設定はGX Works2ではなくCPUユニットロギング設定ツールを使用します。
SDカードはメーカー純正か産業用グレードの物を使うことが無難です。

# 標準RAM
ファイルレジスタ(ZR)、ローカルデバイスファイル、サンプリングトレースファイル、ユニットエラー履歴ファイルが格納できます。

# 標準ROM
デバイスコメントやユーザデータなどの保管用のメモリです。
プログラムメモリがフラッシュメモリ化されたので余り使い道ないですが、容量が大きいのでコメントデータ置き場にしたり、
SP.DEVST/S.DEVLDを使ってデバイスメモリのバックアップ/リストアをするなどの使い方が出来ます。

# デバイスメモリ・ファイルレジスタの読み出し
上記の説明からデバイスメモリ(M,Dなど…)とファイルレジスタ(ZR)のエリアが違うことがわかりますね。
デバイスメモリをPLCから読み出す時は[プログラムメモリ/デバイスメモリ]を選んでデバイスデータを選択して実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/f632c132-f6c3-f41b-33ff-153f49840496.png)
全領域がうまく吸い出せないときは[詳細]を押してデフォルトを押すと読み出し範囲をPCパラメータに合わせて再設定してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/7410aa1a-0635-0b57-8bef-73d0c3ab37f7.png)
ファイルレジスタをPLCから読み出す時は[標準RAM]を選んでファイルレジスタ名を選択して実行
こちらも詳細で読み出し範囲設定が出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/9b83a73e-b20f-d8d4-7662-ef3267e1d8fd.png)

# 拡張データレジスタ,拡張リンクレジスタはどこに含まれるのか？
拡張データレジスタ,拡張リンクレジスタとはについてはこれを読んでください。

https://qiita.com/fa_yoshinobu/items/6ab50883b584d69b527c

拡張データレジスタ,拡張リンクレジスタの実態はファイルレジスタなのですが、吸い出すときはデバイスメモリから吸い出します。
わかりにくいからそういう仕様にしてるのだと思います。

# ファイルレジスタのファイル名をMAINにしたときのバックアップ
ファイルレジスタのファイル名は任意の名前が付けれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/0022c479-aafd-9c32-3273-b23c67083d28.png)

デバイスメモリを吸い出すとデバイスメモリにMAINというのが現れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/36b666c3-f1cf-b2c3-0052-9ea72807502b.png)
この状態でファイルレジスタ(名前はMAIN)を読み出すとどうなるでしょうか？

試すとデバイスメモリとファイルレジスタ両方ともMAINに保存されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/a2871520-d9a4-7aed-a913-0b5d2a5c5909.png)

# GX Simulator2からのデバイスメモリ吸い出し
GX Simulator2へは書込/照合はできますが読み出しは出来ません。困った仕様ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/887c9d20-0b77-8dac-6d21-f52521665173.png)

デバイスメモリのファイルを選択し図のアイコンを押すとGX Simulator2からデバイスデータを吸い出しが出来ます。おおー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/1f77c2bf-041d-d9d1-ffbf-2b3a8dd05edf.png)

このやり方はデバイスメモリのファイルがあることが前提です。
問題は新規作成で作るとなにも設定されてないので吸い出せません。全部手動で設定しないといけない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/4b70a739-4708-dffc-8a19-9ae933fa0443.png)