現代の産業通信では、Modbusプロトコルはそのシンプルさと実装の容易さから広く使用されている。この記事では、libmodbusライブラリを使用してTCPベースのModbusサーバを作成する方法を具体的な例で詳しく説明します。このサーバは、クライアントからのModbusリクエストを処理し、それらのリクエストに応答することができます。
完全なコード(中国語):
1. Modbus TCPサーバの初期化
まず、libmodbusライブラリを導入し、Modbus TCPサーバを初期化します。この例では、サーバはローカルアドレスにバインドされます。127.0.0.1ポートと港。1502。呼び出しによってmodbus_new_tcp関数として、ポイントを作成します。modbus_tその後のすべての操作のコンテキストとして機能する構造体へのポインタ:
ctx = modbus_new_tcp("127.0.0.1", 1502);2. Modbusデータモデルのマッピング
次に、サーバーが使用するModbusデータマップを定義する必要があります。このステップは通過する。modbus_mapping_newこの関数は、異なるタイプのModbusデータ(ビット、入力ビット、ホールドレジスタ、入力レジスタ)のメモリを割り当てて初期化することで行われます。
mb_mapping = modbus_mapping_new(500, 500, 500, 500);
if (mb_mapping == NULL) {
fprintf(stderr, "Failed to allocate the mapping: %s\n", modbus_strerror(errno));
modbus_free(ctx);
return -1;
}3.クライアント接続のリスニングと受け入れ
データマッピングの準備ができたら、サーバーはクライアントからの接続要求をリッスンし始めることができます。使用する。modbus_tcp_listen関数はリスニングを開始し、使用するmodbus_tcp_acceptアクセスを処理するクライアント接続:
s = modbus_tcp_listen(ctx, 1); modbus_tcp_accept(ctx, &s);
4.リクエストの受信と対応
サーバのメインループは、クライアントリクエストの待機、受信、処理、応答の送信を含みます。これは継続的な呼び出しmodbus_receiveリクエストを受信して使用する関数modbus_reply応答を送信する機能:
for (;;) {
rc = modbus_receive(ctx, query);
if (rc > 0) {
modbus_reply(ctx, query, rc, mb_mapping);
} else if (rc == -1) {
break;
}
}5.リソースのクリーンアップとシャットダウン
サーバーがタスクを完了すると(通常はエラーまたはクライアントが接続を閉じて)、割り当てられたすべてのリソースを解放し、接続を優雅に閉じる必要があります。
printf("Quit the loop: %s\n", modbus_strerror(errno));
if (s != -1) {
close(s);
}
modbus_mapping_free(mb_mapping);
modbus_close(ctx);
modbus_free(ctx);上記の手順では、libmodbusを使用して完全に機能するModbus TCPサーバを作成する方法を示しました。このサーバは、単一または複数のビットとレジスタの読み書きを含む標準的なModbus関数コードを処理できます。この例は、教育や試験目的だけでなく、実際のアプリケーションでの基礎としても使用できます。
发表回复