VB與永宏P(guān)LC通信源碼_第1頁
VB與永宏P(guān)LC通信源碼_第2頁
VB與永宏P(guān)LC通信源碼_第3頁
VB與永宏P(guān)LC通信源碼_第4頁
VB與永宏P(guān)LC通信源碼_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、VB與永宏P(guān)LC通信源碼VB與PLC之即時(shí)控制系統(tǒng)詹金萬、陳嘉龍一、前言隨著IT產(chǎn)業(yè)的進(jìn)步及網(wǎng)際網(wǎng)路的發(fā)展,傳統(tǒng)工業(yè)控制所使用之PLC控制器,具有高度的穩(wěn)定性及抗雜訊的特性且配線容易及價(jià)格便宜,因此被大量應(yīng)用在自動(dòng)化的場所,已由單機(jī)操作朝向網(wǎng)路控制化發(fā)展,本文在探討網(wǎng)路控制化的核心技術(shù),使PC藉由RS-232通訊協(xié)定(註)控制PLC(如圖一),並透過VB程式語言,達(dá)到遠(yuǎn)端控制及網(wǎng)路自動(dòng)化控制的功能。本文以手動(dòng)/自動(dòng)紅綠燈控制為主題,所使用之PLC為國內(nèi)永宏電機(jī)公司所製FB-PLC,內(nèi)含通訊模組,因此不需額外增購,且可由該公司網(wǎng)站免費(fèi)下載及更新階梯圖發(fā)展軟體(Winproladder)。二、FB

2、-PLC通訊協(xié)定FB-PLC藉由RS-232與PLC取得介面的傳輸,其傳輸格式(註)如圖二所示,以起始字元(ASCII 02H)與結(jié)束字元(ASCII 03H)作為整個(gè)命令傳輸及回應(yīng)訊息的傳輸封包,F(xiàn)B-PLC總計(jì)提供15種命令格式(ASCII 40H4EH),當(dāng)主系統(tǒng)將命令傳至PLC後,PLC 將依據(jù)命令自動(dòng)回傳所對應(yīng)的訊息,如圖三所示範(fàn)例:將PLC啟動(dòng)(RUN)Master 命令PLC回應(yīng)三手動(dòng)/自動(dòng)紅綠燈控制階梯圖程式利用暫存器R0,R4作為綠燈時(shí)間的計(jì)數(shù)器,R1,R2作為綠燈閃爍次數(shù)及閃爍時(shí)間的計(jì)數(shù)器,R3作為黃燈停留時(shí)間計(jì)數(shù)器,Y0、Y1、Y2分別代表東西向紅、黃、綠三個(gè)燈,Y3、Y

3、4、Y5分別代表南北向紅、黃、綠三個(gè)燈。利用輸入X2作手動(dòng)自動(dòng)的切換控制。當(dāng)PLC處於自動(dòng)模式時(shí),綠燈交換分別由暫存器R0、R4控制;當(dāng)PLC處於手動(dòng)模式時(shí),由輸入X1決定綠燈交換程序。紅綠燈階梯圖的設(shè)計(jì)程式如圖四所示。圖四手動(dòng)自動(dòng)紅綠燈控制階梯圖程式四、VB 即時(shí)監(jiān)程式架構(gòu)及程式設(shè)計(jì)PC藉由RS232與PLC取得連線,傳送速度設(shè)定為9600bps,整個(gè)連線設(shè)定請參考VB程式Form_Load()段。即時(shí)監(jiān)控畫面設(shè)計(jì)如圖五所示,當(dāng)執(zhí)行即時(shí)偵測狀態(tài)按鈕時(shí),桌面將呈現(xiàn)如圖六圖九所示即時(shí)狀態(tài)圖,狀態(tài)的偵測採用輪詢(polling)方式,依序讀取PLC輸出及輸入的即時(shí)狀態(tài),程式執(zhí)行請參考VB程式Sen

4、dFrame(Data, No)段;執(zhí)行參數(shù)傳遞按鈕時(shí),桌面將呈現(xiàn)如圖十畫面,當(dāng)使用者修改參數(shù)後,執(zhí)行傳遞參數(shù)按鈕,PLC 將依據(jù)新的數(shù)據(jù)執(zhí)行其程序,程式執(zhí)行請參考VB程式Send_Ref_Click()段。另傳送命令按鈕提供個(gè)別參數(shù)的讀取和設(shè)定及PLC執(zhí)行程式的載入和存檔等多項(xiàng)功能,桌面呈現(xiàn)如圖十一畫面,程式執(zhí)行請參考VB程式SendCmd_Click()段。圖五即時(shí)監(jiān)控畫面設(shè)計(jì)圖六東西向綠燈Y0監(jiān)控狀態(tài)圖七東西向黃燈Y1監(jiān)控狀態(tài)圖八南北向綠燈Y3監(jiān)控狀態(tài)圖十參數(shù)設(shè)定傳遞畫面圖九南北向黃燈Y4監(jiān)控狀態(tài)五、結(jié)論隨著網(wǎng)際網(wǎng)路的普及,遠(yuǎn)端監(jiān)控已是必然的趨勢,本專題所提供PC與FB-PLC間的連線,

5、僅需在VB程式中加入網(wǎng)際網(wǎng)路物件即可達(dá)到Internet的遠(yuǎn)距控制,亦可透過RS485介面達(dá)到遠(yuǎn)端即時(shí)監(jiān)控。六、參考資料:“Vb與8051串列傳送之研製”國立瑞芳高工90年教師專題研究:“FB-系列RS-232 通訊協(xié)定”永宏電機(jī)股份有限公司七、VB 程式碼Form1程式碼如下:Dim Status1(15) Input X接點(diǎn)的狀態(tài)Dim Status2(12) Output Y接點(diǎn)的狀態(tài)Dim bx(15) X接點(diǎn)狀態(tài)Dim by(12) Y接點(diǎn)狀態(tài)Dim RegDim flag 啟動(dòng)旗號(hào)Dim flag1 由電腦讀出PLC暫存器程式旗號(hào)命令4A程式Dim flag2 由電腦寫入PLC暫存

6、器程式旗號(hào)命令4B程式Dim page_no 暫存器頁數(shù)Public Sub SendFrame(Data, No) 傳送通訊訊息格式()副程式Select Case NoCase 0:Check = Calculate_LRC(Data, 0) 計(jì)算LRC值sendtxt = Chr$(&H2) & Trim(ClientNo) & Trim(CmdNo) & Trim(Data) & Trim(Check) & Chr$(&H3)開頭字元+僕站號(hào)碼+命令號(hào)碼+本文資料+偵誤值+結(jié)尾字元Case 1:Check = Calculate_LRC(Data, 1) 計(jì)算LRC值sendtxt =

7、 Chr$(&H2) & Trim(ClientNo) & Trim(Data) & Trim(Check) & Chr$(&H3)開頭字元+僕站號(hào)碼+本文資料+偵誤值+結(jié)尾字元Case 2: sendtxt = Chr$(&H2) & Trim(ClientNo) & Trim(Data) & Trim(Check_RegText) & Chr(&H3)開頭字元+本文資料+結(jié)尾字元End SelectMSComm.Output = sendtxt 透過RS-232送出End SubPublic Function Calculate_LRC(Data, No) As String 計(jì)算LRC值

8、()副程式Select Case NoCase 0:LRC = 2 + Asc(Left(ClientNo, 1) + Asc(Mid(ClientNo, 2, 1) + Asc(Left(CmdNo, 1) + Asc(Mid(CmdNo, 2, 1)包含開頭字元Chr$(&H2)、僕站號(hào)碼與命令碼Case 1:LRC = 2 + Asc(Left(ClientNo, 1) + Asc(Mid(ClientNo, 2, 1)End SelectFor i = 1 To Len(Data)LRC = LRC + Asc(Mid(Data, i, 1) 將Data一次取一字元加入LRC中Next

9、LRC_Remain = LRC Mod 16 取餘數(shù)LRC的個(gè)位數(shù)LRC_Quotient = LRC 16 取商數(shù)LRC_Quotient = LRC_Quotient Mod 16 LRC的十位數(shù)Calculate_LRC = Hex(LRC_Quotient) & Hex(LRC_Remain) 回傳十六進(jìn)位值End FunctionPrivate Sub B_Y_Click(Index As Integer) Y按鈕()副程式If Index = 0 Then 如果是第0個(gè)按鈕If by(Index) = 1 Then 原先是High,就讓它變Lowsendtxt = 424Y000

10、0 傳送字串多補(bǔ)一個(gè)0by(Index) = 0 更改by(Index)內(nèi)容為Low的狀態(tài)Y接點(diǎn)狀態(tài)Else 原先是Low,就讓它變Highsendtxt = 423Y0000by(Index) = 1 更改by(Index)內(nèi)容為High的狀態(tài)End IfElse 如果是第1第11個(gè)按鈕If by(Index) = 1 Thensendtxt = 424Y000 & Format(Hex(Index), #) 傳送字串為兩位數(shù),不須補(bǔ)一個(gè)0by(Index) = 0Elsesendtxt = 423Y000 & Format(Hex(Index), #)by(Index) = 1End If

11、End IfSendFrame sendtxt, 1 傳送命令資料至RS-232End SubPrivate Sub CmdList_Click() 命單清單選擇()副程式Select Case CmdList.ListIndex 依據(jù)命令清單來選擇命令Case 0: CmdNo = 40Case 1: CmdNo = 41Case 2: CmdNo = 42Case 3: CmdNo = 43Case 4: CmdNo = 44Case 5: CmdNo = 45Case 6: CmdNo = 46Case 7: CmdNo = 47Case 8: CmdNo = 48Case 9: Cmd

12、No = 49Case 10: CmdNo = 4ACase 11: CmdNo = 4BCase 12: CmdNo = 4CCase 13: CmdNo = 4DCase 14: CmdNo = 4EEnd SelectEnd SubPrivate Sub CmdNo_Change() 命令號(hào)碼改變()副程式Select Case CmdNo.Text 依據(jù)選擇命令顯示命令清單Case 40: CmdList.ListIndex = 0Case 41: CmdList.ListIndex = 1Case 42: CmdList.ListIndex = 2Case 43: CmdList.L

13、istIndex = 3Case 44: CmdList.ListIndex = 4Case 45: CmdList.ListIndex = 5Case 46: CmdList.ListIndex = 6Case 47: CmdList.ListIndex = 7Case 48: CmdList.ListIndex = 8Case 49: CmdList.ListIndex = 9Case 4A: CmdList.ListIndex = 10Case 4B: CmdList.ListIndex = 11Case 4C: CmdList.ListIndex = 12Case 4D: CmdLis

14、t.ListIndex = 13Case 4E: CmdList.ListIndex = 14Case Else: MsgBox 無此命令!, vbCritical, 錯(cuò)誤!End SelectEnd SubPrivate Sub Command1_Click()Form1.HideForm2.ShowEnd SubPrivate Sub Connect_Click() 同步狀態(tài)偵測()副程式flag = 1 設(shè)定啟動(dòng)旗號(hào)Connect.Enabled = False 同步狀態(tài)偵測按鈕失效DoDoEventsSendFrame 440CY0000, 1 要求回傳Y0000Y000B共12個(gè)接點(diǎn)

15、狀態(tài)For i = 0 To 10 延遲時(shí)間DoEventsNextSendFrame 4410X0000, 1 要求回傳X0000X0010共16個(gè)接點(diǎn)狀Loop While (flag = 1) 重覆執(zhí)行回傳X與Y接點(diǎn)狀態(tài),直到啟動(dòng)旗號(hào)被停止為止End SubPrivate Sub Form_Activate() 表單啟用()副程式CmdList.ListIndex = 1 預(yù)設(shè)命令為PLC執(zhí)行控制End SubPrivate Sub RegText_Change() RegText改變()副程式Check_RegText = Calculate_LRC(RegText, 1) 計(jì)算LRC

16、值顯示在Check_RegText上End SubPrivate Sub SendCmd_Click() 傳送()副程式If SendData = ThenMsgBo x 傳送資料不可空白!, vbCritical, 錯(cuò)誤!ElseCheckText = Calculate_LRC(SendData, 0) 計(jì)算LRC值顯示在檢查碼上SendFrame SendData, 0 傳送資料End IfEnd SubPrivate Sub ClearData_Click() 清除()副程式For i = 0 To 15bx(i) = 0InpX(i).BackColor = RGB(255, 255

17、, 255) 接點(diǎn)全部OFF,顯示白色NextFor i = 0 To 11by(i) = 0OutY(i).BackColor = RGB(255, 255, 255) 接點(diǎn)全部OFF,顯示白色NextEnd SubPrivate Sub EndCmd_Click() 結(jié)束()副程式If MSComm.PortOpen = True ThenMSComm.PortOpen = False 關(guān)閉通訊埠End IfEnd 程式結(jié)束End SubPrivate Sub Form_Load() 表單載入()副程式/doc/2a096a7d31b765ce

18、05081419.htmlmPort = 1 指定COM1作為通訊埠MSComm.Settings = 9600,e,7,1 設(shè)定通訊協(xié)定的格式MSComm.PortOpen = True 開起通訊埠MSComm.R Threshold = 1 設(shè)定輸入緩衝區(qū)接到一個(gè)字,即起動(dòng)接收事件(OnComm)MSComm.InputLen = 0 設(shè)定每次讀取輸入緩衝區(qū)的資料的長度,0表示每次讀取所有資料MSComm.R TSEnable = True 使Request To Send (RTS) 線有效。一般情況下,由電腦傳送RTS 信號(hào)到數(shù)據(jù)機(jī),以請示準(zhǔn)許傳送資料flag = 1 啟動(dòng)旗號(hào)flag

19、1 = 0 設(shè)定讀出PLC暫存器程式旗號(hào)flag2 = 1 設(shè)定寫入PLC暫存器程式旗號(hào)End SubPublic Sub MSComm_OnComm() RS-232接收()副程式Dobuffer = buffer & MSComm.Input 一直接收字串,直到收到結(jié)尾字元為止Loop Until InStr(buffer, Chr(&H3)If InStr(buffer, Chr(&H2) Thenbuffer = Right(buffer, Len(buffer) - 1) 去除開頭字元End IfIf InStr(buffer, Chr(&H3) Thenbuffer = Mid(b

20、uffer, 1, InStr(1, buffer, Chr(&H3), 1) - 1) 去除結(jié)尾字元End IfSelect Case Mid(buffer, 3, 2) 判別命令碼Case 40: PLC系統(tǒng)狀態(tài)Case 41: PLC之RUN/STOP控制Case 42: 單一個(gè)單點(diǎn)之運(yùn)作控制Case 43: 連續(xù)多個(gè)單點(diǎn)之抑/致能狀態(tài)讀取Case 44: 連續(xù)多個(gè)單點(diǎn)之狀態(tài)讀取 顯示狀態(tài)值XStatus = 清除XStatus內(nèi)容YStatus = 清除YStatus內(nèi)容If Len(buffer) = 23 Then 接收到Input X 的內(nèi)容For i = 0 To 15 015

21、共16個(gè)輸入端XStatus = XStatus & Mid(buffer, 6 + i, 1)將16個(gè)接點(diǎn)的ON/OFF狀態(tài)顯示在XStatus上If Mid(XStatus, i + 1, 1) = 1 ThenInpX(i).BackColor = RGB(255, 0, 0) 如果接點(diǎn)為ON,顯示紅色bx(i) = 1ElseInpX(i).BackColor = RGB(255, 255, 255) 如果接點(diǎn)為OFF,顯示白色bx(0) = 0End IfNextElseIf Len(buffer) = 19 Then 接收到Output Y 的內(nèi)容For i = 0 To 11 0

22、11共12個(gè)輸出端YStatus = YStatus & Mid(buffer, 6 + i, 1)將12個(gè)接點(diǎn)的ON/OFF狀態(tài)顯示在YStatus上If Mid(YStatus, i + 1, 1) = 1 ThenOutY(i).BackColor = RGB(255, 0, 0) 如果接點(diǎn)為ON,顯示紅色by(i) = 1ElseOutY(i).BackColor = RGB(255, 255, 255) 如果接點(diǎn)為OFF,顯示白色by(i) = 0End IfNextEnd IfCase 45: 連續(xù)多個(gè)單點(diǎn)之狀態(tài)寫入Case 46: 連續(xù)多個(gè)暫存器之資料讀取Case 47: 連續(xù)多

23、個(gè)暫存器之資料寫入Case 48: 任意單點(diǎn)/暫存器混合之狀態(tài)/資料讀取Case 49: 任意單點(diǎn)/暫存器混合之狀態(tài)/資料寫入Case 4A: 程式存檔Reg = buffer 顯示暫存器內(nèi)容存入Regflag1 = 1 設(shè)定讀出暫存器旗標(biāo),以利Read_PLC_Click()副程式執(zhí)行Case 4B: 程式載入flag2 = 1 設(shè)定寫入暫存器旗標(biāo),以利Write_PLC_Click()副程式執(zhí)行Case 4C: 暫存器資料存檔Case 4D: 暫存器資料載入Case 4E: 測試回傳Case Else: 未知命令 & Mid(buffer, 3, 2) & vbCrLf & bufferE

24、nd SelectEnd SubPrivate Sub Read_PLC_Click() 讀取PLC()副程式FileDlg.Filter = *.txt 預(yù)設(shè)副檔名為*.txtFileDlg.ShowSave 顯示儲(chǔ)存檔案對話盒fn = FileDlg.FileName 指定檔名fnOn Error GoTo err 如有錯(cuò)誤發(fā)生,跳至錯(cuò)誤處理Open fn For Append As #1 將讀出的暫存器內(nèi)容存檔For page_no = 0 To 127 暫存器共128頁RegTxt = 每次清除轉(zhuǎn)換後要存檔的Reg內(nèi)容SendFrame 4A & Format(Hex(page_no)

25、, #), 1Do Until flag1 = 1 直到電腦讀出PLC暫存器程式旗號(hào)為止DoEventsLoopFor i = 3 To Len(Reg) - 2 從頭開始至偵誤碼前結(jié)束If i = 4 ThenRegTxt = RegTxt & B 將命令4A改成4BElseIf i = 5 ThenIf page_no RegTxt = RegTxt & 0 & Hex(page_no) 少於兩碼的,補(bǔ)一位數(shù)的0ElseRegTxt = RegTxt & Hex(page_no) 本來就是兩碼的,不須補(bǔ)0End IfElseRegTxt = RegTxt & Mid(Reg, i, 1)

26、將讀取進(jìn)來的RegText轉(zhuǎn)換成要存檔的Reg End IfNextRegText = RegTxt 顯示在RegText上Write #1, RegText 寫入檔案flag1 = 0 清除旗號(hào),等待下次再執(zhí)行Nexterr: 錯(cuò)誤處理Close #1 關(guān)閉檔案End SubPrivate Sub RunCmd_Click() 執(zhí)行()副程式If MSComm.PortOpen = False ThenMSComm.PortOpen = TrueEnd IfRunCmd.Enabled = False 執(zhí)行按鈕失效StopCmd.Enabled = True 停止按鈕有效Connect.En

27、abled = True 同步狀態(tài)偵測按鈕有效SendFrame 411, 1 傳送命令flag = 1 設(shè)定啟動(dòng)旗號(hào),執(zhí)行迴圈End SubPrivate Sub SendData_Change() 傳送資料改變()副程式CheckSum = Calculate_LRC(SendData, 0) 計(jì)算檢查碼顯示在CheckSum上End SubPrivate Sub StopCmd_Click() 停止()副程式RunCmd.Enabled = True 執(zhí)行按鈕有效StopCmd.Enabled = False 停止按鈕失效Connect.Enabled = False 同步狀態(tài)偵測按鈕有

28、效flag = 0 停止啟動(dòng)旗號(hào),跳離執(zhí)行迴圈For i = 0 To 4SendFrame 410, 1 為防止無法立即關(guān)閉,傳送三次命令,強(qiáng)迫停止NextFor i = 0 To 11by(i) = 0OutY(i).BackColor = RGB(255, 255, 255) 接點(diǎn)全部OFF,顯示白色NextEnd SubForm2程式碼如下:Dim R0, R1, R2, R3, R4Private Sub BackMain_Click()Unload MeForm1.ShowEnd SubPrivate Sub Default_Ref_Click()EW_GreenTime = 25

29、GreenFlashCount = 2GreenFlashTime = 4Y ellowTime = 20SN_GreenTime = 25End SubPrivate Sub EW_GreenTime_Change()VScrollGT_EW.V alue = EW_GreenTimeEnd SubPrivate Sub Form_Activate()Default_Ref_ClickEnd SubPrivate Sub Form_Load()VScrollGFT = GreenFlashTimeVScrollGFC = GreenFlashCountVScrollYT = Y ellowTimeVScrollGT_EW = EW_GreenTimeVScrollGT_SN = SN_GreenTimeEnd SubPrivate Sub G

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論