摘 要:主要介紹三菱FX系列PLC與上位機之間的通訊協議,并采用CSerial類來實現串行通信,本文給出了程序設計方法和部分源代碼。
引言
可編程控制器(PLC)是集計算機技術、自動控制技術、通信技術為一體的新型自動控制裝置。由于體積小、可靠性高以及組態靈">

      技術頻道

      VC環境下三菱PLC與微機的串行通信

      摘 要:主要介紹三菱FX系列PLC與上位機之間的通訊協議,并采用CSerial類來實現串行通信,本文給出了程序設計方法和部分源代碼。
      引言
      可編程控制器(PLC)是集計算機技術、自動控制技術、通信技術為一體的新型自動控制裝置。由于體積小、可靠性高以及組態靈活等優點,PLC在工業控制領域得到了廣泛的應用。將PC機與可編程控制器組合起來,充分利用PC機強大的人機接口功能、豐富的應用軟件和低廉的價格來共同實現管理、控制一體化成為一個新的發展趨勢。本文重點介紹在Windows 2000環境下如何利用VC來實現PC機與三菱PLC之間的串行通訊。
      1 三菱PLC與計算機之間通信協議
      FX2系列PLC與計算機之間的通信采用RS-232標準,其傳輸速率固定為9600bps,奇偶校驗位采用偶校驗。數據格式如表1所示。數據以幀為單位發送和接收。一個多字符幀由圖1所示的五部分組成,其中和校驗值是將命令碼STX——ETX之間的字符的ASCII碼(十六進制數)相加,取得所得和的最低二位數。STX和ETX分別表示該字符幀的起始標起和結束標志。


      (1) 起始字元(STX):ASCII碼的起始字元STX對應的16進制數位0x02。無論命令信息還是回應信息,它們的起始字元均為STX,接收方以此來判知傳輸資料的開始。
      (2) 命令號碼:為兩位16進制數。所謂命令號碼是指上位機要求下位機所執行的動作類別,例如要求讀取或寫入單點狀態、寫入或讀取暫存器資料、強制設定、運行、停止等。在回應信息中,下位機會將上位機接收到的命令號碼原原本本的隨同其它信息一同發送給上位機。
      (3) 元件首地址:對應要操作的元件的相應的地址。如從D123單元中讀取數據時,要把它對應的地址:0x10F6發送給PLC。
      (4) 元件個數:一次讀取位元件或字元件的數量。
      (5) 結束字元(ETX):ASCII碼的結束字元ETX對應的16進制數為0x03。無論命令信息還是回應信息,它們的結束字元均為ETX,接收方以此來判知此次通訊已結束。
      (6) 校驗碼(Checksum):校驗碼是將STX-ETX之間的ASCII字元的16進制數值以“LRC(Longitudinal Redundancy Check)”法計算出1個Byte長度(兩個16進制數值00-FFH)的校驗碼。當下位機接收到信息后,用同樣的方法計算出接收信息的校驗碼,如果兩個校驗碼相同,則說明傳送正確。
      FX2系列與計算機之間的通信是以主機發出的初始命令,PLC對其做出響應的方式進行通信的。共有0、1、7、8四種命令,上位機實現對PLC的讀寫和強行置位。通過ENQ、ACK和NAK,上位機協調與PLC的通信應答。
      2 編程口操作命令類型
      串行通信是計算機與其他機器之間進行通信的一種常用方法,在Windows操作系統中提供了實現各種串行通信的API函數。通過SC-09編程電纜或FX-232-BD通訊模塊,可以將PC機和計算機串行通信口RS-232連接起來,可以實現PC機對PLC的RAM區數據進行讀、寫操作。根據PLC本身所具有的特性,計算機可對PLC進行以下4種類型的操作:
      (1) 位元件或字元件狀態讀操作(CMD0);
      (2) 位元件或字元件狀態寫操作(CMD1);
      (3) 位元件強制ON操作(CMD7);
      (4) 位元件強制OFF操作(CMD8)。
      3 軟件編程
      (1) 串行通信實現方法
      在進行以上四種操作之前要對串行通信口進行必要的初始化。本人采用了一個專門針對串行通信的CSerial類,并在Open函數中進行了進一步的完善。它由MuMega Technologies公司提供的一個Visual C++類,我們只要理解CSerial類種的幾個成員函數,就能很方便地實現串行通信了。以下是該類定義:
      class CSerial
      {
      public:
      CSerial();
      ~CSerial();
      BOOL Open( int nPort , int nBaud,int nParity,int nByteSize,int nStopBits );
      BOOL Close( void );
      int ReadData( void *, int );
      int SendData( const char *, int );
      int ReadDataWaiting( void );
      BOOL IsOpened( void ){ return( m_bOpened ); }
      protected:
      BOOL WriteCommByte( unsigned char );
      HANDLE m_hIDComDev;
      OVERLAPPED m_OverlappedRead, m_OverlappedWrite;
      BOOL m_bOpened;
      };
      ① Serial::Open這個成員函數打開通信端口。帶五個參數,第一個是串口號,第二個參數是數據傳輸速率,第三個是數據效驗方式,第四個是數據位數,第五個是數據停止位。
      ② Serial::Close函數關閉通信端口。
      ③ CSerial::SendData函數把數據從一個緩沖區寫到串行端口。第一個參數是緩沖區指針,其中包含要被發送的資料;第二個參數是發送的字節數。
      ④ CSerial::ReadData函數從斷口接收緩沖區讀入數據。第一個參數是緩沖區指針,資料將被放入該緩沖區;第二個參數緩沖區的大小。

      (2) 位元件或字元件狀態讀操作

      操作對象元件:PLC內部的X、Y、M、S、T、C、D元件;命令格式如表1;在發送完上述命令格式代碼后,就可以讀取PLC響應信息了。響應信息格式如圖2;


      部分程序代碼:
      BOOL CPlcComDlg::ReadPLC(char *Read, char *address, int bytes)
      {
      CSerial Serial;
      char read_BUFFER;
      if(Serial.Open(m_com, m_Buad, m_Parity, m_Byte, m_StopBites))
      {
      Serial.SendData(&ENQ_request,1);//發送聯絡訊號
      Sleep(100);
      Serial.ReadData(&read_BUFFER,1);//讀取PLC響應訊號
      if(read_BUFFER==ACK)
      {
      //初始化變量
      //發送圖2命令格式代碼
      ASCII(readdatasum_check,readdata_sum);
      //將STX-ETX之間的字符相加,轉換成ASCII(十六進制),并取和的低二位數。
      if(*readdatasum_CHECK==*readdatasum_check)//和校驗
      {
      //對讀出的數據進行處理,轉換成整型數
      for(int j=0;j<bytes/2;j++)
      {
      for(i=j*2;i<j*2+4;i++)
      Read[i]=(Read[i]>0x39)?(Read[i]-0x41+0xA):(Read [i]-0x30);
      Read_value[j]=(((((Read [j*4+2]<<4)+Read [j*4+3]))+Read [j*4+0])<<4)+Read [j*4+1];
      }
      return TRUE;
      }
      else
      return FALSE;
      }
      }
      }
      }
      //將整數轉換成ASCII(十六進制),并取低二位,
      void CPlcComDlg::ASCII(char *total_databytes, int read_bytes)
      {
      unsigned int uTmp;
      uTmp=read_bytes & 0x000f;
      total_databytes[1]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xA);
      uTmp=(read_bytes>>4) & 0x000f;
      total_databytes[0]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xA);
      }

      (3) 位元件或字元件狀態寫操作

      操作對象元件:PLC內部的X、Y、M、S、T、C、D元件;命令格式如圖3所示。




      程序代碼(略)。

      (4) 位元件強制ON操作

      操作對象元件:PLC內部的X、Y、M、S、T、C元件;命令格式如圖4所示。

      部分程序代碼如下:
      void CPlcComDlg::ForceOnOpreation(char *Address)
      {
      CSerial Serial;
      char read_BUFFER;
      CString strtemp;
      if(Serial.Open(m_com,9600))
      {
      Serial.SendData(&ENQ_request,1);
      Sleep(100);
      Serial.ReadData(&read_BUFFER,1);
      if(read_BUFFER==ACK)
      {
      //初始化變量
      //發送圖4命令格式代碼
      ASCII(Sum_Check,sum); //將STX-ETX之間的字符相加,轉換成ASCII(十六進制),并取和的低二位數
      for(i=0;i<2;i++)
      Serial.SendData(&Sum_Check[i],1);//和校驗
      Sleep(100);
      Serial.ReadData(&read_buffer,1);
      if(read_buffer==ACK)
      return TRUE;
      else
      return FALSE;
      }
      }
      }

      (5) 位元件強制OFF操作

      操作對象元件:PLC內部的X、Y、M、S、T、C元件;命令格式如圖5所示。

      4 實時通訊控制界面

      本程序能夠實現遠程控制FX系列PLC的運行。能讀取位元件的當前狀態,以及對它們置位和復位。能夠讀取字元件的值和往字元件寫值。并能自動連續讀取單個字元件的值。

      圖6 通訊界面

      5 結論

      本程序實現了上位機對三菱PLC的實時監控,傳送數據準確,這種通信方法不僅成本低,而且簡單、穩定、實用性強。
      參考文獻
      [1] 李現勇. Visual C++串口通信技術與工程實踐.人民郵電出版社,2002年5月

      文章版權歸西部工控xbgk所有,未經許可不得轉載。

      主站蜘蛛池模板: 国产午夜精品一区二区三区不卡| 熟女少妇丰满一区二区| 国产亚洲一区区二区在线| 亚洲欧美日韩国产精品一区| 国精产品一区二区三区糖心| 人妻无码一区二区三区四区| 成人精品一区二区电影 | 中文字幕一区二区精品区| 高清无码一区二区在线观看吞精| 无码国产精成人午夜视频一区二区 | 精品一区二区久久| 欧亚精品一区三区免费| 无码国产精品一区二区免费vr| 无码人妻AⅤ一区二区三区水密桃 无码欧精品亚洲日韩一区夜夜嗨 无码毛片一区二区三区中文字幕 无码毛片一区二区三区视频免费播放 | 红杏亚洲影院一区二区三区| 国产乱人伦精品一区二区在线观看 | 少妇无码一区二区三区免费| 熟女少妇精品一区二区| 国产精品无码不卡一区二区三区| 亚洲国产av一区二区三区丶| 日韩精品区一区二区三VR| 亚洲av午夜福利精品一区| 久久精品岛国av一区二区无码| 一区在线免费观看| 精品视频一区二区三区四区五区| 国产凸凹视频一区二区| 国产成人一区二区三区免费视频| 亚洲日韩AV一区二区三区中文| 中文字幕在线观看一区二区| 一区二区三区无码视频免费福利 | 免费精品一区二区三区第35| 国产亚洲一区二区在线观看| 国产一区二区电影在线观看| 一区二区三区四区视频| 在线观看国产一区二三区| 免费高清av一区二区三区| 日本精品视频一区二区| 久久国产三级无码一区二区| 国产亚洲一区二区三区在线| 一本大道在线无码一区| 精品91一区二区三区|