MB_HoldingRegWrFP()

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.