在工业自动化领域输入/输出模块比较常见,有数字量输入DI,数字量输出DO,模拟量输入AI,模拟量输出AO,高速脉冲输入HPI,高速脉冲输出HPO。
下面介绍这些IO模块软件处理方案
1.D0
延时输出
2.DI
在工业现场最常用的就是通过DI信号给设备开机停机等信号,如果现场有干扰,就可能造成设备的误动作,造成生命和财产的损失。软件可以开通延时和关断延时滤波消除干扰,通常这个延时时间可以通过参数配置。下面看看下面的时序图,正常情况下DI开通和关断后,经过软件的延时处理,再给到下一级处理,比如这个DI的高电平关联启动,就会调用执行启动函数。
再看看有干扰的情况,当软件检测到一个上升沿或下降沿后,每个节拍都会检测这个变化的信号是否会持续延迟时间,如果该信号一直不变,延迟结束后就会输出该信号,否则输出信号就会保持不变。
void DIDealyModule(DELAY_MODULE *p)
{
if(p->in != p->oldIn)
{
if ((!!p->in)&&(p->type == OPEN_DELAY_TYPE || p->type == BID_DELAY_TYPE))//0--->1
{
p->delayActTick = p->delayTime;
}else if ((!p->in)&&(p->type == CLOSE_DELAY_TYPE || p->type == BID_DELAY_TYPE))//1--->0
{
p->delayActTick = p->delayTime;
}
else
{
p->delayActTick = 0;
}
}
p->out = (p->delayActTick == 0)?p->in:p->out;
if(p->delayActTick > 0)
{
p->delayActTick--;
}
p->oldIn = p->in;
}
3.AI
值转化,校正,滤波,标定
(1)假设AI外部输入的电压为0-10v,转为为0-4095的数字量。
(2)但是有由于硬件有偏差,导致2v对应的不是40952/10,8v对应的不是40958/10,需要线性校正。线性校正的横坐标为adc数值,纵坐标为标幺量,1000代表10v(这里是个技巧将电压标幺化处理)。
(3)对步骤(2)的结果一阶低通滤波
(4)默认标定2v对应20%,8v对应80%,现场有很多特殊情况,比如说客户2v要对应80%的输出,8v对应20%的输出,可以设定参数调整。
(5) 噪声处理
稳定状态下电压的值小数点后面几位会有跳动,为了不让跳动,可以设置一定的阈值,当变动量大于某值,输出才变动,否则输出不变。
pai_deal->adjust_line[i].x = AnalogDeal(&pai_deal->analog_type[i], pai_deal->padc_result[i], i);//输入时adc值,输出对应理论电压
pai_status->type_value[i] = LineCalc(&pai_deal->adjust_line[i]);//输入adc对应理论电压,输出电压标幺值
pai_deal->line_struct[i].x = pai_status->type_value[i];
pai_deal->low_pass_filter[i].in = LineCalc(&pai_deal->line_struct[i]);//输入为定标前标幺,输出为定标后标幺
intermValue = LpfCalc(&pai_deal->low_pass_filter[i]);//输入为滤波前电压标幺,输出为滤波后电压标幺
intermValue = DenoiseDeal(&pai_deal->denoise[i], intermValue, i);//噪声处理
4.AO
值转化,校正,标定
未完待续,搞明白这些,IO模块的软件处理就没有问题!!!!