回复:绝对值编码器接1200的问题

周杰伦

西门子1847工业学习平台

  • 帖子

    2014
  • 精华

    16
  • 被关注

    143

论坛等级:至圣

注册时间:2011-04-19

黄金 黄金 如何晋级?

发布于 2015-02-16 18:50:00

21楼

我们用绝对值编码器是算滚筒绳长的!!!!!
只要只要绳子在滚筒的初始状态就行。

FUNCTION "钢丝绳长度" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
ENC_CURRENT_VAL : DInt; // 来自编码器的脉冲数
ENC_INIT : DInt; // 初始编码器的脉冲数
CNT_P_T : DInt; // 每圈脉冲数=8192
NSlopePerLayer : Int; // 每一层的圈数
RopeLenTotal : Real; // 绞车总绳长
DiaWinch : Real; // 滚筒直径
InitLayer : Int; // 初始层数 一定是整形
InitSlope : Real; // 初始圈数 不一定是整形
DiaRope : Real; // 钢丝绳直径
FacRopeLayer : Real; // 层密系数
END_VAR

VAR_OUTPUT
NLayer : Real; // 层数
NTurns : DInt; // 编码器转过的圈数
RopeLen : Real; // 长度(卷出-卷入)
RadWinch : Real; // 实际直径(+绳的直径)
layer : Int;
zhijing : Real;
zhuanquan : Real;
END_VAR

VAR_TEMP
TotalLayerOut : Real;
fsp : Real;
NTurns_Temp : Real; // 已经转过的圈数
ENC_VAL : DInt; // 编码器转过脉冲数
Current_Layer : DInt; // 钢丝绳实时所在的层数
Current_Dia : Real; // 钢丝绳实时所在的层数的直径
TempValue : Int;
NTurns_Temp2 : Real;
Roll_In : Bool; // 卷入
Roll_Out : Bool; // 卷出
idx : Int;
last_zhijing : Real;
last_quan : Real;
First_Dia : Real;
last_idx : Int;
END_VAR

VAR CONSTANT
CRAD : Real := 0.01745329;
PI : Real := 3.141593;
END_VAR


BEGIN
#fsp := #FacRopeLayer; // 检查层密系数
IF (#fsp < 0.7) THEN
#fsp := 0.7;
END_IF;
IF (#fsp > 1.0) THEN
#fsp := 1.0;
END_IF;
#RopeLen := 0;
#NTurns := 0;
#ENC_VAL := #ENC_CURRENT_VAL - #ENC_INIT; //计算编码器转过的脉冲数=总值-初始




#NTurns_Temp := DINT_TO_REAL(#ENC_VAL) / DINT_TO_REAL(#CNT_P_T);//已转过圈数=已转过脉冲/每圈脉冲
IF #NTurns_Temp < #InitSlope THEN //如果转过圈数小于初始圈数
#Current_Layer := #InitLayer;//还是等于当前层
ELSE
#Current_Layer := #InitLayer - CEIL((#NTurns_Temp - #InitSlope) / INT_TO_REAL(#NSlopePerLayer));//如果转的圈数大于初始圈数,当前层=初始层数-(已转过的圈-初始圈)/每一层圈数
END_IF;

(********************************************************************还在初始层******************************************************************************************)



#Current_Dia := (2*DINT_TO_REAL(#Current_Layer)-1) * #DiaRope * #FacRopeLayer + #DiaWinch;//当前所在层直径=(2*初始层数-1)*绳直径-1+卷筒直径

#TotalLayerOut := #InitLayer - #Current_Layer;//已转过层数=初始层-当前层

#TempValue := REAL_TO_INT(#TotalLayerOut);//已转过层数

#First_Dia := (2*#InitLayer-1) * #DiaRope * #FacRopeLayer + #DiaWinch;//(2*初始层-1)*绳直径*层密系数+卷筒直径=最外层直径。

#RopeLen :=#PI * #Current_Dia * #NTurns_Temp;//当前所在层直径*π*已转过的圈数=最外层长度(没有超过初始层放出长度)





(********************************************************************转过大于初始层******************************************************************************************)



//转过的层数大于1的话
IF (#TotalLayerOut >= 1) THEN

#RopeLen :=#InitSlope * #First_Dia * #PI;//1.最外层(初始层)的长度=π*初始圈数*最外层层直径。




//2.当前层,绳子当前在的层
#last_zhijing := ((2 * DINT_TO_REAL(#Current_Layer) - 1) * #DiaRope + #DiaWinch);//当前层的直径
#last_quan := (#NTurns_Temp - #InitSlope - (#InitLayer - DINT_TO_REAL(#Current_Layer) - 1) * #NSlopePerLayer);//当前层卷过圈数=转过的圈数-初始层圈数-(初始层-当前层-1)*每一层圈数
#RopeLen := #RopeLen + #PI*#last_zhijing * #last_quan;//当前层卷过的长度




//3。除了初始层和当前层以外层的长度
IF (#InitLayer - 1) >= (#InitLayer - DINT_TO_INT(TRUNC(#TotalLayerOut)) + 1) THEN
FOR #idx := (#InitLayer - DINT_TO_INT(TRUNC(#TotalLayerOut)) + 1) TO (#InitLayer - 1) BY 1 DO
#Current_Dia := (2 * #idx - 1) * #DiaRope + #DiaWinch;//除了最外层剩下的一层直径
#RopeLen := #RopeLen + #Current_Dia * #NSlopePerLayer * #PI;


#last_idx := (#InitLayer - DINT_TO_INT(TRUNC(#TotalLayerOut)) + 1) - 1;
#last_idx := #last_idx + 1;
END_FOR;
END_IF;

END_IF;


(********************************************************************结束******************************************************************************************)



#Current_Dia := (2 * DINT_TO_REAL(#Current_Layer) - 1) * #DiaRope + #DiaWinch;
#layer := DINT_TO_INT(#Current_Layer);
#zhijing :=#Current_Dia;
#zhuanquan := #NTurns_Temp;




END_FUNCTION
工控毁我青春!
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1200系列

共有15119条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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