技术频道

基于PC的虚拟仪表数据采集分析系统

1 引言
PLC(可编程逻辑控制器)在工业自动化中得到了非常广泛的应用,从起初的简单逻辑动作控制到现在的集网络,复杂数据运算,通信为一体,其功能和应用领域在未来还将会进一步地被拓宽。但在数据运算,图象处理以及数据存储等方面依然是PLC比较弱的方面,若能结合32位或64位计算机一起使用,结合两者的长处必定能取得较好的使用效果。

2 系统整体设计
参见图1,在原理示意图例中,通过松下PLC自带的温度数据读取单元对热敏电阻阻值的变化量进行A/D转换后将数据存储到PLC的“DT90040”和“DT90041”两个数据寄存器,这两个寄存器分别对应了CH1和CH2两个物理通道。松下PLC的工作扫描周期为0.5ms,温度数据将在每个周期更新一次。

图1 原理示意图


利用个人计算机的串行通信端口以10ms的扫描周期从PLC中将数据取出后存到动态数组中,在通过PICTURE控件以画图的方法将温度变化曲线表示出来。欲保存所取得的数据时可将数据输出到指定的EXCEL文件中。

3 系统的实现方法
3.1 PLC和VB6.0的通信与数据传输处理
计算机和PLC之间通信的时候,相互间传输的数据为4位16进制BCD码,当通过计算机的串行口按照一定的规则向PLC发出数据后,PLC在受到指令后也将返回一段有规则的代码,而笔者所需要的信息就包含在那一段返回码中。在这里,可将计算机串口和PLC的通信格式都设为:
波特率:115200B;
校验位:基校验;
数据长:8位;
停止位:1位;
松下FP系列PLC的通信协议MEWTOCOL-COM命令格式如下:指令格式。
指令信息:


应答信息 (正常时):


应答信息 (发生错误时):


通过查阅FP系列用户手册,可以发现热敏电阻值变化在“DT90040”和“DT90041”寄存器中得以体现,那么若能读出这些值,就可以对数据进行保存处理等相关操作。
对数据寄存器读取命令格式为:


PLC接受到上述指令后会返回下列代码:
读取成功


读取失败


在所接受到的数据的排列格式和我们正常思维所想的是不一样的,其排列如下:


Data (4 characters)
例:DT1105 =K13639( 3547H)
通过计算机RS-232口将下列数据发出后:


这样的现象在串口通信中是很常见的,希望读者在使用时务必加以充分的理解注意。
3.2 数据读取处理详细
在介绍了以上PLC和计算机通信的规则方法后下面将讲解如何具体来实现准确的数据读操作。
参见图2,在按下开始按钮后将执行下列代码:

图2 数据读取


Private Sub Command1_Click()
Dim d1 As String
d1 = "100"
Command1.Enabled = False
Command3.Enabled = True
nk = 10000 / Val(Text4.Text)
If Check1.Value = 1 Then
Timer1.Enabled = True
Picture1.Cls
e = 0
e1 = 0
re = ""
End If
If Check1.Value = 0 Then Timer1.Enabled = False
If Check1.Value = 0 Then
k = AreaReadD(d1, d1, r)
Label9.Caption = Str(Round(Val(r)
/100, 2)) + " ℃"
Picture1.Line (0, 2500)-(10000, 2500), &H808080
Picture1.Line (0, 2300)-(10000, 2300), &H808080
Picture1.Line (0, 2100)-(10000, 2100), &H808080
Picture1.Line (0, 1900)-(10000, 1900), &H808080
Picture1.Line (0, 1700)-(10000, 1700), &H808080
Picture1.Line (0, 1500)-(10000, 1500), &H808080
Picture1.Line (0, 1300)-(10000, 1300), &H808080
Picture1.Line (0, 1100)-(10000, 1100), &H808080
Picture1.Line (0, 900)-(10000, 900), &H808080
Picture1.Line (0, 700)-(10000, 700), &H808080
Picture1.Line (0, 500)-(10000, 500), &H808080
Text1.Text = Trim(Str(Round(Val(r)
/100, 2)) + " ℃")
'Check1.Value = 0
Exit Sub
End If
End Sub
停止数据的采集:
Private Sub Command3_Click()
Timer1.Enabled = False
'Check1.Value = 0
e1 = 0
For ii = 0 To 65525
iy(ii) = ""
Next ii
Command1.Enabled = True
Command3.Enabled = False
Picture1.Line (0, 2500)-(10000, 2500), &H808080
Picture1.Line (0, 2300)-(10000, 2300), &H808080
Picture1.Line (0, 2100)-(10000, 2100), &H808080
Picture1.Line (0, 1900)-(10000, 1900), &H808080
Picture1.Line (0, 1700)-(10000, 1700), &H808080
Picture1.Line (0, 1500)-(10000, 1500), &H808080
Picture1.Line (0, 1300)-(10000, 1300), &H808080
Picture1.Line (0, 1100)-(10000, 1100), &H808080
Picture1.Line (0, 900)-(10000, 900), &H808080
Picture1.Line (0, 700)-(10000, 700), &H808080
Picture1.Line (0, 500)-(10000, 500), &H808080
End Sub
在“开始”被执行后时间控件开始有效,执行下列代码,每个时间周期做一次动作。
Private Sub Timer1_Timer()
Dim d1 As String
Dim d2 As String
Dim r As String
Dim k As String
Dim r2 As String
Dim r3 As Integer
Dim kk As Integer
Dim re1 As Double
If Check1.Value = 1 Then
d1 = "100"
k = AreaReadD(d1, d1, r)
Label9.Caption=Str(Round(Val(r)/100,2))+ "℃"
Picture1.Line-(e, -r/5+3500), &HFFFF&
e = e+Val(Text4.Text)
End If
re1 = Round(Val(r)/100, 2)
Do While Len(re1) < 6
re1 = Str$(re1) & "0"
Loop
re = re & Str(re1)
re = re + " " + iy(e1)
e1 = e1 + Val(Text4.Text)
r3 = 10000 + Val(Text4.Text)
If r3 = e1 Then
MsgBox "数据采集结束。", vbOKOnly, "Note"
Command1.Enabled = True
Command3.Enabled = False
Timer1.Enabled = False
Picture1.Line (0, 2500)-(10000, 2500), &H808080
Picture1.Line (0, 2300)-(10000, 2300), &H808080
Picture1.Line (0, 2100)-(10000, 2100), &H808080
Picture1.Line (0, 1900)-(10000, 1900), &H808080
Picture1.Line (0, 1700)-(10000, 1700), &H808080
Picture1.Line (0, 1500)-(10000, 1500), &H808080
Picture1.Line (0, 1300)-(10000, 1300), &H808080
Picture1.Line (0, 1100)-(10000, 1100), &H808080
Picture1.Line (0, 900)-(10000, 900), &H808080
Picture1.Line (0, 700)-(10000, 700), &H808080
Picture1.Line (0, 500)-(10000, 500), &H808080
Check1.Value = 0
Exit Sub
End If
End Sub
在上面的代码中使用了自定义的函数AreaReadD(d1,d1,r),这个函数的作用是用来读取PLC中d1到d2地址中的数值,AreaReadD的代码如下:
Public Function AreaReadD(ByVal adress1, adress2, Result) As Long
Dim j1, k1, l1, m1, n1 As Integer
Dim inputwd As String
Dim command As String
Dim input1 As String
Dim output1 As Integer
Dim bccR As String
Dim dami As String
dami = Form2.MSComm1.Input
Form2.MSComm1.InBufferCount = 0
Do While Len(adress1) < 5
adress1 = "0" & adress1
Loop
Do While Len(adress2) < 5
adress2 = "0" & adress2
Loop
command = "%01#RDD" + adress1 + adress2
bccR = BCC(command)
Form2.MSComm1.Output = command + bccR + Chr(13)
Delay
inputwd = Trim(Form2.MSComm1.Input)
If Mid$(inputwd, 4, 1) <> "$" TheN
AreaReadD = 1
MsgBox "数据壳出时通信发生问题!", vbOKOnly, "ERROR"
Else
AreaReadD = 0
End If
j1 = Val(DEC(Mid$(inputwd, 7, 1)))
k1 = Val(DEC(Mid$(inputwd, 8, 1)))
l1 = Val(DEC(Mid$(inputwd, 9, 1)))
m1 = Val(DEC(Mid$(inputwd, 10, 1)))
AreaReadD = j1×16 + k1×1 + l1×4096 + m1×256
Result = Str$(j1×16 + k1×1 + l1×4096 + m1×256)
End Function
在AreaReadD功能执行后对其返回信息进行分析和处理的函数为DEC(),如下所示:
Public Function DEC(ByVal hexwd) As Integer
hexwd = UCase(hexwd)
If hexwd = "0" Then DEC = 0
If hexwd = "1" Then DEC = 1
If hexwd = "2" Then DEC = 2
If hexwd = "3" Then DEC = 3
If hexwd = "4" Then DEC = 4
If hexwd = "5" Then DEC = 5
If hexwd = "6" Then DEC = 6
If hexwd = "7" Then DEC = 7
If hexwd = "8" Then DEC = 8
If hexwd = "9" Then DEC = 9
If hexwd = "A" Then DEC = 10
If hexwd = "B" Then DEC = 11
If hexwd = "C" Then DEC = 12
If hexwd = "D" Then DEC = 13
If hexwd = "E" Then DEC = 14
If hexwd = "F" Then DEC = 15
End Function
校验码生成用命令如下BCC():
Public Function BCC(ByVal OBJWD) As String
Dim FcsResult As String
Dim jytemp As Integer
jytemp = 0
For i = 1 To Len(OBJWD)
jytemp = Asc(Mid$(OBJWD, i, 1)) Xor jytemp
Next i
BCC = Hex$(jytemp)
End Function
在上述的例子中使用了多个函数,在VB6.0中函数有内函数和自定义函数,进行有效的利用,可以节约编程的时间,亦可使程序明朗简洁。

以上的代码构成了我们数据采集的人机对话用界面,那么在PLC中也要进行必要的设定,因为我们在这里用的是热敏电阻,其阻值和所对应的数据为非绝对线性,需要进行必要的转化,其热敏电阻的一些使用特性如下:
(1) 热敏电阻输入保存的方法
●把连接在外部的热敏电阻变化作为电压的变化保存下来,使用内置的AD转换其转换为数字数值,进性保存。
●转换的数字值反映在特殊数据寄存器(DT90040或DT90041)上,可以在用户程序中读取。如图3所示:

图3 热敏电阻输入保存的方法示意图


(2) 总精度
总精度=(内置的AD转换器总精度:±5LSB注)+(热敏电阻精度)
注:±5LSB,与A/D转换后的数值(0~1000)相比,总精度有±5的误差。
(3) 热敏电阻和数字转换值
热敏电阻值和数字转换值的转换用以下计算公式进行,数字转换值在K0~K1000之间变化。


(4) 适用的热敏电阻
可以使用电阻值在200Ω~75kΩ的热敏电阻。如附表所示:

附表 选择的热敏电阻类别


由以上的数据我们在PLC中输入如下梯形图程序可以将温度值保存到“DT100”图4梯形图。

图4 温度值保存到“DT100”的梯形图


这样在运行数据采集软件后,点击“开始”后将会在坐标区显示出当前温度的数值曲线,
当测试结束后点击“数据保存”后可以在同文件目录下找到”My.xls”文件,如图5所示。

图5 My.xls”文件


4 结束语
通过比较图5波形,可以发现,温度曲线以极其准确的精度被记录下来,可以很方便地生成EXCEL图表文件,这在工程技术应用和工厂自动化应用中可以作为有力的参考和高效的工具。

文章版权归西部工控xbgk所有,未经许可不得转载。