最近在做电能表相关的项目,遇到了很多表驱动相关的内容,拿出一个来做个例子。
要从下表中提取出相应的误差限,条件有功率因素,负载类型,误差等级,和取值范围。我们看要从中提取出数据是要经过,很多的嵌套的if 或switch结构。 像这类型的可以使用表驱动去解。(要提取其中的)
//=============
//表中每一项的结构
typedef struct
{
float fPowerFactor;//功率因素
int nPayloadType;//负载类型 1:感性,2:容性
float fErrorClass;//误差等级
float fImin;//电流范围 最小值
float fImax;//电流范围 最大值
float fErrorLimit;//误差限
}ERROR_LIMIT;
//表
ERROR_LIMIT errorLimit[] =
{
//-----------------------------------
{1.0f, 1, 0.02f, 0.05f, 0.1f, 0.4f}, //
{1.0f, 2, 0.02f, 0.05f, 0.1f, 0.4f},
//============================
{1.0f, 1, 0.05f, 0.05f, 0.1f, 1.0f},
{1.0f, 2, 0.05f, 0.05f, 0.1f, 1.0f},
//============================
{1.0f, 1, 0.10f, 0.05f, 0.1f, 1.5f},
{1.0f, 2, 0.10f, 0.05f, 0.1f, 1.5f},
//============================
{1.0f, 1, 0.20f, 0.05f, 0.1f, 2.5f},
{1.0f, 2, 0.20f, 0.05f, 0.1f, 2.5f},
//-----------------------------------
{1.0f, 1, 0.02f, 0.10f, 0.0f, 0.2f},
{1.0f, 2, 0.02f, 0.10f, 0.0f, 0.2f},
//============================
{1.0f, 1, 0.05f, 0.10f, 0.0f, 0.5f},
{1.0f, 2, 0.05f, 0.10f, 0.0f, 0.5f},
//============================
{1.0f, 1, 0.10f, 0.10f, 0.0f, 1.0f},
{1.0f, 2, 0.10f, 0.10f, 0.0f, 1.0f},
//============================
{1.0f, 1, 0.20f, 0.10f, 0.0f, 2.0f},
{1.0f, 2, 0.20f, 0.10f, 0.0f, 2.0f},
//-------------------------------------
{0.5f, 1, 0.02f, 0.10f, 0.2f, 0.5f},
{0.5f, 1, 0.05f, 0.10f, 0.2f, 1.0f},
{0.5f, 1, 0.10f, 0.10f, 0.2f, 1.5f},
{0.5f, 1, 0.20f, 0.10f, 0.2f, 2.5f},
//============================
{0.8f, 2, 0.02f, 0.10f, 0.2f, 0.5f},
{0.8f, 2, 0.05f, 0.10f, 0.2f, 1.0f},
{0.8f, 2, 0.10f, 0.10f, 0.2f, 1.5f},
//{0.8, 2, 0.20, 0.10, 0.2, --},
//---------------------------------------
{0.5f, 1, 0.02f, 0.20f, 0.0f, 0.3f},
{0.5f, 1, 0.05f, 0.20f, 0.0f, 0.6f},
{0.5f, 1, 0.10f, 0.20f, 0.0f, 1.0f},
{0.5f, 1, 0.20f, 0.20f, 0.0f, 2.0f},
//============================
{0.8f, 2, 0.02f, 0.20f, 0.0f, 0.3f},
{0.8f, 2, 0.05f, 0.20f, 0.0f, 0.6f},
{0.8f, 2, 0.10f, 0.20f, 0.0f, 1.0f},
//{0.8, 2, 0.20, 0.20, 0.0f, --},
//---------------------------------------
{0.25f, 1, 0.02f, 0.20f, 1.0f, 0.5f},
{0.25f, 1, 0.05f, 0.20f, 1.0f, 1.0f},
{0.25f, 1, 0.10f, 0.20f, 1.0f, 3.5f},
//{0.25, 1, 0.20, 0.20, 1.0, --},
//============================
{0.5f, 2, 0.02f, 0.20f, 1.0f, 0.5f},
{0.5f, 2, 0.05f, 0.20f, 1.0f, 1.0f},
{0.5f, 2, 0.10f, 0.20f, 1.0f, 2.5f}
//{0.5, 2, 0.20, 0.20, 1.0, --}
};
//===============================
//===============================
//返回误差限,没有找到返回0.0//float fErrorLimit;//误差限)
float
GetErrorLimit( float fPowerFactor,//功率因素
int nPayloadType,//负载类型 1:感性,2:容性
float fErrorClass,//误差等级
float fI)
{
int nNum = sizeof(errorLimit) / sizeof (ERROR_LIMIT);
for (int i=0; i
if ((float)fPowerFactor == (float)errorLimit[i].fPowerFactor
&&nPayloadType == errorLimit[i].nPayloadType
&&(float)fErrorClass == (float)errorLimit[i].fErrorClass
&& (float)fI >= (float)errorLimit[i].fImin
)
{
if (errorLimit[i].fImax <= 0.00001
|| fI <= errorLimit[i].fImax)
{
return errorLimit[i].fErrorLimit;
}
}
}
return 0.0;//返回没有找到
}