【应用笔记】【AN004】VB环境下基于RS-485的4-20mA电流采集

版本:第一版作者:周新稳 杨帅 日期:20160226

===========================

本资料高清PDF 下载:

http://pan.baidu.com/s/1c1uuhLQ

 

源代码包下载:

http://pan.baidu.com/s/1LSuXw

===========================

简介

本应用笔记主要说明如何在VB开发环境下基于RS485实现4-20mA电流采集。

系统组成及工作原理

系统组成如图1所示,主要包括 PT100铂电阻温度传感器、SBWZ温度变送器、4-20mA电流采集模块(GM1008)、USB转RS485模块(EVC8001)以及上位机VB 。

【应用笔记】【AN004】VB环境下基于RS-485的4-20mA电流采集

图1 系统组成框图

PT100铂电阻温度传感器:利用铂金属阻值随温度变化而变化的特性制成的一种温度传感器,主要用来测量温度的变化量。

SBWZ温度变送器:一种现场安装式温度变送单元,主要将铂电阻的信号变换成线性4-20mA的输出信号。

4-20mA电流采集模块(GM1008):RS485接口的GM1008电流采集模块,主要实现数据的采集与传输,并通过RS485接口与上位机进行通讯。

USB转RS485模块(EVC8001):实现GM1008的RS485接口与上位机的USB接口成功连接。

上位机VB:制作上位机界面,实现被测数据的采集、分析和显示。

系统工作过程中,当温度发生变化时,

【应用笔记】【AN004】VB环境下基于RS-485的4-20mA电流采集

PT100铂电阻温度传感器的电阻值发生变化,其阻值经过SBWZ温度变送器转换为电流信号,并通过4-20mA电流采集模块(GM1008)及USB转RS485模块(EVC8001)与上位机通讯,从而实现DI电流的采集、分析及显示。

电流采集模块

系统采用RS485接口的8通道4-20mA电流采集模块(GM1008),不仅能更加快速、精确的把测量数据传送给上位机,保证系统的效率,而且可以使系统的信息传输更加稳定。

GM1008简介

GM1008 8通道4-20mA电流采集模块(以下简称模块)采用全电器隔离方案,配合高性能微处理器及8通道12位ADC在较小的体积下完成了电流测量功能。

模块内置高性能电源变换电路,供电电压范围宽至7.5V-36V,且效率高达90%以上。此特性为长时间使用的电源稳定性提供保障。模块内置1500V双隔离电源模块,使得供电输入、模拟测量电路及通信接口三者之间相互隔离,此特性为测量精度、模块稳定性及通用性提供保证。

模块内置基于磁耦合隔离技术的高品质RS485电路,长期使用稳定可靠,抗干扰强、不掉线。

模块内置32位的高性能ARM微处理器,它不但完成8通道、12位电流采集,而且支持固件升级功能,为后期功能升级和Bug修复提供技术保证。

VB上位机程序设计

VB开发环境介绍

VB全称为Visual Basic,是一种由微软公司开发的包含协助开发环境的时间驱动编程语言,拥有图形用户界面和快速应用程序开发系统,可以轻易的使用DAO、RDO、ADO连接数据库,或轻松的创建Active控件。鉴于VB的这些性能满足本系统的应用需求,故在此选择VB作为本实验的上位机开发环境。

软件使用方法

软件界面如图2所示。

【应用笔记】【AN004】VB环境下基于RS-485的4-20mA电流采集

图2 软件界面

软件的具体操作方法如下:

1. 在Port里设置端口(端口号由查询设备管理器获得);

2. 在Baudrate里面设置波特率,一般固定为9600;                                                                  

3. 在Parity里面设置奇偶校验,一般固定为None(无校验);

4. 在Stop Bits里面设置停止位,一般固定为One(一个停止位);

5. 在Address里面设置从机地址,固定为1;

6. 点击Open按键,自动连接RS485,此按键变为Close;

7. 点击Start按键,开始采集电流;

8. 点击Stop按键,停止采集;

9. 点击Close按键,则断开RS485,清除数据。

软件核心代码

核心代码主要有两部分:CRC校验代码(见附录1)和数据处理代码(见附录2)。

1. CRC校验代码:CRC校验是为了保证数据的准确传输,其中CRC校验的方法有多种,本程序采取的是查表法,大大提高了校验速度。

2. 数据处理代码:其中modbus_fun3表示选择modbus的功能代码为3,是读取保持寄存器功能。此部分代码从214行到221行为modbus通信格式的寄存器设置部分,接下来是数据的发送命令和接收命令,以及后面对接收到的数据进行处理以方便以物理量的形式显示。

测量采集演示及说明

配备工具或软件

1. 12V电源

2. PT100铂电阻温度传感器

3. SBWZ系列温度变送器

4. RS485接口8通道4-20mA电流采集模块(GM1008)

5. USB转RS485模块(EVC8001)

6. Aligent 34401A台式六位半数字万用表

7. 应用平台:Visual Studio 2015社区版(自行下载)

8. 电脑操作系统:Windows 8.1 x32

系统连接方式

【应用笔记】【AN004】VB环境下基于RS-485的4-20mA电流采集

本次实验主要采集两个通道的电流数据,为了保持图片连线清楚整洁,只接入1个SBWZ,另一个连接方式相同。系统主要硬件连接如图3所示。

图3 系统主要硬件连接图

(1) 电源(12V)导线1:正极连接温度变送器正接线柱,负极连接GM1008的接地端口(GND);

(2) 导线2:连接GM1008的接地端口与GM1008的供电处(POWER)的一个端口;

(3) 导线3:连接温度变送器与GM1008供电处(POWER)的另一个端口;

(4) 导线4:连接通道与温度变送器负接线柱;

(5) 导线5:连接EVC8001与GM1008的RS485模块的B-端口;

(6) 导线6:连接EVC8001与GM1008的RS485模块的A+端口;

(7) 方口USB线:连接EVC8001与电脑。

测试步骤

1. 根据系统主要硬件连接图(图3)连接各组件;

2. 接入两个温度变送器,GM1008配置两个通道,将CH0设定为开水数据采集通道,CH1设定为打火机火焰数据采集通道;

3. 然后在程序界面设置好端口以及相关参数(从机地址Address一般固定为1);

4. 将两个PT100铂电阻分别放入开水与打火机火焰中(具体操作为点击界面的Open按钮,连接以后点Start按钮,系统会自动采集数据,操作简单方便)。

测试结果

实验采集数据界面如图4所示,为了验证测试结果的准确性以及得到准确的温度,对其进行了实验测试。

【应用笔记】【AN004】VB环境下基于RS-485的4-20mA电流采集

图4 实验采集数据图

(1)精度验证

为了验证所测电流值的准确性,把Aligent 34401A 台式六位半数字万用表串联到SBWZ温度变送器后端的电路中,将万用表的电流读数与上位机显示的电流值进行对比。实验结果如表1所示,经过多次实验,两组数据结果基本相同。

表1 实验各项数据表

被测对象

GM1008测量值

万用表 测量值

SBWZ 对应温度

水(CH0)

7.68mA

7.64mA

92℃

打火机(CH1)

19.67mA

19.65mA

393℃

(2)实验验证

由SBWZ温度变送器以及PT100铂电阻的量程之间的关系,得出实际测得电流与温度之间符合关系式:

y=25*x-100

测得的电流值对照计算知所测水温约为92℃,火焰约为393℃(由于火焰温度高于PT100的最大测量值,所以到19mA以后停止实验,以免损坏设备),测试结果与实际相符。

故由测试可知:本系统在VB开发环境基于RS485测得的数据是真实可靠的,可应用于实际中。

总结

本应用系统的测试成功,充分证明了在VB开发环境下基于RS485的4-20mA电流采集是可行的,上位机软件制作的界面使测量的操作简单,数据清晰,便于用户对工业自动化系统的数据进行实时的监控,满足行业对数据的需求。


参考资料

1. 《VB语言程序设计》

2. 《C程序设计语言》

相关资源下载

1Visual Studio 2015下载地址:

https://www.visualstudio.com/downloads/download-visual-studio-vs

2、GM1008 简易手册:

http://files.cnblogs.com/files/xiaomagee/GM1008%E7%AE%80%E6%98%93%E6%89%8B%E5%86%8CV1.0.pdf

3、GM1008 用户手册:

http://files.cnblogs.com/files/xiaomagee/GM1008%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8CV1.0.pdf

4、GM1008 购买地址:

https://item.taobao.com/item.htm?spm=a1z10.3c.w4002251610686.9.zoJaPi&id=522203245449

附录1CRC校验代码

121 'CRC校验

122 Function crc(data() As Byte, length As Integer, ByRef ReturnDatalo As Byte, ByRef ReturnDatahi As Byte) As String

123 Dim CRC16Hi As Byte

124 Dim CRC16Lo As Byte

125 CRC16Hi = &HFF

126 CRC16Lo = &HFF

127 Dim i As Integer

128 Dim iIndex As Long

129

130 For i = 0 To length - 1

131 iIndex = CRC16Hi Xor data(i)

132 CRC16Hi = CRC16Lo Xor GetCRCHi(iIndex) '低位处理

133 CRC16Lo = GetCRCLo(iIndex) '高位处理

134 Next i

135 ReturnDatahi = CRC16Hi 'CRC高位

136 ReturnDatalo = CRC16Lo 'CRC低位

137

138 Return 1

139 End Function

205 '数据处理

206 Private Function modbus_fun3(start_address As Integer, read_number As Integer) As Integer

207 Dim sendbyte = New Byte() {0, 0, 0, 0, 0, 0, 0, 0}

208 Dim recvbyte(256) As Byte

209 Dim length As Int32

210 Dim data(24) As Int16

211 Dim crc_value As Int16

212 Dim i As Int16

213 Dim text As String

214 sendbyte(0) = 1 ‘单位标识符

215 sendbyte(1) = 3 ‘功能码

216 sendbyte(2) = start_address >> 8 ‘读寄存器起始地址

217 sendbyte(3) = start_address

218 sendbyte(4) = read_number >> 8 ‘读寄存器数量

219 sendbyte(5) = read_number

220

221 crc_value = crc(sendbyte, 6,sendbyte(7),sendbyte(6))

222 Try

223 text = ""

224 '发送命令

225 SerialPort1.Write(sendbyte, 0, 8)

226 '接收数据

227 length = SerialPort1.BytesToRead()

228 While (length < 53)

229 length = SerialPort1.BytesToRead()

230 End While

231 i = SerialPort1.Read(recvbyte, 0, length)

232 For k = 0 To 23

233 data(k) = (recvbyte(k * 2 + 3) * 256) + recvbyte(k * 2 + 4)

234 Next k

235 '数值转换

236 For i = 0 To 7

237 display_value(i) = (data(i * 3 + 2) / 100.0)

238 Next i

附录2:显示通道数据程序

239 Catch ex As Exception

240

241 End Try

242 Return 1

243 End Function