Python Snap7实现S7-1200 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字典

IQMDB/VCTTM
0x810x820x830x840x1C0x1D

使用教程

  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

后续

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

要连接多个S7-1200实现读写,你需要使用snap7库。以下是一个简单的Python代码示例,可以连接两个S7-1200并从它们读取数据: ```python import snap7 # 定义S7-1200的IP地址和端口号 plc1_ip = '192.168.0.10' plc1_port = 102 plc2_ip = '192.168.0.20' plc2_port = 102 # 连接到S7-1200 plc1 = snap7.client.Client() plc1.connect(plc1_ip, plc1_port) plc2 = snap7.client.Client() plc2.connect(plc2_ip, plc2_port) # 读取S7-1200的数据 data1 = plc1.read_area(snap7.types.Areas.DB, 1, 0, 10) data2 = plc2.read_area(snap7.types.Areas.DB, 1, 0, 10) # 输出读取的数据 print('Data from PLC1:', data1) print('Data from PLC2:', data2) # 关闭连接 plc1.disconnect() plc2.disconnect() ``` 在这个示例中,我们先定义了两个S7-1200的IP地址和端口号,并使用snap7库的client模块连接到这些S7-1200。然后,我们使用read_area方法从每个S7-1200的DB1区域读取了10个字节的数据,并将其存储在data1和data2变量中。最后,我们输出读取的数据并关闭连接。 如果你想写入数据,可以使用write_area方法来实现。例如,以下代码可以写入数据到两个S7-1200的DB1区域: ```python import snap7 # 定义S7-1200的IP地址和端口号 plc1_ip = '192.168.0.10' plc1_port = 102 plc2_ip = '192.168.0.20' plc2_port = 102 # 连接到S7-1200 plc1 = snap7.client.Client() plc1.connect(plc1_ip, plc1_port) plc2 = snap7.client.Client() plc2.connect(plc2_ip, plc2_port) # 写入数据到S7-1200 plc1.write_area(snap7.types.Areas.DB, 1, 0, b'Hello') plc2.write_area(snap7.types.Areas.DB, 1, 0, b'World') # 关闭连接 plc1.disconnect() plc2.disconnect() ``` 在这个示例中,我们使用write_area方法向每个S7-1200的DB1区域写入了一个字符串,并使用disconnect方法关闭了连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rosen.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值