【C#】某AGV调度系统源码笔记(十四)

AGV调度类库

自定义appsocket服务器

继承自 AppServer<SLSocketSession> 的自定义 Socket 服务器类,类使用 SuperSocket 库构建,是一个专门针对于某种特定通讯协议的 Socket 服务器实现。

在其构造函数中,通过调用基类(AppServer)的构造函数并传入一个 TerminatorReceiveFilterFactory 实例来初始化服务器。这个 TerminatorReceiveFilterFactory 被配置为使用 "ENDFLAG\r\n" 作为消息的终结符,使用 UTF-8 编码解析消息,并指定了一个自定义的请求信息解析器。

类创建了一个 Socket 服务器,它能够接收特定格式的消息,消息以 "ENDFLAG\r\n" 作为结束标志。当服务器接收到完整的消息后,它会使用 自定义请求信息解析器来解析这个消息,将其分解为定义好的请求信息(如命令和参数等)。这种机制使得 自定义socket服务器非常适合用于处理基于文本协议的通信任务。

由于 自定义socket服务器继承自 AppServer<SLSocketSession>,它自然地支持 SuperSocket 提供的各种高级功能,如会话管理、异步通讯处理等。自定义socket会话指的是对客户端连接的会话封装,它定义了与客户端交互的具体行为,包括如何处理接收到的消息等。通过继承和定制 自定义socket会话,可以实现更加复杂和特定于应用的逻辑。

总之,自定义socket服务器为开发者提供了一个强大而灵活的框架,用于快速构建和部署具有复杂通讯需求的服务器端应用。通过自定义接收过滤器和会话处理逻辑,能够满足多种不同的通讯协议和业务需求。

自定义请求信息解析器

实现了 IRequestInfoParser<StringRequestInfo> 接口。这个类的作用是解析接收到的字符串请求信息,并将之转换为 StringRequestInfo 实例。它提供了灵活的解析方式,支持自定义消息和参数的分隔符。

namespace SuperSocket.SocketBase.Protocol
{
    [DefaultMember("Item")]
    public class StringRequestInfo : RequestInfo<string>
    {
        public StringRequestInfo(string key, string body, string[] parameters);


        public string this[int index] { get; }


        public string[] Parameters { get; }


        public string GetFirstParam();
    }
}

属性

  • 用于分割请求名称和参数的分隔符。

  • 用于分割多个参数的分隔符。

  • 定义了一个常量,值为一个空格字符,作为默认的分隔符。

  • 类型为 BasicRequestInfoParser 的静态只读字段,可用作默认的请求解析器实例。

构造函数

  • 无参数构造函数: 使用默认的分隔符进行初始化。

  • 带参数构造函数: 允许自定义请求名称与参数的分隔符和参数之间的分隔符。

方法

  • 解析请求方法: 接受一个 string参数,表示原始的请求字符串。方法首先根据 请求名称与参数的分隔符 查找请求名称和参数的分界点。如果存在分界点,则将请求字符串分割为请求名称 和参数部分 ;如果不存在分界点,则整个源字符串视为请求名称。参数部分根据 参数之间的分隔符 进行进一步分割,最终构造并返回一个 字符串请求信息实例。

功能描述

自定义请求信息解析器 类提供了一个简单而强大的机制来解析基于文本的请求。这对于基于文本协议的 Socket 通信来说非常重要,使得开发者能够轻松地自定义和扩展请求解析逻辑。通过调整自定义请求名称与参数的分隔符和参数之间的分隔符,可以适配多种不同格式的请求消息,增强了服务端解析请求的灵活性和通用性。这个类在 SuperSocket 框架中尤为重要,它是请求处理流程中不可或缺的一环,确保了服务端能够正确理解和处理客户端发送的每一个请求。

自定义socket服务器

继承自 AppServer<自定义socket会话> 类。这个类利用了 SuperSocket 框架来构建基于套接字的应用程序服务端,特别针对自定义的 自定义socket会话类型的会话处理。

构造函数

  • 在构造函数中,自定义socket服务器通过调用基类的构造函数使用一个 TerminatorReceiveFilterFactory 实例初始化服务器。该工厂类采用了 "ENDFLAG" 作为消息终止符,使用 UTF-8 编码,并传入了一个 自定义请求信息解析器实例,该实例接受 "MFLAG" 作为请求消息标志和 "PFLAG" 作为请求参数标志进行请求信息的解析。

功能描述

自定义socket服务器构造的服务端在接收到以 "ENDFLAG" 结尾的数据时,会认为一条完整的消息已经接收完成。接着使用初始化时定义的 SLRequestInfoParser 来解析数据内容。自定义请求信息解析器会根据 "MFLAG" 分解请求命令和 "PFLAG" 分解出各个参数。这样的设置使得服务器可以处理和识别自定义格式的消息,并将消息适配到 SuperSocket 框架中去。

由于 自定义socket服务器继承自泛型类 AppServer,其中类型参数为 自定义socket会话,表明这个服务端针对的是特定类型的会话,即 自定义socket会话自定义socket会话类将定义与客户端的连接会话在接收到数据后具体如何处理该数据。

通过该框架,开发者能够构建一个可靠的套接字通信服务器,实现基于文本的自定义通信协议。这能够在多种领域中提供强大且灵活的通信服务端解决方案,如自动化指挥调度、物联网设备管理等领域。

自定义socket会话

继承自 AppSession<自定义socket会话>。这个类是会话的具体实现,用于表示和管理与客户端的会话连接。在通信过程中,每个客户端的连接都会实例化一个 自定义socket会话对象,用于处理单个客户端会话所特有的数据和行为。

属性

  • 表示客户端类型,类型为 tcp客户端类型枚举,定义了客户端可能的几种类型,如未知、操作台、APP等。

  • 表示客户端所属分组的名称,类型为 string

  • 客户端所关联的线路编号,类型为 int

  • 客户端的唯一标识,或称之为 平板ID,类型为 int

  • 表示客户端所处的区域类型,类型为 int,可以用来区分客户端所在的不同功能区域或地理位置。

方法

  • 重写 AppSession 中的 TrySend 方法,该方法用于向客户端发送数据。参数包括要发送的数据数组 ,数据的起始偏移 ,和要发送的数据长度 。如果在发送数据过程中发生异常,则会调用 记录错误日志方法,并返回 false 表示发送失败;如果成功发送,则返回 true

功能描述

自定义socket会话提供了必要的属性来描述客户端会话的基本信息(如类型、分组、路线等),这些信息对于管理和区分不同的客户端连接非常重要。通过重写 TrySend 方法并在其中添加异常处理逻辑,提高了服务的健壮性和稳定性,同时也便于问题的追踪和定位。

此类是基于 SuperSocket 框架开发的,所以除了上述自定义的属性和方法之外,它还继承了 AppSession 类中的众多功能和属性,如会话管理、断开连接处理、数据接收处理等。这样的设计使得开发者可以更方便地构建和管理高效、可靠的Socket通信应用。

调度器类

类是在 命名空间下实现 调度器接口的调度类。这个类负责整个自动化调度系统的调度逻辑,包括管理车辆、IO设备、充电桩信息,执行定时任务等等。

属性

  • 车辆信息反馈锁、IO设备信息反馈锁、充电桩信息反馈锁、定时处理任务锁等静态对象,用作多线程编程中对资源的锁定。

  • 通讯基础类对象:通信类,用于与 AGV 交换信息。

  • 交通管制类:交通控制类,处理车辆运动时的交通管制。

  • 路线规划类:计算路线的实例,用于路径规划。

  • 调度系统内部tcp通信类

  • 非标通信或逻辑处理类-注释掉

定时器

  • 定时判断启动被交通管制停止的车辆。

  • 定时拉取未执行任务:用于周期性获取未执行的任务,并将任务分配给合适的车辆。

  • 定时触发检查需要报警的平板:用于定期检查需要报警的平板电脑。

  • 定时删除任务:用于定期删除过期的任务。

方法和函数

  • AGV添加命令、充电桩添加命令、IO设备添加命令等方法,封装了向 AGV 或其他设备发送指令的逻辑。

  • 调度初始化,负责初始化数据库连接、读取系统参数、加载各种档案、初始化交通管制、初始化定时器。

  • 启动调度服务,包括启动 TCP 通信【初始化操作台服务、启动操作台服务、初始化AGV通信、启动AGV通信,如果这些失败了则通过事件委托通知外部并返回false】。

  • 停止调度服务:直接返回true。

  • 同步基础信息数据,重新从数据库中读取系统参数和基础档案,更新核心数据。

  • 封装了调用交通管制逻辑的方法:处理交通管制停车逻辑,检查车辆是否锁定在交管区域。

事件回调

  • 处理 AGV、IO 设备、充电桩的反馈信息。

    AGV反馈: 记录开始时间,查找匹配的AGV信息,如果没找到记录日志并返回,如果收到的AGV状态中的当前站点为0,使用之前记录的站点。检查AGV状态是否变化,加锁,防止多线程同时操作【记录旧的站点信息,更新AGV状态,如果AGV处于低电量状态设置相应状态,处理AGV的掉线和重连逻辑,如果之前掉线,现在重连,记录掉线日志;如果之前未掉线,现在掉线,更新掉线状态,通知外部事件处理器,记录掉线日志,掉线后后续逻辑不再执行 返回。处理自动充电,记录当前时间,检查是否需要开始自动充电,记录结束时间,记录日志。步点变化:如果AGV到达新的站点,记录日志,进行交通管制,将前一站点赋值给小车的历史站点。将车辆当前信息反馈给MES系统。判断回写PLC。处理一下回待命点的车:如果AGV处于待命状态并且在待命地标位置,更新状态。如果AGV的信息发生变化,触发车辆改变事件,更新上一坐标时间。】记录结束时间,记录处理整个AGV状态回报耗时。如果发生异常,记录错误日志。

    IO反馈: 通过ID查找系统已有的IO设备信息,如果没有找到对应IO设备,记录错误并返回。使用锁来处理接收到的IO信息,防止多线程同时操作引起的问题,如果系统记录的IO设备之前掉线,现在恢复链接,则记录日志,如果系统记录的IO设备之前未掉线,现在掉线了,则记录日志。使用接收到的IO设备信息更新系统记录的IO设备信息。

    接收处理充电桩设备回馈信息: 查找匹配的充电桩信息,入股哦没有找到对应的充电桩信息记录日志并返回。加锁处理:如果之前充电桩掉线,现在重连,记录日志。如果之前充电桩未掉线,现在掉线,记录日志。更新充电桩状态信息,处理充电完成逻辑,查找当前正在该充电桩充电的AGV车辆信息,获取充电电量阈值和结束充电阈值,根据充电状态和时间控制是否停止充电【发送停止充电指令,解除充电桩锁定状态,更新AGV车辆的低电量状态、充电时间等信息】。捕获异常,记录错误日志。

  • 定时器处理函数:

    定时启动被交管停止的agv:禁用定时器避免重入,调用交通管理逻辑,处理被停止的AGV车辆。捕获异常(发送异常状态通知并记录日志),最终任务完成后重新启动定时器。

    定时拉取任务并规划相应路线:锁定任务处理对象,防止多线程访问冲突,停止定时器避免重入,遍历所有正在执行任务的车辆,尝试将任务标记为完成,判断车辆是否完成并且处于允许更新任务状态的车辆状态(包括停止 待命 充电),如果车辆需要等待,则记录开始等待时间。解锁储位信息,更新任务详情状态为完成,重置任务详情ID,检查并更新任务总状态为完成。更新AGV车辆任务信息记录到记忆文件中。  判断是否处理自动充电。处理分解具体任务并派发。查找当前有效任务,遍历所有任务判断是否超时,没超时则将分派具体任务信息,开始查找合适的AGV来领取任务,如果任务状态为待处理的,就找空闲的车来执行,如果任务是正在执行中的,则找对应执行小车且状态变成可接受任务的agv来继续执行。找到agv后,如果在交管中或者交管了别的车,先不派发任务。如果当前任务明细已经没有了,则让当前的车回其待命点。否则人前任务有明细,判断是否达到等待时间,如果还需等待,记录日志并continue,否则开始分派任务,获取开始地标和结束地标,确保非空,获取规划路线并发送给小车。领取并开始执行任务,记录当前小车的任务信息,更新任务为执行状态。更新小车当前任务号、任务明细ID,目标站点到车辆任务xml文件。 处理(查找)未回待命点的车辆, 根据情况记录是否还被交管中,判断当前agv是否维护待命点(待命点为空),获取起止地标,规划路线,保存当前车辆路线,发送回待命点路线给车辆。  处理一下任务完成的小车的记忆路线,移除指定小车路线。

自定义函数 

  • 获取路线命令函数:参数为车辆信息,任务类型,任务详情。根据给定的车辆信息、路线类型以及任务详情,生成一条命令指令集合,这些指令将控制AGV车辆沿预定路线移动,并执行特定任务。此函数的核心在于将路线中的每个地标信息转换成能够被AGV车辆识别和执行的动作命令。

    首先,函数通过筛选、分析给定车辆的路线信息中的中间地标,识别出需要执行特殊动作的地标。然后,根据起始地标、这些特殊动作地标和结束地标,逐一创建动作命令实体,并对每个命令实体设定具体动作参数,例如移动方向、速度、旋转角度、避让动作等。特别注意以下几点:车辆如果在起始地标处且需执行特殊任务(如回到待命点、去充电站等),会为命令实体设置相应的动作类型(ActionType)。对于有特殊操作需求的任务(如搬运物料任务),将根据任务细节和存储信息调整动作类型和动作参数。函数还考虑了车辆角度与地标角度的差异,以判断车辆是否需要旋转调整方向。最后,函数通过组装命令实体列表并记录日志,生成最终的 命令转值对象(这里是地标命令列表),这个对象包含了控制车辆执行整个路线所需的所有动作命令集合。这段代码非常详细地展示了如何根据车辆当前状态和任务需求,动态生成控制AGV车辆沿特定路线移动并执行任务的动作命令集。通过这种方式,能够灵活地应对各种运输和搬运场景,提高了AGV车辆的自动化和智能化水平。

  • 发送AGV路线指令:是为自动导引车(AGV)发送行进路线。函数接收三个参数:车辆信息、发送路线的类型、派发任务详情。这个函数主要流程包括检查和记录路线信息、转换路线指令、处理交通管制前的规则、下发路线命令到车辆以及错误处理。

    首先,函数检查车辆路线是否有效(路线点数量大于1)。如果路线无效,则直接返回失败。然后,函数会记录下路线信息,并尝试通过调用 获取路线命令函数来转换路线为车辆可接受的指令集合。如果转换成功,则进一步检查是否有交通管制,如果没有则继续发送路线到车辆。在交通管制检查通过后,该函数将进行几个步骤:创建车辆真实路线的深拷贝,并保存。解锁车辆在交通中的资源,并清除其资源。检查并处理车辆所在充电站的状态。如果车辆正在执行任务(状态为1或3),则取消车辆当前任务,并重新发送路线命令。如果车辆处于其他状态,则直接下发路线命令。函数的最后部分注释掉了一些代码,这部分代码涉及了在不同的发送路线类型和车辆状态下的特殊处理逻辑。如果在处理过程中捕获到任何异常,函数将记录错误日志并返回失败。总的来说,这段代码负责的是根据车辆当前状态和任务需要,控制AGV车辆开始沿着指定的路线移动以执行任务。代码涵盖了从路线指令转换到真正发送命令给AGV车辆的全过程,同时也做了异常处理和日志记录,确保整个下发路线的流程清晰、可靠。

  • 判断是否重新计算路线:异步向自动导引车(AGV)发送路线命令。该方法接收三个参数:车辆信息、发送路线的类型、派发任务的详细信息。其核心功能是在满足特定条件下,计算并下发新路线到指定的AGV车辆。

    方法首先创建一个新的任务,以异步方式执行路线发送逻辑,不阻塞主线程。内部使用一个永真的 while 循环(来不断检查车辆的状态,并执行相应逻辑。在循环的开始,首先通过车辆ID找到车辆的当前信息。如果未找到该车辆,方法结束执行。当车辆状态为0(假设这代表车辆处于空闲状态),方法继续执行;否则,每隔1秒检查一次,直到超时(超过10秒)。在确定车辆处于空闲状态后,方法计算从车辆当前位置到最终目的地的新路线,并生成路线的深拷贝。如果新路线有效(路线点数大于1),则记录车辆当前路线,并尝试保存该路线信息。接下来,将通过 获取路线方法转换新路线为车辆可接受的命令集,如果转换成功,便下发这些命令到AGV车辆。如果车辆当前有其他已锁定的资源,会发送一个停止命令给车辆,确保车辆安全停止。整个方法的核心逻辑是在车辆空闲时,计算并下发新的行进路线,对于中途发现的任何错误或异常情况进行适当的日志记录。由于方法内部使用了异步执行策略和循环等待机制,它能够灵活地处理车辆当前状态,确保只有在车辆真正准备好时才开始下发新路线,提高系统的响应性和可靠性。同时,异常处理确保了在出现错误时不会导致程序崩溃,而是进行恰当的日志记录。

  • 主界面调用发送车辆执行路线

  • 判断是否需要切换自动充电路线:检查并确定是否需要将AGV(自动导引车)发送到充电站进行充电。该过程基于设定的电量阈值、充电时间段、车辆当前状态以及充电站的位置等信息来实现。

    首先,方法尝试从系统参数中获取关于充电的配置信息,包括充电电压阈值、充电桩的安装类型,以及充电的开始和结束时间。接着,方法进入到判断时间段内是否充电的逻辑。如果当前时间位于配置的充电时间内,那么系统将会遍历所有AGV车辆,设置它们的 低电量状态为 true,即视为低电量状态,需要去充电。然后,方法将基于充电桩安装类型(在待命点上或不在待命点上),为每辆处于低电量状态且没有被分配充电点的车辆计算前往最近充电站的路线。如果充电桩位于待命点上,那么该逻辑还会检查车辆是否已经处于充电点位置。如果不在充电位置,则会计算路线并尝试发送该路线指令到车辆。如果在充电位置,则直接设置车辆状态为充电。此外,如果充电桩与待命点分开,方法将寻找一个空闲的充电桩,计算路线,然后发送路线指令给AGV车辆。如果找不到空闲的充电桩,则会尝试将车辆发送回待命点。整个方法通过分别处理在充电时间段内和充电阈值判断两种情况,以确保AGV车辆在必要时能够被及时送往充电站进行充电,以维护车辆的正常运行并防止因电量耗尽而导致的工作中断。此方法包含了较为复杂的逻辑判断,旨在在保证AGV系统高效运转的同时,也顾及了资源的合理分配和使用。

  • 检查任务是否超时:检查AGV(自动导引车)的派发任务是否超时。方法接受一个名为 任务信息 的 调度任务信息 类型参数,代表一个派发任务的信息。以下是该方法的执行流程:首先,方法尝试从系统参数中获取名为 任务超时的任务超时的设置值,并将其转换为 double 类型的数值 任务超时值。如果这个参数为空字符串或者转换失败(或结果为0),则方法直接返回 false,这意味着不执行超时检查。接着,该方法尝试解析 任务创建时间字段为 DateTime 类型的变量 任务创建时间,使用的格式是 "yyyyMMddHHmmss"。如果解析失败,则方法同样返回 false。如果创建时间解析成功且任务超时时间参数有效,方法会计算当前时间和任务创建时间的时间差。如果这个时间差大于或等于设置的任务超时时间,则调用 更新任务状态 方法更新任务状态为5(假定代表任务超时状态),并且返回 true 表示有任务超时。如果任务没有超时,方法返回 false。整个方法通过捕获异常来确保程序的鲁棒性,并在处理过程中通过记录错误日志帮助排查问题。准确地检测任务是否超时对于维护AGV系统的效率和响应性来说是非常重要的,该方法通过比较任务建立时间和当前时间与系统预设的超时时间进行判断,确保了任务能够在预定的时间内完成。

  • 计算小车当前站点到达任务目的站点的路径长度:首先通过站点编号查找当前车辆所在地标和任务目的地标的信息。如果任一地标信息不存在,则记录日志并返回长度为0表明没有可行路径。函数继续检查系统参数 是否导入长度来决定是否需要计算具体的路径长度。如果参数为“是”,则通过 获取路线方法 获取并计算两地标之间的实际路线长度,即通过各个路段的长度之和来计算;如果参数非“是”或为空,则返回路线中地标的数量。

异常处理:如果在路径长度计算过程中出现异常,函数将记录错误日志,并返回 -1 作为错误标记。

判断AGV是否需要开启自动充电:检查传入的AGV车辆对象 的状态。如果AGV处于低电量状态,并且当前站点和计划充电站点一致,且车辆状态允许(状态码为2、0或4),则查询对应充电桩信息。若充电桩状态为0(可能表示空闲),则发送“开始充电”指令,并记录充电日志。如果没有找到对应充电桩,则记录错误日志。异常处理:出现异常时,会记录错误日志。

广播平板的订单信息:如果存在 tpc通信对象,调用该处理器的 同步所有的订单信息方法,并返回包含成功操作码的操作返回信息 对象。如果同步发生异常,记录错误日志并返回包含失败操作码和异常信息的 操作返回信息对象。

更新储位状态和lock状态:使用异步Task工厂启动新的任务,获取系统参数中是否使用储位状态,如果使用储位状态则解锁存储。

自定义内部枚举int型(发送路线类型):执行任务、返回待命点、去充电桩充电、手工任务。

完成任务方法:根据AGV(自动导引车)的状态来完成或重做一个指定的任务。首先,函数尝试获取AGV当前执行的任务详细信息。如果车辆确实存在、任务详细信息有效、且车辆标记为需要完成任务(标志为1),且执行任务编号和任务明细ID有效,则进入任务完成的逻辑处理。函数会标记该任务和任务明细为已完成状态(状态码2),释放任务相关的存储位置,并清除车辆的当前任务和路线信息。同时,将任务编号清空,并在日志中记录完成任务的信息。另外,如果车辆标记为需要重做任务(标志为1),则将任务状态重置,并进行类似的处理流程,但不会释放存储位置。函数中还提及了一段注释掉的代码,涉及到回写PLC的操作,但这部分代码没有启用。异常处理:如果在处理过程中出现异常,函数将记录错误日志。

辅助功能

  • 验证软件的序列号和授权情况。

  • 与外部的 web 服务进行通信。

    调用webservice接口: 被注释掉。

    调用webapi接口: 运行异步任务,如果核心数据的系统参数中包含url获取url并检查是否为空,将小车信息对象放到小车消息中,并转换成json格式,使用httpget方法发送请求,并记录响应结果日志。

    通过Web API发送AGV车辆的相关信息:将传入的 小车信息转换为 小车消息对象,添加到列表中,然后将这个列表转换成JSON字符串。之后,利用 WebService代理类的HttpGet 方法,通过HTTP GET请求将这个JSON字符串作为参数发送到指定的Web API地址,并返回API调用的结果。异常处理:如果调用过程中发生异常,函数将记录错误日志,并返回异常信息作为函数的返回值。

  • 检查是否需要对AGV(自动导引车)执行"回写PLC"的操作:通过 Task.Run 异步启动新任务,不阻塞主线程。在异步任务内,首先检查传入的 小车信息对象是否有效,并检查其路线列表是否有元素。随后找出当前车辆站点在路线列表中的索引位置 当前站点索引,判断这个位置是否达到某个触发条件(这里是索引值大于等于2)。如果达到条件,记录日志并执行 AGV服务器数据访问类的需要更新回调方法更新回写PLC的需要状态。异常处理:出现异常时,记录错误日志

  • 清除AGV车辆的锁定资源:获取与当前车辆相关的所有锁定资源,创建一份深拷贝保存在临时列表 当前小车锁定临时对象中,遍历这个列表,找出每个锁定资源在全局锁定资源列表 交通管制类锁定资源 中的索引位置,并从全局列表中移除。异常处理:如果发生异常,则将异常抛出。

  • 获取当前交通管理中所有车辆的锁定资源信息:如果交通管理对象 或其锁定资源列表 为 null,直接返回空字符串。遍历锁定资源列表,构建包含所有锁定信息的字符串 ,每个锁定资源表示为一个车辆阻挡另一车辆的信息,格式化添加到 交管信息字符串中。异常处理:如果发生异常,则将异常抛出。

总而言之,Dispacther 类作为调度的核心类,协调整个系统的各个部分,确保整个自动化调度系统能够高效、稳定地运作。

外围设备处理器类

主要负责处理外围设备(如按钮盒等)的通信及逻辑处理。

属性

  • 一个静态对象,用于同步处理回调中的线程安全问题。

  • 一个 TCPServer 实例,负责管理 socket 服务器的创建、配置和启动。

  • 一个哈希表,用于记录上次接收到监控传感器信号的时间,以实现滤波功能。

函数方法

  • 初始化并启动 TCP 服务,配置来自 XML 文件的服务参数如端口、超时设置等,然后创建 TCPServer 实例,并注册接收消息的回调函数。

回调和业务逻辑处理

  • 接收到 TCP 消息的回调函数,其作用是处理来自外围设备的信号。内部通过锁 确保线程安全。接收到的消息首先进行基础验证,然后根据消息内容,如按钮盒的 IP 地址和消息类型,决定下一步的业务逻辑。

  • 处理按钮盒请求的核心逻辑。根据接收到的消息,判断是哪个按钮被按下,并调用相应的处理函数如 (处理呼叫),(处理监控),或者 (处理放行)。

详细业务逻辑

  • 处理按钮盒的呼叫请求。基于按钮的配置,生成任务和任务明细,将储位状态、必经地标和任务信息加入数据库中。

  • 处理监控请求,通常涉及到更新储位状态。

  • 处理放行请求,当工作站的任务完成且需要放行时,更新任务状态并允许 AGV 继续执行后续任务。

助手方法

  • 控制按钮灯的状态,用于反馈操作的结果(如点亮或熄灭按钮灯以提示作业人员)。

整体来看,类构造了一个完整的处理外围设备(特别是按钮盒)请求的流程,涵盖从接收请求、解析请求到执行具体业务逻辑,并通过反馈给外围设备(如控制灯的状态)来完成交互。

系统内部设备处理器类

处理调度系统内部的通信逻辑。

类的成员属性

  • 表示调度系统的实例。

  • 用于内部通信服务的服务端实例。

类的成员变量

  • 锁对象,确保线程安全。

主要方法

  • 构造方法 ,会将一个 调度器实例作为参数传递,并注册对应的事件处理程序。

  • 初始化方法用于初始化内部通信的服务器设置,包括端口、文本编码等设置。如果初始化成功,则启动服务器。

  • 启动方法用于启动 内部处理器,目前这个方法只是简单返回 true

  • 停止方法用于停止内部通信的服务器。

  • 用于处理从客户端接收到的请求的方法,根据请求的不同命令,执行对应的业务逻辑。

业务逻辑处理

  • 小车状态改变事件方法在车辆状态变化时会被调用,向所有客户端推送车辆的状态变化信息。

  • 根据内部通信协议执行相应的业务逻辑的方法,如处理平板请求、同步按钮布局等。

  • 用于检查平板的登录状态方法。

数据库操作的方法

 执行数据库的查询和更新操作的方法,用于获取平板配置、生产订单信息以及任务的创建等操作。

内部处理器类贯穿了整个内部通信的核心逻辑,涵盖了从初始化通信服务端开始,到消息接收、事件触发和响应客户端请求等一系列过程,并涉及到操作数据库的一些具体实现。

非标准调度类

封装了处理非标准调度命令的相关逻辑。

属性

该类拥有两个属性:

  • 调度器属性保存了调度系统的主实例。

  • 通讯基础实例属性保存了与 AGV 通讯的 通信基础实例。

构造函数

  • 构造函数 接收一个 调度器类型的对象作为调度系统的主实例,并保存至内部属性。

方法

  • AGV添加命令:向 AGV 下发控制命令,使用 通讯基类实例的 AGV添加控制命令方法发送指定的命令。

  • 写入寄存器:向叉车发送升降命令。这个方法内部构造了 叉车命令枚举类型的指令,根据参数 打开类型(0降,1升)决定叉车的动作,并创建 命令列表类型的对象传递给 AGV添加控制命令方法执行。

类通过与 AGV 通讯的 通信基础实例,实现了特定的物料搬运、设备操作等非标准调度命令的下发。这些命令与 AGV 调度系统的标准操作命令(如移动到某个地标)相比,用于执行更复杂或特殊的任务,比如叉车的升降动作等。

作者陈晓永:智能装备专业高级工程师,软件工程师。机器人自动化产线仿真动画制作 

The End

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值