使用TCP接收OpenSees的recorder数据

使用TCP接收OpenSees的Recorder数据

在使用OpenSees对结构进行分析的过程中,recorder命令是必不可少的,使用recorder命令对结构中重要节点、单元的位移进行记录,同时记录结构的基底反力,就可以绘制结构的滞回曲线。但是在OpenSees使用recorder向文件中添加数据的时候,文件是处于锁定状态的,也就是不能在模型计算的过程中实时的获取记录的位移,因此recorder提供了另一个方法——TCP发送。通过查看recorder的研究可以发现:

其中有一个-tcp的选项,根据帮助文件的描述:

需要一个IP地址和一个端口号,那这个很简单了,可以直接使用Python监听一个TCP的端口,那么就可以获得分析的数据了。因此,直接使用Python的socket模块监听一个TCP端口,这里我选择了8099端口,因为这个端口使用的软件比较少:

这里先期接收20个字节的数据看看是什么,在正式监听之前需要将下面的recorder代码插入到时程分析的OpenSees代码中去:

这里我输出的是模型中504号节点的三个自由度位移,这个节点号根据自己的需求定义。

执行TCP监听的Python代码,并且运行时程分析的tcl代码,可以直接得到print的数据:b’\x00\x00\x00\x00\x00\x00\x10@’。这里说明一下在进行TCP传输时,OpenSees是发送的字节流,因此还需要对获得的数据进行解码,在Python中对字节流解码可以使用str.decode()的命令,但是还有一个更为方便的就是使用Struct模块:

This module performs conversions between Python values and C structs represented as Python bytes objects. This can be used in handling binary data stored in files or from network connections, among other sources. It uses Format Strings as compact descriptions of the layout of the C structs and the intended conversion to/from Python values.

直接import struct后使用unpack()函数解码:

在构建Struct对象的时候,直接使用结构化代码’d’来定义,这表明传输过来的数据为64为浮点数。当然Struct支持很多种类的字节流解码:

使用TCP接收OpenSees的Recorder数据

使用TCP接收OpenSees的Recorder数据

可以根据实际传输需要进行选择,这样可以得到传输过来的第一个数据:(4.0,),其实这是表明后面数据的大小。为了更加清楚的了解传输数据的方式,可以写了一个循环进行数据的获取,看看传输过来的是什么数据:

可以得到下面的数据:

很明显,我们选择输出的信息为当前的时间以及节点的三个自由度上的位移,因此,输出的数据可以这么理解,第一个数据为数据长度,从第二个数据开始,依次输出数据长度,时间及三个自由度上的位移,根据这样的规则,我们编写一个简单的循环来存储所有的数据:

这样可以得到下面的数据:

到此成功获取recorder传输的TCP数据,由于TCP通信相比于从文件中获取数据来说更加直接,也更加适合与远程操作和分布计算,因此这样的方式更加有效率,根据这样的思路可以编写一个循环监听8099端口的代码,下面的代码是我修改了OpenSees论坛上的代码,用来循环获取数据,这样可以使用Python开启子线程一直监听8099端口,一旦接收到数据,主线程可以进行接下来的工作:

需要注意的是,在本机测试上面的代码是没有任何问题的,但是在联机测试的过程中,当recorder的节点数量过大(数百个节点自由度)时会产生丢包现象。这样导致的结果就是采用Struct解码的时候会出现错误数据,常见的问题就是数据扩大或者缩小至非正常数据,比如5.8e+312或者1.4e-217这样的数据,所以如果在多台电脑之间使用TCP传输数据,可以将安装OpenSees的A机器编写一个Python脚本接收OpenSees的数据,根据带宽采用合适的数据流传输至B机器。这样可以保证传输比较可靠。

下载本文源代码:点击下载

一条评论

  1. 刘宗成   •  

    非常有意思的文章,手动点赞

刘宗成进行回复 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Are you human? Click the Pineapple...