回复:TCP通讯,PLC作为server

杭州小子

  • 帖子

    151
  • 精华

    0
  • 被关注

    16

论坛等级:游侠

注册时间:2011-11-03

普通 普通 如何晋级?

发布于 2016-06-12 10:29:51

12楼

展开查看
以下是引用潇潇在2016-05-31 05:06:22的发言 >11楼

一切皆有因果,也是与这里的西门子工程师们有缘。有缘才会来这里,有缘才会有心交流。


问题产生的原因:

项目需要:需要采用西门子PLC与第三方系统(高层系统)进行基于open socket的message数据交互。

因为工作上的局限性,所以只能把项目上的应用告诉给大家,给大家提供一个思路。也希望大家能在此基础上,继续钻研,而不要拘泥与下面的内容。


首先介绍西门子的两个链接,有对通讯有详细的介绍:

https://support.industry.siemens.com/cs/document/8707570/transferring-data-(with-fc5-ag_send-and-fc6-ag_recv)-with-variable-message-lengths-via-the-tcp-protocol?dti=0&lc=en-WW


http://snap7.sourceforge.net/siemens_comm.html


希望大家能够认真的阅读一下上面链接中提供的信息。

从参考的链接中可以得知,西门子发送消息是其基本功能,所以工程师如果在遇到发送接收open socket消息的时候,也不要紧张,因为这个是西门子基本的功能。

其实在看完上述链接之后也基本是可以明白如何去做。

后面的描述也就是描述如何在目前的项目中的应用过程,有兴趣的工程师可以继续往下看。


先对项目的需要进行形式化的图形描述(形式化描述,是为了更好的表述问题,描述有简单和复杂,对待不同的对象有不同程度的描述,比如:对待实际开发的工程师,就需要精确描述;而对客户来说,只需要简单描述即可)。

借用第二个链接中的图示,项目需求如下:


西门子可以有两种硬件方式来进行通讯(S7-300):

  • CPU自带的网口通讯:采用OCW配置通讯,功能块是:TRCV, TSEND

  • CP343网卡与第三方通讯:通过NetPro配置,功能块是:AG_RCV和AG_SEND.

基本两种的只是配置的时候有点不同,实际的应用是一样。


下面介绍实际的应用过程:(采用CP 343,硬件配置请参考西门子相关的资料)

消息内容的定义(定长):

定长就是数据长度是固定的,在定义数据的时候一定要注意一下几点:

  1. 西门子数据定义都是基于一个WORD,所以在定义数据的时候,尽可能是采用WORD作为数据的基本单位;

  2. 数据开始符:, 结束符,数据结束符,以及校验等等,请参考数据通讯的相关书籍。

定义好数据结构UDT后,在进行数据赋值的时候可以基于数据结构赋值,程序简单而且可读性,可扩展性好。


首先介绍一个概念FIFO,全称就是First input first output。

介绍FIFO是为了建立一个解决发送接收消息的性能的问题,通常数据是实时的发送和接收,如果发送或者接收数据在瞬时增加,就需要软件有一定的缓冲的功能,FIFO也就是定义一个缓冲数据区,用来在瞬时数据量增加的情况下,缓存一部分数据。


发送数据的过程,首先是装载数据,过程如下:(简单描述,不规范请见谅)

数据装载至FIFO中,每增加一条消息,数据INDEX_HEAD就需要增加1。

另一个功能块,就可以提供从FIFO读取数据的功能,简单描述如下:

Index_Head与Index_Tail之间的差值也就是需要发送数据的量。

当装载数据的时候,Index_Header + 1 等于Index_Tail时候,也就是说明有数据处理不及时丢失。

此时可以决定是不是继续装载,如果不继续装载将丢失当前发送的数据,而保留之前的数据;而继续装载将保留当前发送数据,而丢弃之前发送的数据。


非常感谢你的帮助,思路很清晰。已经准备按照这个思路实际操作了。之前就是没有找到合适的资料,造成好多都是凭感觉测试的。走了不少的弯路。

评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54710条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。