Python基于Snap7与PLC建立连接并读写数据

这篇具有很好参考价值的文章主要介绍了Python基于Snap7与PLC建立连接并读写数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

       最近偶尔在网上看到可以用Python通过snap7与PLC建立连接并读写数据,好多小伙伴没有现成的PLC,这里介绍一个电脑模拟PLC与python通讯。效果与实际情况一样的。这里是以SIEMENS的PLC为例,通过Pycharm与TIA V17建立连接,对其DB块、M区、Q区、I区读写数据。后面还添加了200系列V区的读写数据。请注意在程序中个别只对200专用!200系列的PLC不能模拟,也就不能用那个通讯工具了,直接与PLC通讯就好了。

一、安装Snap7安装包

1、在下载的1.4.2文件夹中找到文件

Python基于Snap7与PLC建立连接并读写数据

2、将这两个文件拷贝到python的安装目录include中

Python基于Snap7与PLC建立连接并读写数据

3、cmd中输入 pip install python-snap7,打开pycharm查看snap7是否安装成功,然后导入snap7包

二、安装SIEMEN的编程软件TIA V17

Python基于Snap7与PLC建立连接并读写数据

按照参考链接打开TIA V17仿真,建立好变量连接在线:

Python基于Snap7与PLC建立连接并读写数据

三、西门子PLC连接工具NetToPLCsim,修改IP地址和端口

4、以管理员身份打开NetToPLCsim软件,如果102端口被占用,会提示重新获取102端口,在弹窗里点击【是】。

Python基于Snap7与PLC建立连接并读写数据

等待端口修改成功。

Python基于Snap7与PLC建立连接并读写数据

点击【Add】,填写电脑和PLC设备的IP地址,电脑和PLC设备的IP地址最好一样。

Python基于Snap7与PLC建立连接并读写数据

填写完毕后点击【Start Server】。

Python基于Snap7与PLC建立连接并读写数据

四、测试程序

运行程序就可以测试是否可以读取PLC中数据和写入PLC数据,以下是测试代码,在参考文章中读写都是用区域代码,但是实际测试无法匹配到区域代码。还有读写DB块和M区、Q区、I区的方法稍有不同需要注意。

import snap7
from snap7.util import *

plc = snap7.client.Client()
plc.set_connection_type(3)  # (200专用)


# 定义Plc连接
def plc_connect(ip, rack, slot):
    plc.connect(ip, rack, slot)
    if plc.get_connected():
        print("连接成功")


# PLC断开连接
def plc_disconnect():
    plc.disconnect()


def dbRead(dbnum, dblength):
    """
    DB块的读操作;如果是200smart系列的将dbnum设置为0
    :param dbnum:
    :param dblength:
    :return:
    """
    data = plc.read_area(snap7.types.Areas.DB, dbnum, 0, dblength)
    print(get_int(data, 0))
    print(get_bool(data, 2, 0))
    print(get_dword(data, 4))
    print(get_real(data, 8))
    print(get_bool(data, 0, 0))
    print(get_byte(data, 2))


def dbWrite(dbnum, dblength):
    """
    DB块的写操作;如果是200smart系列的将dbnum设置为0
    :param dbnum: DB块的序号
    :param dblength:
    :return: 字节长度,根据需要设定
    """
    data = plc.read_area(snap7.types.Areas.DB, dbnum, 0, dblength)
    # set_int(data, 0, 20)
    # set_bool(data, 2, 0, False)
    # set_dword(data, 4, 1000)
    # set_real(data, 8, 11.3)
    # set_int(data, 12, 99)
    set_bool(data, 0, 0, False)  # 设置DBD0.DBX0.0为False
    # set_byte(data, 2, 2)
    # set_int(data, 4, 100)

    plc.write_area(snap7.types.Areas.DB, dbnum, 0, data)
    print('写入成功!!!')


def mRead1(num, bit):
    """
    M区的读操作--------bool
    :param num:
    :param bit:
    :return:
    """
    data = plc.read_area(snap7.types.Areas.MK, 0, num, 1)
    print(get_bool(data, 0, bit))


def mRead2(num):
    """
    M区的读操作--------int/word/dint/dword
    :param num:
    :return:
    """
    data = plc.read_area(snap7.types.Areas.MK, 0, num, 2)
    print(get_int(data, 0))  # 读取MW0值
    print(get_byte(data, 0))  # 读取MB0值
    print(get_dint(data, 0))  # 读取MD0值


def mWrite1(byte, bit, value):
    """
    M块的写操作---------bool
    :param byte:
    :param bit:
    :param value:
    :return:
    """
    data = plc.read_area(snap7.types.Areas.MK, 0, byte, 1)
    set_bool(data, 0, bit, value)
    plc.write_area(snap7.types.Areas.MK, 0, byte, data)


def mWrite2(byte, value):
    """
    M块的写操作---------int/word/dint/dword
    :param byte:
    :param value:
    :return:
    """
    data = plc.read_area(snap7.types.Areas.MK, 0, byte, 4)
    # set_int(data, 0, value)
    set_dint(data, 0, value)
    plc.write_area(snap7.types.Areas.MK, 0, byte, data)


def qRead1(byte, bit):
    """
    Q区的读操作-------------bool
    :param byte:
    :param bit:
    :return:
    """
    data = plc.read_area(snap7.types.Areas.PA, 0, byte, 1)
    print(get_bool(data, 0, bit))


def qRead2(byte):
    """
    Q区的读操作-------------byte/int/word/dint/dword
    :param byte:
    :return:
    """
    data = plc.read_area(snap7.types.Areas.PA, 0, byte, 2)
    # print(get_byte(data, 0))
    print(get_int(data, 0))
    # print(get_dint(data, 0))


def qWrite1(byte, bit, value):
    """
    Q区的写操作----------bool
    :param byte:
    :param bit:
    :param value:
    :return:
    """
    data = plc.read_area(snap7.types.Areas.PA, 0, byte, 1)  # read_area的SIZE参数,这里默认位一个字节
    set_bool(data, 0, bit, value)
    plc.write_area(snap7.types.Areas.PA, 0, byte, data)


def qWrite2(byte, value):
    """
    Q区的写操作----------int/word/dint/dword
    :param byte:
    :param value:
    :return:
    """
    data = plc.read_area(snap7.types.Areas.PA, 0, byte, 2)  # read_area的SIZE参数,int-2;dint-4
    set_int(data, 0, value)   # 读取QW0值
    # set_dint(data, 0, value)
    plc.write_area(snap7.types.Areas.PA, 0, byte, data)


def iRead1(byte, bit):
    """
    输入映象区的读操作-------bool
    :param byte:
    :param bit:
    :return:
    """
    data = plc.read_area(snap7.types.Areas.PE, 0, byte, 1)  # Size参数,这里我们定义为1个字节的长度
    print(get_bool(data, 0, bit))


def iRead2(byte):
    """
    输入映象区的读操作-------byte/int/word/dint/dword
    :param byte:
    :return:
    """
    data = plc.read_area(snap7.types.Areas.PE, 0, byte, 2)  # Size参数,这里我们定义为1个字节的长度
    # print(get_byte(data, 0))
    print(get_int(data, 0))
    # print(get_dint(data, 0))


if __name__ == '__main__':
    plc_connect('192.168.1.10', 0, 1)
    dbRead(1, 4)
    dbWrite(1, 4)
    mRead1(20, 2)
    mRead2(100)
    mWrite1(20, 6, True)
    mWrite2(22, 100)
    qRead1(100, 5)
    qRead2(200)
    qWrite1(100, 5)
    iRead1(99, 7)
    iRead2(122)
    plc_disconnect()

TIA V17 链接:https://pan.baidu.com/s/1vfzzDhqKLy49pl9V0AINsA    提取码:hmn8

西门子PLC连接工具 ,NetToPLCsim;NetToPLCSim download | SourceForge.net

Snap7 链接: https://pan.baidu.com/s/1--Zhwj1gs417rpLrpV1QKQ     提取码: qtnm

参考:通讯测试工具和博图仿真机的连接教程

           Python读写PLC文章来源地址https://www.toymoban.com/news/detail-469636.html

到了这里,关于Python基于Snap7与PLC建立连接并读写数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 通过Python连接 modbus tcp 和台达PLC通信测试记录

    安装台达梯形图软件 “WPLSoft” http://downloadcenter.delta-china.com.cn/DownloadCenter?v=1q=WPLsort_expr=cdatesort_dir=DESC 2.硬件连接 2.1 电脑网卡 连接PLC以太网, IP设为192.168.1.x网段,PLC默认IP为192.168.1.5. 2.2 PLC 供电24V, S/S输入公共端接GND,UP0/ZP0输出驱动电源的端口接GND / 24V 2.3 在 PLC X0输入触

    2024年01月23日
    浏览(52)
  • 组态王和plc之间如何建立通讯?

    这两者之间可以有很多种通讯方式,比如:PROFIBUS、MPI、以太网、DDE、OPC、MODBUS、自由口等,主要还是要看你的PLC选型,以及组网方式。 现在最常见,也最常用的大概要数RS485,MODBUS协议下的无线通讯方式了。我们假定是组态王与西门子S7-200 Smart 之间进行MODBUS 通信。这时组

    2024年02月06日
    浏览(36)
  • 汇川PLC如何连接电脑进行数据通信和远程上下载

    一台可联网操作的电脑 一台单网口的远程透传网关及博达远程透传配置工具 网线一条,用于实现网络连接和连接PLC 一台汇川PLC及其编程软件InoPrShop 一张4G卡或WIFI天线实现通讯(使用4G联网则插入4G SIM卡,WIFI联网则将WIFI天线插入USB口) 1.将网关通电,用网线将网关和电脑进行

    2024年04月09日
    浏览(233)
  • 在Ubuntu下载Python3.6 并建立软连接

    打开终端,输入su root,进入root模式 为了避免权限问题  安装zlib1g-dev 1.然后创建目录 2.进入python3目录 3.从官网下载好python3.6.2 4.然后把刚才下载的python3.6.2安装包解压在/usr/local/python3下 5.配置一下安装目录 6.编译安装 7.建立软链接 注意:如果只执行第二句可能出现以下错误

    2024年01月17日
    浏览(27)
  • kettle与MySQL数据库建立连接教程

    1、下载mysql8.0的jar驱动 https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.28 2、将下载好的mysql的驱动放到kettle安装文件中的lib下面,然后重启Spoon 3 、建立连接的两种方式 第一种方式:数据库 连接

    2024年02月04日
    浏览(49)
  • C#、JAVA读写PLC物联网Modbus

    Modbus协议是一种常用于工业自动化领域的通信协议,它使用简单、易实现、可靠的特点得到了广泛应用。物联网中的设备也需要使用Modbus协议进行通信。本文将介绍物联网Modbus通信的相关内容。 一、Modbus协议简介 Modbus协议是一种串行通信协议,它最初由Modicon公司在1979年发布

    2024年02月10日
    浏览(41)
  • Java-JDBC建立数据库连接(MySQL)

    注意:连接数据需要先在JAVA中导入mysql的jar包。 1.1—下载JAR包 1、打开浏览器搜索MySQL,进入官网 2、点击DOWNLOADS    3、点击 MySQL Community (GPL) Downloads  4、点击Connector/J 5、点击Archieve 6、选择版本,和OS,然后点击下载即可。          版本号 下载地址 8.0.32 https://download

    2024年02月03日
    浏览(71)
  • python 与PLC 基于 modbus tcp 协议通讯

    Modbus是一种串行通信协议,是工业领域通信协议的业界标准,是工业电子设备之间常用的连接方式。最近在工作中需要上位机python程序和PLC做通讯,就测试了下使用modbus tcp 通讯。         目前实际测试结果是与西门子PLC/信捷PLC都可以正常通讯使用,但是看到网上说可以传输

    2024年02月17日
    浏览(43)
  • TCP 编程探秘:建立连接、数据传输与多路复用的精髓

    函数名 用法 参数 返回值 说明 socket int socket(int domain, int type, int protocol); domain : 协议族 type : 套接字类型 protocol : 协议类型 成功时返回套接字描述符,失败时返回 -1 创建一个套接字 bind int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); sockfd : 套接字描述符 addr : 指向地址结

    2024年02月03日
    浏览(31)
  • maven如何建立JavaWeb项目并连接数据库,验证登录

    这里是建立建立web项目:Maven如何创建Java web项目(纯干货版)!!!_明天更新的博客-CSDN博客 我们主要演示如何连接数据库验证登录。 1.在webapp目录下创建我们的登录页面:index.jsp    还需要再写一个验证登录成功的页面(如果页面跳转成功就代表登录成功)  内容如下:

    2024年02月13日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包