带有 Python 的 Modbus TCP 服务器

Posted

技术标签:

【中文标题】带有 Python 的 Modbus TCP 服务器【英文标题】:Modbus TCP server with Python 【发布时间】:2022-01-14 19:44:21 【问题描述】:

我正在使用 Python 启动一个程序。我想将 Python 的一些信息发送到 Simply Modbus TCP Client。说实话我真的不会用 Python,同时我也在学习 Modbus。

我收到的错误消息是:

runfile('C:/Users/rafa_/OneDrive/Área de Trabalho/TCC_v.0/2/simhvac.py', wdir='C:/Users/rafa_/OneDrive/Área de Trabalho/TCC_v.0/2')
Erro:  ("'Hvac' object has no attribute '_server'",) 

我的代码在那里(有人可以帮助我):

from threading import Thread
from pyModbusTCP.server import DataBank, ModbusServer
from time import sleep
import time

class ServidorMODBUS():
    
    """ Classe Servidor Modbus"""
    
    def __init__(self, host_ip, port):
        
        """construtor"""
        
        self._server = ModbusServer(host=host_ip, port=port, no_block=True)
        self._db = DataBank
        
class Hvac(Thread):

    def __init__(self):
        Thread.__init__(self)
        self.Ts = 0.5           # Sampling period in seconds

        # Initial conditions
        self.temperature = 25 # Initial temperature (Celsius degree)
        self.co2 = 400        # Initial CO2 concentration (ppm)
        self.humity = 33      # Initial Humidity (% RH) 

        self.number_of_occup = 1
        self.co2_air_inlet = 200
        self.T_air = 23

        self.T_ac = 20
        self.H_ac = 90
        self.H_air = 90


        # CO2 Parameters
        self.co2_params = 
            'a1': -0.8964, 
            'kn': 2.108,
            'ki': 0.0579, 
            'kd': self.Ts
         

        # Temperature Parameters
        self.temperature_params = 
            'beta_i1'  : -1.179,
            'beta_i2'  : 0.2567, 
            'alfa_ac'  : 0.0043,
            'alfa_air' : 0.0762,
            'alfa_0'   : 0.0013,
            'alfa_1'   : -9.96E-4,
            'alfa_I'   : -3.06E-4
        

        # Humity Parameters
        self.humity_params = 
            'delta_i1'  : -1.6696,
            'delta_i2'  : 0.6844,
            'gamma_ac'  : -2.83E-4,
            'gamma_air' : 0.0147,
            'gamma_T'   : 2.16E-4,
            'gamma_0'   : 0.0016,
            'gamma_1'   : 0.0018,
            'gamma_I'   : 4.98E-5
        


    def run(self):

        co2 = [self.co2, self.co2]
        temp = [self.temperature, self.temperature]
        humity = [self.humity, self.humity]

        co2_il = [self.co2_air_inlet, self.co2_air_inlet]

        """Execuçao MODBUS"""
        
        try:
            self._server.start()
            print("Servidor MODBUS online")
            while True:
              
                t = time.time()
                # Process CO2, temperature, humity
                (a1, kn, ki, kd) = self.co2_params.values()
                n = self.number_of_occup
                i = self.co2_air_inlet
                d = 0 # disturbance
                self.co2 = kn*n + ki*i + kd*d - a1*co2[0]
    
                (beta_i1, beta_i2, alfa_ac, alfa_air, alfa_0, alfa_1, alfa_I) = self.temperature_params.values()
                T_ac = self.T_ac
                T_air = self.T_air
                self.temperature = alfa_ac*T_ac+alfa_air*T_air+alfa_0*co2[0]+alfa_1*co2[1]+alfa_I*co2_il[1] - beta_i1*temp[0]-beta_i2*temp[1]
    
    
                (delta_i1,delta_i2,gamma_ac,gamma_air,gamma_T,gamma_0,gamma_1,gamma_I) = self.humity_params.values()
                H_ac = self.H_ac
                H_air = self.H_air
                self.humity = gamma_ac*H_ac+gamma_air*H_air+gamma_T*self.temperature+gamma_0*co2[0]+gamma_1*co2[1]+gamma_I*co2_il[1]-delta_i1*humity[0]-delta_i2*humity[1]
                
                # Update delays
                co2 = [self.co2, co2[0]]
                temp = [self.temperature, temp[0]]
                humity = [self.humity, humity[0]]
                co2_il = [self.co2_air_inlet, co2_il[0]]
                
                print('CO2:', self.co2, 'Temp:', self.temperature, 'Humidity:', self.humity)
                time.sleep(self.Ts-(time.time()-t))
                
                self._db.set_words(1000, co2, temp, humity, co2_il)
                print("________________")
                print("Tabela MODBUS")
                print(f'Holding Register \r\n R1000: self.db.get_words(1000)\r\n R2000 self.db.get_words(2000)')
                print(f'Coil \r\n R1000:self.db.get_bits(1000)')
                sleep(1)
        except Exception as e:
            print("Erro: ", e.args)

下面的截图显示了错误。

【问题讨论】:

请让我们知道您面临的具体问题(错误、意外结果、无法确定如何执行特定任务等) - 请参阅 how to ask 以获取指导。 实际上程序运行了,但没有将包发送给客户端 所以当你查询服务器时你得到一个错误?请说明您是如何查询的以及结果是什么(编辑问题并添加额外信息)。 我现在要回家,我要分享一些打印屏幕,简而言之,程序正在冷却,但没有将信息发送给客户 【参考方案1】:

在 Stack Overflow 上发布问题时,最好包含 minimum reproducible example,因为这样可以让其他人更容易快速评估您的问题(在许多情况下,您将在创建示例时自己解决问题)。您粘贴的代码(包括屏幕截图中的代码)可以简化为(尝试here):

from threading import Thread

class Hvac(Thread):

    def run(self):
        try:
            self._server.start()
        except Exception as e:
            print("Erro: ", e.args)

HvacSim = Hvac()
HvacSim.start()

运行它会产生与您收到的相同的错误:

Erro:  ("'Hvac' object has no attribute '_server'",)

您实际上可以通过删除try/catch 来进一步简化此操作,这将导致不同(且更有帮助)的错误消息(告诉您发生错误的行等)。

您可能在想“但我在这里定义了_server”:


class ServidorMODBUS():
    
    """ Classe Servidor Modbus"""    
    def __init__(self, host_ip, port):        
        """construtor"""        
        self._server = ModbusServer(host=host_ip, port=port, no_block=True)

但是,这是在 ServidorMODBUS 类中,而不是 Hvac(您实际上似乎根本没有使用 ServidorMODBUS)。目前还不清楚你打算用ServidorMODBUS 做什么(我猜你想在__init__ 中为Hvac 创建一个实例)。

【讨论】:

以上是关于带有 Python 的 Modbus TCP 服务器的主要内容,如果未能解决你的问题,请参考以下文章

在树莓派上使用Python实现Modbus TCP Server

python modbus_tk我想看看这个怎么用,怎么样可以看到例子和详细的教程?

Modbus库开发笔记之三:Modbus TCP Server开发

采用VSPDModbusTool模拟串口MODBUS TCP设备进行Python采集软件开发

异形Modbus客户端 和 异形modbus服务器之间的通讯 侦听模式的modbus-tcp客户端通讯

Modbus库开发笔记之四:Modbus TCP Client开发