s7 200 java_java android 读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC...
本文將使用一個gitHub開源的組件技術(shù)來讀寫西門子plc數(shù)據(jù),使用的是基于以太網(wǎng)的TCP/IP實(shí)現(xiàn),不需要額外的組件,讀取操作只要放到后臺線程就不會卡死線程,本組件支持超級方便的高性能讀寫操作
github地址:https://github.com/dathlin/HslCommunication?如果喜歡可以star或是fork,還可以打賞支持,打賞請認(rèn)準(zhǔn)源代碼項(xiàng)目。
本項(xiàng)目目前支持C#語言和java語言,C#語言的功能比較齊全,java版本的庫還在開發(fā)及完善中。
代碼使用支持的例子可以參照C#版本的,兩者幾乎是一模一樣的,支持的數(shù)據(jù)類型也是一致的。
技術(shù)支持QQ群:592132877??(組件的版本更新細(xì)節(jié)也將第一時間在群里發(fā)布)最后編輯日期:2018年4月3日 09:44:41
里面各種小伙伴,為您解答數(shù)據(jù)交互,編程技巧,如果對本界面提供的API有任何疑問,都可以加群咨詢,如果有更好的建議,歡迎提出。
本文將展示如何配置網(wǎng)絡(luò)參數(shù)及怎樣使用代碼來訪問PLC數(shù)據(jù),希望給有需要的人解決一些實(shí)際問題。主要對西門子PLC的M,Q,I,DB塊的數(shù)據(jù)讀寫,親測有效。
此處使用了網(wǎng)線直接的方式,如果PLC接進(jìn)了局域網(wǎng),就可以進(jìn)行遠(yuǎn)程讀寫了^_^
此處使用到了2個命名空間:
import HslCommunication.Profinet.Siemens.SiemensPLCS;
import HslCommunication.Profinet.Siemens.SiemensS7Net;
import HslCommunication.Core.Types.OperateResultExOne;
隨便聊聊(C#版本服務(wù)器)
當(dāng)我們一個上位機(jī)需要讀取100臺西門子PLC設(shè)備(此處只是舉個例子,凡是都是使用Modbus tcp的都是一樣的)的時候,你采用服務(wù)器主動去請求100臺設(shè)備的機(jī)制對性能來說是個極大的考驗(yàn),如果開100個線程去輪詢100臺設(shè)備,那么性能損失將是非常大的,更不用說再增加設(shè)備,如果搭建Modbus tcp服務(wù)器,就可以完美的解決性能問題,因?yàn)檫B接的壓力將會平均分?jǐn)偨o每一臺PLC,服務(wù)器端只要新增一個時間戳就可以知道客戶端有沒有連接上。
我們在100臺PLC里都增加發(fā)送Modbus tcp方法,將數(shù)據(jù)發(fā)送到服務(wù)器的ip和端口上去,服務(wù)器根據(jù)站號來區(qū)分設(shè)備。這樣就可以搭建一個高性能總站。?本組件支持快速搭建一個高性能的Modbus tcp總站。
關(guān)于兩種模式
本組件所提供的所有客戶端類,包括三菱,西門子,歐姆龍,modbus-tcp,以及SimplifyNet都是繼承自雙模式基類,雙模式包含了短連接和長連接,下面就具體介紹下兩個模式的區(qū)別
短連接:每次讀寫都是一個單獨(dú)的請求,請求完畢也就關(guān)閉了,如果服務(wù)器的端口僅僅支持單連接,那么關(guān)閉后這個端口可以被其他連接復(fù)用,但是在頻繁的網(wǎng)絡(luò)請求下,容易發(fā)生異常,會有其他的請求不成功,尤其是多線程的情況下。
長連接:創(chuàng)建一個公用的連接通道,所有的讀寫請求都利用這個通道來完成,這樣的話,讀寫性能更快速,即時多線程調(diào)用也不會影響,內(nèi)部有同步機(jī)制。如果服務(wù)器的端口僅僅支持單連接,那么這個端口就被占用了,比如三菱的端口機(jī)制,西門子的Modbus tcp端口機(jī)制也是這樣的。以下代碼默認(rèn)使用長連接,性能更高,還支持多線程同步。
在短連接的模式下,每次請求都是單獨(dú)的訪問,所以沒有重連的困擾,在長連接的模式下,如果本次請求失敗了,在下次請求的時候,會自動重新連接服務(wù)器,直到請求成功為止。另外,盡量所有的讀寫都對結(jié)果的成功進(jìn)行判斷。
關(guān)于日志記錄
暫時只是預(yù)留了接口,具體可以自己實(shí)現(xiàn)
關(guān)于兩種協(xié)議
本組件支持的西門子通信有兩種協(xié)議,一種是S7協(xié)議,在PLC側(cè)幾乎不需要配置參數(shù),另一個協(xié)議Fetch/Write協(xié)議,相對比較麻煩一點(diǎn),如果S7不方便讀取的話,可以選擇Fetch/Write,相對而言,S7更加方便點(diǎn)。
這兩個協(xié)議除了實(shí)例化的類型不一致,讀寫PLC的代碼和連接機(jī)制都是一致的,所以FW協(xié)議的具體代碼就不粘貼了,詳細(xì)參照下面的Demo項(xiàng)目。
訪問測試項(xiàng)目(C#版本,可以方便測試)
在上述的github源代碼里有個測試項(xiàng)目,HslCommunicationDemo,里面包含了各種客戶端的Demo項(xiàng)目,不需要編寫任何的代碼就可以測試數(shù)據(jù)的訪問了。
演示項(xiàng)目(C#服務(wù)器+asp.net + C#客戶端 + android客戶端)
下面的三篇演示了具體如何去訪問PLC的數(shù)據(jù),我們在訪問完成后,通常需要進(jìn)行處理,以下的示例項(xiàng)目就演示了后臺從PLC讀取數(shù)據(jù)后,前臺顯示并推送給所有在線客戶端的功能,客戶端并進(jìn)行圖形化顯示,具有一定的參考意義,項(xiàng)目地址為:
下面的圖片示例中的左邊程序就是服務(wù)器程序,它應(yīng)該和PLC直接連接并接入局域網(wǎng),然后把數(shù)據(jù)推送給客戶端顯示。注意:一個復(fù)雜高級的程序就應(yīng)該把處理邏輯程序和界面程序分開,比如這里的服務(wù)器程序?qū)崿F(xiàn)數(shù)據(jù)采集,推送,存儲。讓客戶端程序去實(shí)現(xiàn)數(shù)據(jù)的整理,分析,顯示,這樣即使客戶端程序因?yàn)锽UG奔潰,服務(wù)器端仍然可以正常的工作。
S7協(xié)議下的tcp直接通訊,配置簡單,一般PLC都支持
測試通過的PLC:1200系列?本人親測
200smart? 感謝 無名①終止^^ 的測試
300系列? 感謝 懂PLC不懂c# 的測試
1500系列 感謝
∮溪風(fēng)-⊙_⌒ 的測試
報文的格式參考了如下的兩篇文章
如果你擅長于網(wǎng)絡(luò)通信和組件開發(fā),可以通過報文格式開發(fā)出自己的西門子通信庫,我所做的就是基于報文格式進(jìn)行了二次封裝,隱藏了socket通信的細(xì)節(jié),還包含了異常處理,提供了簡單方便的API來讀寫數(shù)據(jù)。提供了整數(shù)數(shù)據(jù)的讀寫,字符串讀寫,來豐富各種需求,從事實(shí)上來說,只要可以讀寫字節(jié),相當(dāng)于任何數(shù)據(jù)了。
準(zhǔn)備:在西門子PLC上配置好IP地址,就只有一個IP地址就夠了,然后打開電腦的cmd指令,只要能ping通西門子PLC即可。
還需要在PLC側(cè)配置打開? GET/SET通訊允許:(感謝網(wǎng)友 OLIFE提供的圖片) (如果碰到讀取數(shù)據(jù)時出現(xiàn)長度驗(yàn)證失敗的信息,請務(wù)必檢查下面的勾是否打上)
最簡單的一條應(yīng)用,只需要兩行代碼,示例:讀取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);
}
程序退出的時候需要關(guān)閉長連接
siemens_net.ConnectClose();
以下演示了一些簡單的常用的讀寫操作,不過并未對結(jié)果進(jìn)行判斷,實(shí)際生產(chǎn)代碼中,需要對結(jié)果進(jìn)行嚴(yán)格的判定
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");
下面說明復(fù)雜的數(shù)據(jù)操作,并對結(jié)果進(jìn)行判斷,以及批量化的數(shù)據(jù)操作,例如讀取M100-M109
OperateResultExOne 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
{
// 發(fā)生了異常
}
}
讀寫的數(shù)據(jù)類型,支持 M。I。Q,DB塊,T、C
M ? 地址示例:M100
I 地址示例:I100
Q 地址示例 Q100
DB 塊。DB1.100 ? ? 對于smart200來說,V區(qū)100就是DB1.100
T 地址示例 T100
C 地址示例: C100
總結(jié)
以上是生活随笔為你收集整理的s7 200 java_java android 读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 通用方法_java – 类型的
- 下一篇: java file类复制文件路径_jav