在工业自动化领域输入/输出模块比较常见,有数字量输入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模块的软件处理就没有问题!!!!