如何使用 Python 构建 PC 通信?
PLC(Programmable Logic Controller)即可编程逻辑控制器,可以理解为一个微型计算机,广泛应用于工业控制领域中,包括楼宇智控、精密机床、汽车电子等等。
随着物联网的兴起,越来越多的传统工业设备需要和外界通信,但很多情况下,类似PLC的微控制器经常会由于自身硬件因素而无法与外界直接互联互通。PC作为一个中介桥梁,为PLC与外界的沟通打开了一扇门。
而Python作为当前最火的语言,不仅在AI、云计算等诸多方面都能看到它的身影,在工业控制中也不能少了它。本文就来分享下如何使用Python构建PC与PLC的通信,也算展示一把Python在工控领域的风采。
当前市场上主流的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。
实战
经过上面的精心准备,下面就来一波实战。通过读写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来个跑马灯。
声明:本文为作者投稿,原载于个人公众号chafezhou,版权归作者所有。
“征稿啦!”
CSDN 公众号秉持着「与千万技术人共成长」理念,不仅以「极客头条」、「畅言」栏目在第一时间以技术人的独特视角描述技术人关心的行业焦点事件,更有「技术头条」专栏,深度解读行业内的热门技术与场景应用,让所有的开发者紧跟技术潮流,保持警醒的技术嗅觉,对行业趋势、技术有更为全面的认知。
如果你有优质的文章,或是行业热点事件、技术趋势的真知灼见,或是深度的应用实践、场景方案等的新见解,欢迎联系 CSDN 投稿,联系方式:微信(guorui_1118,请备注投稿+姓名+公司职位),邮箱(guorui@csdn.net)。
PLC工程师学习Python的重要性
#挑战30天在头条写日记#
随着技术的发展,跨学科的知识变得日益重要。PLC工程师传统上在工业自动化和控制领域中扮演关键角色,而Python作为一种广泛使用的通用编程语言,为PLC工程师打开了许多新的门。以下是PLC工程师学习Python的主要好处:
数据分析与处理 :在现代生产环境中,大量的数据需要被收集、处理和分析。Python有许多强大的库,如Pandas和NumPy,可以用于数据处理和分析,使工程师能够从复杂的数据中提取有用的信息。集成与通信 :Python提供了与其他系统通信的工具,允许PLC与更广泛的IT架构更加紧密地集成。这意味着工程师可以使用Python进行高级通信和数据交换,例如与数据库或云平台。开发自定义工具 :有时,标准软件工具不能满足特定的需求。使用Python,PLC工程师可以快速开发自定义的工具,例如自动化测试脚本或特定的数据可视化工具。机器学习和人工智能 :随着工业4.0的兴起,机器学习和AI在制造领域中的应用也越来越广泛。Python是机器学习的主要编程语言,工程师可以利用它进行预测性维护、产品质量分析和优化生产流程。提高工作效率 :Python是一种易于学习且具有高生产力的语言,它的简洁性使得开发速度更快,错误更少。这使得工程师在开发过程中更加高效。市场竞争力 :随着工业和IT领域的日益融合,具有Python编程能力的PLC工程师将更具市场竞争力,能够胜任更多的跨学科项目。个人发展与职业前景 :不断地学习和扩展自己的技能集是每位工程师的职责。学习Python不仅可以为PLC工程师打开新的职业机会,还可以加深对现代技术趋势的理解。总之,对PLC工程师来说,学习Python意味着不仅可以提高他们在工业自动化领域的专业能力,还可以更好地适应现代工业的多变和多学科的需求,使自己始终处于行业的前沿。
相关问答
python与plc哪个有前途?
作为一个过来人,在此郑重回答,PYTHON比PLC有前途的多!或者说,任何一种程序员用的编程语言,玩好了,都比PLC有前途!PLC这个行业是工控,工控门槛太低,玩的...作...
PLC学会了,有必要学python吗?
python很有意思,学过一段时间,其中有些语法跟PLC的ST语言很像,不过我觉得当个爱好学学还行,以后打算入行靠这个吃饭我觉得还是把PLC搞精通比较好,个人观点不...
plc工资一般多少?
首先这个和所处的城市,行业,技术能力,人际关系,公司等有关系,3000到2万的工资都是有的。如果你刚毕业,在一线城市,去的一般公司,工资给到5K,我觉得算是...一类...
计算机语言入门学哪个好,是JAVA,C++,PYTHON吗?
作为一名IT从业者,同时也是一名教育工作者,我来回答一下这个问题。首先,Java、C++和Python这三门编程语言都是当前流行程度比较高的编程语言,其中Java和Pyth...
为什么matlab和Python那么相似,包括语法和功能函数?
不是相似的问题,就是一脉相通~你说CAD和CACX怎么这么相似,不就就是基于平面几何吗~为什么PROE,solidworks,UG这么相似,不就是基于立体几何吗~还能跑到哪去,...
编程学哪个好呢?
真是太可怕了,看了前面几位大神的评论。我表示超级震惊!第一次听说过C上手比JavaEE容易的。面向过程编程vs面向对象编程哪一个更容易让新手理解?C前期的薪...
大学学的是自动化,现在有plc三级证书,可以从事什么工作?
你可以从事的工作太多了,说都说不完,主要是不知你可以做多久。plc有等级证好像在一个技校听过,但我可以告诉你这证屁用都没有,所有单位都不会看你这个证,外...如...
你编程入门的第一门语言是哪一个?怎么学?
第一次接触且入门的编程语言是c语言。我本科为车辆工程专业,没有接触编程;但研究生为机电一体化,因为要做一个自动...因为每一门语言都会有相关机构大肆吹嘘这门...
做电气维修的学编程语言接受会快些吗?(个人感觉这和编程逻辑...
(个人感觉这和编程逻辑性相同的)我的专业是机电一体化的,N多年以前的我们学校就一台386老爷机(在学校没摸过电脑)没学过C,就连机械,电器元件图都要手画的...
机械手编程要学多久才会?
plc自动化编程一般都是C/C++javaPython等一些编程语言楼上不懂瞎说误人plc自动化编程一般都是C/C++javaPython等一些编程语言楼上不懂瞎说误人