主頁 > 軟體設計 > C#與PLC通信開發之松下FP系列PLC

C#與PLC通信開發之松下FP系列PLC

2020-09-11 12:49:34 軟體設計

這里寫自定義目錄標題

  • 前言
  • 松下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程式猿會制作好,電纜連線圖如下:
RS232電纜連線圖
既然是串口通信,那么在通信前,要問清楚PLC程式猿波特率、奇偶校驗位、停止位這些重要的串口通信引數,在撰寫代碼前,可以先使用串口除錯助手來檢查是否能正常通信,我們可以給PLC的串口發送這串16進制資料來驗證是否能正常通信(注意:以16進制形式發送):

2530312357435352303031323132300D

注:這條指令是往觸點R12寫入1

暫時先不要管這條資料的含義,如果可以和PLC正常通信,那么PLC是有反饋的,串口除錯助手可以收到資料,如果PLC沒有反饋,那么可以根據以下順序檢查問題:

  1. 確保串口號是正確的,
  2. 確認波特率、奇偶校驗位、停止位這些引數是一致的,
  3. 跟PLC程式猿確認RS232電纜的接線是正確的,

通信協議

與PLC能正常進行串口通信之后,接下來就是根據通信協議來收發資料,進行通信,松下PLC與工控機之間的通信是遵照松下電工的專用通訊協議:MEWTOCOL來實作的,松下官方有關于這個協議的完整的描述檔案,網上到處都可以找得到,我這里也有一份,不過說實話,這個檔案說的不是很詳細,看完這個檔案,很多要緊的地方還是稀里糊涂的,比如指令的內容具體該怎么填寫,BCC(指令校驗)到底該怎么計算才是正確的,這也是我寫這篇文章的目的,我曾經走了不少彎路,浪費了不少時間和精力,后來總算搞清楚了,所以我建議,大家結合我這篇文章來看那個檔案,就會很清楚了,本文也不會完全復制官方的檔案,畢竟有30多頁,只是結合我的體會,概述的講講,具體的指令,大家還是下載官方的檔案來看,
官方檔案下載地址:松下通信協議檔案下載地址

該協議由以下特點:

  1. 資料傳輸采用ASCII的形式,
  2. 應答式協議,首先由工控機發送指令,然后PLC會自動對指令進行回應,也就是說,不需要撰寫任何PLC程式,只要PLC和工控機連接正常,工控機給PLC發送指令,都能得到PLC的回應回復,

幀格式

指令是以幀為單位進行,工控機向PLC發送命令幀,然后PLC作出回應,向工控機發送回應幀,

命令幀格式
命令幀格式
其中:

  1. %為起始碼,這是固定不變的,
  2. AD(H)和 AD(L)是目標站號的高位和低位,一般如果只有一個PLC的話,那么就填寫01,高位是0,低位是1,
  3. #也是固定不變的,
  4. 指令代碼,每個指令會有不同的指令代碼,后面會講,
  5. 文本代碼,指令的內容,不同的指令,內容也不同,
  6. BCC(H)和BCC(L),是幀的資料校驗的高低位,資料校驗范圍是BCC前面的所有字符,
  7. CR,回車鍵,ASCII為0x0D,不可見字符,

回應幀格式
回應幀有兩種,一種是正確回應,一種是錯誤回應,也就是說,如果工控機給PLC發送的指令是正確的,那么PLC就會回傳正確的回應幀,否則就回傳錯誤的回應幀,
回應幀格式
可見,可以從第4個字符來判斷是正確回應,還是錯誤回應,

BCC的計算

BCC校驗碼的計算方式是將指令中的各個ASCII字符的16進制(00~FF)進行異或求和后生成的. 該校驗碼也以兩個ASCII碼字符表示(高位在前,低位在后),
例如這條指令:

%01#RCSX00001DCR
注意:CR不是兩個字符,是一個字符,回車鍵,但是是不可顯示字符,所以這里用CR來表示,

計算方式:
BCC的計算方法
代碼如下:

        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,則命令幀為:
命令幀
這里需要注意的是:

  1. 寫入的數值是按字寫入,也就是說,每個值占2個位元組,
  2. 低位在前,高位在后,
  3. 寫入的字符是16進制的,

所以,需要代碼進行處理,例如此處的DT2=1507H,1507H的10進制值是5383,則處理步驟為:

  1. 先將5383轉換為16進制的字符1507
  2. 將字符轉換順序,低位在前,高位在后,也就是轉換成:0715

我們寫一個函式來進行處理:

        private string ConvertShortToPlcFormat(short value)
        {
            string temp = value.ToString("X4");
            return temp.Substring(2, 2) + temp.Substring(0, 2);
        }

正常通信情況下,PLC的回應幀為:
PLC回應幀

結語

在這篇文章里,我概述了如何使用MEWTOCOL協議與松下FP系列PLC進行串口通信,詳細講解了幾個常用的指令和BCC的計算,相信通過閱讀本文,再結合松下官方的協議檔案,掌握C#工控機與松下FP系列PLC的通信開發不再是難事了,

我曾經在幾個專案里面和松下的PLC打過交道,一個掃碼稱重+按快遞公司分揀的流水線專案,另一個是掃碼列印貼標+掃碼剔除的專案,目前兩個專案都在穩定的運行中,其中,前一個專案讀碼相機采用的是海康的智能讀碼套件MV-PD010003-21IH,后一個專案讀碼相機采用的是得利捷的300N,PLC都是采用的松下PLC,

掃碼稱重快手臺+分揀專案截圖:
專案軟體運行圖
掃碼列印貼標+掃碼剔除專案截圖:
掃碼貼標和剔除系統

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/5674.html

標籤:其他

上一篇:Android 11正式版發布!

下一篇:華為聯合教指委發布《物聯網實踐系列教材》

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more