将程序修改为在搅拌楼端运行
This commit is contained in:
@ -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
|
||||||
|
|||||||
@ -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):
|
||||||
"""关闭数据库连接"""
|
"""关闭数据库连接"""
|
||||||
|
|||||||
@ -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
15
main.py
@ -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__":
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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):
|
||||||
"""处理未浇筑信息"""
|
"""处理未浇筑信息"""
|
||||||
@ -394,8 +398,37 @@ 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
70
tcp/client.py
Normal 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客户端已停止")
|
||||||
|
|
||||||
Reference in New Issue
Block a user