分享

LabVIEW编程实例:如何基于TCP协议发送参数命令包

 lgk88888 2019-01-17

在上篇文章中,已经讲了LabVIEW中基于TCP协议进行数据通信的基本方法,详细请参考。

可能有的小伙伴就问了,那个太简单了,而且发送的是最简单的字符串信息,对于实际的仪器硬件控制,一般发送的多是参数命令包的形式,在参数命令包中会包含多个参数,且每个参数数据类型可能不同,占用的字节长度也不同,那么,在LabVIEW中如何将这些参数打包为字节流数据进行发送呢?

下面通过一个具体的例子,演示在LabVIEW中如何通过网口基于TCP协议发送包含多个参数的命令包信息。

实例说明

LabVIEW中基于TCP协议编写VI程序,实现通过网口对某个硬件设备发送参数命令包进行控制。其中,硬件设备为服务器端,假设命令包的格式要求如下:

l  整个包大小为32Byte,中间不足部分补0

l  包头、包尾各占4个字节,分别为0X12 34 56 78”和0X87 65 43 21

l  包头后面紧跟着各个参数值,为简单起见,这儿仅给出了3个有符号整型的参数,且每个参数的初始值、占用字节数定义如下:

032-1

编程思路

由于硬件设备是服务器,所以我们写的VI程序是作为客户端的角色存在的,当客户端根据主机的IP地址和端口号发出连接请求并成功建立起连接后,需要将32个字节的内容发送到服务器端。

所以,问题的核心是如何将发送的参数信息打包为包含包头、包尾且符合要求的字节流数据。这儿需要用到一个LabVIEW平台提供的关键函数“平化至字符串”,该函数可将任意数据转换为二进制值组成的字节流数据(LabVIEW中表现为字符串类型),其参数信息如下图所示:

032-2

该函数参数中,除了待转换的数据参数外,还包括一个“预置数组或字符串大小?”参数,这个参数是只有输入数组或字符串类型的数据时才有效,对于这个例子设置为假即可。

字节顺序也是一个比较重要的参数,用以设置返回的平化字符串中数据的endian形式。字节顺序表明在内存中整数是否按照从最高有效字节到最低有效字节的形式表示,或者相反。它是一个枚举类型的参数,可取的值及每个值的意义如下图所示:

032-3

使用这个函数将所有的内容打包为字节流数据后,就可以使用“写入TCP”函数发送到服务器端也就是硬件端了。

前面板设计

针对这个例子,设计前面板如下图所示:

032-4

在前面板上可以设置待连接的服务器端的IP地址、端口号,待发送的内容及字节顺序等信息。

程序框图设计

程序框图主框架采用包含三帧的顺序结构,第一帧和第三帧分别实现打开TCP连接和关闭TCP连接。第二帧为代码的主要处理部分,采用while循环与事件结构的方式,当用户点击前面板上的“发送参数包”按钮时,将参数、包头、包尾等信息打包为字节流数据发送到硬件端。

第一帧代码如下图所示,根据IP地址和端口号使用“打开TCP连接”函数向服务器端申请连接,连接建立成功后返回一个连接ID,该参数通过顺序结构的局部变量传递到后面帧以作进一步的处理。

032-5

第三帧框图程序较为简单,当程序退出时关闭TCP连接,如下图所示:

032-6

第二帧代码如下图所示:

032-7

该帧在“发送参数包”按钮“值改变”事件中时,将参数、包头、包尾等信息打包为字节流数据发送到硬件端,下面对代码进行详细解释。

首先使用“创建数组”函数创建包含32个元素的一维数组,数组元素的类型为“I8”类型,其中前4个字节和后4个字节分别为包头和包尾,中间的24个字节为全0。将这个包含32个元素的一维数组使用“平化至字符串”函数转换为字节流数据(字符串类型)。

然后将待发送的具体参数信息(簇类型)也使用“平化至字符串”函数转换为字节流数据(字符串类型),使用“替换子字符串”函数,将上面产生的一维数组从第5个元素(前4个为包头信息)开始替换即可。

最后将替换后的字符串数据使用“写入TCP数据”发送至服务器端(硬件)就完成了我们的任务。

其中“平化至字符串”函数需要的字节顺序参数可通过前面板上控件进行设置。

程序运行结果

下面借助于网口调试助手来模拟某硬件设备,看一下这个程序的运行情况。

先设置网口助手参数,将网口助手设置为服务器端,IP地址和端口号分别设置为192.168.0.1091080,打开服务器。

然后运行我们的程序,IP地址和端口号同样设置为192.168.0.1091080,点击前面板上的“发送参数包”按钮,字节顺序分别选择“little-endian”和“big-endian”,可以看到结果如下:

032-8

在上图网络数据接收区,第一行显示的字节顺序是“little-endian”,数据确实是按小端存放的,如“参数b”其值为20,其16进制表示为0x0014,其接收顺序为“14 00”,数据的低位存放在低内存地址位置。第二行显示的字节顺序是“big-endian”,刚好相反。其它参数bc的字节顺序情况也是相同。

同时,向硬件端发送的内容正确的包含了包头、包尾信息且共32个字节,完全达到了我们的要求。

总结

从这个例子可以看出,在LabVIEW中将待发送参数包打包为字节流数据,通过TCP协议发送至硬件端进行仪器的控制,也是非常简单的。

 

如果你觉得这篇文章对你有用的话,收藏+点赞吧。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多