STEP7中批量把模拟量输入转换为浮点数

STEP7中批量把模拟量输入转换为浮点数
STEP7中批量把模拟量输入转换为浮点数

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设置与修改,而是全部在WINCC中设置,那么模拟量的高量程的数据块也可以采用这种数据结构。

数据块数据格式2,这个数据格式是最常见格式,每条数据需要单独添加,它的优点,每数据内容直观、易修改,可以看到每条数据的注释。数据修改可以在数据块内进行,建立这种数据块,不推荐用手工添加,最好用EXEC表格导入, EXEC表格导入方法有相关的文档介绍。

创建数据块数据格式1方法:

①新建一个数据块,修改数据块名称及编号

②打开数据块,如下图,在第2行的名称栏输入SPAN(也可以是别的名字,但不能出现非法字符与汉字),在类型栏输入ARRAY[0..100],100是指数据个数,如果需要转换的模拟量为150个,则把100改为150即可。如果是建立低量程数据块,零点全部是0,

则在第2行的初始值栏输入0.0,如果第2行的初始值栏不确定也可以不填(例如DB3621模拟量浮点数输出数据块就不需要填写初始值),注释栏也可以不填,在第3行的类型列输入REAL,最后,点一下菜单中的保存,一个数据块创建完成。

创建数据块数据格式2方法:

①新建一个数据块,修改数据块名称及编号

②打开数据块,如下图,

按下图添加数据,一般来说,名称栏填位号(不能有中文),类型栏填REAL,初始值栏填需要输入量程值或者零点值,注释栏可以不填,建议填一些说明,可以方便后期维护与修改,这一栏可以用汉字说明。一般来说,使用这个数据块,推荐采用EXEC导入,XEC表格导入方法有相关的文档介绍。数据编辑完成后,点一下菜单中的保存,一个数据块创建完成。

用以上是方法创建3个数据块:DB3621、DB3622、DB3627。

步骤三:创建转换子程序

①创建一个程序,不需要带背景的数据块的,修改程序块名称及编号,例如FC3622

②打开程序块FC3622,编辑接口,接口按下图添加与修改:只有修改两个标签:IN与TEMP,分别是下面的两个图,OUT与IN_OUT不需要修改。

③在网络1粘贴以下内容,保存

L 0

T #num

//////////////////////////////////////////////////// L #DB_ADD

ITD

L L#8

*D

T LD 44

////////////////////////////////////////////

P6: NOP 0

//////////////////////////////////////////////////// L #SPAN_DB

T LW 40

OPN DB [LW 40]

L #num

L 32

*I

ITD

L LD 44

+D

T #add

L DBD [#add]

T #HI_LIM

////////////////

L #ZERO_DB

T LW 40

OPN DB [LW 40]

L DBD [#add]

T #LI_LIM

////////////////

L #num

L 16

*I

T LW 60

L #PIW

L 8

*I

L LW 60

+I

ITD

T #add_1

L PIW [#add_1]

T #SCALE_IN

///////////////////

CALL "SCALE"

IN :=#SCALE_IN

HI_LIM :=#HI_LIM

LO_LIM :=#LI_LIM

BIPOLAR:=FALSE

RET_VAL:=#RE_VAL

OUT :=#SCALE_OUT

L #AI_OUT_DB

T LW 40

OPN DB [LW 40]

L #SCALE_OUT

T DBD [#add]

////////////////////////////////////////////////////

L 1

L #num

+I

T #num

L #NU

JC P6

L #num

步骤4,在OB1中调用FC3622 如下图:

PIW是模拟量输入模块输入起始地址,就是步骤1中提到的地址,NU是需要转换数据条数(模拟量输入的个数)

SPAN_DB是模拟量的高量程数据块编号,在步骤2创建DB3622

ZERO_DB是模拟量的低量程数据块编号,在步骤2创建的DB3627 AI_OUT_DB模拟量浮点数存放的数据块编号,在步骤2创建的DB3621 DB_ADD数据块内数据的起始地址(高量程等第一个数据地址)如果模拟量输入地址不连续,可以多次调用这个子程序,第2次调用时,复制上面的程序网络,只要修改PIW、NU、DB_ADD这3个参数即可。

最后,程序下载,需要重新下载OB1,还需下载新创建的FC3622与数据块DB3621,DB3622,DB3627;全部程序下载完成后,可以打开DB3621,看看转换后的数据是是否在实时更新。

最后一个小建议,做这个项目时最好编制如下的EXEC表,方便在WINCC中建立变量。

数的定点表示和浮点表示

计算机处理的数值数据多数带有小数,小数点在计算机常有两种表示方法,一种是约定所有数值数据的小数点隐含在某一个固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。 1. 定点数表示法(fixed-point) 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。在计算机常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数,后者为定点整数。 定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据x的形式为x=x0.x1x2… xn(其中x0为符号位,x1~xn是数值的有效部分,也称为尾数,x1为最高有效位),则在计算机中的表示形式为: 一般说来,如果最末位xn= 1,前面各位都为0,则数的绝对值最小,即|x|min= 2-n。如果各位均为1,则数的绝对值最大,即|x|max=1-2-n。所以定点小数的表示围是:

2-n≤|x|≤1 -2-n 定点整数是纯整数,约定的小数点位置在有效数值部分最低位之后。若数据x的形式为x=x0x1x2…xn(其中x0为符号位,x1~xn是尾数,xn为最低有效位),则在计算机中的表示形式为: 定点整数的表示围是: 1≤|x|≤2n-1 当数据小于定点数能表示的最小值时,计算机将它们作0处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出。 计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据比例因子,还原

4到20ma模拟量转换公式

4到20ma模拟量转换公式 大家可能会非常熟悉RS232,RS485,CAN等工业上常用的总线,他们都是传输数字信号的方式。那么,我们用什么方式来传输模拟信号呢?工业上普遍需要测量各类非电物理量,例如温度、压力、速度、角度等,这些都需要转换成模拟量电信号才能传输到几百米外的控制室或显示设备上。工业上最广泛采用的是用4~20mA电流来传输模拟量。 采用电流信号的原因是不容易受干扰,因为工业现场的噪声电压的幅度可能达到数V,但是噪声的功率很弱,所以噪声电流通常小于nA 级别,因此给4-20mA传输带来的误差非常小;电流源内阻趋于无穷大,导线电阻串联在回路中不影响精度,因此在普通双绞线上可以传输数百米;由于电流源的大内阻和恒流输出,在接收端我们只需放置一个250欧姆到地的电阻就可以获得0-5V的电压,低输入阻抗的接收器的好处是nA级的输入电流噪声只产生非常微弱的电压噪声。 上限取20mA是因为防爆的要求:20mA的电流通断引起的火花能量不足以引燃瓦斯。下限没有取0mA的原因是为了能检测断线:正常工作时不会低于4mA,当传输线因故障断路,环路电流降为0。常取2mA作为断线报警值。电流型变送器将物理量转换成4~20mA电流输出,必然要有外电源为其供电。最典型的是变送器需要两根电源线,加上两根电流输出线,总共要接4根线,称之为四线制变送器。当然,

电流输出可以与电源公用一根线(公用VCC或者GND),可节省一根线,所以现在基本上将四线制变送器称之为三线制变送器。其实大家可能注意到,4-20mA电流本身就可以为变送器供电,变送器在电路中相当于一个特殊的负载,这种变送器只需外接2根线,因而被称为两线制变送器。工业电流环标准下限为4mA,因此在量程范围内,变送器通常只有24V,4mA供电(因此,在轻负载条件下高效率的DC/DC电源(TPS54331,TPS54160),低功耗的传感器和信号链产品、以及低功耗的处理器(如MSP430)对于两线制的4-20mA收发非常重要)。这使得两线制传感器的设计成为可能而又富有挑战。

单精度浮点数的转换和解析

1 单精度浮点数的转换和解析 工业现场通信经常遇到浮点数解析的问题,如果需要自己模拟数据而又不懂浮点数解析的话会很麻烦!很久以前根据modbus 报文格式分析得到的,供大家参考。 浮点数保存的字节格式如下: 地址 +0 +1 +2 +3 内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 这里 S 代表符号位,1是负,0是正 E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。 M 24位的尾数保存在23位中,只存储23位,最高位固定为1。此方法用最较少的位数实现了 较高的有效位数,提高了精度。 零是一个特定值,幂是0 尾数也是0。 浮点数-12.5作为一个十六进制数0xC1480000保存在存储区中,这个值如下: 地址 +0 +1 +2 +3 内容0xC1 0x48 0x00 0x00 浮点数和十六进制等效保存值之间的转换相当简单。下面的例子说明上面的值-12.5如何转 换。 浮点保存值不是一个直接的格式,要转换为一个浮点数,位必须按上面的浮点数保存格式表 所列的那样分开,例如: 地址 +0 +1 +2 +3 格式 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 二进制 11000001 01001000 00000000 00000000 十六进制 C1 48 00 00 从这个例子可以得到下面的信息: 符号位是1 表示一个负数 幂是二进制10000010或十进制130,130减去127是3,就是实际的幂。 尾数是后面的二进制数10010000000000000000000

32位浮点数转换为十进制

流量计计算机通过485端口以MODBUS协议把内部IEEE32位浮点数传送到DCS的数据经过研究试验,其数据格式如下 数据请求依次为:十六进制 从站地址:01;读命令:03;数据起始高位地址:0F;数据起始低位地址:A0;(0FA0=4000即地址44001);数据长度高位:00;数据长度低位:28;(0028=40即40个地址);CRC效验码:46,E2 数据应答格式: 从站地址:01;读命令反馈:03;数据长度:50;第一个地址:69;C0;48;A9;第二个地址:C5;00;48;A2;以下类推,直到最后两位CRC:E8;86 第一个地址:69;C0;48;A9是如何换算为346958的呢? 流量计发送的是IEEE标准的32位浮点数 首先要把69;C0;48;A9进行高低16位交换变成:48;A9;69;C0 变为32位二进制数:01001000 10101001 01101001 11000000 其中最高位为0,代表是正数 接下来的八位:10010001变成十进制是145,根据IEEE规范应减去127得18,这是小数点右移的位数; 剩下的23位是纯二进制小数即:0.0101001 01101001 11000000 加1后得1.0101001 01101001 11000000 小数点右移18位后得10101001 01101001 110.00000 变为十进制得346958 其它地址的32位浮点数计算方法同上 标题:《IEEE754 学习总结》 发信人:Vegeta 时间:2004-11-11,10:32 详细信息: 一:前言 二:预备知识 三:将浮点格式转换成十进制数 四:将十进制数转换成浮点格式(real*4) 附:IEEE754 Converte 1.0介绍 一:前言

1769模拟量转换成数字量的量程

前几天为量程转换犯愁,问了周围几个人,说的都不一样。换好,找到了1769模拟量模块的。我只列出了正常值的范围,超出信号值范围的变换值没有列。 IF4模块(4路模拟量输入模块) 信号类型Raw/Proportional Engineering Scale for PID ±10V±31206±1000~8192~16383 0~5V0~312060~500~16383 1~5V6243~31206 1000~50001~16383 4~20mA6241~0~2000~16383 0~20mA0~312060~2000~16383 IF8模块(8路模拟量输入模块) 信号类型Raw/Proportional Engineering ±10V±32767±10500 0~5V-27068~327670~5250 0~10V-27988~327670~10500 1~5V-32767~~5250 4~20mA-32767~0~21000 0~20mA -32767~327670~21000 OF2模块(2路模拟量输出模块) 信号类型Raw/Proportional Engineering ±10V±31207±100

0~5V0~312070~5000 0~10V0~312070~100 1~5V 6241~0~5000 4~20mA 6241~0~200 0~20Ma0~312070~200 0~16383 OF8C(8路电流模拟量输出模块) 信号类型Raw/Proportional Engineering 4~20mA-29822~0~200 0~20Ma-32767~296460~200 OF8V(8路电压模拟量输出模块) 信号类型Raw/Proportional Engineering ±10V±31207±100 0~5V-27068~299180~5000 0~10V-29788~297880~100 1~5V-25869~0~5000 Scale for PID 0~16383 0~16383 0~16383 1~16383 0~16383 0~16383

浮点转定点方法总结

浮点转定点方法总结 —孔德琦

目录 定点运算方法................................................ 错误!未定义书签。 数的定标 ............................................... 错误!未定义书签。 C语言:从浮点到定点 ................................. 错误!未定义书签。 加法.................................................... 错误!未定义书签。 乘法..................................................... 错误!未定义书签。 除法..................................................... 错误!未定义书签。 三角函数运算............................................ 错误!未定义书签。 开方运算................................................ 错误!未定义书签。 附录...................................................... 错误!未定义书签。 附录1:定点函数库...................................... 错误!未定义书签。 附录2:正弦和余弦表..................................... 错误!未定义书签。

浮点数和定点数的区别

cloudseawang 定点数与浮点数区别 最近做HDR时,经常要用NV提供的16位纹理,它的说明书16位能达到24位的精度,就很奇怪?一直搞不懂浮点数的精度怎么算的? 今天认真看了一下IEEE float point的标准,终于明白是什么了 1. 什么是浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式,比如99.00 或者00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值。由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。SQL 中的NUMBER 数据类型就是利用定点数来定义的。还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。 定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如123.45 用十进制科学计数法可以表达为1.2345 × 102 ,其中1.2345 为尾数,10 为基数,2 为指数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。 提示: 尾数有时也称为有效数字(Significand)。尾数实际上是有效数字的非正式说法。同样的数值可以有多种浮点数表达方式,比如上面例子中的123.45 可以表达为12.345 ×101,0.12345 × 103 或者1.2345 × 102。因为这种多样性,有必要对其加以规范化以达到统一表达的目标。规范的(Normalized)浮点数表达方式具有如下形式: ±d.dd...d × β e , (0 ≤ d i < β) 其中 d.dd...d 即尾数,β 为基数,e 为指数。尾数中数字的个数称为精度,在本文中用p 来表示。每个数字d 介于0 和基数之间,包括0。小数点左侧的数字不为0。 基于规范表达的浮点数对应的具体值可由下面的表达式计算而得: ±(d 0 + d 1β-1 + ... + d p-1β-(p-1))β e , (0 ≤ d i < β) 对于十进制的浮点数,即基数β 等于10 的浮点数而言,上面的表达式非常容易理解,也很直白。计算机内部的数值表达是基于二进制的。从上面的表达式,我们可以知道,二进制数同样可以有小数点,也同样具有类似于十进制的表达方式。只是此时β 等于2,而每个数字d 只能在0 和 1 之间取值。比如二进制数1001.101 相当于1 × 2 3 + 0 × 22 + 0 ×21 + 1 ×20 + 1 ×2-1 + 0 ×2-2 + 1 ×2-3,对应于十进制的9.625。其规范浮点数表达为1.001101 × 23。 2. IEEE 浮点数 计算机中是用有限的连续字节保存浮点数的。保存这些浮点数当然必须有特定的格式,Java 平台上的浮点数类型float 和double 采纳了IEEE 754 标准中所定义的单精度32 位浮点数和双精度64 位浮点数的格式。 注意: Java 平台还支持该标准定义的两种扩展格式,即float-extended-exponent 和double-extended-exponent 扩展格式。这里将不作介绍,有兴趣的读者可以参考相应的参考资料。 在IEEE 标准中,浮点数是将特定长度的连续字节的所有二进制位分割为特定宽度的符号域,指数域和尾数域三个域,其中保存的值分别用于表示给定二进制浮点数中的符号,

非标准浮点数和标准的浮点数之间的转换

地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司Microchip 公司单片机所采用的浮点数格式是IEEE-754标准的变异型。 1、变异型32位浮点数格式为::阶码E (8位),符号S (1位),尾数M (23位) 变异型32位浮点数的二进制格式为::E7,E6,E5,E4,E4,E3,E2,E1,E0,S ,M22,M21,M20,M19,M18,M17,M16,M15,M14,M13,M12,M11,M10,M9,M8,M7,M6,M5,M4,M3,M2,M1,M0共计32位值。 存储模式 :大端格式,高字节存放在低地址位置。 2、标准型32位浮点数格式为::符号S (1位),阶码E (8位),尾数M (23位) 标准型32位浮点数的二进制格式为::S ,E7,E6,E5,E4,E4,E3,E2,E1,E0,M22,M21,M20,M19,M18,M17,M16,M15,M14,M13,M12,M11,M10,M9,M8,M7,M6,M5,M4,M3,M2,M1,M0共计32位值。 存储模式 :小端格式,高字节存放在高地址位置。 #include<18f6720.h> //#include //包含头文件string.h #include //包含头文件stdlib.h union { int8 b[4]; int32 d; //b[3]和d 的高8位值相等;b[0]和d 的低8位值相等; float f; }IEEE_FLOAT_DATA; //IEEE 标准型浮点数; union { int8 b[4]; int16 c[2]; int32 d; //b[3]和d 的高8位值相等;b[0]和d 的低8位值相等; float f; }IEEE_aberrance_FLOAT_DATA; //IEEE 变异型浮点数; //函数功能:将x 中的IEEE-754标准的浮点数转换为IEEE-754标准的变异型浮点数 //输入参数IEEE_FLOAT_DATA.d 中是标准型浮点数;IEEE_FLOAT_DATA.d=0xC148000 //输出参数:IEEE_FLOAT_DATA.f 存放为变异型浮点数据;IEEE_FLOAT_DATA.d 为变异型浮点数的16进制数据; void convert_IEEE_FLOAT_DATA_to_IEEE_aberrance_FLOAT_DATA() { //IEEE_FLOAT_DATA.d=x; int1 bit_value; int8 temp; if( bit_test(IEEE_FLOAT_DATA.b[2],7) ) bit_value=1; //获取阶码E0上的值; else bit_value=0; bit_value=shift_left(&IEEE_FLOAT_DATA.b[3],1,bit_value); //左移1位,将E0上的值移入,获取符号值S ; if(bit_value) bit_set(IEEE_FLOAT_DATA.b[2],7); //修改符号值S else bit_clear(IEEE_FLOAT_DATA.b[2],7); //修改符号值S ////////////////////////存储模式 ////////////

数的定点表示和浮点表示

计算机处理的数值数据多数带有小数,小数点在计算机中通常有两种表示方法,一种是约定所有数值数据的小数点隐含在某一个固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。 1. 定点数表示法(fixed-point) 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。在计算机中通常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数,后者为定点整数。 定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据x的形式为x=x0.x1x2… xn(其中x0为符号位,x1~xn是数值的有效部分,也称为尾数,x1为最高有效位),则在计算机中的表示形式为: 一般说来,如果最末位xn= 1,前面各位都为0,则数的绝对值最小,即|x|min= 2-n。如果各位均为1,则数的绝对值最大,即|x|max=1-2-n。所以定点小数的表示范围是:

2-n≤|x|≤1 -2-n 定点整数是纯整数,约定的小数点位置在有效数值部分最低位之后。若数据x的形式为x=x0x1x2…xn(其中x0为符号位,x1~xn是尾数,xn为最低有效位),则在计算机中的表示形式为: 定点整数的表示范围是: 1≤|x|≤2n-1 当数据小于定点数能表示的最小值时,计算机将它们作0处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出。 计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据比例因子,还原

十进制数和单精度浮点数的相互转换

将十进制数转换成浮点格式(real*4) [例1]: 十进制26.0转换成二进制 11010.0 规格化二进制数 1.10100*2^4 计算指数 4+127=131 符号位指数部分尾数部分 0 10000011 10100000000000000000000 以单精度(real*4)浮点格式存储该数0100 0001 1101 0000 0000 0000 0000 0000 0x41D0 0000 [例2]: 0.75 十进制0.75转换成二进制 0.11 规格化二进制数 1.1*2^-1 计算指数 -1+127=126 符号位指数部分尾数部分 0 01111110 10000000000000000000000 以单精度(real*4)浮点格式存储该数0011 1111 0100 0000 0000 0000 0000 0000 0x3F40 0000 [例3]: -2.5 十进制-2.5转换成二进制 -10.1 规格化二进制数 -1.01*2^1 计算指数 1+127=128 符号位指数部分尾数部分 1 10000000 01000000000000000000000 以单精度(real*4)浮点格式存储该数1100 0000 0010 0000 0000 0000 0000 0000 0xC020 0000

将浮点格式转换成十进制数 [例1]: 0x00280000(real*4) 转换成二进制 00000000001010000000000000000000 符号位指数部分(8位)尾数部分 0 00000000 01010000000000000000000 符号位=0;因指数部分=0,则:尾数部分M为m: 0.01010000000000000000000=0.3125 该浮点数的十进制为: (-1)^0*2^(-126)*0.3125 =3.6734198463196484624023016788195e-39 [例2]: 0xC04E000000000000(real*8) 转换成二进制1100000001001110000000000000000000000000000000000000000000000000 符号位指数部分(11位)尾数部分 1 10000000100 1110000000000000000000000000000000000000000000000000 符号位=1;指数=1028,因指数部分不为全'0'且不为全'1',则:尾数部分M为1+m:1.1110000000000000000000000000000000000000000000000000=1.875 该浮点数的十进制为: (-1)^1*2^(1028-1023)*1.875 =-60

plc模拟量转换标度变换数字量公式以及西门子变换写法

PlC模拟量标度转化原理 信号的变换需要经过以下过程:物理量-传感器信号-标准电信号-A/D转换-数值显示。声明:为简单起见,我们在此讨论的是线性的信号变换。同时略过传感器的信号变换过程。 假定物理量为A,范围即为A0-Am,实时物理量为X;标准电信号是B0-Bm,实时电信号为Y;A/D转换数值为C0-Cm,实时数值为Z。 如此,B0对应于A0,Bm对应于Am,Y对应于X,及Y=f(X)。由于是线性关系,得出方程式为Y=(Bm-B0)*(X-A0)/(Am-A0)+B0。又由于是线性关系,经过A/D转换后的数学方程Z=f(X)可以表示为Z=(Cm-C0)*(X-A0)/(Am-A0)+C0。那么就很容易得出逆变换的数学方程为X=(Am-A0)*(Z-C0)/(Cm-C0)+A0。方程中计算出来的X就可以在显示器上直接表达为被检测的物理量。 5、PLC中逆变换的计算方法 以S7-200和4-20mA为例,经A/D转换后,我们得到的数值是6400-32000,及C0=6400,Cm=32000 。于是,X=(Am-A0)*(Z-6400)/(32000-6400)+A0。 例如某温度传感器和变送器检测的是-10-60℃,用上述的方程表达为X=70*(Z-6400)/25600-10。经过PLC的数学运算指令计算后,HMI可以从结果寄存器中读取并直接显示为工程量。 用同样的原理,我们可以在HMI上输入工程量,然后由软件转换成控制系统使用的标准化数值。 在S7-200中,(Z-6400)/25600的计算结果是非常重要的数值。这是一个0-1.0(100%)的实数,可以直接送到PID指令(不是指令向导)的检测值输入端。PID指令输出的也是0-1.0的实数,通过前面的计算式的反计算,可以转换成6400-32000,送到D/A端口变成4-20mA输出。 1.自己写转换程序。 2.需要注意你的模拟量是单极性的还是双极性的。 函数关系A=f(D)可以表示为数学方程: A=(D-D0)×(Am-A0)/(Dm-D0)+A0。 根据该方程式,可以方便地根据D值计算出A值。将该方程式逆变换,得出函数关系D=f (A)可以表示为数学方程: D=(A-A0)×(Dm-D0)/(Am-A0)+D0。 具体举一个实例,以S7-200和4—20mA为例,经A/D转换后,我们得到的数值是6400—32000,即A0=4,Am=20,D0=6400,Dm=32000,代入公式,得出: A=(D-6400)×(20-4)/(32000-6400)+4

编写一个程序,将用小数表示的浮点数,转换成科学计数法的形式输出.输入的数据没有

不知道你问什么语言 Java:浮点数输出,不显示成科学计数法 BigDecimal bg=new BigDecimal("3.456785E-8"); System.out.println(bg.toPlainString()); C: public abstract class ScienceCount { public static string KXJSF(double num) { double bef = System.Math.Abs(num); int aft = 0; while (bef >= 10 || (bef < 1 && bef != 0)) { if (bef >= 10) { bef=bef/10; aft++; } else { bef=bef*10; aft--; } } Return string.Concat(num >=0 ?"" :"-",ReturnBef(bef),"E",ReturnAft(aft)); } ///

/// 有效数字的处理 /// /// 有效数字 /// 三位有效数字,不足则补零 public static string ReturnBef(double bef) {

if (bef.ToString() != null) { char[] arr = bef.ToString().ToCharArray(); switch (arr.Length) { case 1: case 2: return string.Concat(arr[0], ".", "00"); break; case 3: return string.Concat(arr[0] + "." + arr[2] + "0"); break; default: return string.Concat(arr[0] + "." + arr[2] + arr[3]); break; } } else { return "000"; } } ///

/// 幂的处理 /// /// 幂数 /// 三位幂数部分,不足则补零 public static string ReturnAft(int aft) { if (aft.ToString() != null) { string end; char[] arr = System.Math.Abs(aft).ToString().ToCharArray(); switch (arr.Length) { case 1: end = "00" + arr[0];

第7章DSP定点数和浮点数(重要)

第7章D S P定点数和浮点数(重要) 本期教程主要跟大家讲解一下定点数和浮点数的基础知识,了解这些基础知识对于后面学习ARM官方的DSP库大有裨益。特别是初学的一定要理解这些基础知识。 7.1 定点数和浮点数概念 7.2 IEEE浮点数 7.3 定点数运算 7.4总结 7.1定点数和浮点数概念 如果小数点的位置事先已有约定,不再改变,此类数称为“定点数”。相比之下,如果小数点的位置可变,则称为“浮点数”(定点数的本质是小数,整数只是其表现形式)。 7.1.1定点数 常用的定点数有两种表示形式:如果小数点位置约定在最低数值位的后面,则该数只能是定点整数;如果小数点位置约定在最高数值位的前面,则该数只能是定点小数。 7.1.2浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式,比如 99.00 或者 00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值。由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。SQL 中的 NUMBER 数据类型就是利用定点数来定义的。还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。 定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如 123.45 用十进制科学计数法可以表达为 1.2345 × 102,其中 1.2345 为尾数,10 为基数,2 为指数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。 提示: 尾数有时也称为有效数字(Significand)。尾数实际上是有效数字的非正式说法。

浮点数转换为字符串

串口通讯中传递的数据格式不外两种:ASCII码(即可见字符形式)和二进制数据格式(对应Modbus协议中有ASCII模式和RTU模式)。最初的想法是把浮点数的各位分别提取出来,保存成一个各元素都是ASCII码的数组,然后通过串口发送出去,对方接收到这个数组后再相应地组合成原来的浮点数。这是以前写过的一段代码: //################################################################ // 函数名:void Float2Char(float Value,char *array) // 描述:将浮点数的各个位的数值转换成字符串,通过串口发送至上位机显示 // 参数:float Value为欲转换的正数浮点数值,转换结果保存在字符数组*array里 //################################################################ void Float2Char(float Value,char *array) { Uint16 IntegerPart; float DecimalPart; Uint16 i = 0; Uint16 j = 0; char temp; //分离整数部分与小数部分: //整数部分保存在IntegerPart中 //小数部分保存在DecimalPart中 if (Value>=1) { IntegerPart = (Uint16)Value; DecimalPart = Value-IntegerPart; } else { IntegerPart = 0; DecimalPart = Value-IntegerPart; } //转换整数部分 if (IntegerPart == 0) { array[0] = 0+48; array[1] = '.'; i = 1; } else { while(IntegerPart>0) {

关于浮点数与定点数的理解

定点数与浮点数 计算机处理的数值数据多数带有小数,小数点在计算机中通常有两种表示方法,一种是约定所有数值数据的小数点隐含在某一个固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。 1. 定点数表示法(fixed-point) 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。在计算机中通常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数,后者为定点整数。 定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据x 的形式为x = x0.x1x2…x n( 其中x0为符号位,x1~x n是数值的有效部分,也称为尾数,x1为最高有效位),则在计算机中的表示形式为: 一般说来,如果最末位x n = 1,前面各位都为0 ,则数的绝对值最小,即|x|mi n = 2-n。如果各位均为1,则数的绝对值最大,即|x|ma x =1-2-n 。所以定点小数的表示范围是: 2- n ≤ | x| ≤ 1 - 2- n 定点整数是纯整数,约定的小数点位置在有效数值部分最低位之后。若数据x 的形式为x = x0x1x2…x n ( 其中x0为符号位,x1~x n是尾数,x n为最低有效位),则在计算机中的表示形式为:

定点整数的表示范围是: 1≤ | x| ≤ 2n - 1 当数据小于定点数能表示的最小值时,计算机将它们作0处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出。 计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据比例因子,还原成实际数值。若比例因子选择不当,往往会使运算结果产生溢出或降低数据的有效精度。 用定点数进行运算处理的计算机被称为定点机。 2. 浮点数表示法(floating-point number) 4与科学计数法相似,任意一个J进制数N,总可以写成 N = J E × M 式中M称为数N 的尾数(mantissa),是一个纯小数;E为数N 的阶码(e x ponent),是一个整数,J称为比例因子J E的底数。这种表示方法相当于数的小数点位置随比例因子的不同而在一定范围内可以自由浮动,所以称为浮点表示法。 底数是事先约定好的(常取2),在计算机中不出现。在机器中表示一个浮点数时,一是要给出尾数,用定点小数形式表示。尾数部分给出有效数字的位数,因而决定了浮点数的表示精度。二是要给出阶码,用整数形式表示,阶码指明

200 PLC模拟量的AD和DA转换

S7-200 PLC模拟量的A/D和D/A转换以及编程的探讨 对于初学PLC编程的人来说,模拟量输入、输出模块的编程要比用位变量进行一般的程序控制难的多,因为它不仅仅是程序编程,而且还涉及到模拟量的转换公式推导与使用的问题。因为A/D、D/A转换之间的对应关系,S7-200 CPU内部用数值表示外部的模拟量信号,两者之间有一定的数学关系。这个关系就是模拟量/数字量的换算关系。 例如,当输入模拟量设定为电流信号的输入,在S7-200 CPU内部,电流信号0-20mA对应于数值范围0-32000;但是对于4-20mA的信号,对应的内部数值为6400-32000。那可能有学员不知道这个6400是怎么算来的?其实这里的数字量和电流是成正比的,只需要按比例去算就可以了。因为电流信号0-20mA对应于数值范围0-32000,那么1mA 对应的数字量就是32000/20=1600,而4mA对应的数字量就等于4*1600,等于6400。(这里是以S7-200 PLC来作为举例,对于S7-200 SMART S7-300 400等等PLC也是同理的,只是对应的数字量不同而已) 不同的传感变送器,通过不同的模拟量输入输出模块进行转换,其转换公式是不一样的,如果选用的转换公式不对,编出的程序肯定是错误的。比如有3个温度传感变送器:(1)、测温范围为0~200 ,变送器输出信号为4~20ma (2)、测温范围为0~200 ,变送器输出信号为0~5V (3)、测温范围为-100 ~500 ,变送器输出信号为4~20ma (1)和(2)二个温度传感变送器,测温范围一样,但输出信号不同,(1)和(3)传感变送器输出信号一样,但测温范围不同,这3个传感变送器既使选用相同的模拟量输入模块,其转换公式也是各不相同。 下面选用S7-200的模拟量输入输出模块EM235的参数为依据对上述的3个温度传感器进行转换公式的推导: 对于(1)和(3)传感变送器所用的模块,其模拟量输入设置为0~20ma电流信号,20ma 对应数子量=32000,4 ma对应数字量=6400; 对于(2)传感变送器用的模块,其模拟量输入设置为0~5V电压信号,5V对应数字量=32000,0V对应数字量=0; 这3种传感変送器的转换公式该如何推导的呢?这要借助与数学知识帮助,请看下图:

二进制与十进制整数,浮点数相互转换

二进制与十进制整数,浮点数相互转换 2011-07-01 8:53 整数转化为二进制 1.正整数用源码表示 2.负整数用绝对值的补码表示(将绝对值取反+1) 如-50用50的补码表示 50的源码为 00000000000000000000000000110010 反码则为 11111111111111111111111111001101 补码为反码+1 11111111111111111111111111001110 二进制转化为整数 1.如果符号位为0,表示为正,直接将二进制数据翻译即可 2.如果符号位为1,表示为负,将数据-1取反.或者(取反+1) 如: 11111111111111111111111111001110 -1: 11111111111111111111111111001101 取反: 00000000000000000000000000110010 源码: 11111111111111111111111111001110 取反: 00000000000000000000000000110001 +1: 00000000000000000000000000110010 浮点型转化为二进制 将整数转化为二进制,去掉首位1,小数转化为二进制,整数去1后二进制位数+127转化为二进制,然后根据浮点型正负在最前面加上符号位。 如:-40.125 整数为101000,去掉首位1则为01000,小数为001,则整数位数为5,+127=132(10000100),加上符号位1,则二进制数据为 100 0010 0 整数: 1010 00 去掉首位1: 010 00 加上前八位表示小数点位置: 100 0010 0010 0000 1 加上小数位: 100 0010 0010 0000 1000 0000 0000 0000 加上符号位: 1100 0010 0010 0000 1000 0000 0000 0000 二进制转化为浮点型 去掉首位符号位,取前八位-127然后将剩余的二进制数据小数点后移所得值,首位+1,小数点之前位整数,之后为小数,由符号位判断正负。 如:正数: 0100 0011 0100 0100 0100 0110 1111 1100 去掉符号位: 100 0011 0100 0100 0100 0110 1111 1100 前八位 100 0011 0=134 -124 =7; 整数: 100 0100 首位+1 1100 0100=196 小数: 0100 0110 1111 1100 小数依次乘1/2,1/4,1/8,1/16....= 1/2*0+1/4*1+1/8*0+1/16*0+1/32*0+1/64*1......最后得出保留四位小数的话是196.2769 负数:

模拟量转换数字量公式

信号的变换需要经过以下过程:物理量-传感器信号-标准电信号-A/D转换-数值显示。 声明:为简单起见,我们在此讨论的是线性的信号变换。同时略过传感器的信号变换过程。 假定物理量为A,范围即为A0-Am,实时物理量为X;标准电信号是B0-Bm,实时电信号为Y;A/D转换数值为C0-Cm,实时数值为Z。 如此,B0对应于A0,Bm对应于Am,Y对应于X,及Y=f(X)。由于是线性关系,得出方程式为Y=(Bm-B0)*(X-A0)/(Am-A0)+B0。又由于是线性关系,经过A/D转换后的数学方程Z=f(X)可以表示为Z=(Cm-C0)*(X-A0)/(Am-A0)+C0。那么就很容易得出逆变换的数学方程为X=(Am-A0)*(Z-C0)/(Cm-C0)+A0。方程中计算出来的X就可以在显示器上直接表达为被检测的物理量。 5、PLC中逆变换的计算方法 以S7-200和4-20mA为例,经A/D转换后,我们得到的数值是6400-32000,及C0=6400,Cm=32000 。于是,X=(Am-A0)*(Z-6400)/(32000-6400)+A0。 例如某温度传感器和变送器检测的是-10-60℃,用上述的方程表达为X=70*(Z-6400)/25600-10。经过PLC的数学运算指令计算后,HMI可以从结果寄存器中读取并直接显示为工程量。 用同样的原理,我们可以在HMI上输入工程量,然后由软件转换成控制系统使用的标准化数值。 在S7-200中,(Z-6400)/25600的计算结果是非常重要的数值。这是一个0-1.0(100%)的实数,可以直接送到PID指令(不是指令向导)的检测值输入端。PID指令输出的也是0-1.0的实数,通过前面的计算式的反计算,可以转换成6400-32000,送到D/A端口变成4-20mA输出。 1.自己写转换程序。 2.需要注意你的模拟量是单极性的还是双极性的。 函数关系A=f(D)可以表示为数学方程: A=(D-D0)×(Am-A0)/(Dm-D0)+A0。 根据该方程式,可以方便地根据D值计算出A值。将该方程式逆变换,得出函数关系D=f (A)可以表示为数学方程: D=(A-A0)×(Dm-D0)/(Am-A0)+D0。

S7―200PLC双精度浮点数转换为整形-最新资料

S7―200PLC双精度浮点数转换为整形 现场总线技术是物联网核心技术之一,在物联网广为推行的今天被应用得更是淋漓尽致。小型PLC为核心的小型测控终端拥有标准化构架、高可靠性、易于修改调整的控制编程、智能化、强大控制能力和现场总线通讯能力,使PLC系统构架更加灵活,被应用在很多工业分布集散型控制系统,如车间数台大型设备的分控、无人值守泵房的监控、城域管网系统的智能调控节点。这些小型系统不仅集成了对现场设备工艺控制保护逻辑,还通过通讯总线无损读取流量计、智能电能仪表等现场仪表测量值和累计值,避免积算误差和线路干扰以及模拟采集精度误差,确保采集值与仪表读数的一致性。 内存空间较小、运算能力相对较弱是小型PLC的主要缺点,目前多数PLC缺少对双精度浮点数支持,而不少仪表的数据采用双精度浮点数格式存储,这就导致通讯采集的仪表数据不能进一步处理并用于工艺保护控制。作者根据双精度浮点数定义,结合小型PLC指令特点,针对Siemens-S7200系列这类没有双精度浮点数指令的PLC,深入探讨在其中实现双精度数据便捷处理的方法。本文仅以双精度数据取整转化为长整形数为例,其它诸如双精度转换成单精度等均可如法炮制。 现场总线,因为通讯信息无损,不需要考虑通道两端转换误差,正越来越多地被应用到各种现代控制检测系统。尤其是针对

诸如流量计等具有累计信息的仪表,原始依靠瞬时量积算或脉冲亮积算方法往往会因PLC停电等原因导致PLC累计值与仪表读数不一致,通过总线的无损传输完全克服了读数不一致,无疑给管理带来极大方便,用户不必再抄录现场仪表读数。通常PLC是第一接收来自仪表、智能控制器等总线数据的控制单元,甚至还需要PLC直接处理后用于现场人机界面显示或远程传输。 S7-200内部数据处理指令只能直接处理单精度浮点数。双精度浮点采用64位数据存储。流量计等仪表通常采用双精度浮点数直接积算出累计信息,因此其累计信息也通常采用双精度浮点数存储,但实际管理中,针对累计信息,一般只看整数部分,而仪表累计信息整数部分通常最多只显示9位或10位整数位。比如流量计累计流量,管理部门通常只关心多少吨液体或多少标立方气体,小于1吨或1立方的数据往往被忽略。因此为便于管理,需要在S7-200PLC中直接将双精度浮点数转化为整形字。PLC 中只有双长整形数能达到10位整数位,有符号双长字整形数可以表达-2147483648~2147483647。因此可以将双精度浮点数转换为双长字即能满足日常生产管理需要。 图一直接整数截取法适用于指数不大于30,最大截取误差为±1。如果再根据截取后第一小数位判断即可实现四舍五入,使最大截取误差变为±0.5。从图二S7-200指令实现可以看出,由于没有使用单精度计算,避免了单精度计算导致数据丢失,从而提高了转换精度,确保整数位与仪表读数一致性。

相关文档
最新文档