産業オートメーションの分野では、Modbusプロトコルはそのシンプルさと幅広いサポートからデバイス間通信によく使用されています。この記事では、C言語とlibmodbusライブラリを使用して、デバイス間の効率的な通信を可能にするフル機能のModbus TCPサーバを作成する方法を説明します。
完全なコード:
1. Modbusサーバの初期化
まず、Modbus TCPサーバインスタンスを作成します。使用する。modbus_new_tcpポイントの初期化modbus_t型へのポインタ。この関数の引数はサーバのIPアドレスとポート番号です。この例では、サーバーはローカルアドレス127.0.0.1のポート1502をリッスンするように構成されています。
ctx = modbus_new_tcp("127.0.0.1", 1502);2. Modbusマッピングの設定
Modbusマッピングは、サーバがデータ(コイル、ディスクリート入力、ホールドレジスタ、入力レジスタなど)を保存する方法です。使用する。modbus_mapping_newこれらのデータ領域の割り当てと初期化:
mb_mapping = modbus_mapping_new(MODBUS_MAX_READ_BITS, 0, MODBUS_MAX_READ_REGISTERS, 0);
マッピングの作成に失敗すると、サーバーはエラー·メッセージを出力して終了します。
3.接続のリスニング
使用する。modbus_tcp_listenネットワーク接続をリッスンする関数で、ソケット記述子を返します。サーバが処理できる接続の最大数NB_CONNECTIONマクロの定義:
server_socket = modbus_tcp_listen(ctx, NB_CONNECTION);
4. SIGINT信号の処理
サーバーを適切にシャットダウンしてリソースを解放するには、signalSIGINTシグナル(通常はCtrl+Cで発生)をキャプチャし、に関連付ける関数。close_sigint機能:より:
signal(SIGINT, close_sigint);
close_sigint関数はソケットを閉じ、Modbusコンテキストとマッピングを解放し、プログラムを終了します。
5.メイン·サイクル
サーバは無限ループで動作します。selectソケット上のアクティビティをリッスンする機能。もし、selectアクティビティが検出されると、サーバーは新しい接続要求か、接続が確立されたデータ要求かをチェックします。
if master_s == server_s {
新しい接続要求の処理
(エルゼ)
//接続されたクライアントからデータを処理する
}新しい接続の場合、サーバーは接続を受け入れ、新しいソケットをlistenコレクションに追加します。データ要求の場合、サーバはmodbus_receiveデータを受け取り、利用するmodbus_reply応答を送る。
6.パフォーマンス評価
サーバの性能を評価するために、転送データレートの計算がコードに組み込まれています。サーバは、所与の時間内に正常に処理されたビットbitsとレジスタregistersの数をカウントし、ポイント/秒とKiB/秒の転送速度を求めます。
rate = (n_loop * nb_points) * G_MSEC_PER_SEC / (end - start);
printf("* %d points/s\n", rate);これらのパフォーマンス指標は、サーバの設定やネットワーク構成を最適化する際に役立ちます。
結論:結論
C言語とlibmodbusライブラリを使用すると、複数のクライアント接続をサポートするだけでなく、パフォーマンスに関するリアルタイムデータを提供するModbus TCPサーバを効率的に実装できます。これにより、産業用アプリケーションのデバイス通信に強力で柔軟なソリューションが得られます。
发表回复