MB_CoilWr()
MB_CoilWr()
is called when a Modbus master sends a Function Code 5 and Function Code 15 command. MB_CoilWr()
changes the value of a single coil. MB_CoilWr()
should only be called by µC/Modbus.
Prototype
void MB_CoilWr (CPU_INT16U coil,
CPU_BOOLEAN coil_val;
CPU_INT16U *
perr)
Arguments
coil
Is the coil number that you want to change and can be a number between 0 and 65535 (depending on your product). It is up to you to decide which coil is assigned to what variable in your product.
coil_val
Is the value you want to change the coil to and can be either DEF_TRUE
or DEF_FALSE
.
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 coil number you specified is a valid coil and you are able to have code access the value of this coil.
MODBUS_ERR_RANGE
if the coil number passed as an argument is not a valid coil number for your product.
Returned Value
None
Notes / Warnings
Code is enabled when either MODBUS_CFG_FC05_EN
is set to DEF_ENABLED
or MODBUS_CFG_FC15_EN
is set to DEF_ENABLED
in your product’s mb_cfg.h
file.
Called By:
MBS_FC05_CoilWr()
and MBS_FC15_CoilWrMultiple()
in mbs_core.c
Example
In this example, our product has 163 coils. 160 coils are placed in a table called AppCoilTbl[]
. The other three coils are actually variables that we treat as coils to allow a MODBUS master to read the status of those values. The first 160 coils are assigned coil numbers 0 to 159. Coil numbers 200, 201 and 202 correspond to the following application variables: AppStatus
, AppRunning
and AppLED
, respectively.
CPU_INT08U AppCoilTbl[20]; CPU_BOOLEAN AppStatus; CPU_BOOLEAN AppRunning; CPU_BOOLEAN AppLED; void MB_CoilWr (CPU_INT16U coil, CPU_BOOLEAN coil_val, CPU_INT16U *perr) { CPU_INT08U ix; CPU_INT08U bit_nbr; *perr = MODBUS_ERR_NONE; if (coil < 20 * sizeof(CPU_INT08U)) { ix = coil / 8; bit_nbr = coil % 8; CPU_CRITICAL_ENTER(); if (coil_val == TRUE) { AppCoilTbl[ix] |= (1 << bit_nbr); } else { AppCoilTbl[ix] &= ~(1 << bit_nbr); } CPU_CRITICAL_EXIT(); } else { switch (coil) { case 200: AppStatus = coil_val; break; case 201: AppRunning = coil_val; break; case 202: AppLED = coil_val; break; default: *perr = MODBUS_ERR_RANGE; break; } } }