matlabでMODBUS①コンテックCPSN-MCB271-1-041＋CPSN-AI-1208LI

　コンテックの低価格マイコンCONPROSYSnanoのCPSN-MCB271-1-041本体に、A-Dコンバータ・モジュールCPSN-AI-1208LIを追加した形で、アナログ電圧を収集します。

<img width="400" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/3c028ac9-7258-7bc0-6df4-736124041d06.jpeg">

　MODBUS/TCPが動いているので、matlabのアプリInstrument Control Toolboxについてくる（確証がない）Modbus Explorerを使って情報を見ます。
###Modbus Explorer
　アプリのなかにあるModbus Explorerを起動します。
![2020-08-29_12h41_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/5c0db76f-7eab-49b0-1f6f-300f669f6741.png)

　左端にある＋Deviceをクリックします。
![コメント 2020-08-29 124628.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/915c807f-7fad-ff05-ad1a-6d6f9eba375f.png)

　Modbus TCP/IPをクリックします。
![スクリーンショット 2020-08-29 12.54.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/3c03933c-3f0d-3691-d9e8-3b05d2f5c1b0.png)

　CPSN-MCB271-1-041には192.168.111.21を振ってあります。見つけてきました。Register Type（ファンクション）からInput Registerを選び、Readの虫眼鏡のアイコンをクリックすると、Read Valueの欄に2559を読み出しました。
　ファンクションなどは、こちらの記事を参照してください。
　　https://www.denshi.club/cookbook/wire/rs485/modbus/modbus-2-l.html

　その右にあるConfirm Parametersをクリックします。すると、次の画面になり、自動でデータを読み取って、グラフを描きます。
![スクリーンショット 2020-08-29 13.08.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/275e3670-3e23-ef21-8995-b4403288fdc4.png)

　真ん中の画面Read Registersの左端にあるSelectのReg1をチェックを入れ、上部メニューのGenerate Scriptをクリックすると、ライブエディタが開きます。名前を付けて保存します。

![スクリーンショット 2020-08-29 13.13.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/0491698c-5567-b811-fd68-0bcbca045a88.png)

###コードを書く
　読み取った2559は、10進です。
　コンテックCPSN-MCB271-1-041のA-Dコンバータモジュール、
リファレンスマニュアル(ハードウェア編)|CPSN-AI-1208LI/CPSN-AI-2408LI[日本語]
を参考に、アナログ入力コネクタの1ピンAI0と5ピンAGNDにTL431の出力をつないでいます。
　コンテックCPSN-MCB271-1-041の
リファレンスマニュアル(ソフトウェア編) | CPSN-MCB271-S1-041/CPSN-MCB271-1-041 [日本語]
には、アナログA-Dコンバータ・モジュールCPSN-AI-1208LI（12ビット）のデータ形式が書かれています。デフォルトでは、±10Vの入力です。この時、入力電圧+0.000000は0x800です。1LSBは0.004883Vです。

```matlab
　Vin0 = double((modbusData.Reg_1 - hex2dec('0x800') ) * 0.004883);
```

で、電圧に変換できます。マイナスの値は検証していません。

###プログラム
20回測定してプロットでグラフを描きます。

```matlab
% Create a Modbus Object.
m = modbus('tcpip', '192.168.111.21');
m.Timeout = 20;

% Save the Server ID specified.
serverId = 1;

% Input Registers
% Read 1 Input Register of type 'int16' starting from address 1.
count = 20;
V0 = (count);
for i=1:count
    modbusData.Reg_1 = read(m, 'inputregs', 1, 1, serverId, 'int16');
    Vin0 = double((modbusData.Reg_1 - hex2dec('0x800') ) * 0.004883);
    fprintf('Vin0 = %.6f \n', Vin0);
    V0(i) = Vin0;
    pause(0.1);
end

plot(V0);

% Clear the Modbus Object created.
clear m

% Clear the Server ID.
clear serverId

```

　グラフです。

![スクリーンショット 2020-08-29 14.35.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/c9c074cb-dc5d-3435-c7d1-d44098d30a9a.png)




###資料；Webベースのアクセス
　コンテックのマイコンには、Webからアクセスできます。デフォルトのパスワードはmcb271です。Modbusの読み出し画面です。
![スクリーンショット 2020-08-29 14.18.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/d050e7b0-bcb7-73af-217c-797374eb2277.png)

　A-Dコンバータ・モジュールの設定もここからできます。
![スクリーンショット 2020-08-29 14.20.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/610d6a25-b12a-736e-6d3e-b83c2c7a8e7a.png)


###資料；Modbusスキャナ
　アナログ・デバイセズ社のWebページ
　　https://wiki.analog.com/resources/eval/user-guides/eval-adicup3029/reference_designs/demo_plc_modbus
で紹介されていたQModMasterを利用すると、モノによってはエラーがあってもアクセスできます。

![スクリーンショット 2020-08-29 14.45.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/25a91b57-6af0-ad03-d552-3081630f0e0d.png)