陕西西门子S7-1500PLC模块代理(量大从优)
STEP 7消息帧举例的简要描述
下列示例小编将加深对复杂变量处理方法的理解。每一个不同块的程序强调一个特定方面。示例中因为技术原因而声明的功能比如“Generate_frame”(生成帧)和“Check_sum”(校验和)仅是为了让程序更加简单明了,在必要的地方,只进行了简单的处理。
在这一点上,示例采用了文本和图片来描述,在原书磁盘中,STL_B ook库中的“Message frame Example”下可以找到这个程序。
这个示例由如下部分组成:
●消息帧数据
(UDT 51、UDT 52、DB 61、DB 62、DB 63)说明如何处理自定义数据结构。
●时钟校验(FC 61)
说明如何处理数据块和标准块。
●校验和(FC 62)
说明如何使用直接变量寻址。
●生成帧(FB 51)
说明对于确定的地址,如何使用SFC 29 BLKMOV。
●存储帧(FB52)
说明如何使用ANY指针“变量”。
●日期转换(FC 63)
说明复杂数据类型变量的处理。
1.消息帧数据示例
示例说明了如何把经常遇到的数据结构定义为自己的数据类型,以及如何在变量声明和参数声明中使用这些数据类型。
为即将到来和即将过去的帧建立一个数据库:一个具有消息帧结构的发送,一个具有相同结构的接收,以及一个用于中间存储接收消息帧的环形(接收)缓冲器(如图26-6所示)。
图26-6 消息帧数据示例的数据结构
因为消息帧的数据结构会经常遇到,所以把它定义为用户自定义数据类型(UDT)帧。帧包含了一个帧标题,同时还需要给帧标题的结构命名。发送和接收都将是一个数据块,各自包含了一个具有消息帧结构的变量。是环形缓冲器,一个包含8个组件区域的数据块,数据结构和消息帧的结构相同。
首先定义UDT标题,然后才是UDT帧。帧由一个结构标题、一个包含4个组件的Measured_values字段,以及一个可变的Check(校验)组成。所有组件的初始值为0。在数据块“Send_mailb”和“Rec_mailb”中,各定义了一个具有frame(帧)结构的变量Data(数据)。
在数据块的初始化段中,可以单个地对变量进行初始化。比如,组件ID接收一个与UDT初始值不同的值。作为一个字段,数据块“缓冲器”包含的变量Entry为8个具有frame(帧)结构的组件。
在此也一样,在声明段中单个的组件可以使用不同的值进行初始化(比如Entry[1].Header.Numb:=1)。
这个示例包含了在下列示例中使用的对象:
UDT 51 用户自定义数据类型标题
UDT 52 用户自定义数据类型帧
DB 61 发送(Send_mailb)
DB 62 接收(Rec_mailb)
DB 63 缓冲器
2.时钟校验示例
示例说明了如何处理系统块和标准块(错误分析、从库中复制、重命名)。
功能“Clock_check”(时钟校验)将把CPU中集成的实时时钟中的日历作为功能值输出。为此,需要使用系统功能SFC 1 READ_CLK,按照DATE_AND_TIME或DT的数据格式,读取实时时钟中的日期和日历。因为只需要读取日历,所以还需要IED功能FC 8 DT_TOD。这个功能从数据格式DT中,按照TIME_OF_DAY或TOD的格式获取日历(如图26-7所示)。
实时时钟的时间说明存储在数据块“Data66”中,因为在“日期转换”示例中还需要这些消息。除了这个附加的用途,可以声明一个暂态局部变量以代替变量CPU_Tim。
3.错误分析
系统功能通过二进制结果BR和功能值RET_VAL来提示错误。如果BR=“0”,则存在错误,功能值为负(位15置位)。而IEC标准功能仅通过二进制结果提示错误。
示例中给出了两种类型的错误分析。在“Clock_Check”功能中,二进制结果开始被设置为“1”;如果存在错误,则二进制结果被相关的块设为“0”,然后输出一个无效的日历值。在“Clock_Check”功能调用之后,可以通过二进制结果来检验错误。
4.系统功能的离线编程
在编译示例程序之前,或增量编程的输入调用之前,离线的用户程序必须包含系统功能SFC 1和标准功能FC 8。两个功能均由STEP 7提供。在提供的块库中可以找到这些功能(对于集成到CPU中的系统功能,库中包含了界面说明而不是系统功能的程序。通过这个界面说明功能可以离线地调用功能。界面说明不会传送到CPU。可加载功能,比如IEC功能,作为可执行功能保存在库中)。
图26-7 时钟校验示例
通过STMATIC管理器的菜单File→Open,选择Standard Library(标准)库,然后打开System Function blocks(系统功能块)库。在Blocks(块),下面将会找到系统功能的所有界面说明。如果没有打开自己项目的项目窗口,可以通过Window→Arrange→Vertically平铺这两个窗口,然后使用鼠标将所选的系统功能拖入程序当中(用鼠标选中SFC,“保持”住,“拖”到Blocks中或打开的窗口中,然后“放下”)。可以用同样的方法复制标准功能FC 8。在IEC Function Blocks(IEC功能块)库中可以找到它,FC 8是一个可加载的功能,所以和SFC1不同,它将会占用用户存储器。
在增量式编程中,如果标准块是从“Libraries”(库)下面的Editor's Program Element Catalog(编辑器程序元件目录)调入的,它将自动被复制到Blocks中,并输入到符号表中。
5.重命名标准功能
可以给可加载的标准功能重新命名,在项目窗口中选中一个标准功能(比如FC 8),然后(再)单击其标识符。在名称的周围将出现一个框,然后指定一个新的地址(比如FC 98)。当标准功能(重命名为FC 98)被选中时,如果按下F1,将仍会收到原先的标准功能(FC 8)的在线帮助功能。
当进行复制操作时,如果存在相同地址的块,将会出现一个对话框,从而选择是覆盖还是重命名。
6.符号地址
在符号表中,可以给系统功能和标准功能命名,所以可根据符号来存取这些功能。可以在块名称允许的框架之内自由地选择名称,在示例中,已经为每个块名称选择了一个符号名(用于改进的识别)。
7.校验和示例
这个示例给出了间接寻址的使用,以及利用可变地址计算结果直接存取ANY类型的块参数。
不考虑任何进位(溢出、超出DINT数值范围),把数据结构中所有的字节简单地相加,即可生成校验和。
对于所有的数据结构(STRUCT和UDT),如果将其应用到参数类型为ANY的块参数中,编辑器将把它们作为由字节组件组成的字段来处理。因此,对于这个程序,不仅可以从由字节组件组成的字段中(ARRAY OF BYTE)生成一个校验和,也可以从结构变量中生成。对于其他数据类型的变量,如果要使用这个程序,必须修改相关的校验(ANY指针中的类型ID)。
校验和功能使用直接变量寻址来获得变量的地址(更确切地说,编辑器存储ANY指针的地址)。
首先,做一个检验以确保类型ID为“Byte”且重复系数大于1。在错误事件中,二进制结果被设置为“0”,功能退出并返回功能值零。
实参的起始地址(在运行时)位于ANY指针中。它被加载到地址寄存器AR1,如果变量位于一个数据块中,则该数据块也将被打开。
下一个网络将组成实参的所有字节的值相加。程序循环运行直到变量Quantity的值变为0(循环使该值减小)。
然后,总和将传递给功能值。
8.生成帧示例
该例说明了如何使用功能SFC 20 BLKMOV复制复杂变量(如图26-8所示)。
数据块“Send_mailb”将填入消息帧数据。使用一个功能块,其实例数据块中包含了ID和顺序号。网络数据存储在全局数据块中,使用系统功能BLKMOV将其复制到发送
利用功能“Clock_check”(见前一个示例)的帮助,可以从CPU的实时时钟获取日历,通过把消息帧的帧标题和数据中的字节简单地相加,可生成校验和(见“Check_sum”功能)。图26-9给出了程序和数据结构。
功能块FB“Generate_frame”(生成帧)中的个网络,将存储在实例数据块中的ID传递给帧标题,顺序号加上1之后也传递给帧标题。
第二个网络包含了功能“Clock_check”的调用,它从实时时钟获取日历并按照TIME_OF_DAY的格式将其输入到帧标题中。
在第三个网络中可以看到,在运行时不是使用间接寻址,而是使用系统功能SFC 20 BLKMOV来复制所选变量的一种方法。因此不需要知道地址和变量的结构。
原理也特别简单:所用的复制功能是通过跳转赋值器选定的。允许数字1~4作为选择标准。示例“缓冲器入口”利用一个变量的目标区域说明了同样的功能,变量使用的指针在运行时才计算出来。
图26-8 校验和示例
图26-9 生成帧示例
下一个网络通过帧标题和帧数据产生校验和。因为功能“Checksum”(校验和)是在单个数据区上生成校验和,帧标题和数据合并到暂态变量Block(块)中。再把Block(块)的内容按照字节相加,并存储到发送帧的校验和中。
功能块“Generate_frame”按照这种方式编程,即通过一个信号沿对其进行调用以生成消息帧。
9.存储帧示例
示例集中说明了如何使用ANY指针“变量”。
数据块“Rec_mailb”中的帧将输入到数据块“Buffer”(缓冲器)中的下一个位置。块局部变量Entry(入口)决定了在环形缓冲器中的位置。环形缓冲器的地址就是从这个位置的值开始计算的(如图26-10所示)。
图26-10 存储帧示例
如果接收中的帧数目发生了改变,帧将被写入到缓冲器的下一个位置。缓冲器是一个可以容纳8个帧的数据块。在输入第8个帧之后,下一个帧将再次输入到个位置。
功能块“Store_frame”(存储帧)将比较输入帧的序号和数据块“Rec_mailb”中存储的序号,如果帧序号不同,则调整存储的序号,接收中的帧将被复制到数据块“Buffer”的下一个入口中。系统功能SFC 20 BLKMOV用于处理复制操作。因为根据Entrv(入口)值的不同,目标可能不同。计算目标区的地址,在此从ANY_Pointer中产生一个ANY指针,并且把它传递给SFC的参数DSTBLK。请注意,暂态局部变量的间接寻址只能使用区内寻址。
数据结构frame的长度为20字节(标题:8字节,内容:8字节,校验:4字节)。数据块“Reci_mailb”中的变量Receive(接收)的长度为20字节,就像数据块Buffer中的Entry字段的每一个组件的长度都为20字节。因此,单个组件Entry[n]起始于字节地址n×20,其中n与变量Entry有关。
10.数据转换示例
示例集中说明了复杂数据类型变量的处理。变量采用直接变量存取,或使用两个地址寄存器的间接寻址。
全局数据块“Data66”包含了变量CPU_Tim(数据类型DATE_AND_TIME)和Dat(数据类型STRING)。日期从变量CPU_Tim中获取,然后被当作一个字符串按照“YYMMTT”的格式保存到变量Dat中。
在功能“DT_Conv”后面的程序中,指向输入参数Tim的指针使用地址寄存器AR1和DB寄存器,指向功能值(与数据块“Data66”中的STRING变量Dat有关)的指针使用地址寄存器AR2和DI寄存器。程序位于功能当中,从而使两个数据块寄存器和两个地址寄存器保持有效而不受任何限制。
个网络中的程序计算块参数Tim中的实参地址,该值在运行时保持有效,并将DB寄存器中的地址保存到AR1。复杂数据类型的实参只能位于数据块(全局或实例数据)或调用块的暂态局部数据块中(V区中)。如果实参位于数据块中,DB寄存器中将会加载数据块的序号,AR1中的区指针包含地址区DB。如果实参位于V区中,DB寄存器中将会加载0,AR1中的指针将包含地址区V。
第二个网络包含与功能值相等的程序,其地址位于AR2和DI寄存器中。为了能够通过DI寄存器间接寻址,地址区DI必须输入到AR2中。然而,根据实参所占用存储器的不同,地址区也不同。当存储器内为数据块时,地址区为DB序号;存储器内为V区时,地址区为V序号。通过将AR2的第24位置为“1”,可以把地址区从DB改变到DI,但没有改变任何地址区V。
这样准备之后,在下一个网络中可以检验功能值中实参的长度。长度Z少为6个字符。如果小于6个字符,二进制结果BR中将包含“0”(否则为“1”),块处理结束。这样,在调用功能“DT_Conv”之后,就可以通过二进制结果来校验处理错误。
下一个网络从Tim中获取年和月(以BCD格式),并将其值转换为ASCII字符(在它们前面加3),并写回到功能值中。对于天数也是如此。
程序以功能值中当前长度的修正结束。
陕西西门子S7-1500PLC模块代理(量大从优)