折腾记:C++用开源库Snap7通过S7协议连接西门子PLC

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


        不是教程,是避坑指南。使用了S7-200smart和S7-1200这两款PLC。

目录

什么是snap7

下载

编译

S7-200smart准备

IP要弄清楚

数据准备

使用Snap7采集S7-200smart

S7-1200准备

使用Snap7采集1200

交叉编译


什么是snap7

        snap7是个开源库,用来访问西门子PLC的S7协议,支持C/C++以及很多很多别的语言(别的是啥咱不关心)。

下载

        搜官网下载啦,很简单的。

编译

        下载过来的压缩包打开,进到build目录看,有说明文件,非常简单明了。(以后有闲可以整教程出来,不过真的很简单啊,我重点记录遇到的困难)

S7-200smart准备

IP要弄清楚

        设置IP并牢记。Setp7-micro/win smart的搜索功能不好用(这可能是操作系统加强了网络安全的原因)。通过IP能连接到PLC就算正常了。

数据准备

        200smart的数据区是V,snap7是不支持的。我的数据放在VB0和VB1,用HSL可以读取(虽然地址示例没有V,但是可以用),snap7没有对应的函数,所以创建了一个数据块。

        如何创建数据块:

        先连接PLC,底部状态栏显示PLC地址和“已连接”。左侧树,“数据块”,“插入数据页”,右侧下部“数据块”窗口,倒数第三个图标,像个“+R”的,“通过RAM创建数据块”,自动根据内存创建数据块,数据块索引究竟是0还是1不确定,没有地方设置,多尝试几个看看。创建完数据块要下载程序,然后把PLC设置为运行状态,然后就可以用读数据块的函数来读取数据了。

        下载程序之后读取数据一直不变,我还以为是静态的,看了一眼PLC发现处于暂停状态,启动之后就一切正常了。因为开始我有两个数据块所以后一个索引是1是可以理解的,但是删除前一个之后仍然是1(这也可以理解啊,固定坑位模式吧),所以这个不能猜,要靠试。

使用Snap7采集S7-200smart

        Snap7编译结果只有一个so,没有头文件。C++的包装文件是一对h和cpp,在代码示例里面,相同位置有个client的文件,是客户端的代码,把这三个文件拿去用就可以了。

        client.cpp有main函数,改个名就能合在自己的项目里面了。

        由于snap7并未明确支持S7-200smart,所以有点麻烦。

        实际测试发现参数要用(0,1)(机架号和槽位,下同),以及连接类型要设置为3(示例代码没有设置连接类型),不然可能无法连接。200smart其实是没有机架号和槽位参数的。

        HSL的200smart并不需要设置这些。C#就是强些(我现在同时用C++和C#,C#确实舒服很多啊,但是程序太大放不进设备,没办法)。

        实测连接类型为3,参数(0,0)和(0,1)正常,(0,5)和(1,0)则无法连接。

        实测参数(0,0),连接类型不设置无法连接,连接类型0、1、4无法连接,2、3正常连接。

        至于测试代码,除了client的测试,就是用了读数据块的函数。

S7-1200准备

        S7-1200连接比较容易,用正确的参数(0、1)直接就连上了(不正确连不上),但是读数据始终出错,HSL也报错,此时PLC里面还是原来的程序,看不太懂。然后下载了我自己的程序,读取指定的数据块,一样报错,这就抓狂了,看各种设置都正确的,却始终无法读取,最后搜到一个帖子说“恢复出厂设置能解决问题”,于是就恢复出厂设置,重新下载程序,一切OK了。

使用Snap7采集1200

        我的程序包含一个数据块,索引为2,总长度为26个字节。使用DBRead读取成功,数据都正确,但是要注意,数据块是有范围的,读取位置不能超出范围,否则失败。

        实测无需设置连接类型,或者设置为1、2、3(0或4就不行了,文档里说3-10都是“S7 basic”啊,当然0确实不是有效值)。

交叉编译

        交叉编译到arm64只需要把common.mk(build/unix下面)里面的指令换一下就可以了,很简单。arm v6、arm v7啥意思我不懂,我还是用的x86_64_linux.mk,实测程序正常运行。


(这里是结束)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/9308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2022年知识付费小程序案例分享资料,海量收录.完整版,线上销售沟通的技巧和方法,怎么进行沟通?

现在是互联网时代,很多购物平台和知识付费平台在网上全面开花,因此也诞生了销售员的工作也从线下转到了线上。线上销售毕竟不同于线下销售,想要将产品卖出去,沟通的技巧和方式也很重要。 一、 线上销售沟通前的准备 1、 心理上的准…

‘ChatGLMTokenizer‘ object has no attribute ‘sp_tokenizer‘

问题 ‘ChatGLMTokenizer’ object has no attribute ‘sp_tokenizer’ 解决方案 将self.sp_tokenizer SPTokenizer(vocab_file, num_image_tokensnum_image_tokens)移动到super().init()前面 self.sp_tokenizer SPTokenizer(vocab_file, num_image_tokensnum_image_token…

TypeScript学习日志-第十七天(泛型约束)

泛型约束 当我们使用泛型时非常方便,但是在使用的过程中也会遇到很多问题,如图: 这时候就会提示错误,因为返回的是相加的值,但是不是所有的类型都能相加的,例如来个undefined类型的 就不能进行相加了&…

回顾5款我非常喜欢的软件,希望大家也能喜欢

​ 我喜欢分享好软件,这就像与老友聊天一样让我感到快乐。在这个过程中,我可以回顾这些实用的小工具,也希望它们可以帮助到更多人。 1.备份工具——Cobian Backup ​ Cobian Backup是一款功能强大的备份软件,支持自动定时备份、增量备份、差异备份等多种备份方式。…

知识付费系统 设计,课程顾问怎么跟家长微信互动?这样去维护客户

当今天下,营销方式层出不穷,可是有些机构比较保守,始终坚持自己独有的一套模式,并且屡试不爽,今天,小编就带着大家一起来聊一聊课程顾问怎么跟家长微信互动。 维系客户客户有三个方面: 1:微信私…

7-66 按层遍历二叉树

用先序和中序序列构造一棵二叉树(树中结点个数不超过10个),通过用队记录结点访问次序的方法实现对二叉树进行按层遍历,即按层数由小到大、同层由左到右输出按层遍历序列。 输入格式: 第一行输入元素个数 第二行输入先序序列,以空格隔开 第三行输入中序序列,以空格隔开…

wePWNise:一款功能强大的红队Office宏VBA代码生成工具

关于wePWNise wePWNise是一款功能强大的Office宏VBA代码生成工具,该工具基于纯Python开发,可以帮助广大研究人员生成用于Office宏或模版的VBA代码,并以此来测试目标Office环境、应用程序控制和防护机制的安全性。 wePWNise的设计理念将自动化…

libcity 笔记:基本使用方法

介绍 — Bigscity-LibCity 文档 (bigscity-libcity-docs.readthedocs.io) 1 介绍 一个统一、全面、可扩展的代码库,为交通预测领域提供了一个可靠的实验工具和便捷的开发框架目前支持 交通状态预测 交通流量预测 交通速度预测 交通需求预测 起点-终点&#xff…

宽电压降压恒压DC-DC 电源管理芯片

产品描述 AP8851L 一款宽电压范围降压型 DC-DC 电源管理芯片,内部集成使能 开关控制、基准电源、误差放大器、过 热保护、限流保护、短路保护等功能, 非常适合在宽输入电压范围具有优良 的负载和线性调整度。 AP8851L 芯片包含每周期的峰值 限流、软启…

Telnet协议:远程控制的基石

目录 1. 概述 2. 工作机制 3. 网络虚拟终端 4. 选项协商 5. 操作方式 6. 用户接口命令 7. 验证的过程 1. 概述 Telnet(Telecommunication Network)是一种用于在互联网上远程登录到计算机系统的标准协议。它早期被广泛用于远程终端连接&#xff0…

Baidu Comate智能编码助手:大学生的代码编写助手

Baidu Comate智能编码助手:大学生的代码编写助手 前言一、关于Baidu Comate智能编码助手1.1 Baidu Comate智能编码助手简介1.2 产品功能 二、安装使用(本文以pycharm为例)三、我的百度Comate之旅3.1智能推荐3.1.1 单行推荐3.1.2 多行推荐 3.2…

理解Java类加载与对象创建顺序

在Java编程中,理解类加载和对象创建的顺序是非常重要的。这个过程涉及到静态代码块、静态成员变量、实例代码块以及构造器的执行顺序。在本文中,我们将深入探讨Java中类加载和对象创建的顺序,并通过示例代码来加深理解。 类加载顺序 首先&a…

pg数据库学习知识要点分析-1

知识要点1 对象标识OID 在PostgreSQL内部,所有的数据库对象都通过相应的对象标识符(object identifier,oid)进行管理,这些标识符是无符号的4字节整型。数据库对象与相应oid 之间的关系存储在对应的系统目录中&#xf…

AI论文速读 |2024[IJCAI]TrajCL: 稳健轨迹表示:通过因果学习隔离环境混杂因素

题目: Towards Robust Trajectory Representations: Isolating Environmental Confounders with Causal Learning 作者:Kang Luo, Yuanshao Zhu, Wei Chen, Kun Wang(王琨), Zhengyang Zhou(周正阳), Sijie Ruan(阮思捷), Yuxuan Liang(梁宇轩) 机构&a…

SAP-PP-MM特殊库存的生产发料

如果有个物料是在特殊库存E,那么往生产订单发料是如何确定哪一个组件消耗这个特殊库存呢? 在生产订单中有哪些标记确定特殊库存?确定销售订单和行项目? 通过上图可以看到特殊库存标记1,也就是单独客户库存。 其他的特…

UVa11865 Stream My Contest

UVa11865 Stream My Contest 题目链接题意输入格式输出格式 分析朱-刘算法 不固定根的最小树形图求法AC 代码 题目链接 UVA - 11865 Stream My Contest 题意 你需要花费不超过cost元来搭建一个比赛网络。网络中有n台机器,编号为0~n-1,其中机器0为服务器…

洗地机什么品牌好?洗地机怎么选?618洗地机选购指南

随着科技的飞速发展,洗地机以其高效的清洁能力、稳定的性能和用户友好的设计而闻名,不仅可以高效吸尘、拖地,还不用手动洗滚布,已经逐渐成为现代家庭不可或缺的清洁助手。然而,在众多品牌和型号中,如何选择…

C++语言·string类

1. 为什么有string类 C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数(strcpy,strcat),但是这些库函数与字符串是分离开的,不太符合OOP(Object Oriented Programming面向对…

封装长按触发事件的uniapp组件

简单说一下原理 首先介绍三个针对触摸屏设备的事件,分别是: touchstart:当手指触摸屏幕时触发,即触摸开始的时候;touchend:当手指离开屏幕时触发,即触摸结束的时候;touchcancel&am…

【深耕 Python】Quantum Computing 量子计算机(3)重要数学公式一览

写在前面 往期量子计算机博客: 【深耕 Python】Quantum Computing 量子计算机(1)图像绘制基础 【深耕 Python】Quantum Computing 量子计算机(2)绘制电子运动平面波 正文 偏微分: 交换关系&#xff…