英雄小游戏,Scanner,while,if,方法调用,延时

这是一个简单的Java控制台游戏示例,玩家可以输入英雄的名字、血量、攻击力和防御力,然后与名为“主宰”的敌人进行战斗。游戏使用了Scanner类来获取用户输入,并通过循环和条件判断来模拟战斗过程。
package com.itheima;

import java.util.Scanner;

public class HeroGame {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入英雄的名字:");
        String hreoName = scanner.next(); // 默认字符串
        System.out.println("请输入英雄的血量:");
        int hreoBlood = scanner.nextInt();
        System.out.println("请输入英雄的攻击力:");
        int heroAttack = scanner.nextInt();
        System.out.println("请输入英雄的防御力:");
        int heroDefense = scanner.nextInt();

        String bossName = "主宰";
        int bossBlood = 1000;
        int bossAttack = 200;
        int bossDefense = 20;

        System.out.println("开始打架了------");

        while (hreoBlood >= 0 && bossBlood >= 0) {
            sleep(500); // 延迟500毫秒
            System.out.println(hreoName + "射了" + bossName + "一箭," + bossName + "受到了" + (heroAttack - bossDefense) + "伤害");
            System.out.println(bossName + "射了" + hreoName + "一箭," + hreoName + "受到了" + (bossAttack - heroDefense) + "伤害");

            // 掉血
            hreoBlood -= (bossAttack - heroDefense);
            bossBlood -= (heroAttack - bossDefense);
        }
        if (hreoBlood <= 0){
            System.out.println("英雄死亡!");
        }
        if (bossBlood <= 0){
            System.out.println("主宰死亡!");
        }
    }

    public static void sleep(int time){
        // 打出Thread.sleep(time*1000)然后选择try catch就会有这段代码了
        try {
            Thread.sleep(time); // 1秒等于1000毫秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 

// 加载配置 int load_config(arp_config_t *config) { if (config == NULL) { fprintf(stderr, "错误: 配置指针为空\n"); return -1; } // 使用ds_read读取配置 ds_read(ARPD_CONFIG_PATH, config, sizeof(arp_config_t)); return 0; } S32 arp_scanner_init() { memset(&g_scanner, 0, sizeof(arp_scanner_t)); // 创建原始套接字 g_scanner.raw_socket = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ARP)); if (g_scanner.raw_socket < 0) { perror("socket"); return -1; } // 初始化互斥锁 if (pthread_mutex_init(&g_scanner.lock, NULL) != 0) { close(g_scanner.raw_socket); return -1; } // 从配置文件加载配置 if (load_config(&g_scanner.config) != 0) { // 加载失败时使用默认值 g_scanner.config.enabled = FALSE; g_scanner.config.scan_interval = 60; g_scanner.config.validity_period = 300; g_scanner.config.packet_interval = 100; g_scanner.config.start_ip = ip_to_int("192.168.1.100"); g_scanner.config.end_ip = ip_to_int("192.168.1.200"); // 默认网络接口 strcpy(g_scanner.config.interface, "eth0"); fprintf(stderr, "Using default configuration\n"); } return 0; } // 扫描线程函数 static void *arp_scan_thread(void *arg) { // 执行扫描操作 int ret = arp_scanner_scan(); // 更新扫描状态 pthread_mutex_lock(&g_scanner.lock); g_scanner.scanning = (ret == 0); // 只有成功完成才保持扫描状态 pthread_mutex_unlock(&g_scanner.lock); return NULL; } S32 arp_scanner_start(void) { pthread_mutex_lock(&g_scanner.lock); // 1. 检查是否已在扫描中 if (g_scanner.scanning) { pthread_mutex_unlock(&g_scanner.lock); return ERROR_BUSY; } // 2. 检查配置是否启用 if (!g_scanner.config.enabled) { pthread_mutex_unlock(&g_scanner.lock); return ERROR_DISABLED; } // 3. 验证IP范围有效性 if (g_scanner.config.start_ip >= g_scanner.config.end_ip) { pthread_mutex_unlock(&g_scanner.lock); return ERROR_INVAL; } // 4. 确保套接字有效 if (g_scanner.raw_socket < 0) { // 尝试重新初始化 if (arp_scanner_init() != 0) { pthread_mutex_unlock(&g_scanner.lock); return ERROR_SOCKET; } } // 5. 重置停止标志并启动扫描线程 g_scanner.stop_requested = FALSE; int ret = pthread_create(&g_scanner.scan_thread, NULL, arp_scan_thread, NULL); if (ret == 0) { g_scanner.scanning = TRUE; pthread_mutex_unlock(&g_scanner.lock); return OK; } else { pthread_mutex_unlock(&g_scanner.lock); return ERROR_THREAD; } } // 停止函数 int arp_scanner_stop(void) { pthread_mutex_lock(&g_scanner.lock); // 1. 检查扫描是否正在运行 if (!g_scanner.scanning) { pthread_mutex_unlock(&g_scanner.lock); return ERROR_NOT_RUNNING; } // 2. 设置停止标志 g_scanner.stop_requested = TRUE; // 3. 等待扫描线程结束(带超时) struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); ts.tv_sec += 5; // 5秒超时 int ret = pthread_timedjoin_np(g_scanner.scan_thread, NULL, &ts); if (ret == ETIMEDOUT) { // 超时处理:取消线程 pthread_cancel(g_scanner.scan_thread); ret = ERROR_TIMEOUT; } else if (ret != 0) { // 其他错误 ret = ERROR_THREAD; } // 更新状态 g_scanner.scanning = FALSE; g_scanner.stop_requested = FALSE; pthread_mutex_unlock(&g_scanner.lock); return (ret == 0) ? OK : ret; }需要在扫描线程执行的过程中定期查询是否stop吗
最新发布
08-29
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/ioctl.h> #include <net/ethernet.h> #include <arpa/inet.h> #include "arp.h" #include <pthread.h> #include <time.h> #include <netinet/ether.h> #define ETH_HEADER_SIZE 14 #define ARP_PACKET_SIZE 42 #define INITIAL_SIZE 1024 unsigned int if_nametoindex(const char *ifname) { struct ifreq ifr; int sockfd; sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket"); return 0; } memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, ifname, IFNAMSIZ - 1); if (ioctl(sockfd, SIOCGIFINDEX, &ifr) < 0) { close(sockfd); perror("ioctl"); return 0; } close(sockfd); return ifr.ifr_ifru.ifru_metric; } void get_local_mac(uint8_t *mac) { struct ifreq ifr; int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); if (sock < 0) { perror("socket"); exit(EXIT_FAILURE); } // 使用eth0接口,可根据需要修改 strncpy(ifr.ifr_name, "ens33", IFNAMSIZ); if (ioctl(sock, SIOCGIFHWADDR, &ifr) < 0) { perror("ioctl"); close(sock); exit(EXIT_FAILURE); } memcpy(mac, ifr.ifr_ifru.ifru_hwaddr.sa_data, 6); close(sock); } void get_local_ip(struct in_addr *local_ip) { struct ifreq ifr; int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); if (sock < 0) { perror("socket"); exit(EXIT_FAILURE); } // 使用eth0接口,可根据需要修改 strncpy(ifr.ifr_name, "ens33", IFNAMSIZ); if (ioctl(sock, SIOCGIFADDR, &ifr) < 0) { perror("ioctl"); close(sock); exit(EXIT_FAILURE); } struct sockaddr_in *sin = (struct sockaddr_in *)&ifr.ifr_ifru.ifru_addr; *local_ip = sin->sin_addr; close(sock); } // 发送ARP请求 void send_arp(int sock, struct _ARP_HDR_new *arp) { // 构建完整的以太网帧 uint8_t packet[ARP_PACKET_SIZE]; // 以太网目标地址(广播) memset(packet, 0xFF, 6); // 以太网源地址(本机MAC) get_local_mac(packet + 6); // 以太网类型(ARP) packet[12] = 0x08; // ETH_P_ARP高位 packet[13] = 0x06; // ETH_P_ARP低位 // ARP包内容 memcpy(packet + ETH_HEADER_SIZE, arp, sizeof(arp)); // 发送到网络接口 struct sockaddr_ll dest = { .sll_family = AF_PACKET, .sll_protocol = htons(ETH_P_ARP), .sll_ifindex = if_nametoindex("ens33"), // 使用eth0接口 .sll_halen = ETH_ALEN, .sll_addr = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} // 广播地址 }; if (sendto(sock, packet, ARP_PACKET_SIZE, 0, (struct sockaddr *)&dest, sizeof(dest)) < 0) { perror("sendto"); } } int recv_arp(int sock, struct _ARP_HDR_new *arp_resp) { uint8_t buffer[ETH_FRAME_LEN]; ssize_t len = recv(sock, buffer, sizeof(buffer), 0); if (len < ETH_HEADER_SIZE) { return -1; // 接收失败 } // 检查是否为ARP包 if (buffer[12] != 0x08 || buffer[13] != 0x06) { return -1; // 非ARP包 } // 解析ARP包 struct _ARP_HDR_new *arp = (struct _ARP_HDR_new *)(buffer + ETH_HEADER_SIZE); // 检查是否为ARP响应 if (ntohs(arp->ar_op) != ARPOP_REPLY) { return -1; // 非ARP响应 } memcpy(arp_resp, arp, sizeof(arp)); return len; } // 查找或创建ARP条目 arp_entry* find_or_create_entry(arp_scanner *scanner, uint32_t ip) { // 首先尝试查找现有条目 for (int i = 0; i < scanner->entry_count; i++) { if (scanner->entries[i].ip == ip) { return &scanner->entries[i]; } } // 如果表已满,扩展容量 if (scanner->entry_count >= scanner->max_entries) { int new_size = scanner->max_entries * 2; arp_entry *new_entries = realloc(scanner->entries, new_size * sizeof(arp_entry)); if (!new_entries) { perror("realloc"); return NULL; } scanner->entries = new_entries; scanner->max_entries = new_size; } // 创建新条目 arp_entry *new_entry = &scanner->entries[scanner->entry_count++]; new_entry->ip = ip; memset(new_entry->mac, 0, ETH_ALEN); new_entry->last_update = time(NULL); new_entry->expire_time = new_entry->last_update + scanner->config.entry_ttl; return new_entry; } // 创建原始套接字 int create_arp_socket() { int sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ARP)); if (sock < 0) { perror("socket"); exit(EXIT_FAILURE); } return sock; } // 构建ARP请求报文 void build_arp_packet(struct _ARP_HDR_new *arp, uint32_t target_ip) { arp->ar_hrd = htons(ARPHRD_ETHER); arp->ar_pro = htons(ETHERTYPE_IP); arp->ar_hln = ETH_ALEN; arp->ar_pln = sizeof(in_addr_t); arp->ar_op = htons(ARPOP_REQUEST); // 设置源MAC(本机MAC) get_local_mac(arp->ar_sha); // 设置源IP(本机IP) struct in_addr local_ip; get_local_ip(&local_ip); memcpy(arp->ar_sip, &local_ip, sizeof(local_ip)); // 设置目标MAC(广播) memset(arp->ar_tha, 0xFF, ETH_ALEN); // 设置目标IP memcpy(arp->ar_tip, &target_ip, sizeof(target_ip)); } // ARP扫描线程 void* scan_thread(void *arg) { arp_scanner *scanner = (arp_scanner*)arg; int sock = create_arp_socket(); while (scanner->config.enable_scan) { pthread_mutex_lock(&scanner->lock); config_t cfg = scanner->config; pthread_mutex_unlock(&scanner->lock); // 遍历IP范围 for (uint32_t ip = cfg.start_ip; ip <= cfg.end_ip; ip++) { struct _ARP_HDR_new arp_req; build_arp_packet(&arp_req, ip); // 发送ARP请求 send_arp(sock, &arp_req); // 按间隔等待 usleep(cfg.packet_interval * 1000); } // 等待扫描周期 sleep(cfg.scan_cycle); } close(sock); return NULL; } // ARP响应处理 void process_arp_response(arp_scanner *scanner, struct _ARP_HDR_new *arp) { uint32_t ip; memcpy(&ip, arp->ar_sip, sizeof(ip)); pthread_mutex_lock(&scanner->lock); // 查找或创建条目 arp_entry *entry = find_or_create_entry(scanner, ip); memcpy(entry->mac, arp->ar_sha, ETH_ALEN); entry->last_update = time(NULL); entry->expire_time = entry->last_update + scanner->config.entry_ttl; pthread_mutex_unlock(&scanner->lock); } // 超时清理线程 void* cleanup_thread(void *arg) { arp_scanner *scanner = (arp_scanner*)arg; while (1) { sleep(5); // 每5秒检查一次 pthread_mutex_lock(&scanner->lock); time_t now = time(NULL); for (int i = 0; i < scanner->entry_count; ) { if (scanner->entries[i].expire_time < now) { // 移除超时条目 memmove(&scanner->entries[i], &scanner->entries[i+1], (scanner->entry_count - i - 1) * sizeof(arp_entry)); scanner->entry_count--; } else { i++; } } pthread_mutex_unlock(&scanner->lock); } return NULL; } // 动态调整内存 void resize_entries(arp_scanner *scanner, int new_size) { arp_entry *new_entries = realloc(scanner->entries, new_size * sizeof(arp_entry)); if (new_entries) { scanner->entries = new_entries; scanner->max_entries = new_size; } } void update_config(arp_scanner *scanner, config_t new_config) { pthread_mutex_lock(&scanner->lock); // 验证IP范围有效性 if (ntohl(new_config.end_ip) < ntohl(new_config.start_ip)) { fprintf(stderr, "Invalid IP range\n"); } else { scanner->config = new_config; } pthread_mutex_unlock(&scanner->lock); } // 配置 config_t default_config = { .enable_scan = 1, .scan_cycle = 300, // 5分钟 .packet_interval = 100, // 100毫秒 .entry_ttl = 1800, // 30分钟 .start_ip=1, .end_ip=1 }; int main() { default_config.start_ip = inet_addr("192.168.157.1"); default_config.end_ip = inet_addr("192.168.157.254"); arp_scanner scanner = { .entries = malloc(INITIAL_SIZE * sizeof(arp_entry)), .entry_count = 0, .max_entries = INITIAL_SIZE, .config = default_config }; pthread_mutex_init(&scanner.lock, NULL); // 启动扫描线程 pthread_t scan_tid, cleanup_tid; pthread_create(&scan_tid, NULL, scan_thread, &scanner); pthread_create(&cleanup_tid, NULL, cleanup_thread, &scanner); // 启动ARP响应接收 int arp_sock = create_arp_socket(); while (1) { struct _ARP_HDR_new arp_resp; if (recv_arp(arp_sock, &arp_resp) > 0) { process_arp_response(&scanner, &arp_resp); } } // 清理资源 pthread_join(scan_tid, NULL); pthread_join(cleanup_tid, NULL); free(scanner.entries); close(arp_sock); return 0; }我给你的这个代码是正确的,目的是定时扫描网段,但是有一个问题,我抓包的时候发现并不是按网段发送的,arp只会询问一个ip地址,而且定时好像也没有效果,这是什么问题
08-27
在以下代码中,我想在线程拉起来之后再设置scanner.scanning=SCANNING_OFF,应该怎么做呢:#include "arp.h" #include "arp_scanner.h" #include "arp_config.h" #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> /* 静态全局变量初始化 */ static arp_scanner_t scanner = { .entries = NULL , .scanning = SCANNING_OFF, .sockfd = -1, }; /* 扫描器初始化 */ /* * fn static void load_default_config(arp_scanner_t *scanner) * brief 导入默认配置参数 * details None * * param[in] None * param[out]None * return None * * retval None * note None */ static int load_default_config(arp_scanner_t *scanner) { scanner->config.enable = DEFAULT_ENABLE; scanner->config.scan_interval = DEFAULT_SCAN_INTERVAL; scanner->config.send_interval = DEFAULT_SEND_INTERVAL; strncpy(scanner->config.start_ip, DEFAULT_START_IP, sizeof(DEFAULT_START_IP)); strncpy(scanner->config.end_ip, DEFAULT_END_IP, sizeof(DEFAULT_END_IP)); return 0; } // 打印ARP配置 void print_config(const arp_config_t *config) { printf("ARP 配置:\n"); printf(" 功能开关: %s\n", config->enable ? "开启" : "关闭"); printf(" 扫描周期: %d 秒\n", config->scan_interval); printf(" 有效期: %d 秒\n", config->valid_time); printf(" 发包间隔: %d 毫秒\n", config->send_interval); printf(" 起始IP: %s\n", config->start_ip); printf(" 结束IP: %s\n", config->end_ip); } static int arp_init() { /* 初始化扫描器 */ pthread_mutex_init(&scanner.lock, NULL); /* 加载默认配置 */ load_default_config(&scanner); print_config(&scanner.config); // 打印默认配置 /* 创建arp socket */ scanner.sockfd = create_arp_socket(); if (scanner.sockfd < 0) { fprintf(stderr, "创建arp socket失败\n"); return -1; } printf("ARP socket已创建\n"); return 0; } static int arp_reload() { /* */ // 配置修改后的消息通知及配置更新重载 } static int arp_start() { /* 启动arp扫描线程 */ if (pthread_create(&scanner.scan_thread, NULL, arp_scan_thread, &scanner) != 0) { perror("❌ 创建扫描线程失败"); close(scanner.sockfd); return -1; } printf("扫描线程已启动\n"); return 0; } static int arp_stop() { // printf("等待扫描进行(10秒)...\n"); // for (int i = 0; i < 10; i++) { // printf("扫描状态: %s\n", scanner.scanning ? "进行中" : "已停止"); // sleep(1); // } scanner.scanning = SCANNING_OFF; pthread_join(scanner.scan_thread, NULL); printf("扫描已停止\n"); return 0; } int main() { arp_init(); arp_start(); arp_stop(); }
08-22
import time import json import fastapi import uvicorn import serial import signal # from fastapi import FastAPI, HTTPException from fastapi import FastAPI, HTTPException, Request from fastapi.staticfiles import StaticFiles from pydantic import BaseModel #from PLC_Siemens import UserControlReadWriteOp from Modbus_TCP import Modbus_TCP from PanasonicFPXHPLC import PanasonicFPXHPLC import threading import os import sys from pathlib import Path from ScrewInfo import ScrewInfo from ScannerInfo import ScannerInfo from fastapi.responses import FileResponse import glob from HZG import HZG import logging from logging.handlers import RotatingFileHandler from logging.handlers import TimedRotatingFileHandler logging.basicConfig(filename='app.log', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') app = FastAPI() # 新增全局退出控制 exit_flag = threading.Event() main_pid = os.getpid() app.mount("/static", StaticFiles(directory="static"), name="static") sys.modules["fastapi.openapi.docs"].get_swagger_ui_html.__kwdefaults__["swagger_js_url"] = "/static/swagger-ui-bundle.js" sys.modules["fastapi.openapi.docs"].get_swagger_ui_html.__kwdefaults__["swagger_css_url"] = "/static/swagger-ui.css" # plc = PanasonicFPXHPLC("192.168.0.20") plc = PanasonicFPXHPLC(port='COM16', baudrate=115200) hzg = HZG() SignalDi = None lock_Barcode = threading.Lock() lock_Plc = threading.Lock() lock_Screw = threading.Lock() ############################################################ #根据路径下的json文件,创建螺钉机实例 base_dir = os.path.dirname(os.path.abspath(__file__)) # 使用Path对象处理路径 root_path = Path(base_dir) # 递归遍历所有.json文件 #构造空的螺钉机字典 ScrewDeviceList ={} #构造空的扫码枪机字典 ScannerDeviceList ={} #遍历路径下 json文件 for json_file in root_path.rglob("*.json"): with open(json_file, 'r', encoding='utf-8') as file: data = json.load(file) # 获取配置文件中的IPPort DeviceType = data["DeviceType"] if DeviceType == "Screw": # 将文件信息存入字典 # 获取配置文件中的IPPort ip = data["Ip"] port = (data["Port"]) info = {json_file.stem: ScrewInfo(ip,port)} ScrewDeviceList.update(info) elif DeviceType == "Scanner": #根据json配置内容,创建扫码枪对象实例 info = {json_file.stem: ScannerInfo(json_file.stem,data["Port"],data["Baudrate"])} ScannerDeviceList.update(info) ############################################################ # 创建一个锁对象 lock = threading.Lock() # # 绑定find_image文件夹路径 IMAGE_FOLDER3 = "D:\\YourImageFolder\\" # 替换为你的文件夹路径 ##绑定左工位image文件夹路径 IMAGE_FOLDER = ("D:\\RawPicture1\\") LastImageFile = None CreateTime_LastImage = None ##绑定右工位image文件夹路径 IMAGE_FOLDER2 = ("D:\\RawPicture2\\") LastImageFile2 = None CreateTime_LastImage2 = None # 新增监控线程 def shutdown_monitor(): while True: if exit_flag.is_set(): print("检测到致命错误,触发系统关闭...") hzg.SendMessageToHZG("检测到致命错误,触发系统关闭...") os.kill(main_pid, signal.SIGINT) # 优雅关闭FastAPI break time.sleep(1) def ScanBarcode(): try: while not exit_flag.is_set(): try: for key, scanner in ScannerDeviceList.items(): if not scanner.connected: continue try: waiting = scanner.Device.in_waiting if waiting > 0: #time.sleep(0.1) raw_data = scanner.Device.read(scanner.Device.in_waiting) try: decoded_data = raw_data.decode('utf-8').strip() if decoded_data: with lock_Barcode: scanner.Data = decoded_data print(decoded_data) #扫到码后调用HZG 服务端指令 HZG完成业务逻辑处理 logging.info("扫码调用活字格文件") print(hzg.BarcodeProcess(key,decoded_data)) logging.info("扫码调用活字格文件完成") print(f"[扫码数据] {scanner.Data}") except UnicodeDecodeError as e: print(f"解码失败 @ {scanner.Port}: {raw_data.hex()}") raise RuntimeError("连续解码错误") from e except (serial.SerialException, OSError) as e: print(f"硬件错误 @ {scanner.Port}: {str(e)}") hzg.SendMessageToHZG(f"硬件错误 @ {scanner.Port}: {str(e)}") raise # 向上抛出致命错误 except RuntimeError as e: print(f"扫码系统关键错误: {str(e)}") hzg.SendMessageToHZG(f"扫码系统关键错误: {str(e)}") exit_flag.set() # 设置全局退出标志 break time.sleep(0.1) except Exception as e: #print(f"扫码线程崩溃: {str(e)}") exit_flag.set() os.kill(main_pid, signal.SIGINT) # 直接发送终止信号 def ReadTorque (): while True: try: for key, screw in ScrewDeviceList.items(): print(key) print("TorqueData") print(screw.Data) time.sleep(0.5) with lock_Screw: rlt = screw.device.read_holding_register(0, 100) #print(rlt) #打螺钉结束信号 #print(rlt[32] ) if rlt[32] == 1: screw.SetScrewFinish() if rlt[32] !=1: screw.ResetScrewFinish() screw.ResetorqueFinish() if screw.CheckIfNeedGetTorque() : #计算扭矩 torque = rlt[24]/10 + rlt[25]/1000 # 计算角度 angle = rlt[26]*10000 + rlt[27] #判断拧紧结果 if rlt[31] == 0: data = {"Torque":torque,"Angle":angle,"Result":True,"ErrorCode":rlt[31]} else: data = {"Torque": torque, "Angle": angle, "Result": False,"ErrorCode":rlt[31]} screw.Data.append(data) screw.SetorqueFinish() #保存扭矩 pass except Exception as ex: print(f"螺钉枪关键错误: {str(ex)}") hzg.SendMessageToHZG(f"螺钉枪关键错误: {str(ex)}") exit_flag.set() # 设置全局退出标志 break time.sleep(0.1) def ScrewLeftFinishProcess (): while True: try: # R50 左打螺钉完成信号 R55 右侧打螺钉完成信号 # 判断完成信号是否从0跳转到1,发生跳转时调用或资格接口 with lock_Plc: logging.info(f"RedaIsLeftScrew:...") IsLeftScrewFinish = plc.read_r_register(50) logging.info(f"IsLeftScrewFinish:{IsLeftScrewFinish}") time.sleep(0.1) logging.info(f"RedaIsLeftTorqu:...") IsLeftReadTorqueFinish = plc.read_r_register(51) logging.info(f"IsLeftReadTorqueFinish:{IsLeftReadTorqueFinish}") if IsLeftScrewFinish and not IsLeftReadTorqueFinish: logging.info(f"StartCallGettorqueByPython") rlt = hzg.CallGettorqueByPython("Left") logging.info(f"EndCallGettorqueByPython:{rlt}") #延时三秒,防止重复调用 time.sleep(3) except Exception as ex: print(f"扫码系统关键错误: {str(ex)}") hzg.SendMessageToHZG(f"扫码系统关键错误: {str(ex)}") exit_flag.set() # 设置全局退出标志 break time.sleep(0.1) def ScrewRightFinishProcess (): while True: try: # R50 左打螺钉完成信号 R55 右侧打螺钉完成信号 # 判断完成信号是否从0跳转到1,发生跳转时调用或资格接口 with lock_Plc: logging.info(f"RedaIsRightScrew:...") IsRightScrewFinish = plc.read_r_register(55) logging.info(f"IsRightScrewFinish:{IsRightScrewFinish}") time.sleep(0.1) logging.info(f"RedaIsRightTorque:...") IsRightReadTorqueFinish = plc.read_r_register(56) logging.info(f"IsRightReadTorqueFinish:{IsRightReadTorqueFinish}") if IsRightScrewFinish and not IsRightReadTorqueFinish: logging.info(f"StartCallGettorqueByPython") rlt = hzg.CallGettorqueByPython("Right") logging.info(f"EndCallGettorqueByPython:{rlt}") #延时三秒,防止重复调用 time.sleep(3) except Exception as ex: print(f"扫码系统关键错误: {str(ex)}") hzg.SendMessageToHZG(f"扫码系统关键错误: {str(ex)}") exit_flag.set() # 设置全局退出标志 break time.sleep(0.1) # def ScrewRightFinishProcess (): # # # while True: # # try: # # # # R50 左打螺钉完成信号 R55 右侧打螺钉完成信号 # # 判断完成信号是否从0跳转到1,发生跳转时调用或资格接口 # with lock_Plc: # IsLeftScrewFinish = plc.read_r_register(50) # # if not IsLeftScrewFinish : # time.sleep(0.5) # with lock_Plc: # IsLeftScrewFinish = plc.read_r_register(50) # if IsLeftScrewFinish: # hzg.CallGettorqueByPython("Left") # # with lock_Plc: # IsRightScrewFinish = plc.read_r_register(55) # if not IsRightScrewFinish : # time.sleep(0.1) # with lock_Plc: # IsRightScrewFinish = plc.read_r_register(55) # if IsRightScrewFinish: # hzg.CallGettorqueByPython("Right") # # # except Exception as ex: # print(f"扫码系统关键错误: {str(ex)}") # exit_flag.set() # 设置全局退出标志 # break # # time.sleep(0.1) @app.get("/GetBarcode") async def GetBarcode (Device:str): try: if Device in ScannerDeviceList: device = ScannerDeviceList[Device] with lock_Barcode: barcode = device.Data device.Data = "" return {"status": 0, "msg": "success", "data": barcode} else: return {"status": -1, "msg": "该设备不存在", "data": None} except Exception as ex: return {"status": -1, "msg": str(ex), "data": None} @app.get("/GetTorque") async def GetTorque (Device:str): try: if Device in ScrewDeviceList: device = ScrewDeviceList[Device] return {"status": 0, "msg": "success", "data": device.Data} else: return {"status": -1, "msg": "该设备不存在", "data": None} except Exception as ex: return {"status": -1, "msg": str(ex), "data": None} @app.post("/SetScrewparameter") async def SetScrewparameter(Device: str, value: str, TorqueUpperLimit: str, TorqueLowerLimit: str, AngleUpperLimit: str, AngleLowerLimit: str): """ 向指定设备的寄存器中写入地址值,并设置扭矩上下限 :param Device: 设备名称 :param address: 寄存器地址 :param value: 要写入的值 :param TorqueUpperLimit: 扭矩上限,写入地址 58 :param TorqueLowerLimit: 扭矩下限,写入地址 60 :return: 返回操作状态信息 """ try: Rlt = { "status": 0, "msg": "写入成功", "data": { "address": None, "TorqueUpperLimit": None, "TorqueLowerLimit": None } } if Device in ScrewDeviceList: device = ScrewDeviceList[Device] with lock_Screw: #写入任务数参数 result_Task = device.device.write_holding_register(48, 1) if result_Task != (48, 1): Rlt["status"] = -1 Rlt["msg"] = "写入任务数失败" return Rlt print("写入任务数到地址 48 成功") result_Parameter = device.device.write_holding_register(49, 1) if result_Parameter != (49, 1): Rlt["status"] = -1 Rlt["msg"] = "写入参数失败" return Rlt print("写入参数到地址 49 成功") # 写入扭矩目标值到地址 56 result_StandardValue = device.device.write_holding_register(56, int(value)) if result_StandardValue != (56, int(value)): Rlt["status"] = -1 Rlt["msg"] = "写入扭矩目标值失败" return Rlt print(f"写入目标值到地址 56 成功,值: {value}") # 写入扭矩上限到地址 58 result_TorqueUpperLimit = device.device.write_holding_register(58, int(TorqueUpperLimit)) if result_TorqueUpperLimit != (58, int(TorqueUpperLimit)): Rlt["status"] = -1 Rlt["msg"] = "写入扭矩上限失败" return Rlt print(f"写入扭矩上限到地址 58 成功,值: {TorqueUpperLimit}") # 写入扭矩下限到地址 60 result_TorqueLowerLimit = device.device.write_holding_register(60, int(TorqueLowerLimit)) if result_TorqueLowerLimit != (60, int(TorqueLowerLimit)): Rlt["status"] = -1 Rlt["msg"] = "写入扭矩下限失败" return Rlt print(f"写入扭矩下限到地址 60 成功,值: {TorqueLowerLimit}") # 写入转角上限到地址 64 result_AngleUpperLimit = device.device.write_holding_register(64, int(AngleUpperLimit)) if result_AngleUpperLimit != (64, int(AngleUpperLimit)): Rlt["status"] = -1 Rlt["msg"] = "写入转角上限失败" return Rlt print(f"写入转角上限到地址 64 成功,值: {AngleUpperLimit}") # 写入转角下限到地址 66 result_AngleLowerLimit = device.device.write_holding_register(66, int(AngleLowerLimit)) if result_AngleLowerLimit != (66, int(AngleLowerLimit)): Rlt["status"] = -1 Rlt["msg"] = "写入转角下限失败" return Rlt print(f"写入转角下限到地址 66 成功,值: {AngleLowerLimit}") # 写入扭矩参数保存 result_ScrewSave = device.device.write_holding_register(50, 1) if result_ScrewSave!= (50, 1): Rlt["status"] = -1 Rlt["msg"] = "写入扭矩参数保存失败" return Rlt print("写入扭矩参数保存到地址 50 成功") return {"status": 0, "msg": "写入成功", "data": None} else: return {"status": -1, "msg": "该设备不存在", "data": None} except Exception as ex: return {"status": -1, "msg": str(ex), "data": None} @app.get("/ClearTorque") async def ClearTorque (Device:str): try: if Device in ScrewDeviceList: device = ScrewDeviceList[Device] device.Data.clear() return {"status": 0, "msg": "success", "data": None} else: return {"status": -1, "msg": "该设备不存在", "data": None} except Exception as ex: return {"status": -1, "msg": str(ex), "data": None} @app.get("/SetData") async def SetData (RegisterType:str,Address:str,Value:str,Type:str): try: with lock_Plc: if RegisterType == "DT": if Type == "U8": logging.info("SetData:开始读取write_d_register_fineshed数据") write_d_register_fineshed=plc.write_d_register(int(Address), int(Value), Type) logging.info(f"write_d_register_fineshed:{write_d_register_fineshed}") if write_d_register_fineshed:#plc.write_d_register(int(Address),int(Value),Type): return {"status": 0, "msg": "写入成功", "data": None} else: return {"status": -1, "msg": "写入失败", "data": None} if Type == "String": logging.info("SetData:开始读取write_d_register_fineshed数据") write_d_register_fineshed = plc.write_d_register(int(Address),Value,Type) logging.info(f"write_d_register_fineshed:{write_d_register_fineshed}") if write_d_register_fineshed: # plc.write_d_register(int(Address),Value,Type): return {"status": 0, "msg": "写入成功", "data": None} else: return {"status": -1, "msg": "写入失败", "data": None} elif RegisterType == "R": logging.info("SetData:开始读取write_r_register_fineshed数据") write_r_register_fineshed = plc.write_r_register(int(Address),int(Value)) logging.info(f"write_r_register_fineshed:{write_r_register_fineshed}") if write_r_register_fineshed:#plc.write_r_register(int(Address),int(Value)): return {"status": 0, "msg": "写入成功", "data": None} else: return {"status": -1, "msg": "写入失败", "data": None} else: return {"status": -1, "msg": "寄存器类型不存在", "data": None} except Exception as ex: print(f"读写PLC错误: {str(ex)}") hzg.SendMessageToHZG(f"读写PLC错误: {str(ex)}") exit_flag.set() # 设置全局退出标志 @app.get("/GetData") async def GetData(RegisterType: str, Address: str,Type:str): try: logging.info("Start:开始读取PLC数据") with lock_Plc: if RegisterType == "DT": if Type == "String": logging.info(f"GetData:String...") rlt = plc.Read_string(int(Address)) if rlt != None: logging.info(f"End:DT/String{rlt}") return {"status": 0, "msg": "读取成功", "data":rlt} else: return {"status": -1, "msg": "读取失败", "data": None} else: logging.info(f"GetData:U8...") rlt = plc.read_dt_register(int(Address)) if rlt != None: logging.info(f"End:DT/U8{rlt}") return {"status": 0, "msg": "读取成功", "data": rlt} else: return {"status": -1, "msg": "读取失败", "data": None} elif RegisterType == "R": logging.info(f"GetData:R...") rlt = plc.read_r_register(int(Address)) if rlt != None: logging.info(f"End:R/Bool{rlt}") return {"status": 0, "msg": "读取成功", "data": rlt} else: return {"status": -1, "msg": "读取失败", "data": None} else: return {"status": -1, "msg": "寄存器类型不存在", "data": None} except Exception as ex: print(f"读写PLC错误: {str(ex)}") hzg.SendMessageToHZG(f"读写PLC错误: {str(ex)}") exit_flag.set() # 设置全局退出标志 @app.get("/imagesLeft/{filename}") async def get_image(filename: str): # images = glob.glob(os.path.join((IMAGE_FOLDER+"*.bmp"))) images = glob.glob(os.path.join((IMAGE_FOLDER+"*.jpg"))) if not images: return {"error": "File not found"} images.sort(key=os.path.getmtime) if os.path.isfile(images[-1]): LastImageFile = images[-1] return FileResponse(images[-1]) @app.get("/CheckIfHaveNewImage1/") async def CheckIfHaveNewImage(): global LastImageFile,CreateTime_LastImage images = glob.glob(os.path.join((IMAGE_FOLDER + "*.jpg"))) if not images: return {"status": -1, "msg": "文件夹无照片", "data": None} images.sort(key=os.path.getmtime) if os.path.isfile(images[-1]): if LastImageFile != None: CreateTime_new = os.path.getmtime(images[-1]) if CreateTime_LastImage != CreateTime_new: CreateTime_LastImage = CreateTime_new LastImageFile = images[-1] return {"status": 0, "msg": "照片已经更新", "data": None} else: CreateTime_new = os.path.getmtime(images[-1]) CreateTime_LastImage = CreateTime_new LastImageFile = images[-1] return {"status": 0, "msg": "照片已经更新", "data": None} return {"status": -1, "msg": "照片未更新", "data": None} @app.get("/imagesRight/{filename}") async def get_image(filename: str): # images = glob.glob(os.path.join((IMAGE_FOLDER2+"*.bmp"))) images = glob.glob(os.path.join((IMAGE_FOLDER2+"*.jpg"))) if not images: return {"error": "File not found"} images.sort(key=os.path.getmtime) if os.path.isfile(images[-1]): LastImageFile = images[-1] return FileResponse(images[-1]) @app.get("/CheckIfHaveNewImage2/") async def CheckIfHaveNewImage(): global LastImageFile2,CreateTime_LastImage2 images = glob.glob(os.path.join((IMAGE_FOLDER2 + "*.jpg"))) if not images: return {"status": -1, "msg": "文件夹无照片", "data": None} images.sort(key=os.path.getmtime) if os.path.isfile(images[-1]): if LastImageFile2 != None: CreateTime_new = os.path.getmtime(images[-1]) if CreateTime_LastImage2 != CreateTime_new: CreateTime_LastImage2 = CreateTime_new LastImageFile2 = images[-1] return {"status": 0, "msg": "照片已经更新", "data": None} else: CreateTime_new = os.path.getmtime(images[-1]) CreateTime_LastImage2 = CreateTime_new LastImageFile2 = images[-1] return {"status": 0, "msg": "照片已经更新", "data": None} return {"status": -1, "msg": "照片未更新", "data": None} @app.get("/find-image/{filename}") async def find_image(filename: str): try: # 支持的图片扩展名 image_extensions = [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".JPG", ".JPEG", ".PNG", ".GIF", ".BMP"] # 遍历文件夹,查找匹配的文件 for file in os.listdir(IMAGE_FOLDER3): file_name, file_extension = os.path.splitext(file) if file_name == filename and file_extension in image_extensions: # 找到匹配的文件,返回图片 image_path = os.path.join(IMAGE_FOLDER3, file) if os.path.isfile(image_path): return FileResponse(image_path) # 如果没有找到匹配的文件,返回错误信息 raise HTTPException(status_code=404, detail="Image not found") except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.on_event("startup") async def startup_event(): hzg.SendMessageToHZG("系统初始化中...") #遍历螺钉机,连接每一个螺钉机 for key, screw in ScrewDeviceList.items(): screw.Open() #遍历扫码枪,扫码枪 for key, Scanner in ScannerDeviceList.items(): Scanner.connect() # 启动监控线程 threading.Thread(target=shutdown_monitor, daemon=True).start() # 启动数据读取线程 threading.Thread(target=ReadTorque, daemon=True).start() threading.Thread(target=ScanBarcode, daemon=True).start() #线程读取打螺钉完成信号 threading.Thread(target=ScrewLeftFinishProcess, daemon=True).start() threading.Thread(target=ScrewRightFinishProcess, daemon=True).start() print("系统初始化完成") hzg.SendMessageToHZG("系统初始化完成") print("PLC connected and FastAPI started.") # 增强关闭事件 @app.on_event("shutdown") def shutdown_event(): print("\n执行安全关闭...") exit_flag.set() # 释放所有硬件资源 for scanner in ScannerDeviceList.values(): scanner.stop() for screw in ScrewDeviceList.values(): screw.Close() print("所有设备连接已安全关闭") if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=39000, log_level="info") #uvicorn.run(app, host="127.0.0.1", port=57000, log_level="info") 以上代码 告诉我哪些是关于hkcamera类的使用 帮我分开 我需要把它融入另一段层序 以上是hikcamera类 import datetime import json import socket import threading import time import uuid class AutoEvent: def __init__(self): self.Event = threading.Event() def Wait(self, timeout: float): Rlt = self.Event.wait(timeout=timeout) self.Event.clear() return Rlt def Set(self): self.Event.set() class HikCamera: __Socket = None def __init__(self): self.__TorqueResultList = [] self.__Lock = threading.Lock() self.__ReceiveEvent = AutoEvent() self.__ReceiveData = b"" self.__IsConnected = False def SetConnect(self, Ip, Port, Timeout=10000): self.__Port = Port self.__IPAddress = Ip self.__Timeout = Timeout def Open(self): if not self.__IsConnected: self.Close() self.__Socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.__Socket.settimeout(self.__Timeout / 1000.0) self.__Socket.connect((self.__IPAddress, self.__Port)) self.__IsConnected = True def Send(self, Data: bytes): self.__Socket.send(Data) def __SendAndReceive(self, data): self.__Socket.send(data) return self.__Socket.recv(1024) def Close(self): if self.__Socket: self.__Socket.close() self.__IsConnected = False def Trigger(self,JobNo:str,Barcode: str): str_cmd = "Start:" + JobNo + "," + Barcode cmd = str_cmd.encode("utf-8") data = self.__SendAndReceive(cmd) str_data = data.decode("utf-8") return str_data def str_to_hex_array(self,input): # 确保字符串长度为偶数 if len(input) % 2 != 0: input = '0' + input # 使用bytes.fromhex转换 return list(bytes.fromhex(input)) if __name__ == '__main__': TimeStamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f") dk = HikCamera() dk.SetConnect("192.168.1.100", 7930) dk.Open() print(dk.Trigger("1","AAaAA")) time.sleep(100000)
06-13
import time import json import fastapi import uvicorn import serial import signal # from fastapi import FastAPI, HTTPException from fastapi import FastAPI, HTTPException, Request from fastapi.staticfiles import StaticFiles from pydantic import BaseModel #from PLC_Siemens import UserControlReadWriteOp from Modbus_TCP import Modbus_TCP from PanasonicFPXHPLC import PanasonicFPXHPLC import threading import os import sys from pathlib import Path from ScrewInfo import ScrewInfo from ScannerInfo import ScannerInfo from fastapi.responses import FileResponse import glob from HZG import HZG import logging from HIKCamera import HikCamera from logging.handlers import RotatingFileHandler from logging.handlers import TimedRotatingFileHandler logging.basicConfig(filename='app.log', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') app = FastAPI() # 新增全局退出控制 exit_flag = threading.Event() main_pid = os.getpid() #x相机初始化 Camera_Left = HikCamera() Camera_Left.SetConnect("192.168.0.100", 7930) Camera_Right = HikCamera() Camera_Right.SetConnect("192.168.0.100", 7931) app.mount("/static", StaticFiles(directory="static"), name="static") sys.modules["fastapi.openapi.docs"].get_swagger_ui_html.__kwdefaults__["swagger_js_url"] = "/static/swagger-ui-bundle.js" sys.modules["fastapi.openapi.docs"].get_swagger_ui_html.__kwdefaults__["swagger_css_url"] = "/static/swagger-ui.css" # plc = PanasonicFPXHPLC("192.168.0.20") plc = PanasonicFPXHPLC(port='COM16', baudrate=115200) hzg = HZG() SignalDi = None lock_Barcode = threading.Lock() lock_Plc = threading.Lock() lock_Screw = threading.Lock() lock_Camera_Left = threading.Lock() lock_Camera_Right = threading.Lock() ############################################################ #根据路径下的json文件,创建螺钉机实例 base_dir = os.path.dirname(os.path.abspath(__file__)) # 使用Path对象处理路径 root_path = Path(base_dir) # 递归遍历所有.json文件 #构造空的螺钉机字典 ScrewDeviceList ={} #构造空的扫码枪机字典 ScannerDeviceList ={} #遍历路径下 json文件 for json_file in root_path.rglob("*.json"): with open(json_file, 'r', encoding='utf-8') as file: data = json.load(file) # 获取配置文件中的IPPort DeviceType = data["DeviceType"] if DeviceType == "Screw": # 将文件信息存入字典 # 获取配置文件中的IPPort ip = data["Ip"] port = (data["Port"]) info = {json_file.stem: ScrewInfo(ip,port)} ScrewDeviceList.update(info) elif DeviceType == "Scanner": #根据json配置内容,创建扫码枪对象实例 info = {json_file.stem: ScannerInfo(json_file.stem,data["Port"],data["Baudrate"])} ScannerDeviceList.update(info) ############################################################ # 创建一个锁对象 lock = threading.Lock() # # 绑定find_image文件夹路径 IMAGE_FOLDER_SaveImage = "D:\\SaveImg\\" # 替换为你的文件夹路径 ##绑定左工位image文件夹路径 IMAGE_FOLDER = ("D:\\SaveImg\\") LastImageFile = None CreateTime_LastImage = None ##绑定右工位image文件夹路径 IMAGE_FOLDER2 = ("D:\\SaveImg\\") LastImageFile2 = None CreateTime_LastImage2 = None # 新增监控线程 def shutdown_monitor(): while True: if exit_flag.is_set(): print("检测到致命错误,触发系统关闭...") hzg.SendMessageToHZG("检测到致命错误,触发系统关闭...") os.kill(main_pid, signal.SIGINT) # 优雅关闭FastAPI break time.sleep(1) def ScanBarcode(): try: while not exit_flag.is_set(): try: for key, scanner in ScannerDeviceList.items(): if not scanner.connected: continue try: waiting = scanner.Device.in_waiting if waiting > 0: #time.sleep(0.1) raw_data = scanner.Device.read(scanner.Device.in_waiting) try: decoded_data = raw_data.decode('utf-8').strip() if decoded_data: with lock_Barcode: scanner.Data = decoded_data print(decoded_data) #扫到码后调用HZG 服务端指令 HZG完成业务逻辑处理 logging.info("扫码调用活字格文件") print(hzg.BarcodeProcess(key,decoded_data)) logging.info("扫码调用活字格文件完成") print(f"[扫码数据] {scanner.Data}") except UnicodeDecodeError as e: print(f"解码失败 @ {scanner.Port}: {raw_data.hex()}") raise RuntimeError("连续解码错误") from e except (serial.SerialException, OSError) as e: print(f"硬件错误 @ {scanner.Port}: {str(e)}") hzg.SendMessageToHZG(f"硬件错误 @ {scanner.Port}: {str(e)}") raise # 向上抛出致命错误 except RuntimeError as e: print(f"扫码系统关键错误: {str(e)}") hzg.SendMessageToHZG(f"扫码系统关键错误: {str(e)}") exit_flag.set() # 设置全局退出标志 break time.sleep(0.1) except Exception as e: #print(f"扫码线程崩溃: {str(e)}") exit_flag.set() os.kill(main_pid, signal.SIGINT) # 直接发送终止信号 def ReadTorque (): while True: try: for key, screw in ScrewDeviceList.items(): print(key) print("TorqueData") print(screw.Data) time.sleep(0.5) with lock_Screw: rlt = screw.device.read_holding_register(0, 100) #print(rlt) #打螺钉结束信号 #print(rlt[32] ) if rlt[32] == 1: screw.SetScrewFinish() if rlt[32] !=1: screw.ResetScrewFinish() screw.ResetorqueFinish() if screw.CheckIfNeedGetTorque() : #计算扭矩 torque = rlt[24]/10 + rlt[25]/1000 # 计算角度 angle = rlt[26]*10000 + rlt[27] #判断拧紧结果 if rlt[31] == 0: data = {"Torque":torque,"Angle":angle,"Result":True,"ErrorCode":rlt[31]} else: data = {"Torque": torque, "Angle": angle, "Result": False,"ErrorCode":rlt[31]} screw.Data.append(data) screw.SetorqueFinish() #保存扭矩 pass except Exception as ex: print(f"螺钉枪关键错误: {str(ex)}") hzg.SendMessageToHZG(f"螺钉枪关键错误: {str(ex)}") exit_flag.set() # 设置全局退出标志 break time.sleep(0.1) def ScrewLeftFinishProcess (): while True: try: # R50 左打螺钉完成信号 R55 右侧打螺钉完成信号 # 判断完成信号是否从0跳转到1,发生跳转时调用或资格接口 with lock_Plc: IsLeftScrewFinish = plc.read_r_register(50) logging.info(f"IsLeftScrewFinish:{IsLeftScrewFinish}") time.sleep(0.1) with lock_Plc: IsLeftReadTorqueFinish = plc.read_r_register(51) logging.info(f"IsLeftReadTorqueFinish:{IsLeftReadTorqueFinish}") if IsLeftScrewFinish and not IsLeftReadTorqueFinish: logging.info(f"StartCallGettorqueByPython") rlt = hzg.CallGettorqueByPython("Left") logging.info(f"EndCallGettorqueByPython:{rlt}") #延时三秒,防止重复调用 time.sleep(2) except Exception as ex: print(f"扫码系统关键错误: {str(ex)}") hzg.SendMessageToHZG(f"扫码系统关键错误: {str(ex)}") exit_flag.set() # 设置全局退出标志 break time.sleep(0.1) def ScrewRightFinishProcess (): while True: try: # R50 左打螺钉完成信号 R55 右侧打螺钉完成信号 # 判断完成信号是否从0跳转到1,发生跳转时调用或资格接口 with lock_Plc: IsRightScrewFinish = plc.read_r_register(55) logging.info(f"IsRightScrewFinish:{IsRightScrewFinish}") time.sleep(0.1) with lock_Plc: IsRightReadTorqueFinish = plc.read_r_register(56) logging.info(f"IsRightReadTorqueFinish:{IsRightReadTorqueFinish}") if IsRightScrewFinish and not IsRightReadTorqueFinish: logging.info(f"StartCallGettorqueByPython") rlt = hzg.CallGettorqueByPython("Right") logging.info(f"EndCallGettorqueByPython:{rlt}") #延时三秒,防止重复调用 time.sleep(2) except Exception as ex: print(f"扫码系统关键错误: {str(ex)}") hzg.SendMessageToHZG(f"扫码系统关键错误: {str(ex)}") exit_flag.set() # 设置全局退出标志 break time.sleep(0.1) def CameraLeftProcess():#L:读:触发相机D414写入结果地址:D406,R:触发相机读D402,写入结果地址:D404 while True: try: with lock_Plc: IsLeftCameraReady = plc.read_d_register(414) time.sleep(0.1) logging.info(f"IsLeftCameraReady:{IsLeftCameraReady}") if IsLeftCameraReady==1: Camera_Left.Open() barcide_Left=hzg.getbarcodefromHZG("左工位") if barcide_Left["照片保存信息"]=="1": save_info="Y" else: save_info="N" Camera_Left_name = barcide_Left["合成的条码返回"] Camera_Left_name=Camera_Left_name.replace("\"", "").replace("#", "_") Camera_Left_road_list=Camera_Left.Trigger(Camera_Left_name, "L", save_info).split(";") Camera_Left_is=Camera_Left_road_list[0] if len(Camera_Left_road_list)==2: path=os.path.join(Camera_Left_road_list[1].replace("\"", ""),Camera_Left_name+ ".jpg").replace('\\', "\\\"") path1 = path.replace("\"", "") Barcode=barcide_Left["合成的条码返回"].split("#")[1] hzg.getImgRoadfromHZG("左工位", path1,Barcode,Camera_Left_name) # HZG.getImgRoadfromHZG("右工位", os.path.join(Camera_Left_road_list[1].replace("\"", ""), barcide_Left["合成的条码返回"].replace("\"", "") + ".jpg")) # HZG.getImgRoadfromHZG("右工位", Camera_Left_road) if Camera_Left_is=="1": with lock_Plc: plc.write_d_register(406, 1) logging.info(f"writeIsLeftCameraFinish:1") time.sleep(2) with lock_Plc: plc.write_d_register(406, 0) time.sleep(0.1) logging.info(f"RedaIsLeftCamera:Clear") else: with lock_Plc: plc.write_d_register(406, 2) logging.info(f"writeIsLeftCameraFinish:2") time.sleep(2) with lock_Plc: plc.write_d_register(406, 0) logging.info(f"RedaIsLeftCamera:Clear") time.sleep(1) except Exception as ex: with lock_Camera_Left: Camera_Left.Close() Camera_Left.Open() print(f"拍照系统关键错误: {str(ex)}") hzg.SendMessageToHZG(f"拍照系统关键错误: {str(ex)}") exit_flag.set() # 设置全局退出标志 break time.sleep(0.1) def CameraRightProcess():#L:读:触发相机D414写入结果地址:D406,R:触发相机读D402,写入结果地址:D404 while True: try: with lock_Plc: IsRightCameraReady = plc.read_d_register(402) logging.info(f"IsRightCameraReady:{IsRightCameraReady}") if IsRightCameraReady == 1: with lock_Camera_Right: Camera_Right.Open() barcide_Right = hzg.getbarcodefromHZG("右工位") if barcide_Right["照片保存信息"] == "1": save_info = "Y" else: save_info = "N" print(barcide_Right["合成的条码返回"]) Camera_Right_name = barcide_Right["合成的条码返回"].replace("\"", "").replace("#", "_") Camera_Right_road_list=Camera_Right.Trigger( Camera_Right_name,"R", save_info).split(";") Camera_Left_is = Camera_Right_road_list[0] if len(Camera_Right_road_list) == 2: path=os.path.join(Camera_Right_road_list[1].replace("\"", ""),Camera_Right_name + ".jpg").replace('\\', "\\\"") path1 = path.replace("\"","") Barcode = barcide_Right["合成的条码返回"].split("#")[1] hzg.getImgRoadfromHZG("右工位", path1, Barcode,Camera_Right_name) # HZG.getImgRoadfromHZG("右工位", Camera_Right_road) if Camera_Left_is=="1": logging.info(f"CameraRightProcess:SUCCESS") with lock_Plc: plc.write_d_register(404, 1) logging.info(f"writeIsRightCameraFinish:1") time.sleep(2) with lock_Plc: plc.write_d_register(404, 0) logging.info(f"RedaIsRightCamera:Clear") else: with lock_Plc: plc.write_d_register(404, 2) logging.info(f"writeIsRightCameraFinish:2") time.sleep(2) with lock_Plc: plc.write_d_register(404, 0) logging.info(f"RedaIsRightCamera:Clear") time.sleep(1) except Exception as ex: with lock_Camera_Right: Camera_Right.Close() Camera_Right.Open() print(f"拍照系统关键错误: {str(ex)}") hzg.SendMessageToHZG(f"拍照系统关键错误: {str(ex)}") exit_flag.set() # 设置全局退出标志 break time.sleep(0.1) # def ScrewRightFinishProcess (): # # # while True: # # try: # # # # R50 左打螺钉完成信号 R55 右侧打螺钉完成信号 # # 判断完成信号是否从0跳转到1,发生跳转时调用或资格接口 # with lock_Plc: # IsLeftScrewFinish = plc.read_r_register(50) # # if not IsLeftScrewFinish : # time.sleep(0.5) # with lock_Plc: # IsLeftScrewFinish = plc.read_r_register(50) # if IsLeftScrewFinish: # hzg.CallGettorqueByPython("Left") # # with lock_Plc: # IsRightScrewFinish = plc.read_r_register(55) # if not IsRightScrewFinish : # time.sleep(0.1) # with lock_Plc: # IsRightScrewFinish = plc.read_r_register(55) # if IsRightScrewFinish: # hzg.CallGettorqueByPython("Right") # # # except Exception as ex: # print(f"扫码系统关键错误: {str(ex)}") # exit_flag.set() # 设置全局退出标志 # break # # time.sleep(0.1) @app.get("/CameraSelectJob") async def CameraSelectJob (Job:str): try: with lock_Camera_Left: #Camera_Left.Open() if Camera_Left.SelectJob(Job): return {"status": 0, "msg": "success" } else: return {"status": -1, "msg": "NG"} except Exception as ex: with lock_Camera_Left: Camera_Left.Close() Camera_Left.Open() print(f"拍照系统换型错误: {str(ex)}") hzg.SendMessageToHZG(f"拍照系统换型错误: {str(ex)}") return {"status": -1, "msg": "NG"} #exit_flag.set() # 设置全局退出标志 @app.get("/GetBarcode") async def GetBarcode (Device:str): try: if Device in ScannerDeviceList: device = ScannerDeviceList[Device] with lock_Barcode: barcode = device.Data device.Data = "" return {"status": 0, "msg": "success", "data": barcode} else: return {"status": -1, "msg": "该设备不存在", "data": None} except Exception as ex: return {"status": -1, "msg": str(ex), "data": None} @app.get("/GetTorque") async def GetTorque (Device:str): try: if Device in ScrewDeviceList: device = ScrewDeviceList[Device] return {"status": 0, "msg": "success", "data": device.Data} else: return {"status": -1, "msg": "该设备不存在", "data": None} except Exception as ex: return {"status": -1, "msg": str(ex), "data": None} @app.post("/SetScrewparameter") async def SetScrewparameter(Device: str, value: str, TorqueUpperLimit: str, TorqueLowerLimit: str, AngleUpperLimit: str, AngleLowerLimit: str): """ 向指定设备的寄存器中写入地址值,并设置扭矩上下限 :param Device: 设备名称 :param address: 寄存器地址 :param value: 要写入的值 :param TorqueUpperLimit: 扭矩上限,写入地址 58 :param TorqueLowerLimit: 扭矩下限,写入地址 60 :return: 返回操作状态信息 """ try: Rlt = { "status": 0, "msg": "写入成功", "data": { "address": None, "TorqueUpperLimit": None, "TorqueLowerLimit": None } } if Device in ScrewDeviceList: device = ScrewDeviceList[Device] with lock_Screw: #写入任务数参数 result_Task = device.device.write_holding_register(48, 1) if result_Task != (48, 1): Rlt["status"] = -1 Rlt["msg"] = "写入任务数失败" return Rlt print("写入任务数到地址 48 成功") with lock_Screw: result_Parameter = device.device.write_holding_register(49, 1) if result_Parameter != (49, 1): Rlt["status"] = -1 Rlt["msg"] = "写入参数失败" return Rlt print("写入参数到地址 49 成功") with lock_Screw: # 写入扭矩目标值到地址 56 result_StandardValue = device.device.write_holding_register(56, int(value)) if result_StandardValue != (56, int(value)): Rlt["status"] = -1 Rlt["msg"] = "写入扭矩目标值失败" return Rlt print(f"写入目标值到地址 56 成功,值: {value}") # 写入扭矩上限到地址 58 with lock_Screw: result_TorqueUpperLimit = device.device.write_holding_register(58, int(TorqueUpperLimit)) if result_TorqueUpperLimit != (58, int(TorqueUpperLimit)): Rlt["status"] = -1 Rlt["msg"] = "写入扭矩上限失败" return Rlt print(f"写入扭矩上限到地址 58 成功,值: {TorqueUpperLimit}") with lock_Screw: # 写入扭矩下限到地址 60 result_TorqueLowerLimit = device.device.write_holding_register(60, int(TorqueLowerLimit)) if result_TorqueLowerLimit != (60, int(TorqueLowerLimit)): Rlt["status"] = -1 Rlt["msg"] = "写入扭矩下限失败" return Rlt print(f"写入扭矩下限到地址 60 成功,值: {TorqueLowerLimit}") with lock_Screw: # 写入转角上限到地址 64 result_AngleUpperLimit = device.device.write_holding_register(64, int(AngleUpperLimit)) if result_AngleUpperLimit != (64, int(AngleUpperLimit)): Rlt["status"] = -1 Rlt["msg"] = "写入转角上限失败" return Rlt print(f"写入转角上限到地址 64 成功,值: {AngleUpperLimit}") # 写入转角下限到地址 66 with lock_Screw: result_AngleLowerLimit = device.device.write_holding_register(66, int(AngleLowerLimit)) if result_AngleLowerLimit != (66, int(AngleLowerLimit)): Rlt["status"] = -1 Rlt["msg"] = "写入转角下限失败" return Rlt print(f"写入转角下限到地址 66 成功,值: {AngleLowerLimit}") # 写入扭矩参数保存 with lock_Screw: result_ScrewSave = device.device.write_holding_register(50, 1) if result_ScrewSave!= (50, 1): Rlt["status"] = -1 Rlt["msg"] = "写入扭矩参数保存失败" return Rlt print("写入扭矩参数保存到地址 50 成功") return {"status": 0, "msg": "写入成功", "data": None} else: return {"status": -1, "msg": "该设备不存在", "data": None} except Exception as ex: return {"status": -1, "msg": str(ex), "data": None} @app.get("/ClearTorque") async def ClearTorque (Device:str): try: if Device in ScrewDeviceList: device = ScrewDeviceList[Device] device.Data.clear() return {"status": 0, "msg": "success", "data": None} else: return {"status": -1, "msg": "该设备不存在", "data": None} except Exception as ex: return {"status": -1, "msg": str(ex), "data": None} @app.get("/SetData") async def SetData (RegisterType:str,Address:str,Value:str,Type:str): try: if RegisterType == "DT": if Type == "U8": logging.info("SetData:开始读取write_d_register_fineshed数据") with lock_Plc: write_d_register_fineshed=plc.write_d_register(int(Address), int(Value), Type) logging.info(f"write_d_register_fineshed:{write_d_register_fineshed}") if write_d_register_fineshed:#plc.write_d_register(int(Address),int(Value),Type): return {"status": 0, "msg": "写入成功", "data": None} else: return {"status": -1, "msg": "写入失败", "data": None} if Type == "String": logging.info("SetData:开始读取write_d_register_fineshed数据") with lock_Plc: write_d_register_fineshed = plc.write_d_register(int(Address),Value,Type) logging.info(f"write_d_register_fineshed:{write_d_register_fineshed}") if write_d_register_fineshed: # plc.write_d_register(int(Address),Value,Type): return {"status": 0, "msg": "写入成功", "data": None} else: return {"status": -1, "msg": "写入失败", "data": None} elif RegisterType == "R": logging.info("SetData:开始读取write_r_register_fineshed数据") with lock_Plc: write_r_register_fineshed = plc.write_r_register(int(Address),int(Value)) logging.info(f"write_r_register_fineshed:{write_r_register_fineshed}") if write_r_register_fineshed:#plc.write_r_register(int(Address),int(Value)): return {"status": 0, "msg": "写入成功", "data": None} else: return {"status": -1, "msg": "写入失败", "data": None} else: return {"status": -1, "msg": "寄存器类型不存在", "data": None} except Exception as ex: print(f"读写PLC错误: {str(ex)}") hzg.SendMessageToHZG(f"读写PLC错误: {str(ex)}") exit_flag.set() # 设置全局退出标志 @app.get("/GetData") async def GetData(RegisterType: str, Address: str,Type:str): try: logging.info("Start:开始读取PLC数据") if RegisterType == "DT": if Type == "String": with lock_Plc: rlt = plc.Read_string(int(Address)) if rlt != None: logging.info(f"End:DT/String{rlt}") return {"status": 0, "msg": "读取成功", "data":rlt} else: return {"status": -1, "msg": "读取失败", "data": None} else: with lock_Plc: rlt = plc.read_dt_register(int(Address)) if rlt != None: logging.info(f"End:DT/U8{rlt}") return {"status": 0, "msg": "读取成功", "data": rlt} else: return {"status": -1, "msg": "读取失败", "data": None} elif RegisterType == "R": with lock_Plc: rlt = plc.read_r_register(int(Address)) if rlt != None: logging.info(f"End:R/Bool{rlt}") return {"status": 0, "msg": "读取成功", "data": rlt} else: return {"status": -1, "msg": "读取失败", "data": None} else: return {"status": -1, "msg": "寄存器类型不存在", "data": None} except Exception as ex: print(f"读写PLC错误: {str(ex)}") hzg.SendMessageToHZG(f"读写PLC错误: {str(ex)}") exit_flag.set() # 设置全局退出标志 @app.get("/imagesLeft/{filename}") async def get_image(filename: str): # images = glob.glob(os.path.join((IMAGE_FOLDER+"*.bmp"))) # images = glob.glob(os.path.join((IMAGE_FOLDER+"*.jpg"))) # if not images: # return {"error": "File not found"} # images.sort(key=os.path.getmtime) # if os.path.isfile(images[-1]): # LastImageFile = images[-1] return FileResponse(LastImageFile) # @app.get("/CheckIfHaveNewImage1/") # async def CheckIfHaveNewImage(): # global LastImageFile,CreateTime_LastImage # # images = glob.glob(os.path.join((IMAGE_FOLDER + "*.jpg"))) # if not images: # return {"status": -1, "msg": "文件夹无照片", "data": None} # images.sort(key=os.path.getmtime) # # if os.path.isfile(images[-1]): # if LastImageFile != None: # CreateTime_new = os.path.getmtime(images[-1]) # if CreateTime_LastImage != CreateTime_new: # CreateTime_LastImage = CreateTime_new # LastImageFile = images[-1] # return {"status": 0, "msg": "照片已经更新", "data": None} # else: # CreateTime_new = os.path.getmtime(images[-1]) # CreateTime_LastImage = CreateTime_new # LastImageFile = images[-1] # return {"status": 0, "msg": "照片已经更新", "data": None} # return {"status": -1, "msg": "照片未更新", "data": None} @app.get("/CheckIfHaveNewImage1/") async def CheckIfHaveNewImage(): global LastImageFile, CreateTime_LastImage all_images = [] # 递归遍历所有Left文件夹 for root, dirs, files in os.walk(IMAGE_FOLDER): # 只处理包含 Left 且为 OK 或 NG 的文件夹 if "Left" in root and (os.path.basename(root) in ["OK", "NG"]): images = glob.glob(os.path.join(root, "*.jpg")) all_images.extend(images) # 所有目录遍历完成后检查 if not all_images: return {"status": -1, "msg": "所有Left文件夹无照片", "data": None} # 获取最新的文件 all_images.sort(key=os.path.getmtime) latest_image = all_images[-1] current = os.path.getmtime(latest_image) # 修复变量名 # 首次初始化 if LastImageFile is None: LastImageFile = latest_image CreateTime_LastImage = current # 修复变量赋值 return {"status": 0, "msg": "首次发现照片", "data": latest_image} # 检测更新(使用精确时间比对) if current > CreateTime_LastImage: # 改为时间戳比较而非不等于 LastImageFile = latest_image CreateTime_LastImage = current return {"status": 0, "msg": "照片已更新", "data": latest_image} return {"status": -1, "msg": "照片未更新", "data": None} @app.get("/imagesRight/{filename}") async def get_image(filename: str): # images = glob.glob(os.path.join((IMAGE_FOLDER2+"*.bmp"))) # images = glob.glob(os.path.join((IMAGE_FOLDER2+"*.jpg"))) # if not images: # return {"error": "File not found"} # images.sort(key=os.path.getmtime) # if os.path.isfile(images[-1]): # LastImageFile = images[-1] return FileResponse(LastImageFile2) # @app.get("/CheckIfHaveNewImage2/") # async def CheckIfHaveNewImage(): # global LastImageFile2,CreateTime_LastImage2 # # images = glob.glob(os.path.join((IMAGE_FOLDER2 + "*.jpg"))) # if not images: # return {"status": -1, "msg": "文件夹无照片", "data": None} # images.sort(key=os.path.getmtime) # # if os.path.isfile(images[-1]): # if LastImageFile2 != None: # CreateTime_new = os.path.getmtime(images[-1]) # if CreateTime_LastImage2 != CreateTime_new: # CreateTime_LastImage2 = CreateTime_new # LastImageFile2 = images[-1] # return {"status": 0, "msg": "照片已经更新", "data": None} # else: # CreateTime_new = os.path.getmtime(images[-1]) # CreateTime_LastImage2 = CreateTime_new # LastImageFile2 = images[-1] # return {"status": 0, "msg": "照片已经更新", "data": None} # return {"status": -1, "msg": "照片未更新", "data": None} @app.get("/CheckIfHaveNewImage2/") async def CheckIfHaveNewImage(): global LastImageFile2, CreateTime_LastImage2 all_images = [] # 递归遍历所有Left文件夹 for root, dirs, files in os.walk(IMAGE_FOLDER2): # 只处理包含 Left 且为 OK 或 NG 的文件夹 if "Right" in root and (os.path.basename(root) in ["OK", "NG"]): images = glob.glob(os.path.join(root, "*.jpg")) all_images.extend(images) # 所有目录遍历完成后检查 if not all_images: return {"status": -1, "msg": "所有Left文件夹无照片", "data": None} # 获取最新的文件 all_images.sort(key=os.path.getmtime) latest_image = all_images[-1] current = os.path.getmtime(latest_image) # 修复变量名 # 首次初始化 if LastImageFile2 is None: LastImageFile2 = latest_image CreateTime_LastImage2 = current # 修复变量赋值 return {"status": 0, "msg": "首次发现照片", "data": latest_image} # 检测更新(使用精确时间比对) if current > CreateTime_LastImage2: # 改为时间戳比较而非不等于 LastImageFile2 = latest_image CreateTime_LastImage2 = current return {"status": 0, "msg": "照片已更新", "data": latest_image} return {"status": -1, "msg": "照片未更新", "data": None} @app.get("/find-image/{filename}") async def find_image(filename: str): try: # 支持的图片扩展名 # image_extensions = [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".JPG", ".JPEG", ".PNG", ".GIF", ".BMP"] # # 遍历文件夹,查找匹配的文件 # for file in os.listdir(IMAGE_FOLDER_SaveImage): # file_name, file_extension = os.path.splitext(file) # if file_name == filename and file_extension in image_extensions: # # 找到匹配的文件,返回图片 # image_path = os.path.join(IMAGE_FOLDER_SaveImage, file) # if os.path.isfile(image_path): # return FileResponse(image_path) if os.path.isfile(filename): return FileResponse(filename) # 如果没有找到匹配的文件,返回错误信息 raise HTTPException(status_code=404, detail="Image not found") except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.on_event("startup") async def startup_event(): hzg.SendMessageToHZG("系统初始化中...") #遍历螺钉机,连接每一个螺钉机 for key, screw in ScrewDeviceList.items(): screw.Open() #遍历扫码枪,扫码枪 for key, Scanner in ScannerDeviceList.items(): Scanner.connect() # 启动监控线程 threading.Thread(target=shutdown_monitor, daemon=True).start() # 启动数据读取线程 threading.Thread(target=ReadTorque, daemon=True).start() threading.Thread(target=ScanBarcode, daemon=True).start() #线程读取打螺钉完成信号 threading.Thread(target=ScrewLeftFinishProcess, daemon=True).start() threading.Thread(target=ScrewRightFinishProcess, daemon=True).start() # #线程读取拍照信号CameraLeftProcess()CameraRightProcess() threading.Thread(target=CameraLeftProcess, daemon=True).start() threading.Thread(target=CameraRightProcess, daemon=True).start() print("系统初始化完成") hzg.SendMessageToHZG("系统初始化完成") print("PLC connected and FastAPI started.") # 增强关闭事件 @app.on_event("shutdown") def shutdown_event(): print("\n执行安全关闭...") exit_flag.set() # 释放所有硬件资源 for scanner in ScannerDeviceList.values(): scanner.stop() for screw in ScrewDeviceList.values(): screw.Close() print("所有设备连接已安全关闭") if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=39000, log_level="info") #uvicorn.run(app, host="127.0.0.1", port=57000, log_level="info") 以上代码 是使用hikcamera类的 帮我把以上代码怎么使用的提取出来 我要加入另一段程序里面去
06-12
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值