4.2 VB與PLC通信的實(shí)現(xiàn)
以下舉例說明現(xiàn)場(chǎng)設(shè)備與PLC通信的實(shí)現(xiàn)。
1)控制要求:控制PLC的起動(dòng)、停止,并顯示運(yùn)行狀態(tài)(綠色為運(yùn)行,紅色為停止);能夠用交替型按鈕控制Y0,Y1,并用指示燈顯示Y0,Y1狀態(tài)(綠色為運(yùn)行,紅色為停止);能夠?qū)256,D512兩個(gè)寄存器進(jìn)行數(shù)值寫入的操作。
2)實(shí)現(xiàn)思路:PLC起動(dòng)停止的標(biāo)志位為M1072,查DVP協(xié)議,知道地址為H0C30,按功能碼01操作; 同樣Y0,Y1的地址分別為H0500,H0501。寫入FF00為ON,0000為OFF,按功能碼05操作;D256,D512地址分別為H1100,H1200,按功能碼06操作即可。
3)VB接口的設(shè)計(jì)如圖10所示。
圖10 監(jiān)控程序界面
用按鈕控制PLC的起動(dòng)停止,Y0、Y1的ON/OFF及D256、D512寫完數(shù)據(jù)的發(fā)送;用Shape組件做指示燈,表示PLC的運(yùn)行狀態(tài)和Y的狀態(tài);用timer組件不停的讀取M1072的狀態(tài),以判斷PLC的運(yùn)行情況;用MScomm控件實(shí)現(xiàn)PC與PLC的通信。
4)編程實(shí)現(xiàn)的代碼構(gòu)成
?。?) LRC算法校驗(yàn)的實(shí)現(xiàn)
Public Function LRC(str As String) As String
c = 0
l = Len(str)
For c = c + 1 To l
c_data = Mid$(str, c, 2)
#p#分頁標(biāo)題#e# d_lrc = d_lrc + Val(“&H” + c_data)
c = c + 1
Next c
If d_lrc 》 &HFF Then
d_lrc = d_lrc Mod &H100
End If
h_lrc = Hex(&HFF - d_lrc + 1)
If Len(h_lrc) 》 2 Then
h_lrc = Mid(h_lrc, Len(h_lrc) - 1, 2)
End If
LRC = h_lrc
End Function
?。?) 運(yùn)行的開始就判斷PLC的狀態(tài)并設(shè)置標(biāo)志位
‘初次運(yùn)行打開串口,并顯示PLC運(yùn)行狀態(tài)
Private Sub Form_Load()
Dim s1 As String
Dim s2 As String
Dim s22 As String
Dim s3 As String#p#分頁標(biāo)題#e#
Dim s4 As String
MSComm1.PortOpen = True
s2 = “01010C300001”
s22 = LRC(s2)
s1 = “:” + s2 + s22 + Chr$(13) + Chr$(10)
MSComm1.Output = s1
s3 = MSComm1.Input
s4 = Mid$(s, 6, 8)
If s4 = “0C30FF00” Then
plc = 1 ’PLC為運(yùn)行標(biāo)志
Else
plc = 0 ‘PLC為停止標(biāo)志
End If
End Sub
(3) 下面一段為用指示燈表示PLC的運(yùn)行狀態(tài)
Private Sub Timer5_Timer()
Dim s1 As String
Dim s2 As String#p#分頁標(biāo)題#e#
Dim s22
Dim s3 As String
Dim s4 As String
s2 = “01010C300001”
s22 = LRC(s2)
s1 = “:” + s2 + s22 + Chr$(13) + Chr$(10)
MSComm1.Output = s1
s3 = MSComm1.Input
s4 = Mid$(s3, 8, 2)
If s4 = “31” Then
plc = 1 ’PLC為運(yùn)行標(biāo)志
Else: If s4 = “30” Then plc = 0 ‘PLC為停止標(biāo)志
End If
If plc = 1 Then
Label2.Caption = “PLC正在運(yùn)行。。.。。.”
Shape1.FillColor = RGB(0, 255, 0) ’green
Else
Label2.Caption = “PLC已經(jīng)停止”#p#分頁標(biāo)題#e#
Shape1.FillColor = RGB(255, 0, 0) ‘red
End If
End Sub
?。?) PLC的起動(dòng)與停止
’起動(dòng)PLC
Private Sub start_Click()
Dim strout As String
Timer5.Enabled = False
str = “00050C30FF00” ‘M1072 為PLC起動(dòng)停止標(biāo)志位。查地址表,M1072為OC30.FF00為置
ON,0000為置OFF。
’以上都是固定格式,要牢記。
LRCC = LRC(str) ‘計(jì)算 str的lrc校驗(yàn)碼。
strout = “:” + str + LRCC + Chr$(13) + Chr$(10) ’欲傳送之?dāng)?shù)據(jù)。13為D,10為A
MSComm1.Output = strout
Timer5.Enabled = True
End Sub
‘停止PLC
#p#分頁標(biāo)題#e# Private Sub stop_Click()
Dim strout As String
Timer5.Enabled = False
str = “00050C300000”
LRCC = LRC(str)
strout = “:” + str + LRCC + Chr$(13) + Chr$(10)
MSComm1.Output = strout
Timer5.Enabled = True
End Sub
Y0、Y1的ON/OFF與PLC起動(dòng)/停止的控制方式相同,指示燈的表示方式也相同。D256,D512數(shù)據(jù)寫入的操作類似,限于篇幅其它代碼就不再列出了。
5 結(jié)束語
VB語言易于編程使用,為與串行設(shè)備的通信提供了很大的方便。臺(tái)達(dá)PLC采用標(biāo)準(zhǔn)的目前廣為流行的MODBUS協(xié)議,為實(shí)現(xiàn)PLC與監(jiān)控計(jì)算機(jī)的通信提供了簡(jiǎn)化的平臺(tái)。由于臺(tái)達(dá)所有的機(jī)電產(chǎn)品都支持MODBUS協(xié)議,所以,掌握了VB與PLC通信過程,也就等于掌握了PC與臺(tái)達(dá)所有機(jī)電產(chǎn)品的通信。
轉(zhuǎn)載請(qǐng)注明出處。