带有 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采集软件开发