做品管圈網(wǎng)站企業(yè)seo培訓(xùn)
初級代碼游戲的專欄介紹與文章目錄-CSDN博客
我的github:codetoys,所有代碼都將會位于ctfc庫中。已經(jīng)放入庫中我會指出在庫中的位置。
這些代碼大部分以Linux為目標但部分代碼是純C++的,可以在任何平臺上使用。
? ? ? ? 不是教程,是避坑指南。使用了S7-200smart和S7-1200這兩款PLC。
目錄
什么是snap7
下載
編譯
S7-200smart準備
IP要弄清楚
數(shù)據(jù)準備
使用Snap7采集S7-200smart
S7-1200準備
使用Snap7采集1200
交叉編譯
什么是snap7
? ? ? ? snap7是個開源庫,用來訪問西門子PLC的S7協(xié)議,支持C/C++以及很多很多別的語言(別的是啥咱不關(guān)心)。
下載
? ? ? ? 搜官網(wǎng)下載啦,很簡單的。
編譯
? ? ? ? 下載過來的壓縮包打開,進到build目錄看,有說明文件,非常簡單明了。(以后有閑可以整教程出來,不過真的很簡單啊,我重點記錄遇到的困難)
S7-200smart準備
IP要弄清楚
????????設(shè)置IP并牢記。Setp7-micro/win smart的搜索功能不好用(這可能是操作系統(tǒng)加強了網(wǎng)絡(luò)安全的原因)。通過IP能連接到PLC就算正常了。
數(shù)據(jù)準備
????????200smart的數(shù)據(jù)區(qū)是V,snap7是不支持的。我的數(shù)據(jù)放在VB0和VB1,用HSL可以讀取(雖然地址示例沒有V,但是可以用),snap7沒有對應(yīng)的函數(shù),所以創(chuàng)建了一個數(shù)據(jù)塊。
????????如何創(chuàng)建數(shù)據(jù)塊:
????????先連接PLC,底部狀態(tài)欄顯示PLC地址和“已連接”。左側(cè)樹,“數(shù)據(jù)塊”,“插入數(shù)據(jù)頁”,右側(cè)下部“數(shù)據(jù)塊”窗口,倒數(shù)第三個圖標,像個“+R”的,“通過RAM創(chuàng)建數(shù)據(jù)塊”,自動根據(jù)內(nèi)存創(chuàng)建數(shù)據(jù)塊,數(shù)據(jù)塊索引究竟是0還是1不確定,沒有地方設(shè)置,多嘗試幾個看看。創(chuàng)建完數(shù)據(jù)塊要下載程序,然后把PLC設(shè)置為運行狀態(tài),然后就可以用讀數(shù)據(jù)塊的函數(shù)來讀取數(shù)據(jù)了。
????????下載程序之后讀取數(shù)據(jù)一直不變,我還以為是靜態(tài)的,看了一眼PLC發(fā)現(xiàn)處于暫停狀態(tài),啟動之后就一切正常了。因為開始我有兩個數(shù)據(jù)塊所以后一個索引是1是可以理解的,但是刪除前一個之后仍然是1(這也可以理解啊,固定坑位模式吧),所以這個不能猜,要靠試。
使用Snap7采集S7-200smart
????????Snap7編譯結(jié)果只有一個so,沒有頭文件。C++的包裝文件是一對h和cpp,在代碼示例里面,相同位置有個client的文件,是客戶端的代碼,把這三個文件拿去用就可以了。
????????client.cpp有main函數(shù),改個名就能合在自己的項目里面了。
????????由于snap7并未明確支持S7-200smart,所以有點麻煩。
????????實際測試發(fā)現(xiàn)參數(shù)要用(0,1)(機架號和槽位,下同),以及連接類型要設(shè)置為3(示例代碼沒有設(shè)置連接類型),不然可能無法連接。200smart其實是沒有機架號和槽位參數(shù)的。
????????HSL的200smart并不需要設(shè)置這些。C#就是強些(我現(xiàn)在同時用C++和C#,C#確實舒服很多啊,但是程序太大放不進設(shè)備,沒辦法)。
????????實測連接類型為3,參數(shù)(0,0)和(0,1)正常,(0,5)和(1,0)則無法連接。
????????實測參數(shù)(0,0),連接類型不設(shè)置無法連接,連接類型0、1、4無法連接,2、3正常連接。
? ? ? ? 至于測試代碼,除了client的測試,就是用了讀數(shù)據(jù)塊的函數(shù)。
S7-1200準備
????????S7-1200連接比較容易,用正確的參數(shù)(0、1)直接就連上了(不正確連不上),但是讀數(shù)據(jù)始終出錯,HSL也報錯,此時PLC里面還是原來的程序,看不太懂。然后下載了我自己的程序,讀取指定的數(shù)據(jù)塊,一樣報錯,這就抓狂了,看各種設(shè)置都正確的,卻始終無法讀取,最后搜到一個帖子說“恢復(fù)出廠設(shè)置能解決問題”,于是就恢復(fù)出廠設(shè)置,重新下載程序,一切OK了。
使用Snap7采集1200
????????我的程序包含一個數(shù)據(jù)塊,索引為2,總長度為26個字節(jié)。使用DBRead讀取成功,數(shù)據(jù)都正確,但是要注意,數(shù)據(jù)塊是有范圍的,讀取位置不能超出范圍,否則失敗。
????????實測無需設(shè)置連接類型,或者設(shè)置為1、2、3(0或4就不行了,文檔里說3-10都是“S7 basic”啊,當然0確實不是有效值)。
交叉編譯
????????交叉編譯到arm64只需要把common.mk(build/unix下面)里面的指令換一下就可以了,很簡單。arm v6、arm v7啥意思我不懂,我還是用的x86_64_linux.mk,實測程序正常運行。
(這里是結(jié)束)