MB_HoldingRegRd()

MB_HoldingRegRd()

MB_HoldingRegRd() is called when a Modbus master sends a Function Code 3 command. MB_HoldingRegRd() read the value of a single holding register. Integer holding registers are numbered from 0 through (MODBUS_CFG_FP_START_IX – 1) . MODBUS_FP_START_IX allows you to specify the start of ‘floating-point’ (see section 5.07, MD_HoldingRegRdFP() ). MB_HoldingRegRd() should only be called by µC/Modbus.

Prototype

CPU_INT16U MB_HoldingRegRd (CPU_INT16U reg,

CPU_INT16U * perr)

Arguments

reg

Is the desired holding register to read and can be a number between 0 and MODBUS_CFG_FP_START_IX-1 (depending on your product). It is up to you to decide what application variable is assigned to each holding register number. Note that if your product doesn’t have any floating-point registers but a large number of holding registers, you can set MODBUS_CFG_FP_START_IX to 65535.

perr

Is a pointer to a variable that will contain an error code based on the outcome of the call. Your code thus needs to return one of the following error codes:

MODBUS_ERR_NONE

if the holding register number you specified is a valid holding register and you are able to have code access the value of this holding register.

MODBUS_ERR_RANGE

if the holding register number passed as an argument is not a valid holding register number for your product.

Returned Value

MB_HoldingRegRd() returns the current value of the specified holding register as an unsigned value. Of course, you can also return ‘signed’ values but those need to be cast to CPU_INT16U. You should note that the value will not be changed if you cast a signed variable to CPU_INT16U. The Modbus master will receive the proper value and it’s up to the Modbus master to properly retrieve the signed data . If an invalid holding register number is specified, you should return 0.

Notes / Warnings

Code is enabled when MODBUS_CFG_FC03_EN is set to DEF_ENABLED in your product’s mb_cfg.h file.

Called By:

MBS_FC03_HoldingRegRd() in mbs_core.c

Example

 

CPU_INT16S AppTemp; CPU_INT16U AppCtr; CPU_INT16S AppPres; CPU_INT16U AppRxPktCtr; CPU_INT16U MB_HoldingRegRd (CPU_INT16U reg, CPU_INT16U *perr) { CPU_INT16U val; *perr = MODBUS_ERR_NONE; switch (reg) { case 1000: CPU_CRITICAL_ENTER(); val = (CPU_INT16U)AppTemp; CPU_CRITICAL_EXIT(); return (val); case 1001: CPU_CRITICAL_ENTER(); val = AppCtr; CPU_CRITICAL_EXIT(); return (val); case 1002: CPU_CRITICAL_ENTER(); val = (CPU_INT16U)AppPres; CPU_CRITICAL_EXIT(); return (val); case 1003: CPU_CRITICAL_ENTER(); val = AppRxPktCtr; CPU_CRITICAL_EXIT(); return (val); default: *perr = MODBUS_ERR_RANGE; return (0); } }