这个话题其实很不合时宜了,现在串口服务器价格实在太有吸引力了,简单配置就可以实现很多高大上的功能。但作为老旧的通讯方式,多个串口设备直接通过RS485总线接入200Smart还是有很多应用场景的。
轮询是必然的,即使有些串口服务器一个口可以接入多台设备,也还是需要轮询。所以是有延迟的。接入的少延迟低,接入多延迟高。
如果出现485设备掉线的情况,延迟就更高了,不作处理可能有很大机率导致通讯失效,不是失败是失效。失败是技术名词而失效是设备术语。即使TCP通讯也会失败,但却是暂时的。
抛开特殊情况不谈,比如末端设备通讯线开路会导致整条总线失效。
如果是总线上某几台设备通讯故障失败,如何实现在一定时间内跳过失败设备的轮询从而提高通讯效率呢?
轮询的本质是队列排队,只需要剔除故障设备就可以了。但设备不会总失败吧,处理好就需要加入队列轮询了。所以需要一个正常轮询队列和一个暂停队列。为了管理方便,还需要一个状态数组结构。为了方便用户可以简单生成自己配置的通讯任务,需要一张通讯任务表,里面包含Modbus-RTU通讯的相关的数据信息。这样还需要一个关于通讯任务表索引的二维数组。x维是关于从站号的,y维是从站任务索引记录。
需要的技术:FIFO队列、200Smart结构类型的数组。
策略设计:失败几次判定剔除并进入暂停队列,失败计数的窗口、轮询几次需要对暂停队列的一个或多个设备进行轮询一次、暂停设备成功通讯几次判定该设备可以归队、暂停设备的成功次数是连续计数的吗?
时间戳:使用轮询计数器作为时间戳。
现在已经有很长一段时间没有遇到需要很多台Modbus-RTU设备通讯的项目了,这个方案最多一次连接过15台485仪表,30个通讯任务。
基础技术其实不难实现,策略逻辑搞了很长一段时间。