應用案例 台達電子工業股份有限公司 機電事業部 案例名稱 VB(PC)與台達溫控器通訊連線 發行單位 應用技術服務中心 發行日期 Aug. 13 2009 適用機種 可程式控制器、人機介面、交流伺服驅動器、變頻器、溫控器 頁數 8 機器設備名稱: VB(PC)與台達溫控器通訊連線 機器設備本身的規格或特點: 若要使用 HMI 來對溫控器或變頻器執行監控動作只要於畫面上規劃出相關元件即可輕易的完成,但當客戶欲使用 PC 來 監控時也可以藉由市面上的圖控軟體來完成。但由於該軟體價格較高並且有時客戶只需很簡易的監控動作時,即可利用 如 VB、VC++、Delphi 等開發軟體來 開發藉由 PC 上 RS232 口執行串列埠通訊(就如同 HMI 使用 COM 口連線方式,只是需自行撰寫通訊程式)。以下內容 為對台達控制器(下方以溫控器為例)送出命令字串,將溫度值顯示於 PC 上的範例。 控制系統的功能說明或功能方塊圖: 由於 PC 上只有 RS232 的硬體介面,因此可透過台達轉換器 IFD8500 (RS232 to RS485)將 RS232 訊號轉換為和溫 控器相同的 RS485 硬體介面。 通訊流程: 送出字串命令 PC RS232 IFD8500 處理訊息內容顯示 RS485 DTA 接收後回應訊息 RS232 轉為 系統整合使用的效益說明: 台達的所有產品皆是使用 Modbus 的通訊協定,因此了解了通訊字串的處理方式以後,無論是對於 HMI、PLC、變頻器、 溫控器及伺服驅動器皆可依此方式來進行。只需略為修改通訊站號及所需的通訊位置即可完成台達產品的 PC 監控需求。 系統改造的主要成果或改造效果評估: 雖然 PC 上的軟體開發並非為台達的銷售項目,監控的動作我們可以輕易的於 HMI 上來完成,但有某些客戶有 PC 上的 監控需求時(有時是 HMI 資料上傳至 PC),此範例可提供給大家程式的架構範例,可省去購買圖控軟體的高額費用,雖 然程式的開發較為費時,但可藉由 PC 軟體來捆包銷售台達產品。 品質至上 信賴第一 追求卓越 QUALITY RELIABLITY EXCELLENT 應用案例 台達電子工業股份有限公司 機電事業部 設備上使用的台達機電產品: 型號 參數設定 全系列 PLC 全系列 需為 Slave 模式 HMI SERVO 全系列 變頻器 全系列 溫控器 全系列 週邊設備 可無需 IFD8500,以 RS232 通訊 可無需 IFD8500,以 RS232 通訊 可無需 IFD8500,以 RS232 通訊 配線圖: 使用 RS232 時,請直接使用程式傳輸線 DVPACAB2A30 即可。 EH-PLC 使用 DVP-F232 或 HMI 使用 RS232 時,請使用 2、3 腳位互換的 D-Sub 9Pin 通訊線(第 5 腳為 0V 準 位需對接)。由於不使用硬體交握訊號,因此 7、8 腳不使用(如下圖)。 1) PLC 2) (PLC 或 HMI 側) 3) (PC 側) 其他為使用 RS485 介面時,需以 IFD8500 轉換。(如下圖) 品質至上 信賴第一 追求卓越 QUALITY RELIABLITY EXCELLENT 應用案例 台達電子工業股份有限公司 機電事業部 操作說明: LblMsg( 即 LabelMessage,顯示通訊狀態元件) TxtPV(即 TextPV,顯示 PV 值元件) TxtSV(即 TextSV,顯示 SV 值元件) 單純貼上溫控器外觀圖 CmdStart(即 CommandStart,按壓開始通訊) CmdStop(即 CommandStop,按壓暫停通訊) CmdExit(即 CommandExit,按壓結束程式) 畫面內容將只顯示一台溫控器的現在值及設定值,一方面為本身也於初學階段,另一方面若功能太多,將造成內容太過 繁雜而不易了解。其實寫入的功能和讀取類似,後續會提出分享。 編輯畫面架構: 顯示畫面表單 開啟 COM1 通訊埠 副程式(計算 LRC) Timer2(300ms 無回應,即 Timer1(當一筆通訊完成後延遲 10ms 再送出下一筆) 品質至上 信賴第一 追求卓越 屬性設定表 QUALITY RELIABLITY EXCELLENT 應用案例 台達電子工業股份有限公司 機電事業部 溫控器通訊協定說明 溫控器通訊協定說明: 1) 此程式範例以台達溫控器來做說明,目的是一方面溫控器體積比較小,並且目前數值有面板可供觀察,所以比較方 便。而實際的應用上,無論是對 PLC、變頻器、HMI 及 SERVO 也是用相同的方式來做串列通訊,主要差異只是定 義的暫存器編號不同而已。 2) 若以要讀取溫控 PV 及 SV 值來看,只需送出命令 :010347000002B5\x0D\x0A,當中藍色:為頭碼、紅色 B5 為 LRC 檢查碼、綠色\x0D\x0A 為尾碼。 3) 當命令送出後於正常情形下,溫控會回應以下訊息 :01030401DA030A10\x0D\x0A,當中紅色部份 01DA 即為 PV 值,而 030A 即為 SV 值。回傳的資料為 16 進制值,只需將它轉為 10 進制值分別是 474 及 778,也由於溫控 器是支援至小數一位顯示,因此目前的 PV 值即為 47.7 及 SV 值即為 77.8。 4) 送出命令時可以先將頭碼、尾碼及檢查碼預先填入要發送的字串中。但於接收命令是必須把所接收到的命令,計算 出 LRC 檢查碼後再和接收到的檢查碼比較接收命令是否完全正確。因此於上圖的 Module 中編寫了副程式以計算 LRC 檢查碼於 71 行處,無論送出或接收到資料時皆會藉由副程式來演算出檢查碼以判斷是否收到的通訊字串完全 正確。 程式: 1 Dim Receivecommand As String '定義為字串型式 2 Dim Timeout As Integer '定義為整數型式 3 Dim StopFlag As Boolean '定義為布林(即 True 或 False)型式 ------------------------------------------------------------------------------------------------------------------------------4 Private Sub Form_Load() 5 MSComm1.PortOpen = True 6 End Sub 當程式一開始 RUN 時(就類似 HMI 上的畫面開啟巨集動作) '當程式一開始 RUN 時,即把 COM1 串列埠開啟 ' ------------------------------------------------------------------------------------------------------------------------------- 當啟動鍵被按壓時,執行以下程式 8 StopFlag = False '按壓啟動鍵時,把停止鍵的旗標(StopFlag)清除 9 Timer1.Enabled = True '啟動 Timer1,準備開始送出命令。當 Timer1 啟動後,經過設定值 10ms 後 即開始執行 22 行的程式 10 Timer2.Enabled = True '啟動 Timer2,準備開始判是否通訊逾時。經過設定值 300ms 後即開始執行 34 行的程式 11 TxtPV.ForeColor = &HFF& '把數值 1(現在值)的顯示設為紅色(&HFF&表示為紅色) 12 TxtSV.ForeColor = &HC000& '把數值 2(設定值)的顯示設為綠色(&HC00&表示為綠色) 13 End Sub '啟動鍵被按壓的程式結束 7 Private Sub CmdStart_Click() ' ------------------------------------------------------------------------------------------------------------------------------14 15 16 當停止鍵被按壓時,執行以下程式 StopFlag = True '按壓停止鍵時,把停止旗標(StopFlag)設為 True。當 StopFlag 為 True 時,將由 23 行的 判斷式來執行 28~31 行中的動作(把 PV 和 SV 及通訊狀態顯示的顏色改為灰色) Receivecommand = "" '把電腦中用來接收資料的接收暫存器清空(Receivecommand 為自定的定 義,用來存放 COM1 通訊埠所接收到的資料 Private Sub CmdStop_Click() 品質至上 信賴第一 追求卓越 ' QUALITY RELIABLITY EXCELLENT 應用案例 台達電子工業股份有限公司 機電事業部 17 End Sub ------------------------------------------------------------------------------------------------------------------------------- 當停止鍵被按壓時,執行以下程式 按壓離開鍵時,關閉 COM1 串列埠 '程式結束並關閉 18 Private Sub CmdExit_Click() ' 19 MSComm1.PortOpen = False ' 20 End 21 End Sub ------------------------------------------------------------------------------------------------------------------------------22 Private Sub Timer1_Timer() 31 如果停止旗標沒有啟動,將開始送出以下命令至溫控器 MSComm1.Output = SendCommand("010347000002") '送出命令,但不含頭碼、LRC 檢查碼及尾碼,將 由模組中的副程式來計算 LRC 並自動補上頭、尾碼。因此 SendCommand( )為呼叫副程式的函數,會將 (“010347000002”)帶入該副程式中計算並組合出完整的字串後回傳。於該副程式中會補充說明 Timer1.Enabled = False '送出命令後,把 Timer1 關閉,等待下一次的觸發 Timer2.Enabled = True '打開通訊逾時(TimeOut)計時器,以判斷是否已 TimeOut Else '反之若停止旗標已啟動,將執行以下動作 LblMsg.Caption = "停止中" '通訊狀態文字顯示"停止中" LblMsg.ForeColor = &HC0C0C0 '通訊狀態文字顯示灰色(&HC0C0C0&表示為灰色) TxtPV.ForeColor = &HC0C0C0 '數值 1(現在值)顯示灰色 TxtSV.ForeColor = &HC0C0C0 '數值 2(設定值)顯示灰色 32 End If 33 End Sub 23 24 25 26 27 28 29 30 If StopFlag = False Then ' ------------------------------------------------------------------------------------------------------------------------------34 Private Sub Timer2_Timer() 43 發生通訊逾時,把接收暫存器清空,因為有可能是接收不完整的字串 Timer1.Enabled = True '重新啟動 Timer1 以重新送出下一次的字串 Timer2.Enabled = False '把 Timer2(通訊逾時)的計時器關閉,下次的開啟會由 Timer1 自行啟動 Timeout = Timeout + 1 '把通訊錯誤的次數加 1 If Timeout >= 3 Then '當連續錯誤已達 3 次,將執行以下通訊錯誤的顯示 TxtPV.Text = "xxxx" '數值 1(現在值)顯示為"xxxx" TxtSV.Text = "xxxx" '數值 2(設定值)顯示為"xxxx" LblMsg.Caption = "通訊錯誤" '通訊狀態文字顯示"通訊錯誤" LblMsg.ForeColor = &HFF& '通訊狀態文字為紅色 44 End If 45 End Sub 35 Receivecommand = "" 36 37 38 39 40 41 42 ' ------------------------------------------------------------------------------------------------------------------------------- 當接收到資料後, 當接收到資料後,VB 有 COM 口的 OnComm 事件可利用來判斷是否字串已收完畢 ----------------------------------------------------------------------------------------------------------------------46 Private Sub MSComm1_OnComm() 品質至上 信賴第一 追求卓越 'OnComm 為通訊口開啟後可用於處理所有發生的事件 QUALITY RELIABLITY EXCELLENT 應用案例 台達電子工業股份有限公司 機電事業部 設定 COM 口編號(如果是用 USB 轉出的 COM 埠為 COM4, 請將此值設為 4) 設定接收而產生 comEvReceive 的數量,由於需判斷尾碼, 因此設定為 1(說明 47 行) 通訊格式的設定 '利用 CommEvent 事件來判定字串收入的情形, 會產生的屬性有很多,如溢位、通訊埠超速、及收到特定數目字串等,以下即使用當通訊口接收到設定的 字串數目時,即會產生 事件。目前數目設為 1,即每收到一個字串即產生 comEvReceive 事件,因此 可利用此功能判定是否已收到尾碼。字串數目的設定如上圖於點選通訊元件後所出現的屬性表中 Rthreshold 來設定 48 Case comEvReceive '當只要有一個字串進入 COM 口時,即發生 comEvReceive 事件(因 Rthreshold=1) 49 Receivecommand = Receivecommand + MSComm1.Input '把收到的每一個字串組合起來, Receivecommand 為自訂名稱) 50 If InStr(1, Receivecommand, vbLf) Then '判斷是否已執行到尾碼 Lf,當已收到 vbLf 字串即開始以 下的計算結果。InStr( )函數為取出 Receivecommand 字串的最後一字元判定是否為 vbLf(尾碼)字元。 51 ReceiveData = Mid(Receivecommand, 2, 14) '如收到得字串為:01030401DA030A10\x0D\x0A,為 檢查字串接收是否完整,因此需取出字串 01030401DA030A 來計算其檢查碼是否等於收到的檢查碼 10。 Mid( )指令為對字串 Receivecommand 由第 2 字元開始取出 14 個字元後放到 ReceiveData 中 52 ReceiveLRC = Mid(Receivecommand, 16, 2) '同上原理,取出 LRC 檢查碼 10 53 CompareLRC = GetLRC(ReceiveData) '將 ReceiveData 字串丟給副程式 GetLRC( ),第 75 行去 計算檢查碼,其結果放於 CompareLRC 中 54 If ReceiveLRC = CompareLRC Then '將 CompareLRC 與收到的檢查碼比較是否正確 55 ReceiveValue = Mid(Receivecommand, 8, 4) '正確--取出數值 1(PV 值)的 4 位字串,以計算出 PV 值 56 OctValue = Val("&h" & (ReceiveValue)) / 10 '轉換結果為 10 進制資料。”&h”&ReceiveValue 為將此 4 字 串轉為 16 進制值。Val()為將此 16 進制值轉為 10 進制值,也由於溫控器為小數一位顯示,所以需除以 10 57 TxtPV.Text = OctValue '把數值 1(PV 值)資料顯示於畫面 TxtPV 元件上 58 ReceiveValue = Mid(Receivecommand, 12, 4) '同上方式取出數值 2(SV 值)的 4 位字串 59 OctValue = Val("&h" & (ReceiveValue)) / 10 '同上方式轉換數值 2 結果為 10 進制資料顯示 60 Text2.Text = OctValue '同上方式把數值 2(SV 值)資料顯示於畫面 TxtSV 元件上 61 Receivecommand = "" '將通訊埠資料接收區清乾淨 62 Timer1.Enabled = True '啟動計時器 1(10ms)準備送出下一次的讀取命令 63 Timer2.Enabled = False '這次通訊已正確,將 TimeOut 的計時器關閉,等待下一次 Timer1 再次送出命令時的啟動計時 64 Label1.Caption = "通訊 OK" '數值可正確讀出,通訊狀態文字顯示"通訊 OK" 65 Label1.ForeColor = &H0& '通訊狀態文字顯示為黑色(&H0&表示為黑色) 66 Timeout = 0 '把通訊錯誤的累積次數清除為 0 47 Select Case MSComm1.CommEvent CommEvent comEvReceive 品質至上 信賴第一 追求卓越 QUALITY RELIABLITY EXCELLENT 應用案例 台達電子工業股份有限公司 機電事業部 67 End If 68 End If 69 End Select 70 End Sub ------------------------------------------------------------------------------------------------------------------------------- 以下為計算 LRC 檢查碼的副程式, 檢查碼的副程式,程式放在編輯畫面的 Module 中 ------------------------------------------------------------------------------------------------------------------------------- 此函數只要輸入要計算的字串於 strOut 中 (如 010347000002),即會執行以下程式來自動組合出完整字串 strLRC = GetLRC(strOut) '首先呼叫另一副程式 GetLRC( )以計算出 LRC 檢查碼存於 strLRC 中 SendCommand = ":" & strOut & strLRC & Chr(13) & Chr(10) '此副程式計算完成回傳,完整的字串即為 頭碼":" + 原本字串 strOut + 副程式計算的檢查碼 strLRC + 尾碼 Chr(13)&Chr(10)即 OD ; DA 71 Function SendCommand(strOut) As String 72 73 74 ' End Function ------------------------------------------------------------------------------------------------------------------------------- '此函數只要輸入要計算的字串於 strOut 中(如 010347000002),即 會自動算出 LRC 檢查碼 76 Dim i As Integer '定義為整數型式 77 Dim nTotal As Integer '定義為整數型式 78 Dim nLength As Integer '定義為整數型式 79 Dim nStart As Integer '定義為整數型式 80 nStart = 1 '開始位置由字串的第一字元開始做加算的動作 81 If Left(strOut, 1) = ":" Then nStart = 2 '忽略':' 的影響,如果第一字為":"即從第二字開始算。Left(strOut,1) 為判定字串 strOut 左邊的第一個字元 82 nLength = Len(strOut) '首先計算出字串的長度,Len(strOut )為計算字串 strOut 的長度的指令 83 nTotal = 0 '先把總合值清為 0 84 For i = nStart To nLength Step 2 '開始利用 For 迴圈做加總的動作,由於 LRC 是一次取 2 碼相加,所以 Step 必需設定為 2 85 nTotal = nTotal + Val("&H" & Mid(strOut, i, 2)) '由於 i 值每次加 2,利用 Mid( )函數陸續由左側開始一次取 2 字元做加總,"&H"&表示把字串轉為 16 進制值,Val 表示再將資料轉為 10 進制方式傳回,再做加總 75 Function GetLRC(strOut) As String 86 Next i 88 由於檢查碼是利用 減總合(16 進制)的下八位再加 即為取得下 位值,而 即完成上述動作。且 LRC 只取兩 一次,以取得實際所需的值 GetLRC = Hex(nTotal) '將算好的 LRC 值再轉回 16 進制值後傳回給 GetLRC 89 End Function HFF 87 nTotal = (&HFF - (nTotal Mod 256) + 1) Mod 256 ' 1 nTotal Mod 256 8 (&HFF - (nTotal Mod 256) + 1) Mod 256 。因此 位使用,因此再 ------------------------------------------------------------------------------------------------------------------------------- 品質至上 信賴第一 追求卓越 QUALITY RELIABLITY EXCELLENT 應用案例 台達電子工業股份有限公司 機電事業部 其他: 1) 溫控器的站號為 1 號,並為 9600,7,E,1 的通訊格式。 2) 範例程式請使用 VB 6.0 來開啟。 3) 由於畫面中的溫控器圖片位置定義每人並不相同,請 將圖片放於 PC 中後,點選該圖片元件的屬性表設定 右方 Picture 屬性去設定要取得的圖片正確位置。 品質至上 信賴第一 追求卓越 QUALITY RELIABLITY EXCELLENT