2013-05-27 6 views
2

에 의해 배열을 전달하기위한 바피 (Vapi)의 정의에 사용하는 I가 ModbusTCP 사용하여 하나의 장치 레지스터를 읽을 libmodbus을 사용하여 다음과 같은 C 코드 :매개 변수 참조

modbus_t *ctx; 
uint16_t tab_reg[16]; 

ctx = modbus_new_tcp("10.0.1.77", 502); 
modbus_read_registers(ctx, 0x20, 2, tab_reg); 

printf("reg = %d (0x%X)\n", tab_reg[0], tab_reg[0]); 
printf("reg = %d (0x%X)\n", tab_reg[1], tab_reg[1]); 

지금 발라은을 사용하여 이상이 전환 시도

[CCode (cheader_filename = "modbus.h", cname = "modbus_new_tcp")] 
public static unowned Modbus.modbus_t create_tcp (string ip_address, int port); 

public static int read_registers (Modbus.modbus_t ctx, int addr, int nb, uint16 dest); 
[CCode (cheader_filename = "modbus.h")] 

및 번역 발라 프로그램입니다 : 내가 생성 한 VAPI, 새로운 읽기 그 내용은

class ModbusReadTest : GLib.Object { 

    unowned Modbus.modbus_t ctx; 

    public void run() { 
     uint16 reg = 0x00; 

     ctx = create_tcp ("10.0.1.77", 502); 
     Modbus.read_registers (ctx, 0x20, 2, reg); 

     message ("reg = %d (0x%X)", reg, reg); 

     Modbus.close(ctx); 
    } 
} 
놀라운 일이 아니다

read-registers-test.c:71:2: warning: passing argument 4 of ‘modbus_read_registers’ makes pointer from integer without a cast [enabled by default] 

: 나는 C 코드로 다음 이진 사용하여 GCC에이를 컴파일 할 때 6,

은 공교롭게도, 나는 오류가 발생합니다. '

int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest); 

내가 배열 옵션의 혼합을 시도하고'밖으로 '를 사용하지만, 천국 :하지만 내가 가까이 libmodbus 헤더의 프로토 타입을 일치하도록 바피 (Vapi)의 내용을 수정 가야하는 방법을 잘 모르겠어요 한 번에 두 개 이상의 더블 바이트 레지스터를 가질 수있었습니다.

의견을 보내 주셔서 감사합니다.

답변

5

read_registers 아마 대신 정적 메소드의 (Modbus.modbus_t에) 인스턴스 방법을해야하고, Modbus.modbus_t 아마 Modbus.Context 같은로 변경해야 create_tcp 아마 생성자해야하고, Modbus.close는해야 Modbus.Context 컴팩트 클래스의 무료 기능이지만,이 질문의 요점입니다. (irc.gnome.org에서 #vala를 사용하면 도움을 얻을 수 있습니다).

public static int read_registers (Modbus.modbus_t ctx, int addr, [CCode (array_length_pos = 2.5)] uint16[] dest); 

그런 다음 당신이 발라에서 이런 짓을 할 것이다 : :

public void run() { 
    uint16 reg[2]; 

    ctx = create_tcp ("10.0.1.77", 502); 
    Modbus.read_registers (ctx, 0x20, reg); 

    message ("reg = %d (0x%X)", reg, reg); 

    Modbus.close(ctx); 
} 

tab_reg가 가지고있는 원래의 C (더 충실 포트에 대한

당신은 아마 그것을 배열을 만들고 싶어 2) 대신 16 개 요소를 사용하면 배열 자르기를 사용할 수 있습니다.

public void run() { 
    uint16 reg[16]; 

    ctx = create_tcp ("10.0.1.77", 502); 
    Modbus.read_registers (ctx, 0x20, reg[0:2]); 

    stdout.printf ("reg = %d (0x%X)\n", reg, reg); 

    Modbus.close(ctx); 
} 

배열 방법을 사용하려면 array_length_pos를 1.5로 변경해야합니다.

+1

완벽하고 고마워요. –