我正在制作一个能够玩各种视频游戏机的街机柜(真正的硬件,而不是模拟的)。里面会有一台电脑来运行选择菜单。我得自己写。我还需要编程一个PLC,它将做各种事情,如控制继电器,在PC和各种控制台之间切换音频/视频/控制等。我需要你及时帮我完成那两项任务,但这不是我现在的工作。
我正在工作的起点与控制器编码有关。基本上,每个玩家的控制由几个按钮和一个操纵杆组成。这些使用瞬时,常开触点开关,每个按钮一个,每个基本方向上的操纵杆一个。按下按钮或操纵杆方向,关闭开关。然后,按钮的状态通过编码器传送到控制台。
编码器有一个连接每个按钮和操纵杆的方向,通过一个上拉电阻连接到5伏("高")。当按下按钮或方向时,通过瞬时开关与地连接。当编码器读取按钮连接上的接地("低")时,它知道按钮已被按下,并将此信息传达给控制台。
我已经在各种控制台上工作了,但是我已经想到了一些很好的功能,这就是我当前任务的来源。
第一个特性是按钮重新映射。有些游戏在设计时就考虑到了控制器,所以当你在街机控制面板上使用它们时,有些按钮可能不在你想要的位置。有些游戏允许通过软件重新设置按钮,但有些游戏则不允许。我的想法是在操纵杆、按钮和编码器之间添加一个PLC。我把这个PLC称为"预编码器"。"
预编码器将读取一些输入引脚上的按钮状态,然后将这些状态写回一些输出引脚,将它们中继到编码器。优点是它的编程可以将任何输入引脚与任何输出引脚相关联,有效地重新映射按钮。每当通过电脑菜单选择主机时,也可以选择与特定游戏相关的按钮映射配置文件,并将其转发给预编码器。
当然,读取按钮并将其状态传递给编码器的预编码器的例程必须非常快速地重复以实现平滑控制。这些游戏将以大约50到60Hz的频率运行,这意味着每16.67毫秒或更少的时间就会出现一个新的视频帧。理想情况下,预编码器将能够每帧重复这个程序很多次,以确保绝对最小的输入延迟。我想确保代码和硬件选择是优化的,以尽可能快地运行。
第二个功能是涡轮按钮。有些游戏,尤其是街机游戏,要求玩家在每次想要射击时重复按下射击按钮,即使你有无限的弹药。这似乎没有必要,而且它会很快累坏你的手指。涡轮按钮是一个可以持续按住的按钮,但游戏会被告知你正在快速按下并释放它。这可以在PC上运行的任何软件中完成,或者使用像555定时器这样的模拟解决方案,但最好的方法是将涡轮按钮的时间与视频刷新率同步。通过将来自PC或视频游戏机的视频输出的垂直同步脉冲馈送到PLC,它将确切地知道一帧视频的渲染频率。然后可以通过定义按下和释放按钮的帧数来控制涡轮按钮的定时。时间信息也可以包含在游戏特定的按钮配置文件中。
第三个特性是慢速按钮。实际上,这可能只适用于操纵杆,但我指的是开关的基本方向作为按钮。在某些游戏中(游戏邦注:它可能只会在shmups中使用),有时需要移动你的角色(船/飞机)穿过非常狭小的空间。如果移动太快,即使是最小的操纵杆输入,你可能会走得太远,崩溃。这个想法是,当一个缓慢的激活按钮被按住时,操纵杆将通过快速激活和停用它来减少响应,就像涡轮按钮一样。
我不确定我是否希望预编码器本身正在观看垂直同步脉冲,或者如果它会减慢它太多。我目前的想法是,一个独立的PLC将负责驾驶室本身的一般管理;观看"开"键,切换继电器,直接与PC通信,观看垂直同步脉冲等。这将释放预编码器以更快地运行。
以下是预编码器的一些示例"代码"。显然,这只是我脑海中的一个粗略的轮廓,因为我甚至不知道它会是什么语言。本例假设将使用专用PLC作为预编码器。一个独立的PLC将负责观察垂直同步脉冲,此外还有其他任务,如从计算机获取游戏配置文件并将一些信息传递给预编码器。该PLC将知道turbo和慢速功能的帧定时应该是什么,它将计数帧,并且在应该禁用turbo按钮的帧期间,它向预编码器PCB上的引脚输出高电平,让它知道禁用turbo按钮。在帧期间,当它应该被启用时,它输出低到该引脚。慢速按钮也是同样的道理。还有一个引脚,预编码器在其例行程序结束时检查,所以它可以被告知停止并等待不同的游戏配置文件。get info from other PLC (which got it from the computer, from a user-selected game profile):
array containing list of turbo buttons (buttons are identified by what input pin they are connected to)
array containing list of slow buttons (will probably only be the joystick directions, if any)
array containing list of slow activation buttons (should normally be only one button, if any)
array containing list of normal buttons (not turbo or slow)
array containing which output pin to use for each button (this determines remapping)
Begin Loop
if turbo pin is high
for each turbo button
output pin = high
next
else
for each turbo button
output pin = input pin
next
end if
if slow pin is high and slow activation button is pressed
for each slow button
output pin = high
next
else
for each slow button
output pin = input pin
next
end if
for each normal button
output pin = input pin
next
Restart Loop unless stop pin is low
如果你已经阅读了所有这些,谢谢你的时间。所以(最后),这是我的问题:
你的总体想法是什么?关于我的总体想法,可行性等等?
我应该使用哪种PLC作为预编码器?我原本想尝试一个Arduino,但我的阅读表明,它会太慢,由于它使用高级编程库。我可以在另一个PLC上建立我自己的董事会。
我应该用什么语言来编程PLC?我不介意学一门新语言。这个项目没有时间限制,我会把它放在任何需要让预编码器尽可能快地运行。
我需要什么将我的程序闪现到PLC?
在运行时,这些PLC应该如何相互通信,以及如何与PC机通信?
我问对地方了吗?正确的论坛,正确的板块,等等?还有什么我应该问的吗?
等待您的回复,
抢劫
我有一些想法可能对你有用:
你的总体想法是什么?关于我的总体想法,可行性等等?
- 这个项目听起来像是你想在Defender上作弊,就像我小时候在Atari操纵杆上使用555计时器芯片一样。
- 这个项目是可行的,但是你需要一个相当快的PLC。
- 你可能会花很多时间让这个工作,像一个任务。
我应该使用哪种PLC作为预编码器?我原本想尝试一个Arduino,但我的阅读表明,它会太慢,由于它使用高级编程库。我可以在另一个PLC上建立我自己的董事会。
当我想到什么PLC可能足够快时,我想到了一些事情。
-
如果您使用具有任务架构的PLC,您可以使用一个事件来触发v-sync脉冲上的任务,并使用另一个事件来触发控制台活动。如果你使用的是没有任务架构的PLC,用户可能会意识到随着程序扫描与v-sync和游戏中的活动进入或离开阶段而出现的可变延迟。如果PLC足够快,例如扫描时间为1ms,则可能不成立。
-
大多数便宜的plc永远不会做到这一点。开销和性能将使大多数plc每次扫描保持在5-10ms左右。然而,基于pc的PLC可能会工作得很好。也许倍福控制器会很好地工作。如果您使用像CX2000这样的设备,它有Windows 7、USB、DVI作为用户界面,并且在侧面有一个Ethercat总线,用于连接物理I/O卡,用于控制器和控制台连接。请参阅下面的软件。有许多非基于pc的plc可以很好地工作,但这些可能会很昂贵且难以集成。
-
Arduino解决方案应该工作,如果你正在使用一个足够快的模型。但你的开发时间会更长,因为它除了空白屏幕和一堆库之外什么都没有。与真正发光的plc相比,故障排除更令人头疼。您需要仔细规划才能使Arduino工作。此外,微控制器的硬件接口更困难,您必须在代码中管理断开开关。每台PLC的输入端都有滤波,输入输出的多样性使设计变得容易。但是,如果钱是一个问题,Arduino或其他微控制器是真正的选择。一个快速的PLC可能真的很贵(800美元到2万美元,大约1500美元)。如果你要构建多个系统,Arduino可能会更好。
我应该用什么语言来编程PLC?我不介意学一门新语言。这个项目没有时间限制,我会把它放在任何需要让预编码器尽可能快地运行。
-
IEC61131是PLC编程语言的标准。在美国,大多数plc都是用梯形逻辑编程的,因为它很容易学习,并且在机器中更快地进行故障排除和维护。结构化文本也有其优势,特别是在性能方面。它看起来像是basic/C/Java的混合体,易于学习,看起来几乎像您的伪代码示例。至于你的项目,我认为它可以用两种语言编程。我绝不会使用其他IEC61131语言来完成这项任务。
-
倍福TwinCAT3使用MS Visual Studio作为IDE,您可以在同一个项目中编写选择菜单(使用VB/c++/c#)和PLC代码(使用IEC61131)。TwinCAT(在CX2000上)的运行时许可证以内核模式运行,在Windows 7不做其他更重要的事情时为其提供处理性能。我用过一些CX1020型号,它们表现非常好。扫描时间约为5ms,其中包含大量代码。更快的设备扫描时间为1ms。
我需要什么将我的程序闪现到PLC?
plc不像微控制器那样"闪烁"。无论你用什么软件来编写软件,都有一种连接到控制器的方法。"上网"一词将二者联系起来。术语"下载"one_answers"上传"是指在开发计算机和PLC之间传输程序。术语"在线编辑"是指在PLC执行代码时进行代码更改。当现代plc断电时,它们使用电池来复制程序和用户RAM来闪存。当他们上电时,他们把闪存拷贝回RAM。要连接到任何现代PLC,您将使用USB或以太网电缆。
在运行时,这些PLC应该如何相互通信,以及如何与PC通信?
你计划多台PLC?PLC与PC的连接是一个复杂的问题。术语"OPC服务器"指的是一些[昂贵的]软件,它可以让您的自定义Windows PC应用程序访问plc中的内存。倍福的解决方案将所有这些很好地粘合在一起,而无需购买更多的东西。PLC与PLC之间的通信更容易。该方法通常是通过以太网,在细节上差别很大。
我问对地方了吗?正确的论坛,正确的板块,等等?还有什么我应该问的吗?
-
当然,在这个论坛上有一些PLC活动,似乎倾向于硬核PC/Web/移动开发。我来这里是为了给我更深层次的软件问题找到非常聪明的答案。
-
你可以试试plctalk.net,这是一个面向具体工程师和服务技术人员的论坛,讨论与机械和自动化相关的连接和兼容性问题。你可能会对垂直同步脉冲感到茫然。他们的技能集围绕着一个工业范例,可靠性可能是他们的最高使命。
-
您也可以在Arduino或Microchip/Atmel/ARM论坛上询问有关性能的问题。如果你告诉他们PLC比他们的硬件快,那将会激怒他们!他们可能会告诉你,你可以得到微秒级的性能数字,如果你使用硬件中断和大量的物理电路来实现这一点,你可以做到,你能够应付不眠之夜的故障排除。
丹尼斯