matlabでMODBUS②WAGOのPLC 750シリーズ


 WAGOのPLCを取り上げます。多くのマニュアルが日本語になっています。MODBUS/TCPを使うために、TCPインターフェース750-342、アナログ入力のモジュール750-479、終端の750-600を組み合わせました。

 アナログ入力モジュールは2チャネルです。13ビット+符号(左詰め、下2ビットはエラー・コード。通常'00')の、2の補数形式で保持レジスタから読み取れます。アナログ・モジュールのアドレスは、つないだ順番に振られるようで、'1'と思われます。
 TCPインターフェース750-342の外側にはMACアドレスが書かれています。これをもとに、TCP/IPアドレスを振ります。750-842のマニュアルを読んで設定しました。具体的な説明は、こちらの記事を参照してください。

まずは、Modbus Explorer

 Modbus Explorerを起動します。

 Deviceをクリックして、出てきたModbus TCP/IPのアイコンをクリックします。

 Device Addressに、設定した192.168.111.24を入れ、Register TypeはHolding...を選択します。Register Addressは'1'、Readアイコンをクリックすると、8195が読み出されました。

 Confirm Parametersをクリックします。次の画面が立ち上がって、連続してreadが実行されてグラフが描かれます。

 Reg_1の横にチェックをし、Generate Scripts CODEをクリックします。
 ライブエディタが立ち上がります。

プログラム

 自動で生成された、

% Holding Registers
% Read 1 Holding Register of type 'int16' starting from address 1.
modbusData.Reg_1 = read(m, 'holdingregs', 1, 1, serverId, 'int16');

の記述でデータを読み出して、値はmodbusData.Reg_1 に入ります。これを電圧に変えます。
 16ビット長 2の補数形式なので、一度dec2bin()でバイナリの文字列に変換します。この文字列の前に接頭語'0b'をくっつけ、後ろに桁数?を表す's16'をつなげます。その文字列をbin2dec()で10進数に変換すると、先頭が'1'であればマイナスの符号の処理が行われます(R2020a以降)。
 アナログ・データのフォーマットは±10Vなので、2^15で割って10をかけると電圧に変換されます。

 プログラムです。

% Create a Modbus Object.
m = modbus('tcpip', '192.168.111.24');
m.Timeout = 3;

% Save the Server ID specified.
serverId = 1;

% Holding Registers
% Read 1 Holding Register of type 'int16' starting from address 1.
modbusData.Reg_1 = read(m, 'holdingregs', 1, 1, serverId, 'int16');

binStr = dec2bin(modbusData.Reg_1,16);
Vin = bin2dec(append('0b',binStr,'s16')) / 32768 * 10;
fprintf('Vin0 = %.5fV\n', Vin);

% Clear the Modbus Object created.
clear m

% Clear the Server ID.
clear serverId