找答案的高端用户(找答案钻石及双钻级别的用户)将尽可能从此问题下的所有回
答中,为您推荐最佳答案。届时您可以根据推荐数采纳答案。
如果自提问时间起7天内您仍无法选出最佳答案,您可以选择“无满意答案”关闭此问题。
小程序查看
手机扫码追踪该问题
手机扫码追踪该问题,
觉得实用,立即去分享!
点击复制链接
如图是计算 M0.0-M31.7 从最左的 M0.7 开始向右扫描,扫描到第一个为1 的位时,得出前导0有多少个。
代码如下:
"左边0位总和" := 0;
"内循环退出标志" := FALSE;
FOR #I := 0 TO 31 DO
FOR #J:= 7 TO 0 BY -1 DO
"左边0位总和" := "左边0位总和" + 1;
IF PEEK_BOOL(area := 16#83, dbNumber := 0, byteOffset := #I, bitOffset := #J)=TRUE THEN
"左边0位总和" := "左边0位总和" - 1;
"内循环退出标志" := TRUE;
EXIT;
END_IF;
END_FOR;
IF "内循环退出标志" THEN
EXIT;
END_IF;
END_FOR;
说明:
注意上面的 I 、 J 是在 OB1 中定义的临时变量。
如果要用到DB块中,DB块必须是非优化的,DB 块的 area := 16#84 dbNumber 此时就要写 DB块号
http://www.ad.siemens.com.cn/productportal/Prods/S7-1200_PLC_EASY_PLUS/07-Program/03-instruction/03-Address/03-PEEK_POKE.html
{
if (BOON[0] = FALSE AND #INC = FALSE) then
#COUNT:=#COUNT+1;
end_if;
IF (BOON[0] ) then
#INC:=true;
end_if;
}
建立一个中间变量,作为判断数组中为0的个数,如果为零,则加1,直到遇到第一个1时,将中间位设置成1,则计数终止
byte可以换个方法,先判断这个byte:=0,如果等于0就+8,不等于0,就用上述方法去找有几个0,在这个数上加上这个数就可以
首次回答问题,获得
双倍西币积分!
立即成为技术知识分享的一员!
找答案微信小程序
提问
搜索
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!