久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3390|回復: 1
打印 上一主題 下一主題
收起左側

VB與松下PLC通信程序學習資料

[復制鏈接]
跳轉到指定樓層
樓主
ID:817370 發表于 2020-9-9 09:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
獻給有需要的人

這就是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)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1006852 發表于 2022-3-7 16:35 | 只看該作者
VB少有人用嗎?前一個資料也沒有看。這么好的資料沒有一個回復的。是不是沒有人用上位機聯PLC?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区久久 | 亚洲精品18 | 欧美一a一片一级一片 | 日韩在线xx | 成人av片在线观看 | 在线视频91| 精品久久久久国产 | 欧美精品久久久久 | 狠狠亚洲| 国产精品久久久久久久久动漫 | 国产精品区二区三区日本 | 久久久久久中文字幕 | 91精品国产综合久久精品图片 | 一级在线观看 | 久久一及片 | 成人精品免费视频 | 九九热精品免费 | 一区二区三区国产精品 | 国产视频第一页 | 国产精品久久欧美久久一区 | 蜜桃免费一区二区三区 | 在线欧美一区 | 99精品久久久久久久 | 午夜日韩 | 一区中文字幕 | 男女羞羞视频在线免费观看 | 精品欧美一区二区三区 | 国产日韩欧美另类 | 91传媒在线观看 | 在线视频亚洲 | 欧美成人高清视频 | yeyeav| 日韩在线视频观看 | caoporn地址| 欧美性网| 国产精品a级 | 日韩一区二区三区四区五区六区 | 一片毛片| 亚洲午夜电影 | 日本a视频| 一区二区三区免费看 |