PLC(Programmable Logic Controller)即可编程逻辑控制器,可以理解为一个微型计算机,广泛应用于工业控制领域中,包括楼宇智控、精密机床、汽车电子等等。

随着物联网的兴起,越来越多的传统工业设备需要和外界通信,但很多情况下,类似PLC的微控制器经常会由于自身硬件因素而无法与外界直接互联互通。PC作为一个中介桥梁,为PLC与外界的沟通打开了一扇门。

而Python作为当前最火的语言,不仅在AI、云计算等诸多方面都能看到它的身影,在工业控制中也不能少了它。本文就来分享下如何使用Python构建电脑和PLC通信,也算展示一把Python在工控领域的风采。

Snap7简介

当前市场上主流的PLC通信方式为网络通信和串行通信。网络通信这块主要协议有profinet,modbus-tcp等,串行通信主要是基于RS232/485的modbus。

本次接触到的是西门子S7系列的PLC,通信方式都为网络型的,而Snap7正是一个开源的、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两个库的安装。

安装Snap7请查看《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 canreadDB, Inputs, Outputs, Merkers, TimersandCounters.

:param dbnumber: The DBnumber,onlyused when area= S7AreaDB

:paramstart:offsettostart writing

:param size:numberof unitstoread

"""

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")

returnbytearray(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

complementaryfunctionofCli_ReadArea(),theparametersandtheir

meanings are the same. Theonlydifferenceisthat the datais

transferred from thebufferpointed by pUsrData into PLC.

:param dbnumber: The DBnumber,onlyused when area= S7AreaDB

:paramstart:offsettostart writing

:param data:abytearray 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)

returnself.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。

实战

经过上面的精心准备,下面就来一波实战。通过读写PLC的M10.1、MW201来具体看看如何读写PLC。

importstruct

importtime

importsnap7

defplc_connect(ip, rack=, slot=1):

"""

连接初始化

:param ip:

:param rack: 通常为0

:param slot: 根据plc安装,一般为0或1

:return:

"""

client = snap7.client.Client()

client.connect(ip, rack, slot)

returnclient

defplc_con_close(client):

"""

连接关闭

:param client:

:return:

"""

client.disconnect()

deftest_mk10_1(client):

"""

测试M10.1

:return:

"""

area = snap7.snap7types.areas.MK

dbnumber =

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))

deftest_mk_w201(client):

"""

测试MW201,数据类型为word

:param client:

:return:

"""

area = snap7.snap7types.areas.MK

dbnumber =

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来个跑马灯。

python零基础教学plc_利用Python构建电脑和PLC通信的方法相关推荐

  1. c语言python零基础教学_编程零基础应当如何开始学习 Python?附教程

    零基础学编程,用python入门是个不错的选择,虽然国内基本上还是以c语言作为入门开发语言,但在国外,已经有很多的学校使用python作为入门编程语言.此外,python在机器学习,人工智能领域也非常 ...

  2. python零基础能学吗-Python编程语言好学吗?零基础转行能学Python吗?

    Python编程语言好学吗?零基础转行能学Python吗?人工智能时代的来临催生了很多新兴行业,Python是最具代表性也是比较热门的技术之一.有人看好Python入门简单.功能强大的特性,选择转行从 ...

  3. c语言python零基础教学_编程零基础应当如何开始学习 Python?

    目录 1.学习了解Python的基础知识. 2.安装Python,边学边练. 3.收集资料,作为练习指引. 4.确定学习方向,项目练手. 5.学习过程中要注意多练.多问! 编程零基础选择Python开 ...

  4. python零基础能学吗-python 零基础该怎么学?

    谁知道你认真学是怎么学,反正最起码也要五个月到一年吧.才能说是稍微懂一点这些东西了吧. 这是学python需要下载的软件集合. 软件 提取码:38lh 学python的就业方向如图. /> Py ...

  5. python零基础入门教程会计-Python 19会计(Z)

    spContent=本课基于主讲教师在北京大学讲授数据结构与算法课(Python版)的多年教学实践经验,面向零编程基础的大学生和社会公众,全面讲授Python语言基础,培养学生计算思维的能力,并讲解P ...

  6. 【python零基础入门学习】Python入门,带你快速学习为什么那么多人想学 Python?

    最近,网上流传一组<人工智能实验教材>的图片,照片火起来的原因是教材是为幼儿园的小朋友们设计的! [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aJF1cH ...

  7. python零基础能学吗-Python真的零基础可以学会吗?

    Python语言简单,对新手极其友好,但想要零基础学习,还需要解决一些基本问题,不能蛮干. 首先要弄明白自己的需求.为什么要学Python? 我学Python是想要给自己带来什么? 能够解决我的什么问 ...

  8. python零基础能学吗-python零基础能学吗

    Python是一门高级编程语言,而且Python语言适合零基础人员学习,也是初学者的首选. 如何学习好Python: 1. 要有决心 做任何事情,首先要有足够的决心和坚持,才能做好事情.学好Pytho ...

  9. Python零基础入门篇㉕〗- Python字典的常用方法

    订阅 Python全栈白宝书-零基础入门篇 可报销!白嫖入口-请点击我.推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 Python全栈白宝书专栏,免费阶段订阅数量43 ...

最新文章

  1. 26 进程优先级队列Queue
  2. ASP.NET MVC中权限控制的简单实现
  3. plsql 记录型变量
  4. android转流媒体,android 4.4中的流媒体渲染过程
  5. jmeter里的连接数_Jmeter之连接问题
  6. (八)Locust 设置断言
  7. REDHAT5.6dhcp服务器及dhcp中继代理配置
  8. 拓端tecdat|R语言rcurl抓取问财财经搜索网页股票数据
  9. python快速编辑入门答案_1.1、Python快速入门(0529)
  10. 网管世界 网管生活 网管总结
  11. SVG霍比特人电影标题样式
  12. Drain:在线实时日志解析方法
  13. MySQL有几部分_数据库系统有哪几部分组成?
  14. YOYOW-WeCenter特别版免费开源发布,一小时建立你的问答社区
  15. QUALCOMM MDM9X15 LCD初始化流程
  16. Linux ubuntu下载vim
  17. 2021支付宝集五福【最全攻略】!
  18. 【单调队列优化dp】jzoj4883灵知的太阳信仰 纪中集训提高B组
  19. android studio manifest merger failed,Android Studio报错Manifest merger failed with multiple errors...
  20. 学习水泵相关知识:基本参数、特性曲线及工况的确定

热门文章

  1. 量子计算机时空穿越,科学家用量子计算机模拟时间机器 人类能否回到过去?...
  2. 前端传递给后端且通过cookie方式,尽量传递id
  3. hdu 5901 Count primes 素数计数模板
  4. 收缩 虚拟硬盘 shrink vhd
  5. android style 与theme的区别
  6. [导入](原创)我和李昊原师兄优化的一个分页,用来应对200000条以下数据
  7. [转载] 浅析Java OutOfMemoryError
  8. 『计算机视觉』Mask-RCNN_推断网络终篇:使用detect方法进行推断
  9. Oracle 04-Oracle创建数据库
  10. C# XXX.XmlSerializers”的程序集未能加载到..