獻給有需要的人
這就是COM口圖標。從Private Sub Form_Load()說起,在這個Form_Load()中先檢查COM口是否打開。If FP0.PortOpen = True Then FP0.PortOpen = False,這就是若com口是打開的,就先把com口關閉,這樣是為了好去調試com口。FP0.CommPort = 1,這個設置com口為1。FP0.Settings = "9600,o,8,1,波特率9600,位數8,停止位1。FP0.InputLen = 0 ,InputLen設為0就是讀出緩沖區的所有內容。FP0.OutBufferCount = 0 ,清空發送緩沖區,就是在接收之前清空緩沖區。FP0.InBufferCount = 0,清空接收緩沖區。FP0.PortOpen = True,com口開啟。 這就是COM口的通信參數設置。 校驗計算程序: 之前是比較基礎的com口參數的設置,這次的校驗計算程序是用來進行對傳送數據的奇校驗或者偶校驗,程序上設置的是為偶校驗。Function FCS(a$) As String,聲明FCS(a$)設置為字符型,在任何模塊中都可被調用。b% = 0,設置b%為0。 I% = Len(a$),a$的字符串長度。 For I = 1 To I%
b% = b% Xor Asc(Mid(a$, I, 1)),一個FOR循環,根據字符長度開進行循環。Mid(a$, I, 1),把a$的第I位取1個字符。 Asc(Mid(a$, I, 1)),把這個字符轉換成Asc碼。之后b%與之異或。在松下PLC的通信協議中,在校驗中要把每一位的Asc碼進行異或求和后生成,所以此程序若有五位,就必須異或五次,把最后的異或求和的數據送入ff$,(ff$ = Hex$(b%)),Hex的作用是把數據轉換成16位的數據。 If Len(ff$) = 1 Then
ff$ = "0" + ff$ 這條程序就是檢測最后異或求和的數據有幾位,等于1的話就是一位,而最后的校驗碼應該是兩位,所以需要ff$ = "0" + ff$。最后FCS = ff$,這就是最后的一步,是所有模塊都可以進行調用。 首先我們要在通用聲明模塊中進行聲明:Dim 操作類型 As Integer,將操作類型定義為整數。 Dim Sendata As String,將Sendata定義為字符串。 Sendata = "#RDD0000100001",根據通信協議發送數據(%起始碼、01為PLC站號、RD為讀取寄存器指令,D0000100001,數據代碼D,起始數據編碼00001,結束數據編碼00001)。 FP0.RThreshold = 13,接收到13個字節數據就立即觸發OnComm()事。 Sendata = Sendata + FCS(Sendata) + vbCr,意思是Sendata = #RDD0000100001+調用校驗碼程序的結果+vbCr(vbCr是回車的意思,回到本行的開頭,意思不是特別懂)。 操作類型 = 1,這個后面再說。 FP0.InBufferCount = 0,在發送數據之前清空接收緩沖區。 FP0.OutBufferCount = 0,在發送數據之前清空發送緩沖區。 FP0.Output = Sendata,向PLC發送數據。 Dim Sendata As String ,定義Sendata為字符串。 Dim Devdat1 As String,定義Devdat1為字符串。 If CDbl(Val(Text2.Text)) > 32767 Then: MsgBox ("數值超限!"): Exit Sub,CDbl為把數值轉換為雙精度浮點數據類型。Val是將字符串數據類型轉換為數值型數據類型。32767(2的15開方)是不允許輸入的數據超過16位。 Devdat1 = Right("00000000" + Hex(Val(Text2.Text)), 4),Hex就是使數值返回16進制數值。("00000000" + Hex(Val(Text2.Text)),湊成16位數。Right去后面的4位。 Devdat1 = Right(Devdat1, 2) + Left(Devdat1, 2),數據的寫入格式為先低位后高位。 Devdat1 = Devdat1 FP0.RThreshold = 9,接收9位字符數就觸發OnComm()事。 Sendata = "#WDD0000100001" + Devdat1,發送數據的地址+要寫入的數據。 操作類型 = 2 FP0.InBufferCount = 0 '清空接收緩沖區 FP0.OutBufferCount = 0 '清空發送緩沖區 FP0.Output = Sendata + FCS(Sendata) + vbCr。 Dim Sendata As String FP0.RThreshold = 9 Sendata = "#WCSR00011,WCS單觸點寫入。R0001指令代碼+觸點編號。1最后的1是觸點ON。 操作類型 = 3
FP0.InBufferCount = 0 '清空接收緩沖區
FP0.OutBufferCount = 0 '清空發送緩沖區
FP0.Output = Sendata + FCS(Sendata) + vbCr Dim Sendata As String FP0.RThreshold = 9 Sendata = "#WCSR00010",跟第五章一樣,只是最后以為是0,0是狀態OFF。 操作類型 = 4
FP0.InBufferCount = 0 '清空接收緩沖區
FP0.OutBufferCount = 0 '清空發送緩沖區
FP0.Output = Sendata + FCS(Sendata) + vbCr Dim Sendata As String
FP0.RThreshold = 10
Sendata = "#RCP1R0001"RCP為讀取多觸點狀態,之后的1為觸點編號。R0001為觸點代碼編號。 操作類型 = 5
FP0.InBufferCount = 0 '清空接收緩沖區
FP0.OutBufferCount = 0 '清空發送緩沖區
FP0.Output = Sendata + FCS(Sendata) + vbCr COM主程序: Private Sub FP0_OnComm(),當接收到一定數目的FP0.RThreshold=X,就會觸發此COM。 Dim getData As String ' Dim station1
Dim station2
Dim M1data As Integer If FP0.CommEvent = comEvReceive Then,CommEvent 是判斷 MSComm控件的當前狀態。 comEvReceive 是收到 Rthreshold 個字符。 getData = FP0.Input ,讀取接收緩沖內容。 Select Case 操作類型,選擇操作類型。 Case 1,如果是讀取DT1. getData = Mid(getData, 7, 4),讀取第7位(包括第七位)的四位,這四位就是觸點的數據。 station1 = Right(getData, 2) ,因為之前的四位數據是先低后高,所以這邊先取高位。
station2 = Left(getData, 2),取低位。 getData = station1 + station2 ,先高后低。 getData = Val("&H" + getData),十六進制轉換為十進制。 Text1.Text = CStr(getData), 顯示在Text1里。 Case 2 ,如果是寫DT1。 If Mid(getData, 4, 1) = "$" Then getDate前面定義就是FP0.input,當接受PLC Label1.Caption = "寫入成功" 發出的數據的第四位為$時,就說明了數據發送
Else 成功,否則就是失敗的。這里的程序就是就是這樣的。
Label1.Caption = "寫入失敗"
End If Case 3 '如果是置位R1
If Mid(getData, 4, 1) = "$" Then
Label2.Caption = "置位成功"
Else
Label2.Caption = "置位失敗"
End If Case 4 '如果是復位R1
If Mid(getData, 4, 1) = "$" Then
Label2.Caption = "復位成功"
Else
Label2.Caption = "復位失敗"
End If
Case 5 '如果是讀取R1的狀態
If Mid(getData, 7, 1) = 1 Then
Label3.Caption = "ON"
Else
Label3.Caption = "OFF"
End If End Select 以上。 從第九章開始就是真正意義上的自動監控程序的學習: Dim 非實時監控通訊 As Boolean,對非實時監控通信定義為布爾。
Dim 何種非實時監控通訊 As String,何種非實時監控通信定義為字符串。
Dim 實時監控通訊 As Boolean ,實時監控通訊定義為布爾。 Dim j As Integer ,j定義為整型。 Dim Sendata As String ,Sendata定義為字符串。
Dim yuanji As String ,yuanji定義為字符串。
Dim zhuang As String ,zhuang定義為字符串。
Dim devdat As String ,devdat定義為字符串。
Dim setad As String ,setad定義為字符串。
Dim caoxian As Boolean ,caoxian定義為布爾。
Dim awe1 As Integer ,awe1定義為整型。
Dim errT As Boolean ,errT定義為布爾。 在通用聲明里對這些變量進行聲明。 Private Sub Combo2_Click() ,通訊超時的選擇
Timer2.Interval = (Combo2.ListIndex + 1) * 1000 ,檢測時間為s,而計時器的單位為ms,所以要乘以1000。ListIndex為項目的索引值,第一個ListIndex等于0,所以必須+ 1。 End Sub Private Sub Combo1_Click() ,通訊口的選擇。
errT = True ,通訊口錯誤。
Call CommSet ,調用通訊口設置過程。
End Sub 對COM口參數進行設置: Private Sub CommSet()
On Error GoTo err1 ,On Error是個錯誤處理程序,On Error GoTo err1語句就是啟動錯誤處理程序從指定的err1開始。 If fp0.PortOpen = True Then fp0.PortOpen = False ,如果通訊口已打開,則先關閉通訊口。開始通訊口設置工作。
fp0.CommPort = Combo1.ListIndex + 1 ,索引值+1就是所選的COM。 fp0.Settings = "9600,o,8,1" fp0.InputLen = 0 fp0.OutBufferCount = 0 fp0.InBufferCount = 0 fp0.PortOpen = True ,打開通訊口。
errT = False ,不存在錯誤。
Exit Sub err1:
MsgBox Err.Description ,錯誤提示。
End Sub Private Sub Command9_Click() setad = UCase(Text3.Text) ,UCase的作用是將小寫字母轉換為大寫字母,Text3.Text為輸入的文本。
setad = Right("0000" + CStr(setad), 4) ,CStr(setad)的作用是將setad轉換為字符串型,Right就是去數據右邊的4位。 If setad = "" Then ,""為VB的空字符。
MsgBox ("請輸入元件地址!")
Text3.SetFocus ,Text3置為焦點。
Exit Sub
End If
非實時監控通訊 = True ,為真。
何種非實時監控通訊 = "查詢"
Select Case zhuang ,zhuang為置/復位,位狀態查詢元件標志。
Case "X" ,zhuang為X。
Sendata = "#RCP1X" + setad ,%為指令指定的,01為站號,RCP為讀取多觸點狀態,1為觸點數目(n=1-8),X為觸點代碼,setad就是觸點編號。下面也是一樣的道理。
Case "Y" ,zhuang為Y。 Sendata = "#RCP1Y" + setad
Case "R" ,zhuang為R。 Sendata = "#RCP1R" + setad
End Select End Sub Private Sub Command8_Click()
setad = UCase(Text3.Text)
setad = Right("0000" + CStr(setad), 4)
If setad = "" Then
MsgBox ("請輸入元件地址!")
Text3.SetFocus
Exit Sub
End If
非實時監控通訊 = True
何種非實時監控通訊 = "置位"
Select Case zhuang
Case "X"
Sendata = "#WCSX" + setad + "1" ,WCS為寫入單觸點狀態,setad為觸點編號,"1"為觸點數據,狀態為ON。
Case "Y"
Sendata = "#WCSY" + setad + "1"
Case "R"
Sendata = "#WCSR" + setad + "1"
End Select End Sub Private Sub Command7_Click() setad = UCase(Text3.Text)
setad = Right("0000" + CStr(setad), 4)
If setad = "" Then
MsgBox ("請輸入元件地址!")
Text3.SetFocus
Exit Sub
End If
非實時監控通訊 = True
何種非實時監控通訊 = "置位"
Select Case zhuang
Case "X"
Sendata = "#WCSX" + setad + "0"
Case "Y"
Sendata = "#WCSY" + setad + "0"
Case "R"
Sendata = "#WCSR" + setad + "0"
End Select End Sub Private Sub Form_Unload(Cancel As Integer) End ,End就是退出。
End Sub Private Sub Option8_Click() zhuang = "X"
End Sub Private Sub Option10_Click() zhuang = "R"
End Sub Private Sub Command1_Click()
非實時監控通訊 = True
Sendata = "#RMR" ,Sendata為發送數據命令,RM為遙控命令,R為PROG到RUN模式。
何種非實時監控通訊 = "運行"
End Sub Private Sub Command2_Click() 非實時監控通訊 = True
Sendata = "#RMP" ,P為RUN到PROG模式。
何種非實時監控通訊 = "運行"
End Sub 校驗計算程序是用來進行對傳送數據的奇校驗或者偶校驗,程序上設置的是為偶校驗。 Function FCS(a$) As String 聲明FCS(a$)設置為字符型,在任何模塊中都可被調用。
b% = 0 I% = Len(a$) ,a$的字符串長度。
For I = 1 To I% ,一個FOR循環,根據字符長度開進行循環。
b% = b% Xor Asc(Mid(a$, I, 1)) ,Mid(a$, I, 1),把a$的第I位取1個字符。 Asc(Mid(a$, I, 1)),把這個字符轉換成Asc碼。之后b%與之異或。 Next
ff$ = Hex$(b%) ,Hex的功能是轉換為十六進制數值。
If Len(ff$) = 1 Then
ff$ = "0" + ff$
End If
FCS = ff$
End Function Private Sub Command5_Click(index As Integer) ,讀或者寫。 Dim Devadd As String, Devadd1 As String ,Devadd是輸入地址的16位數據,Devadd1是32位。
Dim Devdat1 As String
Dim station1
Dim station2
Dim station3
Dim station4
Dim station5
Dim station6
Dim setad As String, setad1 As String ,setad為輸入地址。 非實時監控通訊 = True ,需要非實時監控通訊狀態。 setad = Text1.Text ,讀取輸入的地址。 If setad = "" Then ,如果地址為空則提示。 MsgBox ("請輸入元件地址!") ,提示這個。 Text1.SetFocus ,text1控件取得焦點。 Exit Sub ,退出此事件。 End If Devadd = Right("00000" + CStr(Val(setad)), 5) ,因為其實數據編碼是五位,所以寄存器地址為后五位。 Devadd1 = Right("00000" + CStr(Val(Text1.Text) + 1), 5) ,是32位數據的時候需要兩個寄存器,分為高十六位和低十六位,其中高十六位在的寄存器地址是低十六位的寄存器地址的+1,所以CStr(Val(Text1.Text) + 1。 If index = 0 Then '如果是點擊的是讀按鈕,index是command5中的數組標識,index = 0就是讀取。 何種非實時監控通訊 = "讀" If Option3.Value = True Then ,如果是16位讀。 Sendata = "#RDD" + Devadd + Devadd ,讀取十六位數據。 Else
Sendata = "#RDD" + Devadd + Devadd1 ,讀三十二位數據。 End If Else ,如果是點擊的是寫按鈕。 何種非實時監控通訊 = "寫" If Option3.Value = True Then devdat = "#WDD" + Devadd + Devadd ,寫入十六位數據。 Else
devdat = "#WDD" + Devadd + Devadd1 ,寫入三十二位數據。 End If If Option1.Value Then ,十進制方式。 If Option4.Value = True Then ,三十二位寫入。 If CDbl(Val(Text2.Text)) > 2147483648# Then: MsgBox ("數值超限!"): Exit Sub ,CDbl為轉換為雙精度浮點型數據。若數值大于2147483648,則數值超限。Text2.Text為寫入數值,數值為16進制四位數值,如00A3H。 Devdat1 = Right(("00000000" + Hex(Val(Text2.Text))), 8) station1 = Right(Devdat1, 4) ,取數據的右四位。 station2 = Left(Devdat1, 4) ,取數據的左四位。 station3 = Right(station1, 2) ,右四位數據的右二位。 station4 = Left(station1, 2) ,右四位數據的左二位。 station1 = station3 + station4 ,數據的原始格式是左高右低,而PLC讀出和寫入的數據的格式是左低右高。 station5 = Right(station2, 2) ,左四位數據的右二位。 station6 = Left(station2, 2) ,左四位數據的左二位。 station2 = station5 + station6 Devdat1 = station1 + station2 Sendata = devdat + Devdat1 ,devadd就是DTn,而devadd1就是DTn+1,devdat =起始碼+目標站號+#+指令名稱+DTn+DTn(DTn+DTn+1),Devdar1是要寫入的數據。 Else ,單字節寫入。 If CDbl(Val(Text2.Text)) > 32767 Then: MsgBox ("數值超限"): Exit Sub Devdat1 = Right("00000000" + Hex(Val(Text2.Text)), 4) Devdat1 = Right(Devdat1, 2) + Left(Devdat1, 2) Sendata = devdat + Devdat1 End If If Option4.Value = True Then If Val("&H" + Text2.Text) > 2147483648# Then: MsgBox ("數值超限"): Exit Sub ,&H為轉換為十進制。例如:&H61=97。 Devdat1 = Right("00000000" + Text2.Text, 8) station1 = Right(Devdat1, 4) station2 = Left(Devdat1, 4) station3 = Right(station1, 2) station4 = Left(station1, 2) station1 = station3 + station4 station5 = Right(station2, 2) station6 = Left(station2, 2) station2 = station5 + station6 Devdat1 = station1 + station2 Sendata = devdat + Devdat1 Else If Val("&H" + Text2.Text) > 32767 Then: MsgBox ("êy?μ3??T£?"): Exit Sub Devdat1 = Right("00000000" + Text2.Text, 4) Devdat1 = Right(Devdat1, 2) + Left(Devdat1, 2) Sendata = devdat + Devdat1 End If End If End If End Sub Private Sub Form_Load() Dim g As Integer For g = 1 To 10 ,添加通信選擇。 Combo1.AddItem "Com" & Trim$(Str$(g)) ,添加Combo1項目10個。 Next g For g = 1 To 10 Combo2.AddItem g ,添加Combo2項目10個。 Next g Combo1.ListIndex = 0 ,默認com1口。 Combo2.ListIndex = 0 ,默認通訊超時5秒。 非實時監控通訊 = False Option1.Value = True ,默認選擇十進制。 Option3.Value = True ,默認選擇十六位讀寫方式。 Option10.Value = True ,默認選擇R。 yuanji = "DT" ,默認選擇DT。 Timer1.Enabled = True ,激活定時掃描。 Timer2.Enabled = False ,通訊超時關閉。 End Sub Private Sub fp0_OnComm() Dim GetData As String Dim k As Integer Dim asd(3) As Integer Dim wei(3) As String Dim gfd As String Dim xym(15) As String If fp0.CommEvent = comEvReceive Then ,CommEvent的屬性返回的值為comEvReceive時發生了接收事件。 Timer2.Enabled = False ,PLC有返回數據,定時器關閉。 Label2.Caption = "通訊正常" GetData = fp0.Input ,讀取接收區緩沖內容。 Shape4.BackColor = &HC0& ,通訊狀態指示燈為紅色。 If 非實時監控通訊 = True And 實時監控通訊 = False Then ,如果有非實時監控通訊操作并且實時監控通訊處理結束。 非實時監控通訊 = False ,清楚非實時監控通訊標識。 Select Case 何種非實時監控通訊 Case "讀" If Option3.Value = True Then ,16位讀。 GetData = Mid(GetData, 7, 4) station1 = Right(GetData, 2)
station2 = Left(GetData, 2)
GetData = station1 + station2
If Option2.Value = True Then
Text2.Text = CStr(Right(Hex(Val("&H" + GetData)), 4)) ,&H表示括號內為十六進制數據。
Else
GetData = Val("&H" + GetData) Text2.Text = CStr(GetData)
End If Else '32位讀
GetData = Mid(GetData, 7, 8) ,讀回來的數據的順序是先低位后高位。
station1 = Right(GetData, 4)
station2 = Left(GetData, 4)
station3 = Right(station1, 2)
station4 = Left(station1, 2)
station5 = Right(station2, 2)
station6 = Left(station2, 2)
station1 = station3 + station4
station2 = station5 + station6
GetData = station1 + station2
Dim sdfg As Double
sdfg = "&H" + GetData ,字符串+數字=字符串。
If Option2.Value = True Then ,如果是以十進制格式讀取數據。
Text2.Text = Hex(sdfg) ,
Else
Text2.Text = CStr(sdfg)
End If
End If Case "查詢"
If Mid(GetData, 7, 1) = 1 Then
Shape8.BackColor = &HC0&
Else
Shape8.BackColor = &HE0E0E0
End If End Select Else
Select Case j
Case 0 ,讀DT0---DT4。
GetData = Mid(GetData, 7, 20) '從GetData變量代表的字符的左側開始的第七位開始取四個字符賦給GetData
Text6 = GetData
For k = 0 To 4
Text5(k).Text = Val("&H" + Mid(GetData, k * 4 + 3, 2) + Mid(GetData, k * 4 + 1, 2)) 'Right的功能是從GetData變量代表的字符的右側開始取2個字符
Next k
Case 1 '讀R0---RF狀態
GetData = Mid(GetData, 7, 8) '從GetData變量代表的字符的左側開始的第七位開始取一個字符賦給GetData
Text6 = GetData
For k = 0 To 7
If Mid(GetData, k + 1, 1) = "1" Then
Shape3(k).BackColor = &HC0&
Else
Shape3(k).BackColor = &HE0E0E0
End If
Next k Case 2, 3
GetData = Mid(GetData, 7, 4) '根據協議,左起第二位開始的八位是需要的數據。取出
asd(0) = Val("&H" + Mid(GetData, 1, 2)) '低位寄存器的低八位,并轉換為十進制
asd(1) = Val("&H" + Mid(GetData, 3, 2)) '低位寄存器的高八位,并轉換為十進制
For k = 0 To 1
wei(k) = dec2bin(asd(k)) '將讀取的數據轉換成二進制
Next k
gfd = wei(1) + wei(0) '將四組的八位二進制合并在一起
Text6 = gfd
'協議規定返回的PLC是從低位到高位排列,所以先提取出的放在后面
'如讀D0的雙字,那么返回來的順序是:D0的低八位,D0的高八位,D1的低八位,D1的高八位
'如,D0雙字節的數=2685674341,它的十六進制=A0142365。那么在讀取過程中時PLC返回此數據的順序為:652314A0
For k = 0 To 15
xym(k) = Mid(gfd, 16 - k, 1) '讀取各位的狀態
If xym(k) = "1" Then '如果為1,說明相應的位為吸合狀態
Select Case j
Case 2
Shape1(k).BackColor = &HC0& '如果為讀取輸入(X)的狀態
Case 3
Shape2(k).BackColor = &HC0& '如果為讀取輸出(Y)的狀態
End Select
Else
Select Case j
Case 2
Shape1(k).BackColor = &HE0E0E0 '如果為讀取輸入(X)的狀態
Case 3
Shape2(k).BackColor = &HE0E0E0 '如果為讀取輸出(Y)的狀態
End Select
End If
Next k Case 4 '讀PLC的當前狀態
GetData = Mid(GetData, 14, 1) '從GetData變量代表的字符的左側開始的第14位開始取1個字符賦給GetData
Text6 = GetData
If Val(GetData) Mod 2 = "1" Then
Picture1(0).BackColor = &HFF&
Picture1(1).BackColor = &H80000005
Else
Picture1(0).BackColor = &H80000005
Picture1(1).BackColor = &HFF&
End If
j = -1 '計數器清零,開始下一次實時監控循環,下面有一個j=j+1,為了保證清零,所以賦的是-1
End Select
j = j + 1 '進行本次循環的下一步通訊
實時監控通訊 = False '實時監控通訊處理完畢
Timer1.Enabled = True '打開定時通訊掃描
End If End If
End Sub Private Sub Timer1_Timer() '實時監控
If errT = True Then '如果通訊口錯誤
Label2.Caption = "您的電腦沒有此通訊口"
Exit Sub
End If
Shape4.BackColor = &HE0E0E0
If 非實時監控通訊 = True Then
Select Case 何種非實時監控通訊
Case "讀"
If Option3.Value = True Then '十六進制
fp0.RThreshold = 13 '設定產生OnComm事件的接收緩沖區字符數
Else
fp0.RThreshold = 17 '設定產生OnComm事件的接收緩沖區字符數
End If
Case "查詢"
fp0.RThreshold = 10 '設定產生OnComm事件的接收緩沖區字符數
Case "寫", "置位", "復位"
fp0.RThreshold = 9 '設定產生OnComm事件的接收緩沖區字符數
Case "運行"
fp0.RThreshold = 9 '設定產生OnComm事件的接收緩沖區字符數
End Select
Else
實時監控通訊 = True
Select Case j '作用:實時監控共需要五次才能完成一個實時監控通訊循環,每次j+1來判斷應該發送第幾次命令
Case 0 '讀DT0----DT4
Sendata = "#RDD0000000004" '根據協議要求發送代碼
fp0.RThreshold = 29 '設定產生OnComm事件的接收緩沖區字符數
Case 1 '讀R0---RF狀態
Sendata = "#RCP8R0000R0001R0002R0003R0004R0005R0006R0007"
fp0.RThreshold = 17 '設定產生OnComm事件的接收緩沖區字符數
Case 2 '讀輸入點狀態
Sendata = "#RCCX00000000"
fp0.RThreshold = 13 '設定產生OnComm事件的接收緩沖區字符數
Case 3 '讀輸出點狀態
Sendata = "#RCCY00000000"
fp0.RThreshold = 13 '設定產生OnComm事件的接收緩沖區字符數
Case 4 '讀PLC的當前狀態
Sendata = "#RT"
fp0.RThreshold = 25 '設定產生OnComm事件的接收緩沖區字符數
End Select
End If
Sendata = Sendata + FCS(Sendata) + vbCr 'FCS(fs)是調用校驗和程序
fp0.InBufferCount = 0
fp0.OutBufferCount = 0
fp0.Output = Sendata
Timer1.Enabled = False '關閉定時通訊,等待PLC返回數據。fp0_OnComm()事件處理完返回的數據后,再打開定時通訊
Timer2.Enabled = True '打開與PLC通訊是否正常判斷定時器
l = 0
End Sub Private Sub Timer2_Timer() '如果發送命令結束后,在設定的通訊超時時間內此定時器仍沒有關斷
Label2.Caption = "通訊不正常" '通訊狀態指示
j = 0
Timer1.Enabled = True '打開定時通訊掃描
End Sub
以上內容word格式下載:
VB與松下PLC通信程序學習.docx
(83.76 KB, 下載次數: 24)
2020-9-9 09:20 上傳
點擊文件名下載附件
VB與松下PLC通信程序學習.docx 下載積分: 黑幣 -5
|