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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Snap7 在西门子PLC的使用

發布時間:2023/12/9 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Snap7 在西门子PLC的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

編譯源碼

參考代碼

https://gitee.com/wilson202008/demo-snap7

下載

snap7-full-1.4.2.7z
https://sourceforge.net/projects/snap7/files/1.4.2/
下載后解壓到目錄下

編譯

進入下面的目錄/snap7/build/unix

$ sudo make -f x86_64_linux.mk install g++ -shared -fPIC -o ../bin/x86_64-linux/libsnap7.so @"filelist.txt" -L. -lpthread -lrt -O3 rm -f "filelist.txt" cp -f ../bin/x86_64-linux/libsnap7.so /usr/lib

SNAP7的使用

代碼目錄結構

需要把snap7.cpp和snap7.h包含進來,在源碼可找到

$ ls build CMakeLists.txt Main.cpp PLCTest.cpp PLCTest.h snap7.cpp snap7.h

CMakeLists.txt的編寫

需要包含libsnap7.so
libgtest.a是為了編寫測試用例

cmake_minimum_required(VERSION 2.8)project(demo)SET(CMAKE_BUILD_TYPE "Debug") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -g -Wall")SET(SNAP7LIB /usr/lib/libsnap7.so) SET(GTESTLIB /usr/local/lib/libgtest.a)aux_source_directory(. DIRSRCS)add_executable(demo ${DIRSRCS}) target_link_libraries(demo ${SNAP7LIB} ${GTESTLIB})

PLCTest.h的編寫

#pragma once#include <memory> #include <iostream>#include "gtest/gtest.h" #include "snap7.h"class PLCTest : public testing::Test { private:void SetUp() override;void TearDown() override; public:std::shared_ptr<TS7Client> _client; };

連接PLC

void PLCTest::SetUp() {_client = std::make_shared<TS7Client>();int res = _client->ConnectTo("192.168.30.5", 0, 1);std::cout << "connect result: " << res << std::endl; }

斷開連接

void PLCTest::TearDown() {if (_client != NULL){_client->Disconnect();} }

寫M塊的數據

下面是修改MW68為1的例子

TEST_F(PLCTest, writeMB) {if (_client == NULL){return;}byte buffer[2] ={0x0000, 0x0001};int bufsize = sizeof(buffer);int res = _client->MBWrite(68, bufsize, buffer);EXPECT_EQ(res, 0);if (res != 0){std::cout << "MBWrite failed, " << CliErrorText(res)<<std::endl;return;} }

讀M塊的數據

下面是讀取MW90的例子

TEST_F(PLCTest, readMB) {if (_client == NULL){return;}byte buffer[1];int bufsize = sizeof(buffer);int res = _client->MBRead(90, bufsize, buffer);EXPECT_EQ(res, 0);if (res != 0){std::cout << "MBRead failed, " << CliErrorText(res)<<std::endl;return;}std::cout<<"data: ";for (int i = 0; i < bufsize; i++){std::cout<<(int)buffer[i]<<" ";}std::cout<<std::endl; }

讀取DB塊的數據

TEST_F(PLCTest, readDB) {if (_client == NULL){return;}byte buffer[1];int bufsize = sizeof(buffer);int res = _client->DBRead(5, 0, bufsize, buffer);EXPECT_EQ(res, 0);if (res != 0){std::cout << "DBRead failed, " << CliErrorText(res)<<std::endl;return;}std::cout<<"data: ";for (int i = 0; i < bufsize; i++){std::cout<<(int)buffer[i]<<" ";}std::cout<<std::endl; }

寫DB塊的數據

TEST_F(PLCTest, writeDB) {if (_client == NULL){return;}byte buffer[2] ={0x0000, 0x0000};int bufsize = sizeof(buffer);int res = _client->DBWrite(6, 0, bufsize, buffer);EXPECT_EQ(res, 0);if (res != 0){std::cout << "DBWrite failed, " << CliErrorText(res)<<std::endl;return;} }

獲取PLC版本

TEST_F(PLCTest, getOrderCode) {if (_client == NULL){return;}TS7OrderCode info;int res = _client->GetOrderCode(&info);EXPECT_EQ(res, 0);if (res != 0){std::cout << "get order code failed, " << CliErrorText(res)<<std::endl;return;}std::cout<<"get order code success, Code: "<<info.Code<<", Version: "<<info.V1<<"."<<info.V2<<"."<<info.V3; }

獲取Block信息

TEST_F(PLCTest, listBlock) {if (_client == NULL){return;}TS7BlocksList List;_client->ListBlocks(&List);printf(" OBCount : %d\n", List.OBCount);printf(" FBCount : %d\n", List.FBCount);printf(" FCCount : %d\n", List.FCCount);printf(" SFBCount : %d\n", List.SFBCount);printf(" SFCCount : %d\n", List.SFCCount);printf(" DBCount : %d\n", List.DBCount);printf(" SDBCount : %d\n", List.SDBCount); }

總結

以上是生活随笔為你收集整理的Snap7 在西门子PLC的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

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