//再次感谢 "丁劲犇" 对我问题的解答...
修改后,可用.
工控应用中, 可用来当前编码值是否在 设置值的范围内.
小功能. 留用.
#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再次扫描时访问时, 地址又是错误的. 同样的错误犯了两次错误. 超级猪.