Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1062649
  • 博文数量: 264
  • 博客积分: 6005
  • 博客等级: 大校
  • 技术积分: 2798
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-08 20:15
文章分类

全部博文(264)

文章存档

2011年(42)

2010年(213)

2009年(4)

2008年(2)

2007年(3)

分类:

2010-04-08 19:55:51

       最近在做电能表相关的项目,遇到了很多表驱动相关的内容,拿出一个来做个例子。
要从下表中提取出相应的误差限,条件有功率因素,负载类型,误差等级,和取值范围。我们看要从中提取出数据是要经过,很多的嵌套的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;//返回没有找到
}

阅读(684) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~