华荣三照明、合信、荣欣八组合馈电
This commit is contained in:
160
uart_port.py
Normal file
160
uart_port.py
Normal file
@ -0,0 +1,160 @@
|
||||
import struct
|
||||
import uart_group_config as uart
|
||||
import time
|
||||
import serial
|
||||
import menu_utils as utils
|
||||
from modbus_tk import modbus_rtu, modbus_tcp
|
||||
import json
|
||||
from mqtt_device import class_comm_mqtt_interface, class_comm_mqtt_thread
|
||||
from comm_protocol_modbus import class_protocol_modbus_rtu, class_protocol_modbus_tcp
|
||||
from comm_device import class_comm_device
|
||||
from device_conf import class_comm_device_config
|
||||
from menu_group import class_menu_group
|
||||
from modbus_server import class_modbus_tcp_server
|
||||
from comm_modbus_device import class_modbus_comm_device
|
||||
import comm_global
|
||||
from print_color import *
|
||||
from mqtt_object import class_mqtt_info_object_group, class_mqtt_info_object
|
||||
import keyboard
|
||||
from comm_thread import class_comm_master_thread
|
||||
|
||||
# 常量
|
||||
DEFAULT_COMM_WRITE_TIMEOUT_MS = 500
|
||||
DEFAULT_MODBUS_SERVER_IP = "127.0.0.1"
|
||||
|
||||
# 初始化 MQTT 信息组
|
||||
mqtt_info_group = class_mqtt_info_object_group()
|
||||
|
||||
#初始化 Modbus TCP 服务器
|
||||
def initialize_modbus_server(slave_addr, ip, port):
|
||||
|
||||
return class_modbus_tcp_server(slave_addr=slave_addr, slave_ip=ip, slave_port=port)
|
||||
#获取 MQTT 服务器配置
|
||||
def get_mqtt_server_config():
|
||||
|
||||
user_name = utils.dict_or_object_get_attr(uart.mqtt_server, "user_name", "admin")
|
||||
password = utils.dict_or_object_get_attr(uart.mqtt_server, "password", "admin")
|
||||
server = utils.dict_or_object_get_attr(uart.mqtt_server, "remote", "127.0.0.1")
|
||||
port = utils.dict_or_object_get_attr(uart.mqtt_server, "port", 1883)
|
||||
return user_name, password, server, port
|
||||
#创建并返回通讯主线程列表
|
||||
def create_comm_master_thread_list():
|
||||
comm_master_thread_list = []
|
||||
|
||||
for object_config_list in uart.comm_thread_config:
|
||||
try:
|
||||
protocol_name = utils.dict_or_object_get_attr(object_config_list, "protocol", None)
|
||||
mode = utils.dict_or_object_get_attr(object_config_list, "mode", None)
|
||||
|
||||
_protocol = None
|
||||
if protocol_name == "modbus_rtu":
|
||||
_protocol = class_protocol_modbus_rtu("modbus_rtu")
|
||||
elif protocol_name == "modbus_tcp":
|
||||
_protocol = class_protocol_modbus_tcp("modbus_tcp")
|
||||
|
||||
if _protocol is None or mode is None:
|
||||
continue
|
||||
|
||||
_protocol.open(mode)
|
||||
|
||||
_device_list = utils.dict_or_object_get_attr(object_config_list, "device_list", None)
|
||||
_device_comm_object_list = []
|
||||
|
||||
if _device_list:
|
||||
for device_list_item_dict in _device_list:
|
||||
try:
|
||||
_unique_name = utils.dict_or_object_get_attr(device_list_item_dict, "unique_name", None)
|
||||
_device_name = utils.dict_or_object_get_attr(device_list_item_dict, "device_name", None)
|
||||
_comm_addr = utils.dict_or_object_get_attr(device_list_item_dict, "comm_addr", None)
|
||||
_device_remap = utils.dict_or_object_get_attr(device_list_item_dict, "device_remap", None)
|
||||
|
||||
if _unique_name is None or _device_name is None or _comm_addr is None or _device_remap is None:
|
||||
continue
|
||||
|
||||
device_object = __import__(_device_name)
|
||||
|
||||
config = getattr(device_object, "comm_device_config", None)
|
||||
_func_action_process = getattr(device_object, "func_action_process", None)
|
||||
_func_alarm_query = getattr(device_object, "func_alarm_query", None)
|
||||
|
||||
if config:
|
||||
_comm_table, _function = config.get_comm_table()
|
||||
_alias_table = config.get_alias_table()
|
||||
|
||||
_mqtt_info_object = mqtt_info_group.create_mqtt_info_object(device_name=_device_name)
|
||||
_unique_object = class_modbus_comm_device(
|
||||
comm_addr=_comm_addr,
|
||||
comm_table=_comm_table,
|
||||
device_remap=_device_remap,
|
||||
mqtt_thread=global_mqtt_thread,
|
||||
protocol=_protocol,
|
||||
mqtt_info_object=_mqtt_info_object,
|
||||
unique_name=_unique_name,
|
||||
action_process_func=_func_action_process,
|
||||
request_alarm_func=_func_alarm_query,
|
||||
alias_table=_alias_table
|
||||
)
|
||||
|
||||
global_mqtt_thread.add_unique_object(unique_name=_unique_name, unique_object=_unique_object)
|
||||
_device_comm_object_list.append(_unique_object)
|
||||
except Exception as e:
|
||||
print_error_msg(f"Failed to configure device: {_device_name}. Error: {str(e)}")
|
||||
|
||||
if _device_comm_object_list:
|
||||
_comm_thread = class_comm_master_thread(
|
||||
device_comm_object_list=_device_comm_object_list,
|
||||
thread_name=_unique_name
|
||||
)
|
||||
comm_master_thread_list.append(_comm_thread)
|
||||
except Exception as e:
|
||||
print_error_msg(f"Failed to configure communication thread. Error: {str(e)}")
|
||||
|
||||
return comm_master_thread_list
|
||||
|
||||
#主函数,初始化并运行应用程序
|
||||
def main():
|
||||
|
||||
_slave_addr = 2
|
||||
comm_global.g_key_thread.start()
|
||||
|
||||
_modbus_tcp_server = initialize_modbus_server(_slave_addr, DEFAULT_MODBUS_SERVER_IP, 502)
|
||||
|
||||
_user_name, _password, _server, _port = get_mqtt_server_config()
|
||||
|
||||
# 创建并配置 MQTT 线程
|
||||
global global_mqtt_thread
|
||||
global_mqtt_thread = class_comm_mqtt_thread()
|
||||
global_mqtt_thread.set_mqtt_server(
|
||||
server=_server,
|
||||
port=_port,
|
||||
keep_alive=60,
|
||||
user_name=_user_name,
|
||||
password=_password
|
||||
)
|
||||
|
||||
# 创建通讯主线程
|
||||
comm_master_thread_list = create_comm_master_thread_list()
|
||||
|
||||
# 启动 MQTT 和通讯主线程
|
||||
global_mqtt_thread.start()
|
||||
for comm_thread in comm_master_thread_list:
|
||||
comm_thread.start()
|
||||
|
||||
while True:
|
||||
# 定期检查 Modbus TCP 连接状态并重连
|
||||
if not _modbus_tcp_server.is_connected():
|
||||
print("Modbus TCP 服务器断线重连中...")
|
||||
_modbus_tcp_server.reconnect()
|
||||
time.sleep(1) # 延迟一段时间后再次检查
|
||||
time.sleep(10) # 每隔 10 秒检查一次连接状态
|
||||
|
||||
# 清理并关闭线程
|
||||
global_mqtt_thread.close()
|
||||
for comm_thread in comm_master_thread_list:
|
||||
comm_thread.close()
|
||||
for comm_thread in comm_master_thread_list:
|
||||
comm_thread.join()
|
||||
global_mqtt_thread.join()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user