提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:这里可以添加本文要记录的大概内容:
例如:python越来越火,它可以做很多很多事。本人用它学习上位机,这次通过pyqt5和西门子plc200smart采用modbus_tcp通讯。
提示:以下是本篇文章正文内容,下面案例可供参考
代码如下(示例):
import modbus_tk.defines as md
import modbus_tk.modbus_tcp as mt
代码如下(示例):
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,后面别的类对我操作时,实际只对我这一个实例对象操作。在内存里只有一个内存地址。