AGV小车监控系统与PLC博途技术整合

版权申诉
0 下载量 13 浏览量 更新于2024-11-18 收藏 45.56MB ZIP 举报
资源摘要信息: "本资源主要介绍了AGV小车监控系统与PLC博途(TIA Portal)的集成应用,同时涉及到了DevExpress库在Windows窗体应用程序中的使用。AGV(Automated Guided Vehicle,自动导引车)是现代工业自动化物流中的重要组成部分,其监控系统的建设对于提高工厂自动化水平和物流效率具有重要意义。PLC(Programmable Logic Controller,可编程逻辑控制器)是工业自动化中不可或缺的控制核心设备,而TIA Portal是西门子公司为其自动化产品线提供的集成工程软件环境,通过该软件可以实现从项目管理到控制逻辑编程,再到HMI(Human-Machine Interface,人机界面)设计的全集成。 在本资源描述中提到了AGV-monitoring AGV小车监控系统的开发,涉及到多个C#命名空间,表明这是一个基于.NET框架和C#语言的Windows窗体应用程序。其中,DevExpress是一个功能强大的UI控件库,用于创建丰富的用户界面。***是一个.NET下的库,用于与西门子S7系列PLC进行通讯。"information"可能是指程序中使用的某个自定义类或命名空间,包含了程序运行所需的数据信息。"Monitor_AGV.Contributions"和"Monitor_AGV.LoadDatas"可能是程序中用于处理AGV监控数据的相关模块。"Monitor_***munication"则可能涉及AGV与监控系统之间的数据通讯和协议处理。 结合.NET和C#编程语言,使用DevExpress库构建一个用户界面友好的AGV小车监控系统是一个典型的工业信息化项目。通过这个系统,可以实现对AGV小车的实时监控,包括位置跟踪、任务调度、故障诊断等功能。此外,通过***库与PLC的通信可以实现对AGV小车的精确控制和状态监测,这在自动化物流系统中具有很高的应用价值。 本资源中提到的“linq”代表语言集成查询(Language Integrated Query),这是一种在.NET框架下集成查询功能的方法,允许开发者使用统一的语法对多种数据源进行查询。在AGV监控系统中,可能会利用LINQ查询来处理和分析AGV产生的数据,例如查询特定时间内的AGV状态、位置历史记录或者任务完成情况等,从而为决策提供支持。 最后,资源中的"AGV-monitoring-master"标识了一个包含AGV监控项目源代码的压缩包文件名。从这个文件名可以推测,其中包含了整个项目的源代码、资源文件以及必要的配置文件,是一个完整的项目源代码包,可以用于学习、测试和部署AGV监控系统。"master"通常表示这是项目的主分支或主要版本,适用于主开发线和生产部署。 通过本资源,开发者可以了解到如何将.NET平台下的技术与工业自动化硬件相结合,构建一个功能强大的AGV监控系统。同时,也可以从中学习到如何利用LINQ查询技术来处理工业监控数据,以及如何使用DevExpress等工具来提升用户界面的友好性和交互体验。"

void AGVScheduler::assign_task_to_agv(std::vector<Task>& tasks, std::vector<AGV>& agvs) { // 首先按照任务的完成状态、优先级进行排序 std::sort(tasks.begin(), tasks.end(), [](const Task& task_1, const Task& task_2) { if (task_1.completed != task_2.completed) { return !task_1.completed; } else { return task_1.priority < task_2.priority; } }); for (const auto& task : tasks) { std::cout << "Task name: " << task.id << ", Completed: " << task.completed << ", Priority: " << task.priority << std::endl; } // 遍历任务列表,分配任务给可用的小车 for (auto& task : tasks) { if (!task.completed) { AGV* closest_agv = nullptr; // 初始化为 nullptr while (closest_agv == nullptr) { // 查找可用的小车 for (auto& agv : agvs) { if (agv.getState()) { closest_agv = &agv; break; } } if (closest_agv == nullptr) { // 没有可用的小车,等待一段时间再查找 std::this_thread::sleep_for(std::chrono::seconds(1)); } } // 找到最近的可用小车 int min_distance = INT_MAX; for (auto& agv : agvs) { if (agv.getState()) { int distance = abs(agv.getCurrentX()- task.start_x) + abs(agv.getCurrentY() - task.start_y); if (distance < min_distance) { min_distance = distance; closest_agv = &agv; } } } // 将任务分配给 AGV 对象的起点和终点坐标 closest_agv->setStartCoord(task.start_x, task.start_y); closest_agv->setEndCoord(task.end_x, task.end_y); closest_agv->setState(false); task.completed = true; std::cout << closest_agv->getid() << "," << task.id << endl; } } },當沒有小車用的時候就卡死,添加代碼,找到可用小車的開始運行,沒找到可用小車的一直等待,直到有可用小車

2023-05-24 上传

void AGVScheduler::assign_task_to_agv(std::vector<Task>& tasks, std::vector<AGV>& agvs) { // 首先按照任务的完成状态、优先级进行排序 std::sort(tasks.begin(), tasks.end(), [](const Task& task_1, const Task& task_2) { if (task_1.completed != task_2.completed) { return task_1.completed < task_2.completed; // 未完成的任务排在已完成的任务前面 } else { return task_1.priority < task_2.priority; // 同一完成状态下,按照优先级排序 } }); for (const auto& task : tasks) { //std::cout << "Task name: " << task.id << ", Completed: " << task.completed << ", Priority: " << task.priority << std::endl; } // 遍历任务列表,分配任务给可用的小车 for (auto& task : tasks) { if (task.completed == 0) { // 只分配未完成的任务 AGV* closest_agv = nullptr; int wait_time = 0; // 等待时间计数器 // 初始化为 nullptr while (closest_agv == nullptr && wait_time < 1) { // 最多等待 1 秒钟 // 查找可用的小车 for (auto& agv : agvs) { if (agv.getState()) { closest_agv = &agv; break; } } if (closest_agv == nullptr) { // 没有可用的小车,等待一段时间再查找 std::this_thread::sleep_for(std::chrono::seconds(1)); wait_time++; } } if (closest_agv != nullptr) { // 找到可用小车 // 找到最近的可用小车 int min_distance = INT_MAX; for (auto& agv : agvs) { if (agv.getState()) { int distance = abs(agv.getCurrentX()- task.start_x) + abs(agv.getCurrentY() - task.start_y); if (distance < min_distance) { min_distance = distance; closest_agv = &agv; } } } // 将任务分配给 AGV 对象的起点和终点坐标 closest_agv->set_task_id(task.id); closest_agv->setStartCoord(task.start_x, task.start_y); closest_agv->setEndCoord(task.end_x, task.end_y); closest_agv->setState(false); // 小车被占用 task.completed = 1; // 任务状态修改为进行中 std::cout << "agv_id" << closest_agv->getid() << "————" << "task_id"<<task.id << "task_completed"<< task.completed << endl; } else { std::cout << "task_id-" << task.id << "No available AGV!" << "task_completed"<< task.completed <<endl; } } },修改代碼為在最後輸出所有task的agvid,taskid和task的completed

2023-05-25 上传

void AGVScheduler::assign_task_to_agv(std::vector<Task>& tasks, std::vector<AGV>& agvs) { // 首先按照任务的完成状态、优先级进行排序 std::sort(tasks.begin(), tasks.end(), [](const Task& task_1, const Task& task_2) { if (task_1.completed != task_2.completed) { return !task_1.completed; } else { return task_1.priority < task_2.priority; } }); for (const auto& task : tasks) { std::cout << "Task name: " << task.id << ", Completed: " << task.completed << ", Priority: " << task.priority << std::endl; } // 遍历任务列表,分配任务给可用的小车 for (auto& task : tasks) { if (!task.completed) { AGV* closest_agv = nullptr; // 初始化为 nullptr // 查找可用的小车 while (closest_agv == nullptr) { for (auto& agv : agvs) { if (agv.getState()) { closest_agv = &agv; break; } } if (closest_agv == nullptr) { // 没有可用的小车,等待一段时间再查找 std::this_thread::sleep_for(std::chrono::seconds(1)); } } // 找到最近的可用小车 int min_distance = INT_MAX; for (auto& agv : agvs) { if (agv.getState()) { int distance = abs(agv.getCurrentX()- task.start_x) + abs(agv.getCurrentY() - task.start_y); if (distance < min_distance) { min_distance = distance; closest_agv = &agv; } } } closest_agv->setCurrentX(closest_agv->getCurrentX()); closest_agv->setCurrentY(closest_agv->getCurrentY()); closest_agv->setEndCoord(task.end_x, task.end_y); // 将任务终点分配给 AGV 对象的终点坐标 closest_agv->setStartCoord(task.start_x, task.start_y); // 将任务起点分配给 AGV 对象的终点坐标 closest_agv->setState(false); task.completed = true; std::cout << closest_agv->getid() << "," << task.id << endl; } } },修改爲找到可用的小車,找不到等待一段时间再查找。已經找到的可用小車的任務繼續下面的流程,黨等待一段時間找到可用任務的小車也繼續下面的流程

2023-05-24 上传