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

2026-05-21 13:46:49183 阅读量

AGV通信类库

相关服务:迪拜VPS服务器

AGV会话基类

提供了AGV会话管理的基本框架及一些通用的属性和方法。

委托:连接socket的委托、发送socket数据包的委托。

属性:数据序号标识、设备ID、设备类型(AGV  充电桩 其他远程ID)、设备名称、通信参数、最后一次收到命令反馈的时间、距最后一次消息收到的时间(秒)、最后一次重新连接的时间、距最后一次连接的时长(秒)、存储明林的线程安全队列、对命令队列进行操作的互斥锁。

构造函数:初始化收到消息的时间和最后一次连接的时间。

获取下一个数据包的索引方法(使用锁对象)。

计算两个坐标之间的直线距离方法。

功能码枚举:读,写。

类被设计为可由其它派生类继承,比如实现具体的AGV会话管理逻辑。基类提供了数据序号生成、距离计算等基本功能,同时通过委托定义了连接Socket和发送数据的通用接口,便于在派生类中实现具体逻辑。

AGV通信会话类1

这个类主要用于处理自动导引车(AGV)的通信会话,包括数据的发送、接收和处理等功能。

属性: 线程同步锁对象、是否停止服务标志、用于TCP网络通信的socket对象、服务状态布尔值、负责socket接收的服务线程、负责接受包体的线程、通讯观察线程(计时器 每秒一次)、用于TCP连接之前测试小车ping通的对象、连接初委托、发送数据委托、读取命令的字节列表、读取寄存器通道的命令列表、写入字节的命令列表。

构造函数:初始化定时器和委托。设置通讯观察定时器属性,使其自动复位并启动,绑定通讯观察定时器的Elapsed事件到通讯观察者处理方法。实例化连接和发送数据的委托。

初始化方法用于初始化通信会话。清理socket相关资源,实例化tcpsocket为tcp通信的socket。设置服务停止标志位false。返回true表示初始化成功。捕获异常,构造小车基本信息,将当前设备id赋值给小车ID,设置小车通讯中断为true,触发小车反馈事件,记录错误日志。

连接Socket 方法用于建立Socket连接。参数为端点和socket对象,使用socket对象连接到传入的网络端点,返回true,捕获异常,记录错误日志。

通讯方法是一个无限循环,用于发送指令和接收AGV反馈。创建命令转值实例对象为null,如果命令队列中有待处理的命令,设置发送次数为0,循环尝试执行命令,知道成功或尝试多次。从队列中中移除已执行的命令赋值给命令转值对象。 否则,如果命令队列为空,则发送查询命令,设置读取命令的字节列表,发送查询命令,记录发送AGV命令消息日志。最外层捕获异常记录错误日志并清理通信资源。

设置查询AGV状态的数据包方法设置读取命令byte列表的内容。清空之前的数据,添加包头,添加设备ID,添加数据索引,添加数据索引,添加指令类型(这里是查询)、添加19个字节的填充数据,添加校验字节,添加包尾。如有异常则抛出。

消息接收器方法用于接收小车反馈命令。无线循环接收AGV的数据,入股哦命令队列为空,并且socket有数据可读,记录操作开始时间,获取AGV的回调数据,记录操作结束时间,日志记录AGV解码耗时,否则没有数据则暂停休息10毫秒。最外层捕获异常清理资源。

清理通讯资源方法:若tcpsocket不为空,则先关闭、释放资源,终止控制线程,终止接收线程,返回清理成功。

通讯观察器是定时器的回调函数,用于观察通讯状态。暂停定时器,若接收超时且距上一次连接时间超过4秒,则尝试重新连接;若接收超时,则触发调度状态事件通知掉线并尝试在1秒后重新连接。最终在非停止服务状态下,重启定时器。

重连方法尝试重新创建连接。如果初始化成功,构造小车状态信息,初始化上一连接时间,若重新启动成功,记录上一连接时间,否则,设置小车通信终端,触发调度状态事件,触发小车反馈事件。 如果初始化失败,构造小车基本状态信息,设置小车ID和通信终端,触发调度状态事件和小车反馈事件。 如果捕获到异常,一样触发以上两个事件。

重启方法尝试重新启动连接和通信线程。设置保持服务器状态为真,解析IP地址创建网络端点,连接到服务器,创建并启动通讯线程,创建并启动接收消息线程,返回true表示重启成功。捕获到异常,设置保持服务器状态为假,构造小车信息(ID、通讯中断)触发小车反馈事件,记录错误日志,返回false表示重启失败。

执行命令方法(传入命令转值变量)解析并执行AGV指令。初始化日志字符串用于记录发送的数据,判断指令类型并构建对应的数据包发送至AGV,如果指令为启动AGV,清空写入字节列表,构建RTU通讯协议的数据包,添加包头、添加设备ID,添加数据索引、添加功能码表示启动命令,添加命令的参数,添加占位空间(空字节),计算并添加校验字节,添加包尾。发送数据包,记录日志,获取AGV的响应结果,返回响应结果。如果指令为停止AGV, 构建数据包(功能码表示停止命令),发送数据。并记录发送AGV消息日志。如果指令为更改AGV路线,将指令值转换为地标列表,遍历每个地标,并发送对应的命令(获取当前操作的迪拜哦,清空日志字符串,清空写入列表,添加包头,添加设备ID,添加序列号,添加功能码,表示路线缓存指令,添加预留字节,添加地标代码的字低字节高字节,判断启动方向并添加到写入字节列表【前进 后退 右旋 左旋】,添加动作类型【提升、降低叉车】到写入字节列表,添加额外的动作字节,添加路径中间动作地标,计算地标拐弯方向并添加到写入列表,如果速度不为默认值,则添加速度设置,如果避障不为默认值,则添加避障设置,处理最后一个地标动作【需要传感器停车、设置IO口指令,切换到指定虚拟地标 ;不需要传感器停车即正常停车,添加正常停车动作的代码,根据动作类型进行不同的处理,取料 放料 自动充电】,计算并填充剩余空间以保证数据包长度一致性,添加空白字节,计算并添加校验字节,添加包围),构造发送前的日志记录,将命令转换为16进制字符串,获取当前设备ID的AGV小车信息,构建并记录当前AGV路径地标信息,记录发送的路径地标信息和路径导航命令。发送数据包直到成功,若发送失败则等待80毫秒后重试。实现数据包大小不足24字节时的补充机制,如果数据包未达到24字节填充剩余部分,添加校验字节,添加包尾。收集发送的数据,将每个字节转换为十六进制字符串并拼接到发送日志字符串,如果能够在核心数据中找到匹配的AGV信息,则记录路径日志,否则日志为无。循环调用发送站点缓存指令方法发送数据包,如果发送失败则80毫秒后重试,直至发送成功。    开始发路线强制站点,发送强制站点数据包,即AGV达到的最终改路线地标,清空写入列表,添加包头,添加设备ID,添加下一数据索引,添加功能码表示终点地标,添加序列化第一个地标代码,填充剩余空间,计算并添加校验字节,添加包尾。收集并记录发送日志,循环发送强制站点数据,如果发送失败则等待并重试。如果核心数据找到相应AGV,更新历史地标信息,更新历史上传地标码,返回成功。如果AGV指令为设置路线站点时,将指令的值转换为地标列表,遍历每个地标并构建对应的数据包【获取当前操作的地标,清空之前的日志和数据列表,添加包头,添加设备ID,添加数据索引,添加功能码表示设置路线站点的指令,添加预留字节,添加地标代码的字节,低字节高字节,如果为起始地标,根据动作类型{取料 放料 }、动作结束标志添加对应的字节码 ,添加路径中间地标坐标,排除起点和终点之外的地标,根据移动方向{后退前进 右旋}添加对应的字节码,添加地标拐弯方向的字节码,添加速度字节,添加避障字节,处理最后一个地标动作,根据是否需要停车添加与传感器停车或正常停车相关的字节指令,计算并添加填充字节以确保数据包长度一致性,添加空白字节填充,添加校验字节,添加包尾,发送数据包之前记录日志,获取并记录当前AGV的路径地标信息,一直尝试发送数据包,直到发送成功】,最终返回成功状态。如果接收到的指令是取消当前任务即停车,清空数据列表,准备新指令,添加包头,添加设备ID,添加数据索引,添加功能码,表示取消任务指令,添加指令参数,标识具体的取消任务操作,填充足够的空白字节以保持数据结构的统一,添加校验字节,添加包围,记录指令发送日志,确定握手机制,确保数据被接收,如果未发送成功等80毫秒重试,返回true。 如果接收到的指令是强制站点设置,清空数据列表,准备新的指令,添加包头,添加设备ID,添加数据索引,添加功能码表示强制站点指令,将强制站点信息转化为字节,填充空白字节以保持数据格式统一,添加校验字节,添加包尾,记录指令发送日志,确定握手,返回true。 如果接收到的指令是设置速度或避障,直接返回true。如果接收到的指令是写寄存器通道, 将指令转化为叉举动作和高度的列表,清除之前的数据,准备新的指令数据,添加包头,添加设备ID,添加数据索引,添加功能码表示写寄存器操作,添加起始位,添加数量表示两组数据动作和高度,将叉举动作和高度信息转化为字节添加到列表中,填充足够的空白字节,添加校验字节,添加包尾,记录指令发送日志,确定握手,返回true。

493fb29924b15578f7bc0af995742121.png

发送站点方法发送站点缓存指令并接收反馈。发送命令tcp socket,等到60毫秒接收数据,定义总长度26字节,断线计数0,已接收长度0,储存接收数据的缓冲区,循环接收所有的数据直到接收完毕,根据未接收长度分配临时缓冲区,单词接收的长度,接收数据得到接收长度,如果接收长度小于等于0,则可能是断线,累计断线次数,超过3次抛出异常。将接收的数据拷贝到总缓冲区,更新已接收长度。  更新最后接收时间,记录日志,接收完成。校验接收的数据,如果校验不成功,记录日志返回false,否则记录日志验证成功,将接收到的数据转换为十六进制格式的字符串并记录日志。判断功能码是否为0,如果不为0则命令执行失败,返回false,更新最后接收时间,返回成功状态。。捕获异常,清除tcp socket一些状态,记录异常日志,返回false。

获取命令反馈方法获取命令执行的反馈。如果在多线程中可以注销下面的锁机制,保证此段代码在同一时间只被一个线程执行。预期接收数据的总长度,接收失败计数,已接收数据的长度,缓冲区用来存储接收的数据,循环接收数据直到完成接收到所有数据【根据剩余需要接收的数据长度分配缓冲区,单次接收数据的长度,如果有数据,从socket接收数据得到接收长度,如果长度小于等于0累计断线次数超过三次抛出异常,将接收到的数据复制到总缓冲区,更新已接收数据的长度】,对接收到的数据进行校验,校验码不符返回false,校验通过,记录接收到的数据日志,将数据转换为16进制字符串, 解析接收到的数据,更新小车信息【如果是停止命令的反馈,根据设备ID获取对应小车信息,如果存在则更新其通讯状态为正常,如果发送的数据与接收的数据中的数据索引一致,则视为成功接收,更新接收时间并返回true,否则不做任何操作】【如果接收到的指令码是0x82则进行小车实体信息的更新,将小车的相关信息从接收到的数据中解析出来,设置小车ID,将当前站带你的高位和地位的二进制字符串连接后转换为十进制整数,获取小车状态码,解析小车的运行距离通过拼接四个字节的二进制字符串后转换为十进制double,解析逻辑站点,同样将高位和低位的二进制字符串拼接后转换为十进制int,解析小车的速度,更新通讯中断状态为正常,解析行走方向和转向方向,解析小车电压值,将电压的整数部分和小数部分拼接后转换为浮点数,解析异常报警信息,初始化异常信息字符串,根据每一位的标志位解析对应的异常信息,如果存在异常则记录到日志中,触发小车状态反馈事件,更新最后接收时间,返回操作成功】【如果是避障传感器反馈,更新小车的碰撞状态,并触发相关事件,更新通讯状态为正常,触发小车状况反馈事件,更新接收时间】【其他返回false】,捕获异常记录日志。

获取校验码方法计算校验位。初始化r为0,遍历字节列表中1-23元素,将字节值转换为十进制字符串,然后解析为整数并累加到r中,从256中减去累加和的256的模,得到校验字节,将校验和转换为字节类型并返回。

发送数据方法重载,负责发送数据。参数为要发送数据的socket对象,待发送的数据列表。记录发送时间,通过socket发送数据,获取命令反馈的返回值,记录发送指令的设备ID发送耗时和结果,返回命令反馈结果。

停止服务方法停止服务并清理资源。标记为停止状态,停止定时器,不继续保持服务状态,关闭并释放socket资源,终止处理线程,如果有接收处理线程也应该停止,返回true。

启动方法启动通信会话。设置保持服务的标志位true,构造网络端点ip和端口,建立tcp连接,创建并启动通信线程,设置后台线程,创建爱你并启动接收消息线程,返回true。捕获异常,设置不保持服务状态,记录并处理已启动失败的情况【构造小车信息设置ID和通讯中断,触发车辆反馈事件记录错误日志返回false】,最终保证通信观察定时器是开启的。

获取空填充的字节方法:创建指定大小的数据,将每个元素设置为0x00,返回填充了空字节的数组。

这个类是一个AGV通信会话的具体实现,它通过TCP协议与AGV进行通信,发送控制指令并接收AGV的状态反馈。内部使用了线程来分别处理数据的发送和接收,通过定时器观察通讯状态,以实现对AGV的实时监控和控制。此外,该类还提供了一系列用于指令编码、发送和接收反馈的方法,以及用于处理通信故障和重连的机制。

AGV通信会话类2

类用来管理与自动导引车(Automated Guided Vehicle, AGV)之间的通信会话。

属性

  • 线程同步时使用的锁对象。

  • 布尔类型,表示是否停止服务。

  • Socket对象,用于TCP通信。

  • 布尔类型,表示服务是否持续运行。

  • Thread类型,负责socket接收的线程。

  • 每秒执行一次通讯观察的计时器。

  • Ping对象,用于TCP连接前测试AGV是否可达。

  • 连接socket委托,用于连接socket。

  • socket发送数据委托,用于发送数据。

  • 读取字节列表和 写入字节列表:List类型,用于存储要读取和写入的数据。

方法

  • 构造函数初始化实例和相应的属性。

  • 初始化:尝试初始化Socket对象并设置 停止标记为 false。

  • 通讯函数:是一个循环过程,负责处理通信逻辑,发送心跳指令,执行AGV指令等。

  • 设置心跳命令方法。

  • 清除并关闭Socket资源,结束通信线程。

  • 连接到指定的ip端点 。

  • 通信观察方法,用于监测AGV的连接状态,并在必要时候尝试重连。

  • 尝试重新连接至AGV。

  • 重新启动通信会话。

  • 执行AGV指令,包括启动、停止、取消任务和下发路径等。

  • 发送执行命令并接收反馈。

  • 发送数据至AGV。

  • 获取AGV执行命令的反馈,处理接收到的消息。

  • 停止服务,终止所有通信和相关线程。

  • 启动服务,连接至AGV的Socket,并启动通信线程。

功能描述

类封装了与AGV进行通信的所有必要逻辑。提供了初始化连接、发送和接收数据、处理AGV指令以及维护通信状态等功能。同时,该类将处理这些功能所需的数据和逻辑细节与其他系统部分隔离,这样可以简化其他部分的代码,并使得AGV的通信逻辑更加容易管理和维护。通过定时器检测通信状态,确保AGV的在线状态,以及在连接丢失时尝试重连,保持系统的稳定性。

AGV通信会话类3

该类旨在为特定AGV车辆提供通信会话管理功能。

属性

  • 当前会话的通讯令牌,使用GUID字符串形式。

  • 布尔类型,标志当前服务是否停止。

  • Timer对象,用于定期观察和维护通讯状态。

  • 两个字节类型列表,分别用于存储读取和写入的字节数据。

  • Socket对象,用于TCP网络通信。

方法

  • 构造函数 初始化AGV会话,设置设备ID、设备类型、通信参数等。

  • 初始化通信会话,设置Socket参数并捕获异常。

  • 启动或重启通信会话。这些方法执行Socket的连接,并启动通信任务。

  • 清理通信会话,关闭Socket并重置相关资源。

  • 停止通信会话,关闭计时器并执行清理操作。

  • 重连方法,在连接丢失或失败时尝试重新建立连接。

  • 异步的通信方法,此方法在子线程中运行,处理发送心跳、执行指令等任务。

  • 设置心跳指令的数据。

  • 执行AGV指令,包括处理指令的发送和校验。

  • 发送执行命令或数据到AGV,并等待执行结果。

  • 获取执行命令后的AGV回调,并处理AGV的反馈数据。

  • 通信状态观察方法,检测AGV的连接状态并在必要时尝试重连。

功能描述

类为AGV提供了一个完整的通信会话管理机制,包括会话的初始化、启动、停止、重连以及指令的发送与反馈处理。它通过异步任务处理数据交换过程,确保了高效和实时的通信。该类通过分配唯一的通讯令牌和周期性的通信状态观察,保障了通信会话的稳定性。各方法实现了对通信过程中可能出现的异常情况的处理,增强了系统的健壮性。

充电桩通信会话类

用于管理与充电站的通信会话。

属性

  •  客户端的 Socket 对象,负责 TCP 网络通信。

  •  一个 Thread 类型,服务线程,处理 socket 接收的任务。

  •  List 类型,用于存储读取和写入操作的字节列表。

  •  Timer 对象,每秒触发一次的通讯观察计时器。

方法

  • 构造函数 初始化 定时器,设置其 自动重置、启用属性,并订阅 Elapsed 事件处理器。

  •  初始化通信会话,设置 Socket 参数,并捕获异常。

  •  启动或重启通信会话,设置网络连接和启动服务线程。

  •  停止服务,关闭计时器、Socket,并终止服务线程。

  •  尝试连接到指定的端点 IP端口。

  •  通讯方法,用于处理充电站的通信逻辑,包括发送查询命令、执行命令和接收反馈。

  •  设置发送的读指令列表。

  •  执行与充电桩相关的指令,如开始充电和停止充电。

  •  发送数据到充电桩,并接收反馈。

  •  通信状态观察方法,定期检查连接状态,并在必要时尝试重连。

  •  重新尝试连接充电桩。

  •  清理通讯会话,关闭资源。

  •  接收数据的方法,处理接收到的消息。

  •  获取充电桩的反馈并处理。

功能描述

类封装了与充电站通信的所有必要逻辑。它提供了通信会话的初始化、启动、停止、重连、指令发送及反馈接收功能。该类通过 通信方法异步执行通信任务,处理数据发送和接收过程,保证了通信的实时性。通过 定时器,它还能及时检测到通信中断并尝试重连,从而维持通信的稳定性。

通信基础类

通信基础类,负责管理并初始化不同类型通信会话(如AGV、充电桩、IO设备等)的集合以及与之关联的控制命令。

属性

  • 小车通讯对象的集合,存储各AGV会话实例。

  • 充电桩通信对象的集合,存储各充电桩会话实例。

  • IO设备通讯会话的集合。

方法

  • 向特定的AGV通信会话添加发送指令。

    根据设备ID查找对应的AGV通讯会话对象,会话非空则将命令添加到队列。否则,找不到对应的通讯会话,记录错误并向委托发送状态事件。

  • 初始化所有AGV小车、充电桩及IO设备的通信会话。

    初始化小车调度组件,充电桩调度组件,停止并清除所有的小车通信会话,给所有在配置列表中的AGV小车创建通信会话,添加到列表。 调用反射执行方法,初始化个AGV小车的通信会话,停止并清除所有充电桩通信会话,给所有在配置列表中的充电桩创建通信会话,并添加到充电桩会话列表。初始化各个充电桩的通信会话。停止并清除所有IO设备会话,给所有在配置列表中的IO设备创建通信会话并尝试初始化。返回true,捕获异常,触发调度状态事件,记录错误日志。

  • 启动所有通信会话。

    遍历AGV会话集合,为每个会话开启通讯,使用新线程执行启动通讯的方法【反射调用会话的启动方法,如果启动成功触发状态改变事件并记录日志,如果启动失败设置小车通讯中断状态,触发状态改变事件并记录日志】,设置后台线程。

    遍历充电桩会话集合,为每个会话开启通讯。

    遍历IO设备会话集合,为每个会话开启通讯。

  • 向特定的充电桩通信会话添加发送指令。

    查找与充电桩ID对应的充电桩会话,如果找到将控制命令加入队列。否则触发状态改变事件。

  • 向特定的IO设备通信会话添加发送指令。

    从IO会话集合中查找对应的会话,如果找到将控制命令加入队列,后略。

自定义函数

  • 通过反射执行一个对象上的方法。

    参数会话对象,方法名称,参数列表。 获取会话对象类型和方法信息,然后调用Invoke运行并返回结果。捕获异常。

  • 通过反射获取一个对象上的属性值。

    参数字段名,对象。获取对象中对应属性名的属性值,并返回。

  • 通过反射设置一个对象上的属性值。

    参数属性名,值对象,对象。 获取对象类型,将值转换为该属性对应的类型,设置实例的属性值,返回true,捕获异常。

功能描述

类为整个通信层的管理提供了一个基础。包含了与自动导引车(AGV)、充电桩以及IO设备进行通信连接和操作的基础结构和方法实现。这个类的核心功能是维护一个通讯会话的集合,并且提供方法去初始化和启动这些会话。这个类允许通过方法添加特定的控制指令到对应设备的通信队列中。

IO会话类

继承自AGV会话基类,主要用于处理自动运输车(AGV)与IO设备之间的网络通信。

属性

  • 一个锁变量,用于线程同步。

  • 标志位,表示服务是否停止。

  • 存储与客户端建立的TCP连接的Socket对象。

  • 是否维持服务标志位,表示服务状态。

  • 服务线程,分别负责处理Socket接收和IO数据接受处理。

  • 通信观察计时器,每秒观察一次通讯状态。

  • 用于TCP连接前测试小车ping通的Ping对象。

  • 委托,分别用于连接Socket和发送数据。

  • 分别用于存储读取和写入数据的字节序列。

方法

  • 初始化通信,创建Socket对象等。

  • 建立与主机的连接。

  • 通讯方法,循环检查是否有命令需要执行,并执行。

  • 接受IO设备反馈命令。

  • 清理通讯,关闭并释放资源。

  • 通讯状态观察方法。

  • 重连和重启服务。

  • 执行命令,根据传入的命令值构建发送数据并发送。

    清除写入列表,添加下一个数据标识,添加字节间隔,设置命令长度,添加设备ID,设置功能码,添加命令数据,转换命令值为整数,根据IO端口状态获取字节列表,在写入列表中添加命令字节,初始化命令字符串,遍历字节列表,将字节转换为字符串添加到命令字符串,记录日志。发送数据并指定是写操作。

  • 处理命令反馈,解析数据并进行反馈。

  • 发送数据的重载方法,用于发送字节序列并接收反馈。

    发送字节数据到服务器,如果功能码是写操作,在操作线程暂停1秒,等待设备响应,接收响应头数据,重置离线计数器和已接收长度,接收响应正文。如果功能码是读取操作,解析IO端口状态【将带解析字节转换为二进制字符串不足8位左侧填充0并转换为字节数组,创建新的io端口信息,设置io端口号,设置io端口状态为(如果字符数组当前位是1则端口状态设置为1,否则设置为0),将io端口信息添加到io设备信息的端口列表中。】,如果是写入操作且响应码为0x0f更新最后接收响应时间直接返回true。

  • 停止服务,关闭计时器和socket连接,终止线程等。

  • 启动服务,创建并连接socket,启动处理线程等。

自定义方法

  • 计算当前通讯中唯一标识。

  • 根据端口号计算对应的发送字节。

总体来说,这个类实现了AGV与IO设备之间的通信协议,包括连接管理、数据发送接收、状态监视等功能。通过TCP协议在网络上进行数据交换,能够在AGV运输系统中进行命令传送、状态检查、故障反馈等操作。

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

The End

本文地址:https://www.limyvps.com/news/26_60393.html