こういうのを見つけたんですが↓
MODBUS通信について教えてください。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12131426727
回答者は、MODBUSよーしらんけどと書いてますが、実際に使っていないので03と04の違いに迷うというシチュエーションがおそらく理解できてないような気がしますね。
同じ機能の測定機器でもメーカーによって測定データを03で読み出すものと04で読み出す仕様のものとがあります。データを読み出す通信の制御をしてる側から見るとファンクションコードが違うだけなんですが、じゃあ何でメーカーによって違うの?ということなんです。
ファンクションコード03と04は、03がRead Holding Register、04がRead Input Registerというファンクションなので、結局03と04の違いはHolding RegisterとInput Registerの違いは何か?ということになります。
上記Q&Aの回答には
(4)入力レジスタ(Input Register)
入力レジスタは、フィールドからのAI(Analog Input)やスレーブデバイス内の情報として用いられます。
16ビット長のデータで、参照するのみで変更はできません。可能アドレス範囲は30001から39999です。複数の連続したアドレスを割当てることにより、単精度実数、倍精度実数などのデータを扱うこともできます。
(5)保持レジスタ(Holding Register)
保持レジスタは、フィールドからのAO(Analog Output)やスレーブデバイス内の設定情報として用いられます。16ビット長のデータで、参照・変更ができます。可能アドレス範囲は40001から49999です。複数の連続したアドレスを割当てることによって、単精度実数、倍精度実数などのデータを扱うこ ともできます。
と仕様書が引用されていて、回答者は開始アドレスの違いといってますが、そこは通信をする上であまり重要でないです。
重要なのは、
入力レジスタ→参照のみ
保持レジスタ→参照変更ができる
ってところです。MODBUSでは、マスター機器はファンクションコードの06や10を使ってスレーブ機器の保持レジスタを書き換えることができます。外から書き換え可能なのが保持レジスタ、書き換えられないのが入力レジスタということなのです。
ちなみに測定データをファンクションコード03で読み出す仕様の機器が普通にあるんですが、これは保持レジスタがマスターから変更可能であることを考えるとレジスタの使い方がよくなくて、参照のみの入力レジスタにデータを書き込んでファンクションコード04で読み出させるべきなんじゃないかと思いますが、コストの問題なんですかね?