Python Snap7实现S7-1200 PLC通信控制_python与西门子1200通讯-程序员宅基地

技术标签: python  plc  

介绍

​ Snap7 是一个基于以太网与S7系列的西门子PLC通讯的开源库,支持包括S7系列的S7-200、S7-200 Smart、S7-300、S7-400、S7-1200以及S7-1500的以太网通信。Snap 7支持python、C/C++、C#、labview等语言,其中最常用的当属它的python库——python-snap7

安装

​ python-snap7是python中的一个开放的功能包,所以使用前只需要直接用pip安装即可

pip install python-snap7

数据存储地址

python-snap7中定义的Areas字典

I Q M DB/V CT TM
0x81 0x82 0x83 0x84 0x1C 0x1D

使用教程

  1. 创建客户端实例
client = snap7.client.Client()
  1. 连接客户端
'''
@brief  连接客户端使用api
@param  address address是服务器的IP地址,如果使用NetToPLCsim
        连接PLCsim,则IP地址应该是计算机的IP地址
@param  rack     针对S7-1200此处应该是0
@param  slot     针对S7-1200此处应该是1
@param  tcpport     端口默认是102
'''
def connect(self, address, rack, slot, tcpport=102)
  1. PLC读取

获取PLC各个区的数值

'''
@brief  获取PLC各个区的数值
@param  area         PLC内各寄存区的代码
@param  dbnumber     dbnumber只针对DB块才有效
@param  start        start为寄存区起始地址
@param  size         size是读取数量
@return  bytearray类型
'''
def read_area(self, area, dbnumber, start, size)

不同类型所占字节大小

TypeSize = {
    'int': 2,  # 有符号(-32768~32767)
    'bool': 1,  # bool值
    'dint': 4,  # 有符号 (-2147483648~2147483647)
    'word': 2,  # 无符号(0~65536)
    'real': 4,  # 有符号 float类型(这范围记不住了)
    'dword': 4,  # 无符号(0~4294967295)
    'char': 1,  # CHAR,ASCII字符集,占用1个字节内存,主要针对欧美国家(字符比较少)
    'string': 255,  # STRING,占用256个字节内存,ASCII字符串,由ASCII字符组成
    's5time': 2,
    'wchar': 2,  # WCHAR,Unicode字符集,占用2个字节内存,主要针对亚洲国家(字符比较多)
    'wstring': 512,  # WSTRING,默认占用512个字节内存(可变),Unicode字符串,由Unicode字符构成
    'dt': 4,  # DateTime 日期
    'usint': 1,  # 0~255
    'sint': 1,  # -128~127
    'uint': 2,  # 0~4294967295
    'udint': 4,  # 0~4294967295
    'lreal': 8,
    'time': 4,
    'd': 2,
    'tod': 4,  # TOD (TIME_OF_DAY)数据作为无符号双整数值存储,被解释为自指定日期的凌晨算起的毫秒数(凌晨 = 0ms)。必须指定小时(24 小时/天)、分钟和秒。可以选择指定小数秒格式。
    'dtl': 12,  # DTL(日期和时间长型)数据类型使用 12 个字节的结构保存日期和时间信息。可以在块的临时存储器或者 DB 中定义 DTL 数据。
    'date': 2,  # Date(16位日期值)、
    'ltod': 8
}

读取字节数组中的布尔值

'''
@brief  读取字节数组中的布尔值
@param  _bytearray     读到的字节数组
@param  byte_index     字节的索引
@param  bool_index     布尔值的索引
@return  对应位的布尔类型
'''
def get_bool(_bytearray, byte_index, bool_index)
  1. PLC写入

写入PLC映像区

'''
@brief  写入PLC映像区
@param  area         PLC内各寄存区的代码
@param  dbnumber     dbnumber只针对DB块才有效
@param  start        start为寄存区起始地址
@param  data         bytearray类型,需要通过一个set_bool函数将传入的数据事先写好
@return  bytearray类型
'''
def write_area(self, area, dbnumber, start, data)

写入字节数组中的布尔值

'''
@brief  写入字节数组中的布尔值
@param  _bytearray     待写入的字节数组
@param  byte_index     字节的索引
@param  bool_index     位索引
@param  value          写入的布尔值
'''
def set_bool(_bytearray, byte_index, bool_index, value)

​ 由于写入要求的是dataarray类型,所以最快捷的方法是先使用read_area读取输出映像区的值,之后通过set_bool赋值,之后通过write_area传入输出映像区。代码示例:

def WriteOutput(dev, bytebit, value):
    #使用split分割bytebit,例如0.0,可以分割成byte = 0, bit = 0
    byte,bit = bytebit.split('.')
    byte,bit = int(byte), int(bit)

    #使用read_area读取输出映像区的值
    dataArray = dev.read_area(0x82, 0, byte, 1)
    #通过set_bool对dataArray赋值
    set_bool(dataArray, 0, bit, value)
    #过write_area将dataArray传入输出映像区
    dev.write_area(0x82, 0, byte, dataArray)

​ 通过这个函数,可以实现对指定的输出映像区进行写操作,接下来使用这个函数,对PLC内Q0.0-Q1.7共16个输出循环写入1和0。

参考

通过Python实现S7-1200输出控制

python 使用Snap7读写西门子S7系列PLC

后续

 喜欢的话可以关注一下我的公众号技术开发小圈,尤其是对深度学习以及计算机视觉有兴趣的朋友,我会把相关的源码以及更多资料发在上面,希望可以帮助到新入门的大家!
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Rosen_er/article/details/123474247

智能推荐

用C语言写循环赛日程表,循环赛的方法与编排-程序员宅基地

文章浏览阅读1k次。一、循环赛的种类与特点(一)循环赛的种类循环赛又称循环法。是指参赛队(或个人,下同)之间,都要互相轮流比赛,最后按照各参赛队在全部比赛中的胜负场数、得分多少排定名次的比赛方法。它在对抗性项目比赛中经常被采用。循环赛包括单循环、双循环或分组循环三种。单循环是所有参赛队(人)相互轮赛一次;双循环是所有参赛队(人)相互轮赛二次;分组循环是参赛队(人)较多时,采用种子法,把强队(人)分散在各组,先进行小组..._c语言循环赛互打一场比赛 甲队两胜

springboot项目访问html页面,发现端口不一致&继承WebMvcConfigurationSupport类会导致自动配置失效_springboot项目前端端口号不同怎么办-程序员宅基地

文章浏览阅读1.6k次,点赞4次,收藏6次。最后的解决方法“在config--WebMvcConfig中不要继承WebMvcConfigurationSupport,而是实现WebMvcConfigurer接口”,且不要在idea中直接点击浏览器图标打开对应的html页面,要自己在浏览器输入url。在本次debug过程中,更加清楚地明白了,springboot项目启动过程中,只扫描引导类同包或子包下的程序,而在resources目录下的静态资源文件(没放到),需要被映射,才能被扫描到。_springboot项目前端端口号不同怎么办

k8s.配置管理.configmap&secret_configmap @value-程序员宅基地

文章浏览阅读80次。configmap 和secret 都需要提前创建configmap和secret都可以为pod提供挂载和变量的方式变量的方式有envfrom全部变量和valuefrom单个变量的引用configmap和secret 需要和引用的pod或者资源对象在同一个ns下。_configmap @value

System.TypeInitializationException: 'The type initializer for 'MySql.Data.MySqlClient.Replication.Re...-程序员宅基地

文章浏览阅读2.2k次。下午在调试的时候报错数据库连接就报错我就很纳闷后面用原来的代码写发现还是报错System.TypeInitializationException:'The type initializer for 'MySql.Data.MySqlClient.Replication.ReplicationManager' threw an exception.'应该是出在Mysql包上的问题..._system.typeinitializationexception:““mysql.data.mysqlclient.mysqlpoolmanag

树莓派上部署jeecg-boot快速开发平台_jeecgboot linux部署-程序员宅基地

文章浏览阅读249次。系统安装Ubuntu Server(可百度)更换软件源打开位置cd /etc/apt/编辑sources.listsudo nano sources.list使用清华的软件源镜像deb https://mirrors.ustc.edu.cn/ubuntu-ports/ focal main restricted universe multiversedeb https://mirrors.ustc.edu.cn/ubuntu-ports/ focal-updates main restricted univ_jeecgboot linux部署

C/C++操作YUV视频_c++读取yuv视频-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏5次。C/C++对YUV数据的一些操作_c++读取yuv视频

随便推点

Flutter混合开发-Null check operator used on a null value_flutter null check operator used on a null value-程序员宅基地

文章浏览阅读4.8k次。标题Flutter与Android混编在Android与Flutter混编中导入flutter的GetX框架时,配置getPages参数出错,在编译时不报错,但是运行之后,debug模式下出现红底白色的错误,错误显示为 Null check operator used on a null value,看一眼懵了,本地开发版本使用的是flutter2,配置的Getx库也确实在很早的版本中就支持了Null safety ,且配置的getPages为数组并且可为空,按照常理怎么也不可能出现这个错误!尝试的方案_flutter null check operator used on a null value

查看WIN10 SDK的版本_win10 sdk 版本好哪里查-程序员宅基地

文章浏览阅读4.4k次。查看WIN10 SDK的版本_win10 sdk 版本好哪里查

MFC C++改变控件字体大小颜色的方法_cfont设置字体大小-程序员宅基地

文章浏览阅读1.4k次。MFC C++改变控件字体大小颜色的方法_cfont设置字体大小

requests(网络请求库神器 )库快速上手_requests 在线请求工具-程序员宅基地

文章浏览阅读202次。关于requests(网络请求库神器 )库快速上手urllib、urllib2、urllib3、httplib、httplib2 都是和 HTTP 相关的 Python 模块,看名字就觉得很反人类,更糟糕的是这些模块在 Python2 与 Python3 中有很大的差异,如果业务代码要同时兼容 2 和 3,写起来会让人崩溃。好在,还有一个非常惊艳的 HTTP 库叫 requests,它是 ..._requests 在线请求工具

springboot使用EntityManager执行自定义SQL_springboot 执行自定义sql-程序员宅基地

文章浏览阅读2.9k次。1.在代码中注入 EntityManager import javax.persistence.EntityManager;@AutowiredEntityManager entityManager; 2.在方法中具体使用EntityManager public List<DefColumn> findAllColumns(String table) { Query query = entityManager.createNativeQue._springboot 执行自定义sql

MSYS2安装和使用_pacman windows-程序员宅基地

文章浏览阅读546次,点赞14次,收藏12次。msys2是一款跨平台编译套件,它模拟linux编译环境,支持整合mingw32和mingw64,能很方便的在windows上对一些开源的linux工程进行编译运行。更重要的是它支持pacman包管理器;这意味着你可以很方便的安装所需要的软件包和开发库,而不需要自己去找源码编译。_pacman windows