网络变量(NetworkVariable)探究(三)

第三部分 基于网络变量的复杂数据传输
在上一篇文章中,我们通过LabVIEW和VC#演示了网络变量通信。可以看到,在分布式系统管理器中创建网络变量时,可以为网络变量分配多种数据类型,这为我们实现各种类型的数据传输提供了便利。然而,这里仍然存在很大的局限性,设想我们有如下应用,在学生信息管理系统中存储了学生的基本信息和各门课程的成绩,举例如下:
学生信息表
序号 信息名称 信息值 信息类型
1 姓名 张三疯 字符串
2 年龄 20 整形
3 学号 5209527 字符串
4 班级 三年级二班 字符串
5 班主任 火龙真人 字符串
6 婚否 否 布尔型
7 成绩 古文鉴赏65.0 浮点型
8 高等数学 23.0 浮点型
9 宇宙物理 78.5 浮点型
10 装13高手的修炼手册 89.0 浮点型
11 泡妞大法 96.0 浮点型
现在我们要使用网络变量来传输学生的这组信息。从表中可以看出,这个 学(liú)生(máng)的信息非常丰富,信息数据类型包括布尔型、整形、浮点型和字符串型,一共有11个数据。难道我们要在分布式系统管理器中为这11条信息创建11个网络变量吗?当然,你可以说把5门成绩组合为一个数组,这样就少了4个。是的,确实少了一些,但哪天要是校长一拍脑袋,觉得信息还是太少,需要加入籍贯、出生地、身份证号、政治面貌等等信息呢?显然,为每条信息去创建一个网络变量会让网络变量的维护管理变得困难,还会增加软件的设计复杂度。
那么有没有一种高效的数据传输方式来解决这个问题呢?答案是肯定的。在LabVIEW中有一种叫做簇的东东,它是一种容器类数据类型,可以装入不同类型的数据……等等,怎么感觉到一股熟悉的味道扑面而来?没错,它与C语言中的结构体类型非常类似,或者说簇就是LabVIEW中的结构体。现在我们就把学生信息打包入簇。
在LabVIEW中新建一个VI,在函数面板中找到簇常量,然后往里面加入各个元素,其中成绩先组织为一个数组再放入簇中,最后结果如图1所示。
在这里插入图片描述

						图1

我们再给包含学生信息的簇取一个响亮的名字Student Info,这样,这个簇就把零散的信息打包起来成为了一个整体。
下一步要做的就是把这个簇发布到网络变量上去。按常规套路,我们应该先在分布式系统管理器中新建一个与需要发布的数据类型相同的网络变量,可是在网络变量的数据类型中根本找不到簇这个类型,如下图所示。
在这里插入图片描述

						图2

是不是这条路行不通?恭喜你答对了,确实行不通,行不通不是因为我们在网络变量的数据类型里找不到簇,实际上我们是有办法让网络变量支持簇数据类型的,方法是自定义一个簇控件并保存,新建网络变量然后设定其数据类型为来自自定义控件,选择保存好的簇自定义控件即可,如图所示。
在这里插入图片描述

						图3

比如我们把刚才创建的StudentInfo簇保存为一个自定义控件,并把这个控件设置为网络变量的数据类型,结果如下图所示,我们得到了自定义的数据类型。
在这里插入图片描述

						图4

这样这个网络变量就是簇类型。然而,簇这个东东是LabVIEW特有的数据类型,在其他平台如C#、LabWindows/CVI等是不支持的,即使有了簇类型的网络变量也仅限于在LabVIEW同平台内通信,要跨平台也是不行的。如果你不相信,非要去撞南墙,可以在VS中用C#编写连接该自定义簇类型网络变量代码来试试,当我们试图去连接它时,它会毫不留情地抛出下面这个错误,真是一点面子都不给。
在这里插入图片描述

						图5

怎么办怎么办?一个大写的问号悬浮在头顶上挥之不去,放弃吗?好啊好啊,一个欢快的声音在耳边响起,是的,迎难而退随波逐流它不香吗?正要关机睡觉的时候,另一个神秘的声音从脑海深处缓缓飘来并越发清晰,它不断重复着:“0……1……0……1……”对呀,在计算机的世界里除了0就是1,别无他物。在CPU看来,无论是布尔型整形浮点型还是杀马特型,无论是结构体共用体还是甄嬛体,都是0和1的各种组合,小样,你以为换了一身马甲我就不认识你了吗?不管你包装得多么华丽,在我看来不过是皇帝的新衣。CPU每天的工作就是把0和1进行各种排列组合,就像人类,我们开飞机、种玉米、打篮球、煮酸菜粉丝汤……不过就是把各种原子搬来搬去……
扯远了,回到正题。
既然所有的数据都是0和1组成的(最小单元是包含8个位的字节), 那么我们可不可以把复杂类型(簇、结构体、类)按照一定的规则还原为字节流或者字符串流发布到字符串型的网络变量,在接收端再按照相应的规则把字节流或者字符串流还原为复杂类型呢?当然可以的,只要Writer和Reader双方都支持这种中间媒介的转换即可,这叫万变不离其宗。想到这里忽然觉得前面的道路宽阔起来,但是上哪儿去找这个媒介呢?正愁间,背后传来一阵爽朗的笑声,回头一看,原来是JSON这个老家伙驾着一片七彩祥云缓缓飘来降落在身后,只见它双手合十,眯眼颔首道:“施主久等了,我就是你苦苦期盼的中间媒介。”看着它故作神秘的样子大脑顿时豁然开朗。
有了JSON大神的帮忙,一切就简单多了,说干就干。
在LabVIEW的字符串函数API中,有一个函数,功能是将各种数据转换为JSON字符串,见下图,就长这样式儿的。
在这里插入图片描述

						图6

我们可以使用这个API将前面创建的包含学生信息的簇转化为JSON字符串,代码及运行结果见下图。
在这里插入图片描述

						图7

在这里插入图片描述

						图8

可以看到,我们成功将簇类型数据转换为了JSON字符串,但是有部分乱码,这是因为 函数的输出字符串是UTF-8编码的,而显示框采用的是ASCII编码,为了正常显示,我们可以把UTF-8编码的字符串转换为ASCII字符串,这里要用到一个转换函数,这个转换函数在LabVIEW的基础包中是没有的,需要额外安装Unicode Tools工具包才能使用,修改后如下图所示。
在这里插入图片描述

					图9

在这里插入图片描述

						图10

现在正常了。
我们实现了将复杂类型数据转换为JSON字符串,剩下的事就Easy了,打开分布式系统管理器,创建一个字符串类型的网络变量,如下图所示。
在这里插入图片描述

						图11

继续修改LabVIEW中的代码,加入网络变量写功能,即把转换后得到的JOSN字符串写入到网络变量中,下图所示。
在这里插入图片描述

						图12

Writer端就完成了,接下来我们开发Reader。和上一章一样,Reader端使用VC#来完成。代码如下

public partial class MainFor
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值