python (pyqt5)和西门子200smartPLC通讯

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、思路
  • 二、使用步骤
    • 1.引入库
    • 2.读入数据
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

例如:python越来越火,它可以做很多很多事。本人用它学习上位机,这次通过pyqt5和西门子plc200smart采用modbus_tcp通讯。


提示:以下是本篇文章正文内容,下面案例可供参考

1.引入库

代码如下(示例):

 


import modbus_tk.defines as md
import modbus_tk.modbus_tcp as mt

2.创建一个类封装

 

代码如下(示例):


def  connect_plc(ip='127.0.0.0',port=502):
    try:
         master = mt.TcpMaster(ip, port)
         master.set_timeout(5.5)
         return master
    except Exception as e:
        print('wrong')

master=connect_plc('192.168.5.100',502)

class Plc():
    '''
    功能码                         编号              含义

    READ_COILS                   H01               读线圈
    READ_DISCRETE_INPUTS         H02               读离散输入
    READ_HOLDING_REGISTERS       H03              读保持寄存器
    READ_INPUT_REGISTERS         H04              读输入寄存器(模拟量)
    WRITE_SINGLE_COIL            H05              写单一线圈
    WRITE_SINGLE_REGISTER        H06              写单一寄存器
    WRITE_MULTIPLE_COILS         H15              写多个线圈
    WRITE_MULTIPLE_REGISTERS     H16              写多个寄存器

    '''

    # VERSION 2.0 引入单例模式

    def __init__(self,master):
        self.master=master

    def get_01(self, adr=0, num=0):  # 读线圈Q区
        db = self.master.execute(slave=1, function_code=md.READ_COILS, starting_address=adr, quantity_of_x=num)
        return db

    def get_02(self, adr=0, num=0):  # 读输入信号
        db = self.master.execute(slave=1, function_code=md.READ_DISCRETE_INPUTS, starting_address=adr,
                                 quantity_of_x=num)
        return db

    def get_03(self, adr=0, num=0):  # 读保持寄存器
        db = self.master.execute(slave=1, function_code=md.READ_HOLDING_REGISTERS, starting_address=adr,
                                 quantity_of_x=num)
        return db

    def get_04(self, adr=0, num=0):  # 读保持寄存器
        db = self.master.execute(slave=1, function_code=md.READ_INPUT_REGISTERS, starting_address=adr,
                                 quantity_of_x=num)
        return db

    def set_05(self, adr=0, value=0):  # 写单个线圈
        db = self.master.execute(slave=1, function_code=md.WRITE_SINGLE_COIL, starting_address=adr, output_value=value)

    def set_06(self, adr=0, value=0):  # 写单个寄存器
        db = self.master.execute(slave=1, function_code=md.WRITE_SINGLE_REGISTER, starting_address=adr,
                                 output_value=value)

    def set_15(self, adr=0, value=[]):  # 写多个线圈
        db = self.master.execute(slave=1, function_code=md.WRITE_MULTIPLE_COILS, starting_address=adr,
                                 output_value=value)

    def set_16(self, adr=0, value=[]):  # 写多个寄存器
        db = self.master.execute(slave=1, function_code=md.WRITE_MULTIPLE_REGISTERS, starting_address=adr,
                                 output_value=value)



new_plc=Plc(master)#建立一个plc对象

该处创建一个单例模式。


总结

 

1.我这里读取定义了一个函数读取plc的IP地址和port端口号,实际项目中要创建个文本文件,然后读取进来。这样别人就可以随便改Plc的地址。这里为了方便,直接写再代码里了。

2.类的方法名都用get加数字组合标识读取(如get_01(),set和数字组合表示写入(如:set_05())。后面的数字就是功能码,刚开始学习始,会对modbus的功能码很头疼,这里这样设置,用几次就记住了。

3.后面创建了单例模式。之前不明白设计模式,等到自己设计项目时就会想到各种情况,你所想的问题,别人也会想到。所谓单例模式就是一个实例。在这里可以理解我我就连了一个PLC,后面别的类对我操作时,实际只对我这一个实例对象操作。在内存里只有一个内存地址。

你可能感兴趣的:(python,机器学习,pandas,pyqt)