流程图下载地址:https://download.csdn.net/download/cjh16606260986/88711468
最近做了两台超声波一体针焊接机已交货,为提高效率和与客户的流水线并线,所以两台机不能单独工作要协调工作。以发挥最大产能。因此做了这个双机协作通讯。
相关技术
1.Socket通讯
2.ConcurrentQueue对列
3.Task线程
模拟两个的交流。两台机比成两组人。每组有两个人。一个负责通讯(交流,对话),一个负责生产。分工协作。
一号机:一个ConcurrentQueue对列服务这里有两个成员(QS成员、QSM成员)
一个P成员。
二号机也一样。
拆垛机,缓存机区,清扫机
ConcurrentQueue对列服务
主要用于管理所有的通讯请求,为了避免出现冲突,用对列可以实现请求排对效果,先进先出,一个一个处理。
ConcurrentQueue对列服务中有两个成员:QS成员和QSM成员成员。
所有设备的进料,出料请求
监控待料位是否有料,没料向拆垛机发送要料请求。让待料位始终有一盘物料在。监控QS成员是否活着,对列中未处理的请求个数。也可以做一个监控报警的功能。
监控上料位是否有料,没有料时发向ConcurrentQueue对列服务发送要料请求。上料位到料后,监控QS成员是发送的生产料盘码。收到生产料盘码就进行生产流程。生产完成后向ConcurrentQueue对列服务发送出料请求,QS成员收到出料请求后进行处理,在可以出料后,通知P成员出料。
Socket服务端主要用于和Socket客户端进行发送消息和接收消息。
Socket客户端用于和Socket服务端进行发送消息和接收消息。
负责处理进料,出料,向拆垛机要料,接收缓存区到料通知,接收缓存区出料通知
一号机(服务端)进料
当一号机(服务端)P成员没有物料时和ConcurrentQueue对列服务说我没有生产的物料了(发送要料请求)。
一号机(服务端)出料
P成员生产完成后向ConcurrentQueue对列服务发送出料请求,然后等待QS成员的处理通知,收到出料通知后执行出料动作。
负责二号机要料,一号机出料,二号机出料,缓存区到料通知,缓存区出料通知,清扫机要为处理
二号机(客户端)进料
当二号机(服务端)P成员没有物料时和ConcurrentQueue对列服务说我没有生产的物料了(发送要料请求),QS成员收到向一号机(服务端)用Socket客户端发送要料请求。一号机(服务端)收到要料请求后会立刻发送收到要料请求的回复。
二号机(客户端)出料
P成员生产完成后向ConcurrentQueue对列服务发送出料请求,QS成员收到向一号机(服务端)用Socket客户端发送出料请求。一号机(服务端)收到出料请求后会立刻发送收到出料请求的回复。然后等待(服务端)QS成员的处理通知,收到出料通知后执行出料动作。
QS成员请求会安顺序处理,取出请求后先判断当前通讯状态是否为空闲中,是 开始处理请求,先用Dequeue方法从对列中取出一个请求,判断请求类型是进料还是出料。
将通讯状态改成进料处理状态,跟据设备ID(DeviceId)判断是否是本机,如果是先询问本机的生产状态是否为生产中,如果是继续下面的放料逻辑,否则放弃处理,将通讯状态改回空闲。如果设备ID(DeviceId)不是本机通过Socket服务端向客户端发送InSendRequest(进料发送请求)这时的请求没有料盘码,客户端在收到请求后要判断是否有料盘码,如果没有说明是询问生产状态的请求,这时的回复内容主要是IsStartWeld(是否工作中(焊接中)...)的赋值。服务端发送请求后开始等待客户端的回复。收到IsStartWeld为1(true)的回复后,开始处理进料逻辑处理,否则放弃处理,将通讯状态改回空闲。
进料逻辑处理:
先看待料位是否有物料,有就直接下降待料位阻挡,打开皮带电机放料。否则去向拆垛机要料,再监控待料位是否到料,待料位到料后放料,上料位到料监控,到料后扫料盘码,再判断这个请求是否是本机发出的,如果是把要生产的料盘码转给P成员生产,再监控生产状态是否为生产中,是的话本机的进料请求处理完成,将通讯状态改成空闲。如果是2号机(客户端)进料发送【进料发送请求】通知2号机这时请求内容中有料盘码,2号机在收到请求后判断是否有料盘码,有说明这个料盘是发给2号机生产的。这时2号机回复收到发料通知,1号机收到回复后执行放料动作,上料位阻挡下降,等待2号机发送到料通知,2号收到料盘后扫码后就知道这个料盘中给自己生产的还是1号机放料料盘了。收到2号机的到料通知后,1号机上料位阻挡上升,将通讯状态改回空闲。进料逻辑完。
一号机生产完后要出料,这时和QS说我生产完了要出料。QS这时要检查流水线上的二号机缓存区状态是否空闲状态。如果空闲将通讯状态改成出料状态,通知二号机一号机要出料的信息(料盘码)等相关信息通过Socket发送给相关客户端,二号机收到后要马上回复一号机收到的出料请求并同意。一号机收到回复后通知P成员出料。QS要负责一路监控出料执行情况,料盘到了二号机扫码后要发送收到的料盘信息给1号机(发送到料通知)。并继续执行出料。料盘到了缓存区后也要发送通知给一号机(发送到料通知)。这时一号机的QS通讯状态恢复成空闲状态。
二号机(客户端)的Socket客户端收到一号机发送的InSendRequest(进料发送请求)后将请求数据交给ConcurrentQueue对列服务处理。
QS成员收到要处理的请求后,从对列中取出判断是InSendRequest(进料发送请求)时走进料逻辑。
进料逻辑:待料位阻挡下降,监控上料位是否到料,扫料盘码,回复1号机服务端收到料了,判断是否是自己生产(根据1号机发送的请求数据中有生产设备ID和料盘码),如果 是 将料盘码交给P成员进行生产,监控生产状态。将通讯状态改成空闲。
二号机生产完后要出料,先将出料请求交给ConcurrentQueue对列服务,QS收到出料信息后向1号机(服务端)发送出料请求,这时Socket服务端收到请求后将请求数据交给1号机的ConcurrentQueue对列服务进行处理。1号机的QS收到请求后检查2号机缓存区状态是否空闲状态,是通知2号机出料,用Socket服务端发送OutSendRequest(放料(出料)发送请求),等待2号机回复,2号机收到出料通知将出料通知交给2号机的ConcurrentQueue对列服务,2号机的ConcurrentQueue对列服务的QS成员在收到出料通知后先回复1号机收到出料通知并开始处理,通知P成员可以出料了,P成员执行出料动作,QS成员监控缓存的到料情况,缓存区收到料盘后向1号机发送缓存区到料通知,1号机服务端通讯状态改成空闲,2号机通讯状态为空闲,缓存区状态为有料,并记录到料时间。
二号机监控线程QSM成员每2秒监控一次清扫机的要料信号,收到后判断缓存区是否有料,如果有,再判断缓存区的到料时间是否超过了两秒,这是用于解决,清扫机要料太快,缓存区刚到料就立刻放料,这里还没给1号机发送到料通知,这时1号机会一直等待缓存区到料通知,导致进入循环,无法处理下一个请求。所以缓存区到料后要2秒后才能出料。如果时间大于2秒了,缓存区执行出料动作。监控出料情况,出料完成后缓存区阻挡上升,给1号机发送缓存区出料通知,更新缓存区状态。
流程图下载地址:https://download.csdn.net/download/cjh16606260986/88711468