這里寫自定義目錄標題
- 前言
- 松下FP系列PLC
- 通信協議
- 幀格式
- BCC的計算
- 指令
- 常用指令舉例
- 結語
前言
首先,C#與PLC通信的開發,要和PLC程式開發區分開,C#與PLC通信的開發,是上位機軟體開發,PLC程式開發,是撰寫在PLC里運行的程式,是PLC程式猿的事情,我最初接觸PLC的時候,不是很清楚,畢竟搞軟體開發的,硬體都不怎么熟悉,第一次碰到需要和PLC打交道的專案時,曾經一度差點放棄,找不到方向,迫于專案時間的壓力,只能在網路上盲目的尋找資料,甚至買了一本PLC編程的書籍來看,結果完全看不懂,后來才知道,那本書介紹的是如何撰寫PLC里面運行的程式的教程,需要一定的電子電氣方面的基礎,是PLC程式猿看的書,而我需要的,是C#如何與PLC進行通信方面的資料,完全搞錯了方向,
一般來說,自動化設備的專案,有一個上位機程式猿和一個PLC程式猿一起合作,C#寫上位機軟體,PLC程式猿寫PLC程式,不過不要指望可以從PLC程式猿那里獲取更多的資訊,因為一般PLC程式猿對上位機軟體開發也是一竅不通,他不可能教你怎么和PLC通信,因為他也不會,不過他可以告訴你,有沒有通信上,結果正確不正確,作為一個上位機軟體開發,我們不需要深入了解PLC,只要能知道一些概念,能和PLC程式猿正常溝通就行了,重點是怎么和PLC通信,
PLC有眾多的品牌,國外的有西門子、ABB、三菱、松下這些,國內也有不少,比如臺達、永宏、匯川等等,同一品牌的PLC又有多種型號,不同的型號,通信方式有的也不一樣,所以做專案一般要先問清楚:什么品牌的PLC,具體是什么型號?
所謂和PLC通信,就是讀寫PLC的存盤區,或者是給PLC發送命令,上位機和PLC的物理介面,有的是串口,比如松下和三菱系列的PLC,還有的是網口,比如西門子的PLC,所以和PLC通信,涉及到串口編程和網路編程,如果您沒有串口編程的基礎,可以參看我的另一個專欄:C#完全掌握串口通信開發
C#與PLC通信的開發,最大的障礙是硬體,這也是上位機開發的一個問題,如果手頭上沒有硬體的話,寫出來的程式是對是錯也沒辦法驗證,不過幸運的是,這個專欄里的PLC,都是我專案中遇到的,經受過實際硬體的驗證,可以確保程式的正確性,我把這些整理出來,讓大家少走一些彎路,減少專案開發的時間,
松下FP系列PLC
松下FP系列PLC與工控機之間的通信方式可以采用串口通信,與工控機連接的RS232電纜必須按照松下的產品手冊所給的連線圖進行制作,否則通信將無法實作,一般這根線PLC程式猿會制作好,電纜連線圖如下:

既然是串口通信,那么在通信前,要問清楚PLC程式猿波特率、奇偶校驗位、停止位這些重要的串口通信引數,在撰寫代碼前,可以先使用串口除錯助手來檢查是否能正常通信,我們可以給PLC的串口發送這串16進制資料來驗證是否能正常通信(注意:以16進制形式發送):
2530312357435352303031323132300D
注:這條指令是往觸點R12寫入1
暫時先不要管這條資料的含義,如果可以和PLC正常通信,那么PLC是有反饋的,串口除錯助手可以收到資料,如果PLC沒有反饋,那么可以根據以下順序檢查問題:
- 確保串口號是正確的,
- 確認波特率、奇偶校驗位、停止位這些引數是一致的,
- 跟PLC程式猿確認RS232電纜的接線是正確的,
通信協議
與PLC能正常進行串口通信之后,接下來就是根據通信協議來收發資料,進行通信,松下PLC與工控機之間的通信是遵照松下電工的專用通訊協議:MEWTOCOL來實作的,松下官方有關于這個協議的完整的描述檔案,網上到處都可以找得到,我這里也有一份,不過說實話,這個檔案說的不是很詳細,看完這個檔案,很多要緊的地方還是稀里糊涂的,比如指令的內容具體該怎么填寫,BCC(指令校驗)到底該怎么計算才是正確的,這也是我寫這篇文章的目的,我曾經走了不少彎路,浪費了不少時間和精力,后來總算搞清楚了,所以我建議,大家結合我這篇文章來看那個檔案,就會很清楚了,本文也不會完全復制官方的檔案,畢竟有30多頁,只是結合我的體會,概述的講講,具體的指令,大家還是下載官方的檔案來看,
官方檔案下載地址:松下通信協議檔案下載地址
該協議由以下特點:
- 資料傳輸采用ASCII的形式,
- 應答式協議,首先由工控機發送指令,然后PLC會自動對指令進行回應,也就是說,不需要撰寫任何PLC程式,只要PLC和工控機連接正常,工控機給PLC發送指令,都能得到PLC的回應回復,
幀格式
指令是以幀為單位進行,工控機向PLC發送命令幀,然后PLC作出回應,向工控機發送回應幀,
命令幀格式

其中:
- %為起始碼,這是固定不變的,
- AD(H)和 AD(L)是目標站號的高位和低位,一般如果只有一個PLC的話,那么就填寫01,高位是0,低位是1,
- #也是固定不變的,
- 指令代碼,每個指令會有不同的指令代碼,后面會講,
- 文本代碼,指令的內容,不同的指令,內容也不同,
- BCC(H)和BCC(L),是幀的資料校驗的高低位,資料校驗范圍是BCC前面的所有字符,
- CR,回車鍵,ASCII為0x0D,不可見字符,
回應幀格式
回應幀有兩種,一種是正確回應,一種是錯誤回應,也就是說,如果工控機給PLC發送的指令是正確的,那么PLC就會回傳正確的回應幀,否則就回傳錯誤的回應幀,

可見,可以從第4個字符來判斷是正確回應,還是錯誤回應,
BCC的計算
BCC校驗碼的計算方式是將指令中的各個ASCII字符的16進制(00~FF)進行異或求和后生成的. 該校驗碼也以兩個ASCII碼字符表示(高位在前,低位在后),
例如這條指令:
%01#RCSX00001DCR
注意:CR不是兩個字符,是一個字符,回車鍵,但是是不可顯示字符,所以這里用CR來表示,
計算方式:

代碼如下:
public static string Bcc(string cmd)
{
cmd = cmd.Trim();
byte bcc = 0;
byte[] cmdArr = System.Text.Encoding.ASCII.GetBytes(cmd);
for (int i = 0; i < cmdArr.Length; i++)
{
bcc = (byte)(bcc ^ cmdArr[i]);
}
return bcc.ToString("X2")
}
引數cmd為指令的前半部分,也就是去掉bcc和CR的部分,例如指令為:%01#RCSX00001DCR,則cmd引數為:%01#RCSX0000
指令
工控機可以給PLC發送的指令一共有20多種,不過我們常用的指令一般有9種,


常用指令舉例
例1:寫入單觸點狀態(指令代碼:WCS)

例如我們往觸點R12寫入1,則命令幀為:
%01#WCSR0012120CR
拆開成各個部分:% 01 # WCS R 0012 1 20 CR
正常通信情況下,PLC會回傳正確的回應幀:
%01$WC14CR
例2:讀取單觸點狀態(指令代碼:RCS)

例如我們讀取觸點R12的值,則命令幀為:
%01#RCSR001214CR
拆分成各個部分:% 01 # RCS R 0012 14 CR
正常通信情況下,假如R12觸點的值為1,那么PLC回傳的回應幀為:
%01$RC120**CR
例3:寫入資料暫存器值(指令代碼:WD)

例如我們寫入字數值到PLC的 DT1到DT3,其中:DT1=05H,DT2=1507H,DT3=900H,則命令幀為:

這里需要注意的是:
- 寫入的數值是按字寫入,也就是說,每個值占2個位元組,
- 低位在前,高位在后,
- 寫入的字符是16進制的,
所以,需要代碼進行處理,例如此處的DT2=1507H,1507H的10進制值是5383,則處理步驟為:
- 先將5383轉換為16進制的字符1507
- 將字符轉換順序,低位在前,高位在后,也就是轉換成:0715
我們寫一個函式來進行處理:
private string ConvertShortToPlcFormat(short value)
{
string temp = value.ToString("X4");
return temp.Substring(2, 2) + temp.Substring(0, 2);
}
正常通信情況下,PLC的回應幀為:

結語
在這篇文章里,我概述了如何使用MEWTOCOL協議與松下FP系列PLC進行串口通信,詳細講解了幾個常用的指令和BCC的計算,相信通過閱讀本文,再結合松下官方的協議檔案,掌握C#工控機與松下FP系列PLC的通信開發不再是難事了,
我曾經在幾個專案里面和松下的PLC打過交道,一個掃碼稱重+按快遞公司分揀的流水線專案,另一個是掃碼列印貼標+掃碼剔除的專案,目前兩個專案都在穩定的運行中,其中,前一個專案讀碼相機采用的是海康的智能讀碼套件MV-PD010003-21IH,后一個專案讀碼相機采用的是得利捷的300N,PLC都是采用的松下PLC,
掃碼稱重快手臺+分揀專案截圖:

掃碼列印貼標+掃碼剔除專案截圖:

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/5674.html
標籤:其他
上一篇:Android 11正式版發布!
