写不NG流程:添加传送带运行、步进电机移动、线条个数方便后续夹爪的抓取、气动夹爪控制流程

This commit is contained in:
2026-01-09 17:52:52 +08:00
parent 8821b30689
commit a8a35545cc
7 changed files with 410 additions and 43 deletions

119
RK1106/RK1106_server.py Normal file
View File

@ -0,0 +1,119 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
# @Time : 2026/1/9 10:45
# @Author : reenrr
# @File : RK1106_server.py
# @Desc : RK1106服务端等待工控机调用
'''
import socket
import logging
import sys
from test import motor_demo
# --------日志配置(终端+文件双输出)--------------
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
# 核心新增:日志文件配置
handlers=[
# 1. 文件处理器:保存到.log文件
logging.FileHandler(
"RK1106_server.log", # Buildroot推荐路径临时测试可改/tmp/1106_server.log
mode='a', # 追加模式(不会覆盖历史日志)
encoding='utf-8' # 防止中文乱码(必加)
),
# 2. 终端处理器:输出到控制台
logging.StreamHandler(sys.stdout)
]
)
# --------配置TCP服务端----------
HOST = "127.0.0.1"
PORT = 8888
# 程序映射表(指令表示 -> 执行函数)
PROG_MAP = {
# "STEPPER_TEST": motor_test_demo,
"test": motor_demo
}
def parse_command(cmd_str: str) ->tuple[str, dict]:
"""
解析工控机发送的指令字符串
:param cmd_str: 指令字符串
:return: 指令名称,参数字典
"""
# 空指令处理
if not cmd_str or cmd_str.strip() == "":
return "", {}
# 分割指令标识和参数
cmd_parts = cmd_str.strip().split("|", 1)
prog_id = cmd_parts[0].strip()
params = {}
# 解析参数格式param1=val1&param2=val2
if len(cmd_parts) > 1 and cmd_parts[1].strip() != "":
param_str = cmd_parts[1].strip()
param_pairs = param_str.split("&")
for pair in param_pairs:
if "=" in pair:
key, value = pair.split("=", 1) # 处理值中含=的情况
# 类型自动转换(数字/字符串)
try:
params[key.strip()] = int(value.strip())
except ValueError:
try:
params[key.strip()] = float(value.strip())
except ValueError:
params[key.strip()] = value.strip()
return prog_id, params
# ----------对外接口----------
def server():
# 创建TCP socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:
# 允许端口复用
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((HOST, PORT))
server_socket.listen(1) # 只允许1个工控机连接
logging.info(f"[1106] 服务已启动,监听端口:{PORT},等待工控机连接...")
# 等待工控机连接
conn, addr = server_socket.accept()
with conn:
logging.info(f"[1106] 工控机已连接:{addr}")
# 循环接收指令
while True:
# 接收指令最大1024字节
data = conn.recv(1024).decode()
logging.info(f"\n[1106] 收到工控机指令:{data}")
# 解析指令
prog_id, params = parse_command(data)
logging.info(f"[1106] 解析结果 - 指令:{prog_id},参数:{params}")
# 执行对应程序
responses = ""
if prog_id in PROG_MAP:
try:
result = PROG_MAP[prog_id](**params)
response = f"SUCCESS|步进电机测试执行完成,结果:{result}"
logging.info(f"[1106] {response}")
except Exception as e:
response = f"FAIL|步进电机测试执行失败:{str(e)}"
logging.error(f"[1106] {response}", exc_info=True)
else:
response = f"FAIL|未知指令:{prog_id},支持指令:{list(PROG_MAP.keys())}"
logging.warning(f"[1106] {response}")
# 发送响应给工控机
conn.sendall(response.encode("utf-8"))
logging.info(f"[1106] 已发送响应:{response}")
# ----------测试接口----------
if __name__ == "__main__":
server()

View File

@ -249,7 +249,7 @@ class StepperMotor:
"""析构函数:确保资源释放"""
self.close()
# 使用示例
# ----------对外接口-----------
def motor_demo():
"""电机控制示例"""
motor = None
@ -287,6 +287,5 @@ def motor_demo():
motor.close()
print("[OK] 程序退出完成")
if __name__ == '__main__':
motor_demo()