第13章 LabVIEW串口通信程序设计
图13-58 扫描安装的模块
单击模块名称“4012”,进入测试/配置界面,如图13-60所示。设置模块的地址值(1)、波特率(9600)、电压输入范围等,完成后,单击“Update”按钮。图13-60中模块名称4012前显示其地址值01,AI通道的输入电压是1.4635V。
图13-59 显示已安装的模块 图13-60 4012模块配置与测试
单击模块名称“4050”,进入测试/配置界面,如图13-61所示。 设定波特率和校验和应注意:在同一条485总线上的所有模块和主计算机的波特率和校验和必须相同。连网前分别设置好两个模块的地址,不能重复。
4.添加设备
运行设备管理程序DevMgr.exe,在出现的对话框中从Supported Devices列表中选择“Advantech COM Devices”项,单击“Add”按钮,出现“Communication Port Configuration”
对话框,设置串口通信参数,如图13-62所示。图13-61 4050模块配置与测试 完成后,单击“OK”按钮。
展开“Advantech COM Devices”项,选择“Advantech ADAM-4000 Modules for RS-485”项,单击“Add”按钮,出现“Advantech ADAM-4000 Modules Parameters”对话框,如图13-63所示。在Module Type下拉列表中选择ADAM 4012在Module Address文本框中设置地址值,如1(必须和模块的配置值一致)。
同样添加模块ADAM 4050,地址值设为2,完成后单击“OK”按钮。这时在Installed Devices列表中出现模块ADAM 4012与模块ADAM 4050的信息,如图13-64所示。
– 307 –
LabVIEW虚拟仪器数据采集与串口通信测控应用实战
图13-62 添加串口 图13-63 添加模块
在Installed Devices列表中选择模块“000 < ADAM 4012 Address=1 Dec.>”,单击右侧的“Test”按钮,出现“Advantech Devices Test”对话框,如图13-65所示。在Analog Input选项卡中,显示模拟输入电压值。图13-65中,ADAM-4012模块的输入电压是1.4235V。
图13-64 模块添加完成 图13-65 测试模块
至此,就可以用开发软件对I/O模块编程了。
13.7.2 设计任务
利用LabVIEW编写应用程序实现远程I/O模块温度测量与控制。 任务要求。
(1)自动连续读取并显示温度测量值;显示测量温度实时变化曲线。 (2)当测量温度大于设定值时,线路中指示灯亮。
13.7.3 任务实现
1.建立新VI程序
启动NI LabVIEW程序,选择新建(New)选项中的VI项,建立一个新VI程序。 2.程序前面板设计
? 在前面板设计区的空白处单击鼠标右键,显示控件选板(Controls)。
– 308 –
第13章 LabVIEW串口通信程序设计
(1)添加一个仪表显示控件:控件(Controls)→数值(Numeric)→仪表(Meter),将标签改为“温度表”。
(2)添加一个实时图形显示控件:控件(Controls)→图形(Graph)→波形图形(Waveform Chart),将标签改为“温度曲线”。
(3)添加一个数值显示控件:控件(Controls)→数值(Numeric)→数值显示控件(Numeric Indicator),将标签改为“温度值:”。
(4)添加一个指示灯控件:控件(Controls)→布尔(Boolean)→圆形指示灯(Round LED),将标签分别改为“指示灯”。
(5)添加一个串口资源检测控件:控件(Controls)→新式(Modern)→ I/O → VISA资源名称(VISA resource name);单击控件箭头,选择串口号,如ASRL1:或COM1。
(6)添加一个停止按钮(Stop Buffor)控件:控件(Controls)→布尔(Boolean)→停止按钮(Stop Butoon),标题为“STOP”。
设计的程序前面板如图13-66所示。
图13-66 程序前面板
3.框图程序设计——添加函数与连线
程序设计思路:读温度值时,向串口发送指令“#01”+回车,模块向串口返回电压值(字符串形式);超温控制时,向串口发送指令“#021001”+回车。
要解决两个问题:如何发送读指令?如何读取电压值并转换为数值形式?
? 进入框图程序设计界面,在设计区空白处单击鼠标右键,显示函数选板(Functions)。 (1)添加一个While循环结构:编程(Programming)→结构(Structures)→ While 循环(While Loop)。
(2)在While循环结构中添加一个顺序结构:编程(Programming)→结构(Structure)→ 层叠式顺序结构(Stacked Sequence)。
将顺序结构的帧(Frame)设置为5个(序号0~4)。设置方法:选中顺序结构(Sequence),单击鼠标右键,执行在后面添加帧(Add Frame After)选项4次。
(3)在顺序结构Frame 0中添加5个函数。
??添加一个串口配置函数:编程(Programming)→仪器I/O(Instrument I/O)→串口(Serial)→ VISA配置串口(VISA Configure Serial Port)。
??添加4个数值常量:编程(Programming)→ 数值(Numeric)→ 数值常量(Numeric Constant),值分别为9600(波特率)、8(数据位)、0(校验位,无)、1(停止位)。
??将函数VISA资源名称(VISA resource name)的输出端口与串口配置(VISA Configure Serial Port)函数的输入端口VISA资源名称(VISA resource name)相连。
– 309 –
LabVIEW虚拟仪器数据采集与串口通信测控应用实战
??将数值常量9600、8、0、1分别与VISA配置串口(VISA Configure Serial Port)函数的输入端口波特率(baud rate)、数据位(data bits)、奇偶(parity)、停止位(stop bits)相连。
(4)在循环结构中的条件端口上单鼠标右键,在弹出的快捷菜单上选择“真时停止(Stop if True)”项;将停止按钮图标与循环结构的条件端子相连。
连接好的框图程序如图13-67所示。
图13-67 添加初始化串口函数
(5)在顺序结构Frame 1中添加4个函数。
??添加一个字符串常量:编程(Programming)→字符串(String)→字符串常量(String Constant),值改为“#01”,标签为“读01号模块1通道电压指令”。
??添加一个回车键常量:编程(Programming)→字符串(String)→回车键常量(Carriage Return)。
??添加一个字符串连接函数:编程(Programming) →字符串(String)→连接字符串(Concatenate Strings),用于将读指令和回车符送给写串口函数。
??添加一个串口写入函数:编程(Programming)→仪器I/O(Instrument I/O)→串口(Serial)→ VISA写入(VISA Write)。
??将字符串常量(值为“#01”,读模拟量输入端口电压值的指令)与连接字符串(Concatenate Strings)函数的输入端口Substring相连。
??将回车键常量与连接字符串(Concatenate Strings)函数的另一个输入端口字符串(Substring)相连。
??将连接字符串(Concatenate Strings)函数的输出端口连接的字符串(Concatenated String)与VISA写入(VISA Write)函数的输入端口写入缓冲区(write buffer)相连。
连接好的框图程序如图13-68所示。
图13-68 添加写指令函数
(6)在顺序结构Frame 2中添加一个时间延迟函数:编程(Programming)→定时(Timing)→时间延迟(Time Delay),时间采用默认值,如图13-69所示。
– 310 –
第13章 LabVIEW串口通信程序设计
图13-69 添加延时函数
(7)在顺序结构Frame 3中添加函数。
??添加一个串口字节数函数:编程(Programming)→仪器I/O(Instrument I/O)→串口(Serial)→ VISA串口字节数(VISA Bytes at Serial Port),标签为“Property Node”。
??添加一个串口读取函数:编程(Programming)→仪器I/O(Instrument I/O)→串口(Serial)→ VISA读取(VISA Read)。
??添加截取字符串函数:编程(Programming)→字符串(String)→截取字符串(String Subset)。
??添加一个将字符串转换为数字函数:编程(Programming)→字符串(String)→字符串/数值转换(String /Number Conversion)→ 分数/指数字符串至数值转换(Fract/Exp String To Number)。
??添加一个减号函数:编程(Programming)→数值(Numeric)→减(Subtract)。 ??添加一个乘号函数:编程(Programming)→数值(Numeric)→乘(Multiply)。 ??添加一个比较函数(大于等于):编程(Programming)→比较(Comparison)→大于等于?(Greater or Equal ?)。
??添加5个数值常量:编程(Programming)→数值(Numeric)→数值常量(Numeric Constant),值分别为4、6、1、50,30。
??添加一个条件结构1:编程(Programming) → 结构(Structures)→ 条件结构(Case Structure)。
??将VISA资源名称(VISA resource name)函数的输出端口与串口字节数(VISA Bytes at Serial Port)函数(顺序结构Frame1中)的输入端口引用(reference)相连。
??将串口字节数(VISA Bytes at Serial Port)函数的输出端口VISA资源名称(VISA resource name)与串口读取(VISA Read)函数的输入端口VISA资源名称(VISA resource name)相连。
??将串口字节数(VISA Bytes at Serial Port)函数的输出端口Number of bytes at Serial port与串口读取(VISA Read)函数的输入端口字节总数(byte count)相连。
??将串口读取(VISA Read)函数的输出端口读取缓冲区(read buffer)与截取字符串(String Subset)函数的输入端口字符串(string)相连。
??将数值常量(值为4)与截取字符串(String Subset)函数的输入端口偏移量(offset)相连。 ??将数值常量(值为6)与截取字符串(String Subset)函数的输入端口长度(length)相连。 ??将截取字符串(String Subset)函数的输出端口子字符串(substring)与分数/指数字符串至数值转换(Fract/Exp String To Number)函数的输入端口字符串(string)相连。
??将分数/指数字符串至数值转换(Fract/Exp String To Number)函数的输出端口数字(number)与减号(Subtract)函数的输入端口x相连。
其他函数添加及连线略。连接好的框图程序如图13-70所示。
– 311 –