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