登录
首页 PLC论坛 PLC论坛
回帖 发帖
正文

主题:设计一个公平的抢答器

点击:7596 回复:19

 
许多教科书上都有抢答器的例子,但不少抢答器是不公平的,也就是说,如果两个人在同一plc扫描周期内按下抢答按钮,抢答程序只接受程序位置上排在前面的抢答者的按钮信号。下面是一个有三个抢答者的抢答器,变量分配如下:

i0.0 -- 主持人按钮
 i0.1,i0.2,i0.3 -- 分别为三个抢答者按钮;
 q0.0,q0.1,q0.2 -- 分别为对应于抢答者的警报器输出;

   下图是两个按钮(i0.1,i0.2)同时按下后的情况,图中得电的接口和线圈呈红色。图中可见,同i0.1对应的输出q0.0也呈红色,表示q0.0=1,然而,第二个输出q0.1却是是黑色,即q0.1=0,原因是前面的q0.0=1阻断了q0.1的通路,请注意图中非q0.0呈黑色。

http://blog.gkong.com/uploadfile4/2010121641740117.jpg

  这就造成了抢答的不公平性。为了解决这个问题,可以考虑先用中间变量保存抢答输出。在进行中间变量计算时,只用到上一次的输出,等到所有计算完成,再把所有中间变量输出。下图是新的梯形图以及在两个按钮同时按下后的情形:

http://blog.gkong.com/uploadfile4/201012164149125.jpg


图中可见,当两个按钮i0.0和i0.1同时按下时,两个输出q0.0和q0.1同时为红色。不过,这个程序依旧有问题,在下一周期时,所有的输出又都变成了黑色:


   
http://blog.gkong.com/uploadfile4/2010121641527189.jpg

   出现这种情况的原因是,每个输出分别阻止了下一个输出继续保持为1。为了解决这个问题,下面我们再把程序做一个改动:

http://blog.gkong.com//uploadfile4/2010121642014418.jpg

它完全达到了公平抢答器的要求。



----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=130938&Name=lingcore
10-12-16 04:27
楼主,您的程序无法达到抢答器的要求,因为抢答器要求在同一时间内只能有一个输出,您的程序在同一时间内如果同时按下,那么会存在多个输出~~~~~您的程序连抢答器的要求都无法实现。
Good Luck~表情
10-12-16 09:14
这里有一个抢答器控制要求的描述问题。在提出要求的时候,应该讲明如果两个按钮同时按下,那么应该怎样处理。
如果一定要求只输出一个信号,可以考虑随机选择,这样也会达到比较公平的效果。
我认为当两个信号同时到达的时候,同时产生两个输出是比较好的解决方案。抢答器程序实际上可以有多种应用,比如记录谁是跑步比赛第一名,那些故障首先出现等等。在这些情况下,如果有多个事件同时出现,把它们一起报告,似乎是更好的解决方法。

引用 cvlsam 在 2010/12/16 9:14:37 发言【内容省略】

10-12-17 01:40
哈哈 楼主辛苦
个人观点:用plc就不可能有绝对的“公平”
所谓的第一也只能在“公差”范围内的第一,即便“并列第一”如果将分辨率提高到一定程度也是可以分出1-2(理论)
10-12-18 09:15
纯理论,实际抢答中没有多大意义...................
主持人与选手之间的位置、距离......==各种因素的影响造成的时间误差都大于扫描周期的..........
实际中的公平是相对的....................
最后修改:2010/12/19 15:44:07
10-12-19 15:42
5楼
该帖内容不符合相关规定!
11-02-28 09:40
我试试
11-03-06 15:40
看看咱的这个算不算公平呢?
只要主持人没按下抢答允许,谁先乱按的都被亮灯弃权;
只要在一个程序内多个同时按下的都有效,过了一个程序周期的将失去抢答的权限。
在一定的时间内无人抢答,时间过后抢答无效。
程序如图:
附件
最后修改:2011/3/12 2:04:02
11-03-12 01:58
上传不了图片?!表情
贴程序吧..
ORGANIZATION_BLOCK 主程序:OB1
TITLE=程序注释
// 七路抢达器
// I0.0~I0.7 八路抢答输入
// I1.0 开始抢答允许
// I1.1 复位所有输出
//
// Q0.0~Q0.7 八路抢答正常输出
// Q1.0~Q1.7 七路抢答超抢警告
// Q2.0 开始抢答允许输出
// Q2.1 抢答超时输出
//
BEGIN
Network 1 // 网络标题
// 网络注释
LD     SM0.0
A      I1.0
EU
TOF    T38, 1000
S      Q1.0, 1
Network 2
LDB>   IB0, 0
O      M0.0
LPS
A      T38
LPS
EU
MOVB   IB0, QB0
LRD
S      M0.0, 1
LPP
ED
S      Q2.1, 1
LPP
AN     T38
LPS
A      I0.0
EU
S      Q1.0, 1
LRD
A      I0.1
EU
S      Q1.1, 1
LRD
A      I0.2
EU
S      Q1.2, 1
LRD
A      I0.3
EU
S      Q1.3, 1
LRD
A      I0.4
EU
S      Q1.4, 1
LRD
A      I0.5
EU
S      Q1.5, 1
LRD
A      I0.6
EU
S      Q1.6, 1
LPP
A      I0.7
EU
S      Q1.7, 1
Network 3 // 网络标题
// 网络注释
LD     SM0.0
LD     I1.1
O      Q2.1
ALD
R      Q0.0, 8
R      Q1.0, 8
R      Q2.0, 8
R      M0.0, 1
R      T38, 1
END_ORGANIZATION_BLOCK
SUBROUTINE_BLOCK SBR_0:SBR0
TITLE=子程序注释
BEGIN
Network 1 // 网络标题
// 网络注释
END_SUBROUTINE_BLOCK
INTERRUPT_BLOCK INT_0:INT0
TITLE=中断程序注释
BEGIN
Network 1
END_INTERRUPT_BLOCK
11-03-12 02:02
很赞同2楼的说法。
另外还有个问题:抢答按钮是自锁式的还是自复位式的?如果是自复位式的,那么最后的程序中就有考虑自锁的问题,不能只在按下抢答按钮的同时有输出,手一松就没输出了。
11-06-18 16:02

上一页下一页

工控新闻

更多新闻资讯