-
寄存器数值转换
2021-02-07 14:23:34寄存器的位值被重新定义后,怎么计算寄存器的值? 1、单片机的有些数据通常需要保存在寄存器中,它们是以0或1的方式存在的。 上图是一个24位的寄存器,MSB最高位是bit23,LSB最低位是bit0。 当bit23:0=0xFFFFFF...寄存器的位值被重新定义后,怎么计算寄存器的值?
1、单片机的有些数据通常需要保存在寄存器中,它们是以0或1的方式存在的。
上图是一个24位的寄存器,MSB最高位是bit23,LSB最低位是bit0。
当bit23:0=0xFFFFFF时,它对应的十进制数值为:
2、有时为了表示某种数据,有的资料会对寄存器的位值进行重新定义。见下图:
上图中,0.0 ≤寄存器的值域< 1.0
当bit23:0=0xFFFFFF时,它对应的十进制数值为:
//返回数值: 0.0<= 浮点数值 < 1.0
//dat=0x800000,则返回2^(-1)
//dat=0x400000,则返回2^(-2)
//dat=0x200000,则返回2^(-3)
//dat=0x100000,则返回2^(-4)
//dat=0x080000,则返回2^(-5)
//dat=0x040000,则返回2^(-6)
//dat=0x020000,则返回2^(-7)
//dat=0x010000,则返回2^(-8)
//dat=0x008000,则返回2^(-9)
//dat=0x004000,则返回2^(-10)
//dat=0x002000,则返回2^(-11)
//dat=0x001000,则返回2^(-12)
//dat=0x000800,则返回2^(-13)
//dat=0x000400,则返回2^(-14)
//dat=0x000200,则返回2^(-15)
//dat=0x000100,则返回2^(-16)
//dat=0x000080,则返回2^(-17)
//dat=0x000040,则返回2^(-18)
//dat=0x000020,则返回2^(-19)
//dat=0x000010,则返回2^(-20)
//dat=0x000008,则返回2^(-21)
//dat=0x000004,则返回2^(-22)
//dat=0x000002,则返回2^(-23)
//dat=0x000001,则返回2^(-24)
//dat=0x000000,则返回0
//函数功能:它和(float)dat/0x1000000是等价的
float value_commutation(u32 dat)
{
float f,tmpFloatData;
u8 i;
u32 dat_temp;
dat_temp=dat;
dat_temp = (u32)(dat_temp&0x00FFFFFF);//只有最低24位参与计算
f=0.5;//2^(-1)=0.5
tmpFloatData=0.0;
for(i = 0;i<24;i++)
{
if(dat_temp&0x800000) tmpFloatData=tmpFloatData+f;
dat_temp =(u32)( dat_temp << 1 );
f = f/2.0;
}
return tmpFloatData;
}
3、负数是以补码保存的,下面的寄存器被定义如下:
MSB最高位为符号位
当MSB=1时,该寄存器表示的是一个负数,负数是以补码保存的;负数的补码减1,就得到反码,再将反码除了最高位MSB外,其余各位取反,就得到负数的原码。
当MSB=0时,该寄存器表示的是一个正数;
-1.0 ≤ 寄存器的值 < 1.0
1) 当bit23:0=0xFFFFFF时,它对应的十进制数值是一个负数,因此
反码为:0xFFFFFF-1=0xFFFFFE
原码为:(~0xFFFFFE)|0x800000=0x000001|0x800000=0x800001
2) 当bit23:0=0x800000时,它对应的十进制数值是一个负数,因此
反码为:0x800000-1=0x7FFFFF
原码为:(~0x7FFFFF) |0x800000=0x800000|0x800000 =-0x800000=-1
负数补码的最高位为1,其余各位为0,表示该负数最小,因此这里为-1;
3) 当bit23:0=0x800001时,它对应的十进制数值是一个负数,因此
反码为:0x800001-1=0x800000
原码为:(~0x800000)|0x800000=0x7FFFFF|0x800000 =-0x7FFFFF
//返回数值: -1.0<= 浮点数值 < 1.0
//dat=0x800000,则返回-2^(0)
//dat=0x400000,则返回2^(-1)
//dat=0x200000,则返回2^(-2)
//dat=0x100000,则返回2^(-3)
//dat=0x080000,则返回2^(-4)
//dat=0x040000,则返回2^(-5)
//dat=0x020000,则返回2^(-6)
//dat=0x010000,则返回2^(-7)
//dat=0x008000,则返回2^(-8)
//dat=0x004000,则返回2^(-9)
//dat=0x002000,则返回2^(-10)
//dat=0x001000,则返回2^(-11)
//dat=0x000800,则返回2^(-12)
//dat=0x000400,则返回2^(-13)
//dat=0x000200,则返回2^(-14)
//dat=0x000100,则返回2^(-15)
//dat=0x000080,则返回2^(-16)
//dat=0x000040,则返回2^(-17)
//dat=0x000020,则返回2^(-18)
//dat=0x000010,则返回2^(-19)
//dat=0x000008,则返回2^(-20)
//dat=0x000004,则返回2^(-21)
//dat=0x000002,则返回2^(-22)
//dat=0x000001,则返回2^(-23)
//dat=0x000000,则返回0
//函数功能:它和(float)dat/0x800000在功能上是等价的
float value_commutation1(u32 dat)
{
float f,tmpFloatData;
s8 flag;
u32 dat_temp;
u8 i;
dat_temp=dat;
dat_temp = (u32)(dat_temp&0X00FFFFFF);//只有最低24位参与计算
//计算负数原码开始
flag = 1;//假定为正数
f=0.5;
if(dat&0x800000)//最高位为符号位
{
flag = -1;//设置为负数
dat_temp = dat_temp -1;//负数的补码减一得到反码
dat_temp = (u32)(~dat_temp); //除最高位外,其余位取反得到原码
dat_temp = (u32)(dat_temp&0X7FFFFF);
}
if(dat==0x800000) tmpFloatData=1.0;
else tmpFloatData=0.0;
//计算负数原码结束
for(i = 0;i<23;i++)
{
dat_temp =(u32)( dat_temp << 1 );
if(dat_temp&0x800000) tmpFloatData=tmpFloatData+f;
f = f/2.0;
}
tmpFloatData = tmpFloatData*flag;//添加正负号
return tmpFloatData;
}
-
使用keil调试STM32,定时器的CNT寄存器数值在断点读取数值不准确问题
2019-09-25 16:48:04使用keil调试STM32,定时器的CNT寄存器数值在断点读取数值不准确问题 比如定时器更新中断,在中断服务程序打下断点后,程序没有执行。但是定时器的计数器一直在计数,并不会停止,同时调试器读取数值需要一点时间,并...使用keil调试STM32,定时器的CNT寄存器数值在断点读取数值不准确问题
比如定时器更新中断,在中断服务程序打下断点后,程序没有执行。但是定时器的计数器一直在计数,并不会停止,同时调试器读取数值需要一点时间,并不是刚进入中断服务的计数0,所以最后寄存器窗口获取的数值并不是中断服务函数执行时的数值。
-
Hook_获取寄存器数值
2016-10-23 11:40:06很多分析程序的时候,我们会发现如果能读出目标程序运行到指定地址之后的寄存器数据的话,我们的工作会轻松很多。可是怎么能够读取出来呢? 要知道,寄存器的值是随着程序的运行而在不断做着改变的。 如果想要像...很多分析程序的时候,我们会发现如果能读出目标程序运行到指定地址之后的寄存器数据的话,我们的工作会轻松很多。可是怎么能够读取出来呢?
要知道,寄存器的值是随着程序的运行而在不断做着改变的。
如果想要像使用调试工具一样读出寄存器的值的话,其实有2种方法。
第一种就是做个简易的程序调试器,在指定地址上下断点,让程序获取debug异常,读取寄存器数据。
第二种就是在程序运行到指定行数的时候加上我们自己的代码,读出我们想要的东西。
这种技术叫什么呢?
我也不是很清楚,反正是hook的一种吧。
关于这种hook的技术,用处挺大的,有了这个,可以说是 哈哈,只可意会。
下篇就讲讲怎么hook获取好了。
这篇就先到这里啦
-
PLC根据寄存器数值查询MySQL/SQLServer/PostgreSQL数据库,将数据写入寄存器
2019-11-19 11:46:13案例是通过一个智能网关,实现PLC与数据库的双向通讯,根据PLC中的数值查询数据库中的数据,然后将结果返回给PLC,采用的是西门子的PLC和SQLServer数据库;数据库网关软件与手册PLC如何将数据写入SQL数据库存入多个...IGT-DSER智能网关模块,支持各种PLC、智能仪表、远程IO与数据库之间双向通讯,既可以读取设备的数据上报到SQL数据库,也可以从数据库查询数据后写入到设备;
网关安装在设备侧,随设备启动、停止,不会错过任何数据,已批量用于多种行业的智能工厂,大大提高MES等工业互联网项目的实施效率。IGT-DSER带有两种数据缓存功能:
1. 高频次采集数据缓存,打包后一次性上报到数据库;
2. 断网、服务器维护上报异常时,将数据缓存,待故障解除后重新上报到数据库本案例是通过一个IGT-DSER智能网关,实现PLC与数据库的双向通讯,根据PLC中的数值查询数据库中的数据,然后将结果返回给PLC,采用的是西门子的PLC和SQLServer数据库;数据库网关软件与手册 PLC如何将数据写入SQL数据库存入多个数据表
首先建立数据库Database,然后建立数据表Report1,表结构如下图:然后在数据表中填入数据,实现PLC根据barcode字符串查询para1和para2的值,PLC是S7-1500,数据地址对应如下:
barcode:DB6.DBB40[String], para1:DB6.DBW0[Int], para2: DB6.DBD24[Real];
然后通过网关的参数配置软件设置参数,如下图:
将参数下载到网关后重启,网关即进入工作状态,然后准备好数据表中的数据,如下图:
这样网关根据PLC的数值进行实时判断,当PLC的DB6.DBB40的字符串与数据库的barcode相等时,即将该行数据对应的para1的数据写入DB6.DBW0,将para2的数据写入DB6.DBD24。打开PLC的编程软件监控数据如下:
关于配置表与SQL语言的对应关系,可看这篇文章。 IGT-DSER智能网关同样支持其他品牌的PLC,参数设置方式相似:
◆ FX: 三菱FX系列PLC ◆ QL: 三菱Q/L系列PLC
◆ AS: 三菱A系列PLC ◆ OM: 欧姆龙全系列PLC
◆ S72S: 西门子S7-200/Smart系列PLC ◆ S734: 西门子S7-300/400系列PLC
◆ S71K: 西门子S7-1200/1500系列PLC ◆ MBS: 施耐德等Modbus兼容PLC
◆ DVP: 台达、信捷PLC ◆ NAIS: 松下全系列PLC
◆ KVS: 基恩士全系列PLC ◆ FTK: 永宏全系列PLC
◆ MSK: LS/LG全系列PLC ◆ KOY: 光洋全系列PLC
◆ ABM: AB MicroLogix系列PLC ◆ ABC: AB Compact/Control系列PLC
相关软件与手册:点击下载
-
sqlserver 字符转数值_PLC根据寄存器数值查询MySQL/SQLServer数据库,将数据到寄存器...
2020-11-29 11:17:30案例是通过一个IGT-DSER智能网关,实现PLC与数据库的双向通讯,根据PLC中的数值查询数据库中的数据,然后将结果返回给PLC,采用的是西门子的PLC和SQLServer数据库; 首先建立数据库Database,然后建立数据表Report1,... -
C# Timer 读取Modbus 寄存器数值设置
2013-06-27 15:04:29目前我可以通过button 链接到port,并且读取到寄存器数值。但是软件与PLC只链接一会就自动断开了。请问怎么可以实现一直接通,并且循环读取寄存器的值呢—— 听说要用timer...但是不太理解如何设置timer. 是应该在... -
mysql查询数据根据月份划分_PLC根据寄存器数值查询MySQL/SQLServer/PostgreSQL数据库,将数据写到寄存器...
2021-01-03 16:40:06案例是通过一个IGT-DSER智能网关,实现PLC与数据库的双向通讯,根据PLC中的数值查询数据库中的数据,然后将结果返回给PLC,采用的是西门子的PLC和SQLServer数据库; 首先建立数据库Database,然后建立数据表Report1,... -
用VB6.0模仿OD调试器单步调试和模仿CE获取寄存器数值-代码内存断点
2021-02-01 01:15:05vb真的很强大,只是坚持到最后的人不多,以上的作品我再2012年的时候就完成了。技术交流QQ 1016058890 技术交流站 www.zai996.com -
Ida动态修改android程序的内存数据和寄存器数值,绕过so文件的判断语句
2017-01-19 17:12:27另外在ida动态调试过程中,除了内存中的数据可以修改,寄存器的数据也是可以动态修改的。比如说程序执行到CMP R6, #0。本来R6的值是0,经过比较后,程序会跳转到4082A3FC这个地址。 但是如果我们在PC执行... -
发那科机器人寄存器Ar_发那科机器人应用-数值寄存器 R[]
2020-12-31 08:07:47数值寄存器R数值寄存器指令 数值寄存器指令是进行寄存器的算术运算的指令。数值寄存器用来存储某一整数值或小数值得变量(有关数值寄存器, 见 7.3 节)。标准情况下提供有 200 个数值寄存器。 R[i] =(值) R[i] =(值)... -
发那科机器人寄存器Ar_发那科机器人应用-数值寄存器 R「」
2020-12-22 21:23:15数值寄存器R数值寄存器指令数值寄存器指令是进行寄存器的算术运算的指令。数值寄存器用来存储某一整数值或小数值得变量(有关数值寄存器,见 7.3 节)。标准情况下提供有 200 个数值寄存器。R[i] =(值)R[i] =(值)指令... -
发那科机器人寄存器Ar_详解发那科机器人应用-数值寄存器 R「」
2020-12-22 21:23:13数值寄存器R数值寄存器指令数值寄存器指令是进行寄存器的算术运算的指令。数值寄存器用来存储某一整数值或小数值得变量(有关数值寄存器,见 7.3 节)。标准情况下提供有 200 个数值寄存器。R[i] =(值)R[i] =(值)指令... -
汇编:寄存器中数值清零操作
2019-02-22 16:03:33一、用bic清零 全部清零 ldr r0,=0x11111111 bic r0,#0xffffffff 第五位清零 ldr r0,=0x11111111 bic r0,#0x00f00000 -
寄存器
2021-01-07 19:19:15不同类型的CPU内部的寄存器的种类,数量以及寄存器存储的数值范围都是不同的。根据功能的不同,可以讲寄存器分为以下几类。 种类 功能 累加寄存器 存储运行的数据和运算后的数据。 标志寄存器 用于反应... -
LCD时序问题!ARM液晶显示器,在向寄存器写入数值时时序不对。
2017-07-14 02:26:41读不懂时序图,也没有给出时序数值,不清楚怎么赋值! LCD型号LTV350QV_04F04 #define VSPW 9 #define VBPD 1 #define LINEVAL 239 #define VFPD 1 #define CLKVAL 4 #define HSPW 40 #define ... -
汇编—将寄存器中的数值以二进制的形式输出
2013-05-11 22:08:35;将BX寄存器中的数值以16位二进制的形式输出到屏幕 BIN_Print -
linux的汇编学习(1)---实现打印寄存器的数值,或者打印字符串
2017-11-25 01:35:361. 一个是print_hex函数,用于实现把bx寄存器的内容以十六进制的形式显示出来 2. 一个是print_string函数,用于实现把bx寄存器所指向的字符串打印出来 直接看最终的代码实现: [org 0x7c00] ;打印字符串 mov bx... -
如何利用LabVIEW中的数值输入将数值写入到PLC的寄存器内?
2020-04-19 16:20:56有没有大神能帮忙解决一下,目前是三菱PLC的寄存器D1002,如何通过数值输入将值写入到D1002的寄存器内? -
ARM的寄存器及异常处理机制
2018-12-13 14:49:11r13(sp) //栈指针寄存器(私有寄存器),当模式切换、程序跳转时,可以存储通用寄存器数值到sp指向的内存地址 r14(lr)//链接寄存器() 当程序跳转时,用来记录程序返回地址 r15(pc)//程序计数器 读操作:... -
MODBUS RTU协议中浮点数是如何存储,读到浮点数寄存器的数值如何转换成所需的浮点数
2019-12-05 19:38:00浮点数保存的字节格式如下: 地址 +0 +1 +2 +3 内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 这里S 代表符号位,1是负,0是正 E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。...M 24位的尾数保存在23位中,只存储... -
8086cpu为什么不能将数值直接送入段寄存器
2013-07-26 18:43:39段寄存器在CPU里,数据寄存器也在CPU里,如果想向段寄存器里写入数值,必须通过数据寄存器,在CPU外部的数据无法直接送给段寄存器。具体硬件原理我也不清楚,貌似是数据总线和数据寄存器相连接,不直接和段寄存器... -
MODBUS RTU协议中浮点数是如何存储,读到浮点数寄存器的数值如何转换成所需的浮点数...
2016-02-17 09:39:00浮点数保存的字节格式如下: 地址 +0 +1 +2 +3内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 这里S 代表符号位,1是负,0是正E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。M 24位的尾数保存在23位中,只存储23位,...
-
Java CompletableFuture(2)-原理详解--TBD
-
华为1+X认证——网络系统建设与运维(初级)
-
SDL2+Opengles2.0使用,SDL_GL_SwapWindow()立即刷新问题
-
Python批处理将RGB(彩色图)转换为灰度图
-
一天学完MySQL数据库
-
lvs+nginx+keepalived
-
物联网基础篇:快速玩转MQTT
-
Huffman编码树.pdf
-
并元理论基础综述 杨义先 s_q.pdf
-
浙江大学《数据结构》上课笔记 + 数据结构实现 + 课后题题解
-
智能停车场云平台(附vue+SpringBoot前后端项目源码)
-
【ssm项目源码】智能医院管理系统.zip
-
学会提问-a1c7_8687926d588379f38df39b2d349e17f1.pdf
-
MHA 高可用 MySQL 架构与 Altas 读写分离
-
用Go语言来写区块链(一)
-
.git 目录结构
-
Unity RUST 逆向安全开发
-
天津大学803机械原理与机械设计历年考研真题汇编
-
ELF视频教程
-
基于Flink+Hudi构建企业亿级云上实时数据湖教程(PC、移动、小