范围检测值 小函数.

//再次感谢 "丁劲犇" 对我问题的解答...

修改后,可用.

工控应用中, 可用来当前编码值是否在 设置值的范围内.

小功能. 留用.


#include <stdio.h>
void* CheckRangeInit(void);
void  CheckRangeSet(void* ptHandle, long ForOffset, long BackOffset, long Target, long Resolution);
unsigned short CheckRangeDetect(void* ptHandle, long Current);


void main(void)
{
    void* test1 = 0;
    void* test2 = 0;
    void* test3 = 0;
    void* test4 = 0;
    void* test5 = 0;
    int i;
    test1 = CheckRangeInit();
    test2 = CheckRangeInit();
    test3 = CheckRangeInit();
    test4 = CheckRangeInit();
    test5 = CheckRangeInit();


    CheckRangeSet(test1, 10, 10, 50, 360);
    CheckRangeSet(test2, 10, 10, 80, 360);
    CheckRangeSet(test3, 10, 10, 120, 360);
    CheckRangeSet(test4, 10, 10, 140, 360);
    CheckRangeSet(test5, 10, 10, 355, 360);
    for (i = 0; i <= 360; i++)
    {
        if (CheckRangeDetect(test1, i))
        {
            printf("test1 %d  !\n", i);
        }

        if (CheckRangeDetect(test2, i))
        {
            printf("test2 %d  !\n", i);
        }

        if (CheckRangeDetect(test3, i))
        {
            printf("test3 %d  !\n", i);
        }

        if (CheckRangeDetect(test4, i))
        {
            printf("test4 %d  !\n", i);
        }

        if (CheckRangeDetect(test5, i))
        {
            printf("test5 %d  !\n", i);
        }
    }

}
/***********************
初始化,返回句柄地址.
***********************/
void* CheckRangeInit(void)
{
#define MaxArray 50
    static int i = 0;
    static long temp[MaxArray][2] = { 0 };
    if (i < 49)
        return (void*)temp[i++];
    else
        return (void*)-1;
}

/*************
计算句柄地址中的范围值.
参数1: 变量句柄
参数2: 范围前值
参数2: 范围后值
参数3: 基准值
参数4: 循环最大值
**************/
void  CheckRangeSet(void* ptHandle, long ForOffset, long BackOffset, long Target, long Resolution)
{
    long* set = (long*)ptHandle;
    set[0] = Target - ForOffset;
    if (set[0] < 0)
        set[0] += Resolution;
    set[1] = Target + BackOffset;
    if (set[1] > Resolution)
        set[1] -= Resolution;
}
/********************
判断当前值是否在范围内.
********************/
unsigned short CheckRangeDetect(void* ptHandle, long Current)
{
    const long* set = (const long*)ptHandle;
    if (set[0] < set[1])
    {
        return (Current >= set[0]) && (Current <= set[1]);
    }
    else if (set[0] > set[1])
    {
        if ((Current <= set[1]) || (Current >= set[0]))
            return 1;
        else return 0;
    }
    else return 0;
}

2020.10.14 更新, 初始化函数中数组改为静态数组, 动态数组在函数退出后会释放.

实际项目应用中.

   static bool initflag = true;
   static void * DetectPos = 0;
   
   if(initflag)  //上电只运行一次.
   {
     initflag = false;
     DetectPos =(void*)CheckRangeInit();
     CheckRangeSet(DetectPos, 3, 3, TRIG_POSI*4, ENC_LINE);     
   }

 

DetectPos 也要定义为 静态变量. 不然,PLC再次扫描时访问时, 地址又是错误的. 同样的错误犯了两次错误. 超级猪.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值