【ECJP006】MODBUS 通信 - クライアント側



MODBUS  紹介

MODBUS はシリアル通信プロトコルであり、標準的な産業用通信プロトコルであり、現在産業用電子機器間の一般的な接続方法です。
Elite ロボットは、MODBUS クライアント側をサポートするだけでなく、サーバ側機能もサポートします。

通信プロトコルは、MODBUS TCP および MODBUS RTU をサポートします. MODBUS TCP 通信は、コントローラのイーサネット インターフェイスに接続する必要があり、ModBus RTU 通信は、コントローラの RS485インターフェイスまたはフランジの端にある RS485インターフェイスに接続できます。

MODBUS クライアント側の機能は LUA スクリプトによって実現されます。そのうち MODBUS クライアントは既にカプセル化されたインターフェイスであり、ユーザーは対応するパラメーターを入力するだけでいいです。他に特別なプロトコル要件がある場合は、TCP/UDP 通信、RS485 通信、TCI 通信 (フランジの端にある RS485)、および 232 通信も使用できます。具体的な方法については、Elite_lua のマニュアルを参照してください(https://drive.google.com/drive/folders/1l4xPfI6GooncpPrRxoS4nZwXp5MwWBUe)。


Modbus クライアント インターフェースの紹介


①MODBUS RTU ハンドルを取得する

ctx = modbus_new_rtu(choose, baud, parity, data_bit, stop_bit)

パラメーター:

int型 choose:  0:コントローラの RS485 (ディフォルト),
       2: フランジの端にある RS485(必須フィールド)

int型 baud:   4800 9600 ...(ディフォルトは4800)

int型 parity:  ‘E’,‘N’,‘O’対応するASCII コードの値は 69,78,79(ディフォルト値は78)

int型 data_bit:  7/8 (ディフォルト値は8)

int stop_bit:   1/2 (ディフォルト値は1)

戻り値:

ctx: modbusハンドル

例:ctx = modbus_new_rtu(1, 9600, 78, 8, 1)


②MODBUS  TCPハンドルを取得する

ctx = modbus_new_tcp(ip, port)

パラメータ:

string型 ip:modbus slaveのIPアドレス

int型  port:modbus スレーブのポート番号

戻り値:

ctx:modbusハンドル

例:ctx = modbus_new_tcp("192.168.1.15", 502)


③MODBUS  ハンドルを接続

ret = modbus_connect(ctx)

パラメータ:

ctx:modbusハンドル

戻り値(int型):

 ret:    -1:接続しません

   他の値であれば成功です。

注意:MODBUS  RTU ハンドル接続している場合,このインターフェースの戻り値は接続が成功するかどうかを判断する根拠ではない。

例:modbus_connect(ctx)


④MODBUS  ハンドルを閉じる

modbus_close(ctx)

パラメータ:

ctx:modbusハンドル

戻り値:空

例:modbus_close(ctx)


⑤スレーブ IDを設定する

ret = modbus_set_slave(ctx, slave_id)

int型 slave_id:スレーブID

戻り値(Int型):ret:   -1:接続に失敗

          他の値であれば成功

例:modbus_set_slave(ctx ,0x2)


⑥保持レジスタを書き込み 機能コード06

ret = modbus_write_register(ctx, reg, value)

パラメータ:

ctx:modbusハンドル

int型  reg:ゴールド レジスタのアドレス(十進数)

int型  value:値

int型 戻り値: ret:-1:エラー

         他の値であれば成功

例:modbus_write_register(ctx , 771, 1)


⑦コイル値を読み出し 機能コード01

reg_value = modbus_read_bits(ctx, reg, len)

パラメータ:

ctx:modbusハンドル

int型  reg:コイル アドレス

int型  value:コイル個数(<128)

テーブル型 戻り値: reg_value:コイルアドレスのデータリストを読み込みます

例:ret= modbus_read_bits(ctx , 771 ,1)


⑧複数コイル書き込み 機能コード 15

ret = modbus_write_bits(ctx, reg, size, value)

パラメータ:

ctx: modbusハンドル

int型  reg:コイル アドレス

int型  size:コイル個数

int型  value:コイル書き込みデータ、テーブル型

int型 戻り値: ret: -1:エラー

           他の値であれば成功

例:value_array = {1, 1, 1}
  modbus_write_bits(ctx, 1, 3, value_array)


⑨シングルコイルを書き込み 機能コード 05

ret = modbus_write_bit(ctx, reg, value)

パラメータ:

ctx:modbusハンドル

int型  reg:コイル アドレス

int型  value:コイルに書き込むデータ

int型 戻り値:  ret:  -1:エラー

             他の値であれば成功

例:modbus_write_bit(ctx , 1, 1)


⑩入力レジスタ読み出し 機能コード 04

ret, reg_value = modbus_read_input_register(ctx, addr)

パラメータ:

ctx:modbusハンドル

int型 addr:入力レジスタ アドレス

int型戻り値:  ret:  -1:エラー

           他の値であれば成功

int型  reg_value:正常に返されたレジスタ値を読み出し

例:modbus_read_input_register(ctx , 1)


⑪複数レジスタを書き込み 機能コード 16

modbus_write_registers(ctx, reg, size, value)

パラメータ:

ctx:modbusハンドル

int型     reg:レジスタ アドレス

int型     size:個数

テーブル型  value:書き込むデータ

int型    戻り値:  -1:エラー

           他の値であれば成功

例:modbus_write_registers (ctx , 1, 3, {0x3444, 0x3333, 0x4444})


⑫保持レジスタを読み出し 機能コード 03

modbus_read_registers(ctx, addr, len)

パラメータ:

ctx: modbusハンドル

int型   addr:レジスタ アドレス

int型   len:個数範囲は [1,125]

戻り値: 失敗:空,

     成功:レジスタ値はテーブル型

RTU 例:

sleep(5)
ctx = modbus_new_rtu(0,9600,78,8,1)
modbus_connect(ctx)        
ret1 = modbus_set_slave(ctx,0x3)
if(ret1 == -1) then
    elite_print("Wrong address")
end        
ret2 = modbus_write_register(ctx,771,1)        
if(ret2 == -1) then     
    elite_print("Write error")
end
ret3,value = modbus_read_register(ctx,771)        
if(ret3 == -1) then       
    elite_print("Read error")
end
elite_print("value is:",value)
modbus_close(ctx)


TCP例:

sleep(5)
ip = "192.168.1.7"
port = 502
ctx = modbus_new_tcp(ip,port)
repeat
    ret = modbus_connect(ctx)
until(ret ~= -1)
ret2 = modbus_write_register(ctx,771,1)
if(ret2 == -1) then        
     elite_print("Write error")
end
ret3, value = modbus_read_register(ctx,771)
if(ret3 == -1) then        
    elite_print("Read error")
end
elite_print("value is:",value)
modbus_close(ctx)
点击显示全文
赞同0
发表评论
分享

手机扫码分享
0
268
收藏
举报
收起
登录
  • 密码登录
  • 验证码登录
还没有账号,立即注册
还没有账号,立即注册
注册
已有账号,立即登录
选择发帖板块
举报
请选择举报理由
举报
举报说明