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

article/2025/7/17 1:58:08

       最近偶尔在网上看到可以用Python通过snap7与PLC建立连接并读写数据,好多小伙伴没有现成的PLC,这里介绍一个电脑模拟PLC与python通讯。效果与实际情况一样的。这里是以SIEMENS的PLC为例,通过Pycharm与TIA V17建立连接,对其DB块、M区、Q区、I区读写数据。后面还添加了200系列V区的读写数据。请注意在程序中个别只对200专用!200系列的PLC不能模拟,也就不能用那个通讯工具了,直接与PLC通讯就好了。

一、安装Snap7安装包

1、在下载的1.4.2文件夹中找到文件

2、将这两个文件拷贝到python的安装目录include中

3、cmd中输入 pip install python-snap7,打开pycharm查看snap7是否安装成功,然后导入snap7包

二、安装SIEMEN的编程软件TIA V17

按照参考链接打开TIA V17仿真,建立好变量连接在线:

三、西门子PLC连接工具NetToPLCsim,修改IP地址和端口

4、以管理员身份打开NetToPLCsim软件,如果102端口被占用,会提示重新获取102端口,在弹窗里点击【是】。

等待端口修改成功。

点击【Add】,填写电脑和PLC设备的IP地址,电脑和PLC设备的IP地址最好一样。

填写完毕后点击【Start Server】。

四、测试程序

运行程序就可以测试是否可以读取PLC中数据和写入PLC数据,以下是测试代码,在参考文章中读写都是用区域代码,但是实际测试无法匹配到区域代码。还有读写DB块和M区、Q区、I区的方法稍有不同需要注意。

import snap7
from snap7.util import *plc = snap7.client.Client()
plc.set_connection_type(3)  # (200专用)# 定义Plc连接
def plc_connect(ip, rack, slot):plc.connect(ip, rack, slot)if plc.get_connected():print("连接成功")# PLC断开连接
def plc_disconnect():plc.disconnect()def dbRead(dbnum, dblength):"""DB块的读操作;如果是200smart系列的将dbnum设置为0:param dbnum::param dblength::return:"""data = plc.read_area(snap7.types.Areas.DB, dbnum, 0, dblength)print(get_int(data, 0))print(get_bool(data, 2, 0))print(get_dword(data, 4))print(get_real(data, 8))print(get_bool(data, 0, 0))print(get_byte(data, 2))def dbWrite(dbnum, dblength):"""DB块的写操作;如果是200smart系列的将dbnum设置为0:param dbnum: DB块的序号:param dblength::return: 字节长度,根据需要设定"""data = plc.read_area(snap7.types.Areas.DB, dbnum, 0, dblength)# set_int(data, 0, 20)# set_bool(data, 2, 0, False)# set_dword(data, 4, 1000)# set_real(data, 8, 11.3)# set_int(data, 12, 99)set_bool(data, 0, 0, False)  # 设置DBD0.DBX0.0为False# set_byte(data, 2, 2)# set_int(data, 4, 100)plc.write_area(snap7.types.Areas.DB, dbnum, 0, data)print('写入成功!!!')def mRead1(num, bit):"""M区的读操作--------bool:param num::param bit::return:"""data = plc.read_area(snap7.types.Areas.MK, 0, num, 1)print(get_bool(data, 0, bit))def mRead2(num):"""M区的读操作--------int/word/dint/dword:param num::return:"""data = plc.read_area(snap7.types.Areas.MK, 0, num, 2)print(get_int(data, 0))  # 读取MW0值print(get_byte(data, 0))  # 读取MB0值print(get_dint(data, 0))  # 读取MD0值def mWrite1(byte, bit, value):"""M块的写操作---------bool:param byte::param bit::param value::return:"""data = plc.read_area(snap7.types.Areas.MK, 0, byte, 1)set_bool(data, 0, bit, value)plc.write_area(snap7.types.Areas.MK, 0, byte, data)def mWrite2(byte, value):"""M块的写操作---------int/word/dint/dword:param byte::param value::return:"""data = plc.read_area(snap7.types.Areas.MK, 0, byte, 4)# set_int(data, 0, value)set_dint(data, 0, value)plc.write_area(snap7.types.Areas.MK, 0, byte, data)def qRead1(byte, bit):"""Q区的读操作-------------bool:param byte::param bit::return:"""data = plc.read_area(snap7.types.Areas.PA, 0, byte, 1)print(get_bool(data, 0, bit))def qRead2(byte):"""Q区的读操作-------------byte/int/word/dint/dword:param byte::return:"""data = plc.read_area(snap7.types.Areas.PA, 0, byte, 2)# print(get_byte(data, 0))print(get_int(data, 0))# print(get_dint(data, 0))def qWrite1(byte, bit, value):"""Q区的写操作----------bool:param byte::param bit::param value::return:"""data = plc.read_area(snap7.types.Areas.PA, 0, byte, 1)  # read_area的SIZE参数,这里默认位一个字节set_bool(data, 0, bit, value)plc.write_area(snap7.types.Areas.PA, 0, byte, data)def qWrite2(byte, value):"""Q区的写操作----------int/word/dint/dword:param byte::param value::return:"""data = plc.read_area(snap7.types.Areas.PA, 0, byte, 2)  # read_area的SIZE参数,int-2;dint-4set_int(data, 0, value)   # 读取QW0值# set_dint(data, 0, value)plc.write_area(snap7.types.Areas.PA, 0, byte, data)def iRead1(byte, bit):"""输入映象区的读操作-------bool:param byte::param bit::return:"""data = plc.read_area(snap7.types.Areas.PE, 0, byte, 1)  # Size参数,这里我们定义为1个字节的长度print(get_bool(data, 0, bit))def iRead2(byte):"""输入映象区的读操作-------byte/int/word/dint/dword:param byte::return:"""data = plc.read_area(snap7.types.Areas.PE, 0, byte, 2)  # Size参数,这里我们定义为1个字节的长度# print(get_byte(data, 0))print(get_int(data, 0))# print(get_dint(data, 0))if __name__ == '__main__':plc_connect('192.168.1.10', 0, 1)dbRead(1, 4)dbWrite(1, 4)mRead1(20, 2)mRead2(100)mWrite1(20, 6, True)mWrite2(22, 100)qRead1(100, 5)qRead2(200)qWrite1(100, 5)iRead1(99, 7)iRead2(122)plc_disconnect()

TIA V17 链接:https://pan.baidu.com/s/1vfzzDhqKLy49pl9V0AINsA    提取码:hmn8

西门子PLC连接工具 ,NetToPLCsim;NetToPLCSim download | SourceForge.net

Snap7 链接: https://pan.baidu.com/s/1--Zhwj1gs417rpLrpV1QKQ     提取码: qtnm

参考:通讯测试工具和博图仿真机的连接教程

           Python读写PLC


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

相关文章

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

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

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

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

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

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

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

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

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

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

数学建模,8月学习感想

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

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

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

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

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

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

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

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

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

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

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

继续无题

企业分为:决策层、管理层、执行层。 所以企业也会有:决策软件、管理软件、执行软件。 (1) 啥叫分析?分析就是根据现状,思考原因,这就是典型的归因:从现在往过去捋,这就叫…

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

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

数模论文写作入门——正文篇

提示:数模论文写作入门还有“首页篇”和“排版篇”,可查看专栏补充。 目录 前言 一、问题重述 1、改词降重 水论文方法 2、 查阅相关背景资料 引用高大上 二、问题分析 三、模型假设 1.题目中明确给出假设条件 2.排除生活中小概率时间&#xff08…

SPSS统计分析过程包括描述性统计、均值比较、一般线性模型、相关分析、回归分析、对数线性模型、聚类分析、数据简化、生存分析、时间序列分析、多重响应等几大类...

https://www.zhihu.com/topic/19582125/top-answershttps://wenku.baidu.com/search?wordspss&ieutf-8&lm0&od0 SPSS 18.0由17个功能模组组成: Base System 基础程式 Advanced Models 高等统计模组(GEE/GLM/存活分析) Regression Models 进阶回归模组 …

数学建模论文写作

声明:本文为本人在b站学习清风数学建模的学习笔记 数学建模清风——论文写作方法教程(国赛和美赛) 文章目录 论文写作方法国赛摘要摘要的开头段摘要的中间段摘要的结尾段摘要中常见的废话完整摘要参考关键词 (正文部分&#xff09…

机器学习中的 Shapley 值怎么理解?

导语:在集体合作中,如何公平分配奖励? 图片来源:https://unsplash.com/photos/TL5Vy1IM-uA 我第一次听说 Shapley 值是在学习模型可解释性的时候。我知道了 SHAP,它是一个框架,可以更好地理解为什么机器学…

做数据分析如何从囚徒困境到合作的进化

小飞象交流会 即使拿到一手烂牌,也要打出一串王炸。这是场无限游戏,努力成为牌桌上最后一名玩家。 内部交流│7期 做数据分析如何 从囚徒困境到合作的进化 data analysis ●●●● 分享人:周海鹏 ‍ ‍‍ 在推进业务线各种项目的过程中&#…

博弈论学习(二)——完全信息静态博弈

这一篇主要介绍非合作博弈中,完全信息静态博弈的相关知识。 切记非合作博弈的条件:参与人具有足够智力且极端个人主义,即以自己的效用作为唯一的衡量标准。 要理解完全信息静态博弈,首先要了解以下2个概念: 完全信息…

Nabla算子

Nabla算子的定义: 梯度: 散度: 旋度: