如何使用 Python 构建 西门子PLC Snap7通信
如何使用 Python 构建西门子 PLC Snap7通信
PLC(Programmable Logic Controller)即可编程逻辑控制器,可以理解为一个微型计算机,广泛应用于工业控制领域中,包括楼宇智控、精密机床、汽车电子等等。
随着物联网的兴起,越来越多的传统工业设备需要和外界通信,但很多情况下,类似PLC的微控制器经常会由于自身硬件因素而无法与外界直接互联互通。PC作为一个中介桥梁,为PLC与外界的沟通打开了一扇门。
而Python作为当前最火的语言,不仅在AI、云计算等诸多方面都能看到它的身影,在工业控制中也不能少了它。本文就来分享下如何使用Python构建PC与PLC的通信,也算展示一把Python在工控领域的风采。
Snap7简介
当前市场上主流的PLC通信方式为网络通信和串行通信。网络通信这块主要协议有profinet,modbus-tcp等,串行通信主要是基于RS232/485的modbus。
本次接触到的是西门子S7系列的PLC,通信方式都为网络型的,而Snap7(http://snap7.sourceforge.net/)正是一个开源的、32/64位的、多平台的以太网通讯库:
支持多硬件体系结构(i386/x86_64、ARM/ARM64、Sun Sparc、Mips);
支持多系统(Windows、Linux、BSD、Solaris);
支持多语言(C/C++、Phyton、Node.js、Pascal、C#、VB)。
Python对其进行了封装,具体可以参见:https://github.com/gijzelaerr/python-snap7。
开发环境搭建
这里主要从Windows和Linux(Ubuntu)两个平台,说说如何搭建Python环境下的Snap7开发环境。Python的安装这里就不再赘述,环境搭建主要就是Snap7和python-snap7两个库的安装。
1、安装Snap7
Windows下,需要根据Python的结构版本(32位/64位),将下载的Snap7的发布库copy到对应的Python安装根目录下即可。
如上图所示,我的Python是32bit,所以需要将Snap7中Win32目录下的文件Copy到Python的安装根目录下,如下图所示:
Linux(Ubuntu)下安装相对简单些,按如下命令即可:
$ sudo -s
$ add-apt-repository ppa:gijzelaar/snap7
$ apt-get update
$ apt-get install libsnap71 libsnap7-dev
2、安装python-snap7
Snap7的Python库安装就简单很多了,不管是Windows还是Linux,直接pip安装即可。
$ pip install python-snap7
经过上面两步,环境就算搭建好了。通过一个连接测试代码试试,判断下环境是否搭建正常。
import snap7
client = snap7.client.Client()
client.connect(‘192.168.0.1’, 0, 1)
client.disconnect()
如果是下图提示,则环境正常(192.168.0.1的PLC不存在)。
如果是下图提示,则环境异常(snap7库安装不正确)。
读写PLC
环境搭建正常后,在正式建立通信前PLC还需做些配置工作,主要是开发自身的读写权限。具体参照下图配置:
通过上述配置,PLC可以正常通信了。
1、python-snap7读写分析
结合python-snap7的文档API和源码分析,python-sna7重要的两个方法是read_area和write_area,通过这两个方法就能读和写PLC的对应存储地址。
def read_area(self, area, dbnumber, start, size):
“”"This is the main function to read data from a PLC.
With it you can read DB, Inputs, Outputs, Merkers, Timers and Counters.
:param dbnumber: The DB number, only used when area= S7AreaDB
:param start: offset to start writing
:param size: number of units to read
“”"
assert area in snap7.snap7types.areas.values()
wordlen = snap7.snap7types.S7WLByte
type_ = snap7.snap7types.wordlen_to_ctypes[wordlen]
logger.debug("reading area: %s dbnumber: %s start: %s: amount %s: "
“wordlen: %s” % (area, dbnumber, start, size, wordlen))
data = (type_ * size)()
result = self.library.Cli_ReadArea(self.pointer, area, dbnumber, start,
size, wordlen, byref(data))
check_error(result, context=“client”)
return bytearray(data)
@error_wrap
def write_area(self, area, dbnumber, start, data):
“”"This is the main function to write data into a PLC. It’s the
complementary function of Cli_ReadArea(), the parameters and their
meanings are the same. The only difference is that the data is
transferred from the buffer pointed by pUsrData into PLC.
:param dbnumber: The DB number, only used when area= S7AreaDB
:param start: offset to start writing
:param data: a bytearray containing the payload
“”"
wordlen = snap7.snap7types.S7WLByte
type_ = snap7.snap7types.wordlen_to_ctypes[wordlen]
size = len(data)
logger.debug("writing area: %s dbnumber: %s start: %s: size %s: "
“type: %s” % (area, dbnumber, start, size, type_))
cdata = (type_ * len(data)).from_buffer_copy(data)
return self.library.Cli_WriteArea(self.pointer, area, dbnumber, start,
size, wordlen, byref(cdata))
从参数可见,需要提供PLC的区域地址、起始地址、读和写的数据长度。PLC能提供如下信息:
2、PLC数据存储和地址
通过阅读PLC的手册获取到如下信息:
PLC的数据存储通过Tag的形式与存储区间关联,分为输入(I)、输出(O)、位存储(M)和数据块(DB)。程序在访问对应(I/O)tag时,是通过访问CPU的Process Image Out对相应地址进行操作的。具体对应关系如下:
到这里就能明白python-snap7中定义的areas地址是什么含义了。
areas = ADict({
‘PE’: 0x81, #input
‘PA’: 0x82, #output
‘MK’: 0x83, #bit memory
‘DB’: 0x84, #DB
‘CT’: 0x1C, #counters
‘TM’: 0x1D, #Timers
})
现在离读写PLC还差最后一步,就是起始地址如何确定呢?
从上可见对于M3.4,对应的就是M(0x83),起始地址是3,对应bit位是4。
如何使用 Python 构建 PC 通信?
实战
经过上面的精心准备,下面就来一波实战。通过读写PLC的M10.1、MW201来具体看看如何读写PLC。
import struct
import time
import snap7
def plc_connect(ip, rack=0, slot=1):
“”"
连接初始化
:param ip:
:param rack: 通常为0
:param slot: 根据plc安装,一般为0或1
:return:
“”"
client = snap7.client.Client()
client.connect(ip, rack, slot)
return client
def plc_con_close(client):
“”"
连接关闭
:param client:
:return:
“”"
client.disconnect()
def test_mk10_1(client):
“”"
测试M10.1
:return:
“”"
area = snap7.snap7types.areas.MK
dbnumber = 0
amount = 1
start = 10
print(u’初始值’)
mk_data = client.read_area(area, dbnumber, start, amount)
print(struct.unpack(’!c’, mk_data))
print(u’置1’)
client.write_area(area, dbnumber, start, b’’)
print(u’当前值’)
mk_cur = client.read_area(area, dbnumber, start, amount)
print(struct.unpack(’!c’, mk_cur))
def test_mk_w201(client):
“”"
测试MW201,数据类型为word
:param client:
:return:
“”"
area = snap7.snap7types.areas.MK
dbnumber = 0
amount = 2
start = 201
print(u’初始值’)
mk_data = client.read_area(area, dbnumber, start, amount)
print(struct.unpack(’!h’, mk_data))
print(u’置12’)
client.write_area(area, dbnumber, start, b’’)
print(u’当前值’)
mk_cur = client.read_area(area, dbnumber, start, amount)
print(struct.unpack(’!h’, mk_cur))
time.sleep(3)
print(u’置3’)
client.write_area(area, dbnumber, start, b’’)
print(u’当前值’)
mk_cur = client.read_area(area, dbnumber, start, amount)
print(struct.unpack(’!h’, mk_cur))
if name == “main”:
client_fd = plc_connect(‘192.168.0.1’)
test_mk10_1(client_fd)
test_mk10_1(client_fd)
plc_con_close(client_fd)
从代码可见,MW201,根据M确定area为MK,根据W确定数据amount为2Btye,根据201确定start为201,读出来的数据根据数据长度用struct进行unpack,写数据对应strcut的pack。
这里给出PLC变量类型和大小,这样对应确定读写的amount。
如何使用 Python 构建 西门子PLC Snap7通信相关推荐
- python与西门子PLC通讯
python与西门子PLC通讯 安装Python-snap7 win+R打开"运行",输入cmd,确定后,进入DOS命令行终端,输入下面的命令: pip install pytho ...
- plc编程和python的联系_通过Python与西门子PLC通信
供大家想要与西门子PLC通信的朋友使用 1.该程序是通过python snap7连接西门子1200.1500系列PLC并按照I.Q.M区采集打印信息: 2.用户打开应用程序之前,要将目录下的snap7 ...
- 用python编写西门子plc程序_snap7读写西门子plc1200步骤(python)
本文是利用snap7进行对plc1200进行读写,所用语言是python3,windows7下,plc具体型号为S7-1212DC/DC/DC 1.snap7安装 win+R打开运行串口,输入cmd, ...
- sidirect 连接西门子_配置SIDirect DAServer 通过TCP/IP实现和西门子PLC的通信(1)-机电之家网PLC技术网...
无需借助西门子的Simaticnet 软件,SIDirect DAS Server 可以通过标准的以太网卡访问S7 200, S7 300,S7 400 家族PLC.SIDirect DAServer ...
- python plc_基于python的西门子plc数据采集系统
这个是网络上别人写的,采用的opc获取数据,然后通过tcp传回,采集器以tcp服务端存在,自己再写一个tcp客户端接收数据进行处理就好了. 技术环境: (1)采用python开发环境(32位),支持W ...
- 信捷plc485通信上位机_基于Snap7实现与西门子PLC通信
如果你对西门子PLC通信或者上位机开发稍微有一点研究的话,应该对Snap7有所耳闻. Snap7是一个基于以太网与西门子S7系列PLC通信的开源库,在世界领域应用很广.但也许是因为资料比较少,而且很多 ...
- C#上位机 西门子PLC通信 S7NET协议
C#上位机 西门子PLC通信 S7NET协议 1,西门子PLC网口通信,可通信S7-200smart,S7-1200,S7-1500. 2,例子简单易懂,自己写的程序,可提供部分 3,现场实测有效. ...
- 一种快速实现西门子PLC联网的解决方案
本文简要介绍一种常见的西门子PLC联网方案,供大家参考. 西门子PLC种类繁多,早期的很多设备不支持联网功能,因此,这些西门子PLC要联网,需要通过西门子PLC网关来实现.在本文中,我们采用市场广泛应 ...
- python零基础教学plc_利用Python构建电脑和PLC通信的方法
PLC(Programmable Logic Controller)即可编程逻辑控制器,可以理解为一个微型计算机,广泛应用于工业控制领域中,包括楼宇智控.精密机床.汽车电子等等. 随着物联网的兴起,越 ...
最新文章
- Dubbo序列化对象
- 部署yum仓库自动挂载服务
- oc58--Category注意事项
- php 元_PHP 享元模式 - 304158的个人空间 - OSCHINA - 中文开源技术交流社区
- access vba 用recordset读取表中数据的简单方法
- UVA654 LA5508 POJ1079 Ratio【暴力】
- 管理信息系统案例分析_BIM案例分析—地下空间工程(二)
- 中国互联网界有哪些风险投资、天使投资?
- 如何实现在 Vue 中嵌入代码编辑器 ?
- 计算机cpu任务管理器,任务管理器里CPU使用率过高问题
- 单元测试总结反思_考试反思,考试反思作文
- phpcms v9 栏目伪静态完全自定义为栏目英文目录名
- 计算机视觉最新进展概览2021年8月15日到2021年8月21日
- BEA提出SOA四大策略
- vue +高德地图 绘制围栏
- 安超OS为企业数字化转型构建坚实的云基座
- 基于matlab的相干信号的doa 估计,基于空间平滑MUSIC算法的相干信号DOA估计(1)
- 新泰一中2021年高考成绩查询,新泰一中2017年高考情况通报!最高分703分!新泰一中又牛了!!!...
- 直销立法,新闻频道报道
- 分享|智慧环卫规划方案(附PDF)
热门文章
- 远程服务器终端复用工具:tmux
- CPU性能指标之DMIPS、MIPS
- Smartbi:“最强大脑”智慧检务如何落地?智慧检务系统建设案例
- BFS解迷宫问题(经典BFS算法)
- 计算机四代发展史的应用领域,计算机发展历史和应用.doc
- 【框架】984- 2021 年最佳 JavaScript 框架
- 同城跑腿配送行业存的问题,如何解决?创业者有必要现在入局吗?
- 【考试指南】TiDB 5.0认证指南之PCTA PCTP
- python交叉验证法_详解python实现交叉验证法与留出法
- 前端web如何播放m3u8格式的视频