| 查看: 4633 | 回复: 21 | ||||||||
| 【奖励】 本帖被评价14次,作者chenfire增加金币 14 个 | ||||||||
| 当前主题已经存档。 | ||||||||
[资源]
【原创】LabVIEW与仪器通讯 —— 通讯协议
|
||||||||
|
在LabVIEW编程中,经常要在前面板跟后面板之间切换,打不打断思路的情况下,有两种快速的切换方式:一是双击某个输入或显示控件,二是利用快捷键“Ctrl+E”。快捷键在编程过程中的非常好用,例如新建文件可以用“Ctrl+N”,当一个大程序在调试过程中,对某些部分的功能不太肯定时,可以把它们选择上,然后用“Ctrl+C、Ctrl+N、Ctrl+V”,在新文件里面调试。Ctrl+C跟Ctrl+V是大家都用过的复制、粘贴快捷键。再有就是Ctrl+S比较常用,保存修改;Ctrl+W:关闭。熟练运用快捷键的话,可以使编程加快,软件操作起来更流畅。 好,进入正题,上个帖子讲了接口,(http://muchong.com/bbs/viewthread.php?tid=1756408&fpage=1),这次介绍通讯协议。 2. 通讯协议 通讯协议可以理解为一种语言,是计算机与设备交流的方式。计算机必须讲设备能听得懂的语言,设备才能根据计算机的指令进行工作。 各个厂商会自定义自己的通讯协议,当然大牌厂商往往都会采用标准的SCPI语言,这种语言看起来比较舒服,也简单明了。而国内的厂商则是五花八门。几乎每个厂都根据自己的喜好来定通讯协议。有的厂甚至还有几种不同的通讯协议(如常州同惠)。 2.1 例子 其实设备的控制并没有想象中的那么神秘,通过下面这个例子大家就能入门了。 仪器是Keithley的2010数字万用表,这个设备同时带GPIB接口跟串口,这里用的是串口连接。仪器面板上显示的是测量电阻的功能。我在LabVIEW上写了这样的程序: ![]() ![]() 运行后,前面板的“数值显示控件”上出现了一个数值“1000.479343”,这就是当前的电阻值。如果把这个“数值显示控件”替换成一个“波形图表”,连续运行这个程序,就会出现一条电阻曲线图,如下图所示。这个图就是每隔50毫秒,电阻的变化值。从这个例子可以看出来,原来只能测单点电阻值的设备,通过与LabVIEW的通讯,变成可以记录电阻-时间变化曲线的设备了,功能扩展了。 ![]() 例子的功能讲到这里,该介绍一下程序了。回头看看第一个图,“VISA资源名称”其实就是仪器地址,我们用的是串口一,所以填COM1,顶上的字符串常量“:FETCh?\n”就是我们这里要讲的通讯协议,留到后面说。往右边是一个VISA Write控件,将前面的字符串常量“:FETCh?\n”通过COM1写入到设备中去,之后给50毫秒的延迟等待设备响应命令,将测试结果送到串口总线上,然后通过一个“VISA串口字节数”控件来测试设备送回来的数据长度,并把这个数据长度传给VISA Read控件,VISA Read把仪器接口总线上所有数据如数读回计算机。因为读回到计算机的数据是字符串格式的,所以用一个字符串转换控件,将读回来的数据转换成十进制数字格式并送显示。 这个程序就这么简单,设备的控制也就是如此而已。 2.2 通讯协议显示方式 控制设备最核心的部分,是LabVIEW如何跟设备通讯,也就是上面例子里面,“:FETCh?\n”之类代码的含义。这是一个字符串常量,字符串常量的显示方式有4种,分别是“正常显示”、“\代码显示”、“密码显示”跟“十六进制显示”。显示方式非常重要,写各种通讯协议必须非常注意的。有网友说,运行别人写的程序就可以,但运行自己写的、看起来跟别人一摸一样的程序就出错,其原因很可能就在这里。虽然显示出来的代码都是“:FETCh?\n”,但如果选“正常显示”跟“\代码显示”,其中的字符就差别一个“\”号,就是这个“\”符号导致程序不能运行。 在字符串输入控件、字符串显示控件跟字符串常量上按右键,就可以选择并确定当前的控件用那种显示方式。 上面这个例子,用的是“\代码显示”方式,最后面的“\n”代表一个换行符。这种显示方式在各种语言的程序设计中都是经常用到的。在LabVIEW中常用的有“\s”空格,“\t”Tab键。如果选择“正常显示”的话,我们看到的是“:FETCh?”就是后面的“\n”没显示出来。但在这个设备的通讯协议中,每句命令都必须以“\n”作为结束符,为了直观,在这个程序中的命令符采用“\代码显示”。(如果还没搞明白怎么回事的话,可以上搜索引擎找“转义字符”,可能有的人解释的比较清楚,我这里就不做仔细讨论了) 还有一个显示方式是“密码显示”,这种显示方式就比较常见了,不管输入什么字符,默认都用一个“*”号表示,当然也可以换默认字符。但这种显示在LabVIEW通讯编程上,比较少用,至少我从来没用过。 最后一种显示方式是“十六进制显示”,这种显示方式也是在设备通讯上常用的。例如有的设备使用Modbus RTU通讯协议,读写过程中传输的都是十六进制的数据。这时候,最好就是采用“十六进制显示”,这样通讯语言看起来就比较直观。举个例子,我现在要向一个使用Modbus RTU协议的温控器输入命令,这样我在“十六进制显示”的字符串控件中输入“0106 0040 0320 8936”,上面的各个数字对应的都有特殊的含义,熟练的人一眼就能看出来,而如果用“正常显示”,则成了无规则的“乱码”。 2.3 各种通讯协议 上面例子里提到的“:FETCh?\n”,是一种标准的SCPI通讯协议,这种协议的特点是简单易懂,从字面上就可以猜得到这个命令的作用,如“:FETCh?\n”,就是英文字母fetch,“获取”的意思,作用就是获取当前设备的测试结果。再举个例子:“:FUNCtion\s'CURRent:AC'\n”,从字面上可能就猜得到这个命令的意思了,就是把设备的功能切换到测量交流电流档。 各种设备的通讯协议可能稍微有些不同,主要是前缀、后缀的起始符、结束符稍有不同。只要仔细阅读通讯协议,不断尝试,这个问题不难解决。 除了标准SCPI通讯协议之外,比较难对付的是其他一些自定义的协议,因为从协议上的代码,不翻手册你是猜不到它具体的含义的。例如比较常用的Modbus RTU跟Modbus ASCII协议。就拿上面举的例子来说,在“十六进制显示”的字符串控件中输入“0106 0040 0320 8936”,对应通讯协议,它的含义是分别如下:0106是指RS485接口的设备地址为01,(这就是上节“接口”提到的,RS485的地址如何体现的问题,设备地址在通讯协议上体现了),06是写入单寄存器的功能,0040是写入的寄存器地址,这个寄存器上的数据是DO(0)输出口控制的温度值,0320是在指定的寄存器上写入的数值,十六进制,转成十进制是800,根据通讯协议,这里指80.0摄氏度;8936是16位CRC效验码。通过这条命令,是要告诉串口总线:往RS485设备地址为01的温控器传输命令,把地址为0040H的寄存器上写入0320H,这个动作的含义是把DO(0)输出端口的温度值设置为80度。有些人会觉得这很难理解,要拐几个弯才能识别到这条命令的意思,相比于标准SCPI命令来说,Modbus协议费解一些,但相对于一些企业自定义的协议来说,Modbus还算比较好的,至少每个节点都有一定的含义:一条命令上的数字代表的意思分别是:设备地址、操作、寄存器地址、数据、校验码。而一些企业自定义的代码,你永远猜不到是什么意思,也猜不到它为什么要那样写,反正这条命令就是对应这个功能,你得将就它。 上面提到的Modbus RTU跟Modbus ASCII的区别在于,Modbus RTU通讯协议下,必须选择“十六进制显示”才能看到实际发送/接收的代码,而Modbus ASCII协议用“正常显示”就能看到。 这里还要来稍微提一下校验码,因为早期的数据传输不稳定,为了确保接收到的命令是正确的,先要进行校验。每个公司对校验码的定义可能都不一样,常有的有8 bit的CRC、16位的CRC等。也可能用企业自定义的计算方法。对于常用的校验码计算方式,可以写一个子程序保存起来,以备下次调用。 应该说,搞懂了通讯协议就解决了设备的控制问题,只要设备能响应一条命令,那么这台设备的所有通讯问题都能解决。 在常用的大厂设备中,底层的通讯协议一般都不用自己写,直接上NI的主页下载就行了,因为全世界的LabVIEWer都很热心地上传他们写的子程序。我们要做的只是上去下载来用就是了。但偶尔也有些功能不适用,这时候就需要自己动手写了。相信有了一些参考的例子,结合自己一些实际编写经验,每来一台新的设备,只要照葫芦画瓢就行了。 3 其他问题 除了接口跟通讯协议外,在写程序控制设备的过程中那个还会经常遇到一些问题。我总结一下,下次再贴给虫友们。 [ Last edited by chenfire on 2009-12-28 at 20:21 ] |
» 收录本帖的淘帖专辑推荐
研究生须知 | Immiscible的淘贴 | 科研、英语学习及生活 | LabVIEW |
Labview学习应用资料 |
» 猜你喜欢
2025冷门绝学什么时候出结果
已经有3人回复
天津工业大学郑柳春团队欢迎化学化工、高分子化学或有机合成方向的博士生和硕士生加入
已经有4人回复
康复大学泰山学者周祺惠团队招收博士研究生
已经有6人回复
AI论文写作工具:是科研加速器还是学术作弊器?
已经有3人回复
孩子确诊有中度注意力缺陷
已经有6人回复
2026博士申请-功能高分子,水凝胶方向
已经有6人回复
论文投稿,期刊推荐
已经有4人回复
硕士和导师闹得不愉快
已经有13人回复
请问2026国家基金面上项目会启动申2停1吗
已经有5人回复
同一篇文章,用不同账号投稿对编辑决定是否送审有没有影响?
已经有3人回复
nono2009
超级版主 (文学泰斗)
-

专家经验: +21105 - 仿真EPI: 1
- 应助: 28684 (院士)
- 贵宾: 513.911
- 金币: 2555140
- 帖子: 1602243
- 在线: 65200.8小时
- 虫号: 827383
2楼2009-12-28 19:23:35
3楼2009-12-28 20:14:08
4楼2009-12-29 11:18:12
5楼2009-12-29 12:01:21
6楼2009-12-29 12:08:40
7楼2009-12-30 09:52:15
8楼2009-12-30 10:09:39
9楼2009-12-31 00:17:33
10楼2009-12-31 19:17:22
11楼2009-12-31 22:43:38
12楼2010-01-05 10:19:44
13楼2010-01-05 14:17:22
14楼2010-01-05 19:34:49
16楼2010-01-16 16:37:56
18楼2010-01-27 20:12:53
19楼2010-03-25 09:03:55
20楼2010-04-06 13:27:23
21楼2010-04-08 23:06:58
22楼2010-04-09 11:11:22
简单回复
wph66615楼
2010-01-11 16:19
回复




sunning090817楼
2010-01-20 02:15
回复


















回复此楼


很好 很好