在工业自動化领域,Modbusプロトコル因其简洁性和广泛サポート而常被用于デバイス间通信。本記事介绍使い方は?C语言和libmodbus库来作成一个功能齐全的Modbus TCPServer,実装デバイス间的有效通信。
完全代码:
1. 初期化ModbusServer
首先,需要作成一个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函数来监听网络连接,它戻る一个socket説明符。サーバー·サーバー能够処理的最大连接数由NB_CONNECTION宏定义:
server_socket = modbus_tcp_listen(ctx, NB_CONNECTION);
4. 処理SIGINT信号
为了能够优雅地关闭サーバー·サーバー并释放リソース,我们使用signal函数来捕获SIGINT信号(通常由Ctrl+C引发),并将其关联到close_sigint函数:
signal(SIGINT, close_sigint);
close_sigint函数关闭socket,释放ModbusContextより和マッピング,然后退出程序。
5. メイン·サイクル
サーバー·サーバー运行在一个无限循环中,使用select函数来监听socket上的活动。もしselect检测到活动,サーバー·サーバー将チェック是新的接続リクエストまだ已建立连接的データリクエスト:
if (master_socket == server_socket) {
// 処理新的接続リクエスト
} else {
// 処理来自接続されたクライアント側は的データ
}对于新的连接,サーバー·サーバー接受连接并将新socket追加到监听集合中。对于データリクエスト,サーバー·サーバー使用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 TCPServer,它不仅サポート多クライアント側は连接,还能够提供について其性能的リアルタイムデータ。这为工业应用中的デバイス通信提供了一个强大且灵活的ソリューション。
Leave a Reply