技术论坛

横向比较s7_200和三菱FX1S-14MT在有符号加减法的表现

作者 主题
至圣

经验值: 10686
发帖数: 1561
精华帖: 33
主题:【探讨】横向比较s7_200和三菱FX1S-14MT在有符号加减法的表现
推荐帖


只看楼主 楼主 2017-09-06 16:52:11

最近手头有了FX1S-14MT的实物,对心头一个有了很久的疑问进行了实测。这个疑问就是当加减运算的结果超过了有符号数表达的范围,结果会是怎样的?PLC系统相应的标志位又是怎样的?实验的结果下面以附件图片给出来了,实验是通过触摸屏在线联机后截图所得。可以看出二者有很大的区别,这个区别对我们编程处理高速计数器的数值时有很大影响,我以前的旧贴中提到过,可惜那时没有FX1S-14MT的实物测试一直心存悬疑,看了三菱的手册也是没看太明白(尤其是那个关于标志位的说明)。





工控爱好者
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1421167&b_id=3&s_id=1&num=12

至圣

经验值: 67551
发帖数: 14784
精华帖: 100
回复:横向比较s7_200和三菱FX1S-14MT在有符号加减法的表现
推荐帖


只看楼主 1楼 2017-09-07 09:09:23

200呢,是全数轴循环。最大值加1等于最小值,溢出。正负数轴手尾相连,形成一个大圈。

30呢,是半轴循环。最大值加1等于0,溢出。正负数轴两端向中间0值相连,形成正环和负环。

所以200可以理解40000这个值,而30最大只能32767。

最大值加1等于最小值,这方便机械的运算。

最大值加1等于0,比较接近人的感官。

所以,大量的人认为200高速计数器很大值过零的时候会有意外,然后能可每次复位高计为0重新计算。因为感官认识是这样吧。而30的,很大值过零后产生进位标志之后把结果做相应的加或减最大值就可以了。也是感官认识。

殊不知,200的处理方式更加简单,管都不用管。


 
以下网友喜欢您的帖子:

  
版主

经验值: 25998
发帖数: 11809
精华帖: 43
回复:横向比较s7_200和三菱FX1S-14MT在有符号加减法的表现
推荐帖


只看楼主 2楼 2017-09-07 09:36:31

当采用补码规则进行加减运算时,无符号数和有符号数的运算法则是相同的,直接就是二进制的运算法则。

当需要解释、显示时,才考虑符号位、溢出进位的意义。


我们可以让200做32位、48位、64位等超长的整数运算,利用普通的加减法配合溢出位处理就可以实现。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 10686
发帖数: 1561
精华帖: 33
回复:横向比较s7_200和三菱FX1S-14MT在有符号加减法的表现
推荐帖


只看楼主 楼主 3楼 2017-09-07 10:48:29

就像VD0高位字是VW0而不是VW2一样,三菱的双字D0却是高位字为D1。这些根本的区别给很多人挖过坑,基本而重要的东西,值得大家花时间弄清楚。相信其它品牌的PLC一样会碰到。顺带提一句:高速计数器200和FX1S过了正的最大值再加计数时都是变为负的最大值,即所谓的循环计数以16进制描述就是0000 0000(0)----7FFF FFFF(正极值),8000 0000(负极值),8000 0001-----FFFF FFFE(-2),FFFF FFFF(-1),0000 0000(0)----如此循环,减计数则循环方向相反。


工控爱好者
以下网友喜欢您的帖子:

  
至圣

经验值: 10686
发帖数: 1561
精华帖: 33
回复:横向比较s7_200和三菱FX1S-14MT在有符号加减法的表现


只看楼主 楼主 4楼 2017-09-07 11:27:58

是的,计数值的确是没有负的,但这个数值变化规律以有符号看就是这样,然后使用加减法指令时它也是以有符号数对待的。并且三菱和200在溢出处理上区别还很大。在我的测试中,16位有符号计算三菱的在代数计算结果为-32769时,结果实际显示为0,负溢出标志M8021,0标志M8020均置位,/////为-32770时,实际结果显示为-1,仅负溢出标志M8021置位


16位有符号计算三菱的在代数计算结果为32768时,实际结果显示为0,正溢出标志M8022,0标志M8020均置位,/////为32769时,实际结果显示为1,仅正溢出标志M8022置位


一个特例:32位的有符号计算,三菱的,(-2147483647)-2147483647=(-2147483645),负溢出标志置位

写成16进制为8000 0001-7FFF FFFF=8000 0003


再看看200的,(-2147483647)-2147483647=2,溢出标志SM1.1置位,写成16进制为8000 0001-7FFF FFFF=0000 0002





工控爱好者
以下网友喜欢您的帖子:

  
版主

经验值: 25998
发帖数: 11809
精华帖: 43
回复:横向比较s7_200和三菱FX1S-14MT在有符号加减法的表现


只看楼主 5楼 2017-09-07 13:08:08

使用补码方式表示负数时,一统江湖啦。

补码方式下,有符号数的加减计算法则,和二进制(无符号)方式完全相同。

有符号和无符号,仅在于你对数值的解释。

所以,200中,你找不到无符号的加减运算。因为有符号的加减运算,就是无符号的加减运算。

但是,当你要作数位扩展,比如8位扩16位,16位扩32位,就要考虑到符号位,以及溢出位的处理。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 10686
发帖数: 1561
精华帖: 33
回复:横向比较s7_200和三菱FX1S-14MT在有符号加减法的表现


只看楼主 楼主 6楼 2017-09-10 21:41:02

在网上找到一个加减器的模型,有点怀疑200的加减指令能实现更多位的扩展,因为系统未提供模型中所需的C位,不知可否用系统的溢出位处理后获取C位。现以附件贴图把那个模型贴出来,供大家讨论




工控爱好者
以下网友喜欢您的帖子:

  
至圣

经验值: 10686
发帖数: 1561
精华帖: 33
回复:横向比较s7_200和三菱FX1S-14MT在有符号加减法的表现
推荐帖


只看楼主 楼主 7楼 2017-09-14 13:18:56

这两天有闲参照那个运算器的模型自己做了一段程序实现字节有符号加减运算,可以实现以字节为单位的多字节加减运算。附件就是这段程序,可以做成库,欢迎有兴趣者测试指正

加减库指令.zip



工控爱好者
以下网友喜欢您的帖子:

  
侠圣

经验值: 2039
发帖数: 256
精华帖: 0
回复:横向比较s7_200和三菱FX1S-14MT在有符号加减法的表现


只看楼主 8楼 2017-09-14 14:06:12

精彩,真的精彩


 
以下网友喜欢您的帖子:

  
至圣

经验值: 10686
发帖数: 1561
精华帖: 33
回复:横向比较s7_200和三菱FX1S-14MT在有符号加减法的表现
推荐帖


只看楼主 楼主 9楼 2017-09-15 11:01:53

对7楼的程序实际运行发现非常耗时,串行计算的机制决定了它快不了,只能做一下改善,以下附件程序减少了子程序调用级数,并使用了JMP和LBL指令跳转实现循环代替系统的FOR-NEXT指令,耗时大概缩短三成。翻阅手册发现子程序中使用L存储器虽增加了程序可移植性但程序执行时间比其他存储器会增加很多。等有闲把L换成V试试看。

加减库指令2.zip



工控爱好者
以下网友喜欢您的帖子:

  
至圣

经验值: 10686
发帖数: 1561
精华帖: 33
回复:横向比较s7_200和三菱FX1S-14MT在有符号加减法的表现


只看楼主 楼主 10楼 2017-09-19 15:12:03

L改成V寄存器后,扫描周期大幅缩短到原来的三成不到,这让我有些意外,特此补记。


工控爱好者
以下网友喜欢您的帖子:

  
至圣

经验值: 10686
发帖数: 1561
精华帖: 33
回复:横向比较s7_200和三菱FX1S-14MT在有符号加减法的表现


只看楼主 楼主 11楼 2018-04-14 20:08:02

找到一台OMRON的CP1E型PLC也做了这个有符号加减的实验,与200的表现一致。再此补记。


工控爱好者
以下网友喜欢您的帖子:

  
侠士

经验值: 1531
发帖数: 51
精华帖: 0
回复:横向比较s7_200和三菱FX1S-14MT在有符号加减法的表现


只看楼主 12楼 2018-04-15 11:22:35
非常好,感谢楼主分享。
人之所以痛苦,在于追求错误的东西。反之亦然。
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
横向比较s7_200和三菱FX1S-14MT在有符号加减法的表现
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。