恭喜,你发布的帖子
发布于 2016-06-12 10:29:51
12楼
一切皆有因果,也是与这里的西门子工程师们有缘。有缘才会来这里,有缘才会有心交流。
问题产生的原因:
项目需要:需要采用西门子PLC与第三方系统(高层系统)进行基于open socket的message数据交互。
因为工作上的局限性,所以只能把项目上的应用告诉给大家,给大家提供一个思路。也希望大家能在此基础上,继续钻研,而不要拘泥与下面的内容。
首先介绍西门子的两个链接,有对通讯有详细的介绍:
http://snap7.sourceforge.net/siemens_comm.html
希望大家能够认真的阅读一下上面链接中提供的信息。
从参考的链接中可以得知,西门子发送消息是其基本功能,所以工程师如果在遇到发送接收open socket消息的时候,也不要紧张,因为这个是西门子基本的功能。
其实在看完上述链接之后也基本是可以明白如何去做。
后面的描述也就是描述如何在目前的项目中的应用过程,有兴趣的工程师可以继续往下看。
先对项目的需要进行形式化的图形描述(形式化描述,是为了更好的表述问题,描述有简单和复杂,对待不同的对象有不同程度的描述,比如:对待实际开发的工程师,就需要精确描述;而对客户来说,只需要简单描述即可)。
借用第二个链接中的图示,项目需求如下:
西门子可以有两种硬件方式来进行通讯(S7-300):
CPU自带的网口通讯:采用OCW配置通讯,功能块是:TRCV, TSEND
CP343网卡与第三方通讯:通过NetPro配置,功能块是:AG_RCV和AG_SEND.
基本两种的只是配置的时候有点不同,实际的应用是一样。
下面介绍实际的应用过程:(采用CP 343,硬件配置请参考西门子相关的资料)
消息内容的定义(定长):
定长就是数据长度是固定的,在定义数据的时候一定要注意一下几点:
西门子数据定义都是基于一个WORD,所以在定义数据的时候,尽可能是采用WORD作为数据的基本单位;
数据开始符:
定义好数据结构UDT后,在进行数据赋值的时候可以基于数据结构赋值,程序简单而且可读性,可扩展性好。
首先介绍一个概念FIFO,全称就是First input first output。
介绍FIFO是为了建立一个解决发送接收消息的性能的问题,通常数据是实时的发送和接收,如果发送或者接收数据在瞬时增加,就需要软件有一定的缓冲的功能,FIFO也就是定义一个缓冲数据区,用来在瞬时数据量增加的情况下,缓存一部分数据。
发送数据的过程,首先是装载数据,过程如下:(简单描述,不规范请见谅)
数据装载至FIFO中,每增加一条消息,数据INDEX_HEAD就需要增加1。
另一个功能块,就可以提供从FIFO读取数据的功能,简单描述如下:
Index_Head与Index_Tail之间的差值也就是需要发送数据的量。
当装载数据的时候,Index_Header + 1 等于Index_Tail时候,也就是说明有数据处理不及时丢失。
此时可以决定是不是继续装载,如果不继续装载将丢失当前发送的数据,而保留之前的数据;而继续装载将保留当前发送数据,而丢弃之前发送的数据。
非常感谢你的帮助,思路很清晰。已经准备按照这个思路实际操作了。之前就是没有找到合适的资料,造成好多都是凭感觉测试的。走了不少的弯路。
请填写推广理由:
分享
只看
楼主