23.Step7如何将定时器(Timer)的剩余时间转为浮点数
- 格式:docx
- 大小:140.89 KB
- 文档页数:6
海为plc整数转浮点数PLC(Programmable Logic Controller,可编程逻辑控制器)是一种采用数字计算机技术、以程序为中心、用于控制工业过程的计算机控制系统。
在PLC编程中,经常会涉及到整数(integers)和浮点数(floating-point numbers)之间的转换。
整数是没有小数部分的数字,而浮点数则可以包含小数部分。
在工业控制系统中,使用浮点数能够更加精确地描述和控制过程参数,因此转换整数为浮点数是很常见的操作。
PLC提供了一些指令和功能块,用于实现整数转浮点数的操作。
以下将介绍几种常见的转换方法。
1. 直接转换法(cast):最简单的方法是使用类型转换指令,将整数直接转换为浮点数。
例如,在PLC的Ladder Diagram(梯形图)中使用CAST指令,可以将一个整数类型的变量直接转换为浮点数类型。
2. 除法运算法(division):另一种方法是通过除法运算实现整数转浮点数。
将整数除以浮点数1.0可以得到相应的浮点数值。
例如,将一个整数变量x除以1.0并将结果赋值给浮点数变量y,则y的值将为x的浮点表示。
3. 隐式转换法(implicit conversion):某些PLC编程语言具有隐式类型转换的功能,在表达式中使用不同类型的变量时,系统会自动进行转换。
例如,在PLC的Structured Text(结构化文本)中,可以直接将整数变量赋值给浮点数变量,系统将自动进行类型转换。
4. 使用功能块(function block):PLC还提供了一些用于整数与浮点数转换的功能块。
在PLC的Function Block Diagram(功能块图)中,可以使用这些功能块完成转换操作。
例如,使用MOVE_TO_FLOAT功能块将整数变量转换为浮点数变量。
实际的转换方法取决于PLC的型号和编程语言。
在开发PLC应用程序时,应查阅相关的PLC文档和手册,以确定适合的转换方法。
plc字符转浮点数指令PLC(可编程逻辑控制器)是一种广泛应用于工业自动化领域的控制设备,它通过程序控制来实现各种自动化任务。
在PLC编程中,字符转浮点数是一种常用的指令,用于将字节数据转换为浮点数表示。
本文将介绍PLC字符转浮点数指令的原理、应用和注意事项。
一、指令原理在PLC编程中,字符转浮点数指令通常由两个参数组成:输入参数和输出参数。
输入参数是需要转换的字符数据,输出参数是转换后的浮点数数据。
指令的执行过程如下:1. 获取输入参数:PLC从输入寄存器或者内存中获取输入参数,输入参数通常是由字符数据组成的字节序列。
2. 转换为浮点数:PLC通过一定的算法将输入参数转换为浮点数表示。
转换算法通常是根据IEEE 754标准进行的,该标准定义了浮点数的表示方式和转换规则。
3. 存储输出参数:转换后的浮点数数据存储到输出寄存器或者内存中,以供后续的程序使用。
二、指令应用字符转浮点数指令在工业自动化中有广泛的应用,以下是几个常见的应用场景:1. 传感器数据处理:在工业生产中,各种传感器常常输出字符形式的数据,如温度、压力、流量等。
通过字符转浮点数指令,可以将这些字符数据转换为浮点数表示,方便进行后续的数据处理和控制。
2. 数据通信:在PLC与其他设备之间进行数据通信时,常常需要进行数据格式的转换。
字符转浮点数指令可以将其他设备发送的字符数据转换为浮点数表示,或者将PLC的浮点数数据转换为字符形式发送给其他设备。
3. 数据存储:在PLC中,浮点数数据通常需要存储到内存或者寄存器中,以供程序使用。
字符转浮点数指令可以将字符数据转换为浮点数,并将其存储到指定的内存地址或者寄存器中。
三、注意事项在使用字符转浮点数指令时,需要注意以下几点:1. 数据格式:PLC的字符转浮点数指令通常支持多种数据格式,如BCD码、ASCII码等。
在使用指令时,需要根据实际情况选择合适的数据格式。
2. 数据精度:由于浮点数的表示精度有限,字符转浮点数指令可能会引入一定的误差。
plc st语言16进制转浮点数在工业控制领域中,PLC(可编程逻辑控制器)是一种常用的自动化控制设备,它负责监测和控制各种生产过程。
PLC使用ST语言(结构化文本语言)进行编程,其中包含了各种数据类型和操作符。
在ST 语言中,经常需要进行16进制数与浮点数之间的转换。
本文将介绍如何在PLC的ST语言中进行16进制转浮点数的操作。
在PLC的ST语言中,我们可以使用以下方法将16进制数转换为浮点数:1. 首先,我们需要将16进制数转换为二进制数。
在ST语言中,可以使用“CONV”操作符来实现这一步骤。
例如,如果我们有一个16进制数0x3F800000,我们可以使用以下代码将其转换为二进制数: ```stVARhexValue : WORD; // 16进制数值binaryValue : DWORD; // 二进制数值END_VARhexValue := 16#3F800000; // 将16进制数0x3F800000赋给hexValue// 将hexValue转换为binaryValuebinaryValue :=CONV.DINT_TO_DWORD(CONV.WORD_TO_DINT(hexValue));```2. 接下来,我们需要将得到的二进制数转换为IEEE 754标准的浮点数。
在ST语言中,可以使用“CONV”操作符以及“REAL_TO_LREAL”函数来实现这一步骤。
例如,如果我们得到了一个二进制数0x3F800000,我们可以使用以下代码将其转换为浮点数: ```stVARbinaryValue : DWORD; // 二进制数值floatValue : REAL; // 浮点数值END_VARbinaryValue := 16#3F800000; // 将二进制数0x3F800000赋给binaryValue// 将binaryValue转换为floatValuefloatValue :=REAL_TO_LREAL(CONV.DWORD_TO_REAL(binaryValue));```3. 最后,将得到的浮点数值用于后续的计算和控制。
s7数字转时间指令S7数字转时间指令S7数字转时间指令是指西门子S7系列可编程逻辑控制器(PLC)中的一种特殊指令,用于将数字值转换为对应的时间值。
通过该指令,可以方便地对时间进行计算和操作,实现精确的时间控制。
一、S7数字转时间指令的基本语法和参数解释1. 语法:TON(TimerName, IN, PT)TimerName:定时器名称,用于标识不同的定时器IN:输入的时间值,可以是一个字或双字类型的变量PT:预设时间,用于设置定时器的时间上限2. 参数解释:定时器名称:用于标识不同的定时器,可以自定义,命名规则要符合PLC的命名规范输入的时间值:可以是一个字或双字类型的变量,表示从外部输入的时间值,单位可以是毫秒、秒、分钟等预设时间:用于设置定时器的时间上限,单位与输入的时间值一致二、S7数字转时间指令的使用示例例如,我们需要一个定时器,当输入的时间值达到预设时间时,输出一个开关信号。
以下是一个示例程序:```VARInputTime: INT; // 输入的时间值PresetTime: INT; // 预设时间Timer1: TON; // 定时器1Output: BOOL; // 输出信号END_VAR// 设置输入的时间值和预设时间InputTime := 5000; // 5000毫秒PresetTime := 10000; // 10000毫秒// 调用S7数字转时间指令TON(Timer1, InputTime, PresetTime);// 检测定时器的状态IF Timer1.Q THENOutput := TRUE; // 输出开关信号ELSEOutput := FALSE;END_IF```在上述示例中,我们首先定义了输入的时间值和预设时间的变量,以及一个定时器和一个输出信号的变量。
然后,我们将输入的时间值和预设时间赋值给对应的变量。
接下来,我们调用了S7数字转时间指令,将定时器和输入的时间值、预设时间作为参数传入。
:数INT_时间S5Time及Time相互转换
就是整数INT、时间S5Time及Time之间的相互转换。
如何转换,首先要弄清整数INT、时间S5Time及Time的数据结构。
整数INT是16位的数据:
时间S5Time是16位数据,BCD码格式:
时间Time是32位数据,类似于双整数DINT:
由此可见,三者之间的转换即是整数INT、双整数DINT及BCD码之间的转换。
可以根据数据结构特点,自己编程实现相互转换,这样比较复杂。
利用库函数FC33/FC40是最简单方便的。
方法如下:
1. 整数INT到时间S5Time的转换方法:
INT -> I_DI指令 -> DINT -> MOVE指令 -> Time -> 库函数FC40 -> S5Time。
2. 整数INT到时间Time的转换方法:INT -> I_DI指令 -> DINT -> MOVE指令 -> Time。
如图示:
3. 时间S5Time到整数INT的转换方法:
S5Time -> 库函数FC33 -> Time -> MOVE指令 -> DINT -> 取其高字部分,用MOVE指令 -> INT。
注意数据类型。
STEP7批量把模拟量输入转换为浮点数使用STEP7编程的工程师都知道,把模拟量输入转换为浮点数需要用FC105块。
FC105需要填写模拟量输入地址、高量程、低量程以及输出浮点数的地址等数据,如果项目只有几个模拟量输入,这样做没有问题,如果项目有几十个甚至超过100个模拟量输入,这样做就是非常痛苦的一件事。
本篇文章就可以解决大量模拟量输入的问题,这个方法在多个项目可以共享,每次项目只需要做小量修改,可以节约大量的时间,并且不容易出错,几乎无需调试。
本篇文章面向的是有初步STEP7编程基础的工程师,如果以前没有用过STEP7软件,可能看起来比较吃劲,下面详细讲解操作步骤,子程序会提供全部的源码,已经经过验证,复制过去就可以用,有兴趣的人也可以分析一下子程序。
操作步骤共有4个步骤:步骤1设定模拟量输入地址及要求,步骤2创建3个数据块;步骤3创建转换子程序,步骤4把子程序放在OB1中运行。
步骤1:在做项目时最好保证模拟量输入地址是连续,如果模拟量输入地址不连续,有两个方法解决,方法1,如果新设计的项目,最好修改硬件组态,使模拟量输入地址是连续的;方法2,如果项目不允许修改模拟量输入地址,可以多次调用子程序,有几个连续的地址就调用几次。
模拟量输入地址的起始与模拟量的数量在步骤4中使用。
步骤2:创建三个数据块DB3621、DB3622、DB3627(这3个数据块编号在具体的项目中可以修改),DB3621存放模拟量浮点数输出,这个数据块存放的数据就是转换完的模拟量数据,DB3622存放模拟量的高量程、DB3627存放模拟量的低量程,根据项目不同,数据块采用不同的数据块格式可以简化操作,以下介绍什么情况采用哪种数据块数据格式。
数据块数据格式1 ,这个数据格式采用数组结构,这种数据块创建与修改数据块大小十分容易,但是在STEP 7中不容易手动修改单个的值,这种格式适合存放模拟量浮点数输出,如果模拟量的低量程基本上全部是0,只有个别数据不为0,也用这个格式。
Step7-数据类型详细说明总结汇总STEP7中的基本数据类型⑴位(BOOL)位数据的数据类型为BOOL(布尔)型,在软件编程中BOOL 变量的值1和0常用英语词TURE(真)和FALSE(假)来表示,对应二进制数中的“1”和“0”,常用于开关量的逻辑运算,存储空间为1位。
⑵字节(BYTE)字节数据长度为8位,数据格式为B#16#,B代表BYTE,表示数据长度为一个字节(8位),#16#表示十六进制,取值范围为B#16#0~B#16#FF。
⑶字(WORD)字数据长度为16位,这种数据可采用4种方法进行描述。
二进制:二进制的格式为2#,如2#101,取值范围为2#0~2#1111_1111_1111_1111,书写时每4位可用下划线隔开,也可直接表示为2#111111111111。
十六进制:十六进制的格式为W#16#,W代表WORD,表示数据长度为16位,#16#表示十六进制,数据取值范围为W #16#0~W#16#FFFF。
BCD码:BCD码的格式为C#,取值范围为C#0~C#999。
BCD码是用4位二进制表示1位十进制数,4位二进制中的0000~1001组合分别表示十进制中的0~9,4位二进制中的1010~1111组合放弃不用。
BCD码的最高4位用来表示符号,十六位BCD码的取值范围为-999~+999。
在STEP7的数据格式中,BCD码的取值只取正值,与最高4位的符号无关。
无符号十进制数:无符号十进制数的格式为B#(×,×),取值范围为B#(0,0)~B#(255,255),无符号十进制数是用十进制的0~255对应二进制数中的0000_0000~1111_1111(8位),16位二进制数就需要两个0~255的数来表示,例如:B#(12,254)=2#0000_1100_1111_111012 254上面4种数据都是描述一个长度位16位的二进制数,无论你使用哪种方式都可以。
2.2.2 基本的浮点数指令2.2.2 基本的浮点数指令2013-07-12 11:21:39 我来说两句收藏我要投稿本⽂所属图书 > C++反汇编与逆向分析技术揭秘本书既是⼀本全⾯⽽系统地讲解反汇编与逆向分析技术的安全类专著,⼜是⼀部深刻揭⽰C++内部⼯作机制的程序设计类著作。
理论与实践并重,理论部分系统地讲解了C++的各种语法特性和元素的逆向分析⽅法和流程,重在... ⽴即去当当⽹订购前⾯学习了浮点数的编码⽅式,下⾯来学习浮点数指令。
浮点数的操作指令与普通数据类型不同,浮点数操作是通过浮点寄存器来现实的,⽽普通数据类型使⽤的是通⽤寄存器,它们分别使⽤两套不同的指令。
浮点寄存器是通过栈结构来实现的,由ST(0)~ST(7)共8个栈空间组成,每个浮点寄存器占8字节。
每次使⽤浮点寄存器都是率先使⽤ST(0),⽽不能越过ST(0)直接使⽤ST(1)。
浮点寄存器的使⽤就是压栈、出栈的过程。
当ST(0)存在数据时,执⾏压栈操作后,ST(0)中的数据将装⼊ST(1)中,如⽆出栈操作,将顺序地向下压栈,直到将浮点寄存器占满。
常⽤浮点数指令的介绍如表2-1所⽰,其中,IN表⽰操作数⼊栈,OUT表⽰操作数出栈。
其他运算指令和普通指令类似,只需在前⾯加F即可,如FSUB和FSUBP等。
在使⽤浮点指令时,都要先利⽤ST(0)进⾏运算。
当ST(0)中有值时,便会将ST(0)中的数据顺序向下存放到ST(1)中,然后再将数据放⼊ST(0)中。
如果再次操作ST(0),则会先将ST(1)中的数据放⼊ST(2)中,然后将ST(0)中的数据放⼊ST(1)中,最后才将新的数据存放到ST(0)。
以此类推,在8个浮点寄存器都有值的情况下继续向ST(0)中存放数据,这时会丢弃ST(7)中数据信息。
下⾯通过⼀个简单的⽰例来了解各指令的使⽤流程,熟悉数据传送类型指令FLD、FLD1、FST、FSTP、FISTP等的使⽤⽅法。
MicrosoftVisualC++6.0通过函数__ftol将float 型转换为int型,见代码清单2-3。
c语言定点数转浮点数函数
在C语言中,我们可以使用以下函数将定点数转换为浮点数:
c.
float fixedToFloat(int fixedNum, int fracBits) {。
return fixedNum / (float)(1 << fracBits);
}。
在这个函数中,`fixedNum`是定点数,`fracBits`是小数部分
的位数。
我们首先将`fixedNum`除以2的`fracBits`次方,然后将
结果转换为浮点数并返回。
另外,还有一些其他方法可以实现定点数到浮点数的转换,比
如直接使用移位操作或者乘以适当的倍数来实现。
但是上面的方法
是一种简单且常用的实现方式。
需要注意的是,定点数和浮点数在表示方式和精度上有所不同,
因此在进行转换时需要特别小心,以确保精度不会丢失。
另外,还
需要考虑溢出和舍入误差等问题,以保证转换的准确性。
总的来说,定点数到浮点数的转换需要根据具体的需求和应用
场景来选择合适的方法,并且在实现时需要注意精度和溢出等问题。
STEP7批量把模拟量输入转换为浮点数使用STEP7编程的工程师都知道,把模拟量输入转换为浮点数需要用FC105块。
FC105需要填写模拟量输入地址、高量程、低量程以及输出浮点数的地址等数据,如果项目只有几个模拟量输入,这样做没有问题,如果项目有几十个甚至超过100个模拟量输入,这样做就是非常痛苦的一件事。
本篇文章就可以解决大量模拟量输入的问题,这个方法在多个项目可以共享,每次项目只需要做小量修改,可以节约大量的时间,并且不容易出错,几乎无需调试。
本篇文章面向的是有初步STEP7编程基础的工程师,如果以前没有用过STEP7软件,可能看起来比较吃劲,下面详细讲解操作步骤,子程序会提供全部的源码,已经经过验证,复制过去就可以用,有兴趣的人也可以分析一下子程序。
操作步骤共有4个步骤:步骤1设定模拟量输入地址及要求,步骤2创建3个数据块;步骤3创建转换子程序,步骤4把子程序放在OB1中运行。
步骤1:在做项目时最好保证模拟量输入地址是连续,如果模拟量输入地址不连续,有两个方法解决,方法1,如果新设计的项目,最好修改硬件组态,使模拟量输入地址是连续的;方法2,如果项目不允许修改模拟量输入地址,可以多次调用子程序,有几个连续的地址就调用几次。
模拟量输入地址的起始与模拟量的数量在步骤4中使用。
步骤2:创建三个数据块DB3621、DB3622、DB3627(这3个数据块编号在具体的项目中可以修改),DB3621存放模拟量浮点数输出,这个数据块存放的数据就是转换完的模拟量数据,DB3622存放模拟量的高量程、DB3627存放模拟量的低量程,根据项目不同,数据块采用不同的数据块格式可以简化操作,以下介绍什么情况采用哪种数据块数据格式。
数据块数据格式1 ,这个数据格式采用数组结构,这种数据块创建与修改数据块大小十分容易,但是在STEP 7中不容易手动修改单个的值,这种格式适合存放模拟量浮点数输出,如果模拟量的低量程基本上全部是0,只有个别数据不为0,也用这个格式。
组态王与单片机协议1.通信口设置:通信方式:RS-232,RS-485,RS-422都可。
波特率:由单片机决定。
字节数据格式:起始位、数据位、停止位均由单片机决定。
2.设备地址设置格式:##.#(前面的两个字符是设备地址,范围为0-255;后面的一个字符是用户设定是不是打包,“0”为不打包、“1”为打包。
)3.寄放器设置4.格式:读写格式(除字头外所有字节均为ASCII码)说明;字头:1字节,40H设备地址: 2字节,0—255(即0---0x0ffH)标志:1字节,bit0~bit7,bit0= 0:读,bit0= 1:写。
Bit1= 0:不打包,bit3bit2 = 00,数据类型为字节。
bit3bit2 = 01,数据类型为字。
bit3bit2 = 1x,数据类型为浮点数。
数据地址: 2字节,0x0000~0xffff数据字节数:1字节,1—100,实际读写的数据的字节数。
数据…:为实际的数据CR:0x0d。
5.上位机发送读命令下位机应答:假设正常:假设不正常:例:读12号仪表,数据地址为15的数据。
其中数据为255,数据类型为字节,不打包。
所发数据为:假设正确:假设不正确:4.上位机发送写命令下位机应答:假设正常:假设不正常:例:写12号仪表,数据地址为15。
其中数据为255,数据类型为字节,不打包。
所发数据为:假设正确:假设不正确:6.浮点数格式:4字节浮点数 = 第一字节高4位ASCII 码+第一字节低4位ASCII 码+第二字节高4位ASCII 码+第二字节低4位ASCII 码 +第三字节高4位ASCII 码+第三字节低4位ASCII 码 +第四字节高4位ASCII 码+第四字节低4位ASCII 码第1字节低4位 第2字节低4位第3字节低4位 第4字节低4位第1字节高4位 第2字节高4位 第3字节高4位 第4字节高4位★ 四字节浮点数格式:(1)第一字节 (2)第二字节 (3)第三字节 (4)第四字节注:数符=0——正,数符=1——负D7 D6 D5 ~ D0★ 数符:1位阶符:1位 阶码:6位例:流量积算操纵仪表瞬时流量测量值数据= 转换成浮点数:=27=0716+C816+6616+6616=30ASCII +37ASCII +43ASCII +38ASCII +36ASCII +36ASCII +36ASCII +36ASCII 小数部份:256=256=256=10进制:第一字节 第二字节 第三字节 第四字节十六进制: ASCII 码: 第一字节 第二字节 第三字节 第四字节传输格式如下:第1字节低4位 第2字节低4位 第3字节低4位 第4字节低4位 数 符 阶 符 阶 码小 数 部 分 小 数 部 分 小 数 部 分0 0 7200 102 10230 3742( C )、38(8) 36(6)、36(6) 36(6)、36(6)0 0 7 C8 66 66小数部分乘以256整数部份为第二字节(200)第二字节小数部分乘以256整数部份为第三字节(102)第三字节小数部分乘以256整数部份为第四字节(102)第1字节高4位第2字节高4位第3字节高4位第4字节高4位3、注:仪表内部数据为十六进制表示的十进制数。
定时器Timer实时修改时间间隔(周期)1.定时器Timer当时间间隔(周期)变化时,实时去修改我项目中主要是实现在某个时间段上午8:00-12:00,下午2:00(pm_start)-19:00(pm_end),每隔3分钟(pm_time)(可以手动设置)自动上传当前的位置(google的定位)// 执行定时任务privateboolean bool= true;// true表示服务器与本地数据相同,false表示服务器与本地数据不相同privatevoid start_schedule_pm() {final Timer timer = new Timer();timerTask = new TimerTask() {@Overridepublicvoid run() {//当不相同时取消timer重新new一个timerif (!bool) {if (timer != null) {Log.e("%%%%", bool + "");timerTask.cancel();timer.cancel();start_schedule_pm();bool = true;return;}}if ((getCurrentTime() - 12) >=Double.valueOf(pm_end)) {timerTask.cancel();timer.cancel();//我的是在android service里跑的程序,所以关闭了servicestopSelf();return;}if(!AppUtils.checkNet(getApplicationContext())) {Log.d("data", "网络未连接");return;}Log.d("data", "新任务开始");if (location != null) {if ((getCurrentTime() -12) >Double.valueOf(pm_start)) {//这里需要handler来实现,否则报Can't create handler inside thread that has not called Looper.prepare()mHandler.sendEmptyMessage(1);}}mHandler.sendEmptyMessage(2);}};timer.schedule(timerTask, 0, Long.valueOf(pm_time) * 60 * 1000);}Handler mHandler = new Handler() {publicvoid handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case 1://google定位服务onLocationChanged(location);// getSqlData();//获取服务器数据并与本地数据相比较,如果不相同update本地数据库,bool=falsegetSetTime();break;case 2:locationManager.requestLocationUpdates(provider, 30 * 1000, 0,LocationService.this);break;default:break;}}};//google定位服务即获取当前的location需要implements LocationListenerlocationManager = (LocationManager)getSystemService(LOCATION_SERVICE);Criteria criteria = new Criteria();provider =locationManager.getBestProvider(criteria, true);location= locationManager.getLastKnownLocation(provider);publicvoid onLocationChanged(Location location) { // 获得当前位置的纬度latitude = location.getLatitude();// 获得当前位置的经度longitude = location.getLongitude();Log.e("经纬度分别为:",Calendar.getInstance().getTime() + "longitude="+ longitude + "latitude" + latitude);// 获取当时的时间(24小时制)SimpleDateFormatsDateFormat =new SimpleDateFormat("yyyy-MM-ddHH:mm:ss");time = sDateFormat.format(new Date()); //把数据上传到服务器isPositionAvailable();}。
IEEE 754是一种用于表示浮点数的标准,定义了浮点数的表示方法、运算规则等。
IEEE 754标准定义了32位单精度浮点数和64位双精度浮点数的表示方式。
下面分别说明 IEEE 754 标准中的整数转浮点数的过程。
IEEE 754 单精度浮点数表示单精度浮点数采用32位表示,其中包括:•1位符号位(S):0表示正数,1表示负数。
•8位指数位(E):用移码表示,偏移值为127。
•23位尾数位(M):有效位数。
IEEE 754 单精度浮点数的表示形式为:[ (-1)^S \times 2^{(E-127)} \times 1.M ]整数转单精度浮点数的步骤:1.确定符号位(S):–如果整数为正,则符号位S为0;如果整数为负,则符号位S为1。
2.将整数转为二进制形式:–将整数的绝对值转为二进制形式。
3.确定指数位(E):–计算整数的二进制表示中最高位的位置,记为(k)。
–指数位(E)的移码表示为:(E = k + 127)。
4.确定尾数位(M):–尾数位(M)为整数二进制表示中去掉最高位的部分,补足为23位。
5.组合符号位、指数位和尾数位:–将上述得到的符号位、指数位和尾数位组合起来,得到最终的单精度浮点数表示。
示例:以整数 25 转为 IEEE 754 单精度浮点数为例:1.确定符号位(S):–整数为正,所以符号位S为0。
2.将整数25转为二进制形式:–25的二进制为 (11001)。
3.确定指数位(E):–最高位的位置是4,所以 (E = 4 + 127 = 131)。
4.确定尾数位(M):–尾数位为 (1001),补足为23位。
5.组合符号位、指数位和尾数位:–得到最终的单精度浮点数表示为 (0 \ 10000011 \10010000000000000000000)。
这就是整数25转为 IEEE 754 单精度浮点数的过程。
类似的步骤可以用于双精度浮点数的表示。
整数转浮点数的关键在于确定符号位、指数位和尾数位的值,并将它们组合起来形成浮点数表示。
【S7-300】Step7如何将定时器(Timer)的剩余时间转为浮点数
在Step7中定时器(Timer)的输出参数BI、BCD,是其剩余时间的两种数据格式。
BI以整数Int格式显示,BCD以BCD格式显示。
如何将BI、BCD转为秒为单位的浮点数(Real),下面提供了思路和例程。
1 定时器(Timer)的参数说明
定时器(Timer)在编程中大量使用,有时会用到其剩余时间,例如用剩余时间进行其他运算和编程,或者在其它厂家的触摸屏上显示。
这时,需将定时器的剩余时间转为浮点数(Real),以秒为单位。
下面是调用定时器的程序截图,预设定时时间为1分钟为例。
首先,分析定时器的各参数含义,按鼠标左键点击定时器框图后按F1键会看到step7帮助信息,如下图。
由此可见输出参数BI、BCD是定时器剩余时间的两种数据格式。
BI以整数Int 格式显示,BCD以BCD格式显示。
注意,此处BCD格式即是S5Time格式,其数据结构和时基如下:
明显看出,参数BI转为秒为单位的浮点数,必须利用参数BCD的时基。
参数BCD转为秒为单位的浮点数,需调用库函数FC33(S5TI_TIM)。
2 剩余时间参数BI,转为秒为单位的浮点数(Real)
思路:参数BI -> 整数INT -> 双整数DI -> 浮点数Real -> 取参数BCD的时基-> 根据不同时基,转为秒为单位的浮点数Real。
编程如下:
3 剩余时间参数BCD,转为秒为单位的浮点数(Real)
思路:参数BCD -> 时间S5Time -> 库函数FC33(S5TI_TIM) -> 时间Time -> 双整数DI -> 浮点数Real -> 除以1000.0,转为秒为单位的浮点数Real。
编程如下:
4 结果显示
本例程中,定时器的预设定时时间为1分钟,启动定时器,截图如下。
可见,截图时定时器剩余时间为30s500ms,参数BI和BCD转为秒为单位的浮点数,均为30.5秒。