2013-05-27 58 views
2

传递数组我有一个使用libmodbus使用MODBUSTCP读取单个设备寄存器以下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")] 

和翻译瓦拉程序是:

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); 
    } 
} 

巧合的是,当我编译成C代码,然后转换成二进制使用gcc这个我得到的错误:

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

这并不奇怪。但我不知道我应该如何去修改瓦皮内容的原型在libmodbus头接近匹配:

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

我试过的阵列选项的组合和使用“出”,但避风港”一次只能得到一个以上的双字节寄存器。

感谢您的任何建议。

回答

5

read_registers应该可能是一个实例方法(在Modbus.modbus_t上)而不是静态方法,而Modbus.modbus_t可能应该重命名为类似于Modbus.Context,create_tcp应该是构造函数,并且Modbus.close应该成为Modbus.Context compact类的一个免费函数,但这不是问题的要点(如果你在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); 
} 

对于端口更忠实于原始的C(其中tab_reg有16个元素,而不是2),你可以使用数组切片:

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); 
} 

请注意,如果你把它的我nstance方法,您需要将array_length_pos更改为1.5。

+1

完美,非常感谢。 –