回复:单圈绝对值编码器在记多圈数时如何处理计数问题

已锁定

W.M.J

  • 帖子

    144
  • 精华

    7
  • 被关注

    41

论坛等级:侠圣

注册时间:2016-11-15

黄金 黄金 如何晋级?

发布于 2021-12-09 09:05:10

17楼

展开查看
以下是引用芳季在2021-12-08 19:19:59的发言 >13楼

想必你手上肯定有程序的啦?楼上。要不……

好吧,附一段程序供大家参考,这是用在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

//------------------------------------------------------------------


评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200 SMART

共有9430条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。