特徴は
libmodbusは、高速でクロスプラットフォームのModbusライブラリです。
説明する。
libmodbusは、Modbusプロトコルを使用するデバイスとのデータ送受信のためのライブラリです。このライブラリには、異なるネットワークを介して通信する様々なバックエンドbackendsが含まれているRTUモードでのシリアルポートやTCP / IPv6でのイーサネットなど。
プロトコル仕様ドキュメントhttp//www.modbus.org/specs.phpは、http//www.modbus.org Webサイトから入手できます。
libmodbusは下位通信層の抽象化を提供し、サポートされているすべてのプラットフォームで同じAPIを提供します。
このドキュメントでは、libmodbusの概念を紹介し、libmodbusが異なるハードウェアやプラットフォームからModbus通信を実装する方法を説明し、libmodbusライブラリが提供する関数のリファレンスマニュアルを提供します。
環境contexts
RTUバックエンド(リモートターミナルユニット)はシリアルポート通信に使用され、プロトコル通信に使用されるデータのコンパクトなバイナリ表現を使用します。RTUフォーマットはコマンド/データに従い、CRC(巡回冗長チェック)はデータの信頼性を確保するためのエラーチェックメカニズムとして機能します。Modbus RTUはModbusで最も一般的な実装である。Modbus RTUメッセージは連続して送信されなければならず、文字の間隔はあってはならない(Wikipedia Modbus www.example.comより2011年3月13日現在20 51 GMT)。http://en.wikipedia.org/wiki/Modbus
Modbus RTUフレームワークは、スレーブ、Modbusリクエストを処理するデバイス/サーバ、リクエストを送信するクライアント(マスター)を呼び出します。通信は常にプライマリ·サーバから開始されます。
多くのModbusデバイスは同じ物理リンク(バス構造)上で接続できるため、メッセージを送信する前にmodbus_set_slaveを使用してスレーブ(受信デバイス)IDを設定する必要があります。スレーブを実行している場合、そのスレーブ番号は受信メッセージのフィルタリングに使用されます。
modbus RTU環境の作成
初期化RTU環境ポインタmodbus_t * modbus_new_rtu const char *device int baud char parity int data_bit int stop_bit
mod_t * mod_new_rconst * int baud parity int data_bit int_bit;
//参照コード
mod_t *ctx;
ctx = mod_new_r "/dev/ttyUSB0" 115200 'N8 1;
if ctx == NULL {
ff stderr "Unable to the libmodcontext\n";
リターン-1;
}modbus_new_rtu関数は、RTUモードを使用してシリアル回線で通信するためのmodbus構造体を生成し、初期化します。
デバイスOSが処理するシリアルポートの名前を指定します(例:/dev/ttyS0や/dev/ttyUSB0)。Windowsシステムでは、COM番号が9より大きい場合は、COMの前に\.\を付ける必要があります。例えば、“..。コム10、http//msdn.microsoft.com/en-us/library/aa365247 v=vs.85.aspxを参照
baud :接続のボーレートを指定します。たとえば、96 00、19200、576 00、115200などです。
パリティ:パリティチェックビットを表し、以下の値を持ちます。
Nパリティなし
E 偶数チェック
O 奇数の検証
data_bit:データのビット数を指定します。使用可能な値は、5,6,7,8です。
stop_bit:停止ビット数を指定し、1と2を指定できます。
戻り値:確立に成功すると、modbus_new_rtu()関数はmodbus_t構造体へのポインタを返します。それ以外の場合はNULLを返し、errnoをAn invalid argument was given.に設定します。
シリアルモードの設定
現在のシリアルモードの取得int modbus_rtu_get_serial_mode modbus_t *ctx);
int modbus_rtu_get_serial_mode (modbus_t *ctx);≪戻り値| Return | emdw ≫成功した場合、関数は戻ります。 MODBUS_RTU_RS232 または MODBUS_RTU_RS485 。それ以外の場合は-1を返し、errnoをThe current libmodbus backend is not RTU.
RTU環境でのみ使用。
シリアルモードの設定 int modbus_rtu_set_serial_mode(modbus_t *ctx, int mode);
int modbus_rtu_set_serial_mode(modbus_t *ctx, int mode);mode-MODBUS_RTU_RS232またはMODBUS_RTU_RS485を入力します。
戻り値成功した、关数は0を返します。それ以外の場合、-1を返し、errnoを以下で定義する値のいずれかに設定します。
EINVAL The current libmodbus backend is not RTU.
ENOTSUP The function is not supported on your platform.。
ioctlの呼び出しが失敗すると、ioctlのエラーコードが返されます。
RTU環境での現在のRTSモードの取得int modbus_rtu_get_rts modbus_t *ctx)RepliStor 3.1.4リリースでRepliStorを補完
int modbus_rtu_get_rts (modbus_t *ctx);現在のctx環境でリクエストを送信するモードを取得できます。
戻り値:
MODBUS___NONE MODBUS___UP MODBUS_RTU_RT_DOWN -1、つまり呼び出しは失敗し、EINVALをThe libmodbus backend is not RTU.に設定します。
RTU環境でのRTSモードの取得設定int modbus_rtu_set_rts modbus_t *ctx, int mode)RepliStor 3.1.4リリースでRepliStorを補完
int mod_r_set_rts mod_t *ctx int mode;
//例:正極性を持つRTSモードを起動する
mod_t *ctx;
uint16_t tab_reg10];
ctx = mod_new_r "/dev/ttyS0" 115200 'N8 1;
mod_set_slave ctx 1;
mod_r_set_serial_mode ctx、MODBUS_RTU_485;
mod_r_set_rts ctx、MODBUS___UP;
if modbus_connect ctx == -1 {
ff stderr "Connexion ed %s\n" mod_strerror no;
mod_free ctx;
リターン-1;
}
rc = mod_read_registers ctx 0 7 tab_;
if rc == -1 {
ff stderr "%s\n" mod_strerror no;
リターン-1;
}
mod_clctx;
mod_free ctx;RS 485シリアルバス上で通信するための送信リクエストの送信モードを設定します。デフォルトモードはMODBUS_RTT_RTS_NONEで、データがラインに書き込まれるまで信号が送信されません。
RTSモードを有効にするには、MODBUS_RTU_RTS_UPまたはMODBUS_RTU_RTU_RTS_DOWNを使用する必要があります。これらのモードは、RTSモードを有効にし、極性を同時に設定します。MODBUS___UPを使用すると、フラグ位置をイネーブルにしてioc呼び出しを行い、次いで1ミリ秒の遅延の后にバスにデータを书き込み、次いでフラグ位置を非イネーブルにして别のioc呼び出しを行い、再度1ミリ秒遅延させる。MODBUS___DOWNモードも同様であるが、逆のフラグビットを使用する。
成功した場合、関数は0を返すはずです。それ以外の場合は-1を返し、errnoをThe libmodbus backend isn t RTU or the mode given in argument is invalid.に設定します。
カスタムRTS実装int modbus_rtu_set_custom_rts modbus_t *ctx, void (set_rts) (modbus_t ctx, int on))RepliStor 3.1.4リリースでRepliStorを補完
int modbus_rtu_set_custom_rts(modbus_t *ctx, void (set_rts) (modbus_t ctx, int on));転送前後の設定RST PINの設定呼び出すカスタム定義関数は、デフォルトではIOCTLでRTS PINを切り替える内部関数を呼び出すように設定されています。
関数はRTSモードに従い、MODBUS_RTU_RTT_RT_UPまたはMODBUS_RTU_RTU_RTU_RTU_RTU_RTU_RTU_RTU_RTU_DOWNの値を使用して呼び出す必要があることに注意してください。
戻り値modbus_rtu_set_custom_rts関数が成功した場合、0を返します。それ以外の場合は-1を返し、errnoをThe libmodbus backend is not RTU.に設定します。
发表回复