Snap7 在西门子PLC的使用
生活随笔
收集整理的這篇文章主要介紹了
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/libSNAP7的使用
代碼目錄結構
需要把snap7.cpp和snap7.h包含進來,在源碼可找到
$ ls build CMakeLists.txt Main.cpp PLCTest.cpp PLCTest.h snap7.cpp snap7.hCMakeLists.txt的編寫
需要包含libsnap7.so
libgtest.a是為了編寫測試用例
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的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《圆明园的毁灭》教学设计方案
- 下一篇: System.Type类