2016-10-24 10 views
0

私はmodbusを初めて使用しています。私はヘルプ(?)ファイルを読んで何時間も費やしてきましたが、これはあなたに例を与えてくれないようです。私はRaspberry Pi、model3でCを使い、libmodbusをインストールしています。私はepSolarソーラーパネルコントローラとFTDI USB to RS485コンバータを使って話をしようとしています。 epSolarのドキュメントでは、Read Inputレジスタは3000番地から始まり、311Dに続きます。私は3104を読もうとしています。 私は以下のコードを修正しました。これは、デバイスに接続しますが、入力レジスタを読み取ろうと0x04を常に-1を返します。libmodbus関数の使用例がありません

#include <stdio.h> 
#include <unistd.h> 
#include <string.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <modbus.h> 

enum {TCP, RTU}; 

int main(int argc, char *argv[]) 
{ 
int socket; 
modbus_t *ctx; 
modbus_mapping_t *mb_mapping; 
int rc; 
int use_backend; 
int i; 
uint16_t tab_reg[64]; 
use_backend = RTU; 

printf("Waiting for Serial connection\n"); 
ctx = modbus_new_rtu("/dev/SOLAR", 115200, 'N', 8, 1); 
modbus_set_slave(ctx, 0); 
//modbus_connect(ctx); 
if(modbus_connect(ctx) == -1) 
    { 
    fprintf(stderr, "Serial connection failed: 
      %s\n", modbus_strerror(errno)); 
    modbus_free(ctx); 
    return -1; 
    } 

printf("Serial connection started!\n"); 

mb_mapping = modbus_mapping_new(MODBUS_MAX_READ_BITS, 0, 
           MODBUS_MAX_READ_REGISTERS, 0); 
if(mb_mapping == NULL) 
    { 
    fprintf(stderr, "Failed to allocate the mapping: %s\n", 
       modbus_strerror(errno)); 
    modbus_free(ctx); 
    return -1; 
    } 
    rc = modbus_read_input_registers(ctx, 1, 0x0A, tab_reg); 
    if(rc == -1) 
    { 
    fprintf(stderr, "%s\n", modbus_strerror(errno)); 
    return -1; 
    } 

    for(i=0; i < rc; i++) 
    printf("reg[%d]=%d (0x%X)\n", i, tab_reg[i], tab_reg[i]); 
    modbus_mapping_free(mb_mapping); 
    modbus_free(ctx); 
    modbus_close(ctx); 
    return 0; 
} 

それは罰金接続し、マッピングを割り当てますが、RCは常に-1ポートがタイムアウトしたエラーメッセージが表示されて。 私は思考を使い果たし、私がトレサールを通してナビゲートしているように感じます!

ご迷惑をおかけして申し訳ございません。

+0

** modbus_set_slave(ctx、0); ** modbus swlave ID 0は無効です。有効なmodbusスレーブIDは1-247です。 –

答えて

0

私はModbusも新しくなっています。私の現在の経験では、結果を格納するのに十分なメモリをtab_regに割り当てていることを確認してください。また、デバッグモードをmodbus_set_debug(ctx, TRUE);に設定して、リクエストとレスポンスコードを確認してください。

関連する問題