Modbus TCP サーバの実装について

実現したいこと

Modbus TCPというものを知り、試してみたく試行錯誤しています。
以下の環境おいてModbus TCP を実現したいのですがうまくいきません。

  • Modbusサーバ

ラズパイ
libmodbus使用

  • Modbusクライアント

Modbus TCP機能付きPLC(製品名は伏せます)

前提

・本体IPアドレス 192.168.1.5
・機能 コイルの状態読み出し
・マスターデバイスアドレス M0001
・データサイズ 1
・リモートホスト番号 192.168.1.100 502
・スレーブ番号 220
・Modbusスレーブアドレス 001002

  • Modbusサーバ

libmodbusを用いて構築(ソースは後述)

発生している問題・エラーメッセージ

  • クライアント側で以下の通信ログが確認できている

送信:OK
受信:エラー

  • サーバー側での最終ログは以下の通り

Modbusサーバが起動しました
かつ、いつまで経ってもquery_len が>0にならないことを確認
→TCP接続ができていないと判断

該当のソースコード

C++

1int ModbusServer()2{3 modbus_t *ctx = nullptr;4 ctx = modbus_new_tcp("192.168.1.100", 502);5 modbus_set_slave(ctx,220);6 7 if(modbus_tcp_listen(ctx, 1) == -1){8 std::cerr << "Modbusサーバのリスニングに失敗" << std::endl;9 modbus_free(ctx);10 return -1;11 }12 13 std::cout << "Modbusサーバが起動しました" << std::endl;14 15 // coilsのマッピング16 modbus_mapping_t *mapping = nullptr;17 mapping = modbus_mapping_new(0,0,16,0); // 16個のコイルを設定18 19 if(mapping == nullptr) {20 std::cerr << "Modbusマッピングに失敗" << std::endl;21 modbus_free(ctx);22 return -1;23 }24 25 while(true){26 uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];27 int query_len = modbus_receive(ctx, query);28 29 if(query_len > 0){30 int response_len = modbus_reply(ctx, query, query_len, mapping);31 32 if (response_len == -1){33 std::cerr << "レスポンス生成失敗" << std::endl;34 }35 }36 }37 38 modbus_mapping_free(mapping);39 modbus_free(ctx);40 std::cout << "Modbusサーバが正常終了しました" << std::endl;41 42 return 0;43}

試したこと

以下は確認済

  • PCからModbusサーバ機器に対してnetcatをしてTCP/502に接続できること
  • ModbusサーバからModbusクライアントにPingが通ること

とりあえずどんな内容でも良いのでハンドシェイクが取りたいです。

コメントを投稿

0 コメント