电脑断电关机的问题

ccbbcc 2019-05-24 06:28:39
我写了一个VB上位机程序,和下位机网口通讯,用的协议是UDP。
上位机发命令,下位机控制电机转,可是发现一个问题。
如果上位机程序被关闭,我在窗体unload事件里,给下位机发命令,让电机停止,没问题。
可是如果在上位机软件打开而且电机正在转的情况下,关机,或者断电,这时电机不会停止。
这是个很大的问题。下位机如何判断电脑关机呢?或者网络连接断开?请高手指教,谢谢!
...全文
211 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccbbcc 2019-05-25
  • 打赏
  • 举报
回复
引用 7 楼 脆皮大雪糕 的回复:
上面说的只是下位机能获取到异常 更完整的是双向的通讯。比如(还是比如哈) 上位机每隔一段时间发送一个心跳给下位机,下位机接收到以后除了自己内部进行时钟调整以外,还要给上位机一个反馈信息。如果上位机给了心跳指令,隔一段时间内没有收到下位机的反馈(反馈超时)就可以认为是网络或者下位机完蛋了,发起警报提醒人来处理。 结合上面就实现了,上位机完蛋了下位机收不到心跳会停机,下位机完蛋了上位机收不到回报会报警 如果仅仅是网络断了,那么下位机收不到心跳会停机同时上位机收不到回报会报警。
谢谢!你说的很详细了,我试试
脆皮大雪糕 2019-05-25
  • 打赏
  • 举报
回复
上面说的只是下位机能获取到异常 更完整的是双向的通讯。比如(还是比如哈) 上位机每隔一段时间发送一个心跳给下位机,下位机接收到以后除了自己内部进行时钟调整以外,还要给上位机一个反馈信息。如果上位机给了心跳指令,隔一段时间内没有收到下位机的反馈(反馈超时)就可以认为是网络或者下位机完蛋了,发起警报提醒人来处理。 结合上面就实现了,上位机完蛋了下位机收不到心跳会停机,下位机完蛋了上位机收不到回报会报警 如果仅仅是网络断了,那么下位机收不到心跳会停机同时上位机收不到回报会报警。
脆皮大雪糕 2019-05-25
  • 打赏
  • 举报
回复
引用 4 楼 ccbbcc 的回复:
[quote=引用 2 楼 脆皮大雪糕 的回复:] 通讯协议里增加一个心跳协议。 上位机每隔一段时间,比如10秒向下位机发一个心跳消息。 下位机每隔一段时间(比如一秒)将一个寄存器减1,只要收到心跳消息或者其他命令,这个寄存器就设置为一个值(比如30)。当这个寄存器被减到0电机停止。 这样,不管是你的程序进程异常被杀,还是上位机异常关机,或者网络断掉,最多30秒,最少20秒后电机就会停
感觉时间有点长。[/quote] 没看我说的都是“比如”吗?这里面所有的数字都可以调整的啊 可以做以下推算: 你的下位机的心跳轮询时间设置为A秒,寄存器设置值为B。这样当寄存器重置以后,到下一次重置时间超过 A*B的时间就会停止。 你的上位机发送心跳的间隔为C秒。 那么最坏的情况是,上位机刚发出一个心跳信号,就宕机了。这时候下位机接收到了这个信号,但再也不会收到下一个了,于是宕机A*B秒后就停发动机。 最好的情况是,上位机发出一个心跳信号,在即将发出下一个心跳信号的时候宕机了,此时下位机距离新一轮计时开始已经进过了C秒的时间,还差 A*B-C的时间就会到了,于是会在宕机后 A*B-C秒后停止发动机。 由以上推演,你能知道,利用心跳信号,可以在上位机或者网络出问题后 A*B-C ~ A*B秒内发现并作出反应。调整这几个参数就能将结果落到你希望的范围内。 而且,从推演中可以看出, C必须小于 A*B 并且, A和C不限于整数,只要你的系统反应够快够稳定,你可以做小到毫秒大到海枯石烂的范围内的设定。
舉杯邀明月 2019-05-24
  • 打赏
  • 举报
回复
心跳检测“超时时间”,你自己按需要进行控制啊,你觉得多长合适就设置多长。
UDP协议,哪来的“重联”这个说法?

如果电脑端检测到“断网”了,就执行 Winsock的Close命令;
当检测到“网络可用”时,那就重新绑定IP和端口就行了呗。

下位机那儿,你自己看情况办。
ccbbcc 2019-05-24
  • 打赏
  • 举报
回复
引用 2 楼 脆皮大雪糕 的回复:
通讯协议里增加一个心跳协议。 上位机每隔一段时间,比如10秒向下位机发一个心跳消息。 下位机每隔一段时间(比如一秒)将一个寄存器减1,只要收到心跳消息或者其他命令,这个寄存器就设置为一个值(比如30)。当这个寄存器被减到0电机停止。 这样,不管是你的程序进程异常被杀,还是上位机异常关机,或者网络断掉,最多30秒,最少20秒后电机就会停
感觉时间有点长。
ccbbcc 2019-05-24
  • 打赏
  • 举报
回复
引用 1 楼 舉杯邀明月 的回复:
在“断电关机”时,各进程都不能被执行了,它如何去“发指令”? 在“网络断开”时,网络已经“不通”了,你又如何能通过网络传递数据? 楼主,难道你不觉得你的“逻辑”有问题吗! 我觉得有个变通方式,就是“心跳检测”(这频率就看你允许它们“失联”多久了), 当心跳检测“无响应”时,下位机就“自己停机”吧。
谢谢!断电关机自然不会发指令,可是网络断开还要不要重连呢?
脆皮大雪糕 2019-05-24
  • 打赏
  • 举报
回复
通讯协议里增加一个心跳协议。 上位机每隔一段时间,比如10秒向下位机发一个心跳消息。 下位机每隔一段时间(比如一秒)将一个寄存器减1,只要收到心跳消息或者其他命令,这个寄存器就设置为一个值(比如30)。当这个寄存器被减到0电机停止。 这样,不管是你的程序进程异常被杀,还是上位机异常关机,或者网络断掉,最多30秒,最少20秒后电机就会停
舉杯邀明月 2019-05-24
  • 打赏
  • 举报
回复
在“断电关机”时,各进程都不能被执行了,它如何去“发指令”?
在“网络断开”时,网络已经“不通”了,你又如何能通过网络传递数据?

楼主,难道你不觉得你的“逻辑”有问题吗!


我觉得有个变通方式,就是“心跳检测”(这频率就看你允许它们“失联”多久了),
当心跳检测“无响应”时,下位机就“自己停机”吧。

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧