9
即寻址是对操作数是常数或常量的寻址方式,其特点是操作数值直接表示在指令中,出现在指令中的操作数称为立即数。有些指令的操作数是一的,为简化起见,并不在指令中写出。
立即寻址方式可用来提供常数、设置初值等。常数值可分为字节、字、双字型等数据。CPU以二进制方式存储所有常数。在指令中可用十进制、十六进制、ASCII码或浮点数形式来表示操作数。
立即寻址示例:
SET 说明:把RLO置1
OW W#16#320 将常量W#16#320与ACCU1“或”运算
L 1352 把整数1352装入ACCU1
L‘ABCD’ 把ASCII码字符ABCD装入ACCU1
L C#100 把BCD码常数100(计数值)装入ACCU1
AW W#16#3A12 常数W316#3 A12与ACCU1的低位相“与”,运算结果在ACCU1的低字中。
存储器直接寻址包括对寄存器和存储器的直接寻址。在直接寻址的指令中,直接给出操作数的存储单元地址,包括寄存器或存储器的区域、长度和位置,根据这个地址就可以立即找到该数据。例如,用MW200*位存储区中的字,地址为200;MB100表示以字节方式存取,MW100表示存取MB100、MB101组成的字,MD100表示存取MB100~ MB103组成的双字。在指令中,数据类型应与指令标识符相匹配。
直接寻址编程示例:
A IO.0 说明:对输入位10.0进行“与”逻辑操作
S L20.0 把本地数据位I20.0置“l”
= M115.4 使存储区位M115.4的内容等于RLO的内容
L IB10 把输入字节IB10的内容装入ACCU1
T DBD12 把ACCU1中的内容传送给数据双字DBD12中。
存储器间接寻址简称间接寻址。该寻址方式在指令中以存储器的形式给出操作数所在存储器单元的地址,也就是说该存储器的内容是操作数所在存储器单元的地址。该存储器一般称为地址指针,在指令中需写在方括号“[]”内。地址指针可以是字或双字。对于地址范围小于65 535(即16位二进制数所表示的较大值)的存储器(如T、C、DB、FB、FC等)可以用字指针,其指针格式如图所示。对于其他存储器(如I、Q、M等)则要使用双字指针。如果要用双字指针访问字节、字或双字存储器,必须**指针的位编号为0,只有双字MD、LD、DBD和DID能作双字地址指针,存储器间接寻址的双字指针的格式如图所示,位0~2(XXX)为被寻址位的位编号(范围0~7),位3—l8为被寻址字节的字节编号(范围0~65 535)。
图 存储器间接寻址的字指针格式
图 存储器间接寻址的双字指针格式
存储器间接寻址的单字格式的指针寻址示例:
L2 说明:将数字2#0000_0000_0000_0010装入累加器1
T MW50 将累加器l低字中的内容传给MW50作为指针值
OPN DB35 打开共享数据块DB35
L DBW[MW50] 将共享数据块DBW2的内容装入累加器1
存储器间接寻址的双字格式的指针寻址示例:
上面程序中Q[MD2]中的MD2称为地址指针,其里面的数值代表地址。
使用存储器间接寻址,该存储器的值是操作数的地址,因此改变了存储器的值就相当于改变了操作数的地址,在循环程序中经常使用存储器间接寻址。
寄存器间接寻址简称寄存器寻址。在S7中有两个地址寄存器,分别是AR1和AR2。通过地址寄存器,可以对各存储区的存储器内容实现寄存器间接寻址。地址寄存器的内容加上偏移量形成地址指针,该指针指向数值所在的存储单元。地址寄存器及偏移量必须写在方括号“[]”内。寄存器间接寻址的语句不改变地址寄存器中的数值。用寄存器指针访问一个字节、字或双字时,必须**地址指针中位地址编号为0。
装载存储区可能是CPU模块中的部分RAM、内置的E2PROM或选用的可拆卸FlashEPROM( FEPROM)卡,用于保存不包含符号地址和注释的用户程序和系统数据(组态、连接和模块参数等)。
有的CPU有集成的装载存储器,有的可以使用微存储器卡(MMC)来进行扩展,CPU31XC的用户程序只能装入插入式的MMC。
断电时数据保存在MMC存储器中,因此,数据块的内容基本上被*保留。
下载程序时,用户程序(逻辑块和数据块)被下载到CPU的装载存储器,CPU把可执行部分复制到工作存储器,而符号表和注释则保存在编程设备中。
工作存储区占用CPU模块中的部分RAM,它是集成的高速存取的RAM存储器,用于存放CPU运行时所执行的用户程序和数据。为了**程序执行的快速性和不过多地占用工作存储器,在执行时只把与程序执行有关的块装人工作存储区。
CPU工作存储区也为程序块的调用安排了一定数量的临时本地数据存储区(或称L堆栈),用来存储程序块被调用时的临时数据,访问局域数据比访问数据块中的数据更快。用户生成块时,可以表明临时变量( TEMP),它们只在执行该块时有效,执行完后就被覆盖了。也就是说,L堆栈中的数据在程序块工作时有效,并一直保持,当新的块被调用时,L堆栈将进行重新分配。
在FB、FC或OB运行时设定,将块变量声明表中声明的临时变量存在临时本地数据存储区(L堆栈)。L堆栈提供空间以传送某些类型参数和存放梯形图的中间结果。块结束执行时,临时本地存储区再行分配,不同的CPU提供不同数量的临时本地存储区(L堆栈)。
语句表( STL)程序中的数据块可以被标识为“与执行无关”(UNLINIKED),它们只是存储在装载存储器中。有必要时,可以用SFC 20“BLKMOV”将它们复制到工作存储区。
复位CPU的存储器时,RAM中的程序被清除。
系统存储区为不能扩展的RAM,是CPU为用户程序提供的存储器组件,被划分为若干个地址区域,分别用于存放不同的操作数据,如输入过程映像、输出过程映像、位存储器、定时器和计数器、块堆栈(B堆栈)、中断堆栈(I堆栈)和诊断缓冲区等。
系统存储区可通过指令在相应的地址区内对数据直接进行寻址。
(1)输入/输出(I/O)过程映像表
在每次扫描循环开始时,CPU读取数字量输入模块的外接输入电路的状态,并将它们的存放过程映像输入表中。在扫描循环中,用户程序计算输出值,并将它们的存放过程映像输出表。在扫描循环结束时,将过程映像输出表的内容写入数字量输出模块。
用户程序访问plc的输入(I)和输出(O)地址区时,不是去读/写数字信号模块中的信号状态,而是访问CPU中的过程映像区。
I和O均可以按位、字节、字和双字来存取,如10.0、IBO、IWO和IDO。
与直接访问I/O模块相比,访问过程映像表可以**在整个程序周期内,过程映像的状态始终一致。在程序执行过程中,即使接在输入模块的外接输入电路的状态发生了变化,过程映像表中的信号状态仍然保持不变,直到下一个循环被刷新。由于过程映像保存在CPU的系统存储器中,该问速度比直接访问I/O模块快得多。
在用户程序中输入过程映像的标识符为I,是PLC接收外部输入数字量信号的窗口。输入端可以外接常开触点或常闭触点,也可以接多个触点组成的串并联电路。PLC将外部电路的通/断状态读入并存储在输入过程映像中。外部输入电路接通时,对应的输入过程映像为ON(1状态);反之为OF(0状态)。在梯形图中,可以多次使用输入过程映像的常开触点和常闭触点。
在用户程序中输出过程映像的标识符为0,在循环周期结束时,CPU将输出过程映像的数据传送给输出模块,再由后者驱动外部负载。如果梯形图00.0的线圈“得电”,继电器型输出模块中对应的硬件继电器的常开触点闭合,使接在00.0对应的输出端子的外部负载工作。输出模块中的每一个硬件继电器仅有一对常开触点,但是在梯形图中,每一个输出位的常开触点和常闭触点都可以多次使用。
S7-300 CPU的过程映像区的大小是固定的,S7-400 CPU可以将过程映像划分为较多15个区段,这意味着如果需要,可以独立于循环来刷新过程映像表的某些区段。用STEP 7*的过程映像区段中的每一个I/O地址不再属于081过程映像I/O表。需要定义哪些I/O模块地址属于哪些过程映像区段。
可以在用户程序中用SFC(系统功能)刷新过程映像。SFC26“UPDAT_PI”用来刷新整个或部分过程映像输入表,SFC27“UPDAT_PO”用来刷新整个或部分过程映像输出表。
某些CPU也可以调用OB(组织块)由系统自动地对*的过程映像分区刷新。
(2)内部存储器标志位(M)存储器区
内部存储器标志位(M)用来保存控制逻辑的中间操作状态或其他控制信息。虽然名为“位存储器区”,表示按位存取,但是也可以按字节、字或双字来存取。
(3)定时器(T)存储器区
定时器相当于继电器系统中的时间继电器。给定时器分配的字用于存储时间基值和时间值(0~ 999),时间值可以用二进制或BCD码方式读取。
(4)计数器(C)存储器区
计数器用来累计其计数脉冲上升沿的次数,有加计数器、减计数器和加/减计数器。给计数器分配的字用于存储计数当前值(0~ 999),计数值可以用二进制或BCD码方式读取。
(5)数据块
数据块用来存放程序数据信息,分为可被所有逻辑块公用的“共享”数据块(DB,简称数据块)和被功能块( FB)特定占用的“背景”数据块(DI)。
DB为共享数据块,DBX是共享数据块中的数据位,DBB、DBW和DBD分别是数据块中的数据字节、数据字和数据双字。
DI为背景数据块,DIX是背景数据块中的数据位,DIB、DIW和DID分别是背景数据块中的数据字节、数据字和数据双字。
(6)诊断缓冲区
诊断缓冲区是系统状态列表的一部分,包括系统诊断事件和用户定义的诊断事件的信息。这些信息按它们出现的顺序排列,*一行中是较新的事件。
诊断事件包括模块的故障、写处理的错误、CPU中的系统错误、CPU的运行模式切换错误、用户程序中的错误和用户用系统功能SFC 52定义的诊断错误等。
STEP7-Micro/Win在程序编辑器窗口里为每个POU提供一个独立的页。主程序总是*1页,后面是子程序或中断程序。因为各个程序在编辑器窗口里被分开,编译时在程序结束的地方自动加入无条件结束指令或无条件返回指令,用户程序只能使用条件结束和条件返回指令。
通常将具有特定功能且多次使用的程序段作为子程序。子程序可以多次被调用,也可以嵌套(较多8层),还可以递归调用(自己调用自己)。子程序有子程序调用和子程序返回两大类指令,子程序返回又分条件返回和无条件返回。子程序调用指令用在主程序或其他调用子程序的程序中,子程序的无条件返回指令在子程序的最后网络段。梯形图指令系统能够自动生成子程序的无条件返回指令,用户*输入。
子程序的调用是有条件的,未调用它时不会执行子程序中的指令,因此使用子程序可以减少扫描时间,同时可使整个程序功能清晰,易于查错和维护,还能减少存储空间。为了移植子程序,应避免使用全局符号和变量,例如V存储区中的**地址。
在编程软件的程序数据窗口的下方有主程序(OBI)、子程序(SUB0)、中断服务程序(INT0) 的标签,点击子程序标签即可进入SUB0子程序显示区。也可以通过指令树的项目进入子程序SUB0显示区。添加一个子程序时,可以用编辑菜单的插入项增加一个子程序,子程序编号n从0开始自动向上生成。用鼠标右键点击指令树中的子程序或中断程序的图标,在弹出的菜单中选择“重新命名”,可以修改它们的名称。
子程序可能有要传递的参数(变量和数据),这时可以在子程序调用指令中包含相应参数,它可以在子程序与调用程序之间传送。参数(变量和数据)必须有符号名(较多8个字符)、变量和数据类型等内容。子程序较多可传递16个参数。传递的参数在子程序局部变量表中定义。局部变量表中的变量有IN、OUT、IN/OUT和TEMP等四种类型。
●IN类型:将*位置的参数传入子程序。参数的寻址方式可以是直接寻址(如VB10)、间接寻址(如*ACl)或立即数(如1234)。也可以将数据的地址值传入子程序(&VB100)。
●OUT类型:是子程序的结果值(数据),它被返回给调用它的POU。常数和地址值不允许作为输出参数。
●IN/OUT类型:将*位置的参数传到子程序,从子程序来的结果值被返回到同样的地址。常数和地址值不允许作为输出参数。
●TEMP类型:局部存储器只能用作子程序内部的暂时存储器,不能用来传递参数。
局部变量表的数据类型可以是能流、布尔(位)、字节、字、双字、整数、双整数和实数型。能流是指仅允许对位输入操作的布尔能流(布尔型),梯形图表达形式为用触点(位输入)将电源母线和指令盒连接起来。
在局部变量表输入变量名称、变量类型、数据类型等参数以后,双击指令树中的子程序(或选择点击方框快捷按钮,在弹出的菜单中选择子程序项),在梯形图显示区显示出带参数的子程序调用指令盒。
局部变量表变量类型的修改方法是,用光标选中变量类型区,点击鼠标右键得到一个下拉菜单,选择插入项,弹出一个下拉子菜单,点击选中的类型,在变量类型区光标所在处即可得到选中的类型。
给予程序传递参数时,它们放在子程序的局部存储器(L)中,局部变量表较左列是每个被传递参数的局部存储器地址。
子程序调用时,输入参数被拷贝到局部存储器。子程序完成时,从局部存储器拷贝输出参数到*的输出参数地址。
内部寄存器的方法。如果把PLC的内部寄存器比喻成一幢大楼,那么寻址方法就是对房间门牌的编号。只有掌握了寄存器的寻址方法,我们才能正确使用内部寄存器。
内部寄存器的寻址,是欧美系PLC所*有的,它不同于日系的PLC。因为日系的PLC一般是直接使用。比如三菱的PLC,它用D0,D1来表示内部的数据寄存器。M0,M1 表示的是位寄存器,D0 和M0之间没有任何关系而欧系PLC与日系的完全不同,是使用和计算机一样的寻址方法。
计算机较基本的存储单位是位,同样,在PLC内也是采用位作为较基本的寻址单位。八个位组成一个字节,两个字节组成一个字。西门子博途软件平台中,高位在低字节,低位在高字节。这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放,这和我们的阅读习惯一致。这样说起来可能很抽象,我们直接看图。
如图,这是较基本的存储单元,MB0.0表示的是一个较基本的位,MB0表示一个字节,很明显,从MB0.0到MB0.7的八个位组成了一个字节,也就是MB0。其中MB0.0相当于三菱plc的M0,而MB0可以认为是三菱PLC的D0,很显然,他们是你中有我,我中有你的关系。所以,写程序**定要做好规划,避免地址重叠。
这就是西门子博途软件平台的寻址方式,很显然,他有重叠的部分,这是我们要注意的,也是和日系PLC较大的不同,也可以说是欧系PLC的一个大陷阱。比如,MW1 和 MW0 MW2有重叠的部分,我们使用了MW1之后,为了避免地址重复,就不要再使用MW0 和MW1了。MD0 同理。
这就是西门子博途软件平台的寻址方式,很显然,他有重叠的部分,这是我们要注意的,也是和日系PLC较大的不同,也可以说是欧系PLC的一个大陷阱。比如,MW1 和 MW0 MW2有重叠的部分,我们使用了MW1之后,为了避免地址重复,就不要再使用MW0 和MW1了。MD0 同理。