[摘  要]
    本文介紹了一個使用Visual C++編寫的通信程序,主要實現(xiàn)微機與OMRON PLC間的通信,并對它們間的通信協(xié)議作了闡述。
[關鍵詞]
    PLC  鏈接通信  通訊控制
1、前言
 &n">

      技術頻道

      用VC++開發(fā)微機與OMRON PLC間的一種通訊程序

      [摘 要]
      本文介紹了一個使用Visual C++編寫的通信程序,主要實現(xiàn)微機與OMRON PLC間的通信,并對它們間的通信協(xié)議作了闡述。
      [關鍵詞]
      PLC 鏈接通信 通訊控制
      1、前言
      可編程控制器是一種數(shù)字運算操作的電子系統(tǒng),專為在工業(yè)環(huán)境下應用而設計。它采用了可編程序的存儲器,用于其內(nèi)部存儲程序,執(zhí)行邏輯運算、順序控制、定時、計數(shù)和算術操作等面向用戶的指令,并通過數(shù)字式或模擬式輸入輸出控制各種類型的機械的生產(chǎn)過程。可編程控制器及其有關外部設備,都按易于與工業(yè)控制系統(tǒng)聯(lián)成一個整體、易于擴充其功能的原則設計。早期的PLC以數(shù)字量的順序控制為主,提供了簡單的慢速的通信功能(只支持RS232、RS485、多采用Modbus協(xié)議),現(xiàn)在的PLC不僅具有邏輯運算、順序控制、定時、計數(shù)和算術操作,而且還具有A / D、D / A轉(zhuǎn)換,數(shù)值計算和數(shù)據(jù)處理等功能。它既可以對開關量進行控制,也可以對模擬量進行控制,隨著PLC功能不斷擴充,它還有通訊聯(lián)網(wǎng)功能,舉例C200HX / HG / HE的OMRON PLC的CPU內(nèi)的RS - 232C端口和外設端口支持通信功能就有與編程設備(如編程器,LSS,或SSS (中文版))進行通信、與個人計算機和其它外設進行上位機鏈接通信、與個人計算機和其它外設進行RS - 232C、與其它PC進行1:1、再有是與裝有NT鏈接接口的可編程終端(PT)進行NT鏈接通信(1:1、1:N),本課題就是基于OMRON PLC的鏈接通信(有通信協(xié)議),用VC++開發(fā)的上位機與PLC間的通信。
      2、OMRON PLC的通信協(xié)議
      目前,隨著PLC的快速發(fā)展,越來越多的PLC生產(chǎn)廠商開發(fā)了它與計算機的通信功能(主要是利用計算機串口進行通信),本文是以C200HE PLC為例,作詳細闡述,本文的通信協(xié)議采用的是上位機鏈接通信。上位機鏈接通信通過在上位機與PLC之間交換命令和應答實現(xiàn)的。在一次交換中傳輸?shù)拿詈蛻饠?shù)據(jù)稱為一幀,一個幀最多可包含131個數(shù)據(jù)字符。
      命令幀格式
      從上位機發(fā)送一個命令時,按下示的格式排列命令數(shù)據(jù)



      @符號必須置于每個命令的開頭,節(jié)點號是用來辨識每一臺PLC的節(jié)點,在本文中,它設置PLC的DM6558單元中,識別碼設置兩字符的命令代碼,設置通信是讀寫PLC的哪個寄存器單元,例讀寫IR / SR區(qū)時它的識別碼設置分別為RR和WR,讀寫DM區(qū)分別為RD和WD。正文設置命令參數(shù),包括所要讀寫PLC寄存器單元的起始地址和字數(shù)。FCS是設置兩字符的幀檢查順序碼,是一個轉(zhuǎn)換成2個ASCII字符的8位數(shù)據(jù),這8位數(shù)據(jù)為從幀開始到正文結束(即FCS之前)所有數(shù)據(jù)執(zhí)行“異或”操作的結果。終止符設置“*”和回車(CHR $(13))兩字符,表示命令結束。命令幀可以有最多131個字符長。一個等于或大于132字符的命令必須分成若干幀。命令分段,使用回車定界符(CHR $(13))。
      應答幀格式



      識別碼和正文取決于接收到的上位機聯(lián)結命令,結束碼表示命令完成的狀態(tài)(即是否有錯誤發(fā)生),當應答超過132字符,它必須分成若干幀。結束碼是應答幀中表示PLC應答的信息。例結束代碼為00表示正常結束,13表示FCS錯誤,14表示格式錯誤,15表示入口碼數(shù)據(jù)錯誤,18表示幀長度錯誤,A3表示傳輸數(shù)據(jù)時因FCS錯誤引起終止,A8表示傳輸數(shù)據(jù)時因幀長度錯誤引起終止。
      本文的上位機命令幀包括讀寫PLC單元中的數(shù)據(jù)的命令。讀命令幀為:@01RR0100000141* + CHR $(13),意思是上位機讀取節(jié)點為1的PLC中的IR0100單元中的內(nèi)容。寫命令幀為:@01WR0100000171* + CHR $(13),意思是寫一個數(shù)到節(jié)點為1的PLC的IR0100單元中。
      3、系統(tǒng)結構圖
      下圖是計算機與PLC通信的組成系統(tǒng)圖



      上位計算機與多個PLC進行通信,必須連接一個RS232 / 422電平轉(zhuǎn)換器,RS422采用平衡發(fā)送接收方式,它具有傳輸距離長、抗干擾能力強和多點通信能力,最多可以接32臺PLC,如圖1所示,每一臺PLC都必須掛一個COM06單元進行RS422方式連接,所有的PLC與計算機間的通訊采用的是PLC上位機鏈接通信協(xié)議。
      3.1 硬件設置
      RS232 / 422轉(zhuǎn)換器的設置開關撥到422方式,OMRON PLC上的COM06通信板單元同樣設置為422方式和四線制。
      3.2 參數(shù)設置
      上下位機的通信波特率設置為9600,數(shù)據(jù)格式設置為E,7,2。
      3.3 節(jié)點設置
      在PLC的DC6558單元中設置節(jié)點號00(初始值)~ 31(號機)。
      4、用Visual C++6.0編寫串行通信程序
      本文的上位機鏈接通信程序是用Visual C++6.0編寫的,主要是利用VC++中的一個通信控件來實現(xiàn)的。
      首先利用MFC AppWizard ( exe ) 建立一個基于對話框,支持Activex控件,命名為Transcomn的應用程序。然后在對話框中加入一些控件,其中那個電話形狀的控件必須是在系統(tǒng)中注冊過的Microsoft Communications Control,由它進行通訊時首先得設置它的一些屬性如表1。

      CommPort

      1

      通訊協(xié)議為 PLC 上位機鏈接通信,利用微機的串口1

      InputMode

      0

      接收數(shù)據(jù)類型為文本形式

      Rthreshold

      1

      每接收一個字符就產(chǎn)生一個事件

      Settings

      9600, E, 7, 2

      參數(shù)依次為波特率、奇偶檢驗數(shù)據(jù)位數(shù)、停止位數(shù)


      5、程序編寫
      在程序中需添加的代碼如下:
      // TranscommDlg.cpp:implementation file
      BOOL CTranscommDlg::OnInitDialog ()
      {
      最后要在ClassWizard中添加變量和響應函數(shù)如表2。

      控制名稱

      控制 ID

      對應變量或函數(shù)

      通訊地址文本框

      ID - ADDRESS

      m_address

      DM 區(qū)文本框

      ID - DM

      m_dmbox

      LR 區(qū)文本框

      ID - LR

      m_lrbox

      HR 區(qū)文本框

      ID - HR

      m_hrbox

      IR 區(qū)文本框

      ID - IR

      m_irbox

      應答幀文本框

      ID - RESPONSE

      m_response

      通訊控件

      ID - MSCOMM

      M - comm.

      發(fā)送命令按鈕

      ID - SEND

      OnSend ( )


      // TODO:Add extra initialization here
      // 打開通信端口1
      m_comm..SetCommPort (1);
      IF_(m_comm..GetPortOper ())
      m_comm..SetPortOper (FALSE);
      m_comm.SetPortOpen (TRUE);
      // 初始狀態(tài)為選中地址為1的PLC,并對它的DM0100單元實行操作
      m_address= “1”
      m_dmbox=“0100”
      return TRUE;}
      // 發(fā)送事件
      void CTranscommDlg::OnSend ()
      {
      // TODO:Add your control notification handler code here
      // 按本文第二部分介紹的,寫出需要傳出的命令碼字符串CString m_send
      // 將這個字符串發(fā)送到串行口
      Cstring m_send;
      m_comm.SetOutput (COleVariant (m_send));
      }
      // 接收事件
      void CTranscommDlg::OnComm ()
      {
      // TODO:Add your control notification handler code here
      if (m_comm..GetCommEvent () = 2)
      {
      COle Variant m_input = m_comm.GetInput ();
      m_input.ChangeType (VT_BSTR);
      m_response = m_input.bstrVal; // 把接收到的變量賦給應答幀文本框變量
      UpdateData (FALSE);
      }
      }
      6、結論
      按照類似的方法,選擇不同的地址和單元區(qū),可以編寫出其它命令的控制指令,以上的程序已在我所在的武漢大學PLC控制網(wǎng)絡實驗室作過實驗,得到驗證。

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

      主站蜘蛛池模板: 日本一区二区免费看| 精品国产AⅤ一区二区三区4区| 在线精品一区二区三区| 蜜桃臀无码内射一区二区三区| 波多野结衣的AV一区二区三区| 伦理一区二区三区| 91在线一区二区| 亚洲av色香蕉一区二区三区蜜桃| 国产精品一区二区久久乐下载| 国产福利电影一区二区三区,亚洲国模精品一区 | 国产亚洲情侣一区二区无| 国产精品区一区二区三在线播放 | 精品人妻码一区二区三区| 无码中文字幕人妻在线一区二区三区| 日韩一区二区三区电影在线观看| 精品国产一区二区22| 精品少妇ay一区二区三区 | 色狠狠一区二区三区香蕉蜜桃| 国产在线一区二区| 成人精品一区二区三区电影 | 日本免费一区二区三区| 精品国产日韩一区三区| 国产一区玩具在线观看| 亚洲精品精华液一区二区| 亚洲一区二区三区AV无码| 久热国产精品视频一区二区三区 | 人妻无码一区二区三区AV| 国内精品视频一区二区八戒| 免费萌白酱国产一区二区三区| 国产成人一区二区三中文| 国产激情无码一区二区三区| 国产香蕉一区二区在线网站| 国产福利电影一区二区三区久久老子无码午夜伦不 | 视频一区二区在线观看| 无码毛片视频一区二区本码 | 成人免费视频一区| 国产精品高清一区二区三区| 最新中文字幕一区| 亚洲国产精品一区二区第一页| 国产成人高清亚洲一区91| 人妻天天爽夜夜爽一区二区|