日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

snap7库C++版本对PLC数据的读写

發布時間:2023/12/9 c/c++ 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 snap7库C++版本对PLC数据的读写 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄:

1、snap7庫的C++版本源碼的下載及編譯;

2、對西門子S7- 200 smart 數據塊的讀寫;

參考

1、snap7庫的C++版本源碼的下載及編譯

(1)snap7的下載路徑如下鏈接,我這邊使用的最新版本的庫,最新的也只是到2017年,至于為啥不再維護更新了,咱也不太清楚,對這也沒太深入的研究;
https://sourceforge.net/projects/snap7/files/1.4.2/
(2)編譯;
這里只是使用snap7的demo作為參考來介紹庫的使用,使用的是arm-v7版本,具體路徑:
snap7-full-1.4.2/snap7-full-1.4.2/examples/cpp/arm_v7-linux
修改該路徑下的makefile文件,將編譯器替換成自己的交叉編譯器

## ## LINUX barebone makefile for c++ examples : good for all platforms ## ## Simply run make or make clean ## ## Intend this makefile only as a "batch examples updater" after library modification. ##Libs := -lsnap7 Wrapper :=snap7.cppCXX := arm-linux-gnueabihf-g++ CC := arm-linux-gnueabihf-gcc CXXFLAGS :=-O3 CFLAGS :=LDFLAGS=-Wl,-rpath=/usr/arm-linux-gnueabihf/lib.PHONY: all cleanall: $(CXX) $(LDFLAGS) $(CXXFLAGS) -o client ../client.cpp ../$(Wrapper) $(Libs) $(CXX) $(LDFLAGS) $(CXXFLAGS) -o server ../server.cpp ../$(Wrapper) $(Libs) $(CXX) $(LDFLAGS) $(CXXFLAGS) -o srv_resourceless ../srv_resourceless.cpp ../$(Wrapper) $(Libs) $(CXX) $(LDFLAGS) $(CXXFLAGS) -o apartner ../apartner.cpp ../$(Wrapper) $(Libs) $(CXX) $(LDFLAGS) $(CXXFLAGS) -o ppartner ../ppartner.cpp ../$(Wrapper) $(Libs) clean:$(RM) client$(RM) server$(RM) srv_resourceless$(RM) apartner$(RM) ppartner

修改項介紹:將CXX和CX改為自己設備的交叉編譯器,我這邊用的是arm-linux-gnueabihf-g++;還有就是修改下編譯好的snap7的動態庫路徑,LDFLAGS=-Wl,-rpath=/usr/arm-linux-gnueabihf/lib
編譯指令:

arm-linux-gnueabihf-g++ ../client.cpp ../snap7.cpp -o client -L ../../../build/bin/arm-linux-gnueabihf-linux/ -lsnap7 -Wl,-rpath=/usr/arm-linux-gnueabihf/lib -lpthread -lrt

將編譯完成的可執行文件拷貝到設備,在設備端調試;

2、對西門子S7- 200 smart 數據塊的讀寫

數據塊的讀寫,只是簡單測試下I塊單byte數據的讀取和DB塊多byte數據的讀取,

這里使用三方工具HslCommunicationDemo查看I塊的數據值,其中I0.4 和I0.6的值都是true;
snap7-full-1.4.2/snap7-full-1.4.2/examples/cpp/client.cpp源碼的main函數添加以下代碼

byte value1 = 0; bool temp = false; Client->EBRead(0,1,&value1 ); int n0, n1, n2, n3, n4, n5, n6, n7; n0 = (value6 & 0x01) == 0x01 ? 1 : 0; n1 = (value6 & 0x02) == 0x02 ? 1 : 0; n2 = (value6 & 0x04) == 0x04 ? 1 : 0; n3 = (value6 & 0x08) == 0x08 ? 1 : 0; n4 = (value6 & 0x10) == 0x10 ? 1 : 0; n5 = (value6 & 0x20) == 0x20 ? 1 : 0; n6 = (value6 & 0x40) == 0x40 ? 1 : 0; n7 = (value6 & 0x80) == 0x80 ? 1 : 0; printf("<<<<< hhhhh 579 n0 = %d, n1 = %d, n2 = %d, n3 = %d, n4= %d, n5= %d, n6=%d, n7= %d\n", n0,n1,n2,n3,n4,n5,n6,n7);

輸出打印結果:

代碼中EBRead()接口底層調用的是Cli_EBRead();

接口及參數說明如上,其中第二個參數就是PLC的偏移地址,比如說IO.4,那偏移地址就是0,如果是I4.2,偏移地址是4,詳細的解釋如下圖所示:第三個參數是要讀取數據的大小,最小單位是bytes,所以I0.4位置存放的數據類型是bool型,那就取一個byte就可以了,取出數據之后直接賦值給bool變量即可;

DB數據塊數據的讀取,使用的接口是Cli_DBRead(),函數的說明如下

這個比較容易理解,第二個參數就是DB塊的序號,第三個參數是在數據塊內的偏移地址,第四個參數是讀取數據的大小,最小單位也是byte;

float value0 = 0;byte value1[4]= {0};Client->DBRead(1,300,4,value1);*((byte*)&value0 + 0) = value1[3];*((byte*)&value0 + 1) = value1[2];*((byte*)&value0 + 2) = value1[1];*((byte*)&value0 + 3) = value1[0];

上面的代碼就是要讀取DB1.300位置的數據,是個浮點數據,讀取出來的數據是要進行數據大端小端的轉化才行;

參考:
https://blog.csdn.net/fengshuiyue/article/details/39665421

https://blog.csdn.net/weixin_42292586/article/details/121909746?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-121909746-blog-93708694.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-121909746-blog-93708694.pc_relevant_paycolumn_v3&utm_relevant_index=2

https://blog.csdn.net/weixin_41320090/article/details/93708694

總結

以上是生活随笔為你收集整理的snap7库C++版本对PLC数据的读写的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。