FAIRINO Modbus TCPでの通信方法

ロボットプログラムでのModbus TCP通信設定方法

本記事では、FAIRINOロボットをPLCなどの制御機器をから制御する場合に使用するModbus TCP通信の設定方法について、Luaコード例と実用上のポイントをまとめました。
なおオフラインアプリで確認しておりロボットのファームフェアバージョンV3.9.2に対応します。

1. パラメータの設定および確認

外部デバイスとModbus TCP通信をする設定と確認方法を説明します。

1-1. メニューナビゲーションからプログラムページを開く

メニューナビゲーションから「プログラム」→「プログラミング」を選択します。

1-2. Modbus TCP設定アイコンをクリック

ツールの下記位置のアイコン(ポップアップ「Modbus TCP設定」の表示)をクリックします。

1-3. スレーブステーション設定画面を表示する

Modbus TCP設定ページのタブ「スレーブステーション設定」を選択します。

1-4. 通信設定パラメータを入力する

以下のテキストボックスにパラメータを入力します

  • IP … 192.168.58.2 (ロボットのIPとして設定してあるアドレス)
  • ポート番号 … 502
  • 子局番号 … 1 (システムに合わせて設定してください)

memo

Modbus TCPでは通常ポート502を使用します

1-5. マスター機器側からスレーブ側へ接続し通信の確認をする

接続に成功すると接続ステータスのシグナルが緑に変わります。

1-6. マスターデバイスからのデータ受信確認

マスター側でアドレス132の保持レジスタに任意の小数値を書き込みます。
書き込んだ値がロボット制御アプリのModbus TCP設定ページの保持レジスタ(アナログ入力)のAI32に反映されているかを確認します。(下図の場合は3.141)

今回はフリーソフト Modbus Toolを使用し、マスター側の機能を使用しています。

ロボット制御アプリのModbus TCP設定ページで、保持レジスタAO32の値が変更されていることが分かります。

2. コイル、レジスタのアドレス

FAIRINOで使用するデータレジスタのアドレスを紹介します。

コイル(Coil)‐汎用IO
入出力名データ型最初の
アドレス
データ個数割り当て
DIブール型100128DI0 ~ DI127
汎用DOブール型3008(物理)DO0 ~ DO7
COブール型3088(物理)CO0 ~ CO7
コイル(Coil) – 機能IO
入出力名データ型最初の
アドレス
データ個数割り当て 
一時停止ブール型5001
プログラム再開ブール型5011
プログラム起動ブール型5021
プログラム停止ブール型5031
原位置へ移動ブール型5041
手動自動切換えブール型5051
メインプログラム起動ブール型5061
減速モードLevel1ブール型5071
減速モードLevel2ブール型5081
減速モードLevel3ブール型5091
アラームリセットブール型5101
入力ビット
入出力名データ型最初の
アドレス
データ個数割り当て
DOブール型100128DO0 ~ DO127
入力レジスタ
入出力名データ型最初の
アドレス
データ個数割り当て
AI符号なし整数10016AI0 ~ AI15
符号あり整数11616AI16 ~ AI31
浮動小数点13232AI32 ~ AI63
保持レジスタ
入出力名データ型最初のアドレスデータ個数割り当て
AO符号なし整数10016AO0 ~ AO15
符号あり整数11616AO16 ~ AO31
浮動小数点13232AO32 ~ AO63

3. ロボット動作プログラムの設定方法

ロボットプログラムからModbus TCP通信でデータを書き込み及び、読み込みを実施する方法を紹介します。
今回はスクリプト入力モードでのプログラム作成を紹介します。

3-1. マスターデバイスからのビット入力を読み込む

ModbusSlaveReadDI関数を使用してデータを読み込みます。

local val1, val2, val3 = ModbusSlaveReadDI(DI0, 3)

機能: ModbusTCPでスレーブとなるデバイスからのデジタルIO入力(コイル)を読み込む。
文法: ModbusSlaveReadDI(register_name, register_num)

引数:

register_name: 読み込みを行うデータの先頭となるアドレスのデータ名
register_num: 読み込むデータ数

戻り値: 指定したアドレスのデータを読み込んだ値を返す。複数のデータを取得する場合はデータの個数分の変数を準備する。0または1を取得する。

3-2. マスターデバイスへのコイル出力を書き込む

ModbusSlaveWriteDO関数を使用してデータを書き込みます。

ModbusSlaveWriteDO(DO0, 3, {0, 1, 0})

機能: ModbusTCPでスレーブとなるデバイスへのデジタルIO出力(入力ビット)を書き込む。
文法: ModbusSlaveWriteDO(register_name, register_num, register_val)

引数:

register_name: 書き込みを行うデータの先頭となるアドレスのデータ名
register_num: 書き込むデータ数
register_val: 書き込むデータの値をテーブル型(配列型)で入力。値は0または1とする。

戻り値: なし

3-3. マスターデバイスからの数値入力(入力レジスタ)を読み込む

ModbusSlaveReadAI関数を使用してデータを読み込みます。

local val1, val2 = ModbusSlaveReadAI(AI32, 2)

機能: ModbusTCPでスレーブとなるデバイスからのレジスタ入力(保持レジスタ)を読み込む。
文法: ModbusSlaveReadAI(register_name, register_num)

引数:

register_name: 読み込みを行うデータの先頭となるアドレスのデータ名
register_num: 読み込むデータ数

戻り値: 指定したアドレスのデータを読み込んだ値を返す。複数のデータを取得する場合はデータの個数分の変数を準備する。

3-4. マスターデバイスへの数値出力(保持レジスタ)を書き込む

ModbusSlaveWriteAO関数を使用してデータを書き込みます。

ModbusSlaveWriteAO(AO32, 2, {1.833, -2.62})

機能: ModbusTCPでスレーブとなるデバイスへのレジスタ出力(入力レジスタ)を書き込む。
文法: ModbusSlaveWriteAO(register_name, register_num, register_val)

引数:

register_name: 書き込みを行うデータの先頭となるアドレスのデータ名
register_num: 書き込むデータ数
register_val: 書き込むデータの値をテーブル型(配列型)で入力する。

戻り値: なし

memo

値はアドレス0~15までは2バイト符号なし正整数(0~65535)、アドレス16~31までは2バイト符号あり整数(-32768~32767)、アドレス32~63までは浮動小数点を入力します。

3-5. コイルの値が変化するまで待機する

ModbusSlaveWaitDI関数を使用して入力待ちをします。

ModbusSlaveWaitDI(DI1, 1, 1000)

機能: ModbusTCPでスレーブとなるデバイスからのデジタルIO入力(コイル)が指定の値になるまで待機する。
文法: ModbusSlaveWaitDI(register_name, waiting_state, waiting_time)

引数:

register_name: 取得するデータ名
waiting_state: 待機をするコイルの状態。ON→1、OFF→0
waiting_time: 最大待機する時間。ms単位で入力。

戻り値: なし

memo

待機時間内にコイルが設定状態にならない場合はロボットプログラムがエラーとなり停止する

3-6. サンプルプログラム

-- デバイスへ動作指示を入力する為DO0(デバイス動作信号)をONにする
ModbusSlaveWriteDO(DO0, 1, {1})

WaitMs(500)

ModbusSlaveWriteDO(DO0, 1, {0})

-- デバイスのDI0(デバイス動作完了信号)がONになるまで待機する
ModbusSlaveWaitDI(DI0, 1, 1000)

-- デバイスのDI1(デバイスの動作結果信号)を取得する
local result = ModbusSlaveReadDI(DI1, 1)

-- デバイスの動作結果の数値データAI32, AI33を取得する
local data1, data2 = ModbusSlaveReadAI(AI32, 2)