恭喜,你发布的帖子
发布于 2021-12-09 09:05:10
17楼
想必你手上肯定有程序的啦?楼上。要不……
好吧,附一段程序供大家参考,这是用在S120+增量型编码器,通过读取编码器度数计算移动距离的程序,给这个应用类似。前面的回帖不严谨,再次纠正一下:判断上溢时除了判断增量的绝对值>MaxValue/2,还有判断差值为负。
//==================================================================
//Calculate actual position by r482
//==================================================================
//------------------------------------------------------------------
//Initial
//------------------------------------------------------------------
#MaxPulseVal := 4294967296.0;
//------------------------------------------------------------------
//Read actual value(r482)
//------------------------------------------------------------------
#uData.CurrCycleReadVal := #ActReadVal;
//------------------------------------------------------------------
//Calculate increment value per cycle
//------------------------------------------------------------------
#uData.IncrementVal := UDINT_TO_LREAL(#uData.CurrCycleReadVal) - UDINT_TO_LREAL(#uData.LastCycleReadVal);
#uData.Status1.PulseOverFlow := ABS(#uData.IncrementVal) > #MaxPulseVal / 2.0;
IF #uData.Status1.PulseOverFlow THEN
IF #uData.IncrementVal > 0.0 THEN //underflow
#uData.EffectIncrementVal := - (#MaxPulseVal - #uData.CurrCycleReadVal + #uData.LastCycleReadVal);
ELSE //overflow
#uData.EffectIncrementVal := #MaxPulseVal - #uData.LastCycleReadVal + #uData.CurrCycleReadVal;
END_IF;
ELSE
#uData.EffectIncrementVal := #uData.IncrementVal;
END_IF;
#uData.LastCycleReadVal := #uData.CurrCycleReadVal;
//------------------------------------------------------------------
//Calculate pulse increment per cycle
//------------------------------------------------------------------
#uData.ActPulseIncrement := #uData.EffectIncrementVal / (2.0 ** #FineResolution);
#uData.Status1.PulseCountOK := ABS(#uData.ActPulseIncrement) < #MaxPulsePerCycle;
//------------------------------------------------------------------
//Calculate actual position by pulse increment
//------------------------------------------------------------------
IF #Enable THEN
IF #uData.Status1.PulseCountOK THEN
#uData.ActPosition := #uData.ActPosition + #uData.ActPulseIncrement * ABS(#Resolution);
END_IF;
END_IF;
//------------------------------------------------------------------
//Preset
//------------------------------------------------------------------
#uData.Status1.Preseted := (#uData.Control1.Preset AND NOT #uData.Status1.PresetRaiseEdgeSave) OR #ExtPreset;
IF #uData.Status1.Preseted THEN
#uData.ActPosition := #uData.PresetPosition;
END_IF;
#uData.Status1.PresetRaiseEdgeSave := #uData.Control1.Preset;
#uData.Control1.Preset := false;
//------------------------------------------------------------------
//Out
//------------------------------------------------------------------
#ActPosition := #uData.ActPosition;
//------------------------------------------------------------------
//END
//------------------------------------------------------------------
请填写推广理由:
分享
只看
楼主