DB块调用问题
python读取S7-1200DB块

python读取S7-1200DB块python读取S7-1200 DB块读DB区使⽤的⽅法依旧是read_aread ef re ad_area(sel f, ar ea, d bn um be r, st ar t,size)area是PLC内各寄存区的代码,具体参考下表dbnumber是DB块编号,可以在DB块属性中常规选项中查看到,start为寄存区起始地址,size是DB块完整的长度,因为DB块中可以有各种数据类型,所以长度参数⼀定要准确,否则返回数据会出现问题。
要访问DB块,必须取消DB块属性中的优化的块访问选项针对的是DB块,所有area参数需要使⽤0x84,size参数需要通过DB块内的数据数量和数据类型具体计算出来因为read_area⽅法返回的是byteArray类型的结果,可以通过get_bool,get_int,get_read,get_dword⽅法直接将byteArray 类型转换成对应的数据类型⽐如针对get_bool⽅法d ef ge t_bool(_byt earray, byte_ind e x, b oo l_in de x)第⼀个bytearray参数是read_area的返回值,byte_index参数是DB块中变量的偏移量,bool_index参数是位变量的地址。
先来看⼀个简单的例⼦,DB块中有两个变量,⼀个浮点数,⼀个布尔量main函数中的代码如下d ef ma in():s71200 = snap7.client.Client()c onnect(s71200, '192.168.2.110',0,1) whil e T r ue:tr y:d at a =s71200.r ea d_ar ea(0x84, 1,0,5)#此处5代表D B块中数据长度,浮点数4个b yte,布尔量⼀个by t ep ri nt(da ta)v al ue= get_r ea l(da ta, 0)#此处0是浮点数的偏移量v al ue2 =ge t_bo ol(d at a, 4,0)#此处4是布尔量的偏移量p ri nt(va lu e, v al ue2)s le ep(5)ex cep t Snap7Exception as e:c on ne c t(s71200, '192.168.2.110',0,1)if__name__ =='__ma in__':m ain()运⾏后如下但是这样操作很⿇烦,需要提前计算好DB块中的数据长度,需要将每个数据的偏移量和数据类型都填好,这⾥希望有⼀个简单的⽅法,定义好DB块的数据名称,数据类型,数据偏移量,之后运⾏程序后,⾃动计算长度,对应数据类型和偏移量,从⽽获取正确的结果。
step7同时打开DB、DI数据块时的编程问题

step7同时打开DB、DI数据块时的编程问题尝试使用STL编写一个FB,遇到如下问题,请看一下,代码如下:net1:A#device_autoA#device_ready=#allowed_in_queuenet2:L#qu1_dbT#qu1_dbtmpOPNDB[#qu1_dbtmp]L#qu2_db(**)T#qu2_dbtmp(**)OPNDI[#qu2_dbtmp](**)net3:A#allowed_in_queueFP#fp1A#device_autoA#device_readyJNB_001CALL”ATT”DATA:=#device_numTABLE:=DIW0_001:NOP0问题现象描述:在用PLCSIM模拟程序时,我将#device_auto和#device_ready对应的外部管脚置一,监控FB,net1中的#device_auto和#device_ready信号为绿色接通,但是net3中的#device_auto和#device_ready信号为虚线断开,同时FC84的入列程序也无法实现,我将带有(**)标注的程序使用//屏蔽掉,重新下载监控,问题现象有消失,该接通的接通,不存在同一变量上边接通,下边断开等问题现象。
请问:1·对于同时打开两个DB块,我上边写的程序在哪里使用错误?2·在使用打开两个DB时,应该注意哪些呢?图片说明:1,未命名2,问题图片13,问题图片24,问题图片3最佳答案在FB中使用了AR2和DI寄存器来访问接口参数,在FB改变这两个会引起混乱,不推荐在FB里使用DI寄存器和AR2地址寄存器,一般需要打开两个数据块的操作都放在FC里来做。
DB块的内容说明及常用信号和功能块及功能说明

DB块的内容说明:DB1 西门子保留DB2~DB4 PLC messagesDB5~DB8 basic programDB9 NC compile NC编译循环接口DB10 NCK interface 中央NC接口DB11 mode group interface 方式组接口DB18 SPL接口(安全集成)DB19 PCU接口DB20 PLC机床数据DB21~DB30 NC channel interface NC通道接口DB31~DB61 interface for axis/spindles 轴/主轴号1到31预留接口DB71~DB74 tool management 用户刀具管理DB75~DB76 M 功能代码PLC到MMC的信号:DB 19 DBX 0.0 screen brightDB 19 DBX 0.1 screen darkeningDB 19 DBX 0.2 key disableDB 19 DBX 0.3 清除通道报警DB 19 DBX 0.7 机床坐标或工件坐标DB 19 DBX 0.7=1 工件坐标DB 19 DBX 0.7=0 机床坐标MMC到PLC的信号:DB 19 DBX 20.3 报警已清除NCK 与PLC之间的信号传递DB2~~PLC 信息DB10 ~NCK信息PLC给NCK的信号DB 10 DBX 56.1 急停信号MMC给PLC的信号DB10 DBX 103.6 MMC过热DB10 DBX 103.7 电池报警NCK给PLC的信号DB10 DBX 104.7 NCK CPU readyDB10 DBX 108.7 NC readyDB10 DBX 108.6 drive readyDB10 DBX 106.7 急停信号DB10 DBX 109.0 NCK报警存在DB10 DBX 109.5 NCK过热DB10 DBX 109.6 NCU温度过高DB10 DBX 109.7 电池报警DB 11~ DB 14 方式组信号PLC给NCK的信号:DB11DBX0.0 AUTODB 11 DBX 0.1 MDADB 11 DBX 0.2 JOGDB 11 DBX 0.4 方式组切换禁止DB 11 DBX 0.5 方式组停止,进给轴。
DB块内容说明常用信号和功能块功能说明

DB块的内容说明:DB1 西门子保留DB2~DB4 PLC messagesDB5~DB8 basic programDB9 NC compile NC编译循环接口DB10 NCK interface 中央NC接口DB11 mode group interface 方式组接口DB18 SPL接口(安全集成)DB19 PCU接口DB20 PLC机床数据DB21~DB30 NC channel interface NC通道接口DB31~DB61 interface for axis/spindles 轴/主轴号1到31预留接口DB71~DB74 tool management 用户刀具管理DB75~DB76 M 功能代码PLC到MMC的信号:DB 19 DBX 0.0 screen brightDB 19 DBX 0.1 screen darkeningDB 19 DBX 0.2 key disableDB 19 DBX 0.3 清除通道报警DB 19 DBX 0.7 机床坐标或工件坐标DB 19 DBX 0.7=1 工件坐标DB 19 DBX 0.7=0 机床坐标MMC到PLC的信号:DB 19 DBX 20.3 报警已清除NCK 与PLC之间的信号传递DB2~~PLC 信息DB10 ~NCK信息PLC给NCK的信号DB 10 DBX 56.1 急停信号MMC给PLC的信号DB10 DBX 103.6 MMC过热DB10 DBX 103.7 电池报警NCK给PLC的信号DB10 DBX 104.7 NCK CPU readyDB10 DBX 108.7 NC readyDB10 DBX 108.6 drive readyDB10 DBX 106.7 急停信号DB10 DBX 109.0 NCK报警存在DB10 DBX 109.5 NCK过热DB10 DBX 109.6 NCU温度过高DB10 DBX 109.7 电池报警DB 11~ DB 14 方式组信号PLC给NCK的信号:DB11DBX0.0 AUTODB 11 DBX 0.1 MDADB 11 DBX 0.2 JOGDB 11 DBX 0.4 方式组切换禁止DB 11 DBX 0.5 方式组停止,进给轴。
fc块调用db块 db不能当输出

fc块调用db块db不能当输出
用fc做了个程序块,在ob1中调用他在输出(out)的引脚中用了个db块
当我调用第二次fc输出也用db块。
在测试当中只测试第一个fc时db置1,为什么第二个fc的输出引脚的db块也置1呢?(第二个fc根本没有满足条件)当我不用db块,我用q或者m不会出现上述情况,这是为什么?
问题补充:
我把out这个引脚改成in/out的引脚就好了应该不是楼下说的那样
最佳答案
这个问题是因fc调用的参数传送机制引起的当fc的参数是一个绝对地址引用的db块数据时(比如db1.dbx0.0),系统会为这个形参分配一个临时区域(就是v 区,上一层程序的本地数据,即调用fc的块的l区),众所周知,临时变量要遵循先赋值后使用的原则,对于这样一个out类型的形参,块被开始调用时,并不会把实参(如db1.dbx0.0)赋值给形参,如果在fc块里没有对这个形参赋值,那么块结束时就会把一个不确定的值(其他块遗留在临时变量区域的值)赋值给实参,这样就会出现你描述的问题。
当这个参数是in/out类型时,fc块被调用开始时,会把实参(如db1.dbx0.0)赋值给形参(in参数的特性),这样既使在fc块里没有对形参赋值,形参也不会是一个不确定的值,而是把原来的实参值重新赋值给实参,所以结果就和out 类型不一样。
所以在fc使用db块绝对地址引用的变量作为out类型变量实参时,一定要确保对形参赋值,否则就用in/out替换out类型。
300的编程软件中数据块的调用问题

1、应用OPNDBm(例如OPNDB1)命令后,其后程序中所出现的数据块的DDDWDBDX(双字、字、字节、位)相关的指令时,这些DDDWDBDX(双字、字、ຫໍສະໝຸດ 节、位)均属于DBm(例如DB1)。
2、直接输入DBm.DBXn较上述OPN指令灵活,例如:
300的编程软件中数据块的调用问题
使用DBCALL命令打开数据块与直接输入DBm.DBXn之间的区别!求指教!!
问题补充:
那再补充个问题:如果一个FC中需要调用多个DB块时,用OPN打开DB块会不会造成程序混乱呢?如果不会,那具体的操作又是怎样!!
最佳答案
打开数据块的命令是OPN,例如OPNDB1。
LDB1.DBB10//取DB1
LDB2.DBB10//取DB2
>=I
上述程序不需应用OPNDB1,和OPNDB2了。
plc中不同的db块数据传送至同一db块中的方法(一)

plc中不同的db块数据传送至同一db块中的方法(一)PLC中不同的DB块数据传送至同一DB块中引言在PLC编程中,经常会遇到需要将不同的DB(Data Block)块中的数据传送至同一个DB块中的需求。
这种需求一般发生在需要对来自不同部分的数据进行汇总和分析的情况下。
本文将详细说明多种方法来实现这一需求。
方法一:使用数据块间的复制指令1.新建一个DB模块用于接收和存储其他DB块的数据。
2.使用PLC编程软件中提供的数据块间的复制(COPY)指令,将其他DB块中的数据复制至接收DB块中。
3.在复制过程中,可以根据需要选择复制整个DB块还是只复制其中的部分数据。
4.定期调用复制指令,以确保接收DB块中的数据是最新的。
方法二:使用数据块之间的读写操作1.在接收DB块中定义与其他DB块相同的数据结构。
2.使用数据块之间的读写操作,将其他DB块中的数据逐个读取,并写入接收DB块中。
3.可以采用循环的方式,依次读取每个DB块,将数据写入接收DB块中。
4.在写入过程中,需要注意保持数据的一致性,以避免数据冲突和丢失。
方法三:使用定时中断1.设置一个定时中断,定时触发数据传送操作。
2.在定时中断发生时,依次读取其他DB块的数据,并写入接收DB块中。
3.使用定时中断可以实现按照设定的频率自动执行数据传送操作,无需手动触发。
方法四:使用PLC的事件触发功能1.利用PLC编程软件提供的事件触发功能,在特定的事件(如状态变化、数据更新等)发生时执行数据传送操作。
2.将其他DB块中的数据读取,并写入接收DB块中。
3.通过设置适当的事件触发条件,可以确保数据传送操作能够在需要的时候自动执行。
方法五:使用程序块调用1.在PLC编程中定义一个新的程序块,用于执行数据传送操作。
2.在程序块中依次读取其他DB块中的数据,并写入接收DB块中。
3.在主程序中调用该程序块,以触发数据传送操作。
4.可以根据实际需要设置程序块的调用频率和执行逻辑。
DB块解释

电话响起,一天工作开始。
C:我300PLC内共享DB块内存的参数不能保持,CPU下电后再上电,所有保存的参数都变成零了? E:请问您共享DB块的初始值是零吗?C:我没改过,都是默认的。
E:那您有没有使能“Non Retain”属性?C:我没改过,都是默认的,那些对勾我都没打。
E:(心理活动,应该是程序的问题,可能是程序有地方启动时给这里写零。
)那您这个问题可能是程序有地方给这里写零造成的,您检查过程序吗?C:检查过,没发现问题。
程序是两年前做的,一直都没问题的,就是昨天检修后突然不行了。
E:(心理活动,检修后行的话,有可能是MMC卡取下来后CPU上电了。
)那您CPU 的存储卡您取下来过吗?C:取下来过,然后将另外一个MMC卡插入这个CPU内下载程序了。
下载后又把原先的卡插进来了,启动后就发现原来调试的几个参数没有了。
E:这是正常的,如果CPU在取下存储卡后单独上电,然后下电,然后再插存储卡,DB块通过MMC卡保持的数据会丢失的。
C:那如果我调试好的参数需要保持住应该怎么办?E:您可以考虑初始值,将您调试好的数据放入DB块的初始值;或者您可以考虑更改离线的实际值。
这样数据就不会丢,随程序保存。
C:那我试下电话二次响起C:我DB块的初始值不起作用,现在数值还全是0。
E:那您是在声明视图修改完初始值,然后保存下载的吧?C:是的。
我下载完后直接监视,实际值都是0。
E:那您需要对DB块执行初始化,初始化之后,所有的初始值变成离线的实际值。
然后再下载,然后程序在线的实际值就是您设定的初始值了。
C:DB数值这么多事儿,听起来有点纠结。
那怎么进行初始化操作呢?E:将DB块切换到数据视图,然后在编辑菜单下选择初始化数据块项,然后点保存,然后下载。
C:新数值已经起作用了,非常感谢!Case结束。
DB块数值涉及的内容有:初始值、离线项目的实际值、在线项目的实际值、带@的实际值,部分客户由于不清楚之间的关系或者不熟悉其作用,造成调试过程中很多问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DB块调用问题【地址的概念】完整的一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如NOT等)。
其中的操作数是指令要执行的目标,也就是指令要进行操作的地址。
我们知道,在PLC中划有各种用途的存储区,比如物理输入输出区P、映像输入区I、映像输出区Q、位存储区M、定时器T、计数器C、数据区DB和L等,同时我们还知道,每个区域可以用位(BIT)、字节(BYTE)、字(WORD)、双字(DWORD)来衡量,或者说来指定确切的大小。
当然定时器T、计数器C不存在这种衡量体制,它们仅用位来衡量。
由此我们可以得到,要描述一个地址,至少应该包含两个要素:1、存储的区域2、这个区域中具体的位置比如:A Q2.0其中的A是指令符,Q2.0是A的操作数,也就是地址。
这个地址由两部分组成:Q:指的是映像输出区2.0:就是这个映像输出区第二个字节的第0位。
由此,我们得出,一个确切的地址组成应该是:〖存储区符〗〖存储区尺寸符〗〖尺寸数值〗.〖位数值〗,例如:DBX200.0。
DB X 200 . 0其中,我们又把〖存储区符〗〖存储区尺寸符〗这两个部分合称为:地址标识符。
这样,一个确切的地址组成,又可以写成:地址标识符+ 确切的数值单元【间接寻址的概念】寻址,就是指定指令要进行操作的地址。
给定指令操作的地址方法,就是寻址方法。
在谈间接寻址之前,我们简单的了解一下直接寻址。
所谓直接寻址,简单的说,就是直接给出指令的确切操作数,象上面所说的,A Q2.0,就是直接寻址,对于A这个指令来说,Q2.0就是它要进行操作的地址。
这样看来,间接寻址就是间接的给出指令的确切操作数。
对,就是这个概念。
比如:A Q[MD100] ,A T[DBW100]。
程序语句中用方刮号[ ] 标明的内容,间接的指明了指令要进行的地址,这两个语句中的MD100和DBW100称为指针Pointer,它指向它们其中包含的数值,才是指令真正要执行的地址区域的确切位置。
间接由此得名。
西门子的间接寻址方式计有两大类型:存储器间接寻址和寄存器间接寻址。
【存储器间接寻址】存储器间接寻址的地址给定格式是:地址标识符+指针。
指针所指示存储单元中所包含的数值,就是地址的确切数值单元。
存储器间接寻址具有两个指针格式:单字和双字。
单字指针是一个16bit的结构,从0-15bit,指示一个从0-65535的数值,这个数值就是被寻址的存储区域的编号。
双字指针是一个32bit的结构,从0-2bit,共三位,按照8进制指示被寻址的位编号,也就是0-7;而从3-18bit,共16位,指示一个从0-65535的数值,这个数值就是被寻址的字节编号。
指针可以存放在M、DI、DB和L区域中,也就是说,可以用这些区域的内容来做指针。
单字指针和双字指针在使用上有很大区别。
下面举例说明:L DW#16#35 //将32位16进制数35存入ACC1T MD2 //这个值再存入MD2,这是个32位的位存储区域L +10 //将16位整数10存入ACC1,32位16进制数35自动移动到ACC2T MW100 //这个值再存入MW100,这是个16位的位存储区域OPN DBW[MW100] //打开DBW10。
这里的[MW100]就是个单字指针,存放指针的区域是M区,MW100中的值10,就是指针间接指定的地址,它是个16位的值!--------L L#+10 //以32位形式,把10放入ACC1,此时,ACC2中的内容为:16位整数10T MD104 //这个值再存入MD104,这是个32位的位存储区域A I[MD104] //对I1.2进行与逻辑操作!=DIX[MD2] //赋值背景数据位DIX6.5!--------A DB[MW100].DBX[MD2] //读入DB10.DBX6.5数据位状态=Q[MD2] //赋值给Q6.5--------A DB[MW100].DBX[MD2] //读入DB10.DBX6.5数据位状态=Q[MW100] //错误!!没有Q10这个元件---------------------------------------------------------------------------------------------------从上面系列举例我们至少看出来一点:单字指针只应用在地址标识符是非位的情况下。
的确,单字指针前面描述过,它确定的数值是0-65535,而对于byte.bit这种具体位结构来说,只能用双字指针。
这是它们的第一个区别,单字指针的另外一个限制就是,它只能对T、C、DB、FC和FB进行寻址,通俗地说,单字指针只可以用来指代这些存储区域的编号。
相对于单字指针,双字指针就没有这样的限制,它不仅可以对位地址进行寻址,还可以对BYTE、WORD、DWORD寻址,并且没有区域的限制。
不过,有得必有失,在对非位的区域进行寻址时,必须确保其0-2bit为全0!总结一下:单字指针的存储器间接寻址只能用在地址标识符是非位的场合;双字指针由于有位格式存在,所以对地址标识符没有限制。
也正是由于双字指针是一个具有位的指针,因此,当对字节、字或者双字存储区地址进行寻址时,必须确保双字指针的内容是8或者8的倍数。
现在,我们来分析一下上述例子中的A I[MD104] 为什么最后是对I1.2进行与逻辑操作。
通过L L#+10 ,我们知道存放在MD104中的值应该是:MD104:0000 0000 0000 0000 0000 0000 0000 1010当作为双字指针时,就应该按照3-18bit指定byte,0-2bit指定bit来确定最终指令要操作的地址,因此:0000 0000 0000 0000 0000 0000 0000 1010 = 1.2详解西门子间接寻址【地址寄存器间接寻址】在先前所说的存储器间接寻址中,间接指针用M、DB、DI和L直接指定,就是说,指针指向的存储区内容就是指令要执行的确切地址数值单元。
但在寄存器间接寻址中,指令要执行的确切地址数值单元,并非寄存器指向的存储区内容,也就是说,寄存器本身也是间接的指向真正的地址数值单元。
从寄存器到得出真正的地址数值单元,西门子提供了两种途径:1、区域内寄存器间接寻址2、区域间寄存器间接寻址地址寄存器间接寻址的一般格式是:〖地址标识符〗〖寄存器,P#byte.bit〗,比如:DIX[AR1,P#1.5] 或M[AR1,P#0.0] 。
〖寄存器,P#byte.bit〗统称为:寄存器寻址指针,而〖地址标识符〗在上帖中谈过,它包含〖存储区符〗+〖存储区尺寸符〗。
但在这里,情况有所变化。
比较一下刚才的例子:DIX [AR1,P#1.5]X [AR1,P#1.5]DIX可以认为是我们通常定义的地址标识符,DI是背景数据块存储区域,X是这个存储区域的尺寸符,指的是背景数据块中的位。
但下面一个示例中的M呢?X只是指定了存储区域的尺寸符,那么存储区域符在哪里呢?毫无疑问,在AR1中!DIX [AR1,P#1.5] 这个例子,要寻址的地址区域事先已经确定,AR1可以改变的只是这个区域内的确切地址数值单元,所以我们称之为:区域内寄存器间接寻址方式,相应的,这里的[AR1,P#1.5] 就叫做区域内寻址指针。
X [AR1,P#1.5] 这个例子,要寻址的地址区域和确切的地址数值单元,都未事先确定,只是确定了存储大小,这就是意味着我们可以在不同的区域间的不同地址数值单元以给定的区域大小进行寻址,所以称之为:区域间寄存器间接寻址方式,相应的,这里的[AR1,P#1.5] 就叫做区域间寻址指针。
既然有着区域内和区域间寻址之分,那么,同样的AR1中,就存有不同的内容,它们代表着不同的含义。
【AR的格式】地址寄存器是专门用于寻址的一个特殊指针区域,西门子的地址寄存器共有两个:AR1和AR2,每个32位。
当使用在区域内寄存器间接寻址中时,我们知道这时的AR中的内容只是指明数值单元,因此,区域内寄存器间接寻址时,寄存器中的内容等同于上帖中提及的存储器间接寻址中的双字指针,也就是:其0-2bit,指定bit位,3-18bit指定byte字节。
其第31bit固定为0。
AR:0000 0000 0000 0BBB BBBB BBBB BBBB BXXX这样规定,就意味着AR的取值只能是:0.0 ——65535.7例如:当AR=D4(hex)=0000 0000 0000 0000 0000 0000 1101 0100(b),实际上就是等于26.4。
而在区域间寄存器间接寻址中,由于要寻址的区域也要在AR中指定,显然这时的AR中内容肯定于寄存器区域内间接寻址时,对AR内容的要求,或者说规定不同。
AR:1000 0YYY 0000 0BBB BBBB BBBB BBBB BXXX比较一下两种格式的不同,我们发现,这里的第31bit 被固定为1,同时,第24、25、26位有了可以取值的范围。
聪明的你,肯定可以联想到,这是用于指定存储区域的。
对,bit24-26的取值确定了要寻址的区域,它的取值是这样定义的:区域标识符26、25、24位P(外部输入输出)000I(输入映像区)001Q(输出映像区)010M(位存储区)011DB(数据块)100DI(背景数据块)101L(暂存数据区,也叫局域数据)111如果我们把这样的AR内容,用HEX表示的话,那么就有:当是对P区域寻址时,AR=800***xx当是对I区域寻址时,AR=810***xx当是对Q区域寻址时,AR=820***xx当是对M区域寻址时,AR=830***xx当是对DB区域寻址时,AR=840***xx当是对DI区域寻址时,AR=850***xx当是对L区域寻址时,AR=870***xx经过列举,我们有了初步的结论:如果AR中的内容是8开头,那么就一定是区域间寻址;如果要在DB区中进行寻址,只需在8后面跟上一个40。
84000000-840FFFFF指明了要寻址的范围是:DB区的0.0——65535.7。
例如:当AR=840000D4(hex)=1000 0100 0000 0000 0000 0000 1101 0100(b),实际上就是等于DBX26.4。
我们看到,在寄存器寻址指针[AR1/2,P#byte.bit] 这种结构中,P#byte.bit又是什么呢?【P#指针】P#中的P是Pointer,是个32位的直接指针。
所谓的直接,是指P#中的#后面所跟的数值或者存储单元,是P直接给定的。
这样P#XXX这种指针,就可以被用来在指令寻址中,作为一个“常数”来对待,这个“常数”可以包含或不包含存储区域。
例如:● L P#Q1.0 //把Q1.0这个指针存入ACC1,此时ACC1的内容=82000008(hex)=Q1.0★ L P#1.0 //把1.0这个指针存入ACC1,此时ACC1的内容=00000008(hex)=1.0● L P#MB100 //错误!必须按照byte.bit结构给定指针。