西门子(授权)代理|触摸屏
我公司是西门子签约代理商备有大量西门子产品浔之漫智控技术(上海)有限公司:西门子授权代理商
现货库存;大量全新库存,款到48小时发货,无须漫长货期
西门子PLC(S7-200、S7-200SMART、S7-300、S7-400、S7-1200、S7-1500、ET200S、ET200M、ET200SP)、触摸屏、变频器、工控机、电线电缆、仪器仪表等,产品选型、询价、采购,敬请联系,浔之漫智控技术(上海)有限公司
当将MD100以这种 [MD100] 形式表示时,你既要在对MD100赋值时考虑到所赋的值是否符合存储器间接寻址双字指针的规范,又要在使用这个寻址格式作为语句一部分时,是否符合语法的规范。
在你给出个例程的句:L [MD100]上,我们看出它犯了后一个错误。
存储器间接寻址指针,是作为的存储区域的确切数值单元来运用的。也就是说,指针不包含区域标识,它只是指明了一个数值。要在 [MD100]前加上区域标识如: M、DB、I、Q、L等,还要加上存储区尺寸大小如:X、B、W、D等。在加存储区域和大小标识时,要考虑累加器加载指令L不能对位地址操作,只能非位的地址。
为了对比下面的寄存器寻址方式,我们这里,修改为:L MD[MD100]。并假定MD100=8Hex,我们也假定MD1=85000018Hex。
当把MD100这个双字作为一个双字指针运用时,其存储值的0-18bit将会按照双字指针的结构Byte.bit来重新“翻译",“翻译"的结果才是指针指向的地址,MD100中的8Hex=1000B=1.0,下面的语句:
L MD[MD100]
LAR1
经过“翻译"就是:
L MD1
LAR1
前面我们已经假定了MD1=85000018,同样道理,MD1作为指针使用时,对0-18bit应该经过Byte.bit结构的“翻译",由于是传送给AR地址寄存器,还要对24-31bit进行区域寻址“翻译"。这样,我们得出LAR1中终的值=DIX3.0。就是说,我们在地址寄存器AR1中存储了一个指针,它指向DIX3.0。
-----------------------------
L MD100
LAR1
这段语句,是直接把MD100的值传送给AR,当然也要经过“翻译",结果AR1=1.0。就是说,我们在地址寄存器AR1中存储了一个指针,它指向1.0,这是由MD100直接赋值的。
似乎,两段语句,只是赋值给AR1的结果不同而已,其实不然。我们事先假定的值是考虑到对比的关系,特意的。如果MD100=CHex的呢?
对于前一段,由于CHex=1100,其0-3bit为非0,程序将立即出错,无法执行。(因为没有MD1.4这种地址!!)
后一段AR1的值经过翻译以后,等于1.4,程序能正常执行
因为实数的数值范围远大于32位整数,有的实数不能成功地转换为32位整数。如果被转换的实数格式非法或超出了32位整数的表示范围,则在累加器1中得不到有效结果,状态字中的OV和OS被置1。
上面的指令都是将累加器1中的实数化整为32位整数,因化整的规则不同,在累加器1中得到的结果也不一致,如下表
西门子plc的每次向上计数输入执行从关闭至打开转换时,向上计数(CTU)从该计数器的当前值向上计数。重设输入打开或执行重设指令时,计数器被重设。达到大值(32,767)时,计数器停止。
每次向上计数输入执行从关闭至打开转换时,向上/向下计数器(CTUD)向上计数,每次向下计数输入执行从关闭至打开转换32,767)时,向上计数输入的下一个上升边缘导致当前计数变成小值(32,768)。与此相似,达到小值(-32,768)时,向下计数输入的下一个上升边缘导致当前计数变成大值(32,767)。
向上和向上/向下计数器有一个保持当前计数的当前值。计数器还有一个预设值(PV),每次执行计数器指令时,将预设值与当C位)打开。否则,C位关闭。
每次向下计数输入执行从关闭至打开转换时,向下计数器(CTD)从该计数器的当前值向下计数。载入输入打开时,计数器重设计数器位,并将预设值载入当前值。达到零时,计数器停止,计数器位(C位)打开。
当您使用西门子plc重设指令重设计数器时,计数器位被重设,计数器当前值被设为零。使用计数器号码引用该计数器的当前值和C位。
注释:
因为每台计数器有一个当前值,请勿将相同的号码给一台以上计数器。(向上计数器、向上/向下计数器和向下计数器存取相同的当前值。)
P#中的P是Pointer,是个32位的直接指针。所谓的直接,是指P#中的#后面所跟的数值或者存储单元,是P直接给定的。这样P#这种指针,就可以被用来在指令寻址中,作为一个“常数"来对待,这个“常数"可以包含或不包含存储区域。例如:
● 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结构给定指针。
● L P#M100.0 //把M100.0这个指针存入ACC1,此时ACC1的内容=83000320(hex)=M100.0
● L P#DB100.DBX26.4 //错误!DBX已经提供了存储区域,不能重复。
● L P#DBX26.4 //把DBX26.4这个指针存入ACC1,此时ACC1的内容=840000D4(hex)=DBX26.4
我们发现,当对P#只是数值时,累加器中的值和区域内寻址指针规定的格式相同(也和存储器间接寻址双字指针格式相同);而当对P#有存储区域时,累加器中的内容和区域间寻址指针内容相同。事实上,把什么样的值传给AR,就决定了是以什么样的方式来进行寄存器间接寻址。在实际应用中,我们正是利用P#的这种特点,根据不同的需要,P#指针,再传递给AR,以确定终的寻址方式。
在寄存器寻址中,P#作为寄存器AR指针的偏移量,用来和AR指针进行相加运算,运算的结果,才是指令真正要操作的确切地址数值单元!