uC/Modbus 用户手册——第三节 使用uC/Modbus

目录

3.00 使用uC/Modbus

3.01 使用uC/Modbus,MB_CfgCh()

3.02 使用uC/Modbus,MB_ChToPortMap()

3.03 使用uC/Modbus,MB_Exit()

3.04 使用uC/Modbus-M,MBM_FC01_CoilRd()

3.05 使用uC/Modbus-M,MBM_FC02_DIRd()

3.06 使用uC/Modbus-M,MBM_FC03_HoldingRegRd()

3.07 使用uC/Modbus-M, MBM_FC03_HoldingRegRdFP()

3.08 使用uC/Modbus-M,MBM_FC04_InRegRd()

3.09 uC/Modbus-M,MBM_FC05_CoilWr()

3.10 uC/Modbus-M,MBM_FC06_ HoldingRegWr()

3.11 使用uC/Modbus-M,MBM_FC06_ HoldingRegWrFP()

3.12 使用uC/Modbus-M,MBM_FC08_Diag()

3.13 使用uC/Modbus-M,MBM_FC15_CoilWr()

3.14 使用uC/Modbus-M,MBM_FC16_HoldingRegWrN ()

3.15 使用uC/Modbus-M,MBM_FC16_HoldingRegWrNFP()

3.16 使用uC/Modbus,MB_Init()

3.17 使用uC/Modbus,MB_ModeSet()

3.18 使用uC/Modbus-S,MB_ NodeAddrSet()

3.19 uC/Modbus-S,MB_WrEnSet()


​​​​​​​3.00 使用uC/Modbus

为了在您的产品中使用uC/Modbus,您需要确保拥有以下元素:

为您正在使用的CPU设置uC/CPU:

需要创建cpu.h和cpu_a.asm文件(参见2.04)。

为您正在使用的UART和RTU计时器设置BSP:

您需要创建一个mb_bsp.c文件(参见章节5)。需要注意,uC/Modbus包含一个用于不同处理器和板的mb_bsp.c文件。您可以将这些文件作为写BSP的示例。

为您正在使用的RTOS设置RTOS接口:

uC/Modbus包含了uC/OS-II和uC/OS-III的RTOS接口(参见章节6)。如果使用其他RTOS,您需要提供一个mb_os.c文件。实际上可以仿造为uC/OS-II和uC/OS-III提供的接口创建RTOS接口。

对于uC/OS-II和uC/OS-III,不要忘记配置#defines来设置任务优先级和堆栈大小(需要放置在您应用程序的app_cfg.h中)。

如果您的产品不需要RTOS,您可以使用No_OS端口。该端口仅适用uC/Modbus-S,uC/Modbus-M都需要使用RTOS。

初始化uC/Modbus并配置通道。

通过调用MB_Init()并指定一个Modbus RTU频率作为参数即可完成uC/Modbus初始化。一旦完成初始化,只需要对每个Modbus通道配置即可(使用MB_CfgCh()),示例如下。此处,我们的产品拥有3个Modbus端口:一个Modbus RTU端口,波特率为9600,一个Modbus ASCII端口,波特率为19200,一个Modbus ASCII Master端口,波特率为19200。两个Modbus从机端口默认Modbus地址为1,当然,如有需要您可以为其分别指定地址。

MB_Init(1000);                // Initialize uC/Modbus, RTU timer at 1000 Hz 
MB_CfgCh( 1,                  // ... Modbus Node # for this slave channel
         MODBUS_SLAVE,        // ... This is a SLAVE
          0,                  // ... 0 when a slave 
         MODBUS_MODE_RTU,     // ... Modbus Mode (_ASCII or _RTU) 
          1,                  // ... Specify UART #1 
         9600,                // ... Baud Rate 
          8,                  // ... Number of data bits 7 or 8 
         MODBUS_PARITY_NONE,  // ... Parity: _NONE, _ODD or _EVEN 
          1,                  // ... Number of stop bits 1 or 2 
         MODBUS_WR_EN);       // ... Enable (_EN) or disable (_DIS) writes 
MB_CfgCh( 1,                  // ... Modbus Node # for this slave channel 
         MODBUS_SLAVE,        // ... This is a SLAVE
          0,                  // ... 0 when a slave
         MODBUS_MODE_ASCII,   // ... Modbus Mode (_ASCII or _RTU) 
          1,                  // ... Specify UART #2 
         19200,               // ... Baud Rate 
          8,                  // ... Number of data bits 7 or 8 
         MODBUS_PARITY_NONE,  // ... Parity: _NONE, _ODD or _EVEN 
          1,                  // ... Number of stop bits 1 or 2 
         MODBUS_WR_EN);       // ... Enable (_EN) or disable (_DIS) writes

要点

如果您的应用使用RTOS接口,一个uC/Modbus-S通道配置后,不需要在代码中做任何事情。也就是,不许要在应用程序任务中不需要添加任何代码,Modbus主机就可以与您的Modbus从机进行通信。更多工作原理的详细信息请参考第7节。

如果应用未使用RTOS接口,uC/Modbus-S通道配置完成后,应用程序需要调用MB_OS_RxTask()来轮询Modbus从机通道。更多工作原理的详细信息请参考第8节。

MB_CfgCh( 1,                 // ... Modbus Node # for this slave channel 
         MODBUS_MASTER,      // ... This is a MASTER
         OS_TICKS_PER_SEC,   // ... One second timeout waiting for slave response
         MODBUS_MODE_ASCII,  // ... Modbus Mode (_ASCII or _RTU) 
          2,                 // ... Specify UART #3 
         19200,              // ... Baud Rate 
          8,                 // ... Number of data bits 7 or 8 
         MODBUS_PARITY_NONE, // ... Parity: _NONE, _ODD or _EVEN 
          1,                 // ... Number of stop bits 1 or 2 
         MODBUS_WR_EN);      // ... Enable (_EN) or disable (_DIS) writes

要点

uC/Modbus-M通道配置完成后,应用程序需要调用本节中描述的MBM_FC??_???()函数来从连接到该通道的Modbus从机获取数据。更多工作原理的详细信息请参考第8节。

您的应用程序通过多个函数与μC/Modbus对接,这些函数允许您更改通道的行为。对于每个接口函数uC/Modbus适用于主机通道或从机通道,uC/Modbus-S只适用于从机通道,uC/Modbus-M只适用于主机通道。

​​​​​​​3.01 使用uC/Modbus,MB_CfgCh()

该函数用于配置您产品中的每个Modbus通道。MB_CfgCh()必须在MB_Init()之后调用,函数原型如下:

原型

MODBUS_CH *MB_CfgCh (CPU_INT08U node_addr,
                     CPU_INT08U master_slave,
                     CPU_INT32U rx_timeout,
                     CPU_INT08U modbus_mode,
                     CPU_INT08U port_nbr,
                     CPU_INT32U baud,
                     CPU_INT08U bits,
                     CPU_INT08U parity,
                     CPU_INT08U stops,
                     CPU_INT08U wr_en);

参数

node_addr

连接到产品的Modbus主机所看到的通道的节点地址。每个通道可以被“看作”具有相同的节点地址或每个通道具有不同的节点地址。

master_slave

指定通道作为Modbus主机或Modbus从机。该参数的值可以是MODBUS_MASTER或MODBUS_SLAVE。

rx_timeout

指定Modbus主机等待从机响应的时间量。在RTOS时钟中指定该时间(请参阅RTOS文档以确定时钟速率)。

modbus_mode

指定操作模式(ASCII或RTU),因此,该参数可以是MODBUS_MODE_ASCII 或 MODBUS_MODE_RTU。

port_nbr

指定哪一个物理连接(即:端口)与Modbus通道相关联。也就是该参数决定哪一个UART将与Modbus通道关联。port_nbr通常从0分配到产品中的最大物理UART数量减去1。例如,如果您的产品有4个UART,并且全部关联到Modbus通道,那么这些UART编号为0到3。当然,没有必要一定要从0开始编号,编号方案取决于MB_BSP.c文件。

baud

Modbus通道的波特率。通常指定一个标准波特率,如9600,19200,38400等。

bits

指定UART使用的数据位数。对于RTU,通常指定8。对于ASCII,可以指定7或8。如果指定7位,您可能还需要指定奇偶性(请参见下一个参数)。

parity

当使用Modbus ASCII模式时指定奇偶校验的类型(如果需要使用奇偶校验)。此参数允许的值:

MODBUS_PARITY_NONE,

MODBUS_PARITY_ODD和

MODBUS_PARITY_EVEN。

stops

指定UART使用的停止位的位数。可以指定1或2。典型值为1,但请与Modbus主节点进行核对,查看是否需要指定为2。

wr_en

该参数指定是否允许Modbus主机向该通道发送“写”命令。该参数的值可以是MODBUS_WR_EN 或 MODBUS_WR_DIS。也就是,如果不希望Modbus主机更改您产品的值,指定MODBUS_WR_DIS即可。注意,应用程序可以通过调用MB_WrEnSet()函数在程序运行时更改该设置(参见3.06)。

返回值

函数返回一个指向已创建通道的指针,您可以在调用其他函数时使用该通道。

注意事项/警告

调用方

Modbus主机或从机应用。

示例

​​​​​​​3.02 使用uC/Modbus,MB_ChToPortMap()

此函数允许将每个通道的“逻辑”映射更改为“物理”映射。也就是这个函数允许更改每个uC/Modbus通道的端口分配。

原型

void MB_ChToPortMap (MODBUS_CH *pch,
                     CPU_INT08U port_nbr)

参数

pch

指向待映射通道的指针(由MB_CfgCg()返回)。

port_nbr

指定哪一个物理连接(即,端口)关联到Modbus通道。也就是,它确定哪一个UART与Modbus通道关联。port_nbr通常从0分配到产品中的最大物理UART数量减去1。例如,如果您的产品有4个UART,并且全部关联到Modbus通道,那么这些UART编号为0到3。当然,没有必要一定要从0开始编号,编号方案取决于MB_BSP.c文件。

返回值

注意事项/警告

调用方

Modbus主机或从机应用。

示例

​​​​​​​3.03 使用uC/Modbus,MB_Exit()

如果不再希望uC/Modbus在您的产品中运行,应该调用MB_Exit()。

原型

void MB_Exit (void);

参数

返回值

注意事项/警告

调用方

Modbus主机或从机应用。

示例

​​​​​​​3.04 使用uC/Modbus-M,MBM_FC01_CoilRd()

该函数被应用代码调用,从Modbus从机读取线圈。

原型

CPU_INT16U MBM_FC01_CoilRd (MODBUS_CH  *pch,
                            CPU_INT08U  slave_addr,
                            CPU_INT16U  start_addr,
                            CPU_INT08U *p_coil_tbl,
                            CPU_INT16U  nbr_coils);

参数

pch

一个指向通道的指针(由MB_CfgCh()返回)。该指针指定Modbus Master在哪一个通道上进行通讯。当然,在配置通道之前,需要将‘pch’配置为Master。

slave_addr

指定想要读取线圈信息的从机“节点地址”,可以是1-255,需要与从节点分配的地址一致。

start_addr

指定线圈的起始地址。可以是0-65535。

pcoil_tbl

指向一个8位值数组的指针,接收所有被读取线圈的值。数组大小至少(nbr_coils - 1) / 8 + 1。表格式如下:

MSB

LSB

B7

B6

B5

B4

B3

B2

B1

B0

p_coil_tbl[0]

#8

#7

#1

p_coil_tbl[1]

#16

#15

#9

nbr_coils

指定希望从从机读取的线圈数量。

返回值

MODBUS_ERR_NONE

调用成功

MODBUS_ERR_RX

该通道(见MB_CfgCh())超时未收到从机应答。

MODBUS_ERR_SLAVE_ADDR

发送的从节点地址与接收的从节点地址不一致。

MODBUS_ERR_FC

发送的功能码与接收的功能码不一致。

MODBUS_ERR_BYTE_COUNT

希望接收的字节数与实际接收的字节数不一致。

注意事项/警告

调用方

Modbus主机应该

示例

​​​​​​​3.05 使用uC/Modbus-M,MBM_FC02_DIRd()

从应用中调用该函数读取Modbus从机的离散输入。

原型

CPU_INT16U MBM_FC02_DIRd (MODBUS_CH  *pch,
                          CPU_INT08U  slave_addr,
                          CPU_INT16U  start_addr,
                          CPU_INT08U *p_di_tbl,
                          CPU_INT16U  nbr_di);

参数

pch

一个指向通道的指针(由MB_CfgCh()返回)。该指针指定Modbus Master在哪一个通道上进行通讯。当然,在配置通道之前,需要将‘pch’配置为Master。

slave_addr

指定想要读取线圈信息的从机“节点地址”,可以是1-255,需要与从节点分配的地址一致。

start_addr

指定离散输入的起始地址。可以是0-65535。

pcoil_tbl

指向一个8位值数组的指针,接收所有被读取离散输入的值。数组大小至少(nbr_di - 1) / 8 + 1。表格式如下:

MSB

LSB

B7

B6

B5

B4

B3

B2

B1

B0

p_di_tbl[0]

#8

#7

#1

p_di_tbl[1]

#16

#15

#9

nbr_coils

指定希望从从机读取的离散输入的数量。

返回值

MODBUS_ERR_NONE

调用成功

MODBUS_ERR_RX

该通道(见MB_CfgCh())超时未收到从机应答。

MODBUS_ERR_SLAVE_ADDR

发送的从节点地址与接收的从节点地址不一致。

MODBUS_ERR_FC

发送的功能码与接收的功能码不一致。

MODBUS_ERR_BYTE_COUNT

希望接收的字节数与实际接收的字节数不一致。

注意事项/警告

调用方

Modbus主机应该

示例

​​​​​​​3.06 使用uC/Modbus-M,MBM_FC03_HoldingRegRd()

从应用代码调用该函数,从Modbus从机读取16位保持寄存器。

原型

CPU_INT16U MBM_FC03_HoldingRegRd (MODBUS_CH  *pch,
                                  CPU_INT08U  slave_node,
                                  CPU_INT16U  start_addr,
                                  CPU_INT16U *p_reg_tbl,
                                  CPU_INT16U  nbr_regs);

参数

pch

一个指向通道的指针(由MB_CfgCh()返回)。该指针指定Modbus Master在哪一个通道上进行通讯。当然,在配置通道之前,需要将‘pch’配置为Master。

slave_node

指定想要读取寄存器的从机“节点地址”,可以是1-255,需要与从节点分配的地址一致。

start_addr

指定保持寄存器的起始地址。可以是0-65535。请注意,如果要使用浮点寄存器(即在从机的mb_cfg.h中将MODBUS_CFG_FP_EN设置为DEF_ENABLED),起始地址必须是一个小于MODBUS_CFG_FP_START_IX(slave)的数。

p_reg_tbl

指向一个16位值数组的指针,接收所有被读取寄存器的值。数组大小至少nbr_regs。 

请注意,您可以将无符号值“转换”为有符号值。就Modbus协议而言,它发送和接收16位值,并使用特定的应用程序解释这些值。

nbr_regs

指定希望从从机读取的寄存器的数量。

返回值

MODBUS_ERR_NONE

调用成功

MODBUS_ERR_RX

该通道(见MB_CfgCh())超时未收到从机应答。

MODBUS_ERR_SLAVE_ADDR

发送的从节点地址与接收的从节点地址不一致。

MODBUS_ERR_FC

发送的功能码与接收的功能码不一致。

MODBUS_ERR_BYTE_COUNT

希望接收的字节数与实际接收的字节数不一致。

注意事项/警告

MODBUS_CFG_FP_START_IX与从机一致。

调用方

Modbus主机应用。

示例

​​​​​​​3.07 使用uC/Modbus-M, MBM_FC03_HoldingRegRdFP()

从应用代码中调用该函数,从Modbus从机读取32位浮点型寄存器。

原型

CPU_INT16U MBM_FC03_HoldingRegRdFP (MODBUS_CH  *pch,
                                    CPU_INT08U  slave_node,
                                    CPU_INT16U  start_addr,
                                    CPU_FP32   *p_reg_tbl,
                                    CPU_INT16U  nbr_regs);

参数

pch

一个指向通道的指针(由MB_CfgCh()返回)。该指针指定Modbus Master在哪一个通道上进行通讯。当然,在配置通道之前,需要将‘pch’配置为Master。

slave_node

指定想要读取寄存器的从机“节点地址”,可以是1-255,需要与从节点分配的地址一致。

start_addr

指定浮点型保持寄存器的起始地址。对于从机,可以是MODBUS_CFG_FP_START_IX到65535。前提是将mb_cfg.h中的MODBUS_CFG_FP_EN设置为DEF_ENABLED,使能了对浮点型的支持。

p_reg_tbl

指向一个32位IEEE-754格式的数组的指针,接收所有被读取寄存器的值。数组大小至少nbr_regs。 

nbr_regs

指定希望从从机读取的寄存器的数量。

返回值

MODBUS_ERR_NONE

调用成功

MODBUS_ERR_RX

该通道(见MB_CfgCh())超时未收到从机应答。

MODBUS_ERR_SLAVE_ADDR

发送的从节点地址与接收的从节点地址不一致。

MODBUS_ERR_FC

发送的功能码与接收的功能码不一致。

MODBUS_ERR_BYTE_COUNT

希望接收的字节数与实际接收的字节数不一致。

注意事项/警告

浮点型格式对应与丹尼尔流控制扩展。具体就是,假定一个寄存器是32位的,并使用IEEE-754格式。

与您主机通信的从机必须使能对浮点型的支持。浮点型寄存器(MODBUS_CFG_FP_START_IX)的起始地址与从机的起始地址一致。

调用方

Modbus主机应用。

示例

​​​​​​​3.08 使用uC/Modbus-M,MBM_FC04_InRegRd()

从应用代码中调用该函数,从Modbus从机读取16位输入寄存器(input registers)寄存器。

原型

CPU_INT16U MBM_FC04_InRegRd (MODBUS_CH  *pch,
                             CPU_INT08U  slave_node,
                             CPU_INT16U  start_addr,
                             CPU_INT16U *p_reg_tbl,
                             CPU_INT16U  nbr_regs);

参数

pch

一个指向通道的指针(由MB_CfgCh()返回)。该指针指定Modbus Master在哪一个通道上进行通讯。当然,在配置通道之前,需要将‘pch’配置为Master。

slave_node

指定想要读取寄存器的从机“节点地址”,可以是1-255,需要与从节点分配的地址一致。

start_addr

指定寄存器的起始地址。可以是0-65535。注意,对于从机,如果打算使用浮点型寄存器(即在从机的mb_cfg.h中将MODBUS_CFG_FP_EN设置为DEF_ENABLED),起始地址必须是一个比MODBUS_CFG_FP_START_IX小的数。

p_reg_tbl

指向一个无符号16位值数组的指针,接收所有被读取寄存器的值。数组大小至少nbr_regs。您可以将无符号值“转换”为有符号值。就Modbus协议而言,它发送和接收16位值,并使用特定的应用程序解释这些值。

nbr_regs

指定希望从从机读取的寄存器的数量。

返回值

MODBUS_ERR_NONE

调用成功

MODBUS_ERR_RX

该通道(见MB_CfgCh())超时未收到从机应答。

MODBUS_ERR_SLAVE_ADDR

发送的从节点地址与接收的从节点地址不一致。

MODBUS_ERR_FC

发送的功能码与接收的功能码不一致。

MODBUS_ERR_BYTE_COUNT

希望接收的字节数与实际接收的字节数不一致。

注意事项/警告

MODBUS_CFG_FP_START_IX要与从机一致。

调用方

Modbus主机应用。

示例

​​​​​​​3.09 uC/Modbus-M,MBM_FC05_CoilWr()

从应用代码中调用该函数,向Modbus从机写入单线圈。

原型

CPU_INT16U MBM_FC05_CoilWr (MODBUS_CH  *pch,
                            CPU_INT08U  slave_node,
                            CPU_INT16U  slave_addr,
                            CPU_BOOLEAN coil_val);

参数

pch

一个指向通道的指针(由MB_CfgCh()返回)。该指针指定Modbus Master在哪一个通道上进行通讯。当然,在配置通道之前,需要将‘pch’配置为Master。

slave_node

指定想要读取寄存器的从机“节点地址”,可以是1-255,需要与从节点分配的地址一致。

slave_addr

指定要修改的线圈的地址。可以是0-65535。

coil_val

线圈的期望值,可以是MODBUS_COIL_OFF 或 MODBUS_COIL_ON。

返回值

MODBUS_ERR_NONE

调用成功

MODBUS_ERR_RX

该通道(见MB_CfgCh())超时未收到从机应答。

MODBUS_ERR_SLAVE_ADDR

发送的从节点地址与接收的从节点地址不一致。

MODBUS_ERR_FC

发送的功能码与接收的功能码不一致。

MODBUS_ERR_BYTE_COUNT

希望接收的字节数与实际接收的字节数不一致。

MODBUS_ERR_COIL_ADDR

指定的线圈地址无效。

注意事项/警告

调用方

Modbus主机应用。

示例

​​​​​​​3.10 uC/Modbus-M,MBM_FC06_ HoldingRegWr()

从应用代码中调用该函数,向Modbus从机写如一个16位保持寄存器。

原型

CPU_INT16U MBM_FC06_HoldingRegWr (MODBUS_CH  *pch,
                                  CPU_INT08U  slave_node,
                                  CPU_INT16U  slave_addr,
                                  CPU_INT16U  reg_val);

参数

pch

一个指向通道的指针(由MB_CfgCh()返回)。该指针指定Modbus Master在哪一个通道上进行通讯。当然,在配置通道之前,需要将‘pch’配置为Master。

slave_node

指定想要读取寄存器的从机“节点地址”,可以是1-255,需要与从节点分配的地址一致。

slave_addr

指定要修改的保持寄存器的地址。可以是0-65535。

reg_val

保持寄存器的期望值,如果更改的保持寄存器是有符号值,只需要将该值强制转换为无符号值即可。Modbus读写16位值时不关心符号。

返回值

MODBUS_ERR_NONE

调用成功

MODBUS_ERR_RX

该通道(见MB_CfgCh())超时未收到从机应答。

MODBUS_ERR_SLAVE_ADDR

发送的从节点地址与接收的从节点地址不一致。

MODBUS_ERR_FC

发送的功能码与接收的功能码不一致。

MODBUS_ERR_BYTE_COUNT

希望接收的字节数与实际接收的字节数不一致。

注意事项/警告

调用方

Modbus主机应用。

示例

​​​​​​​3.11 使用uC/Modbus-M,MBM_FC06_ HoldingRegWrFP()

从应用代码中调用该函数,向Modbus从机保持寄存器写入32位浮点型数值。

原型

CPU_INT16U MBM_FC06_HoldingRegWrFP (MODBUS_CH  *pch,
                                    CPU_INT08U  slave_node,
                                    CPU_INT16U  slave_addr,
                                    CPU_FP32    reg_val);

参数

pch

一个指向通道的指针(由MB_CfgCh()返回)。该指针指定Modbus Master在哪一个通道上进行通讯。当然,在配置通道之前,需要将‘pch’配置为Master。

slave_node

指定想要读取寄存器的从机“节点地址”,可以是1-255,需要与从节点分配的地址一致。

slave_addr

指定要修改的保持寄存器的地址。可以是0-65535。

reg_val

希望写入保持寄存器的值,浮点数采用IEEE-754格式。

返回值

MODBUS_ERR_NONE

调用成功

MODBUS_ERR_RX

该通道(见MB_CfgCh())超时未收到从机应答。

MODBUS_ERR_SLAVE_ADDR

发送的从节点地址与接收的从节点地址不一致。

MODBUS_ERR_FC

发送的功能码与接收的功能码不一致。

MODBUS_ERR_BYTE_COUNT

希望接收的字节数与实际接收的字节数不一致。

注意事项/警告

调用方

Modbus主机应用。

示例

​​​​​​​3.12 使用uC/Modbus-M,MBM_FC08_Diag()

从应用代码中调用该函数,对Modbus从机进行诊断性检查。

原型

CPU_INT16U MBM_FC08_Diag (MODBUS_CH  *pch,
                          CPU_INT08U  slave_node,
                          CPU_INT16U  fnct,
                          CPU_INT16U  sub_fnct,
                          CPU_INT16U *pval);

参数

pch

一个指向通道的指针(由MB_CfgCh()返回)。该指针指定Modbus Master在哪一个通道上进行通讯。当然,在配置通道之前,需要将‘pch’配置为Master。

slave_node

指定想要读取寄存器的从机“节点地址”,可以是1-255,需要与从节点分配的地址一致。

fnct

指定一个希望在从机上执行的功能,指定如下任一参数:

MODBUS_FC08_LOOPBACK_CLR_CTR

清除从机中的循环计数器

MODBUS_FC08_BUS_MSG_CTR

读取从机接收到的消息数量计数器。该计数器跟踪所有接收到的消息,不论是否被处理。

MODBUS_FC08_BUS_CRC_CTR

读取从机CRC校验错误的次数。

MODBUS_FC08_BUS_EXCEPT_CTR

读取从机检测到的异常次数。

MODBUS_FC08_SLAVE_MSG_CTR

读取从机接收并处理的消息数量。

MODBUS_FC08_SLAVE_NO_RESP_CTR

读取因CRC错误或无效命令导致未应答的消息数量。

sub_fnct

对应该函数的一个子函数参数。此时,uC/Modbus不支持子函数。

返回值

MODBUS_ERR_NONE

调用成功

MODBUS_ERR_RX

该通道(见MB_CfgCh())超时未收到从机应答。

MODBUS_ERR_SLAVE_ADDR

发送的从节点地址与接收的从节点地址不一致。

MODBUS_ERR_DIAG

指定了一个无效的诊断功能码(例如,不是‘fnct’参数描述的功能)。

MODBUS_ERR_SUB_FNCT

指定了一个无效的子函数。

注意事项/警告

调用方

Modbus主机应用。

示例

​​​​​​​3.13 使用uC/Modbus-M,MBM_FC15_CoilWr()

从应用代码中调用该函数,向Modbus从机写入多个线圈值。

原型

CPU_INT16U MBM_FC15_CoilWr (MODBUS_CH  *pch,
                            CPU_INT08U  slave_node,
                            CPU_INT16U  slave_addr,
                            CPU_INT08U *p_coil_tbl,
                            CPU_INT16U  nbr_coils);

参数

pch

一个指向通道的指针(由MB_CfgCh()返回)。该指针指定Modbus Master在哪一个通道上进行通讯。当然,在配置通道之前,需要将‘pch’配置为Master。

slave_node

指定想要读取寄存器的从机“节点地址”,可以是1-255,需要与从节点分配的地址一致。

slave_addr

指定要修改的线圈的起始地址。可以是0-65535。

p_coil_tbl

指向一个数组,对应线圈的值。格式如下:

MSB

LSB

B7

B6

B5

B4

B3

B2

B1

B0

p_coil_tbl[0]

#8

#7

#1

p_coil_tbl[1]

#16

#15

#9

nbr_coils

要更改的线圈的数量,当然,p_coil_tbl所指向的数值必须包含相应的数量。

返回值

MODBUS_ERR_NONE

调用成功

MODBUS_ERR_RX

该通道(见MB_CfgCh())超时未收到从机应答。

MODBUS_ERR_SLAVE_ADDR

发送的从节点地址与接收的从节点地址不一致。

MODBUS_ERR_FC

发送的功能码与接收的功能码不一致。

MODBUS_ERR_BYTE_COUNT

希望接收的字节数与实际接收的字节数不一致。

注意事项/警告

调用方

Modbus主机应用。

示例

​​​​​​​3.14 使用uC/Modbus-M,MBM_FC16_HoldingRegWrN ()

从应用代码中调用该函数,向Modbus从机写入多个16位保持寄存器值。

原型

CPU_INT16U MBM_FC16_HoldingRegWrN (MODBUS_CH  *pch,
                                   CPU_INT08U  slave_node,
                                   CPU_INT16U  slave_addr,
                                   CPU_INT16U *p_reg_tbl,
                                   CPU_INT16U  nbr_reg);

参数

pch

一个指向通道的指针(由MB_CfgCh()返回)。该指针指定Modbus Master在哪一个通道上进行通讯。当然,在配置通道之前,需要将‘pch’配置为Master。

slave_node

指定想要读取寄存器的从机“节点地址”,可以是1-255,需要与从节点分配的地址一致。

slave_addr

指定要修改的保持寄存器的起始地址。可以是0-65535。

p_reg_tbl

指向一个数组,对应保持寄存器的值。如果更改的值有符号值,只需将其强制转换为无符号值即可。Modbus读写16位值时不关心符号

nbr_reg

要更改的寄存器的数量,当然,p_reg_tbl所指向的数值必须包含相应的数量。

返回值

MODBUS_ERR_NONE

调用成功

MODBUS_ERR_RX

该通道(见MB_CfgCh())超时未收到从机应答。

MODBUS_ERR_SLAVE_ADDR

发送的从节点地址与接收的从节点地址不一致。

MODBUS_ERR_FC

发送的功能码与接收的功能码不一致。

MODBUS_ERR_BYTE_COUNT

希望接收的字节数与实际接收的字节数不一致。

注意事项/警告

调用方

Modbus主机应用。

示例

​​​​​​​3.15 使用uC/Modbus-M,MBM_FC16_HoldingRegWrNFP()

从应用代码中调用该函数,向Modbus从机的多个32位浮点保持寄存器写入数值。

原型

CPU_INT16U MBM_FC16_HoldingRegWrNFP (MODBUS_CH  *pch,
                                     CPU_INT08U  slave_node,
                                     CPU_INT16U  slave_addr,
                                     CPU_FP32   *p_reg_tbl,
                                     CPU_INT16U  nbr_reg);

参数

pch

一个指向通道的指针(由MB_CfgCh()返回)。该指针指定Modbus Master在哪一个通道上进行通讯。当然,在配置通道之前,需要将‘pch’配置为Master。

slave_node

指定想要读取寄存器的从机“节点地址”,可以是1-255,需要与从节点分配的地址一致。

slave_addr

指定要修改的保持寄存器的起始地址。可以是0-65535。

p_reg_tbl

指向一个IEEE-754值的数组,对应保持寄存器的值。

nbr_reg

要更改的寄存器的数量,当然,p_reg_tbl所指向的数值必须包含相应的数量。

返回值

MODBUS_ERR_NONE

调用成功

MODBUS_ERR_RX

该通道(见MB_CfgCh())超时未收到从机应答。

MODBUS_ERR_SLAVE_ADDR

发送的从节点地址与接收的从节点地址不一致。

MODBUS_ERR_FC

发送的功能码与接收的功能码不一致。

MODBUS_ERR_BYTE_COUNT

希望接收的字节数与实际接收的字节数不一致。

注意事项/警告

调用方

Modbus主机应用。

示例

​​​​​​​3.16 使用uC/Modbus,MB_Init()

如上节所述,需要调用MB_Init()来初始化uC/Modbus。在调用时,MB_Init()创建一个任务处理发送到产品的所有帧。参考第7节。

原型

void MB_Init (CPU_INT32U freq);

参数

freq

对应与您打算使用的RTU定时器中断频率。如果不使用Modbus RTU,传0即可。

返回值

注意事项/警告

调用方

Modbus主机/从机应用。

示例

​​​​​​​3.17 使用uC/Modbus,MB_ModeSet()

该函数允许更改某一通道的Modbus模式。通常不需要使用此函数,因为通道的模式已在MB_CfgCh()中设置完成。

原型

void MB_ModeSet (MODBUS_CH  *pch, 
                 CPU_INT08U  mode)

参数

pch

一个指向通道的指针(由MB_CfgCh()返回)。该指针指定Modbus Master在哪一个通道上进行通讯。

mode

指定通道支持ASII还是RTU模式,因此,必须传入MODBUS_MODE_ASCII或MODBUS_MODE_RTU。

返回值

注意事项/警告

调用方

Modbus主机/从机应用。

示例

​​​​​​​3.18 使用uC/Modbus-S,MB_ NodeAddrSet()

该函数更改通道要应答的‘节点地址’。通常不需要使用该函数,因为通道的地址已经在MB_CfgCh()设置完成。

原型

void MB_NodeAddrSet (MODBUS_CH  *pch, 
                     CPU_INT08U  addr)

参数

pch

一个指向通道的指针(由MB_CfgCh()返回)。该指针指定Modbus Master在哪一个通道上进行通讯。该通道必须已经被配置为Modbus从机。

addr

节点地址可以是1-255的任意值。

返回值

注意事项/警告

调用方

Modbus从机应用。

示例

​​​​​​​3.19 uC/Modbus-S,MB_WrEnSet()

该函数允许启用/禁用对产品进行写参数操作。也就是,允许通道作为只读通道。通常不需要使用该函数,因为通道读写权限在MB_CfgCh()中已经设置完成。

原型

void MB_WrEnSet (MODBUS_CH  *pch, 
                 CPU_INT08U  wr_en)

参数

pch

一个指向通道的指针(由MB_CfgCh()返回)。该指针指定Modbus Master在哪一个通道上进行通讯。该通道必须已经被配置为Modbus从机。

wr_en

wr_en决定是否允许写入。必须传入MODBUS_WR_EN或MODBUS_WR_DIS

返回值

注意事项/警告

调用方

Modbus主机/从机应用。

示例

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值