MB_HoldingRegWrFP()
MB_HoldingRegWrFP()
is called when a Modbus master sends a Function Code 6 and Function Code 16 command. MB_HoldingRegWrFP()
writes a single floating?point holding register value. Floating-point holding registers are numbered from MODBUS_CFG_FP_START_IX
to 65535
. In other words, MODBUS_CFG_FP_START_IX
allows you to specify the start of ‘floating-point’ holding register addresses. MB_HoldingRegWrFP()
should only be called by µC/Modbus.
Prototype
void MB_HoldingRegWrFP (CPU_INT16U reg,
CPU_FP32 reg_val,
CPU_INT16U *perr)
Arguments
reg
Is the desired holding register to read and can be a number between MODBUS_CFG_FP_START_IX
and 65535
(depending on your product). It is up to you to decide what application variable is assigned to each floating-point holding register number. Note that if your product doesn’t have any floating-point registers but a large number of integer holding registers, you can set MODBUS_CFG_FP_START_IX
to 65535.
reg_val
Is the desired value for the specified holding register and can be any IEEE-754 floating point value.
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 floating-point holding register number you specified is a valid floating-point holding register and you are able to have code access the value of this floating-point holding register.
MODBUS_ERR_RANGE
if the floating-point holding register number passed as an argument is not a valid floating-point holding register number for your product.
Returned Value
None
Notes / Warnings
Code is enabled when either MODBUS_CFG_FC06_EN
is set to DEF_ENABLED
or MODBUS_CFG_FC16_EN
is set to DEF_ENABLED
in your product’s mb_cfg.h
file.
Called By:
MBS_FC06_HoldingRegWr()
and MBS_FC16_HoldingRegWr()
in mbs_core.c
Example
In this example, our product has 2 floating-point integer variables that we want to assign to floating-point holding registers. Your systems Engineer decided to assign MODBUS floating-point holding register numbers MODBUS_CFG_FP_START_IX+0
and MODBUS_CFG_FP_START_IX+1
to the two floating-point variables. You will notice that we disable interrupts to access the variables. This is done in case your CPU does not perform floating-point data accesses atomically.
CPU_FP32 AppDiameter; /* Modbus Holding Register # MODBUS_CFG_FP_START_IX + 0 */ CPU_FP32 AppCircumference; CPU_FP32 AppTempDegC; /* Modbus Holding Register # MODBUS_CFG_FP_START_IX + 1 */ CPU_FP32 AppTempDegF; void MB_HoldingRegWrFP (CPU_INT16U reg, CPU_FP32 reg_val, CPU_INT16U *perr) { CPU_FP32 temp_val; *perr = MODBUS_ERR_NONE; switch (reg) { case MODBUS_CFG_FP_START_IX + 0: temp_val = reg_val * (CPU_FP32)3.141592654; /* Compute circumference */ CPU_CRITICAL_ENTER(); AppDiameter = reg_val; AppCircumference = temp_val; CPU_CRITICAL_EXIT(); Break; case MODBUS_CFG_FP_START_IX + 1: temp_val = reg_val * (CPU_FP32)1.8 + (CPU_FP32)32.0; /* C -> F Conversion */ CPU_CRITICAL_ENTER(); AppTempDegC = reg_val; AppTempDegF = temp_val; CPU_CRITICAL_EXIT(); break; default: *perr = MODBUS_ERR_RANGE; break; } }
As shown in the example above, computations are performed when a value is changed.