modbus_t环境是一个不透明的结构,包含根据所选变体与其他Modbus设备建立连接的所有必要信息。
该函数位于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;
}
该函数位于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;
}
该函数位于头文件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;
}
该函数位于头文件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);
该函数位于头文件modbus中
在使用任何libmodbus函数之前,调用者必须使用上述功能分配和初始化 modbus_t环境,然后提供以下函数来修改和释放环境:
函数原型:void modbus_free(modbus_t *ctx);
作用:释放modbus环境
该函数位于头文件modbus中
函数原型:int modbus_write_bit(modbus_t *ctx, int addr, int status);
作用:用于写远程设备addr地址处的状态,值必须是TRUE或者FLASE。该函数使用0x05功能码(强置单线圈)。返回:成功返回1,失败返回-1并设置errno。
该函数位于头文件modbus中
函数原型:int modbus_write_register(modbus_t *ctx, int addr, int value);
作用:用于写远程设备addr地址处的数值,设置为value。该函数使用0x06功能码(预置单寄存器)。返回:成功返回1,失败返回-1并设置errno。
该函数位于头文件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)。
该函数位于头文件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。