python通过snap7与plc进行读写操作

基本语句

import snap7
import struct
plc = snap7.client.Client()
plc.connect('192.168.0.1', 0, 1)
if plc.get_connected():
    print('success')
else:
    print('fail')

通过返回值,得到是否连接成功。connect函数里的ip和你Plc的ip一致,0,1位一般为默认参数,是指代plc的网口插槽位置的。

下面介绍两个最最重要的函数:也就基本上只使用到这些:

read_area(area,dbnumber,start,size)
 
write(area,dbnumber,start,data)

第一个参数area位置可以填写下面三种,代表的类型分别是plc的输入输出和中间变量

area0x810x820x830x84
类型输入I输出 Q中间变量M数据块db

一般我们是通过控制M变量来控制Q的,而不直接对Q进行写入操作。

第二个参数是dbnumber,输入、输出、中间区域默认为0,db块就是块的序号,如果数据块_1,其实就是1号,所以写1。

第三和第四个参数是决定了读写的位置。

plc.write_area(0x83,0,3,struct.pack('B',4))

这里表示对中间M区中的M3.2位置写入1.

plc.write_area(0x83,0,3,`struct.pack('B',3)`)

如果把4改成3,那么就变成对中间M区中的M3.1,M3.0位置写入1.

struct.pack('B',3)

这个的意思是吧十进制的数转成二进制。这样就能实现只用一个数就能控制多个位置。譬如我输入十进制的15,那么二进制就是1111,这样就可以将4个位置全部置为1.

关于读取数据的转换
直接读取的结果往往是不能够直接用的,就像下面那一堆符号

>>> plc.read_area(0x83,0,8,4)
bytearray(b'@\x07/@')

snap7提供了util函数,可以很方便的实现转换

snap7.util.get_bool(_bytearray, byte_index, bool_index)# Get the boolean value from location in bytearray

snap7.util.get_int(_bytearray, byte_index)#Get int value from bytearray.  int are represented in two bytes

snap7.util.get_real(_bytearray, byte_index) # Get real value. create float from 4 bytes

举个例子
MD8的寄存器位置存储了一个Real类型的数
在这里插入图片描述

>>> plc.read_area(0x83,0,8,4)#直接读出来的结果
bytearray(b'@\x07/@')
>>> snap7.util.get_real(data,0)#转换后的结果
2.1122589111328125

这样就实现了对模拟量的读取了

最后通过

plc.disconnect()

断开链接


版权声明:本文为qq_37501211原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。