java android 讀寫西門子PLC資料,包含S7協議和Fetch/Write協議,s7支援200smart,300PLC,1200PLC,1500PLC

來源:互聯網
上載者:User

標籤:out   []   測試   image   使用   生產   怎樣   cmd   打賞   

本文將使用一個gitHub開源的組件技術來讀寫西門子plc資料,使用的是基於乙太網路的TCP/IP實現,不需要額外的組件,讀取操作只要放到後台線程就不會卡死線程,本組件支援超級方便的高效能讀寫操作

github地址:https://github.com/dathlin/HslCommunication 如果喜歡可以star或是fork,還可以打賞支援,打賞請認準原始碼項目。

nuget地址:https://www.nuget.org/packages/HslCommunication/            

github地址:https://github.com/dathlin/HslCommunication                                 如果喜歡可以star或是fork,還可以打賞支援。

 

本項目目前支援C#語言和java語言,C#語言的功能比較齊全,java版本的庫還在開發及完善中。

 

 

點擊下載本組件的jar包。HslCommunication.jar

代碼使用支援的例子可以參照C#版本的,兩者幾乎是一模一樣的,支援的資料類型也是一致的。

 

支援人員QQ群:592132877  (組件的版本更新細節也將第一時間在群裡發布)最後編輯日期:2018年4月3日 09:44:41

裡面各種小夥伴,為您解答資料互動,編程技巧,如果對本介面提供的API有任何疑問,都可以加群諮詢,如果有更好的建議,歡迎提出。

 

組件的完整資訊和其他API介紹參照:http://www.cnblogs.com/dathlin/p/7703805.html   組件的授權協議,更新日誌,都在該頁面裡面。

 

本文將展示如何配置網路參數及怎樣使用代碼來訪問PLC資料,希望給有需要的人解決一些實際問題。主要對西門子PLC的M,Q,I,DB塊的資料讀寫,親測有效。

此處使用了網線直接的方式,如果PLC接進了區域網路,就可以進行遠程讀寫了^_^

此處使用到了2個命名空間:

import HslCommunication.Profinet.Siemens.SiemensPLCS;import HslCommunication.Profinet.Siemens.SiemensS7Net;import HslCommunication.Core.Types.OperateResultExOne;

  

 

 

隨便聊聊(C#版本伺服器)

當我們一個上位機需要讀取100台西門子PLC裝置(此處只是舉個例子,凡是都是使用Modbus tcp的都是一樣的)的時候,你採用伺服器主動去請求100台裝置的機制對效能來說是個極大的考驗,如果開100個線程去輪詢100台裝置,那麼效能損失將是非常大的,更不用說再增加裝置,如果搭建Modbus tcp伺服器,就可以完美的解決效能問題,因為串連的壓力將會平均分攤給每一台PLC,伺服器端只要新增一個時間戳記就可以知道用戶端有沒有串連上。

我們在100台PLC裡都增加發送Modbus tcp方法,將資料發送到伺服器的ip和連接埠上去,伺服器根據站號來區分裝置。這樣就可以搭建一個高效能總站。 本組件支援快速搭建一個高效能的Modbus tcp總站。

http://www.cnblogs.com/dathlin/p/7782315.html

 

關於兩種模式

本組件所提供的所有用戶端類,包括三菱,西門子,歐姆龍,modbus-tcp,以及SimplifyNet都是繼承自雙模式基類,雙模式包含了短串連和長串連,下面就具體介紹下兩個模式的區別

短串連:每次讀寫都是一個單獨的請求,請求完畢也就關閉了,如果伺服器的連接埠僅僅支援單串連,那麼關閉後這個連接埠可以被其他串連複用,但是在頻繁的網路請求下,容易發生異常,會有其他的請求不成功,尤其是多線程的情況下。

長串連:建立一個公用的串連通道,所有的讀寫請求都利用這個通道來完成,這樣的話,讀寫效能更快速,即時多線程調用也不會影響,內部有同步機制。如果伺服器的連接埠僅僅支援單串連,那麼這個連接埠就被佔用了,比如三菱的連接埠機制,西門子的Modbus tcp連接埠機制也是這樣的。以下代碼預設使用長串連,效能更高,還支援多線程同步。

在短串連的模式下,每次請求都是單獨的訪問,所以沒有重連的困擾,在長串連的模式下,如果本次請求失敗了,在下次請求的時候,會自動重新串連伺服器,直到請求成功為止。另外,盡量所有的讀寫都對結果的成功進行判斷。

 

關於日誌記錄

暫時只是預留了介面,具體可以自己實現

 

關於兩種協議

本組件支援的西門子通訊有兩種協議,一種是S7協議,在PLC側幾乎不需要配置參數,另一個協議Fetch/Write協議,相對比較麻煩一點,如果S7不方便讀取的話,可以選擇Fetch/Write,相對而言,S7更加方便點。

這兩個協議除了執行個體化的類型不一致,讀寫PLC的代碼和串連機制都是一致的,所以FW協議的具體代碼就不粘貼了,詳細參照下面的Demo項目。

 

訪問測試專案(C#版本,可以方便測試)

在上述的github原始碼裡有個測試專案,HslCommunicationDemo,裡麵包含了各種用戶端的Demo項目,不需要編寫任何的代碼就可以測試資料的訪問了。

為:HslCommunicationDemo.zip

 

示範項目(C#伺服器+asp.net + C#用戶端 + android用戶端)

下面的三篇示範了具體如何去訪問PLC的資料,我們在訪問完成後,通常需要進行處理,以下的樣本項目就示範了後台從PLC讀取資料後,前台顯示並推送給所有線上用戶端的功能,用戶端並進行圖形化顯示,具有一定的參考意義,項目地址為:

https://github.com/dathlin/RemoteMonitor

下面的圖片樣本中的左邊程式就是伺服器程式,它應該和PLC直接連接並接入區域網路,然後把資料推送給用戶端顯示。注意:一個複雜進階的程式就應該把處理邏輯程式和介面程式分開,比如這裡的伺服器程式實現資料擷取,推送,儲存。讓用戶端程式去實現資料的整理,分析,顯示,這樣即使用戶端程式因為BUG奔潰,伺服器端仍然可以正常的工作。

 

 

S7協議下的tcp直接通訊,配置簡單,一般PLC都支援

 

測試通過的PLC:1200系列 本人親測

                          200smart  感謝 無名①終止^^ 的測試

                          300系列  感謝 懂PLC不懂c# 的測試

                          1500系列 感謝 ∮溪風-⊙_⌒ 的測試

 

 報文的格式參考了如下的兩篇文章

http://www.itpub.net/thread-2052649-1-1.html

https://wenku.baidu.com/view/d93b88b06394dd88d0d233d4b14e852459fb3912.html

如果你擅長於網路通訊和組件開發,可以通過報文格式開發出自己的西門子通訊庫,我所做的就是基於報文格式進行了二次封裝,隱藏了socket通訊的細節,還包含了異常處理,提供了簡單方便的API來讀寫資料。提供了整數資料的讀寫,字串讀寫,來豐富各種需求,從事實上來說,只要可以讀寫位元組,相當於任何資料了。

準備:在西門子PLC上配置好IP地址,就只有一個IP地址就夠了,然後開啟電腦的cmd指令,只要能ping通西門子PLC即可。

還需要在PLC側配置開啟  GET/SET通訊允許:(感謝網友 OLIFE 提供的圖片) (如果碰到讀取資料時出現長度驗證失敗的資訊,請務必檢查下面的勾是否打上)

 

 

 

 

最簡單的一條應用,只需要兩行代碼,樣本:讀取M100的byte值

    private static void SiemesTest(){        SiemensS7Net siemens_net = new SiemensS7Net(SiemensPLCS.S1200,"192.168.1.195");        System.out.println(siemens_net.ReadByte("M100").Content);    }

 

上述使用了短串連的模式,隨用隨連,我們下面示範長串連

SiemensS7Net siemens_net = new SiemensS7Net(SiemensPLCS.S1200,"192.168.1.195");        OperateResult connect = siemens_net.ConnectServer();        if(connect.IsSuccess){            System.out.println("connect success!");        }        else {            System.out.println("failed:"+connect.Message);        }

程式退出的時候需要關閉長串連

siemens_net.ConnectClose();

  

以下示範了一些簡單的常用的讀寫操作,不過並未對結果進行判斷,實際生產代碼中,需要對結果進行嚴格的判定

        byte m100_byte = siemens_net.ReadByte("M100").Content;        short m100_short = siemens_net.ReadInt16("M100").Content;        int m100_int = siemens_net.ReadInt32("M100").Content;        long m100_long = siemens_net.ReadInt64("M100").Content;        float m100_float = siemens_net.ReadFloat("M100").Content;        double m100_double = siemens_net.ReadDouble("M100").Content;        String m100_string = siemens_net.ReadString("M100",(short) 10).Content;                siemens_net.Write("M100",(byte) 123);        siemens_net.Write("M100",(short) 123);        siemens_net.Write("M100",(int) 123);        siemens_net.Write("M100",(long) 123);        siemens_net.Write("M100", 123.456f);        siemens_net.Write("M100", 123.456d);        siemens_net.Write("M100","1234567890");

  

 

下面說明複雜的資料操作,並對結果進行判斷,以及批量化的資料操作,例如讀取M100-M109

        OperateResultExOne<byte[]> read = siemens_net.Read( "M100", (short) 10 );        {            if(read.IsSuccess)            {                byte m100 = read.Content[0];                byte m101 = read.Content[1];                byte m102 = read.Content[2];                byte m103 = read.Content[3];                byte m104 = read.Content[4];                byte m105 = read.Content[5];                byte m106 = read.Content[6];                byte m107 = read.Content[7];                byte m108 = read.Content[8];                byte m109 = read.Content[9];            }            else            {                // 發生了異常            }        }

  

讀寫的資料類型,支援 M。I。Q,DB塊,T、C

M   地址樣本:M100

I 地址樣本:I100

Q 地址樣本 Q100

DB 塊。DB1.100     對於smart200來說,V區100就是DB1.100

T 地址樣本 T100

C 地址樣本: C100

 

java android 讀寫西門子PLC資料,包含S7協議和Fetch/Write協議,s7支援200smart,300PLC,1200PLC,1500PLC

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.