施耐德PLC应用,在程序中定义变量和数据!
施耐德PLC中编辑变量和数据:(一)基本知识
1、变量分类
变量是在程序执行时可以修改的内存区域。Unity Pro 软件编程可以使用两种类型的变量:
1) 定位变量:是与 I/O 硬件模块输入输出通道相关联的,或者与内存引用相关联的变量。例如:“启动电机”与输入模板通道 %I 0.5.0 相关联,“启动电机”就是定位变量。
2) 非定位变量:是既不与I/O 硬件模块输入输出通道相关联,也不与内存引用地址相关联的变量,即没有地址关联的变量成为非定位变量。非定位变量在内存中的位置不可知。这种变量定义类型可以使您在编写程序时抛开地址的束缚,完全专注于您的应用。
2、通用数据类型和范围
BOOL/EBOOL : 布尔变量必须为 FALSE (0) 或 TRUE (1). EBOOL处理强制和边沿检测
WORD : 代表 “位串16”, 意味着数据长度为 16 位
INT : 代表整型数. 数值范围从 -32768 至 +32767
UINT : 代表无符号整型数. 数值范围从 0 至 65535
REAL : 代表浮点值. 数值范围从 -3.40e+38 至 3.40e+38
3、 通用数据类型的立即值语法
通常基本数据类型(EDT)的实例采用变量名或拓扑地址的方式引用,而在数据编辑器或程序段中也可以通过立即值的方式赋值和引用。如下图所示。
4、定义变量的三种方式
方式一,在项目浏览器中鼠标双击“变量和FB实例”,在弹出的‘数据编辑器窗口’定义,编辑、修改变量,如下图。
方式二,在项目浏览器中双击CPU或I/O模块,如下图查看相应模块的地址,在模块的I/O对象表格里定义,这种方式只能生成,不支持修改和删除。
方式三,在”程序编辑窗口”中定义,这种方式只能生成,不支持修改和删除。
(二)实际操作
1、在项目浏览器中点击“变量和FB实例”,在右侧“名称”下输入start,类型选 EBOOL,在下一行输入 stop,类型选 EBOOL,然后关闭窗口。如下图:
2、从硬件属性中书写:在项目浏览器中双击DDO3202k;左键点右侧“BMX DDO3202k”,选择I/O对象,再选择%Q,然后点击“更新网络”。在该界面右侧%Q0.2.0名称下,改写为cmd_motor,再用鼠标左键选中第2行,按着鼠标左键下拉,选择右侧Q0.2.1、Q0.2.2、Q0.2.3;然后在左侧“名称前缀”框中输入cmd_,点击“创建”。即可形成cmd_0、cmd_1、cmd_2;如下图:
3、关闭所有窗口,点击“变量和FB实例”,会显示刚才所有的定义变量名。
4、按保存按钮,保存项目。
PLC里Real数据结构和高低字节详解~一次性搞懂real问题
最近又遇到个问题,PLC和PLC通信,需要用到Real变量,还需要高低字节转换,该怎么正确传输呢?下面由我一步一步解决这个问题。一次性彻底解决Real数据结构问题。
第一步:硬件配置
倍福PLC为主站,西门子模块为从站,通过Profibus通信传输数据,但硬件配置只能配置Byte,如下图定义了64字节输入,64字节输出。
第二步:问题描述
我需要西门子PLC给我发一个real类型的数据,一个real类型为4个byte,我就在程序里定义5-8Byte这4个byte为一个Real(如下图蓝色显示,图中为64个byte的16进制显示,两个数字00代表一个byte)。
倍福里Real的16进制数据CD 4C 03 43,此时在程序里的显示为131.3;但是西门子发过来的不是131.3。
这又是什么问题呢?
此刻想到有高低字节转换,所以认为是高低字节问题导致的(我的上一篇文章详细讲解了高低字节转换机理)。于是我打算在程序里通过高低字节转换看看结果是不是一致的。也就是上图中real的16进制数据变成了43 03 4C CD。结果显示还是不正确,这就纳闷了。。
头大中……………
怎么办呢?
只能一步一步分析数据结构了。
第三步:技术原理分析
倍福侧显示的Real:131.3的数据结构如图所示
西门子侧由于有高低字转换问题,实际西门子侧需做个高低字节转换后,要给我发以下数据结构:
这样数据结构才能全部对应上,如果西门子不经过高低字节转换,直接发131.3数据给倍福,那么因为存在高低字节互换问题,倍福收到的完全是反的字节,即1100 1101 0100 1100 0000 0011 0100 0011,这就需要倍福侧再次做高低字节转换。才能得到实际的结果131.3;
卧槽!
经过推理可以经过高低字节转换就得到正确结果了呀!!
在验证一遍,西门子发个real,倍福经过高低字节转换,确实可以得到正确结果,之前我的程序写错了,程序里定义的是DWORD,不是Real!!!
研究到现在白研究了,高低字节转换就可以实现了!!!
但是既然已经研究到这了,就干脆把Real的换算机制搞清楚吧!!!!!
第四步:Real 换算机制
32位real的结构如下图:
高地址<------------>低地址
| 符号位 | 指数 | 尾数 |
| 1 bit | 8 bit | 23 bit |
*符号位1代表负数,0代表正数。
*指数就是公式里的指数。
*尾数就是小数点后面的部分。
举例说明:Real值 131.1
二进制表示位0100 0011 0000 0011 0100 1100 1100 1101
机器运算需要转为补码运算,正数补码和反码一致。
即131.3的补码和上面一样,0100 0011 0000 0011 0100 1100 1100 1101
**0代表正数;
**后面8位1000 0110为指数,转换为十进制是 指数=134。
**尾数部分为000 0011 0100 1100 1100 1101,根据公式加1;
为1. 000 0011 0100 1100 1100 1101;
Real转换公式为 REAL=1*1.(尾数部分)*2^(指数-127)
以上数据代入,十进制real即为=1.00000110100110011001101*2^(134-127)
=1.00000110100110011001101*2^7
以上由于是二进制乘法,所以每次乘以2,小数点前移1位,2^7就是前移7位,数据表示为
=10000011.0100110011001101
抓换成10进制无限接近 =131.3
到此转换完成,Lreal是64位结构也是相同的机制,只是指数和尾数变多了。
问题解决了,还收获Real数据的知识,挺充实!!
相关问答
在plc编程中byte转换成real的原理是什么
你想要一个16进制数形式的字符串还是把每个16进制数转成它代表的ascii字符?你的源数据是个byte[]?第一种就没什么可说的了,直接调每个byte的ToStri...
为什么要把plc采集的real类型的数据转化成int型?
关于这个问题,将PLC采集的实数类型数据转换为整数类型可能是为了以下几个原因:1.数据处理方便:整数类型数据处理更加简单,可以直接进行算术运算、比较、排...
wincc7.0和施耐德昆腾plc连接,REAL值显示不正常,请高手知道一下,谢谢?
查看一下wincc输出格式设置,一般大于0的real数值,数据格式采用(十进制),输出格式采用(99999.9),如果小数点需要显示多几位就多设几位,如果是显示负的real值...
库卡机器人怎么写浮点数给plc?
库卡机器人(KUKARobot)和PLC(可编程逻辑控制器)通常用于自动化系统。确保机器人和PLC之间的数据传输正确是至关重要的。浮点数通常是指带小数点的数字,如3...
plc中等于指令怎么使用?
PLC中等于指令是一条输入指令,它的操作数据类型除了SINT的格式对应的是立即数,其余的都不是。等于指令的测试源A的值与测试源B的值是否相等。REAL数据类型的...
AB的PLC中,有这些数据类型:INTDINTSINTREALBOOL。请问分别代表什么意思啊?
INT16位整型其值域为-32768~+32767DINT32位整型其值域为-2147483648~+2147483647SINT8位整型其值域为-128~+127REAL实型其值域为-2的128次方...
real占多少位?
bool布尔量就是开关量只有0,1byte字节word字16位整数dword双字32位整数int带符号16位整数dint带符号32位整数real浮点数实数32位别的我没用过...
PLC的基本数据类型,我们如何在编程中选用?
PLC的基本数据类型,我们常用的有如下几种:1.布尔类型BOOL,也就是我们常说的0和1,也可以理解为True和False,对于PLC来说就是DI或者DO点的输入或输出状态...
PLC中,实数,整数型,双整数型的概念是什么?最好举例._作业帮
[最佳回答]实数和长整型一样占用2个字(4个字节)的空间,只是实数表示的是带有小数的数据,如88.39,这就是实型,在程序中一般符号是REAL或FLOAT;而长整型也就是你...
PLC什么双整数?
实数和长整型一样占用2个字(4个字节)的空间,只是实数表示的是带有小数的数据,如88.39,这就是实型,在程序中一般符号是REAL或FLOAT;而长整型也就是你说的双整数...