基于libmodbus的QT串口相关(三)——源代码解读——libmodbus底层库函数

modbus_t环境是一个不透明的结构,包含根据所选变体与其他Modbus设备建立连接的所有必要信息。

1.modbus_new_rtu函数

该函数位于modbus_rtu头文件

函数原型:modbus_t *modbus_new_rtu(const char *device, int baud, char parity, int data_bit, int stop_bit);

作用:modbus_new_rtu - 生成RTU的连接,这个 modbus_new_rtu()函数会生成并初始化一个modbus的结构体来在串行线路中使用RTU模式进行通讯。device 指定OS处理的串行端口的名称,比如 /dev/ttyS0 or /dev/ttyUSB0,在windows系统上,如果COM编号大于9,必须要在COM前加上\\.\ ,比如 \\\\.\\COM10.,参照http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx ,baud 参数指定连接的波特率,比如9600, 19200, 57600, 115200等。parity 参数代表奇偶检验位,有如下值:N   无奇偶校验、E  偶数校验、O  奇数校验,data_bit 参数指定数据的位数,允许值有: 5, 6, 7 ,8.stop_bit 参数指定停止位位数,允许值有1和0.如果建立成功,modbus_new_rtu()函数将返回指向modbus_t结构的指针。 否则它将返回NULL并将errno设置为下面定义的值之一。

参考例程:


modbus_t *ctx;

 

ctx = modbus_new_rtu("/dev/ttyUSB0", 115200, 'N', 8, 1);

if (ctx == NULL) 
{

    fprintf(stderr, "Unable to create the libmodbus context\n");

    return -1;

}

2.modbus_set_slave函数

该函数位于modbus头文件。

函数原型:int modbus_set_slave(modbus_t *ctx, int slave);

 

作用:设定从机号码(slave number),modbus_set_slave() 用于设定libmodbus环境中的slave数值。此动作取决于网络和设备的角色。RTU:定义远程设备的从站ID以在主站模式下进行通信,或将内部从站ID设置为从站模式。 根据协议,Modbus设备只接受包含了其从机号码(slave number)或特殊广播号码的消息。TCP:如果消息必须到达串行网络上的设备,则仅在TCP中需要从站号码。 某些不兼容的设备或软件(例如modpoll)使用从站ID作为单元标识符,这是不正确的(参见Modbus Messaging Implementation Guide v1.0b的第23页)没有从站值,故障的远程设备或软件会丢弃请求! 特殊值MODBUS_TCP_SLAVE(0xFF)可用于TCP模式以恢复默认值。

广播地址是 MODBUS_BROADCAST_ADDRESS 。 当您希望网络中的所有Modbus设备都收到请求时,必须使用此特殊值。

成功则返回0,否者返回-1并将errno设定为下面定义的值之一。slave number 为空。

参考例程:


modbus_t *ctx;

 

ctx = modbus_new_rtu("/dev/ttyUSB0", 115200, 'N', 8, 1);

if (ctx == NULL) {

    fprintf(stderr, "Unable to create the libmodbus context\n");

    return -1;

}

 

rc = modbus_set_slave(ctx, YOUR_DEVICE_ID);

if (rc == -1) {

    fprintf(stderr, "Invalid slave ID\n");

    modbus_free(ctx);

    return -1;

}

 

if (modbus_connect(ctx) == -1) 
{

    fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));

    modbus_free(ctx);

    return -1;

}

3.modbus_connect函数

该函数位于头文件modbus中

函数原型:int modbus_connect(modbus_t *ctx);

使用参数给定的环境信息,建立与主机、网络或总线的连接。返回:成功返回0,错误返回-1并将errno设置为底层平台的系统呼叫。


int modbus_connect(modbus_t *ctx);

//例子

modbus_t *ctx;

 

ctx = modbus_new_tcp("127.0.0.1", 502);

if (modbus_connect(ctx) == -1)
 {

    fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));

    modbus_free(ctx);

    return -1;

}

 

4.modbus_close函数

该函数位于头文件modbus中

函数原型: void modbus_close(modbus_t *ctx);

作用:关闭与下级建立的连接。返回值:无


void modbus_close(modbus_t *ctx);

//例子

modbus_t *ctx;

 

ctx = modbus_new_tcp("127.0.0.1", 502);

if (modbus_connect(ctx) == -1) {

    fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));

    modbus_free(ctx);

    return -1;

}

 

modbus_close(ctx);

modbus_free(ctx);

5.modbus_free函数

该函数位于头文件modbus中

在使用任何libmodbus函数之前,调用者必须使用上述功能分配和初始化 modbus_t环境,然后提供以下函数来修改和释放环境:

函数原型:void modbus_free(modbus_t *ctx);

作用:释放modbus环境

6.modbus_write_bit函数

该函数位于头文件modbus中

函数原型:int modbus_write_bit(modbus_t *ctx, int addr, int status);

作用:用于写远程设备addr地址处的状态,值必须是TRUE或者FLASE。该函数使用0x05功能码(强置单线圈)。返回:成功返回1,失败返回-1并设置errno。

7.modbus_write_register函数

该函数位于头文件modbus中

函数原型:int modbus_write_register(modbus_t *ctx, int addr, int value);

作用:用于写远程设备addr地址处的数值,设置为value。该函数使用0x06功能码(预置单寄存器)。返回:成功返回1,失败返回-1并设置errno。

8.modbus_read_bits函数

该函数位于头文件modbus中

函数原型:modbus_read_bits(plc, Adress, Count, read_reg_bit);

作用:用于读远程设备的 addr 地址开始的共nb 位(线圈)的状态,读取的结果以无符号的字节 (8 位) 设置为TRUE或FALSE存储在目的数组dest中。您必须注意分配足够的内存以将结果存储在dest位置,至少是nb* sizeof (uint8_t) 的内存大小。 该函数使用0x01功能码(读取线圈状态)。返回:成功返回读取位的数目即nb,失败返回-1并设置errno为Too many bits requested。译者注:即取得一组逻辑线圈的当前状态(1/0)。

9.modbus_read_registers函数

该函数位于头文件modbus中

函数原型:int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);

作用: 用于读远程设备的 addr 地址开始的共nb 位(保持寄存器)的状态。读取结果以uint (16 位) 的形式存储在dest数组中。您必须注意分配足够的内存以将结果存储在dest位置,至少是nb* sizeof (uint16_t) 的内存大小。该函数使用0x03 功能码 (读取保持寄存器)。返回:成功返回读取输入位的数目即nb,失败返回-1并设置errno为Too many registers requested。

 

 

 

 


 

 
 

 

 

 

 

 

 

 

你可能感兴趣的:(通信)