24小时热门版块排行榜    

CyRhmU.jpeg
查看: 4635  |  回复: 21
【奖励】 本帖被评价14次,作者chenfire增加金币 14
当前主题已经存档。
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

chenfire

木虫 (著名写手)


[资源] 【原创】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 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

hky9807

木虫 (著名写手)


★★★★★ 五星级,优秀推荐

这个要坚决的顶起来!
谢谢!
7楼2009-12-30 09:52:15
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 22 个回答

★★★★★ 五星级,优秀推荐

沙发支持。专家原创作品不断,太牛了
2楼2009-12-28 19:23:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

chenfire

木虫 (著名写手)


引用回帖:
Originally posted by nono2009 at 2009-12-28 19:23:
沙发支持。专家原创作品不断,太牛了

呵呵,就要毕业了,上班以后可能不会用到这方面的东西了。最近比较闲,写写总结,一是留个纪念,二是希望对新人有用吧。
谢谢nono版主的慷慨金币跟每帖必顶、且只坐沙发的支持。

[ Last edited by chenfire on 2009-12-28 at 20:17 ]
3楼2009-12-28 20:14:08
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

goldjay

至尊木虫 (知名作家)


好好休息楼主的介绍,谢谢
5楼2009-12-29 12:01:21
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
☆ 无星级 ★ 一星级 ★★★ 三星级 ★★★★★ 五星级
普通表情 高级回复(可上传附件)
信息提示
请填处理意见