當我嘗試temp_controll從子類啟動或啟動成員函式時,出現兩種型別的錯誤Temperature_Controll。問題是 while 回圈是在新執行緒中啟動的。
我無法將 modbus 客戶端連接傳遞給成員函式。
AttributeError: 'ModbusTcpClient' object has no attribute 'modbus'
我不完全理解這個問題,因為我假設我會從主類繼承 modbus.client?
第二個問題是,當我注釋掉 rp 并想從主類“database_reading”訪問成員函式時,出現以下錯誤:
AttributeError: 'str' object has no attribute 'database_reading'
如何通過第二個執行緒執行子類方法?
class Echo(WebSocket):
def __init__(self, client, server, sock, address):
super().__init__(server, sock, address)
self.modbus = client
def database_reading(self)
do_something()
return data
class Temperature_Controll2(Echo):
def __init__(self, client):
super(Temperature_Controll, self).__init__(client)
self.modbus = client
def temp_controll(self, value):
#super().temp_controll(client)
while True:
print("temp_controll")
rp = self.modbus.read_coils(524, 0x1)
print(rp.bits[0])
self.database_reading()
def main():
logging.basicConfig()
with ModbusClient(host=HOST, port=PORT) as client:
client.connect()
time.sleep(0.01)
print("Websocket server on port %s" % PORTNUM)
server = SimpleWebSocketServer('', PORTNUM, partial(Echo, client))
control = Temperature_Controll2.temp_controll
t2 = threading.Thread(target=control, args=(client, 'get'))
t2.start()
try:
t1 = threading.Thread(target=server.serveforever())
t1.start()
finally:
server.close()
if __name__ == "__main__":
main()
這是我的代碼的一個最小示例,執行緒 t1 的執行沒有任何問題。我對 OOP 編程的經驗很少,也許這里有人可以提供幫助,謝謝!
uj5u.com熱心網友回復:
你得到這個錯誤:
AttributeError: 'ModbusTcpClient' object has no attribute 'modbus'
因為當Thread你創建的時候:
t2 = threading.Thread(target=control, args=(client, 'get'))
打電話Temperature_Controll2.temp_controll(client, 'get'),
在這一行:實際上是您在此處創建的變數rp = self.modbus.read_coils(524, 0x1):self client
with ModbusClient(host=HOST, port=PORT) as client:
并且不是Temperature_Controll2我假設您期望的實體。
uj5u.com熱心網友回復:
好的,再次感謝,解決辦法是:
class Temperature_Controll2(Echo):
def __init__(self, client):
#super(Temperature_Controll2, self).__init__() #client , server, sock, address, database_reading)
#super().__init__()
self.modbus = client
def temp_controll(self, value):
#super().temp_controll(client)
while True:
print("temp_controll")
rp = self.modbus.read_coils(524, 0x1)
time.sleep(4)
def main():
with ModbusClient(host=HOST, port=PORT) as client:
client.connect()
time.sleep(0.01)
print("Websocket server on port %s" % PORTNUM)
server = SimpleWebSocketServer('', PORTNUM, partial(Echo, client))
control = Temperature_Controll2(client)
t2 = threading.Thread(target=control.temp_controll('get'))
try:
t1 = threading.Thread(target=server.serveforever())
t1.start()
finally:
server.close()
但是對于客戶端,我只能與 modbus 服務器建立一個連接,因此 websocket 或 while 回圈都可以作業。我想我必須以不同的方式處理這個問題。
uj5u.com熱心網友回復:
一個簡短的附錄,我想,我現在知道為什么第二個變體不起作用。
此變體一直運行,直到 Echo 類中的 temp_control 到達點,其中 modbus 模塊被函式呼叫。Modbus 模塊不是母類 Echo 的一部分,這就是我認為不能繼承的原因。
Modbus 通過 partial 作為變數傳遞給 Echo 類,因此將實體化(我希望我表達正確)。因此,只有將變數 client 傳遞給實體的變體才有效。
# This is a non-functional version of my programme and is for information only
class Echo(WebSocket):
def __init__(self, client, server, sock, address):
super().__init__(server, sock, address)
self.modbus = client
def temp_control(self)
do_something()
return True
class Temperature_Control3(Echo):
def __init__(self, value=None): #, client, server, sock, address):
#super(Temperature_Control3, self).__init__(server, sock, address)
if value is None:
value = {}
self.value = value
def control(self, value):
while True:
self.temp_control(524, 'get')
#self.database_reading()[0][1]
time.sleep(2)
def main():
with ModbusClient(host=HOST, port=PORT) as client:
client.connect()
time.sleep(0.01)
print("Websocket server on port %s" % PORTNUM)
server = SimpleWebSocketServer('', PORTNUM, partial(Echo, client))
control = Temperature_Control3()
t3 = threading.Thread(target=lambda:control.control('get'))
t3.start()
try:
t1 = threading.Thread(target=server.serveforever())
t1.start()
for thread in threading.enumerate():
print(thread.name)
finally:
server.close()
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/536995.html
上一篇:只能分配給特定值的類中的字串屬性
