ロボットプログラムでの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 | ブール型 | 100 | 128 | DI0 ~ DI127 |
| 汎用DO | ブール型 | 300 | 8 | (物理)DO0 ~ DO7 |
| CO | ブール型 | 308 | 8 | (物理)CO0 ~ CO7 |
コイル(Coil) – 機能IO
| 入出力名 | データ型 | 最初の アドレス | データ個数 | 割り当て |
|---|---|---|---|---|
| 一時停止 | ブール型 | 500 | 1 | |
| プログラム再開 | ブール型 | 501 | 1 | |
| プログラム起動 | ブール型 | 502 | 1 | |
| プログラム停止 | ブール型 | 503 | 1 | |
| 原位置へ移動 | ブール型 | 504 | 1 | |
| 手動自動切換え | ブール型 | 505 | 1 | |
| メインプログラム起動 | ブール型 | 506 | 1 | |
| 減速モードLevel1 | ブール型 | 507 | 1 | |
| 減速モードLevel2 | ブール型 | 508 | 1 | |
| 減速モードLevel3 | ブール型 | 509 | 1 | |
| アラームリセット | ブール型 | 510 | 1 |
入力ビット
| 入出力名 | データ型 | 最初の アドレス | データ個数 | 割り当て |
|---|---|---|---|---|
| DO | ブール型 | 100 | 128 | DO0 ~ DO127 |
入力レジスタ
| 入出力名 | データ型 | 最初の アドレス | データ個数 | 割り当て |
|---|---|---|---|---|
| AI | 符号なし整数 | 100 | 16 | AI0 ~ AI15 |
| 符号あり整数 | 116 | 16 | AI16 ~ AI31 | |
| 浮動小数点 | 132 | 32 | AI32 ~ AI63 |
保持レジスタ
| 入出力名 | データ型 | 最初のアドレス | データ個数 | 割り当て |
|---|---|---|---|---|
| AO | 符号なし整数 | 100 | 16 | AO0 ~ AO15 |
| 符号あり整数 | 116 | 16 | AO16 ~ AO31 | |
| 浮動小数点 | 132 | 32 | AO32 ~ 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)