【正文】
ata) + vbCrEnd SubPrivate Sub Form_Load()Dim g As Integer For g = 1 To 3 39。添加通訊選擇 Com amp。 Trim$(Str$(g)) Next g For g = 1 To 10 39。添加通訊超時(shí)選擇 g Next g = 0 39。默認(rèn)COM1口 = 0 39。默認(rèn)通訊超時(shí)5秒 非實(shí)時(shí)監(jiān)控通訊 = False = True = False 39。監(jiān)測(cè)與PLC的通訊是否正常。 39。用法:當(dāng)發(fā)送完相應(yīng)的通訊命令后,打開(kāi)此定時(shí)器,如果100毫秒內(nèi)PLC沒(méi)有數(shù)據(jù)返回,則表示與PLC通訊不正常End SubPrivate Sub Form_Unload(Cancel As Integer) 39。界面關(guān)閉時(shí)結(jié)束一切進(jìn)程EndEnd SubPrivate Sub Combo1_Click() 39。通訊口選擇 errT = True 39。通訊口錯(cuò)誤 Call CommSet 39。調(diào)用通訊口設(shè)置過(guò)程End SubPrivate Sub CommSet() On Error GoTo err1 If = True Then = False 39。如果通訊口已打開(kāi),則先關(guān)閉通訊口。開(kāi)始通訊口設(shè)置工作 = + 1 = 9600,o,8,1 = 0 = 0 39。設(shè)置和返回發(fā)送緩沖區(qū)的字節(jié)數(shù),設(shè)為0時(shí)清空發(fā)送緩沖區(qū) = 0 = True 39。打開(kāi)串口 errT = False Exit Suberr1: MsgBox 39。錯(cuò)誤提示End SubFunction FCS(a$) As String b% = 0 i% = Len(a$) 39。Len功能為取出字符串的位數(shù) For i = 1 To i% b% = b% Xor Asc(Mid(a$, i, 1)) 39。Asc的功能是轉(zhuǎn)換成Asc碼,Xor 運(yùn)算符來(lái)做兩個(gè)表達(dá)式結(jié)果的邏輯異或 Next ff$ = Hex$(b%) 39。 39。Hex的功能是轉(zhuǎn)換為十六進(jìn)制數(shù)值 If Len(ff$) = 1 Then ff$ = 0 + ff$ End If FCS = ff$End FunctionPrivate Sub fp0_OnComm()Dim GetData As StringDim k As Integer If = EvReceive Then 39。CommEvent的屬性返回的值為EvReceive時(shí)是發(fā)生了接收事件. = False = 通訊正常 GetData = If 非實(shí)時(shí)監(jiān)控通訊 = True And 實(shí)時(shí)監(jiān)控通訊 = False Then 39。如果有非實(shí)時(shí)監(jiān)控通訊操作,并且實(shí)時(shí)監(jiān)控通訊處理結(jié)束 非實(shí)時(shí)監(jiān)控通訊 = False = True Else Select Case j Case 0 39。讀DT0 GetData = Mid(GetData, 7, 4) 39。從GetData變量代表的字符的左側(cè)開(kāi)始的第七位開(kāi)始取四個(gè)字符賦給GetData GetData = Right(GetData, 2) + Mid(GetData, 1, 2) 39。Right的功能是從GetData變量代表的字符的右側(cè)開(kāi)始取2個(gè)字符 = Val(amp。H + GetData) 39。Val的功能將字符串轉(zhuǎn)換為數(shù)字 Case 1 39。讀R0狀態(tài) GetData = Mid(GetData, 7, 1) 39。從GetData變量代表的字符的左側(cè)開(kāi)始的第七位開(kāi)始取一個(gè)字符賦給GetData If GetData = 1 Then = ON Else = OFF End If Case 2 39。讀輸入點(diǎn)狀態(tài) GetData = Mid(GetData, 7, 8) 39。從GetData變量代表的字符的左側(cè)開(kāi)始的第七位開(kāi)始取八個(gè)字符賦給GetData For k = 0 To 7 If Mid(GetData, k + 1, 1) = 1 Then Picture3(k).BackColor = amp。HFFamp。 Else Picture3(k).BackColor = amp。H80000005 End If Next k Case 3 39。讀輸出點(diǎn)狀態(tài) GetData = Mid(GetData, 7, 8) 39。從GetData變量代表的字符的左側(cè)開(kāi)始的第七位開(kāi)始取八個(gè)字符賦給GetData For k = 0 To 7 If Mid(GetData, k + 1, 1) = 1 Then Picture4(k).BackColor = amp。HFFamp。 Else Picture4(k).BackColor = amp。H80000005 End If Next k Case 4 39。讀PLC的當(dāng)前狀態(tài) GetData = Mid(GetData, 14, 1) 39。從GetData變量代表的字符的左側(cè)開(kāi)始的第14位開(kāi)始取1個(gè)字符賦給GetData If GetData Mod 2 = 1 Then Picture1(0).BackColor = amp。HFFamp。 Picture1(1).BackColor = amp。H80000005 Else Picture1(0).BackColor = amp。H80000005 Picture1(1).BackColor = amp。HFFamp。 End If j = 1 End Select j = j + 1 39。進(jìn)行本次循環(huán)的下一步通訊 實(shí)時(shí)監(jiān)控通訊 = False = True End If End IfEnd SubPrivate Sub Timer1_Timer() If errT = True Then = 您的電腦沒(méi)有此通訊口 Exit Sub End If If 非實(shí)時(shí)監(jiān)控通訊 = True Then = 9 Else 實(shí)時(shí)監(jiān)控通訊 = True Select Case j 39。作用:實(shí)時(shí)監(jiān)控共需要五次才能完成一個(gè)實(shí)時(shí)監(jiān)控通訊循環(huán),每次j+1來(lái)判斷應(yīng)該發(fā)送第幾次命令 Case 0 39。讀DT0 Sendata = %01RDD0040000400 = 13 39。設(shè)定產(chǎn)生OnComm事件的接收緩沖區(qū)字符數(shù) Case 1 39。讀R0狀態(tài) Sendata = %01RCSR0000 = 10 39。設(shè)定產(chǎn)生OnComm事件的接收緩沖區(qū)字符數(shù) Case 2 39。讀輸入點(diǎn)狀態(tài) Sendata = %01RCP8X0000X0001X0002X0003X0004X0005X0006X0007 = 17 39。設(shè)定產(chǎn)生OnComm事件的接收緩沖區(qū)字符數(shù) Case 3 39。讀輸出點(diǎn)狀態(tài) Sendata = %01RCP8Y0000Y0001Y0002Y0003Y0004Y0005Y0006Y0007 = 17 Case 4 39。讀PLC的當(dāng)前狀態(tài) Sendata = %01RT = 25 39。設(shè)定產(chǎn)生OnComm事件的接收緩沖區(qū)字符數(shù) End Select Sendata = Sendata + FCS(Sendata) + vbCr 39。FCS(fs)是調(diào)用校驗(yàn)和程序 End If = 0 = 0 = Sendata = False 39。關(guān)閉定時(shí)通訊,等待PLC返回?cái)?shù)據(jù)。COMMFX_OnComm()事件處理完返回的數(shù)據(jù)后,再打開(kāi)定時(shí)通訊 = True l = 0End SubPrivate Sub Timer2_Timer() 39。如果發(fā)送命令結(jié)束后,在設(shè)定的通訊超時(shí)時(shí)間內(nèi)此定時(shí)器仍沒(méi)有關(guān)斷 = 通訊不正常 39。通訊狀態(tài)指示 j = 0 = True End Sub 36