jetson nano上编译与使用西门子PLC通讯库snap7

article/2025/7/16 20:51:40

文章目录

  • 一.西门子snap7介绍
  • 二.西门子S7通讯介绍
  • 三.jetson nano编译snap7库
  • 四.Qt Cmake导入snap7库
  • 五.snap7主要函数说明
    • 1.与PLC建立连接
    • 2.读写PA区变量
    • 3.读写MK区变量
  • 六.通讯程序示例

一.西门子snap7介绍

官网:https://snap7.sourceforge.net/

Snap7 是一个基于以太网与S7系列的西门子PLC通讯的开源库。支持包括S7系列的S7-200、S7-200 Smart、S7-300、S7-400、S7-1200以及S7-1500的以太网通信。支持32/64位英特尔/ AMD的所有平台。 例如:

  • Windows ( 除了 windows Me和95);

  • Linux和类Linux(树莓派,UBeagleBone Black,DOO 等),

  • BSD;

  • Oracle Solaris ;

  • Apple OSX

支持语言也比较广:

  • Pascal;

  • C#;

  • C++;

  • C;

  • LabVIEW

  • Python;

  • Node.js

  • Java.

二.西门子S7通讯介绍

西门子S7系列PLC采用以下两种通讯方式:

  • 开放式的TCP\IP,可以用于连接PLC与其他非西门子硬件
  • 西门子自己开发的S7 Protocol以太网通讯协议,用于西门子内部硬件通讯

这两者的传输报文是不一样的,如下图:
在这里插入图片描述
西门子数存储到二进制时方式是大端模式(BIG-Endian),而我们的普通电脑常常为小端模式(Liitle-Endian)。
大端模式是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中.
小端模式是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
例如:双字 DWORD 0X2F11214C

PLC:
在这里插入图片描述

PC:
在这里插入图片描述

所以数据需要进行转换

三.jetson nano编译snap7库

  1. 下载源代码

    下载地址:

    https://sourceforge.net/projects/snap7/files/1.4.2/

  2. 解压下载好的文件,进入如下图所示目录
    在这里插入图片描述

  3. 空白处右键打开命令行,输入如下代码进行编译源代码以及安装

    sudo make -f arm_v6_linux.mk install
    

    在这里插入图片描述

四.Qt Cmake导入snap7库

  1. 从example/cpp文件夹中拷贝snap7.h snap7.cpp两个文件到自己的项目中
    在这里插入图片描述

  2. cmake设置如下

    cmake_minimum_required(VERSION 3.5)project(snap7Test VERSION 0.1 LANGUAGES CXX)set(CMAKE_INCLUDE_CURRENT_DIR ON)
    set(CMAKE_AUTOUIC ON)
    set(CMAKE_AUTOMOC ON)
    set(CMAKE_AUTORCC ON)
    set(CMAKE_CXX_STANDARD 17)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)find_package(QT NAMES Qt5 REQUIRED COMPONENTS Widgets)
    find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Gui)set(PROJECT_SOURCESmain.cppmainwindow.cppmainwindow.hmainwindow.uisnap7.cppsnap7.h
    )add_executable(${PROJECT_NAME} ${PROJECT_SOURCES})target_link_libraries(${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Gui)
    target_link_libraries(${PROJECT_NAME} PRIVATE libsnap7.so)
    

    主要在下面这两个,一个是把snap7.h和snap7.cpp添加到自己的项目中,一个是添加libsnap7.so库到项目中

    
    set(PROJECT_SOURCESmain.cppmainwindow.cppmainwindow.hmainwindow.uisnap7.cppsnap7.h
    )target_link_libraries(${PROJECT_NAME} PRIVATE libsnap7.so)
    

五.snap7主要函数说明

ConnectTo(const char *RemAddress, int Rack, int Slot);//函数说明:通过PLC的IP地址*RemAddress建立连接。// *RemAddress PLC的IP地址,
// Rack s7200SMART PLC的齿数,一般为0
// Slot s7200SMART PLC的槽数,一般为1
Disconnect();//函数说明:断开PC与PLC的连接
ReadArea(int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData);//函数说明:读PLC某个区域的值//Area表示内存区。取值0x84:V区  0x83:M区  0x82:O区  0x81:I区  0x1C:C区  0x1D:T区
//DBNumber表示区域号,只有在对DB块使用时才有用,默认设置为0
//Start表示起始地址。当函数功能为读bit时,int addr =Start/8; int bit = Start%8;
// 此时表示第addr地址的第Bit位。如Start = 8;则表示第1号地址的第0位,即addr.Bit(1.0);
//Amount表示要读取的数据长度,当函数类型为读bit时,只能为1
//WordLen决定函数的功能,函数功能有读位,字节,字,双字。取值: 0x1:Bit  0x2:Byte  
// 0x4:Word  0x6:DW  0x8 : Real 0x1c : C区(16Bit)  0x1D:T区(16Bit)
//注意:读Word和DWord功能有问题,高位字节在前,低位字节在后(跟我们的程序反过来)
//*pUsrData表示数据缓冲区,读取的数据存入该缓冲区
WriteArea(int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData);//函数说明:写PLC某个区域的值//Area表示内存区。取值0x84:V区  0x83:M区  0x82:O区  0x81:I区  0x1C:C区  0x1D:T区
//DBNumber表示区域号,只有在对DB块使用时才有用,默认设置为0
//Start表示起始地址。当函数功能为写bit时,int addr =Start/8; int bit = Start%8;
// 此时表示第addr地址的第Bit位。如Start = 8;则表示第1号地址的第0位,即addr.Bit(1.0);
//Amount表示要写的数据长度,当函数类型为写bit时,只能为1
//WordLen决定函数的功能,函数功能有写位,字节,字,双字。取值: 0x1:Bit  0x2:Byte  
// 0x4:Word  0x6:DW  0x8 : Real 0x1c : C区(16Bit)  0x1D:T区(16Bit)
//注意:读Word和DWord功能有问题,高位字节在前,低位字节在后(跟我们的程序反过来)
//*pUsrData表示数据缓冲区,写入PLC的数据存入该缓冲区
DBRead(int DBNumber, int Start, int Size, void *pUsrData);//函数说明:读V区的Byte值//DBNumber读V区识别号码,只有在对DB块使用时才有用,默认设置为0
//Start读PLC的起始地址
//Size读PLC的字节个数
//*pUsrData数据缓冲区,函数读到的数据存在这个缓冲区内
DBWrite(int DBNumber, int Start, int Size, void *pUsrData);    //函数说明:写V区的Byte值//DBNumber读V区识别号码,只有在对DB块使用时才有用,默认设置为0
//Start读PLC的起始地址
//Size读PLC的字节个数
//*pUsrData数据缓冲区,函数读到的数据存在这个缓冲区内
//area用于区分I、Q、M、DB区域,具体选择如下
areas = ADict({'PE': 0x81,  #input 输入区'PA': 0x82,  #output 输出区'MK': 0x83,  #bit memory 中间存储区(M区)'DB': 0x84,  #DB区'CT': 0x1C,  #counters'TM': 0x1D,  #Timers
})

在这里插入图片描述
在这里插入图片描述

1.与PLC建立连接

#include "snap7.h"TS7Client* client = new TS7Client;
char *Address = "192.168.1.10";
int Rack = 0;
int Slot = 1;
client->ConnectTo(Address, Rack, Slot);

2.读写PA区变量

int l_byData[1] = { 1 };
client->WriteArea(S7AreaPA, 0, 4, 1, S7WLBit, &l_byData); //PA区的0.4写入值1
client->ReadArea(S7AreaPA, 0, 4, 1, S7WLBit, &l_byData); //PA区的0.4读取值1

3.读写MK区变量

byte l_byData[4] = { 0 };
float l_fSpeed = 50;//字节转换
l_byData[3] = *((byte*)&l_fSpeed + 0);
l_byData[2] = *((byte*)&l_fSpeed + 1);
l_byData[1] = *((byte*)&l_fSpeed + 2);
l_byData[0] = *((byte*)&l_fSpeed + 3);client->WriteArea(S7AreaMK, 0, 4, 4, S7WLDWord, &l_byData); //写入值client->ReadArea(S7AreaMK, 0, 4, 4, S7WLDWord, &l_byData); //读取值
//转换
*((byte*)&l_fSpeed + 0) = l_byData[3];
*((byte*)&l_fSpeed + 1) = l_byData[2];
*((byte*)&l_fSpeed + 2) = l_byData[1];
*((byte*)&l_fSpeed + 3) = l_byData[0];

六.通讯程序示例

打包下载地址:https://download.csdn.net/download/qq_30150579/87382222

# cmakeList.txt
cmake_minimum_required(VERSION 3.5)project(snap7Test VERSION 0.1 LANGUAGES CXX)set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)find_package(QT NAMES Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Gui)set(PROJECT_SOURCESmain.cppmainwindow.cppmainwindow.hmainwindow.uisnap7.cppsnap7.h
)add_executable(${PROJECT_NAME} ${PROJECT_SOURCES})target_link_libraries(${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Gui)
target_link_libraries(${PROJECT_NAME} PRIVATE libsnap7.so)
//main.cpp
#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "snap7.h"QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;TS7Client* client;char *Address;int Rack = 0;int Slot = 1;private slots:void on_ConnectpushButton_clicked();void on_DisconnectpushButton_clicked();void on_WritePApushButton_clicked();void on_ReadPApushButton_clicked();void on_WriteMKpushButton_clicked();void on_ReadMKpushButton_clicked();
};
#endif // MAINWINDOW_H
// mainwindow.cpp
#include "mainwindow.h"
#include "./ui_mainwindow.h"#include <QDebug>
#include <QMessageBox>
#include "snap7.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);client = new TS7Client;
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_ConnectpushButton_clicked()
{QByteArray ad(ui->lineEdit->text().toUtf8());Address = ad.data();Rack = ui->lineEdit_2->text().toInt();Slot = ui->lineEdit_3->text().toInt();int tmp = client->ConnectTo(Address, Rack, Slot);if(tmp==0){QMessageBox::information(this,tr("success"),tr("PLC连接成功"));}else{QMessageBox::critical(this,tr("error"),tr("PLC连接失败"));}
}void MainWindow::on_DisconnectpushButton_clicked()
{int tmp = client->Disconnect();if(tmp==0){QMessageBox::information(this,tr("success"),tr("PLC断开成功"));}else{QMessageBox::critical(this,tr("error"),tr("PLC断开失败"));}
}void MainWindow::on_WritePApushButton_clicked()
{int l_byData[1] = { ui->lineEdit_6->text().toInt() };int tmp = client->WriteArea(S7AreaPA, 0, ui->lineEdit_7->text().toInt(), 1, S7WLBit, &l_byData);if(tmp==0){QMessageBox::information(this,tr("success"),tr("写入成功"));}else{QMessageBox::critical(this,tr("error"),tr("写入失败"));}
}void MainWindow::on_ReadPApushButton_clicked()
{int l_byData[1] = { 0 };int tmp = client->ReadArea(S7AreaPA, 0, ui->lineEdit_7->text().toInt(), 1, S7WLBit, &l_byData);if(tmp==0){QMessageBox::information(this,tr("success"),tr("读取成功"));ui->lineEdit_8->setText(QString("%1").arg(l_byData[0]));}else{QMessageBox::critical(this,tr("error"),tr("读取失败"));}
}void MainWindow::on_WriteMKpushButton_clicked()
{byte l_byData[4] = { 0 };float l_fSpeed = ui->lineEdit_5->text().toFloat();l_byData[3] = *((byte*)&l_fSpeed + 0);l_byData[2] = *((byte*)&l_fSpeed + 1);l_byData[1] = *((byte*)&l_fSpeed + 2);l_byData[0] = *((byte*)&l_fSpeed + 3);int tmp = client->WriteArea(S7AreaMK, 0, ui->lineEdit_4->text().toInt(), 4, S7WLDWord, &l_byData);if(tmp==0){QMessageBox::information(this,tr("success"),tr("写入成功"));}else{QMessageBox::critical(this,tr("error"),tr("写入失败"));}
}void MainWindow::on_ReadMKpushButton_clicked()
{byte l_byData[20] = {0};float l_fSpeed = {0};int tmp = client->ReadArea(S7AreaMK, 0, ui->lineEdit_4->text().toInt(), 4, S7WLDWord, &l_byData);if(tmp==0){QMessageBox::information(this,tr("success"),tr("读取成功"));*((byte*)&l_fSpeed + 0) = l_byData[3];*((byte*)&l_fSpeed + 1) = l_byData[2];*((byte*)&l_fSpeed + 2) = l_byData[1];*((byte*)&l_fSpeed + 3) = l_byData[0];ui->lineEdit_9->setText(QString("%1").arg(l_fSpeed));}else{QMessageBox::critical(this,tr("error"),tr("读取失败"));}
}

在这里插入图片描述


http://chatgpt.dhexx.cn/article/g6WFOFUa.shtml

相关文章

Python-snap7 安装和测试

本文章记录Python-snap7零基础的安装和测试过程。 1 部件和软件 硬件&#xff1a; 1&#xff09;S7-1500 CUP 1511-1 PN&#xff08;6ES7511-1AK02-0AB0&#xff09; 2&#xff09;SD存储卡 4M&#xff08;6ES7 954-8LC03-0AA0&#xff09; 3&#xff09;220V AC 转 24V DC 电…

SNAP7 C++ 通讯

静态调用的dll的一个实例 2017年11月17日 09:49:18 净无邪 阅读数&#xff1a;334 版权声明&#xff1a;本文为博主原创文章&#xff0c;欢迎各位朋友转载。转载时&#xff0c;保留链接地址&#xff01; https://blog.csdn.net/naibozhuan3744/article/details/78557761 本实…

Qt5调用Snap7

Snap7是一个与西门子PLC通信的开源库, 在网上下载了一个例子, 研究了一天终于通信成功了, 在此记录一下 项目文件 win32:LIBS C:\Qt\Qt5.7.0\Tools\mingw530_32\i686-w64-mingw32\lib\libws2_32.a win32:LIBS C:\Qt\Qt5.7.0\Tools\mingw530_32\i686-w64-mingw32\lib\libwin…

python snap7 plc_Python-Snap7获取西门子PLC 300数值

说明 在一次数采项目中,对现场PLC300进行取数。本人小白,在网上搜罗了大量信息,终于找到解决方法。 准备事项 1. 操作系统 2.Python环境(本次使用Python3.6.6) 3.Snap7 connect connect(192.168.0.1, rack=0,slot=1) 三个参数分别为:IP 地址,机架,插槽 read_ar…

python-snap7的安装记录

python-snap7的安装记录-windows&#xff08;仅供个人备忘&#xff09; 首先 pip install python-snap7其次安装包再然后是环境变量最后是测试 网上其他人的资料尝试上去总感觉不靠谱&#xff0c;很多内容不是一篇网上的文章就能解决&#xff08;不是这里不对就是那里看不懂&am…

snap7

The Snap7 theatre (剧场、讲堂) The purpose of Snap7 is to fully integrate your PC station into a PLC network, without anybody sees the difference. To allow this, the Snap7 theater must be the same as the Siemens and contain the same actors. Snap7 library…

Python基于Snap7与PLC建立连接并读写数据

最近偶尔在网上看到可以用Python通过snap7与PLC建立连接并读写数据&#xff0c;好多小伙伴没有现成的PLC,这里介绍一个电脑模拟PLC与python通讯。效果与实际情况一样的。这里是以SIEMENS的PLC为例&#xff0c;通过Pycharm与TIA V17建立连接&#xff0c;对其DB块、M区、Q区、I区…

snap7通过NetToPLCsim工具接入模拟西门子PLC S7-1200步骤简介

概述 本文主要是设备通过S7协议接入西门子PLC S7-XXXX系列的开发使用文档&#xff0c;主要包括西门子PLC组态工具博途V15,PLC模拟工具S7-PLCSIM&#xff0c;IP地址映射工具NetToPLCsim等使用使用说明&#xff0c;S7协议的编译及使用说明等&#xff1b; 1 开发工具之间的关系 仿…

基于Snap7实现与西门子PLC通信

​如果你对西门子PLC通信或者上位机开发稍微有一点研究的话&#xff0c;应该对Snap7有所耳闻。 Snap7是一个基于以太网与西门子S7系列PLC通信的开源库&#xff0c;在世界领域应用很广。但也许是因为资料比较少&#xff0c;而且很多都是纯英文&#xff0c;在国内反而没有大规模…

c++ snap7通信vs环境配置与编程入门

前言&#xff1a;作者基本为电脑桌面软件开发小白&#xff0c;搜索网上的教程中踩了不少坑&#xff0c;在此整理分享最基础的vs环境下c开发snap7应用环境搭建&#xff0c;完成第一条snap7与PLC成功通信。 准备工作 Visual Studio 2013 及以后版本&#xff08;以下简称vs&…

Python使用python-snap7实现西门子PLC通讯

Python简介 Python是开源的高级编程语言之一&#xff0c;广泛应用于人工智能、数据分析、爬虫等领域。由于它拥有大量的开源库和标准库&#xff0c;以及简单且贴近自然语言的语法&#xff0c;所以即便是从未接触过编程的人&#xff0c;也能快速上手。2021年10月&#xff0c;Py…

手把手教你强化学习 (三)马尔可夫决策过程与贝尔曼方程

马尔可夫决策过程 (Markov Decision Process&#xff0c;MDP)是序贯决策(sequential decision)的数学模型&#xff0c;一般用于具备马尔可夫性的环境中。最早的研究可以追溯到最优控制 (optimal control)问题上&#xff0c;1957年&#xff0c;美国学者Richard Bellman通过离散随…

数学建模,8月学习感想

数学建模概览 Matlab入门常用的操作指令数据类型 建模流程分析问题建立模型&求解模型数据建模技术优化技术连续模型求解评价模型求解机理建模方法 撰写论文前情提示正文部分配套说明排版工具 写在最后 长文预警&#xff01;&#xff01;&#xff01; Matlab入门 Matlab可谓…

「从零入门数据分析」01_ 数据分析概述

作者 | gongyouliu 编辑 | auroral-L 本篇文章共8628字&#xff0c;预计阅读时间35分钟。 大家好&#xff0c;我是强哥。一个热爱暴走、读书、写作的人&#xff01; 本章目录 一、数据分析的发展简史 二、数据分析的应用场景 三、常用的数据分析工具与技术 四、数据分析的思维…

数学建模心得分享(校赛)——2021.6.7

一、个人感受 总结为&#xff1a;找队友->讲方法->找知识->善讨论->勤实践 基础能力(个人见解)&#xff1a; 第一次比赛完&#xff0c;还有这刚刚实习完的余温&#xff0c;工作中的思维的惯性还时刻在影响着我&#xff0c;身边的人几乎都为了自己的生活而奋斗。有幸…

matlab在管理学中的应用简述【一】

1、问题研究与描述 1.1 问题与模型 &#xff08;1&#xff09;问题 问题与人们的日常生活和工作有着密切的联系&#xff0c;人们每天都要面对各种各样的问题需要处理和解决。 如&#xff1a;资源配置问题&#xff0c;救灾抢险问题&#xff0c;时间安排问题&#xff0c;生产组…

大数据和人工智能属于什么专业 - 学大数据和人工智能出来做什么

人工智能专业主要从事什么工作&#xff1f; 1、算法工程师。进行人工智能相关前沿算法的研究&#xff0c;包括机器学习、知识应用、智能决策等技术的应用。以机器学习的过程为例&#xff0c;涉及到数据收集、数据整理、算法设计、算法训练、算法验证、算法应用等步骤&#xff0…

方差分析 anova一般指方差分析

方差分析(Analysis of Variance,简称ANOVA),又称“ 变异数分析”或“F检验”,是R.A.Fisher发明的,用于两个及两个以上 样本均数差别的 显著性检验。 由于各种因素的影响,研究所得的数据呈现波动状。造成波动的原因可分成两类,一是不可控的随机因素,另一是研究中施加的对…

继续无题

企业分为&#xff1a;决策层、管理层、执行层。 所以企业也会有&#xff1a;决策软件、管理软件、执行软件。 &#xff08;1&#xff09; 啥叫分析&#xff1f;分析就是根据现状&#xff0c;思考原因&#xff0c;这就是典型的归因&#xff1a;从现在往过去捋&#xff0c;这就叫…

数学建模经验分享及比赛时间汇总

一、浅谈数学建模1.1 什么是数学建模 先来看看官方的解释&#xff1a;数学建模是运用数学的语言和方法&#xff0c;通过抽象&#xff0c;简化建立能近似刻画“解决”实际问题的一种强有力的数学手段。数学建模就是用数学语言描述实际现象的过程。这里的实际现象既包涵具体的自然…