1 引言
PLC(可編程邏輯控制器)在工業(yè)自動化中得到了非常廣泛的應(yīng)用,從起初的簡單邏輯動作控制到現(xiàn)在的集網(wǎng)絡(luò),復(fù)雜數(shù)據(jù)運(yùn)算,通信為一體,其功能和應(yīng)用領(lǐng)域在未來還將會進(jìn)一步地被拓寬。但在數(shù)據(jù)運(yùn)算,圖象處理以及數(shù)據(jù)存儲等方面依然是PLC比較弱的方面,若能結(jié)合32位或64位計(jì)算機(jī)一起使用,結(jié)合兩者的長處必定能取得較好的使用效果。

      技術(shù)頻道

      基于PC的虛擬儀表數(shù)據(jù)采集分析系統(tǒng)

      1 引言
      PLC(可編程邏輯控制器)在工業(yè)自動化中得到了非常廣泛的應(yīng)用,從起初的簡單邏輯動作控制到現(xiàn)在的集網(wǎng)絡(luò),復(fù)雜數(shù)據(jù)運(yùn)算,通信為一體,其功能和應(yīng)用領(lǐng)域在未來還將會進(jìn)一步地被拓寬。但在數(shù)據(jù)運(yùn)算,圖象處理以及數(shù)據(jù)存儲等方面依然是PLC比較弱的方面,若能結(jié)合32位或64位計(jì)算機(jī)一起使用,結(jié)合兩者的長處必定能取得較好的使用效果。

      2 系統(tǒng)整體設(shè)計(jì)
      參見圖1,在原理示意圖例中,通過松下PLC自帶的溫度數(shù)據(jù)讀取單元對熱敏電阻阻值的變化量進(jìn)行A/D轉(zhuǎn)換后將數(shù)據(jù)存儲到PLC的“DT90040”和“DT90041”兩個數(shù)據(jù)寄存器,這兩個寄存器分別對應(yīng)了CH1和CH2兩個物理通道。松下PLC的工作掃描周期為0.5ms,溫度數(shù)據(jù)將在每個周期更新一次。

      圖1 原理示意圖


      利用個人計(jì)算機(jī)的串行通信端口以10ms的掃描周期從PLC中將數(shù)據(jù)取出后存到動態(tài)數(shù)組中,在通過PICTURE控件以畫圖的方法將溫度變化曲線表示出來。欲保存所取得的數(shù)據(jù)時可將數(shù)據(jù)輸出到指定的EXCEL文件中。

      3 系統(tǒng)的實(shí)現(xiàn)方法
      3.1 PLC和VB6.0的通信與數(shù)據(jù)傳輸處理
      計(jì)算機(jī)和PLC之間通信的時候,相互間傳輸?shù)臄?shù)據(jù)為4位16進(jìn)制BCD碼,當(dāng)通過計(jì)算機(jī)的串行口按照一定的規(guī)則向PLC發(fā)出數(shù)據(jù)后,PLC在受到指令后也將返回一段有規(guī)則的代碼,而筆者所需要的信息就包含在那一段返回碼中。在這里,可將計(jì)算機(jī)串口和PLC的通信格式都設(shè)為:
      波特率:115200B;
      校驗(yàn)位:基校驗(yàn);
      數(shù)據(jù)長:8位;
      停止位:1位;
      松下FP系列PLC的通信協(xié)議MEWTOCOL-COM命令格式如下:指令格式。
      指令信息:


      應(yīng)答信息 (正常時):


      應(yīng)答信息 (發(fā)生錯誤時):


      通過查閱FP系列用戶手冊,可以發(fā)現(xiàn)熱敏電阻值變化在“DT90040”和“DT90041”寄存器中得以體現(xiàn),那么若能讀出這些值,就可以對數(shù)據(jù)進(jìn)行保存處理等相關(guān)操作。
      對數(shù)據(jù)寄存器讀取命令格式為:


      PLC接受到上述指令后會返回下列代碼:
      讀取成功


      讀取失敗


      在所接受到的數(shù)據(jù)的排列格式和我們正常思維所想的是不一樣的,其排列如下:


      Data (4 characters)
      例:DT1105 =K13639( 3547H)
      通過計(jì)算機(jī)RS-232口將下列數(shù)據(jù)發(fā)出后:


      這樣的現(xiàn)象在串口通信中是很常見的,希望讀者在使用時務(wù)必加以充分的理解注意。
      3.2 數(shù)據(jù)讀取處理詳細(xì)
      在介紹了以上PLC和計(jì)算機(jī)通信的規(guī)則方法后下面將講解如何具體來實(shí)現(xiàn)準(zhǔn)確的數(shù)據(jù)讀操作。
      參見圖2,在按下開始按鈕后將執(zhí)行下列代碼:

      圖2 數(shù)據(jù)讀取


      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
      停止數(shù)據(jù)的采集:
      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
      在“開始”被執(zhí)行后時間控件開始有效,執(zhí)行下列代碼,每個時間周期做一次動作。
      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 "數(shù)據(jù)采集結(jié)束。", 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
      在上面的代碼中使用了自定義的函數(shù)AreaReadD(d1,d1,r),這個函數(shù)的作用是用來讀取PLC中d1到d2地址中的數(shù)值,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 "數(shù)據(jù)殼出時通信發(fā)生問題!", 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功能執(zhí)行后對其返回信息進(jìn)行分析和處理的函數(shù)為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
      校驗(yàn)碼生成用命令如下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
      在上述的例子中使用了多個函數(shù),在VB6.0中函數(shù)有內(nèi)函數(shù)和自定義函數(shù),進(jìn)行有效的利用,可以節(jié)約編程的時間,亦可使程序明朗簡潔。

      以上的代碼構(gòu)成了我們數(shù)據(jù)采集的人機(jī)對話用界面,那么在PLC中也要進(jìn)行必要的設(shè)定,因?yàn)槲覀冊谶@里用的是熱敏電阻,其阻值和所對應(yīng)的數(shù)據(jù)為非絕對線性,需要進(jìn)行必要的轉(zhuǎn)化,其熱敏電阻的一些使用特性如下:
      (1) 熱敏電阻輸入保存的方法
      ●把連接在外部的熱敏電阻變化作為電壓的變化保存下來,使用內(nèi)置的AD轉(zhuǎn)換其轉(zhuǎn)換為數(shù)字?jǐn)?shù)值,進(jìn)性保存。
      ●轉(zhuǎn)換的數(shù)字值反映在特殊數(shù)據(jù)寄存器(DT90040或DT90041)上,可以在用戶程序中讀取。如圖3所示:

      圖3 熱敏電阻輸入保存的方法示意圖


      (2) 總精度
      總精度=(內(nèi)置的AD轉(zhuǎn)換器總精度:±5LSB注)+(熱敏電阻精度)
      注:±5LSB,與A/D轉(zhuǎn)換后的數(shù)值(0~1000)相比,總精度有±5的誤差。
      (3) 熱敏電阻和數(shù)字轉(zhuǎn)換值
      熱敏電阻值和數(shù)字轉(zhuǎn)換值的轉(zhuǎn)換用以下計(jì)算公式進(jìn)行,數(shù)字轉(zhuǎn)換值在K0~K1000之間變化。


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

      附表 選擇的熱敏電阻類別


      由以上的數(shù)據(jù)我們在PLC中輸入如下梯形圖程序可以將溫度值保存到“DT100”圖4梯形圖。

      圖4 溫度值保存到“DT100”的梯形圖


      這樣在運(yùn)行數(shù)據(jù)采集軟件后,點(diǎn)擊“開始”后將會在坐標(biāo)區(qū)顯示出當(dāng)前溫度的數(shù)值曲線,
      當(dāng)測試結(jié)束后點(diǎn)擊“數(shù)據(jù)保存”后可以在同文件目錄下找到”My.xls”文件,如圖5所示。

      圖5 My.xls”文件


      4 結(jié)束語
      通過比較圖5波形,可以發(fā)現(xiàn),溫度曲線以極其準(zhǔn)確的精度被記錄下來,可以很方便地生成EXCEL圖表文件,這在工程技術(shù)應(yīng)用和工廠自動化應(yīng)用中可以作為有力的參考和高效的工具。

      文章版權(quán)歸西部工控xbgk所有,未經(jīng)許可不得轉(zhuǎn)載。

      主站蜘蛛池模板: 日产亚洲一区二区三区| 一区国产传媒国产精品| 色窝窝免费一区二区三区| 久热国产精品视频一区二区三区| 亚洲一区二区三区乱码A| 国99精品无码一区二区三区| 无码精品人妻一区二区三区影院| 日韩人妻无码免费视频一区二区三区| 一本岛一区在线观看不卡| 日本高清无卡码一区二区久久| 韩国理伦片一区二区三区在线播放| 亚洲一区中文字幕在线电影网| 日韩AV无码一区二区三区不卡毛片 | 亚洲国产日韩一区高清在线| 国产成人一区二区三区| 久久国产一区二区| av无码精品一区二区三区四区| 亚洲综合一区二区| 无码午夜人妻一区二区三区不卡视频| 亚洲一区二区三区在线视频| 国产午夜精品片一区二区三区| 无码人妻少妇色欲AV一区二区| 国产午夜精品一区二区三区| 手机看片福利一区二区三区| 成人区精品一区二区不卡亚洲| 色久综合网精品一区二区| 69福利视频一区二区| 亚洲国产成人久久综合一区| 无码人妻av一区二区三区蜜臀| 无码人妻精品一区二区三区久久久| 日本一区二区三区不卡视频| 国产在线精品一区二区高清不卡 | 在线观看国产区亚洲一区成人| 亚洲综合无码一区二区痴汉| 日产一区日产2区| 日本一区二区三区久久| 国产精品亚洲一区二区无码| 国产日韩精品一区二区在线观看播放 | 日韩在线视频一区| 韩国精品一区视频在线播放| 精品一区二区三区在线视频观看 |