您现在所在的是:

西门子SIEMENS

回帖:5个,阅读:463 [上一页] [1] [下一页]
* 帖子主题:

请大神指点

533
yonggang123
文章数:6
年度积分:50
历史总积分:533
注册时间:2016/2/18
发站内信
发表于:2016/6/24 22:09:30
#0楼
楼主编写了一段代码用来控制传送机从高速运行中平缓减速,想通过一个算法来实现一个平滑的曲线减速,测试中遇到了数据转换问题,先附上代码


SP05: L     #FQ1.Parameter.Stoppos_2
     L     #FQ1.Status_to_CO.Position
     -R    
     T     #Internal.Distance_ToStopPos

     L     #Internal.Distance_ToStopPos
     L     L#1300
     /D    
     L     #Internal.Distance_ToStopPos
     *D    
 
     DTR  

     SQRT  
     RND  
     T     #Internal.SlowSpeed
     A(    
     L     #Internal.SlowSpeed
     L     #FQ1.Parameter.Speed_4
     >I    
     )    
     JC    FF01
     L     #FQ1.Parameter.Speed_4
     T     #Internal.SlowSpeed

FF01: A(    
     L     #Internal.SlowSpeed
     L     #FQ1.Parameter.Speed_2
     >I    
     )    
     JC    FF02
     L     #Internal.SlowSpeed
     T     #FQ1.Speed.Control
     JU    SP01

FF02: L     #FQ1.Parameter.Speed_2
     T     #FQ1.Speed.Control
     JU    SP01


问题出现在所有的位置参数都是DW(现场的距离是2米,程序中距离值是用浮点型定义的2.0,也就是#FQ1.Parameter.Stoppos_2=2.0,这个数据转换成整型数据非常大),所以运算到下面会溢出
     L     #Internal.Distance_ToStopPos
     L     L#1300
     /D    
     L     #Internal.Distance_ToStopPos
     *D  
     DTR  
     SQRT  
     RND
      T     #Internal.SlowSpeed
到这里结果就成了0 ,请大神指点一下如何改进! ( #Internal.SlowSpeed 是 int, #Internal.Distance_ToStopPos 是DW)
10507
xlian
文章数:3232
年度积分:53
历史总积分:10507
注册时间:2002/5/7
发站内信
2018论坛热心网友
西门子PLC体验(二)
发表于:2016/6/25 9:23:01
#1楼
你用RND+试试
[此贴子已经被作者于2016/6/25 9:29:10编辑过]
37605
cvlsam 版主
文章数:12429
年度积分:216
历史总积分:37605
注册时间:2001/12/22
发站内信
2018论坛贡献奖
2017论坛贡献奖
2016论坛贡献奖
2015论坛贡献奖
2013论坛贡献奖
2012论坛贡献奖
2011论坛贡献奖
2011国庆活动
2010论坛杰出贡献奖
发表于:2016/6/25 19:41:49
#2楼
以下是引用yonggang1232016/6/24 22:09:30的发言:
楼主编写了一段代码用来控制传送机从高速运行中平缓减速,想通过一个算法来实现一个平滑的曲线减速,测试中遇到了数据转换问题,先附上代码


SP05: L     #FQ1.Parameter.Stoppos_2
     L     #FQ1.Status_to_CO.Position
     -R
     T     #Internal.Distance_ToStopPos

     L     #Internal.Distance_ToStopPos
     L     L#1300
     /D
     L     #Internal.Distance_ToStopPos
     *D

     DTR

     SQRT
     RND
     T     #Internal.SlowSpeed
     A(
     L     #Internal.SlowSpeed
     L     #FQ1.Parameter.Speed_4
     >I
     )
     JC    FF01
     L     #FQ1.Parameter.Speed_4
     T     #Internal.SlowSpeed

FF01: A(
     L     #Internal.SlowSpeed
     L     #FQ1.Parameter.Speed_2
     >I
     )
     JC    FF02
     L     #Internal.SlowSpeed
     T     #FQ1.Speed.Control
     JU    SP01

FF02: L     #FQ1.Parameter.Speed_2
     T     #FQ1.Speed.Control
     JU    SP01


问题出现在所有的位置参数都是DW(现场的距离是2米,程序中距离值是用浮点型定义的2.0,也就是#FQ1.Parameter.Stoppos_2=2.0,这个数据转换成整型数据非常大),所以运算到下面会溢出
     L     #Internal.Distance_ToStopPos
     L     L#1300
     /D
     L     #Internal.Distance_ToStopPos
     *D
     DTR
     SQRT
     RND
      T     #Internal.SlowSpeed
到这里结果就成了0 ,请大神指点一下如何改进! ( #Internal.SlowSpeed 是 int, #Internal.Distance_ToStopPos 是DW)

RND指令的运算结果为32位整形数据,因此请将Internal.SlowSpeed的数据类型改为Dint。

Good Luck~
533
yonggang123
文章数:6
年度积分:50
历史总积分:533
注册时间:2016/2/18
发站内信
发表于:2016/6/26 21:10:36
#3楼
回复 #2楼 cvlsam
请问下,浮点型数据应该如何运算,由于电机最后只接受int数据作为速度,但是浮点数据转换过来是个DW(L#1234567890),有十位之大,有没有其他办法运算
533
yonggang123
文章数:6
年度积分:50
历史总积分:533
注册时间:2016/2/18
发站内信
发表于:2016/6/26 21:11:51
#4楼
回复 #1楼 xlian
谢谢回复,可是在RND前就已经溢出了
8371
fujifa
文章数:2941
年度积分:57
历史总积分:8371
注册时间:2014/2/10
发站内信
2017论坛贡献奖
2016论坛贡献奖
2015论坛贡献奖
发表于:2016/6/27 11:43:06
#5楼
以下是引用yonggang1232016/6/26 21:10:36的发言:
请问下,浮点型数据应该如何运算,由于电机最后只接受int数据作为速度,但是浮点数据转换过来是个DW(L#1234567890),有十位之大,有没有其他办法运算

那说明你的浮点数本身已经大于了整型数据能显示的范围,例如:

你的浮点数本身为56666.6,此时转换为长整型数据为56666,此时对于INT数据来说没有意义,因此,你需要控制你的数据在0.0~32766.9之间。
精通富士POD,富士PLC的编程
有问题可以直接电邮:FUJIFA@yeah.net

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2025 Gkong.com, All Rights Reserved

78.0005