折腾记: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,实测程序正常运行。
(这里是结束)
相关文章:
折腾记:C++用开源库Snap7通过S7协议连接西门子PLC
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 不是教程,是避坑指…...
Android studio 新版本 NewUI toolbar显示快捷按钮
新版本的Android studio 启用新的界面,以前许多快捷按键位置有变化 文章目录 设置始终显示主菜单设置ToolBar快捷按钮显示设置右下角显示分支 设置始终显示主菜单 原本要点击左上角几个横向才显示的菜单 设置始终显示,View -> Appearance -> Mai…...
辛普森公式求函数的近似积分【通用计算】
利用辛普森公式可以近似求出复杂函数的积分值,公式如下: ∫ a b f ( x ) d x ≈ h 3 [ y 0 y 2 n − 1 4 ( ∑ i 1 n − 1 y 2 i − 1 ) ∑ i 1 n − 1 y 2 i ] \int_{a}^{b} f(x) dx \approx \frac{h}{3}\left[ y_0 y_{2n-1} 4(\sum\limits_{i1…...
即插即用 | YOLOv8热力图可视化方法详解,揭秘AI如何「看」世界!【附完整源码】
《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…...
多线程学习D10 收尾了应该
线程安全集合类概述 重点介绍java.util.concurrent.* 下的线程安全集合类,可以发现它们有规律,里面包含三类关键词:Blocking、CopyOnWrite、Concurrent Blocking 大部分实现基于锁,并提供用来阻塞的方法 CopyOnWrite 之类容器修改…...
ai可以做思维导图吗?当然是可以的!
ai可以做思维导图吗?在快节奏的现代生活中,思维导图作为一种高效的信息组织和表达工具,越来越受到人们的青睐。随着人工智能(AI)技术的不断发展,AI思维导图软件也应运而生,它们不仅能够帮助用户…...
景源畅信数字:抖音小店的入住门槛大不大?
近年来,随着短视频平台的崛起,抖音小店逐渐成为了众多商家和创业者关注的焦点。那么,抖音小店的入住门槛究竟大不大呢?本文将从四个方面对这一问题进行详细阐述。 一、注册流程 抖音小店的注册流程相对简单,只需按照官方指引完成…...
鸿蒙开发-ArkTS语言-容器-非线性容器
鸿蒙开发-UI-web 鸿蒙开发-UI-web-页面 鸿蒙开发-ArkTS语言-基础类库 鸿蒙开发-ArkTS语言-并发 鸿蒙开发-ArkTS语言-并发-案例 鸿蒙开发-ArkTS语言-容器 文章目录 前言 一、非线性容器 1.HashMap 2.HashSet 3.TreeMap 4.TreeSet 5.LightWeightMap 6.LightWeightSet 7.P…...
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C笔记专栏: C笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、简单介绍Sizeof和Strlen1.1 Sizeof1.2 Strlen函数1.3 Sie…...
【设计模式】单例模式的前世今生
文章目录 引言简介起航!向“确保某个类在系统中只有一个实例”进发 ⛵️Lazy SingletonDouble-checked locking(DCL) SingletonVolatile SingletonAtomic SingletonMeyers Singleton 附:C静态对象的初始化 引言 说起单例模式&…...
厦门网上在线教育系统,线下老师怎么转型到线上网上授课?
现在很多 线下老师都想转到线上做网课,但是在转线上过程中会出现很多问题,很多人都不知道怎么开始,今天小编和大家说一下要注意的。 一、你要有一套适合线上的教学视频 首先你要准备做的课程内容是什么,怎么讲,讲什么&…...
Spring底层入门(九)
boot的执行流程分为构造SpringApplication对象、调用run方法两部分 1、Spring Boot 执行流程-构造 通常我们会在SpringBoot的主启动类中写以下的代码: 参数一是当前类的字节码,参数二是main的args参数。 public class StartApplication {public static…...
掌握Android Fragment开发之魂:Fragment的深度解析(下)
在上一篇文章中,我们深入探讨了Fragment 通信,包含Fragment 向 Activity 传递数据、Activity 向 Fragment 传递数据、Fragment 之间的通信方式。感兴趣的朋友,请前往查阅: 掌握Android Fragment开发之魂:Fragment的深度…...
小巧简单实用的Linux端口转发工具Rinetd
Linux下实现端口转发有很多种方法,尤其是在可以联网的情况下,更是容易。最近在资源受限的定制系统中,找到一个方便离线安装和使用的端口转发工具Rinetd,安装包仅几十K,而且有很多版本的Linux发行系统的支持。 1、安装…...
HackBar 新手使用教程(入门)
啥是Hackbar? Hackbar是一个Firefox 的插件,它的功能类似于地址栏,但是它里面的数据不受服务器的相应触发的重定向等其它变化的影响。 有网址的载入于访问,联合查询,各种编码,数据加密功能。 这个Hackbar可以帮助你在测试SQL注入,XSS漏洞和网站的安全性,主要是帮助…...
<Linux> 权限
目录 权限人员相对于文件来说的分类更改权限文件的拥有者与所属组umask粘滞位 权限 权限是操作系统用来限制对资源访问的机制,权限一般分为读、写、执行。系统中的每个文件都拥有特定的权限、所属用户及所属组,通过这样的机制来限制哪些用户、哪些组可以…...
Nacos Docker 快速部署----解决nacos鉴权漏洞问题
Nacos Docker 快速部署 1. 说明 1.1 官方文档 官方地址 https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html docker启动文件的gitlhub地址 https://github.com/nacos-group/nacos-docker.git 问题: 缺少部分必要配置与说明 1.2 部署最新版本Nacos&…...
存储或读取时转换JSON数据
一、 数据库类型 二、使用Hutool工具 存储时将数据转换为JSON数据 获取时将JSON数据转换为对象 发现问题: 原本数据对象是Address 和 Firend但是转换完成后数据变成了JSONArray和JSONObject 三、自定义TypeHandler继承Mybatis的BaseTypeHandler处理器 package …...
Spring Data JPA的作用和用法
Spring Data JPA 是 Spring 框架的一个模块,它提供了一种数据访问抽象,允许以一种声明式和简洁的方式来处理数据库操作。它基于 Java Persistence API (JPA),是一个行业标准的 ORM(对象关系映射)规范,用于将…...
【go项目01_学习记录08】
学习记录 1 模板文件1.1 articlesStoreHandler() 使用模板文件1.2 统一模板 1 模板文件 重构 articlesCreateHandler() 和 articlesStoreHandler() 函数,将 HTML 抽离并放置于独立的模板文件中。 1.1 articlesStoreHandler() 使用模板文件 . . . func articlesSt…...
Java中的线程
一、创建线程的几种方式? ① 通过继承Thread类并重写run方法 ,实现简单但不可以继承其他类 Thread底层也是实现了Runnable接口,重写的是run而不是start方法 ②实现Runnable接口并重写run方法, 避免了单继承的局限性ÿ…...
顺序表的实现(迈入数据结构的大门)(完整代码)
seqlist.h #pragma once typedef int SLDataType;#include<stdio.h> #include<stdlib.h> #include<assert.h>typedef struct SeqList {SLDataType* a;int size; // 有效数据个数int capacity; // 空间容量 }SL;//初始化和销毁 void SLInit(SL* ps); void SL…...
neo4j-5.11.0安装APOC插件or配置允许使用过程的权限
在已经安装好neo4j和jdk的情况下安装apoc组件,之前使用neo4j-community-4.4.30,可以找到配置apoc-4.4.0.22-all.jar,但是高版本neo4j对应没有apoc-X.X.X-all.jar。解决如下所示: 1.安装好JDK与neo4j 已经安装对应版本的JDK 17.0…...
mybatis 中 #{}和 ${}的区别是什么?
在 MyBatis 中,#{} 和 ${} 是两种用于参数替换的语法,但它们之间存在一些重要的区别,主要体现在安全性、预编译和动态 SQL 上。 安全性: #{}:这是预编译处理,MyBatis 会为传入的参数生成 PreparedStatement…...
深入解析C#中的接口设计原则
深入解析C#中的接口设计原则 目录 深入解析C#中的接口设计原则 一、接口设计的SOLID原则 二、接口设计的最佳实践 三、接口设计的高级技术 四、结论 接口在面向对象编程中扮演着至关重要的角色。它们是定义行为契约的一种方式,允许实现者提供这些行为的具体实现…...
106短信群发平台在金融和法务行业的应用分析
一、金融行业应用 1.客户通知与提醒:银行、证券、保险等金融机构经常需要向客户发送各类通知和提醒,如账户余额变动、交易确认、扣费通知、理财产品到期提醒等。106短信群发平台可以快速、准确地将这些信息发送到客户的手机上,确保客户及时获…...
Spring AOP(2)
目录 Spring AOP详解 PointCut 切面优先级Order 切点表达式 execution表达式 切点表达式示例 annotation 自定义注解MyAspect 切面类 添加自定义注解 Spring AOP详解 PointCut 上面代码存在一个问题, 就是对于excution(* com.example.demo.controller.*.*(..))的大量重…...
Spring-依赖注入的处理过程
前置知识 1 入口 DefaultListableBeanFactory#resolveDependency 2 每个依赖都有对应的DependencyDescriptor 3 自定绑定候选对象处理器AutowireCapableBeanFactory 注入处理 我们可以看到接口AutowireCapableBeanFactory中有两个方法。 第一个是单个注入: Null…...
2.用python爬取的保存在text文件中的格式为MP4的视频url
文章目录 一、url的保存格式二、MP4视频获取 一、url的保存格式 爬取的视频名字和url保存在text文件中,每一个视频都是一个单独的text,其中text的文件名就是视频的名字,text内容是视频的下载url,并且所有的text都保存在同一个文件…...
Java基于B/S医院绩效考核管理平台系统源码java+springboot+MySQL医院智慧绩效管理系统源码
Java基于B/S医院绩效考核管理平台系统源码javaspringbootMySQL医院智慧绩效管理系统源码 医院绩效考核系统是一个关键的管理工具,旨在评估和优化医院内部各部门、科室和员工的绩效。一个有效的绩效考核系统不仅能帮助医院实现其战略目标,还能提升医疗服…...
爱站网是干嘛的/短视频培训要多少学费
摘抄整合,勿喷 GDB r:run,执行程序 n:next,下一步,不进入函数 s:step,下一步,会进入函数 b:breakponit,设置断点 l:listÿ…...
wordpress编辑颜色/国内新闻摘抄2022年
给一个正整数,如果是偶数,则减半;如果是奇数,则变为它的三倍加一。直到变为一停止。对于所有正整数经过足够多次变换最终总能达到1。#!/usr/bin/env python# -*- coding: utf-8 -*-def collatz(number):while(number ! 1):if numb…...
广州网站优化费用/树枝seo
由于博客图片量大,篇幅太长,因此需要分上、中、下三篇博客来写,上篇和中篇我们已经一起学习完了,这篇博客我们一起学习下剩余部分。 一、配置反向代理 我们需要在两个跟踪器上安装nginx(也就是192.168.156.5和192.168…...
网站开发vs设计报告/微信软文广告经典案例
来自:http://www.it165.net/pro/html/201505/42504.html 一、前言 上篇有提到在WebAPI项目内,通过在Nuget里安装(Microsoft.AspNet.WebApi.HelpPage)可以根据注释生成帮助文档,查看代码实现会发现是基于解析项目生成的…...
东莞最新疫情最新消息/短视频seo搜索优化
今天给大侠带来如何写好状态机,状态机是逻辑设计的重要内容,状态机的设计水平直接反应工程师的逻辑功底,所以很多公司在硬件工程师及逻辑工程师面试中,状态机设计几乎是必选题目。本篇在引入状态机设计思想的基础上,重…...
怎么知道网站的域名/微信营销推广
一,Mllib的数据格式 1,本地向量 本地向量是存储在本地节点上的,其基本数据类型是Vector,其有两个子集,分别是密集的与稀疏的,我们一般使用Vectors工厂类来实现。如: Vectors.dese(1.0,2.0,3.…...