将程序修改为在搅拌楼端运行

This commit is contained in:
xiongyi
2025-11-17 21:56:11 +08:00
parent 88625f4782
commit 3a746eddb7
7 changed files with 184 additions and 46 deletions

View File

@ -26,6 +26,10 @@ SQL_SERVER_CONFIG = {
TCP_HOST = '127.0.0.1' TCP_HOST = '127.0.0.1'
TCP_PORT = 8888 TCP_PORT = 8888
# 新增TCP客户端配置
TCP_CLIENT_HOST = '192.168.1.100'
TCP_CLIENT_PORT = 8889
# 其他配置 # 其他配置
MAX_AGE_HOURS = 24 MAX_AGE_HOURS = 24
CHECK_INTERVAL = 10 CHECK_INTERVAL = 10

View File

@ -1,5 +1,6 @@
"""Access数据库操作模块""" """Access数据库操作模块"""
import pyodbc import pyodbc
import os
class AccessDB: class AccessDB:
@ -10,6 +11,11 @@ class AccessDB:
def connect(self): def connect(self):
"""连接Access数据库""" """连接Access数据库"""
try:
# 检查网络路径是否存在
if self.db_path.startswith('\\\\') and not os.path.exists(self.db_path):
raise FileNotFoundError(f"无法访问网络路径: {self.db_path},请检查网络连接和共享设置")
conn_str = ( conn_str = (
r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};' r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
f'DBQ={self.db_path};' f'DBQ={self.db_path};'
@ -17,9 +23,16 @@ class AccessDB:
) )
self.connection = pyodbc.connect(conn_str) self.connection = pyodbc.connect(conn_str)
return self.connection return self.connection
except pyodbc.Error as e:
print(f"连接Access数据库失败: {e}")
raise
except FileNotFoundError as e:
print(f"数据库文件不可访问: {e}")
raise
def get_max_mark(self): def get_max_mark(self):
"""获取Access数据库中最大的Mark值""" """获取Access数据库中最大的Mark值"""
try:
if not self.connection: if not self.connection:
self.connect() self.connect()
@ -31,9 +44,16 @@ class AccessDB:
max_mark = 0 max_mark = 0
return max_mark return max_mark
except pyodbc.Error as e:
print(f"查询最大Mark值时出错: {e}")
return 0
except Exception as e:
print(f"获取最大Mark值时发生未知错误: {e}")
return 0
def query_task_status(self, mis_ids): def query_task_status(self, mis_ids):
"""查询任务状态""" """查询任务状态"""
try:
if not self.connection: if not self.connection:
self.connect() self.connect()
@ -53,6 +73,12 @@ class AccessDB:
current_tasks[mark] = flag current_tasks[mark] = flag
return current_tasks return current_tasks
except pyodbc.Error as e:
print(f"查询任务状态时出错: {e}")
return {}
except Exception as e:
print(f"查询任务状态时发生未知错误: {e}")
return {}
def close(self): def close(self):
"""关闭数据库连接""" """关闭数据库连接"""

View File

@ -32,7 +32,7 @@ class SQLServerConnection:
SELECT SELECT
Code, Code,
U1, U2, U3, U4, U5, U6, U7, U8, U9, U10, U11, U12, U13, U14, U15, U16, U17 U1, U2, U3, U4, U5, U6, U7, U8, U9, U10, U11, U12, U13, U14, U15, U16, U17
FROM MixTable FROM Recipe_back
WHERE Code IS NOT NULL WHERE Code IS NOT NULL
ORDER BY Code ORDER BY Code
""" """

15
main.py
View File

@ -1,7 +1,6 @@
"""主程序入口""" """主程序入口"""
import time import time
import threading import threading
from datetime import datetime
from API.client import APIClient from API.client import APIClient
from API.mix_weight_api import MixWeightAPI from API.mix_weight_api import MixWeightAPI
from services.task_service import TaskService from services.task_service import TaskService
@ -9,16 +8,17 @@ from services.monitoring_service import MonitoringService
from database.access_db import AccessDB from database.access_db import AccessDB
from database.sql_server import SQLServerDB from database.sql_server import SQLServerDB
from tcp.server import TCPServer from tcp.server import TCPServer
from tcp.client import TCPClient
from config.settings import ( from config.settings import (
ACCESS_DB_PATH, ACCESS_DB_PASSWORD, ACCESS_DB_PATH, ACCESS_DB_PASSWORD,
TCP_HOST, TCP_PORT, CHECK_INTERVAL, MAX_AGE_HOURS TCP_HOST, TCP_PORT, TCP_CLIENT_HOST, TCP_CLIENT_PORT,
CHECK_INTERVAL, MAX_AGE_HOURS
) )
from utils.helpers import cleanup_old_timestamps from utils.helpers import cleanup_old_timestamps
# 假设同事提供的函数 # 假设同事提供的函数
def save_to_custom_table(misid, flag, task_id, produce_mix_id, project_name, beton_grade, adjusted_volume, artifact_id): def save_to_custom_table(misid, flag, task_id, produce_mix_id, project_name, beton_grade, adjusted_volume, artifact_id):
"""保存到自定义数据表的函数""" """保存到自定义数据表的函数"""
# 这里应该是同事提供的实际实现
print(f"保存到自定义数据表: MISID={misid}, Flag={flag}, TaskID={task_id}, 调整后方量={adjusted_volume}") print(f"保存到自定义数据表: MISID={misid}, Flag={flag}, TaskID={task_id}, 调整后方量={adjusted_volume}")
def start_api_service(): def start_api_service():
@ -27,7 +27,7 @@ def start_api_service():
api.run(host='127.0.0.1', port=5001, debug=False, threaded=True) api.run(host='127.0.0.1', port=5001, debug=False, threaded=True)
def main(): def main():
global tcp_server global tcp_server, data_client
api_thread = threading.Thread(target=start_api_service) api_thread = threading.Thread(target=start_api_service)
api_thread.daemon = True api_thread.daemon = True
api_thread.start() api_thread.start()
@ -38,6 +38,10 @@ def main():
tcp_server_thread.daemon = True tcp_server_thread.daemon = True
tcp_server_thread.start() tcp_server_thread.start()
# 初始化发送数据的TCP客户端
data_client = TCPClient(host=TCP_CLIENT_HOST, port=TCP_CLIENT_PORT)
data_client.start()
# 等待服务端启动 # 等待服务端启动
time.sleep(1) time.sleep(1)
@ -129,6 +133,9 @@ def main():
# 停止TCP服务端 # 停止TCP服务端
if 'tcp_server' in locals(): if 'tcp_server' in locals():
tcp_server.stop() tcp_server.stop()
# 停止TCP客户端
if 'data_client' in locals():
data_client.stop()
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -2,11 +2,9 @@
"""监控服务""" """监控服务"""
import time import time
import threading import threading
from datetime import datetime
from database.access_db import AccessDB from database.access_db import AccessDB
from database.sql_server import SQLServerDB from database.sql_server import SQLServerDB
from config.settings import ACCESS_DB_PATH, ACCESS_DB_PASSWORD, MONITOR_INTERVAL from config.settings import ACCESS_DB_PATH, ACCESS_DB_PASSWORD, MONITOR_INTERVAL
from tcp.server import TCPServer
from services.task_service import TaskService from services.task_service import TaskService
class MonitoringService: class MonitoringService:
@ -103,7 +101,7 @@ class MonitoringService:
self._handle_status_n(erp_id,artifact_id) self._handle_status_n(erp_id,artifact_id)
elif current_flag.endswith('p'): elif current_flag.endswith('p'):
self._handle_status_p(erp_id,artifact_id) self._handle_status_p(erp_id,artifact_id)
elif current_flag.endswith('x'): elif current_flag.endswith('y'):
self._handle_status_x(erp_id,artifact_id) self._handle_status_x(erp_id,artifact_id)
def _handle_status_d(self,erp_id, artifact_id): def _handle_status_d(self,erp_id, artifact_id):
@ -191,7 +189,7 @@ class MonitoringService:
print(f"发送状态数据给TCP客户端时出错: {e}") print(f"发送状态数据给TCP客户端时出错: {e}")
def _handle_status_x(self, erp_id,artifact_id): def _handle_status_x(self, erp_id,artifact_id):
"""处理状态'x' - 数据已接收""" """处理状态'y' - 数据已接收"""
print(f"派发任务 ErpID {artifact_id}: 已插入") print(f"派发任务 ErpID {artifact_id}: 已插入")
try: try:
print(5) print(5)

View File

@ -5,6 +5,7 @@ from database.access_db import AccessDB
from database.sql_server import SQLServerDB from database.sql_server import SQLServerDB
from config.settings import ACCESS_DB_PATH, ACCESS_DB_PASSWORD from config.settings import ACCESS_DB_PATH, ACCESS_DB_PASSWORD
from utils.helpers import get_f_block_positions from utils.helpers import get_f_block_positions
from tcp.client import TCPClient
import threading import threading
import time import time
@ -16,6 +17,9 @@ class TaskService:
self.task_before = {"block_number":None, "beton_volume":None, "artifact_id":None} self.task_before = {"block_number":None, "beton_volume":None, "artifact_id":None}
self.artifact_timestamps = {} self.artifact_timestamps = {}
self.tcp_server = tcp_server self.tcp_server = tcp_server
from config.settings import TCP_CLIENT_HOST, TCP_CLIENT_PORT
self.data_client = TCPClient(host=TCP_CLIENT_HOST, port=TCP_CLIENT_PORT)
self.data_client.start()
def process_not_pour_info(self): def process_not_pour_info(self):
"""处理未浇筑信息""" """处理未浇筑信息"""
@ -395,7 +399,36 @@ class TaskService:
return erp_id return erp_id
def save_to_custom_table(self, misid, flag, task_id, produce_mix_id, project_name, beton_grade, adjusted_volume, artifact_id): def save_to_custom_table(self, misid, flag, task_id, produce_mix_id, project_name, beton_grade, adjusted_volume, artifact_id):
print(f"保存到自定义数据表: MISID={misid}, Flag={flag}, TaskID={task_id}, 调整后方量={adjusted_volume}") try:
task_data = {
"erp_id": misid,
"task_id": task_id,
"artifact_id": artifact_id,
"produce_mix_id": produce_mix_id,
"project_name": project_name,
"beton_grade": beton_grade,
"adjusted_volume": adjusted_volume,
"flag": flag,
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
self.data_client.send_data(task_data)
print(f"任务 {artifact_id} 的数据已发送到另一台电脑")
except Exception as e:
print(f"发送数据到另一台电脑时出错: {e}")
print(f"原计划保存到自定义数据表: MISID={misid}, Flag={flag}, TaskID={task_id}, 调整后方量={adjusted_volume}")
def update_custom_table_status(self, erp_id, status): def update_custom_table_status(self, erp_id, status):
print(f"更新自定义数据表状态: ERP ID={erp_id}, 状态={status}") # 通过专用TCP客户端发送状态更新到另一台电脑
try:
status_data = {
"cmd": "update_status",
"erp_id": erp_id,
"status": status,
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
self.data_client.send_data(status_data)
print(f"任务状态更新已发送到另一台电脑: ERP ID={erp_id}, 状态={status}")
except Exception as e:
print(f"发送状态更新到另一台电脑时出错: {e}")
print(f"原计划更新自定义数据表状态: ERP ID={erp_id}, 状态={status}")

70
tcp/client.py Normal file
View File

@ -0,0 +1,70 @@
import socket
import json
import threading
import time
class TCPClient:
def __init__(self, host='127.0.0.1', port=8889):
self.host = host
self.port = port
self.client_socket = None
self.is_connected = False
self.reconnect_interval = 5 # 重连间隔(秒)
self.is_running = False
def connect(self):
"""连接到TCP服务端"""
try:
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client_socket.connect((self.host, self.port))
self.is_connected = True
print(f"已连接到 {self.host}:{self.port}")
return True
except Exception as e:
print(f"连接到服务端失败: {e}")
self.is_connected = False
return False
def start(self):
"""启动客户端并维持连接"""
self.is_running = True
reconnect_thread = threading.Thread(target=self._reconnect_worker, daemon=True)
reconnect_thread.start()
def _reconnect_worker(self):
"""重连工作线程"""
while self.is_running:
if not self.is_connected:
print(f"尝试重新连接到 {self.host}:{self.port}...")
self.connect()
time.sleep(self.reconnect_interval)
def send_data(self, data):
"""发送数据到服务端"""
if not self.is_connected or not self.client_socket:
print("客户端未连接到服务端")
return False
try:
json_data = json.dumps(data, ensure_ascii=False)
# 添加换行符作为结束标记
self.client_socket.sendall((json_data + "\n").encode('utf-8'))
print(f"已发送数据: {json_data}")
return True
except Exception as e:
print(f"发送数据时出错: {e}")
self.is_connected = False
return False
def stop(self):
"""停止客户端"""
self.is_running = False
self.is_connected = False
if self.client_socket:
try:
self.client_socket.close()
except Exception as e:
print(f"关闭客户端套接字时出错: {e}")
print("TCP客户端已停止")