签到有奖
消息提醒
运维工程师专区
官方商城
扫码分享好友 任选多种周边
刚接触S7-1500,现场有个计算长度的测量轮,原理就是单圈编码器计圈数乘以测量轮周长来计算钢板长度。在计算过程中要求在电脑上实时的显示钢板长度。这样我感觉只能用累加指令,用反馈回的码值除以单圈码值进行累加,计算完成后用确认信号将累加值清零,但是没找到方法。这样应该怎么编程啊?
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1387334&b_id=66&s_id=0&num=22
主要不知道累加指令或功能块应该用哪一个,算法在原来的设备上用过,但不是西门子的工控设备
是计米器吧,用计数器.
计数器不好判断圈数啊?实时的在电脑上显示不容易啊
比如,测量轮转的较快的话,一圈码值是8192,比如从4096开始计算,前半圈可以直接(8192-4096)/8192*周长计算,但第二圈开始是整圈,实时显示不太容易。即使满一圈减去前边的码值加上圈数周长,也很难在屏幕上做到实时显示,毕竟有时候需要非标尺寸停止的。。。。
这种卷轴累的,每转一圈 周长固定不变吗?还是随着转动 轴直径越来越大?
没做过此类项目,另外,单圈编码器的数据变化是否如此也不清楚,以下想法仅供参考:
如果是固定不变的,你用单圈的应该是0-8192,一圈之后再从0-8192?
那你可以采用进位的方式吧?
你的实际总长度=当前圈的长度+之前累加的长度(不包含当前圈);
另外也测算一下,根据你显示数据长度的单位,比如是1mm,算是多少编码器数为1mm,
这样程序判断一下,一旦编码器数为0重新开始转了,就把先前那一圈的长度累加出来加到之前累加的长度,当前圈的再从0开始计算,屏幕实时显示这2个的累加之后的值。
8192是取数字量编码2的13次方,是多圈型编码器改的,码值从0-8191,到8192时从零再次开始计算。测量轮的直径不变,长度等于第一圈的长度加圈数乘以周长加上最后的长度。
测算长度现在计算方式是∑1/8192*周长,但不知道1500中怎么计算。。。。
引用5楼详细内容:
怎么算什么意思?不知道程序怎么写吗?如果不知道是否有特殊的功能块,那就用最简单的函数指令写累加呗!
引用6楼详细内容:
用SCL写累加指令?其实就是不知道1500中有没有相应的FC块可以用。。。。。
引用7楼详细内容:
这种功能性的fc,没有用过的,只能不好说有没有,我认为可以自己尝试写啊,scl或者stl,当然前者可能更可行些;
如果一定要确认是否有可用的块,打400问吧,比较他们是经过培训的,应该更了解一些。
你这是板材卷绕的计长?还是单纯的不卷绕只是输送棍上的计长?
提问题时麻烦把背景多交待一些
引用楼主详细内容:
板材直接在辊道上计长。计完长度后直接剪切。下次会注意。。。。。。其实感觉只是一种方式,现有的设备运行的挺好,公司计划再上一套。但原先用的是AB的CONTROLLOGIX,价格太贵,考虑用西门子替代,做些技术储备。。。。
也就是“定长控制”了
引用详细内容:
单纯做累积可参考全球技术资源文档(条目ID号48799854)"在STEP 7 (TIA Portal) 中,如何实现流量累积功能?"
TOTAL=TOTAL+X。这还需要专门一个块吗?
但也要考虑采样间隔之类,累积其实也是一种定积分的思想。
这个就是相邻两个PLC程序扫描周期读到的编码器实际读数之差的累加,但必须注意编码器度数溢出时的处理。下面截取以前做的其中累计脉冲的程序例子:
#MaxPulseVal := 8192.0;//读取到的编码器最大度数//------------------------------------------------------------------#tempData.r_currCycleEncoderVal := UDINT_TO_REAL(#actEncoderVal);//读取到的编码器当前值//------------------------------------------------------------------#tempData.r_encoderValPerCycle := #tempData.r_currCycleEncoderVal - #TempData.r_lastCycleEncoderVal; //两个周期的度数差#tempData.b_I_OverFlowFlag := ABS(#tempData.r_encoderValPerCycle) > #MaxPulseVal / 2;//判断编码器是否旋转是否超过一圈
//判断是正转超出还是反转超出
IF #tempData.b_I_OverFlowFlag THEN IF #tempData.r_encoderValPerCycle > 0.0 THEN //underflow 说明是反转超出一圈 #tempData.r_effectEncoderValPerCycle := - (#MaxPulseVal - #tempData.r_currCycleEncoderVal + #tempData.r_lastCycleEncoderVal); ELSE //overflow说明是正转超出一圈 #tempData.r_effectEncoderValPerCycle := #MaxPulseVal - #tempData.r_lastCycleEncoderVal + #tempData.r_currCycleEncoderVal; END_IF;ELSE #tempData.r_effectEncoderValPerCycle := #tempData.r_encoderValPerCycle; //正常范围END_IF;
#tempData.r_lastCycleEncoderVal := #tempData.r_currCycleEncoderVal;
#tempData.r_TotalPulse := #tempData.r_actPosition + #tempData.r_effectEncoderValPerCycle;//脉冲总数
脉冲速度慢的话, 累加 INC指令
速度快的话,使用高速计数器,甚至需要中断来做计算
你的测量轮周长是增加的吗,还是固定不变的
分享
扫码分享好友 任选多种好礼
收藏
有帮助
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!
密码至少8位,包含大、小写字母,数字和符号至少三种。
允许邮箱和手机接收来自支持中心网站的信息
我已同意《支持中心网站注册协议和隐私政策》
微信登录扫码一键登录
验证码登录
密码登录
二维码失效点击重试
打开微信扫一扫,快速登录/注册
未注册手机验证后自动登录,注册即代表同意《支持中心网站注册协议和隐私政策》
三日内免验证登录
短信登录
登录