VB与永宏PLC通信源码_第1页
VB与永宏PLC通信源码_第2页
VB与永宏PLC通信源码_第3页
VB与永宏PLC通信源码_第4页
VB与永宏PLC通信源码_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

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

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

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

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

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

7、 Chr$(&H2) & Trim(ClientNo) & Trim(Data) & Trim(Check) & Chr$(&H3)開頭字元+僕站號碼+本文資料+偵誤值+結尾字元Case 2: sendtxt = Chr$(&H2) & Trim(ClientNo) & Trim(Data) & Trim(Check_RegText) & Chr(&H3)開頭字元+本文資料+結尾字元End SelectMSComm.Output = sendtxt 透過RS-232送出End SubPublic Function Calculate_LRC(Data, No) As String 計算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)、僕站號碼與命令碼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 取餘數LRC的個位數LRC_Quotient = LRC 16 取商數LRC_Quotient = LRC_Quotient Mod 16 LRC的十位數Calculate_LRC = Hex(LRC_Quotient) & Hex(LRC_Remain) 回傳十六進位值End FunctionPrivate Sub B_Y_Click(Index As Integer) Y按鈕()副程式If Index = 0 Then 如果是第0個按鈕If by(Index) = 1 Then 原先是High,就讓它變Lowsendtxt = 424Y000

10、0 傳送字串多補一個0by(Index) = 0 更改by(Index)內容為Low的狀態Y接點狀態Else 原先是Low,就讓它變Highsendtxt = 423Y0000by(Index) = 1 更改by(Index)內容為High的狀態End IfElse 如果是第1第11個按鈕If by(Index) = 1 Thensendtxt = 424Y000 & Format(Hex(Index), #) 傳送字串為兩位數,不須補一個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 依據命令清單來選擇命令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() 命令號碼改變()副程式Select Case CmdNo.Text 依據選擇命令顯示命令清單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, 錯誤!End SelectEnd SubPrivate Sub Command1_Click()Form1.HideForm2.ShowEnd SubPrivate Sub Connect_Click() 同步狀態偵測()副程式flag = 1 設定啟動旗號Connect.Enabled = False 同步狀態偵測按鈕失效DoDoEventsSendFrame 440CY0000, 1 要求回傳Y0000Y000B共12個接點

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

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

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

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

19、1 = 0 設定讀出PLC暫存器程式旗號flag2 = 1 設定寫入PLC暫存器程式旗號End SubPublic Sub MSComm_OnComm() RS-232接收()副程式Dobuffer = buffer & MSComm.Input 一直接收字串,直到收到結尾字元為止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) 去除結尾字元End IfSelect Case Mid(buffer, 3, 2) 判別命令碼Case 40: PLC系統狀態Case 41: PLC之RUN/STOP控制Case 42: 單一個單點之運作控制Case 43: 連續多個單點之抑/致能狀態讀取Case 44: 連續多個單點之狀態讀取 顯示狀態值XStatus = 清除XStatus內容YStatus = 清除YStatus內容If Len(buffer) = 23 Then 接收到Input X 的內容For i = 0 To 15 015

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

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

23、個暫存器之資料寫入Case 48: 任意單點/暫存器混合之狀態/資料讀取Case 49: 任意單點/暫存器混合之狀態/資料寫入Case 4A: 程式存檔Reg = buffer 顯示暫存器內容存入Regflag1 = 1 設定讀出暫存器旗標,以利Read_PLC_Click()副程式執行Case 4B: 程式載入flag2 = 1 設定寫入暫存器旗標,以利Write_PLC_Click()副程式執行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 預設副檔名為*.txtFileDlg.ShowSave 顯示儲存檔案對話盒fn = FileDlg.FileName 指定檔名fnOn Error GoTo err 如有錯誤發生,跳至錯誤處理Open fn For Append As #1 將讀出的暫存器內容存檔For page_no = 0 To 127 暫存器共128頁RegTxt = 每次清除轉換後要存檔的Reg內容SendFrame 4A & Format(Hex(page_no)

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

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

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

28、效flag = 0 停止啟動旗號,跳離執行迴圈For i = 0 To 4SendFrame 410, 1 為防止無法立即關閉,傳送三次命令,強迫停止NextFor i = 0 To 11by(i) = 0OutY(i).BackColor = RGB(255, 255, 255) 接點全部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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论