热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

三菱plcascll转换16进制_【上】三菱FXPLC学习之数值运算指令

所谓数值运算,就是通过加减乘除来实现数值的变换。在PLC中,数值运算的指令不算难,难的是怎样理解PLC对这些数值的定义与处理方式。所以&#

98b67b6d5a6603e00cbeeda94c7dd684.png

7d9098f7bb8b39d69f7fcf4a88f3c39a.png

所谓数值运算,就是通过加减乘除来实现数值的变换。在PLC中,数值运算的指令不算难,难的是怎样理解PLC对这些数值的定义与处理方式。所以,x小编将这部分知识分为上下两篇文章来述说。

d38bf88f8ef2750b261ad9b6f53b5a08.png

在学习数值指令之前,我们得先了解这些数值有哪些特点。

在数学中,数的分类有很多,那在PLC中,数值的分类是不是也有很多的?在学习之前,看到数值运算指令,我顿时瑟瑟发抖,不会在PLC中也要学习数学吧!

2c7b144e0bfcd3facad195bd4c9c3d59.png

后来才发现,是我杯弓蛇影了,PLC中的数值,除了我之前所说的各种进制数外,其实也不过是有整数与小数之分、整数与负数之分而已。这让我松了一口气。那么,我们正式开始这次的学习分享吧!

PLC的正数和负数

在数学中,负数和正数的区别,在于前面的正负号,例如-5和+5,而PLC中是不是也是这样的呢?并不是的。

PLC中,正负之分是通过最高位(b15或b31)的值来判定的。最高位为0表示正数,最高位为1表示负数。

fba0aebcd4dc7cb512ed158434da28b8.png

例如数据寄存器D0中最高位b15=0,表示D0的值为正数;若b15=1,那么D0的值就为负数。

另外,除了最高位用于区分正负之外,其他位(b14…b0或b30…b0)的值也有区别,这主要是体现在负数的表示中。在说明这一点之前,我们先来了解一下什么是原码、反码和补码。

在数字电路中,数码有原码、反码和补码之分,这样可以使得数值运算变得更为简单。结合符号位(最高位),所谓原码,是指数值本身,例如十进制数+11、-5用二进制数表示的原码分别为01011、10101,此时最高位的“0”、“1”为符号位。

af9fae847a1580efc0f2fcc54ccdb3c7.png

在数字电路中规定,正数的原码=反码=补码,也就是正数的原码、反码和补码都是其本身,如上图所示的+11,其反码和补码也是01011。

而负数就不一样了,符号位始终保持不变,负数的反码就是对各数值位分别取反,如上图所示的-5,反码就是把1 0101变成1 1010。而负数的补码等于其反码加1,如1 1010+1=1 1011。

那么,反码和补码存在的意义又是什么呢?其实,补码的作用就是使运算变得更方便快捷,一个数减去另一个数,就等于这个数加上另一个数的相反数的补码,从而把减法运算转化为加法运算。

如下图所示,求解11-5,5的相反数为-5,从而把11-5转化为11+(-5的补码),并舍去进位,最后得到的结果恰好为6。

596254a75ed5d936b118ebd97da96239.png

为什么把减法转化为加法就可以变得方便呢?这是因为加法的电路可以更为容易设计,这是数字电路的知识,在此我就不再展开阐述,大家感兴趣的可以自行了解。

类似于数字电路对原码、反码和补码的定义,在PLC中,正数(符号位为0)直接用其原码表示,而(符号位为1)负数就用其补码表示。这说明,数据寄存器中的数据若为负数,那它各个数位的值并不代表它本身的值,而是其补码。例如D0所存的数据为H8003,如下图所示,其最高位b15=1,为负数,所以这是补码,不能认为D0的数值大小为-3。

af50323f25f4a89d7b3936dfd89bd161.png

由于最高位为符号位,所以PLC中数值的取值范围也会有所不同,如16位和32位的取值范围如下图所示,此时取值范围显然不是±65536(16位)。

另外,PLC中还对两个数作出特别的规定,如图所示的K0和K-32768,特别是B1000 0000 0000 0000不是表示负零。

be23e98f581206d084b61de368dfbb44.png

知道了PLC中对正负数的定义,我们继续往下看它是怎么定义整数和小数的。

PLC的定点数与浮点数

在PLC中,也可以根据小数点位置的不同,将数值分为整数和小数。其中整数就属于定点数,那么,所谓定点数具体指的又是什么呢?

1)定点数

所谓定点,是指小数点是固定的,要么在最高位的左边、要么在最低位的右边。

354e24652da9a38b0eb9338f7314df68.png

如上图所示,若将小数点至于数值最高位的左边,该数值就为纯小数,所谓纯小数,就是指整数部分为零的数,例如0.12、0.07等;若将小数点至于数值最低位的右边,该数值就为整数,没有小数部分,例如7、8、9等。一般都是采用整数的定点数表示,所以在谈及定点数时,很多时候都默认是整数。

结合上文所提的符号位,即带符号的二进制整数称为BIN数。大家细心点也可以发现,编程手册中经常出现“BIN”这个词,没错,它代表的就是二进制整数,而且带有符号。

5311a2bdb6f847758dabab5509280a93.png

所以,在之后谈及BIN运算指令时,要注意其数值的正负。

2)浮点数

所谓浮点数,其实就是小数,“浮点”表示小数点是浮动的,随着小数点位置的不同,数值的大小也会有所不同。在了解浮点数之前,我们先来了解一个概念:科学计数法。

①科学计数法

科学计数法是一种记数的方法。就是把一个数表示成a×10n的形式。如下图所示,其中底数10是固定不变的,变的是a和n,所以要用科学计数法去表示一个数,只需知道a和n即可。

8dfa608f48af54f3fbc084e99974071b.png

类似的,在PLC中,浮点数就是用科学计数法表示的,又因为它由两部分构成(a与10n),所以浮点数都是用32位表示,即占用两个字元件。其中又分为十进制浮点数和二进制浮点数。

②十进制浮点数

根据上文所提,浮点数用两个连续编号的数据寄存器(Dn+1,Dn)表示。如下图所示,Dn保存浮点数的基数,Dn+1保存浮点数的指数,且两个数都带有符号位。例如(D0)=K666,(D1)=K-2,(D1,D0)就表示了十进制数666×10-2=6.66。

4c75182e573afdf6f45719bc39c5ce5e.png

在三菱PLC FX2N中,基数和指数的取值范围各有不同,表示基数的Dn的取值范围为±1000~9999或0,表示指数的Dn+1的取值范围为-41~35。另外,十进制浮点数中,最小的数是1175×10-41,最大的数为3402×1035。至于为什么是这样,我也不甚清楚,反正这是PLC中的规定。

cd3e7d72b38c450997cd0d8079b82850.png

在PLC中,十进制浮点数是不能直接用来运算的,而是用二进制浮点数进行运算的,但它可以和二进制浮点数相互转换,可用来进行数据监视。这就像是计算机系统,计算机中处理数据是基于二进制数的,但我们查看的时候看到的是十进制数,这是因为计算机把二进制数转换为十进制数以便我们查看。

3)二进制浮点数

afa49376cc334d2a47d3c16564b72c90.png

二进制浮点数在PLC中的表示比较复杂,如上图所示,同样是用两个连续编号的数据寄存器表示,其最高位(b31)仍然表示符号位,这个符号位表示的该浮点数本身的正负,而不是指数的正负。从上图可以看出,指数N占有8位,即b30~b23,而基数a占有23位,即b22~b0。它们的取值如下图所示,其中b0~b30的值为0或1。

9d5f3a7d0c8ff0086217ef7112f9c6c8.png

虽然二进制浮点数的表示方式比较复杂,但是能不能完全理解它,都不妨碍我们对浮点数的理解,对数值运算指令的运用。所以,不理解二进制浮点数的表方法,问题不大,能理解二进制浮点数本身就行。

例如在三菱PLC FX3U中想输入浮点数3.14,直接输入“E3.14”就行,但在三菱PLC FX2N中不能直接输入浮点数,想输入浮点数,就得先输入整数,再运用相应指令运算或转化。

知道了这些数值的相关定义和处理方式,那么我们在下篇文章就可以继续分享数值运算的相关指令啦!

最后,这次的分享就到这里吧!

注:本文章内容都是基于三菱FX PLC 2N所写

选自《三菱FX系列PLC功能指令详解》第五章第27~28课时

c24e925af2635271c80a88573c6ed746.png公众号:电气达人扫码关注,更多干货等着你发现“在看”和“赞”了吗,戳我试试吧3397e26dce27e05729f4297218598a30.gif



推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Søren Kierkegaard famously stated that life can only be understood in retrospect but must be lived moving forward. This perspective delves into the intricate relationship between our lived experiences and our reflections on them. ... [详细]
  • PyCharm中配置Pylint静态代码分析工具
    本文详细介绍如何在PyCharm中配置和使用Pylint,帮助开发者进行静态代码检查,确保代码符合PEP8规范,提高代码质量。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 优化ASM字节码操作:简化类转换与移除冗余指令
    本文探讨如何利用ASM框架进行字节码操作,以优化现有类的转换过程,简化复杂的转换逻辑,并移除不必要的加0操作。通过这些技术手段,可以显著提升代码性能和可维护性。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 资源推荐 | TensorFlow官方中文教程助力英语非母语者学习
    来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • python的交互模式怎么输出名文汉字[python常见问题]
    在命令行模式下敲命令python,就看到类似如下的一堆文本输出,然后就进入到Python交互模式,它的提示符是>>>,此时我们可以使用print() ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
author-avatar
Andrew_Chaoyen_liu_328
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有