首页 > 其他分享 >Qt 使用Snap7

Qt 使用Snap7

时间:2024-04-22 16:48:21浏览次数:21  
标签:Qt snap7 int Snap7 client PLC 使用 byte 连接

1 稳定版本snap7源码下载

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

2 整合到QT项目中

2.1 解压下载的文件得到snap7-full-1.4.2,放到qt项目文件目录下

2.2 从snap7-full-1.4.2目录下找到snap7.cpp、 snap7.dll、 snap7.h、 snap7.lib四个文件并放到qt项目目录下
  snap7.cpp、snap7.h所在目录:\snap7-full-1.4.2\release\Wrappers\c-cpp

  snap7.dll、snap7.lib所在目录:\snap7-full-1.4.2\release\Windows\Win64

2.3 将snap7.cpp添加到qt项目的源文件下、snap7.h添加到项目头文件下

  右键头文件,添加现有文件,选择snap7.h;
  右键源文件,添加现有文件,选择snap7.cpp;

2.4 将snap7.lib添加到项目的外部链接中

  右键项目名,添加库,外部库

  浏览库文件,选择snap7.lib文件;
  去掉为debug版本添加'd'作为后缀的勾选;
  点击下一步,完成。

3 连接测试

3.1 头文件中引入snap7.h文件,并申明TS7Client客户端对象client

3.2 xxx.cpp文件中初始化client对象,使用ip、rack、slot进行连接

 【PLC连接】

 1 void MainWindow::on_pushButton_clicked()
 2 {
 3     int reg = client->ConnectTo("192.168.0.1",0,1);
 4     if(reg == 0)
 5     {
 6         QMessageBox::information(this,"提示","连接成功!");
 7     }
 8     else
 9     {
10         QMessageBox::information(this,"提示","连接失败");
11     }
12 }

【断开连接】

 1 void MainWindow::on_pushButton_6_clicked()
 2 {
 3     if(!client->Connected()){ //未连接则不执行
 4         QMessageBox::information(this,"tips","PLC未连接!");
 5         return;
 6     }
 7     client->Disconnect();
 8     if(!client->Connected()){
 9         QMessageBox::information(this,"tips","已断开连接!");
10     }
11 }

3.3 PLC设置

  rack号和slot号确认

   PLC的连接机制设置允许外部访问

  创建需要读写的DB数据块,并取消数据块属性中的优化的块访问的勾选

3.4 上位机连接PLC,运行qt程序,连接成功

4 读取DB数据
4.1 DBRead函数介绍
  DBRead(DB号, 起始地址, 字节数, 返回的字节数组);

4.2 例程参考
  snap7读取的plc数据都是字节数组,且为大小端;需要根据不同的目标类型进行相应的转换;
  本例程提供了 byte[]转int和byte[]转bool两种转换方式,仅供参考;

 1 void MainWindow::on_pushButton_4_clicked()
 2 {
 3     if(!client->Connected()){ //未连接则不执行
 4         QMessageBox::information(this,"tips","PLC未连接!");
 5         return;
 6     }
 7     byte res[256]= {0};
 8     client->DBRead(1,0,3,&res);
 9     //读取的数据都是字节数组,且为大小端
10     //byte[]转int
11     uint value = res[1] & 0xFF;  //PLC中int数据占2字节长度
12     value |= ((res[0] << 8) & 0xFF00);
13     //byte[]转bool
14     bool isOK = res[2] & 0xFF;
15     ui->value_3->setText(isOK?"TRUE":"FALSE");
16     ui->value_2->setText(QString::number(value));
17 }

5 向DB块写数据
  主要使用DBWrite()函数向DB块写入各种数据;

5.1 DBWrite函数介绍
  DBWrite(DB块号,起始地址,字节大小,写入的字节数组);

5.2 例程参考
  与读取数据类似,数据写入DB块之前需要先转换为字节数组;
  本例程提供了 int转byte[]和bool转byte[]两种转换方式,仅供参考;
【写入int数据】

 1 void MainWindow::on_pushButton_3_clicked()
 2 {
 3     if(!client->Connected()){ //未连接则不执行
 4         QMessageBox::information(this,"tips","PLC未连接!");
 5         return;
 6     }
 7     int value     = ui->value->text().toInt();
 8     int start = ui->byteNum->text().toInt();
 9     //int 转byte数组
10     byte data[2]={0};[]
11     //大小端调换
12     data[1] = (unsigned char)(0xff & value);
13     data[0] = (unsigned char)((0xff00 & value) >> 8);
14     client->DBWrite(1,start,2,&data); //  DBWrite(int DBNumber, int Start, int Size, void *pUsrData)
15 }

【写入bool数据】

 1 void MainWindow::on_toolButton_clicked()
 2 {
 3     if(!client->Connected()){ //未连接则不执行
 4         QMessageBox::information(this,"tips","PLC未连接!");
 5         return;
 6     }
 7     byte data;
 8     if(isOK){
 9         isOK = !isOK;
10         data = 0x01;
11         client->DBWrite(1,2,1,&data);
12         ui->toolButton->setStyleSheet("QToolButton {background-color: green; border: 2px solid black; color: white;}");
13         ui->toolButton->setText("关 闭");
14     }
15     else{
16         isOK = !isOK;
17         data = 0x00;
18         client->DBWrite(1,2,1,&data);
19         ui->toolButton->setStyleSheet("QToolButton {background-color: gray; border: 2px solid black; color: white;}");
20         ui->toolButton->setText("打 开");
21     }
22 }

6 项目打包

6.1 点击qt项目左侧的项目,构建的步骤,qmake,详情,将构建配置选为Release

6.2 在Release版本下执行一遍程序

6.3 执行完毕后在项目文件同目录下,生成对应的release运行文件

6.4 进入运行文件,选择release文件目录,复制其中的.exe可执行文件

6.5 将.exe可执行文件单独放入空文件夹下

6.6 在 “开始”菜单找到Qt 命令行程序(两种形式)并打开

有的qt版本Qt 命令行程序是Qt xxx for Desktop

 有的版本是Qt xxx

6.7 命令行进入含有.exe可执行文件单独放入空文件夹下,并执行windeployqt xxx.exe命令

执行完毕后,打包完成

6.8 含snap7库的qt项目打包注意事项

 至此,完成项目打包,打包文件可以通过微信等方式发到其他Windows电脑上直接运行。

标签:Qt,snap7,int,Snap7,client,PLC,使用,byte,连接
From: https://www.cnblogs.com/ybqjymy/p/18150888

相关文章

  • 使用C# 创建、填写、删除PDF表单域
    通常情况下,PDF文件是不可编辑的,但PDF表单提供了一些可编辑区域,允许用户填写和提交信息。PDF表单通常用于收集信息、反馈或进行在线申请,是许多行业中数据收集和交换的重要工具。PDF表单可以包含各种类型的输入控件,如文本框、复选框、下拉菜单、单选按钮等。本文将介绍如何使用C#......
  • 使用C# 创建、填写、删除PDF表单域
    通常情况下,PDF文件是不可编辑的,但PDF表单提供了一些可编辑区域,允许用户填写和提交信息。PDF表单通常用于收集信息、反馈或进行在线申请,是许多行业中数据收集和交换的重要工具。PDF表单可以包含各种类型的输入控件,如文本框、复选框、下拉菜单、单选按钮等。本文将介绍如何使用C#......
  • grep 的使用场景
    场景1:grep中如何同时搜索A或者B?在使用grep命令进行文本搜索时,如果你想要搜索包含"A"或者"B"的行,可以使用以下两种方法:使用-e选项来为每个搜索模式指定一个表达式:grep-eA-eBfilename这里-eA表示搜索包含"A"的行,-eB表示搜索包含"B"的行。使用单个搜索模式并利用正......
  • SQL中使用not in 的坑
    本文实验环境为MarinaDB,即MySQL开源版本先看一下这个sqlSELECT*FROMtableWHEREidIN(NULL);在表记录所有列都有值的情况下显然都是查不出的,那把in改成notin是不是就能反过来查出所有记录呢?SELECT*FROMtableWHEREidnotIN(NULL);然而结果还是一条都查......
  • ONVIF Device Test Tool使用方法
    ONVIF(OpenNetworkVideoInterfaceForum)是一个开放的、全球性的论坛,旨在开发一个全球性的开放接口标准,以推动网络视频产品之间的互操作性。ONVIFDeviceTestTool则是用于测试设备是否符合ONVIF标准的工具,它对于设备制造商、集成商以及最终用户都至关重要。本文将详细介绍ONVI......
  • 使用pipenv后,如何在pycharm中添加解释器
    问题:我用pyenv安装的python3.10,执行pyenvwhichpython3.10显示:/Users/hxjs/.pyenv/versions/3.10.0/bin/python3.10那系统级别的python解释器路径就是:/Users/hxjs/.pyenv/versions/3.10.0/bin/python3.10我在项目下,使用pipenv--python3.10给项目安装了python3.10,并使用pi......
  • SpringBoot模块集成mqtt代码实现
    1//引入pom2<!--mqtt-->3<dependency>4<groupId>org.springframework.boot</groupId>5<artifactId>spring-boot-starter-integration</artifactId>6</dependency>......
  • 时序数据库IoTDB的安装与使用
    ApacheIoTDB(物联网数据库)是一体化收集、存储、管理与分析物联网时序数据的软件系统。ApacheIoTDB采用轻量式架构,具有高性能和丰富的功能,并与ApacheHadoop、Spark和Flink等进行了深度集成,可以满足工业物联网领域的海量数据存储、高速数据读取和复杂数据分析需求。装环境安装......
  • sqlmap简单使用方法
    基本格式sqlmap-u"http://www.vuln.cn/post.php?id=1"默认使用level1检测全部数据库类型sqlmap-u"http://www.vuln.cn/post.php?id=1" --dbmsmysql--level3指定数据库类型为mysql,级别为3(共5级,级别越高,检测越全面)cookie注入当程序有防get注入的时候,可以使用cookie注......
  • redis 安装使用
    下载地址https://download.redis.io/releases/解压tarzxvfredis-7.0.15.tar.gz-C/usr/local/编译redis:cd/usr/local/redis-7.0.15/make编译完成后会在目录下生成生成一个src的目录安装redis:cdsrc/makeinstallPREFIX=/usr/local/redis安装完成。移动配......