功能与样例通过TCP协议详情利用FC5AGSEND和FC6AGRECV传送具有可变.docx
《功能与样例通过TCP协议详情利用FC5AGSEND和FC6AGRECV传送具有可变.docx》由会员分享,可在线阅读,更多相关《功能与样例通过TCP协议详情利用FC5AGSEND和FC6AGRECV传送具有可变.docx(13页珍藏版)》请在冰点文库上搜索。
功能与样例通过TCP协议详情利用FC5AGSEND和FC6AGRECV传送具有可变
功能与样例:
通过TCP协议(利用FC5“AG_SEND〞和FC6“AG_RECV〞)传送具有可变消息长度的数据
显示订货号
问题:
如何利用通讯功能FC5“AG_SEND〞和FC6“AG_RECV〞,通过TCP协议传送具有可变消息长度的数据?
解答:
TCP协议的性能:
当通过TCP传送数据时,该传送是基于数据流的形式。
在这种情况下,不给出与消息长度、开始和完毕有关的信息。
发送消息时,这并不是问题,因为发送者知道要传送多少数据字节。
然而,接收者无法分辨消息在数据流中的何处完毕,下一个消息在何处开始。
因此,对于通过纯TCP建立的只有两个选项可选:
1.使用固定消息长度,也就是说,发送者和接收者都使用预定义的数据长度。
这意味着要始终明确定义消息限制。
2.使用可变消息长度。
在这种情况下,接收端和发送端都需要更多的时间,因为在开始字节中必须输入起始分隔符和要发送数据的数据长度。
这样,>接收者就可以正确地解释已接收的消息。
下面的实例程序包含一个TCP连接,通过该连接,具有可变消息长度的数据可以利用FC5发送给一个站,并利用FC6接收。
实例程序:
通过TCP协议(利用FC5“AG_SEND〞和FC6“AG_RECV〞)传送具有可变消息长度的数据
常规描述:
STEP7项目包括两个S7-300站,它们均具有用于工业以太网通讯的CPU315-2DP和CP343-1。
这两个站之间的通讯根底是TCP连接。
如果在NetPro中通过“右键单击>对象属性〞打开TCP连接属性,如此可以查看通讯功能块的块参数“ID〞。
在调用FC5和FC6时,要注意该规X,以便可以通过TCP连接传送数据。
图1:
TCP连接的属性
为了利用TCP协议传送数据,要传送的数据必须具有指定的结构。
消息必须包括起始分隔符(以便接收者可以识别消息从何处开始),数据长度规X(定义接收缓冲区)和数据本身。
在此实例中,定义了消息的4个字节的起始分隔符(预置值为:
0x11,0x12,0x13,0x14)和一个S7串。
该S7串包括两个字节的长度信息和实际的数据串。
使用S7串可以传送所有的ASCII字符。
图2:
消息的结构
须知事项:
该实例程序基于如图2所示的消息结构,但也可以自行定义消息结构。
如果希望使用不同的消息结构(例如,h起始分隔符只有3个字节),如此可以依照用户的特定需求,简单地改变该实例程序。
因此,希望利用FC5(AG_SEND)传送的数据,必须在数据块(DB220)中按照预定义的结构准备好。
随后,该数据可以利用FC6(AG_RECV)按如下步骤接收:
1.接收起始分隔符(逐字节地)并识别消息
2.接收S7串的长度信息
3.接收数据
STEP7程序描述
STEP7程序包括如下块:
OB100,OB1,FB100,DB100(FB100的背景DB),FB101(DB100中的多重背景),DB220,DB221,FC5,FC6。
∙OB100
OB100是启动OB,当CPU重启(暖重启)时,运行该OB。
在此OB中,发送的首个通讯触发器的版本为M1.0和M0.1。
图3:
OB100
∙OB1
周期性调用OB1。
该OB包括具有M1.0和M0.1的FB100(背景OB:
OB100)的调用。
一旦运行FB100,如此复位M1.0。
---------------
图4:
OB1
∙FB100:
在OB1周期中调用FB100。
该FB包括FC5“AG_SEND〞和FB101“AG_RECV_VARIABLE〞的调用。
发送块FC5“AG_SEND〞
当时钟标记M10.7为上升沿,且未置位“SND_BUSY〞时,输入参数“ACT〞h可以激活FC5。
当作业运行时,置位“SND_BUSY〞,并且,在此期间不能触发任何功能。
该功能块特别重要,因为该功能是异步的,且占有多个周期。
如果对该功能持续激活,而不是等待其中止,如此会导致通讯过载。
输入参数“ID〞和“LADDR〞只能从NetPro(图1)中的TCP连接属性对话框中获取。
在“SEND〞参数中,需要指定要发送数据的地址(P#DB220.DBX0.0BYTE48)。
在“LEN〞参数中,输入要发送的字节数(48)。
输出参数“DONE〞,“ERROR〞和“STATUS〞对于作业评估是必需的,而且只在同一个周期内有效。
图5:
FB100-调用FC5
如果块运行无错误,如此复位“SND_BUSY〞,并再次调用FC5。
如果该块因出错而终止,如此保存块的状态字用于错误分析,同样复位“SND_BUSY〞。
图6:
FB100-FC5调用的评估
接收块FB101“AG_RECV_VARIABLE〞
当调用FB101“AG_RECV_VARIABLE〞时,必须从NetPro(图1)中的连接属性对话框中获取参数“ID〞和“LADDR〞h。
在“RECV_BUF〞中,需要指定要接收数据的存储位置(P#DB221.DBX0.0BYTE50)。
输出参数“NDR〞,“ERROR〞和“STATUS〞对于作业评估是必需的,而且只在同一个周期内有效。
图7:
FB100-调用FB101
如果块运行无错误,如此保存接收到的数据长度。
如果该块因出错而终止,如此保存块的状态字用于错误分析。
图8:
FB100-FB101调用的评估
∙FB101(“AG_RECV_VARIABLE〞):
状态机:
通过变量“STATE_T〞来定义FB101中程序的输入点。
根据变量“STATE_T〞的状态,跳过与程序的进一步的处理相关的程序段。
按照“STATE_TP〞的程序处理:
∙
"STATE_T"
描述
0
已收到起始分隔符的第一个字节
(从NW9跳至NW13)
1
已收到起始分隔符的第二个字节
(从NW10跳至NW14)
2
已收到起始分隔符的第三个字节
(从NW11跳至NW15)
3
已收到起始分隔符的第四个字节
(从NW12跳至NW16)
4
已识别起始分隔符。
正在接收数据信息
(从NW3跳至NW17)
5
已创建接收缓冲区且数据已接收
(从NW4跳至NW20)
∙
∙
接收起始分隔符(逐字节)并识别消息(程序段5-16)
使用FC6“AG_RECV〞,逐字节地接收起始分隔符(4字节)。
∙
当调用FC6“AG_RECV〞时,参数“ID〞和“LADDR〞来自FB101的输入参数。
在“RECV〞中,需要指定已接收字节的存储位置(SD缓冲区:
字节变量)。
输出参数“NDR〞,“ERROR〞和“STATUS〞对于作业评估是必需的,而且只在同一个周期内有效。
∙
如果块运行无错误,如此保存接收的字节,用于进一步的处理。
如果该块因出错而终止,如此保存块的状态字用于错误分析。
∙
已接收字节后,检验已定义的起始信息。
(Byte0=11;Byte1=12;Byte2=13;Byte3=14)。
∙
图9:
通过起始分隔符识别消息
接收S7串的长度信息(程序段3,17-20)
如果已接收的信息被识别为起始分隔符,那么利用FC6“AG_RECV〞接收S7串的长度信息(两个字节)。
当调用FC6“AG_RECV〞时,参数“ID〞和“LADDR〞来自FB101的输入参数。
在“RECV〞中,需要指定两个长度信息字节的存储位置(VAR_LEN:
由两个字节构成)。
输出参数“NDR〞,“ERROR〞和“STATUS〞对于作业评估是必需的,而且只在同一个周期内有效。
如果块运行无错误,如此已接收数据的实际长度用于接收缓冲区(ANY指针)。
如果该块因出错而终止,如此块的状态字作为FB101的输出参数显示。
图10:
接收长度信息
在创建接收缓冲区(ANY指针)时,有关串(VAR_LEN.ACT_LEN)的实际长度的信息是必需的。
在此,当调用FB101时,使用数据的实际长度来检验已指定的接收缓冲区(ANY指针),并将其存储在临时的ANY指针(VAR_BUF)。
图11:
创建接收缓冲区
接收数据(程序段4,21-23)
随后,利用FC6接收数据。
当调用FC6“AG_RECV〞时,参数“ID〞和“LADDR〞来自FB101的输入参数。
在“RECV〞中,需要指定数据的存储位置(VAR_BUF:
临时ANY指针)。
输出参数“NDR〞,“ERROR〞和“STATUS〞对于作业评估是必需的,而且只在同一个周期内有效。
如果块运行无错误,如此保存已接收数据的长度,并将其作为输出参数发送给FB101。
如果该块因出错而终止,如此块的状态字作为FB101的输出参数显示。
图12:
接收数据
∙DB220:
与FC5一起使用的数据结构位于DB220。
图13:
DB220-发送数据结构
∙DB221:
与FC6一起接收的数据存储在DB221。
该下载包括已描述的实例程序,通过STEP7V5.3和SIMATICNETV6.2创建。
将“〞文件复制到一个单独的目录中,然后通过双击来启动该文件。
STEP7项目将自动解压所有的子目录。
随后,p可以使用SIMATIC管理器来打开并处理该项目。
过滤标准:
硬件平台:
IndustrialEthernet,SIMATICS7-300/S7-400
软件:
帖子内容:
功能组件/工具
条目号:
8707570
日期:
2005-06-23